[efi] Remove the efipci_open() and efipci_close() wrappers

In preparation for formalising the way that EFI protocols are opened
across the codebase, remove the efipci_open() wrapper.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
pull/34/merge
Michael Brown 2025-03-24 11:11:44 +00:00
parent 3283885326
commit 48d1680127
3 changed files with 42 additions and 51 deletions

View File

@ -25,9 +25,6 @@ struct efi_pci_device {
EFI_PCI_IO_PROTOCOL *io; EFI_PCI_IO_PROTOCOL *io;
}; };
extern int efipci_open ( EFI_HANDLE device, UINT32 attributes,
struct efi_pci_device *efipci );
extern void efipci_close ( EFI_HANDLE device );
extern int efipci_info ( EFI_HANDLE device, struct efi_pci_device *efipci ); extern int efipci_info ( EFI_HANDLE device, struct efi_pci_device *efipci );
#endif /* _IPXE_EFI_PCI_H */ #endif /* _IPXE_EFI_PCI_H */

View File

@ -228,14 +228,27 @@ static int efi_bofm_start ( struct efi_device *efidev ) {
struct efi_pci_device efipci; struct efi_pci_device efipci;
IBM_BOFM_TABLE *bofmtab; IBM_BOFM_TABLE *bofmtab;
IBM_BOFM_TABLE *bofmtab2; IBM_BOFM_TABLE *bofmtab2;
void *pci_io;
int bofmrc; int bofmrc;
EFI_STATUS efirc; EFI_STATUS efirc;
int rc; int rc;
/* Open PCI device, if possible */ /* Get PCI device information */
if ( ( rc = efipci_open ( device, EFI_OPEN_PROTOCOL_GET_PROTOCOL, if ( ( rc = efipci_info ( device, &efipci ) ) != 0 ) {
&efipci ) ) != 0 ) DBGC ( device, "EFIBOFM %s cannot get PCI information: %s\n",
efi_handle_name ( device ), strerror ( rc ) );
goto err_info;
}
/* Open PCI I/O protocol */
if ( ( efirc = bs->OpenProtocol ( device, &efi_pci_io_protocol_guid,
&pci_io, efi_image_handle, device,
EFI_OPEN_PROTOCOL_GET_PROTOCOL ))!=0){
rc = -EEFI ( efirc );
DBGC ( device, "EFIBOFM %s cannot open PCI device: %s\n",
efi_handle_name ( device ), strerror ( rc ) );
goto err_open; goto err_open;
}
/* Locate BOFM protocol */ /* Locate BOFM protocol */
if ( ( efirc = bs->LocateProtocol ( &bofm1_protocol_guid, NULL, if ( ( efirc = bs->LocateProtocol ( &bofm1_protocol_guid, NULL,
@ -313,8 +326,10 @@ static int efi_bofm_start ( struct efi_device *efidev ) {
err_set_status: err_set_status:
err_locate_bofm: err_locate_bofm:
efipci_close ( device ); bs->CloseProtocol ( device, &efi_pci_io_protocol_guid,
efi_image_handle, device );
err_open: err_open:
err_info:
return rc; return rc;
} }

View File

@ -771,15 +771,13 @@ static struct dma_operations efipci_dma_operations = {
*/ */
/** /**
* Open EFI PCI device * Get EFI PCI device information
* *
* @v device EFI device handle * @v device EFI device handle
* @v attributes Protocol opening attributes
* @v efipci EFI PCI device to fill in * @v efipci EFI PCI device to fill in
* @ret rc Return status code * @ret rc Return status code
*/ */
int efipci_open ( EFI_HANDLE device, UINT32 attributes, int efipci_info ( EFI_HANDLE device, struct efi_pci_device *efipci ) {
struct efi_pci_device *efipci ) {
EFI_BOOT_SERVICES *bs = efi_systab->BootServices; EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
union { union {
EFI_PCI_IO_PROTOCOL *pci_io; EFI_PCI_IO_PROTOCOL *pci_io;
@ -792,8 +790,9 @@ int efipci_open ( EFI_HANDLE device, UINT32 attributes,
/* See if device is a PCI device */ /* See if device is a PCI device */
if ( ( efirc = bs->OpenProtocol ( device, &efi_pci_io_protocol_guid, if ( ( efirc = bs->OpenProtocol ( device, &efi_pci_io_protocol_guid,
&pci_io.interface, efi_image_handle, &pci_io.interface,
device, attributes ) ) != 0 ) { efi_image_handle, device,
EFI_OPEN_PROTOCOL_GET_PROTOCOL ))!=0){
rc = -EEFI_PCI ( efirc ); rc = -EEFI_PCI ( efirc );
DBGCP ( device, "EFIPCI %s cannot open PCI protocols: %s\n", DBGCP ( device, "EFIPCI %s cannot open PCI protocols: %s\n",
efi_handle_name ( device ), strerror ( rc ) ); efi_handle_name ( device ), strerror ( rc ) );
@ -850,39 +849,6 @@ int efipci_open ( EFI_HANDLE device, UINT32 attributes,
return rc; return rc;
} }
/**
* Close EFI PCI device
*
* @v device EFI device handle
*/
void efipci_close ( EFI_HANDLE device ) {
EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
bs->CloseProtocol ( device, &efi_pci_io_protocol_guid,
efi_image_handle, device );
}
/**
* Get EFI PCI device information
*
* @v device EFI device handle
* @v efipci EFI PCI device to fill in
* @ret rc Return status code
*/
int efipci_info ( EFI_HANDLE device, struct efi_pci_device *efipci ) {
int rc;
/* Open PCI device, if possible */
if ( ( rc = efipci_open ( device, EFI_OPEN_PROTOCOL_GET_PROTOCOL,
efipci ) ) != 0 )
return rc;
/* Close PCI device */
efipci_close ( device );
return 0;
}
/****************************************************************************** /******************************************************************************
* *
* EFI PCI driver * EFI PCI driver
@ -936,8 +902,11 @@ static int efipci_supported ( EFI_HANDLE device ) {
* @ret rc Return status code * @ret rc Return status code
*/ */
static int efipci_start ( struct efi_device *efidev ) { static int efipci_start ( struct efi_device *efidev ) {
EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
EFI_HANDLE device = efidev->device; EFI_HANDLE device = efidev->device;
struct efi_pci_device *efipci; struct efi_pci_device *efipci;
void *pci_io;
EFI_STATUS efirc;
int rc; int rc;
/* Allocate PCI device */ /* Allocate PCI device */
@ -947,10 +916,16 @@ static int efipci_start ( struct efi_device *efidev ) {
goto err_alloc; goto err_alloc;
} }
/* Get PCI device information */
if ( ( rc = efipci_info ( device, efipci ) ) != 0 )
goto err_info;
/* Open PCI device */ /* Open PCI device */
if ( ( rc = efipci_open ( device, ( EFI_OPEN_PROTOCOL_BY_DRIVER | if ( ( efirc = bs->OpenProtocol ( device, &efi_pci_io_protocol_guid,
EFI_OPEN_PROTOCOL_EXCLUSIVE ), &pci_io, efi_image_handle, device,
efipci ) ) != 0 ) { ( EFI_OPEN_PROTOCOL_BY_DRIVER |
EFI_OPEN_PROTOCOL_EXCLUSIVE )))!=0){
rc = -EEFI_PCI ( efirc );
DBGC ( device, "EFIPCI %s could not open PCI device: %s\n", DBGC ( device, "EFIPCI %s could not open PCI device: %s\n",
efi_handle_name ( device ), strerror ( rc ) ); efi_handle_name ( device ), strerror ( rc ) );
DBGC_EFI_OPENERS ( device, device, &efi_pci_io_protocol_guid ); DBGC_EFI_OPENERS ( device, device, &efi_pci_io_protocol_guid );
@ -985,8 +960,10 @@ static int efipci_start ( struct efi_device *efidev ) {
err_probe: err_probe:
list_del ( &efipci->pci.dev.siblings ); list_del ( &efipci->pci.dev.siblings );
err_find_driver: err_find_driver:
efipci_close ( device ); bs->CloseProtocol ( device, &efi_pci_io_protocol_guid,
efi_image_handle, device );
err_open: err_open:
err_info:
free ( efipci ); free ( efipci );
err_alloc: err_alloc:
return rc; return rc;
@ -999,13 +976,15 @@ static int efipci_start ( struct efi_device *efidev ) {
*/ */
static void efipci_stop ( struct efi_device *efidev ) { static void efipci_stop ( struct efi_device *efidev ) {
struct efi_pci_device *efipci = efidev_get_drvdata ( efidev ); struct efi_pci_device *efipci = efidev_get_drvdata ( efidev );
EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
EFI_HANDLE device = efidev->device; EFI_HANDLE device = efidev->device;
pci_remove ( &efipci->pci ); pci_remove ( &efipci->pci );
list_del ( &efipci->pci.dev.siblings ); list_del ( &efipci->pci.dev.siblings );
assert ( efipci->pci.dma.mapped == 0 ); assert ( efipci->pci.dma.mapped == 0 );
assert ( efipci->pci.dma.allocated == 0 ); assert ( efipci->pci.dma.allocated == 0 );
efipci_close ( device ); bs->CloseProtocol ( device, &efi_pci_io_protocol_guid,
efi_image_handle, device );
free ( efipci ); free ( efipci );
} }