Set memory attributes on page
[pscnv.git] / pscnv / nvc0_vm.h
blobca921e5acae163895a9851ef8f07a2d25b423dfb
1 #ifndef __NVC0_VM_H__
2 #define __NVC0_VM_H__
4 #include "drm.h"
5 #include "pscnv_engine.h"
7 #define NVC0_VM_SIZE 0x10000000000ULL
9 #define NVC0_SPAGE_SHIFT 12
10 #define NVC0_LPAGE_SHIFT 17
11 #define NVC0_SPAGE_MASK 0x00fff
12 #define NVC0_LPAGE_MASK 0x1ffff
14 #define NVC0_VM_PDE_COUNT 0x2000
15 #define NVC0_VM_BLOCK_SIZE 0x8000000
16 #define NVC0_VM_BLOCK_MASK 0x7ffffff
17 #define NVC0_VM_SPTE_COUNT (NVC0_VM_BLOCK_SIZE >> NVC0_SPAGE_SHIFT)
18 #define NVC0_VM_LPTE_COUNT (NVC0_VM_BLOCK_SIZE >> NVC0_LPAGE_SHIFT)
20 #define NVC0_PDE(a) ((a) / NVC0_VM_BLOCK_SIZE)
21 #define NVC0_SPTE(a) (((a) & NVC0_VM_BLOCK_MASK) >> NVC0_SPAGE_SHIFT)
22 #define NVC0_LPTE(a) (((a) & NVC0_VM_BLOCK_MASK) >> NVC0_LPAGE_SHIFT)
24 #define NVC0_PDE_HT_SIZE 32
25 #define NVC0_PDE_HASH(n) (n % NVC0_PDE_HT_SIZE)
27 #define nvc0_vm(x) container_of(x, struct nvc0_vm_engine, base)
28 #define nvc0_vs(x) ((struct nvc0_vspace *)(x)->engdata)
30 struct nvc0_pgt {
31 struct list_head head;
32 unsigned int pde;
33 unsigned int limit; /* virtual range = NVC0_VM_BLOCK_SIZE >> limit */
34 struct pscnv_bo *bo[2]; /* 128 KiB and 4 KiB page tables */
37 struct nvc0_vm_engine {
38 struct pscnv_vm_engine base;
39 struct pscnv_vspace *bar1vm;
40 struct pscnv_chan *bar1ch;
41 struct pscnv_vspace *bar3vm;
42 struct pscnv_chan *bar3ch;
45 struct nvc0_vspace {
46 struct pscnv_bo *pd;
47 struct list_head ptht[NVC0_PDE_HT_SIZE];
48 struct pscnv_mm_node *obj19848;
49 struct pscnv_mm_node *obj08004;
50 struct pscnv_mm_node *obj0800c;
51 struct pscnv_bo *mmio_bo;
52 struct pscnv_mm_node *mmio_vm;
53 uint32_t mmio_count;
56 #endif /* __NVC0_VM_H__ */