public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Ard Biesheuvel" <ard.biesheuvel@linaro.org>
To: devel@edk2.groups.io
Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>,
	Sami Mujawar <sami.mujawar@arm.com>,
	Laszlo Ersek <lersek@redhat.com>,
	Leif Lindholm <leif.lindholm@linaro.org>
Subject: [PATCH edk2-platforms 2/2] Platform/ARM/ArmJunoDxe: use PciIo protocol notify to program the MAC
Date: Fri,  6 Dec 2019 11:02:19 +0000	[thread overview]
Message-ID: <20191206110219.32190-3-ard.biesheuvel@linaro.org> (raw)
In-Reply-To: <20191206110219.32190-1-ard.biesheuvel@linaro.org>

Instead of connecting and thus enumerating the PCIe topology in a
platform driver, just so that we can grab the PciIo protocol that
belongs to the Marvell Yukon NIC and program its MAC address, rely
on a protocol notification handler to do this whenever the core code
decides to enumerate the PCIe.

Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
---
 Platform/ARM/JunoPkg/Drivers/ArmJunoDxe/ArmJunoDxe.c   | 161 ++++----------------
 Platform/ARM/JunoPkg/Drivers/ArmJunoDxe/ArmJunoDxe.inf |   1 -
 2 files changed, 30 insertions(+), 132 deletions(-)

diff --git a/Platform/ARM/JunoPkg/Drivers/ArmJunoDxe/ArmJunoDxe.c b/Platform/ARM/JunoPkg/Drivers/ArmJunoDxe/ArmJunoDxe.c
index c0ad7ced2959..ebaf2aa134da 100644
--- a/Platform/ARM/JunoPkg/Drivers/ArmJunoDxe/ArmJunoDxe.c
+++ b/Platform/ARM/JunoPkg/Drivers/ArmJunoDxe/ArmJunoDxe.c
@@ -32,39 +32,8 @@
 STATIC CONST EFI_GUID mJunoAcpiTableFile = { 0xa1dd808e, 0x1e95, 0x4399, { 0xab, 0xc0, 0x65, 0x3c, 0x82, 0xe8, 0x53, 0x0c } };
 #endif
 
-typedef struct {
-  ACPI_HID_DEVICE_PATH      AcpiDevicePath;
-  PCI_DEVICE_PATH           PciDevicePath;
-  EFI_DEVICE_PATH_PROTOCOL  EndDevicePath;
-} EFI_PCI_ROOT_BRIDGE_DEVICE_PATH;
-
-STATIC CONST EFI_PCI_ROOT_BRIDGE_DEVICE_PATH mPciRootComplexDevicePath = {
-    {
-      { ACPI_DEVICE_PATH,
-        ACPI_DP,
-        { (UINT8) (sizeof (ACPI_HID_DEVICE_PATH)),
-          (UINT8) ((sizeof (ACPI_HID_DEVICE_PATH)) >> 8) }
-      },
-      EISA_PNP_ID (0x0A03),
-      0
-    },
-    {
-      { HARDWARE_DEVICE_PATH,
-        HW_PCI_DP,
-        { (UINT8) (sizeof (PCI_DEVICE_PATH)),
-          (UINT8) ((sizeof (PCI_DEVICE_PATH)) >> 8) }
-      },
-      0,
-      0
-    },
-    {
-      END_DEVICE_PATH_TYPE,
-      END_ENTIRE_DEVICE_PATH_SUBTYPE,
-      { END_DEVICE_PATH_LENGTH, 0 }
-    }
-};
-
 STATIC EFI_EVENT mAcpiRegistration = NULL;
