mirror of
https://github.com/ipxe/ipxe
synced 2025-12-07 01:40:28 +03:00
[pci] Allow probing permission to vary by range
Make pci_can_probe() part of the runtime selectable PCI I/O API, and defer this check to the per-range API. Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
@@ -35,10 +35,11 @@ extern int pcibios_write ( struct pci_device *pci, uint32_t command,
|
|||||||
/**
|
/**
|
||||||
* Check if PCI bus probing is allowed
|
* Check if PCI bus probing is allowed
|
||||||
*
|
*
|
||||||
|
* @v pci PCI device
|
||||||
* @ret ok Bus probing is allowed
|
* @ret ok Bus probing is allowed
|
||||||
*/
|
*/
|
||||||
static inline __always_inline int
|
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;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -28,10 +28,11 @@ extern void pcidirect_prepare ( struct pci_device *pci, int where );
|
|||||||
/**
|
/**
|
||||||
* Check if PCI bus probing is allowed
|
* Check if PCI bus probing is allowed
|
||||||
*
|
*
|
||||||
|
* @v pci PCI device
|
||||||
* @ret ok Bus probing is allowed
|
* @ret ok Bus probing is allowed
|
||||||
*/
|
*/
|
||||||
static inline __always_inline int
|
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;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -447,10 +447,6 @@ static int pcibus_probe ( struct root_device *rootdev ) {
|
|||||||
uint32_t busdevfn = 0;
|
uint32_t busdevfn = 0;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
/* Skip automatic probing if prohibited */
|
|
||||||
if ( ! pci_can_probe() )
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
do {
|
do {
|
||||||
/* Allocate struct pci_device */
|
/* Allocate struct pci_device */
|
||||||
if ( ! pci )
|
if ( ! pci )
|
||||||
@@ -464,6 +460,10 @@ static int pcibus_probe ( struct root_device *rootdev ) {
|
|||||||
if ( ( rc = pci_find_next ( pci, &busdevfn ) ) != 0 )
|
if ( ( rc = pci_find_next ( pci, &busdevfn ) ) != 0 )
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
/* Skip automatic probing if prohibited */
|
||||||
|
if ( ! pci_can_probe ( pci ) )
|
||||||
|
continue;
|
||||||
|
|
||||||
/* Look for a driver */
|
/* Look for a driver */
|
||||||
if ( ( rc = pci_find_driver ( pci ) ) != 0 ) {
|
if ( ( rc = pci_find_driver ( pci ) ) != 0 ) {
|
||||||
DBGC ( pci, PCI_FMT " (%04x:%04x class %06x) has no "
|
DBGC ( pci, PCI_FMT " (%04x:%04x class %06x) has no "
|
||||||
|
|||||||
@@ -142,6 +142,18 @@ static struct pci_api * pcicloud_api ( struct pci_device *pci ) {
|
|||||||
return api;
|
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
|
* 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 );
|
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_discover, pcicloud_discover );
|
||||||
PROVIDE_PCIAPI ( cloud, pci_read_config_byte, pcicloud_read_config_byte );
|
PROVIDE_PCIAPI ( cloud, pci_read_config_byte, pcicloud_read_config_byte );
|
||||||
PROVIDE_PCIAPI ( cloud, pci_read_config_word, pcicloud_read_config_word );
|
PROVIDE_PCIAPI ( cloud, pci_read_config_word, pcicloud_read_config_word );
|
||||||
|
|||||||
@@ -139,10 +139,11 @@ PCIAPI_INLINE ( ecam, pci_ioremap ) ( struct pci_device *pci __unused,
|
|||||||
/**
|
/**
|
||||||
* Check if PCI bus probing is allowed
|
* Check if PCI bus probing is allowed
|
||||||
*
|
*
|
||||||
|
* @v pci PCI device
|
||||||
* @ret ok Bus probing is allowed
|
* @ret ok Bus probing is allowed
|
||||||
*/
|
*/
|
||||||
static inline __always_inline int
|
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;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -35,10 +35,11 @@ extern int efipci_write ( struct pci_device *pci, unsigned long location,
|
|||||||
/**
|
/**
|
||||||
* Check if PCI bus probing is allowed
|
* Check if PCI bus probing is allowed
|
||||||
*
|
*
|
||||||
|
* @v pci PCI device
|
||||||
* @ret ok Bus probing is allowed
|
* @ret ok Bus probing is allowed
|
||||||
*/
|
*/
|
||||||
static inline __always_inline int
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -25,10 +25,11 @@ extern int linux_pci_write ( struct pci_device *pci, unsigned long where,
|
|||||||
/**
|
/**
|
||||||
* Check if PCI bus probing is allowed
|
* Check if PCI bus probing is allowed
|
||||||
*
|
*
|
||||||
|
* @v pci PCI device
|
||||||
* @ret ok Bus probing is allowed
|
* @ret ok Bus probing is allowed
|
||||||
*/
|
*/
|
||||||
static inline __always_inline int
|
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;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -22,10 +22,11 @@ struct pci_device;
|
|||||||
/**
|
/**
|
||||||
* Check if PCI bus probing is allowed
|
* Check if PCI bus probing is allowed
|
||||||
*
|
*
|
||||||
|
* @v pci PCI device
|
||||||
* @ret ok Bus probing is allowed
|
* @ret ok Bus probing is allowed
|
||||||
*/
|
*/
|
||||||
static inline __always_inline int
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -72,9 +72,10 @@ struct pci_range {
|
|||||||
/**
|
/**
|
||||||
* Check if PCI bus probing is allowed
|
* Check if PCI bus probing is allowed
|
||||||
*
|
*
|
||||||
|
* @v pci PCI device
|
||||||
* @ret ok Bus probing is allowed
|
* @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
|
* 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 */
|
/** A runtime selectable PCI I/O API */
|
||||||
struct pci_api {
|
struct pci_api {
|
||||||
const char *name;
|
const char *name;
|
||||||
|
typeof ( pci_can_probe ) ( * pci_can_probe );
|
||||||
typeof ( pci_discover ) ( * pci_discover );
|
typeof ( pci_discover ) ( * pci_discover );
|
||||||
typeof ( pci_read_config_byte ) ( * pci_read_config_byte );
|
typeof ( pci_read_config_byte ) ( * pci_read_config_byte );
|
||||||
typeof ( pci_read_config_word ) ( * pci_read_config_word );
|
typeof ( pci_read_config_word ) ( * pci_read_config_word );
|
||||||
@@ -198,6 +200,7 @@ struct pci_api {
|
|||||||
#define PROVIDE_PCIAPI_RUNTIME( subsys, priority ) \
|
#define PROVIDE_PCIAPI_RUNTIME( subsys, priority ) \
|
||||||
struct pci_api pciapi_ ## subsys __pci_api ( priority ) = { \
|
struct pci_api pciapi_ ## subsys __pci_api ( priority ) = { \
|
||||||
.name = #subsys, \
|
.name = #subsys, \
|
||||||
|
.pci_can_probe = PCIAPI_INLINE ( subsys, pci_can_probe ), \
|
||||||
.pci_discover = PCIAPI_INLINE ( subsys, pci_discover ), \
|
.pci_discover = PCIAPI_INLINE ( subsys, pci_discover ), \
|
||||||
.pci_read_config_byte = \
|
.pci_read_config_byte = \
|
||||||
PCIAPI_INLINE ( subsys, pci_read_config_byte ), \
|
PCIAPI_INLINE ( subsys, pci_read_config_byte ), \
|
||||||
|
|||||||
@@ -15,14 +15,4 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
|||||||
#define PCIAPI_PREFIX_cloud __cloud_
|
#define PCIAPI_PREFIX_cloud __cloud_
|
||||||
#endif
|
#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 */
|
#endif /* _IPXE_PCICLOUD_H */
|
||||||
|
|||||||
Reference in New Issue
Block a user