[PATCH 3/4] drm/msm/a6xx: Get HBB dynamically, if available

Connor Abbott cwabbott0 at gmail.com
Wed Apr 9 15:44:11 UTC 2025


On Wed, Apr 9, 2025 at 11:40 AM Konrad Dybcio
<konrad.dybcio at oss.qualcomm.com> wrote:
>
> On 4/9/25 5:30 PM, Connor Abbott wrote:
> > On Wed, Apr 9, 2025 at 11:22 AM Konrad Dybcio
> > <konrad.dybcio at oss.qualcomm.com> wrote:
> >>
> >> On 4/9/25 5:12 PM, Connor Abbott wrote:
> >>> On Wed, Apr 9, 2025 at 10:48 AM Konrad Dybcio <konradybcio at kernel.org> wrote:
> >>>>
> >>>> From: Konrad Dybcio <konrad.dybcio at oss.qualcomm.com>
> >>>>
> >>>> The Highest Bank address Bit value can change based on memory type used.
> >>>>
> >>>> Attempt to retrieve it dynamically, and fall back to a reasonable
> >>>> default (the one used prior to this change) on error.
> >>>>
> >>>> Signed-off-by: Konrad Dybcio <konrad.dybcio at oss.qualcomm.com>
> >>>> ---
> >>>>  drivers/gpu/drm/msm/adreno/a6xx_gpu.c | 22 ++++++++++++++++------
> >>>>  1 file changed, 16 insertions(+), 6 deletions(-)
> >>>>
> >>>> diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c
> >>>> index 06465bc2d0b4b128cddfcfcaf1fe4252632b6777..0cc397378c99db35315209d0265ad9223e8b55c7 100644
> >>>> --- a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c
> >>>> +++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c
> >>>> @@ -13,6 +13,7 @@
> >>>>  #include <linux/firmware/qcom/qcom_scm.h>
> >>>>  #include <linux/pm_domain.h>
> >>>>  #include <linux/soc/qcom/llcc-qcom.h>
> >>>> +#include <linux/soc/qcom/smem.h>
> >>>>
> >>>>  #define GPU_PAS_ID 13
> >>>>
> >>>> @@ -669,17 +670,22 @@ static void a6xx_calc_ubwc_config(struct adreno_gpu *gpu)
> >>>>  static void a6xx_set_ubwc_config(struct msm_gpu *gpu)
> >>>>  {
> >>>>         struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
> >>>> +       u32 hbb = qcom_smem_dram_get_hbb();
> >>>> +       u32 ubwc_mode = adreno_gpu->ubwc_config.ubwc_swizzle & 1;
> >>>> +       u32 level2_swizzling_dis = !(adreno_gpu->ubwc_config.ubwc_swizzle & 2);
> >>>> +       u32 hbb_hi, hbb_lo;
> >>>> +
> >>>>         /*
> >>>>          * We subtract 13 from the highest bank bit (13 is the minimum value
> >>>>          * allowed by hw) and write the lowest two bits of the remaining value
> >>>>          * as hbb_lo and the one above it as hbb_hi to the hardware.
> >>>>          */
> >>>> -       BUG_ON(adreno_gpu->ubwc_config.highest_bank_bit < 13);
> >>>> -       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);
> >>>> +       if (hbb < 0)
> >>>> +               hbb = adreno_gpu->ubwc_config.highest_bank_bit;
> >>>
> >>> No. The value we expose to userspace must match what we program.
> >>> You'll break VK_EXT_host_image_copy otherwise.
> >>
> >> I didn't know that was exposed to userspace.
> >>
> >> The value must be altered either way - ultimately, the hardware must
> >> receive the correct information. ubwc_config doesn't seem to be const,
> >> so I can edit it there if you like it better.
> >>
> >> Konrad
> >
> > Yes, you should be calling qcom_smem_dram_get_hbb() in
> > a6xx_calc_ubwc_config(). You can already see there's a TODO there to
> > plug it in.
>
> Does this look good instead?
>
> diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c
> index 0cc397378c99..ae8dbc250e6a 100644
> --- a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c
> +++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c
> @@ -588,6 +588,8 @@ static void a6xx_set_cp_protect(struct msm_gpu *gpu)
>
>  static void a6xx_calc_ubwc_config(struct adreno_gpu *gpu)
>  {
> +       u8 hbb;

You can't make it u8 and then test for a negative value on error.
Other than that, looks good.

Connor

> +
>         gpu->ubwc_config.rgb565_predicator = 0;
>         gpu->ubwc_config.uavflagprd_inv = 0;
>         gpu->ubwc_config.min_acc_len = 0;
> @@ -636,7 +638,6 @@ static void a6xx_calc_ubwc_config(struct adreno_gpu *gpu)
>             adreno_is_a690(gpu) ||
>             adreno_is_a730(gpu) ||
>             adreno_is_a740_family(gpu)) {
> -               /* TODO: get ddr type from bootloader and use 2 for LPDDR4 */
>                 gpu->ubwc_config.highest_bank_bit = 16;
>                 gpu->ubwc_config.amsbc = 1;
>                 gpu->ubwc_config.rgb565_predicator = 1;
> @@ -665,6 +666,13 @@ static void a6xx_calc_ubwc_config(struct adreno_gpu *gpu)
>                 gpu->ubwc_config.highest_bank_bit = 14;
>                 gpu->ubwc_config.min_acc_len = 1;
>         }
> +
> +       /* Attempt to retrieve HBB data from SMEM, keep the above defaults in case of error */
> +       hbb = qcom_smem_dram_get_hbb();
> +       if (hbb < 0)
> +               return;
> +
> +       gpu->ubwc_config.highest_bank_bit = hbb;
>  }
>
>  static void a6xx_set_ubwc_config(struct msm_gpu *gpu)
>
>
> Konrad


More information about the dri-devel mailing list