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

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;