From: "Pete Batard" <pete@akeo.ie>
To: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Cc: edk2-devel-groups-io <devel@edk2.groups.io>,
"Leif Lindholm" <leif@nuviainc.com>,
"Philippe Mathieu-Daudé" <philmd@redhat.com>,
"Jeremy Linton" <lintonrjeremy@gmail.com>
Subject: Re: [edk2-platforms][PATCH 2/3] Platform/RPi: Add PlatformPcdLib to set the Genet MAC address
Date: Thu, 23 Jan 2020 15:01:39 +0000 [thread overview]
Message-ID: <69df8e67-3f0a-986b-527a-1f937348cccf@akeo.ie> (raw)
In-Reply-To: <CAKv+Gu_s534p080NO8aHoBdpdpencG4Q2Ukz8qvcCqynNpGdHA@mail.gmail.com>
On 2020.01.23 13:50, Ard Biesheuvel wrote:
> On Thu, 23 Jan 2020 at 13:00, Pete Batard <pete@akeo.ie> wrote:
>>
>> 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 | 61 ++++++++++++++++++++
>> Platform/RaspberryPi/Library/PlatformPcdLib/PlatformPcdLib.inf | 44 ++++++++++++++
>> 2 files changed, 105 insertions(+)
>>
>> diff --git a/Platform/RaspberryPi/Library/PlatformPcdLib/PlatformPcdLib.c b/Platform/RaspberryPi/Library/PlatformPcdLib/PlatformPcdLib.c
>> new file mode 100644
>> index 000000000000..78f3679e2e48
>> --- /dev/null
>> +++ b/Platform/RaspberryPi/Library/PlatformPcdLib/PlatformPcdLib.c
>> @@ -0,0 +1,61 @@
>> +/** @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
>> + )
>> +{
>> +
>> + //
>> + // If Genet is in use and a MAC address PCD has not been set, do it here.
>> + //
>> +#if (FixedPcdGet64 (PcdBcmGenetRegistersAddress) != 0)
>
> Can we drop this check? Why would you include this library in your
> .DSC and set the fixed PCD to 0?
Well, the idea is that we may use this PCD library on the Pi 3 as well,
if we want to use a similar approach to this for other features, in
which case PcdBcmGenetRegistersAddress will be 0.
The fact that this library resides in Platform/RaspberryPi/Library/
rather than Platform/RaspberryPi/RPi4/Library/ means that it is designed
to be used on more than the Pi 4 platform if needed.
>
>> + EFI_STATUS Status;
>> + UINT64 MacAddr;
>> + RASPBERRY_PI_FIRMWARE_PROTOCOL *mFwProtocol;
>> +
>> + if (PcdGet64 (PcdBcmGenetMacAddress) == 0) {
>
> This is policy, which we don't need today, and may well be needed
> elsewhere once we do need it. So I'd prefer it if we just drop this
> check.
I'm not sure I understand your point.
This patchset is designed around the idea that someone may also provide
the MAC address at build time to force a specific MAC on their platform.
I can see specific scenarios for such a use (e.g. someone using Pi 4's
in a environment where they assign a specific IP according to the MAC
and planning for drop-in replacement in case of hardware failures) and
even outside of these, I can see people wanting for force a MAC that is
different than the hardware's (e.g. could also be handy for spoofing an
existing network device with an inexpensive Pi 4), without having to
touch the code. Granted, they should be able to perform the same in high
level OS, but once we add a full NIC driver in UEFI, we may announce a
different MAC prior to OS network init, and I think, since we can do it
here, and it will be picked up by the OS, we might as well do so since
it's easy to add.
As such, if someone did set the MAC PCD at build time, we shouldn't
override it.
>
>> + 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 {
>> + PcdSet64 (PcdBcmGenetMacAddress, MacAddr);
>
> Please use PcdSet64S () instead - the unsafe ones are deprecated AFAIR
Will do.
>
>> + }
>> + }
>> +#endif
>> +
>> + return EFI_SUCCESS;
>> +}
>> +
>> +EFI_STATUS
>> +EFIAPI
>> +PlatformPcdLibDestructor (
>> + IN EFI_HANDLE ImageHandle,
>> + IN EFI_SYSTEM_TABLE *SystemTable
>> + )
>> +{
>> + return EFI_SUCCESS;
>> +}
>
> No need for a destructor
Yeah, I wasn't sure if that worked without one, and PlatformUiAppLib has
a similar empty destructor, so I preferred to ensure it was present.
I'll remove it form the patchset.
>
>> diff --git a/Platform/RaspberryPi/Library/PlatformPcdLib/PlatformPcdLib.inf b/Platform/RaspberryPi/Library/PlatformPcdLib/PlatformPcdLib.inf
>> new file mode 100644
>> index 000000000000..a564ddfbb2a3
>> --- /dev/null
>> +++ b/Platform/RaspberryPi/Library/PlatformPcdLib/PlatformPcdLib.inf
>> @@ -0,0 +1,44 @@
>> +#/** @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
>> + DESTRUCTOR = PlatformPcdLibDestructor
>> +
>> +[Sources]
>> + PlatformPcdLib.c
>> +
>> +[Packages]
>> + MdePkg/MdePkg.dec
>> + MdeModulePkg/MdeModulePkg.dec
>> + Platform/RaspberryPi/RaspberryPi.dec
>> + Silicon/Broadcom/Drivers/Net/BcmNet.dec
>> +
>> +[LibraryClasses]
>> + UefiLib
>> + DebugLib
>> + PrintLib
>> +
>> +[Protocols]
>> + gRaspberryPiFirmwareProtocolGuid ## CONSUMES
>> +
>> +[Pcd]
>> + gBcmNetTokenSpaceGuid.PcdBcmGenetMacAddress ## SOMETIMES_PRODUCES
>> +
>> +[FixedPcd]
>> + gBcmNetTokenSpaceGuid.PcdBcmGenetRegistersAddress
>> +
>> +[Depex]
>> + gPcdProtocolGuid AND gRaspberryPiFirmwareProtocolGuid
>> +
>
> Use the PcdLib library class instead - this will depex on the
> gPcdProtocolGuid if needed.
>
> I don't mind this approach, but in general, I'd be happier with a
> specific library class to discover the MAC address.
>
> I.e., a library class in BcmNet.dec called BcmGenetPlatformLib, which
> has [for now] a single function called BcmGenetGetMacFromPlatform().
> The RPi4 implementation would provide that routine, and depex on the
> firmware protocol, ensuring the ordering is correct. That way, we can
> get rid of the PCDs entirely.
I get your point. But I'd rather not do that, since I do see some use
for a PCD provided MAC.
Regards,
/Pete
next prev parent reply other threads:[~2020-01-23 15:01 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-01-23 12:00 [edk2-platforms][PATCH 0/3] Platform/RPi4: Add Genet network driver stub Pete Batard
2020-01-23 12:00 ` [edk2-platforms][PATCH 1/3] Silicon/Broadcom/Net: Add Genet stub driver to setup MAC Pete Batard
2020-01-23 13:44 ` Ard Biesheuvel
2020-01-23 14:36 ` Pete Batard
2020-01-23 12:00 ` [edk2-platforms][PATCH 2/3] Platform/RPi: Add PlatformPcdLib to set the Genet MAC address Pete Batard
2020-01-23 13:50 ` Ard Biesheuvel
2020-01-23 15:01 ` Pete Batard [this message]
2020-01-23 12:00 ` [edk2-platforms][PATCH 3/3] Platform/Rpi4: Enable Broadcom Genet stub driver Pete Batard
2020-01-23 12:00 ` [PATCH] Platform/RPi/Genet: Add Genet stub driver to setup MAC Pete Batard
2020-01-23 12:00 ` [PATCH] Platform/RPi4: Enable BCM GENET stub driver Pete Batard
[not found] ` <15EC824B064B2D10.12514@groups.io>
2020-01-23 12:03 ` [edk2-devel] [PATCH] Platform/RPi/Genet: Add Genet stub driver to setup MAC Pete Batard
[not found] ` <15EC824ADEB49EC2.12514@groups.io>
2020-01-23 12:03 ` [edk2-devel] [PATCH] Platform/RPi4: Enable BCM GENET stub driver Pete Batard
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=69df8e67-3f0a-986b-527a-1f937348cccf@akeo.ie \
--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