[PATCH 2/3] drm/msm: Expand UBWC config setting

Rob Clark robdclark at gmail.com
Tue Jul 2 14:31:40 UTC 2024


On Tue, Jul 2, 2024 at 5:56 AM Connor Abbott <cwabbott0 at gmail.com> wrote:
>
> According to downstream we should be setting RBBM_NC_MODE_CNTL to a
> non-default value on a663 and a680, we don't support a663 and on a680
> we're leaving it at the wrong (suboptimal) value. Just set it on all
> GPUs. Similarly, plumb through level2_swizzling_dis which will be
> necessary on a663.
>
> ubwc_mode is expanded and renamed to ubwc_swizzle to match the name on
> the display side. Similarly macrotile_mode should match the display
> side.
>
> Signed-off-by: Connor Abbott <cwabbott0 at gmail.com>
> ---
>  drivers/gpu/drm/msm/adreno/a5xx_gpu.c   |  4 ++++
>  drivers/gpu/drm/msm/adreno/a6xx_gpu.c   | 36 ++++++++++++++++++++++++---------
>  drivers/gpu/drm/msm/adreno/adreno_gpu.h |  3 ++-
>  3 files changed, 33 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/gpu/drm/msm/adreno/a5xx_gpu.c b/drivers/gpu/drm/msm/adreno/a5xx_gpu.c
> index c003f970189b..33b0f607f913 100644
> --- a/drivers/gpu/drm/msm/adreno/a5xx_gpu.c
> +++ b/drivers/gpu/drm/msm/adreno/a5xx_gpu.c
> @@ -1788,5 +1788,9 @@ struct msm_gpu *a5xx_gpu_init(struct drm_device *dev)
>         else
>                 adreno_gpu->ubwc_config.highest_bank_bit = 14;
>
> +       /* a5xx only supports UBWC 1.0, these are not configurable */
> +       adreno_gpu->ubwc_config.macrotile_mode = 0;
> +       adreno_gpu->ubwc_config.ubwc_swizzle = 0x7;
> +
>         return gpu;
>  }
> diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c
> index c98cdb1e9326..7a3564dd7941 100644
> --- a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c
> +++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c
> @@ -499,8 +499,17 @@ static void a6xx_calc_ubwc_config(struct adreno_gpu *gpu)
>         gpu->ubwc_config.uavflagprd_inv = 0;
>         /* Whether the minimum access length is 64 bits */
>         gpu->ubwc_config.min_acc_len = 0;
> -       /* Entirely magic, per-GPU-gen value */
> -       gpu->ubwc_config.ubwc_mode = 0;
> +       /* Whether to enable level 1, 2 & 3 bank swizzling.
> +        * UBWC 1.0 always enables all three levels.
> +        * UBWC 2.0 removes level 1 bank swizzling, leaving levels 2 & 3.
> +        * UBWC 4.0 adds the optional ability to disable levels 2 & 3.

I guess this is a bitmask for BIT(level_n)?

> +        */
> +       gpu->ubwc_config.ubwc_swizzle = 0x6;
> +       /* Whether to use 4-channel macrotiling mode or the newer 8-channel
> +        * macrotiling mode introduced in UBWC 3.1. 0 is 4-channel and 1 is
> +        * 8-channel.
> +        */

Can we add these comments as kerneldoc comments in the ubwc_config
struct?  That would be a more natural place for eventually moving ubwc
config to a central systemwide table (and perhaps finally properly
dealing with the setting differences for DDR vs LPDDR)

BR,
-R

