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 61742db30cSTakashi Iwai #include <drm/drm_audio_component.h> 62742db30cSTakashi Iwai 63a4e610b5SBen Skeggs #include "uapi/drm/nouveau_drm.h" 64a4e610b5SBen Skeggs 65ebb945a9SBen Skeggs struct nouveau_channel; 668ba9ff11SAlexandre Courbot struct platform_device; 67ebb945a9SBen Skeggs 68ebb945a9SBen Skeggs #include "nouveau_fence.h" 6977145f1cSBen Skeggs #include "nouveau_bios.h" 7024e8375bSBen Skeggs #include "nouveau_vmm.h" 71ebb945a9SBen Skeggs 72ebb945a9SBen Skeggs struct nouveau_drm_tile { 73ebb945a9SBen Skeggs struct nouveau_fence *fence; 74ebb945a9SBen Skeggs bool used; 75ebb945a9SBen Skeggs }; 76ebb945a9SBen Skeggs 770ad72863SBen Skeggs enum nouveau_drm_object_route { 78f5e55187SBen Skeggs NVDRM_OBJECT_NVIF = NVIF_IOCTL_V0_OWNER_NVIF, 790ad72863SBen Skeggs NVDRM_OBJECT_USIF, 800ad72863SBen Skeggs NVDRM_OBJECT_ABI16, 81f5e55187SBen Skeggs NVDRM_OBJECT_ANY = NVIF_IOCTL_V0_OWNER_ANY, 820ad72863SBen Skeggs }; 830ad72863SBen Skeggs 840ad72863SBen Skeggs enum nouveau_drm_notify_route { 850ad72863SBen Skeggs NVDRM_NOTIFY_NVIF = 0, 860ad72863SBen Skeggs NVDRM_NOTIFY_USIF 870ad72863SBen Skeggs }; 880ad72863SBen Skeggs 8994580299SBen Skeggs enum nouveau_drm_handle { 90ebb945a9SBen Skeggs NVDRM_CHAN = 0xcccc0000, /* |= client chid */ 9169a6146dSBen Skeggs NVDRM_NVSW = 0x55550000, 9294580299SBen Skeggs }; 9394580299SBen Skeggs 9494580299SBen Skeggs struct nouveau_cli { 950ad72863SBen Skeggs struct nvif_client base; 96e75c091bSBen Skeggs struct nouveau_drm *drm; 9720d8a88eSBen Skeggs struct mutex mutex; 9820d8a88eSBen Skeggs 991167c6bcSBen Skeggs struct nvif_device device; 10001670a79SBen Skeggs struct nvif_mmu mmu; 10124e8375bSBen Skeggs struct nouveau_vmm vmm; 102bfe91afaSBen Skeggs struct nouveau_vmm svm; 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; 10827111a23SBen Skeggs struct list_head notifys; 1099ad97edeSBen Skeggs char name[32]; 110cb7e88e7SBen Skeggs 111814a2324SBen Skeggs struct work_struct work; 112814a2324SBen Skeggs struct list_head worker; 113cb7e88e7SBen Skeggs struct mutex lock; 11494580299SBen Skeggs }; 11594580299SBen Skeggs 116814a2324SBen Skeggs struct nouveau_cli_work { 117814a2324SBen Skeggs void (*func)(struct nouveau_cli_work *); 118814a2324SBen Skeggs struct nouveau_cli *cli; 119814a2324SBen Skeggs struct list_head head; 120814a2324SBen Skeggs 121814a2324SBen Skeggs struct dma_fence *fence; 122814a2324SBen Skeggs struct dma_fence_cb cb; 123814a2324SBen Skeggs }; 124814a2324SBen Skeggs 125814a2324SBen Skeggs void nouveau_cli_work_queue(struct nouveau_cli *, struct dma_fence *, 126814a2324SBen Skeggs struct nouveau_cli_work *); 127814a2324SBen Skeggs 128ebb945a9SBen Skeggs static inline struct nouveau_cli * 129ebb945a9SBen Skeggs nouveau_cli(struct drm_file *fpriv) 130ebb945a9SBen Skeggs { 131ebb945a9SBen Skeggs return fpriv ? fpriv->driver_priv : NULL; 132ebb945a9SBen Skeggs } 133ebb945a9SBen Skeggs 134967e7bdeSBen Skeggs #include <nvif/object.h> 1353e176fd0SBen Skeggs #include <nvif/parent.h> 136db2bec18SBen Skeggs 13794580299SBen Skeggs struct nouveau_drm { 1383e176fd0SBen Skeggs struct nvif_parent parent; 139cb7e88e7SBen Skeggs struct nouveau_cli master; 14094580299SBen Skeggs struct nouveau_cli client; 14194580299SBen Skeggs struct drm_device *dev; 14294580299SBen Skeggs 14394580299SBen Skeggs struct list_head clients; 144cb75d97eSBen Skeggs 145434fdb51SKarol Herbst u8 old_pm_cap; 146434fdb51SKarol Herbst 147cb75d97eSBen Skeggs struct { 148340b0e7cSBen Skeggs struct agp_bridge_data *bridge; 149cb75d97eSBen Skeggs u32 base; 150cb75d97eSBen Skeggs u32 size; 151340b0e7cSBen Skeggs bool cma; 152cb75d97eSBen Skeggs } agp; 153ebb945a9SBen Skeggs 154ebb945a9SBen Skeggs /* TTM interface support */ 155ebb945a9SBen Skeggs struct { 156ebb945a9SBen Skeggs struct ttm_bo_device bdev; 157ebb945a9SBen Skeggs atomic_t validate_sequence; 158ebb945a9SBen Skeggs int (*move)(struct nouveau_channel *, 159ebb945a9SBen Skeggs struct ttm_buffer_object *, 1602966141aSDave Airlie struct ttm_resource *, struct ttm_resource *); 1611bb3f6a2SBen Skeggs struct nouveau_channel *chan; 1620ad72863SBen Skeggs struct nvif_object copy; 163ebb945a9SBen Skeggs int mtrr; 164658c71f4SBen Skeggs int type_vram; 16574a39954SBen Skeggs int type_host[2]; 16674a39954SBen Skeggs int type_ncoh[2]; 167141b15e5SChristian König struct mutex io_reserve_mutex; 168141b15e5SChristian König struct list_head io_reserve_lru; 169ebb945a9SBen Skeggs } ttm; 170ebb945a9SBen Skeggs 171ebb945a9SBen Skeggs /* GEM interface support */ 172ebb945a9SBen Skeggs struct { 173ebb945a9SBen Skeggs u64 vram_available; 174ebb945a9SBen Skeggs u64 gart_available; 175ebb945a9SBen Skeggs } gem; 176ebb945a9SBen Skeggs 177ebb945a9SBen Skeggs /* synchronisation */ 178ebb945a9SBen Skeggs void *fence; 179ebb945a9SBen Skeggs 180eb47db4fSBen Skeggs /* Global channel management. */ 181eb47db4fSBen Skeggs struct { 182eb47db4fSBen Skeggs int nr; 183eb47db4fSBen Skeggs u64 context_base; 184eb47db4fSBen Skeggs } chan; 185eb47db4fSBen Skeggs 186ebb945a9SBen Skeggs /* context for accelerated drm-internal operations */ 18749981046SBen Skeggs struct nouveau_channel *cechan; 188ebb945a9SBen Skeggs struct nouveau_channel *channel; 189be83cd4eSBen Skeggs struct nvkm_gpuobj *notify; 190ebb945a9SBen Skeggs struct nouveau_fbdev *fbcon; 1910ad72863SBen Skeggs struct nvif_object ntfy; 192ebb945a9SBen Skeggs 193ebb945a9SBen Skeggs /* nv10-nv40 tiling regions */ 194ebb945a9SBen Skeggs struct { 195ebb945a9SBen Skeggs struct nouveau_drm_tile reg[15]; 196ebb945a9SBen Skeggs spinlock_t lock; 197ebb945a9SBen Skeggs } tile; 19851a3d342SBen Skeggs 19977145f1cSBen Skeggs /* modesetting */ 20077145f1cSBen Skeggs struct nvbios vbios; 20177145f1cSBen Skeggs struct nouveau_display *display; 20281280d0eSHans de Goede struct work_struct hpd_work; 20315266ae3SLyude Paul struct work_struct fbcon_work; 20415266ae3SLyude Paul int fbcon_new_state; 2053a6536c5SHans de Goede #ifdef CONFIG_ACPI 2063a6536c5SHans de Goede struct notifier_block acpi_nb; 2073a6536c5SHans de Goede #endif 20877145f1cSBen Skeggs 20977145f1cSBen Skeggs /* power management */ 210b9ed919fSBen Skeggs struct nouveau_hwmon *hwmon; 211b126a200SKarol Herbst struct nouveau_debugfs *debugfs; 2125addcf0aSDave Airlie 2138d021d71SMartin Peres /* led management */ 2148d021d71SMartin Peres struct nouveau_led *led; 2158d021d71SMartin Peres 2165addcf0aSDave Airlie struct dev_pm_domain vga_pm_domain; 217eeaf06acSBen Skeggs 218eeaf06acSBen Skeggs struct nouveau_svm *svm; 2195be73b69SJérôme Glisse 2205be73b69SJérôme Glisse struct nouveau_dmem *dmem; 221742db30cSTakashi Iwai 222742db30cSTakashi Iwai struct { 223742db30cSTakashi Iwai struct drm_audio_component *component; 224742db30cSTakashi Iwai bool component_registered; 225742db30cSTakashi Iwai } audio; 22694580299SBen Skeggs }; 22794580299SBen Skeggs 228ebb945a9SBen Skeggs static inline struct nouveau_drm * 229ebb945a9SBen Skeggs nouveau_drm(struct drm_device *dev) 230ebb945a9SBen Skeggs { 23177145f1cSBen Skeggs return dev->dev_private; 23277145f1cSBen Skeggs } 23377145f1cSBen Skeggs 23474a39954SBen Skeggs static inline bool 23574a39954SBen Skeggs nouveau_drm_use_coherent_gpu_mapping(struct nouveau_drm *drm) 23674a39954SBen Skeggs { 23774a39954SBen Skeggs struct nvif_mmu *mmu = &drm->client.mmu; 23874a39954SBen Skeggs return !(mmu->type[drm->ttm.type_host[0]].type & NVIF_MEM_UNCACHED); 23974a39954SBen Skeggs } 24074a39954SBen Skeggs 2412d8b9ccbSDave Airlie int nouveau_pmops_suspend(struct device *); 2422d8b9ccbSDave Airlie int nouveau_pmops_resume(struct device *); 243321f5c5fSBen Skeggs bool nouveau_pmops_runtime(void); 24494580299SBen Skeggs 245e396ecd1SAlexandre Courbot #include <nvkm/core/tegra.h> 246e396ecd1SAlexandre Courbot 2478ba9ff11SAlexandre Courbot struct drm_device * 248e396ecd1SAlexandre Courbot nouveau_platform_device_create(const struct nvkm_device_tegra_func *, 249e396ecd1SAlexandre Courbot struct platform_device *, struct nvkm_device **); 2508ba9ff11SAlexandre Courbot void nouveau_drm_device_remove(struct drm_device *dev); 2518ba9ff11SAlexandre Courbot 252fa2bade9SBen Skeggs #define NV_PRINTK(l,c,f,a...) do { \ 253fa2bade9SBen Skeggs struct nouveau_cli *_cli = (c); \ 254e75c091bSBen Skeggs dev_##l(_cli->drm->dev->dev, "%s: "f, _cli->name, ##a); \ 255fa2bade9SBen Skeggs } while(0) 2564c497075SLyude Paul 2579ad97edeSBen Skeggs #define NV_FATAL(drm,f,a...) NV_PRINTK(crit, &(drm)->client, f, ##a) 2589ad97edeSBen Skeggs #define NV_ERROR(drm,f,a...) NV_PRINTK(err, &(drm)->client, f, ##a) 259fa2bade9SBen Skeggs #define NV_WARN(drm,f,a...) NV_PRINTK(warn, &(drm)->client, f, ##a) 260fa2bade9SBen Skeggs #define NV_INFO(drm,f,a...) NV_PRINTK(info, &(drm)->client, f, ##a) 2614c497075SLyude Paul 2629ad97edeSBen Skeggs #define NV_DEBUG(drm,f,a...) do { \ 2634f632fb2SJani Nikula if (drm_debug_enabled(DRM_UT_DRIVER)) \ 2649ad97edeSBen Skeggs NV_PRINTK(info, &(drm)->client, f, ##a); \ 2659ad97edeSBen Skeggs } while(0) 2663dbd036bSBen Skeggs #define NV_ATOMIC(drm,f,a...) do { \ 2674f632fb2SJani Nikula if (drm_debug_enabled(DRM_UT_ATOMIC)) \ 2683dbd036bSBen Skeggs NV_PRINTK(info, &(drm)->client, f, ##a); \ 2693dbd036bSBen Skeggs } while(0) 27094580299SBen Skeggs 2714c497075SLyude Paul #define NV_PRINTK_ONCE(l,c,f,a...) NV_PRINTK(l##_once,c,f, ##a) 2724c497075SLyude Paul 2734c497075SLyude Paul #define NV_ERROR_ONCE(drm,f,a...) NV_PRINTK_ONCE(err, &(drm)->client, f, ##a) 2744c497075SLyude Paul #define NV_WARN_ONCE(drm,f,a...) NV_PRINTK_ONCE(warn, &(drm)->client, f, ##a) 2754c497075SLyude Paul #define NV_INFO_ONCE(drm,f,a...) NV_PRINTK_ONCE(info, &(drm)->client, f, ##a) 2764c497075SLyude Paul 2779430738dSBen Skeggs extern int nouveau_modeset; 2789430738dSBen Skeggs 27994580299SBen Skeggs #endif 280