diff options
Diffstat (limited to 'drivers/gpu/drm/i915')
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_context.c | 10 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_gtt.c | 9 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_gtt.h | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_vma.h | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_guc.c | 42 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_guc.h | 12 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_huc.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_uc_fw.c | 2 |
8 files changed, 44 insertions, 40 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c index b10770cfccd2..32f96b8cd9c4 100644 --- a/drivers/gpu/drm/i915/i915_gem_context.c +++ b/drivers/gpu/drm/i915/i915_gem_context.c | |||
@@ -329,15 +329,7 @@ __create_hw_context(struct drm_i915_private *dev_priv, | |||
329 | ctx->desc_template = | 329 | ctx->desc_template = |
330 | default_desc_template(dev_priv, dev_priv->mm.aliasing_ppgtt); | 330 | default_desc_template(dev_priv, dev_priv->mm.aliasing_ppgtt); |
331 | 331 | ||
332 | /* | 332 | ctx->ggtt_offset_bias = dev_priv->ggtt.pin_bias; |
333 | * GuC requires the ring to be placed in Non-WOPCM memory. If GuC is not | ||
334 | * present or not in use we still need a small bias as ring wraparound | ||
335 | * at offset 0 sometimes hangs. No idea why. | ||
336 | */ | ||
337 | if (USES_GUC(dev_priv)) | ||
338 | ctx->ggtt_offset_bias = dev_priv->guc.ggtt_pin_bias; | ||
339 | else | ||
340 | ctx->ggtt_offset_bias = I915_GTT_PAGE_SIZE; | ||
341 | 333 | ||
342 | return ctx; | 334 | return ctx; |
343 | 335 | ||
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c index 1b476423bfab..87219870d559 100644 --- a/drivers/gpu/drm/i915/i915_gem_gtt.c +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c | |||
@@ -2929,6 +2929,15 @@ int i915_gem_init_ggtt(struct drm_i915_private *dev_priv) | |||
2929 | struct drm_mm_node *entry; | 2929 | struct drm_mm_node *entry; |
2930 | int ret; | 2930 | int ret; |
2931 | 2931 | ||
2932 | /* | ||
2933 | * GuC requires all resources that we're sharing with it to be placed in | ||
2934 | * non-WOPCM memory. If GuC is not present or not in use we still need a | ||
2935 | * small bias as ring wraparound at offset 0 sometimes hangs. No idea | ||
2936 | * why. | ||
2937 | */ | ||
2938 | ggtt->pin_bias = max_t(u32, I915_GTT_PAGE_SIZE, | ||
2939 | intel_guc_reserved_gtt_size(&dev_priv->guc)); | ||
2940 | |||
2932 | ret = intel_vgt_balloon(dev_priv); | 2941 | ret = intel_vgt_balloon(dev_priv); |
2933 | if (ret) | 2942 | if (ret) |
2934 | return ret; | 2943 | return ret; |
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.h b/drivers/gpu/drm/i915/i915_gem_gtt.h index 2a116a91420b..ce945bf78a89 100644 --- a/drivers/gpu/drm/i915/i915_gem_gtt.h +++ b/drivers/gpu/drm/i915/i915_gem_gtt.h | |||
@@ -401,6 +401,8 @@ struct i915_ggtt { | |||
401 | 401 | ||
402 | int mtrr; | 402 | int mtrr; |
403 | 403 | ||
404 | u32 pin_bias; | ||
405 | |||
404 | struct drm_mm_node error_capture; | 406 | struct drm_mm_node error_capture; |
405 | }; | 407 | }; |
406 | 408 | ||
diff --git a/drivers/gpu/drm/i915/i915_vma.h b/drivers/gpu/drm/i915/i915_vma.h index af5296b015f5..f1ba40bbe6f9 100644 --- a/drivers/gpu/drm/i915/i915_vma.h +++ b/drivers/gpu/drm/i915/i915_vma.h | |||
@@ -208,6 +208,11 @@ static inline u32 i915_ggtt_offset(const struct i915_vma *vma) | |||
208 | return lower_32_bits(vma->node.start); | 208 | return lower_32_bits(vma->node.start); |
209 | } | 209 | } |
210 | 210 | ||
211 | static inline u32 i915_ggtt_pin_bias(struct i915_vma *vma) | ||
212 | { | ||
213 | return i915_vm_to_ggtt(vma->vm)->pin_bias; | ||
214 | } | ||
215 | |||
211 | static inline struct i915_vma *i915_vma_get(struct i915_vma *vma) | 216 | static inline struct i915_vma *i915_vma_get(struct i915_vma *vma) |
212 | { | 217 | { |
213 | i915_gem_object_get(vma->obj); | 218 | i915_gem_object_get(vma->obj); |
diff --git a/drivers/gpu/drm/i915/intel_guc.c b/drivers/gpu/drm/i915/intel_guc.c index deb6a2053eaf..230aea69385d 100644 --- a/drivers/gpu/drm/i915/intel_guc.c +++ b/drivers/gpu/drm/i915/intel_guc.c | |||
@@ -27,8 +27,6 @@ | |||
27 | #include "intel_guc_submission.h" | 27 | #include "intel_guc_submission.h" |
28 | #include "i915_drv.h" | 28 | #include "i915_drv.h" |
29 | 29 | ||
30 | static void guc_init_ggtt_pin_bias(struct intel_guc *guc); | ||
31 | |||
32 | static void gen8_guc_raise_irq(struct intel_guc *guc) | 30 | static void gen8_guc_raise_irq(struct intel_guc *guc) |
33 | { | 31 | { |
34 | struct drm_i915_private *dev_priv = guc_to_i915(guc); | 32 | struct drm_i915_private *dev_priv = guc_to_i915(guc); |
@@ -144,8 +142,6 @@ int intel_guc_init_misc(struct intel_guc *guc) | |||
144 | struct drm_i915_private *i915 = guc_to_i915(guc); | 142 | struct drm_i915_private *i915 = guc_to_i915(guc); |
145 | int ret; | 143 | int ret; |
146 | 144 | ||
147 | guc_init_ggtt_pin_bias(guc); | ||
148 | |||
149 | ret = guc_init_wq(guc); | 145 | ret = guc_init_wq(guc); |
150 | if (ret) | 146 | if (ret) |
151 | return ret; | 147 | return ret; |
@@ -607,22 +603,6 @@ int intel_guc_resume(struct intel_guc *guc) | |||
607 | */ | 603 | */ |
608 | 604 | ||
609 | /** | 605 | /** |
610 | * guc_init_ggtt_pin_bias() - Initialize the GuC ggtt_pin_bias value. | ||
611 | * @guc: intel_guc structure. | ||
612 | * | ||
613 | * This function will calculate and initialize the ggtt_pin_bias value | ||
614 | * based on the GuC WOPCM size. | ||
615 | */ | ||
616 | static void guc_init_ggtt_pin_bias(struct intel_guc *guc) | ||
617 | { | ||
618 | struct drm_i915_private *i915 = guc_to_i915(guc); | ||
619 | |||
620 | GEM_BUG_ON(!i915->wopcm.size); | ||
621 | |||
622 | guc->ggtt_pin_bias = i915->wopcm.guc.size; | ||
623 | } | ||
624 | |||
625 | /** | ||
626 | * intel_guc_allocate_vma() - Allocate a GGTT VMA for GuC usage | 606 | * intel_guc_allocate_vma() - Allocate a GGTT VMA for GuC usage |
627 | * @guc: the guc | 607 | * @guc: the guc |
628 | * @size: size of area to allocate (both virtual space and memory) | 608 | * @size: size of area to allocate (both virtual space and memory) |
@@ -640,6 +620,7 @@ struct i915_vma *intel_guc_allocate_vma(struct intel_guc *guc, u32 size) | |||
640 | struct drm_i915_private *dev_priv = guc_to_i915(guc); | 620 | struct drm_i915_private *dev_priv = guc_to_i915(guc); |
641 | struct drm_i915_gem_object *obj; | 621 | struct drm_i915_gem_object *obj; |
642 | struct i915_vma *vma; | 622 | struct i915_vma *vma; |
623 | u64 flags; | ||
643 | int ret; | 624 | int ret; |
644 | 625 | ||
645 | obj = i915_gem_object_create(dev_priv, size); | 626 | obj = i915_gem_object_create(dev_priv, size); |
@@ -650,8 +631,8 @@ struct i915_vma *intel_guc_allocate_vma(struct intel_guc *guc, u32 size) | |||
650 | if (IS_ERR(vma)) | 631 | if (IS_ERR(vma)) |
651 | goto err; | 632 | goto err; |
652 | 633 | ||
653 | ret = i915_vma_pin(vma, 0, 0, | 634 | flags = PIN_GLOBAL | PIN_OFFSET_BIAS | i915_ggtt_pin_bias(vma); |
654 | PIN_GLOBAL | PIN_OFFSET_BIAS | guc->ggtt_pin_bias); | 635 | ret = i915_vma_pin(vma, 0, 0, flags); |
655 | if (ret) { | 636 | if (ret) { |
656 | vma = ERR_PTR(ret); | 637 | vma = ERR_PTR(ret); |
657 | goto err; | 638 | goto err; |
@@ -663,3 +644,20 @@ err: | |||
663 | i915_gem_object_put(obj); | 644 | i915_gem_object_put(obj); |
664 | return vma; | 645 | return vma; |
665 | } | 646 | } |
647 | |||
648 | /** | ||
649 | * intel_guc_reserved_gtt_size() | ||
650 | * @guc: intel_guc structure | ||
651 | * | ||
652 | * The GuC WOPCM mapping shadows the lower part of the GGTT, so if we are using | ||
653 | * GuC we can't have any objects pinned in that region. This function returns | ||
654 | * the size of the shadowed region. | ||
655 | * | ||
656 | * Returns: | ||
657 | * 0 if GuC is not present or not in use. | ||
658 | * Otherwise, the GuC WOPCM size. | ||
659 | */ | ||
660 | u32 intel_guc_reserved_gtt_size(struct intel_guc *guc) | ||
661 | { | ||
662 | return guc_to_i915(guc)->wopcm.guc.size; | ||
663 | } | ||
diff --git a/drivers/gpu/drm/i915/intel_guc.h b/drivers/gpu/drm/i915/intel_guc.h index 4121928a495e..ad42faf48c46 100644 --- a/drivers/gpu/drm/i915/intel_guc.h +++ b/drivers/gpu/drm/i915/intel_guc.h | |||
@@ -49,9 +49,6 @@ struct intel_guc { | |||
49 | struct intel_guc_log log; | 49 | struct intel_guc_log log; |
50 | struct intel_guc_ct ct; | 50 | struct intel_guc_ct ct; |
51 | 51 | ||
52 | /* Offset where Non-WOPCM memory starts. */ | ||
53 | u32 ggtt_pin_bias; | ||
54 | |||
55 | /* Log snapshot if GuC errors during load */ | 52 | /* Log snapshot if GuC errors during load */ |
56 | struct drm_i915_gem_object *load_err_log; | 53 | struct drm_i915_gem_object *load_err_log; |
57 | 54 | ||
@@ -130,10 +127,10 @@ static inline void intel_guc_to_host_event_handler(struct intel_guc *guc) | |||
130 | * @vma: i915 graphics virtual memory area. | 127 | * @vma: i915 graphics virtual memory area. |
131 | * | 128 | * |
132 | * GuC does not allow any gfx GGTT address that falls into range | 129 | * GuC does not allow any gfx GGTT address that falls into range |
133 | * [0, GuC ggtt_pin_bias), which is reserved for Boot ROM, SRAM and WOPCM. | 130 | * [0, ggtt.pin_bias), which is reserved for Boot ROM, SRAM and WOPCM. |
134 | * Currently, in order to exclude [0, GuC ggtt_pin_bias) address space from | 131 | * Currently, in order to exclude [0, ggtt.pin_bias) address space from |
135 | * GGTT, all gfx objects used by GuC are allocated with intel_guc_allocate_vma() | 132 | * GGTT, all gfx objects used by GuC are allocated with intel_guc_allocate_vma() |
136 | * and pinned with PIN_OFFSET_BIAS along with the value of GuC ggtt_pin_bias. | 133 | * and pinned with PIN_OFFSET_BIAS along with the value of ggtt.pin_bias. |
137 | * | 134 | * |
138 | * Return: GGTT offset of the @vma. | 135 | * Return: GGTT offset of the @vma. |
139 | */ | 136 | */ |
@@ -142,7 +139,7 @@ static inline u32 intel_guc_ggtt_offset(struct intel_guc *guc, | |||
142 | { | 139 | { |
143 | u32 offset = i915_ggtt_offset(vma); | 140 | u32 offset = i915_ggtt_offset(vma); |
144 | 141 | ||
145 | GEM_BUG_ON(offset < guc->ggtt_pin_bias); | 142 | GEM_BUG_ON(offset < i915_ggtt_pin_bias(vma)); |
146 | GEM_BUG_ON(range_overflows_t(u64, offset, vma->size, GUC_GGTT_TOP)); | 143 | GEM_BUG_ON(range_overflows_t(u64, offset, vma->size, GUC_GGTT_TOP)); |
147 | 144 | ||
148 | return offset; | 145 | return offset; |
@@ -168,6 +165,7 @@ int intel_guc_auth_huc(struct intel_guc *guc, u32 rsa_offset); | |||
168 | int intel_guc_suspend(struct intel_guc *guc); | 165 | int intel_guc_suspend(struct intel_guc *guc); |
169 | int intel_guc_resume(struct intel_guc *guc); | 166 | int intel_guc_resume(struct intel_guc *guc); |
170 | struct i915_vma *intel_guc_allocate_vma(struct intel_guc *guc, u32 size); | 167 | struct i915_vma *intel_guc_allocate_vma(struct intel_guc *guc, u32 size); |
168 | u32 intel_guc_reserved_gtt_size(struct intel_guc *guc); | ||
171 | 169 | ||
172 | static inline int intel_guc_sanitize(struct intel_guc *guc) | 170 | static inline int intel_guc_sanitize(struct intel_guc *guc) |
173 | { | 171 | { |
diff --git a/drivers/gpu/drm/i915/intel_huc.c b/drivers/gpu/drm/i915/intel_huc.c index ffcad5fad6a7..37ef540dd280 100644 --- a/drivers/gpu/drm/i915/intel_huc.c +++ b/drivers/gpu/drm/i915/intel_huc.c | |||
@@ -63,7 +63,7 @@ int intel_huc_auth(struct intel_huc *huc) | |||
63 | return -ENOEXEC; | 63 | return -ENOEXEC; |
64 | 64 | ||
65 | vma = i915_gem_object_ggtt_pin(huc->fw.obj, NULL, 0, 0, | 65 | vma = i915_gem_object_ggtt_pin(huc->fw.obj, NULL, 0, 0, |
66 | PIN_OFFSET_BIAS | guc->ggtt_pin_bias); | 66 | PIN_OFFSET_BIAS | i915->ggtt.pin_bias); |
67 | if (IS_ERR(vma)) { | 67 | if (IS_ERR(vma)) { |
68 | ret = PTR_ERR(vma); | 68 | ret = PTR_ERR(vma); |
69 | DRM_ERROR("HuC: Failed to pin huc fw object %d\n", ret); | 69 | DRM_ERROR("HuC: Failed to pin huc fw object %d\n", ret); |
diff --git a/drivers/gpu/drm/i915/intel_uc_fw.c b/drivers/gpu/drm/i915/intel_uc_fw.c index 6e8e0b546743..fd496416087c 100644 --- a/drivers/gpu/drm/i915/intel_uc_fw.c +++ b/drivers/gpu/drm/i915/intel_uc_fw.c | |||
@@ -222,7 +222,7 @@ int intel_uc_fw_upload(struct intel_uc_fw *uc_fw, | |||
222 | goto fail; | 222 | goto fail; |
223 | } | 223 | } |
224 | 224 | ||
225 | ggtt_pin_bias = to_i915(uc_fw->obj->base.dev)->guc.ggtt_pin_bias; | 225 | ggtt_pin_bias = to_i915(uc_fw->obj->base.dev)->ggtt.pin_bias; |
226 | vma = i915_gem_object_ggtt_pin(uc_fw->obj, NULL, 0, 0, | 226 | vma = i915_gem_object_ggtt_pin(uc_fw->obj, NULL, 0, 0, |
227 | PIN_OFFSET_BIAS | ggtt_pin_bias); | 227 | PIN_OFFSET_BIAS | ggtt_pin_bias); |
228 | if (IS_ERR(vma)) { | 228 | if (IS_ERR(vma)) { |