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