[PATCH v2 5/9] drm/panthor: Make getting GPU model name simple and extensible
Boris Brezillon
boris.brezillon at collabora.com
Thu Apr 10 13:37:29 UTC 2025
On Thu, 10 Apr 2025 14:20:59 +0100
Karunika Choo <karunika.choo at arm.com> wrote:
> On 21/03/2025 08:02, Boris Brezillon wrote:
> > On Thu, 20 Mar 2025 11:17:37 +0000
> > Karunika Choo <karunika.choo at arm.com> wrote:
> >
> >> This patch replaces the previous panthor_model structure with a simple
> >> switch case based on the product_id, which is in the format of:
> >> ((arch_major << 24) | product_major)
> >>
> >> This not only simplifies the comparison, but also allows extending the
> >> function to accommodate naming differences based on GPU features.
> >>
> >> Signed-off-by: Karunika Choo <karunika.choo at arm.com>
> >> ---
> >> drivers/gpu/drm/panthor/panthor_hw.c | 63 +++++++-------------------
> >> drivers/gpu/drm/panthor/panthor_regs.h | 1 +
> >> 2 files changed, 18 insertions(+), 46 deletions(-)
> >>
> >> diff --git a/drivers/gpu/drm/panthor/panthor_hw.c b/drivers/gpu/drm/panthor/panthor_hw.c
> >> index 4cc4b0d5382c..12183c04cd21 100644
> >> --- a/drivers/gpu/drm/panthor/panthor_hw.c
> >> +++ b/drivers/gpu/drm/panthor/panthor_hw.c
> >> @@ -5,40 +5,6 @@
> >> #include "panthor_hw.h"
> >> #include "panthor_regs.h"
> >>
> >> -/**
> >> - * struct panthor_model - GPU model description
> >> - */
> >> -struct panthor_model {
> >> - /** @name: Model name. */
> >> - const char *name;
> >> -
> >> - /** @arch_major: Major version number of architecture. */
> >> - u8 arch_major;
> >> -
> >> - /** @product_major: Major version number of product. */
> >> - u8 product_major;
> >> -};
> >> -
> >> -/**
> >> - * GPU_MODEL() - Define a GPU model. A GPU product can be uniquely identified
> >> - * by a combination of the major architecture version and the major product
> >> - * version.
> >> - * @_name: Name for the GPU model.
> >> - * @_arch_major: Architecture major.
> >> - * @_product_major: Product major.
> >> - */
> >> -#define GPU_MODEL(_name, _arch_major, _product_major) \
> >> -{\
> >> - .name = __stringify(_name), \
> >> - .arch_major = _arch_major, \
> >> - .product_major = _product_major, \
> >> -}
> >> -
> >> -static const struct panthor_model gpu_models[] = {
> >> - GPU_MODEL(g610, 10, 7),
> >> - {},
> >> -};
> >> -
> >> static void arch_10_8_gpu_info_init(struct panthor_device *ptdev)
> >> {
> >> unsigned int i;
> >> @@ -66,29 +32,34 @@ static void arch_10_8_gpu_info_init(struct panthor_device *ptdev)
> >> ptdev->gpu_info.l2_present = gpu_read64(ptdev, GPU_L2_PRESENT_LO);
> >> }
> >>
> >> +static char *get_gpu_model_name(struct panthor_device *ptdev)
> >> +{
> >> + const u32 gpu_id = ptdev->gpu_info.gpu_id;
> >> + const u32 product_id = GPU_PROD_ID_MAKE(GPU_ARCH_MAJOR(gpu_id),
> >> + GPU_PROD_MAJOR(gpu_id));
> >> +
> >> + switch (product_id) {
> >> + case GPU_PROD_ID_MAKE(10, 7):
> >> + return "Mali-G610";
> >> + }
> >
> > I a big fan of these ever growing switch statements with nested
> > conditionals. Could we instead add an optional ::get_variant() callback
> > in panthor_model and have the following formatting:
> >
> > "Mali-%s%s%s", model->name,
> > model->get_variant ? "-" : "",
> > model->get_variant ? model->get_variant() : ""
> >
>
> While that’s certainly an option, I wonder if it’s better to avoid
> additional string formatting when it’s not strictly necessary. The
> switch cases provide a straightforward GPU name without needing to
> handle conditional "-" separators or similar.
>
> Also, with the current approach, if a GPU is misconfigured with an
> incorrect product_major for its core count, the switch’s fallthrough
> helps ensure the correct name is still returned. A model->get_variant()
> callback wouldn’t give us that same flexibility to adjust the name based
> on such mismatches.
Fair enough. I guess we can live with this sort of switch statement for
the name selection. Hopefully the variants are rare enough that it
doesn't go too wild.
More information about the dri-devel
mailing list