diff --git a/src/arch/x86/include/ipxe/pcibios.h b/src/arch/x86/include/ipxe/pcibios.h index 87b403555..b62b470f0 100644 --- a/src/arch/x86/include/ipxe/pcibios.h +++ b/src/arch/x86/include/ipxe/pcibios.h @@ -35,10 +35,11 @@ extern int pcibios_write ( struct pci_device *pci, uint32_t command, /** * Check if PCI bus probing is allowed * + * @v pci PCI device * @ret ok Bus probing is allowed */ static inline __always_inline int -PCIAPI_INLINE ( pcbios, pci_can_probe ) ( void ) { +PCIAPI_INLINE ( pcbios, pci_can_probe ) ( struct pci_device *pci __unused ) { return 1; } diff --git a/src/arch/x86/include/ipxe/pcidirect.h b/src/arch/x86/include/ipxe/pcidirect.h index 501576582..1515b20d4 100644 --- a/src/arch/x86/include/ipxe/pcidirect.h +++ b/src/arch/x86/include/ipxe/pcidirect.h @@ -28,10 +28,11 @@ extern void pcidirect_prepare ( struct pci_device *pci, int where ); /** * Check if PCI bus probing is allowed * + * @v pci PCI device * @ret ok Bus probing is allowed */ static inline __always_inline int -PCIAPI_INLINE ( direct, pci_can_probe ) ( void ) { +PCIAPI_INLINE ( direct, pci_can_probe ) ( struct pci_device *pci __unused ) { return 1; } diff --git a/src/drivers/bus/pci.c b/src/drivers/bus/pci.c index 43ccb751d..3908871b8 100644 --- a/src/drivers/bus/pci.c +++ b/src/drivers/bus/pci.c @@ -447,10 +447,6 @@ static int pcibus_probe ( struct root_device *rootdev ) { uint32_t busdevfn = 0; int rc; - /* Skip automatic probing if prohibited */ - if ( ! pci_can_probe() ) - return 0; - do { /* Allocate struct pci_device */ if ( ! pci ) @@ -464,6 +460,10 @@ static int pcibus_probe ( struct root_device *rootdev ) { if ( ( rc = pci_find_next ( pci, &busdevfn ) ) != 0 ) break; + /* Skip automatic probing if prohibited */ + if ( ! pci_can_probe ( pci ) ) + continue; + /* Look for a driver */ if ( ( rc = pci_find_driver ( pci ) ) != 0 ) { DBGC ( pci, PCI_FMT " (%04x:%04x class %06x) has no " diff --git a/src/drivers/bus/pcicloud.c b/src/drivers/bus/pcicloud.c index 9e1fd32b2..0173c3158 100644 --- a/src/drivers/bus/pcicloud.c +++ b/src/drivers/bus/pcicloud.c @@ -142,6 +142,18 @@ static struct pci_api * pcicloud_api ( struct pci_device *pci ) { return api; } +/** + * Check if PCI bus probing is allowed + * + * @v pci PCI device + * @ret ok Bus probing is allowed + */ +static int pcicloud_can_probe ( struct pci_device *pci ) { + struct pci_api *api = pcicloud_api ( pci ); + + return api->pci_can_probe ( pci ); +} + /** * Read byte from PCI configuration space * @@ -246,7 +258,7 @@ static void * pcicloud_ioremap ( struct pci_device *pci, return api->pci_ioremap ( pci, bus_addr, len ); } -PROVIDE_PCIAPI_INLINE ( cloud, pci_can_probe ); +PROVIDE_PCIAPI ( cloud, pci_can_probe, pcicloud_can_probe ); PROVIDE_PCIAPI ( cloud, pci_discover, pcicloud_discover ); PROVIDE_PCIAPI ( cloud, pci_read_config_byte, pcicloud_read_config_byte ); PROVIDE_PCIAPI ( cloud, pci_read_config_word, pcicloud_read_config_word ); diff --git a/src/include/ipxe/ecam_io.h b/src/include/ipxe/ecam_io.h index 788ba9b9a..b2c232013 100644 --- a/src/include/ipxe/ecam_io.h +++ b/src/include/ipxe/ecam_io.h @@ -139,10 +139,11 @@ PCIAPI_INLINE ( ecam, pci_ioremap ) ( struct pci_device *pci __unused, /** * Check if PCI bus probing is allowed * + * @v pci PCI device * @ret ok Bus probing is allowed */ static inline __always_inline int -PCIAPI_INLINE ( ecam, pci_can_probe ) ( void ) { +PCIAPI_INLINE ( ecam, pci_can_probe ) ( struct pci_device *pci __unused ) { return 1; } diff --git a/src/include/ipxe/efi/efi_pci_api.h b/src/include/ipxe/efi/efi_pci_api.h index 9aca02f65..956795254 100644 --- a/src/include/ipxe/efi/efi_pci_api.h +++ b/src/include/ipxe/efi/efi_pci_api.h @@ -35,10 +35,11 @@ extern int efipci_write ( struct pci_device *pci, unsigned long location, /** * Check if PCI bus probing is allowed * + * @v pci PCI device * @ret ok Bus probing is allowed */ static inline __always_inline int -PCIAPI_INLINE ( efi, pci_can_probe ) ( void ) { +PCIAPI_INLINE ( efi, pci_can_probe ) ( struct pci_device *pci __unused ) { return 0; } diff --git a/src/include/ipxe/linux/linux_pci.h b/src/include/ipxe/linux/linux_pci.h index 2b19e13c3..f9cd98819 100644 --- a/src/include/ipxe/linux/linux_pci.h +++ b/src/include/ipxe/linux/linux_pci.h @@ -25,10 +25,11 @@ extern int linux_pci_write ( struct pci_device *pci, unsigned long where, /** * Check if PCI bus probing is allowed * + * @v pci PCI device * @ret ok Bus probing is allowed */ static inline __always_inline int -PCIAPI_INLINE ( linux, pci_can_probe ) ( void ) { +PCIAPI_INLINE ( linux, pci_can_probe ) ( struct pci_device *pci __unused ) { return 1; } diff --git a/src/include/ipxe/null_pci.h b/src/include/ipxe/null_pci.h index 476ede202..0cdcdc109 100644 --- a/src/include/ipxe/null_pci.h +++ b/src/include/ipxe/null_pci.h @@ -22,10 +22,11 @@ struct pci_device; /** * Check if PCI bus probing is allowed * + * @v pci PCI device * @ret ok Bus probing is allowed */ static inline __always_inline int -PCIAPI_INLINE ( null, pci_can_probe ) ( void ) { +PCIAPI_INLINE ( null, pci_can_probe ) ( struct pci_device *pci __unused ) { return 0; } diff --git a/src/include/ipxe/pci_io.h b/src/include/ipxe/pci_io.h index 456e29e6e..0d32adf81 100644 --- a/src/include/ipxe/pci_io.h +++ b/src/include/ipxe/pci_io.h @@ -72,9 +72,10 @@ struct pci_range { /** * Check if PCI bus probing is allowed * + * @v pci PCI device * @ret ok Bus probing is allowed */ -int pci_can_probe ( void ); +int pci_can_probe ( struct pci_device *pci ); /** * Find next PCI bus:dev.fn address range in system @@ -163,6 +164,7 @@ void * pci_ioremap ( struct pci_device *pci, unsigned long bus_addr, /** A runtime selectable PCI I/O API */ struct pci_api { const char *name; + typeof ( pci_can_probe ) ( * pci_can_probe ); typeof ( pci_discover ) ( * pci_discover ); typeof ( pci_read_config_byte ) ( * pci_read_config_byte ); typeof ( pci_read_config_word ) ( * pci_read_config_word ); @@ -198,6 +200,7 @@ struct pci_api { #define PROVIDE_PCIAPI_RUNTIME( subsys, priority ) \ struct pci_api pciapi_ ## subsys __pci_api ( priority ) = { \ .name = #subsys, \ + .pci_can_probe = PCIAPI_INLINE ( subsys, pci_can_probe ), \ .pci_discover = PCIAPI_INLINE ( subsys, pci_discover ), \ .pci_read_config_byte = \ PCIAPI_INLINE ( subsys, pci_read_config_byte ), \ diff --git a/src/include/ipxe/pcicloud.h b/src/include/ipxe/pcicloud.h index 1feef56cb..52268908c 100644 --- a/src/include/ipxe/pcicloud.h +++ b/src/include/ipxe/pcicloud.h @@ -15,14 +15,4 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #define PCIAPI_PREFIX_cloud __cloud_ #endif -/** - * Check if PCI bus probing is allowed - * - * @ret ok Bus probing is allowed - */ -static inline __always_inline int -PCIAPI_INLINE ( cloud, pci_can_probe ) ( void ) { - return 1; -} - #endif /* _IPXE_PCICLOUD_H */