Rafael J. Wysocki | 2 Aug 23:56
Picon
Gravatar

[PATCH 4/8] PCI / PCIe: Ask BIOS for control of all native services at once (v6)

From: Rafael J. Wysocki <rjw <at> sisk.pl>

PCIe port service drivers ask the BIOS, through _OSC, for control of
the services they handle.  Unfortunately, each of them individually
asks for control of the PCIe capability structure and if that is
granted, some BIOSes expect that the other PCIe port services will be
configured and handled by the kernel as well.  If that is not the
case (eg. one of the PCIe port service drivers is not loaded), the
BIOS may be confused and may cause the system as a whole to misbehave
(eg. on one of such systems enabling the native PCIe PME service
without loading the native PCIe hot-plug service driver causes a
storm of ACPI notify requests to appear).

For this reason rework the PCIe port driver so that (1) it checks
which native PCIe port services can be enabled, according to the
BIOS, and (2) it requests control of all these services
simultaneously.  In particular, this causes pcie_portdrv_probe() to
fail if the BIOS refuses to grant control of the PCIe capability
structure, which means that no native PCIe port services can be
enabled for the PCIe root complex the given port belongs to.

Make it possible to override this behavior using 'pcie_ports=native'
(use the PCIe native services regardless of the BIOS response to the
control request), or 'pcie_ports=compat' (do not use the PCIe native
services at all).

Accordingly, rework the existing PCIe port service drivers so that
they don't request control of the services directly.

Signed-off-by: Rafael J. Wysocki <rjw <at> sisk.pl>
(Continue reading)

Hidetoshi Seto | 3 Aug 03:14
Favicon

Re: [PATCH 4/8] PCI / PCIe: Ask BIOS for control of all native services at once (v6)

