From 48d1680127a13b2dcc3abae9bb839a6ce0f9912a Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Mon, 24 Mar 2025 11:11:44 +0000 Subject: [PATCH] [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 --- src/include/ipxe/efi/efi_pci.h | 3 -- src/interface/efi/efi_bofm.c | 23 ++++++++++-- src/interface/efi/efi_pci.c | 67 ++++++++++++---------------------- 3 files changed, 42 insertions(+), 51 deletions(-) diff --git a/src/include/ipxe/efi/efi_pci.h b/src/include/ipxe/efi/efi_pci.h index 2ea1a8f0e..f8d1e3e40 100644 --- a/src/include/ipxe/efi/efi_pci.h +++ b/src/include/ipxe/efi/efi_pci.h @@ -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 */ diff --git a/src/interface/efi/efi_bofm.c b/src/interface/efi/efi_bofm.c index 15f3837cc..1be68bf8b 100644 --- a/src/interface/efi/efi_bofm.c +++ b/src/interface/efi/efi_bofm.c @@ -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; } diff --git a/src/interface/efi/efi_pci.c b/src/interface/efi/efi_pci.c index 8d4e08567..d55cbe86c 100644 --- a/src/interface/efi/efi_pci.c +++ b/src/interface/efi/efi_pci.c @@ -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 ); }