| 1 | /* SPDX-License-Identifier: MIT */ | 
|---|
| 2 | /* | 
|---|
| 3 | * Copyright © 2020 Intel Corporation | 
|---|
| 4 | */ | 
|---|
| 5 |  | 
|---|
| 6 | #ifndef __GEN6_PPGTT_H__ | 
|---|
| 7 | #define __GEN6_PPGTT_H__ | 
|---|
| 8 |  | 
|---|
| 9 | #include "intel_gtt.h" | 
|---|
| 10 |  | 
|---|
| 11 | struct i915_gem_ww_ctx; | 
|---|
| 12 |  | 
|---|
| 13 | struct gen6_ppgtt { | 
|---|
| 14 | struct i915_ppgtt base; | 
|---|
| 15 |  | 
|---|
| 16 | struct mutex flush; | 
|---|
| 17 | struct i915_vma *vma; | 
|---|
| 18 | gen6_pte_t __iomem *pd_addr; | 
|---|
| 19 | u32 pp_dir; | 
|---|
| 20 |  | 
|---|
| 21 | atomic_t pin_count; | 
|---|
| 22 |  | 
|---|
| 23 | bool scan_for_unused_pt; | 
|---|
| 24 | }; | 
|---|
| 25 |  | 
|---|
| 26 | static inline u32 gen6_pte_index(u32 addr) | 
|---|
| 27 | { | 
|---|
| 28 | return i915_pte_index(address: addr, GEN6_PDE_SHIFT); | 
|---|
| 29 | } | 
|---|
| 30 |  | 
|---|
| 31 | static inline u32 gen6_pte_count(u32 addr, u32 length) | 
|---|
| 32 | { | 
|---|
| 33 | return i915_pte_count(addr, length, GEN6_PDE_SHIFT); | 
|---|
| 34 | } | 
|---|
| 35 |  | 
|---|
| 36 | static inline u32 gen6_pde_index(u32 addr) | 
|---|
| 37 | { | 
|---|
| 38 | return i915_pde_index(addr, GEN6_PDE_SHIFT); | 
|---|
| 39 | } | 
|---|
| 40 |  | 
|---|
| 41 | #define __to_gen6_ppgtt(base) container_of(base, struct gen6_ppgtt, base) | 
|---|
| 42 |  | 
|---|
| 43 | static inline struct gen6_ppgtt *to_gen6_ppgtt(struct i915_ppgtt *base) | 
|---|
| 44 | { | 
|---|
| 45 | BUILD_BUG_ON(offsetof(struct gen6_ppgtt, base)); | 
|---|
| 46 | return __to_gen6_ppgtt(base); | 
|---|
| 47 | } | 
|---|
| 48 |  | 
|---|
| 49 | /* | 
|---|
| 50 | * gen6_for_each_pde() iterates over every pde from start until start+length. | 
|---|
| 51 | * If start and start+length are not perfectly divisible, the macro will round | 
|---|
| 52 | * down and up as needed. Start=0 and length=2G effectively iterates over | 
|---|
| 53 | * every PDE in the system. The macro modifies ALL its parameters except 'pd', | 
|---|
| 54 | * so each of the other parameters should preferably be a simple variable, or | 
|---|
| 55 | * at most an lvalue with no side-effects! | 
|---|
| 56 | */ | 
|---|
| 57 | #define gen6_for_each_pde(pt, pd, start, length, iter)			\ | 
|---|
| 58 | for (iter = gen6_pde_index(start);				\ | 
|---|
| 59 | length > 0 && iter < I915_PDES &&				\ | 
|---|
| 60 | (pt = i915_pt_entry(pd, iter), true);		\ | 
|---|
| 61 | ({ u32 temp = ALIGN(start + 1, 1 << GEN6_PDE_SHIFT);	\ | 
|---|
| 62 | temp = min(temp - start, length);			\ | 
|---|
| 63 | start += temp; length -= temp; }), ++iter) | 
|---|
| 64 |  | 
|---|
| 65 | #define gen6_for_all_pdes(pt, pd, iter)					\ | 
|---|
| 66 | for (iter = 0;							\ | 
|---|
| 67 | iter < I915_PDES &&					\ | 
|---|
| 68 | (pt = i915_pt_entry(pd, iter), true);		\ | 
|---|
| 69 | ++iter) | 
|---|
| 70 |  | 
|---|
| 71 | int gen6_ppgtt_pin(struct i915_ppgtt *base, struct i915_gem_ww_ctx *ww); | 
|---|
| 72 | void gen6_ppgtt_unpin(struct i915_ppgtt *base); | 
|---|
| 73 | void gen6_ppgtt_enable(struct intel_gt *gt); | 
|---|
| 74 | void gen7_ppgtt_enable(struct intel_gt *gt); | 
|---|
| 75 | struct i915_ppgtt *gen6_ppgtt_create(struct intel_gt *gt); | 
|---|
| 76 |  | 
|---|
| 77 | #endif | 
|---|
| 78 |  | 
|---|