When the OS takes over the machine, it calls ExitBootServices() in
order to shut down all resident services and event notifications so
that all asynchronous activity is stopped.

At this point, any DMA masters that are still active should be shut
down. This is especially important for network controllers, since
any activity on the network will trigger DMA writes into memory, which
will no longer be reserved for this purpose once the OS takes over.

So register for the ExitBootServices event, and shut down the controller
at this point if it was started before.

Signed-off-by: Ard Biesheuvel <ard.biesheu...@arm.com>
---
 Silicon/Broadcom/Drivers/Net/BcmGenetDxe/BcmGenetDxe.inf |  4 +++
 Silicon/Broadcom/Drivers/Net/BcmGenetDxe/GenetUtil.h     |  1 +
 Silicon/Broadcom/Drivers/Net/BcmGenetDxe/DriverBinding.c | 31 
++++++++++++++++++++
 3 files changed, 36 insertions(+)

diff --git a/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/BcmGenetDxe.inf 
b/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/BcmGenetDxe.inf
index 3cabc5936562..a287f0495ff9 100644
--- a/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/BcmGenetDxe.inf
+++ b/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/BcmGenetDxe.inf
@@ -42,6 +42,7 @@ [LibraryClasses]
   IoLib
   MemoryAllocationLib
   NetLib
+  UefiBootServicesTableLib
   UefiDriverEntryPoint
   UefiLib
 
@@ -50,6 +51,9 @@ [Protocols]
   gEfiDevicePathProtocolGuid                  ## BY_START
   gEfiSimpleNetworkProtocolGuid               ## BY_START
 
+[Guids]
+  gEfiEventExitBootServicesGuid
+
 [Pcd]
   gEmbeddedTokenSpaceGuid.PcdDmaDeviceOffset
   gEmbeddedTokenSpaceGuid.PcdDmaDeviceLimit
diff --git a/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/GenetUtil.h 
b/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/GenetUtil.h
index 1dc7a51a1ca6..d03bf8daed58 100644
--- a/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/GenetUtil.h
+++ b/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/GenetUtil.h
@@ -203,6 +203,7 @@ typedef struct {
   EFI_HANDLE                      ControllerHandle;
 
   EFI_LOCK                        Lock;
+  EFI_EVENT                       ExitBootServicesEvent;
 
   EFI_SIMPLE_NETWORK_PROTOCOL     Snp;
   EFI_SIMPLE_NETWORK_MODE         SnpMode;
diff --git a/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/DriverBinding.c 
b/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/DriverBinding.c
index a6102421cc26..29753d8ac754 100644
--- a/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/DriverBinding.c
+++ b/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/DriverBinding.c
@@ -76,6 +76,23 @@ GenetDriverBindingSupported (
   return Status;
 }
 
+/**
+  Callback function to shut down the network device at ExitBootServices
+
+  @param  Event                   Pointer to this event
+  @param  Context                 Event handler private data
+
+**/
+STATIC
+VOID
+EFIAPI
+GenetNotifyExitBootServices (
+  EFI_EVENT     Event,
+  VOID          *Context
+  )
+{
+  GenetDisableTxRx ((GENET_PRIVATE_DATA *)Context);
+}
 
 /**
   Starts a device controller or a bus controller.
@@ -173,6 +190,17 @@ GenetDriverBindingStart (
   CopyMem (&Genet->SnpMode.CurrentAddress, &Genet->Dev->MacAddress,
     sizeof(EFI_MAC_ADDRESS));
 
+  Status = gBS->CreateEventEx (EVT_NOTIFY_SIGNAL, TPL_CALLBACK,
+                  GenetNotifyExitBootServices, Genet,
+                  &gEfiEventExitBootServicesGuid,
+                  &Genet->ExitBootServicesEvent);
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_WARN,
+      "GenetDriverBindingStart: failed to register for ExitBootServices event 
- %r\n",
+      Status));
+    goto FreeDevice;
+  }
+
   Status = gBS->InstallMultipleProtocolInterfaces (&ControllerHandle,
                   &gEfiSimpleNetworkProtocolGuid,   &Genet->Snp,
                   NULL);
@@ -251,6 +279,9 @@ GenetDriverBindingStop (
     return Status;
   }
 
+  Status = gBS->CloseEvent (Genet->ExitBootServicesEvent);
+  ASSERT_EFI_ERROR (Status);
+
   GenetDmaFree (Genet);
 
   Status = gBS->CloseProtocol (ControllerHandle,
-- 
2.17.1


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#59055): https://edk2.groups.io/g/devel/message/59055
Mute This Topic: https://groups.io/mt/74130979/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to