[Freedreno] [PATCH] drm/msm/a2xx: support loading legacy (iMX) firmware
Dmitry Baryshkov
dmitry.baryshkov at linaro.org
Mon Jan 2 15:52:35 UTC 2023
On 02/01/2023 03:39, Rob Clark wrote:
> On Sun, Jan 1, 2023 at 7:57 AM Dmitry Baryshkov
> <dmitry.baryshkov at linaro.org> wrote:
>>
>> Support loading A200 firmware generated from the iMX firmware header
>> files. The firmware lacks protection support, however it allows GPU to
>> function properly while using the firmware files with clear license
>> which allows redistribution.
>>
>> Cc: Jonathan Marek <jonathan at marek.ca>
>> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov at linaro.org>
>> ---
>> drivers/gpu/drm/msm/adreno/a2xx_gpu.c | 27 +++++++++++++++++++++++----
>> drivers/gpu/drm/msm/adreno/a2xx_gpu.h | 1 +
>> 2 files changed, 24 insertions(+), 4 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/msm/adreno/a2xx_gpu.c b/drivers/gpu/drm/msm/adreno/a2xx_gpu.c
>> index 6c9a747eb4ad..c67089a7ebc1 100644
>> --- a/drivers/gpu/drm/msm/adreno/a2xx_gpu.c
>> +++ b/drivers/gpu/drm/msm/adreno/a2xx_gpu.c
>> @@ -53,6 +53,8 @@ static void a2xx_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit)
>>
>> static bool a2xx_me_init(struct msm_gpu *gpu)
>> {
>> + struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
>> + struct a2xx_gpu *a2xx_gpu = to_a2xx_gpu(adreno_gpu);
>> struct msm_ringbuffer *ring = gpu->rb[0];
>>
>> OUT_PKT3(ring, CP_ME_INIT, 18);
>> @@ -84,15 +86,20 @@ static bool a2xx_me_init(struct msm_gpu *gpu)
>> /* NQ and External Memory Swap */
>> OUT_RING(ring, 0x00000000);
>> /* protected mode error checking (0x1f2 is REG_AXXX_CP_INT_CNTL) */
>> - OUT_RING(ring, 0x200001f2);
>> + if (a2xx_gpu->protection_disabled)
>> + OUT_RING(ring, 0x00000000);
>> + else
>> + OUT_RING(ring, 0x200001f2);
>> /* Disable header dumping and Header dump address */
>> OUT_RING(ring, 0x00000000);
>> /* Header dump size */
>> OUT_RING(ring, 0x00000000);
>>
>> - /* enable protected mode */
>> - OUT_PKT3(ring, CP_SET_PROTECTED_MODE, 1);
>> - OUT_RING(ring, 1);
>> + if (!a2xx_gpu->protection_disabled) {
>> + /* enable protected mode */
>> + OUT_PKT3(ring, CP_SET_PROTECTED_MODE, 1);
>> + OUT_RING(ring, 1);
>> + }
>>
>> adreno_flush(gpu, ring, REG_AXXX_CP_RB_WPTR);
>> return a2xx_idle(gpu);
>> @@ -101,6 +108,7 @@ static bool a2xx_me_init(struct msm_gpu *gpu)
>> static int a2xx_hw_init(struct msm_gpu *gpu)
>> {
>> struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);
>> + struct a2xx_gpu *a2xx_gpu = to_a2xx_gpu(adreno_gpu);
>> dma_addr_t pt_base, tran_error;
>> uint32_t *ptr, len;
>> int i, ret;
>> @@ -221,6 +229,17 @@ static int a2xx_hw_init(struct msm_gpu *gpu)
>> len = adreno_gpu->fw[ADRENO_FW_PM4]->size / 4;
>> DBG("loading PM4 ucode version: %x", ptr[1]);
>>
>> + /*
>> + * New firmware files seem to have GPU and firmware version in this
>> + * word (0x20xxxx for A200, 0x220xxx for A220, 0x225xxx for A225).
>> + * Older firmware files, which lack protection support, have 0 instead.
>> + */
>> + if (ptr[1] == 0) {
>
> I don't really have a good enough picture about all the possible fw
> versions floating around out there, esp back to the pre-qc days, to
> know if this is a good enough check. But I guess we can go with it,
> and in the worst case later add an allowlist table of fw checksums (or
> similar) if this doesn't turn out to be sufficient, so the overall
> approach isn't painting us into a corner.
>
> Reviewed-by: Rob Clark <robdclark at gmail.com>
For the reference. I have pushed existing redistributable firmware files
to https://github.com/lumag/yamato-firmware.git (I can move the repo to
some other location, e.g. to gitlab.fdo.org/msm if that's a better place).
I've also sent a patch to linux-firmware, so at some point we should be
able to use a200 with the default setup.
>
>> + dev_warn(gpu->dev->dev,
>> + "Legacy firmware detected, disabling protection support\n");
>> + a2xx_gpu->protection_disabled = true;
>> + }
>> +
>> gpu_write(gpu, REG_AXXX_CP_DEBUG,
>> AXXX_CP_DEBUG_MIU_128BIT_WRITE_ENABLE);
>> gpu_write(gpu, REG_AXXX_CP_ME_RAM_WADDR, 0);
>> diff --git a/drivers/gpu/drm/msm/adreno/a2xx_gpu.h b/drivers/gpu/drm/msm/adreno/a2xx_gpu.h
>> index 02fba2cb8932..161a075f94af 100644
>> --- a/drivers/gpu/drm/msm/adreno/a2xx_gpu.h
>> +++ b/drivers/gpu/drm/msm/adreno/a2xx_gpu.h
>> @@ -15,6 +15,7 @@
>> struct a2xx_gpu {
>> struct adreno_gpu base;
>> bool pm_enabled;
>> + bool protection_disabled;
>> };
>> #define to_a2xx_gpu(x) container_of(x, struct a2xx_gpu, base)
>>
>> --
>> 2.39.0
>>
--
With best wishes
Dmitry
More information about the Freedreno
mailing list