* [PATCH v2 0/2] PCI: Marvell CN96XX/CN10XXX quirk and bus-range omission
@ 2025-03-11 13:52 Bo Sun
2025-03-11 13:52 ` [PATCH v2 1/2] PCI: Forcefully set the PCI_REASSIGN_ALL_BUS flag for Marvell CN96XX/CN10XXX boards Bo Sun
2025-03-11 13:52 ` [PATCH v2 2/2] PCI: of_property: Omit 'bus-range' property if no secondary bus Bo Sun
0 siblings, 2 replies; 6+ messages in thread
From: Bo Sun @ 2025-03-11 13:52 UTC (permalink / raw)
To: Bjorn Helgaas
Cc: Manivannan Sadhasivam, Vidya Sagar, linux-pci, linux-kernel,
Kevin Hao, Bo Sun
v2:
This series addresses reviewer feedback:
- Patch 1 sets PCI_REASSIGN_ALL_BUS for Marvell CN96XX/CN10XXX to fix bus numbering.
- Patch 2 omits 'bus-range' if no secondary bus exists as suggested by Bjorn.
v1:
https://patchwork.kernel.org/project/linux-pci/patch/20250117082428.129353-1-Bo.Sun.CN@windriver.com/
Bo Sun (2):
PCI: Forcefully set the PCI_REASSIGN_ALL_BUS flag for Marvell
CN96XX/CN10XXX boards
PCI: of_property: Omit 'bus-range' property if no secondary bus
drivers/pci/of_property.c | 3 +++
drivers/pci/quirks.c | 17 +++++++++++++++++
2 files changed, 20 insertions(+)
--
2.48.1
^ permalink raw reply [flat|nested] 6+ messages in thread* [PATCH v2 1/2] PCI: Forcefully set the PCI_REASSIGN_ALL_BUS flag for Marvell CN96XX/CN10XXX boards 2025-03-11 13:52 [PATCH v2 0/2] PCI: Marvell CN96XX/CN10XXX quirk and bus-range omission Bo Sun @ 2025-03-11 13:52 ` Bo Sun 2025-03-18 6:27 ` Manivannan Sadhasivam 2025-03-11 13:52 ` [PATCH v2 2/2] PCI: of_property: Omit 'bus-range' property if no secondary bus Bo Sun 1 sibling, 1 reply; 6+ messages in thread From: Bo Sun @ 2025-03-11 13:52 UTC (permalink / raw) To: Bjorn Helgaas Cc: Manivannan Sadhasivam, Vidya Sagar, linux-pci, linux-kernel, Kevin Hao, Bo Sun, stable On our Marvell OCTEON CN96XX board, we observed the following panic on the latest kernel: Unable to handle kernel NULL pointer dereference at virtual address 0000000000000080 CPU: 22 UID: 0 PID: 1 Comm: swapper/0 Not tainted 6.14.0-rc6 #20 Hardware name: Marvell OcteonTX CN96XX board (DT) pc : of_pci_add_properties+0x278/0x4c8 Call trace: of_pci_add_properties+0x278/0x4c8 (P) of_pci_make_dev_node+0xe0/0x158 pci_bus_add_device+0x158/0x228 pci_bus_add_devices+0x40/0x98 pci_host_probe+0x94/0x118 pci_host_common_probe+0x130/0x1b0 platform_probe+0x70/0xf0 The dmesg logs indicated that the PCI bridge was scanning with an invalid bus range: pci-host-generic 878020000000.pci: PCI host bridge to bus 0002:00 pci_bus 0002:00: root bus resource [bus 00-ff] pci 0002:00:00.0: scanning [bus f9-f9] behind bridge, pass 0 pci 0002:00:01.0: scanning [bus fa-fa] behind bridge, pass 0 pci 0002:00:02.0: scanning [bus fb-fb] behind bridge, pass 0 pci 0002:00:03.0: scanning [bus fc-fc] behind bridge, pass 0 pci 0002:00:04.0: scanning [bus fd-fd] behind bridge, pass 0 pci 0002:00:05.0: scanning [bus fe-fe] behind bridge, pass 0 pci 0002:00:06.0: scanning [bus ff-ff] behind bridge, pass 0 pci 0002:00:07.0: scanning [bus 00-00] behind bridge, pass 0 pci 0002:00:07.0: bridge configuration invalid ([bus 00-00]), reconfiguring pci 0002:00:08.0: scanning [bus 01-01] behind bridge, pass 0 pci 0002:00:09.0: scanning [bus 02-02] behind bridge, pass 0 pci 0002:00:0a.0: scanning [bus 03-03] behind bridge, pass 0 pci 0002:00:0b.0: scanning [bus 04-04] behind bridge, pass 0 pci 0002:00:0c.0: scanning [bus 05-05] behind bridge, pass 0 pci 0002:00:0d.0: scanning [bus 06-06] behind bridge, pass 0 pci 0002:00:0e.0: scanning [bus 07-07] behind bridge, pass 0 pci 0002:00:0f.0: scanning [bus 08-08] behind bridge, pass 0 This regression was introduced by commit 7246a4520b4b ("PCI: Use preserve_config in place of pci_flags"). On our board, the 0002:00:07.0 bridge is misconfigured by the bootloader. Both its secondary and subordinate bus numbers are initialized to 0, while its fixed secondary bus number is set to 8. However, bus number 8 is also assigned to another bridge (0002:00:0f.0). Although this is a bootloader issue, before the change in commit 7246a4520b4b, the PCI_REASSIGN_ALL_BUS flag was set by default when PCI_PROBE_ONLY was not enabled, ensuing that all the bus number for these bridges were reassigned, avoiding any conflicts. After the change introduced in commit 7246a4520b4b, the bus numbers assigned by the bootloader are reused by all other bridges, except the misconfigured 0002:00:07.0 bridge. The kernel attempt to reconfigure 0002:00:07.0 by reusing the fixed secondary bus number 8 assigned by bootloader. However, since a pci_bus has already been allocated for bus 8 due to the probe of 0002:00:0f.0, no new pci_bus allocated for 0002:00:07.0. This results in a pci bridge device without a pci_bus attached (pdev->subordinate == NULL). Consequently, accessing pdev->subordinate in of_pci_prop_bus_range() leads to a NULL pointer dereference. To summarize, we need to set the PCI_REASSIGN_ALL_BUS flag when PCI_PROBE_ONLY is not enabled in order to work around issue like the one described above. Cc: stable@vger.kernel.org Fixes: 7246a4520b4b ("PCI: Use preserve_config in place of pci_flags") Signed-off-by: Bo Sun <Bo.Sun.CN@windriver.com> --- Changes in v2: - Added explicit comment about the quirk, as requested by Mani. - Made commit message more clear, as requested by Bjorn. drivers/pci/quirks.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index 82b21e34c545..cec58c7479e1 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c @@ -6181,6 +6181,23 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x1536, rom_bar_overlap_defect); DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x1537, rom_bar_overlap_defect); DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x1538, rom_bar_overlap_defect); +/* + * Quirk for Marvell CN96XX/CN10XXX boards: + * + * Adds PCI_REASSIGN_ALL_BUS unless PCI_PROBE_ONLY is set, forcing bus number + * reassignment to avoid conflicts caused by bootloader misconfigured PCI bridges. + * + * This resolves a regression introduced by commit 7246a4520b4b ("PCI: Use + * preserve_config in place of pci_flags"), which removed this behavior. + */ +static void quirk_marvell_cn96xx_cn10xxx_reassign_all_busnr(struct pci_dev *dev) +{ + if (!pci_has_flag(PCI_PROBE_ONLY)) + pci_add_flags(PCI_REASSIGN_ALL_BUS); +} +DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_CAVIUM, 0xa002, + quirk_marvell_cn96xx_cn10xxx_reassign_all_busnr); + #ifdef CONFIG_PCIEASPM /* * Several Intel DG2 graphics devices advertise that they can only tolerate -- 2.48.1 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v2 1/2] PCI: Forcefully set the PCI_REASSIGN_ALL_BUS flag for Marvell CN96XX/CN10XXX boards 2025-03-11 13:52 ` [PATCH v2 1/2] PCI: Forcefully set the PCI_REASSIGN_ALL_BUS flag for Marvell CN96XX/CN10XXX boards Bo Sun @ 2025-03-18 6:27 ` Manivannan Sadhasivam 0 siblings, 0 replies; 6+ messages in thread From: Manivannan Sadhasivam @ 2025-03-18 6:27 UTC (permalink / raw) To: Bo Sun Cc: Bjorn Helgaas, Vidya Sagar, linux-pci, linux-kernel, Kevin Hao, stable On Tue, Mar 11, 2025 at 09:52:28PM +0800, Bo Sun wrote: > On our Marvell OCTEON CN96XX board, we observed the following panic on > the latest kernel: > Unable to handle kernel NULL pointer dereference at virtual address 0000000000000080 > CPU: 22 UID: 0 PID: 1 Comm: swapper/0 Not tainted 6.14.0-rc6 #20 > Hardware name: Marvell OcteonTX CN96XX board (DT) > pc : of_pci_add_properties+0x278/0x4c8 > Call trace: > of_pci_add_properties+0x278/0x4c8 (P) > of_pci_make_dev_node+0xe0/0x158 > pci_bus_add_device+0x158/0x228 > pci_bus_add_devices+0x40/0x98 > pci_host_probe+0x94/0x118 > pci_host_common_probe+0x130/0x1b0 > platform_probe+0x70/0xf0 > > The dmesg logs indicated that the PCI bridge was scanning with an invalid bus range: > pci-host-generic 878020000000.pci: PCI host bridge to bus 0002:00 > pci_bus 0002:00: root bus resource [bus 00-ff] > pci 0002:00:00.0: scanning [bus f9-f9] behind bridge, pass 0 > pci 0002:00:01.0: scanning [bus fa-fa] behind bridge, pass 0 > pci 0002:00:02.0: scanning [bus fb-fb] behind bridge, pass 0 > pci 0002:00:03.0: scanning [bus fc-fc] behind bridge, pass 0 > pci 0002:00:04.0: scanning [bus fd-fd] behind bridge, pass 0 > pci 0002:00:05.0: scanning [bus fe-fe] behind bridge, pass 0 > pci 0002:00:06.0: scanning [bus ff-ff] behind bridge, pass 0 > pci 0002:00:07.0: scanning [bus 00-00] behind bridge, pass 0 > pci 0002:00:07.0: bridge configuration invalid ([bus 00-00]), reconfiguring > pci 0002:00:08.0: scanning [bus 01-01] behind bridge, pass 0 > pci 0002:00:09.0: scanning [bus 02-02] behind bridge, pass 0 > pci 0002:00:0a.0: scanning [bus 03-03] behind bridge, pass 0 > pci 0002:00:0b.0: scanning [bus 04-04] behind bridge, pass 0 > pci 0002:00:0c.0: scanning [bus 05-05] behind bridge, pass 0 > pci 0002:00:0d.0: scanning [bus 06-06] behind bridge, pass 0 > pci 0002:00:0e.0: scanning [bus 07-07] behind bridge, pass 0 > pci 0002:00:0f.0: scanning [bus 08-08] behind bridge, pass 0 > > This regression was introduced by commit 7246a4520b4b ("PCI: Use > preserve_config in place of pci_flags"). On our board, the 0002:00:07.0 > bridge is misconfigured by the bootloader. Both its secondary and > subordinate bus numbers are initialized to 0, while its fixed secondary > bus number is set to 8. However, bus number 8 is also assigned to another > bridge (0002:00:0f.0). Although this is a bootloader issue, before the > change in commit 7246a4520b4b, the PCI_REASSIGN_ALL_BUS flag was set > by default when PCI_PROBE_ONLY was not enabled, ensuing that all the > bus number for these bridges were reassigned, avoiding any conflicts. > > After the change introduced in commit 7246a4520b4b, the bus numbers > assigned by the bootloader are reused by all other bridges, except > the misconfigured 0002:00:07.0 bridge. The kernel attempt to reconfigure > 0002:00:07.0 by reusing the fixed secondary bus number 8 assigned by > bootloader. However, since a pci_bus has already been allocated for > bus 8 due to the probe of 0002:00:0f.0, no new pci_bus allocated for > 0002:00:07.0. This results in a pci bridge device without a pci_bus > attached (pdev->subordinate == NULL). Consequently, accessing > pdev->subordinate in of_pci_prop_bus_range() leads to a NULL pointer > dereference. > > To summarize, we need to set the PCI_REASSIGN_ALL_BUS flag when > PCI_PROBE_ONLY is not enabled in order to work around issue like the > one described above. > > Cc: stable@vger.kernel.org > Fixes: 7246a4520b4b ("PCI: Use preserve_config in place of pci_flags") > Signed-off-by: Bo Sun <Bo.Sun.CN@windriver.com> > --- > Changes in v2: > - Added explicit comment about the quirk, as requested by Mani. > - Made commit message more clear, as requested by Bjorn. > > drivers/pci/quirks.c | 17 +++++++++++++++++ > 1 file changed, 17 insertions(+) > > diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c > index 82b21e34c545..cec58c7479e1 100644 > --- a/drivers/pci/quirks.c > +++ b/drivers/pci/quirks.c > @@ -6181,6 +6181,23 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x1536, rom_bar_overlap_defect); > DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x1537, rom_bar_overlap_defect); > DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x1538, rom_bar_overlap_defect); > > +/* > + * Quirk for Marvell CN96XX/CN10XXX boards: > + * > + * Adds PCI_REASSIGN_ALL_BUS unless PCI_PROBE_ONLY is set, forcing bus number > + * reassignment to avoid conflicts caused by bootloader misconfigured PCI bridges. > + * Do we really need to care about PCI_PROBE_ONLY in the quirk? Why can't we make it unconditional? > + * This resolves a regression introduced by commit 7246a4520b4b ("PCI: Use > + * preserve_config in place of pci_flags"), which removed this behavior. I don't think mentioning the commit is really needed here. - Mani -- மணிவண்ணன் சதாசிவம் ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v2 2/2] PCI: of_property: Omit 'bus-range' property if no secondary bus 2025-03-11 13:52 [PATCH v2 0/2] PCI: Marvell CN96XX/CN10XXX quirk and bus-range omission Bo Sun 2025-03-11 13:52 ` [PATCH v2 1/2] PCI: Forcefully set the PCI_REASSIGN_ALL_BUS flag for Marvell CN96XX/CN10XXX boards Bo Sun @ 2025-03-11 13:52 ` Bo Sun 2025-03-18 6:29 ` Manivannan Sadhasivam 1 sibling, 1 reply; 6+ messages in thread From: Bo Sun @ 2025-03-11 13:52 UTC (permalink / raw) To: Bjorn Helgaas Cc: Manivannan Sadhasivam, Vidya Sagar, linux-pci, linux-kernel, Kevin Hao, Bo Sun, Bjorn Helgaas The previous implementation of of_pci_add_properties() and of_pci_prop_bus_range() assumed that a valid secondary bus is always present, which can be problematic in cases where no bus numbers are assigned for a secondary bus. This patch introduces a check for a valid secondary bus and omits the 'bus-range' property if it is not available, preventing dereferencing the NULL pointer. Suggested-by: Bjorn Helgaas <helgaas@kernel.org> Signed-off-by: Bo Sun <Bo.Sun.CN@windriver.com> --- v2: New patch. drivers/pci/of_property.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/pci/of_property.c b/drivers/pci/of_property.c index 58fbafac7c6a..792b0163af45 100644 --- a/drivers/pci/of_property.c +++ b/drivers/pci/of_property.c @@ -91,6 +91,9 @@ static int of_pci_prop_bus_range(struct pci_dev *pdev, struct of_changeset *ocs, struct device_node *np) { + if (!pdev->subordinate) + return -EINVAL; + u32 bus_range[] = { pdev->subordinate->busn_res.start, pdev->subordinate->busn_res.end }; -- 2.48.1 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v2 2/2] PCI: of_property: Omit 'bus-range' property if no secondary bus 2025-03-11 13:52 ` [PATCH v2 2/2] PCI: of_property: Omit 'bus-range' property if no secondary bus Bo Sun @ 2025-03-18 6:29 ` Manivannan Sadhasivam 2025-03-21 1:17 ` Bo Sun 0 siblings, 1 reply; 6+ messages in thread From: Manivannan Sadhasivam @ 2025-03-18 6:29 UTC (permalink / raw) To: Bo Sun Cc: Bjorn Helgaas, Vidya Sagar, linux-pci, linux-kernel, Kevin Hao, Bjorn Helgaas On Tue, Mar 11, 2025 at 09:52:29PM +0800, Bo Sun wrote: > The previous implementation of of_pci_add_properties() and > of_pci_prop_bus_range() assumed that a valid secondary bus is always > present, which can be problematic in cases where no bus numbers are > assigned for a secondary bus. This patch introduces a check for a valid > secondary bus and omits the 'bus-range' property if it is not available, > preventing dereferencing the NULL pointer. > This definitely needs a Fixes tag and should be backported. - Mani -- மணிவண்ணன் சதாசிவம் ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2 2/2] PCI: of_property: Omit 'bus-range' property if no secondary bus 2025-03-18 6:29 ` Manivannan Sadhasivam @ 2025-03-21 1:17 ` Bo Sun 0 siblings, 0 replies; 6+ messages in thread From: Bo Sun @ 2025-03-21 1:17 UTC (permalink / raw) To: Manivannan Sadhasivam Cc: Bjorn Helgaas, Vidya Sagar, linux-pci, linux-kernel, Kevin Hao, Bjorn Helgaas On 3/18/25 14:29, Manivannan Sadhasivam wrote: > CAUTION: This email comes from a non Wind River email account! > Do not click links or open attachments unless you recognize the sender and know the content is safe. > > On Tue, Mar 11, 2025 at 09:52:29PM +0800, Bo Sun wrote: >> The previous implementation of of_pci_add_properties() and >> of_pci_prop_bus_range() assumed that a valid secondary bus is always >> present, which can be problematic in cases where no bus numbers are >> assigned for a secondary bus. This patch introduces a check for a valid >> secondary bus and omits the 'bus-range' property if it is not available, >> preventing dereferencing the NULL pointer. >> > > This definitely needs a Fixes tag and should be backported. OK, I will add the Fixes tag and send the v3 patches. Thanks, Bo ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2025-03-21 1:17 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-03-11 13:52 [PATCH v2 0/2] PCI: Marvell CN96XX/CN10XXX quirk and bus-range omission Bo Sun 2025-03-11 13:52 ` [PATCH v2 1/2] PCI: Forcefully set the PCI_REASSIGN_ALL_BUS flag for Marvell CN96XX/CN10XXX boards Bo Sun 2025-03-18 6:27 ` Manivannan Sadhasivam 2025-03-11 13:52 ` [PATCH v2 2/2] PCI: of_property: Omit 'bus-range' property if no secondary bus Bo Sun 2025-03-18 6:29 ` Manivannan Sadhasivam 2025-03-21 1:17 ` Bo Sun
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox