From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mx.groups.io with SMTP id smtpd.web11.782.1588970742301994285 for ; Fri, 08 May 2020 13:45:42 -0700 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: arm.com, ip: 217.140.110.172, mailfrom: samer.el-haj-mahmoud@arm.com) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id F3D9211D4; Fri, 8 May 2020 13:45:41 -0700 (PDT) Received: from localhost.localdomain (unknown [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 9FA263F305; Fri, 8 May 2020 13:45:41 -0700 (PDT) From: "Samer El-Haj-Mahmoud" To: devel@edk2.groups.io Cc: Pete Batard , Leif Lindholm , Ard Biesheuvel , Andrei Warkentin , Jared McNeill Subject: [edk2-platform][PATCH v1 4/6] Platform/RaspberryPi: Register GENET platform device protocol Date: Fri, 8 May 2020 16:45:36 -0400 Message-Id: <20200508204538.15650-5-Samer.El-Haj-Mahmoud@arm.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20200508204538.15650-1-Samer.El-Haj-Mahmoud@arm.com> References: <20200508204538.15650-1-Samer.El-Haj-Mahmoud@arm.com> Register an event at EndOfDxe to instantiate the EFI device path protocol with the GENET MAC address on a new handle, and install the BcmGenetPlatformDeviceProtocol on that handle. This protocol is used to pass platform information (GENET MAC address and register base address) to the GENET driver, which will consume this in its implementation of the UEFI driver model Supported/Start/Stop methods. Cc: Pete Batard Cc: Leif Lindholm Cc: Ard Biesheuvel Cc: Andrei Warkentin Cc: Jared McNeill Co-authored-by: Samer El-Haj-Mahmoud Co-authored-by: Ard Biesheuvel Co-authored-by: Andrei Warkentin Signed-off-by: Samer El-Haj-Mahmoud --- Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.inf | 29 ++++-- Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.c | 108 ++++++++++++++++++-- 2 files changed, 117 insertions(+), 20 deletions(-) diff --git a/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.inf b/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.inf index 57963baf9c90..e01f53de5dd6 100644 --- a/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.inf +++ b/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.inf @@ -1,6 +1,8 @@ #/** @file # -# Copyright (c) 2019, ARM Limited. All rights reserved. +# Component description file for the RasbperryPi DXE platform config driver. +# +# Copyright (c) 2019 - 2020, ARM Limited. All rights reserved. # Copyright (c) 2018, Andrei Warkentin # # SPDX-License-Identifier: BSD-2-Clause-Patent @@ -21,7 +23,6 @@ # # VALID_ARCHITECTURES = AARCH64 # - [Sources] ConfigDxe.c ConfigDxeFormSetGuid.h @@ -31,31 +32,36 @@ [Packages] ArmPkg/ArmPkg.dec ArmPlatformPkg/ArmPlatformPkg.dec - MdePkg/MdePkg.dec + EmbeddedPkg/EmbeddedPkg.dec MdeModulePkg/MdeModulePkg.dec + MdePkg/MdePkg.dec + NetworkPkg/NetworkPkg.dec + Platform/RaspberryPi/RaspberryPi.dec Silicon/Broadcom/Bcm27xx/Bcm27xx.dec Silicon/Broadcom/Bcm283x/Bcm283x.dec - Platform/RaspberryPi/RaspberryPi.dec - EmbeddedPkg/EmbeddedPkg.dec + Silicon/Broadcom/Drivers/Net/BcmNet.dec [LibraryClasses] + AcpiLib BaseLib DebugLib DxeServicesTableLib + GpioLib + HiiLib + NetLib PcdLib UefiBootServicesTableLib - UefiRuntimeServicesTableLib UefiDriverEntryPoint - HiiLib - GpioLib - AcpiLib + UefiRuntimeServicesTableLib [Guids] gConfigDxeFormSetGuid + gEfiEndOfDxeEventGroupGuid [Protocols] - gRaspberryPiFirmwareProtocolGuid ## CONSUMES - gRaspberryPiConfigAppliedProtocolGuid ## PRODUCES + gBcmGenetPlatformDeviceProtocolGuid ## PRODUCES + gRaspberryPiFirmwareProtocolGuid ## CONSUMES + gRaspberryPiConfigAppliedProtocolGuid ## PRODUCES [FixedPcd] gRaspberryPiTokenSpaceGuid.PcdCpuLowSpeedMHz @@ -64,6 +70,7 @@ [Pcd] gBcm27xxTokenSpaceGuid.PcdBcm27xxRegistersAddress + gBcm27xxTokenSpaceGuid.PcdBcmGenetRegistersAddress gBcm283xTokenSpaceGuid.PcdBcm283xRegistersAddress gRaspberryPiTokenSpaceGuid.PcdCpuClock gRaspberryPiTokenSpaceGuid.PcdCustomCpuClock diff --git a/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.c b/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.c index c90c25309872..f8ba0db3ba27 100644 --- a/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.c +++ b/Platform/RaspberryPi/Drivers/ConfigDxe/ConfigDxe.c @@ -1,6 +1,6 @@ /** @file * - * Copyright (c) 2019, ARM Limited. All rights reserved. + * Copyright (c) 2019 - 2020, ARM Limited. All rights reserved. * Copyright (c) 2018 - 2019, Andrei Warkentin * * SPDX-License-Identifier: BSD-2-Clause-Patent @@ -8,19 +8,21 @@ **/ #include +#include +#include +#include +#include #include -#include #include +#include #include +#include +#include #include +#include #include #include -#include -#include -#include -#include -#include -#include +#include #include #include "ConfigDxeFormSetGuid.h" @@ -33,6 +35,8 @@ STATIC RASPBERRY_PI_FIRMWARE_PROTOCOL *mFwProtocol; STATIC UINT32 mModelFamily = 0; STATIC UINT32 mModelInstalledMB = 0; +STATIC EFI_MAC_ADDRESS MacAddress; + /* * The GUID inside Platform/RaspberryPi/RPi3/AcpiTables/AcpiTables.inf and * Platform/RaspberryPi/RPi4/AcpiTables/AcpiTables.inf _must_ match below. @@ -46,6 +50,18 @@ typedef struct { EFI_DEVICE_PATH_PROTOCOL End; } HII_VENDOR_DEVICE_PATH; +#pragma pack (1) +typedef struct { + MAC_ADDR_DEVICE_PATH MacAddrDP; + EFI_DEVICE_PATH_PROTOCOL End; +} GENET_DEVICE_PATH; + +typedef struct { + GENET_DEVICE_PATH DevicePath; + BCM_GENET_PLATFORM_DEVICE_PROTOCOL PlatformDevice; +} GENET_DEVICE; +#pragma pack () + STATIC HII_VENDOR_DEVICE_PATH mVendorDevicePath = { { { @@ -68,6 +84,65 @@ STATIC HII_VENDOR_DEVICE_PATH mVendorDevicePath = { } }; +STATIC GENET_DEVICE mGenetDevice = { + { + { + { + MESSAGING_DEVICE_PATH, + MSG_MAC_ADDR_DP, + { + (UINT8)(sizeof (MAC_ADDR_DEVICE_PATH)), + (UINT8)((sizeof (MAC_ADDR_DEVICE_PATH)) >> 8) + } + }, + {{ 0 }}, + NET_IFTYPE_ETHERNET + }, + { + END_DEVICE_PATH_TYPE, + END_ENTIRE_DEVICE_PATH_SUBTYPE, + { + sizeof (EFI_DEVICE_PATH_PROTOCOL), + 0 + } + } + }, + { + GENET_BASE_ADDRESS, + {{ 0 }} + } +}; + + +STATIC +VOID +EFIAPI +RegisterDevices ( + EFI_EVENT Event, + VOID *Context + ) +{ + EFI_HANDLE Handle; + EFI_STATUS Status; + + if (mModelFamily == 4) { + DEBUG ((DEBUG_INFO, "GENET: MAC address %02X:%02X:%02X:%02X:%02X:%02X\n", + MacAddress.Addr[0], MacAddress.Addr[1], MacAddress.Addr[2], + MacAddress.Addr[3], MacAddress.Addr[4], MacAddress.Addr[5])); + + CopyMem (&mGenetDevice.DevicePath.MacAddrDP.MacAddress, MacAddress.Addr, + NET_ETHER_ADDR_LEN); + CopyMem (&mGenetDevice.PlatformDevice.MacAddress, MacAddress.Addr, + NET_ETHER_ADDR_LEN); + + Handle = NULL; + Status = gBS->InstallMultipleProtocolInterfaces (&Handle, + &gEfiDevicePathProtocolGuid, &mGenetDevice.DevicePath, + &gBcmGenetPlatformDeviceProtocolGuid, &mGenetDevice.PlatformDevice, + NULL); + ASSERT_EFI_ERROR (Status); + } +} STATIC EFI_STATUS InstallHiiPages ( @@ -241,6 +316,16 @@ SetupVariables ( PcdSet32 (PcdDisplayEnableSShot, PcdGet32 (PcdDisplayEnableSShot)); } + if (mModelFamily == 4) { + // + // Get the MAC address from the firmware. + // + Status = mFwProtocol->GetMacAddress (MacAddress.Addr); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_WARN, "%a: failed to retrieve MAC address\n", __FUNCTION__)); + } + } + return EFI_SUCCESS; } @@ -447,7 +532,8 @@ ConfigInitialize ( IN EFI_SYSTEM_TABLE *SystemTable ) { - EFI_STATUS Status; + EFI_STATUS Status; + EFI_EVENT EndOfDxeEvent; Status = gBS->LocateProtocol (&gRaspberryPiFirmwareProtocolGuid, NULL, (VOID**)&mFwProtocol); @@ -490,5 +576,9 @@ ConfigInitialize ( Status = LocateAndInstallAcpiFromFv (&mAcpiTableFile); ASSERT_EFI_ERROR (Status); + Status = gBS->CreateEventEx (EVT_NOTIFY_SIGNAL, TPL_NOTIFY, RegisterDevices, + NULL, &gEfiEndOfDxeEventGroupGuid, &EndOfDxeEvent); + ASSERT_EFI_ERROR (Status); + return EFI_SUCCESS; } -- 2.17.1