> +       gpu->ubwc_config.macrotile_mode = 0;
>         /*
>          * The Highest Bank Bit value represents the bit of the highest DDR bank.
>          * This should ideally use DRAM type detection.
> @@ -510,7 +519,7 @@ static void a6xx_calc_ubwc_config(struct adreno_gpu *gpu)
>         if (adreno_is_a610(gpu)) {
>                 gpu->ubwc_config.highest_bank_bit = 13;
>                 gpu->ubwc_config.min_acc_len = 1;
> -               gpu->ubwc_config.ubwc_mode = 1;
> +               gpu->ubwc_config.ubwc_swizzle = 0x7;
>         }
>
>         if (adreno_is_a618(gpu))
> @@ -536,6 +545,7 @@ static void a6xx_calc_ubwc_config(struct adreno_gpu *gpu)
>                 gpu->ubwc_config.amsbc = 1;
>                 gpu->ubwc_config.rgb565_predicator = 1;
>                 gpu->ubwc_config.uavflagprd_inv = 2;
> +               gpu->ubwc_config.macrotile_mode = 1;
>         }
>
>         if (adreno_is_7c3(gpu)) {
> @@ -543,12 +553,12 @@ static void a6xx_calc_ubwc_config(struct adreno_gpu *gpu)
>                 gpu->ubwc_config.amsbc = 1;
>                 gpu->ubwc_config.rgb565_predicator = 1;
>                 gpu->ubwc_config.uavflagprd_inv = 2;
> +               gpu->ubwc_config.macrotile_mode = 1;
>         }
>
>         if (adreno_is_a702(gpu)) {
>                 gpu->ubwc_config.highest_bank_bit = 14;
>                 gpu->ubwc_config.min_acc_len = 1;
> -               gpu->ubwc_config.ubwc_mode = 0;
>         }
>  }
>
> @@ -564,21 +574,26 @@ static void a6xx_set_ubwc_config(struct msm_gpu *gpu)
>         u32 hbb = adreno_gpu->ubwc_config.highest_bank_bit - 13;
>         u32 hbb_hi = hbb >> 2;
>         u32 hbb_lo = hbb & 3;
> +       u32 ubwc_mode = adreno_gpu->ubwc_config.ubwc_swizzle & 1;
> +       u32 level2_swizzling_dis = !(adreno_gpu->ubwc_config.ubwc_swizzle & 2);
>
>         gpu_write(gpu, REG_A6XX_RB_NC_MODE_CNTL,
> +                 level2_swizzling_dis << 12 |
>                   adreno_gpu->ubwc_config.rgb565_predicator << 11 |
>                   hbb_hi << 10 | adreno_gpu->ubwc_config.amsbc << 4 |
>                   adreno_gpu->ubwc_config.min_acc_len << 3 |
> -                 hbb_lo << 1 | adreno_gpu->ubwc_config.ubwc_mode);
> +                 hbb_lo << 1 | ubwc_mode);
>
> -       gpu_write(gpu, REG_A6XX_TPL1_NC_MODE_CNTL, hbb_hi << 4 |
> +       gpu_write(gpu, REG_A6XX_TPL1_NC_MODE_CNTL,
> +                 level2_swizzling_dis << 6 | hbb_hi << 4 |
>                   adreno_gpu->ubwc_config.min_acc_len << 3 |
> -                 hbb_lo << 1 | adreno_gpu->ubwc_config.ubwc_mode);
> +                 hbb_lo << 1 | ubwc_mode);
>
> -       gpu_write(gpu, REG_A6XX_SP_NC_MODE_CNTL, hbb_hi << 10 |
> +       gpu_write(gpu, REG_A6XX_SP_NC_MODE_CNTL,
> +                 level2_swizzling_dis << 12 | hbb_hi << 10 |
>                   adreno_gpu->ubwc_config.uavflagprd_inv << 4 |
>                   adreno_gpu->ubwc_config.min_acc_len << 3 |
> -                 hbb_lo << 1 | adreno_gpu->ubwc_config.ubwc_mode);
> +                 hbb_lo << 1 | ubwc_mode);
>
>         if (adreno_is_a7xx(adreno_gpu))
>                 gpu_write(gpu, REG_A7XX_GRAS_NC_MODE_CNTL,
> @@ -586,6 +601,9 @@ static void a6xx_set_ubwc_config(struct msm_gpu *gpu)
>
>         gpu_write(gpu, REG_A6XX_UCHE_MODE_CNTL,
>                   adreno_gpu->ubwc_config.min_acc_len << 23 | hbb_lo << 21);
> +
> +       gpu_write(gpu, REG_A6XX_RBBM_NC_MODE_CNTL,
> +                 adreno_gpu->ubwc_config.macrotile_mode);
>  }
>
>  static int a6xx_cp_init(struct msm_gpu *gpu)
> diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.h b/drivers/gpu/drm/msm/adreno/adreno_gpu.h
> index cff8ce541d2c..b2da660c10c7 100644
> --- a/drivers/gpu/drm/msm/adreno/adreno_gpu.h
> +++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.h
> @@ -194,9 +194,10 @@ struct adreno_gpu {
>                 u32 rgb565_predicator;
>                 u32 uavflagprd_inv;
>                 u32 min_acc_len;
> -               u32 ubwc_mode;
> +               u32 ubwc_swizzle;
>                 u32 highest_bank_bit;
>                 u32 amsbc;
> +               u32 macrotile_mode;
>         } ubwc_config;
>
>         /*
>
> --
> 2.31.1
>


More information about the dri-devel mailing list