(2010/08/03 6:56), Rafael J. Wysocki wrote:
> +int pcie_port_acpi_setup(struct pci_dev *port, int *srv_mask)
> +{
> +	acpi_status status;
> +	acpi_handle handle;
> +	u32 flags;
> +
> +	if (acpi_pci_disabled)
> +		return 0;
> +
> +	handle = acpi_find_root_bridge_handle(port);
> +	if (!handle)
> +		return -EINVAL;
> +
> +	flags = OSC_PCI_EXPRESS_CAP_STRUCTURE_CONTROL
> +		| OSC_PCI_EXPRESS_NATIVE_HP_CONTROL
> +		| OSC_PCI_EXPRESS_PME_CONTROL;
> +
> +	if (pcie_aer_get_firmware_first(port))
> +		dev_dbg(&port->dev, "PCIe errors handled by BIOS.\n");
> +	else if (pci_aer_available())
> +		flags |= OSC_PCI_EXPRESS_AER_CONTROL;

Is the debug message necessary even when AER is not available?
At least current code doesn't output such strings when pci=noaer,
since AER service driver is not loaded.

if (pci_aer_available()) {
	if (pcie_aer_get_firmware_first(port))
		dev_dbg(&port->dev, "PCIe errors handled by BIOS.\n");
(Continue reading)

Rafael J. Wysocki | 3 Aug 23:01
Picon
Gravatar

Re: [PATCH 4/8] PCI / PCIe: Ask BIOS for control of all native services at once (v6)

On Tuesday, August 03, 2010, Hidetoshi Seto wrote:
> (2010/08/03 6:56), Rafael J. Wysocki wrote:
> > +int pcie_port_acpi_setup(struct pci_dev *port, int *srv_mask)
> > +{
> > +	acpi_status status;
> > +	acpi_handle handle;
> > +	u32 flags;
> > +
> > +	if (acpi_pci_disabled)
> > +		return 0;
> > +
> > +	handle = acpi_find_root_bridge_handle(port);
> > +	if (!handle)
> > +		return -EINVAL;
> > +
> > +	flags = OSC_PCI_EXPRESS_CAP_STRUCTURE_CONTROL
> > +		| OSC_PCI_EXPRESS_NATIVE_HP_CONTROL
> > +		| OSC_PCI_EXPRESS_PME_CONTROL;
> > +
> > +	if (pcie_aer_get_firmware_first(port))
> > +		dev_dbg(&port->dev, "PCIe errors handled by BIOS.\n");
> > +	else if (pci_aer_available())
> > +		flags |= OSC_PCI_EXPRESS_AER_CONTROL;
> 
> Is the debug message necessary even when AER is not available?
> At least current code doesn't output such strings when pci=noaer,
> since AER service driver is not loaded.
> 
> if (pci_aer_available()) {
> 	if (pcie_aer_get_firmware_first(port))
(Continue reading)

Rafael J. Wysocki | 3 Aug 23:01
Picon
Gravatar

Re: [PATCH 4/8] PCI / PCIe: Ask BIOS for control of all native services at once (v6)

On Tuesday, August 03, 2010, Hidetoshi Seto wrote:
> (2010/08/03 6:56), Rafael J. Wysocki wrote:
> > +int pcie_port_acpi_setup(struct pci_dev *port, int *srv_mask)
> > +{
> > +	acpi_status status;
> > +	acpi_handle handle;
> > +	u32 flags;
> > +
> > +	if (acpi_pci_disabled)
> > +		return 0;
> > +
> > +	handle = acpi_find_root_bridge_handle(port);
> > +	if (!handle)
> > +		return -EINVAL;
> > +
> > +	flags = OSC_PCI_EXPRESS_CAP_STRUCTURE_CONTROL
> > +		| OSC_PCI_EXPRESS_NATIVE_HP_CONTROL
> > +		| OSC_PCI_EXPRESS_PME_CONTROL;
> > +
> > +	if (pcie_aer_get_firmware_first(port))
> > +		dev_dbg(&port->dev, "PCIe errors handled by BIOS.\n");
> > +	else if (pci_aer_available())
> > +		flags |= OSC_PCI_EXPRESS_AER_CONTROL;
> 
> Is the debug message necessary even when AER is not available?
> At least current code doesn't output such strings when pci=noaer,
> since AER service driver is not loaded.
> 
> if (pci_aer_available()) {
> 	if (pcie_aer_get_firmware_first(port))
(Continue reading)

Hidetoshi Seto | 3 Aug 03:14
Favicon

Re: [PATCH 4/8] PCI / PCIe: Ask BIOS for control of all native services at once (v6)

(2010/08/03 6:56), Rafael J. Wysocki wrote:
> +int pcie_port_acpi_setup(struct pci_dev *port, int *srv_mask)
> +{
> +	acpi_status status;
> +	acpi_handle handle;
> +	u32 flags;
> +
> +	if (acpi_pci_disabled)
> +		return 0;
> +
> +	handle = acpi_find_root_bridge_handle(port);
> +	if (!handle)
> +		return -EINVAL;
> +
> +	flags = OSC_PCI_EXPRESS_CAP_STRUCTURE_CONTROL
> +		| OSC_PCI_EXPRESS_NATIVE_HP_CONTROL
> +		| OSC_PCI_EXPRESS_PME_CONTROL;
> +
> +	if (pcie_aer_get_firmware_first(port))
> +		dev_dbg(&port->dev, "PCIe errors handled by BIOS.\n");
> +	else if (pci_aer_available())
> +		flags |= OSC_PCI_EXPRESS_AER_CONTROL;

Is the debug message necessary even when AER is not available?
At least current code doesn't output such strings when pci=noaer,
since AER service driver is not loaded.

if (pci_aer_available()) {
	if (pcie_aer_get_firmware_first(port))
		dev_dbg(&port->dev, "PCIe errors handled by BIOS.\n");
(Continue reading)

Hidetoshi Seto | 6 Aug 03:33
Favicon

Re: [PATCH 4/8] PCI / PCIe: Ask BIOS for control of all native services at once (v6)

Rafael,

I found that following 2 hunks break kernel build with O= option. 

(2010/08/03 6:56), Rafael J. Wysocki wrote:
> Index: linux-2.6/drivers/pci/pcie/Makefile
> ===================================================================
> --- linux-2.6.orig/drivers/pci/pcie/Makefile
> +++ linux-2.6/drivers/pci/pcie/Makefile
> @@ -6,10 +6,11 @@
>  obj-$(CONFIG_PCIEASPM)		+= aspm.o
>  
>  pcieportdrv-y			:= portdrv_core.o portdrv_pci.o portdrv_bus.o
> +pcieportdrv-$(CONFIG_ACPI)	+= portdrv_acpi.o
>  
>  obj-$(CONFIG_PCIEPORTBUS)	+= pcieportdrv.o
>  
>  # Build PCI Express AER if needed
>  obj-$(CONFIG_PCIEAER)		+= aer/
>  
> -obj-$(CONFIG_PCIE_PME) += pme/
> +obj-$(CONFIG_PCIE_PME) += pme/pcie_pme.o

and

> Index: linux-2.6/drivers/pci/pcie/pme/Makefile
> ===================================================================
> --- linux-2.6.orig/drivers/pci/pcie/pme/Makefile
> +++ /dev/null
> @@ -1,8 +0,0 @@
(Continue reading)

Rafael J. Wysocki | 6 Aug 12:47
Picon
Gravatar

Re: [PATCH 4/8] PCI / PCIe: Ask BIOS for control of all native services at once (v6)

On Friday, August 06, 2010, Hidetoshi Seto wrote:
> Rafael,
> 
> I found that following 2 hunks break kernel build with O= option. 
> 
> (2010/08/03 6:56), Rafael J. Wysocki wrote:
> > Index: linux-2.6/drivers/pci/pcie/Makefile
> > ===================================================================
> > --- linux-2.6.orig/drivers/pci/pcie/Makefile
> > +++ linux-2.6/drivers/pci/pcie/Makefile
> > @@ -6,10 +6,11 @@
> >  obj-$(CONFIG_PCIEASPM)		+= aspm.o
> >  
> >  pcieportdrv-y			:= portdrv_core.o portdrv_pci.o portdrv_bus.o
> > +pcieportdrv-$(CONFIG_ACPI)	+= portdrv_acpi.o
> >  
> >  obj-$(CONFIG_PCIEPORTBUS)	+= pcieportdrv.o
> >  
> >  # Build PCI Express AER if needed
> >  obj-$(CONFIG_PCIEAER)		+= aer/
> >  
> > -obj-$(CONFIG_PCIE_PME) += pme/
> > +obj-$(CONFIG_PCIE_PME) += pme/pcie_pme.o
> 
> and
> 
> > Index: linux-2.6/drivers/pci/pcie/pme/Makefile
> > ===================================================================
> > --- linux-2.6.orig/drivers/pci/pcie/pme/Makefile
> > +++ /dev/null
(Continue reading)

Hidetoshi Seto | 6 Aug 03:33
Favicon

Re: [PATCH 4/8] PCI / PCIe: Ask BIOS for control of all native services at once (v6)

Rafael,

I found that following 2 hunks break kernel build with O= option. 

(2010/08/03 6:56), Rafael J. Wysocki wrote:
> Index: linux-2.6/drivers/pci/pcie/Makefile
> ===================================================================
> --- linux-2.6.orig/drivers/pci/pcie/Makefile
> +++ linux-2.6/drivers/pci/pcie/Makefile
> @@ -6,10 +6,11 @@
>  obj-$(CONFIG_PCIEASPM)		+= aspm.o
>  
>  pcieportdrv-y			:= portdrv_core.o portdrv_pci.o portdrv_bus.o
> +pcieportdrv-$(CONFIG_ACPI)	+= portdrv_acpi.o
>  
>  obj-$(CONFIG_PCIEPORTBUS)	+= pcieportdrv.o
>  
>  # Build PCI Express AER if needed
>  obj-$(CONFIG_PCIEAER)		+= aer/
>  
> -obj-$(CONFIG_PCIE_PME) += pme/
> +obj-$(CONFIG_PCIE_PME) += pme/pcie_pme.o

and

> Index: linux-2.6/drivers/pci/pcie/pme/Makefile
> ===================================================================
> --- linux-2.6.orig/drivers/pci/pcie/pme/Makefile
> +++ /dev/null
> @@ -1,8 +0,0 @@
(Continue reading)


Gmane