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)