[PATCH] [RFC] drm/radeon: clear WC flag when moving bo from vram to gtt

Julien Isorce julien.isorce at gmail.com
Mon Apr 24 10:01:09 UTC 2017


On 24 April 2017 at 10:51, Christian König <deathsimple at vodafone.de> wrote:

> Am 24.04.2017 um 11:42 schrieb Julien Isorce:
>
>> But re-add the flag is the bo is moved back to vram.
>>
>> This fixes "ring 0/3 stalled" issue which happens when the driver
>> evicts bo from vram to gtt, at least on TAHITI and CAPVERDE.
>>
>
> Interesting find, but NAK on the approach for fixing it.
>

Thx for the comments.


>
> If WC mappings don't work for TAHITI and CAPVERDE we need to figure out
> why or at least disable them for those hardware generations in general.
>

Should I extend
https://cgit.freedesktop.org/~agd5f/linux/tree/drivers/gpu/drm/radeon/radeon_object.c?h=amd-staging-4.9#n228
to BONAIRE (which will include VERDE and TAHITI) ? (to match
https://cgit.freedesktop.org/~agd5f/linux/tree/drivers/gpu/drm/radeon/radeon_ib.c?h=amd-staging-4.9#n199
 )

>
> Disabling WC for BOs swapped out from VRAM won't buy us much if the BO was
> initially created in GTT anyway.


Initially created in VRAM:
https://cgit.freedesktop.org/mesa/mesa/tree/src/gallium/drivers/radeon/r600_buffer_common.c#n164


>
>
> Christian.
>
>
>
>> I do not know the exact reason among the following:
>>    - si_copy_dma from vram to gtt is slow if WC
>>         (only for the non-visible part ? specific cases ?)
>>    - Allow snooping (SNOOPED flag from radeon_vm_bo_update).
>>    - WC should not be set at all for bo in the GTT
>>          (same reason why WC is only set for vram domain,
>>           see mesa::r600_init_resource_fields since mesa commit 5b6a0b7
>>               "gallium/radeon: set GTT WC on tiled textures")
>>    - Bug in WC
>>    - Same reason as why radeon_sa_bo_manager_init is not passing
>>      WC flags if older than CHIP_BONAIRE (see 810b73d1
>>          drm/radeon: Use write-combined CPU mappings of IBs on >= CIK)
>>    - Same as b738ca5d
>>          Revert "drm/radeon: Use write-combined CPU mappings of ring ..."
>>    - Same as 96ea47c0
>>          drm/radeon: Disable uncacheable CPU mappings of GTT with RV6xx
>>          see https://bugs.freedesktop.org/show_bug.cgi?id=91268#c2
>>
>> https://bugs.freedesktop.org/show_bug.cgi?id=100712
>> ---
>>   drivers/gpu/drm/radeon/radeon.h        |  1 +
>>   drivers/gpu/drm/radeon/radeon_object.c |  1 +
>>   drivers/gpu/drm/radeon/radeon_ttm.c    | 13 +++++++++++++
>>   3 files changed, 15 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/radeon/radeon.h
>> b/drivers/gpu/drm/radeon/radeon.h
>> index 7a39a35..9847f4e 100644
>> --- a/drivers/gpu/drm/radeon/radeon.h
>> +++ b/drivers/gpu/drm/radeon/radeon.h
>> @@ -518,6 +518,7 @@ struct radeon_bo {
>>         struct radeon_mn                *mn;
>>         struct list_head                mn_list;
>> +       u32                             vram_flags;
>>   };
>>   #define gem_to_radeon_bo(gobj) container_of((gobj), struct radeon_bo,
>> gem_base)
>>   diff --git a/drivers/gpu/drm/radeon/radeon_object.c
>> b/drivers/gpu/drm/radeon/radeon_object.c
>> index a557869..870f6b0 100644
>> --- a/drivers/gpu/drm/radeon/radeon_object.c
>> +++ b/drivers/gpu/drm/radeon/radeon_object.c
>> @@ -228,6 +228,7 @@ int radeon_bo_create(struct radeon_device *rdev,
>>                                        RADEON_GEM_DOMAIN_CPU);
>>         bo->flags = flags;
>> +       bo->vram_flags = 0;
>>         /* PCI GART is always snooped */
>>         if (!(rdev->flags & RADEON_IS_PCIE))
>>                 bo->flags &= ~(RADEON_GEM_GTT_WC | RADEON_GEM_GTT_UC);
>> diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c
>> b/drivers/gpu/drm/radeon/radeon_ttm.c
>> index d07ff84..a8743bd 100644
>> --- a/drivers/gpu/drm/radeon/radeon_ttm.c
>> +++ b/drivers/gpu/drm/radeon/radeon_ttm.c
>> @@ -440,6 +440,19 @@ static int radeon_bo_move(struct ttm_buffer_object
>> *bo,
>>                 r = radeon_move_ram_vram(bo, evict, interruptible,
>>                                             no_wait_gpu, new_mem);
>>         } else {
>> +               /* Clear WC flag when moving bo from vram to gtt. */
>> +               if (old_mem->mem_type == TTM_PL_VRAM && new_mem->mem_type
>> == TTM_PL_TT) {
>> +                       if (rbo->flags & RADEON_GEM_GTT_WC) {
>> +                               rbo->vram_flags |= RADEON_GEM_GTT_WC;
>> +                               rbo->flags &= ~RADEON_GEM_GTT_WC;
>> +                       }
>> +               /* Re-add WC flag when moving back from gtt to vram. */
>> +               } else if (old_mem->mem_type == TTM_PL_TT &&
>> new_mem->mem_type == TTM_PL_VRAM) {
>> +                       if (rbo->vram_flags & RADEON_GEM_GTT_WC) {
>> +                               rbo->flags |= RADEON_GEM_GTT_WC;
>> +                               rbo->vram_flags &= ~RADEON_GEM_GTT_WC;
>> +                       }
>> +               }
>>                 r = radeon_move_blit(bo, evict, no_wait_gpu, new_mem,
>> old_mem);
>>         }
>>
>>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/dri-devel/attachments/20170424/b3aa5ed3/attachment-0001.html>


More information about the dri-devel mailing list