diff options
author | Suthikulpanit, Suravee <Suravee.Suthikulpanit@amd.com> | 2015-10-28 18:50:54 -0400 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2015-11-06 19:29:22 -0500 |
commit | 29dbe1f0af88b4162d2b57e790db7a51ab061f35 (patch) | |
tree | cf2efa83990788cde278469df666cf2fbae7b9bc /drivers/pci | |
parent | 50230713b63941f4b6b562eea0834f751aa0801e (diff) |
PCI: ACPI: Add support for PCI device DMA coherency
This patch adds support for setting up PCI device DMA coherency from
ACPI _CCA object that should normally be specified in the DSDT node
of its PCI host bridge.
Signed-off-by: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Hanjun Guo <hanjun.guo@linaro.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'drivers/pci')
-rw-r--r-- | drivers/pci/probe.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index d35f83d80b15..064078e11017 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/module.h> | 13 | #include <linux/module.h> |
14 | #include <linux/cpumask.h> | 14 | #include <linux/cpumask.h> |
15 | #include <linux/pci-aspm.h> | 15 | #include <linux/pci-aspm.h> |
16 | #include <linux/acpi.h> | ||
16 | #include <asm-generic/pci-bridge.h> | 17 | #include <asm-generic/pci-bridge.h> |
17 | #include "pci.h" | 18 | #include "pci.h" |
18 | 19 | ||
@@ -1639,7 +1640,7 @@ static void pci_set_msi_domain(struct pci_dev *dev) | |||
1639 | * @dev: ptr to pci_dev struct of the PCI device | 1640 | * @dev: ptr to pci_dev struct of the PCI device |
1640 | * | 1641 | * |
1641 | * Function to update PCI devices's DMA configuration using the same | 1642 | * Function to update PCI devices's DMA configuration using the same |
1642 | * info from the OF node of host bridge's parent (if any). | 1643 | * info from the OF node or ACPI node of host bridge's parent (if any). |
1643 | */ | 1644 | */ |
1644 | static void pci_dma_configure(struct pci_dev *dev) | 1645 | static void pci_dma_configure(struct pci_dev *dev) |
1645 | { | 1646 | { |
@@ -1648,6 +1649,15 @@ static void pci_dma_configure(struct pci_dev *dev) | |||
1648 | if (IS_ENABLED(CONFIG_OF) && dev->dev.of_node) { | 1649 | if (IS_ENABLED(CONFIG_OF) && dev->dev.of_node) { |
1649 | if (bridge->parent) | 1650 | if (bridge->parent) |
1650 | of_dma_configure(&dev->dev, bridge->parent->of_node); | 1651 | of_dma_configure(&dev->dev, bridge->parent->of_node); |
1652 | } else if (has_acpi_companion(bridge)) { | ||
1653 | struct acpi_device *adev = to_acpi_device_node(bridge->fwnode); | ||
1654 | enum dev_dma_attr attr = acpi_get_dma_attr(adev); | ||
1655 | |||
1656 | if (attr == DEV_DMA_NOT_SUPPORTED) | ||
1657 | dev_warn(&dev->dev, "DMA not supported.\n"); | ||
1658 | else | ||
1659 | arch_setup_dma_ops(&dev->dev, 0, 0, NULL, | ||
1660 | attr == DEV_DMA_COHERENT); | ||
1651 | } | 1661 | } |
1652 | 1662 | ||
1653 | pci_put_host_bridge_device(bridge); | 1663 | pci_put_host_bridge_device(bridge); |