[Mesa-dev] [Mesa-stable] [PATCH v4] winsys/radeon: fix nop packet padding for hawaii

Emil Velikov emil.l.velikov at gmail.com
Tue Aug 26 13:09:04 PDT 2014


On 06/08/14 17:16, Alex Deucher wrote:
> On Mon, Aug 4, 2014 at 6:48 AM, Andreas Boll <andreas.boll.dev at gmail.com> wrote:
>> The initial firmware for hawaii does not support type3 nop packet.
>> Detect the new hawaii firmware with query RADEON_INFO_ACCEL_WORKING2.
>> If the returned value is 3, then the new firmware is used.
>>
>> This patch uses type2 for the old firmware and type3 for the new firmware.
>>
>> It fixes the cases when the old firmware is used and the user wants to
>> manually enable acceleration.
>> The two possible scenarios are:
>>  - the kernel has no support for the new firmware.
>>  - the kernel has support for the new firmware but only the old firmware
>>    is available.
>>
>> Additionaly this patch disables GPU acceleration on hawaii if the kernel
>> returns a value < 2. In this case the kernel hasn't the required fixes
>> for proper acceleration.
>>
>> v2:
>>  - Fix indentation
>>  - Use private struct radeon_drm_winsys instead of public struct radeon_info
>>  - Rename r600_accel_working2 to accel_working2
>>
>> v3:
>>  - Use type2 nop packet for returned value < 3
>>
>> v4:
>>  - Fail to initialize winsys for returned value < 2
>>
>> Cc: mesa-stable at lists.freedesktop.org
>> Cc: Alex Deucher <alexander.deucher at amd.com>
>> Cc: Jérôme Glisse <jglisse at redhat.com>
>> Cc: Marek Olšák <marek.olsak at amd.com>
>> Cc: Michel Dänzer <michel.daenzer at amd.com>
>> Signed-off-by: Andreas Boll <andreas.boll.dev at gmail.com>
> 
> Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
> 
Gents this patch does not apply cleanly on the 10.2 branch. Would be nice if
someone can backport rather than me butchering it.

Thanks
Emil

>> ---
>>
>> Unfortunately I can't test this patch myself since I don't own a hawaii card.
>> So I'd need someone to test this patch on kernel >= 3.16-rc7 + these patches
>> [1-2].
>>
>> This patch would bring us one step further for hawaii acceleration on kernel
>> 3.16.
>>
>> Finally we can enable hawaii acceleration if the query returns > 2 [3].
>>
>> Andreas.
>>
>> [1] http://lists.freedesktop.org/archives/dri-devel/2014-August/065305.html
>> [2] http://lists.freedesktop.org/archives/dri-devel/2014-August/065306.html
>> [3] http://lists.x.org/archives/xorg-driver-ati/2014-August/026534.html
>>
>>  src/gallium/winsys/radeon/drm/radeon_drm_cs.c     |  6 +++++-
>>  src/gallium/winsys/radeon/drm/radeon_drm_winsys.c | 10 ++++++++++
>>  src/gallium/winsys/radeon/drm/radeon_drm_winsys.h |  1 +
>>  3 files changed, 16 insertions(+), 1 deletion(-)
>>
>> diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_cs.c b/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
>> index a06ecb2..dd109af 100644
>> --- a/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
>> +++ b/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
>> @@ -446,8 +446,12 @@ static void radeon_drm_cs_flush(struct radeon_winsys_cs *rcs,
>>      case RING_GFX:
>>          /* pad DMA ring to 8 DWs to meet CP fetch alignment requirements
>>           * r6xx, requires at least 4 dw alignment to avoid a hw bug.
>> +         * hawaii with old firmware needs type2 nop packet.
>> +         * accel_working2 with value 2 indicates the new firmware.
>>           */
>> -        if (cs->ws->info.chip_class <= SI) {
>> +        if (cs->ws->info.chip_class <= SI ||
>> +            (cs->ws->info.family == CHIP_HAWAII &&
>> +             cs->ws->accel_working2 < 3)) {
>>              while (rcs->cdw & 7)
>>                  OUT_CS(&cs->base, 0x80000000); /* type2 nop packet */
>>          } else {
>> diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c
>> index 910d06b..ecff0e7 100644
>> --- a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c
>> +++ b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c
>> @@ -395,6 +395,16 @@ static boolean do_winsys_init(struct radeon_drm_winsys *ws)
>>      radeon_get_drm_value(ws->fd, RADEON_INFO_MAX_SH_PER_SE, NULL,
>>                           &ws->info.max_sh_per_se);
>>
>> +    radeon_get_drm_value(ws->fd, RADEON_INFO_ACCEL_WORKING2, NULL,
>> +                         &ws->accel_working2);
>> +    if (ws->info.family == CHIP_HAWAII && ws->accel_working2 < 2) {
>> +        fprintf(stderr, "radeon: GPU acceleration for Hawaii disabled, "
>> +                "returned accel_working2 value %u is smaller than 2. "
>> +                "Please install a newer kernel.\n",
>> +                ws->accel_working2);
>> +        return FALSE;
>> +    }
>> +
>>      if (radeon_get_drm_value(ws->fd, RADEON_INFO_SI_TILE_MODE_ARRAY, NULL,
>>                               ws->info.si_tile_mode_array)) {
>>          ws->info.si_tile_mode_array_valid = TRUE;
>> diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.h b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.h
>> index ea6f7f0..aebc391 100644
>> --- a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.h
>> +++ b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.h
>> @@ -55,6 +55,7 @@ struct radeon_drm_winsys {
>>      enum radeon_generation gen;
>>      struct radeon_info info;
>>      uint32_t va_start;
>> +    uint32_t accel_working2;
>>
>>      struct pb_manager *kman;
>>      struct pb_manager *cman_vram;
>> --
>> 2.0.1
>>
>> _______________________________________________
>> mesa-dev mailing list
>> mesa-dev at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
> _______________________________________________
> mesa-stable mailing list
> mesa-stable at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-stable
> 



More information about the mesa-dev mailing list