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 <olv@google.com>
Reviewed-by: Yiwei Zhang <zzyiwei@chromium.org>
Tested-by: Chia-I Wu <olv@google.com>
This commit is contained in:
Chia-I Wu 2023-02-16 09:18:34 -08:00 committed by Chromeos LUCI
parent b9d5d6c10a
commit bf1f37f516
4 changed files with 47 additions and 21 deletions

View file

@ -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,

52
drv.c
View file

@ -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;

2
drv.h
View file

@ -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);

View file

@ -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,