@ -5,6 +5,7 @@
# ifndef USE_HOSTCC
# include <common.h>
# include <dm.h>
# include <errno.h>
# include <serial.h>
# include <libfdt.h>
@ -190,7 +191,7 @@ fdt_addr_t fdtdec_get_addr(const void *blob, int node,
return fdtdec_get_addr_size ( blob , node , prop_name , NULL ) ;
}
# ifdef CONFIG_PCI
# if defined(CONFIG_PCI) && defined( CONFIG_DM_ PCI)
int fdtdec_get_pci_addr ( const void * blob , int node , enum fdt_pci_space type ,
const char * prop_name , struct fdt_pci_addr * addr )
{
@ -283,58 +284,10 @@ int fdtdec_get_pci_vendev(const void *blob, int node, u16 *vendor, u16 *device)
return - ENOENT ;
}
int fdtdec_get_pci_bdf ( const void * blob , int node ,
struct fdt_pci_addr * addr , pci_dev_t * bdf )
int fdtdec_get_pci_bar32 ( struct udevice * dev , struct fdt_pci_addr * addr ,
u32 * bar )
{
u16 dt_vendor , dt_device , vendor , device ;
int ret ;
/* get vendor id & device id from the compatible string */
ret = fdtdec_get_pci_vendev ( blob , node , & dt_vendor , & dt_device ) ;
if ( ret )
return ret ;
/* extract the bdf from fdt_pci_addr */
* bdf = addr - > phys_hi & 0xffff00 ;
/* read vendor id & device id based on bdf */
pci_read_config_word ( * bdf , PCI_VENDOR_ID , & vendor ) ;
pci_read_config_word ( * bdf , PCI_DEVICE_ID , & device ) ;
/*
* Note there are two places in the device tree to fully describe
* a pci device : one is via compatible string with a format of
* " pciVVVV,DDDD " and the other one is the bdf numbers encoded in
* the device node ' s reg address property . We read the vendor id
* and device id based on bdf and compare the values with the
* " VVVV,DDDD " . If they are the same , then we are good to use bdf
* to read device ' s bar . But if they are different , we have to rely
* on the vendor id and device id extracted from the compatible
* string and locate the real bdf by pci_find_device ( ) . This is
* because normally we may only know device ' s device number and
* function number when writing device tree . The bus number is
* dynamically assigned during the pci enumeration process .
*/
if ( ( dt_vendor ! = vendor ) | | ( dt_device ! = device ) ) {
* bdf = pci_find_device ( dt_vendor , dt_device , 0 ) ;
if ( * bdf = = - 1 )
return - ENODEV ;
}
return 0 ;
}
int fdtdec_get_pci_bar32 ( const void * blob , int node ,
struct fdt_pci_addr * addr , u32 * bar )
{
pci_dev_t bdf ;
int barnum ;
int ret ;
/* get pci devices's bdf */
ret = fdtdec_get_pci_bdf ( blob , node , addr , & bdf ) ;
if ( ret )
return ret ;
/* extract the bar number from fdt_pci_addr */
barnum = addr - > phys_hi & 0xff ;
@ -342,7 +295,7 @@ int fdtdec_get_pci_bar32(const void *blob, int node,
return - EINVAL ;
barnum = ( barnum - PCI_BASE_ADDRESS_0 ) / 4 ;
* bar = pci_read_bar32 ( pci_bus_to_hose ( PCI_BUS ( bdf ) ) , bdf , barnum ) ;
* bar = dm_ pci_read_bar32( dev , barnum ) ;
return 0 ;
}