xref: /linux/drivers/gpu/drm/nouveau/nouveau_drv.h (revision 034142a303fed2903957b06a7c91abdff5531bcf)
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 #define DRIVER_DATE		"20120801"
1177145f1cSBen Skeggs 
1277145f1cSBen Skeggs #define DRIVER_MAJOR		1
13b88baab8SDanilo Krummrich #define DRIVER_MINOR		4
14b88baab8SDanilo Krummrich #define DRIVER_PATCHLEVEL	0
15142c21b8SChristoph Bumiller 
16142c21b8SChristoph Bumiller /*
17142c21b8SChristoph Bumiller  * 1.1.1:
18142c21b8SChristoph Bumiller  * 	- added support for tiled system memory buffer objects
19142c21b8SChristoph Bumiller  *      - added support for NOUVEAU_GETPARAM_GRAPH_UNITS on [nvc0,nve0].
20142c21b8SChristoph Bumiller  *      - added support for compressed memory storage types on [nvc0,nve0].
21142c21b8SChristoph Bumiller  *      - added support for software methods 0x600,0x644,0x6ac on nvc0
22142c21b8SChristoph Bumiller  *        to control registers on the MPs to enable performance counters,
23142c21b8SChristoph Bumiller  *        and to control the warp error enable mask (OpenGL requires out of
24142c21b8SChristoph Bumiller  *        bounds access to local memory to be silently ignored / return 0).
257820e5eeSMario Kleiner  * 1.1.2:
267820e5eeSMario Kleiner  *      - fixes multiple bugs in flip completion events and timestamping
2727111a23SBen Skeggs  * 1.2.0:
2827111a23SBen Skeggs  * 	- object api exposed to userspace
2927111a23SBen Skeggs  * 	- fermi,kepler,maxwell zbc
30055dffdfSMaarten Lankhorst  * 1.2.1:
31055dffdfSMaarten Lankhorst  *      - allow concurrent access to bo's mapped read/write.
3282452755SBen Skeggs  * 1.2.2:
3382452755SBen Skeggs  *      - add NOUVEAU_GEM_DOMAIN_COHERENT flag
34a3c1ff87SBen Skeggs  * 1.3.0:
35a3c1ff87SBen Skeggs  *      - NVIF ABI modified, safe because only (current) users are test
36a3c1ff87SBen Skeggs  *        programs that get directly linked with NVKM.
3779ef5dcaSBen Skeggs  * 1.3.1:
3879ef5dcaSBen Skeggs  *      - implemented limited ABI16/NVIF interop
39142c21b8SChristoph Bumiller  */
4077145f1cSBen Skeggs 
413a6536c5SHans de Goede #include <linux/notifier.h>
423a6536c5SHans de Goede 
430ad72863SBen Skeggs #include <nvif/client.h>
440ad72863SBen Skeggs #include <nvif/device.h>
45f5e55187SBen Skeggs #include <nvif/ioctl.h>
4601670a79SBen Skeggs #include <nvif/mmu.h>
4796da0bcdSBen Skeggs #include <nvif/vmm.h>
480ad72863SBen Skeggs 
49c587cd6fSSam Ravnborg #include <drm/drm_connector.h>
50c587cd6fSSam Ravnborg #include <drm/drm_device.h>
51c587cd6fSSam Ravnborg #include <drm/drm_drv.h>
52c587cd6fSSam Ravnborg #include <drm/drm_file.h>
5394580299SBen Skeggs 
54a3185f91SChristian König #include <drm/ttm/ttm_bo.h>
55612a9aabSLinus Torvalds #include <drm/ttm/ttm_placement.h>
56ebb945a9SBen Skeggs 
57742db30cSTakashi Iwai #include <drm/drm_audio_component.h>
58742db30cSTakashi Iwai 
59a4e610b5SBen Skeggs #include "uapi/drm/nouveau_drm.h"
60a4e610b5SBen Skeggs 
61ebb945a9SBen Skeggs struct nouveau_channel;
628ba9ff11SAlexandre Courbot struct platform_device;
63ebb945a9SBen Skeggs 
64ebb945a9SBen Skeggs #include "nouveau_fence.h"
6577145f1cSBen Skeggs #include "nouveau_bios.h"
66b88baab8SDanilo Krummrich #include "nouveau_sched.h"
6724e8375bSBen Skeggs #include "nouveau_vmm.h"
68b88baab8SDanilo Krummrich #include "nouveau_uvmm.h"
69ebb945a9SBen Skeggs 
70ebb945a9SBen Skeggs struct nouveau_drm_tile {
71ebb945a9SBen Skeggs 	struct nouveau_fence *fence;
72ebb945a9SBen Skeggs 	bool used;
73ebb945a9SBen Skeggs };
74ebb945a9SBen Skeggs 
750ad72863SBen Skeggs enum nouveau_drm_object_route {
76f5e55187SBen Skeggs 	NVDRM_OBJECT_NVIF = NVIF_IOCTL_V0_OWNER_NVIF,
770ad72863SBen Skeggs 	NVDRM_OBJECT_USIF,
780ad72863SBen Skeggs 	NVDRM_OBJECT_ABI16,
79f5e55187SBen Skeggs 	NVDRM_OBJECT_ANY = NVIF_IOCTL_V0_OWNER_ANY,
800ad72863SBen Skeggs };
810ad72863SBen Skeggs 
8294580299SBen Skeggs enum nouveau_drm_handle {
83ebb945a9SBen Skeggs 	NVDRM_CHAN    = 0xcccc0000, /* |= client chid */
8469a6146dSBen Skeggs 	NVDRM_NVSW    = 0x55550000,
8594580299SBen Skeggs };
8694580299SBen Skeggs 
8794580299SBen Skeggs struct nouveau_cli {
880ad72863SBen Skeggs 	struct nvif_client base;
89e75c091bSBen Skeggs 	struct nouveau_drm *drm;
9020d8a88eSBen Skeggs 	struct mutex mutex;
9120d8a88eSBen Skeggs 
921167c6bcSBen Skeggs 	struct nvif_device device;
9301670a79SBen Skeggs 	struct nvif_mmu mmu;
9424e8375bSBen Skeggs 	struct nouveau_vmm vmm;
95bfe91afaSBen Skeggs 	struct nouveau_vmm svm;
96266f7618SDanilo Krummrich 	struct {
97266f7618SDanilo Krummrich 		struct nouveau_uvmm *ptr;
98266f7618SDanilo Krummrich 		bool disabled;
99266f7618SDanilo Krummrich 	} uvmm;
100b88baab8SDanilo Krummrich 
1019a0c32d6SDanilo Krummrich 	struct nouveau_sched *sched;
102b88baab8SDanilo Krummrich 
1037f507624SBen Skeggs 	const struct nvif_mclass *mem;
1041167c6bcSBen Skeggs 
10594580299SBen Skeggs 	struct list_head head;
106ebb945a9SBen Skeggs 	void *abi16;
10727111a23SBen Skeggs 	struct list_head objects;
1089ad97edeSBen Skeggs 	char name[32];
109cb7e88e7SBen Skeggs 
110814a2324SBen Skeggs 	struct work_struct work;
111814a2324SBen Skeggs 	struct list_head worker;
112cb7e88e7SBen Skeggs 	struct mutex lock;
11394580299SBen Skeggs };
11494580299SBen Skeggs 
115814a2324SBen Skeggs struct nouveau_cli_work {
116814a2324SBen Skeggs 	void (*func)(struct nouveau_cli_work *);
117814a2324SBen Skeggs 	struct nouveau_cli *cli;
118814a2324SBen Skeggs 	struct list_head head;
119814a2324SBen Skeggs 
120814a2324SBen Skeggs 	struct dma_fence *fence;
121814a2324SBen Skeggs 	struct dma_fence_cb cb;
122814a2324SBen Skeggs };
123814a2324SBen Skeggs 
124b88baab8SDanilo Krummrich static inline struct nouveau_uvmm *
125b88baab8SDanilo Krummrich nouveau_cli_uvmm(struct nouveau_cli *cli)
126b88baab8SDanilo Krummrich {
127266f7618SDanilo Krummrich 	return cli ? cli->uvmm.ptr : NULL;
128b88baab8SDanilo Krummrich }
129b88baab8SDanilo Krummrich 
130b88baab8SDanilo Krummrich static inline struct nouveau_uvmm *
131b88baab8SDanilo Krummrich nouveau_cli_uvmm_locked(struct nouveau_cli *cli)
132b88baab8SDanilo Krummrich {
133b88baab8SDanilo Krummrich 	struct nouveau_uvmm *uvmm;
134b88baab8SDanilo Krummrich 
135b88baab8SDanilo Krummrich 	mutex_lock(&cli->mutex);
136b88baab8SDanilo Krummrich 	uvmm = nouveau_cli_uvmm(cli);
137b88baab8SDanilo Krummrich 	mutex_unlock(&cli->mutex);
138b88baab8SDanilo Krummrich 
139b88baab8SDanilo Krummrich 	return uvmm;
140b88baab8SDanilo Krummrich }
141b88baab8SDanilo Krummrich 
1427b05a7c0SDanilo Krummrich static inline struct nouveau_vmm *
1437b05a7c0SDanilo Krummrich nouveau_cli_vmm(struct nouveau_cli *cli)
1447b05a7c0SDanilo Krummrich {
145b88baab8SDanilo Krummrich 	struct nouveau_uvmm *uvmm;
146b88baab8SDanilo Krummrich 
147b88baab8SDanilo Krummrich 	uvmm = nouveau_cli_uvmm(cli);
148b88baab8SDanilo Krummrich 	if (uvmm)
149b88baab8SDanilo Krummrich 		return &uvmm->vmm;
150b88baab8SDanilo Krummrich 
1517b05a7c0SDanilo Krummrich 	if (cli->svm.cli)
1527b05a7c0SDanilo Krummrich 		return &cli->svm;
1537b05a7c0SDanilo Krummrich 
1547b05a7c0SDanilo Krummrich 	return &cli->vmm;
1557b05a7c0SDanilo Krummrich }
1567b05a7c0SDanilo Krummrich 
157b88baab8SDanilo Krummrich static inline void
158b88baab8SDanilo Krummrich __nouveau_cli_disable_uvmm_noinit(struct nouveau_cli *cli)
159b88baab8SDanilo Krummrich {
160b88baab8SDanilo Krummrich 	struct nouveau_uvmm *uvmm = nouveau_cli_uvmm(cli);
161b88baab8SDanilo Krummrich 
162b88baab8SDanilo Krummrich 	if (!uvmm)
163b88baab8SDanilo Krummrich 		cli->uvmm.disabled = true;
164b88baab8SDanilo Krummrich }
165b88baab8SDanilo Krummrich 
166b88baab8SDanilo Krummrich static inline void
167b88baab8SDanilo Krummrich nouveau_cli_disable_uvmm_noinit(struct nouveau_cli *cli)
168b88baab8SDanilo Krummrich {
169b88baab8SDanilo Krummrich 	mutex_lock(&cli->mutex);
170b88baab8SDanilo Krummrich 	__nouveau_cli_disable_uvmm_noinit(cli);
171b88baab8SDanilo Krummrich 	mutex_unlock(&cli->mutex);
172b88baab8SDanilo Krummrich }
173b88baab8SDanilo Krummrich 
174814a2324SBen Skeggs void nouveau_cli_work_queue(struct nouveau_cli *, struct dma_fence *,
175814a2324SBen Skeggs 			    struct nouveau_cli_work *);
176814a2324SBen Skeggs 
177ebb945a9SBen Skeggs static inline struct nouveau_cli *
178ebb945a9SBen Skeggs nouveau_cli(struct drm_file *fpriv)
179ebb945a9SBen Skeggs {
180ebb945a9SBen Skeggs 	return fpriv ? fpriv->driver_priv : NULL;
181ebb945a9SBen Skeggs }
182ebb945a9SBen Skeggs 
183fbc0ced4SDanilo Krummrich static inline void
184fbc0ced4SDanilo Krummrich u_free(void *addr)
185fbc0ced4SDanilo Krummrich {
186fbc0ced4SDanilo Krummrich 	kvfree(addr);
187fbc0ced4SDanilo Krummrich }
188fbc0ced4SDanilo Krummrich 
189fbc0ced4SDanilo Krummrich static inline void *
190fbc0ced4SDanilo Krummrich u_memcpya(uint64_t user, unsigned int nmemb, unsigned int size)
191fbc0ced4SDanilo Krummrich {
19268132cc6SDave Airlie 	void __user *userptr = u64_to_user_ptr(user);
19368132cc6SDave Airlie 	size_t bytes;
194fbc0ced4SDanilo Krummrich 
19568132cc6SDave Airlie 	if (unlikely(check_mul_overflow(nmemb, size, &bytes)))
196c5f93623SDan Carpenter 		return ERR_PTR(-EOVERFLOW);
19768132cc6SDave Airlie 	return vmemdup_user(userptr, bytes);
198fbc0ced4SDanilo Krummrich }
199fbc0ced4SDanilo Krummrich 
200967e7bdeSBen Skeggs #include <nvif/object.h>
2013e176fd0SBen Skeggs #include <nvif/parent.h>
202db2bec18SBen Skeggs 
20394580299SBen Skeggs struct nouveau_drm {
2046777264dSBen Skeggs 	struct nvkm_device *nvkm;
2053e176fd0SBen Skeggs 	struct nvif_parent parent;
206034142a3SBen Skeggs 	struct mutex client_mutex;
207034142a3SBen Skeggs 	struct nvif_client _client;
208cced63c3SBen Skeggs 	struct nvif_device device;
209c6bf82d4SBen Skeggs 	struct nvif_mmu mmu;
210cced63c3SBen Skeggs 
21194580299SBen Skeggs 	struct nouveau_cli client;
21294580299SBen Skeggs 	struct drm_device *dev;
21394580299SBen Skeggs 
21494580299SBen Skeggs 	struct list_head clients;
215cb75d97eSBen Skeggs 
216abae9164SJeremy Cline 	/**
217abae9164SJeremy Cline 	 * @clients_lock: Protects access to the @clients list of &struct nouveau_cli.
218abae9164SJeremy Cline 	 */
219abae9164SJeremy Cline 	struct mutex clients_lock;
220abae9164SJeremy Cline 
221434fdb51SKarol Herbst 	u8 old_pm_cap;
222434fdb51SKarol Herbst 
223cb75d97eSBen Skeggs 	struct {
224340b0e7cSBen Skeggs 		struct agp_bridge_data *bridge;
225cb75d97eSBen Skeggs 		u32 base;
226cb75d97eSBen Skeggs 		u32 size;
227340b0e7cSBen Skeggs 		bool cma;
228cb75d97eSBen Skeggs 	} agp;
229ebb945a9SBen Skeggs 
230ebb945a9SBen Skeggs 	/* TTM interface support */
231ebb945a9SBen Skeggs 	struct {
2328af8a109SChristian König 		struct ttm_device bdev;
233ebb945a9SBen Skeggs 		atomic_t validate_sequence;
234ebb945a9SBen Skeggs 		int (*move)(struct nouveau_channel *,
235ebb945a9SBen Skeggs 			    struct ttm_buffer_object *,
2362966141aSDave Airlie 			    struct ttm_resource *, struct ttm_resource *);
2371bb3f6a2SBen Skeggs 		struct nouveau_channel *chan;
2380ad72863SBen Skeggs 		struct nvif_object copy;
239ebb945a9SBen Skeggs 		int mtrr;
240658c71f4SBen Skeggs 		int type_vram;
24174a39954SBen Skeggs 		int type_host[2];
24274a39954SBen Skeggs 		int type_ncoh[2];
243141b15e5SChristian König 		struct mutex io_reserve_mutex;
244141b15e5SChristian König 		struct list_head io_reserve_lru;
245ebb945a9SBen Skeggs 	} ttm;
246ebb945a9SBen Skeggs 
247ebb945a9SBen Skeggs 	/* GEM interface support */
248ebb945a9SBen Skeggs 	struct {
249ebb945a9SBen Skeggs 		u64 vram_available;
250ebb945a9SBen Skeggs 		u64 gart_available;
251ebb945a9SBen Skeggs 	} gem;
252ebb945a9SBen Skeggs 
253ebb945a9SBen Skeggs 	/* synchronisation */
254ebb945a9SBen Skeggs 	void *fence;
255ebb945a9SBen Skeggs 
256eb47db4fSBen Skeggs 	/* Global channel management. */
257eb39c613SBen Skeggs 	int chan_total; /* Number of channels across all runlists. */
258eb39c613SBen Skeggs 	int chan_nr;	/* 0 if per-runlist CHIDs. */
259eb39c613SBen Skeggs 	int runl_nr;
260eb47db4fSBen Skeggs 	struct {
261eb39c613SBen Skeggs 		int chan_nr;
262eb39c613SBen Skeggs 		int chan_id_base;
263eb47db4fSBen Skeggs 		u64 context_base;
264eb39c613SBen Skeggs 	} *runl;
265eb47db4fSBen Skeggs 
2665f03a507SDanilo Krummrich 	/* Workqueue used for channel schedulers. */
2675f03a507SDanilo Krummrich 	struct workqueue_struct *sched_wq;
2685f03a507SDanilo Krummrich 
269ebb945a9SBen Skeggs 	/* context for accelerated drm-internal operations */
27049981046SBen Skeggs 	struct nouveau_channel *cechan;
271ebb945a9SBen Skeggs 	struct nouveau_channel *channel;
272be83cd4eSBen Skeggs 	struct nvkm_gpuobj *notify;
2730ad72863SBen Skeggs 	struct nvif_object ntfy;
274ebb945a9SBen Skeggs 
275ebb945a9SBen Skeggs 	/* nv10-nv40 tiling regions */
276ebb945a9SBen Skeggs 	struct {
277ebb945a9SBen Skeggs 		struct nouveau_drm_tile reg[15];
278ebb945a9SBen Skeggs 		spinlock_t lock;
279ebb945a9SBen Skeggs 	} tile;
28051a3d342SBen Skeggs 
28177145f1cSBen Skeggs 	/* modesetting */
28277145f1cSBen Skeggs 	struct nvbios vbios;
28377145f1cSBen Skeggs 	struct nouveau_display *display;
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 *
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
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 *
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