Merge branch 'acpi-pci'
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>
Sat, 7 Nov 2015 00:30:10 +0000 (01:30 +0100)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Sat, 7 Nov 2015 00:30:10 +0000 (01:30 +0100)
* acpi-pci:
  PCI: ACPI: Add support for PCI device DMA coherency
  PCI: OF: Move of_pci_dma_configure() to pci_dma_configure()
  of/pci: Fix pci_get_host_bridge_device leak
  device property: ACPI: Remove unused DMA APIs
  device property: ACPI: Make use of the new DMA Attribute APIs
  device property: Adding DMA Attribute APIs for Generic Devices
  ACPI: Adding DMA Attribute APIs for ACPI Device
  device property: Introducing enum dev_dma_attr
  ACPI: Honor ACPI _CCA attribute setting

Conflicts:
drivers/crypto/ccp/ccp-platform.c

1  2 
drivers/acpi/glue.c
drivers/acpi/scan.c
drivers/crypto/ccp/ccp-platform.c
drivers/net/ethernet/amd/xgbe/xgbe-main.c
drivers/pci/probe.c
include/acpi/acpi_bus.h
include/linux/acpi.h

Simple merge
Simple merge
index 8b923b7e9389aabd96ee10350c0f0ea9f66556f6,844118cb31a34e565fea4ab46ffbf981d7ad1caf..01b50cb4c9822abb8455f0f465ed8587ef4d3ef5
@@@ -94,6 -95,8 +94,7 @@@ static int ccp_platform_probe(struct pl
        struct ccp_device *ccp;
        struct ccp_platform *ccp_platform;
        struct device *dev = &pdev->dev;
 -      struct acpi_device *adev = ACPI_COMPANION(dev);
+       enum dev_dma_attr attr;
        struct resource *ior;
        int ret;
  
index f14a970b61fa59bf00b6e97474da3ec024ba315e,064078e11017870eece0a58f5beca764f8a70281..0dac52633f012da93b1aeabc9f803e77fdfd57ca
@@@ -1622,50 -1624,45 +1624,78 @@@ static void pci_init_capabilities(struc
        pci_enable_acs(dev);
  }
  
 +/*
 + * This is the equivalent of pci_host_bridge_msi_domain that acts on
 + * devices. Firmware interfaces that can select the MSI domain on a
 + * per-device basis should be called from here.
 + */
 +static struct irq_domain *pci_dev_msi_domain(struct pci_dev *dev)
 +{
 +      struct irq_domain *d;
 +
 +      /*
 +       * If a domain has been set through the pcibios_add_device
 +       * callback, then this is the one (platform code knows best).
 +       */
 +      d = dev_get_msi_domain(&dev->dev);
 +      if (d)
 +              return d;
 +
 +      /*
 +       * Let's see if we have a firmware interface able to provide
 +       * the domain.
 +       */
 +      d = pci_msi_get_device_domain(dev);
 +      if (d)
 +              return d;
 +
 +      return NULL;
 +}
 +
  static void pci_set_msi_domain(struct pci_dev *dev)
  {
 +      struct irq_domain *d;
 +
        /*
 -       * If no domain has been set through the pcibios_add_device
 -       * callback, inherit the default from the bus device.
 +       * If the platform or firmware interfaces cannot supply a
 +       * device-specific MSI domain, then inherit the default domain
 +       * from the host bridge itself.
         */
 -      if (!dev_get_msi_domain(&dev->dev))
 -              dev_set_msi_domain(&dev->dev,
 -                                 dev_get_msi_domain(&dev->bus->dev));
 +      d = pci_dev_msi_domain(dev);
 +      if (!d)
 +              d = dev_get_msi_domain(&dev->bus->dev);
 +
 +      dev_set_msi_domain(&dev->dev, d);
  }
  
+ /**
+  * pci_dma_configure - Setup DMA configuration
+  * @dev: ptr to pci_dev struct of the PCI device
+  *
+  * Function to update PCI devices's DMA configuration using the same
+  * info from the OF node or ACPI node of host bridge's parent (if any).
+  */
+ static void pci_dma_configure(struct pci_dev *dev)
+ {
+       struct device *bridge = pci_get_host_bridge_device(dev);
+       if (IS_ENABLED(CONFIG_OF) && dev->dev.of_node) {
+               if (bridge->parent)
+                       of_dma_configure(&dev->dev, bridge->parent->of_node);
+       } else if (has_acpi_companion(bridge)) {
+               struct acpi_device *adev = to_acpi_device_node(bridge->fwnode);
+               enum dev_dma_attr attr = acpi_get_dma_attr(adev);
+               if (attr == DEV_DMA_NOT_SUPPORTED)
+                       dev_warn(&dev->dev, "DMA not supported.\n");
+               else
+                       arch_setup_dma_ops(&dev->dev, 0, 0, NULL,
+                                          attr == DEV_DMA_COHERENT);
+       }
+       pci_put_host_bridge_device(bridge);
+ }
  void pci_device_add(struct pci_dev *dev, struct pci_bus *bus)
  {
        int ret;
Simple merge
Simple merge