Commit | Line | Data |
---|---|---|
b7019ac5 | 1 | /* SPDX-License-Identifier: MIT */ |
639c308e BS |
2 | #ifndef __NVKM_FB_H__ |
3 | #define __NVKM_FB_H__ | |
861d2107 | 4 | #include <core/subdev.h> |
1b9b4f92 | 5 | #include <core/falcon.h> |
f9463a4b | 6 | #include <core/mm.h> |
861d2107 BS |
7 | |
8 | /* memory type/access flags, do not match hardware values */ | |
9 | #define NV_MEM_ACCESS_RO 1 | |
10 | #define NV_MEM_ACCESS_WO 2 | |
11 | #define NV_MEM_ACCESS_RW (NV_MEM_ACCESS_RO | NV_MEM_ACCESS_WO) | |
12 | #define NV_MEM_ACCESS_SYS 4 | |
13 | #define NV_MEM_ACCESS_VM 8 | |
14 | #define NV_MEM_ACCESS_NOSNOOP 16 | |
15 | ||
16 | #define NV_MEM_TARGET_VRAM 0 | |
17 | #define NV_MEM_TARGET_PCI 1 | |
18 | #define NV_MEM_TARGET_PCI_NOSNOOP 2 | |
19 | #define NV_MEM_TARGET_VM 3 | |
20 | #define NV_MEM_TARGET_GART 4 | |
21 | ||
d36a99d2 | 22 | #define NVKM_RAM_TYPE_VM 0x7f |
861d2107 BS |
23 | #define NV_MEM_COMP_VM 0x03 |
24 | ||
639c308e BS |
25 | struct nvkm_fb_tile { |
26 | struct nvkm_mm_node *tag; | |
861d2107 BS |
27 | u32 addr; |
28 | u32 limit; | |
29 | u32 pitch; | |
30 | u32 zcomp; | |
31 | }; | |
32 | ||
639c308e | 33 | struct nvkm_fb { |
03c8952f | 34 | const struct nvkm_fb_func *func; |
b1e4553c | 35 | struct nvkm_subdev subdev; |
861d2107 | 36 | |
1b9b4f92 | 37 | struct nvkm_falcon_fw vpr_scrubber; |
ebe52a58 | 38 | |
5728d064 BS |
39 | struct { |
40 | struct page *flush_page; | |
41 | dma_addr_t flush_page_addr; | |
42 | } sysmem; | |
43 | ||
639c308e | 44 | struct nvkm_ram *ram; |
f5cfbd99 BS |
45 | |
46 | struct { | |
47 | struct mutex mutex; /* protects mm and nvkm_memory::tags */ | |
48 | struct nvkm_mm mm; | |
49 | } tags; | |
861d2107 | 50 | |
861d2107 | 51 | struct { |
639c308e | 52 | struct nvkm_fb_tile region[16]; |
861d2107 | 53 | int regions; |
861d2107 | 54 | } tile; |
99c59172 | 55 | |
c73baa83 BS |
56 | u8 page; |
57 | ||
99c59172 BS |
58 | struct nvkm_memory *mmu_rd; |
59 | struct nvkm_memory *mmu_wr; | |
861d2107 BS |
60 | }; |
61 | ||
e3f32495 BS |
62 | int nvkm_fb_mem_unlock(struct nvkm_fb *); |
63 | ||
03c8952f BS |
64 | void nvkm_fb_tile_init(struct nvkm_fb *, int region, u32 addr, u32 size, |
65 | u32 pitch, u32 flags, struct nvkm_fb_tile *); | |
66 | void nvkm_fb_tile_fini(struct nvkm_fb *, int region, struct nvkm_fb_tile *); | |
67 | void nvkm_fb_tile_prog(struct nvkm_fb *, int region, struct nvkm_fb_tile *); | |
68 | ||
b7a9369a BS |
69 | int nv04_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); |
70 | int nv10_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); | |
71 | int nv1a_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); | |
72 | int nv20_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); | |
73 | int nv25_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); | |
74 | int nv30_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); | |
75 | int nv35_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); | |
76 | int nv36_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); | |
77 | int nv40_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); | |
78 | int nv41_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); | |
79 | int nv44_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); | |
80 | int nv46_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); | |
81 | int nv47_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); | |
82 | int nv49_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); | |
83 | int nv4e_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); | |
84 | int nv50_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); | |
85 | int g84_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); | |
86 | int gt215_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); | |
87 | int mcp77_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); | |
88 | int mcp89_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); | |
89 | int gf100_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); | |
90 | int gf108_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); | |
91 | int gk104_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); | |
92 | int gk110_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); | |
93 | int gk20a_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); | |
94 | int gm107_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); | |
95 | int gm200_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); | |
96 | int gm20b_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); | |
97 | int gp100_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); | |
98 | int gp102_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); | |
99 | int gp10b_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); | |
100 | int gv100_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); | |
b4806009 | 101 | int tu102_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); |
b7a9369a BS |
102 | int ga100_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); |
103 | int ga102_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **); | |
861d2107 | 104 | |
d390b480 | 105 | #include <subdev/bios.h> |
b655f2bb BS |
106 | #include <subdev/bios/ramcfg.h> |
107 | ||
639c308e | 108 | struct nvkm_ram_data { |
d26e7489 | 109 | struct list_head head; |
b655f2bb | 110 | struct nvbios_ramcfg bios; |
46bf1c38 | 111 | u32 freq; |
b655f2bb BS |
112 | }; |
113 | ||
d36a99d2 BS |
114 | enum nvkm_ram_type { |
115 | NVKM_RAM_TYPE_UNKNOWN = 0, | |
116 | NVKM_RAM_TYPE_STOLEN, | |
117 | NVKM_RAM_TYPE_SGRAM, | |
118 | NVKM_RAM_TYPE_SDRAM, | |
119 | NVKM_RAM_TYPE_DDR1, | |
120 | NVKM_RAM_TYPE_DDR2, | |
121 | NVKM_RAM_TYPE_DDR3, | |
122 | NVKM_RAM_TYPE_GDDR2, | |
123 | NVKM_RAM_TYPE_GDDR3, | |
124 | NVKM_RAM_TYPE_GDDR4, | |
2d5257b7 BS |
125 | NVKM_RAM_TYPE_GDDR5, |
126 | NVKM_RAM_TYPE_GDDR5X, | |
127 | NVKM_RAM_TYPE_GDDR6, | |
128 | NVKM_RAM_TYPE_HBM2, | |
d36a99d2 BS |
129 | }; |
130 | ||
639c308e | 131 | struct nvkm_ram { |
d36a99d2 BS |
132 | const struct nvkm_ram_func *func; |
133 | struct nvkm_fb *fb; | |
134 | enum nvkm_ram_type type; | |
dceef5d8 | 135 | u64 size; |
d36a99d2 BS |
136 | |
137 | #define NVKM_RAM_MM_SHIFT 12 | |
4d058fab BS |
138 | #define NVKM_RAM_MM_ANY (NVKM_MM_HEAP_ANY + 0) |
139 | #define NVKM_RAM_MM_NORMAL (NVKM_MM_HEAP_ANY + 1) | |
140 | #define NVKM_RAM_MM_NOMAP (NVKM_MM_HEAP_ANY + 2) | |
141 | #define NVKM_RAM_MM_MIXED (NVKM_MM_HEAP_ANY + 3) | |
d36a99d2 | 142 | struct nvkm_mm vram; |
d36a99d2 | 143 | u64 stolen; |
0e65ec75 | 144 | struct mutex mutex; |
5f8e2567 | 145 | |
dceef5d8 BS |
146 | int ranks; |
147 | int parts; | |
de1c4e28 | 148 | int part_mask; |
150ccf16 | 149 | |
aae95ca7 BS |
150 | u32 freq; |
151 | u32 mr[16]; | |
d394fb12 | 152 | u32 mr1_nuts; |
b655f2bb | 153 | |
639c308e BS |
154 | struct nvkm_ram_data *next; |
155 | struct nvkm_ram_data former; | |
156 | struct nvkm_ram_data xition; | |
157 | struct nvkm_ram_data target; | |
dceef5d8 | 158 | }; |
d36a99d2 | 159 | |
e9a8b218 BS |
160 | int |
161 | nvkm_ram_get(struct nvkm_device *, u8 heap, u8 type, u8 page, u64 size, | |
162 | bool contig, bool back, struct nvkm_memory **); | |
163 | ||
d36a99d2 | 164 | struct nvkm_ram_func { |
97e5268d BS |
165 | u64 upper; |
166 | u32 (*probe_fbp)(const struct nvkm_ram_func *, struct nvkm_device *, | |
167 | int fbp, int *pltcs); | |
168 | u32 (*probe_fbp_amount)(const struct nvkm_ram_func *, u32 fbpao, | |
169 | struct nvkm_device *, int fbp, int *pltcs); | |
170 | u32 (*probe_fbpa_amount)(struct nvkm_device *, int fbpa); | |
d36a99d2 BS |
171 | void *(*dtor)(struct nvkm_ram *); |
172 | int (*init)(struct nvkm_ram *); | |
173 | ||
d36a99d2 BS |
174 | int (*calc)(struct nvkm_ram *, u32 freq); |
175 | int (*prog)(struct nvkm_ram *); | |
176 | void (*tidy)(struct nvkm_ram *); | |
177 | }; | |
861d2107 | 178 | #endif |