diff mbox series

[4/5] drm/xe/xe2: Limit ccs framebuffers to tile4 only

Message ID 20240126210807.320671-5-juhapekka.heikkila@gmail.com (mailing list archive)
State New, archived
Headers show
Series Enable ccs compressed framebuffers on Xe2 | expand

Commit Message

Juha-Pekka Heikkila Jan. 26, 2024, 9:08 p.m. UTC
Display engine support ccs only with tile4, prevent other modifiers
from using compressed memory. Store pin time pat index to xe_bo.

Signed-off-by: Juha-Pekka Heikkila <juhapekka.heikkila@gmail.com>
---
 drivers/gpu/drm/xe/display/xe_fb_pin.c | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

Comments

Matthew Auld Jan. 29, 2024, 12:02 p.m. UTC | #1
On 26/01/2024 21:08, Juha-Pekka Heikkila wrote:
> Display engine support ccs only with tile4, prevent other modifiers
> from using compressed memory. Store pin time pat index to xe_bo.
> 
> Signed-off-by: Juha-Pekka Heikkila <juhapekka.heikkila@gmail.com>
> ---
>   drivers/gpu/drm/xe/display/xe_fb_pin.c | 19 +++++++++++++++++++
>   1 file changed, 19 insertions(+)
> 
> diff --git a/drivers/gpu/drm/xe/display/xe_fb_pin.c b/drivers/gpu/drm/xe/display/xe_fb_pin.c
> index 722c84a56607..b2930a226f54 100644
> --- a/drivers/gpu/drm/xe/display/xe_fb_pin.c
> +++ b/drivers/gpu/drm/xe/display/xe_fb_pin.c
> @@ -10,9 +10,18 @@
>   #include "intel_fb_pin.h"
>   #include "xe_ggtt.h"
>   #include "xe_gt.h"
> +#include "xe_pat.h"
>   
>   #include <drm/ttm/ttm_bo.h>
>   
> +static bool is_compressed(const struct drm_framebuffer *fb)
> +{
> +	struct xe_bo *bo = intel_fb_obj(fb);
> +	struct xe_device *xe = to_xe_device(to_intel_framebuffer(fb)->base.dev);
> +
> +	return xe_pat_index_has_compression(xe, bo->pat_index);
> +}
> +
>   static void
>   write_dpt_rotated(struct xe_bo *bo, struct iosys_map *map, u32 *dpt_ofs, u32 bo_ofs,
>   		  u32 width, u32 height, u32 src_stride, u32 dst_stride)
> @@ -349,12 +358,22 @@ void intel_unpin_fb_vma(struct i915_vma *vma, unsigned long flags)
>   int intel_plane_pin_fb(struct intel_plane_state *plane_state)
>   {
>   	struct drm_framebuffer *fb = plane_state->hw.fb;
> +	struct xe_device *xe = to_xe_device(to_intel_framebuffer(fb)->base.dev);
>   	struct xe_bo *bo = intel_fb_obj(fb);
>   	struct i915_vma *vma;
>   
>   	/* We reject creating !SCANOUT fb's, so this is weird.. */
>   	drm_WARN_ON(bo->ttm.base.dev, !(bo->flags & XE_BO_SCANOUT_BIT));
>   
> +	if (GRAPHICS_VER(xe) >= 20) {
> +		if (fb->modifier != I915_FORMAT_MOD_4_TILED &&
> +		    is_compressed(fb)) {
> +			drm_warn(&xe->drm, "Cannot create ccs framebuffer with other than tile4 mofifier\n");
> +			return -EINVAL;
> +		}
> +		bo->pat_index_scanout = bo->pat_index;
> +	}

I think this needs to be moved into __xe_pin_fb_vma() after acquiring 
the object lock. Also not sure what prevents vm_bind appearing after we 
drop the lock? Do we need to prevent modifications until the end of 
_xe_unpin_fb_vma()?

> +
>   	vma = __xe_pin_fb_vma(to_intel_framebuffer(fb), &plane_state->view.gtt);
>   	if (IS_ERR(vma))
>   		return PTR_ERR(vma);
Juha-Pekka Heikkila Jan. 30, 2024, 7:16 p.m. UTC | #2
On 29.1.2024 14.02, Matthew Auld wrote:
> On 26/01/2024 21:08, Juha-Pekka Heikkila wrote:
>> Display engine support ccs only with tile4, prevent other modifiers
>> from using compressed memory. Store pin time pat index to xe_bo.
>>
>> Signed-off-by: Juha-Pekka Heikkila <juhapekka.heikkila@gmail.com>
>> ---
>>   drivers/gpu/drm/xe/display/xe_fb_pin.c | 19 +++++++++++++++++++
>>   1 file changed, 19 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/xe/display/xe_fb_pin.c 
>> b/drivers/gpu/drm/xe/display/xe_fb_pin.c
>> index 722c84a56607..b2930a226f54 100644
>> --- a/drivers/gpu/drm/xe/display/xe_fb_pin.c
>> +++ b/drivers/gpu/drm/xe/display/xe_fb_pin.c
>> @@ -10,9 +10,18 @@
>>   #include "intel_fb_pin.h"
>>   #include "xe_ggtt.h"
>>   #include "xe_gt.h"
>> +#include "xe_pat.h"
>>   #include <drm/ttm/ttm_bo.h>
>> +static bool is_compressed(const struct drm_framebuffer *fb)
>> +{
>> +    struct xe_bo *bo = intel_fb_obj(fb);
>> +    struct xe_device *xe = 
>> to_xe_device(to_intel_framebuffer(fb)->base.dev);
>> +
>> +    return xe_pat_index_has_compression(xe, bo->pat_index);
>> +}
>> +
>>   static void
>>   write_dpt_rotated(struct xe_bo *bo, struct iosys_map *map, u32 
>> *dpt_ofs, u32 bo_ofs,
>>             u32 width, u32 height, u32 src_stride, u32 dst_stride)
>> @@ -349,12 +358,22 @@ void intel_unpin_fb_vma(struct i915_vma *vma, 
>> unsigned long flags)
>>   int intel_plane_pin_fb(struct intel_plane_state *plane_state)
>>   {
>>       struct drm_framebuffer *fb = plane_state->hw.fb;
>> +    struct xe_device *xe = 
>> to_xe_device(to_intel_framebuffer(fb)->base.dev);
>>       struct xe_bo *bo = intel_fb_obj(fb);
>>       struct i915_vma *vma;
>>       /* We reject creating !SCANOUT fb's, so this is weird.. */
>>       drm_WARN_ON(bo->ttm.base.dev, !(bo->flags & XE_BO_SCANOUT_BIT));
>> +    if (GRAPHICS_VER(xe) >= 20) {
>> +        if (fb->modifier != I915_FORMAT_MOD_4_TILED &&
>> +            is_compressed(fb)) {
>> +            drm_warn(&xe->drm, "Cannot create ccs framebuffer with 
>> other than tile4 mofifier\n");
>> +            return -EINVAL;
>> +        }
>> +        bo->pat_index_scanout = bo->pat_index;
>> +    }
> 
> I think this needs to be moved into __xe_pin_fb_vma() after acquiring 
> the object lock. Also not sure what prevents vm_bind appearing after we 
> drop the lock? Do we need to prevent modifications until the end of 
> _xe_unpin_fb_vma()?

I did now put in __xe_unpin_fb_vma()
..
vma->bo->has_sealed_pat_index = false;
..

as well as moved this above block to correct place.

> 
>> +
>>       vma = __xe_pin_fb_vma(to_intel_framebuffer(fb), 
>> &plane_state->view.gtt);
>>       if (IS_ERR(vma))
>>           return PTR_ERR(vma);
Maarten Lankhorst Jan. 31, 2024, 10:26 a.m. UTC | #3
Hey,

On 2024-01-30 20:16, Juha-Pekka Heikkila wrote:
> On 29.1.2024 14.02, Matthew Auld wrote:
>> On 26/01/2024 21:08, Juha-Pekka Heikkila wrote:
>>> Display engine support ccs only with tile4, prevent other modifiers
>>> from using compressed memory. Store pin time pat index to xe_bo.
>>>
>>> Signed-off-by: Juha-Pekka Heikkila <juhapekka.heikkila@gmail.com>
>>> ---
>>>   drivers/gpu/drm/xe/display/xe_fb_pin.c | 19 +++++++++++++++++++
>>>   1 file changed, 19 insertions(+)
>>>
>>> diff --git a/drivers/gpu/drm/xe/display/xe_fb_pin.c 
>>> b/drivers/gpu/drm/xe/display/xe_fb_pin.c
>>> index 722c84a56607..b2930a226f54 100644
>>> --- a/drivers/gpu/drm/xe/display/xe_fb_pin.c
>>> +++ b/drivers/gpu/drm/xe/display/xe_fb_pin.c
>>> @@ -10,9 +10,18 @@
>>>   #include "intel_fb_pin.h"
>>>   #include "xe_ggtt.h"
>>>   #include "xe_gt.h"
>>> +#include "xe_pat.h"
>>>   #include <drm/ttm/ttm_bo.h>
>>> +static bool is_compressed(const struct drm_framebuffer *fb)
>>> +{
>>> +    struct xe_bo *bo = intel_fb_obj(fb);
>>> +    struct xe_device *xe = 
>>> to_xe_device(to_intel_framebuffer(fb)->base.dev);
>>> +
>>> +    return xe_pat_index_has_compression(xe, bo->pat_index);
>>> +}
>>> +
>>>   static void
>>>   write_dpt_rotated(struct xe_bo *bo, struct iosys_map *map, u32 
>>> *dpt_ofs, u32 bo_ofs,
>>>             u32 width, u32 height, u32 src_stride, u32 dst_stride)
>>> @@ -349,12 +358,22 @@ void intel_unpin_fb_vma(struct i915_vma *vma, 
>>> unsigned long flags)
>>>   int intel_plane_pin_fb(struct intel_plane_state *plane_state)
>>>   {
>>>       struct drm_framebuffer *fb = plane_state->hw.fb;
>>> +    struct xe_device *xe = 
>>> to_xe_device(to_intel_framebuffer(fb)->base.dev);
>>>       struct xe_bo *bo = intel_fb_obj(fb);
>>>       struct i915_vma *vma;
>>>       /* We reject creating !SCANOUT fb's, so this is weird.. */
>>>       drm_WARN_ON(bo->ttm.base.dev, !(bo->flags & XE_BO_SCANOUT_BIT));
>>> +    if (GRAPHICS_VER(xe) >= 20) {
>>> +        if (fb->modifier != I915_FORMAT_MOD_4_TILED &&
>>> +            is_compressed(fb)) {
>>> +            drm_warn(&xe->drm, "Cannot create ccs framebuffer with 
>>> other than tile4 mofifier\n");
>>> +            return -EINVAL;
>>> +        }
>>> +        bo->pat_index_scanout = bo->pat_index;
>>> +    }
>>
>> I think this needs to be moved into __xe_pin_fb_vma() after acquiring 
>> the object lock. Also not sure what prevents vm_bind appearing after 
>> we drop the lock? Do we need to prevent modifications until the end of 
>> _xe_unpin_fb_vma()?
> 
> I did now put in __xe_unpin_fb_vma()
> ..
> vma->bo->has_sealed_pat_index = false;
> ..
> 
> as well as moved this above block to correct place.
I'm pretty sure this will fail if the BO is pinned more than once 
simultaneously. Should probably be a refcount protected by bo lock instead.

Is the harm from allowing this only having a garbled display?

If so, we might as well allow it, and avoid complicating the bind code 
even more.

Cheers,
~Maarten
diff mbox series

Patch

diff --git a/drivers/gpu/drm/xe/display/xe_fb_pin.c b/drivers/gpu/drm/xe/display/xe_fb_pin.c
index 722c84a56607..b2930a226f54 100644
--- a/drivers/gpu/drm/xe/display/xe_fb_pin.c
+++ b/drivers/gpu/drm/xe/display/xe_fb_pin.c
@@ -10,9 +10,18 @@ 
 #include "intel_fb_pin.h"
 #include "xe_ggtt.h"
 #include "xe_gt.h"
+#include "xe_pat.h"
 
 #include <drm/ttm/ttm_bo.h>
 
+static bool is_compressed(const struct drm_framebuffer *fb)
+{
+	struct xe_bo *bo = intel_fb_obj(fb);
+	struct xe_device *xe = to_xe_device(to_intel_framebuffer(fb)->base.dev);
+
+	return xe_pat_index_has_compression(xe, bo->pat_index);
+}
+
 static void
 write_dpt_rotated(struct xe_bo *bo, struct iosys_map *map, u32 *dpt_ofs, u32 bo_ofs,
 		  u32 width, u32 height, u32 src_stride, u32 dst_stride)
@@ -349,12 +358,22 @@  void intel_unpin_fb_vma(struct i915_vma *vma, unsigned long flags)
 int intel_plane_pin_fb(struct intel_plane_state *plane_state)
 {
 	struct drm_framebuffer *fb = plane_state->hw.fb;
+	struct xe_device *xe = to_xe_device(to_intel_framebuffer(fb)->base.dev);
 	struct xe_bo *bo = intel_fb_obj(fb);
 	struct i915_vma *vma;
 
 	/* We reject creating !SCANOUT fb's, so this is weird.. */
 	drm_WARN_ON(bo->ttm.base.dev, !(bo->flags & XE_BO_SCANOUT_BIT));
 
+	if (GRAPHICS_VER(xe) >= 20) {
+		if (fb->modifier != I915_FORMAT_MOD_4_TILED &&
+		    is_compressed(fb)) {
+			drm_warn(&xe->drm, "Cannot create ccs framebuffer with other than tile4 mofifier\n");
+			return -EINVAL;
+		}
+		bo->pat_index_scanout = bo->pat_index;
+	}
+
 	vma = __xe_pin_fb_vma(to_intel_framebuffer(fb), &plane_state->view.gtt);
 	if (IS_ERR(vma))
 		return PTR_ERR(vma);