All of lore.kernel.org
 help / color / mirror / Atom feed
From: Bjorn Helgaas <helgaas@kernel.org>
To: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>,
	linux-pci@vger.kernel.org, linux-acpi@vger.kernel.org,
	linux-kernel@vger.kernel.org, rafael@kernel.org, lukas@wunner.de,
	terry.bowman@amd.com, kanie@linux.alibaba.com, olof@lixom.net
Subject: Re: [PATCH v14 3/4] PCI/ACPI: Centralize pcie_ports_native checking
Date: Thu, 1 Oct 2026 17:14:08 -0500	[thread overview]
Message-ID: <20261001221408.GA2731929@bhelgaas> (raw)
In-Reply-To: <0ec0bafa-77f7-4807-bc08-a23b3b618e54@linux.intel.com>

On Thu, Oct 01, 2026 at 02:48:46PM -0700, Kuppuswamy Sathyanarayanan wrote:
> Hi Bjorn,
> 
> On 10/1/2026 1:54 PM, Bjorn Helgaas wrote:
> > On Tue, Sep 22, 2026 at 01:45:47PM -0700, Kuppuswamy Sathyanarayanan wrote:
> >> If the user booted with "pcie_ports=native", we take control of the PCIe
> >> port services unconditionally, regardless of what _OSC says.
> >>
> >> Centralize the testing of pcie_ports_native in acpi_pci_root_create(),
> >> where we interpret the _OSC results, so other places only have to check
> >> host_bridge->native_X and we don't have to sprinkle tests of
> >> pcie_ports_native everywhere.
> >>
> >> Rather than overriding the host_bridge->native_X flags after the fact,
> >> fold "pcie_ports=native" into the _OSC control mask we evaluate, i.e.,
> >> proceed as though the platform had granted control of the port services.
> >> That way there is a single mechanism deciding each native_X flag, and we
> >> can report exactly which features we are overriding _OSC for instead of
> >> just noting that we are overriding something:
> >>
> >>   acpi PNP0A08:00: _OSC: OS forcing control ("pcie_ports=native") of [PCIeHotplug PME AER DPC]
> >>
> >> Forcing host_bridge->native_aer also restores DPC service binding under
> >> "pcie_ports=native", which regressed in commit 97ca178c899d ("PCI/DPC:
> >> Allow DPC on all Downstream Ports when OS controls AER").  That commit
> >> replaced the AER service test in get_port_device_capability() with
> >> host->native_aer, so DPC stayed off when host_bridge->native_aer was not
> >> set.
> >>
> >> This also extends "pcie_ports=native" to host_bridge->native_dpc, which
> >> had no pcie_ports_native fallback before.  That effect is narrow.
> >> native_dpc is only consumed by pci_dpc_recovered(), where with
> >> CONFIG_PCIE_EDR=n it previously gave up immediately and now lets pciehp
> >> wait for DPC recovery before treating a Link Down as a hotplug event.
> >>
> >> host_bridge->native_ltr is deliberately not forced.  "pcie_ports="
> >> controls PCIe port services and LTR is not one.  There is no
> >> PCIE_PORT_SERVICE_LTR, and native_ltr is only used by
> >> pci_configure_ltr() to enable ASPM L1.2, so forcing it would be an ASPM
> >> policy decision users did not ask for.
> >>
> >> SHPC hotplug is left alone for a simpler reason: SHPC is a conventional
> >> PCI feature rather than a PCIe one, so "pcie_ports=" has no bearing on
> >> it.
> ...

> >> +	/*
> >> +	 * If the user specified "pcie_ports=native", use the PCIe port
> >> +	 * services regardless of what _OSC says, i.e., proceed as though the
> >> +	 * platform had granted us control of them.  This may conflict with
> >> +	 * firmware that expects to own those features.
> >> +	 */
> >> +	if (pcie_ports_native) {
> >> +		u32 override = OSC_PCIE_PORT_SERVICE_CONTROLS & ~ctrl;
> >> +
> >> +		if (override)
> >> +			decode_osc_control(root, "OS forcing control (\"pcie_ports=native\") of",
> >> +					   override);
> >> +		ctrl |= override;
> >> +	}
> >> +
> >>  	OSC_OWNER(ctrl, OSC_PCI_EXPRESS_NATIVE_HP_CONTROL,
> >>  		  host_bridge->native_pcie_hotplug);
> >>  	OSC_OWNER(ctrl, OSC_PCI_SHPC_NATIVE_HP_CONTROL,
> >> @@ -1051,6 +1079,14 @@ struct pci_bus *acpi_pci_root_create(struct acpi_pci_root *root,
> >>  	OSC_OWNER(ext_ctrl, OSC_CXL_ERROR_REPORTING_CONTROL,
> >>  		  host_bridge->native_cxl_error);
> >>  
> >> +	dev_info(&root->device->dev, "OS native features: SHPCHotplug%c PCIeHotplug%c PME%c AER%c DPC%c LTR%c\n",
> >> +		 FLAG(host_bridge->native_shpc_hotplug),
> >> +		 FLAG(host_bridge->native_pcie_hotplug),
> >> +		 FLAG(host_bridge->native_pme),
> >> +		 FLAG(host_bridge->native_aer),
> >> +		 FLAG(host_bridge->native_dpc),
> > 
> > I think the native_dpc printed here is inaccurate if booted with
> > "pci=dpc-native", isn't it?
> 
> Yes, it is inaccurate.  "pcie_ports=dpc-native" has never set
> native_dpc, but this patch is the first to print it, so I will fix it
> here.
> 
> I will fold it into the same override block, so both parameters go
> through the control mask and get logged the same way, something like:
> 
> 	u32 override = 0;
> 
> 	if (pcie_ports_native)
> 		override = OSC_PCIE_PORT_SERVICE_CONTROLS & ~ctrl;
> 	else if (pcie_ports_dpc_native)
> 		override = OSC_PCI_EXPRESS_DPC_CONTROL & ~ctrl;
> 
> 	if (override) {
> 		decode_osc_control(root, pcie_ports_native ?
> 				   "OS forcing control (\"pcie_ports=native\") of" :
> 				   "OS forcing control (\"pcie_ports=dpc-native\") of",
> 				   override);
> 		ctrl |= override;
> 	}

Sounds good.

> > The DPC probe handling still seems kind of convoluted.  In portdrv.c,
> > we have this:
> > 
> >   get_port_device_capability()
> >   {
> >     if (pci_find_ext_capability(dev, PCI_EXT_CAP_ID_DPC) &&
> > 	pci_aer_available() &&
> > 	(pcie_ports_dpc_native || host->native_aer))
> > 	    services |= PCIE_PORT_SERVICE_DPC;
> > 
> > And then we have this in dpc.c:
> > 
> >   dpc_probe()
> >   {
> >     if (!pcie_aer_is_native(pdev) && !pcie_ports_dpc_native)
> > 	    return -ENOTSUPP;
> > 
> > The combination of get_port_device_capability() and dpc_probe() makes
> > my head hurt.
> > 
> > It seems like the DPC clause of get_port_device_capability() should be
> > parallel to the AER clause, i.e., set PCIE_PORT_SERVICE_DPC if the
> > device has a DPC Capability and the OS owns DPC (host->native_dpc).
> > Anything other than that needs explanation.
> > 
> > I'm confused about why host->native_dpc is not involved in the
> > dpc_probe() path at all.
> 
> Agreed, DPC should be decided on its own, independent of AER.  Today it
> is tied to AER in several places:
> 
> 1. portdrv binds DPC on host->native_aer, not native_dpc, following
>    the PCIe r7.0 sec 6.2.11 implementation note that links DPC control
>    to AER control (97ca178c899d).
> 2. The pci_aer_available() test in the same clause means "pci=noaer"
>    also disables DPC.
> 3. dpc_probe() repeats the ownership check via pcie_aer_is_native(),
>    which also tests dev->aer_cap, so DPC never binds on ports without
>    an AER Capability.
> 4. native_dpc is only consumed by pci_dpc_recovered().
> 
> With the change above, both "pcie_ports=native" and
> "pcie_ports=dpc-native" set native_dpc, so binding on native_dpc would
> work for them.  The problem is the default case, with no "pcie_ports="
> parameter.  We only request OSC_PCI_EXPRESS_DPC_CONTROL when
> CONFIG_PCIE_EDR=y, as the PCI Firmware spec requires, so on an EDR=n
> kernel native_dpc is never set on ACPI systems.

Right, I forgot about that.  This deserves a comment in the code
somewhere.

I think we still need to be able to use DPC without EDR on non-ACPI
systems.

> Today DPC still binds there through native_aer, and switching
> portdrv to test native_dpc alone would silently turn DPC off on
> those systems.

It would be nice if we could make native_dpc be the end result of AER,
EDR, and anything else that determines whether the OS can actually use
DPC.

> I think the simplest fix is to make PCIE_DPC "select PCIE_EDR if ACPI",
> so an ACPI kernel with DPC always negotiates DPC control and native_dpc
> reflects what firmware actually granted.  Then portdrv can bind DPC on
> "DPC Capability && native_dpc", just like the AER clause.
> 
> Lukas has posted a series that removes the DPC/AER dependency:
> 
>   https://lore.kernel.org/r/cover.1790531238.git.lukas@wunner.de
> 
> His 1/7 lets DPC work without an AER Capability, and 2/7 removes the
> dpc_probe() check entirely, so portdrv becomes the only place that
> decides.  The native_dpc change fits naturally on top of that.
> 
> Would you like me to do the native_dpc change in this series, or as a
> separate patch on top of Lukas's series?  If we do it as a separate
> patch on top of Lukas's work, this series can stay a cleanup (plus the
> fix for Guixin's issue).

Doing it on top of Lukas's series sounds good to me.

  reply	other threads:[~2026-10-01 22:14 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-22 20:45 [PATCH v14 0/4] Simplify PCIe native ownership Kuppuswamy Sathyanarayanan
2026-09-22 20:45 ` [PATCH v14 1/4] PCI: Assume control of portdrv-related features only when portdrv enabled Kuppuswamy Sathyanarayanan
2026-09-22 20:57   ` sashiko-bot
2026-09-22 20:45 ` [PATCH v14 2/4] PCI/ACPI: Tidy _OSC control bit checking Kuppuswamy Sathyanarayanan
2026-09-22 20:49   ` sashiko-bot
2026-09-22 20:45 ` [PATCH v14 3/4] PCI/ACPI: Centralize pcie_ports_native checking Kuppuswamy Sathyanarayanan
2026-09-22 20:56   ` sashiko-bot
2026-09-23  1:44   ` Guixin Liu
2026-10-01 20:54   ` Bjorn Helgaas
2026-10-01 21:48     ` Kuppuswamy Sathyanarayanan
2026-10-01 22:14       ` Bjorn Helgaas [this message]
2026-09-22 20:45 ` [PATCH v14 4/4] PCI: Centralize pci_aer_available() checking Kuppuswamy Sathyanarayanan
2026-09-22 21:00   ` sashiko-bot

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20261001221408.GA2731929@bhelgaas \
    --to=helgaas@kernel.org \
    --cc=bhelgaas@google.com \
    --cc=kanie@linux.alibaba.com \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=lukas@wunner.de \
    --cc=olof@lixom.net \
    --cc=rafael@kernel.org \
    --cc=sathyanarayanan.kuppuswamy@linux.intel.com \
    --cc=terry.bowman@amd.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.