From bf1f37f516987288288b60008232a2275ea2a3e0 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Thu, 16 Feb 2023 09:18:34 -0800 Subject: [PATCH] drv: add drv_preload It can be used to preload a backend, currently only used to preload amdgpu. BUG=b:269664560 TEST="grep radeonsi /proc/$(pidof zygote)/maps" on grunt Change-Id: I30d9f701f1da3bc243a9c81326a1ba0c5e0562de Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/minigbm/+/4262034 Commit-Queue: Chia-I Wu Reviewed-by: Yiwei Zhang Tested-by: Chia-I Wu --- amdgpu.c | 13 +++++++++++++ drv.c | 52 +++++++++++++++++++++++++++++++--------------------- drv.h | 2 ++ drv_priv.h | 1 + 4 files changed, 47 insertions(+), 21 deletions(-) diff --git a/amdgpu.c b/amdgpu.c index 5c891de..bcd215c 100644 --- a/amdgpu.c +++ b/amdgpu.c @@ -345,6 +345,18 @@ static bool is_modifier_scanout_capable(struct amdgpu_priv *priv, uint32_t forma return true; } +static void amdgpu_preload(bool load) +{ + static void *handle; + + if (load && !handle) + handle = dri_dlopen(DRI_PATH); + else if (!load && handle) { + dri_dlclose(handle); + handle = NULL; + } +} + static int amdgpu_init(struct driver *drv) { struct amdgpu_priv *priv; @@ -788,6 +800,7 @@ static int amdgpu_bo_invalidate(struct bo *bo, struct mapping *mapping) const struct backend backend_amdgpu = { .name = "amdgpu", + .preload = amdgpu_preload, .init = amdgpu_init, .close = amdgpu_close, .bo_create = amdgpu_create_bo, diff --git a/drv.c b/drv.c index 462b763..9a6def5 100644 --- a/drv.c +++ b/drv.c @@ -52,6 +52,35 @@ extern const struct backend backend_virtgpu; extern const struct backend backend_udl; extern const struct backend backend_vkms; +static const struct backend *drv_backend_list[] = { +#ifdef DRV_AMDGPU + &backend_amdgpu, +#endif +#ifdef DRV_I915 + &backend_i915, +#endif +#ifdef DRV_MSM + &backend_msm, +#endif +#ifdef DRV_VC4 + &backend_vc4, +#endif + &backend_evdi, &backend_komeda, &backend_marvell, &backend_mediatek, + &backend_meson, &backend_nouveau, &backend_radeon, &backend_rockchip, + &backend_sun4i_drm, &backend_synaptics, &backend_udl, &backend_virtgpu, + &backend_vkms +}; + +void drv_preload(bool load) +{ + unsigned int i; + for (i = 0; i < ARRAY_SIZE(drv_backend_list); i++) { + const struct backend *b = drv_backend_list[i]; + if (b->preload) + b->preload(load); + } +} + static const struct backend *drv_get_backend(int fd) { drmVersionPtr drm_version; @@ -62,27 +91,8 @@ static const struct backend *drv_get_backend(int fd) if (!drm_version) return NULL; - const struct backend *backend_list[] = { -#ifdef DRV_AMDGPU - &backend_amdgpu, -#endif -#ifdef DRV_I915 - &backend_i915, -#endif -#ifdef DRV_MSM - &backend_msm, -#endif -#ifdef DRV_VC4 - &backend_vc4, -#endif - &backend_evdi, &backend_komeda, &backend_marvell, &backend_mediatek, - &backend_meson, &backend_nouveau, &backend_radeon, &backend_rockchip, - &backend_sun4i_drm, &backend_synaptics, &backend_udl, &backend_virtgpu, - &backend_vkms - }; - - for (i = 0; i < ARRAY_SIZE(backend_list); i++) { - const struct backend *b = backend_list[i]; + for (i = 0; i < ARRAY_SIZE(drv_backend_list); i++) { + const struct backend *b = drv_backend_list[i]; if (!strcmp(drm_version->name, b->name)) { drmFreeVersion(drm_version); return b; diff --git a/drv.h b/drv.h index 7e6316c..b824fc5 100644 --- a/drv.h +++ b/drv.h @@ -131,6 +131,8 @@ struct mapping { uint32_t refcount; }; +void drv_preload(bool load); + struct driver *drv_create(int fd); void drv_destroy(struct driver *drv); diff --git a/drv_priv.h b/drv_priv.h index d674876..719e392 100644 --- a/drv_priv.h +++ b/drv_priv.h @@ -74,6 +74,7 @@ struct driver { struct backend { char *name; + void (*preload)(bool load); int (*init)(struct driver *drv); void (*close)(struct driver *drv); int (*bo_create)(struct bo *bo, uint32_t width, uint32_t height, uint32_t format,