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 >