Received: by 2002:a05:6a10:c604:0:0:0:0 with SMTP id y4csp265541pxt; Wed, 4 Aug 2021 22:16:56 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx7+hihkSnlKv9C1AWLoJhtAq1kxptONYoXMSLaCRs514h9OkEUfY8PAkqqEtIKlkl5sPmF X-Received: by 2002:a05:6638:130d:: with SMTP id r13mr2882005jad.103.1628140616605; Wed, 04 Aug 2021 22:16:56 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1628140616; cv=none; d=google.com; s=arc-20160816; b=UbaoIWsNb7b8TRCfO0qt35qQW9xZCjNi4Hva+oGiCcvzcL6ySi9/7O2OEefm5lQdkd n9G47JktPNn6t4Y86uuXJxdrisZwoYPv6BpQLfgXbrOtn/HGkfEEgc7f6XcM68Tioklj CnpUT5EDioKNGtNaNBUuG0MMBUi5Nhue0kzlw1iuo/E6g8LqlkOovO+Y+eoPQo5QvNBc 8zpf2H+J8lm01QaFHLFsUqTi97xqkUaBYxJbwGm8ziVuNHn2FTSrFvFevm5MNKLZnSMR zKJEcTlgSTdh3y+hBqCdkntcipWQ+9mS3Fzd0mwXTwXc8l3mXsSAFrZTTsw8XY4ByZKG +1CA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:cc:to:subject :message-id:date:from:in-reply-to:references:mime-version :dkim-signature; bh=Mx4Kord6zTXQ2AHtUR9gYl7dYZ7Wm3q9Z8baSsaWGGk=; b=vVwE3key2WKS7QKvxjEobpO6TZ4ufOE31uIUh1rTna6naC5nDMHa1ph8c2dcXQ+/7Q wMv8NC5gWRbpYEIROKDByMLfGBiMZHzS4vM0QYJzzDIaApMAxrJrlauNYg073IKthkJJ vLXjPiR9hwOHYaBE3R+ruzT6JUvni/pTSLmZLB1t1TlBbTYulF8DNCdH/lyfMjSvxpXR OczVsL/HTSelrFt9p7Knndt0uat1KYoQP2c096Hx+PsCKf7loszf2ae7/beOGECY1BR+ emk0uVBsZDwP2VzfexqvFOGGio60nvuMZAeBUP2LodWAoScZBaiavNMjixm0MsCEAzM2 ElKA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=tx3oPsKC; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id f7si4712192ioj.68.2021.08.04.22.16.45; Wed, 04 Aug 2021 22:16:56 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=tx3oPsKC; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235083AbhHEEYq (ORCPT + 99 others); Thu, 5 Aug 2021 00:24:46 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45338 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236225AbhHEEYo (ORCPT ); Thu, 5 Aug 2021 00:24:44 -0400 Received: from mail-oi1-x231.google.com (mail-oi1-x231.google.com [IPv6:2607:f8b0:4864:20::231]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 34DC1C0613C1 for ; Wed, 4 Aug 2021 21:24:30 -0700 (PDT) Received: by mail-oi1-x231.google.com with SMTP id u10so5767836oiw.4 for ; Wed, 04 Aug 2021 21:24:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=Mx4Kord6zTXQ2AHtUR9gYl7dYZ7Wm3q9Z8baSsaWGGk=; b=tx3oPsKCPCGoYBND6Nhy63gACxEMsk32s07E9h3lw+/pYBIuBPplIfUFkXFlI4au6p gP1u2FR7KqdUcBmv9n1wNQWri5wwnDAJqHNj4FI+J5BNooAHLc06cHGN+OD/+xGSsjWz lycXhkXl5KW81Y9GUzTlscc2Ru5j8SN0tLRHRn6xcQkZEOxlwNrA10mL0dZaZw3OuKJV +ePLlKaXbPXTVpoiUvNXZy/1z8VE1ofpExczaMVlzzyvDM1BL3yE0ohmlErmAiA6vgP9 G1gQlEgbMcPuzOlP4EmuJCxpn/XhkhSop1px/nFqDO8C5vO3sh/DG06qBXfKLy19AOTa +PqA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=Mx4Kord6zTXQ2AHtUR9gYl7dYZ7Wm3q9Z8baSsaWGGk=; b=uDmBo3jKQzTU+qTBxGgpTGDCyM53TvZBiaoo2aLHVDgwcWtQ7f1Pr0tx43/EyJig9w gBByfrAcFRghHiuODv/UrhYosug5wc7HuO5MBFhfxcKwuc16sweZsUWtA2saAjFCRJDc jntGQd5ispil8kErjM8KIXpwfN3l48PXoJ2l5xCqFfZ4XesDScapQa0UxjvF0AfZ9al9 guLGJTJgab9qHsSspAE/lILAokQTEd8xRN/8oF38nAuL4hJrvNuNTw+gJfxLxRiZ3GE7 mgVB8ex1IofT41Xf283cWlxmylcqoydXXrnvHk3d98NupVmEnL7i0RbS1355i8alKLFE M70Q== X-Gm-Message-State: AOAM533Zvl/CYYAC0fu2BSoUf//lDEAb/86aEKp4NqgyMwjFpIqZJStU 54hDzuUj12B8f5zLbwErxvwSkNp86mds0/Ko7Dk= X-Received: by 2002:a05:6808:6d2:: with SMTP id m18mr2034781oih.120.1628137469637; Wed, 04 Aug 2021 21:24:29 -0700 (PDT) MIME-Version: 1.0 References: <20210804023842.1996299-1-lizhenneng@kylinos.cn> In-Reply-To: <20210804023842.1996299-1-lizhenneng@kylinos.cn> From: Alex Deucher Date: Thu, 5 Aug 2021 00:24:18 -0400 Message-ID: Subject: Re: [PATCH v2] drm/radeon: Update pitch for page flip To: Zhenneng Li Cc: Alex Deucher , =?UTF-8?Q?Christian_K=C3=B6nig?= , "Pan, Xinhui" , David Airlie , Daniel Vetter , amd-gfx list , Maling list - DRI developers , LKML Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Aug 3, 2021 at 10:39 PM Zhenneng Li wrote: > > > 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. > > v1->v2: > Update all of the pitch in all of the page_flip functions > in radeon rather than just the evergreen one. > > Cc: Alex Deucher > Cc: "Christian K=C3=B6nig" > Cc: "Pan, Xinhui" > Cc: David Airlie > Cc: Daniel Vetter > Cc: amd-gfx@lists.freedesktop.org > Cc: dri-devel@lists.freedesktop.org > Cc: linux-kernel@vger.kernel.org > Signed-off-by: Zhenneng Li > --- > drivers/gpu/drm/radeon/evergreen.c | 8 +++++++- > drivers/gpu/drm/radeon/r100.c | 5 +++++ > drivers/gpu/drm/radeon/rs600.c | 8 +++++++- > drivers/gpu/drm/radeon/rv770.c | 8 +++++++- > 4 files changed, 26 insertions(+), 3 deletions(-) > > 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 > #include > +#include > > #include "atom.h" > #include "avivod.h" > @@ -1414,10 +1415,15 @@ void evergreen_page_flip(struct radeon_device *rd= ev, int crtc_id, u64 crtc_base, > bool async) > { > struct radeon_crtc *radeon_crtc =3D rdev->mode_info.crtcs[crtc_id= ]; > + struct drm_framebuffer *fb =3D 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, > diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.= c > index ba724198b72e..1268854552ff 100644 > --- a/drivers/gpu/drm/radeon/r100.c > +++ b/drivers/gpu/drm/radeon/r100.c > @@ -162,6 +162,7 @@ void r100_wait_for_vblank(struct radeon_device *rdev,= int crtc) > void r100_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_ba= se, bool async) > { > struct radeon_crtc *radeon_crtc =3D rdev->mode_info.crtcs[crtc_id= ]; > + struct drm_framebuffer *fb =3D radeon_crtc->base.primary->fb; > u32 tmp =3D ((u32)crtc_base) | RADEON_CRTC_OFFSET__OFFSET_LOCK; > int i; > > @@ -169,6 +170,10 @@ void r100_page_flip(struct radeon_device *rdev, int = crtc_id, u64 crtc_base, bool > /* update the scanout addresses */ > WREG32(RADEON_CRTC_OFFSET + radeon_crtc->crtc_offset, tmp); > > + /* update pitch */ > + WREG32(RADEON_CRTC_PITCH + radeon_crtc->crtc_offset, > + fb->pitches[0] / fb->format->cpp[0]); > + This needs the follow formatting (from radeon_legacy_crtc.c): pitch_pixels =3D fb->pitches[0] / fb->format->cpp[0]; crtc_pitch =3D DIV_ROUND_UP(pitch_pixels * fb->format->cpp[0] * 8, fb->format->cpp[0] * 8 * 8); crtc_pitch |=3D crtc_pitch << 16; WREG32(RADEON_CRTC_PITCH + radeon_crtc->crtc_offset, crtc_pitch); With that fixed, Reviewed-by: Alex Deucher > /* Wait for update_pending to go high. */ > for (i =3D 0; i < rdev->usec_timeout; i++) { > if (RREG32(RADEON_CRTC_OFFSET + radeon_crtc->crtc_offset)= & RADEON_CRTC_OFFSET__GUI_TRIG_OFFSET) > diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs60= 0.c > index b2d22e25eee1..b87dd551e939 100644 > --- a/drivers/gpu/drm/radeon/rs600.c > +++ b/drivers/gpu/drm/radeon/rs600.c > @@ -41,6 +41,7 @@ > > #include > #include > +#include > > #include "atom.h" > #include "radeon.h" > @@ -118,6 +119,7 @@ void avivo_wait_for_vblank(struct radeon_device *rdev= , int crtc) > void rs600_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_b= ase, bool async) > { > struct radeon_crtc *radeon_crtc =3D rdev->mode_info.crtcs[crtc_id= ]; > + struct drm_framebuffer *fb =3D radeon_crtc->base.primary->fb; > u32 tmp =3D RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset= ); > int i; > > @@ -125,9 +127,13 @@ void rs600_page_flip(struct radeon_device *rdev, int= crtc_id, u64 crtc_base, boo > tmp |=3D AVIVO_D1GRPH_UPDATE_LOCK; > WREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset, tmp); > > - /* update the scanout addresses */ > + /* flip at hsync for async, default is vsync */ > WREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset, > async ? AVIVO_D1GRPH_SURFACE_UPDATE_H_RETRACE_EN : 0); > + /* update pitch */ > + WREG32(AVIVO_D1GRPH_PITCH + radeon_crtc->crtc_offset, > + fb->pitches[0] / fb->format->cpp[0]); > + /* update the scanout addresses */ > WREG32(AVIVO_D1GRPH_SECONDARY_SURFACE_ADDRESS + radeon_crtc->crtc= _offset, > (u32)crtc_base); > WREG32(AVIVO_D1GRPH_PRIMARY_SURFACE_ADDRESS + radeon_crtc->crtc_o= ffset, > diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv77= 0.c > index 74499307285b..e592e57be1bb 100644 > --- a/drivers/gpu/drm/radeon/rv770.c > +++ b/drivers/gpu/drm/radeon/rv770.c > @@ -32,6 +32,7 @@ > > #include > #include > +#include > > #include "atom.h" > #include "avivod.h" > @@ -809,6 +810,7 @@ u32 rv770_get_xclk(struct radeon_device *rdev) > void rv770_page_flip(struct radeon_device *rdev, int crtc_id, u64 crtc_b= ase, bool async) > { > struct radeon_crtc *radeon_crtc =3D rdev->mode_info.crtcs[crtc_id= ]; > + struct drm_framebuffer *fb =3D radeon_crtc->base.primary->fb; > u32 tmp =3D RREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset= ); > int i; > > @@ -816,9 +818,13 @@ void rv770_page_flip(struct radeon_device *rdev, int= crtc_id, u64 crtc_base, boo > tmp |=3D AVIVO_D1GRPH_UPDATE_LOCK; > WREG32(AVIVO_D1GRPH_UPDATE + radeon_crtc->crtc_offset, tmp); > > - /* update the scanout addresses */ > + /* flip at hsync for async, default is vsync */ > WREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset, > async ? AVIVO_D1GRPH_SURFACE_UPDATE_H_RETRACE_EN : 0); > + /* update pitch */ > + WREG32(AVIVO_D1GRPH_PITCH + radeon_crtc->crtc_offset, > + fb->pitches[0] / fb->format->cpp[0]); > + /* update the scanout addresses */ > if (radeon_crtc->crtc_id) { > WREG32(D2GRPH_SECONDARY_SURFACE_ADDRESS_HIGH, upper_32_bi= ts(crtc_base)); > WREG32(D2GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, upper_32_bits= (crtc_base)); > -- > 2.25.1 > > Content-type: Text/plain > > No virus found > Checked by Hillstone Network AntiVirus