[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;
};
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 );
#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;
IBM_BOFM_TABLE *bofmtab;
IBM_BOFM_TABLE *bofmtab2;
void *pci_io;
int bofmrc;
EFI_STATUS efirc;
int rc;
/* Open PCI device, if possible */
if ( ( rc = efipci_open ( device, EFI_OPEN_PROTOCOL_GET_PROTOCOL,
&efipci ) ) != 0 )
/* Get PCI device information */
if ( ( rc = efipci_info ( device, &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;
}
/* Locate BOFM protocol */
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_locate_bofm:
efipci_close ( device );
bs->CloseProtocol ( device, &efi_pci_io_protocol_guid,
efi_image_handle, device );
err_open:
err_info:
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 attributes Protocol opening attributes
* @v efipci EFI PCI device to fill in
* @ret rc Return status code
*/
int efipci_open ( EFI_HANDLE device, UINT32 attributes,
struct efi_pci_device *efipci ) {
int efipci_info ( EFI_HANDLE device, struct efi_pci_device *efipci ) {
EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
union {
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 */
if ( ( efirc = bs->OpenProtocol ( device, &efi_pci_io_protocol_guid,
&pci_io.interface, efi_image_handle,
device, attributes ) ) != 0 ) {
&pci_io.interface,
efi_image_handle, device,
EFI_OPEN_PROTOCOL_GET_PROTOCOL ))!=0){
rc = -EEFI_PCI ( efirc );
DBGCP ( device, "EFIPCI %s cannot open PCI protocols: %s\n",
efi_handle_name ( device ), strerror ( rc ) );
@ -850,39 +849,6 @@ int efipci_open ( EFI_HANDLE device, UINT32 attributes,
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
@ -936,8 +902,11 @@ static int efipci_supported ( EFI_HANDLE device ) {
* @ret rc Return status code
*/
static int efipci_start ( struct efi_device *efidev ) {
EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
EFI_HANDLE device = efidev->device;
struct efi_pci_device *efipci;
void *pci_io;
EFI_STATUS efirc;
int rc;
/* Allocate PCI device */
@ -947,10 +916,16 @@ static int efipci_start ( struct efi_device *efidev ) {
goto err_alloc;
}
/* Get PCI device information */
if ( ( rc = efipci_info ( device, efipci ) ) != 0 )
goto err_info;
/* Open PCI device */
if ( ( rc = efipci_open ( device, ( EFI_OPEN_PROTOCOL_BY_DRIVER |
EFI_OPEN_PROTOCOL_EXCLUSIVE ),
efipci ) ) != 0 ) {
if ( ( efirc = bs->OpenProtocol ( device, &efi_pci_io_protocol_guid,
&pci_io, efi_image_handle, device,
( 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",
efi_handle_name ( device ), strerror ( rc ) );
DBGC_EFI_OPENERS ( device, device, &efi_pci_io_protocol_guid );
@ -985,8 +960,10 @@ static int efipci_start ( struct efi_device *efidev ) {
err_probe:
list_del ( &efipci->pci.dev.siblings );
err_find_driver:
efipci_close ( device );
bs->CloseProtocol ( device, &efi_pci_io_protocol_guid,
efi_image_handle, device );
err_open:
err_info:
free ( efipci );
err_alloc:
return rc;
@ -999,13 +976,15 @@ static int efipci_start ( struct efi_device *efidev ) {
*/
static void efipci_stop ( struct efi_device *efidev ) {
struct efi_pci_device *efipci = efidev_get_drvdata ( efidev );
EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
EFI_HANDLE device = efidev->device;
pci_remove ( &efipci->pci );
list_del ( &efipci->pci.dev.siblings );
assert ( efipci->pci.dma.mapped == 0 );
assert ( efipci->pci.dma.allocated == 0 );
efipci_close ( device );
bs->CloseProtocol ( device, &efi_pci_io_protocol_guid,
efi_image_handle, device );
free ( efipci );
}