Skip to content

Commit 31c2b81

Browse files
awilliambjorn-helgaas
authored andcommitted
PCI: Add support for DMA alias quirks
Some devices are broken and use a requester ID other than their physical devfn. Add a byte, using an existing gap in the pci_dev structure, to store an alternate "alias" devfn. A bit in the dev_flags tells us when this is valid. We then add the alias as one more step in the pci_for_each_dma_alias() iterator. Tested-by: George Spelvin <[email protected]> Tested-by: Pat Erley <[email protected]> Signed-off-by: Alex Williamson <[email protected]> Signed-off-by: Bjorn Helgaas <[email protected]>
1 parent 6b12159 commit 31c2b81

File tree

2 files changed

+14
-0
lines changed

2 files changed

+14
-0
lines changed

drivers/pci/search.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,17 @@ int pci_for_each_dma_alias(struct pci_dev *pdev,
3737
if (ret)
3838
return ret;
3939

40+
/*
41+
* If the device is broken and uses an alias requester ID for
42+
* DMA, iterate over that too.
43+
*/
44+
if (unlikely(pdev->dev_flags & PCI_DEV_FLAGS_DMA_ALIAS_DEVFN)) {
45+
ret = fn(pdev, PCI_DEVID(pdev->bus->number,
46+
pdev->dma_alias_devfn), data);
47+
if (ret)
48+
return ret;
49+
}
50+
4051
for (bus = pdev->bus; !pci_is_root_bus(bus); bus = bus->parent) {
4152
struct pci_dev *tmp;
4253

include/linux/pci.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,8 @@ enum pci_dev_flags {
171171
PCI_DEV_FLAGS_ASSIGNED = (__force pci_dev_flags_t) (1 << 2),
172172
/* Flag for quirk use to store if quirk-specific ACS is enabled */
173173
PCI_DEV_FLAGS_ACS_ENABLED_QUIRK = (__force pci_dev_flags_t) (1 << 3),
174+
/* Flag to indicate the device uses dma_alias_devfn */
175+
PCI_DEV_FLAGS_DMA_ALIAS_DEVFN = (__force pci_dev_flags_t) (1 << 4),
174176
};
175177

176178
enum pci_irq_reroute_variant {
@@ -268,6 +270,7 @@ struct pci_dev {
268270
u8 rom_base_reg; /* which config register controls the ROM */
269271
u8 pin; /* which interrupt pin this device uses */
270272
u16 pcie_flags_reg; /* cached PCIe Capabilities Register */
273+
u8 dma_alias_devfn;/* devfn of DMA alias, if any */
271274

272275
struct pci_driver *driver; /* which driver has allocated this device */
273276
u64 dma_mask; /* Mask of the bits of bus address this

0 commit comments

Comments
 (0)