.. | .. |
---|
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 | + struct list_head partial_pte_list; |
---|
161 | 168 | } ggtt_mm; |
---|
162 | 169 | }; |
---|
163 | 170 | }; |
---|
164 | 171 | |
---|
165 | 172 | struct intel_vgpu_mm *intel_vgpu_create_ppgtt_mm(struct intel_vgpu *vgpu, |
---|
166 | | - intel_gvt_gtt_type_t root_entry_type, u64 pdps[]); |
---|
| 173 | + enum intel_gvt_gtt_type root_entry_type, u64 pdps[]); |
---|
167 | 174 | |
---|
168 | 175 | static inline void intel_vgpu_mm_get(struct intel_vgpu_mm *mm) |
---|
169 | 176 | { |
---|
.. | .. |
---|
199 | 206 | struct intel_vgpu_scratch_pt scratch_pt[GTT_TYPE_MAX]; |
---|
200 | 207 | }; |
---|
201 | 208 | |
---|
202 | | -extern int intel_vgpu_init_gtt(struct intel_vgpu *vgpu); |
---|
203 | | -extern void intel_vgpu_clean_gtt(struct intel_vgpu *vgpu); |
---|
| 209 | +int intel_vgpu_init_gtt(struct intel_vgpu *vgpu); |
---|
| 210 | +void intel_vgpu_clean_gtt(struct intel_vgpu *vgpu); |
---|
204 | 211 | void intel_vgpu_reset_ggtt(struct intel_vgpu *vgpu, bool invalidate_old); |
---|
205 | 212 | void intel_vgpu_invalidate_ppgtt(struct intel_vgpu *vgpu); |
---|
206 | 213 | |
---|
207 | | -extern int intel_gvt_init_gtt(struct intel_gvt *gvt); |
---|
| 214 | +int intel_gvt_init_gtt(struct intel_gvt *gvt); |
---|
208 | 215 | void intel_vgpu_reset_gtt(struct intel_vgpu *vgpu); |
---|
209 | | -extern void intel_gvt_clean_gtt(struct intel_gvt *gvt); |
---|
| 216 | +void intel_gvt_clean_gtt(struct intel_gvt *gvt); |
---|
210 | 217 | |
---|
211 | | -extern struct intel_vgpu_mm *intel_gvt_find_ppgtt_mm(struct intel_vgpu *vgpu, |
---|
212 | | - int page_table_level, void *root_entry); |
---|
| 218 | +struct intel_vgpu_mm *intel_gvt_find_ppgtt_mm(struct intel_vgpu *vgpu, |
---|
| 219 | + int page_table_level, |
---|
| 220 | + void *root_entry); |
---|
213 | 221 | |
---|
214 | 222 | struct intel_vgpu_oos_page { |
---|
215 | 223 | struct intel_vgpu_ppgtt_spt *spt; |
---|
216 | 224 | struct list_head list; |
---|
217 | 225 | struct list_head vm_list; |
---|
218 | 226 | int id; |
---|
219 | | - unsigned char mem[I915_GTT_PAGE_SIZE]; |
---|
| 227 | + void *mem; |
---|
220 | 228 | }; |
---|
221 | 229 | |
---|
222 | 230 | #define GTT_ENTRY_NUM_IN_ONE_PAGE 512 |
---|
.. | .. |
---|
227 | 235 | struct intel_vgpu *vgpu; |
---|
228 | 236 | |
---|
229 | 237 | struct { |
---|
230 | | - intel_gvt_gtt_type_t type; |
---|
| 238 | + enum intel_gvt_gtt_type type; |
---|
231 | 239 | bool pde_ips; /* for 64KB PTEs */ |
---|
232 | 240 | void *vaddr; |
---|
233 | 241 | struct page *page; |
---|
.. | .. |
---|
235 | 243 | } shadow_page; |
---|
236 | 244 | |
---|
237 | 245 | struct { |
---|
238 | | - intel_gvt_gtt_type_t type; |
---|
| 246 | + enum intel_gvt_gtt_type type; |
---|
239 | 247 | bool pde_ips; /* for 64KB PTEs */ |
---|
240 | 248 | unsigned long gfn; |
---|
241 | 249 | unsigned long write_cnt; |
---|
.. | .. |
---|
261 | 269 | u64 pdps[]); |
---|
262 | 270 | |
---|
263 | 271 | struct intel_vgpu_mm *intel_vgpu_get_ppgtt_mm(struct intel_vgpu *vgpu, |
---|
264 | | - intel_gvt_gtt_type_t root_entry_type, u64 pdps[]); |
---|
| 272 | + enum intel_gvt_gtt_type root_entry_type, u64 pdps[]); |
---|
265 | 273 | |
---|
266 | 274 | int intel_vgpu_put_ppgtt_mm(struct intel_vgpu *vgpu, u64 pdps[]); |
---|
267 | 275 | |
---|
.. | .. |
---|
271 | 279 | int intel_vgpu_emulate_ggtt_mmio_write(struct intel_vgpu *vgpu, |
---|
272 | 280 | unsigned int off, void *p_data, unsigned int bytes); |
---|
273 | 281 | |
---|
| 282 | +void intel_vgpu_destroy_all_ppgtt_mm(struct intel_vgpu *vgpu); |
---|
| 283 | + |
---|
274 | 284 | #endif /* _GVT_GTT_H_ */ |
---|