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