On Thu Aug 27 15:33:31 2026 +0300, Antti Laakso wrote:
> Consolidate isys and psys firmware mapping into a single location to
> simplify ipu7 support and error handling.
>
> Signed-off-by: Antti Laakso <[email protected]>
> Signed-off-by: Sakari Ailus <[email protected]>
Patch committed.
Thanks,
Sakari Ailus
drivers/media/pci/intel/ipu6/ipu6-bus.h | 1 -
drivers/media/pci/intel/ipu6/ipu6-isys.c | 29 -------------
drivers/media/pci/intel/ipu6/ipu6.c | 71 ++++++++++++++++++++++++--------
3 files changed, 54 insertions(+), 47 deletions(-)
---
diff --git a/drivers/media/pci/intel/ipu6/ipu6-bus.h
b/drivers/media/pci/intel/ipu6/ipu6-bus.h
index aef8e4a66c4a..d2f93eb03dea 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-bus.h
+++ b/drivers/media/pci/intel/ipu6/ipu6-bus.h
@@ -26,7 +26,6 @@ struct ipu6_bus_device {
struct ipu6_mmu *mmu;
struct ipu6_device *isp;
const struct ipu6_buttress_ctrl *ctrl;
- const struct firmware *fw;
struct sg_table fw_sgt;
u64 *pkg_dir;
dma_addr_t pkg_dir_dma_addr;
diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys.c
b/drivers/media/pci/intel/ipu6/ipu6-isys.c
index 459121e6c1cb..3fb34d2d189c 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys.c
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys.c
@@ -995,7 +995,6 @@ static int isys_probe(struct auxiliary_device *auxdev,
const struct ipu6_isys_internal_csi2_pdata *csi2_pdata;
struct ipu6_bus_device *adev = auxdev_to_adev(auxdev);
struct ipu6_device *isp = adev->isp;
- const struct firmware *fw;
struct ipu6_isys *isys;
unsigned int i;
int ret;
@@ -1040,18 +1039,6 @@ static int isys_probe(struct auxiliary_device *auxdev,
isys_stream_init(isys);
- if (!isp->secure_mode) {
- fw = isp->cpd_fw;
- ret = ipu6_map_fw_region(adev, fw->data, fw->size,
- DMA_TO_DEVICE, 0);
- if (ret)
- goto release_firmware;
-
- ret = ipu6_cpd_create_pkg_dir(adev, isp->cpd_fw->data);
- if (ret)
- goto remove_shared_buffer;
- }
-
cpu_latency_qos_add_request(&isys->pm_qos, PM_QOS_DEFAULT_VALUE);
ret = alloc_fw_msg_bufs(isys, 20);
@@ -1079,14 +1066,6 @@ free_fw_msg_bufs:
free_fw_msg_bufs(isys);
out_remove_pkg_dir_shared_buffer:
cpu_latency_qos_remove_request(&isys->pm_qos);
- if (!isp->secure_mode)
- ipu6_cpd_free_pkg_dir(adev);
-remove_shared_buffer:
- if (!isp->secure_mode)
- ipu6_unmap_fw_region(adev, DMA_TO_DEVICE);
-release_firmware:
- if (!isp->secure_mode)
- release_firmware(adev->fw);
for (i = 0; i < IPU6_ISYS_MAX_STREAMS; i++)
mutex_destroy(&isys->streams[i].mutex);
@@ -1099,9 +1078,7 @@ release_firmware:
static void isys_remove(struct auxiliary_device *auxdev)
{
- struct ipu6_bus_device *adev = auxdev_to_adev(auxdev);
struct ipu6_isys *isys = dev_get_drvdata(&auxdev->dev);
- struct ipu6_device *isp = adev->isp;
unsigned int i;
free_fw_msg_bufs(isys);
@@ -1111,12 +1088,6 @@ static void isys_remove(struct auxiliary_device *auxdev)
cpu_latency_qos_remove_request(&isys->pm_qos);
- if (!isp->secure_mode) {
- ipu6_cpd_free_pkg_dir(adev);
- ipu6_unmap_fw_region(adev, DMA_TO_DEVICE);
- release_firmware(adev->fw);
- }
-
for (i = 0; i < IPU6_ISYS_MAX_STREAMS; i++)
mutex_destroy(&isys->streams[i].mutex);
diff --git a/drivers/media/pci/intel/ipu6/ipu6.c
b/drivers/media/pci/intel/ipu6/ipu6.c
index af5581da7149..6e1d3b7efa20 100644
--- a/drivers/media/pci/intel/ipu6/ipu6.c
+++ b/drivers/media/pci/intel/ipu6/ipu6.c
@@ -480,6 +480,42 @@ static void ipu6_configure_vc_mechanism(struct ipu6_device
*isp)
writel(val, isp->base + BUTTRESS_REG_BTRS_CTRL);
}
+static int __ipu6_map_fw_by_sys(struct ipu6_device *isp, struct
ipu6_bus_device *adev)
+{
+ int ret;
+
+ ret = ipu6_map_fw_region(adev, isp->cpd_fw->data, isp->cpd_fw->size,
+ DMA_TO_DEVICE, 0);
+ if (ret) {
+ dev_err_probe(&isp->pdev->dev, ret,
+ "Firmware mapping failed\n");
+ return ret;
+ }
+
+ ret = ipu6_cpd_create_pkg_dir(adev, isp->cpd_fw->data);
+ if (ret) {
+ dev_err_probe(&isp->pdev->dev, ret,
+ "failed to create pkg dir\n");
+ return ret;
+ }
+
+ return 0;
+}
+
+static int ipu6_map_fw(struct ipu6_device *isp)
+{
+ int ret;
+
+ ret = __ipu6_map_fw_by_sys(isp, isp->psys);
+ if (ret)
+ return ret;
+
+ if (!isp->secure_mode)
+ return __ipu6_map_fw_by_sys(isp, isp->isys);
+
+ return 0;
+}
+
static int ipu6_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
{
const struct ipu6_buttress_ctrl *isys_ctrl, *psys_ctrl;
@@ -624,19 +660,9 @@ static int ipu6_pci_probe(struct pci_dev *pdev, const
struct pci_device_id *id)
goto out_ipu6_rpm_put;
}
- ret = ipu6_map_fw_region(isp->psys, isp->cpd_fw->data,
- isp->cpd_fw->size, DMA_TO_DEVICE, 0);
- if (ret) {
- dev_err_probe(&isp->pdev->dev, ret, "failed to map fw image\n");
- goto out_ipu6_rpm_put;
- }
-
- ret = ipu6_cpd_create_pkg_dir(isp->psys, isp->cpd_fw->data);
- if (ret) {
- dev_err_probe(&isp->pdev->dev, ret,
- "failed to create pkg dir\n");
+ ret = ipu6_map_fw(isp);
+ if (ret)
goto out_ipu6_rpm_put;
- }
ret = devm_request_threaded_irq(dev, pdev->irq, ipu6_buttress_isr,
ipu6_buttress_isr_threaded,
@@ -679,7 +705,13 @@ out_ipu6_rpm_put:
out_ipu6_bus_del_devices:
if (!IS_ERR_OR_NULL(isp->psys)) {
ipu6_cpd_free_pkg_dir(isp->psys);
- ipu6_unmap_fw_region(isp->psys, DMA_TO_DEVICE);
+ if (isp->psys->fw_sgt.nents)
+ ipu6_unmap_fw_region(isp->psys, DMA_TO_DEVICE);
+ }
+ if (!IS_ERR_OR_NULL(isp->isys)) {
+ ipu6_cpd_free_pkg_dir(isp->isys);
+ if (isp->isys->fw_sgt.nents)
+ ipu6_unmap_fw_region(isp->isys, DMA_TO_DEVICE);
}
if (!IS_ERR_OR_NULL(isp->psys) && !IS_ERR_OR_NULL(isp->psys->mmu))
ipu6_mmu_cleanup(isp->psys->mmu);
@@ -696,13 +728,18 @@ buttress_exit:
static void ipu6_pci_remove(struct pci_dev *pdev)
{
struct ipu6_device *isp = pci_get_drvdata(pdev);
- struct ipu6_mmu *isys_mmu = isp->isys->mmu;
- struct ipu6_mmu *psys_mmu = isp->psys->mmu;
devm_free_irq(&pdev->dev, pdev->irq, isp);
ipu6_cpd_free_pkg_dir(isp->psys);
ipu6_unmap_fw_region(isp->psys, DMA_TO_DEVICE);
+
+ if (isp->isys) {
+ ipu6_cpd_free_pkg_dir(isp->isys);
+ if (isp->isys->fw_sgt.nents)
+ ipu6_unmap_fw_region(isp->isys, DMA_TO_DEVICE);
+ }
+
ipu6_buttress_exit(isp);
ipu6_bus_del_devices(pdev);
@@ -712,8 +749,8 @@ static void ipu6_pci_remove(struct pci_dev *pdev)
release_firmware(isp->cpd_fw);
- ipu6_mmu_cleanup(psys_mmu);
- ipu6_mmu_cleanup(isys_mmu);
+ ipu6_mmu_cleanup(isp->psys->mmu);
+ ipu6_mmu_cleanup(isp->isys->mmu);
}
static void ipu6_pci_reset_prepare(struct pci_dev *pdev)
_______________________________________________
linuxtv-commits mailing list -- [email protected]
To unsubscribe send an email to [email protected]