xref: /aosp_15_r20/external/mesa3d/src/nouveau/drm-shim/nouveau_noop.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2021 Ilia Mirkin
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 <stdint.h>
27*61046927SAndroid Build Coastguard Worker #include <stdlib.h>
28*61046927SAndroid Build Coastguard Worker #include <sys/ioctl.h>
29*61046927SAndroid Build Coastguard Worker #include "drm-uapi/nouveau_drm.h"
30*61046927SAndroid Build Coastguard Worker #include "nouveau/nvif/ioctl.h"
31*61046927SAndroid Build Coastguard Worker #include "nouveau/nvif/cl0080.h"
32*61046927SAndroid Build Coastguard Worker #include "drm-shim/drm_shim.h"
33*61046927SAndroid Build Coastguard Worker #include "util/u_math.h"
34*61046927SAndroid Build Coastguard Worker 
35*61046927SAndroid Build Coastguard Worker #include "../../gallium/drivers/nouveau/nv_object.xml.h"
36*61046927SAndroid Build Coastguard Worker bool drm_shim_driver_prefers_first_render_node = true;
37*61046927SAndroid Build Coastguard Worker 
38*61046927SAndroid Build Coastguard Worker struct nouveau_device {
39*61046927SAndroid Build Coastguard Worker    uint64_t next_offset;
40*61046927SAndroid Build Coastguard Worker };
41*61046927SAndroid Build Coastguard Worker 
42*61046927SAndroid Build Coastguard Worker static struct nouveau_device nouveau = {
43*61046927SAndroid Build Coastguard Worker    .next_offset = 0x1000,
44*61046927SAndroid Build Coastguard Worker };
45*61046927SAndroid Build Coastguard Worker 
46*61046927SAndroid Build Coastguard Worker struct nouveau_shim_bo {
47*61046927SAndroid Build Coastguard Worker    struct shim_bo base;
48*61046927SAndroid Build Coastguard Worker    uint64_t offset;
49*61046927SAndroid Build Coastguard Worker };
50*61046927SAndroid Build Coastguard Worker 
51*61046927SAndroid Build Coastguard Worker static struct nouveau_shim_bo *
nouveau_shim_bo(struct shim_bo * bo)52*61046927SAndroid Build Coastguard Worker nouveau_shim_bo(struct shim_bo *bo)
53*61046927SAndroid Build Coastguard Worker {
54*61046927SAndroid Build Coastguard Worker    return (struct nouveau_shim_bo *)bo;
55*61046927SAndroid Build Coastguard Worker }
56*61046927SAndroid Build Coastguard Worker 
57*61046927SAndroid Build Coastguard Worker struct nouveau_device_info {
58*61046927SAndroid Build Coastguard Worker    uint32_t chip_id;
59*61046927SAndroid Build Coastguard Worker };
60*61046927SAndroid Build Coastguard Worker 
61*61046927SAndroid Build Coastguard Worker static struct nouveau_device_info device_info;
62*61046927SAndroid Build Coastguard Worker 
63*61046927SAndroid Build Coastguard Worker static int
nouveau_ioctl_noop(int fd,unsigned long request,void * arg)64*61046927SAndroid Build Coastguard Worker nouveau_ioctl_noop(int fd, unsigned long request, void *arg)
65*61046927SAndroid Build Coastguard Worker {
66*61046927SAndroid Build Coastguard Worker    return 0;
67*61046927SAndroid Build Coastguard Worker }
68*61046927SAndroid Build Coastguard Worker 
69*61046927SAndroid Build Coastguard Worker static int
nouveau_ioctl_gem_new(int fd,unsigned long request,void * arg)70*61046927SAndroid Build Coastguard Worker nouveau_ioctl_gem_new(int fd, unsigned long request, void *arg)
71*61046927SAndroid Build Coastguard Worker {
72*61046927SAndroid Build Coastguard Worker    struct shim_fd *shim_fd = drm_shim_fd_lookup(fd);
73*61046927SAndroid Build Coastguard Worker    struct drm_nouveau_gem_new *create = arg;
74*61046927SAndroid Build Coastguard Worker    struct nouveau_shim_bo *bo = calloc(1, sizeof(*bo));
75*61046927SAndroid Build Coastguard Worker 
76*61046927SAndroid Build Coastguard Worker    drm_shim_bo_init(&bo->base, create->info.size);
77*61046927SAndroid Build Coastguard Worker 
78*61046927SAndroid Build Coastguard Worker    assert(ULONG_MAX - nouveau.next_offset > create->info.size);
79*61046927SAndroid Build Coastguard Worker 
80*61046927SAndroid Build Coastguard Worker    create->info.handle = drm_shim_bo_get_handle(shim_fd, &bo->base);
81*61046927SAndroid Build Coastguard Worker    create->info.map_handle = drm_shim_bo_get_mmap_offset(shim_fd, &bo->base);
82*61046927SAndroid Build Coastguard Worker 
83*61046927SAndroid Build Coastguard Worker    if (create->align != 0)
84*61046927SAndroid Build Coastguard Worker       nouveau.next_offset = align64(nouveau.next_offset, create->align);
85*61046927SAndroid Build Coastguard Worker    create->info.offset = nouveau.next_offset;
86*61046927SAndroid Build Coastguard Worker    nouveau.next_offset += create->info.size;
87*61046927SAndroid Build Coastguard Worker 
88*61046927SAndroid Build Coastguard Worker    bo->offset = create->info.offset;
89*61046927SAndroid Build Coastguard Worker 
90*61046927SAndroid Build Coastguard Worker    drm_shim_bo_put(&bo->base);
91*61046927SAndroid Build Coastguard Worker 
92*61046927SAndroid Build Coastguard Worker    return 0;
93*61046927SAndroid Build Coastguard Worker }
94*61046927SAndroid Build Coastguard Worker 
95*61046927SAndroid Build Coastguard Worker static int
nouveau_ioctl_gem_info(int fd,unsigned long request,void * arg)96*61046927SAndroid Build Coastguard Worker nouveau_ioctl_gem_info(int fd, unsigned long request, void *arg)
97*61046927SAndroid Build Coastguard Worker {
98*61046927SAndroid Build Coastguard Worker    struct shim_fd *shim_fd = drm_shim_fd_lookup(fd);
99*61046927SAndroid Build Coastguard Worker    struct drm_nouveau_gem_info *info = arg;
100*61046927SAndroid Build Coastguard Worker    struct nouveau_shim_bo *bo =
101*61046927SAndroid Build Coastguard Worker       nouveau_shim_bo(drm_shim_bo_lookup(shim_fd, info->handle));
102*61046927SAndroid Build Coastguard Worker    info->map_handle = drm_shim_bo_get_mmap_offset(shim_fd, &bo->base);
103*61046927SAndroid Build Coastguard Worker    info->offset = bo->offset;
104*61046927SAndroid Build Coastguard Worker    info->size = bo->base.size;
105*61046927SAndroid Build Coastguard Worker 
106*61046927SAndroid Build Coastguard Worker    drm_shim_bo_put(&bo->base);
107*61046927SAndroid Build Coastguard Worker 
108*61046927SAndroid Build Coastguard Worker    return 0;
109*61046927SAndroid Build Coastguard Worker }
110*61046927SAndroid Build Coastguard Worker 
111*61046927SAndroid Build Coastguard Worker static int
nouveau_ioctl_gem_pushbuf(int fd,unsigned long request,void * arg)112*61046927SAndroid Build Coastguard Worker nouveau_ioctl_gem_pushbuf(int fd, unsigned long request, void *arg)
113*61046927SAndroid Build Coastguard Worker {
114*61046927SAndroid Build Coastguard Worker    struct drm_nouveau_gem_pushbuf *submit = arg;
115*61046927SAndroid Build Coastguard Worker    submit->vram_available = 3ULL << 30;
116*61046927SAndroid Build Coastguard Worker    submit->gart_available = 1ULL << 40;
117*61046927SAndroid Build Coastguard Worker    return 0;
118*61046927SAndroid Build Coastguard Worker }
119*61046927SAndroid Build Coastguard Worker 
120*61046927SAndroid Build Coastguard Worker static int
nouveau_ioctl_channel_alloc(int fd,unsigned long request,void * arg)121*61046927SAndroid Build Coastguard Worker nouveau_ioctl_channel_alloc(int fd, unsigned long request, void *arg)
122*61046927SAndroid Build Coastguard Worker {
123*61046927SAndroid Build Coastguard Worker    struct shim_fd *shim_fd = drm_shim_fd_lookup(fd);
124*61046927SAndroid Build Coastguard Worker    struct drm_nouveau_channel_alloc *alloc = arg;
125*61046927SAndroid Build Coastguard Worker    if (device_info.chip_id == 0x50 || device_info.chip_id >= 0x80)
126*61046927SAndroid Build Coastguard Worker       alloc->pushbuf_domains = NOUVEAU_GEM_DOMAIN_VRAM | NOUVEAU_GEM_DOMAIN_GART;
127*61046927SAndroid Build Coastguard Worker    else
128*61046927SAndroid Build Coastguard Worker       alloc->pushbuf_domains = NOUVEAU_GEM_DOMAIN_GART;
129*61046927SAndroid Build Coastguard Worker 
130*61046927SAndroid Build Coastguard Worker    /* NOTE: this will get leaked since we don't handle the channel
131*61046927SAndroid Build Coastguard Worker     * free. However only one channel is created per screen, so impact should
132*61046927SAndroid Build Coastguard Worker     * be limited. */
133*61046927SAndroid Build Coastguard Worker    struct nouveau_shim_bo *notify = calloc(1, sizeof(*notify));
134*61046927SAndroid Build Coastguard Worker    drm_shim_bo_init(&notify->base, 0x1000);
135*61046927SAndroid Build Coastguard Worker    notify->offset = nouveau.next_offset;
136*61046927SAndroid Build Coastguard Worker    nouveau.next_offset += 0x1000;
137*61046927SAndroid Build Coastguard Worker    alloc->notifier_handle = drm_shim_bo_get_handle(shim_fd, &notify->base);
138*61046927SAndroid Build Coastguard Worker 
139*61046927SAndroid Build Coastguard Worker    drm_shim_bo_put(&notify->base);
140*61046927SAndroid Build Coastguard Worker 
141*61046927SAndroid Build Coastguard Worker    return 0;
142*61046927SAndroid Build Coastguard Worker }
143*61046927SAndroid Build Coastguard Worker 
144*61046927SAndroid Build Coastguard Worker static int
nouveau_ioctl_get_param(int fd,unsigned long request,void * arg)145*61046927SAndroid Build Coastguard Worker nouveau_ioctl_get_param(int fd, unsigned long request, void *arg)
146*61046927SAndroid Build Coastguard Worker {
147*61046927SAndroid Build Coastguard Worker    struct drm_nouveau_getparam *gp = arg;
148*61046927SAndroid Build Coastguard Worker 
149*61046927SAndroid Build Coastguard Worker    switch (gp->param) {
150*61046927SAndroid Build Coastguard Worker    case NOUVEAU_GETPARAM_CHIPSET_ID:
151*61046927SAndroid Build Coastguard Worker       gp->value = device_info.chip_id;
152*61046927SAndroid Build Coastguard Worker       return 0;
153*61046927SAndroid Build Coastguard Worker    case NOUVEAU_GETPARAM_PCI_VENDOR:
154*61046927SAndroid Build Coastguard Worker       gp->value = 0x10de;
155*61046927SAndroid Build Coastguard Worker       return 0;
156*61046927SAndroid Build Coastguard Worker    case NOUVEAU_GETPARAM_PCI_DEVICE:
157*61046927SAndroid Build Coastguard Worker       gp->value = 0x1004;
158*61046927SAndroid Build Coastguard Worker       return 0;
159*61046927SAndroid Build Coastguard Worker    case NOUVEAU_GETPARAM_BUS_TYPE:
160*61046927SAndroid Build Coastguard Worker       gp->value = 2 /* NV_PCIE */;
161*61046927SAndroid Build Coastguard Worker       return 0;
162*61046927SAndroid Build Coastguard Worker    case NOUVEAU_GETPARAM_FB_SIZE:
163*61046927SAndroid Build Coastguard Worker       gp->value = 3ULL << 30;
164*61046927SAndroid Build Coastguard Worker       return 0;
165*61046927SAndroid Build Coastguard Worker    case NOUVEAU_GETPARAM_AGP_SIZE:
166*61046927SAndroid Build Coastguard Worker       gp->value = 1ULL << 40;
167*61046927SAndroid Build Coastguard Worker       return 0;
168*61046927SAndroid Build Coastguard Worker    case NOUVEAU_GETPARAM_PTIMER_TIME:
169*61046927SAndroid Build Coastguard Worker       gp->value = 0;
170*61046927SAndroid Build Coastguard Worker       return 0;
171*61046927SAndroid Build Coastguard Worker    case NOUVEAU_GETPARAM_HAS_BO_USAGE:
172*61046927SAndroid Build Coastguard Worker       gp->value = 1;
173*61046927SAndroid Build Coastguard Worker       return 0;
174*61046927SAndroid Build Coastguard Worker    case NOUVEAU_GETPARAM_GRAPH_UNITS:
175*61046927SAndroid Build Coastguard Worker       gp->value = 0x01000101;
176*61046927SAndroid Build Coastguard Worker       return 0;
177*61046927SAndroid Build Coastguard Worker    default:
178*61046927SAndroid Build Coastguard Worker       fprintf(stderr, "Unknown DRM_IOCTL_NOUVEAU_GETPARAM %llu\n",
179*61046927SAndroid Build Coastguard Worker               (long long unsigned)gp->param);
180*61046927SAndroid Build Coastguard Worker       return -1;
181*61046927SAndroid Build Coastguard Worker    }
182*61046927SAndroid Build Coastguard Worker }
183*61046927SAndroid Build Coastguard Worker 
184*61046927SAndroid Build Coastguard Worker static int
nouveau_ioctl_nvif(int fd,unsigned long request,void * arg)185*61046927SAndroid Build Coastguard Worker nouveau_ioctl_nvif(int fd, unsigned long request, void *arg)
186*61046927SAndroid Build Coastguard Worker {
187*61046927SAndroid Build Coastguard Worker    struct {
188*61046927SAndroid Build Coastguard Worker       struct nvif_ioctl_v0 ioctl;
189*61046927SAndroid Build Coastguard Worker    } *args = arg;
190*61046927SAndroid Build Coastguard Worker 
191*61046927SAndroid Build Coastguard Worker    switch (args->ioctl.type) {
192*61046927SAndroid Build Coastguard Worker    case NVIF_IOCTL_V0_MTHD: {
193*61046927SAndroid Build Coastguard Worker       struct {
194*61046927SAndroid Build Coastguard Worker          struct nvif_ioctl_v0 ioctl;
195*61046927SAndroid Build Coastguard Worker          struct nvif_ioctl_mthd_v0 mthd;
196*61046927SAndroid Build Coastguard Worker       } *mthd = (void *)args;
197*61046927SAndroid Build Coastguard Worker       switch (mthd->mthd.method) {
198*61046927SAndroid Build Coastguard Worker       case NV_DEVICE_V0_INFO: {
199*61046927SAndroid Build Coastguard Worker          struct nv_device_info_v0 *info = (void *)&mthd->mthd.data;
200*61046927SAndroid Build Coastguard Worker          info->chipset = device_info.chip_id;
201*61046927SAndroid Build Coastguard Worker          info->platform = NV_DEVICE_INFO_V0_PCIE;
202*61046927SAndroid Build Coastguard Worker 
203*61046927SAndroid Build Coastguard Worker          /* make something up */
204*61046927SAndroid Build Coastguard Worker          info->ram_user = 3ULL << 30;
205*61046927SAndroid Build Coastguard Worker          break;
206*61046927SAndroid Build Coastguard Worker       }
207*61046927SAndroid Build Coastguard Worker       default:
208*61046927SAndroid Build Coastguard Worker          break;
209*61046927SAndroid Build Coastguard Worker       }
210*61046927SAndroid Build Coastguard Worker       break;
211*61046927SAndroid Build Coastguard Worker    }
212*61046927SAndroid Build Coastguard Worker    case NVIF_IOCTL_V0_SCLASS: {
213*61046927SAndroid Build Coastguard Worker       struct {
214*61046927SAndroid Build Coastguard Worker          struct nvif_ioctl_v0 ioctl;
215*61046927SAndroid Build Coastguard Worker          struct nvif_ioctl_sclass_v0 sclass;
216*61046927SAndroid Build Coastguard Worker       } *sclass = (void *)args;
217*61046927SAndroid Build Coastguard Worker 
218*61046927SAndroid Build Coastguard Worker       if (sclass->sclass.count == 0) {
219*61046927SAndroid Build Coastguard Worker          sclass->sclass.count = device_info.chip_id >= 0xe0 ? 4 : 3;
220*61046927SAndroid Build Coastguard Worker          return 0;
221*61046927SAndroid Build Coastguard Worker       }
222*61046927SAndroid Build Coastguard Worker       int idx = 0;
223*61046927SAndroid Build Coastguard Worker       /* m2mf */
224*61046927SAndroid Build Coastguard Worker       switch (device_info.chip_id & ~0xf) {
225*61046927SAndroid Build Coastguard Worker       case 0x170:
226*61046927SAndroid Build Coastguard Worker       case 0x160:
227*61046927SAndroid Build Coastguard Worker       case 0x140:
228*61046927SAndroid Build Coastguard Worker       case 0x130:
229*61046927SAndroid Build Coastguard Worker       case 0x120:
230*61046927SAndroid Build Coastguard Worker       case 0x110:
231*61046927SAndroid Build Coastguard Worker       case 0x100:
232*61046927SAndroid Build Coastguard Worker       case 0xf0:
233*61046927SAndroid Build Coastguard Worker          sclass->sclass.oclass[idx].oclass = NVF0_P2MF_CLASS;
234*61046927SAndroid Build Coastguard Worker          break;
235*61046927SAndroid Build Coastguard Worker       case 0xe0:
236*61046927SAndroid Build Coastguard Worker          sclass->sclass.oclass[idx].oclass = NVE4_P2MF_CLASS;
237*61046927SAndroid Build Coastguard Worker          break;
238*61046927SAndroid Build Coastguard Worker       default:
239*61046927SAndroid Build Coastguard Worker          sclass->sclass.oclass[idx].oclass = NVC0_M2MF_CLASS;
240*61046927SAndroid Build Coastguard Worker          break;
241*61046927SAndroid Build Coastguard Worker       }
242*61046927SAndroid Build Coastguard Worker       sclass->sclass.oclass[idx].minver = -1;
243*61046927SAndroid Build Coastguard Worker       sclass->sclass.oclass[idx].maxver = -1;
244*61046927SAndroid Build Coastguard Worker       idx++;
245*61046927SAndroid Build Coastguard Worker       if (device_info.chip_id >= 0xe0) {
246*61046927SAndroid Build Coastguard Worker          switch (device_info.chip_id & ~0xf) {
247*61046927SAndroid Build Coastguard Worker          case 0x170:
248*61046927SAndroid Build Coastguard Worker             sclass->sclass.oclass[idx].oclass = AMPERE_DMA_COPY_A;
249*61046927SAndroid Build Coastguard Worker             break;
250*61046927SAndroid Build Coastguard Worker          case 0x160:
251*61046927SAndroid Build Coastguard Worker             sclass->sclass.oclass[idx].oclass = TURING_DMA_COPY_A;
252*61046927SAndroid Build Coastguard Worker             break;
253*61046927SAndroid Build Coastguard Worker          case 0x140:
254*61046927SAndroid Build Coastguard Worker             sclass->sclass.oclass[idx].oclass = VOLTA_DMA_COPY_A;
255*61046927SAndroid Build Coastguard Worker             break;
256*61046927SAndroid Build Coastguard Worker          case 0x130:
257*61046927SAndroid Build Coastguard Worker             sclass->sclass.oclass[idx].oclass = PASCAL_DMA_COPY_A;
258*61046927SAndroid Build Coastguard Worker             break;
259*61046927SAndroid Build Coastguard Worker          case 0x120:
260*61046927SAndroid Build Coastguard Worker          case 0x110:
261*61046927SAndroid Build Coastguard Worker             sclass->sclass.oclass[idx].oclass = MAXWELL_DMA_COPY_A;
262*61046927SAndroid Build Coastguard Worker             break;
263*61046927SAndroid Build Coastguard Worker          case 0x100:
264*61046927SAndroid Build Coastguard Worker          case 0xf0:
265*61046927SAndroid Build Coastguard Worker          case 0xe0:
266*61046927SAndroid Build Coastguard Worker             sclass->sclass.oclass[idx].oclass = KEPLER_DMA_COPY_A;
267*61046927SAndroid Build Coastguard Worker             break;
268*61046927SAndroid Build Coastguard Worker          }
269*61046927SAndroid Build Coastguard Worker          sclass->sclass.oclass[idx].minver = -1;
270*61046927SAndroid Build Coastguard Worker          sclass->sclass.oclass[idx].maxver = -1;
271*61046927SAndroid Build Coastguard Worker          idx++;
272*61046927SAndroid Build Coastguard Worker       }
273*61046927SAndroid Build Coastguard Worker       /* 2d */
274*61046927SAndroid Build Coastguard Worker       if (device_info.chip_id >= 0x50) {
275*61046927SAndroid Build Coastguard Worker          if (device_info.chip_id <= 0xa0)
276*61046927SAndroid Build Coastguard Worker             sclass->sclass.oclass[idx].oclass = NV50_2D_CLASS;
277*61046927SAndroid Build Coastguard Worker          else
278*61046927SAndroid Build Coastguard Worker             sclass->sclass.oclass[idx].oclass = NVC0_2D_CLASS;
279*61046927SAndroid Build Coastguard Worker 
280*61046927SAndroid Build Coastguard Worker          sclass->sclass.oclass[idx].minver = -1;
281*61046927SAndroid Build Coastguard Worker          sclass->sclass.oclass[idx].maxver = -1;
282*61046927SAndroid Build Coastguard Worker          idx++;
283*61046927SAndroid Build Coastguard Worker       }
284*61046927SAndroid Build Coastguard Worker       /* 3d */
285*61046927SAndroid Build Coastguard Worker       switch (device_info.chip_id & ~0xf) {
286*61046927SAndroid Build Coastguard Worker       case 0x170:
287*61046927SAndroid Build Coastguard Worker          sclass->sclass.oclass[idx].oclass = GA102_3D_CLASS;
288*61046927SAndroid Build Coastguard Worker          break;
289*61046927SAndroid Build Coastguard Worker       case 0x160:
290*61046927SAndroid Build Coastguard Worker          sclass->sclass.oclass[idx].oclass = TU102_3D_CLASS;
291*61046927SAndroid Build Coastguard Worker          break;
292*61046927SAndroid Build Coastguard Worker       case 0x140:
293*61046927SAndroid Build Coastguard Worker          sclass->sclass.oclass[idx].oclass = GV100_3D_CLASS;
294*61046927SAndroid Build Coastguard Worker          break;
295*61046927SAndroid Build Coastguard Worker       case 0x130:
296*61046927SAndroid Build Coastguard Worker          switch (device_info.chip_id) {
297*61046927SAndroid Build Coastguard Worker          case 0x130:
298*61046927SAndroid Build Coastguard Worker          case 0x13b:
299*61046927SAndroid Build Coastguard Worker             sclass->sclass.oclass[idx].oclass = GP100_3D_CLASS;
300*61046927SAndroid Build Coastguard Worker             break;
301*61046927SAndroid Build Coastguard Worker          default:
302*61046927SAndroid Build Coastguard Worker             sclass->sclass.oclass[idx].oclass = GP102_3D_CLASS;
303*61046927SAndroid Build Coastguard Worker             break;
304*61046927SAndroid Build Coastguard Worker          }
305*61046927SAndroid Build Coastguard Worker          break;
306*61046927SAndroid Build Coastguard Worker       case 0x120:
307*61046927SAndroid Build Coastguard Worker          sclass->sclass.oclass[idx].oclass = GM200_3D_CLASS;
308*61046927SAndroid Build Coastguard Worker          break;
309*61046927SAndroid Build Coastguard Worker       case 0x110:
310*61046927SAndroid Build Coastguard Worker          sclass->sclass.oclass[idx].oclass = GM107_3D_CLASS;
311*61046927SAndroid Build Coastguard Worker          break;
312*61046927SAndroid Build Coastguard Worker       case 0x100:
313*61046927SAndroid Build Coastguard Worker       case 0xf0:
314*61046927SAndroid Build Coastguard Worker          sclass->sclass.oclass[idx].oclass = NVF0_3D_CLASS;
315*61046927SAndroid Build Coastguard Worker          break;
316*61046927SAndroid Build Coastguard Worker       case 0xe0:
317*61046927SAndroid Build Coastguard Worker          switch (device_info.chip_id) {
318*61046927SAndroid Build Coastguard Worker          case 0xea:
319*61046927SAndroid Build Coastguard Worker             sclass->sclass.oclass[idx].oclass = NVEA_3D_CLASS;
320*61046927SAndroid Build Coastguard Worker             break;
321*61046927SAndroid Build Coastguard Worker          default:
322*61046927SAndroid Build Coastguard Worker             sclass->sclass.oclass[idx].oclass = NVE4_3D_CLASS;
323*61046927SAndroid Build Coastguard Worker             break;
324*61046927SAndroid Build Coastguard Worker          }
325*61046927SAndroid Build Coastguard Worker          break;
326*61046927SAndroid Build Coastguard Worker       case 0xd0:
327*61046927SAndroid Build Coastguard Worker          sclass->sclass.oclass[idx].oclass = NVC8_3D_CLASS;
328*61046927SAndroid Build Coastguard Worker          break;
329*61046927SAndroid Build Coastguard Worker       default:
330*61046927SAndroid Build Coastguard Worker       case 0xc0:
331*61046927SAndroid Build Coastguard Worker          switch (device_info.chip_id) {
332*61046927SAndroid Build Coastguard Worker          case 0xc8:
333*61046927SAndroid Build Coastguard Worker             sclass->sclass.oclass[idx].oclass = NVC8_3D_CLASS;
334*61046927SAndroid Build Coastguard Worker             break;
335*61046927SAndroid Build Coastguard Worker          case 0xc1:
336*61046927SAndroid Build Coastguard Worker             sclass->sclass.oclass[idx].oclass = NVC1_3D_CLASS;
337*61046927SAndroid Build Coastguard Worker             break;
338*61046927SAndroid Build Coastguard Worker          default:
339*61046927SAndroid Build Coastguard Worker             sclass->sclass.oclass[idx].oclass = NVC0_3D_CLASS;
340*61046927SAndroid Build Coastguard Worker             break;
341*61046927SAndroid Build Coastguard Worker          }
342*61046927SAndroid Build Coastguard Worker          break;
343*61046927SAndroid Build Coastguard Worker       }
344*61046927SAndroid Build Coastguard Worker       sclass->sclass.oclass[idx].minver = -1;
345*61046927SAndroid Build Coastguard Worker       sclass->sclass.oclass[idx].maxver = -1;
346*61046927SAndroid Build Coastguard Worker       idx++;
347*61046927SAndroid Build Coastguard Worker       switch (device_info.chip_id & ~0xf) {
348*61046927SAndroid Build Coastguard Worker       case 0x170:
349*61046927SAndroid Build Coastguard Worker          sclass->sclass.oclass[idx].oclass = GA102_COMPUTE_CLASS;
350*61046927SAndroid Build Coastguard Worker          break;
351*61046927SAndroid Build Coastguard Worker       case 0x160:
352*61046927SAndroid Build Coastguard Worker          sclass->sclass.oclass[idx].oclass = TU102_COMPUTE_CLASS;
353*61046927SAndroid Build Coastguard Worker          break;
354*61046927SAndroid Build Coastguard Worker       case 0x140:
355*61046927SAndroid Build Coastguard Worker          sclass->sclass.oclass[idx].oclass = GV100_COMPUTE_CLASS;
356*61046927SAndroid Build Coastguard Worker          break;
357*61046927SAndroid Build Coastguard Worker       case 0x130:
358*61046927SAndroid Build Coastguard Worker          switch (device_info.chip_id) {
359*61046927SAndroid Build Coastguard Worker          case 0x130:
360*61046927SAndroid Build Coastguard Worker          case 0x13b:
361*61046927SAndroid Build Coastguard Worker             sclass->sclass.oclass[idx].oclass = GP100_COMPUTE_CLASS;
362*61046927SAndroid Build Coastguard Worker             break;
363*61046927SAndroid Build Coastguard Worker          default:
364*61046927SAndroid Build Coastguard Worker             sclass->sclass.oclass[idx].oclass = GP104_COMPUTE_CLASS;
365*61046927SAndroid Build Coastguard Worker             break;
366*61046927SAndroid Build Coastguard Worker          }
367*61046927SAndroid Build Coastguard Worker          break;
368*61046927SAndroid Build Coastguard Worker       case 0x120:
369*61046927SAndroid Build Coastguard Worker          sclass->sclass.oclass[idx].oclass = GM200_COMPUTE_CLASS;
370*61046927SAndroid Build Coastguard Worker          break;
371*61046927SAndroid Build Coastguard Worker       case 0x110:
372*61046927SAndroid Build Coastguard Worker          sclass->sclass.oclass[idx].oclass = GM107_COMPUTE_CLASS;
373*61046927SAndroid Build Coastguard Worker          break;
374*61046927SAndroid Build Coastguard Worker       case 0x100:
375*61046927SAndroid Build Coastguard Worker       case 0xf0:
376*61046927SAndroid Build Coastguard Worker          sclass->sclass.oclass[idx].oclass = NVF0_COMPUTE_CLASS;
377*61046927SAndroid Build Coastguard Worker          break;
378*61046927SAndroid Build Coastguard Worker       case 0xe0:
379*61046927SAndroid Build Coastguard Worker          sclass->sclass.oclass[idx].oclass = NVE4_COMPUTE_CLASS;
380*61046927SAndroid Build Coastguard Worker          break;
381*61046927SAndroid Build Coastguard Worker       default:
382*61046927SAndroid Build Coastguard Worker          sclass->sclass.oclass[idx].oclass = NVC0_COMPUTE_CLASS;
383*61046927SAndroid Build Coastguard Worker          break;
384*61046927SAndroid Build Coastguard Worker       }
385*61046927SAndroid Build Coastguard Worker       sclass->sclass.oclass[idx].minver = -1;
386*61046927SAndroid Build Coastguard Worker       sclass->sclass.oclass[idx].maxver = -1;
387*61046927SAndroid Build Coastguard Worker       break;
388*61046927SAndroid Build Coastguard Worker    }
389*61046927SAndroid Build Coastguard Worker    default:
390*61046927SAndroid Build Coastguard Worker       break;
391*61046927SAndroid Build Coastguard Worker    }
392*61046927SAndroid Build Coastguard Worker 
393*61046927SAndroid Build Coastguard Worker    return 0;
394*61046927SAndroid Build Coastguard Worker }
395*61046927SAndroid Build Coastguard Worker 
396*61046927SAndroid Build Coastguard Worker static ioctl_fn_t driver_ioctls[] = {
397*61046927SAndroid Build Coastguard Worker    [DRM_NOUVEAU_GETPARAM] = nouveau_ioctl_get_param,
398*61046927SAndroid Build Coastguard Worker    [DRM_NOUVEAU_NVIF] = nouveau_ioctl_nvif,
399*61046927SAndroid Build Coastguard Worker    [DRM_NOUVEAU_CHANNEL_ALLOC] = nouveau_ioctl_channel_alloc,
400*61046927SAndroid Build Coastguard Worker    [DRM_NOUVEAU_CHANNEL_FREE] = nouveau_ioctl_noop,
401*61046927SAndroid Build Coastguard Worker    [DRM_NOUVEAU_GROBJ_ALLOC] = nouveau_ioctl_noop,
402*61046927SAndroid Build Coastguard Worker    [DRM_NOUVEAU_NOTIFIEROBJ_ALLOC] = nouveau_ioctl_noop,
403*61046927SAndroid Build Coastguard Worker    [DRM_NOUVEAU_GPUOBJ_FREE] = nouveau_ioctl_noop,
404*61046927SAndroid Build Coastguard Worker    [DRM_NOUVEAU_GEM_NEW] = nouveau_ioctl_gem_new,
405*61046927SAndroid Build Coastguard Worker    [DRM_NOUVEAU_GEM_PUSHBUF] = nouveau_ioctl_gem_pushbuf,
406*61046927SAndroid Build Coastguard Worker    [DRM_NOUVEAU_GEM_CPU_PREP] = nouveau_ioctl_noop,
407*61046927SAndroid Build Coastguard Worker    [DRM_NOUVEAU_GEM_INFO] = nouveau_ioctl_gem_info,
408*61046927SAndroid Build Coastguard Worker    [DRM_NOUVEAU_GEM_CPU_FINI] = nouveau_ioctl_gem_info,
409*61046927SAndroid Build Coastguard Worker    [DRM_NOUVEAU_VM_INIT] = nouveau_ioctl_noop,
410*61046927SAndroid Build Coastguard Worker    [DRM_NOUVEAU_VM_BIND] = nouveau_ioctl_noop,
411*61046927SAndroid Build Coastguard Worker    [DRM_NOUVEAU_EXEC] = nouveau_ioctl_noop,
412*61046927SAndroid Build Coastguard Worker };
413*61046927SAndroid Build Coastguard Worker 
414*61046927SAndroid Build Coastguard Worker static void
nouveau_driver_get_device_info(void)415*61046927SAndroid Build Coastguard Worker nouveau_driver_get_device_info(void)
416*61046927SAndroid Build Coastguard Worker {
417*61046927SAndroid Build Coastguard Worker    const char *env = getenv("NOUVEAU_CHIPSET");
418*61046927SAndroid Build Coastguard Worker 
419*61046927SAndroid Build Coastguard Worker    if (!env) {
420*61046927SAndroid Build Coastguard Worker       device_info.chip_id = 0xf0;
421*61046927SAndroid Build Coastguard Worker       return;
422*61046927SAndroid Build Coastguard Worker    }
423*61046927SAndroid Build Coastguard Worker 
424*61046927SAndroid Build Coastguard Worker    device_info.chip_id = strtol(env, NULL, 16);
425*61046927SAndroid Build Coastguard Worker }
426*61046927SAndroid Build Coastguard Worker 
427*61046927SAndroid Build Coastguard Worker void
drm_shim_driver_init(void)428*61046927SAndroid Build Coastguard Worker drm_shim_driver_init(void)
429*61046927SAndroid Build Coastguard Worker {
430*61046927SAndroid Build Coastguard Worker    shim_device.bus_type = DRM_BUS_PCI;
431*61046927SAndroid Build Coastguard Worker    shim_device.driver_name = "nouveau";
432*61046927SAndroid Build Coastguard Worker    shim_device.driver_ioctls = driver_ioctls;
433*61046927SAndroid Build Coastguard Worker    shim_device.driver_ioctl_count = ARRAY_SIZE(driver_ioctls);
434*61046927SAndroid Build Coastguard Worker 
435*61046927SAndroid Build Coastguard Worker    shim_device.version_major = 1;
436*61046927SAndroid Build Coastguard Worker    shim_device.version_minor = 3;
437*61046927SAndroid Build Coastguard Worker    shim_device.version_patchlevel = 1;
438*61046927SAndroid Build Coastguard Worker 
439*61046927SAndroid Build Coastguard Worker    nouveau_driver_get_device_info();
440*61046927SAndroid Build Coastguard Worker 
441*61046927SAndroid Build Coastguard Worker    /* Ask userspace to consider all fences completed. */
442*61046927SAndroid Build Coastguard Worker    setenv("NOUVEAU_DISABLE_FENCES", "true", true);
443*61046927SAndroid Build Coastguard Worker 
444*61046927SAndroid Build Coastguard Worker    /* nothing looks at the pci id, so fix it to a GTX 780 */
445*61046927SAndroid Build Coastguard Worker    static const char uevent_content[] =
446*61046927SAndroid Build Coastguard Worker       "DRIVER=nouveau\n"
447*61046927SAndroid Build Coastguard Worker       "PCI_CLASS=30000\n"
448*61046927SAndroid Build Coastguard Worker       "PCI_ID=10de:1004\n"
449*61046927SAndroid Build Coastguard Worker       "PCI_SUBSYS_ID=1028:075B\n"
450*61046927SAndroid Build Coastguard Worker       "PCI_SLOT_NAME=0000:01:00.0\n"
451*61046927SAndroid Build Coastguard Worker       "MODALIAS=pci:v000010ded00005916sv00001028sd0000075Bbc03sc00i00\n";
452*61046927SAndroid Build Coastguard Worker    drm_shim_override_file(uevent_content,
453*61046927SAndroid Build Coastguard Worker                           "/sys/dev/char/%d:%d/device/uevent",
454*61046927SAndroid Build Coastguard Worker                           DRM_MAJOR, render_node_minor);
455*61046927SAndroid Build Coastguard Worker    drm_shim_override_file("0x0\n",
456*61046927SAndroid Build Coastguard Worker                           "/sys/dev/char/%d:%d/device/revision",
457*61046927SAndroid Build Coastguard Worker                           DRM_MAJOR, render_node_minor);
458*61046927SAndroid Build Coastguard Worker    drm_shim_override_file("0x10de",
459*61046927SAndroid Build Coastguard Worker                           "/sys/dev/char/%d:%d/device/vendor",
460*61046927SAndroid Build Coastguard Worker                           DRM_MAJOR, render_node_minor);
461*61046927SAndroid Build Coastguard Worker    drm_shim_override_file("0x10de",
462*61046927SAndroid Build Coastguard Worker                           "/sys/devices/pci0000:00/0000:01:00.0/vendor");
463*61046927SAndroid Build Coastguard Worker    drm_shim_override_file("0x1004",
464*61046927SAndroid Build Coastguard Worker                           "/sys/dev/char/%d:%d/device/device",
465*61046927SAndroid Build Coastguard Worker                           DRM_MAJOR, render_node_minor);
466*61046927SAndroid Build Coastguard Worker    drm_shim_override_file("0x1004",
467*61046927SAndroid Build Coastguard Worker                           "/sys/devices/pci0000:00/0000:01:00.0/device");
468*61046927SAndroid Build Coastguard Worker    drm_shim_override_file("0x1234",
469*61046927SAndroid Build Coastguard Worker                           "/sys/dev/char/%d:%d/device/subsystem_vendor",
470*61046927SAndroid Build Coastguard Worker                           DRM_MAJOR, render_node_minor);
471*61046927SAndroid Build Coastguard Worker    drm_shim_override_file("0x1234",
472*61046927SAndroid Build Coastguard Worker                           "/sys/devices/pci0000:00/0000:01:00.0/subsystem_vendor");
473*61046927SAndroid Build Coastguard Worker    drm_shim_override_file("0x1234",
474*61046927SAndroid Build Coastguard Worker                           "/sys/dev/char/%d:%d/device/subsystem_device",
475*61046927SAndroid Build Coastguard Worker                           DRM_MAJOR, render_node_minor);
476*61046927SAndroid Build Coastguard Worker    drm_shim_override_file("0x1234",
477*61046927SAndroid Build Coastguard Worker                           "/sys/devices/pci0000:00/0000:01:00.0/subsystem_device");
478*61046927SAndroid Build Coastguard Worker }
479