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