| From 7c30c17b47dc8df80d2863d525dc5dcf21420773 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 22 Nov 2023 10:34:07 -0600 |
| Subject: PCI: Log bridge info when first enumerating bridge |
| |
| From: Bjorn Helgaas <bhelgaas@google.com> |
| |
| [ Upstream commit 95140c2fbfdf3b6ca98578e5bdbc82d9922f08b9 ] |
| |
| Log bridge secondary/subordinate bus and window information at the same |
| time we log the bridge BARs, just after discovering the bridge and before |
| scanning the bridge's secondary bus. This logs the bridge and downstream |
| devices in a more logical order: |
| |
| - pci 0000:00:01.0: [8086:1901] type 01 class 0x060400 |
| - pci 0000:01:00.0: [10de:13b6] type 00 class 0x030200 |
| - pci 0000:01:00.0: reg 0x10: [mem 0xec000000-0xecffffff] |
| - pci 0000:00:01.0: PCI bridge to [bus 01] |
| - pci 0000:00:01.0: bridge window [io 0xe000-0xefff] |
| |
| + pci 0000:00:01.0: [8086:1901] type 01 class 0x060400 |
| + pci 0000:00:01.0: PCI bridge to [bus 01] |
| + pci 0000:00:01.0: bridge window [io 0xe000-0xefff] |
| + pci 0000:01:00.0: [10de:13b6] type 00 class 0x030200 |
| + pci 0000:01:00.0: reg 0x10: [mem 0xec000000-0xecffffff] |
| |
| Note that we read the windows into a temporary struct resource that is |
| thrown away, not into the resources in the struct pci_bus. |
| |
| The windows may be adjusted after we know what downstream devices require, |
| and those adjustments are logged as they are made. |
| |
| Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> |
| Stable-dep-of: 9abf79c8d7b4 ("PCI/ACPI: Restrict program_hpx_type2() to AER bits") |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/pci/probe.c | 23 +++++++++++++++++++---- |
| 1 file changed, 19 insertions(+), 4 deletions(-) |
| |
| diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c |
| index f7b01cddf5abf..8a2f1e57bee19 100644 |
| --- a/drivers/pci/probe.c |
| +++ b/drivers/pci/probe.c |
| @@ -458,8 +458,17 @@ static void pci_read_bridge_mmio_pref(struct pci_dev *dev, struct resource *res, |
| |
| static void pci_read_bridge_windows(struct pci_dev *bridge) |
| { |
| + u32 buses; |
| u16 io; |
| u32 pmem, tmp; |
| + struct resource res; |
| + |
| + pci_read_config_dword(bridge, PCI_PRIMARY_BUS, &buses); |
| + res.flags = IORESOURCE_BUS; |
| + res.start = (buses >> 8) & 0xff; |
| + res.end = (buses >> 16) & 0xff; |
| + pci_info(bridge, "PCI bridge to %pR%s\n", &res, |
| + bridge->transparent ? " (subtractive decode)" : ""); |
| |
| pci_read_config_word(bridge, PCI_IO_BASE, &io); |
| if (!io) { |
| @@ -467,8 +476,12 @@ static void pci_read_bridge_windows(struct pci_dev *bridge) |
| pci_read_config_word(bridge, PCI_IO_BASE, &io); |
| pci_write_config_word(bridge, PCI_IO_BASE, 0x0); |
| } |
| - if (io) |
| + if (io) { |
| bridge->io_window = 1; |
| + pci_read_bridge_io(bridge, &res, true); |
| + } |
| + |
| + pci_read_bridge_mmio(bridge, &res, true); |
| |
| /* |
| * DECchip 21050 pass 2 errata: the bridge may miss an address |
| @@ -505,6 +518,8 @@ static void pci_read_bridge_windows(struct pci_dev *bridge) |
| if (tmp) |
| bridge->pref_64_window = 1; |
| } |
| + |
| + pci_read_bridge_mmio_pref(bridge, &res, true); |
| } |
| |
| void pci_read_bridge_bases(struct pci_bus *child) |
| @@ -524,9 +539,9 @@ void pci_read_bridge_bases(struct pci_bus *child) |
| for (i = 0; i < PCI_BRIDGE_RESOURCE_NUM; i++) |
| child->resource[i] = &dev->resource[PCI_BRIDGE_RESOURCES+i]; |
| |
| - pci_read_bridge_io(child->self, child->resource[0], true); |
| - pci_read_bridge_mmio(child->self, child->resource[1], true); |
| - pci_read_bridge_mmio_pref(child->self, child->resource[2], true); |
| + pci_read_bridge_io(child->self, child->resource[0], false); |
| + pci_read_bridge_mmio(child->self, child->resource[1], false); |
| + pci_read_bridge_mmio_pref(child->self, child->resource[2], false); |
| |
| if (dev->transparent) { |
| pci_bus_for_each_resource(child->parent, res) { |
| -- |
| 2.51.0 |
| |