Re: [PATCH] etnaviv: Restore some id values

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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
>





[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux