| .. | .. |
|---|
| 88 | 88 | void (*mm_free_page_table)(struct intel_vgpu_mm *mm); |
|---|
| 89 | 89 | struct list_head oos_page_use_list_head; |
|---|
| 90 | 90 | struct list_head oos_page_free_list_head; |
|---|
| 91 | + struct mutex ppgtt_mm_lock; |
|---|
| 91 | 92 | struct list_head ppgtt_mm_lru_list_head; |
|---|
| 92 | 93 | |
|---|
| 93 | 94 | struct page *scratch_page; |
|---|
| 94 | 95 | unsigned long scratch_mfn; |
|---|
| 95 | 96 | }; |
|---|
| 96 | 97 | |
|---|
| 97 | | -typedef enum { |
|---|
| 98 | | - GTT_TYPE_INVALID = -1, |
|---|
| 98 | +enum intel_gvt_gtt_type { |
|---|
| 99 | + GTT_TYPE_INVALID = 0, |
|---|
| 99 | 100 | |
|---|
| 100 | 101 | GTT_TYPE_GGTT_PTE, |
|---|
| 101 | 102 | |
|---|
| .. | .. |
|---|
| 123 | 124 | GTT_TYPE_PPGTT_PML4_PT, |
|---|
| 124 | 125 | |
|---|
| 125 | 126 | GTT_TYPE_MAX, |
|---|
| 126 | | -} intel_gvt_gtt_type_t; |
|---|
| 127 | +}; |
|---|
| 127 | 128 | |
|---|
| 128 | 129 | enum intel_gvt_mm_type { |
|---|
| 129 | 130 | INTEL_GVT_MM_GGTT, |
|---|
| .. | .. |
|---|
| 131 | 132 | }; |
|---|
| 132 | 133 | |
|---|
| 133 | 134 | #define GVT_RING_CTX_NR_PDPS GEN8_3LVL_PDPES |
|---|
| 135 | + |
|---|
| 136 | +struct intel_gvt_partial_pte { |
|---|
| 137 | + unsigned long offset; |
|---|
| 138 | + u64 data; |
|---|
| 139 | + struct list_head list; |
|---|
| 140 | +}; |
|---|
| 134 | 141 | |
|---|
| 135 | 142 | struct intel_vgpu_mm { |
|---|
| 136 | 143 | enum intel_gvt_mm_type type; |
|---|
| .. | .. |
|---|
| 141 | 148 | |
|---|
| 142 | 149 | union { |
|---|
| 143 | 150 | struct { |
|---|
| 144 | | - intel_gvt_gtt_type_t root_entry_type; |
|---|
| 151 | + enum intel_gvt_gtt_type root_entry_type; |
|---|
| 145 | 152 | /* |
|---|
| 146 | 153 | * The 4 PDPs in ring context. For 48bit addressing, |
|---|
| 147 | 154 | * only PDP0 is valid and point to PML4. For 32it |
|---|
| .. | .. |
|---|
| 153 | 160 | |
|---|
| 154 | 161 | struct list_head list; |
|---|
| 155 | 162 | struct list_head lru_list; |
|---|
| 163 | + struct list_head link; /* possible LRI shadow mm list */ |
|---|
| 156 | 164 | } ppgtt_mm; |
|---|
| 157 | 165 | struct { |
|---|
| 158 | 166 | void *virtual_ggtt; |
|---|
| 159 | | - unsigned long last_partial_off; |
|---|
| 160 | | - u64 last_partial_data; |
|---|
| 167 | + /* Save/restore for PM */ |
|---|
| 168 | + u64 *host_ggtt_aperture; |
|---|
| 169 | + u64 *host_ggtt_hidden; |
|---|
| 170 | + struct list_head partial_pte_list; |
|---|
| 161 | 171 | } ggtt_mm; |
|---|
| 162 | 172 | }; |
|---|
| 163 | 173 | }; |
|---|
| 164 | 174 | |
|---|
| 165 | 175 | struct intel_vgpu_mm *intel_vgpu_create_ppgtt_mm(struct intel_vgpu *vgpu, |
|---|
| 166 | | - intel_gvt_gtt_type_t root_entry_type, u64 pdps[]); |
|---|
| 176 | + enum intel_gvt_gtt_type root_entry_type, u64 pdps[]); |
|---|
| 167 | 177 | |
|---|
| 168 | 178 | static inline void intel_vgpu_mm_get(struct intel_vgpu_mm *mm) |
|---|
| 169 | 179 | { |
|---|
| .. | .. |
|---|
| 199 | 209 | struct intel_vgpu_scratch_pt scratch_pt[GTT_TYPE_MAX]; |
|---|
| 200 | 210 | }; |
|---|
| 201 | 211 | |
|---|
| 202 | | -extern int intel_vgpu_init_gtt(struct intel_vgpu *vgpu); |
|---|
| 203 | | -extern void intel_vgpu_clean_gtt(struct intel_vgpu *vgpu); |
|---|
| 212 | +int intel_vgpu_init_gtt(struct intel_vgpu *vgpu); |
|---|
| 213 | +void intel_vgpu_clean_gtt(struct intel_vgpu *vgpu); |
|---|
| 204 | 214 | void intel_vgpu_reset_ggtt(struct intel_vgpu *vgpu, bool invalidate_old); |
|---|
| 205 | 215 | void intel_vgpu_invalidate_ppgtt(struct intel_vgpu *vgpu); |
|---|
| 206 | 216 | |
|---|
| 207 | | -extern int intel_gvt_init_gtt(struct intel_gvt *gvt); |
|---|
| 208 | | -void intel_vgpu_reset_gtt(struct intel_vgpu *vgpu); |
|---|
| 209 | | -extern void intel_gvt_clean_gtt(struct intel_gvt *gvt); |
|---|
| 217 | +int intel_gvt_init_gtt(struct intel_gvt *gvt); |
|---|
| 218 | +void intel_gvt_clean_gtt(struct intel_gvt *gvt); |
|---|
| 210 | 219 | |
|---|
| 211 | | -extern struct intel_vgpu_mm *intel_gvt_find_ppgtt_mm(struct intel_vgpu *vgpu, |
|---|
| 212 | | - int page_table_level, void *root_entry); |
|---|
| 220 | +struct intel_vgpu_mm *intel_gvt_find_ppgtt_mm(struct intel_vgpu *vgpu, |
|---|
| 221 | + int page_table_level, |
|---|
| 222 | + void *root_entry); |
|---|
| 213 | 223 | |
|---|
| 214 | 224 | struct intel_vgpu_oos_page { |
|---|
| 215 | 225 | struct intel_vgpu_ppgtt_spt *spt; |
|---|
| 216 | 226 | struct list_head list; |
|---|
| 217 | 227 | struct list_head vm_list; |
|---|
| 218 | 228 | int id; |
|---|
| 219 | | - unsigned char mem[I915_GTT_PAGE_SIZE]; |
|---|
| 229 | + void *mem; |
|---|
| 220 | 230 | }; |
|---|
| 221 | 231 | |
|---|
| 222 | 232 | #define GTT_ENTRY_NUM_IN_ONE_PAGE 512 |
|---|
| .. | .. |
|---|
| 227 | 237 | struct intel_vgpu *vgpu; |
|---|
| 228 | 238 | |
|---|
| 229 | 239 | struct { |
|---|
| 230 | | - intel_gvt_gtt_type_t type; |
|---|
| 240 | + enum intel_gvt_gtt_type type; |
|---|
| 231 | 241 | bool pde_ips; /* for 64KB PTEs */ |
|---|
| 232 | 242 | void *vaddr; |
|---|
| 233 | 243 | struct page *page; |
|---|
| .. | .. |
|---|
| 235 | 245 | } shadow_page; |
|---|
| 236 | 246 | |
|---|
| 237 | 247 | struct { |
|---|
| 238 | | - intel_gvt_gtt_type_t type; |
|---|
| 248 | + enum intel_gvt_gtt_type type; |
|---|
| 239 | 249 | bool pde_ips; /* for 64KB PTEs */ |
|---|
| 240 | 250 | unsigned long gfn; |
|---|
| 241 | 251 | unsigned long write_cnt; |
|---|
| .. | .. |
|---|
| 261 | 271 | u64 pdps[]); |
|---|
| 262 | 272 | |
|---|
| 263 | 273 | struct intel_vgpu_mm *intel_vgpu_get_ppgtt_mm(struct intel_vgpu *vgpu, |
|---|
| 264 | | - intel_gvt_gtt_type_t root_entry_type, u64 pdps[]); |
|---|
| 274 | + enum intel_gvt_gtt_type root_entry_type, u64 pdps[]); |
|---|
| 265 | 275 | |
|---|
| 266 | 276 | int intel_vgpu_put_ppgtt_mm(struct intel_vgpu *vgpu, u64 pdps[]); |
|---|
| 267 | 277 | |
|---|
| .. | .. |
|---|
| 271 | 281 | int intel_vgpu_emulate_ggtt_mmio_write(struct intel_vgpu *vgpu, |
|---|
| 272 | 282 | unsigned int off, void *p_data, unsigned int bytes); |
|---|
| 273 | 283 | |
|---|
| 284 | +void intel_vgpu_destroy_all_ppgtt_mm(struct intel_vgpu *vgpu); |
|---|
| 285 | +void intel_gvt_restore_ggtt(struct intel_gvt *gvt); |
|---|
| 286 | + |
|---|
| 274 | 287 | #endif /* _GVT_GTT_H_ */ |
|---|