[PATCH] drm/radeon: Update pitch for page flip

李真能 lizhenneng at kylinos.cn
Tue Aug 3 08:00:42 UTC 2021


在 2021/8/2 下午10:51, Alex Deucher 写道:
> On Mon, Aug 2, 2021 at 4:31 AM Daniel Vetter <daniel at ffwll.ch> wrote:
>> On Mon, Aug 02, 2021 at 10:12:47AM +0200, Christian König wrote:
>>> Am 02.08.21 um 09:43 schrieb Zhenneng Li:
>>>> When primary bo is updated, crtc's pitch may
>>>> have not been updated, this will lead to show
>>>> disorder content when user changes display mode,
>>>> we update crtc's pitch in page flip to avoid
>>>> this bug.
>>>> This refers to amdgpu's pageflip.
>>> Alex is the expert to ask about that code, but I'm not sure if that is
>>> really correct for the old hardware.
>>>
>>> As far as I know the crtc's pitch should not change during a page flip, but
>>> only during a full mode set.
>>>
>>> So could you elaborate a bit more how you trigger this?
>> legacy page_flip ioctl only verifies that the fb->format stays the same.
>> It doesn't check anything else (afair never has), this is all up to
>> drivers to verify.
>>
>> Personally I'd say add a check to reject this, since testing this and
>> making sure it really works everywhere is probably a bit much on this old
>> hw.
> If just the pitch changed, that probably wouldn't be much of a
> problem, but if the pitch is changing, that probably implies other
> stuff has changed as well and we'll just be chasing changes.  I agree
> it would be best to just reject anything other than updating the
> scanout address.
Thanks for your reply!

  In theory , pitch is updated only when the scanout address is 
updated,  but we can trigger this bug on r5230 when using two screens 
and changing modeset,  you can execute shell:


#!/bin/bash

cnt=0;
while [ 1 ]
do
xrandr --output HDMI-0 --right-of VGA-0 --auto
echo "hdmi----vga"
sleep  8
xrandr --output VGA-0 --auto --output HDMI-0 --off
sleep 3
let cnt+=1;
echo $cnt
done

at the same time, open a new terminal, press F11 to fast switch this 
window between maximize size and normal size to improve the 
possibility,attachement picture shows the phenomenon.

I add some debug messages:

