xref: /aosp_15_r20/external/mesa3d/src/broadcom/drm-shim/v3d_noop.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2018 Broadcom
3*61046927SAndroid Build Coastguard Worker  *
4*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker  *
11*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker  * Software.
14*61046927SAndroid Build Coastguard Worker  *
15*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*61046927SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*61046927SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21*61046927SAndroid Build Coastguard Worker  * DEALINGS IN THE SOFTWARE.
22*61046927SAndroid Build Coastguard Worker  */
23*61046927SAndroid Build Coastguard Worker 
24*61046927SAndroid Build Coastguard Worker #include <limits.h>
25*61046927SAndroid Build Coastguard Worker #include <stdio.h>
26*61046927SAndroid Build Coastguard Worker #include <stdlib.h>
27*61046927SAndroid Build Coastguard Worker #include <sys/ioctl.h>
28*61046927SAndroid Build Coastguard Worker #include "drm-uapi/v3d_drm.h"
29*61046927SAndroid Build Coastguard Worker #include "drm-shim/drm_shim.h"
30*61046927SAndroid Build Coastguard Worker 
31*61046927SAndroid Build Coastguard Worker bool drm_shim_driver_prefers_first_render_node = true;
32*61046927SAndroid Build Coastguard Worker 
33*61046927SAndroid Build Coastguard Worker struct v3d_bo {
34*61046927SAndroid Build Coastguard Worker         struct shim_bo base;
35*61046927SAndroid Build Coastguard Worker         uint32_t offset;
36*61046927SAndroid Build Coastguard Worker };
37*61046927SAndroid Build Coastguard Worker 
38*61046927SAndroid Build Coastguard Worker static struct v3d_bo *
v3d_bo(struct shim_bo * bo)39*61046927SAndroid Build Coastguard Worker v3d_bo(struct shim_bo *bo)
40*61046927SAndroid Build Coastguard Worker {
41*61046927SAndroid Build Coastguard Worker         return (struct v3d_bo *)bo;
42*61046927SAndroid Build Coastguard Worker }
43*61046927SAndroid Build Coastguard Worker 
44*61046927SAndroid Build Coastguard Worker struct v3d_device {
45*61046927SAndroid Build Coastguard Worker         uint32_t next_offset;
46*61046927SAndroid Build Coastguard Worker };
47*61046927SAndroid Build Coastguard Worker 
48*61046927SAndroid Build Coastguard Worker static struct v3d_device v3d = {
49*61046927SAndroid Build Coastguard Worker         .next_offset = 0x1000,
50*61046927SAndroid Build Coastguard Worker };
51*61046927SAndroid Build Coastguard Worker 
52*61046927SAndroid Build Coastguard Worker static int
v3d_ioctl_noop(int fd,unsigned long request,void * arg)53*61046927SAndroid Build Coastguard Worker v3d_ioctl_noop(int fd, unsigned long request, void *arg)
54*61046927SAndroid Build Coastguard Worker {
55*61046927SAndroid Build Coastguard Worker         return 0;
56*61046927SAndroid Build Coastguard Worker }
57*61046927SAndroid Build Coastguard Worker 
58*61046927SAndroid Build Coastguard Worker static int
v3d_ioctl_create_bo(int fd,unsigned long request,void * arg)59*61046927SAndroid Build Coastguard Worker v3d_ioctl_create_bo(int fd, unsigned long request, void *arg)
60*61046927SAndroid Build Coastguard Worker {
61*61046927SAndroid Build Coastguard Worker         struct shim_fd *shim_fd = drm_shim_fd_lookup(fd);
62*61046927SAndroid Build Coastguard Worker         struct drm_v3d_create_bo *create = arg;
63*61046927SAndroid Build Coastguard Worker         struct v3d_bo *bo = calloc(1, sizeof(*bo));
64*61046927SAndroid Build Coastguard Worker 
65*61046927SAndroid Build Coastguard Worker         drm_shim_bo_init(&bo->base, create->size);
66*61046927SAndroid Build Coastguard Worker 
67*61046927SAndroid Build Coastguard Worker         assert(UINT_MAX - v3d.next_offset > create->size);
68*61046927SAndroid Build Coastguard Worker         bo->offset = v3d.next_offset;
69*61046927SAndroid Build Coastguard Worker         v3d.next_offset += create->size;
70*61046927SAndroid Build Coastguard Worker 
71*61046927SAndroid Build Coastguard Worker         create->offset = bo->offset;
72*61046927SAndroid Build Coastguard Worker         create->handle = drm_shim_bo_get_handle(shim_fd, &bo->base);
73*61046927SAndroid Build Coastguard Worker 
74*61046927SAndroid Build Coastguard Worker         drm_shim_bo_put(&bo->base);
75*61046927SAndroid Build Coastguard Worker 
76*61046927SAndroid Build Coastguard Worker         return 0;
77*61046927SAndroid Build Coastguard Worker }
78*61046927SAndroid Build Coastguard Worker 
79*61046927SAndroid Build Coastguard Worker static int
v3d_ioctl_get_bo_offset(int fd,unsigned long request,void * arg)80*61046927SAndroid Build Coastguard Worker v3d_ioctl_get_bo_offset(int fd, unsigned long request, void *arg)
81*61046927SAndroid Build Coastguard Worker {
82*61046927SAndroid Build Coastguard Worker         struct shim_fd *shim_fd = drm_shim_fd_lookup(fd);
83*61046927SAndroid Build Coastguard Worker         struct drm_v3d_get_bo_offset *args = arg;
84*61046927SAndroid Build Coastguard Worker         struct shim_bo *bo = drm_shim_bo_lookup(shim_fd, args->handle);
85*61046927SAndroid Build Coastguard Worker 
86*61046927SAndroid Build Coastguard Worker         args->offset = v3d_bo(bo)->offset;
87*61046927SAndroid Build Coastguard Worker 
88*61046927SAndroid Build Coastguard Worker         drm_shim_bo_put(bo);
89*61046927SAndroid Build Coastguard Worker 
90*61046927SAndroid Build Coastguard Worker         return 0;
91*61046927SAndroid Build Coastguard Worker }
92*61046927SAndroid Build Coastguard Worker 
93*61046927SAndroid Build Coastguard Worker static int
v3d_ioctl_mmap_bo(int fd,unsigned long request,void * arg)94*61046927SAndroid Build Coastguard Worker v3d_ioctl_mmap_bo(int fd, unsigned long request, void *arg)
95*61046927SAndroid Build Coastguard Worker {
96*61046927SAndroid Build Coastguard Worker         struct shim_fd *shim_fd = drm_shim_fd_lookup(fd);
97*61046927SAndroid Build Coastguard Worker         struct drm_v3d_mmap_bo *map = arg;
98*61046927SAndroid Build Coastguard Worker         struct shim_bo *bo = drm_shim_bo_lookup(shim_fd, map->handle);
99*61046927SAndroid Build Coastguard Worker 
100*61046927SAndroid Build Coastguard Worker         map->offset = drm_shim_bo_get_mmap_offset(shim_fd, bo);
101*61046927SAndroid Build Coastguard Worker 
102*61046927SAndroid Build Coastguard Worker         drm_shim_bo_put(bo);
103*61046927SAndroid Build Coastguard Worker 
104*61046927SAndroid Build Coastguard Worker         return 0;
105*61046927SAndroid Build Coastguard Worker }
106*61046927SAndroid Build Coastguard Worker 
107*61046927SAndroid Build Coastguard Worker static int
v3d_ioctl_get_param(int fd,unsigned long request,void * arg)108*61046927SAndroid Build Coastguard Worker v3d_ioctl_get_param(int fd, unsigned long request, void *arg)
109*61046927SAndroid Build Coastguard Worker {
110*61046927SAndroid Build Coastguard Worker         struct drm_v3d_get_param *gp = arg;
111*61046927SAndroid Build Coastguard Worker         static const uint32_t v3d42_reg_map[] = {
112*61046927SAndroid Build Coastguard Worker                 [DRM_V3D_PARAM_V3D_UIFCFG] = 0x00000045,
113*61046927SAndroid Build Coastguard Worker                 [DRM_V3D_PARAM_V3D_HUB_IDENT1] = 0x000e1124,
114*61046927SAndroid Build Coastguard Worker                 [DRM_V3D_PARAM_V3D_HUB_IDENT2] = 0x00000100,
115*61046927SAndroid Build Coastguard Worker                 [DRM_V3D_PARAM_V3D_HUB_IDENT3] = 0x00000e00,
116*61046927SAndroid Build Coastguard Worker                 [DRM_V3D_PARAM_V3D_CORE0_IDENT0] = 0x04443356,
117*61046927SAndroid Build Coastguard Worker                 [DRM_V3D_PARAM_V3D_CORE0_IDENT1] = 0x81001422,
118*61046927SAndroid Build Coastguard Worker                 [DRM_V3D_PARAM_V3D_CORE0_IDENT2] = 0x40078121,
119*61046927SAndroid Build Coastguard Worker         };
120*61046927SAndroid Build Coastguard Worker 
121*61046927SAndroid Build Coastguard Worker         switch (gp->param) {
122*61046927SAndroid Build Coastguard Worker         case DRM_V3D_PARAM_SUPPORTS_TFU:
123*61046927SAndroid Build Coastguard Worker                 gp->value = 1;
124*61046927SAndroid Build Coastguard Worker                 return 0;
125*61046927SAndroid Build Coastguard Worker         case DRM_V3D_PARAM_SUPPORTS_CSD:
126*61046927SAndroid Build Coastguard Worker                 gp->value = 1;
127*61046927SAndroid Build Coastguard Worker                 return 0;
128*61046927SAndroid Build Coastguard Worker         case DRM_V3D_PARAM_SUPPORTS_CACHE_FLUSH:
129*61046927SAndroid Build Coastguard Worker                 gp->value = 1;
130*61046927SAndroid Build Coastguard Worker                 return 0;
131*61046927SAndroid Build Coastguard Worker         case DRM_V3D_PARAM_SUPPORTS_PERFMON:
132*61046927SAndroid Build Coastguard Worker                 gp->value = 1;
133*61046927SAndroid Build Coastguard Worker                 return 0;
134*61046927SAndroid Build Coastguard Worker         default:
135*61046927SAndroid Build Coastguard Worker                 break;
136*61046927SAndroid Build Coastguard Worker         }
137*61046927SAndroid Build Coastguard Worker 
138*61046927SAndroid Build Coastguard Worker         if (gp->param < ARRAY_SIZE(v3d42_reg_map) && v3d42_reg_map[gp->param]) {
139*61046927SAndroid Build Coastguard Worker                 gp->value = v3d42_reg_map[gp->param];
140*61046927SAndroid Build Coastguard Worker                 return 0;
141*61046927SAndroid Build Coastguard Worker         }
142*61046927SAndroid Build Coastguard Worker 
143*61046927SAndroid Build Coastguard Worker         fprintf(stderr, "Unknown DRM_IOCTL_V3D_GET_PARAM %d\n", gp->param);
144*61046927SAndroid Build Coastguard Worker         return -1;
145*61046927SAndroid Build Coastguard Worker }
146*61046927SAndroid Build Coastguard Worker 
147*61046927SAndroid Build Coastguard Worker static ioctl_fn_t driver_ioctls[] = {
148*61046927SAndroid Build Coastguard Worker         [DRM_V3D_SUBMIT_CL] = v3d_ioctl_noop,
149*61046927SAndroid Build Coastguard Worker         [DRM_V3D_SUBMIT_TFU] = v3d_ioctl_noop,
150*61046927SAndroid Build Coastguard Worker         [DRM_V3D_WAIT_BO] = v3d_ioctl_noop,
151*61046927SAndroid Build Coastguard Worker         [DRM_V3D_CREATE_BO] = v3d_ioctl_create_bo,
152*61046927SAndroid Build Coastguard Worker         [DRM_V3D_GET_PARAM] = v3d_ioctl_get_param,
153*61046927SAndroid Build Coastguard Worker         [DRM_V3D_GET_BO_OFFSET] = v3d_ioctl_get_bo_offset,
154*61046927SAndroid Build Coastguard Worker         [DRM_V3D_MMAP_BO] = v3d_ioctl_mmap_bo,
155*61046927SAndroid Build Coastguard Worker };
156*61046927SAndroid Build Coastguard Worker 
157*61046927SAndroid Build Coastguard Worker void
drm_shim_driver_init(void)158*61046927SAndroid Build Coastguard Worker drm_shim_driver_init(void)
159*61046927SAndroid Build Coastguard Worker {
160*61046927SAndroid Build Coastguard Worker         shim_device.bus_type = DRM_BUS_PLATFORM;
161*61046927SAndroid Build Coastguard Worker         shim_device.driver_name = "v3d";
162*61046927SAndroid Build Coastguard Worker         shim_device.driver_ioctls = driver_ioctls;
163*61046927SAndroid Build Coastguard Worker         shim_device.driver_ioctl_count = ARRAY_SIZE(driver_ioctls);
164*61046927SAndroid Build Coastguard Worker 
165*61046927SAndroid Build Coastguard Worker         drm_shim_override_file("OF_FULLNAME=/rdb/v3d\n"
166*61046927SAndroid Build Coastguard Worker                                "OF_COMPATIBLE_N=1\n"
167*61046927SAndroid Build Coastguard Worker                                "OF_COMPATIBLE_0=brcm,2711-v3d\n",
168*61046927SAndroid Build Coastguard Worker                                "/sys/dev/char/%d:%d/device/uevent",
169*61046927SAndroid Build Coastguard Worker                                DRM_MAJOR, render_node_minor);
170*61046927SAndroid Build Coastguard Worker }
171