xref: /linux/drivers/gpu/drm/nouveau/nouveau_drv.h (revision 946661e3bef8efa11ba8079d4ebafe6fc3b0aaad)
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