2019-05-19 15:08:55 +03:00
// SPDX-License-Identifier: GPL-2.0-only
2005-04-17 02:20:36 +04:00
/*
* legacy . c - traditional , old school PCI bus probing
*/
# include <linux/init.h>
2011-05-26 20:22:53 +04:00
# include <linux/export.h>
2005-04-17 02:20:36 +04:00
# include <linux/pci.h>
2018-03-07 10:39:13 +03:00
# include <asm/jailhouse_para.h>
2008-12-27 16:02:28 +03:00
# include <asm/pci_x86.h>
2005-04-17 02:20:36 +04:00
/*
* Discover remaining PCI buses in case there are peer host bridges .
* We use the number of last PCI bus provided by the PCI BIOS .
*/
2012-12-22 02:02:53 +04:00
static void pcibios_fixup_peer_bridges ( void )
2005-04-17 02:20:36 +04:00
{
2009-07-10 05:21:13 +04:00
int n ;
2005-04-17 02:20:36 +04:00
2008-08-12 01:11:05 +04:00
if ( pcibios_last_bus < = 0 | | pcibios_last_bus > 0xff )
2005-04-17 02:20:36 +04:00
return ;
DBG ( " PCI: Peer bridge fixup \n " ) ;
2009-07-10 05:21:13 +04:00
for ( n = 0 ; n < = pcibios_last_bus ; n + + )
pcibios_scan_specific_bus ( n ) ;
2005-04-17 02:20:36 +04:00
}
2009-08-29 18:24:51 +04:00
int __init pci_legacy_init ( void )
2005-04-17 02:20:36 +04:00
{
2017-03-17 00:50:04 +03:00
if ( ! raw_pci_ops )
return 1 ;
2005-04-17 02:20:36 +04:00
2017-03-17 00:50:04 +03:00
pr_info ( " PCI: Probing PCI hardware \n " ) ;
2013-01-04 02:28:34 +04:00
pcibios_scan_root ( 0 ) ;
2005-04-17 02:20:36 +04:00
return 0 ;
}
2009-07-10 05:21:13 +04:00
2012-12-22 02:02:53 +04:00
void pcibios_scan_specific_bus ( int busn )
2009-07-10 05:21:13 +04:00
{
2018-03-07 10:39:13 +03:00
int stride = jailhouse_paravirt ( ) ? 1 : 8 ;
2009-07-10 05:21:13 +04:00
int devfn ;
u32 l ;
if ( pci_find_bus ( 0 , busn ) )
return ;
2018-03-07 10:39:13 +03:00
for ( devfn = 0 ; devfn < 256 ; devfn + = stride ) {
2009-07-10 05:21:13 +04:00
if ( ! raw_pci_read ( 0 , busn , devfn , PCI_VENDOR_ID , 2 , & l ) & &
l ! = 0x0000 & & l ! = 0xffff ) {
DBG ( " Found device at %02x:%02x [%04x] \n " , busn , devfn , l ) ;
2017-03-17 00:50:04 +03:00
pr_info ( " PCI: Discovered peer bus %02x \n " , busn ) ;
2014-01-24 22:50:48 +04:00
pcibios_scan_root ( busn ) ;
2009-07-10 05:21:13 +04:00
return ;
}
}
}
2009-07-11 01:39:53 +04:00
EXPORT_SYMBOL_GPL ( pcibios_scan_specific_bus ) ;
2005-04-17 02:20:36 +04:00
2015-10-08 21:51:46 +03:00
static int __init pci_subsys_init ( void )
2008-07-03 00:50:29 +04:00
{
2009-08-29 18:24:51 +04:00
/*
* The init function returns an non zero value when
* pci_legacy_init should be invoked .
*/
2017-03-17 00:50:04 +03:00
if ( x86_init . pci . init ( ) ) {
if ( pci_legacy_init ( ) ) {
pr_info ( " PCI: System does not support PCI \n " ) ;
return - ENODEV ;
}
}
2009-08-29 18:24:51 +04:00
2009-03-25 23:26:13 +03:00
pcibios_fixup_peer_bridges ( ) ;
2009-08-29 19:47:33 +04:00
x86_init . pci . init_irq ( ) ;
2008-07-03 00:50:29 +04:00
pcibios_init ( ) ;
2008-07-10 20:58:25 +04:00
return 0 ;
2008-07-03 00:50:29 +04:00
}
subsys_initcall ( pci_subsys_init ) ;