diff options
Diffstat (limited to 'drivers/pci/pci.c')
-rw-r--r-- | drivers/pci/pci.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 4859669f0ab5..557218222826 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
@@ -1546,6 +1546,41 @@ void pci_enable_ari(struct pci_dev *dev) | |||
1546 | } | 1546 | } |
1547 | 1547 | ||
1548 | /** | 1548 | /** |
1549 | * pci_enable_acs - enable ACS if hardware support it | ||
1550 | * @dev: the PCI device | ||
1551 | */ | ||
1552 | void pci_enable_acs(struct pci_dev *dev) | ||
1553 | { | ||
1554 | int pos; | ||
1555 | u16 cap; | ||
1556 | u16 ctrl; | ||
1557 | |||
1558 | if (!dev->is_pcie) | ||
1559 | return; | ||
1560 | |||
1561 | pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ACS); | ||
1562 | if (!pos) | ||
1563 | return; | ||
1564 | |||
1565 | pci_read_config_word(dev, pos + PCI_ACS_CAP, &cap); | ||
1566 | pci_read_config_word(dev, pos + PCI_ACS_CTRL, &ctrl); | ||
1567 | |||
1568 | /* Source Validation */ | ||
1569 | ctrl |= (cap & PCI_ACS_SV); | ||
1570 | |||
1571 | /* P2P Request Redirect */ | ||
1572 | ctrl |= (cap & PCI_ACS_RR); | ||
1573 | |||
1574 | /* P2P Completion Redirect */ | ||
1575 | ctrl |= (cap & PCI_ACS_CR); | ||
1576 | |||
1577 | /* Upstream Forwarding */ | ||
1578 | ctrl |= (cap & PCI_ACS_UF); | ||
1579 | |||
1580 | pci_write_config_word(dev, pos + PCI_ACS_CTRL, ctrl); | ||
1581 | } | ||
1582 | |||
1583 | /** | ||
1549 | * pci_swizzle_interrupt_pin - swizzle INTx for device behind bridge | 1584 | * pci_swizzle_interrupt_pin - swizzle INTx for device behind bridge |
1550 | * @dev: the PCI device | 1585 | * @dev: the PCI device |
1551 | * @pin: the INTx pin (1=INTA, 2=INTB, 3=INTD, 4=INTD) | 1586 | * @pin: the INTx pin (1=INTA, 2=INTB, 3=INTD, 4=INTD) |