* [edk2-platforms][PATCH v3 1/3] Silicon/Broadcom/Net: Add Genet stub driver to setup MAC
2020-02-03 13:13 [edk2-platforms][PATCH v3 0/3] Platform/RPi4: Add Genet network driver stub Pete Batard
@ 2020-02-03 13:13 ` Pete Batard
2020-02-03 13:13 ` [edk2-platforms][PATCH v3 2/3] Platform/RPi: Add PlatformPcdLib to set the Genet MAC address Pete Batard
` (2 subsequent siblings)
3 siblings, 0 replies; 6+ messages in thread
From: Pete Batard @ 2020-02-03 13:13 UTC (permalink / raw)
To: devel; +Cc: ard.biesheuvel, leif, philmd, lintonrjeremy
From: Jeremy Linton <lintonrjeremy@gmail.com>
Add a stub for the Broadcom Genet network interface, that is used
by the Raspberry Pi 4 (and that may be used by other platforms).
For the time being, the stub only performs UMAC init, using a MAC
address PCD, as, even without a working network interface in UEFI
environment, it is desirable if the hardware can describe itself
for booting in an ACPI environment, rather than pass parameters via
DSDT/DSD .
Signed-off-by: Pete Batard <pete@akeo.ie>
---
Silicon/Broadcom/Drivers/Net/BcmGenetDxe/BcmGenetDxe.inf | 40 +++++++
Silicon/Broadcom/Drivers/Net/BcmGenetDxe/Genet.c | 114 ++++++++++++++++++++
Silicon/Broadcom/Drivers/Net/BcmGenetDxe/Genet.h | 20 ++++
Silicon/Broadcom/Drivers/Net/BcmNet.dec | 22 ++++
4 files changed, 196 insertions(+)
diff --git a/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/BcmGenetDxe.inf b/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/BcmGenetDxe.inf
new file mode 100644
index 000000000000..9e9301608f24
--- /dev/null
+++ b/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/BcmGenetDxe.inf
@@ -0,0 +1,40 @@
+## @file
+#
+# Copyright (c) 2020, Jeremy Linton All rights reserved.<BR>
+#
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+##
+
+[Defines]
+ INF_VERSION = 0x0001001A
+ BASE_NAME = BcmGenetDxe
+ FILE_GUID = e2b1eaf3-50b7-4ae1-b79e-ec8020cb57ac
+ MODULE_TYPE = DXE_DRIVER
+ VERSION_STRING = 0.1
+ ENTRY_POINT = GenetEntryPoint
+
+[Sources]
+ Genet.c
+
+[Packages]
+ ArmPkg/ArmPkg.dec
+ MdeModulePkg/MdeModulePkg.dec
+ MdePkg/MdePkg.dec
+ Silicon/Broadcom/Drivers/Net/BcmNet.dec
+
+[LibraryClasses]
+ ArmLib
+ BaseLib
+ IoLib
+ UefiDriverEntryPoint
+ UefiLib
+
+[FixedPcd]
+ gBcmNetTokenSpaceGuid.PcdBcmGenetRegistersAddress
+
+[Pcd]
+ gBcmNetTokenSpaceGuid.PcdBcmGenetMacAddress
+
+[Depex]
+ TRUE
diff --git a/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/Genet.c b/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/Genet.c
new file mode 100644
index 000000000000..9f29bc0c0894
--- /dev/null
+++ b/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/Genet.c
@@ -0,0 +1,114 @@
+/** @file
+
+ Copyright (c) 2020, Jeremy Linton All rights reserved.<BR>
+
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+ This driver acts like a stub to set the Broadcom
+ Genet MAC address, until the actual network driver
+ is in place.
+
+**/
+
+#include <Library/ArmLib.h>
+#include <Library/DebugLib.h>
+#include <Library/IoLib.h>
+#include <Library/PcdLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/UefiLib.h>
+
+#include <Genet.h>
+#include <PiDxe.h>
+
+STATIC
+VOID
+RMWRegister (
+ UINT32 Offset,
+ UINT32 Mask,
+ UINT32 In
+ )
+{
+ EFI_PHYSICAL_ADDRESS Addr;
+ UINT32 Data;
+ UINT32 Shift;
+
+ Addr = GENET_BASE_ADDRESS + Offset;
+ Data = 0;
+ Shift = 1;
+ if (In) {
+ while (!(Mask & Shift))
+ Shift <<= 1;
+ Data = (MmioRead32 (Addr) & ~Mask) | ((In * Shift) & Mask);
+ } else {
+ Data = MmioRead32 (Addr) & ~Mask;
+ }
+
+ MmioWrite32 (Addr, Data);
+
+ ArmDataMemoryBarrier ();
+}
+
+STATIC
+VOID
+WdRegister (
+ UINT32 Offset,
+ UINT32 In
+ )
+{
+ EFI_PHYSICAL_ADDRESS Base = GENET_BASE_ADDRESS;
+
+ MmioWrite32 (Base + Offset, In);
+
+ ArmDataMemoryBarrier ();
+}
+
+STATIC
+VOID
+SetMacAddress (
+ UINT8* MacAddr
+)
+{
+ // Bring the UMAC out of reset
+ RMWRegister (GENET_SYS_RBUF_FLUSH_CTRL, 0x2, 1);
+ gBS->Stall (10);
+ RMWRegister (GENET_SYS_RBUF_FLUSH_CTRL, 0x2, 0);
+
+ // Update the MAC
+ DEBUG ((DEBUG_INFO, "Using MAC address %02X:%02X:%02X:%02X:%02X:%02X\n",
+ MacAddr[0], MacAddr[1], MacAddr[2], MacAddr[3], MacAddr[4], MacAddr[5]));
+
+ WdRegister (GENET_UMAC_MAC0, (MacAddr[0] << 24) | (MacAddr[1] << 16) |
+ (MacAddr[2] << 8) | MacAddr[3]);
+ WdRegister (GENET_UMAC_MAC1, (MacAddr[4] << 8) | MacAddr[5]);
+
+}
+
+/**
+ The entry point of Genet UEFI Driver.
+
+ @param ImageHandle The image handle of the UEFI Driver.
+ @param SystemTable A pointer to the EFI System Table.
+
+ @retval EFI_SUCCESS The Driver or UEFI Driver exited normally.
+ @retval EFI_INCOMPATIBLE_VERSION _gUefiDriverRevision is greater than
+ SystemTable->Hdr.Revision.
+
+**/
+EFI_STATUS
+EFIAPI
+GenetEntryPoint (
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable
+ )
+{
+ UINT64 MacAddr;
+
+ // Read the MAC address
+ MacAddr = PcdGet64 (PcdBcmGenetMacAddress);
+
+ if (MacAddr != 0) {
+ SetMacAddress ((UINT8*)&MacAddr);
+ }
+
+ return EFI_SUCCESS;
+}
diff --git a/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/Genet.h b/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/Genet.h
new file mode 100644
index 000000000000..4a3827c0e0d1
--- /dev/null
+++ b/Silicon/Broadcom/Drivers/Net/BcmGenetDxe/Genet.h
@@ -0,0 +1,20 @@
+/** @file
+
+ Copyright (c) 2020, Pete Batard <pete@akeo.ie>
+
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef BCM_GENET_H__
+#define BCM_GENET_H__
+
+#include <Library/PcdLib.h>
+
+#define GENET_BASE_ADDRESS (FixedPcdGet64 (PcdBcmGenetRegistersAddress))
+
+#define GENET_SYS_RBUF_FLUSH_CTRL 0x0008
+#define GENET_UMAC_MAC0 0x080c
+#define GENET_UMAC_MAC1 0x0810
+
+#endif /* BCM_GENET_H__ */
diff --git a/Silicon/Broadcom/Drivers/Net/BcmNet.dec b/Silicon/Broadcom/Drivers/Net/BcmNet.dec
new file mode 100644
index 000000000000..2a8688cb09a7
--- /dev/null
+++ b/Silicon/Broadcom/Drivers/Net/BcmNet.dec
@@ -0,0 +1,22 @@
+## @file
+#
+# Copyright (c) 2020, Pete Batard <pete@akeo.ie>
+#
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+##
+
+[Defines]
+ DEC_SPECIFICATION = 0x0001001A
+ PACKAGE_NAME = BcmNetPkg
+ PACKAGE_GUID = 34E19823-D23A-41AB-9C09-ED1225B32DFF
+ PACKAGE_VERSION = 1.0
+
+[Guids]
+ gBcmNetTokenSpaceGuid = {0x12b97d70, 0x9149, 0x4c2f, {0x82, 0xd5, 0xad, 0xa9, 0x1e, 0x92, 0x75, 0xa1}}
+
+[PcdsFixedAtBuild]
+ gBcmNetTokenSpaceGuid.PcdBcmGenetRegistersAddress|0x0|UINT64|0x00000001
+
+[PcdsDynamic]
+ gBcmNetTokenSpaceGuid.PcdBcmGenetMacAddress|0x0|UINT64|0x00000002
--
2.21.0.windows.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [edk2-platforms][PATCH v3 2/3] Platform/RPi: Add PlatformPcdLib to set the Genet MAC address
2020-02-03 13:13 [edk2-platforms][PATCH v3 0/3] Platform/RPi4: Add Genet network driver stub Pete Batard
2020-02-03 13:13 ` [edk2-platforms][PATCH v3 1/3] Silicon/Broadcom/Net: Add Genet stub driver to setup MAC Pete Batard
@ 2020-02-03 13:13 ` Pete Batard
2020-02-03 13:13 ` [edk2-platforms][PATCH v3 3/3] Platform/RPi4: Enable Broadcom Genet stub driver Pete Batard
2020-02-08 8:50 ` [edk2-platforms][PATCH v3 0/3] Platform/RPi4: Add Genet network driver stub Ard Biesheuvel
3 siblings, 0 replies; 6+ messages in thread
From: Pete Batard @ 2020-02-03 13:13 UTC (permalink / raw)
To: devel; +Cc: ard.biesheuvel, leif, philmd, lintonrjeremy
The Genet driver stub used by the Raspberry Pi 4 platform is
designed to set the MAC address according to a PCD.
To be able to set that PCD at runtime, by using the Raspberry
Pi firmware interface, that has a dedicated call to retrieve
the MAC address, and satisfy driver dependencies in a generic
manner, we create a new PlatformPcdLib that can be referenced
by the Genet driver, to set the MAC PCD before use there.
While it is currently only tailored around MAC PCD population
for Genet, we do expect this PCD library to be extended in the
future, to provide additional PCD facilities for other drivers.
Signed-off-by: Pete Batard <pete@akeo.ie>
---
Platform/RaspberryPi/Library/PlatformPcdLib/PlatformPcdLib.c | 45 ++++++++++++++++++++
Platform/RaspberryPi/Library/PlatformPcdLib/PlatformPcdLib.inf | 43 +++++++++++++++++++
2 files changed, 88 insertions(+)
diff --git a/Platform/RaspberryPi/Library/PlatformPcdLib/PlatformPcdLib.c b/Platform/RaspberryPi/Library/PlatformPcdLib/PlatformPcdLib.c
new file mode 100644
index 000000000000..e78518c81374
--- /dev/null
+++ b/Platform/RaspberryPi/Library/PlatformPcdLib/PlatformPcdLib.c
@@ -0,0 +1,45 @@
+/** @file
+ *
+ * Copyright (c) 2020, Pete Batard <pete@akeo.ie>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause-Patent
+ *
+ **/
+
+#include <Library/DebugLib.h>
+#include <Library/PcdLib.h>
+#include <Library/PrintLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/UefiLib.h>
+#include <Library/UefiRuntimeServicesTableLib.h>
+#include <Protocol/RpiFirmware.h>
+
+EFI_STATUS
+EFIAPI
+PlatformPcdLibConstructor (
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable
+ )
+{
+ EFI_STATUS Status;
+ UINT64 MacAddr;
+ RASPBERRY_PI_FIRMWARE_PROTOCOL *mFwProtocol;
+
+ if (PcdGet64 (PcdBcmGenetMacAddress) == 0) {
+ Status = gBS->LocateProtocol (&gRaspberryPiFirmwareProtocolGuid, NULL,
+ (VOID**)&mFwProtocol);
+ ASSERT_EFI_ERROR(Status);
+
+ //
+ // Get the MAC address from the firmware
+ //
+ Status = mFwProtocol->GetMacAddress ((UINT8*) &MacAddr);
+ if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_WARN, "%a: failed to retrieve MAC address\n", __FUNCTION__));
+ } else {
+ PcdSet64S (PcdBcmGenetMacAddress, MacAddr);
+ }
+ }
+
+ return EFI_SUCCESS;
+}
diff --git a/Platform/RaspberryPi/Library/PlatformPcdLib/PlatformPcdLib.inf b/Platform/RaspberryPi/Library/PlatformPcdLib/PlatformPcdLib.inf
new file mode 100644
index 000000000000..2a207d2b3e54
--- /dev/null
+++ b/Platform/RaspberryPi/Library/PlatformPcdLib/PlatformPcdLib.inf
@@ -0,0 +1,43 @@
+#/** @file
+#
+# Copyright (c) 2020, Pete Batard <pete@akeo.ie>
+#
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+#**/
+
+[Defines]
+ INF_VERSION = 0x0001001A
+ BASE_NAME = PlatformPcdLib
+ FILE_GUID = 3B8409D7-D3C7-4006-823B-BFB184435363
+ MODULE_TYPE = DXE_DRIVER
+ VERSION_STRING = 1.0
+ LIBRARY_CLASS = NULL|DXE_DRIVER UEFI_APPLICATION
+ CONSTRUCTOR = PlatformPcdLibConstructor
+
+[Sources]
+ PlatformPcdLib.c
+
+[Packages]
+ MdePkg/MdePkg.dec
+ MdeModulePkg/MdeModulePkg.dec
+ Platform/RaspberryPi/RaspberryPi.dec
+ Silicon/Broadcom/Drivers/Net/BcmNet.dec
+
+[LibraryClasses]
+ DebugLib
+ PcdLib
+ UefiLib
+ PrintLib
+
+[Protocols]
+ gRaspberryPiFirmwareProtocolGuid ## CONSUMES
+
+[Pcd]
+ gBcmNetTokenSpaceGuid.PcdBcmGenetMacAddress ## SOMETIMES_PRODUCES
+
+[FixedPcd]
+ gBcmNetTokenSpaceGuid.PcdBcmGenetRegistersAddress
+
+[Depex]
+ gRaspberryPiFirmwareProtocolGuid
--
2.21.0.windows.1
^ permalink raw reply related [flat|nested] 6+ messages in thread