xref: /aosp_15_r20/external/mesa3d/src/freedreno/drm-shim/freedreno_noop.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2019 Google LLC
3*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker  */
5*61046927SAndroid Build Coastguard Worker 
6*61046927SAndroid Build Coastguard Worker #include <limits.h>
7*61046927SAndroid Build Coastguard Worker #include <stdio.h>
8*61046927SAndroid Build Coastguard Worker #include <stdlib.h>
9*61046927SAndroid Build Coastguard Worker #include "drm-shim/drm_shim.h"
10*61046927SAndroid Build Coastguard Worker #include "drm-uapi/msm_drm.h"
11*61046927SAndroid Build Coastguard Worker #include <sys/ioctl.h>
12*61046927SAndroid Build Coastguard Worker 
13*61046927SAndroid Build Coastguard Worker #include "util/u_math.h"
14*61046927SAndroid Build Coastguard Worker 
15*61046927SAndroid Build Coastguard Worker bool drm_shim_driver_prefers_first_render_node = true;
16*61046927SAndroid Build Coastguard Worker 
17*61046927SAndroid Build Coastguard Worker struct msm_device_info {
18*61046927SAndroid Build Coastguard Worker    uint32_t gpu_id;
19*61046927SAndroid Build Coastguard Worker    uint32_t chip_id;
20*61046927SAndroid Build Coastguard Worker    uint32_t gmem_size;
21*61046927SAndroid Build Coastguard Worker };
22*61046927SAndroid Build Coastguard Worker 
23*61046927SAndroid Build Coastguard Worker static const struct msm_device_info *device_info;
24*61046927SAndroid Build Coastguard Worker 
25*61046927SAndroid Build Coastguard Worker static int
msm_ioctl_noop(int fd,unsigned long request,void * arg)26*61046927SAndroid Build Coastguard Worker msm_ioctl_noop(int fd, unsigned long request, void *arg)
27*61046927SAndroid Build Coastguard Worker {
28*61046927SAndroid Build Coastguard Worker    return 0;
29*61046927SAndroid Build Coastguard Worker }
30*61046927SAndroid Build Coastguard Worker 
31*61046927SAndroid Build Coastguard Worker static int
msm_ioctl_gem_new(int fd,unsigned long request,void * arg)32*61046927SAndroid Build Coastguard Worker msm_ioctl_gem_new(int fd, unsigned long request, void *arg)
33*61046927SAndroid Build Coastguard Worker {
34*61046927SAndroid Build Coastguard Worker    struct shim_fd *shim_fd = drm_shim_fd_lookup(fd);
35*61046927SAndroid Build Coastguard Worker    struct drm_msm_gem_new *create = arg;
36*61046927SAndroid Build Coastguard Worker    size_t size = (size_t)align64(create->size, 4096);
37*61046927SAndroid Build Coastguard Worker 
38*61046927SAndroid Build Coastguard Worker    if (!size)
39*61046927SAndroid Build Coastguard Worker       return -EINVAL;
40*61046927SAndroid Build Coastguard Worker 
41*61046927SAndroid Build Coastguard Worker    struct shim_bo *bo = calloc(1, sizeof(*bo));
42*61046927SAndroid Build Coastguard Worker    int ret;
43*61046927SAndroid Build Coastguard Worker 
44*61046927SAndroid Build Coastguard Worker    ret = drm_shim_bo_init(bo, size);
45*61046927SAndroid Build Coastguard Worker    if (ret) {
46*61046927SAndroid Build Coastguard Worker       free(bo);
47*61046927SAndroid Build Coastguard Worker       return ret;
48*61046927SAndroid Build Coastguard Worker    }
49*61046927SAndroid Build Coastguard Worker 
50*61046927SAndroid Build Coastguard Worker    create->handle = drm_shim_bo_get_handle(shim_fd, bo);
51*61046927SAndroid Build Coastguard Worker 
52*61046927SAndroid Build Coastguard Worker    drm_shim_bo_put(bo);
53*61046927SAndroid Build Coastguard Worker 
54*61046927SAndroid Build Coastguard Worker    return 0;
55*61046927SAndroid Build Coastguard Worker }
56*61046927SAndroid Build Coastguard Worker 
57*61046927SAndroid Build Coastguard Worker static int
msm_ioctl_gem_info(int fd,unsigned long request,void * arg)58*61046927SAndroid Build Coastguard Worker msm_ioctl_gem_info(int fd, unsigned long request, void *arg)
59*61046927SAndroid Build Coastguard Worker {
60*61046927SAndroid Build Coastguard Worker    struct shim_fd *shim_fd = drm_shim_fd_lookup(fd);
61*61046927SAndroid Build Coastguard Worker    struct drm_msm_gem_info *args = arg;
62*61046927SAndroid Build Coastguard Worker    struct shim_bo *bo = drm_shim_bo_lookup(shim_fd, args->handle);
63*61046927SAndroid Build Coastguard Worker 
64*61046927SAndroid Build Coastguard Worker    if (!bo)
65*61046927SAndroid Build Coastguard Worker       return -ENOENT;
66*61046927SAndroid Build Coastguard Worker 
67*61046927SAndroid Build Coastguard Worker    switch (args->info) {
68*61046927SAndroid Build Coastguard Worker    case MSM_INFO_GET_OFFSET:
69*61046927SAndroid Build Coastguard Worker       args->value = drm_shim_bo_get_mmap_offset(shim_fd, bo);
70*61046927SAndroid Build Coastguard Worker       break;
71*61046927SAndroid Build Coastguard Worker    case MSM_INFO_GET_IOVA:
72*61046927SAndroid Build Coastguard Worker       args->value = bo->mem_addr;
73*61046927SAndroid Build Coastguard Worker       break;
74*61046927SAndroid Build Coastguard Worker    case MSM_INFO_SET_IOVA:
75*61046927SAndroid Build Coastguard Worker    case MSM_INFO_SET_NAME:
76*61046927SAndroid Build Coastguard Worker       break;
77*61046927SAndroid Build Coastguard Worker    default:
78*61046927SAndroid Build Coastguard Worker       fprintf(stderr, "Unknown DRM_IOCTL_MSM_GEM_INFO %d\n", args->info);
79*61046927SAndroid Build Coastguard Worker       drm_shim_bo_put(bo);
80*61046927SAndroid Build Coastguard Worker       return -1;
81*61046927SAndroid Build Coastguard Worker    }
82*61046927SAndroid Build Coastguard Worker 
83*61046927SAndroid Build Coastguard Worker    drm_shim_bo_put(bo);
84*61046927SAndroid Build Coastguard Worker 
85*61046927SAndroid Build Coastguard Worker    return 0;
86*61046927SAndroid Build Coastguard Worker }
87*61046927SAndroid Build Coastguard Worker 
88*61046927SAndroid Build Coastguard Worker static int
msm_ioctl_get_param(int fd,unsigned long request,void * arg)89*61046927SAndroid Build Coastguard Worker msm_ioctl_get_param(int fd, unsigned long request, void *arg)
90*61046927SAndroid Build Coastguard Worker {
91*61046927SAndroid Build Coastguard Worker    struct drm_msm_param *gp = arg;
92*61046927SAndroid Build Coastguard Worker 
93*61046927SAndroid Build Coastguard Worker    switch (gp->param) {
94*61046927SAndroid Build Coastguard Worker    case MSM_PARAM_GPU_ID:
95*61046927SAndroid Build Coastguard Worker       gp->value = device_info->gpu_id;
96*61046927SAndroid Build Coastguard Worker       return 0;
97*61046927SAndroid Build Coastguard Worker    case MSM_PARAM_GMEM_SIZE:
98*61046927SAndroid Build Coastguard Worker       gp->value = device_info->gmem_size;
99*61046927SAndroid Build Coastguard Worker       return 0;
100*61046927SAndroid Build Coastguard Worker    case MSM_PARAM_GMEM_BASE:
101*61046927SAndroid Build Coastguard Worker       gp->value = 0x100000;
102*61046927SAndroid Build Coastguard Worker       return 0;
103*61046927SAndroid Build Coastguard Worker    case MSM_PARAM_CHIP_ID:
104*61046927SAndroid Build Coastguard Worker       gp->value = device_info->chip_id;
105*61046927SAndroid Build Coastguard Worker       return 0;
106*61046927SAndroid Build Coastguard Worker    case MSM_PARAM_NR_RINGS:
107*61046927SAndroid Build Coastguard Worker       gp->value = 1;
108*61046927SAndroid Build Coastguard Worker       return 0;
109*61046927SAndroid Build Coastguard Worker    case MSM_PARAM_MAX_FREQ:
110*61046927SAndroid Build Coastguard Worker       gp->value = 1000000;
111*61046927SAndroid Build Coastguard Worker       return 0;
112*61046927SAndroid Build Coastguard Worker    case MSM_PARAM_TIMESTAMP:
113*61046927SAndroid Build Coastguard Worker       gp->value = 0;
114*61046927SAndroid Build Coastguard Worker       return 0;
115*61046927SAndroid Build Coastguard Worker    case MSM_PARAM_PP_PGTABLE:
116*61046927SAndroid Build Coastguard Worker       gp->value = 1;
117*61046927SAndroid Build Coastguard Worker       return 0;
118*61046927SAndroid Build Coastguard Worker    case MSM_PARAM_FAULTS:
119*61046927SAndroid Build Coastguard Worker    case MSM_PARAM_SUSPENDS:
120*61046927SAndroid Build Coastguard Worker       gp->value = 0;
121*61046927SAndroid Build Coastguard Worker       return 0;
122*61046927SAndroid Build Coastguard Worker    case MSM_PARAM_VA_START:
123*61046927SAndroid Build Coastguard Worker    case MSM_PARAM_VA_SIZE:
124*61046927SAndroid Build Coastguard Worker       gp->value = 0x100000000ULL;
125*61046927SAndroid Build Coastguard Worker       return 0;
126*61046927SAndroid Build Coastguard Worker    default:
127*61046927SAndroid Build Coastguard Worker       fprintf(stderr, "Unknown DRM_IOCTL_MSM_GET_PARAM %d\n", gp->param);
128*61046927SAndroid Build Coastguard Worker       return -1;
129*61046927SAndroid Build Coastguard Worker    }
130*61046927SAndroid Build Coastguard Worker }
131*61046927SAndroid Build Coastguard Worker 
132*61046927SAndroid Build Coastguard Worker static int
msm_ioctl_gem_madvise(int fd,unsigned long request,void * arg)133*61046927SAndroid Build Coastguard Worker msm_ioctl_gem_madvise(int fd, unsigned long request, void *arg)
134*61046927SAndroid Build Coastguard Worker {
135*61046927SAndroid Build Coastguard Worker    struct drm_msm_gem_madvise *args = arg;
136*61046927SAndroid Build Coastguard Worker 
137*61046927SAndroid Build Coastguard Worker    args->retained = true;
138*61046927SAndroid Build Coastguard Worker 
139*61046927SAndroid Build Coastguard Worker    return 0;
140*61046927SAndroid Build Coastguard Worker }
141*61046927SAndroid Build Coastguard Worker 
142*61046927SAndroid Build Coastguard Worker static ioctl_fn_t driver_ioctls[] = {
143*61046927SAndroid Build Coastguard Worker    [DRM_MSM_GET_PARAM] = msm_ioctl_get_param,
144*61046927SAndroid Build Coastguard Worker    [DRM_MSM_SET_PARAM] = msm_ioctl_noop,
145*61046927SAndroid Build Coastguard Worker    [DRM_MSM_GEM_NEW] = msm_ioctl_gem_new,
146*61046927SAndroid Build Coastguard Worker    [DRM_MSM_GEM_INFO] = msm_ioctl_gem_info,
147*61046927SAndroid Build Coastguard Worker    [DRM_MSM_GEM_CPU_PREP] = msm_ioctl_noop,
148*61046927SAndroid Build Coastguard Worker    [DRM_MSM_GEM_CPU_FINI] = msm_ioctl_noop,
149*61046927SAndroid Build Coastguard Worker    [DRM_MSM_GEM_SUBMIT] = msm_ioctl_noop,
150*61046927SAndroid Build Coastguard Worker    [DRM_MSM_WAIT_FENCE] = msm_ioctl_noop,
151*61046927SAndroid Build Coastguard Worker    [DRM_MSM_GEM_MADVISE] = msm_ioctl_gem_madvise,
152*61046927SAndroid Build Coastguard Worker    [DRM_MSM_SUBMITQUEUE_NEW] = msm_ioctl_noop,
153*61046927SAndroid Build Coastguard Worker    [DRM_MSM_SUBMITQUEUE_CLOSE] = msm_ioctl_noop,
154*61046927SAndroid Build Coastguard Worker    [DRM_MSM_SUBMITQUEUE_QUERY] = msm_ioctl_noop,
155*61046927SAndroid Build Coastguard Worker };
156*61046927SAndroid Build Coastguard Worker 
157*61046927SAndroid Build Coastguard Worker #define CHIPID(maj, min, rev, pat)                                             \
158*61046927SAndroid Build Coastguard Worker    ((maj << 24) | (min << 16) | (rev << 8) | (pat))
159*61046927SAndroid Build Coastguard Worker 
160*61046927SAndroid Build Coastguard Worker static const struct msm_device_info device_infos[] = {
161*61046927SAndroid Build Coastguard Worker    {
162*61046927SAndroid Build Coastguard Worker       /* First entry is default */
163*61046927SAndroid Build Coastguard Worker       .gpu_id = 630,
164*61046927SAndroid Build Coastguard Worker       .chip_id = CHIPID(6, 3, 0, 0xff),
165*61046927SAndroid Build Coastguard Worker       .gmem_size = 1024 * 1024,
166*61046927SAndroid Build Coastguard Worker    },
167*61046927SAndroid Build Coastguard Worker    {
168*61046927SAndroid Build Coastguard Worker       .gpu_id = 200,
169*61046927SAndroid Build Coastguard Worker       .chip_id = CHIPID(2, 0, 0, 0),
170*61046927SAndroid Build Coastguard Worker       .gmem_size = 256 * 1024,
171*61046927SAndroid Build Coastguard Worker    },
172*61046927SAndroid Build Coastguard Worker    {
173*61046927SAndroid Build Coastguard Worker       .gpu_id = 201,
174*61046927SAndroid Build Coastguard Worker       .chip_id = CHIPID(2, 0, 0, 1),
175*61046927SAndroid Build Coastguard Worker       .gmem_size = 128 * 1024,
176*61046927SAndroid Build Coastguard Worker    },
177*61046927SAndroid Build Coastguard Worker    {
178*61046927SAndroid Build Coastguard Worker       .gpu_id = 220,
179*61046927SAndroid Build Coastguard Worker       .chip_id = CHIPID(2, 2, 0, 0xff),
180*61046927SAndroid Build Coastguard Worker       .gmem_size = 512 * 1024,
181*61046927SAndroid Build Coastguard Worker    },
182*61046927SAndroid Build Coastguard Worker    {
183*61046927SAndroid Build Coastguard Worker       .gpu_id = 305,
184*61046927SAndroid Build Coastguard Worker       .chip_id = CHIPID(3, 0, 5, 0xff),
185*61046927SAndroid Build Coastguard Worker       .gmem_size = 256 * 1024,
186*61046927SAndroid Build Coastguard Worker    },
187*61046927SAndroid Build Coastguard Worker    {
188*61046927SAndroid Build Coastguard Worker       .gpu_id = 307,
189*61046927SAndroid Build Coastguard Worker       .chip_id = CHIPID(3, 0, 6, 0),
190*61046927SAndroid Build Coastguard Worker       .gmem_size = 128 * 1024,
191*61046927SAndroid Build Coastguard Worker    },
192*61046927SAndroid Build Coastguard Worker    {
193*61046927SAndroid Build Coastguard Worker       .gpu_id = 320,
194*61046927SAndroid Build Coastguard Worker       .chip_id = CHIPID(3, 2, 0xff, 0xff),
195*61046927SAndroid Build Coastguard Worker       .gmem_size = 512 * 1024,
196*61046927SAndroid Build Coastguard Worker    },
197*61046927SAndroid Build Coastguard Worker    {
198*61046927SAndroid Build Coastguard Worker       .gpu_id = 330,
199*61046927SAndroid Build Coastguard Worker       .chip_id = CHIPID(3, 3, 0, 0xff),
200*61046927SAndroid Build Coastguard Worker       .gmem_size = 1024 * 1024,
201*61046927SAndroid Build Coastguard Worker    },
202*61046927SAndroid Build Coastguard Worker    {
203*61046927SAndroid Build Coastguard Worker       .gpu_id = 420,
204*61046927SAndroid Build Coastguard Worker       .chip_id = CHIPID(4, 2, 0, 0xff),
205*61046927SAndroid Build Coastguard Worker       .gmem_size = 1536 * 1024,
206*61046927SAndroid Build Coastguard Worker    },
207*61046927SAndroid Build Coastguard Worker    {
208*61046927SAndroid Build Coastguard Worker       .gpu_id = 430,
209*61046927SAndroid Build Coastguard Worker       .chip_id = CHIPID(4, 3, 0, 0xff),
210*61046927SAndroid Build Coastguard Worker       .gmem_size = 1536 * 1024,
211*61046927SAndroid Build Coastguard Worker    },
212*61046927SAndroid Build Coastguard Worker    {
213*61046927SAndroid Build Coastguard Worker       .gpu_id = 510,
214*61046927SAndroid Build Coastguard Worker       .chip_id = CHIPID(5, 1, 0, 0xff),
215*61046927SAndroid Build Coastguard Worker       .gmem_size = 256 * 1024,
216*61046927SAndroid Build Coastguard Worker    },
217*61046927SAndroid Build Coastguard Worker    {
218*61046927SAndroid Build Coastguard Worker       .gpu_id = 530,
219*61046927SAndroid Build Coastguard Worker       .chip_id = CHIPID(5, 3, 0, 2),
220*61046927SAndroid Build Coastguard Worker       .gmem_size = 1024 * 1024,
221*61046927SAndroid Build Coastguard Worker    },
222*61046927SAndroid Build Coastguard Worker    {
223*61046927SAndroid Build Coastguard Worker       .gpu_id = 540,
224*61046927SAndroid Build Coastguard Worker       .chip_id = CHIPID(5, 4, 0, 2),
225*61046927SAndroid Build Coastguard Worker       .gmem_size = 1024 * 1024,
226*61046927SAndroid Build Coastguard Worker    },
227*61046927SAndroid Build Coastguard Worker    {
228*61046927SAndroid Build Coastguard Worker       .gpu_id = 618,
229*61046927SAndroid Build Coastguard Worker       .chip_id = CHIPID(6, 1, 8, 0xff),
230*61046927SAndroid Build Coastguard Worker       .gmem_size = 512 * 1024,
231*61046927SAndroid Build Coastguard Worker    },
232*61046927SAndroid Build Coastguard Worker    {
233*61046927SAndroid Build Coastguard Worker       .gpu_id = 660,
234*61046927SAndroid Build Coastguard Worker       .chip_id = CHIPID(6, 6, 0, 0xff),
235*61046927SAndroid Build Coastguard Worker       .gmem_size = 1024 * 1024 + 512 * 1024,
236*61046927SAndroid Build Coastguard Worker    },
237*61046927SAndroid Build Coastguard Worker    {
238*61046927SAndroid Build Coastguard Worker       .gpu_id = 730,
239*61046927SAndroid Build Coastguard Worker       .chip_id = 0x07030001,
240*61046927SAndroid Build Coastguard Worker       .gmem_size = 2 * 1024 * 1024,
241*61046927SAndroid Build Coastguard Worker    },
242*61046927SAndroid Build Coastguard Worker    {
243*61046927SAndroid Build Coastguard Worker       .gpu_id = 740,
244*61046927SAndroid Build Coastguard Worker       .chip_id = 0x43050a01,
245*61046927SAndroid Build Coastguard Worker       .gmem_size = 3 * 1024 * 1024,
246*61046927SAndroid Build Coastguard Worker    },
247*61046927SAndroid Build Coastguard Worker    {
248*61046927SAndroid Build Coastguard Worker       .gpu_id = 750,
249*61046927SAndroid Build Coastguard Worker       .chip_id = 0x43051401,
250*61046927SAndroid Build Coastguard Worker       .gmem_size = 3 * 1024 * 1024,
251*61046927SAndroid Build Coastguard Worker    },
252*61046927SAndroid Build Coastguard Worker };
253*61046927SAndroid Build Coastguard Worker 
254*61046927SAndroid Build Coastguard Worker static void
msm_driver_get_device_info(void)255*61046927SAndroid Build Coastguard Worker msm_driver_get_device_info(void)
256*61046927SAndroid Build Coastguard Worker {
257*61046927SAndroid Build Coastguard Worker    const char *env = getenv("FD_GPU_ID");
258*61046927SAndroid Build Coastguard Worker 
259*61046927SAndroid Build Coastguard Worker    if (!env) {
260*61046927SAndroid Build Coastguard Worker       device_info = &device_infos[0];
261*61046927SAndroid Build Coastguard Worker       return;
262*61046927SAndroid Build Coastguard Worker    }
263*61046927SAndroid Build Coastguard Worker 
264*61046927SAndroid Build Coastguard Worker    int gpu_id = atoi(env);
265*61046927SAndroid Build Coastguard Worker    for (int i = 0; i < ARRAY_SIZE(device_infos); i++) {
266*61046927SAndroid Build Coastguard Worker       if (device_infos[i].gpu_id == gpu_id) {
267*61046927SAndroid Build Coastguard Worker          device_info = &device_infos[i];
268*61046927SAndroid Build Coastguard Worker          return;
269*61046927SAndroid Build Coastguard Worker       }
270*61046927SAndroid Build Coastguard Worker    }
271*61046927SAndroid Build Coastguard Worker 
272*61046927SAndroid Build Coastguard Worker    fprintf(stderr, "FD_GPU_ID unrecognized, shim supports %d",
273*61046927SAndroid Build Coastguard Worker            device_infos[0].gpu_id);
274*61046927SAndroid Build Coastguard Worker    for (int i = 1; i < ARRAY_SIZE(device_infos); i++)
275*61046927SAndroid Build Coastguard Worker       fprintf(stderr, ", %d", device_infos[i].gpu_id);
276*61046927SAndroid Build Coastguard Worker    fprintf(stderr, "\n");
277*61046927SAndroid Build Coastguard Worker    abort();
278*61046927SAndroid Build Coastguard Worker }
279*61046927SAndroid Build Coastguard Worker 
280*61046927SAndroid Build Coastguard Worker void
drm_shim_driver_init(void)281*61046927SAndroid Build Coastguard Worker drm_shim_driver_init(void)
282*61046927SAndroid Build Coastguard Worker {
283*61046927SAndroid Build Coastguard Worker    shim_device.bus_type = DRM_BUS_PLATFORM;
284*61046927SAndroid Build Coastguard Worker    shim_device.driver_name = "msm";
285*61046927SAndroid Build Coastguard Worker    shim_device.driver_ioctls = driver_ioctls;
286*61046927SAndroid Build Coastguard Worker    shim_device.driver_ioctl_count = ARRAY_SIZE(driver_ioctls);
287*61046927SAndroid Build Coastguard Worker 
288*61046927SAndroid Build Coastguard Worker    /* msm uses the DRM version to expose features, instead of getparam. */
289*61046927SAndroid Build Coastguard Worker    shim_device.version_major = 1;
290*61046927SAndroid Build Coastguard Worker    shim_device.version_minor = 9;
291*61046927SAndroid Build Coastguard Worker    shim_device.version_patchlevel = 0;
292*61046927SAndroid Build Coastguard Worker 
293*61046927SAndroid Build Coastguard Worker    msm_driver_get_device_info();
294*61046927SAndroid Build Coastguard Worker 
295*61046927SAndroid Build Coastguard Worker    drm_shim_override_file("OF_FULLNAME=/rdb/msm\n"
296*61046927SAndroid Build Coastguard Worker                           "OF_COMPATIBLE_N=1\n"
297*61046927SAndroid Build Coastguard Worker                           "OF_COMPATIBLE_0=qcom,adreno\n",
298*61046927SAndroid Build Coastguard Worker                           "/sys/dev/char/%d:%d/device/uevent", DRM_MAJOR,
299*61046927SAndroid Build Coastguard Worker                           render_node_minor);
300*61046927SAndroid Build Coastguard Worker }
301