| /* |
| * 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 <errno.h> |
| #include <stdbool.h> |
| #include <stdio.h> |
| #include <string.h> |
| #include <unistd.h> |
| #include <xf86drm.h> |
| |
| #include "drv_priv.h" |
| #include "external/virtgpu_drm.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("virtgpu backend not enabling %s\n", params[i].name); |
| } |
| |
| 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, |
| }; |