struct caam_queue_if __iomem *qi; /* QI control region */
        struct caam_job_ring __iomem *jr[4];    /* JobR's register space */
 
+       struct iommu_domain *domain;
+
        /*
         * Detected geometry block. Filled in from device tree if powerpc,
         * or from register-based version detection code
 
  */
 static struct kmem_cache *qi_cache;
 
+static void *caam_iova_to_virt(struct iommu_domain *domain,
+                              dma_addr_t iova_addr)
+{
+       phys_addr_t phys_addr;
+
+       phys_addr = domain ? iommu_iova_to_phys(domain, iova_addr) : iova_addr;
+
+       return phys_to_virt(phys_addr);
+}
+
 int caam_qi_enqueue(struct device *qidev, struct caam_drv_req *req)
 {
        struct qm_fd fd;
        const struct qm_fd *fd;
        struct caam_drv_req *drv_req;
        struct device *qidev = &(raw_cpu_ptr(&pcpu_qipriv)->net_dev.dev);
+       struct caam_drv_private *priv = dev_get_drvdata(qidev);
 
        fd = &msg->ern.fd;
 
                return;
        }
 
-       drv_req = (struct caam_drv_req *)phys_to_virt(qm_fd_addr_get64(fd));
+       drv_req = caam_iova_to_virt(priv->domain, qm_fd_addr_get64(fd));
        if (!drv_req) {
                dev_err(qidev,
                        "Can't find original request for CAAM response\n");
        struct caam_drv_req *drv_req;
        const struct qm_fd *fd;
        struct device *qidev = &(raw_cpu_ptr(&pcpu_qipriv)->net_dev.dev);
+       struct caam_drv_private *priv = dev_get_drvdata(qidev);
        u32 status;
 
        if (caam_qi_napi_schedule(p, caam_napi))
                return qman_cb_dqrr_consume;
        }
 
-       drv_req = (struct caam_drv_req *)phys_to_virt(qm_fd_addr_get64(fd));
+       drv_req = caam_iova_to_virt(priv->domain, qm_fd_addr_get64(fd));
        if (unlikely(!drv_req)) {
                dev_err(qidev,
                        "Can't find original request for caam response\n");