1*d95af8dfSAndroid Build Coastguard Worker /*
2*d95af8dfSAndroid Build Coastguard Worker * Copyright 2021 The Chromium OS Authors. All rights reserved.
3*d95af8dfSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be
4*d95af8dfSAndroid Build Coastguard Worker * found in the LICENSE file.
5*d95af8dfSAndroid Build Coastguard Worker */
6*d95af8dfSAndroid Build Coastguard Worker
7*d95af8dfSAndroid Build Coastguard Worker #include <errno.h>
8*d95af8dfSAndroid Build Coastguard Worker #include <stdbool.h>
9*d95af8dfSAndroid Build Coastguard Worker #include <stdio.h>
10*d95af8dfSAndroid Build Coastguard Worker #include <string.h>
11*d95af8dfSAndroid Build Coastguard Worker #include <unistd.h>
12*d95af8dfSAndroid Build Coastguard Worker #include <xf86drm.h>
13*d95af8dfSAndroid Build Coastguard Worker
14*d95af8dfSAndroid Build Coastguard Worker #include "drv_priv.h"
15*d95af8dfSAndroid Build Coastguard Worker #include "external/virtgpu_drm.h"
16*d95af8dfSAndroid Build Coastguard Worker #include "util.h"
17*d95af8dfSAndroid Build Coastguard Worker #include "virtgpu.h"
18*d95af8dfSAndroid Build Coastguard Worker
19*d95af8dfSAndroid Build Coastguard Worker #define PARAM(x) \
20*d95af8dfSAndroid Build Coastguard Worker (struct virtgpu_param) \
21*d95af8dfSAndroid Build Coastguard Worker { \
22*d95af8dfSAndroid Build Coastguard Worker x, #x, 0 \
23*d95af8dfSAndroid Build Coastguard Worker }
24*d95af8dfSAndroid Build Coastguard Worker
25*d95af8dfSAndroid Build Coastguard Worker struct virtgpu_param params[] = {
26*d95af8dfSAndroid Build Coastguard Worker PARAM(VIRTGPU_PARAM_3D_FEATURES), PARAM(VIRTGPU_PARAM_CAPSET_QUERY_FIX),
27*d95af8dfSAndroid Build Coastguard Worker PARAM(VIRTGPU_PARAM_RESOURCE_BLOB), PARAM(VIRTGPU_PARAM_HOST_VISIBLE),
28*d95af8dfSAndroid Build Coastguard Worker PARAM(VIRTGPU_PARAM_CROSS_DEVICE), PARAM(VIRTGPU_PARAM_CONTEXT_INIT),
29*d95af8dfSAndroid Build Coastguard Worker PARAM(VIRTGPU_PARAM_SUPPORTED_CAPSET_IDs), PARAM(VIRTGPU_PARAM_CREATE_GUEST_HANDLE),
30*d95af8dfSAndroid Build Coastguard Worker PARAM(VIRTGPU_PARAM_RESOURCE_SYNC), PARAM(VIRTGPU_PARAM_GUEST_VRAM),
31*d95af8dfSAndroid Build Coastguard Worker };
32*d95af8dfSAndroid Build Coastguard Worker
33*d95af8dfSAndroid Build Coastguard Worker extern const struct backend virtgpu_virgl;
34*d95af8dfSAndroid Build Coastguard Worker extern const struct backend virtgpu_cross_domain;
35*d95af8dfSAndroid Build Coastguard Worker
virtgpu_init(struct driver * drv)36*d95af8dfSAndroid Build Coastguard Worker static int virtgpu_init(struct driver *drv)
37*d95af8dfSAndroid Build Coastguard Worker {
38*d95af8dfSAndroid Build Coastguard Worker int ret = 0;
39*d95af8dfSAndroid Build Coastguard Worker const struct backend *virtgpu_backends[2] = {
40*d95af8dfSAndroid Build Coastguard Worker &virtgpu_cross_domain,
41*d95af8dfSAndroid Build Coastguard Worker &virtgpu_virgl,
42*d95af8dfSAndroid Build Coastguard Worker };
43*d95af8dfSAndroid Build Coastguard Worker
44*d95af8dfSAndroid Build Coastguard Worker for (uint32_t i = 0; i < ARRAY_SIZE(params); i++) {
45*d95af8dfSAndroid Build Coastguard Worker struct drm_virtgpu_getparam get_param = { 0 };
46*d95af8dfSAndroid Build Coastguard Worker
47*d95af8dfSAndroid Build Coastguard Worker get_param.param = params[i].param;
48*d95af8dfSAndroid Build Coastguard Worker get_param.value = (uint64_t)(uintptr_t)¶ms[i].value;
49*d95af8dfSAndroid Build Coastguard Worker int ret = drmIoctl(drv->fd, DRM_IOCTL_VIRTGPU_GETPARAM, &get_param);
50*d95af8dfSAndroid Build Coastguard Worker if (ret)
51*d95af8dfSAndroid Build Coastguard Worker drv_logi("virtgpu backend not enabling %s\n", params[i].name);
52*d95af8dfSAndroid Build Coastguard Worker }
53*d95af8dfSAndroid Build Coastguard Worker
54*d95af8dfSAndroid Build Coastguard Worker for (uint32_t i = 0; i < ARRAY_SIZE(virtgpu_backends); i++) {
55*d95af8dfSAndroid Build Coastguard Worker const struct backend *backend = virtgpu_backends[i];
56*d95af8dfSAndroid Build Coastguard Worker ret = backend->init(drv);
57*d95af8dfSAndroid Build Coastguard Worker if (ret)
58*d95af8dfSAndroid Build Coastguard Worker continue;
59*d95af8dfSAndroid Build Coastguard Worker
60*d95af8dfSAndroid Build Coastguard Worker drv->backend = backend;
61*d95af8dfSAndroid Build Coastguard Worker return 0;
62*d95af8dfSAndroid Build Coastguard Worker }
63*d95af8dfSAndroid Build Coastguard Worker
64*d95af8dfSAndroid Build Coastguard Worker return ret;
65*d95af8dfSAndroid Build Coastguard Worker }
66*d95af8dfSAndroid Build Coastguard Worker
67*d95af8dfSAndroid Build Coastguard Worker const struct backend backend_virtgpu = {
68*d95af8dfSAndroid Build Coastguard Worker .name = "virtio_gpu",
69*d95af8dfSAndroid Build Coastguard Worker .init = virtgpu_init,
70*d95af8dfSAndroid Build Coastguard Worker };
71