| .. | .. |
|---|
| 67 | 67 | nvkm_vmm_pte_func mem; |
|---|
| 68 | 68 | nvkm_vmm_pte_func dma; |
|---|
| 69 | 69 | nvkm_vmm_pte_func sgl; |
|---|
| 70 | + |
|---|
| 71 | + nvkm_vmm_pte_func pfn; |
|---|
| 72 | + bool (*pfn_clear)(struct nvkm_vmm *, struct nvkm_mmu_pt *, u32 ptei, u32 ptes); |
|---|
| 73 | + nvkm_vmm_pxe_func pfn_unmap; |
|---|
| 70 | 74 | }; |
|---|
| 71 | 75 | |
|---|
| 72 | 76 | extern const struct nvkm_vmm_desc_func gf100_vmm_pgd; |
|---|
| .. | .. |
|---|
| 141 | 145 | struct nvkm_vmm_map *); |
|---|
| 142 | 146 | void (*flush)(struct nvkm_vmm *, int depth); |
|---|
| 143 | 147 | |
|---|
| 148 | + int (*mthd)(struct nvkm_vmm *, struct nvkm_client *, |
|---|
| 149 | + u32 mthd, void *argv, u32 argc); |
|---|
| 150 | + |
|---|
| 151 | + void (*invalidate_pdb)(struct nvkm_vmm *, u64 addr); |
|---|
| 152 | + |
|---|
| 144 | 153 | u64 page_block; |
|---|
| 145 | 154 | const struct nvkm_vmm_page page[]; |
|---|
| 146 | 155 | }; |
|---|
| .. | .. |
|---|
| 151 | 160 | }; |
|---|
| 152 | 161 | |
|---|
| 153 | 162 | int nvkm_vmm_new_(const struct nvkm_vmm_func *, struct nvkm_mmu *, |
|---|
| 154 | | - u32 pd_header, u64 addr, u64 size, struct lock_class_key *, |
|---|
| 155 | | - const char *name, struct nvkm_vmm **); |
|---|
| 156 | | -int nvkm_vmm_ctor(const struct nvkm_vmm_func *, struct nvkm_mmu *, |
|---|
| 157 | | - u32 pd_header, u64 addr, u64 size, struct lock_class_key *, |
|---|
| 158 | | - const char *name, struct nvkm_vmm *); |
|---|
| 163 | + u32 pd_header, bool managed, u64 addr, u64 size, |
|---|
| 164 | + struct lock_class_key *, const char *name, |
|---|
| 165 | + struct nvkm_vmm **); |
|---|
| 159 | 166 | struct nvkm_vma *nvkm_vmm_node_search(struct nvkm_vmm *, u64 addr); |
|---|
| 167 | +struct nvkm_vma *nvkm_vmm_node_split(struct nvkm_vmm *, struct nvkm_vma *, |
|---|
| 168 | + u64 addr, u64 size); |
|---|
| 160 | 169 | int nvkm_vmm_get_locked(struct nvkm_vmm *, bool getref, bool mapref, |
|---|
| 161 | 170 | bool sparse, u8 page, u8 align, u64 size, |
|---|
| 162 | 171 | struct nvkm_vma **pvma); |
|---|
| 163 | 172 | void nvkm_vmm_put_locked(struct nvkm_vmm *, struct nvkm_vma *); |
|---|
| 164 | | -void nvkm_vmm_unmap_locked(struct nvkm_vmm *, struct nvkm_vma *); |
|---|
| 165 | | -void nvkm_vmm_unmap_region(struct nvkm_vmm *vmm, struct nvkm_vma *vma); |
|---|
| 173 | +void nvkm_vmm_unmap_locked(struct nvkm_vmm *, struct nvkm_vma *, bool pfn); |
|---|
| 174 | +void nvkm_vmm_unmap_region(struct nvkm_vmm *, struct nvkm_vma *); |
|---|
| 175 | + |
|---|
| 176 | +#define NVKM_VMM_PFN_ADDR 0xfffffffffffff000ULL |
|---|
| 177 | +#define NVKM_VMM_PFN_ADDR_SHIFT 12 |
|---|
| 178 | +#define NVKM_VMM_PFN_APER 0x00000000000000f0ULL |
|---|
| 179 | +#define NVKM_VMM_PFN_HOST 0x0000000000000000ULL |
|---|
| 180 | +#define NVKM_VMM_PFN_VRAM 0x0000000000000010ULL |
|---|
| 181 | +#define NVKM_VMM_PFN_W 0x0000000000000002ULL |
|---|
| 182 | +#define NVKM_VMM_PFN_V 0x0000000000000001ULL |
|---|
| 183 | +#define NVKM_VMM_PFN_NONE 0x0000000000000000ULL |
|---|
| 184 | + |
|---|
| 185 | +int nvkm_vmm_pfn_map(struct nvkm_vmm *, u8 page, u64 addr, u64 size, u64 *pfn); |
|---|
| 186 | +int nvkm_vmm_pfn_unmap(struct nvkm_vmm *, u64 addr, u64 size); |
|---|
| 166 | 187 | |
|---|
| 167 | 188 | struct nvkm_vma *nvkm_vma_tail(struct nvkm_vma *, u64 tail); |
|---|
| 168 | | -void nvkm_vmm_node_insert(struct nvkm_vmm *, struct nvkm_vma *); |
|---|
| 169 | 189 | |
|---|
| 170 | 190 | int nv04_vmm_new_(const struct nvkm_vmm_func *, struct nvkm_mmu *, u32, |
|---|
| 171 | | - u64, u64, void *, u32, struct lock_class_key *, |
|---|
| 191 | + bool, u64, u64, void *, u32, struct lock_class_key *, |
|---|
| 172 | 192 | const char *, struct nvkm_vmm **); |
|---|
| 173 | 193 | int nv04_vmm_valid(struct nvkm_vmm *, void *, u32, struct nvkm_vmm_map *); |
|---|
| 174 | 194 | |
|---|
| .. | .. |
|---|
| 178 | 198 | void nv50_vmm_flush(struct nvkm_vmm *, int); |
|---|
| 179 | 199 | |
|---|
| 180 | 200 | int gf100_vmm_new_(const struct nvkm_vmm_func *, const struct nvkm_vmm_func *, |
|---|
| 181 | | - struct nvkm_mmu *, u64, u64, void *, u32, |
|---|
| 201 | + struct nvkm_mmu *, bool, u64, u64, void *, u32, |
|---|
| 182 | 202 | struct lock_class_key *, const char *, struct nvkm_vmm **); |
|---|
| 183 | 203 | int gf100_vmm_join_(struct nvkm_vmm *, struct nvkm_memory *, u64 base); |
|---|
| 184 | 204 | int gf100_vmm_join(struct nvkm_vmm *, struct nvkm_memory *); |
|---|
| 185 | 205 | void gf100_vmm_part(struct nvkm_vmm *, struct nvkm_memory *); |
|---|
| 186 | 206 | int gf100_vmm_aper(enum nvkm_memory_target); |
|---|
| 187 | 207 | int gf100_vmm_valid(struct nvkm_vmm *, void *, u32, struct nvkm_vmm_map *); |
|---|
| 188 | | -void gf100_vmm_flush_(struct nvkm_vmm *, int); |
|---|
| 189 | 208 | void gf100_vmm_flush(struct nvkm_vmm *, int); |
|---|
| 209 | +void gf100_vmm_invalidate(struct nvkm_vmm *, u32 type); |
|---|
| 210 | +void gf100_vmm_invalidate_pdb(struct nvkm_vmm *, u64 addr); |
|---|
| 190 | 211 | |
|---|
| 191 | 212 | int gk20a_vmm_aper(enum nvkm_memory_target); |
|---|
| 192 | 213 | |
|---|
| 193 | 214 | int gm200_vmm_new_(const struct nvkm_vmm_func *, const struct nvkm_vmm_func *, |
|---|
| 194 | | - struct nvkm_mmu *, u64, u64, void *, u32, |
|---|
| 215 | + struct nvkm_mmu *, bool, u64, u64, void *, u32, |
|---|
| 195 | 216 | struct lock_class_key *, const char *, struct nvkm_vmm **); |
|---|
| 196 | 217 | int gm200_vmm_join_(struct nvkm_vmm *, struct nvkm_memory *, u64 base); |
|---|
| 197 | 218 | int gm200_vmm_join(struct nvkm_vmm *, struct nvkm_memory *); |
|---|
| 198 | 219 | |
|---|
| 220 | +int gp100_vmm_new_(const struct nvkm_vmm_func *, |
|---|
| 221 | + struct nvkm_mmu *, bool, u64, u64, void *, u32, |
|---|
| 222 | + struct lock_class_key *, const char *, struct nvkm_vmm **); |
|---|
| 199 | 223 | int gp100_vmm_join(struct nvkm_vmm *, struct nvkm_memory *); |
|---|
| 200 | 224 | int gp100_vmm_valid(struct nvkm_vmm *, void *, u32, struct nvkm_vmm_map *); |
|---|
| 201 | 225 | void gp100_vmm_flush(struct nvkm_vmm *, int); |
|---|
| 226 | +int gp100_vmm_mthd(struct nvkm_vmm *, struct nvkm_client *, u32, void *, u32); |
|---|
| 227 | +void gp100_vmm_invalidate_pdb(struct nvkm_vmm *, u64 addr); |
|---|
| 202 | 228 | |
|---|
| 203 | | -int nv04_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32, |
|---|
| 229 | +int gv100_vmm_join(struct nvkm_vmm *, struct nvkm_memory *); |
|---|
| 230 | + |
|---|
| 231 | +int nv04_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32, |
|---|
| 204 | 232 | struct lock_class_key *, const char *, struct nvkm_vmm **); |
|---|
| 205 | | -int nv41_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32, |
|---|
| 233 | +int nv41_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32, |
|---|
| 206 | 234 | struct lock_class_key *, const char *, struct nvkm_vmm **); |
|---|
| 207 | | -int nv44_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32, |
|---|
| 235 | +int nv44_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32, |
|---|
| 208 | 236 | struct lock_class_key *, const char *, struct nvkm_vmm **); |
|---|
| 209 | | -int nv50_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32, |
|---|
| 237 | +int nv50_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32, |
|---|
| 210 | 238 | struct lock_class_key *, const char *, struct nvkm_vmm **); |
|---|
| 211 | | -int mcp77_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32, |
|---|
| 239 | +int mcp77_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32, |
|---|
| 212 | 240 | struct lock_class_key *, const char *, struct nvkm_vmm **); |
|---|
| 213 | | -int g84_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32, |
|---|
| 241 | +int g84_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32, |
|---|
| 214 | 242 | struct lock_class_key *, const char *, struct nvkm_vmm **); |
|---|
| 215 | | -int gf100_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32, |
|---|
| 243 | +int gf100_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32, |
|---|
| 216 | 244 | struct lock_class_key *, const char *, struct nvkm_vmm **); |
|---|
| 217 | | -int gk104_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32, |
|---|
| 245 | +int gk104_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32, |
|---|
| 218 | 246 | struct lock_class_key *, const char *, struct nvkm_vmm **); |
|---|
| 219 | | -int gk20a_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32, |
|---|
| 247 | +int gk20a_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32, |
|---|
| 220 | 248 | struct lock_class_key *, const char *, struct nvkm_vmm **); |
|---|
| 221 | | -int gm200_vmm_new_fixed(struct nvkm_mmu *, u64, u64, void *, u32, |
|---|
| 249 | +int gm200_vmm_new_fixed(struct nvkm_mmu *, bool, u64, u64, void *, u32, |
|---|
| 222 | 250 | struct lock_class_key *, const char *, |
|---|
| 223 | 251 | struct nvkm_vmm **); |
|---|
| 224 | | -int gm200_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32, |
|---|
| 252 | +int gm200_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32, |
|---|
| 225 | 253 | struct lock_class_key *, const char *, |
|---|
| 226 | 254 | struct nvkm_vmm **); |
|---|
| 227 | | -int gm20b_vmm_new_fixed(struct nvkm_mmu *, u64, u64, void *, u32, |
|---|
| 255 | +int gm20b_vmm_new_fixed(struct nvkm_mmu *, bool, u64, u64, void *, u32, |
|---|
| 228 | 256 | struct lock_class_key *, const char *, |
|---|
| 229 | 257 | struct nvkm_vmm **); |
|---|
| 230 | | -int gm20b_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32, |
|---|
| 258 | +int gm20b_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32, |
|---|
| 231 | 259 | struct lock_class_key *, const char *, |
|---|
| 232 | 260 | struct nvkm_vmm **); |
|---|
| 233 | | -int gp100_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32, |
|---|
| 261 | +int gp100_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32, |
|---|
| 234 | 262 | struct lock_class_key *, const char *, |
|---|
| 235 | 263 | struct nvkm_vmm **); |
|---|
| 236 | | -int gp10b_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32, |
|---|
| 264 | +int gp10b_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32, |
|---|
| 237 | 265 | struct lock_class_key *, const char *, |
|---|
| 238 | 266 | struct nvkm_vmm **); |
|---|
| 239 | | -int gv100_vmm_new(struct nvkm_mmu *, u64, u64, void *, u32, |
|---|
| 267 | +int gv100_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32, |
|---|
| 268 | + struct lock_class_key *, const char *, |
|---|
| 269 | + struct nvkm_vmm **); |
|---|
| 270 | +int tu102_vmm_new(struct nvkm_mmu *, bool, u64, u64, void *, u32, |
|---|
| 240 | 271 | struct lock_class_key *, const char *, |
|---|
| 241 | 272 | struct nvkm_vmm **); |
|---|
| 242 | 273 | |
|---|
| .. | .. |
|---|
| 270 | 301 | FILL(VMM, PT, PTEI, _ptes, MAP, _addr); \ |
|---|
| 271 | 302 | PTEI += _ptes; \ |
|---|
| 272 | 303 | PTEN -= _ptes; \ |
|---|
| 273 | | - }; \ |
|---|
| 304 | + } \ |
|---|
| 274 | 305 | nvkm_done((PT)->memory); \ |
|---|
| 275 | 306 | } while(0) |
|---|
| 276 | 307 | |
|---|