Messages in this thread Patch in this message | | | Subject | Re: [PATCH V2 5/5] DO NOT MERGE: iommu: disable list appending in dma-iommu | From | Lu Baolu <> | Date | Wed, 9 Sep 2020 09:43:09 +0800 |
| |
Hi Christoph,
On 9/8/20 2:23 PM, Christoph Hellwig wrote: > On Tue, Sep 08, 2020 at 02:04:53PM +0800, Lu Baolu wrote: >> Do you mind telling where can I find Marek's series? > > [PATCH v10 00/30] DRM: fix struct sg_table nents vs. orig_nents misuse > > on various lists including the iommu one. >
It seems that more work is needed in i915 driver. I will added below quirk as you suggested.
--- a/drivers/iommu/dma-iommu.c +++ b/drivers/iommu/dma-iommu.c @@ -851,6 +851,31 @@ static int __finalise_sg(struct device *dev, struct scatterlist *sg, int nents, unsigned int cur_len = 0, max_len = dma_get_max_seg_size(dev); int i, count = 0;
+ /* + * The Intel graphic device driver is used to assume that the returned + * sg list is not combound. This blocks the efforts of converting the + * Intel IOMMU driver to dma-iommu api's. Add this quirk to make the + * device driver work and should be removed once it's fixed in i915 + * driver. + */ + if (dev_is_pci(dev) && + to_pci_dev(dev)->vendor == PCI_VENDOR_ID_INTEL && + (to_pci_dev(dev)->class >> 16) == PCI_BASE_CLASS_DISPLAY) { + for_each_sg(sg, s, nents, i) { + unsigned int s_iova_off = sg_dma_address(s); + unsigned int s_length = sg_dma_len(s); + unsigned int s_iova_len = s->length; + + s->offset += s_iova_off; + s->length = s_length; + sg_dma_address(s) = dma_addr + s_iova_off; + sg_dma_len(s) = s_length; + dma_addr += s_iova_len; + } + + return nents; + } +
Best regards, baolu
| |