diff mbox series

[5/6] drm/etnaviv: update hwdb selection logic

Message ID 20200102100230.420009-6-christian.gmeiner@gmail.com (mailing list archive)
State New, archived
Headers show
Series update hwdw for gc400 | expand

Commit Message

Christian Gmeiner Jan. 2, 2020, 10:02 a.m. UTC
Take product id, customer id and eco id into account. If that
delivers no match try a search for model and revision.

Signed-off-by: Christian Gmeiner <christian.gmeiner@gmail.com>
---
 drivers/gpu/drm/etnaviv/etnaviv_hwdb.c | 19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

Comments

Lucas Stach Jan. 6, 2020, 10:15 a.m. UTC | #1
On Do, 2020-01-02 at 11:02 +0100, Christian Gmeiner wrote:
> Take product id, customer id and eco id into account. If that
> delivers no match try a search for model and revision.
> 
> Signed-off-by: Christian Gmeiner <christian.gmeiner@gmail.com>
> ---
>  drivers/gpu/drm/etnaviv/etnaviv_hwdb.c | 19 ++++++++++++++++++-
>  1 file changed, 18 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_hwdb.c b/drivers/gpu/drm/etnaviv/etnaviv_hwdb.c
> index eb0f3eb87ced..d1744f1b44b1 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_hwdb.c
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_hwdb.c
> @@ -44,9 +44,26 @@ bool etnaviv_fill_identity_from_hwdb(struct etnaviv_gpu *gpu)
>  	struct etnaviv_chip_identity *ident = &gpu->identity;
>  	int i;
>  
> +	/* accurate match */
>  	for (i = 0; i < ARRAY_SIZE(etnaviv_chip_identities); i++) {
>  		if (etnaviv_chip_identities[i].model == ident->model &&
> -		    etnaviv_chip_identities[i].revision == ident->revision) {
> +		    etnaviv_chip_identities[i].revision == ident->revision &&
> +		    etnaviv_chip_identities[i].product_id == ident->product_id &&

Why not simply make this:
(etnaviv_chip_identities[i].product_id == ident->product_id ||
etnaviv_chip_identities[i].product_id == ~0U)
and similar for customer and eco ID?

With this we don't need two different walks through the HWDB, as long
as the more specific entries in the DB are ordered to the front of the
array.

Regards,
Lucas

> +		    etnaviv_chip_identities[i].customer_id == ident->customer_id &&
> +		    etnaviv_chip_identities[i].eco_id == ident->eco_id) {
> +			memcpy(ident, &etnaviv_chip_identities[i],
> +			       sizeof(*ident));
> +			return true;
> +		}
> +	}
> +
> +	/* match based only on model and revision */
> +	for (i = 0; i < ARRAY_SIZE(etnaviv_chip_identities); i++) {
> +		if (etnaviv_chip_identities[i].model == ident->model &&
> +		    etnaviv_chip_identities[i].revision == ident->revision &&
> +		    etnaviv_chip_identities[i].product_id == ~0U &&
> +		    etnaviv_chip_identities[i].customer_id == ~0U &&
> +		    etnaviv_chip_identities[i].eco_id == ~0U) {
>  			memcpy(ident, &etnaviv_chip_identities[i],
>  			       sizeof(*ident));
>  			return true;
Christian Gmeiner Jan. 6, 2020, 10:49 a.m. UTC | #2
Hi Lucas

Am Mo., 6. Jan. 2020 um 11:15 Uhr schrieb Lucas Stach <l.stach@pengutronix.de>:
>
> On Do, 2020-01-02 at 11:02 +0100, Christian Gmeiner wrote:
> > Take product id, customer id and eco id into account. If that
> > delivers no match try a search for model and revision.
> >
> > Signed-off-by: Christian Gmeiner <christian.gmeiner@gmail.com>
> > ---
> >  drivers/gpu/drm/etnaviv/etnaviv_hwdb.c | 19 ++++++++++++++++++-
> >  1 file changed, 18 insertions(+), 1 deletion(-)
> >
> > diff --git a/drivers/gpu/drm/etnaviv/etnaviv_hwdb.c b/drivers/gpu/drm/etnaviv/etnaviv_hwdb.c
> > index eb0f3eb87ced..d1744f1b44b1 100644
> > --- a/drivers/gpu/drm/etnaviv/etnaviv_hwdb.c
> > +++ b/drivers/gpu/drm/etnaviv/etnaviv_hwdb.c
> > @@ -44,9 +44,26 @@ bool etnaviv_fill_identity_from_hwdb(struct etnaviv_gpu *gpu)
> >       struct etnaviv_chip_identity *ident = &gpu->identity;
> >       int i;
> >
> > +     /* accurate match */
> >       for (i = 0; i < ARRAY_SIZE(etnaviv_chip_identities); i++) {
> >               if (etnaviv_chip_identities[i].model == ident->model &&
> > -                 etnaviv_chip_identities[i].revision == ident->revision) {
> > +                 etnaviv_chip_identities[i].revision == ident->revision &&
> > +                 etnaviv_chip_identities[i].product_id == ident->product_id &&
>
> Why not simply make this:
> (etnaviv_chip_identities[i].product_id == ident->product_id ||
> etnaviv_chip_identities[i].product_id == ~0U)
> and similar for customer and eco ID?
>
> With this we don't need two different walks through the HWDB, as long
> as the more specific entries in the DB are ordered to the front of the
> array.
>

Works for me too.. will be change in v2.
diff mbox series

Patch

diff --git a/drivers/gpu/drm/etnaviv/etnaviv_hwdb.c b/drivers/gpu/drm/etnaviv/etnaviv_hwdb.c
index eb0f3eb87ced..d1744f1b44b1 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_hwdb.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_hwdb.c
@@ -44,9 +44,26 @@  bool etnaviv_fill_identity_from_hwdb(struct etnaviv_gpu *gpu)
 	struct etnaviv_chip_identity *ident = &gpu->identity;
 	int i;
 
+	/* accurate match */
 	for (i = 0; i < ARRAY_SIZE(etnaviv_chip_identities); i++) {
 		if (etnaviv_chip_identities[i].model == ident->model &&
-		    etnaviv_chip_identities[i].revision == ident->revision) {
+		    etnaviv_chip_identities[i].revision == ident->revision &&
+		    etnaviv_chip_identities[i].product_id == ident->product_id &&
+		    etnaviv_chip_identities[i].customer_id == ident->customer_id &&
+		    etnaviv_chip_identities[i].eco_id == ident->eco_id) {
+			memcpy(ident, &etnaviv_chip_identities[i],
+			       sizeof(*ident));
+			return true;
+		}
+	}
+
+	/* match based only on model and revision */
+	for (i = 0; i < ARRAY_SIZE(etnaviv_chip_identities); i++) {
+		if (etnaviv_chip_identities[i].model == ident->model &&
+		    etnaviv_chip_identities[i].revision == ident->revision &&
+		    etnaviv_chip_identities[i].product_id == ~0U &&
+		    etnaviv_chip_identities[i].customer_id == ~0U &&
+		    etnaviv_chip_identities[i].eco_id == ~0U) {
 			memcpy(ident, &etnaviv_chip_identities[i],
 			       sizeof(*ident));
 			return true;