[PATCH 7/7] media: ipu6: add PCI ID for IPU8
From: Divyamani Tripathi
Date: Wed Sep 30 2026 - 05:11:26 EST
Add the IPU8 PCI ID and probe wiring. IPU8 reuses the IPU7P5 buttress
register map (unvalidated against IPU8's hardware spec) but needs its
own default control ratio (0x10), so add dedicated
ipu8_{isys,psys}_buttress_ctrl structs instead of reusing IPU7's.
Signed-off-by: Divyamani Tripathi <divyamani.tripathi@xxxxxxxxx>
---
drivers/media/pci/intel/ipu6/ipu6.c | 40 ++++++++++++++++++++++++++++-
include/media/ipu6-pci-table.h | 2 ++
2 files changed, 41 insertions(+), 1 deletion(-)
diff --git a/drivers/media/pci/intel/ipu6/ipu6.c b/drivers/media/pci/intel/ipu6/ipu6.c
index acc492f5cc11..17e659230149 100644
--- a/drivers/media/pci/intel/ipu6/ipu6.c
+++ b/drivers/media/pci/intel/ipu6/ipu6.c
@@ -140,6 +140,28 @@ static const struct ipu6_buttress_ctrl ipu7_psys_buttress_ctrl = {
.pwr_sts_off = IPU6_BUTTRESS_PWR_STATE_DN_DONE,
};
+static const struct ipu6_buttress_ctrl ipu8_isys_buttress_ctrl = {
+ .subsys_id = IPU_ISYS,
+ .ratio = IPU8_IS_FREQ_CTL_DEFAULT_RATIO,
+ .qos_floor = 0,
+ .freq_ctl = IPU7_BUTTRESS_REG_IS_WORKPOINT_REQ,
+ .pwr_sts_shift = IPU7_BUTTRESS_PWR_STATE_IS_PWR_SHIFT,
+ .pwr_sts_mask = IPU7_BUTTRESS_PWR_STATE_IS_PWR_MASK,
+ .pwr_sts_on = IPU6_BUTTRESS_PWR_STATE_UP_DONE,
+ .pwr_sts_off = IPU6_BUTTRESS_PWR_STATE_DN_DONE,
+};
+
+static const struct ipu6_buttress_ctrl ipu8_psys_buttress_ctrl = {
+ .subsys_id = IPU_PSYS,
+ .ratio = IPU8_PS_FREQ_CTL_DEFAULT_RATIO,
+ .qos_floor = 0,
+ .freq_ctl = IPU7_BUTTRESS_REG_PS_WORKPOINT_REQ,
+ .pwr_sts_shift = IPU7_BUTTRESS_PWR_STATE_PS_PWR_SHIFT,
+ .pwr_sts_mask = IPU7_BUTTRESS_PWR_STATE_PS_PWR_MASK,
+ .pwr_sts_on = IPU6_BUTTRESS_PWR_STATE_UP_DONE,
+ .pwr_sts_off = IPU6_BUTTRESS_PWR_STATE_DN_DONE,
+};
+
static const struct ipu6_buttress_registers ipu6_buttress_regs = {
/* Registers */
.irq_status = BUTTRESS_REG_ISR_STATUS,
@@ -624,7 +646,8 @@ static int ipu6_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
int ret;
if ((id->device == PCI_DEVICE_ID_INTEL_IPU7 ||
- id->device == PCI_DEVICE_ID_INTEL_IPU7P5) && force_no_probe_ipu7)
+ id->device == PCI_DEVICE_ID_INTEL_IPU7P5 ||
+ id->device == PCI_DEVICE_ID_INTEL_IPU8) && force_no_probe_ipu7)
return -ENODEV;
isp = devm_kzalloc(dev, sizeof(*isp), GFP_KERNEL);
@@ -677,6 +700,21 @@ static int ipu6_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
isys_ctrl = &ipu7_isys_buttress_ctrl;
psys_ctrl = &ipu7_psys_buttress_ctrl;
break;
+ case PCI_DEVICE_ID_INTEL_IPU8:
+ /*
+ * IPU8 reuses the IPU7P5 buttress register map,
+ * matching staging ipu7 (no dedicated ipu8_buttress_regs
+ * there either). isys/psys control ratios use IPU8's own
+ * 0x10 default, unlike IPU7/IPU7P5.
+ * TODO: confirm buttress register map against IPU8 hw spec.
+ */
+ isp->hw_ver = IPU_VERSION_8;
+ isp->cpd_fw_name = IPU8_FIRMWARE_NAME;
+ isp->model_name = IPU8_MEDIA_DEV_MODEL_NAME;
+ isp->buttress.regs = &ipu7p5_buttress_regs;
+ isys_ctrl = &ipu8_isys_buttress_ctrl;
+ psys_ctrl = &ipu8_psys_buttress_ctrl;
+ break;
default:
return dev_err_probe(dev, -ENODEV,
"Unsupported IPU6 device %x\n",
diff --git a/include/media/ipu6-pci-table.h b/include/media/ipu6-pci-table.h
index cacb8a3170d0..4c7e724ea15e 100644
--- a/include/media/ipu6-pci-table.h
+++ b/include/media/ipu6-pci-table.h
@@ -16,6 +16,7 @@
#define PCI_DEVICE_ID_INTEL_IPU6EP_MTL 0x7d19
#define PCI_DEVICE_ID_INTEL_IPU7 0x645d
#define PCI_DEVICE_ID_INTEL_IPU7P5 0xb05d
+#define PCI_DEVICE_ID_INTEL_IPU8 0xd719
static const struct pci_device_id ipu6_pci_tbl[] = {
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IPU6) },
@@ -26,6 +27,7 @@ static const struct pci_device_id ipu6_pci_tbl[] = {
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IPU6EP_MTL) },
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IPU7) },
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IPU7P5) },
+ { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_IPU8) },
{ }
};
--
2.43.0