On 2021-11-16 09:06, Yicong Yang via iommu wrote:
[...]
+/*
+ * Get RMR address if provided by the firmware.
+ * Return 0 if the IOMMU doesn't present or the policy of the
+ * IOMMU domain is passthrough or we get a usable RMR region.
+ * Otherwise a negative value is returned.
+ */
+static int hisi_ptt_get_rmr(struct hisi_ptt *hisi_ptt)
+{
+       struct pci_dev *pdev = hisi_ptt->pdev;
+       struct iommu_domain *iommu_domain;
+       struct iommu_resv_region *region;
+       LIST_HEAD(list);
+
+       /*
+        * Use direct DMA if IOMMU does not present or the policy of the
+        * IOMMU domain is passthrough.
+        */
+       iommu_domain = iommu_get_domain_for_dev(&pdev->dev);
+       if (!iommu_domain || iommu_domain->type == IOMMU_DOMAIN_IDENTITY)
+               return 0;
+
+       iommu_get_resv_regions(&pdev->dev, &list);
+       list_for_each_entry(region, &list, list)
+               if (region->type == IOMMU_RESV_DIRECT &&
+                   region->length >= HISI_PTT_TRACE_BUFFER_SIZE) {
+                       hisi_ptt->trace_ctrl.has_rmr = true;
+                       hisi_ptt->trace_ctrl.rmr_addr = region->start;
+                       hisi_ptt->trace_ctrl.rmr_length = region->length;
+                       break;
+               }
+
+       iommu_put_resv_regions(&pdev->dev, &list);
+       return hisi_ptt->trace_ctrl.has_rmr ? 0 : -ENOMEM;
+}

No.

The whole point of RMRs is for devices that are already configured to access the given address range in a manner beyond the kernel's control. If you can do this, it proves that you should not have an RMR in the first place.

The notion of a kernel driver explicitly configuring its device to DMA into any random RMR that looks big enough is so egregiously wrong that I'm almost lost for words...

Robin.
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

Reply via email to