[Mesa-stable] [Mesa-dev] [PATCH v4] winsys/radeon: fix nop packet padding for hawaii
Alex Deucher
alexdeucher at gmail.com
Wed Aug 6 09:16:06 PDT 2014
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>
> ---
>
> 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
More information about the mesa-stable
mailing list