/* * Copyright 2021 The Chromium OS Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include #include #include #include #include #include #include "drv_priv.h" #include "external/virtgpu_drm.h" #include "helpers.h" #include "util.h" #include "virtgpu.h" #define PARAM(x) \ (struct virtgpu_param) \ { \ x, #x, 0 \ } struct virtgpu_param params[] = { PARAM(VIRTGPU_PARAM_3D_FEATURES), PARAM(VIRTGPU_PARAM_CAPSET_QUERY_FIX), PARAM(VIRTGPU_PARAM_RESOURCE_BLOB), PARAM(VIRTGPU_PARAM_HOST_VISIBLE), PARAM(VIRTGPU_PARAM_CROSS_DEVICE), PARAM(VIRTGPU_PARAM_CONTEXT_INIT), PARAM(VIRTGPU_PARAM_SUPPORTED_CAPSET_IDs), PARAM(VIRTGPU_PARAM_CREATE_GUEST_HANDLE), PARAM(VIRTGPU_PARAM_RESOURCE_SYNC), PARAM(VIRTGPU_PARAM_GUEST_VRAM), }; extern const struct backend virtgpu_virgl; extern const struct backend virtgpu_cross_domain; static int virtgpu_init(struct driver *drv) { int ret = 0; const struct backend *virtgpu_backends[2] = { &virtgpu_cross_domain, &virtgpu_virgl, }; for (uint32_t i = 0; i < ARRAY_SIZE(params); i++) { struct drm_virtgpu_getparam get_param = { 0 }; get_param.param = params[i].param; get_param.value = (uint64_t)(uintptr_t)¶ms[i].value; int ret = drmIoctl(drv->fd, DRM_IOCTL_VIRTGPU_GETPARAM, &get_param); if (ret) drv_log("DRM_IOCTL_VIRTGPU_GET_PARAM failed with %s\n", strerror(errno)); } for (uint32_t i = 0; i < ARRAY_SIZE(virtgpu_backends); i++) { const struct backend *backend = virtgpu_backends[i]; ret = backend->init(drv); if (ret) continue; drv->backend = backend; return 0; } return ret; } const struct backend backend_virtgpu = { .name = "virtio_gpu", .init = virtgpu_init, };