@ -182,10 +182,10 @@ u32 pci_read_bar32(struct pci_controller *hose, pci_dev_t dev, int barnum)
}
int __pci_hose_bus_to_phys ( struct pci_controller * hose ,
pci_addr_t bus_addr ,
unsigned long flags ,
unsigned long skip_mask ,
phys_addr_t * pa )
pci_addr_t bus_addr ,
unsigned long flags ,
unsigned long skip_mask ,
phys_addr_t * pa )
{
struct pci_region * res ;
int i ;
@ -240,6 +240,68 @@ phys_addr_t pci_hose_bus_to_phys(struct pci_controller *hose,
return phys_addr ;
}
int __pci_hose_phys_to_bus ( struct pci_controller * hose ,
phys_addr_t phys_addr ,
unsigned long flags ,
unsigned long skip_mask ,
pci_addr_t * ba )
{
struct pci_region * res ;
pci_addr_t bus_addr ;
int i ;
for ( i = 0 ; i < hose - > region_count ; i + + ) {
res = & hose - > regions [ i ] ;
if ( ( ( res - > flags ^ flags ) & PCI_REGION_TYPE ) ! = 0 )
continue ;
if ( res - > flags & skip_mask )
continue ;
bus_addr = phys_addr - res - > phys_start + res - > bus_start ;
if ( bus_addr > = res - > bus_start & &
bus_addr < res - > bus_start + res - > size ) {
* ba = bus_addr ;
return 0 ;
}
}
return 1 ;
}
pci_addr_t pci_hose_phys_to_bus ( struct pci_controller * hose ,
phys_addr_t phys_addr ,
unsigned long flags )
{
pci_addr_t bus_addr = 0 ;
int ret ;
if ( ! hose ) {
puts ( " pci_hose_phys_to_bus: invalid hose \n " ) ;
return bus_addr ;
}
/*
* if PCI_REGION_MEM is set we do a two pass search with preference
* on matches that don ' t have PCI_REGION_SYS_MEMORY set
*/
if ( ( flags & PCI_REGION_MEM ) = = PCI_REGION_MEM ) {
ret = __pci_hose_phys_to_bus ( hose , phys_addr ,
flags , PCI_REGION_SYS_MEMORY , & bus_addr ) ;
if ( ! ret )
return bus_addr ;
}
ret = __pci_hose_phys_to_bus ( hose , phys_addr , flags , 0 , & bus_addr ) ;
if ( ret )
puts ( " pci_hose_phys_to_bus: invalid physical address \n " ) ;
return bus_addr ;
}
pci_dev_t pci_find_device ( unsigned int vendor , unsigned int device , int index )
{
struct pci_device_id ids [ 2 ] = { { } , { 0 , 0 } } ;