From 52c63ae1a740cdc5024632170808fb100f7511af Mon Sep 17 00:00:00 2001 From: Kaiyi Li Date: Thu, 18 Jan 2024 12:03:35 -0800 Subject: [PATCH] virtgpu virgl: assume 0 caps for unrecognized capset IDs minigbm gralloc + gfxstream on the host will always fail the get caps ioctl, but gralloc itself still works fine. TEST=build and run the emulator BUG=b:322199104 Change-Id: I35ebbdddbfb050ead76d61626f13f028cf909229 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/minigbm/+/5241884 Auto-Submit: Kaiyi Li Commit-Queue: Kaiyi Li Tested-by: Kaiyi Li Reviewed-by: Dominik Behr --- virtgpu_virgl.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/virtgpu_virgl.c b/virtgpu_virgl.c index e47ce1e..1f098a3 100644 --- a/virtgpu_virgl.c +++ b/virtgpu_virgl.c @@ -548,10 +548,26 @@ static int virgl_get_caps(struct driver *drv, union virgl_caps *caps, int *caps_ int ret; struct drm_virtgpu_get_caps cap_args = { 0 }; + memset(caps, 0, sizeof(union virgl_caps)); *caps_is_v2 = 0; - cap_args.addr = (unsigned long long)caps; - if (params[param_capset_fix].value) { + + if (params[param_supported_capset_ids].value) { + drv_logi("Supported CAPSET IDs: %u.", params[param_supported_capset_ids].value); + if (params[param_supported_capset_ids].value & (1 << 2)) { + *caps_is_v2 = 1; + } else if (params[param_supported_capset_ids].value & (1 << 1)) { + *caps_is_v2 = 0; + } else { + drv_logi("Unrecognized CAPSET IDs: %u. Assuming all zero caps.", + params[param_supported_capset_ids].value); + return 0; + } + } else if (params[param_capset_fix].value) { *caps_is_v2 = 1; + } + + cap_args.addr = (unsigned long long)caps; + if (*caps_is_v2) { cap_args.cap_set_id = 2; cap_args.size = sizeof(union virgl_caps); } else {