1b7019ac5SIlia Mirkin /* SPDX-License-Identifier: MIT */ 2639c308eSBen Skeggs #ifndef __NVKM_FB_H__ 3639c308eSBen Skeggs #define __NVKM_FB_H__ 4c39f472eSBen Skeggs #include <core/subdev.h> 51b9b4f92SBen Skeggs #include <core/falcon.h> 6f9463a4bSBen Skeggs #include <core/mm.h> 7c39f472eSBen Skeggs 8c39f472eSBen Skeggs /* memory type/access flags, do not match hardware values */ 9c39f472eSBen Skeggs #define NV_MEM_ACCESS_RO 1 10c39f472eSBen Skeggs #define NV_MEM_ACCESS_WO 2 11c39f472eSBen Skeggs #define NV_MEM_ACCESS_RW (NV_MEM_ACCESS_RO | NV_MEM_ACCESS_WO) 12c39f472eSBen Skeggs #define NV_MEM_ACCESS_SYS 4 13c39f472eSBen Skeggs #define NV_MEM_ACCESS_VM 8 14c39f472eSBen Skeggs #define NV_MEM_ACCESS_NOSNOOP 16 15c39f472eSBen Skeggs 16c39f472eSBen Skeggs #define NV_MEM_TARGET_VRAM 0 17c39f472eSBen Skeggs #define NV_MEM_TARGET_PCI 1 18c39f472eSBen Skeggs #define NV_MEM_TARGET_PCI_NOSNOOP 2 19c39f472eSBen Skeggs #define NV_MEM_TARGET_VM 3 20c39f472eSBen Skeggs #define NV_MEM_TARGET_GART 4 21c39f472eSBen Skeggs 22d36a99d2SBen Skeggs #define NVKM_RAM_TYPE_VM 0x7f 23c39f472eSBen Skeggs #define NV_MEM_COMP_VM 0x03 24c39f472eSBen Skeggs 25639c308eSBen Skeggs struct nvkm_fb_tile { 26639c308eSBen Skeggs struct nvkm_mm_node *tag; 27c39f472eSBen Skeggs u32 addr; 28c39f472eSBen Skeggs u32 limit; 29c39f472eSBen Skeggs u32 pitch; 30c39f472eSBen Skeggs u32 zcomp; 31c39f472eSBen Skeggs }; 32c39f472eSBen Skeggs 33639c308eSBen Skeggs struct nvkm_fb { 3403c8952fSBen Skeggs const struct nvkm_fb_func *func; 35b1e4553cSBen Skeggs struct nvkm_subdev subdev; 36c39f472eSBen Skeggs 371b9b4f92SBen Skeggs struct nvkm_falcon_fw vpr_scrubber; 38ebe52a58SBen Skeggs 395728d064SBen Skeggs struct { 405728d064SBen Skeggs struct page *flush_page; 415728d064SBen Skeggs dma_addr_t flush_page_addr; 425728d064SBen Skeggs } sysmem; 435728d064SBen Skeggs 44639c308eSBen Skeggs struct nvkm_ram *ram; 45f5cfbd99SBen Skeggs 46f5cfbd99SBen Skeggs struct { 47f5cfbd99SBen Skeggs struct mutex mutex; /* protects mm and nvkm_memory::tags */ 48f5cfbd99SBen Skeggs struct nvkm_mm mm; 49f5cfbd99SBen Skeggs } tags; 50c39f472eSBen Skeggs 51c39f472eSBen Skeggs struct { 52639c308eSBen Skeggs struct nvkm_fb_tile region[16]; 53c39f472eSBen Skeggs int regions; 54c39f472eSBen Skeggs } tile; 5599c59172SBen Skeggs 56c73baa83SBen Skeggs u8 page; 57c73baa83SBen Skeggs 5899c59172SBen Skeggs struct nvkm_memory *mmu_rd; 5999c59172SBen Skeggs struct nvkm_memory *mmu_wr; 60c39f472eSBen Skeggs }; 61c39f472eSBen Skeggs 62*2c0c15a2SBen Skeggs u64 nvkm_fb_vidmem_size(struct nvkm_device *); 63e3f32495SBen Skeggs int nvkm_fb_mem_unlock(struct nvkm_fb *); 64e3f32495SBen Skeggs 6503c8952fSBen Skeggs void nvkm_fb_tile_init(struct nvkm_fb *, int region, u32 addr, u32 size, 6603c8952fSBen Skeggs u32 pitch, u32 flags, struct nvkm_fb_tile *); 6703c8952fSBen Skeggs void nvkm_fb_tile_fini(struct nvkm_fb *, int region, struct nvkm_fb_tile *); 6803c8952fSBen Skeggs void nvkm_fb_tile_prog(struct nvkm_fb *, int region, struct nvkm_fb_tile *); 69c39f472eSBen Skeggs 70b7a9369aSBen Skeggs int nv04_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); 71b7a9369aSBen Skeggs int nv10_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); 72b7a9369aSBen Skeggs int nv1a_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); 73b7a9369aSBen Skeggs int nv20_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); 74b7a9369aSBen Skeggs int nv25_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); 75b7a9369aSBen Skeggs int nv30_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); 76b7a9369aSBen Skeggs int nv35_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); 77b7a9369aSBen Skeggs int nv36_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); 78b7a9369aSBen Skeggs int nv40_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); 79b7a9369aSBen Skeggs int nv41_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); 80b7a9369aSBen Skeggs int nv44_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); 81b7a9369aSBen Skeggs int nv46_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); 82b7a9369aSBen Skeggs int nv47_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); 83b7a9369aSBen Skeggs int nv49_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); 84b7a9369aSBen Skeggs int nv4e_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); 85b7a9369aSBen Skeggs int nv50_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); 86b7a9369aSBen Skeggs int g84_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); 87b7a9369aSBen Skeggs int gt215_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); 88b7a9369aSBen Skeggs int mcp77_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); 89b7a9369aSBen Skeggs int mcp89_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); 90b7a9369aSBen Skeggs int gf100_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); 91b7a9369aSBen Skeggs int gf108_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); 92b7a9369aSBen Skeggs int gk104_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); 93b7a9369aSBen Skeggs int gk110_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); 94b7a9369aSBen Skeggs int gk20a_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); 95b7a9369aSBen Skeggs int gm107_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); 96b7a9369aSBen Skeggs int gm200_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); 97b7a9369aSBen Skeggs int gm20b_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); 98b7a9369aSBen Skeggs int gp100_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); 99b7a9369aSBen Skeggs int gp102_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); 100b7a9369aSBen Skeggs int gp10b_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); 101b7a9369aSBen Skeggs int gv100_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); 102b4806009SBen Skeggs int tu102_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); 103b7a9369aSBen Skeggs int ga100_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); 104b7a9369aSBen Skeggs int ga102_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); 105c39f472eSBen Skeggs 106d390b480SBen Skeggs #include <subdev/bios.h> 107c39f472eSBen Skeggs #include <subdev/bios/ramcfg.h> 108c39f472eSBen Skeggs 109639c308eSBen Skeggs struct nvkm_ram_data { 110c39f472eSBen Skeggs struct list_head head; 111c39f472eSBen Skeggs struct nvbios_ramcfg bios; 112c39f472eSBen Skeggs u32 freq; 113c39f472eSBen Skeggs }; 114c39f472eSBen Skeggs 115d36a99d2SBen Skeggs enum nvkm_ram_type { 116d36a99d2SBen Skeggs NVKM_RAM_TYPE_UNKNOWN = 0, 117d36a99d2SBen Skeggs NVKM_RAM_TYPE_STOLEN, 118d36a99d2SBen Skeggs NVKM_RAM_TYPE_SGRAM, 119d36a99d2SBen Skeggs NVKM_RAM_TYPE_SDRAM, 120d36a99d2SBen Skeggs NVKM_RAM_TYPE_DDR1, 121d36a99d2SBen Skeggs NVKM_RAM_TYPE_DDR2, 122d36a99d2SBen Skeggs NVKM_RAM_TYPE_DDR3, 123d36a99d2SBen Skeggs NVKM_RAM_TYPE_GDDR2, 124d36a99d2SBen Skeggs NVKM_RAM_TYPE_GDDR3, 125d36a99d2SBen Skeggs NVKM_RAM_TYPE_GDDR4, 1262d5257b7SBen Skeggs NVKM_RAM_TYPE_GDDR5, 1272d5257b7SBen Skeggs NVKM_RAM_TYPE_GDDR5X, 1282d5257b7SBen Skeggs NVKM_RAM_TYPE_GDDR6, 1292d5257b7SBen Skeggs NVKM_RAM_TYPE_HBM2, 130d36a99d2SBen Skeggs }; 131d36a99d2SBen Skeggs 132639c308eSBen Skeggs struct nvkm_ram { 133d36a99d2SBen Skeggs const struct nvkm_ram_func *func; 134d36a99d2SBen Skeggs struct nvkm_fb *fb; 135d36a99d2SBen Skeggs enum nvkm_ram_type type; 136c39f472eSBen Skeggs u64 size; 137d36a99d2SBen Skeggs 138d36a99d2SBen Skeggs #define NVKM_RAM_MM_SHIFT 12 1394d058fabSBen Skeggs #define NVKM_RAM_MM_ANY (NVKM_MM_HEAP_ANY + 0) 1404d058fabSBen Skeggs #define NVKM_RAM_MM_NORMAL (NVKM_MM_HEAP_ANY + 1) 1414d058fabSBen Skeggs #define NVKM_RAM_MM_NOMAP (NVKM_MM_HEAP_ANY + 2) 1424d058fabSBen Skeggs #define NVKM_RAM_MM_MIXED (NVKM_MM_HEAP_ANY + 3) 143d36a99d2SBen Skeggs struct nvkm_mm vram; 144d36a99d2SBen Skeggs u64 stolen; 1450e65ec75SBen Skeggs struct mutex mutex; 146c39f472eSBen Skeggs 147c39f472eSBen Skeggs int ranks; 148c39f472eSBen Skeggs int parts; 149c39f472eSBen Skeggs int part_mask; 150c39f472eSBen Skeggs 151c39f472eSBen Skeggs u32 freq; 152c39f472eSBen Skeggs u32 mr[16]; 153c39f472eSBen Skeggs u32 mr1_nuts; 154c39f472eSBen Skeggs 155639c308eSBen Skeggs struct nvkm_ram_data *next; 156639c308eSBen Skeggs struct nvkm_ram_data former; 157639c308eSBen Skeggs struct nvkm_ram_data xition; 158639c308eSBen Skeggs struct nvkm_ram_data target; 159c39f472eSBen Skeggs }; 160d36a99d2SBen Skeggs 161e9a8b218SBen Skeggs int 162e9a8b218SBen Skeggs nvkm_ram_get(struct nvkm_device *, u8 heap, u8 type, u8 page, u64 size, 163e9a8b218SBen Skeggs bool contig, bool back, struct nvkm_memory **); 164e9a8b218SBen Skeggs 165d36a99d2SBen Skeggs struct nvkm_ram_func { 16697e5268dSBen Skeggs u64 upper; 16797e5268dSBen Skeggs u32 (*probe_fbp)(const struct nvkm_ram_func *, struct nvkm_device *, 16897e5268dSBen Skeggs int fbp, int *pltcs); 16997e5268dSBen Skeggs u32 (*probe_fbp_amount)(const struct nvkm_ram_func *, u32 fbpao, 17097e5268dSBen Skeggs struct nvkm_device *, int fbp, int *pltcs); 17197e5268dSBen Skeggs u32 (*probe_fbpa_amount)(struct nvkm_device *, int fbpa); 172d36a99d2SBen Skeggs void *(*dtor)(struct nvkm_ram *); 173d36a99d2SBen Skeggs int (*init)(struct nvkm_ram *); 174d36a99d2SBen Skeggs 175d36a99d2SBen Skeggs int (*calc)(struct nvkm_ram *, u32 freq); 176d36a99d2SBen Skeggs int (*prog)(struct nvkm_ram *); 177d36a99d2SBen Skeggs void (*tidy)(struct nvkm_ram *); 178d36a99d2SBen Skeggs }; 179c39f472eSBen Skeggs #endif 180