accel/ivpu: Convert hw_ip_gen/btrs_gen to enum types

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 <dawid.osuchowski@linux.intel.com>
Reviewed-by: Karol Wachowski <karol.wachowski@linux.intel.com>
Reviewed-by: Andrzej Kacprowski <andrzej.kacprowski@linux.intel.com>
Reviewed-by: Jeff Hugo <jeff.hugo@oss.qualcomm.com>
Signed-off-by: Karol Wachowski <karol.wachowski@linux.intel.com>
Link: https://patch.msgid.link/20261001110401.2866557-3-dawid.osuchowski@linux.intel.com
This commit is contained in:
Dawid Osuchowski 2026-10-01 13:04:00 +02:00 committed by Karol Wachowski
parent 028f6b389d
commit be3cf6bb94
2 changed files with 26 additions and 16 deletions

View File

@ -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;
}

View File

@ -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)