summaryrefslogtreecommitdiffstats
path: root/RedfishPkg
diff options
context:
space:
mode:
authorAbner Chang <abner.chang@amd.com>2023-11-23 17:26:52 +0800
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>2023-12-05 03:27:03 +0000
commit8325fd6466755cf0bce911939a36aa8fb31f5867 (patch)
tree46439fbf7098640813b3c92c9ed01d3273b2b960 /RedfishPkg
parent843ed207144ad450eacec75de7b7a240cde7eedd (diff)
downloadedk2-8325fd6466755cf0bce911939a36aa8fb31f5867.tar.gz
edk2-8325fd6466755cf0bce911939a36aa8fb31f5867.tar.bz2
edk2-8325fd6466755cf0bce911939a36aa8fb31f5867.zip
RedfishPkg/RedfishConfigHandler: Use Redfish HI readiness notification
Wait until Redfish Host Interface is installed on the system then acquire Redfish service. Signed-off-by: Abner Chang <abner.chang@amd.com> Cc: Nickle Wang <nicklew@nvidia.com> Cc: Igor Kulchytskyy <igork@ami.com> Cc: Mike Maslenkin <mike.maslenkin@gmail.com> Reviewed-by: Nickle Wang <nicklew@nvidia.com> Acked-by: Mike Maslenkin <mike.maslenkin@gmail.com>
Diffstat (limited to 'RedfishPkg')
-rw-r--r--RedfishPkg/RedfishConfigHandler/RedfishConfigHandlerDriver.c168
-rw-r--r--RedfishPkg/RedfishConfigHandler/RedfishConfigHandlerDriver.inf9
2 files changed, 116 insertions, 61 deletions
diff --git a/RedfishPkg/RedfishConfigHandler/RedfishConfigHandlerDriver.c b/RedfishPkg/RedfishConfigHandler/RedfishConfigHandlerDriver.c
index f987cc67a6..b421f51374 100644
--- a/RedfishPkg/RedfishConfigHandler/RedfishConfigHandlerDriver.c
+++ b/RedfishPkg/RedfishConfigHandler/RedfishConfigHandlerDriver.c
@@ -17,11 +17,15 @@ EFI_EVENT gEfiRedfishDiscoverProtocolEvent = NULL;
//
// Variables for using RFI Redfish Discover Protocol
//
-VOID *gEfiRedfishDiscoverRegistration;
-EFI_HANDLE gEfiRedfishDiscoverControllerHandle = NULL;
-EFI_REDFISH_DISCOVER_PROTOCOL *gEfiRedfishDiscoverProtocol = NULL;
-BOOLEAN gRedfishDiscoverActivated = FALSE;
-BOOLEAN gRedfishServiceDiscovered = FALSE;
+VOID *gEfiRedfishDiscoverRegistration;
+EFI_HANDLE gEfiRedfishDiscoverControllerHandle = NULL;
+EFI_REDFISH_DISCOVER_PROTOCOL *gEfiRedfishDiscoverProtocol = NULL;
+BOOLEAN gRedfishDiscoverActivated = FALSE;
+BOOLEAN gRedfishServiceDiscovered = FALSE;
+EFI_REDFISH_DISCOVER_NETWORK_INTERFACE *mNetworkInterfaces = NULL;
+UINTN mNumberOfNetworkInterfaces;
+EFI_EVENT mEdkIIRedfishHostInterfaceReadyEvent;
+VOID *mEdkIIRedfishHostInterfaceRegistration;
///
/// Driver Binding Protocol instance
@@ -340,6 +344,83 @@ RedfishServiceDiscoveredCallback (
}
/**
+ Callback function executed when the gEdkIIRedfishHostInterfaceReadyProtocolGuid
+ protocol interface is installed.
+
+ @param[in] Event Event whose notification function is being invoked.
+ @param[in] Context Pointer to the Context buffer
+
+**/
+VOID
+EFIAPI
+AcquireRedfishServiceOnNetworkInterfaceCallback (
+ IN EFI_EVENT Event,
+ IN VOID *Context
+ )
+{
+ EFI_STATUS Status;
+ EFI_REDFISH_DISCOVER_NETWORK_INTERFACE *ThisNetworkInterface;
+ UINTN NetworkInterfaceIndex;
+ EFI_REDFISH_DISCOVERED_TOKEN *ThisRedfishDiscoveredToken;
+
+ ThisNetworkInterface = mNetworkInterfaces;
+ //
+ // Loop to discover Redfish service on each network interface.
+ //
+ for (NetworkInterfaceIndex = 0; NetworkInterfaceIndex < mNumberOfNetworkInterfaces; NetworkInterfaceIndex++) {
+ ThisRedfishDiscoveredToken = (EFI_REDFISH_DISCOVERED_TOKEN *)AllocateZeroPool (sizeof (EFI_REDFISH_DISCOVERED_TOKEN));
+ if (ThisRedfishDiscoveredToken == NULL) {
+ DEBUG ((DEBUG_ERROR, "%a: Not enough memory for EFI_REDFISH_DISCOVERED_TOKEN.\n", __func__));
+ return;
+ }
+
+ ThisRedfishDiscoveredToken->Signature = REDFISH_DISCOVER_TOKEN_SIGNATURE;
+
+ //
+ // Initial this Redfish Discovered Token
+ //
+ Status = gBS->CreateEvent (
+ EVT_NOTIFY_SIGNAL,
+ TPL_CALLBACK,
+ RedfishServiceDiscoveredCallback,
+ (VOID *)ThisRedfishDiscoveredToken,
+ &ThisRedfishDiscoveredToken->Event
+ );
+ if (EFI_ERROR (Status)) {
+ FreePool (ThisRedfishDiscoveredToken);
+ DEBUG ((DEBUG_ERROR, "%a: Failed to create event for Redfish discovered token.\n", __func__));
+ return;
+ }
+
+ //
+ // Acquire for Redfish service which is reported by
+ // Redfish Host Interface.
+ //
+ Status = gEfiRedfishDiscoverProtocol->AcquireRedfishService (
+ gEfiRedfishDiscoverProtocol,
+ gRedfishConfigData.Image,
+ ThisNetworkInterface,
+ EFI_REDFISH_DISCOVER_HOST_INTERFACE,
+ ThisRedfishDiscoveredToken
+ );
+
+ //
+ // Free Redfish Discovered Token if Discover Instance was not created and
+ // Redfish Service Discovered Callback event was not triggered.
+ //
+ if ((ThisRedfishDiscoveredToken->DiscoverList.NumberOfServiceFound == 0) ||
+ EFI_ERROR (ThisRedfishDiscoveredToken->DiscoverList.RedfishInstances->Status))
+ {
+ gBS->CloseEvent (ThisRedfishDiscoveredToken->Event);
+ DEBUG ((DEBUG_ERROR, "%a: Free Redfish discovered token - %x.\n", __func__, ThisRedfishDiscoveredToken));
+ FreePool (ThisRedfishDiscoveredToken);
+ }
+
+ ThisNetworkInterface++;
+ }
+}
+
+/**
Callback function executed when the EFI_REDFISH_DISCOVER_PROTOCOL
protocol interface is installed.
@@ -354,13 +435,10 @@ RedfishDiscoverProtocolInstalled (
OUT VOID *Context
)
{
- EFI_STATUS Status;
- UINTN BufferSize;
- EFI_HANDLE HandleBuffer;
- UINTN NetworkInterfaceIndex;
- EFI_REDFISH_DISCOVER_NETWORK_INTERFACE *ThisNetworkInterface;
- EFI_REDFISH_DISCOVERED_TOKEN *ThisRedfishDiscoveredToken;
- UINTN NumberOfNetworkInterfaces;
+ EFI_STATUS Status;
+ UINTN BufferSize;
+ EFI_HANDLE HandleBuffer;
+ VOID *RedfishHostInterfaceReadyProtocol;
DEBUG ((DEBUG_MANAGEABILITY, "%a: New network interface is installed on system by EFI Redfish discover driver.\n", __func__));
@@ -401,67 +479,43 @@ RedfishDiscoverProtocolInstalled (
Status = gEfiRedfishDiscoverProtocol->GetNetworkInterfaceList (
gEfiRedfishDiscoverProtocol,
gRedfishConfigData.Image,
- &NumberOfNetworkInterfaces,
- &ThisNetworkInterface
+ &mNumberOfNetworkInterfaces,
+ &mNetworkInterfaces
);
- if (EFI_ERROR (Status) || (NumberOfNetworkInterfaces == 0)) {
+ if (EFI_ERROR (Status) || (mNumberOfNetworkInterfaces == 0)) {
DEBUG ((DEBUG_ERROR, "%a: No network interfaces found on the handle.\n", __func__));
return;
}
//
- // Loop to discover Redfish service on each network interface.
+ // Check if Redfish Host Interface is ready or not.
//
- for (NetworkInterfaceIndex = 0; NetworkInterfaceIndex < NumberOfNetworkInterfaces; NetworkInterfaceIndex++) {
- ThisRedfishDiscoveredToken = (EFI_REDFISH_DISCOVERED_TOKEN *)AllocateZeroPool (sizeof (EFI_REDFISH_DISCOVERED_TOKEN));
- if (ThisRedfishDiscoveredToken == NULL) {
- DEBUG ((DEBUG_ERROR, "%a: Not enough memory for EFI_REDFISH_DISCOVERED_TOKEN.\n", __func__));
- return;
- }
-
- ThisRedfishDiscoveredToken->Signature = REDFISH_DISCOVER_TOKEN_SIGNATURE;
-
- //
- // Initial this Redfish Discovered Token
- //
+ Status = gBS->LocateProtocol (&gEdkIIRedfishHostInterfaceReadyProtocolGuid, NULL, &RedfishHostInterfaceReadyProtocol);
+ if (!EFI_ERROR (Status)) {
+ // Acquire Redfish service;
+ AcquireRedfishServiceOnNetworkInterfaceCallback ((EFI_EVENT)NULL, (VOID *)NULL);
+ } else {
Status = gBS->CreateEvent (
EVT_NOTIFY_SIGNAL,
TPL_CALLBACK,
- RedfishServiceDiscoveredCallback,
- (VOID *)ThisRedfishDiscoveredToken,
- &ThisRedfishDiscoveredToken->Event
+ AcquireRedfishServiceOnNetworkInterfaceCallback,
+ NULL,
+ &mEdkIIRedfishHostInterfaceReadyEvent
);
if (EFI_ERROR (Status)) {
- FreePool (ThisRedfishDiscoveredToken);
- DEBUG ((DEBUG_ERROR, "%a: Failed to create event for Redfish discovered token.\n", __func__));
+ DEBUG ((DEBUG_ERROR, "%a: Failed to create event for gEdkIIRedfishHostInterfaceReadyProtocolGuid installation.", __func__));
return;
}
- //
- // Acquire for Redfish service which is reported by
- // Redfish Host Interface.
- //
- Status = gEfiRedfishDiscoverProtocol->AcquireRedfishService (
- gEfiRedfishDiscoverProtocol,
- gRedfishConfigData.Image,
- ThisNetworkInterface,
- EFI_REDFISH_DISCOVER_HOST_INTERFACE,
- ThisRedfishDiscoveredToken
- );
-
- //
- // Free Redfish Discovered Token if Discover Instance was not created and
- // Redfish Service Discovered Callback event was not triggered.
- //
- if ((ThisRedfishDiscoveredToken->DiscoverList.NumberOfServiceFound == 0) ||
- EFI_ERROR (ThisRedfishDiscoveredToken->DiscoverList.RedfishInstances->Status))
- {
- gBS->CloseEvent (ThisRedfishDiscoveredToken->Event);
- DEBUG ((DEBUG_ERROR, "%a: Free Redfish discovered token - %x.\n", __func__, ThisRedfishDiscoveredToken));
- FreePool (ThisRedfishDiscoveredToken);
+ Status = gBS->RegisterProtocolNotify (
+ &gEdkIIRedfishHostInterfaceReadyProtocolGuid,
+ mEdkIIRedfishHostInterfaceReadyEvent,
+ &mEdkIIRedfishHostInterfaceRegistration
+ );
+ if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_ERROR, "%a: Fail to register event for the installation of gEdkIIRedfishHostInterfaceReadyProtocolGuid.", __func__));
+ return;
}
-
- ThisNetworkInterface++;
}
return;
diff --git a/RedfishPkg/RedfishConfigHandler/RedfishConfigHandlerDriver.inf b/RedfishPkg/RedfishConfigHandler/RedfishConfigHandlerDriver.inf
index b167c6e1ee..aed93f570c 100644
--- a/RedfishPkg/RedfishConfigHandler/RedfishConfigHandlerDriver.inf
+++ b/RedfishPkg/RedfishConfigHandler/RedfishConfigHandlerDriver.inf
@@ -46,11 +46,12 @@
UefiDriverEntryPoint
[Protocols]
- gEfiRedfishDiscoverProtocolGuid ## CONSUMES
+ gEfiRedfishDiscoverProtocolGuid ## CONSUMES
gEfiRestExServiceBindingProtocolGuid
- gEfiRestExProtocolGuid ## CONSUMES
- gEdkIIRedfishCredentialProtocolGuid ## CONSUMES
- gEdkIIRedfishConfigHandlerProtocolGuid ## CONSUMES
+ gEfiRestExProtocolGuid ## CONSUMES
+ gEdkIIRedfishCredentialProtocolGuid ## CONSUMES
+ gEdkIIRedfishConfigHandlerProtocolGuid ## CONSUMES
+ gEdkIIRedfishHostInterfaceReadyProtocolGuid ## CONSUMES
[Guids]
gEfiEventExitBootServicesGuid ## CONSUMES ## Event