Re: [PATCH] etnaviv: Restore some id values

From: Tomeu Vizoso
Date: Fri Mar 01 2024 - 04:28:13 EST


On Thu, Feb 29, 2024 at 8:55 PM Christian Gmeiner
<christian.gmeiner@xxxxxxxxx> wrote:
>
> From: Christian Gmeiner <cgmeiner@xxxxxxxxxx>
>
> The hwdb selection logic as a feature that allows it to mark some fields
> as 'don't care'. If we match with such a field we memcpy(..)
> the current etnaviv_chip_identity into ident.
>
> This step can overwrite some id values read from the GPU with the
> 'don't care' value.
>
> Fix this issue by restoring the affected values after the memcpy(..).
>
> As this is crucial for user space to know when this feature works as
> expected increment the minor version too.
>
> Fixes: 4078a1186dd3 ("drm/etnaviv: update hwdb selection logic")
> Cc: stable@xxxxxxxxxxxxxxx

Oops.

Reviewed-by: Tomeu Vizoso <tomeu@xxxxxxxxxxxxxxx>

Cheers,

Tomeu

> Signed-off-by: Christian Gmeiner <cgmeiner@xxxxxxxxxx>
> ---
> drivers/gpu/drm/etnaviv/etnaviv_drv.c | 2 +-
> drivers/gpu/drm/etnaviv/etnaviv_hwdb.c | 14 ++++++++++++++
> 2 files changed, 15 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_drv.c b/drivers/gpu/drm/etnaviv/etnaviv_drv.c
> index 6228ce603248..9a2965741dab 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_drv.c
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_drv.c
> @@ -494,7 +494,7 @@ static const struct drm_driver etnaviv_drm_driver = {
> .desc = "etnaviv DRM",
> .date = "20151214",
> .major = 1,
> - .minor = 3,
> + .minor = 4,
> };
>
> /*
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_hwdb.c b/drivers/gpu/drm/etnaviv/etnaviv_hwdb.c
> index 67201242438b..1e38d66702f1 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_hwdb.c
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_hwdb.c
> @@ -265,6 +265,9 @@ static const struct etnaviv_chip_identity etnaviv_chip_identities[] = {
> bool etnaviv_fill_identity_from_hwdb(struct etnaviv_gpu *gpu)
> {
> struct etnaviv_chip_identity *ident = &gpu->identity;
> + const u32 product_id = ident->product_id;
> + const u32 customer_id = ident->customer_id;
> + const u32 eco_id = ident->eco_id;
> int i;
>
> for (i = 0; i < ARRAY_SIZE(etnaviv_chip_identities); i++) {
> @@ -278,6 +281,17 @@ bool etnaviv_fill_identity_from_hwdb(struct etnaviv_gpu *gpu)
> etnaviv_chip_identities[i].eco_id == ~0U)) {
> memcpy(ident, &etnaviv_chip_identities[i],
> sizeof(*ident));
> +
> + /* Restore some id values if ~0U aka 'don't care' is used. */
> + if (etnaviv_chip_identities[i].product_id == ~0U)
> + ident->product_id = product_id;
> +
> + if (etnaviv_chip_identities[i].customer_id == ~0U)
> + ident->customer_id = customer_id;
> +
> + if (etnaviv_chip_identities[i].eco_id == ~0U)
> + ident->eco_id = eco_id;
> +
> return true;
> }
> }
> --
> 2.44.0
>