Merge tag 'pci-v5.6-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci
Pull PCI updates from Bjorn Helgaas: "Resource management: - Improve resource assignment for hot-added nested bridges, e.g., Thunderbolt (Nicholas Johnson) Power management: - Optionally print config space of devices before suspend (Chen Yu) - Increase D3 delay for AMD Ryzen5/7 XHCI controllers (Daniel Drake) Virtualization: - Generalize DMA alias quirks (James Sewart) - Add DMA alias quirk for PLX PEX NTB (James Sewart) - Fix IOV memory leak (Navid Emamdoost) AER: - Log which device prevents error recovery (Yicong Yang) Peer-to-peer DMA: - Whitelist Intel SkyLake-E (Armen Baloyan) Broadcom iProc host bridge driver: - Apply PAXC quirk whether driver is built-in or module (Wei Liu) Broadcom STB host bridge driver: - Add Broadcom STB PCIe host controller driver (Jim Quinlan) Intel Gateway SoC host bridge driver: - Add driver for Intel Gateway SoC (Dilip Kota) Intel VMD host bridge driver: - Add support for DMA aliases on other buses (Jon Derrick) - Remove dma_map_ops overrides (Jon Derrick) - Remove now-unused X86_DEV_DMA_OPS (Christoph Hellwig) NVIDIA Tegra host bridge driver: - Fix Tegra30 afi_pex2_ctrl register offset (Marcel Ziswiler) Panasonic UniPhier host bridge driver: - Remove module code since driver can't be built as a module (Masahiro Yamada) Qualcomm host bridge driver: - Add support for SDM845 PCIe controller (Bjorn Andersson) TI Keystone host bridge driver: - Fix "num-viewport" DT property error handling (Kishon Vijay Abraham I) - Fix link training retries initiation (Yurii Monakov) - Fix outbound region mapping (Yurii Monakov) Misc: - Add Switchtec Gen4 support (Kelvin Cao) - Add Switchtec Intercomm Notify and Upstream Error Containment support (Logan Gunthorpe) - Use dma_set_mask_and_coherent() since Switchtec supports 64-bit addressing (Wesley Sheng)" * tag 'pci-v5.6-changes' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci: (60 commits) PCI: Allow adjust_bridge_window() to shrink resource if necessary PCI: Set resource size directly in adjust_bridge_window() PCI: Rename extend_bridge_window() to adjust_bridge_window() PCI: Rename extend_bridge_window() parameter PCI: Consider alignment of hot-added bridges when assigning resources PCI: Remove local variable usage in pci_bus_distribute_available_resources() PCI: Pass size + alignment to pci_bus_distribute_available_resources() PCI: Rename variables PCI: vmd: Add two VMD Device IDs PCI: Remove unnecessary braces PCI: brcmstb: Add MSI support PCI: brcmstb: Add Broadcom STB PCIe host controller driver x86/PCI: Remove X86_DEV_DMA_OPS PCI: vmd: Remove dma_map_ops overrides iommu/vt-d: Remove VMD child device sanity check iommu/vt-d: Use pci_real_dma_dev() for mapping PCI: Introduce pci_real_dma_dev() x86/PCI: Expose VMD's pci_dev in struct pci_sysdata x86/PCI: Add to_pci_sysdata() helper PCI/AER: Initialize aer_fifo ...
This commit is contained in:
@@ -1372,8 +1372,11 @@ int pci_save_state(struct pci_dev *dev)
|
||||
{
|
||||
int i;
|
||||
/* XXX: 100% dword access ok here? */
|
||||
for (i = 0; i < 16; i++)
|
||||
for (i = 0; i < 16; i++) {
|
||||
pci_read_config_dword(dev, i * 4, &dev->saved_config_space[i]);
|
||||
pci_dbg(dev, "saving config space at offset %#x (reading %#x)\n",
|
||||
i * 4, dev->saved_config_space[i]);
|
||||
}
|
||||
dev->state_saved = true;
|
||||
|
||||
i = pci_save_pcie_state(dev);
|
||||
@@ -5998,7 +6001,8 @@ EXPORT_SYMBOL_GPL(pci_pr3_present);
|
||||
/**
|
||||
* pci_add_dma_alias - Add a DMA devfn alias for a device
|
||||
* @dev: the PCI device for which alias is added
|
||||
* @devfn: alias slot and function
|
||||
* @devfn_from: alias slot and function
|
||||
* @nr_devfns: number of subsequent devfns to alias
|
||||
*
|
||||
* This helper encodes an 8-bit devfn as a bit number in dma_alias_mask
|
||||
* which is used to program permissible bus-devfn source addresses for DMA
|
||||
@@ -6014,18 +6018,29 @@ EXPORT_SYMBOL_GPL(pci_pr3_present);
|
||||
* cannot be left as a userspace activity). DMA aliases should therefore
|
||||
* be configured via quirks, such as the PCI fixup header quirk.
|
||||
*/
|
||||
void pci_add_dma_alias(struct pci_dev *dev, u8 devfn)
|
||||
void pci_add_dma_alias(struct pci_dev *dev, u8 devfn_from, unsigned nr_devfns)
|
||||
{
|
||||
int devfn_to;
|
||||
|
||||
nr_devfns = min(nr_devfns, (unsigned) MAX_NR_DEVFNS - devfn_from);
|
||||
devfn_to = devfn_from + nr_devfns - 1;
|
||||
|
||||
if (!dev->dma_alias_mask)
|
||||
dev->dma_alias_mask = bitmap_zalloc(U8_MAX, GFP_KERNEL);
|
||||
dev->dma_alias_mask = bitmap_zalloc(MAX_NR_DEVFNS, GFP_KERNEL);
|
||||
if (!dev->dma_alias_mask) {
|
||||
pci_warn(dev, "Unable to allocate DMA alias mask\n");
|
||||
return;
|
||||
}
|
||||
|
||||
set_bit(devfn, dev->dma_alias_mask);
|
||||
pci_info(dev, "Enabling fixed DMA alias to %02x.%d\n",
|
||||
PCI_SLOT(devfn), PCI_FUNC(devfn));
|
||||
bitmap_set(dev->dma_alias_mask, devfn_from, nr_devfns);
|
||||
|
||||
if (nr_devfns == 1)
|
||||
pci_info(dev, "Enabling fixed DMA alias to %02x.%d\n",
|
||||
PCI_SLOT(devfn_from), PCI_FUNC(devfn_from));
|
||||
else if (nr_devfns > 1)
|
||||
pci_info(dev, "Enabling fixed DMA alias for devfn range from %02x.%d to %02x.%d\n",
|
||||
PCI_SLOT(devfn_from), PCI_FUNC(devfn_from),
|
||||
PCI_SLOT(devfn_to), PCI_FUNC(devfn_to));
|
||||
}
|
||||
|
||||
bool pci_devs_are_dma_aliases(struct pci_dev *dev1, struct pci_dev *dev2)
|
||||
@@ -6033,7 +6048,9 @@ bool pci_devs_are_dma_aliases(struct pci_dev *dev1, struct pci_dev *dev2)
|
||||
return (dev1->dma_alias_mask &&
|
||||
test_bit(dev2->devfn, dev1->dma_alias_mask)) ||
|
||||
(dev2->dma_alias_mask &&
|
||||
test_bit(dev1->devfn, dev2->dma_alias_mask));
|
||||
test_bit(dev1->devfn, dev2->dma_alias_mask)) ||
|
||||
pci_real_dma_dev(dev1) == dev2 ||
|
||||
pci_real_dma_dev(dev2) == dev1;
|
||||
}
|
||||
|
||||
bool pci_device_is_present(struct pci_dev *pdev)
|
||||
@@ -6057,6 +6074,21 @@ void pci_ignore_hotplug(struct pci_dev *dev)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(pci_ignore_hotplug);
|
||||
|
||||
/**
|
||||
* pci_real_dma_dev - Get PCI DMA device for PCI device
|
||||
* @dev: the PCI device that may have a PCI DMA alias
|
||||
*
|
||||
* Permits the platform to provide architecture-specific functionality to
|
||||
* devices needing to alias DMA to another PCI device on another PCI bus. If
|
||||
* the PCI device is on the same bus, it is recommended to use
|
||||
* pci_add_dma_alias(). This is the default implementation. Architecture
|
||||
* implementations can override this.
|
||||
*/
|
||||
struct pci_dev __weak *pci_real_dma_dev(struct pci_dev *dev)
|
||||
{
|
||||
return dev;
|
||||
}
|
||||
|
||||
resource_size_t __weak pcibios_default_alignment(void)
|
||||
{
|
||||
return 0;
|
||||
|
Reference in New Issue
Block a user