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;