Skip to content
Permalink
Browse files
Platform/RaspberryPi4: Register GENET platform device protocol
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.

Co-authored-by: Samer El-Haj-Mahmoud <samer.el-haj-mahmoud@arm.com>
Co-authored-by: Ard Biesheuvel <ard.biesheuvel@arm.com>
Co-authored-by: Andrei Warkentin <awarkentin@vmware.com>
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@arm.com>
Reviewed-by: Leif Lindholm <leif@nuviainc.com>
  • Loading branch information
3 people committed May 12, 2020
1 parent 8ed5446 commit 193bc271a51d1630f248374bf38ed49754a0720b
Showing 2 changed files with 95 additions and 4 deletions.
@@ -22,6 +22,7 @@
#include <Library/NetLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiRuntimeServicesTableLib.h>
#include <Protocol/BcmGenetPlatformDevice.h>
#include <Protocol/RpiFirmware.h>
#include <ConfigVars.h>
#include "ConfigDxeFormSetGuid.h"
@@ -35,6 +36,8 @@ STATIC RASPBERRY_PI_FIRMWARE_PROTOCOL *mFwProtocol;
STATIC UINT32 mModelFamily = 0;
STATIC UINT32 mModelInstalledMB = 0;

STATIC EFI_MAC_ADDRESS mMacAddress;

/*
* The GUID inside Platform/RaspberryPi/RPi3/AcpiTables/AcpiTables.inf and
* Platform/RaspberryPi/RPi4/AcpiTables/AcpiTables.inf _must_ match below.
@@ -48,6 +51,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 = {
{
{
@@ -70,6 +85,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",
mMacAddress.Addr[0], mMacAddress.Addr[1], mMacAddress.Addr[2],
mMacAddress.Addr[3], mMacAddress.Addr[4], mMacAddress.Addr[5]));

CopyMem (&mGenetDevice.DevicePath.MacAddrDP.MacAddress, mMacAddress.Addr,
NET_ETHER_ADDR_LEN);
CopyMem (&mGenetDevice.PlatformDevice.MacAddress, mMacAddress.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 (
@@ -243,6 +317,16 @@ SetupVariables (
PcdSet32 (PcdDisplayEnableSShot, PcdGet32 (PcdDisplayEnableSShot));
}

if (mModelFamily == 4) {
//
// Get the MAC address from the firmware.
//
Status = mFwProtocol->GetMacAddress (mMacAddress.Addr);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_WARN, "%a: failed to retrieve MAC address\n", __FUNCTION__));
}
}

return EFI_SUCCESS;
}

@@ -449,7 +533,8 @@ ConfigInitialize (
IN EFI_SYSTEM_TABLE *SystemTable
)
{
EFI_STATUS Status;
EFI_STATUS Status;
EFI_EVENT EndOfDxeEvent;

Status = gBS->LocateProtocol (&gRaspberryPiFirmwareProtocolGuid,
NULL, (VOID**)&mFwProtocol);
@@ -495,5 +580,9 @@ ConfigInitialize (
ASSERT_EFI_ERROR (Status);
}

Status = gBS->CreateEventEx (EVT_NOTIFY_SIGNAL, TPL_NOTIFY, RegisterDevices,
NULL, &gEfiEndOfDxeEventGroupGuid, &EndOfDxeEvent);
ASSERT_EFI_ERROR (Status);

return EFI_SUCCESS;
}
@@ -23,7 +23,6 @@
#
# VALID_ARCHITECTURES = AARCH64
#

[Sources]
ConfigDxe.c
ConfigDxeFormSetGuid.h
@@ -57,10 +56,12 @@

[Guids]
gConfigDxeFormSetGuid
gEfiEndOfDxeEventGroupGuid

[Protocols]
gRaspberryPiFirmwareProtocolGuid ## CONSUMES
gRaspberryPiConfigAppliedProtocolGuid ## PRODUCES
gBcmGenetPlatformDeviceProtocolGuid ## PRODUCES
gRaspberryPiFirmwareProtocolGuid ## CONSUMES
gRaspberryPiConfigAppliedProtocolGuid ## PRODUCES

[FixedPcd]
gRaspberryPiTokenSpaceGuid.PcdCpuLowSpeedMHz
@@ -69,6 +70,7 @@

[Pcd]
gBcm27xxTokenSpaceGuid.PcdBcm27xxRegistersAddress
gBcm27xxTokenSpaceGuid.PcdBcmGenetRegistersAddress
gBcm283xTokenSpaceGuid.PcdBcm283xRegistersAddress
gRaspberryPiTokenSpaceGuid.PcdCpuClock
gRaspberryPiTokenSpaceGuid.PcdCustomCpuClock

0 comments on commit 193bc27

Please sign in to comment.