+STATIC EFI_EVENT mPciIoNotificationRegistration = NULL;
 
 /**
   This function reads PCI ID of the controller.
@@ -99,59 +68,6 @@ ReadMarvellYoukonPciId (
   return EFI_SUCCESS;
 }
 
-/**
-  This function searches for Marvell Yukon NIC on the Juno
-  platform and returns PCI IO protocol handle for the controller.
-
-  @param[out]  PciIo   PCI IO protocol handle
-**/
-STATIC
-EFI_STATUS
-GetMarvellYukonPciIoProtocol (
-  OUT EFI_PCI_IO_PROTOCOL  **PciIo
-  )
-{
-  UINTN       HandleCount;
-  EFI_HANDLE  *HandleBuffer;
-  UINTN       HIndex;
-  EFI_STATUS  Status;
-
-  Status = gBS->LocateHandleBuffer (
-                  ByProtocol,
-                  &gEfiPciIoProtocolGuid,
-                  NULL,
-                  &HandleCount,
-                  &HandleBuffer);
-  if (EFI_ERROR (Status)) {
-    return (Status);
-  }
-
-  for (HIndex = 0; HIndex < HandleCount; ++HIndex) {
-    // If PciIo opened with EFI_OPEN_PROTOCOL_GET_PROTOCOL, the CloseProtocol() is not required
-    Status = gBS->OpenProtocol (
-                    HandleBuffer[HIndex],
-                    &gEfiPciIoProtocolGuid,
-                    (VOID **) PciIo,
-                    NULL,
-                    NULL,
-                    EFI_OPEN_PROTOCOL_GET_PROTOCOL);
-    if (EFI_ERROR (Status)) {
-      continue;
-    }
-
-    Status = ReadMarvellYoukonPciId (*PciIo, JUNO_MARVELL_YUKON_ID);
-    if (EFI_ERROR (Status)) {
-      continue;
-    } else {
-      break;
-    }
-  }
-
-  gBS->FreePool (HandleBuffer);
-
-  return Status;
-}
-
 /**
  This function restore the original controller attributes
 
@@ -326,18 +242,14 @@ WriteMacAddress (
 **/
 STATIC
 EFI_STATUS
