Will try tomorrow.

I'm currently using patch
https://bugs.freedesktop.org/attachment.cgi?id=52762 from
https://bugs.freedesktop.org/show_bug.cgi?id=40221 applied on top of
vanilla 3.1 kernel. It works fine.

Your patch is a bit different in code, so I need to check it. Will check
using Debian 3.1 kernel.

--
Best regards,
Valentyn Pavliuchenko



2011/12/22 Jonathan Nieder <jrnie...@gmail.com>

> found 646376 linux-2.6/3.0.0-3
> tags 646376 + upstream patch moreinfo
> quit
>
> Michel Dänzer wrote:
> > Valentyn Pavliuchenko wrote:
>
> >> I have ATI Cayman (Radeon HD 6790). When working with a PC for for an
> hour I
> >> got corruption of different parts of screen (like windows captions,
> menus,
> >> whole windows, window shadows, etc.). The corruption looks like using
> >> uninitializaed memory instead of textures. After reboot everything is
> ok.
> >
> > See the upstream bug report referenced above. Looks like it's finally
> > about to be fixed.
>
> Thanks, Michel.
>
> Valentyn, could you try this patch and see if helps?  [1] has
> instructions.
>
> [1] http://kernel-handbook.alioth.debian.org/ch-common-tasks.html
>
> From: Jerome Glisse <jgli...@redhat.com>
> Date: Wed, 26 Oct 2011 11:41:22 -0400
> Subject: drm/radeon: flush read cache for gtt with fence on r6xx and newer
> GPU V3
>
> commit 77b1bad423599c9841ea282a82172f039bb2ff92 upstream.
>
> Cayman seems to be particularly sensitive to read cache returning
> old data after bind/unbind to GTT. Flush read cache for GTT range
> with each fences for all new hw. Should fix several rendering glitches.
> Like
>
> V2 flush whole address space
> V3 also flush shader read cache
>
> https://bugs.freedesktop.org/show_bug.cgi?id=40221
> https://bugs.freedesktop.org/show_bug.cgi?id=38022
> https://bugzilla.redhat.com/show_bug.cgi?id=738790
>
> Signed-off-by: Jerome Glisse <jgli...@redhat.com>
> Reviewed-by: Alex Deucher <alexander.deuc...@amd.com>
> Signed-off-by: Dave Airlie <airl...@redhat.com>
> Signed-off-by: Jonathan Nieder <jrnie...@gmail.com>
> ---
>  drivers/gpu/drm/radeon/evergreen_blit_kms.c |    4 ++--
>  drivers/gpu/drm/radeon/r600.c               |   16 ++++++++++++++++
>  drivers/gpu/drm/radeon/r600_blit_kms.c      |    4 ++--
>  3 files changed, 20 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/gpu/drm/radeon/evergreen_blit_kms.c
> b/drivers/gpu/drm/radeon/evergreen_blit_kms.c
> index 2eb251858e72..80ef4401ee9e 100644
> --- a/drivers/gpu/drm/radeon/evergreen_blit_kms.c
> +++ b/drivers/gpu/drm/radeon/evergreen_blit_kms.c
> @@ -779,9 +779,9 @@ int evergreen_blit_prepare_copy(struct radeon_device
> *rdev, int size_bytes)
>        ring_size = num_loops * dwords_per_loop;
>        /* set default  + shaders */
>        ring_size += 55; /* shaders + def state */
> -       ring_size += 10; /* fence emit for VB IB */
> +       ring_size += 16; /* fence emit for VB IB */
>        ring_size += 5; /* done copy */
> -       ring_size += 10; /* fence emit for done copy */
> +       ring_size += 16; /* fence emit for done copy */
>        r = radeon_ring_lock(rdev, ring_size);
>        if (r)
>                return r;
> diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
> index 9b62a97742a7..0991e63191c8 100644
> --- a/drivers/gpu/drm/radeon/r600.c
> +++ b/drivers/gpu/drm/radeon/r600.c
> @@ -2327,6 +2327,14 @@ void r600_fence_ring_emit(struct radeon_device
> *rdev,
>        if (rdev->wb.use_event) {
>                u64 addr = rdev->wb.gpu_addr + R600_WB_EVENT_OFFSET +
>                        (u64)(rdev->fence_drv.scratch_reg -
> rdev->scratch.reg_base);
> +               /* flush read cache over gart */
> +               radeon_ring_write(rdev, PACKET3(PACKET3_SURFACE_SYNC, 3));
> +               radeon_ring_write(rdev, PACKET3_TC_ACTION_ENA |
> +                                       PACKET3_VC_ACTION_ENA |
> +                                       PACKET3_SH_ACTION_ENA);
> +               radeon_ring_write(rdev, 0xFFFFFFFF);
> +               radeon_ring_write(rdev, 0);
> +               radeon_ring_write(rdev, 10); /* poll interval */
>                /* EVENT_WRITE_EOP - flush caches, send int */
>                radeon_ring_write(rdev, PACKET3(PACKET3_EVENT_WRITE_EOP,
> 4));
>                radeon_ring_write(rdev,
> EVENT_TYPE(CACHE_FLUSH_AND_INV_EVENT_TS) | EVENT_INDEX(5));
> @@ -2335,6 +2343,14 @@ void r600_fence_ring_emit(struct radeon_device
> *rdev,
>                radeon_ring_write(rdev, fence->seq);
>                radeon_ring_write(rdev, 0);
>        } else {
> +               /* flush read cache over gart */
> +               radeon_ring_write(rdev, PACKET3(PACKET3_SURFACE_SYNC, 3));
> +               radeon_ring_write(rdev, PACKET3_TC_ACTION_ENA |
> +                                       PACKET3_VC_ACTION_ENA |
> +                                       PACKET3_SH_ACTION_ENA);
> +               radeon_ring_write(rdev, 0xFFFFFFFF);
> +               radeon_ring_write(rdev, 0);
> +               radeon_ring_write(rdev, 10); /* poll interval */
>                radeon_ring_write(rdev, PACKET3(PACKET3_EVENT_WRITE, 0));
>                radeon_ring_write(rdev,
> EVENT_TYPE(CACHE_FLUSH_AND_INV_EVENT) | EVENT_INDEX(0));
>                /* wait for 3D idle clean */
> diff --git a/drivers/gpu/drm/radeon/r600_blit_kms.c
> b/drivers/gpu/drm/radeon/r600_blit_kms.c
> index 9aa74c3f8cb6..d198b89cd403 100644
> --- a/drivers/gpu/drm/radeon/r600_blit_kms.c
> +++ b/drivers/gpu/drm/radeon/r600_blit_kms.c
> @@ -632,9 +632,9 @@ int r600_blit_prepare_copy(struct radeon_device *rdev,
> int size_bytes)
>        ring_size = num_loops * dwords_per_loop;
>        /* set default  + shaders */
>        ring_size += 40; /* shaders + def state */
> -       ring_size += 10; /* fence emit for VB IB */
> +       ring_size += 16; /* fence emit for VB IB */
>        ring_size += 5; /* done copy */
> -       ring_size += 10; /* fence emit for done copy */
> +       ring_size += 16; /* fence emit for done copy */
>        r = radeon_ring_lock(rdev, ring_size);
>        if (r)
>                return r;
> --
> 1.7.8
>
>

Reply via email to