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