1b7019ac5SIlia Mirkin /* SPDX-License-Identifier: MIT */
24dc28134SBen Skeggs #ifndef __NOUVEAU_DRV_H__
34dc28134SBen Skeggs #define __NOUVEAU_DRV_H__
494580299SBen Skeggs
577145f1cSBen Skeggs #define DRIVER_AUTHOR "Nouveau Project"
677145f1cSBen Skeggs #define DRIVER_EMAIL "nouveau@lists.freedesktop.org"
777145f1cSBen Skeggs
877145f1cSBen Skeggs #define DRIVER_NAME "nouveau"
9451b58d2SRhys Kidd #define DRIVER_DESC "nVidia Riva/TNT/GeForce/Quadro/Tesla/Tegra K1+"
1077145f1cSBen Skeggs
1177145f1cSBen Skeggs #define DRIVER_MAJOR 1
12b88baab8SDanilo Krummrich #define DRIVER_MINOR 4
13b88baab8SDanilo Krummrich #define DRIVER_PATCHLEVEL 0
14142c21b8SChristoph Bumiller
15142c21b8SChristoph Bumiller /*
16142c21b8SChristoph Bumiller * 1.1.1:
17142c21b8SChristoph Bumiller * - added support for tiled system memory buffer objects
18142c21b8SChristoph Bumiller * - added support for NOUVEAU_GETPARAM_GRAPH_UNITS on [nvc0,nve0].
19142c21b8SChristoph Bumiller * - added support for compressed memory storage types on [nvc0,nve0].
20142c21b8SChristoph Bumiller * - added support for software methods 0x600,0x644,0x6ac on nvc0
21142c21b8SChristoph Bumiller * to control registers on the MPs to enable performance counters,
22142c21b8SChristoph Bumiller * and to control the warp error enable mask (OpenGL requires out of
23142c21b8SChristoph Bumiller * bounds access to local memory to be silently ignored / return 0).
247820e5eeSMario Kleiner * 1.1.2:
257820e5eeSMario Kleiner * - fixes multiple bugs in flip completion events and timestamping
2627111a23SBen Skeggs * 1.2.0:
2727111a23SBen Skeggs * - object api exposed to userspace
2827111a23SBen Skeggs * - fermi,kepler,maxwell zbc
29055dffdfSMaarten Lankhorst * 1.2.1:
30055dffdfSMaarten Lankhorst * - allow concurrent access to bo's mapped read/write.
3182452755SBen Skeggs * 1.2.2:
3282452755SBen Skeggs * - add NOUVEAU_GEM_DOMAIN_COHERENT flag
33a3c1ff87SBen Skeggs * 1.3.0:
34a3c1ff87SBen Skeggs * - NVIF ABI modified, safe because only (current) users are test
35a3c1ff87SBen Skeggs * programs that get directly linked with NVKM.
3679ef5dcaSBen Skeggs * 1.3.1:
3779ef5dcaSBen Skeggs * - implemented limited ABI16/NVIF interop
38142c21b8SChristoph Bumiller */
3977145f1cSBen Skeggs
403a6536c5SHans de Goede #include <linux/notifier.h>
413a6536c5SHans de Goede
420ad72863SBen Skeggs #include <nvif/client.h>
430ad72863SBen Skeggs #include <nvif/device.h>
44f5e55187SBen Skeggs #include <nvif/ioctl.h>
4501670a79SBen Skeggs #include <nvif/mmu.h>
4696da0bcdSBen Skeggs #include <nvif/vmm.h>
470ad72863SBen Skeggs
48c587cd6fSSam Ravnborg #include <drm/drm_connector.h>
49c587cd6fSSam Ravnborg #include <drm/drm_device.h>
50c587cd6fSSam Ravnborg #include <drm/drm_drv.h>
51c587cd6fSSam Ravnborg #include <drm/drm_file.h>
5294580299SBen Skeggs
53a3185f91SChristian König #include <drm/ttm/ttm_bo.h>
54612a9aabSLinus Torvalds #include <drm/ttm/ttm_placement.h>
55ebb945a9SBen Skeggs
56742db30cSTakashi Iwai #include <drm/drm_audio_component.h>
57742db30cSTakashi Iwai
58a4e610b5SBen Skeggs #include "uapi/drm/nouveau_drm.h"
59a4e610b5SBen Skeggs
60ebb945a9SBen Skeggs struct nouveau_channel;
618ba9ff11SAlexandre Courbot struct platform_device;
62ebb945a9SBen Skeggs
63ebb945a9SBen Skeggs #include "nouveau_fence.h"
6477145f1cSBen Skeggs #include "nouveau_bios.h"
65b88baab8SDanilo Krummrich #include "nouveau_sched.h"
6624e8375bSBen Skeggs #include "nouveau_vmm.h"
67b88baab8SDanilo Krummrich #include "nouveau_uvmm.h"
68ebb945a9SBen Skeggs
69ebb945a9SBen Skeggs struct nouveau_drm_tile {
70ebb945a9SBen Skeggs struct nouveau_fence *fence;
71ebb945a9SBen Skeggs bool used;
72ebb945a9SBen Skeggs };
73ebb945a9SBen Skeggs
740ad72863SBen Skeggs enum nouveau_drm_object_route {
75f5e55187SBen Skeggs NVDRM_OBJECT_NVIF = NVIF_IOCTL_V0_OWNER_NVIF,
760ad72863SBen Skeggs NVDRM_OBJECT_USIF,
770ad72863SBen Skeggs NVDRM_OBJECT_ABI16,
78f5e55187SBen Skeggs NVDRM_OBJECT_ANY = NVIF_IOCTL_V0_OWNER_ANY,
790ad72863SBen Skeggs };
800ad72863SBen Skeggs
8194580299SBen Skeggs enum nouveau_drm_handle {
82ebb945a9SBen Skeggs NVDRM_CHAN = 0xcccc0000, /* |= client chid */
8369a6146dSBen Skeggs NVDRM_NVSW = 0x55550000,
8494580299SBen Skeggs };
8594580299SBen Skeggs
8694580299SBen Skeggs struct nouveau_cli {
870ad72863SBen Skeggs struct nvif_client base;
88e75c091bSBen Skeggs struct nouveau_drm *drm;
8920d8a88eSBen Skeggs struct mutex mutex;
9020d8a88eSBen Skeggs
911167c6bcSBen Skeggs struct nvif_device device;
9201670a79SBen Skeggs struct nvif_mmu mmu;
9324e8375bSBen Skeggs struct nouveau_vmm vmm;
94bfe91afaSBen Skeggs struct nouveau_vmm svm;
95266f7618SDanilo Krummrich struct {
96266f7618SDanilo Krummrich struct nouveau_uvmm *ptr;
97266f7618SDanilo Krummrich bool disabled;
98266f7618SDanilo Krummrich } uvmm;
99b88baab8SDanilo Krummrich
1009a0c32d6SDanilo Krummrich struct nouveau_sched *sched;
101b88baab8SDanilo Krummrich
1027f507624SBen Skeggs const struct nvif_mclass *mem;
1031167c6bcSBen Skeggs
10494580299SBen Skeggs struct list_head head;
105ebb945a9SBen Skeggs void *abi16;
10627111a23SBen Skeggs struct list_head objects;
1079ad97edeSBen Skeggs char name[32];
108cb7e88e7SBen Skeggs
109814a2324SBen Skeggs struct work_struct work;
110814a2324SBen Skeggs struct list_head worker;
111cb7e88e7SBen Skeggs struct mutex lock;
11294580299SBen Skeggs };
11394580299SBen Skeggs
114814a2324SBen Skeggs struct nouveau_cli_work {
115814a2324SBen Skeggs void (*func)(struct nouveau_cli_work *);
116814a2324SBen Skeggs struct nouveau_cli *cli;
117814a2324SBen Skeggs struct list_head head;
118814a2324SBen Skeggs
119814a2324SBen Skeggs struct dma_fence *fence;
120814a2324SBen Skeggs struct dma_fence_cb cb;
121814a2324SBen Skeggs };
122814a2324SBen Skeggs
123b88baab8SDanilo Krummrich static inline struct nouveau_uvmm *
nouveau_cli_uvmm(struct nouveau_cli * cli)124b88baab8SDanilo Krummrich nouveau_cli_uvmm(struct nouveau_cli *cli)
125b88baab8SDanilo Krummrich {
126266f7618SDanilo Krummrich return cli ? cli->uvmm.ptr : NULL;
127b88baab8SDanilo Krummrich }
128b88baab8SDanilo Krummrich
129b88baab8SDanilo Krummrich static inline struct nouveau_uvmm *
nouveau_cli_uvmm_locked(struct nouveau_cli * cli)130b88baab8SDanilo Krummrich nouveau_cli_uvmm_locked(struct nouveau_cli *cli)
131b88baab8SDanilo Krummrich {
132b88baab8SDanilo Krummrich struct nouveau_uvmm *uvmm;
133b88baab8SDanilo Krummrich
134b88baab8SDanilo Krummrich mutex_lock(&cli->mutex);
135b88baab8SDanilo Krummrich uvmm = nouveau_cli_uvmm(cli);
136b88baab8SDanilo Krummrich mutex_unlock(&cli->mutex);
137b88baab8SDanilo Krummrich
138b88baab8SDanilo Krummrich return uvmm;
139b88baab8SDanilo Krummrich }
140b88baab8SDanilo Krummrich
1417b05a7c0SDanilo Krummrich static inline struct nouveau_vmm *
nouveau_cli_vmm(struct nouveau_cli * cli)1427b05a7c0SDanilo Krummrich nouveau_cli_vmm(struct nouveau_cli *cli)
1437b05a7c0SDanilo Krummrich {
144b88baab8SDanilo Krummrich struct nouveau_uvmm *uvmm;
145b88baab8SDanilo Krummrich
146b88baab8SDanilo Krummrich uvmm = nouveau_cli_uvmm(cli);
147b88baab8SDanilo Krummrich if (uvmm)
148b88baab8SDanilo Krummrich return &uvmm->vmm;
149b88baab8SDanilo Krummrich
1507b05a7c0SDanilo Krummrich if (cli->svm.cli)
1517b05a7c0SDanilo Krummrich return &cli->svm;
1527b05a7c0SDanilo Krummrich
1537b05a7c0SDanilo Krummrich return &cli->vmm;
1547b05a7c0SDanilo Krummrich }
1557b05a7c0SDanilo Krummrich
156b88baab8SDanilo Krummrich static inline void
__nouveau_cli_disable_uvmm_noinit(struct nouveau_cli * cli)157b88baab8SDanilo Krummrich __nouveau_cli_disable_uvmm_noinit(struct nouveau_cli *cli)
158b88baab8SDanilo Krummrich {
159b88baab8SDanilo Krummrich struct nouveau_uvmm *uvmm = nouveau_cli_uvmm(cli);
160b88baab8SDanilo Krummrich
161b88baab8SDanilo Krummrich if (!uvmm)
162b88baab8SDanilo Krummrich cli->uvmm.disabled = true;
163b88baab8SDanilo Krummrich }
164b88baab8SDanilo Krummrich
165b88baab8SDanilo Krummrich static inline void
nouveau_cli_disable_uvmm_noinit(struct nouveau_cli * cli)166b88baab8SDanilo Krummrich nouveau_cli_disable_uvmm_noinit(struct nouveau_cli *cli)
167b88baab8SDanilo Krummrich {
168b88baab8SDanilo Krummrich mutex_lock(&cli->mutex);
169b88baab8SDanilo Krummrich __nouveau_cli_disable_uvmm_noinit(cli);
170b88baab8SDanilo Krummrich mutex_unlock(&cli->mutex);
171b88baab8SDanilo Krummrich }
172b88baab8SDanilo Krummrich
173814a2324SBen Skeggs void nouveau_cli_work_queue(struct nouveau_cli *, struct dma_fence *,
174814a2324SBen Skeggs struct nouveau_cli_work *);
175814a2324SBen Skeggs
176ebb945a9SBen Skeggs static inline struct nouveau_cli *
nouveau_cli(struct drm_file * fpriv)177ebb945a9SBen Skeggs nouveau_cli(struct drm_file *fpriv)
178ebb945a9SBen Skeggs {
179ebb945a9SBen Skeggs return fpriv ? fpriv->driver_priv : NULL;
180ebb945a9SBen Skeggs }
181ebb945a9SBen Skeggs
182fbc0ced4SDanilo Krummrich static inline void
u_free(void * addr)183fbc0ced4SDanilo Krummrich u_free(void *addr)
184fbc0ced4SDanilo Krummrich {
185fbc0ced4SDanilo Krummrich kvfree(addr);
186fbc0ced4SDanilo Krummrich }
187fbc0ced4SDanilo Krummrich
188fbc0ced4SDanilo Krummrich static inline void *
u_memcpya(uint64_t user,unsigned int nmemb,unsigned int size)189fbc0ced4SDanilo Krummrich u_memcpya(uint64_t user, unsigned int nmemb, unsigned int size)
190fbc0ced4SDanilo Krummrich {
19168132cc6SDave Airlie void __user *userptr = u64_to_user_ptr(user);
19268132cc6SDave Airlie size_t bytes;
193fbc0ced4SDanilo Krummrich
19468132cc6SDave Airlie if (unlikely(check_mul_overflow(nmemb, size, &bytes)))
195c5f93623SDan Carpenter return ERR_PTR(-EOVERFLOW);
19668132cc6SDave Airlie return vmemdup_user(userptr, bytes);
197fbc0ced4SDanilo Krummrich }
198fbc0ced4SDanilo Krummrich
199967e7bdeSBen Skeggs #include <nvif/object.h>
2003e176fd0SBen Skeggs #include <nvif/parent.h>
201db2bec18SBen Skeggs
20294580299SBen Skeggs struct nouveau_drm {
2036777264dSBen Skeggs struct nvkm_device *nvkm;
2043e176fd0SBen Skeggs struct nvif_parent parent;
205034142a3SBen Skeggs struct mutex client_mutex;
206034142a3SBen Skeggs struct nvif_client _client;
207cced63c3SBen Skeggs struct nvif_device device;
208c6bf82d4SBen Skeggs struct nvif_mmu mmu;
209cced63c3SBen Skeggs
21094580299SBen Skeggs struct nouveau_cli client;
21194580299SBen Skeggs struct drm_device *dev;
21294580299SBen Skeggs
21394580299SBen Skeggs struct list_head clients;
214cb75d97eSBen Skeggs
215abae9164SJeremy Cline /**
216abae9164SJeremy Cline * @clients_lock: Protects access to the @clients list of &struct nouveau_cli.
217abae9164SJeremy Cline */
218abae9164SJeremy Cline struct mutex clients_lock;
219abae9164SJeremy Cline
220434fdb51SKarol Herbst u8 old_pm_cap;
221434fdb51SKarol Herbst
222cb75d97eSBen Skeggs struct {
223340b0e7cSBen Skeggs struct agp_bridge_data *bridge;
224cb75d97eSBen Skeggs u32 base;
225cb75d97eSBen Skeggs u32 size;
226340b0e7cSBen Skeggs bool cma;
227cb75d97eSBen Skeggs } agp;
228ebb945a9SBen Skeggs
229ebb945a9SBen Skeggs /* TTM interface support */
230ebb945a9SBen Skeggs struct {
2318af8a109SChristian König struct ttm_device bdev;
232ebb945a9SBen Skeggs atomic_t validate_sequence;
233ebb945a9SBen Skeggs int (*move)(struct nouveau_channel *,
234ebb945a9SBen Skeggs struct ttm_buffer_object *,
2352966141aSDave Airlie struct ttm_resource *, struct ttm_resource *);
2361bb3f6a2SBen Skeggs struct nouveau_channel *chan;
2370ad72863SBen Skeggs struct nvif_object copy;
238ebb945a9SBen Skeggs int mtrr;
239658c71f4SBen Skeggs int type_vram;
24074a39954SBen Skeggs int type_host[2];
24174a39954SBen Skeggs int type_ncoh[2];
242141b15e5SChristian König struct mutex io_reserve_mutex;
243141b15e5SChristian König struct list_head io_reserve_lru;
244ebb945a9SBen Skeggs } ttm;
245ebb945a9SBen Skeggs
246ebb945a9SBen Skeggs /* GEM interface support */
247ebb945a9SBen Skeggs struct {
248ebb945a9SBen Skeggs u64 vram_available;
249ebb945a9SBen Skeggs u64 gart_available;
250ebb945a9SBen Skeggs } gem;
251ebb945a9SBen Skeggs
252ebb945a9SBen Skeggs /* synchronisation */
253ebb945a9SBen Skeggs void *fence;
254ebb945a9SBen Skeggs
255eb47db4fSBen Skeggs /* Global channel management. */
256eb39c613SBen Skeggs int chan_total; /* Number of channels across all runlists. */
257eb39c613SBen Skeggs int chan_nr; /* 0 if per-runlist CHIDs. */
258eb39c613SBen Skeggs int runl_nr;
259eb47db4fSBen Skeggs struct {
260eb39c613SBen Skeggs int chan_nr;
261eb39c613SBen Skeggs int chan_id_base;
262eb47db4fSBen Skeggs u64 context_base;
263eb39c613SBen Skeggs } *runl;
264eb47db4fSBen Skeggs
2655f03a507SDanilo Krummrich /* Workqueue used for channel schedulers. */
2665f03a507SDanilo Krummrich struct workqueue_struct *sched_wq;
2675f03a507SDanilo Krummrich
268ebb945a9SBen Skeggs /* context for accelerated drm-internal operations */
26949981046SBen Skeggs struct nouveau_channel *cechan;
270ebb945a9SBen Skeggs struct nouveau_channel *channel;
271be83cd4eSBen Skeggs struct nvkm_gpuobj *notify;
2720ad72863SBen Skeggs struct nvif_object ntfy;
273ebb945a9SBen Skeggs
274ebb945a9SBen Skeggs /* nv10-nv40 tiling regions */
275ebb945a9SBen Skeggs struct {
276ebb945a9SBen Skeggs struct nouveau_drm_tile reg[15];
277ebb945a9SBen Skeggs spinlock_t lock;
278ebb945a9SBen Skeggs } tile;
27951a3d342SBen Skeggs
28077145f1cSBen Skeggs /* modesetting */
28177145f1cSBen Skeggs struct nvbios vbios;
28277145f1cSBen Skeggs struct nouveau_display *display;
283b96a2253SVasily Khoruzhick bool headless;
28481280d0eSHans de Goede struct work_struct hpd_work;
285d62f8e98SBen Skeggs spinlock_t hpd_lock;
286d297ce4bSLyude Paul u32 hpd_pending;
2873a6536c5SHans de Goede #ifdef CONFIG_ACPI
2883a6536c5SHans de Goede struct notifier_block acpi_nb;
2893a6536c5SHans de Goede #endif
29077145f1cSBen Skeggs
29177145f1cSBen Skeggs /* power management */
292b9ed919fSBen Skeggs struct nouveau_hwmon *hwmon;
293b126a200SKarol Herbst struct nouveau_debugfs *debugfs;
2945addcf0aSDave Airlie
2958d021d71SMartin Peres /* led management */
2968d021d71SMartin Peres struct nouveau_led *led;
2978d021d71SMartin Peres
2985addcf0aSDave Airlie struct dev_pm_domain vga_pm_domain;
299eeaf06acSBen Skeggs
300eeaf06acSBen Skeggs struct nouveau_svm *svm;
3015be73b69SJérôme Glisse
3025be73b69SJérôme Glisse struct nouveau_dmem *dmem;
303742db30cSTakashi Iwai
304742db30cSTakashi Iwai struct {
305742db30cSTakashi Iwai struct drm_audio_component *component;
3069125e242SLyude Paul struct mutex lock;
307742db30cSTakashi Iwai bool component_registered;
308742db30cSTakashi Iwai } audio;
30994580299SBen Skeggs };
31094580299SBen Skeggs
311ebb945a9SBen Skeggs static inline struct nouveau_drm *
nouveau_drm(struct drm_device * dev)312ebb945a9SBen Skeggs nouveau_drm(struct drm_device *dev)
313ebb945a9SBen Skeggs {
31477145f1cSBen Skeggs return dev->dev_private;
31577145f1cSBen Skeggs }
31677145f1cSBen Skeggs
31774a39954SBen Skeggs static inline bool
nouveau_drm_use_coherent_gpu_mapping(struct nouveau_drm * drm)31874a39954SBen Skeggs nouveau_drm_use_coherent_gpu_mapping(struct nouveau_drm *drm)
31974a39954SBen Skeggs {
32074a39954SBen Skeggs struct nvif_mmu *mmu = &drm->client.mmu;
32174a39954SBen Skeggs return !(mmu->type[drm->ttm.type_host[0]].type & NVIF_MEM_UNCACHED);
32274a39954SBen Skeggs }
32374a39954SBen Skeggs
3242d8b9ccbSDave Airlie int nouveau_pmops_suspend(struct device *);
3252d8b9ccbSDave Airlie int nouveau_pmops_resume(struct device *);
326321f5c5fSBen Skeggs bool nouveau_pmops_runtime(void);
32794580299SBen Skeggs
328e396ecd1SAlexandre Courbot #include <nvkm/core/tegra.h>
329e396ecd1SAlexandre Courbot
3308ba9ff11SAlexandre Courbot struct drm_device *
331e396ecd1SAlexandre Courbot nouveau_platform_device_create(const struct nvkm_device_tegra_func *,
332e396ecd1SAlexandre Courbot struct platform_device *, struct nvkm_device **);
333448359c1SBen Skeggs void nouveau_drm_device_remove(struct nouveau_drm *);
3348ba9ff11SAlexandre Courbot
335fa2bade9SBen Skeggs #define NV_PRINTK(l,c,f,a...) do { \
336fa2bade9SBen Skeggs struct nouveau_cli *_cli = (c); \
337e75c091bSBen Skeggs dev_##l(_cli->drm->dev->dev, "%s: "f, _cli->name, ##a); \
338fa2bade9SBen Skeggs } while(0)
3394c497075SLyude Paul
3406777264dSBen Skeggs #define NV_PRINTK_(l,drm,f,a...) do { \
3416777264dSBen Skeggs dev_##l((drm)->nvkm->dev, "drm: "f, ##a); \
3426777264dSBen Skeggs } while(0)
3436777264dSBen Skeggs #define NV_FATAL(drm,f,a...) NV_PRINTK_(crit, (drm), f, ##a)
3446777264dSBen Skeggs #define NV_ERROR(drm,f,a...) NV_PRINTK_(err, (drm), f, ##a)
3456777264dSBen Skeggs #define NV_WARN(drm,f,a...) NV_PRINTK_(warn, (drm), f, ##a)
3466777264dSBen Skeggs #define NV_INFO(drm,f,a...) NV_PRINTK_(info, (drm), f, ##a)
3474c497075SLyude Paul
3489ad97edeSBen Skeggs #define NV_DEBUG(drm,f,a...) do { \
3494f632fb2SJani Nikula if (drm_debug_enabled(DRM_UT_DRIVER)) \
3506777264dSBen Skeggs NV_PRINTK_(info, (drm), f, ##a); \
3519ad97edeSBen Skeggs } while(0)
3523dbd036bSBen Skeggs #define NV_ATOMIC(drm,f,a...) do { \
3534f632fb2SJani Nikula if (drm_debug_enabled(DRM_UT_ATOMIC)) \
3546777264dSBen Skeggs NV_PRINTK_(info, (drm), f, ##a); \
3553dbd036bSBen Skeggs } while(0)
35694580299SBen Skeggs
3574c497075SLyude Paul #define NV_PRINTK_ONCE(l,c,f,a...) NV_PRINTK(l##_once,c,f, ##a)
3584c497075SLyude Paul
3594c497075SLyude Paul #define NV_ERROR_ONCE(drm,f,a...) NV_PRINTK_ONCE(err, &(drm)->client, f, ##a)
3604c497075SLyude Paul #define NV_WARN_ONCE(drm,f,a...) NV_PRINTK_ONCE(warn, &(drm)->client, f, ##a)
3614c497075SLyude Paul #define NV_INFO_ONCE(drm,f,a...) NV_PRINTK_ONCE(info, &(drm)->client, f, ##a)
3624c497075SLyude Paul
3639430738dSBen Skeggs extern int nouveau_modeset;
3649430738dSBen Skeggs
3656901f1d6SBen Skeggs /*XXX: Don't use these in new code.
3666901f1d6SBen Skeggs *
3676901f1d6SBen Skeggs * These accessors are used in a few places (mostly older code paths)
3686901f1d6SBen Skeggs * to get direct access to NVKM structures, where a more well-defined
3696901f1d6SBen Skeggs * interface doesn't exist. Outside of the current use, these should
3706901f1d6SBen Skeggs * not be relied on, and instead be implemented as NVIF.
3716901f1d6SBen Skeggs *
3726901f1d6SBen Skeggs * This is especially important when considering GSP-RM, as a lot the
3736901f1d6SBen Skeggs * modules don't exist, or are "stub" implementations that just allow
3746901f1d6SBen Skeggs * the GSP-RM paths to be bootstrapped.
3756901f1d6SBen Skeggs */
3766901f1d6SBen Skeggs #include <subdev/bios.h>
3776901f1d6SBen Skeggs #include <subdev/fb.h>
3786901f1d6SBen Skeggs #include <subdev/gpio.h>
3796901f1d6SBen Skeggs #include <subdev/clk.h>
3806901f1d6SBen Skeggs #include <subdev/i2c.h>
3816901f1d6SBen Skeggs #include <subdev/timer.h>
3826901f1d6SBen Skeggs #include <subdev/therm.h>
3836901f1d6SBen Skeggs
3846901f1d6SBen Skeggs static inline struct nvkm_device *
nvxx_device(struct nouveau_drm * drm)3856901f1d6SBen Skeggs nvxx_device(struct nouveau_drm *drm)
3866901f1d6SBen Skeggs {
3876901f1d6SBen Skeggs return drm->nvkm;
3886901f1d6SBen Skeggs }
3896901f1d6SBen Skeggs
3906901f1d6SBen Skeggs #define nvxx_bios(a) nvxx_device(a)->bios
3916901f1d6SBen Skeggs #define nvxx_fb(a) nvxx_device(a)->fb
3926901f1d6SBen Skeggs #define nvxx_gpio(a) nvxx_device(a)->gpio
3936901f1d6SBen Skeggs #define nvxx_clk(a) nvxx_device(a)->clk
3946901f1d6SBen Skeggs #define nvxx_i2c(a) nvxx_device(a)->i2c
3956901f1d6SBen Skeggs #define nvxx_iccsense(a) nvxx_device(a)->iccsense
3966901f1d6SBen Skeggs #define nvxx_therm(a) nvxx_device(a)->therm
3976901f1d6SBen Skeggs #define nvxx_volt(a) nvxx_device(a)->volt
3986901f1d6SBen Skeggs
3996901f1d6SBen Skeggs #include <engine/gr.h>
4006901f1d6SBen Skeggs
4016901f1d6SBen Skeggs #define nvxx_gr(a) nvxx_device(a)->gr
40294580299SBen Skeggs #endif
403