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>
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 .
*/
static void __devinit pcibios_fixup_peer_bridges ( void )
{
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
{
if ( ! raw_pci_ops ) {
printk ( " PCI: System does not support PCI \n " ) ;
return 0 ;
}
printk ( " PCI: Probing PCI hardware \n " ) ;
pci_root_bus = pcibios_scan_root ( 0 ) ;
return 0 ;
}
2009-07-10 05:21:13 +04:00
2010-06-15 17:43:19 +04:00
void __devinit pcibios_scan_specific_bus ( int busn )
2009-07-10 05:21:13 +04:00
{
int devfn ;
long node ;
u32 l ;
if ( pci_find_bus ( 0 , busn ) )
return ;
node = get_mp_bus_to_node ( busn ) ;
for ( devfn = 0 ; devfn < 256 ; devfn + = 8 ) {
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 ) ;
printk ( KERN_INFO " PCI: Discovered peer bus %02x \n " , busn ) ;
pci_scan_bus_on_node ( busn , & pci_root_ops , node ) ;
return ;
}
}
}
2009-07-11 01:39:53 +04:00
EXPORT_SYMBOL_GPL ( pcibios_scan_specific_bus ) ;
2005-04-17 02:20:36 +04:00
2008-07-03 00:50:29 +04:00
int __init pci_subsys_init ( void )
{
2009-08-29 18:24:51 +04:00
/*
* The init function returns an non zero value when
* pci_legacy_init should be invoked .
*/
if ( x86_init . pci . init ( ) )
pci_legacy_init ( ) ;
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 ) ;