Message ID | 1483643086-2883-9-git-send-email-eric.auger@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Thu, Jan 05, 2017 at 07:04:36PM +0000, Eric Auger wrote: > +static void intel_iommu_get_resv_regions(struct device *device, > + struct list_head *head) > +{ > + struct iommu_resv_region *reg; > + > + reg = iommu_alloc_resv_region(IOAPIC_RANGE_START, > + IOAPIC_RANGE_END - IOAPIC_RANGE_START + 1, > + 0, IOMMU_RESV_NOMAP); > + if (!reg) > + return; > + list_add_tail(®->list, head); > +} That is different from what AMD does, can you also report the RMRR regions for the device here (as direct-map regions)? Joerg
Hi Joerg, On 06/01/2017 12:01, Joerg Roedel wrote: > On Thu, Jan 05, 2017 at 07:04:36PM +0000, Eric Auger wrote: >> +static void intel_iommu_get_resv_regions(struct device *device, >> + struct list_head *head) >> +{ >> + struct iommu_resv_region *reg; >> + >> + reg = iommu_alloc_resv_region(IOAPIC_RANGE_START, >> + IOAPIC_RANGE_END - IOAPIC_RANGE_START + 1, >> + 0, IOMMU_RESV_NOMAP); >> + if (!reg) >> + return; >> + list_add_tail(®->list, head); >> +} > > That is different from what AMD does, can you also report the RMRR > regions for the device here (as direct-map regions)? if I return RMRR regions as direct mapped regions, iommu_group_create_direct_mappings will perform the 1-1 mapping. I am not familiar with the intel-iommu code but I guess this job currently is done in the intel driver: iommu_prepare_rmrr_dev -> iommu_prepare_identity_map ->domain_prepare_identity_map -> iommu_domain_identity_map? What is your feeling? Thanks Eric > > > > Joerg >
On Fri, Jan 06, 2017 at 12:45:54PM +0100, Auger Eric wrote: > On 06/01/2017 12:01, Joerg Roedel wrote: > > On Thu, Jan 05, 2017 at 07:04:36PM +0000, Eric Auger wrote: > > That is different from what AMD does, can you also report the RMRR > > regions for the device here (as direct-map regions)? > > if I return RMRR regions as direct mapped regions, > iommu_group_create_direct_mappings will perform the 1-1 mapping. No, this will not happen until the Intel IOMMU driver returns valid IOMMU_DOMAIN_DMA type domains. > I am not familiar with the intel-iommu code but I guess this job > currently is done in the intel driver: > iommu_prepare_rmrr_dev -> iommu_prepare_identity_map > ->domain_prepare_identity_map -> iommu_domain_identity_map? Right, this is done in the Intel driver atm. Joerg
Hi Joerg, On 06/01/2017 13:46, Joerg Roedel wrote: > On Fri, Jan 06, 2017 at 12:45:54PM +0100, Auger Eric wrote: >> On 06/01/2017 12:01, Joerg Roedel wrote: >>> On Thu, Jan 05, 2017 at 07:04:36PM +0000, Eric Auger wrote: > >>> That is different from what AMD does, can you also report the RMRR >>> regions for the device here (as direct-map regions)? >> >> if I return RMRR regions as direct mapped regions, >> iommu_group_create_direct_mappings will perform the 1-1 mapping. > > No, this will not happen until the Intel IOMMU driver returns valid > IOMMU_DOMAIN_DMA type domains. Hum OK thanks! Best Regards Eric > >> I am not familiar with the intel-iommu code but I guess this job >> currently is done in the intel driver: >> iommu_prepare_rmrr_dev -> iommu_prepare_identity_map >> ->domain_prepare_identity_map -> iommu_domain_identity_map? > > Right, this is done in the Intel driver atm. > > > > Joerg >
diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c index c66c273..4080207 100644 --- a/drivers/iommu/intel-iommu.c +++ b/drivers/iommu/intel-iommu.c @@ -5184,6 +5184,28 @@ static void intel_iommu_remove_device(struct device *dev) iommu_device_unlink(iommu->iommu_dev, dev); } +static void intel_iommu_get_resv_regions(struct device *device, + struct list_head *head) +{ + struct iommu_resv_region *reg; + + reg = iommu_alloc_resv_region(IOAPIC_RANGE_START, + IOAPIC_RANGE_END - IOAPIC_RANGE_START + 1, + 0, IOMMU_RESV_NOMAP); + if (!reg) + return; + list_add_tail(®->list, head); +} + +static void intel_iommu_put_resv_regions(struct device *dev, + struct list_head *head) +{ + struct iommu_resv_region *entry, *next; + + list_for_each_entry_safe(entry, next, head, list) + kfree(entry); +} + #ifdef CONFIG_INTEL_IOMMU_SVM int intel_iommu_enable_pasid(struct intel_iommu *iommu, struct intel_svm_dev *sdev) { @@ -5293,19 +5315,21 @@ struct intel_iommu *intel_svm_device_to_iommu(struct device *dev) #endif /* CONFIG_INTEL_IOMMU_SVM */ static const struct iommu_ops intel_iommu_ops = { - .capable = intel_iommu_capable, - .domain_alloc = intel_iommu_domain_alloc, - .domain_free = intel_iommu_domain_free, - .attach_dev = intel_iommu_attach_device, - .detach_dev = intel_iommu_detach_device, - .map = intel_iommu_map, - .unmap = intel_iommu_unmap, - .map_sg = default_iommu_map_sg, - .iova_to_phys = intel_iommu_iova_to_phys, - .add_device = intel_iommu_add_device, - .remove_device = intel_iommu_remove_device, - .device_group = pci_device_group, - .pgsize_bitmap = INTEL_IOMMU_PGSIZES, + .capable = intel_iommu_capable, + .domain_alloc = intel_iommu_domain_alloc, + .domain_free = intel_iommu_domain_free, + .attach_dev = intel_iommu_attach_device, + .detach_dev = intel_iommu_detach_device, + .map = intel_iommu_map, + .unmap = intel_iommu_unmap, + .map_sg = default_iommu_map_sg, + .iova_to_phys = intel_iommu_iova_to_phys, + .add_device = intel_iommu_add_device, + .remove_device = intel_iommu_remove_device, + .get_resv_regions = intel_iommu_get_resv_regions, + .put_resv_regions = intel_iommu_put_resv_regions, + .device_group = pci_device_group, + .pgsize_bitmap = INTEL_IOMMU_PGSIZES, }; static void quirk_iommu_g4x_gfx(struct pci_dev *dev)
This patch registers the [FEE0_0000h - FEF0_000h] 1MB MSI range as a reserved region. This will allow to report that range in the iommu-group sysfs. Signed-off-by: Eric Auger <eric.auger@redhat.com> --- RFCv2 -> RFCv3: - use get/put_resv_region callbacks. RFC v1 -> RFC v2: - fix intel_iommu_add_reserved_regions name - use IOAPIC_RANGE_START and IOAPIC_RANGE_END defines - return if the MSI region is already registered; --- drivers/iommu/intel-iommu.c | 50 +++++++++++++++++++++++++++++++++------------ 1 file changed, 37 insertions(+), 13 deletions(-)