On Thu Aug 27 15:33:30 2026 +0300, Antti Laakso wrote:
> Make ipu6_map_fw_region reusable as for ipu7 we want to map other
> buffers too, not only firmware. Also add DMA data direction and mapping
> attributes as arguments as these are different for ipu7.
> 
> 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-buttress.c | 40 ++++++++++++++--------------
 drivers/media/pci/intel/ipu6/ipu6-buttress.h | 10 +++----
 drivers/media/pci/intel/ipu6/ipu6-isys.c     |  7 ++---
 drivers/media/pci/intel/ipu6/ipu6.c          |  8 +++---
 4 files changed, 33 insertions(+), 32 deletions(-)

---

diff --git a/drivers/media/pci/intel/ipu6/ipu6-buttress.c 
b/drivers/media/pci/intel/ipu6/ipu6-buttress.c
index 13fd7a083b25..74db0a37561e 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-buttress.c
+++ b/drivers/media/pci/intel/ipu6/ipu6-buttress.c
@@ -676,55 +676,55 @@ int ipu6_buttress_reset_authentication(struct ipu6_device 
*isp)
        return 0;
 }
 
-int ipu6_buttress_map_fw_image(struct ipu6_bus_device *sys,
-                              const struct firmware *fw, struct sg_table *sgt)
+int ipu6_map_fw_region(struct ipu6_bus_device *sys, const void *data,
+                      size_t size, enum dma_data_direction dir,
+                      unsigned long attrs)
 {
-       bool is_vmalloc = is_vmalloc_addr(fw->data);
+       bool is_vmalloc = is_vmalloc_addr(data);
        struct pci_dev *pdev = sys->isp->pdev;
+       struct sg_table *sgt = &sys->fw_sgt;
        struct page **pages;
-       const void *addr;
        unsigned long n_pages;
        unsigned int i;
        int ret;
 
-       if (!is_vmalloc && !virt_addr_valid(fw->data))
+       if (!is_vmalloc && !virt_addr_valid(data))
                return -EDOM;
 
-       n_pages = PFN_UP(fw->size);
+       n_pages = PFN_UP(size);
 
        pages = kmalloc_objs(*pages, n_pages);
        if (!pages)
                return -ENOMEM;
 
-       addr = fw->data;
        for (i = 0; i < n_pages; i++) {
                struct page *p = is_vmalloc ?
-                       vmalloc_to_page(addr) : virt_to_page(addr);
+                       vmalloc_to_page(data) : virt_to_page(data);
 
                if (!p) {
                        ret = -ENOMEM;
                        goto out;
                }
                pages[i] = p;
-               addr += PAGE_SIZE;
+               data += PAGE_SIZE;
        }
 
-       ret = sg_alloc_table_from_pages(sgt, pages, n_pages, 0, fw->size,
+       ret = sg_alloc_table_from_pages(sgt, pages, n_pages, 0, size,
                                        GFP_KERNEL);
        if (ret) {
                ret = -ENOMEM;
                goto out;
        }
 
-       ret = dma_map_sgtable(&pdev->dev, sgt, DMA_TO_DEVICE, 0);
+       ret = dma_map_sgtable(&pdev->dev, sgt, dir, 0);
        if (ret) {
                sg_free_table(sgt);
                goto out;
        }
 
-       ret = ipu6_dma_map_sgtable(sys, sgt, DMA_TO_DEVICE, 0);
+       ret = ipu6_dma_map_sgtable(sys, sgt, dir, attrs);
        if (ret) {
-               dma_unmap_sgtable(&pdev->dev, sgt, DMA_TO_DEVICE, 0);
+               dma_unmap_sgtable(&pdev->dev, sgt, dir, 0);
                sg_free_table(sgt);
                goto out;
        }
@@ -736,18 +736,18 @@ out:
 
        return ret;
 }
-EXPORT_SYMBOL_NS_GPL(ipu6_buttress_map_fw_image, "INTEL_IPU6");
+EXPORT_SYMBOL_NS_GPL(ipu6_map_fw_region, "INTEL_IPU6");
 
-void ipu6_buttress_unmap_fw_image(struct ipu6_bus_device *sys,
-                                 struct sg_table *sgt)
+void ipu6_unmap_fw_region(struct ipu6_bus_device *sys,
+                         enum dma_data_direction dir)
 {
        struct pci_dev *pdev = sys->isp->pdev;
 
-       ipu6_dma_unmap_sgtable(sys, sgt, DMA_TO_DEVICE, 0);
-       dma_unmap_sgtable(&pdev->dev, sgt, DMA_TO_DEVICE, 0);
-       sg_free_table(sgt);
+       ipu6_dma_unmap_sgtable(sys, &sys->fw_sgt, dir, 0);
+       dma_unmap_sgtable(&pdev->dev, &sys->fw_sgt, dir, 0);
+       sg_free_table(&sys->fw_sgt);
 }
-EXPORT_SYMBOL_NS_GPL(ipu6_buttress_unmap_fw_image, "INTEL_IPU6");
+EXPORT_SYMBOL_NS_GPL(ipu6_unmap_fw_region, "INTEL_IPU6");
 
 int ipu6_buttress_authenticate(struct ipu6_device *isp)
 {
diff --git a/drivers/media/pci/intel/ipu6/ipu6-buttress.h 
b/drivers/media/pci/intel/ipu6/ipu6-buttress.h
index 47a49e961945..79d8f5893686 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-buttress.h
+++ b/drivers/media/pci/intel/ipu6/ipu6-buttress.h
@@ -84,11 +84,11 @@ struct ipu6_ipc_buttress_bulk_msg {
 };
 
 int ipu6_buttress_ipc_reset(struct ipu6_device *isp);
-int ipu6_buttress_map_fw_image(struct ipu6_bus_device *sys,
-                              const struct firmware *fw,
-                              struct sg_table *sgt);
-void ipu6_buttress_unmap_fw_image(struct ipu6_bus_device *sys,
-                                 struct sg_table *sgt);
+int ipu6_map_fw_region(struct ipu6_bus_device *sys, const void *data,
+                      size_t size, enum dma_data_direction dir,
+                      unsigned long attrs);
+void ipu6_unmap_fw_region(struct ipu6_bus_device *sys,
+                         enum dma_data_direction dir);
 int ipu6_buttress_power(struct device *dev,
                        const struct ipu6_buttress_ctrl *ctrl, bool on);
 bool ipu6_buttress_get_secure_mode(struct ipu6_device *isp);
diff --git a/drivers/media/pci/intel/ipu6/ipu6-isys.c 
b/drivers/media/pci/intel/ipu6/ipu6-isys.c
index 5a3ba5007249..459121e6c1cb 100644
--- a/drivers/media/pci/intel/ipu6/ipu6-isys.c
+++ b/drivers/media/pci/intel/ipu6/ipu6-isys.c
@@ -1042,7 +1042,8 @@ static int isys_probe(struct auxiliary_device *auxdev,
 
        if (!isp->secure_mode) {
                fw = isp->cpd_fw;
-               ret = ipu6_buttress_map_fw_image(adev, fw, &adev->fw_sgt);
+               ret = ipu6_map_fw_region(adev, fw->data, fw->size,
+                                        DMA_TO_DEVICE, 0);
                if (ret)
                        goto release_firmware;
 
@@ -1082,7 +1083,7 @@ out_remove_pkg_dir_shared_buffer:
                ipu6_cpd_free_pkg_dir(adev);
 remove_shared_buffer:
        if (!isp->secure_mode)
-               ipu6_buttress_unmap_fw_image(adev, &adev->fw_sgt);
+               ipu6_unmap_fw_region(adev, DMA_TO_DEVICE);
 release_firmware:
        if (!isp->secure_mode)
                release_firmware(adev->fw);
@@ -1112,7 +1113,7 @@ static void isys_remove(struct auxiliary_device *auxdev)
 
        if (!isp->secure_mode) {
                ipu6_cpd_free_pkg_dir(adev);
-               ipu6_buttress_unmap_fw_image(adev, &adev->fw_sgt);
+               ipu6_unmap_fw_region(adev, DMA_TO_DEVICE);
                release_firmware(adev->fw);
        }
 
diff --git a/drivers/media/pci/intel/ipu6/ipu6.c 
b/drivers/media/pci/intel/ipu6/ipu6.c
index 428ad046e239..af5581da7149 100644
--- a/drivers/media/pci/intel/ipu6/ipu6.c
+++ b/drivers/media/pci/intel/ipu6/ipu6.c
@@ -624,8 +624,8 @@ static int ipu6_pci_probe(struct pci_dev *pdev, const 
struct pci_device_id *id)
                goto out_ipu6_rpm_put;
        }
 
-       ret = ipu6_buttress_map_fw_image(isp->psys, isp->cpd_fw,
-                                        &isp->psys->fw_sgt);
+       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;
@@ -679,7 +679,7 @@ out_ipu6_rpm_put:
 out_ipu6_bus_del_devices:
        if (!IS_ERR_OR_NULL(isp->psys)) {
                ipu6_cpd_free_pkg_dir(isp->psys);
-               ipu6_buttress_unmap_fw_image(isp->psys, &isp->psys->fw_sgt);
+               ipu6_unmap_fw_region(isp->psys, DMA_TO_DEVICE);
        }
        if (!IS_ERR_OR_NULL(isp->psys) && !IS_ERR_OR_NULL(isp->psys->mmu))
                ipu6_mmu_cleanup(isp->psys->mmu);
@@ -702,7 +702,7 @@ static void ipu6_pci_remove(struct pci_dev *pdev)
        devm_free_irq(&pdev->dev, pdev->irq, isp);
        ipu6_cpd_free_pkg_dir(isp->psys);
 
-       ipu6_buttress_unmap_fw_image(isp->psys, &isp->psys->fw_sgt);
+       ipu6_unmap_fw_region(isp->psys, DMA_TO_DEVICE);
        ipu6_buttress_exit(isp);
 
        ipu6_bus_del_devices(pdev);
_______________________________________________
linuxtv-commits mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to