lkml.org 
[lkml]   [2012]   [May]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 5/7] amd_iommu: Make use of DMA quirks and ACS checks in IOMMU groups
    Date
    Work around broken devices and adhere to ACS support when determining
    IOMMU grouping.

    Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
    ---

    drivers/iommu/amd_iommu.c | 25 +++++++++++++++++++++++++
    1 file changed, 25 insertions(+)

    diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c
    index e072bd1..0e78d3c 100644
    --- a/drivers/iommu/amd_iommu.c
    +++ b/drivers/iommu/amd_iommu.c
    @@ -254,6 +254,14 @@ static bool check_device(struct device *dev)
    return true;
    }

    +static void swap_pci_ref(struct pci_dev **from, struct pci_dev *to)
    +{
    + pci_dev_put(*from);
    + *from = to;
    +}
    +
    +#define REQ_ACS_FLAGS (PCI_ACS_SV | PCI_ACS_RR | PCI_ACS_CR | PCI_ACS_UF)
    +
    static int iommu_init_device(struct device *dev)
    {
    struct pci_dev *dma_pdev, *pdev = to_pci_dev(dev);
    @@ -286,6 +294,23 @@ static int iommu_init_device(struct device *dev)
    } else
    dma_pdev = pci_dev_get(pdev);

    + swap_pci_ref(&dma_pdev, pci_get_dma_source(dma_pdev));
    +
    + if (dma_pdev->multifunction &&
    + !pci_acs_enabled(dma_pdev, REQ_ACS_FLAGS))
    + swap_pci_ref(&dma_pdev,
    + pci_get_slot(dma_pdev->bus,
    + PCI_DEVFN(PCI_SLOT(dma_pdev->devfn),
    + 0)));
    +
    + while (!pci_is_root_bus(dma_pdev->bus)) {
    + if (pci_acs_path_enabled(dma_pdev->bus->self,
    + NULL, REQ_ACS_FLAGS))
    + break;
    +
    + swap_pci_ref(&dma_pdev, pci_dev_get(dma_pdev->bus->self));
    + }
    +
    group = iommu_group_get(&dma_pdev->dev);
    pci_dev_put(dma_pdev);
    if (!group) {


    \
     
     \ /
      Last update: 2012-05-30 22:41    [W:0.028 / U:0.564 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site