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

Reply via email to