[PATCH 1/2] iommu/riscv: Map IMSIC addresses for paging domains
Jason Gunthorpe
jgg at nvidia.com
Tue May 12 06:38:54 PDT 2026
On Fri, May 08, 2026 at 04:23:38PM -0500, Andrew Jones wrote:
> +static void riscv_iommu_get_resv_regions(struct device *dev, struct list_head *head)
> +{
> + const struct imsic_global_config *imsic_global;
> + unsigned int cpu;
> +
> + if (!imsic_enabled())
> + return;
> +
> + imsic_global = imsic_get_global_config();
> +
> + for_each_possible_cpu(cpu) {
> + const struct imsic_local_config *local;
> + struct iommu_resv_region *reg;
> +
> + local = per_cpu_ptr(imsic_global->local, cpu);
> + if (!local->msi_va)
> + continue;
> +
> + /*
> + * The device always writes to the host physical IMSIC address, so install
> + * identity mappings directly. Use IOMMU_RESV_DIRECT_RELAXABLE instead of
> + * IOMMU_RESV_DIRECT since these 1:1 mappings are not required for assigned
> + * devices.
Oh? Why not?
> + reg = iommu_alloc_resv_region(local->msi_pa, IMSIC_MMIO_PAGE_SZ,
> + IOMMU_WRITE | IOMMU_NOEXEC | IOMMU_MMIO,
> + IOMMU_RESV_DIRECT_RELAXABLE, GFP_KERNEL);
> + if (reg)
> + list_add_tail(®->list, head);
This seems like quite a hack, the ARM was seems much better, the
interrupt controller should be using the iommu_dma_prepare_msi() path
to obtain an appropriately translated MSI address for the aperture.
Then things will work correctly with VFIO too.
Jason
More information about the linux-riscv
mailing list