diff --git a/dkms.conf b/dkms.conf index fee5f111..8d3fbebc 100644 --- a/dkms.conf +++ b/dkms.conf @@ -78,6 +78,8 @@ PATCH[$((++j))]="7.0/0066-media-ipu7-Clean-csi2-fwnode-ep-when-destroying-v4l2.p PATCH_MATCH[$j]="^(7\.0)" PATCH[$((++j))]="0067-media-ipu7-sync-acpi-csi2-config-abi.patch" PATCH_MATCH[$j]="^(6.1[78]|7\.0)" +PATCH[$((++j))]="0068-media-ipu7-set-csi2-port-count-by-hardware.patch" +PATCH_MATCH[$j]="^(6.1[78]|7\.0)" PATCH[$((++j))]="0100-media-ipu7-isys-let-v4l2-set-default-colorspace.patch" PATCH_MATCH[$j]="^(6.1[7])" PATCH[$((++j))]="6.18/0100-media-ipu7-isys-let-v4l2-set-default-colorspace.patch" diff --git a/patches/0068-media-ipu7-set-csi2-port-count-by-hardware.patch b/patches/0068-media-ipu7-set-csi2-port-count-by-hardware.patch new file mode 100644 index 00000000..e76d2db0 --- /dev/null +++ b/patches/0068-media-ipu7-set-csi2-port-count-by-hardware.patch @@ -0,0 +1,66 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Khai Wen, Ng +Date: Mon, 21 Sep 2026 00:00:00 +0000 +Subject: [PATCH] media: ipu7: set CSI2 port count by hardware version + +IPU7 provides four CSI2 ports, while IPU7P5 and IPU8 provide three. +The common platform data initialization currently uses the four-entry +offset table for every hardware version, causing an invalid fourth CSI2 +entity to be registered on IPU7P5 and IPU8. + +Pass the PCI-selected hardware version to the platform data initializer +and set the number of ports accordingly. + +Signed-off-by: Khai Wen, Ng + +--- + drivers/media/pci/intel/ipu7/ipu7.c | 12 +++++++++--- + drivers/media/pci/intel/ipu7/ipu7.h | 3 ++- + 2 files changed, 11 insertions(+), 4 deletions(-) + +diff --git a/ipu7-drivers/drivers/media/pci/intel/ipu7/ipu7.c b/ipu7-drivers/drivers/media/pci/intel/ipu7/ipu7.c +index 18aebd0..156ff42 100644 +--- a/ipu7-drivers/drivers/media/pci/intel/ipu7/ipu7.c ++++ b/ipu7-drivers/drivers/media/pci/intel/ipu7/ipu7.c +@@ -2110,9 +2110,15 @@ static const struct ipu_buttress_ctrl ipu8_psys_buttress_ctrl = { + }; + + void ipu_internal_pdata_init(struct ipu_isys_internal_pdata *isys_ipdata, +- struct ipu_psys_internal_pdata *psys_ipdata) ++ struct ipu_psys_internal_pdata *psys_ipdata, ++ u8 hw_ver) + { +- isys_ipdata->csi2.nports = ARRAY_SIZE(ipu7_csi_offsets); ++ if (is_ipu7(hw_ver)) ++ isys_ipdata->csi2.nports = 4; ++ else if (is_ipu7p5(hw_ver) || is_ipu8(hw_ver)) ++ isys_ipdata->csi2.nports = 3; ++ else ++ isys_ipdata->csi2.nports = 0; + isys_ipdata->csi2.offsets = ipu7_csi_offsets; + isys_ipdata->num_parallel_streams = IPU7_ISYS_NUM_STREAMS; + psys_ipdata->hw_variant.spc_offset = IPU7_PSYS_SPC_OFFSET; +@@ -2571,7 +2577,7 @@ static int ipu7_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) + return -ENODEV; + } + +- ipu_internal_pdata_init(isys_ipdata, psys_ipdata); ++ ipu_internal_pdata_init(isys_ipdata, psys_ipdata, isp->hw_ver); + + isys_base = isp->base + isys_ipdata->hw_variant.offset; + psys_base = isp->base + psys_ipdata->hw_variant.offset; +diff --git a/ipu7-drivers/drivers/media/pci/intel/ipu7/ipu7.h b/ipu7-drivers/drivers/media/pci/intel/ipu7/ipu7.h +index b48bc1d..cd97e3d 100644 +--- a/ipu7-drivers/drivers/media/pci/intel/ipu7/ipu7.h ++++ b/ipu7-drivers/drivers/media/pci/intel/ipu7/ipu7.h +@@ -244,6 +244,7 @@ struct ipu7_psys_pdata { + int request_cpd_fw(const struct firmware **firmware_p, const char *name, + struct device *device); + void ipu_internal_pdata_init(struct ipu_isys_internal_pdata *isys_ipdata, +- struct ipu_psys_internal_pdata *psys_ipdata); ++ struct ipu_psys_internal_pdata *psys_ipdata, ++ u8 hw_ver); + void ipu7_dump_fw_error_log(const struct ipu7_bus_device *adev); + #endif /* IPU7_H */ +-- +2.51.1