On Fri, Jan 05, 2018 at 02:39:57PM +0100, Koen Vandeputte wrote: > > > On 2018-01-05 13:32, Lorenzo Pieralisi wrote: > > > >> /* setup bus numbers */ > >> val = dw_pcie_readl_dbi > >> val &= 0xff000000; > >> val |= 0x00010100; <--- hardcoded today > >> dw_pcie_writel_dbi > > >>I *think* I understand what's going on - the kernel takes the primary, > >>secondary and subordinate values in the host bridge as valid in: > >> > >>pci_scan_bridge_extend() > >> > >>and given that pcibios_assign_all_busses() returns false (guess) it sets-up > >>the bus hierarchy with a bus resource with subordinate number as read from > >>PCI host bridge config space - which, given that it is 1 according to your > >>explanation - this triggers the issue you reported. > >> > >>After commit a20c7f36bd3d the root bus resource is propagated down the > >>hierarchy, hence the problem. > >> > >>So, in order to fix the issue I think the best way is to programme the > >>root bridge in: > >> > >>drivers/pci/dwc/pci-designware-host.c > >> > >>but with the value coming from the root bus IORESOURCE_BUS resource, > >>not hardcoding 0xff. > >> > >>I would kindly ask you to send logs with debug turned on in: > >> > >>drivers/pci/probe.c > >> > >>since I would like to check my understanding is correct. > >> > >>Please CC all dwc host maintainers since this has potential widespread > >>impact. > >> > >>Thanks, > >>Lorenzo > Hi Lorenzo, > > This is exactly what I'm trying to explain: > > The host starts of with a (hardcoded today) subord of 1. [bits 16:23] > > Since commit a20c7f36bd3d, downstream devices cannot assign bus nr's > higher than the subord of the upstream device. > So in this case, scanning stops after the bridge as soon as bus 1 is > assigned .. :) There is one thing that I need to understand though. Before the commit above, how would enumeration works given that the subordinate bus number was set to 1 and that the kernel, AFAICS, does not overwrite it ? Are you able to send me a log (enumeration with debugging enabled and lspci) with the commit above reverted please ? Thanks, Lorenzo > As other targets besides i.MX6 (layerscape, armada8k, ...) also use > the same function to init PCIe, I believe those targets are also > affected. > > I've tested here setting the PCI_PRIMARY_BUS register to 0x 00 ff 01 > 00 (ignored-subord-secbus-primbus), and the whole scanning works > again. > I fully agree that hardcoding is not the final fix, as this param > can be defined in a DT. > > > Fixing this, combined with the upstream commit exposing the error, > fixes all following pci boot errors: > > .. > [ 0.466405] pci_bus 0000:05: [bus 05] partially hidden behind > bridge 0000:01 [bus 01] > .. > [ 0.466435] pci_bus 0000:02: busn_res: can not insert [bus 02-05] > under [bus 01] (conflicts with (null) [bus 01]) > [ 0.466454] pci_bus 0000:02: [bus 02-05] partially hidden behind > bridge 0000:01 [bus 01] > .. > > > Watching the tree using lspci also shows that all primaries, > secondaries and subords are perfectly logical as expected. > > > Thanks, > > Koen > > > Log showing the initial issue without any fixup: > > > [ 0.116673] OF: PCI: host bridge /soc/pcie@0x01000000 ranges: > [ 0.116692] OF: PCI: No bus range found for > /soc/pcie@0x01000000, using [bus 00-ff] > [ 0.116719] OF: PCI: IO 0x01f80000..0x01f8ffff -> 0x00000000 > [ 0.116739] OF: PCI: MEM 0x01000000..0x01efffff -> 0x01000000 > [ 0.337752] imx6q-pcie 1ffc000.pcie: link up > [ 0.337771] imx6q-pcie 1ffc000.pcie: Link: Gen2 disabled > [ 0.337785] imx6q-pcie 1ffc000.pcie: link up > [ 0.337796] imx6q-pcie 1ffc000.pcie: Link up, Gen1 > [ 0.338039] imx6q-pcie 1ffc000.pcie: PCI host bridge to bus 0000:00 > [ 0.338055] pci_bus 0000:00: root bus resource [bus 00-ff] > [ 0.338069] pci_bus 0000:00: root bus resource [io 0x0000-0xffff] > [ 0.338082] pci_bus 0000:00: root bus resource [mem > 0x01000000-0x01efffff] > [ 0.338094] pci_bus 0000:00: scanning bus > [ 0.338127] pci 0000:00:00.0: [16c3:abcd] type 01 class 0x060400 > [ 0.338151] pci 0000:00:00.0: reg 0x10: [mem 0x00000000-0x000fffff] > [ 0.338168] pci 0000:00:00.0: reg 0x38: [mem 0x00000000-0x0000ffff pref] > [ 0.338204] pci 0000:00:00.0: calling pci_fixup_ide_bases+0x0/0x4c > [ 0.338259] pci 0000:00:00.0: supports D1 > [ 0.338267] pci 0000:00:00.0: PME# supported from D0 D1 D3hot D3cold > [ 0.338276] pci 0000:00:00.0: PME# disabled > [ 0.338512] pci_bus 0000:00: fixups for bus > [ 0.338525] PCI: bus0: Fast back to back transfers disabled > [ 0.338541] pci 0000:00:00.0: scanning [bus 01-01] behind bridge, pass 0 > [ 0.338673] pci_bus 0000:01: scanning bus > [ 0.338773] pci 0000:01:00.0: [10b5:8604] type 01 class 0x060400 > [ 0.338816] pci 0000:01:00.0: calling ventana_pciesw_early_fixup+0x0/0xa4 > [ 0.467817] pci 0000:01:00.0: reg 0x10: [mem 0x00000000-0x0001ffff] > [ 0.467999] pci 0000:01:00.0: calling pci_fixup_ide_bases+0x0/0x4c > [ 0.468467] pci 0000:01:00.0: PME# supported from D0 D3hot D3cold > [ 0.468491] pci 0000:01:00.0: PME# disabled > [ 0.468795] pci_bus 0000:01: fixups for bus > [ 0.468854] PCI: bus1: Fast back to back transfers disabled > [ 0.468877] pci 0000:01:00.0: scanning [bus 00-00] behind bridge, pass 0 > [ 0.468886] pci 0000:01:00.0: bridge configuration invalid ([bus > 00-00]), reconfiguring > [ 0.468939] pci 0000:01:00.0: scanning [bus 00-00] behind bridge, pass 1 > [ 0.469265] pci_bus 0000:02: busn_res: can not insert [bus 02-01] > under [bus 01] (conflicts with (null) [bus 01]) > [ 0.469282] pci_bus 0000:02: scanning bus > [ 0.469554] pci_bus 0000:02: fixups for bus > [ 0.469559] PCI: bus2: Fast back to back transfers enabled > [ 0.469572] pci_bus 0000:02: bus scan returning with max=02 > [ 0.469582] pci_bus 0000:02: busn_res: [bus 02-01] end is updated to 02 > [ 0.469593] pci_bus 0000:02: busn_res: can not insert [bus 02] > under [bus 01] (conflicts with (null) [bus 01]) > [ 0.469615] pci_bus 0000:02: [bus 02] partially hidden behind > bridge 0000:01 [bus 01] > [ 0.469636] pci_bus 0000:01: bus scan returning with max=02 > [ 0.469643] pci 0000:00:00.0: bridge has subordinate 01 but max busn 02 > [ 0.469661] pci 0000:00:00.0: scanning [bus 01-01] behind bridge, pass 1 > [ 0.469671] pci_bus 0000:00: bus scan returning with max=01 > [ 0.469791] pci 0000:00:00.0: fixup irq: got 298 > [ 0.469800] pci 0000:00:00.0: assigning IRQ 298 > [ 0.469849] pci 0000:01:00.0: fixup irq: got 298 > [ 0.469856] pci 0000:01:00.0: assigning IRQ 298 > [ 0.469946] pci 0000:00:00.0: BAR 0: assigned [mem 0x01000000-0x010fffff] > [ 0.469965] pci 0000:00:00.0: BAR 8: assigned [mem 0x01100000-0x011fffff] > [ 0.469980] pci 0000:00:00.0: BAR 6: assigned [mem > 0x01200000-0x0120ffff pref] > [ 0.469997] pci 0000:01:00.0: BAR 0: assigned [mem 0x01100000-0x0111ffff] > [ 0.470026] pci 0000:01:00.0: PCI bridge to [bus 02] > [ 0.470108] pci 0000:00:00.0: PCI bridge to [bus 01] > [ 0.470121] pci 0000:00:00.0: bridge window [mem 0x01100000-0x011fffff] > [ 0.470381] pcieport 0000:00:00.0: Signaling PME through PCIe PME > interrupt > [ 0.470397] pci 0000:01:00.0: Signaling PME through PCIe PME interrupt > [ 0.470412] pcie_pme 0000:00:00.0:pcie001: service driver pcie_pme loaded > [ 0.470660] pcieport 0000:01:00.0: enabling device (0140 -> 0142) > [ 0.470788] pcieport 0000:01:00.0: enabling bus mastering > > > > [ Node 4 | node-4 ] lspci -tv > -[0000:00]---00.0-[01]----00.0-[02]-- > [ Node 4 | node-4 ] > > > > [ Node 4 | node-4 ] lspci -v > 00:00.0 PCI bridge: Synopsys, Inc. Device abcd (rev 01) (prog-if 00 > [Normal decode]) > Flags: bus master, fast devsel, latency 0, IRQ 298 > Memory at 01000000 (32-bit, non-prefetchable) [size=1M] > Bus: primary=00, secondary=01, subordinate=01, sec-latency=0 > I/O behind bridge: None > Memory behind bridge: 01100000-011fffff [size=1M] > Prefetchable memory behind bridge: None > [virtual] Expansion ROM at 01200000 [disabled] [size=64K] > Capabilities: [40] Power Management version 3 > Capabilities: [50] MSI: Enable- Count=1/1 Maskable+ 64bit+ > Capabilities: [70] Express Root Port (Slot-), MSI 00 > Capabilities: [100] Advanced Error Reporting > Capabilities: [140] Virtual Channel > Kernel driver in use: pcieport > lspci: Unable to load libkmod resources: error -12 > > 01:00.0 PCI bridge: PLX Technology, Inc. PEX 8604 4-lane, 4-Port PCI > Express Gen 2 (5.0 GT/s) Switch (rev ba) (prog-if 00 [Normal > decode]) > Flags: bus master, fast devsel, latency 0, IRQ 298 > Memory at 01100000 (32-bit, non-prefetchable) [size=128K] > Bus: primary=01, secondary=02, subordinate=02, sec-latency=0 > I/O behind bridge: None > Memory behind bridge: None > Prefetchable memory behind bridge: None > Capabilities: [40] Power Management version 3 > Capabilities: [48] MSI: Enable- Count=1/4 Maskable+ 64bit+ > Capabilities: [68] Express Upstream Port, MSI 00 > Capabilities: [a4] Subsystem: PLX Technology, Inc. PEX 8604 > 4-lane, 4-Port PCI Express Gen 2 (5.0 GT/s) Switch > Capabilities: [100] Device Serial Number ba-86-01-10-b5-df-0e-00 > Capabilities: [fb4] Advanced Error Reporting > Capabilities: [138] Power Budgeting <?> > Capabilities: [148] Virtual Channel > Capabilities: [448] Vendor Specific Information: ID=0000 Rev=0 > Len=0cc <?> > Capabilities: [950] Vendor Specific Information: ID=0001 Rev=0 > Len=010 <?> > Kernel driver in use: pcieport > [ Node 4 | node-4 ]