mirror of
https://github.com/torvalds/linux.git
synced 2026-05-28 17:13:52 +02:00
drm/imagination: Use a lookup table for fw defs
With more than two firmware processor types, the if/else chain in pvr_fw_init() gets a bit ridiculous. Use a static array indexed on pvr_fw_processor_type (which is now a proper enum instead of #defines) instead. Reviewed-by: Frank Binns <frank.binns@imgtec.com> Link: https://lore.kernel.org/r/20250410-sets-bxs-4-64-patch-v1-v6-11-eda620c5865f@imgtec.com Signed-off-by: Matt Coster <matt.coster@imgtec.com>
This commit is contained in:
parent
28dbcfbc01
commit
544b9b3b6f
|
|
@ -739,8 +739,4 @@ pvr_ioctl_union_padding_check(void *instance, size_t union_offset,
|
|||
__union_size, __member_size); \
|
||||
})
|
||||
|
||||
#define PVR_FW_PROCESSOR_TYPE_META 0
|
||||
#define PVR_FW_PROCESSOR_TYPE_MIPS 1
|
||||
#define PVR_FW_PROCESSOR_TYPE_RISCV 2
|
||||
|
||||
#endif /* PVR_DEVICE_H */
|
||||
|
|
|
|||
|
|
@ -938,16 +938,27 @@ pvr_fw_validate_init_device_info(struct pvr_device *pvr_dev)
|
|||
int
|
||||
pvr_fw_init(struct pvr_device *pvr_dev)
|
||||
{
|
||||
static const struct pvr_fw_defs *fw_defs[PVR_FW_PROCESSOR_TYPE_COUNT] = {
|
||||
[PVR_FW_PROCESSOR_TYPE_META] = &pvr_fw_defs_meta,
|
||||
[PVR_FW_PROCESSOR_TYPE_MIPS] = &pvr_fw_defs_mips,
|
||||
[PVR_FW_PROCESSOR_TYPE_RISCV] = NULL,
|
||||
};
|
||||
|
||||
u32 kccb_size_log2 = ROGUE_FWIF_KCCB_NUMCMDS_LOG2_DEFAULT;
|
||||
u32 kccb_rtn_size = (1 << kccb_size_log2) * sizeof(*pvr_dev->kccb.rtn);
|
||||
struct pvr_fw_device *fw_dev = &pvr_dev->fw_dev;
|
||||
int err;
|
||||
|
||||
if (fw_dev->processor_type == PVR_FW_PROCESSOR_TYPE_META)
|
||||
fw_dev->defs = &pvr_fw_defs_meta;
|
||||
else if (fw_dev->processor_type == PVR_FW_PROCESSOR_TYPE_MIPS)
|
||||
fw_dev->defs = &pvr_fw_defs_mips;
|
||||
else
|
||||
if (fw_dev->processor_type >= PVR_FW_PROCESSOR_TYPE_COUNT)
|
||||
return -EINVAL;
|
||||
|
||||
fw_dev->defs = fw_defs[fw_dev->processor_type];
|
||||
|
||||
/*
|
||||
* Not all firmware processor types are currently supported.
|
||||
* Once they are, this check can be removed.
|
||||
*/
|
||||
if (!fw_dev->defs)
|
||||
return -EINVAL;
|
||||
|
||||
err = fw_dev->defs->init(pvr_dev);
|
||||
|
|
|
|||
|
|
@ -402,6 +402,13 @@ struct pvr_fw_device {
|
|||
#define pvr_fw_irq_clear(pvr_dev) \
|
||||
pvr_fw_irq_write_reg(pvr_dev, clear, (pvr_dev)->fw_dev.defs->irq.clear_mask)
|
||||
|
||||
enum pvr_fw_processor_type {
|
||||
PVR_FW_PROCESSOR_TYPE_META = 0,
|
||||
PVR_FW_PROCESSOR_TYPE_MIPS,
|
||||
PVR_FW_PROCESSOR_TYPE_RISCV,
|
||||
PVR_FW_PROCESSOR_TYPE_COUNT,
|
||||
};
|
||||
|
||||
extern const struct pvr_fw_defs pvr_fw_defs_meta;
|
||||
extern const struct pvr_fw_defs pvr_fw_defs_mips;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user