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 13a3c1ff87SBen Skeggs #define DRIVER_MINOR 3 1479ef5dcaSBen Skeggs #define DRIVER_PATCHLEVEL 1 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 54612a9aabSLinus Torvalds #include <drm/ttm/ttm_bo_api.h> 55612a9aabSLinus Torvalds #include <drm/ttm/ttm_bo_driver.h> 56612a9aabSLinus Torvalds #include <drm/ttm/ttm_placement.h> 57612a9aabSLinus Torvalds #include <drm/ttm/ttm_memory.h> 58612a9aabSLinus Torvalds #include <drm/ttm/ttm_module.h> 59612a9aabSLinus Torvalds #include <drm/ttm/ttm_page_alloc.h> 60ebb945a9SBen Skeggs 61a4e610b5SBen Skeggs #include "uapi/drm/nouveau_drm.h" 62a4e610b5SBen Skeggs 63ebb945a9SBen Skeggs struct nouveau_channel; 648ba9ff11SAlexandre Courbot struct platform_device; 65ebb945a9SBen Skeggs 66ebb945a9SBen Skeggs #include "nouveau_fence.h" 6777145f1cSBen Skeggs #include "nouveau_bios.h" 6824e8375bSBen Skeggs #include "nouveau_vmm.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 820ad72863SBen Skeggs enum nouveau_drm_notify_route { 830ad72863SBen Skeggs NVDRM_NOTIFY_NVIF = 0, 840ad72863SBen Skeggs NVDRM_NOTIFY_USIF 850ad72863SBen Skeggs }; 860ad72863SBen Skeggs 8794580299SBen Skeggs enum nouveau_drm_handle { 88ebb945a9SBen Skeggs NVDRM_CHAN = 0xcccc0000, /* |= client chid */ 8969a6146dSBen Skeggs NVDRM_NVSW = 0x55550000, 9094580299SBen Skeggs }; 9194580299SBen Skeggs 9294580299SBen Skeggs struct nouveau_cli { 930ad72863SBen Skeggs struct nvif_client base; 94e75c091bSBen Skeggs struct nouveau_drm *drm; 9520d8a88eSBen Skeggs struct mutex mutex; 9620d8a88eSBen Skeggs 971167c6bcSBen Skeggs struct nvif_device device; 9801670a79SBen Skeggs struct nvif_mmu mmu; 9924e8375bSBen Skeggs struct nouveau_vmm vmm; 100bfe91afaSBen Skeggs struct nouveau_vmm svm; 1017f507624SBen Skeggs const struct nvif_mclass *mem; 1021167c6bcSBen Skeggs 10394580299SBen Skeggs struct list_head head; 104ebb945a9SBen Skeggs void *abi16; 10527111a23SBen Skeggs struct list_head objects; 10627111a23SBen Skeggs struct list_head notifys; 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 123814a2324SBen Skeggs void nouveau_cli_work_queue(struct nouveau_cli *, struct dma_fence *, 124814a2324SBen Skeggs struct nouveau_cli_work *); 125814a2324SBen Skeggs 126ebb945a9SBen Skeggs static inline struct nouveau_cli * 127ebb945a9SBen Skeggs nouveau_cli(struct drm_file *fpriv) 128ebb945a9SBen Skeggs { 129ebb945a9SBen Skeggs return fpriv ? fpriv->driver_priv : NULL; 130ebb945a9SBen Skeggs } 131ebb945a9SBen Skeggs 132967e7bdeSBen Skeggs #include <nvif/object.h> 133db2bec18SBen Skeggs 13494580299SBen Skeggs struct nouveau_drm { 135cb7e88e7SBen Skeggs struct nouveau_cli master; 13694580299SBen Skeggs struct nouveau_cli client; 13794580299SBen Skeggs struct drm_device *dev; 13894580299SBen Skeggs 13994580299SBen Skeggs struct list_head clients; 140cb75d97eSBen Skeggs 141cb75d97eSBen Skeggs struct { 142340b0e7cSBen Skeggs struct agp_bridge_data *bridge; 143cb75d97eSBen Skeggs u32 base; 144cb75d97eSBen Skeggs u32 size; 145340b0e7cSBen Skeggs bool cma; 146cb75d97eSBen Skeggs } agp; 147ebb945a9SBen Skeggs 148ebb945a9SBen Skeggs /* TTM interface support */ 149ebb945a9SBen Skeggs struct { 150ebb945a9SBen Skeggs struct ttm_bo_device bdev; 151ebb945a9SBen Skeggs atomic_t validate_sequence; 152ebb945a9SBen Skeggs int (*move)(struct nouveau_channel *, 153ebb945a9SBen Skeggs struct ttm_buffer_object *, 154ebb945a9SBen Skeggs struct ttm_mem_reg *, struct ttm_mem_reg *); 1551bb3f6a2SBen Skeggs struct nouveau_channel *chan; 1560ad72863SBen Skeggs struct nvif_object copy; 157ebb945a9SBen Skeggs int mtrr; 158658c71f4SBen Skeggs int type_vram; 15974a39954SBen Skeggs int type_host[2]; 16074a39954SBen Skeggs int type_ncoh[2]; 161ebb945a9SBen Skeggs } ttm; 162ebb945a9SBen Skeggs 163ebb945a9SBen Skeggs /* GEM interface support */ 164ebb945a9SBen Skeggs struct { 165ebb945a9SBen Skeggs u64 vram_available; 166ebb945a9SBen Skeggs u64 gart_available; 167ebb945a9SBen Skeggs } gem; 168ebb945a9SBen Skeggs 169ebb945a9SBen Skeggs /* synchronisation */ 170ebb945a9SBen Skeggs void *fence; 171ebb945a9SBen Skeggs 172eb47db4fSBen Skeggs /* Global channel management. */ 173eb47db4fSBen Skeggs struct { 174eb47db4fSBen Skeggs int nr; 175eb47db4fSBen Skeggs u64 context_base; 176eb47db4fSBen Skeggs } chan; 177eb47db4fSBen Skeggs 178ebb945a9SBen Skeggs /* context for accelerated drm-internal operations */ 17949981046SBen Skeggs struct nouveau_channel *cechan; 180ebb945a9SBen Skeggs struct nouveau_channel *channel; 181be83cd4eSBen Skeggs struct nvkm_gpuobj *notify; 182ebb945a9SBen Skeggs struct nouveau_fbdev *fbcon; 1830ad72863SBen Skeggs struct nvif_object nvsw; 1840ad72863SBen Skeggs struct nvif_object ntfy; 185ebb945a9SBen Skeggs 186ebb945a9SBen Skeggs /* nv10-nv40 tiling regions */ 187ebb945a9SBen Skeggs struct { 188ebb945a9SBen Skeggs struct nouveau_drm_tile reg[15]; 189ebb945a9SBen Skeggs spinlock_t lock; 190ebb945a9SBen Skeggs } tile; 19151a3d342SBen Skeggs 19277145f1cSBen Skeggs /* modesetting */ 19377145f1cSBen Skeggs struct nvbios vbios; 19477145f1cSBen Skeggs struct nouveau_display *display; 19581280d0eSHans de Goede struct work_struct hpd_work; 19615266ae3SLyude Paul struct work_struct fbcon_work; 19715266ae3SLyude Paul int fbcon_new_state; 1983a6536c5SHans de Goede #ifdef CONFIG_ACPI 1993a6536c5SHans de Goede struct notifier_block acpi_nb; 2003a6536c5SHans de Goede #endif 20177145f1cSBen Skeggs 20277145f1cSBen Skeggs /* power management */ 203b9ed919fSBen Skeggs struct nouveau_hwmon *hwmon; 204b126a200SKarol Herbst struct nouveau_debugfs *debugfs; 2055addcf0aSDave Airlie 2068d021d71SMartin Peres /* led management */ 2078d021d71SMartin Peres struct nouveau_led *led; 2088d021d71SMartin Peres 2095addcf0aSDave Airlie struct dev_pm_domain vga_pm_domain; 210eeaf06acSBen Skeggs 211eeaf06acSBen Skeggs struct nouveau_svm *svm; 2125be73b69SJérôme Glisse 2135be73b69SJérôme Glisse struct nouveau_dmem *dmem; 21494580299SBen Skeggs }; 21594580299SBen Skeggs 216ebb945a9SBen Skeggs static inline struct nouveau_drm * 217ebb945a9SBen Skeggs nouveau_drm(struct drm_device *dev) 218ebb945a9SBen Skeggs { 21977145f1cSBen Skeggs return dev->dev_private; 22077145f1cSBen Skeggs } 22177145f1cSBen Skeggs 22274a39954SBen Skeggs static inline bool 22374a39954SBen Skeggs nouveau_drm_use_coherent_gpu_mapping(struct nouveau_drm *drm) 22474a39954SBen Skeggs { 22574a39954SBen Skeggs struct nvif_mmu *mmu = &drm->client.mmu; 22674a39954SBen Skeggs return !(mmu->type[drm->ttm.type_host[0]].type & NVIF_MEM_UNCACHED); 22774a39954SBen Skeggs } 22874a39954SBen Skeggs 2292d8b9ccbSDave Airlie int nouveau_pmops_suspend(struct device *); 2302d8b9ccbSDave Airlie int nouveau_pmops_resume(struct device *); 231321f5c5fSBen Skeggs bool nouveau_pmops_runtime(void); 23294580299SBen Skeggs 233e396ecd1SAlexandre Courbot #include <nvkm/core/tegra.h> 234e396ecd1SAlexandre Courbot 2358ba9ff11SAlexandre Courbot struct drm_device * 236e396ecd1SAlexandre Courbot nouveau_platform_device_create(const struct nvkm_device_tegra_func *, 237e396ecd1SAlexandre Courbot struct platform_device *, struct nvkm_device **); 2388ba9ff11SAlexandre Courbot void nouveau_drm_device_remove(struct drm_device *dev); 2398ba9ff11SAlexandre Courbot 240fa2bade9SBen Skeggs #define NV_PRINTK(l,c,f,a...) do { \ 241fa2bade9SBen Skeggs struct nouveau_cli *_cli = (c); \ 242e75c091bSBen Skeggs dev_##l(_cli->drm->dev->dev, "%s: "f, _cli->name, ##a); \ 243fa2bade9SBen Skeggs } while(0) 2444c497075SLyude Paul 2459ad97edeSBen Skeggs #define NV_FATAL(drm,f,a...) NV_PRINTK(crit, &(drm)->client, f, ##a) 2469ad97edeSBen Skeggs #define NV_ERROR(drm,f,a...) NV_PRINTK(err, &(drm)->client, f, ##a) 247fa2bade9SBen Skeggs #define NV_WARN(drm,f,a...) NV_PRINTK(warn, &(drm)->client, f, ##a) 248fa2bade9SBen Skeggs #define NV_INFO(drm,f,a...) NV_PRINTK(info, &(drm)->client, f, ##a) 2494c497075SLyude Paul 2509ad97edeSBen Skeggs #define NV_DEBUG(drm,f,a...) do { \ 251*4f632fb2SJani Nikula if (drm_debug_enabled(DRM_UT_DRIVER)) \ 2529ad97edeSBen Skeggs NV_PRINTK(info, &(drm)->client, f, ##a); \ 2539ad97edeSBen Skeggs } while(0) 2543dbd036bSBen Skeggs #define NV_ATOMIC(drm,f,a...) do { \ 255*4f632fb2SJani Nikula if (drm_debug_enabled(DRM_UT_ATOMIC)) \ 2563dbd036bSBen Skeggs NV_PRINTK(info, &(drm)->client, f, ##a); \ 2573dbd036bSBen Skeggs } while(0) 25894580299SBen Skeggs 2594c497075SLyude Paul #define NV_PRINTK_ONCE(l,c,f,a...) NV_PRINTK(l##_once,c,f, ##a) 2604c497075SLyude Paul 2614c497075SLyude Paul #define NV_ERROR_ONCE(drm,f,a...) NV_PRINTK_ONCE(err, &(drm)->client, f, ##a) 2624c497075SLyude Paul #define NV_WARN_ONCE(drm,f,a...) NV_PRINTK_ONCE(warn, &(drm)->client, f, ##a) 2634c497075SLyude Paul #define NV_INFO_ONCE(drm,f,a...) NV_PRINTK_ONCE(info, &(drm)->client, f, ##a) 2644c497075SLyude Paul 2659430738dSBen Skeggs extern int nouveau_modeset; 2669430738dSBen Skeggs 26794580299SBen Skeggs #endif 268