[   89.065206] lzn debug, 
drivers/gpu/drm/drm_crtc_helper.c:drm_crtc_helper_set_config:589, 
set->crtc->primary->fb: 0xffffffa0e5956100, set->fb: 0xffffffa0e701e400
[   89.065209] lzn debug, 
drivers/gpu/drm/drm_crtc_helper.c:drm_crtc_helper_set_config:601
[   89.065213] lzn debug, 
drivers/gpu/drm/drm_crtc_helper.c:drm_crtc_helper_set_config:713, 
fb_changed: 1, mode_changed: 0
[   89.065216] lzn debug, 
drivers/gpu/drm/radeon/atombios_crtc.c:dce4_crtc_do_set_base:1148, x: 0: 
y: 0, crtc: 0xffffffa0e62dc000, atomic: 0
[   89.065222] lzn debug, 
drivers/gpu/drm/radeon/atombios_crtc.c:dce4_crtc_do_set_base:1426, 
fb_location: 0x117f2000, target_fb->width: 1920, target_fb->height: 1080
[   89.065223] lzn debug, 
drivers/gpu/drm/radeon/atombios_crtc.c:dce4_crtc_do_set_base:1430, 
fb_pitch_pixels: 1920, target_fb->pitches[0]: 7680, 
target_fb->format->cpp[0]: 4
[   89.065240] lzn debug, 
drivers/gpu/drm/drm_crtc_helper.c:drm_crtc_helper_set_config:752*****************************************************************
[   92.079288] lzn debug, 
drivers/gpu/drm/drm_crtc_helper.c:drm_crtc_helper_set_config:589, 
set->crtc->primary->fb: 0xffffffa0e701e400, set->fb: 0xffffffa0eafced00
[   92.079291] lzn debug, 
drivers/gpu/drm/drm_crtc_helper.c:drm_crtc_helper_set_config:601
[   92.079295] lzn debug, 
drivers/gpu/drm/drm_crtc_helper.c:drm_crtc_helper_set_config:713, 
fb_changed: 1, mode_changed: 0
[   92.079298] lzn debug, 
drivers/gpu/drm/radeon/atombios_crtc.c:dce4_crtc_do_set_base:1148, x: 0: 
y: 0, crtc: 0xffffffa0e62dc000, atomic: 0
[   92.079304] lzn debug, 
drivers/gpu/drm/radeon/atombios_crtc.c:dce4_crtc_do_set_base:1426, 
fb_location: 0x10000000, target_fb->width: 3840, target_fb->height: 1080
[   92.079306] lzn debug, 
drivers/gpu/drm/radeon/atombios_crtc.c:dce4_crtc_do_set_base:1430, 
fb_pitch_pixels: 3840, target_fb->pitches[0]: 15360, 
target_fb->format->cpp[0]: 4
[   92.079323] lzn debug, 
drivers/gpu/drm/drm_crtc_helper.c:drm_crtc_helper_set_config:752*****************************************************************
[   92.080382] lzn debug, 
drivers/gpu/drm/drm_crtc_helper.c:drm_crtc_helper_set_config:589, 
set->crtc->primary->fb: 0x0, set->fb: 0xffffffa0eafced00
[   92.080384] lzn debug, 
drivers/gpu/drm/drm_crtc_helper.c:drm_crtc_helper_set_config:595
[   92.080387] lzn debug, 
drivers/gpu/drm/drm_crtc_helper.c:drm_crtc_helper_set_config:713, 
fb_changed: 0, mode_changed: 1
[   92.080389] lzn debug, 
drivers/gpu/drm/drm_crtc_helper.c:drm_crtc_helper_set_config:715
[   92.083143] lzn debug, 
drivers/gpu/drm/radeon/atombios_crtc.c:dce4_crtc_do_set_base:1148, x: 
1920: y: 0, crtc: 0xffffffa0e62db000, atomic: 0
[   92.083149] lzn debug, 
drivers/gpu/drm/radeon/atombios_crtc.c:dce4_crtc_do_set_base:1426, 
fb_location: 0x10000000, target_fb->width: 3840, target_fb->height: 1080
[   92.083164] lzn debug, 
drivers/gpu/drm/radeon/atombios_crtc.c:dce4_crtc_do_set_base:1430, 
fb_pitch_pixels: 3840, target_fb->pitches[0]: 15360, 
target_fb->format->cpp[0]: 4
[   92.120595] lzn debug, 
drivers/gpu/drm/drm_crtc_helper.c:drm_crtc_helper_set_config:752*****************************************************************
[  100.157744] lzn debug, 
drivers/gpu/drm/drm_crtc_helper.c:drm_crtc_helper_set_config:589, 
set->crtc->primary->fb: 0xffffffa0eafced00, set->fb: 0xffffffa0f3a5bb00
[  100.157746] lzn debug, 
drivers/gpu/drm/drm_crtc_helper.c:drm_crtc_helper_set_config:601
[  100.157749] lzn debug, 
drivers/gpu/drm/drm_crtc_helper.c:drm_crtc_helper_set_config:713, 
fb_changed: 1, mode_changed: 0
[  100.157752] lzn debug, 
drivers/gpu/drm/radeon/atombios_crtc.c:dce4_crtc_do_set_base:1148, x: 0: 
y: 0, crtc: 0xffffffa0e62dc000, atomic: 0
[  100.157758] lzn debug, 
drivers/gpu/drm/radeon/atombios_crtc.c:dce4_crtc_do_set_base:1426, 
fb_location: 0x1790c000, target_fb->width: 1920, target_fb->height: 1080
[  100.157760] lzn debug, 
drivers/gpu/drm/radeon/atombios_crtc.c:dce4_crtc_do_set_base:1430, 
fb_pitch_pixels: 1920, target_fb->pitches[0]: 7680, 
target_fb->format->cpp[0]: 4
[  100.157777] lzn debug, 
drivers/gpu/drm/drm_crtc_helper.c:drm_crtc_helper_set_config:752*****************************************************************
[  103.166751] lzn debug, 
drivers/gpu/drm/drm_crtc_helper.c:drm_crtc_helper_set_config:589, 
set->crtc->primary->fb: 0xffffffa0e9a0cd00, set->fb: 0xffffffa0e9a0cd00
[  103.166757] lzn debug, 
drivers/gpu/drm/drm_crtc_helper.c:drm_crtc_helper_set_config:713, 
fb_changed: 0, mode_changed: 0
[  103.166758] lzn debug, 
drivers/gpu/drm/drm_crtc_helper.c:drm_crtc_helper_set_config:752*****************************************************************
[  103.169353] lzn debug, 
drivers/gpu/drm/drm_crtc_helper.c:drm_crtc_helper_set_config:589, 
set->crtc->primary->fb: 0x0, set->fb: 0xffffffa0e9a0cd00
[  103.169355] lzn debug, 
drivers/gpu/drm/drm_crtc_helper.c:drm_crtc_helper_set_config:595
[  103.169359] lzn debug, 
drivers/gpu/drm/drm_crtc_helper.c:drm_crtc_helper_set_config:713, 
fb_changed: 0, mode_changed: 1
[  103.169360] lzn debug, 
drivers/gpu/drm/drm_crtc_helper.c:drm_crtc_helper_set_config:715
[  103.170396] lzn debug, 
drivers/gpu/drm/radeon/atombios_crtc.c:dce4_crtc_do_set_base:1148, x: 
1920: y: 0, crtc: 0xffffffa0e62db000, atomic: 0
[  103.170403] lzn debug, 
drivers/gpu/drm/radeon/atombios_crtc.c:dce4_crtc_do_set_base:1426, 
fb_location: 0x11fea000, target_fb->width: 3840, target_fb->height: 1080
[  103.170404] lzn debug, 
drivers/gpu/drm/radeon/atombios_crtc.c:dce4_crtc_do_set_base:1430, 
fb_pitch_pixels: 3840, target_fb->pitches[0]: 15360, 
target_fb->format->cpp[0]: 4
[  103.224592] lzn debug, 
drivers/gpu/drm/drm_crtc_helper.c:drm_crtc_helper_set_config:752*****************************************************************

