[edk2-devel] [PATCH edk2-platforms v4 5/9] Silicon/Broadcom/BcmGenetDxe: shut down devices on ExitBootServices()

Andrei Warkentin awarkentin at vmware.com
Mon May 11 16:32:42 UTC 2020


LGTM. I agree that we just need to stop TX/RX. We do not want to reset controller (as that will nuke the programmed-in MAC address).

Reviewed-by: Andrei Warkentin <andrey.warkentin at gmail.com>
________________________________
From: Ard Biesheuvel <ard.biesheuvel at arm.com>
Sent: Monday, May 11, 2020 9:55 AM
To: devel at edk2.groups.io <devel at edk2.groups.io>
Cc: Ard Biesheuvel <ard.biesheuvel at arm.com>; Pete Batard <pete at akeo.ie>; Jared McNeill <jmcneill at invisible.ca>; Andrei Warkentin <awarkentin at vmware.com>; Samer El-Haj-Mahmoud <Samer.El-Haj-Mahmoud at arm.com>; Jeremy Linton <jeremy.linton at arm.com>
Subject: [PATCH edk2-platforms v4 5/9] Silicon/Broadcom/BcmGenetDxe: shut down devices on ExitBootServices()

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.biesheuvel at 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 | 35 +++++++++++++++++++-
 3 files changed, 39 insertions(+), 1 deletion(-)

diff --git a/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/BcmGenetDxe.inf b/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/BcmGenetDxe.inf
index 248164249c6e..9b3dc5e62ecf 100644
--- a/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/BcmGenetDxe.inf
+++ b/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/BcmGenetDxe.inf
@@ -44,6 +44,7 @@ [LibraryClasses]
   IoLib
   MemoryAllocationLib
   NetLib
+  UefiBootServicesTableLib
   UefiDriverEntryPoint
   UefiLib

@@ -52,6 +53,9 @@ [Protocols]
   gEfiDevicePathProtocolGuid                  ## BY_START
   gEfiSimpleNetworkProtocolGuid               ## BY_START

+[Guids]
+  gEfiEventExitBootServicesGuid
+
 [FixedPcd]
   gEmbeddedTokenSpaceGuid.PcdDmaDeviceOffset
   gEmbeddedTokenSpaceGuid.PcdDmaDeviceLimit
diff --git a/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/GenetUtil.h b/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/GenetUtil.h
index ddfbc0806c07..c43bdbe1d6da 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 dacb3ac7d762..00fbfbc109bb 100644
--- a/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/DriverBinding.c
+++ b/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/DriverBinding.c
@@ -74,6 +74,23 @@ GenetDriverBindingSupported (
   return EFI_SUCCESS;
 }

+/**
+  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.
@@ -171,6 +188,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);
@@ -182,12 +210,14 @@ GenetDriverBindingStart (
                         &gBcmGenetPlatformDeviceProtocolGuid,
                         This->DriverBindingHandle,
                         ControllerHandle);
-    goto FreeDevice;
+    goto FreeEvent;
   }

   Genet->ControllerHandle = ControllerHandle;
   return EFI_SUCCESS;

+FreeEvent:
+  gBS->CloseEvent (Genet->ExitBootServicesEvent);
 FreeDevice:
   DEBUG ((DEBUG_WARN, "%a: Returning %r\n", __FUNCTION__, Status));
   FreePool (Genet);
@@ -248,6 +278,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 (#59138): https://edk2.groups.io/g/devel/message/59138
Mute This Topic: https://groups.io/mt/74137449/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/edk2-devel-archive/attachments/20200511/cb0436be/attachment.htm>


More information about the edk2-devel-archive mailing list