xref: /aosp_15_r20/external/minigbm/virtgpu.c (revision d95af8df99a05bcb8679a54dc3ab8e5cd312b38e)
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)&params[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