Change the hw_ip_gen and btrs_gen members of struct ivpu_device, and their accessors, from u32/int to enum vpu_hw_ip/enum vpu_hw_btrs, and drop the default: labels from the switch statements in ivpu_hw_ip.c that dispatch on them. Switching on the real enum types lets the compiler treat these switches as exhaustive at compile time, so a missing case for a new generation now warns instead of silently hitting default:.
This compile-time guarantee holds because ivpu_ip_gen_init() now fails probe on an unrecognized PCI device ID instead of leaving these fields at 0, so the switches never see an unhandled value. Signed-off-by: Dawid Osuchowski <[email protected]> --- drivers/accel/ivpu/ivpu_drv.h | 28 ++++++++++++++++------------ drivers/accel/ivpu/ivpu_hw_ip.c | 14 ++++++++++---- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/drivers/accel/ivpu/ivpu_drv.h b/drivers/accel/ivpu/ivpu_drv.h index 87953d0474fb..ce9cb118c0c4 100644 --- a/drivers/accel/ivpu/ivpu_drv.h +++ b/drivers/accel/ivpu/ivpu_drv.h @@ -31,17 +31,9 @@ #define PCI_DEVICE_ID_WCL 0xfd3e #define PCI_DEVICE_ID_NVL 0xd71d -#define IVPU_HW_IP_37XX 37 -#define IVPU_HW_IP_40XX 40 -#define IVPU_HW_IP_50XX 50 -#define IVPU_HW_IP_60XX 60 - #define IVPU_HW_IP_REV_LNL_B0 4 #define IVPU_HW_IP_REV_NVL_A0 0 -#define IVPU_HW_BTRS_MTL 1 -#define IVPU_HW_BTRS_LNL 2 - #define IVPU_GLOBAL_CONTEXT_MMU_SSID 0 /* SSID 1 is used by the VPU to represent reserved context */ #define IVPU_RESERVED_CONTEXT_MMU_SSID 1 @@ -107,6 +99,18 @@ ivpu_dbg(vdev, MISC, "Using WA: " #wa_name "\n"); \ } while (0) +enum vpu_hw_ip { + IVPU_HW_IP_37XX = 37, + IVPU_HW_IP_40XX = 40, + IVPU_HW_IP_50XX = 50, + IVPU_HW_IP_60XX = 60, +}; + +enum vpu_hw_btrs { + IVPU_HW_BTRS_MTL = 1, + IVPU_HW_BTRS_LNL = 2, +}; + struct ivpu_wa_table { bool punit_disabled; bool clear_runtime_mem; @@ -136,8 +140,8 @@ struct ivpu_device { struct drm_device drm; void __iomem *regb; void __iomem *regv; - u32 hw_ip_gen; - u32 btrs_gen; + enum vpu_hw_ip hw_ip_gen; + enum vpu_hw_btrs btrs_gen; u32 platform; u32 irq; @@ -259,12 +263,12 @@ static inline u16 ivpu_device_id(struct ivpu_device *vdev) return to_pci_dev(vdev->drm.dev)->device; } -static inline int ivpu_hw_ip_gen(struct ivpu_device *vdev) +static inline enum vpu_hw_ip ivpu_hw_ip_gen(struct ivpu_device *vdev) { return vdev->hw_ip_gen; } -static inline int ivpu_hw_btrs_gen(struct ivpu_device *vdev) +static inline enum vpu_hw_btrs ivpu_hw_btrs_gen(struct ivpu_device *vdev) { return vdev->btrs_gen; } diff --git a/drivers/accel/ivpu/ivpu_hw_ip.c b/drivers/accel/ivpu/ivpu_hw_ip.c index c604c1c37e99..bd6bb3fa49ff 100644 --- a/drivers/accel/ivpu/ivpu_hw_ip.c +++ b/drivers/accel/ivpu/ivpu_hw_ip.c @@ -688,7 +688,7 @@ static void pwr_island_delay_set(struct ivpu_device *vdev) post2 = 0; status = high ? 46 : 3; break; - default: + case IVPU_HW_IP_60XX: post = high ? 198 : 17; post1 = 0; post2 = high ? 198 : 17; @@ -801,10 +801,15 @@ static void ivpu_hw_ip_tbu_mmu_enable_40xx(struct ivpu_device *vdev) void ivpu_hw_ip_tbu_mmu_enable(struct ivpu_device *vdev) { - if (ivpu_hw_ip_gen(vdev) == IVPU_HW_IP_37XX) + switch (ivpu_hw_ip_gen(vdev)) { + case IVPU_HW_IP_37XX: return ivpu_hw_ip_tbu_mmu_enable_37xx(vdev); - else + + case IVPU_HW_IP_40XX: + case IVPU_HW_IP_50XX: + case IVPU_HW_IP_60XX: return ivpu_hw_ip_tbu_mmu_enable_40xx(vdev); + } } static inline u64 get_entry_point_addr(struct ivpu_device *vdev) @@ -940,8 +945,9 @@ int ivpu_hw_ip_soc_cpu_boot(struct ivpu_device *vdev) ret = soc_cpu_boot_40xx(vdev); break; - default: + case IVPU_HW_IP_60XX: ret = soc_cpu_boot_60xx(vdev); + break; } if (ret) -- 2.43.0
