Messages in this thread |  | | Subject | Re: [PATCH 1/8] iommu/vt-d: clean up 32bit si_domain assignment | | From | Lu Baolu <> | | Date | Mon, 23 Dec 2019 11:00:47 +0800 |
| |
Hi,
On 12/21/19 11:03 PM, Tom Murphy wrote: > @@ -5618,9 +5583,13 @@ static int intel_iommu_add_device(struct device *dev) > struct iommu_domain *domain; > struct intel_iommu *iommu; > struct iommu_group *group; > + u64 dma_mask = *dev->dma_mask; > u8 bus, devfn; > int ret; > > + if (dev->coherent_dma_mask && dev->coherent_dma_mask < dma_mask) > + dma_mask = dev->coherent_dma_mask; > + > iommu = device_to_iommu(dev, &bus, &devfn); > if (!iommu) > return -ENODEV; > @@ -5640,7 +5609,12 @@ static int intel_iommu_add_device(struct device *dev) > domain = iommu_get_domain_for_dev(dev); > dmar_domain = to_dmar_domain(domain); > if (domain->type == IOMMU_DOMAIN_DMA) { > - if (device_def_domain_type(dev) == IOMMU_DOMAIN_IDENTITY) { > + /* > + * We check dma_mask >= dma_get_required_mask(dev) because > + * 32 bit DMA falls back to non-identity mapping. > + */ > + if (device_def_domain_type(dev) == IOMMU_DOMAIN_IDENTITY && > + dma_mask >= dma_get_required_mask(dev)) { > ret = iommu_request_dm_for_dev(dev); > if (ret) { > dmar_remove_one_dev_info(dev);
dev->dma_mask is set to 32bit by default. During loading driver, it sets the real dma_mask with dma_set_mask() according to the real capability. Here you will always see 32bit dma_mask for each device.
Best regards, baolu
|  |