Re: [PATCH] x86/pci: derive pcibios_last_bus from ACPI MCFG

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wednesday, February 23, 2011 03:08:10 am Jan Beulich wrote:
> On various newer Intel systems the PCI bus(ses) the non-core devices
> live on aren't getting announced by ACPI except through the bus range
> covered by mmconfig. At least the i7core-edac driver depends on these
> devices getting detected.

I think you're saying:

  - the PCI host bridge has a _CRS method that reports the downstream
    bus number range
  - there are downstream devices on a bus X outside that _CRS range
  - the MCFG table has an entry that covers bus X

What are these downstream devices?  Might the BIOS be intentionally
excluding them from PCI discovery so it can use them for its own
purposes, e.g., things used by SMM code or exposed via an ACPI
namespace device?

If these devices are really intended for PCI discovery by the OS,
the fact that the _CRS range excludes the bus sounds like a simple
BIOS defect, and the workaround you propose feels like an ad hoc
strategy that could be fragile.

If the BIOS is intentionally hiding the devices by excluding the
bus from the _CRS range, I think the BIOS could (and probably should)
also exclude the bus from the ranges in the MCFG table, and then
this fix would fail.

Bjorn

> Mauro, could you check whether with this change the Xeon 55xx hack in
> that driver can go away altogether, and with it the bogus exporting of
> pcibios_scan_specific_bus()?
> 
> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx>
> Cc: Mauro Carvalho Chehab <mchehab@xxxxxxxxxx>
> Cc: Aristeu Sergio <arozansk@xxxxxxxxxx>
> 
> ---
>  arch/x86/pci/mmconfig-shared.c |   10 ++++++++++
>  1 file changed, 10 insertions(+)
> 
> --- 2.6.38-rc6/arch/x86/pci/mmconfig-shared.c
> +++ 2.6.38-rc6-x86-mmconfig-last-bus/arch/x86/pci/mmconfig-shared.c
> @@ -606,6 +606,16 @@ static void __init __pci_mmcfg_init(int 
>  	if (list_empty(&pci_mmcfg_list))
>  		return;
>  
> +	if (pcibios_last_bus < 0) {
> +		const struct pci_mmcfg_region *cfg;
> +
> +		list_for_each_entry(cfg, &pci_mmcfg_list, list) {
> +			if (cfg->segment)
> +				break;
> +			pcibios_last_bus = cfg->end_bus;
> +		}
> +	}
> +
>  	if (pci_mmcfg_arch_init())
>  		pci_probe = (pci_probe & ~PCI_PROBE_MASK) | PCI_PROBE_MMCONF;
>  	else {
> 
> 
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-pci" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-pci" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [DMA Engine]     [Linux Coverity]     [Linux USB]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Greybus]

  Powered by Linux