After 103s of os started,  bug is triggerd, fb_changed and mode_changed 
are zero, and crtc's pitch has not been updated.

Amdgpu has the same problem,  but amdgpu's page_flip will update pitch, 
so this bug can't trigger on amdgpu.

you can refer to dce_v6_0_page_flip in amdgpu,all amdgpu drivers update 
pitch in page_flip.

test os: focal-desktop-arm64.iso

Zhenneng Li
>
> Alex
>
>> -Daniel
>>
>>> Thanks,
>>> Christian.
>>>
>>>> Cc: Alex Deucher <alexander.deucher at amd.com>
>>>> Cc: "Christian König" <christian.koenig at amd.com>
>>>> Cc: "Pan, Xinhui" <Xinhui.Pan at amd.com>
>>>> Cc: David Airlie <airlied at linux.ie>
>>>> Cc: Daniel Vetter <daniel at ffwll.ch>
>>>> Cc: amd-gfx at lists.freedesktop.org
>>>> Cc: dri-devel at lists.freedesktop.org
>>>> Cc: linux-kernel at vger.kernel.org
>>>> Signed-off-by: Zhenneng Li <lizhenneng at kylinos.cn>
>>>> ---
>>>>    drivers/gpu/drm/radeon/evergreen.c | 8 +++++++-
>>>>    1 file changed, 7 insertions(+), 1 deletion(-)
>>>>
>>>> diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c
>>>> index 36a888e1b179..eeb590d2dec2 100644
>>>> --- a/drivers/gpu/drm/radeon/evergreen.c
>>>> +++ b/drivers/gpu/drm/radeon/evergreen.c
>>>> @@ -28,6 +28,7 @@
>>>>    #include <drm/drm_vblank.h>
>>>>    #include <drm/radeon_drm.h>
>>>> +#include <drm/drm_fourcc.h>
>>>>    #include "atom.h"
>>>>    #include "avivod.h"
>>>> @@ -1414,10 +1415,15 @@ void evergreen_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_base,
>>>>                       bool async)
>>>>    {
>>>>      struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
>>>> +   struct drm_framebuffer *fb = radeon_crtc->base.primary->fb;
>>>> -   /* update the scanout addresses */
>>>> +   /* flip at hsync for async, default is vsync */
>>>>      WREG32(EVERGREEN_GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset,
>>>>             async ? EVERGREEN_GRPH_SURFACE_UPDATE_H_RETRACE_EN : 0);
>>>> +   /* update pitch */
>>>> +   WREG32(EVERGREEN_GRPH_PITCH + radeon_crtc->crtc_offset,
>>>> +          fb->pitches[0] / fb->format->cpp[0]);
>>>> +   /* update the scanout addresses */
>>>>      WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + radeon_crtc->crtc_offset,
>>>>             upper_32_bits(crtc_base));
>>>>      WREG32(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset,
>>>>
>>>> No virus found
>>>>              Checked by Hillstone Network AntiVirus
>> --
>> Daniel Vetter
>> Software Engineer, Intel Corporation
>> http://blog.ffwll.ch
-------------- next part --------------
A non-text attachment was scrubbed...
Name: r5230.jpg
Type: image/jpeg
Size: 2956751 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/dri-devel/attachments/20210803/1149149f/attachment-0001.jpg>


More information about the dri-devel mailing list