-ArmJunoSetNicMacAddress ()
+ArmJunoSetNicMacAddress (
+  IN  EFI_PCI_IO_PROTOCOL   *PciIo
+  )
 {
   UINT64                              OldPciAttr;
-  EFI_PCI_IO_PROTOCOL*                PciIo;
   UINT32                              PciRegBase;
   EFI_STATUS                          Status;
 
-  Status = GetMarvellYukonPciIoProtocol (&PciIo);
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
   PciRegBase = 0;
   Status = InitPciDev (PciIo, &PciRegBase, &OldPciAttr);
   if (EFI_ERROR (Status)) {
@@ -352,14 +264,8 @@ ArmJunoSetNicMacAddress ()
 }
 
 /**
-  Notification function of the event defined as belonging to the
-  EFI_END_OF_DXE_EVENT_GROUP_GUID event group that was created in
-  the entry point of the driver.
-
-  This function is called when an event belonging to the
-  EFI_END_OF_DXE_EVENT_GROUP_GUID event group is signalled. Such an
-  event is signalled once at the end of the dispatching of all
-  drivers (end of the so called DXE phase).
+  This function is called when a gEfiPciIoProtocolGuid protocol instance is
+  registered in the protocol database.
 
   @param[in]  Event    Event declared in the entry point of the driver whose
                        notification function is being invoked.
@@ -367,33 +273,30 @@ ArmJunoSetNicMacAddress ()
 **/
 STATIC
 VOID
-OnEndOfDxe (
+PciIoNotificationEvent (
   IN EFI_EVENT  Event,
   IN VOID       *Context
   )
 {
-  EFI_DEVICE_PATH_PROTOCOL* PciRootComplexDevicePath;
-  EFI_HANDLE                Handle;
-  EFI_STATUS                Status;
+  EFI_STATUS            Status;
+  EFI_PCI_IO_PROTOCOL   *PciIo;
 
-  //
-  // PCI Root Complex initialization
-  // At the end of the DXE phase, we should get all the driver dispatched.
-  // Force the PCI Root Complex to be initialized. It allows the OS to skip
-  // this step.
-  //
-  PciRootComplexDevicePath = (EFI_DEVICE_PATH_PROTOCOL*) &mPciRootComplexDevicePath;
-  Status = gBS->LocateDevicePath (&gEfiPciRootBridgeIoProtocolGuid,
-                                  &PciRootComplexDevicePath,
-                                  &Handle);
+  Status = gBS->LocateProtocol (&gEfiPciIoProtocolGuid,
+                  mPciIoNotificationRegistration, (VOID **)&PciIo);
+  if (EFI_ERROR (Status)) {
+    return;
+  }
 
-  Status = gBS->ConnectController (Handle, NULL, PciRootComplexDevicePath, FALSE);
-  ASSERT_EFI_ERROR (Status);
+  Status = ReadMarvellYoukonPciId (PciIo, JUNO_MARVELL_YUKON_ID);
+  if (EFI_ERROR (Status)) {
+    return;
+  }
 
-  Status = ArmJunoSetNicMacAddress ();
+  Status = ArmJunoSetNicMacAddress (PciIo);
   if (EFI_ERROR (Status)) {
     DEBUG ((DEBUG_ERROR, "ArmJunoDxe: Failed to set Marvell Yukon NIC MAC address\n"));
   }
+  gBS->CloseEvent (Event);
 }
 
 EFI_STATUS
@@ -408,7 +311,6 @@ ArmJunoEntryPoint (
   CHAR16                *TextDevicePath;
   UINTN                 TextDevicePathSize;
   UINT32                JunoRevision;
-  EFI_EVENT             EndOfDxeEvent;
 
   //
   // Register the OHCI and EHCI controllers as non-coherent
@@ -497,20 +399,17 @@ ArmJunoEntryPoint (
     PcdSetBoolS (PcdPciDisableBusEnumeration, FALSE);
 
     //
-    // Create an event belonging to the "gEfiEndOfDxeEventGroupGuid" group.
-    // The "OnEndOfDxe()" function is declared as the call back function.
-    // It will be called at the end of the DXE phase when an event of the
-    // same group is signalled to inform about the end of the DXE phase.
-    // Install the INSTALL_FDT_PROTOCOL protocol.
+    // Create a protocol notification event handler on the PciIo protocol
+    // so we can set the MAC address on the Marvell Yukon as soon as it
+    // appears.
     //
-    Status = gBS->CreateEventEx (
-                    EVT_NOTIFY_SIGNAL,
-                    TPL_CALLBACK,
-                    OnEndOfDxe,
-                    NULL,
-                    &gEfiEndOfDxeEventGroupGuid,
-                    &EndOfDxeEvent
-                    );
+    EfiCreateProtocolNotifyEvent (
+        &gEfiPciIoProtocolGuid,
+        TPL_NOTIFY,
+        PciIoNotificationEvent,
+        NULL,
+        &mPciIoNotificationRegistration
+        );
 
 #ifndef DYNAMIC_TABLES_FRAMEWORK
     // Declare the related ACPI Tables
diff --git a/Platform/ARM/JunoPkg/Drivers/ArmJunoDxe/ArmJunoDxe.inf b/Platform/ARM/JunoPkg/Drivers/ArmJunoDxe/ArmJunoDxe.inf
index 7c118d9c9c6b..d016967c3c37 100644
--- a/Platform/ARM/JunoPkg/Drivers/ArmJunoDxe/ArmJunoDxe.inf
+++ b/Platform/ARM/JunoPkg/Drivers/ArmJunoDxe/ArmJunoDxe.inf
@@ -44,7 +44,6 @@ [LibraryClasses]
   UefiDriverEntryPoint
 
 [Guids]
-  gEfiEndOfDxeEventGroupGuid
   gEfiFileInfoGuid
 
 [Protocols]
-- 
2.17.1


  parent reply	other threads:[~2019-12-06 11:02 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-12-06 11:02 [PATCH edk2-platforms 0/2] Platform/ARM/Juno: remove explicit PCIe enumeration Ard Biesheuvel
2019-12-06 11:02 ` [PATCH edk2-platforms 1/2] Platform/ARM/ArmJunoDxe: make mAcpiRegistration STATIC Ard Biesheuvel
2019-12-06 12:16   ` Laszlo Ersek
2019-12-06 11:02 ` Ard Biesheuvel [this message]
2019-12-06 12:12   ` [PATCH edk2-platforms 2/2] Platform/ARM/ArmJunoDxe: use PciIo protocol notify to program the MAC Laszlo Ersek
2019-12-06 12:16     ` Ard Biesheuvel
2019-12-06 11:12 ` [PATCH edk2-platforms 0/2] Platform/ARM/Juno: remove explicit PCIe enumeration Leif Lindholm
2019-12-06 11:41   ` Sami Mujawar
2019-12-06 14:01     ` Ard Biesheuvel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20191206110219.32190-3-ard.biesheuvel@linaro.org \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox