* [RFC edk2-platforms v1 0/3] Improve D0x @ 2020-05-21 14:43 Ming Huang 2020-05-21 14:43 ` [RFC edk2-platforms v1 1/3] Silicon/Hisilicon: Change updating dsdt in ready to boot event Ming Huang ` (3 more replies) 0 siblings, 4 replies; 12+ messages in thread From: Ming Huang @ 2020-05-21 14:43 UTC (permalink / raw) To: devel, leif, ard.biesheuvel Cc: lidongzhan, huangming23, songdongkuang, wanghuiqiang, qiuliangen Main Changes: Add update sas address feature in AcpiPlatformDxe. Ming Huang (3): Silicon/Hisilicon: Change updating dsdt in ready to boot event Silicon/Hisilicon/Acpi: Add update sas address feature Silicon/Hisilicon: Rename EthMac files Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c | 62 +- Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf | 8 +- Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c | 500 ---------------- Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h | 16 - Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.c | 612 ++++++++++++++++++++ Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.h | 16 + 6 files changed, 689 insertions(+), 525 deletions(-) delete mode 100644 Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c delete mode 100644 Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h create mode 100644 Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.c create mode 100644 Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.h -- 2.8.1 ^ permalink raw reply [flat|nested] 12+ messages in thread
* [RFC edk2-platforms v1 1/3] Silicon/Hisilicon: Change updating dsdt in ready to boot event 2020-05-21 14:43 [RFC edk2-platforms v1 0/3] Improve D0x Ming Huang @ 2020-05-21 14:43 ` Ming Huang 2020-05-26 17:40 ` Leif Lindholm 2020-05-21 14:43 ` [RFC edk2-platforms v1 2/3] Silicon/Hisilicon/Acpi: Add update sas address feature Ming Huang ` (2 subsequent siblings) 3 siblings, 1 reply; 12+ messages in thread From: Ming Huang @ 2020-05-21 14:43 UTC (permalink / raw) To: devel, leif, ard.biesheuvel Cc: lidongzhan, huangming23, songdongkuang, wanghuiqiang, qiuliangen The better time for updating dsdt is in ready to boot event, so change the updating time. Signed-off-by: Ming Huang <huangming23@huawei.com> --- Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c | 60 ++++++++++++++++++-- 1 file changed, 56 insertions(+), 4 deletions(-) diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c index b888cb1..1ab55bc 100644 --- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c +++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c @@ -1,8 +1,8 @@ /** @file - Copyright (c) 2014, Applied Micro Curcuit Corporation. All rights reserved.<BR> - Copyright (c) 2015, Hisilicon Limited. All rights reserved.<BR> - Copyright (c) 2015, Linaro Limited. All rights reserved.<BR> + Copyright (c) 2014 - 2020, Applied Micro Curcuit Corporation. All rights reserved.<BR> + Copyright (c) 2015 - 2020, Hisilicon Limited. All rights reserved.<BR> + Copyright (c) 2015 - 2020, Linaro Limited. All rights reserved.<BR> SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -23,6 +23,38 @@ #include <IndustryStandard/AcpiAml.h> #include "EthMac.h" +EFI_EVENT mUpdateAcpiDsdtTableEvent; + +VOID +EFIAPI +UpdateAcpiDsdt ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + EFI_ACPI_TABLE_PROTOCOL *AcpiTableProtocol; + EFI_STATUS Status; + + Status = gBS->LocateProtocol ( + &gEfiAcpiTableProtocolGuid, + NULL, + (VOID**)&AcpiTableProtocol + ); + + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, " Unable to locate ACPI table protocol\n")); + return; + } + + Status = EthMacInit (); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, " UpdateAcpiDsdtTable Failed, Status = %r\n", Status)); + } + + gBS->CloseEvent (Event); + return; +} + EFI_STATUS EFIAPI AcpiPlatformEntryPoint ( @@ -30,5 +62,25 @@ AcpiPlatformEntryPoint ( IN EFI_SYSTEM_TABLE *SystemTable ) { - return EthMacInit(); + EFI_STATUS Status; + + // + // Register notify function + // + Status = gBS->CreateEventEx ( + EVT_NOTIFY_SIGNAL, + TPL_CALLBACK, + UpdateAcpiDsdt, + NULL, + &gEfiEventReadyToBootGuid, + &mUpdateAcpiDsdtTableEvent + ); + + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Create ReadyToBoot event for UpdateAcpiDsdt failed.\n")); + } else { + DEBUG ((DEBUG_INFO, "Create ReadyToBoot event for UpdateAcpiDsdt success.\n")); + } + + return Status; } -- 2.8.1 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [RFC edk2-platforms v1 1/3] Silicon/Hisilicon: Change updating dsdt in ready to boot event 2020-05-21 14:43 ` [RFC edk2-platforms v1 1/3] Silicon/Hisilicon: Change updating dsdt in ready to boot event Ming Huang @ 2020-05-26 17:40 ` Leif Lindholm 2020-05-27 11:38 ` Ming Huang 0 siblings, 1 reply; 12+ messages in thread From: Leif Lindholm @ 2020-05-26 17:40 UTC (permalink / raw) To: Ming Huang Cc: devel, ard.biesheuvel, lidongzhan, songdongkuang, wanghuiqiang, qiuliangen Please call your patches PATCH. RFC is when a potential solution is put up for discussion, not for changing platform code. On Thu, May 21, 2020 at 22:43:02 +0800, Ming Huang wrote: > The better time for updating dsdt is in ready to boot event, > so change the updating time. The commit message should explain *why* it is better. > > Signed-off-by: Ming Huang <huangming23@huawei.com> > --- > Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c | 60 ++++++++++++++++++-- > 1 file changed, 56 insertions(+), 4 deletions(-) > > diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c > index b888cb1..1ab55bc 100644 > --- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c > +++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c > @@ -1,8 +1,8 @@ > /** @file > > - Copyright (c) 2014, Applied Micro Curcuit Corporation. All rights reserved.<BR> > - Copyright (c) 2015, Hisilicon Limited. All rights reserved.<BR> > - Copyright (c) 2015, Linaro Limited. All rights reserved.<BR> > + Copyright (c) 2014 - 2020, Applied Micro Curcuit Corporation. All rights reserved.<BR> > + Copyright (c) 2015 - 2020, Hisilicon Limited. All rights reserved.<BR> > + Copyright (c) 2015 - 2020, Linaro Limited. All rights reserved.<BR> Only the Hisilicon copyright should be updated (or a Huawei one added, given that this is the address used for submitting). / Leif > SPDX-License-Identifier: BSD-2-Clause-Patent > > **/ > @@ -23,6 +23,38 @@ > #include <IndustryStandard/AcpiAml.h> > #include "EthMac.h" > > +EFI_EVENT mUpdateAcpiDsdtTableEvent; > + > +VOID > +EFIAPI > +UpdateAcpiDsdt ( > + IN EFI_EVENT Event, > + IN VOID *Context > + ) > +{ > + EFI_ACPI_TABLE_PROTOCOL *AcpiTableProtocol; > + EFI_STATUS Status; > + > + Status = gBS->LocateProtocol ( > + &gEfiAcpiTableProtocolGuid, > + NULL, > + (VOID**)&AcpiTableProtocol > + ); > + > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, " Unable to locate ACPI table protocol\n")); > + return; > + } > + > + Status = EthMacInit (); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, " UpdateAcpiDsdtTable Failed, Status = %r\n", Status)); > + } > + > + gBS->CloseEvent (Event); > + return; > +} > + > EFI_STATUS > EFIAPI > AcpiPlatformEntryPoint ( > @@ -30,5 +62,25 @@ AcpiPlatformEntryPoint ( > IN EFI_SYSTEM_TABLE *SystemTable > ) > { > - return EthMacInit(); > + EFI_STATUS Status; > + > + // > + // Register notify function > + // > + Status = gBS->CreateEventEx ( > + EVT_NOTIFY_SIGNAL, > + TPL_CALLBACK, > + UpdateAcpiDsdt, > + NULL, > + &gEfiEventReadyToBootGuid, > + &mUpdateAcpiDsdtTableEvent > + ); > + > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_ERROR, "Create ReadyToBoot event for UpdateAcpiDsdt failed.\n")); > + } else { > + DEBUG ((DEBUG_INFO, "Create ReadyToBoot event for UpdateAcpiDsdt success.\n")); > + } > + > + return Status; > } > -- > 2.8.1 > ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [RFC edk2-platforms v1 1/3] Silicon/Hisilicon: Change updating dsdt in ready to boot event 2020-05-26 17:40 ` Leif Lindholm @ 2020-05-27 11:38 ` Ming Huang 0 siblings, 0 replies; 12+ messages in thread From: Ming Huang @ 2020-05-27 11:38 UTC (permalink / raw) To: Leif Lindholm Cc: devel, ard.biesheuvel, lidongzhan, songdongkuang, wanghuiqiang, qiuliangen 在 2020/5/27 1:40, Leif Lindholm 写道: > Please call your patches PATCH. RFC is when a potential solution > is put up for discussion, not for changing platform code. Modify it in v2. > > On Thu, May 21, 2020 at 22:43:02 +0800, Ming Huang wrote: >> The better time for updating dsdt is in ready to boot event, >> so change the updating time. > > The commit message should explain *why* it is better. Modify it in v2. > >> >> Signed-off-by: Ming Huang <huangming23@huawei.com> >> --- >> Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c | 60 ++++++++++++++++++-- >> 1 file changed, 56 insertions(+), 4 deletions(-) >> >> diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c >> index b888cb1..1ab55bc 100644 >> --- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c >> +++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c >> @@ -1,8 +1,8 @@ >> /** @file >> >> - Copyright (c) 2014, Applied Micro Curcuit Corporation. All rights reserved.<BR> >> - Copyright (c) 2015, Hisilicon Limited. All rights reserved.<BR> >> - Copyright (c) 2015, Linaro Limited. All rights reserved.<BR> >> + Copyright (c) 2014 - 2020, Applied Micro Curcuit Corporation. All rights reserved.<BR> >> + Copyright (c) 2015 - 2020, Hisilicon Limited. All rights reserved.<BR> >> + Copyright (c) 2015 - 2020, Linaro Limited. All rights reserved.<BR> > > Only the Hisilicon copyright should be updated (or a Huawei one added, > given that this is the address used for submitting). Ok, just modify Hisilicon copyright in v2. Thanks, Ming > > / > Leif > >> SPDX-License-Identifier: BSD-2-Clause-Patent >> >> **/ >> @@ -23,6 +23,38 @@ >> #include <IndustryStandard/AcpiAml.h> >> #include "EthMac.h" >> >> +EFI_EVENT mUpdateAcpiDsdtTableEvent; >> + >> +VOID >> +EFIAPI >> +UpdateAcpiDsdt ( >> + IN EFI_EVENT Event, >> + IN VOID *Context >> + ) >> +{ >> + EFI_ACPI_TABLE_PROTOCOL *AcpiTableProtocol; >> + EFI_STATUS Status; >> + >> + Status = gBS->LocateProtocol ( >> + &gEfiAcpiTableProtocolGuid, >> + NULL, >> + (VOID**)&AcpiTableProtocol >> + ); >> + >> + if (EFI_ERROR (Status)) { >> + DEBUG ((DEBUG_ERROR, " Unable to locate ACPI table protocol\n")); >> + return; >> + } >> + >> + Status = EthMacInit (); >> + if (EFI_ERROR (Status)) { >> + DEBUG ((DEBUG_ERROR, " UpdateAcpiDsdtTable Failed, Status = %r\n", Status)); >> + } >> + >> + gBS->CloseEvent (Event); >> + return; >> +} >> + >> EFI_STATUS >> EFIAPI >> AcpiPlatformEntryPoint ( >> @@ -30,5 +62,25 @@ AcpiPlatformEntryPoint ( >> IN EFI_SYSTEM_TABLE *SystemTable >> ) >> { >> - return EthMacInit(); >> + EFI_STATUS Status; >> + >> + // >> + // Register notify function >> + // >> + Status = gBS->CreateEventEx ( >> + EVT_NOTIFY_SIGNAL, >> + TPL_CALLBACK, >> + UpdateAcpiDsdt, >> + NULL, >> + &gEfiEventReadyToBootGuid, >> + &mUpdateAcpiDsdtTableEvent >> + ); >> + >> + if (EFI_ERROR (Status)) { >> + DEBUG ((DEBUG_ERROR, "Create ReadyToBoot event for UpdateAcpiDsdt failed.\n")); >> + } else { >> + DEBUG ((DEBUG_INFO, "Create ReadyToBoot event for UpdateAcpiDsdt success.\n")); >> + } >> + >> + return Status; >> } >> -- >> 2.8.1 >> > > . > ^ permalink raw reply [flat|nested] 12+ messages in thread
* [RFC edk2-platforms v1 2/3] Silicon/Hisilicon/Acpi: Add update sas address feature 2020-05-21 14:43 [RFC edk2-platforms v1 0/3] Improve D0x Ming Huang 2020-05-21 14:43 ` [RFC edk2-platforms v1 1/3] Silicon/Hisilicon: Change updating dsdt in ready to boot event Ming Huang @ 2020-05-21 14:43 ` Ming Huang 2020-05-26 18:49 ` Leif Lindholm 2020-05-21 14:43 ` [RFC edk2-platforms v1 3/3] Silicon/Hisilicon: Rename EthMac files Ming Huang 2020-05-26 18:09 ` [RFC edk2-platforms v1 0/3] Improve D0x Leif Lindholm 3 siblings, 1 reply; 12+ messages in thread From: Ming Huang @ 2020-05-21 14:43 UTC (permalink / raw) To: devel, leif, ard.biesheuvel Cc: lidongzhan, huangming23, songdongkuang, wanghuiqiang, qiuliangen The updating sas address feature is similar with apdating mac address. Modify updating dsdt flow for add this feature. Signed-off-by: Ming Huang <huangming23@huawei.com> --- Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c | 2 +- Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c | 200 +++++++++++++++----- Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h | 2 +- 3 files changed, 158 insertions(+), 46 deletions(-) diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c index 1ab55bc..d3ea051 100644 --- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c +++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c @@ -46,7 +46,7 @@ UpdateAcpiDsdt ( return; } - Status = EthMacInit (); + Status = UpdateAcpiDsdtTable (); if (EFI_ERROR (Status)) { DEBUG ((DEBUG_ERROR, " UpdateAcpiDsdtTable Failed, Status = %r\n", Status)); } diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c index cd98506..205f2f9 100644 --- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c +++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c @@ -1,8 +1,8 @@ /** @file - Copyright (c) 2014, Applied Micro Curcuit Corporation. All rights reserved.<BR> - Copyright (c) 2015, Hisilicon Limited. All rights reserved.<BR> - Copyright (c) 2015, Linaro Limited. All rights reserved.<BR> + Copyright (c) 2014 - 2020, Applied Micro Curcuit Corporation. All rights reserved.<BR> + Copyright (c) 2015 - 2020, Hisilicon Limited. All rights reserved.<BR> + Copyright (c) 2015 - 2020, Linaro Limited. All rights reserved.<BR> SPDX-License-Identifier: BSD-2-Clause-Patent This driver is called to initialize the FW part of the PHY in preparation @@ -30,6 +30,7 @@ #include <Library/UefiRuntimeServicesTableLib.h> #include <IndustryStandard/Acpi.h> #include <IndustryStandard/AcpiAml.h> +#include <Library/MemoryAllocationLib.h> #include <Protocol/HisiBoardNicProtocol.h> @@ -45,13 +46,20 @@ #define EFI_ACPI_MAX_NUM_TABLES 20 #define DSDT_SIGNATURE 0x54445344 -#define D03_ACPI_ETH_ID "HISI00C2" - #define ACPI_ETH_MAC_KEY "local-mac-address" +#define ACPI_ETH_SAS_KEY "sas-addr" #define PREFIX_VARIABLE_NAME L"MAC" #define PREFIX_VARIABLE_NAME_COMPAT L"RGMII_MAC" -#define MAC_MAX_LEN 30 +#define ADDRESS_MAX_LEN 30 + +CHAR8 *mHisiAcpiDevId[] = {"HISI00C1","HISI00C2","HISI0162"}; + +typedef enum { + DsdtDeviceUnknown, + DsdtDeviceLan, + DsdtDeviceSas +} DSDT_DEVICE_TYPE; EFI_STATUS GetEnvMac( IN UINTN MacNextID, @@ -89,12 +97,35 @@ EFI_STATUS GetEnvMac( return EFI_SUCCESS; } -EFI_STATUS _SearchReplacePackageMACAddress( +EFI_STATUS GetSasAddress ( + IN UINT8 Index, + IN OUT UINT8 *SasAddrBuffer + ) +{ + if (SasAddrBuffer == NULL) { + return EFI_INVALID_PARAMETER; + } + + SasAddrBuffer[0] = 0x50; + SasAddrBuffer[1] = 0x01; + SasAddrBuffer[2] = 0x88; + SasAddrBuffer[3] = 0x20; + SasAddrBuffer[4] = 0x16; + SasAddrBuffer[5] = 0x00; + SasAddrBuffer[6] = 0x00; + SasAddrBuffer[7] = Index; + + return EFI_SUCCESS; +} + +EFI_STATUS _SearchReplacePackageAddress( IN EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, IN EFI_ACPI_HANDLE ChildHandle, IN UINTN Level, IN OUT BOOLEAN *Found, - IN UINTN MacNextID) + IN UINTN DevNextID, + IN DSDT_DEVICE_TYPE FoundDev + ) { // ASL template for ethernet driver: /* @@ -117,12 +148,18 @@ EFI_STATUS _SearchReplacePackageMACAddress( UINTN Count; EFI_ACPI_HANDLE CurrentHandle; EFI_ACPI_HANDLE NextHandle; - UINT8 MACBuffer[MAC_MAX_LEN]; + EFI_ACPI_HANDLE Level1Handle; + UINT8 *AddressBuffer; + UINT8 AddressByte = 0; DBG("In Level:%d\n", Level); + Level1Handle = NULL; Status = EFI_SUCCESS; for (CurrentHandle = NULL; ;) { Status = AcpiTableProtocol->GetChild(ChildHandle, &CurrentHandle); + if (Level == 1) { + Level1Handle = CurrentHandle; + } if (Level != 3 && (EFI_ERROR(Status) || CurrentHandle == NULL)) break; @@ -143,11 +180,14 @@ EFI_STATUS _SearchReplacePackageMACAddress( DataSize, Data[0], DataSize > 1 ? Data[1] : 0); Data = Buffer; - if (DataType != EFI_ACPI_DATA_TYPE_STRING - || AsciiStrCmp((CHAR8 *) Data, ACPI_ETH_MAC_KEY) != 0) + if ((DataType != EFI_ACPI_DATA_TYPE_STRING) || + ((AsciiStrCmp ((CHAR8 *) Data, ACPI_ETH_MAC_KEY) != 0) && + (AsciiStrCmp ((CHAR8 *) Data, ACPI_ETH_SAS_KEY) != 0))) { + ChildHandle = Level1Handle; continue; + } - DBG("_DSD Key Type %d. Found MAC address key\n", DataType); + DBG("_DSD Key Type %d. Found address key\n", DataType); // // We found the node. @@ -157,13 +197,33 @@ EFI_STATUS _SearchReplacePackageMACAddress( } if (Level == 3 && *Found) { + AddressBuffer = AllocateZeroPool (ADDRESS_MAX_LEN); + if (AddressBuffer == NULL) { + DEBUG ((DEBUG_ERROR, "%a:%d AllocateZeroPool failed\n", __FILE__, __LINE__)); + return EFI_OUT_OF_RESOURCES; + } - //Update the MAC - Status = GetEnvMac(MacNextID, MACBuffer); - if (EFI_ERROR(Status)) + switch (FoundDev) { + case DsdtDeviceLan: + //Update the MAC + Status = GetEnvMac (DevNextID, AddressBuffer); + AddressByte = 6; + break; + case DsdtDeviceSas: + //Update SAS Address. + Status = GetSasAddress (DevNextID, AddressBuffer); + AddressByte = 8; + break; + default: + Status = EFI_INVALID_PARAMETER; + } + if (EFI_ERROR (Status)) { + FreePool (AddressBuffer); + AddressBuffer = NULL; break; + } - for (Count = 0; Count < 6; Count++) { + for (Count = 0; Count < AddressByte; Count++) { Status = AcpiTableProtocol->GetOption(CurrentHandle, 1, &DataType, &Buffer, &DataSize); if (EFI_ERROR(Status)) break; @@ -177,13 +237,15 @@ EFI_STATUS _SearchReplacePackageMACAddress( // only need one byte. // FIXME: Assume the CPU is little endian - Status = AcpiTableProtocol->SetOption(CurrentHandle, 1, (VOID *)&MACBuffer[Count], sizeof(UINT8)); + Status = AcpiTableProtocol->SetOption (CurrentHandle, 1, AddressBuffer + Count, sizeof(UINT8)); if (EFI_ERROR(Status)) break; Status = AcpiTableProtocol->GetChild(ChildHandle, &CurrentHandle); if (EFI_ERROR(Status) || CurrentHandle == NULL) break; } + FreePool (AddressBuffer); + AddressBuffer = NULL; break; } @@ -192,7 +254,13 @@ EFI_STATUS _SearchReplacePackageMACAddress( //Search next package AcpiTableProtocol->Open((VOID *) Buffer, &NextHandle); - Status = _SearchReplacePackageMACAddress(AcpiTableProtocol, NextHandle, Level + 1, Found, MacNextID); + Status = _SearchReplacePackageAddress( + AcpiTableProtocol, + NextHandle, + Level + 1, + Found, + DevNextID, + FoundDev); AcpiTableProtocol->Close(NextHandle); if (!EFI_ERROR(Status)) break; @@ -201,22 +269,26 @@ EFI_STATUS _SearchReplacePackageMACAddress( return Status; } -EFI_STATUS SearchReplacePackageMACAddress( +EFI_STATUS SearchReplacePackageAddress( IN EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, IN EFI_ACPI_HANDLE ChildHandle, - IN UINTN MacNextID) + IN UINTN DevNextID, + IN DSDT_DEVICE_TYPE FoundDev + ) { BOOLEAN Found = FALSE; UINTN Level = 0; - return _SearchReplacePackageMACAddress(AcpiTableProtocol, ChildHandle, Level, &Found, MacNextID); + return _SearchReplacePackageAddress(AcpiTableProtocol, ChildHandle, Level, + &Found, DevNextID, FoundDev); } EFI_STATUS -GetEthID ( +GetDeviceInfo ( EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, EFI_ACPI_HANDLE ChildHandle, - UINTN *EthID + UINTN *DevID, + DSDT_DEVICE_TYPE *FoundDev ) { EFI_STATUS Status; @@ -225,7 +297,7 @@ GetEthID ( CONST VOID *Buffer; UINTN DataSize; - // Get NameString ETHx + // Get NameString Status = AcpiTableProtocol->GetOption (ChildHandle, 1, &DataType, &Buffer, &DataSize); if (EFI_ERROR (Status)) { DEBUG ((EFI_D_ERROR, "[%a:%d] Get NameString failed: %r\n", __FUNCTION__, __LINE__, Status)); @@ -236,14 +308,23 @@ GetEthID ( DBG("Size %p Data %02x %02x %02x %02x\n", DataSize, Data[0], Data[1], Data[2], Data[3]); Data[4] = '\0'; - if (DataSize != 4 || - AsciiStrnCmp ("ETH", Data, 3) != 0 || - Data[3] > '9' || Data[3] < '0') { - DEBUG ((EFI_D_ERROR, "[%a:%d] The NameString %a is not ETHn\n", __FUNCTION__, __LINE__, Data)); + if ((DataSize != 4) || + (Data[3] > '9' || Data[3] < '0')) { + DEBUG ((DEBUG_ERROR, "The NameString %a is not ETHn or SASn\n", Data)); return EFI_INVALID_PARAMETER; } - *EthID = Data[3] - '0'; + if (AsciiStrnCmp ("ETH", Data, 3) == 0) { + *FoundDev = DsdtDeviceLan; + } else if (AsciiStrnCmp ("SAS", Data, 3) == 0) { + *FoundDev = DsdtDeviceSas; + } else { + DEBUG ((DEBUG_ERROR, "[%a:%d] The NameString %a is not ETHn or SASn\n", + __FUNCTION__, __LINE__, Data)); + return EFI_INVALID_PARAMETER; + } + + *DevID = Data[3] - '0'; return EFI_SUCCESS; } @@ -257,8 +338,10 @@ EFI_STATUS ProcessDSDTDevice ( CONST VOID *Buffer; UINTN DataSize; EFI_ACPI_HANDLE DevHandle; - INTN Found = 0; - UINTN MacNextID; + DSDT_DEVICE_TYPE FoundDev = DsdtDeviceUnknown; + UINTN DevNextID; + BOOLEAN HisiAcpiDevNotFound; + UINTN Index; Status = AcpiTableProtocol->GetOption(ChildHandle, 0, &DataType, &Buffer, &DataSize); if (EFI_ERROR(Status)) @@ -280,7 +363,7 @@ EFI_STATUS ProcessDSDTDevice ( break; // - // Search for _HID with Ethernet ID + // Search for _HID with Device ID // Status = AcpiTableProtocol->GetOption(DevHandle, 0, &DataType, &Buffer, &DataSize); if (EFI_ERROR(Status)) @@ -312,23 +395,34 @@ EFI_STATUS ProcessDSDTDevice ( DBG("[%a:%d] - _HID = %a\n", __FUNCTION__, __LINE__, Data); if (EFI_ERROR(Status) || - DataType != EFI_ACPI_DATA_TYPE_STRING || - (AsciiStrCmp((CHAR8 *) Data, D03_ACPI_ETH_ID) != 0)) { - AcpiTableProtocol->Close(ValueHandle); - Found = 0; + DataType != EFI_ACPI_DATA_TYPE_STRING) { + AcpiTableProtocol->Close (ValueHandle); + FoundDev = DsdtDeviceUnknown; + continue; + } + + HisiAcpiDevNotFound = TRUE; + for (Index = 0; Index < ARRAY_SIZE (mHisiAcpiDevId); Index++) { + if (AsciiStrCmp ((CHAR8 *)Data, mHisiAcpiDevId[Index]) == 0) { + HisiAcpiDevNotFound = FALSE; + break; + } + } + if (HisiAcpiDevNotFound) { + AcpiTableProtocol->Close (ValueHandle); + FoundDev = DsdtDeviceUnknown; continue; } - DBG("Found Ethernet device\n"); + DBG("Found device\n"); AcpiTableProtocol->Close(ValueHandle); - Status = GetEthID (AcpiTableProtocol, ChildHandle, &MacNextID); + Status = GetDeviceInfo (AcpiTableProtocol, ChildHandle, &DevNextID, &FoundDev); if (EFI_ERROR (Status)) { continue; } - Found = 1; - } else if (Found == 1 && AsciiStrnCmp((CHAR8 *) Data, "_DSD", 4) == 0) { + } else if ((FoundDev != DsdtDeviceUnknown) && AsciiStrnCmp((CHAR8 *) Data, "_DSD", 4) == 0) { // - // Patch MAC address for open source kernel + // Patch DSD data // EFI_ACPI_HANDLE PkgHandle; Status = AcpiTableProtocol->GetOption(DevHandle, 2, &DataType, &Buffer, &DataSize); @@ -351,12 +445,30 @@ EFI_STATUS ProcessDSDTDevice ( // // Walk the _DSD node // - if (DataSize == 1 && Data[0] == AML_PACKAGE_OP) - Status = SearchReplacePackageMACAddress(AcpiTableProtocol, PkgHandle, MacNextID); + if (DataSize == 1 && Data[0] == AML_PACKAGE_OP) { + Status = SearchReplacePackageAddress (AcpiTableProtocol, PkgHandle, DevNextID, FoundDev); + } AcpiTableProtocol->Close(PkgHandle); + } else if (AsciiStrnCmp ((CHAR8 *) Data, "_ADR", 4) == 0) { + Status = AcpiTableProtocol->GetOption (DevHandle, 2, &DataType, &Buffer, &DataSize); + if (EFI_ERROR (Status)) { + break; + } + + if (DataType != EFI_ACPI_DATA_TYPE_CHILD) { + continue; + } + + Status = GetDeviceInfo (AcpiTableProtocol, ChildHandle, &DevNextID, &FoundDev); + + if (EFI_ERROR (Status)) { + continue; + } } } + } else if ((DataSize == 2) && (Data[0] == AML_EXT_OP) && (Data[1] == AML_EXT_DEVICE_OP)) { + ProcessDSDTDevice (AcpiTableProtocol, DevHandle); } } @@ -457,7 +569,7 @@ AcpiCheckSum ( Buffer[ChecksumOffset] = CalculateCheckSum8 (Buffer, Table->Length); } -EFI_STATUS EthMacInit(void) +EFI_STATUS UpdateAcpiDsdtTable(void) { EFI_STATUS Status; EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol; diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h index 0a3e811..a7e1eed 100644 --- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h +++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h @@ -10,7 +10,7 @@ #ifndef _ETH_MAC_H_ #define _ETH_MAC_H_ -EFI_STATUS EthMacInit(VOID); +EFI_STATUS UpdateAcpiDsdtTable (VOID); #endif -- 2.8.1 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [RFC edk2-platforms v1 2/3] Silicon/Hisilicon/Acpi: Add update sas address feature 2020-05-21 14:43 ` [RFC edk2-platforms v1 2/3] Silicon/Hisilicon/Acpi: Add update sas address feature Ming Huang @ 2020-05-26 18:49 ` Leif Lindholm 2020-05-27 14:21 ` Ming Huang 0 siblings, 1 reply; 12+ messages in thread From: Leif Lindholm @ 2020-05-26 18:49 UTC (permalink / raw) To: Ming Huang Cc: devel, ard.biesheuvel, lidongzhan, songdongkuang, wanghuiqiang, qiuliangen On Thu, May 21, 2020 at 22:43:03 +0800, Ming Huang wrote: > The updating sas address feature is similar with apdating mac address. > Modify updating dsdt flow for add this feature. > > Signed-off-by: Ming Huang <huangming23@huawei.com> > --- > Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c | 2 +- > Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c | 200 +++++++++++++++----- > Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h | 2 +- > 3 files changed, 158 insertions(+), 46 deletions(-) > > diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c > index 1ab55bc..d3ea051 100644 > --- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c > +++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c > @@ -46,7 +46,7 @@ UpdateAcpiDsdt ( > return; > } > > - Status = EthMacInit (); > + Status = UpdateAcpiDsdtTable (); > if (EFI_ERROR (Status)) { > DEBUG ((DEBUG_ERROR, " UpdateAcpiDsdtTable Failed, Status = %r\n", Status)); > } > diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c > index cd98506..205f2f9 100644 > --- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c > +++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c > @@ -1,8 +1,8 @@ > /** @file > > - Copyright (c) 2014, Applied Micro Curcuit Corporation. All rights reserved.<BR> > - Copyright (c) 2015, Hisilicon Limited. All rights reserved.<BR> > - Copyright (c) 2015, Linaro Limited. All rights reserved.<BR> > + Copyright (c) 2014 - 2020, Applied Micro Curcuit Corporation. All rights reserved.<BR> > + Copyright (c) 2015 - 2020, Hisilicon Limited. All rights reserved.<BR> > + Copyright (c) 2015 - 2020, Linaro Limited. All rights reserved.<BR> Same comment as for 1/3. > SPDX-License-Identifier: BSD-2-Clause-Patent > > This driver is called to initialize the FW part of the PHY in preparation > @@ -30,6 +30,7 @@ > #include <Library/UefiRuntimeServicesTableLib.h> > #include <IndustryStandard/Acpi.h> > #include <IndustryStandard/AcpiAml.h> > +#include <Library/MemoryAllocationLib.h> Good lord this include block is a mess. Nevertheless, a less offensive place to insert this new header would be between #include <Library/DebugLib.h> and #include <Library/PcdLib.h> . > > #include <Protocol/HisiBoardNicProtocol.h> > > @@ -45,13 +46,20 @@ > #define EFI_ACPI_MAX_NUM_TABLES 20 > #define DSDT_SIGNATURE 0x54445344 > > -#define D03_ACPI_ETH_ID "HISI00C2" > - > #define ACPI_ETH_MAC_KEY "local-mac-address" > +#define ACPI_ETH_SAS_KEY "sas-addr" Please consider column alignment. > > #define PREFIX_VARIABLE_NAME L"MAC" > #define PREFIX_VARIABLE_NAME_COMPAT L"RGMII_MAC" > -#define MAC_MAX_LEN 30 > +#define ADDRESS_MAX_LEN 30 Please consider column alignment. > > +CHAR8 *mHisiAcpiDevId[] = {"HISI00C1","HISI00C2","HISI0162"}; > + > +typedef enum { > + DsdtDeviceUnknown, > + DsdtDeviceLan, > + DsdtDeviceSas > +} DSDT_DEVICE_TYPE; > > EFI_STATUS GetEnvMac( > IN UINTN MacNextID, > @@ -89,12 +97,35 @@ EFI_STATUS GetEnvMac( > return EFI_SUCCESS; > } > > -EFI_STATUS _SearchReplacePackageMACAddress( > +EFI_STATUS GetSasAddress ( Function name should be on separate line. If only used in this module, function should also be STATIC. > + IN UINT8 Index, > + IN OUT UINT8 *SasAddrBuffer > + ) > +{ > + if (SasAddrBuffer == NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + SasAddrBuffer[0] = 0x50; > + SasAddrBuffer[1] = 0x01; > + SasAddrBuffer[2] = 0x88; > + SasAddrBuffer[3] = 0x20; > + SasAddrBuffer[4] = 0x16; > + SasAddrBuffer[5] = 0x00; > + SasAddrBuffer[6] = 0x00; > + SasAddrBuffer[7] = Index; What does the above do? What are the hardcoded values? > + > + return EFI_SUCCESS; > +} > + > +EFI_STATUS _SearchReplacePackageAddress( Function name should be on separate line. If only used in this module, function should also be STATIC. Functions should not have names starting with _. > IN EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, > IN EFI_ACPI_HANDLE ChildHandle, > IN UINTN Level, > IN OUT BOOLEAN *Found, > - IN UINTN MacNextID) > + IN UINTN DevNextID, > + IN DSDT_DEVICE_TYPE FoundDev > + ) > { > // ASL template for ethernet driver: > /* > @@ -117,12 +148,18 @@ EFI_STATUS _SearchReplacePackageMACAddress( > UINTN Count; > EFI_ACPI_HANDLE CurrentHandle; > EFI_ACPI_HANDLE NextHandle; > - UINT8 MACBuffer[MAC_MAX_LEN]; > + EFI_ACPI_HANDLE Level1Handle; > + UINT8 *AddressBuffer; > + UINT8 AddressByte = 0; > > DBG("In Level:%d\n", Level); > + Level1Handle = NULL; > Status = EFI_SUCCESS; > for (CurrentHandle = NULL; ;) { > Status = AcpiTableProtocol->GetChild(ChildHandle, &CurrentHandle); > + if (Level == 1) { > + Level1Handle = CurrentHandle; > + } > if (Level != 3 && (EFI_ERROR(Status) || CurrentHandle == NULL)) > break; > > @@ -143,11 +180,14 @@ EFI_STATUS _SearchReplacePackageMACAddress( > DataSize, Data[0], DataSize > 1 ? Data[1] : 0); > > Data = Buffer; > - if (DataType != EFI_ACPI_DATA_TYPE_STRING > - || AsciiStrCmp((CHAR8 *) Data, ACPI_ETH_MAC_KEY) != 0) > + if ((DataType != EFI_ACPI_DATA_TYPE_STRING) || > + ((AsciiStrCmp ((CHAR8 *) Data, ACPI_ETH_MAC_KEY) != 0) && > + (AsciiStrCmp ((CHAR8 *) Data, ACPI_ETH_SAS_KEY) != 0))) { Indentation should help clarify the relationship between the differenc comparison values: if ((DataType != EFI_ACPI_DATA_TYPE_STRING) || ((AsciiStrCmp ((CHAR8 *) Data, ACPI_ETH_MAC_KEY) != 0) && (AsciiStrCmp ((CHAR8 *) Data, ACPI_ETH_SAS_KEY) != 0))) { > + ChildHandle = Level1Handle; > continue; > + } > > - DBG("_DSD Key Type %d. Found MAC address key\n", DataType); > + DBG("_DSD Key Type %d. Found address key\n", DataType); > > // > // We found the node. > @@ -157,13 +197,33 @@ EFI_STATUS _SearchReplacePackageMACAddress( > } > > if (Level == 3 && *Found) { > + AddressBuffer = AllocateZeroPool (ADDRESS_MAX_LEN); > + if (AddressBuffer == NULL) { > + DEBUG ((DEBUG_ERROR, "%a:%d AllocateZeroPool failed\n", __FILE__, __LINE__)); > + return EFI_OUT_OF_RESOURCES; > + } > > - //Update the MAC > - Status = GetEnvMac(MacNextID, MACBuffer); > - if (EFI_ERROR(Status)) > + switch (FoundDev) { > + case DsdtDeviceLan: > + //Update the MAC > + Status = GetEnvMac (DevNextID, AddressBuffer); > + AddressByte = 6; > + break; > + case DsdtDeviceSas: > + //Update SAS Address. > + Status = GetSasAddress (DevNextID, AddressBuffer); > + AddressByte = 8; > + break; > + default: > + Status = EFI_INVALID_PARAMETER; > + } > + if (EFI_ERROR (Status)) { > + FreePool (AddressBuffer); > + AddressBuffer = NULL; These nested for loops could certainly benefit from having their contents broken down into a few helper functions, but fundamentally - this AddressBuffer is only used again on another time around the loop, and if so, it is overwritten by the call to AllocateZeroPool. Why are we rewriting the pointer? > break; > + } > > - for (Count = 0; Count < 6; Count++) { > + for (Count = 0; Count < AddressByte; Count++) { > Status = AcpiTableProtocol->GetOption(CurrentHandle, 1, &DataType, &Buffer, &DataSize); > if (EFI_ERROR(Status)) > break; > @@ -177,13 +237,15 @@ EFI_STATUS _SearchReplacePackageMACAddress( > > // only need one byte. > // FIXME: Assume the CPU is little endian > - Status = AcpiTableProtocol->SetOption(CurrentHandle, 1, (VOID *)&MACBuffer[Count], sizeof(UINT8)); > + Status = AcpiTableProtocol->SetOption (CurrentHandle, 1, AddressBuffer + Count, sizeof(UINT8)); > if (EFI_ERROR(Status)) > break; > Status = AcpiTableProtocol->GetChild(ChildHandle, &CurrentHandle); > if (EFI_ERROR(Status) || CurrentHandle == NULL) > break; > } > + FreePool (AddressBuffer); > + AddressBuffer = NULL; Same thing again - why rewrite the pointer after free? > break; > } > > @@ -192,7 +254,13 @@ EFI_STATUS _SearchReplacePackageMACAddress( > > //Search next package > AcpiTableProtocol->Open((VOID *) Buffer, &NextHandle); > - Status = _SearchReplacePackageMACAddress(AcpiTableProtocol, NextHandle, Level + 1, Found, MacNextID); > + Status = _SearchReplacePackageAddress( Indentation looks wrong because of the function name. Drop the leading _ and it will be fine. > + AcpiTableProtocol, > + NextHandle, > + Level + 1, > + Found, > + DevNextID, > + FoundDev); > AcpiTableProtocol->Close(NextHandle); > if (!EFI_ERROR(Status)) > break; > @@ -201,22 +269,26 @@ EFI_STATUS _SearchReplacePackageMACAddress( > return Status; > } > > -EFI_STATUS SearchReplacePackageMACAddress( > +EFI_STATUS SearchReplacePackageAddress( > IN EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, > IN EFI_ACPI_HANDLE ChildHandle, > - IN UINTN MacNextID) > + IN UINTN DevNextID, > + IN DSDT_DEVICE_TYPE FoundDev > + ) > { > BOOLEAN Found = FALSE; > UINTN Level = 0; > > - return _SearchReplacePackageMACAddress(AcpiTableProtocol, ChildHandle, Level, &Found, MacNextID); > + return _SearchReplacePackageAddress(AcpiTableProtocol, ChildHandle, Level, > + &Found, DevNextID, FoundDev); > } > > EFI_STATUS > -GetEthID ( > +GetDeviceInfo ( > EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, > EFI_ACPI_HANDLE ChildHandle, > - UINTN *EthID > + UINTN *DevID, > + DSDT_DEVICE_TYPE *FoundDev > ) > { > EFI_STATUS Status; > @@ -225,7 +297,7 @@ GetEthID ( > CONST VOID *Buffer; > UINTN DataSize; > > - // Get NameString ETHx > + // Get NameString > Status = AcpiTableProtocol->GetOption (ChildHandle, 1, &DataType, &Buffer, &DataSize); > if (EFI_ERROR (Status)) { > DEBUG ((EFI_D_ERROR, "[%a:%d] Get NameString failed: %r\n", __FUNCTION__, __LINE__, Status)); > @@ -236,14 +308,23 @@ GetEthID ( > DBG("Size %p Data %02x %02x %02x %02x\n", DataSize, Data[0], Data[1], Data[2], Data[3]); > > Data[4] = '\0'; > - if (DataSize != 4 || > - AsciiStrnCmp ("ETH", Data, 3) != 0 || > - Data[3] > '9' || Data[3] < '0') { > - DEBUG ((EFI_D_ERROR, "[%a:%d] The NameString %a is not ETHn\n", __FUNCTION__, __LINE__, Data)); > + if ((DataSize != 4) || > + (Data[3] > '9' || Data[3] < '0')) { > + DEBUG ((DEBUG_ERROR, "The NameString %a is not ETHn or SASn\n", Data)); > return EFI_INVALID_PARAMETER; > } > > - *EthID = Data[3] - '0'; > + if (AsciiStrnCmp ("ETH", Data, 3) == 0) { > + *FoundDev = DsdtDeviceLan; > + } else if (AsciiStrnCmp ("SAS", Data, 3) == 0) { > + *FoundDev = DsdtDeviceSas; > + } else { > + DEBUG ((DEBUG_ERROR, "[%a:%d] The NameString %a is not ETHn or SASn\n", > + __FUNCTION__, __LINE__, Data)); > + return EFI_INVALID_PARAMETER; > + } > + > + *DevID = Data[3] - '0'; > return EFI_SUCCESS; > } > > @@ -257,8 +338,10 @@ EFI_STATUS ProcessDSDTDevice ( > CONST VOID *Buffer; > UINTN DataSize; > EFI_ACPI_HANDLE DevHandle; > - INTN Found = 0; > - UINTN MacNextID; > + DSDT_DEVICE_TYPE FoundDev = DsdtDeviceUnknown; > + UINTN DevNextID; > + BOOLEAN HisiAcpiDevNotFound; > + UINTN Index; > > Status = AcpiTableProtocol->GetOption(ChildHandle, 0, &DataType, &Buffer, &DataSize); > if (EFI_ERROR(Status)) > @@ -280,7 +363,7 @@ EFI_STATUS ProcessDSDTDevice ( > break; > > // > - // Search for _HID with Ethernet ID > + // Search for _HID with Device ID > // > Status = AcpiTableProtocol->GetOption(DevHandle, 0, &DataType, &Buffer, &DataSize); > if (EFI_ERROR(Status)) > @@ -312,23 +395,34 @@ EFI_STATUS ProcessDSDTDevice ( > DBG("[%a:%d] - _HID = %a\n", __FUNCTION__, __LINE__, Data); > > if (EFI_ERROR(Status) || > - DataType != EFI_ACPI_DATA_TYPE_STRING || > - (AsciiStrCmp((CHAR8 *) Data, D03_ACPI_ETH_ID) != 0)) { > - AcpiTableProtocol->Close(ValueHandle); > - Found = 0; > + DataType != EFI_ACPI_DATA_TYPE_STRING) { > + AcpiTableProtocol->Close (ValueHandle); > + FoundDev = DsdtDeviceUnknown; > + continue; > + } > + > + HisiAcpiDevNotFound = TRUE; > + for (Index = 0; Index < ARRAY_SIZE (mHisiAcpiDevId); Index++) { > + if (AsciiStrCmp ((CHAR8 *)Data, mHisiAcpiDevId[Index]) == 0) { > + HisiAcpiDevNotFound = FALSE; > + break; > + } > + } > + if (HisiAcpiDevNotFound) { > + AcpiTableProtocol->Close (ValueHandle); > + FoundDev = DsdtDeviceUnknown; > continue; > } > > - DBG("Found Ethernet device\n"); > + DBG("Found device\n"); > AcpiTableProtocol->Close(ValueHandle); > - Status = GetEthID (AcpiTableProtocol, ChildHandle, &MacNextID); > + Status = GetDeviceInfo (AcpiTableProtocol, ChildHandle, &DevNextID, &FoundDev); > if (EFI_ERROR (Status)) { > continue; > } > - Found = 1; > - } else if (Found == 1 && AsciiStrnCmp((CHAR8 *) Data, "_DSD", 4) == 0) { > + } else if ((FoundDev != DsdtDeviceUnknown) && AsciiStrnCmp((CHAR8 *) Data, "_DSD", 4) == 0) { > // > - // Patch MAC address for open source kernel > + // Patch DSD data > // > EFI_ACPI_HANDLE PkgHandle; > Status = AcpiTableProtocol->GetOption(DevHandle, 2, &DataType, &Buffer, &DataSize); > @@ -351,12 +445,30 @@ EFI_STATUS ProcessDSDTDevice ( > // > // Walk the _DSD node > // > - if (DataSize == 1 && Data[0] == AML_PACKAGE_OP) > - Status = SearchReplacePackageMACAddress(AcpiTableProtocol, PkgHandle, MacNextID); > + if (DataSize == 1 && Data[0] == AML_PACKAGE_OP) { > + Status = SearchReplacePackageAddress (AcpiTableProtocol, PkgHandle, DevNextID, FoundDev); > + } > > AcpiTableProtocol->Close(PkgHandle); > + } else if (AsciiStrnCmp ((CHAR8 *) Data, "_ADR", 4) == 0) { > + Status = AcpiTableProtocol->GetOption (DevHandle, 2, &DataType, &Buffer, &DataSize); > + if (EFI_ERROR (Status)) { > + break; > + } > + > + if (DataType != EFI_ACPI_DATA_TYPE_CHILD) { > + continue; > + } > + > + Status = GetDeviceInfo (AcpiTableProtocol, ChildHandle, &DevNextID, &FoundDev); > + > + if (EFI_ERROR (Status)) { > + continue; > + } > } > } > + } else if ((DataSize == 2) && (Data[0] == AML_EXT_OP) && (Data[1] == AML_EXT_DEVICE_OP)) { > + ProcessDSDTDevice (AcpiTableProtocol, DevHandle); > } > } > > @@ -457,7 +569,7 @@ AcpiCheckSum ( > Buffer[ChecksumOffset] = CalculateCheckSum8 (Buffer, Table->Length); > } > > -EFI_STATUS EthMacInit(void) > +EFI_STATUS UpdateAcpiDsdtTable(void) Function name on its own line. / Leif > { > EFI_STATUS Status; > EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol; > diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h > index 0a3e811..a7e1eed 100644 > --- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h > +++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h > @@ -10,7 +10,7 @@ > #ifndef _ETH_MAC_H_ > #define _ETH_MAC_H_ > > -EFI_STATUS EthMacInit(VOID); > +EFI_STATUS UpdateAcpiDsdtTable (VOID); > > #endif > > -- > 2.8.1 > ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [RFC edk2-platforms v1 2/3] Silicon/Hisilicon/Acpi: Add update sas address feature 2020-05-26 18:49 ` Leif Lindholm @ 2020-05-27 14:21 ` Ming Huang 0 siblings, 0 replies; 12+ messages in thread From: Ming Huang @ 2020-05-27 14:21 UTC (permalink / raw) To: Leif Lindholm Cc: devel, ard.biesheuvel, lidongzhan, songdongkuang, wanghuiqiang, qiuliangen 在 2020/5/27 2:49, Leif Lindholm 写道: > On Thu, May 21, 2020 at 22:43:03 +0800, Ming Huang wrote: >> The updating sas address feature is similar with apdating mac address. >> Modify updating dsdt flow for add this feature. >> >> Signed-off-by: Ming Huang <huangming23@huawei.com> >> --- >> Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c | 2 +- >> Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c | 200 +++++++++++++++----- >> Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h | 2 +- >> 3 files changed, 158 insertions(+), 46 deletions(-) >> >> diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c >> index 1ab55bc..d3ea051 100644 >> --- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c >> +++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c >> @@ -46,7 +46,7 @@ UpdateAcpiDsdt ( >> return; >> } >> >> - Status = EthMacInit (); >> + Status = UpdateAcpiDsdtTable (); >> if (EFI_ERROR (Status)) { >> DEBUG ((DEBUG_ERROR, " UpdateAcpiDsdtTable Failed, Status = %r\n", Status)); >> } >> diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c >> index cd98506..205f2f9 100644 >> --- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c >> +++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c >> @@ -1,8 +1,8 @@ >> /** @file >> >> - Copyright (c) 2014, Applied Micro Curcuit Corporation. All rights reserved.<BR> >> - Copyright (c) 2015, Hisilicon Limited. All rights reserved.<BR> >> - Copyright (c) 2015, Linaro Limited. All rights reserved.<BR> >> + Copyright (c) 2014 - 2020, Applied Micro Curcuit Corporation. All rights reserved.<BR> >> + Copyright (c) 2015 - 2020, Hisilicon Limited. All rights reserved.<BR> >> + Copyright (c) 2015 - 2020, Linaro Limited. All rights reserved.<BR> > > Same comment as for 1/3. Modify it in v2. > >> SPDX-License-Identifier: BSD-2-Clause-Patent >> >> This driver is called to initialize the FW part of the PHY in preparation >> @@ -30,6 +30,7 @@ >> #include <Library/UefiRuntimeServicesTableLib.h> >> #include <IndustryStandard/Acpi.h> >> #include <IndustryStandard/AcpiAml.h> >> +#include <Library/MemoryAllocationLib.h> > > Good lord this include block is a mess. > Nevertheless, a less offensive place to insert this new header would > be between > #include <Library/DebugLib.h> > and > #include <Library/PcdLib.h> > . Ok, modify it in v2. > >> >> #include <Protocol/HisiBoardNicProtocol.h> >> >> @@ -45,13 +46,20 @@ >> #define EFI_ACPI_MAX_NUM_TABLES 20 >> #define DSDT_SIGNATURE 0x54445344 >> >> -#define D03_ACPI_ETH_ID "HISI00C2" >> - >> #define ACPI_ETH_MAC_KEY "local-mac-address" >> +#define ACPI_ETH_SAS_KEY "sas-addr" > > Please consider column alignment. > >> >> #define PREFIX_VARIABLE_NAME L"MAC" >> #define PREFIX_VARIABLE_NAME_COMPAT L"RGMII_MAC" >> -#define MAC_MAX_LEN 30 >> +#define ADDRESS_MAX_LEN 30 > > Please consider column alignment. Ok, modify it in v2. > >> >> +CHAR8 *mHisiAcpiDevId[] = {"HISI00C1","HISI00C2","HISI0162"}; >> + >> +typedef enum { >> + DsdtDeviceUnknown, >> + DsdtDeviceLan, >> + DsdtDeviceSas >> +} DSDT_DEVICE_TYPE; >> >> EFI_STATUS GetEnvMac( >> IN UINTN MacNextID, >> @@ -89,12 +97,35 @@ EFI_STATUS GetEnvMac( >> return EFI_SUCCESS; >> } >> >> -EFI_STATUS _SearchReplacePackageMACAddress( >> +EFI_STATUS GetSasAddress ( > > Function name should be on separate line. > If only used in this module, function should also be STATIC. Ok, modify it in v2. > >> + IN UINT8 Index, >> + IN OUT UINT8 *SasAddrBuffer >> + ) >> +{ >> + if (SasAddrBuffer == NULL) { >> + return EFI_INVALID_PARAMETER; >> + } >> + >> + SasAddrBuffer[0] = 0x50; >> + SasAddrBuffer[1] = 0x01; >> + SasAddrBuffer[2] = 0x88; >> + SasAddrBuffer[3] = 0x20; >> + SasAddrBuffer[4] = 0x16; >> + SasAddrBuffer[5] = 0x00; >> + SasAddrBuffer[6] = 0x00; >> + SasAddrBuffer[7] = Index; > > What does the above do? > What are the hardcoded values? In v2, add a protocol interface to get sas address and this SasAddrBuffer assignment will only in error branch. > >> + >> + return EFI_SUCCESS; >> +} >> + >> +EFI_STATUS _SearchReplacePackageAddress( > > Function name should be on separate line. > If only used in this module, function should also be STATIC. > Functions should not have names starting with _. Ok, modify it in v2. > >> IN EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, >> IN EFI_ACPI_HANDLE ChildHandle, >> IN UINTN Level, >> IN OUT BOOLEAN *Found, >> - IN UINTN MacNextID) >> + IN UINTN DevNextID, >> + IN DSDT_DEVICE_TYPE FoundDev >> + ) >> { >> // ASL template for ethernet driver: >> /* >> @@ -117,12 +148,18 @@ EFI_STATUS _SearchReplacePackageMACAddress( >> UINTN Count; >> EFI_ACPI_HANDLE CurrentHandle; >> EFI_ACPI_HANDLE NextHandle; >> - UINT8 MACBuffer[MAC_MAX_LEN]; >> + EFI_ACPI_HANDLE Level1Handle; >> + UINT8 *AddressBuffer; >> + UINT8 AddressByte = 0; >> >> DBG("In Level:%d\n", Level); >> + Level1Handle = NULL; >> Status = EFI_SUCCESS; >> for (CurrentHandle = NULL; ;) { >> Status = AcpiTableProtocol->GetChild(ChildHandle, &CurrentHandle); >> + if (Level == 1) { >> + Level1Handle = CurrentHandle; >> + } >> if (Level != 3 && (EFI_ERROR(Status) || CurrentHandle == NULL)) >> break; >> >> @@ -143,11 +180,14 @@ EFI_STATUS _SearchReplacePackageMACAddress( >> DataSize, Data[0], DataSize > 1 ? Data[1] : 0); >> >> Data = Buffer; >> - if (DataType != EFI_ACPI_DATA_TYPE_STRING >> - || AsciiStrCmp((CHAR8 *) Data, ACPI_ETH_MAC_KEY) != 0) >> + if ((DataType != EFI_ACPI_DATA_TYPE_STRING) || >> + ((AsciiStrCmp ((CHAR8 *) Data, ACPI_ETH_MAC_KEY) != 0) && >> + (AsciiStrCmp ((CHAR8 *) Data, ACPI_ETH_SAS_KEY) != 0))) { > > Indentation should help clarify the relationship between the differenc > comparison values: > > if ((DataType != EFI_ACPI_DATA_TYPE_STRING) || > ((AsciiStrCmp ((CHAR8 *) Data, ACPI_ETH_MAC_KEY) != 0) && > (AsciiStrCmp ((CHAR8 *) Data, ACPI_ETH_SAS_KEY) != 0))) { Ok, modify it in v2. > >> + ChildHandle = Level1Handle; >> continue; >> + } >> >> - DBG("_DSD Key Type %d. Found MAC address key\n", DataType); >> + DBG("_DSD Key Type %d. Found address key\n", DataType); >> >> // >> // We found the node. >> @@ -157,13 +197,33 @@ EFI_STATUS _SearchReplacePackageMACAddress( >> } >> >> if (Level == 3 && *Found) { >> + AddressBuffer = AllocateZeroPool (ADDRESS_MAX_LEN); >> + if (AddressBuffer == NULL) { >> + DEBUG ((DEBUG_ERROR, "%a:%d AllocateZeroPool failed\n", __FILE__, __LINE__)); >> + return EFI_OUT_OF_RESOURCES; >> + } >> >> - //Update the MAC >> - Status = GetEnvMac(MacNextID, MACBuffer); >> - if (EFI_ERROR(Status)) >> + switch (FoundDev) { >> + case DsdtDeviceLan: >> + //Update the MAC >> + Status = GetEnvMac (DevNextID, AddressBuffer); >> + AddressByte = 6; >> + break; >> + case DsdtDeviceSas: >> + //Update SAS Address. >> + Status = GetSasAddress (DevNextID, AddressBuffer); >> + AddressByte = 8; >> + break; >> + default: >> + Status = EFI_INVALID_PARAMETER; >> + } >> + if (EFI_ERROR (Status)) { >> + FreePool (AddressBuffer); >> + AddressBuffer = NULL; > > These nested for loops could certainly benefit from having their > contents broken down into a few helper functions, but fundamentally - > this AddressBuffer is only used again on another time around the loop, > and if so, it is overwritten by the call to AllocateZeroPool. Why are > we rewriting the pointer? Good idea, I will break down it into a new helper funtion. The reason for rewriting the pointer is that there is a internal programming specification to do this. The rewriting is not need in reality, so I will delete it in v2. > >> break; >> + } >> >> - for (Count = 0; Count < 6; Count++) { >> + for (Count = 0; Count < AddressByte; Count++) { >> Status = AcpiTableProtocol->GetOption(CurrentHandle, 1, &DataType, &Buffer, &DataSize); >> if (EFI_ERROR(Status)) >> break; >> @@ -177,13 +237,15 @@ EFI_STATUS _SearchReplacePackageMACAddress( >> >> // only need one byte. >> // FIXME: Assume the CPU is little endian >> - Status = AcpiTableProtocol->SetOption(CurrentHandle, 1, (VOID *)&MACBuffer[Count], sizeof(UINT8)); >> + Status = AcpiTableProtocol->SetOption (CurrentHandle, 1, AddressBuffer + Count, sizeof(UINT8)); >> if (EFI_ERROR(Status)) >> break; >> Status = AcpiTableProtocol->GetChild(ChildHandle, &CurrentHandle); >> if (EFI_ERROR(Status) || CurrentHandle == NULL) >> break; >> } >> + FreePool (AddressBuffer); >> + AddressBuffer = NULL; > > Same thing again - why rewrite the pointer after free? > >> break; >> } >> >> @@ -192,7 +254,13 @@ EFI_STATUS _SearchReplacePackageMACAddress( >> >> //Search next package >> AcpiTableProtocol->Open((VOID *) Buffer, &NextHandle); >> - Status = _SearchReplacePackageMACAddress(AcpiTableProtocol, NextHandle, Level + 1, Found, MacNextID); >> + Status = _SearchReplacePackageAddress( > > Indentation looks wrong because of the function name. Drop the leading > _ and it will be fine. Ok, modify it in v2. > >> + AcpiTableProtocol, >> + NextHandle, >> + Level + 1, >> + Found, >> + DevNextID, >> + FoundDev); >> AcpiTableProtocol->Close(NextHandle); >> if (!EFI_ERROR(Status)) >> break; >> @@ -201,22 +269,26 @@ EFI_STATUS _SearchReplacePackageMACAddress( >> return Status; >> } >> >> -EFI_STATUS SearchReplacePackageMACAddress( >> +EFI_STATUS SearchReplacePackageAddress( >> IN EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, >> IN EFI_ACPI_HANDLE ChildHandle, >> - IN UINTN MacNextID) >> + IN UINTN DevNextID, >> + IN DSDT_DEVICE_TYPE FoundDev >> + ) >> { >> BOOLEAN Found = FALSE; >> UINTN Level = 0; >> >> - return _SearchReplacePackageMACAddress(AcpiTableProtocol, ChildHandle, Level, &Found, MacNextID); >> + return _SearchReplacePackageAddress(AcpiTableProtocol, ChildHandle, Level, >> + &Found, DevNextID, FoundDev); >> } >> >> EFI_STATUS >> -GetEthID ( >> +GetDeviceInfo ( >> EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, >> EFI_ACPI_HANDLE ChildHandle, >> - UINTN *EthID >> + UINTN *DevID, >> + DSDT_DEVICE_TYPE *FoundDev >> ) >> { >> EFI_STATUS Status; >> @@ -225,7 +297,7 @@ GetEthID ( >> CONST VOID *Buffer; >> UINTN DataSize; >> >> - // Get NameString ETHx >> + // Get NameString >> Status = AcpiTableProtocol->GetOption (ChildHandle, 1, &DataType, &Buffer, &DataSize); >> if (EFI_ERROR (Status)) { >> DEBUG ((EFI_D_ERROR, "[%a:%d] Get NameString failed: %r\n", __FUNCTION__, __LINE__, Status)); >> @@ -236,14 +308,23 @@ GetEthID ( >> DBG("Size %p Data %02x %02x %02x %02x\n", DataSize, Data[0], Data[1], Data[2], Data[3]); >> >> Data[4] = '\0'; >> - if (DataSize != 4 || >> - AsciiStrnCmp ("ETH", Data, 3) != 0 || >> - Data[3] > '9' || Data[3] < '0') { >> - DEBUG ((EFI_D_ERROR, "[%a:%d] The NameString %a is not ETHn\n", __FUNCTION__, __LINE__, Data)); >> + if ((DataSize != 4) || >> + (Data[3] > '9' || Data[3] < '0')) { >> + DEBUG ((DEBUG_ERROR, "The NameString %a is not ETHn or SASn\n", Data)); >> return EFI_INVALID_PARAMETER; >> } >> >> - *EthID = Data[3] - '0'; >> + if (AsciiStrnCmp ("ETH", Data, 3) == 0) { >> + *FoundDev = DsdtDeviceLan; >> + } else if (AsciiStrnCmp ("SAS", Data, 3) == 0) { >> + *FoundDev = DsdtDeviceSas; >> + } else { >> + DEBUG ((DEBUG_ERROR, "[%a:%d] The NameString %a is not ETHn or SASn\n", >> + __FUNCTION__, __LINE__, Data)); >> + return EFI_INVALID_PARAMETER; >> + } >> + >> + *DevID = Data[3] - '0'; >> return EFI_SUCCESS; >> } >> >> @@ -257,8 +338,10 @@ EFI_STATUS ProcessDSDTDevice ( >> CONST VOID *Buffer; >> UINTN DataSize; >> EFI_ACPI_HANDLE DevHandle; >> - INTN Found = 0; >> - UINTN MacNextID; >> + DSDT_DEVICE_TYPE FoundDev = DsdtDeviceUnknown; >> + UINTN DevNextID; >> + BOOLEAN HisiAcpiDevNotFound; >> + UINTN Index; >> >> Status = AcpiTableProtocol->GetOption(ChildHandle, 0, &DataType, &Buffer, &DataSize); >> if (EFI_ERROR(Status)) >> @@ -280,7 +363,7 @@ EFI_STATUS ProcessDSDTDevice ( >> break; >> >> // >> - // Search for _HID with Ethernet ID >> + // Search for _HID with Device ID >> // >> Status = AcpiTableProtocol->GetOption(DevHandle, 0, &DataType, &Buffer, &DataSize); >> if (EFI_ERROR(Status)) >> @@ -312,23 +395,34 @@ EFI_STATUS ProcessDSDTDevice ( >> DBG("[%a:%d] - _HID = %a\n", __FUNCTION__, __LINE__, Data); >> >> if (EFI_ERROR(Status) || >> - DataType != EFI_ACPI_DATA_TYPE_STRING || >> - (AsciiStrCmp((CHAR8 *) Data, D03_ACPI_ETH_ID) != 0)) { >> - AcpiTableProtocol->Close(ValueHandle); >> - Found = 0; >> + DataType != EFI_ACPI_DATA_TYPE_STRING) { >> + AcpiTableProtocol->Close (ValueHandle); >> + FoundDev = DsdtDeviceUnknown; >> + continue; >> + } >> + >> + HisiAcpiDevNotFound = TRUE; >> + for (Index = 0; Index < ARRAY_SIZE (mHisiAcpiDevId); Index++) { >> + if (AsciiStrCmp ((CHAR8 *)Data, mHisiAcpiDevId[Index]) == 0) { >> + HisiAcpiDevNotFound = FALSE; >> + break; >> + } >> + } >> + if (HisiAcpiDevNotFound) { >> + AcpiTableProtocol->Close (ValueHandle); >> + FoundDev = DsdtDeviceUnknown; >> continue; >> } >> >> - DBG("Found Ethernet device\n"); >> + DBG("Found device\n"); >> AcpiTableProtocol->Close(ValueHandle); >> - Status = GetEthID (AcpiTableProtocol, ChildHandle, &MacNextID); >> + Status = GetDeviceInfo (AcpiTableProtocol, ChildHandle, &DevNextID, &FoundDev); >> if (EFI_ERROR (Status)) { >> continue; >> } >> - Found = 1; >> - } else if (Found == 1 && AsciiStrnCmp((CHAR8 *) Data, "_DSD", 4) == 0) { >> + } else if ((FoundDev != DsdtDeviceUnknown) && AsciiStrnCmp((CHAR8 *) Data, "_DSD", 4) == 0) { >> // >> - // Patch MAC address for open source kernel >> + // Patch DSD data >> // >> EFI_ACPI_HANDLE PkgHandle; >> Status = AcpiTableProtocol->GetOption(DevHandle, 2, &DataType, &Buffer, &DataSize); >> @@ -351,12 +445,30 @@ EFI_STATUS ProcessDSDTDevice ( >> // >> // Walk the _DSD node >> // >> - if (DataSize == 1 && Data[0] == AML_PACKAGE_OP) >> - Status = SearchReplacePackageMACAddress(AcpiTableProtocol, PkgHandle, MacNextID); >> + if (DataSize == 1 && Data[0] == AML_PACKAGE_OP) { >> + Status = SearchReplacePackageAddress (AcpiTableProtocol, PkgHandle, DevNextID, FoundDev); >> + } >> >> AcpiTableProtocol->Close(PkgHandle); >> + } else if (AsciiStrnCmp ((CHAR8 *) Data, "_ADR", 4) == 0) { >> + Status = AcpiTableProtocol->GetOption (DevHandle, 2, &DataType, &Buffer, &DataSize); >> + if (EFI_ERROR (Status)) { >> + break; >> + } >> + >> + if (DataType != EFI_ACPI_DATA_TYPE_CHILD) { >> + continue; >> + } >> + >> + Status = GetDeviceInfo (AcpiTableProtocol, ChildHandle, &DevNextID, &FoundDev); >> + >> + if (EFI_ERROR (Status)) { >> + continue; >> + } >> } >> } >> + } else if ((DataSize == 2) && (Data[0] == AML_EXT_OP) && (Data[1] == AML_EXT_DEVICE_OP)) { >> + ProcessDSDTDevice (AcpiTableProtocol, DevHandle); >> } >> } >> >> @@ -457,7 +569,7 @@ AcpiCheckSum ( >> Buffer[ChecksumOffset] = CalculateCheckSum8 (Buffer, Table->Length); >> } >> >> -EFI_STATUS EthMacInit(void) >> +EFI_STATUS UpdateAcpiDsdtTable(void) > > Function name on its own line. Ok, modify it in v2. Thanks, Ming > > / > Leif > >> { >> EFI_STATUS Status; >> EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol; >> diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h >> index 0a3e811..a7e1eed 100644 >> --- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h >> +++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h >> @@ -10,7 +10,7 @@ >> #ifndef _ETH_MAC_H_ >> #define _ETH_MAC_H_ >> >> -EFI_STATUS EthMacInit(VOID); >> +EFI_STATUS UpdateAcpiDsdtTable (VOID); >> >> #endif >> >> -- >> 2.8.1 >> > > . > ^ permalink raw reply [flat|nested] 12+ messages in thread
* [RFC edk2-platforms v1 3/3] Silicon/Hisilicon: Rename EthMac files 2020-05-21 14:43 [RFC edk2-platforms v1 0/3] Improve D0x Ming Huang 2020-05-21 14:43 ` [RFC edk2-platforms v1 1/3] Silicon/Hisilicon: Change updating dsdt in ready to boot event Ming Huang 2020-05-21 14:43 ` [RFC edk2-platforms v1 2/3] Silicon/Hisilicon/Acpi: Add update sas address feature Ming Huang @ 2020-05-21 14:43 ` Ming Huang 2020-05-26 18:50 ` Leif Lindholm 2020-05-26 18:09 ` [RFC edk2-platforms v1 0/3] Improve D0x Leif Lindholm 3 siblings, 1 reply; 12+ messages in thread From: Ming Huang @ 2020-05-21 14:43 UTC (permalink / raw) To: devel, leif, ard.biesheuvel Cc: lidongzhan, huangming23, songdongkuang, wanghuiqiang, qiuliangen As not only update mac address feature in EthMac files, so rename them to UpdateDsdt. Signed-off-by: Ming Huang <huangming23@huawei.com> --- Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c | 2 +- Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf | 8 +- Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c | 612 -------------------- Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h | 16 - Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.c | 612 ++++++++++++++++++++ Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.h | 16 + 6 files changed, 633 insertions(+), 633 deletions(-) diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c index d3ea051..fd67677 100644 --- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c +++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c @@ -21,7 +21,7 @@ #include <Library/UefiRuntimeServicesTableLib.h> #include <IndustryStandard/Acpi.h> #include <IndustryStandard/AcpiAml.h> -#include "EthMac.h" +#include "UpdateDsdt.h" EFI_EVENT mUpdateAcpiDsdtTableEvent; diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf index 53da731..a2b669d 100644 --- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf +++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf @@ -1,8 +1,8 @@ ## @file # -# Copyright (c) 2014, Applied Micro Curcuit Corp. All rights reserved.<BR> -# Copyright (c) 2015, Hisilicon Limited. All rights reserved.<BR> -# Copyright (c) 2015, Linaro Limited. All rights reserved.<BR> +# Copyright (c) 2014 - 2020, Applied Micro Curcuit Corp. All rights reserved.<BR> +# Copyright (c) 2015 - 2020, Hisilicon Limited. All rights reserved.<BR> +# Copyright (c) 2015 - 2020, Linaro Limited. All rights reserved.<BR> # SPDX-License-Identifier: BSD-2-Clause-Patent # ## @@ -18,7 +18,7 @@ [Sources] AcpiPlatform.c - EthMac.c + UpdateDsdt.c [Packages] MdePkg/MdePkg.dec diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c deleted file mode 100644 index 205f2f9..0000000 --- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c +++ /dev/null @@ -1,612 +0,0 @@ -/** @file - - Copyright (c) 2014 - 2020, Applied Micro Curcuit Corporation. All rights reserved.<BR> - Copyright (c) 2015 - 2020, Hisilicon Limited. All rights reserved.<BR> - Copyright (c) 2015 - 2020, Linaro Limited. All rights reserved.<BR> - SPDX-License-Identifier: BSD-2-Clause-Patent - - This driver is called to initialize the FW part of the PHY in preparation - for the OS. - -**/ - -#include <Guid/ShellVariableGuid.h> -#include <Library/UefiRuntimeServicesTableLib.h> -#include <Library/DebugLib.h> -#include <Library/TimerLib.h> - -#include <PiDxe.h> -#include <Guid/EventGroup.h> -#include <Protocol/AcpiTable.h> -#include <Protocol/FirmwareVolume2.h> -#include <Library/BaseLib.h> -#include <Library/UefiBootServicesTableLib.h> -#include <Protocol/AcpiSystemDescriptionTable.h> -#include <Library/DebugLib.h> -#include <Library/PcdLib.h> -#include <Library/PrintLib.h> -#include <Library/DebugLib.h> -#include <Library/BaseMemoryLib.h> -#include <Library/UefiRuntimeServicesTableLib.h> -#include <IndustryStandard/Acpi.h> -#include <IndustryStandard/AcpiAml.h> -#include <Library/MemoryAllocationLib.h> - -#include <Protocol/HisiBoardNicProtocol.h> - -// Turn on debug message by enabling below define -//#define ACPI_DEBUG - -#ifdef ACPI_DEBUG -#define DBG(arg...) DEBUG((EFI_D_ERROR,## arg)) -#else -#define DBG(arg...) -#endif - -#define EFI_ACPI_MAX_NUM_TABLES 20 -#define DSDT_SIGNATURE 0x54445344 - -#define ACPI_ETH_MAC_KEY "local-mac-address" -#define ACPI_ETH_SAS_KEY "sas-addr" - -#define PREFIX_VARIABLE_NAME L"MAC" -#define PREFIX_VARIABLE_NAME_COMPAT L"RGMII_MAC" -#define ADDRESS_MAX_LEN 30 - -CHAR8 *mHisiAcpiDevId[] = {"HISI00C1","HISI00C2","HISI0162"}; - -typedef enum { - DsdtDeviceUnknown, - DsdtDeviceLan, - DsdtDeviceSas -} DSDT_DEVICE_TYPE; - -EFI_STATUS GetEnvMac( - IN UINTN MacNextID, - IN OUT UINT8 *MacBuffer) -{ - EFI_MAC_ADDRESS Mac; - EFI_STATUS Status; - HISI_BOARD_NIC_PROTOCOL *OemNic = NULL; - - Status = gBS->LocateProtocol(&gHisiBoardNicProtocolGuid, NULL, (VOID **)&OemNic); - if(EFI_ERROR(Status)) - { - DEBUG((EFI_D_ERROR, "[%a]:[%dL] LocateProtocol failed %r\n", __FUNCTION__, __LINE__, Status)); - return Status; - } - - Status = OemNic->GetMac(&Mac, MacNextID); - if(EFI_ERROR(Status)) - { - DEBUG((EFI_D_ERROR, "[%a]:[%dL] GetMac failed %r\n", __FUNCTION__, __LINE__, Status)); - return Status; - } - - CopyMem (MacBuffer, &Mac, 6); - DEBUG((EFI_D_ERROR, "Port %d MAC %02x:%02x:%02x:%02x:%02x:%02x\n", - MacNextID, - MacBuffer[0], - MacBuffer[1], - MacBuffer[2], - MacBuffer[3], - MacBuffer[4], - MacBuffer[5] - )); - - return EFI_SUCCESS; -} - -EFI_STATUS GetSasAddress ( - IN UINT8 Index, - IN OUT UINT8 *SasAddrBuffer - ) -{ - if (SasAddrBuffer == NULL) { - return EFI_INVALID_PARAMETER; - } - - SasAddrBuffer[0] = 0x50; - SasAddrBuffer[1] = 0x01; - SasAddrBuffer[2] = 0x88; - SasAddrBuffer[3] = 0x20; - SasAddrBuffer[4] = 0x16; - SasAddrBuffer[5] = 0x00; - SasAddrBuffer[6] = 0x00; - SasAddrBuffer[7] = Index; - - return EFI_SUCCESS; -} - -EFI_STATUS _SearchReplacePackageAddress( - IN EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, - IN EFI_ACPI_HANDLE ChildHandle, - IN UINTN Level, - IN OUT BOOLEAN *Found, - IN UINTN DevNextID, - IN DSDT_DEVICE_TYPE FoundDev - ) -{ - // ASL template for ethernet driver: -/* - * Name (_DSD, Package () { - * ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), - * Package () { - * Package (2) {"mac-address", Package (6) { 00, 11, 22, 33, 44, 55 }} - * Package (2) {"phy-channel", 0}, - * Package (2) {"phy-mode", "rgmii"}, - * Package (2) {"max-transfer-unit", 0x5dc}, // MTU of 1500 - * Package (2) {"max-speed", 0x3e8}, // 1000 Mbps - * } - * }) - */ - EFI_STATUS Status; - EFI_ACPI_DATA_TYPE DataType; - CONST UINT8 *Data; - CONST VOID *Buffer; - UINTN DataSize; - UINTN Count; - EFI_ACPI_HANDLE CurrentHandle; - EFI_ACPI_HANDLE NextHandle; - EFI_ACPI_HANDLE Level1Handle; - UINT8 *AddressBuffer; - UINT8 AddressByte = 0; - - DBG("In Level:%d\n", Level); - Level1Handle = NULL; - Status = EFI_SUCCESS; - for (CurrentHandle = NULL; ;) { - Status = AcpiTableProtocol->GetChild(ChildHandle, &CurrentHandle); - if (Level == 1) { - Level1Handle = CurrentHandle; - } - if (Level != 3 && (EFI_ERROR(Status) || CurrentHandle == NULL)) - break; - - Status = AcpiTableProtocol->GetOption(CurrentHandle, 0, &DataType, &Buffer, &DataSize); - Data = Buffer; - DBG("_DSD Child Subnode Store Op Code 0x%02X 0x%02X %02X\n", - DataSize, Data[0], DataSize > 1 ? Data[1] : 0); - - if (Level < 2 && Data[0] != AML_PACKAGE_OP) - continue; - - if (Level == 2 && Data[0] == AML_STRING_PREFIX) { - Status = AcpiTableProtocol->GetOption(CurrentHandle, 1, &DataType, &Buffer, &DataSize); - if (EFI_ERROR(Status)) - break; - - DBG(" _DSD Child Subnode Store Op Code 0x%02X 0x%02X %02X\n", - DataSize, Data[0], DataSize > 1 ? Data[1] : 0); - - Data = Buffer; - if ((DataType != EFI_ACPI_DATA_TYPE_STRING) || - ((AsciiStrCmp ((CHAR8 *) Data, ACPI_ETH_MAC_KEY) != 0) && - (AsciiStrCmp ((CHAR8 *) Data, ACPI_ETH_SAS_KEY) != 0))) { - ChildHandle = Level1Handle; - continue; - } - - DBG("_DSD Key Type %d. Found address key\n", DataType); - - // - // We found the node. - // - *Found = TRUE; - continue; - } - - if (Level == 3 && *Found) { - AddressBuffer = AllocateZeroPool (ADDRESS_MAX_LEN); - if (AddressBuffer == NULL) { - DEBUG ((DEBUG_ERROR, "%a:%d AllocateZeroPool failed\n", __FILE__, __LINE__)); - return EFI_OUT_OF_RESOURCES; - } - - switch (FoundDev) { - case DsdtDeviceLan: - //Update the MAC - Status = GetEnvMac (DevNextID, AddressBuffer); - AddressByte = 6; - break; - case DsdtDeviceSas: - //Update SAS Address. - Status = GetSasAddress (DevNextID, AddressBuffer); - AddressByte = 8; - break; - default: - Status = EFI_INVALID_PARAMETER; - } - if (EFI_ERROR (Status)) { - FreePool (AddressBuffer); - AddressBuffer = NULL; - break; - } - - for (Count = 0; Count < AddressByte; Count++) { - Status = AcpiTableProtocol->GetOption(CurrentHandle, 1, &DataType, &Buffer, &DataSize); - if (EFI_ERROR(Status)) - break; - - Data = Buffer; - DBG(" _DSD Child Subnode Store Op Code 0x%02X 0x%02X %02X DataType 0x%X\n", - DataSize, Data[0], DataSize > 1 ? Data[1] : 0, DataType); - - if (DataType != EFI_ACPI_DATA_TYPE_UINT) - break; - - // only need one byte. - // FIXME: Assume the CPU is little endian - Status = AcpiTableProtocol->SetOption (CurrentHandle, 1, AddressBuffer + Count, sizeof(UINT8)); - if (EFI_ERROR(Status)) - break; - Status = AcpiTableProtocol->GetChild(ChildHandle, &CurrentHandle); - if (EFI_ERROR(Status) || CurrentHandle == NULL) - break; - } - FreePool (AddressBuffer); - AddressBuffer = NULL; - break; - } - - if (Level > 3) - break; - - //Search next package - AcpiTableProtocol->Open((VOID *) Buffer, &NextHandle); - Status = _SearchReplacePackageAddress( - AcpiTableProtocol, - NextHandle, - Level + 1, - Found, - DevNextID, - FoundDev); - AcpiTableProtocol->Close(NextHandle); - if (!EFI_ERROR(Status)) - break; - } - - return Status; -} - -EFI_STATUS SearchReplacePackageAddress( - IN EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, - IN EFI_ACPI_HANDLE ChildHandle, - IN UINTN DevNextID, - IN DSDT_DEVICE_TYPE FoundDev - ) -{ - BOOLEAN Found = FALSE; - UINTN Level = 0; - - return _SearchReplacePackageAddress(AcpiTableProtocol, ChildHandle, Level, - &Found, DevNextID, FoundDev); -} - -EFI_STATUS -GetDeviceInfo ( - EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, - EFI_ACPI_HANDLE ChildHandle, - UINTN *DevID, - DSDT_DEVICE_TYPE *FoundDev - ) -{ - EFI_STATUS Status; - EFI_ACPI_DATA_TYPE DataType; - CHAR8 Data[5]; - CONST VOID *Buffer; - UINTN DataSize; - - // Get NameString - Status = AcpiTableProtocol->GetOption (ChildHandle, 1, &DataType, &Buffer, &DataSize); - if (EFI_ERROR (Status)) { - DEBUG ((EFI_D_ERROR, "[%a:%d] Get NameString failed: %r\n", __FUNCTION__, __LINE__, Status)); - return Status; - } - - CopyMem (Data, Buffer, 4); - DBG("Size %p Data %02x %02x %02x %02x\n", DataSize, Data[0], Data[1], Data[2], Data[3]); - - Data[4] = '\0'; - if ((DataSize != 4) || - (Data[3] > '9' || Data[3] < '0')) { - DEBUG ((DEBUG_ERROR, "The NameString %a is not ETHn or SASn\n", Data)); - return EFI_INVALID_PARAMETER; - } - - if (AsciiStrnCmp ("ETH", Data, 3) == 0) { - *FoundDev = DsdtDeviceLan; - } else if (AsciiStrnCmp ("SAS", Data, 3) == 0) { - *FoundDev = DsdtDeviceSas; - } else { - DEBUG ((DEBUG_ERROR, "[%a:%d] The NameString %a is not ETHn or SASn\n", - __FUNCTION__, __LINE__, Data)); - return EFI_INVALID_PARAMETER; - } - - *DevID = Data[3] - '0'; - return EFI_SUCCESS; -} - -EFI_STATUS ProcessDSDTDevice ( - EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, - EFI_ACPI_HANDLE ChildHandle) -{ - EFI_STATUS Status; - EFI_ACPI_DATA_TYPE DataType; - CONST UINT8 *Data; - CONST VOID *Buffer; - UINTN DataSize; - EFI_ACPI_HANDLE DevHandle; - DSDT_DEVICE_TYPE FoundDev = DsdtDeviceUnknown; - UINTN DevNextID; - BOOLEAN HisiAcpiDevNotFound; - UINTN Index; - - Status = AcpiTableProtocol->GetOption(ChildHandle, 0, &DataType, &Buffer, &DataSize); - if (EFI_ERROR(Status)) - return EFI_SUCCESS; - - Data = Buffer; - // - // Skip all non-device type - // - if (DataSize != 2 || Data[0] != AML_EXT_OP || Data[1] != AML_EXT_DEVICE_OP) - return EFI_SUCCESS; - - // - // Walk the device type node - // - for (DevHandle = NULL; ; ) { - Status = AcpiTableProtocol->GetChild(ChildHandle, &DevHandle); - if (EFI_ERROR(Status) || DevHandle == NULL) - break; - - // - // Search for _HID with Device ID - // - Status = AcpiTableProtocol->GetOption(DevHandle, 0, &DataType, &Buffer, &DataSize); - if (EFI_ERROR(Status)) - break; - - Data = Buffer; - DBG("Data Type 0x%02X %02X\n", Data[0], DataSize > 1 ? Data[1] : 0); - if (DataSize == 1 && Data[0] == AML_NAME_OP) { - Status = AcpiTableProtocol->GetOption(DevHandle, 1, &DataType, &Buffer, &DataSize); - if (EFI_ERROR(Status)) - break; - - Data = Buffer; - if (DataType == EFI_ACPI_DATA_TYPE_NAME_STRING) { - if (AsciiStrnCmp((CHAR8 *) Data, "_HID", 4) == 0) { - EFI_ACPI_HANDLE ValueHandle; - - Status = AcpiTableProtocol->GetOption(DevHandle, 2, &DataType, &Buffer, &DataSize); - if (EFI_ERROR(Status)) - break; - - if (DataType != EFI_ACPI_DATA_TYPE_CHILD) - continue; - - AcpiTableProtocol->Open((VOID *) Buffer, &ValueHandle); - Status = AcpiTableProtocol->GetOption(ValueHandle, 1, &DataType, &Buffer, &DataSize); - - Data = Buffer; - DBG("[%a:%d] - _HID = %a\n", __FUNCTION__, __LINE__, Data); - - if (EFI_ERROR(Status) || - DataType != EFI_ACPI_DATA_TYPE_STRING) { - AcpiTableProtocol->Close (ValueHandle); - FoundDev = DsdtDeviceUnknown; - continue; - } - - HisiAcpiDevNotFound = TRUE; - for (Index = 0; Index < ARRAY_SIZE (mHisiAcpiDevId); Index++) { - if (AsciiStrCmp ((CHAR8 *)Data, mHisiAcpiDevId[Index]) == 0) { - HisiAcpiDevNotFound = FALSE; - break; - } - } - if (HisiAcpiDevNotFound) { - AcpiTableProtocol->Close (ValueHandle); - FoundDev = DsdtDeviceUnknown; - continue; - } - - DBG("Found device\n"); - AcpiTableProtocol->Close(ValueHandle); - Status = GetDeviceInfo (AcpiTableProtocol, ChildHandle, &DevNextID, &FoundDev); - if (EFI_ERROR (Status)) { - continue; - } - } else if ((FoundDev != DsdtDeviceUnknown) && AsciiStrnCmp((CHAR8 *) Data, "_DSD", 4) == 0) { - // - // Patch DSD data - // - EFI_ACPI_HANDLE PkgHandle; - Status = AcpiTableProtocol->GetOption(DevHandle, 2, &DataType, &Buffer, &DataSize); - if (EFI_ERROR(Status)) - break; - - if (DataType != EFI_ACPI_DATA_TYPE_CHILD) - continue; - - // - // Open package data - // - AcpiTableProtocol->Open((VOID *) Buffer, &PkgHandle); - Status = AcpiTableProtocol->GetOption(PkgHandle, 0, &DataType, &Buffer, &DataSize); - - Data = Buffer; - DBG("_DSD Subnode Store Op Code 0x%02X %02X\n", - Data[0], DataSize > 1 ? Data[1] : 0); - - // - // Walk the _DSD node - // - if (DataSize == 1 && Data[0] == AML_PACKAGE_OP) { - Status = SearchReplacePackageAddress (AcpiTableProtocol, PkgHandle, DevNextID, FoundDev); - } - - AcpiTableProtocol->Close(PkgHandle); - } else if (AsciiStrnCmp ((CHAR8 *) Data, "_ADR", 4) == 0) { - Status = AcpiTableProtocol->GetOption (DevHandle, 2, &DataType, &Buffer, &DataSize); - if (EFI_ERROR (Status)) { - break; - } - - if (DataType != EFI_ACPI_DATA_TYPE_CHILD) { - continue; - } - - Status = GetDeviceInfo (AcpiTableProtocol, ChildHandle, &DevNextID, &FoundDev); - - if (EFI_ERROR (Status)) { - continue; - } - } - } - } else if ((DataSize == 2) && (Data[0] == AML_EXT_OP) && (Data[1] == AML_EXT_DEVICE_OP)) { - ProcessDSDTDevice (AcpiTableProtocol, DevHandle); - } - } - - return EFI_SUCCESS; -} - - -BOOLEAN -IsSbScope ( - EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, - EFI_ACPI_HANDLE ChildHandle - ) -{ - EFI_STATUS Status; - EFI_ACPI_DATA_TYPE DataType; - CONST UINT8 *Data; - CONST VOID *Buffer; - UINTN DataSize; - - Status = AcpiTableProtocol->GetOption (ChildHandle, 0, &DataType, &Buffer, &DataSize); - if (EFI_ERROR(Status)) return FALSE; - - Data = Buffer; - if (DataSize != 1 || Data[0] != AML_SCOPE_OP) { - return FALSE; - } - - return TRUE; -} - -EFI_STATUS ProcessDSDTChild( - EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, - EFI_ACPI_HANDLE ChildHandle) -{ - EFI_STATUS Status; - EFI_ACPI_HANDLE DevHandle; - - // Check Scope(_SB) at first - if (!IsSbScope (AcpiTableProtocol, ChildHandle)) { - return ProcessDSDTDevice (AcpiTableProtocol, ChildHandle); - } - - for (DevHandle = NULL; ; ) { - Status = AcpiTableProtocol->GetChild (ChildHandle, &DevHandle); - if (EFI_ERROR(Status) || DevHandle == NULL) { - break; - } - - ProcessDSDTDevice (AcpiTableProtocol, DevHandle); - } - - return EFI_SUCCESS; -} - -static EFI_STATUS ProcessDSDT( - EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, - EFI_ACPI_HANDLE TableHandle) -{ - EFI_STATUS Status; - EFI_ACPI_HANDLE ChildHandle; - // - // Parse table for device type - DBG ("[%a:%d] - TableHandle=%p\n", __FUNCTION__, __LINE__, TableHandle); - for (ChildHandle = NULL; ; ) { - Status = AcpiTableProtocol->GetChild(TableHandle, &ChildHandle); - DBG ("[%a:%d] - Child=%p, %r\n", __FUNCTION__, __LINE__, ChildHandle, Status); - if (EFI_ERROR(Status)) - break; - if (ChildHandle == NULL) - break; - - ProcessDSDTChild(AcpiTableProtocol, ChildHandle); - } - - return EFI_SUCCESS; -} - -STATIC -VOID -AcpiCheckSum ( - IN OUT EFI_ACPI_SDT_HEADER *Table - ) -{ - UINTN ChecksumOffset; - UINT8 *Buffer; - - ChecksumOffset = OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, Checksum); - Buffer = (UINT8 *)Table; - - // - // set checksum to 0 first - // - Buffer[ChecksumOffset] = 0; - - // - // Update checksum value - // - Buffer[ChecksumOffset] = CalculateCheckSum8 (Buffer, Table->Length); -} - -EFI_STATUS UpdateAcpiDsdtTable(void) -{ - EFI_STATUS Status; - EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol; - EFI_ACPI_SDT_HEADER *Table; - EFI_ACPI_TABLE_VERSION TableVersion; - UINTN TableKey; - EFI_ACPI_HANDLE TableHandle; - UINTN i; - - DEBUG ((EFI_D_ERROR, "Updating Ethernet MAC in ACPI DSDT...\n")); - - // - // Find the AcpiTable protocol - Status = gBS->LocateProtocol(&gEfiAcpiSdtProtocolGuid, NULL, (VOID**) &AcpiTableProtocol); - if (EFI_ERROR(Status)) { - DBG("Unable to locate ACPI table protocol\n"); - return EFI_SUCCESS; - } - - // - // Search for DSDT Table - for (i = 0; i < EFI_ACPI_MAX_NUM_TABLES; i++) { - Status = AcpiTableProtocol->GetAcpiTable(i, &Table, &TableVersion, &TableKey); - if (EFI_ERROR(Status)) - break; - if (Table->Signature != DSDT_SIGNATURE) - continue; - - Status = AcpiTableProtocol->OpenSdt(TableKey, &TableHandle); - if (EFI_ERROR(Status)) - break; - - ProcessDSDT(AcpiTableProtocol, TableHandle); - - AcpiTableProtocol->Close(TableHandle); - AcpiCheckSum (Table); - } - - return EFI_SUCCESS; -} diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h deleted file mode 100644 index a7e1eed..0000000 --- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h +++ /dev/null @@ -1,16 +0,0 @@ -/* - * - * Copyright (c) 2014, Applied Micro Circuits Corporation - * Copyright (c) 2015, Hisilicon Limited. All rights reserved. - * Copyright (c) 2015, Linaro Limited. All rights reserved. - * Author: Loc Ho <lho@apm.com> - * - * SPDX-License-Identifier: BSD-2-Clause-Patent - */ -#ifndef _ETH_MAC_H_ -#define _ETH_MAC_H_ - -EFI_STATUS UpdateAcpiDsdtTable (VOID); - -#endif - diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.c b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.c new file mode 100644 index 0000000..205f2f9 --- /dev/null +++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.c @@ -0,0 +1,612 @@ +/** @file + + Copyright (c) 2014 - 2020, Applied Micro Curcuit Corporation. All rights reserved.<BR> + Copyright (c) 2015 - 2020, Hisilicon Limited. All rights reserved.<BR> + Copyright (c) 2015 - 2020, Linaro Limited. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent + + This driver is called to initialize the FW part of the PHY in preparation + for the OS. + +**/ + +#include <Guid/ShellVariableGuid.h> +#include <Library/UefiRuntimeServicesTableLib.h> +#include <Library/DebugLib.h> +#include <Library/TimerLib.h> + +#include <PiDxe.h> +#include <Guid/EventGroup.h> +#include <Protocol/AcpiTable.h> +#include <Protocol/FirmwareVolume2.h> +#include <Library/BaseLib.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Protocol/AcpiSystemDescriptionTable.h> +#include <Library/DebugLib.h> +#include <Library/PcdLib.h> +#include <Library/PrintLib.h> +#include <Library/DebugLib.h> +#include <Library/BaseMemoryLib.h> +#include <Library/UefiRuntimeServicesTableLib.h> +#include <IndustryStandard/Acpi.h> +#include <IndustryStandard/AcpiAml.h> +#include <Library/MemoryAllocationLib.h> + +#include <Protocol/HisiBoardNicProtocol.h> + +// Turn on debug message by enabling below define +//#define ACPI_DEBUG + +#ifdef ACPI_DEBUG +#define DBG(arg...) DEBUG((EFI_D_ERROR,## arg)) +#else +#define DBG(arg...) +#endif + +#define EFI_ACPI_MAX_NUM_TABLES 20 +#define DSDT_SIGNATURE 0x54445344 + +#define ACPI_ETH_MAC_KEY "local-mac-address" +#define ACPI_ETH_SAS_KEY "sas-addr" + +#define PREFIX_VARIABLE_NAME L"MAC" +#define PREFIX_VARIABLE_NAME_COMPAT L"RGMII_MAC" +#define ADDRESS_MAX_LEN 30 + +CHAR8 *mHisiAcpiDevId[] = {"HISI00C1","HISI00C2","HISI0162"}; + +typedef enum { + DsdtDeviceUnknown, + DsdtDeviceLan, + DsdtDeviceSas +} DSDT_DEVICE_TYPE; + +EFI_STATUS GetEnvMac( + IN UINTN MacNextID, + IN OUT UINT8 *MacBuffer) +{ + EFI_MAC_ADDRESS Mac; + EFI_STATUS Status; + HISI_BOARD_NIC_PROTOCOL *OemNic = NULL; + + Status = gBS->LocateProtocol(&gHisiBoardNicProtocolGuid, NULL, (VOID **)&OemNic); + if(EFI_ERROR(Status)) + { + DEBUG((EFI_D_ERROR, "[%a]:[%dL] LocateProtocol failed %r\n", __FUNCTION__, __LINE__, Status)); + return Status; + } + + Status = OemNic->GetMac(&Mac, MacNextID); + if(EFI_ERROR(Status)) + { + DEBUG((EFI_D_ERROR, "[%a]:[%dL] GetMac failed %r\n", __FUNCTION__, __LINE__, Status)); + return Status; + } + + CopyMem (MacBuffer, &Mac, 6); + DEBUG((EFI_D_ERROR, "Port %d MAC %02x:%02x:%02x:%02x:%02x:%02x\n", + MacNextID, + MacBuffer[0], + MacBuffer[1], + MacBuffer[2], + MacBuffer[3], + MacBuffer[4], + MacBuffer[5] + )); + + return EFI_SUCCESS; +} + +EFI_STATUS GetSasAddress ( + IN UINT8 Index, + IN OUT UINT8 *SasAddrBuffer + ) +{ + if (SasAddrBuffer == NULL) { + return EFI_INVALID_PARAMETER; + } + + SasAddrBuffer[0] = 0x50; + SasAddrBuffer[1] = 0x01; + SasAddrBuffer[2] = 0x88; + SasAddrBuffer[3] = 0x20; + SasAddrBuffer[4] = 0x16; + SasAddrBuffer[5] = 0x00; + SasAddrBuffer[6] = 0x00; + SasAddrBuffer[7] = Index; + + return EFI_SUCCESS; +} + +EFI_STATUS _SearchReplacePackageAddress( + IN EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, + IN EFI_ACPI_HANDLE ChildHandle, + IN UINTN Level, + IN OUT BOOLEAN *Found, + IN UINTN DevNextID, + IN DSDT_DEVICE_TYPE FoundDev + ) +{ + // ASL template for ethernet driver: +/* + * Name (_DSD, Package () { + * ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), + * Package () { + * Package (2) {"mac-address", Package (6) { 00, 11, 22, 33, 44, 55 }} + * Package (2) {"phy-channel", 0}, + * Package (2) {"phy-mode", "rgmii"}, + * Package (2) {"max-transfer-unit", 0x5dc}, // MTU of 1500 + * Package (2) {"max-speed", 0x3e8}, // 1000 Mbps + * } + * }) + */ + EFI_STATUS Status; + EFI_ACPI_DATA_TYPE DataType; + CONST UINT8 *Data; + CONST VOID *Buffer; + UINTN DataSize; + UINTN Count; + EFI_ACPI_HANDLE CurrentHandle; + EFI_ACPI_HANDLE NextHandle; + EFI_ACPI_HANDLE Level1Handle; + UINT8 *AddressBuffer; + UINT8 AddressByte = 0; + + DBG("In Level:%d\n", Level); + Level1Handle = NULL; + Status = EFI_SUCCESS; + for (CurrentHandle = NULL; ;) { + Status = AcpiTableProtocol->GetChild(ChildHandle, &CurrentHandle); + if (Level == 1) { + Level1Handle = CurrentHandle; + } + if (Level != 3 && (EFI_ERROR(Status) || CurrentHandle == NULL)) + break; + + Status = AcpiTableProtocol->GetOption(CurrentHandle, 0, &DataType, &Buffer, &DataSize); + Data = Buffer; + DBG("_DSD Child Subnode Store Op Code 0x%02X 0x%02X %02X\n", + DataSize, Data[0], DataSize > 1 ? Data[1] : 0); + + if (Level < 2 && Data[0] != AML_PACKAGE_OP) + continue; + + if (Level == 2 && Data[0] == AML_STRING_PREFIX) { + Status = AcpiTableProtocol->GetOption(CurrentHandle, 1, &DataType, &Buffer, &DataSize); + if (EFI_ERROR(Status)) + break; + + DBG(" _DSD Child Subnode Store Op Code 0x%02X 0x%02X %02X\n", + DataSize, Data[0], DataSize > 1 ? Data[1] : 0); + + Data = Buffer; + if ((DataType != EFI_ACPI_DATA_TYPE_STRING) || + ((AsciiStrCmp ((CHAR8 *) Data, ACPI_ETH_MAC_KEY) != 0) && + (AsciiStrCmp ((CHAR8 *) Data, ACPI_ETH_SAS_KEY) != 0))) { + ChildHandle = Level1Handle; + continue; + } + + DBG("_DSD Key Type %d. Found address key\n", DataType); + + // + // We found the node. + // + *Found = TRUE; + continue; + } + + if (Level == 3 && *Found) { + AddressBuffer = AllocateZeroPool (ADDRESS_MAX_LEN); + if (AddressBuffer == NULL) { + DEBUG ((DEBUG_ERROR, "%a:%d AllocateZeroPool failed\n", __FILE__, __LINE__)); + return EFI_OUT_OF_RESOURCES; + } + + switch (FoundDev) { + case DsdtDeviceLan: + //Update the MAC + Status = GetEnvMac (DevNextID, AddressBuffer); + AddressByte = 6; + break; + case DsdtDeviceSas: + //Update SAS Address. + Status = GetSasAddress (DevNextID, AddressBuffer); + AddressByte = 8; + break; + default: + Status = EFI_INVALID_PARAMETER; + } + if (EFI_ERROR (Status)) { + FreePool (AddressBuffer); + AddressBuffer = NULL; + break; + } + + for (Count = 0; Count < AddressByte; Count++) { + Status = AcpiTableProtocol->GetOption(CurrentHandle, 1, &DataType, &Buffer, &DataSize); + if (EFI_ERROR(Status)) + break; + + Data = Buffer; + DBG(" _DSD Child Subnode Store Op Code 0x%02X 0x%02X %02X DataType 0x%X\n", + DataSize, Data[0], DataSize > 1 ? Data[1] : 0, DataType); + + if (DataType != EFI_ACPI_DATA_TYPE_UINT) + break; + + // only need one byte. + // FIXME: Assume the CPU is little endian + Status = AcpiTableProtocol->SetOption (CurrentHandle, 1, AddressBuffer + Count, sizeof(UINT8)); + if (EFI_ERROR(Status)) + break; + Status = AcpiTableProtocol->GetChild(ChildHandle, &CurrentHandle); + if (EFI_ERROR(Status) || CurrentHandle == NULL) + break; + } + FreePool (AddressBuffer); + AddressBuffer = NULL; + break; + } + + if (Level > 3) + break; + + //Search next package + AcpiTableProtocol->Open((VOID *) Buffer, &NextHandle); + Status = _SearchReplacePackageAddress( + AcpiTableProtocol, + NextHandle, + Level + 1, + Found, + DevNextID, + FoundDev); + AcpiTableProtocol->Close(NextHandle); + if (!EFI_ERROR(Status)) + break; + } + + return Status; +} + +EFI_STATUS SearchReplacePackageAddress( + IN EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, + IN EFI_ACPI_HANDLE ChildHandle, + IN UINTN DevNextID, + IN DSDT_DEVICE_TYPE FoundDev + ) +{ + BOOLEAN Found = FALSE; + UINTN Level = 0; + + return _SearchReplacePackageAddress(AcpiTableProtocol, ChildHandle, Level, + &Found, DevNextID, FoundDev); +} + +EFI_STATUS +GetDeviceInfo ( + EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, + EFI_ACPI_HANDLE ChildHandle, + UINTN *DevID, + DSDT_DEVICE_TYPE *FoundDev + ) +{ + EFI_STATUS Status; + EFI_ACPI_DATA_TYPE DataType; + CHAR8 Data[5]; + CONST VOID *Buffer; + UINTN DataSize; + + // Get NameString + Status = AcpiTableProtocol->GetOption (ChildHandle, 1, &DataType, &Buffer, &DataSize); + if (EFI_ERROR (Status)) { + DEBUG ((EFI_D_ERROR, "[%a:%d] Get NameString failed: %r\n", __FUNCTION__, __LINE__, Status)); + return Status; + } + + CopyMem (Data, Buffer, 4); + DBG("Size %p Data %02x %02x %02x %02x\n", DataSize, Data[0], Data[1], Data[2], Data[3]); + + Data[4] = '\0'; + if ((DataSize != 4) || + (Data[3] > '9' || Data[3] < '0')) { + DEBUG ((DEBUG_ERROR, "The NameString %a is not ETHn or SASn\n", Data)); + return EFI_INVALID_PARAMETER; + } + + if (AsciiStrnCmp ("ETH", Data, 3) == 0) { + *FoundDev = DsdtDeviceLan; + } else if (AsciiStrnCmp ("SAS", Data, 3) == 0) { + *FoundDev = DsdtDeviceSas; + } else { + DEBUG ((DEBUG_ERROR, "[%a:%d] The NameString %a is not ETHn or SASn\n", + __FUNCTION__, __LINE__, Data)); + return EFI_INVALID_PARAMETER; + } + + *DevID = Data[3] - '0'; + return EFI_SUCCESS; +} + +EFI_STATUS ProcessDSDTDevice ( + EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, + EFI_ACPI_HANDLE ChildHandle) +{ + EFI_STATUS Status; + EFI_ACPI_DATA_TYPE DataType; + CONST UINT8 *Data; + CONST VOID *Buffer; + UINTN DataSize; + EFI_ACPI_HANDLE DevHandle; + DSDT_DEVICE_TYPE FoundDev = DsdtDeviceUnknown; + UINTN DevNextID; + BOOLEAN HisiAcpiDevNotFound; + UINTN Index; + + Status = AcpiTableProtocol->GetOption(ChildHandle, 0, &DataType, &Buffer, &DataSize); + if (EFI_ERROR(Status)) + return EFI_SUCCESS; + + Data = Buffer; + // + // Skip all non-device type + // + if (DataSize != 2 || Data[0] != AML_EXT_OP || Data[1] != AML_EXT_DEVICE_OP) + return EFI_SUCCESS; + + // + // Walk the device type node + // + for (DevHandle = NULL; ; ) { + Status = AcpiTableProtocol->GetChild(ChildHandle, &DevHandle); + if (EFI_ERROR(Status) || DevHandle == NULL) + break; + + // + // Search for _HID with Device ID + // + Status = AcpiTableProtocol->GetOption(DevHandle, 0, &DataType, &Buffer, &DataSize); + if (EFI_ERROR(Status)) + break; + + Data = Buffer; + DBG("Data Type 0x%02X %02X\n", Data[0], DataSize > 1 ? Data[1] : 0); + if (DataSize == 1 && Data[0] == AML_NAME_OP) { + Status = AcpiTableProtocol->GetOption(DevHandle, 1, &DataType, &Buffer, &DataSize); + if (EFI_ERROR(Status)) + break; + + Data = Buffer; + if (DataType == EFI_ACPI_DATA_TYPE_NAME_STRING) { + if (AsciiStrnCmp((CHAR8 *) Data, "_HID", 4) == 0) { + EFI_ACPI_HANDLE ValueHandle; + + Status = AcpiTableProtocol->GetOption(DevHandle, 2, &DataType, &Buffer, &DataSize); + if (EFI_ERROR(Status)) + break; + + if (DataType != EFI_ACPI_DATA_TYPE_CHILD) + continue; + + AcpiTableProtocol->Open((VOID *) Buffer, &ValueHandle); + Status = AcpiTableProtocol->GetOption(ValueHandle, 1, &DataType, &Buffer, &DataSize); + + Data = Buffer; + DBG("[%a:%d] - _HID = %a\n", __FUNCTION__, __LINE__, Data); + + if (EFI_ERROR(Status) || + DataType != EFI_ACPI_DATA_TYPE_STRING) { + AcpiTableProtocol->Close (ValueHandle); + FoundDev = DsdtDeviceUnknown; + continue; + } + + HisiAcpiDevNotFound = TRUE; + for (Index = 0; Index < ARRAY_SIZE (mHisiAcpiDevId); Index++) { + if (AsciiStrCmp ((CHAR8 *)Data, mHisiAcpiDevId[Index]) == 0) { + HisiAcpiDevNotFound = FALSE; + break; + } + } + if (HisiAcpiDevNotFound) { + AcpiTableProtocol->Close (ValueHandle); + FoundDev = DsdtDeviceUnknown; + continue; + } + + DBG("Found device\n"); + AcpiTableProtocol->Close(ValueHandle); + Status = GetDeviceInfo (AcpiTableProtocol, ChildHandle, &DevNextID, &FoundDev); + if (EFI_ERROR (Status)) { + continue; + } + } else if ((FoundDev != DsdtDeviceUnknown) && AsciiStrnCmp((CHAR8 *) Data, "_DSD", 4) == 0) { + // + // Patch DSD data + // + EFI_ACPI_HANDLE PkgHandle; + Status = AcpiTableProtocol->GetOption(DevHandle, 2, &DataType, &Buffer, &DataSize); + if (EFI_ERROR(Status)) + break; + + if (DataType != EFI_ACPI_DATA_TYPE_CHILD) + continue; + + // + // Open package data + // + AcpiTableProtocol->Open((VOID *) Buffer, &PkgHandle); + Status = AcpiTableProtocol->GetOption(PkgHandle, 0, &DataType, &Buffer, &DataSize); + + Data = Buffer; + DBG("_DSD Subnode Store Op Code 0x%02X %02X\n", + Data[0], DataSize > 1 ? Data[1] : 0); + + // + // Walk the _DSD node + // + if (DataSize == 1 && Data[0] == AML_PACKAGE_OP) { + Status = SearchReplacePackageAddress (AcpiTableProtocol, PkgHandle, DevNextID, FoundDev); + } + + AcpiTableProtocol->Close(PkgHandle); + } else if (AsciiStrnCmp ((CHAR8 *) Data, "_ADR", 4) == 0) { + Status = AcpiTableProtocol->GetOption (DevHandle, 2, &DataType, &Buffer, &DataSize); + if (EFI_ERROR (Status)) { + break; + } + + if (DataType != EFI_ACPI_DATA_TYPE_CHILD) { + continue; + } + + Status = GetDeviceInfo (AcpiTableProtocol, ChildHandle, &DevNextID, &FoundDev); + + if (EFI_ERROR (Status)) { + continue; + } + } + } + } else if ((DataSize == 2) && (Data[0] == AML_EXT_OP) && (Data[1] == AML_EXT_DEVICE_OP)) { + ProcessDSDTDevice (AcpiTableProtocol, DevHandle); + } + } + + return EFI_SUCCESS; +} + + +BOOLEAN +IsSbScope ( + EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, + EFI_ACPI_HANDLE ChildHandle + ) +{ + EFI_STATUS Status; + EFI_ACPI_DATA_TYPE DataType; + CONST UINT8 *Data; + CONST VOID *Buffer; + UINTN DataSize; + + Status = AcpiTableProtocol->GetOption (ChildHandle, 0, &DataType, &Buffer, &DataSize); + if (EFI_ERROR(Status)) return FALSE; + + Data = Buffer; + if (DataSize != 1 || Data[0] != AML_SCOPE_OP) { + return FALSE; + } + + return TRUE; +} + +EFI_STATUS ProcessDSDTChild( + EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, + EFI_ACPI_HANDLE ChildHandle) +{ + EFI_STATUS Status; + EFI_ACPI_HANDLE DevHandle; + + // Check Scope(_SB) at first + if (!IsSbScope (AcpiTableProtocol, ChildHandle)) { + return ProcessDSDTDevice (AcpiTableProtocol, ChildHandle); + } + + for (DevHandle = NULL; ; ) { + Status = AcpiTableProtocol->GetChild (ChildHandle, &DevHandle); + if (EFI_ERROR(Status) || DevHandle == NULL) { + break; + } + + ProcessDSDTDevice (AcpiTableProtocol, DevHandle); + } + + return EFI_SUCCESS; +} + +static EFI_STATUS ProcessDSDT( + EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, + EFI_ACPI_HANDLE TableHandle) +{ + EFI_STATUS Status; + EFI_ACPI_HANDLE ChildHandle; + // + // Parse table for device type + DBG ("[%a:%d] - TableHandle=%p\n", __FUNCTION__, __LINE__, TableHandle); + for (ChildHandle = NULL; ; ) { + Status = AcpiTableProtocol->GetChild(TableHandle, &ChildHandle); + DBG ("[%a:%d] - Child=%p, %r\n", __FUNCTION__, __LINE__, ChildHandle, Status); + if (EFI_ERROR(Status)) + break; + if (ChildHandle == NULL) + break; + + ProcessDSDTChild(AcpiTableProtocol, ChildHandle); + } + + return EFI_SUCCESS; +} + +STATIC +VOID +AcpiCheckSum ( + IN OUT EFI_ACPI_SDT_HEADER *Table + ) +{ + UINTN ChecksumOffset; + UINT8 *Buffer; + + ChecksumOffset = OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, Checksum); + Buffer = (UINT8 *)Table; + + // + // set checksum to 0 first + // + Buffer[ChecksumOffset] = 0; + + // + // Update checksum value + // + Buffer[ChecksumOffset] = CalculateCheckSum8 (Buffer, Table->Length); +} + +EFI_STATUS UpdateAcpiDsdtTable(void) +{ + EFI_STATUS Status; + EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol; + EFI_ACPI_SDT_HEADER *Table; + EFI_ACPI_TABLE_VERSION TableVersion; + UINTN TableKey; + EFI_ACPI_HANDLE TableHandle; + UINTN i; + + DEBUG ((EFI_D_ERROR, "Updating Ethernet MAC in ACPI DSDT...\n")); + + // + // Find the AcpiTable protocol + Status = gBS->LocateProtocol(&gEfiAcpiSdtProtocolGuid, NULL, (VOID**) &AcpiTableProtocol); + if (EFI_ERROR(Status)) { + DBG("Unable to locate ACPI table protocol\n"); + return EFI_SUCCESS; + } + + // + // Search for DSDT Table + for (i = 0; i < EFI_ACPI_MAX_NUM_TABLES; i++) { + Status = AcpiTableProtocol->GetAcpiTable(i, &Table, &TableVersion, &TableKey); + if (EFI_ERROR(Status)) + break; + if (Table->Signature != DSDT_SIGNATURE) + continue; + + Status = AcpiTableProtocol->OpenSdt(TableKey, &TableHandle); + if (EFI_ERROR(Status)) + break; + + ProcessDSDT(AcpiTableProtocol, TableHandle); + + AcpiTableProtocol->Close(TableHandle); + AcpiCheckSum (Table); + } + + return EFI_SUCCESS; +} diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.h b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.h new file mode 100644 index 0000000..a7e1eed --- /dev/null +++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.h @@ -0,0 +1,16 @@ +/* + * + * Copyright (c) 2014, Applied Micro Circuits Corporation + * Copyright (c) 2015, Hisilicon Limited. All rights reserved. + * Copyright (c) 2015, Linaro Limited. All rights reserved. + * Author: Loc Ho <lho@apm.com> + * + * SPDX-License-Identifier: BSD-2-Clause-Patent + */ +#ifndef _ETH_MAC_H_ +#define _ETH_MAC_H_ + +EFI_STATUS UpdateAcpiDsdtTable (VOID); + +#endif + -- 2.8.1 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [RFC edk2-platforms v1 3/3] Silicon/Hisilicon: Rename EthMac files 2020-05-21 14:43 ` [RFC edk2-platforms v1 3/3] Silicon/Hisilicon: Rename EthMac files Ming Huang @ 2020-05-26 18:50 ` Leif Lindholm 2020-05-27 14:22 ` Ming Huang 0 siblings, 1 reply; 12+ messages in thread From: Leif Lindholm @ 2020-05-26 18:50 UTC (permalink / raw) To: Ming Huang Cc: devel, ard.biesheuvel, lidongzhan, songdongkuang, wanghuiqiang, qiuliangen On Thu, May 21, 2020 at 22:43:04 +0800, Ming Huang wrote: > As not only update mac address feature in EthMac files, so rename > them to UpdateDsdt. > > Signed-off-by: Ming Huang <huangming23@huawei.com> > --- > Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c | 2 +- > Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf | 8 +- > Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c | 612 -------------------- > Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h | 16 - > Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.c | 612 ++++++++++++++++++++ > Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.h | 16 + > 6 files changed, 633 insertions(+), 633 deletions(-) > > diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c > index d3ea051..fd67677 100644 > --- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c > +++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c > @@ -21,7 +21,7 @@ > #include <Library/UefiRuntimeServicesTableLib.h> > #include <IndustryStandard/Acpi.h> > #include <IndustryStandard/AcpiAml.h> > -#include "EthMac.h" > +#include "UpdateDsdt.h" > > EFI_EVENT mUpdateAcpiDsdtTableEvent; > > diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf > index 53da731..a2b669d 100644 > --- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf > +++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf > @@ -1,8 +1,8 @@ > ## @file > # > -# Copyright (c) 2014, Applied Micro Curcuit Corp. All rights reserved.<BR> > -# Copyright (c) 2015, Hisilicon Limited. All rights reserved.<BR> > -# Copyright (c) 2015, Linaro Limited. All rights reserved.<BR> > +# Copyright (c) 2014 - 2020, Applied Micro Curcuit Corp. All rights reserved.<BR> > +# Copyright (c) 2015 - 2020, Hisilicon Limited. All rights reserved.<BR> > +# Copyright (c) 2015 - 2020, Linaro Limited. All rights reserved.<BR> Same comment on copyright as on 1/3 and 2/3. / Leif > # SPDX-License-Identifier: BSD-2-Clause-Patent > # > ## > @@ -18,7 +18,7 @@ > > [Sources] > AcpiPlatform.c > - EthMac.c > + UpdateDsdt.c > > [Packages] > MdePkg/MdePkg.dec > diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c > deleted file mode 100644 > index 205f2f9..0000000 > --- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c > +++ /dev/null > @@ -1,612 +0,0 @@ > -/** @file > - > - Copyright (c) 2014 - 2020, Applied Micro Curcuit Corporation. All rights reserved.<BR> > - Copyright (c) 2015 - 2020, Hisilicon Limited. All rights reserved.<BR> > - Copyright (c) 2015 - 2020, Linaro Limited. All rights reserved.<BR> > - SPDX-License-Identifier: BSD-2-Clause-Patent > - > - This driver is called to initialize the FW part of the PHY in preparation > - for the OS. > - > -**/ > - > -#include <Guid/ShellVariableGuid.h> > -#include <Library/UefiRuntimeServicesTableLib.h> > -#include <Library/DebugLib.h> > -#include <Library/TimerLib.h> > - > -#include <PiDxe.h> > -#include <Guid/EventGroup.h> > -#include <Protocol/AcpiTable.h> > -#include <Protocol/FirmwareVolume2.h> > -#include <Library/BaseLib.h> > -#include <Library/UefiBootServicesTableLib.h> > -#include <Protocol/AcpiSystemDescriptionTable.h> > -#include <Library/DebugLib.h> > -#include <Library/PcdLib.h> > -#include <Library/PrintLib.h> > -#include <Library/DebugLib.h> > -#include <Library/BaseMemoryLib.h> > -#include <Library/UefiRuntimeServicesTableLib.h> > -#include <IndustryStandard/Acpi.h> > -#include <IndustryStandard/AcpiAml.h> > -#include <Library/MemoryAllocationLib.h> > - > -#include <Protocol/HisiBoardNicProtocol.h> > - > -// Turn on debug message by enabling below define > -//#define ACPI_DEBUG > - > -#ifdef ACPI_DEBUG > -#define DBG(arg...) DEBUG((EFI_D_ERROR,## arg)) > -#else > -#define DBG(arg...) > -#endif > - > -#define EFI_ACPI_MAX_NUM_TABLES 20 > -#define DSDT_SIGNATURE 0x54445344 > - > -#define ACPI_ETH_MAC_KEY "local-mac-address" > -#define ACPI_ETH_SAS_KEY "sas-addr" > - > -#define PREFIX_VARIABLE_NAME L"MAC" > -#define PREFIX_VARIABLE_NAME_COMPAT L"RGMII_MAC" > -#define ADDRESS_MAX_LEN 30 > - > -CHAR8 *mHisiAcpiDevId[] = {"HISI00C1","HISI00C2","HISI0162"}; > - > -typedef enum { > - DsdtDeviceUnknown, > - DsdtDeviceLan, > - DsdtDeviceSas > -} DSDT_DEVICE_TYPE; > - > -EFI_STATUS GetEnvMac( > - IN UINTN MacNextID, > - IN OUT UINT8 *MacBuffer) > -{ > - EFI_MAC_ADDRESS Mac; > - EFI_STATUS Status; > - HISI_BOARD_NIC_PROTOCOL *OemNic = NULL; > - > - Status = gBS->LocateProtocol(&gHisiBoardNicProtocolGuid, NULL, (VOID **)&OemNic); > - if(EFI_ERROR(Status)) > - { > - DEBUG((EFI_D_ERROR, "[%a]:[%dL] LocateProtocol failed %r\n", __FUNCTION__, __LINE__, Status)); > - return Status; > - } > - > - Status = OemNic->GetMac(&Mac, MacNextID); > - if(EFI_ERROR(Status)) > - { > - DEBUG((EFI_D_ERROR, "[%a]:[%dL] GetMac failed %r\n", __FUNCTION__, __LINE__, Status)); > - return Status; > - } > - > - CopyMem (MacBuffer, &Mac, 6); > - DEBUG((EFI_D_ERROR, "Port %d MAC %02x:%02x:%02x:%02x:%02x:%02x\n", > - MacNextID, > - MacBuffer[0], > - MacBuffer[1], > - MacBuffer[2], > - MacBuffer[3], > - MacBuffer[4], > - MacBuffer[5] > - )); > - > - return EFI_SUCCESS; > -} > - > -EFI_STATUS GetSasAddress ( > - IN UINT8 Index, > - IN OUT UINT8 *SasAddrBuffer > - ) > -{ > - if (SasAddrBuffer == NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - SasAddrBuffer[0] = 0x50; > - SasAddrBuffer[1] = 0x01; > - SasAddrBuffer[2] = 0x88; > - SasAddrBuffer[3] = 0x20; > - SasAddrBuffer[4] = 0x16; > - SasAddrBuffer[5] = 0x00; > - SasAddrBuffer[6] = 0x00; > - SasAddrBuffer[7] = Index; > - > - return EFI_SUCCESS; > -} > - > -EFI_STATUS _SearchReplacePackageAddress( > - IN EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, > - IN EFI_ACPI_HANDLE ChildHandle, > - IN UINTN Level, > - IN OUT BOOLEAN *Found, > - IN UINTN DevNextID, > - IN DSDT_DEVICE_TYPE FoundDev > - ) > -{ > - // ASL template for ethernet driver: > -/* > - * Name (_DSD, Package () { > - * ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), > - * Package () { > - * Package (2) {"mac-address", Package (6) { 00, 11, 22, 33, 44, 55 }} > - * Package (2) {"phy-channel", 0}, > - * Package (2) {"phy-mode", "rgmii"}, > - * Package (2) {"max-transfer-unit", 0x5dc}, // MTU of 1500 > - * Package (2) {"max-speed", 0x3e8}, // 1000 Mbps > - * } > - * }) > - */ > - EFI_STATUS Status; > - EFI_ACPI_DATA_TYPE DataType; > - CONST UINT8 *Data; > - CONST VOID *Buffer; > - UINTN DataSize; > - UINTN Count; > - EFI_ACPI_HANDLE CurrentHandle; > - EFI_ACPI_HANDLE NextHandle; > - EFI_ACPI_HANDLE Level1Handle; > - UINT8 *AddressBuffer; > - UINT8 AddressByte = 0; > - > - DBG("In Level:%d\n", Level); > - Level1Handle = NULL; > - Status = EFI_SUCCESS; > - for (CurrentHandle = NULL; ;) { > - Status = AcpiTableProtocol->GetChild(ChildHandle, &CurrentHandle); > - if (Level == 1) { > - Level1Handle = CurrentHandle; > - } > - if (Level != 3 && (EFI_ERROR(Status) || CurrentHandle == NULL)) > - break; > - > - Status = AcpiTableProtocol->GetOption(CurrentHandle, 0, &DataType, &Buffer, &DataSize); > - Data = Buffer; > - DBG("_DSD Child Subnode Store Op Code 0x%02X 0x%02X %02X\n", > - DataSize, Data[0], DataSize > 1 ? Data[1] : 0); > - > - if (Level < 2 && Data[0] != AML_PACKAGE_OP) > - continue; > - > - if (Level == 2 && Data[0] == AML_STRING_PREFIX) { > - Status = AcpiTableProtocol->GetOption(CurrentHandle, 1, &DataType, &Buffer, &DataSize); > - if (EFI_ERROR(Status)) > - break; > - > - DBG(" _DSD Child Subnode Store Op Code 0x%02X 0x%02X %02X\n", > - DataSize, Data[0], DataSize > 1 ? Data[1] : 0); > - > - Data = Buffer; > - if ((DataType != EFI_ACPI_DATA_TYPE_STRING) || > - ((AsciiStrCmp ((CHAR8 *) Data, ACPI_ETH_MAC_KEY) != 0) && > - (AsciiStrCmp ((CHAR8 *) Data, ACPI_ETH_SAS_KEY) != 0))) { > - ChildHandle = Level1Handle; > - continue; > - } > - > - DBG("_DSD Key Type %d. Found address key\n", DataType); > - > - // > - // We found the node. > - // > - *Found = TRUE; > - continue; > - } > - > - if (Level == 3 && *Found) { > - AddressBuffer = AllocateZeroPool (ADDRESS_MAX_LEN); > - if (AddressBuffer == NULL) { > - DEBUG ((DEBUG_ERROR, "%a:%d AllocateZeroPool failed\n", __FILE__, __LINE__)); > - return EFI_OUT_OF_RESOURCES; > - } > - > - switch (FoundDev) { > - case DsdtDeviceLan: > - //Update the MAC > - Status = GetEnvMac (DevNextID, AddressBuffer); > - AddressByte = 6; > - break; > - case DsdtDeviceSas: > - //Update SAS Address. > - Status = GetSasAddress (DevNextID, AddressBuffer); > - AddressByte = 8; > - break; > - default: > - Status = EFI_INVALID_PARAMETER; > - } > - if (EFI_ERROR (Status)) { > - FreePool (AddressBuffer); > - AddressBuffer = NULL; > - break; > - } > - > - for (Count = 0; Count < AddressByte; Count++) { > - Status = AcpiTableProtocol->GetOption(CurrentHandle, 1, &DataType, &Buffer, &DataSize); > - if (EFI_ERROR(Status)) > - break; > - > - Data = Buffer; > - DBG(" _DSD Child Subnode Store Op Code 0x%02X 0x%02X %02X DataType 0x%X\n", > - DataSize, Data[0], DataSize > 1 ? Data[1] : 0, DataType); > - > - if (DataType != EFI_ACPI_DATA_TYPE_UINT) > - break; > - > - // only need one byte. > - // FIXME: Assume the CPU is little endian > - Status = AcpiTableProtocol->SetOption (CurrentHandle, 1, AddressBuffer + Count, sizeof(UINT8)); > - if (EFI_ERROR(Status)) > - break; > - Status = AcpiTableProtocol->GetChild(ChildHandle, &CurrentHandle); > - if (EFI_ERROR(Status) || CurrentHandle == NULL) > - break; > - } > - FreePool (AddressBuffer); > - AddressBuffer = NULL; > - break; > - } > - > - if (Level > 3) > - break; > - > - //Search next package > - AcpiTableProtocol->Open((VOID *) Buffer, &NextHandle); > - Status = _SearchReplacePackageAddress( > - AcpiTableProtocol, > - NextHandle, > - Level + 1, > - Found, > - DevNextID, > - FoundDev); > - AcpiTableProtocol->Close(NextHandle); > - if (!EFI_ERROR(Status)) > - break; > - } > - > - return Status; > -} > - > -EFI_STATUS SearchReplacePackageAddress( > - IN EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, > - IN EFI_ACPI_HANDLE ChildHandle, > - IN UINTN DevNextID, > - IN DSDT_DEVICE_TYPE FoundDev > - ) > -{ > - BOOLEAN Found = FALSE; > - UINTN Level = 0; > - > - return _SearchReplacePackageAddress(AcpiTableProtocol, ChildHandle, Level, > - &Found, DevNextID, FoundDev); > -} > - > -EFI_STATUS > -GetDeviceInfo ( > - EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, > - EFI_ACPI_HANDLE ChildHandle, > - UINTN *DevID, > - DSDT_DEVICE_TYPE *FoundDev > - ) > -{ > - EFI_STATUS Status; > - EFI_ACPI_DATA_TYPE DataType; > - CHAR8 Data[5]; > - CONST VOID *Buffer; > - UINTN DataSize; > - > - // Get NameString > - Status = AcpiTableProtocol->GetOption (ChildHandle, 1, &DataType, &Buffer, &DataSize); > - if (EFI_ERROR (Status)) { > - DEBUG ((EFI_D_ERROR, "[%a:%d] Get NameString failed: %r\n", __FUNCTION__, __LINE__, Status)); > - return Status; > - } > - > - CopyMem (Data, Buffer, 4); > - DBG("Size %p Data %02x %02x %02x %02x\n", DataSize, Data[0], Data[1], Data[2], Data[3]); > - > - Data[4] = '\0'; > - if ((DataSize != 4) || > - (Data[3] > '9' || Data[3] < '0')) { > - DEBUG ((DEBUG_ERROR, "The NameString %a is not ETHn or SASn\n", Data)); > - return EFI_INVALID_PARAMETER; > - } > - > - if (AsciiStrnCmp ("ETH", Data, 3) == 0) { > - *FoundDev = DsdtDeviceLan; > - } else if (AsciiStrnCmp ("SAS", Data, 3) == 0) { > - *FoundDev = DsdtDeviceSas; > - } else { > - DEBUG ((DEBUG_ERROR, "[%a:%d] The NameString %a is not ETHn or SASn\n", > - __FUNCTION__, __LINE__, Data)); > - return EFI_INVALID_PARAMETER; > - } > - > - *DevID = Data[3] - '0'; > - return EFI_SUCCESS; > -} > - > -EFI_STATUS ProcessDSDTDevice ( > - EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, > - EFI_ACPI_HANDLE ChildHandle) > -{ > - EFI_STATUS Status; > - EFI_ACPI_DATA_TYPE DataType; > - CONST UINT8 *Data; > - CONST VOID *Buffer; > - UINTN DataSize; > - EFI_ACPI_HANDLE DevHandle; > - DSDT_DEVICE_TYPE FoundDev = DsdtDeviceUnknown; > - UINTN DevNextID; > - BOOLEAN HisiAcpiDevNotFound; > - UINTN Index; > - > - Status = AcpiTableProtocol->GetOption(ChildHandle, 0, &DataType, &Buffer, &DataSize); > - if (EFI_ERROR(Status)) > - return EFI_SUCCESS; > - > - Data = Buffer; > - // > - // Skip all non-device type > - // > - if (DataSize != 2 || Data[0] != AML_EXT_OP || Data[1] != AML_EXT_DEVICE_OP) > - return EFI_SUCCESS; > - > - // > - // Walk the device type node > - // > - for (DevHandle = NULL; ; ) { > - Status = AcpiTableProtocol->GetChild(ChildHandle, &DevHandle); > - if (EFI_ERROR(Status) || DevHandle == NULL) > - break; > - > - // > - // Search for _HID with Device ID > - // > - Status = AcpiTableProtocol->GetOption(DevHandle, 0, &DataType, &Buffer, &DataSize); > - if (EFI_ERROR(Status)) > - break; > - > - Data = Buffer; > - DBG("Data Type 0x%02X %02X\n", Data[0], DataSize > 1 ? Data[1] : 0); > - if (DataSize == 1 && Data[0] == AML_NAME_OP) { > - Status = AcpiTableProtocol->GetOption(DevHandle, 1, &DataType, &Buffer, &DataSize); > - if (EFI_ERROR(Status)) > - break; > - > - Data = Buffer; > - if (DataType == EFI_ACPI_DATA_TYPE_NAME_STRING) { > - if (AsciiStrnCmp((CHAR8 *) Data, "_HID", 4) == 0) { > - EFI_ACPI_HANDLE ValueHandle; > - > - Status = AcpiTableProtocol->GetOption(DevHandle, 2, &DataType, &Buffer, &DataSize); > - if (EFI_ERROR(Status)) > - break; > - > - if (DataType != EFI_ACPI_DATA_TYPE_CHILD) > - continue; > - > - AcpiTableProtocol->Open((VOID *) Buffer, &ValueHandle); > - Status = AcpiTableProtocol->GetOption(ValueHandle, 1, &DataType, &Buffer, &DataSize); > - > - Data = Buffer; > - DBG("[%a:%d] - _HID = %a\n", __FUNCTION__, __LINE__, Data); > - > - if (EFI_ERROR(Status) || > - DataType != EFI_ACPI_DATA_TYPE_STRING) { > - AcpiTableProtocol->Close (ValueHandle); > - FoundDev = DsdtDeviceUnknown; > - continue; > - } > - > - HisiAcpiDevNotFound = TRUE; > - for (Index = 0; Index < ARRAY_SIZE (mHisiAcpiDevId); Index++) { > - if (AsciiStrCmp ((CHAR8 *)Data, mHisiAcpiDevId[Index]) == 0) { > - HisiAcpiDevNotFound = FALSE; > - break; > - } > - } > - if (HisiAcpiDevNotFound) { > - AcpiTableProtocol->Close (ValueHandle); > - FoundDev = DsdtDeviceUnknown; > - continue; > - } > - > - DBG("Found device\n"); > - AcpiTableProtocol->Close(ValueHandle); > - Status = GetDeviceInfo (AcpiTableProtocol, ChildHandle, &DevNextID, &FoundDev); > - if (EFI_ERROR (Status)) { > - continue; > - } > - } else if ((FoundDev != DsdtDeviceUnknown) && AsciiStrnCmp((CHAR8 *) Data, "_DSD", 4) == 0) { > - // > - // Patch DSD data > - // > - EFI_ACPI_HANDLE PkgHandle; > - Status = AcpiTableProtocol->GetOption(DevHandle, 2, &DataType, &Buffer, &DataSize); > - if (EFI_ERROR(Status)) > - break; > - > - if (DataType != EFI_ACPI_DATA_TYPE_CHILD) > - continue; > - > - // > - // Open package data > - // > - AcpiTableProtocol->Open((VOID *) Buffer, &PkgHandle); > - Status = AcpiTableProtocol->GetOption(PkgHandle, 0, &DataType, &Buffer, &DataSize); > - > - Data = Buffer; > - DBG("_DSD Subnode Store Op Code 0x%02X %02X\n", > - Data[0], DataSize > 1 ? Data[1] : 0); > - > - // > - // Walk the _DSD node > - // > - if (DataSize == 1 && Data[0] == AML_PACKAGE_OP) { > - Status = SearchReplacePackageAddress (AcpiTableProtocol, PkgHandle, DevNextID, FoundDev); > - } > - > - AcpiTableProtocol->Close(PkgHandle); > - } else if (AsciiStrnCmp ((CHAR8 *) Data, "_ADR", 4) == 0) { > - Status = AcpiTableProtocol->GetOption (DevHandle, 2, &DataType, &Buffer, &DataSize); > - if (EFI_ERROR (Status)) { > - break; > - } > - > - if (DataType != EFI_ACPI_DATA_TYPE_CHILD) { > - continue; > - } > - > - Status = GetDeviceInfo (AcpiTableProtocol, ChildHandle, &DevNextID, &FoundDev); > - > - if (EFI_ERROR (Status)) { > - continue; > - } > - } > - } > - } else if ((DataSize == 2) && (Data[0] == AML_EXT_OP) && (Data[1] == AML_EXT_DEVICE_OP)) { > - ProcessDSDTDevice (AcpiTableProtocol, DevHandle); > - } > - } > - > - return EFI_SUCCESS; > -} > - > - > -BOOLEAN > -IsSbScope ( > - EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, > - EFI_ACPI_HANDLE ChildHandle > - ) > -{ > - EFI_STATUS Status; > - EFI_ACPI_DATA_TYPE DataType; > - CONST UINT8 *Data; > - CONST VOID *Buffer; > - UINTN DataSize; > - > - Status = AcpiTableProtocol->GetOption (ChildHandle, 0, &DataType, &Buffer, &DataSize); > - if (EFI_ERROR(Status)) return FALSE; > - > - Data = Buffer; > - if (DataSize != 1 || Data[0] != AML_SCOPE_OP) { > - return FALSE; > - } > - > - return TRUE; > -} > - > -EFI_STATUS ProcessDSDTChild( > - EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, > - EFI_ACPI_HANDLE ChildHandle) > -{ > - EFI_STATUS Status; > - EFI_ACPI_HANDLE DevHandle; > - > - // Check Scope(_SB) at first > - if (!IsSbScope (AcpiTableProtocol, ChildHandle)) { > - return ProcessDSDTDevice (AcpiTableProtocol, ChildHandle); > - } > - > - for (DevHandle = NULL; ; ) { > - Status = AcpiTableProtocol->GetChild (ChildHandle, &DevHandle); > - if (EFI_ERROR(Status) || DevHandle == NULL) { > - break; > - } > - > - ProcessDSDTDevice (AcpiTableProtocol, DevHandle); > - } > - > - return EFI_SUCCESS; > -} > - > -static EFI_STATUS ProcessDSDT( > - EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, > - EFI_ACPI_HANDLE TableHandle) > -{ > - EFI_STATUS Status; > - EFI_ACPI_HANDLE ChildHandle; > - // > - // Parse table for device type > - DBG ("[%a:%d] - TableHandle=%p\n", __FUNCTION__, __LINE__, TableHandle); > - for (ChildHandle = NULL; ; ) { > - Status = AcpiTableProtocol->GetChild(TableHandle, &ChildHandle); > - DBG ("[%a:%d] - Child=%p, %r\n", __FUNCTION__, __LINE__, ChildHandle, Status); > - if (EFI_ERROR(Status)) > - break; > - if (ChildHandle == NULL) > - break; > - > - ProcessDSDTChild(AcpiTableProtocol, ChildHandle); > - } > - > - return EFI_SUCCESS; > -} > - > -STATIC > -VOID > -AcpiCheckSum ( > - IN OUT EFI_ACPI_SDT_HEADER *Table > - ) > -{ > - UINTN ChecksumOffset; > - UINT8 *Buffer; > - > - ChecksumOffset = OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, Checksum); > - Buffer = (UINT8 *)Table; > - > - // > - // set checksum to 0 first > - // > - Buffer[ChecksumOffset] = 0; > - > - // > - // Update checksum value > - // > - Buffer[ChecksumOffset] = CalculateCheckSum8 (Buffer, Table->Length); > -} > - > -EFI_STATUS UpdateAcpiDsdtTable(void) > -{ > - EFI_STATUS Status; > - EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol; > - EFI_ACPI_SDT_HEADER *Table; > - EFI_ACPI_TABLE_VERSION TableVersion; > - UINTN TableKey; > - EFI_ACPI_HANDLE TableHandle; > - UINTN i; > - > - DEBUG ((EFI_D_ERROR, "Updating Ethernet MAC in ACPI DSDT...\n")); > - > - // > - // Find the AcpiTable protocol > - Status = gBS->LocateProtocol(&gEfiAcpiSdtProtocolGuid, NULL, (VOID**) &AcpiTableProtocol); > - if (EFI_ERROR(Status)) { > - DBG("Unable to locate ACPI table protocol\n"); > - return EFI_SUCCESS; > - } > - > - // > - // Search for DSDT Table > - for (i = 0; i < EFI_ACPI_MAX_NUM_TABLES; i++) { > - Status = AcpiTableProtocol->GetAcpiTable(i, &Table, &TableVersion, &TableKey); > - if (EFI_ERROR(Status)) > - break; > - if (Table->Signature != DSDT_SIGNATURE) > - continue; > - > - Status = AcpiTableProtocol->OpenSdt(TableKey, &TableHandle); > - if (EFI_ERROR(Status)) > - break; > - > - ProcessDSDT(AcpiTableProtocol, TableHandle); > - > - AcpiTableProtocol->Close(TableHandle); > - AcpiCheckSum (Table); > - } > - > - return EFI_SUCCESS; > -} > diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h > deleted file mode 100644 > index a7e1eed..0000000 > --- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h > +++ /dev/null > @@ -1,16 +0,0 @@ > -/* > - * > - * Copyright (c) 2014, Applied Micro Circuits Corporation > - * Copyright (c) 2015, Hisilicon Limited. All rights reserved. > - * Copyright (c) 2015, Linaro Limited. All rights reserved. > - * Author: Loc Ho <lho@apm.com> > - * > - * SPDX-License-Identifier: BSD-2-Clause-Patent > - */ > -#ifndef _ETH_MAC_H_ > -#define _ETH_MAC_H_ > - > -EFI_STATUS UpdateAcpiDsdtTable (VOID); > - > -#endif > - > diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.c b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.c > new file mode 100644 > index 0000000..205f2f9 > --- /dev/null > +++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.c > @@ -0,0 +1,612 @@ > +/** @file > + > + Copyright (c) 2014 - 2020, Applied Micro Curcuit Corporation. All rights reserved.<BR> > + Copyright (c) 2015 - 2020, Hisilicon Limited. All rights reserved.<BR> > + Copyright (c) 2015 - 2020, Linaro Limited. All rights reserved.<BR> > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > + This driver is called to initialize the FW part of the PHY in preparation > + for the OS. > + > +**/ > + > +#include <Guid/ShellVariableGuid.h> > +#include <Library/UefiRuntimeServicesTableLib.h> > +#include <Library/DebugLib.h> > +#include <Library/TimerLib.h> > + > +#include <PiDxe.h> > +#include <Guid/EventGroup.h> > +#include <Protocol/AcpiTable.h> > +#include <Protocol/FirmwareVolume2.h> > +#include <Library/BaseLib.h> > +#include <Library/UefiBootServicesTableLib.h> > +#include <Protocol/AcpiSystemDescriptionTable.h> > +#include <Library/DebugLib.h> > +#include <Library/PcdLib.h> > +#include <Library/PrintLib.h> > +#include <Library/DebugLib.h> > +#include <Library/BaseMemoryLib.h> > +#include <Library/UefiRuntimeServicesTableLib.h> > +#include <IndustryStandard/Acpi.h> > +#include <IndustryStandard/AcpiAml.h> > +#include <Library/MemoryAllocationLib.h> > + > +#include <Protocol/HisiBoardNicProtocol.h> > + > +// Turn on debug message by enabling below define > +//#define ACPI_DEBUG > + > +#ifdef ACPI_DEBUG > +#define DBG(arg...) DEBUG((EFI_D_ERROR,## arg)) > +#else > +#define DBG(arg...) > +#endif > + > +#define EFI_ACPI_MAX_NUM_TABLES 20 > +#define DSDT_SIGNATURE 0x54445344 > + > +#define ACPI_ETH_MAC_KEY "local-mac-address" > +#define ACPI_ETH_SAS_KEY "sas-addr" > + > +#define PREFIX_VARIABLE_NAME L"MAC" > +#define PREFIX_VARIABLE_NAME_COMPAT L"RGMII_MAC" > +#define ADDRESS_MAX_LEN 30 > + > +CHAR8 *mHisiAcpiDevId[] = {"HISI00C1","HISI00C2","HISI0162"}; > + > +typedef enum { > + DsdtDeviceUnknown, > + DsdtDeviceLan, > + DsdtDeviceSas > +} DSDT_DEVICE_TYPE; > + > +EFI_STATUS GetEnvMac( > + IN UINTN MacNextID, > + IN OUT UINT8 *MacBuffer) > +{ > + EFI_MAC_ADDRESS Mac; > + EFI_STATUS Status; > + HISI_BOARD_NIC_PROTOCOL *OemNic = NULL; > + > + Status = gBS->LocateProtocol(&gHisiBoardNicProtocolGuid, NULL, (VOID **)&OemNic); > + if(EFI_ERROR(Status)) > + { > + DEBUG((EFI_D_ERROR, "[%a]:[%dL] LocateProtocol failed %r\n", __FUNCTION__, __LINE__, Status)); > + return Status; > + } > + > + Status = OemNic->GetMac(&Mac, MacNextID); > + if(EFI_ERROR(Status)) > + { > + DEBUG((EFI_D_ERROR, "[%a]:[%dL] GetMac failed %r\n", __FUNCTION__, __LINE__, Status)); > + return Status; > + } > + > + CopyMem (MacBuffer, &Mac, 6); > + DEBUG((EFI_D_ERROR, "Port %d MAC %02x:%02x:%02x:%02x:%02x:%02x\n", > + MacNextID, > + MacBuffer[0], > + MacBuffer[1], > + MacBuffer[2], > + MacBuffer[3], > + MacBuffer[4], > + MacBuffer[5] > + )); > + > + return EFI_SUCCESS; > +} > + > +EFI_STATUS GetSasAddress ( > + IN UINT8 Index, > + IN OUT UINT8 *SasAddrBuffer > + ) > +{ > + if (SasAddrBuffer == NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + SasAddrBuffer[0] = 0x50; > + SasAddrBuffer[1] = 0x01; > + SasAddrBuffer[2] = 0x88; > + SasAddrBuffer[3] = 0x20; > + SasAddrBuffer[4] = 0x16; > + SasAddrBuffer[5] = 0x00; > + SasAddrBuffer[6] = 0x00; > + SasAddrBuffer[7] = Index; > + > + return EFI_SUCCESS; > +} > + > +EFI_STATUS _SearchReplacePackageAddress( > + IN EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, > + IN EFI_ACPI_HANDLE ChildHandle, > + IN UINTN Level, > + IN OUT BOOLEAN *Found, > + IN UINTN DevNextID, > + IN DSDT_DEVICE_TYPE FoundDev > + ) > +{ > + // ASL template for ethernet driver: > +/* > + * Name (_DSD, Package () { > + * ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), > + * Package () { > + * Package (2) {"mac-address", Package (6) { 00, 11, 22, 33, 44, 55 }} > + * Package (2) {"phy-channel", 0}, > + * Package (2) {"phy-mode", "rgmii"}, > + * Package (2) {"max-transfer-unit", 0x5dc}, // MTU of 1500 > + * Package (2) {"max-speed", 0x3e8}, // 1000 Mbps > + * } > + * }) > + */ > + EFI_STATUS Status; > + EFI_ACPI_DATA_TYPE DataType; > + CONST UINT8 *Data; > + CONST VOID *Buffer; > + UINTN DataSize; > + UINTN Count; > + EFI_ACPI_HANDLE CurrentHandle; > + EFI_ACPI_HANDLE NextHandle; > + EFI_ACPI_HANDLE Level1Handle; > + UINT8 *AddressBuffer; > + UINT8 AddressByte = 0; > + > + DBG("In Level:%d\n", Level); > + Level1Handle = NULL; > + Status = EFI_SUCCESS; > + for (CurrentHandle = NULL; ;) { > + Status = AcpiTableProtocol->GetChild(ChildHandle, &CurrentHandle); > + if (Level == 1) { > + Level1Handle = CurrentHandle; > + } > + if (Level != 3 && (EFI_ERROR(Status) || CurrentHandle == NULL)) > + break; > + > + Status = AcpiTableProtocol->GetOption(CurrentHandle, 0, &DataType, &Buffer, &DataSize); > + Data = Buffer; > + DBG("_DSD Child Subnode Store Op Code 0x%02X 0x%02X %02X\n", > + DataSize, Data[0], DataSize > 1 ? Data[1] : 0); > + > + if (Level < 2 && Data[0] != AML_PACKAGE_OP) > + continue; > + > + if (Level == 2 && Data[0] == AML_STRING_PREFIX) { > + Status = AcpiTableProtocol->GetOption(CurrentHandle, 1, &DataType, &Buffer, &DataSize); > + if (EFI_ERROR(Status)) > + break; > + > + DBG(" _DSD Child Subnode Store Op Code 0x%02X 0x%02X %02X\n", > + DataSize, Data[0], DataSize > 1 ? Data[1] : 0); > + > + Data = Buffer; > + if ((DataType != EFI_ACPI_DATA_TYPE_STRING) || > + ((AsciiStrCmp ((CHAR8 *) Data, ACPI_ETH_MAC_KEY) != 0) && > + (AsciiStrCmp ((CHAR8 *) Data, ACPI_ETH_SAS_KEY) != 0))) { > + ChildHandle = Level1Handle; > + continue; > + } > + > + DBG("_DSD Key Type %d. Found address key\n", DataType); > + > + // > + // We found the node. > + // > + *Found = TRUE; > + continue; > + } > + > + if (Level == 3 && *Found) { > + AddressBuffer = AllocateZeroPool (ADDRESS_MAX_LEN); > + if (AddressBuffer == NULL) { > + DEBUG ((DEBUG_ERROR, "%a:%d AllocateZeroPool failed\n", __FILE__, __LINE__)); > + return EFI_OUT_OF_RESOURCES; > + } > + > + switch (FoundDev) { > + case DsdtDeviceLan: > + //Update the MAC > + Status = GetEnvMac (DevNextID, AddressBuffer); > + AddressByte = 6; > + break; > + case DsdtDeviceSas: > + //Update SAS Address. > + Status = GetSasAddress (DevNextID, AddressBuffer); > + AddressByte = 8; > + break; > + default: > + Status = EFI_INVALID_PARAMETER; > + } > + if (EFI_ERROR (Status)) { > + FreePool (AddressBuffer); > + AddressBuffer = NULL; > + break; > + } > + > + for (Count = 0; Count < AddressByte; Count++) { > + Status = AcpiTableProtocol->GetOption(CurrentHandle, 1, &DataType, &Buffer, &DataSize); > + if (EFI_ERROR(Status)) > + break; > + > + Data = Buffer; > + DBG(" _DSD Child Subnode Store Op Code 0x%02X 0x%02X %02X DataType 0x%X\n", > + DataSize, Data[0], DataSize > 1 ? Data[1] : 0, DataType); > + > + if (DataType != EFI_ACPI_DATA_TYPE_UINT) > + break; > + > + // only need one byte. > + // FIXME: Assume the CPU is little endian > + Status = AcpiTableProtocol->SetOption (CurrentHandle, 1, AddressBuffer + Count, sizeof(UINT8)); > + if (EFI_ERROR(Status)) > + break; > + Status = AcpiTableProtocol->GetChild(ChildHandle, &CurrentHandle); > + if (EFI_ERROR(Status) || CurrentHandle == NULL) > + break; > + } > + FreePool (AddressBuffer); > + AddressBuffer = NULL; > + break; > + } > + > + if (Level > 3) > + break; > + > + //Search next package > + AcpiTableProtocol->Open((VOID *) Buffer, &NextHandle); > + Status = _SearchReplacePackageAddress( > + AcpiTableProtocol, > + NextHandle, > + Level + 1, > + Found, > + DevNextID, > + FoundDev); > + AcpiTableProtocol->Close(NextHandle); > + if (!EFI_ERROR(Status)) > + break; > + } > + > + return Status; > +} > + > +EFI_STATUS SearchReplacePackageAddress( > + IN EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, > + IN EFI_ACPI_HANDLE ChildHandle, > + IN UINTN DevNextID, > + IN DSDT_DEVICE_TYPE FoundDev > + ) > +{ > + BOOLEAN Found = FALSE; > + UINTN Level = 0; > + > + return _SearchReplacePackageAddress(AcpiTableProtocol, ChildHandle, Level, > + &Found, DevNextID, FoundDev); > +} > + > +EFI_STATUS > +GetDeviceInfo ( > + EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, > + EFI_ACPI_HANDLE ChildHandle, > + UINTN *DevID, > + DSDT_DEVICE_TYPE *FoundDev > + ) > +{ > + EFI_STATUS Status; > + EFI_ACPI_DATA_TYPE DataType; > + CHAR8 Data[5]; > + CONST VOID *Buffer; > + UINTN DataSize; > + > + // Get NameString > + Status = AcpiTableProtocol->GetOption (ChildHandle, 1, &DataType, &Buffer, &DataSize); > + if (EFI_ERROR (Status)) { > + DEBUG ((EFI_D_ERROR, "[%a:%d] Get NameString failed: %r\n", __FUNCTION__, __LINE__, Status)); > + return Status; > + } > + > + CopyMem (Data, Buffer, 4); > + DBG("Size %p Data %02x %02x %02x %02x\n", DataSize, Data[0], Data[1], Data[2], Data[3]); > + > + Data[4] = '\0'; > + if ((DataSize != 4) || > + (Data[3] > '9' || Data[3] < '0')) { > + DEBUG ((DEBUG_ERROR, "The NameString %a is not ETHn or SASn\n", Data)); > + return EFI_INVALID_PARAMETER; > + } > + > + if (AsciiStrnCmp ("ETH", Data, 3) == 0) { > + *FoundDev = DsdtDeviceLan; > + } else if (AsciiStrnCmp ("SAS", Data, 3) == 0) { > + *FoundDev = DsdtDeviceSas; > + } else { > + DEBUG ((DEBUG_ERROR, "[%a:%d] The NameString %a is not ETHn or SASn\n", > + __FUNCTION__, __LINE__, Data)); > + return EFI_INVALID_PARAMETER; > + } > + > + *DevID = Data[3] - '0'; > + return EFI_SUCCESS; > +} > + > +EFI_STATUS ProcessDSDTDevice ( > + EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, > + EFI_ACPI_HANDLE ChildHandle) > +{ > + EFI_STATUS Status; > + EFI_ACPI_DATA_TYPE DataType; > + CONST UINT8 *Data; > + CONST VOID *Buffer; > + UINTN DataSize; > + EFI_ACPI_HANDLE DevHandle; > + DSDT_DEVICE_TYPE FoundDev = DsdtDeviceUnknown; > + UINTN DevNextID; > + BOOLEAN HisiAcpiDevNotFound; > + UINTN Index; > + > + Status = AcpiTableProtocol->GetOption(ChildHandle, 0, &DataType, &Buffer, &DataSize); > + if (EFI_ERROR(Status)) > + return EFI_SUCCESS; > + > + Data = Buffer; > + // > + // Skip all non-device type > + // > + if (DataSize != 2 || Data[0] != AML_EXT_OP || Data[1] != AML_EXT_DEVICE_OP) > + return EFI_SUCCESS; > + > + // > + // Walk the device type node > + // > + for (DevHandle = NULL; ; ) { > + Status = AcpiTableProtocol->GetChild(ChildHandle, &DevHandle); > + if (EFI_ERROR(Status) || DevHandle == NULL) > + break; > + > + // > + // Search for _HID with Device ID > + // > + Status = AcpiTableProtocol->GetOption(DevHandle, 0, &DataType, &Buffer, &DataSize); > + if (EFI_ERROR(Status)) > + break; > + > + Data = Buffer; > + DBG("Data Type 0x%02X %02X\n", Data[0], DataSize > 1 ? Data[1] : 0); > + if (DataSize == 1 && Data[0] == AML_NAME_OP) { > + Status = AcpiTableProtocol->GetOption(DevHandle, 1, &DataType, &Buffer, &DataSize); > + if (EFI_ERROR(Status)) > + break; > + > + Data = Buffer; > + if (DataType == EFI_ACPI_DATA_TYPE_NAME_STRING) { > + if (AsciiStrnCmp((CHAR8 *) Data, "_HID", 4) == 0) { > + EFI_ACPI_HANDLE ValueHandle; > + > + Status = AcpiTableProtocol->GetOption(DevHandle, 2, &DataType, &Buffer, &DataSize); > + if (EFI_ERROR(Status)) > + break; > + > + if (DataType != EFI_ACPI_DATA_TYPE_CHILD) > + continue; > + > + AcpiTableProtocol->Open((VOID *) Buffer, &ValueHandle); > + Status = AcpiTableProtocol->GetOption(ValueHandle, 1, &DataType, &Buffer, &DataSize); > + > + Data = Buffer; > + DBG("[%a:%d] - _HID = %a\n", __FUNCTION__, __LINE__, Data); > + > + if (EFI_ERROR(Status) || > + DataType != EFI_ACPI_DATA_TYPE_STRING) { > + AcpiTableProtocol->Close (ValueHandle); > + FoundDev = DsdtDeviceUnknown; > + continue; > + } > + > + HisiAcpiDevNotFound = TRUE; > + for (Index = 0; Index < ARRAY_SIZE (mHisiAcpiDevId); Index++) { > + if (AsciiStrCmp ((CHAR8 *)Data, mHisiAcpiDevId[Index]) == 0) { > + HisiAcpiDevNotFound = FALSE; > + break; > + } > + } > + if (HisiAcpiDevNotFound) { > + AcpiTableProtocol->Close (ValueHandle); > + FoundDev = DsdtDeviceUnknown; > + continue; > + } > + > + DBG("Found device\n"); > + AcpiTableProtocol->Close(ValueHandle); > + Status = GetDeviceInfo (AcpiTableProtocol, ChildHandle, &DevNextID, &FoundDev); > + if (EFI_ERROR (Status)) { > + continue; > + } > + } else if ((FoundDev != DsdtDeviceUnknown) && AsciiStrnCmp((CHAR8 *) Data, "_DSD", 4) == 0) { > + // > + // Patch DSD data > + // > + EFI_ACPI_HANDLE PkgHandle; > + Status = AcpiTableProtocol->GetOption(DevHandle, 2, &DataType, &Buffer, &DataSize); > + if (EFI_ERROR(Status)) > + break; > + > + if (DataType != EFI_ACPI_DATA_TYPE_CHILD) > + continue; > + > + // > + // Open package data > + // > + AcpiTableProtocol->Open((VOID *) Buffer, &PkgHandle); > + Status = AcpiTableProtocol->GetOption(PkgHandle, 0, &DataType, &Buffer, &DataSize); > + > + Data = Buffer; > + DBG("_DSD Subnode Store Op Code 0x%02X %02X\n", > + Data[0], DataSize > 1 ? Data[1] : 0); > + > + // > + // Walk the _DSD node > + // > + if (DataSize == 1 && Data[0] == AML_PACKAGE_OP) { > + Status = SearchReplacePackageAddress (AcpiTableProtocol, PkgHandle, DevNextID, FoundDev); > + } > + > + AcpiTableProtocol->Close(PkgHandle); > + } else if (AsciiStrnCmp ((CHAR8 *) Data, "_ADR", 4) == 0) { > + Status = AcpiTableProtocol->GetOption (DevHandle, 2, &DataType, &Buffer, &DataSize); > + if (EFI_ERROR (Status)) { > + break; > + } > + > + if (DataType != EFI_ACPI_DATA_TYPE_CHILD) { > + continue; > + } > + > + Status = GetDeviceInfo (AcpiTableProtocol, ChildHandle, &DevNextID, &FoundDev); > + > + if (EFI_ERROR (Status)) { > + continue; > + } > + } > + } > + } else if ((DataSize == 2) && (Data[0] == AML_EXT_OP) && (Data[1] == AML_EXT_DEVICE_OP)) { > + ProcessDSDTDevice (AcpiTableProtocol, DevHandle); > + } > + } > + > + return EFI_SUCCESS; > +} > + > + > +BOOLEAN > +IsSbScope ( > + EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, > + EFI_ACPI_HANDLE ChildHandle > + ) > +{ > + EFI_STATUS Status; > + EFI_ACPI_DATA_TYPE DataType; > + CONST UINT8 *Data; > + CONST VOID *Buffer; > + UINTN DataSize; > + > + Status = AcpiTableProtocol->GetOption (ChildHandle, 0, &DataType, &Buffer, &DataSize); > + if (EFI_ERROR(Status)) return FALSE; > + > + Data = Buffer; > + if (DataSize != 1 || Data[0] != AML_SCOPE_OP) { > + return FALSE; > + } > + > + return TRUE; > +} > + > +EFI_STATUS ProcessDSDTChild( > + EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, > + EFI_ACPI_HANDLE ChildHandle) > +{ > + EFI_STATUS Status; > + EFI_ACPI_HANDLE DevHandle; > + > + // Check Scope(_SB) at first > + if (!IsSbScope (AcpiTableProtocol, ChildHandle)) { > + return ProcessDSDTDevice (AcpiTableProtocol, ChildHandle); > + } > + > + for (DevHandle = NULL; ; ) { > + Status = AcpiTableProtocol->GetChild (ChildHandle, &DevHandle); > + if (EFI_ERROR(Status) || DevHandle == NULL) { > + break; > + } > + > + ProcessDSDTDevice (AcpiTableProtocol, DevHandle); > + } > + > + return EFI_SUCCESS; > +} > + > +static EFI_STATUS ProcessDSDT( > + EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, > + EFI_ACPI_HANDLE TableHandle) > +{ > + EFI_STATUS Status; > + EFI_ACPI_HANDLE ChildHandle; > + // > + // Parse table for device type > + DBG ("[%a:%d] - TableHandle=%p\n", __FUNCTION__, __LINE__, TableHandle); > + for (ChildHandle = NULL; ; ) { > + Status = AcpiTableProtocol->GetChild(TableHandle, &ChildHandle); > + DBG ("[%a:%d] - Child=%p, %r\n", __FUNCTION__, __LINE__, ChildHandle, Status); > + if (EFI_ERROR(Status)) > + break; > + if (ChildHandle == NULL) > + break; > + > + ProcessDSDTChild(AcpiTableProtocol, ChildHandle); > + } > + > + return EFI_SUCCESS; > +} > + > +STATIC > +VOID > +AcpiCheckSum ( > + IN OUT EFI_ACPI_SDT_HEADER *Table > + ) > +{ > + UINTN ChecksumOffset; > + UINT8 *Buffer; > + > + ChecksumOffset = OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, Checksum); > + Buffer = (UINT8 *)Table; > + > + // > + // set checksum to 0 first > + // > + Buffer[ChecksumOffset] = 0; > + > + // > + // Update checksum value > + // > + Buffer[ChecksumOffset] = CalculateCheckSum8 (Buffer, Table->Length); > +} > + > +EFI_STATUS UpdateAcpiDsdtTable(void) > +{ > + EFI_STATUS Status; > + EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol; > + EFI_ACPI_SDT_HEADER *Table; > + EFI_ACPI_TABLE_VERSION TableVersion; > + UINTN TableKey; > + EFI_ACPI_HANDLE TableHandle; > + UINTN i; > + > + DEBUG ((EFI_D_ERROR, "Updating Ethernet MAC in ACPI DSDT...\n")); > + > + // > + // Find the AcpiTable protocol > + Status = gBS->LocateProtocol(&gEfiAcpiSdtProtocolGuid, NULL, (VOID**) &AcpiTableProtocol); > + if (EFI_ERROR(Status)) { > + DBG("Unable to locate ACPI table protocol\n"); > + return EFI_SUCCESS; > + } > + > + // > + // Search for DSDT Table > + for (i = 0; i < EFI_ACPI_MAX_NUM_TABLES; i++) { > + Status = AcpiTableProtocol->GetAcpiTable(i, &Table, &TableVersion, &TableKey); > + if (EFI_ERROR(Status)) > + break; > + if (Table->Signature != DSDT_SIGNATURE) > + continue; > + > + Status = AcpiTableProtocol->OpenSdt(TableKey, &TableHandle); > + if (EFI_ERROR(Status)) > + break; > + > + ProcessDSDT(AcpiTableProtocol, TableHandle); > + > + AcpiTableProtocol->Close(TableHandle); > + AcpiCheckSum (Table); > + } > + > + return EFI_SUCCESS; > +} > diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.h b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.h > new file mode 100644 > index 0000000..a7e1eed > --- /dev/null > +++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.h > @@ -0,0 +1,16 @@ > +/* > + * > + * Copyright (c) 2014, Applied Micro Circuits Corporation > + * Copyright (c) 2015, Hisilicon Limited. All rights reserved. > + * Copyright (c) 2015, Linaro Limited. All rights reserved. > + * Author: Loc Ho <lho@apm.com> > + * > + * SPDX-License-Identifier: BSD-2-Clause-Patent > + */ > +#ifndef _ETH_MAC_H_ > +#define _ETH_MAC_H_ > + > +EFI_STATUS UpdateAcpiDsdtTable (VOID); > + > +#endif > + > -- > 2.8.1 > ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [RFC edk2-platforms v1 3/3] Silicon/Hisilicon: Rename EthMac files 2020-05-26 18:50 ` Leif Lindholm @ 2020-05-27 14:22 ` Ming Huang 0 siblings, 0 replies; 12+ messages in thread From: Ming Huang @ 2020-05-27 14:22 UTC (permalink / raw) To: Leif Lindholm Cc: devel, ard.biesheuvel, lidongzhan, songdongkuang, wanghuiqiang, qiuliangen 在 2020/5/27 2:50, Leif Lindholm 写道: > On Thu, May 21, 2020 at 22:43:04 +0800, Ming Huang wrote: >> As not only update mac address feature in EthMac files, so rename >> them to UpdateDsdt. >> >> Signed-off-by: Ming Huang <huangming23@huawei.com> >> --- >> Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c | 2 +- >> Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf | 8 +- >> Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c | 612 -------------------- >> Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h | 16 - >> Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.c | 612 ++++++++++++++++++++ >> Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.h | 16 + >> 6 files changed, 633 insertions(+), 633 deletions(-) >> >> diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c >> index d3ea051..fd67677 100644 >> --- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c >> +++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c >> @@ -21,7 +21,7 @@ >> #include <Library/UefiRuntimeServicesTableLib.h> >> #include <IndustryStandard/Acpi.h> >> #include <IndustryStandard/AcpiAml.h> >> -#include "EthMac.h" >> +#include "UpdateDsdt.h" >> >> EFI_EVENT mUpdateAcpiDsdtTableEvent; >> >> diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf >> index 53da731..a2b669d 100644 >> --- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf >> +++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf >> @@ -1,8 +1,8 @@ >> ## @file >> # >> -# Copyright (c) 2014, Applied Micro Curcuit Corp. All rights reserved.<BR> >> -# Copyright (c) 2015, Hisilicon Limited. All rights reserved.<BR> >> -# Copyright (c) 2015, Linaro Limited. All rights reserved.<BR> >> +# Copyright (c) 2014 - 2020, Applied Micro Curcuit Corp. All rights reserved.<BR> >> +# Copyright (c) 2015 - 2020, Hisilicon Limited. All rights reserved.<BR> >> +# Copyright (c) 2015 - 2020, Linaro Limited. All rights reserved.<BR> > > Same comment on copyright as on 1/3 and 2/3. Modify it in v2. Thanks, Ming > > / > Leif > >> # SPDX-License-Identifier: BSD-2-Clause-Patent >> # >> ## >> @@ -18,7 +18,7 @@ >> >> [Sources] >> AcpiPlatform.c >> - EthMac.c >> + UpdateDsdt.c >> >> [Packages] >> MdePkg/MdePkg.dec >> diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c >> deleted file mode 100644 >> index 205f2f9..0000000 >> --- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c >> +++ /dev/null >> @@ -1,612 +0,0 @@ >> -/** @file >> - >> - Copyright (c) 2014 - 2020, Applied Micro Curcuit Corporation. All rights reserved.<BR> >> - Copyright (c) 2015 - 2020, Hisilicon Limited. All rights reserved.<BR> >> - Copyright (c) 2015 - 2020, Linaro Limited. All rights reserved.<BR> >> - SPDX-License-Identifier: BSD-2-Clause-Patent >> - >> - This driver is called to initialize the FW part of the PHY in preparation >> - for the OS. >> - >> -**/ >> - >> -#include <Guid/ShellVariableGuid.h> >> -#include <Library/UefiRuntimeServicesTableLib.h> >> -#include <Library/DebugLib.h> >> -#include <Library/TimerLib.h> >> - >> -#include <PiDxe.h> >> -#include <Guid/EventGroup.h> >> -#include <Protocol/AcpiTable.h> >> -#include <Protocol/FirmwareVolume2.h> >> -#include <Library/BaseLib.h> >> -#include <Library/UefiBootServicesTableLib.h> >> -#include <Protocol/AcpiSystemDescriptionTable.h> >> -#include <Library/DebugLib.h> >> -#include <Library/PcdLib.h> >> -#include <Library/PrintLib.h> >> -#include <Library/DebugLib.h> >> -#include <Library/BaseMemoryLib.h> >> -#include <Library/UefiRuntimeServicesTableLib.h> >> -#include <IndustryStandard/Acpi.h> >> -#include <IndustryStandard/AcpiAml.h> >> -#include <Library/MemoryAllocationLib.h> >> - >> -#include <Protocol/HisiBoardNicProtocol.h> >> - >> -// Turn on debug message by enabling below define >> -//#define ACPI_DEBUG >> - >> -#ifdef ACPI_DEBUG >> -#define DBG(arg...) DEBUG((EFI_D_ERROR,## arg)) >> -#else >> -#define DBG(arg...) >> -#endif >> - >> -#define EFI_ACPI_MAX_NUM_TABLES 20 >> -#define DSDT_SIGNATURE 0x54445344 >> - >> -#define ACPI_ETH_MAC_KEY "local-mac-address" >> -#define ACPI_ETH_SAS_KEY "sas-addr" >> - >> -#define PREFIX_VARIABLE_NAME L"MAC" >> -#define PREFIX_VARIABLE_NAME_COMPAT L"RGMII_MAC" >> -#define ADDRESS_MAX_LEN 30 >> - >> -CHAR8 *mHisiAcpiDevId[] = {"HISI00C1","HISI00C2","HISI0162"}; >> - >> -typedef enum { >> - DsdtDeviceUnknown, >> - DsdtDeviceLan, >> - DsdtDeviceSas >> -} DSDT_DEVICE_TYPE; >> - >> -EFI_STATUS GetEnvMac( >> - IN UINTN MacNextID, >> - IN OUT UINT8 *MacBuffer) >> -{ >> - EFI_MAC_ADDRESS Mac; >> - EFI_STATUS Status; >> - HISI_BOARD_NIC_PROTOCOL *OemNic = NULL; >> - >> - Status = gBS->LocateProtocol(&gHisiBoardNicProtocolGuid, NULL, (VOID **)&OemNic); >> - if(EFI_ERROR(Status)) >> - { >> - DEBUG((EFI_D_ERROR, "[%a]:[%dL] LocateProtocol failed %r\n", __FUNCTION__, __LINE__, Status)); >> - return Status; >> - } >> - >> - Status = OemNic->GetMac(&Mac, MacNextID); >> - if(EFI_ERROR(Status)) >> - { >> - DEBUG((EFI_D_ERROR, "[%a]:[%dL] GetMac failed %r\n", __FUNCTION__, __LINE__, Status)); >> - return Status; >> - } >> - >> - CopyMem (MacBuffer, &Mac, 6); >> - DEBUG((EFI_D_ERROR, "Port %d MAC %02x:%02x:%02x:%02x:%02x:%02x\n", >> - MacNextID, >> - MacBuffer[0], >> - MacBuffer[1], >> - MacBuffer[2], >> - MacBuffer[3], >> - MacBuffer[4], >> - MacBuffer[5] >> - )); >> - >> - return EFI_SUCCESS; >> -} >> - >> -EFI_STATUS GetSasAddress ( >> - IN UINT8 Index, >> - IN OUT UINT8 *SasAddrBuffer >> - ) >> -{ >> - if (SasAddrBuffer == NULL) { >> - return EFI_INVALID_PARAMETER; >> - } >> - >> - SasAddrBuffer[0] = 0x50; >> - SasAddrBuffer[1] = 0x01; >> - SasAddrBuffer[2] = 0x88; >> - SasAddrBuffer[3] = 0x20; >> - SasAddrBuffer[4] = 0x16; >> - SasAddrBuffer[5] = 0x00; >> - SasAddrBuffer[6] = 0x00; >> - SasAddrBuffer[7] = Index; >> - >> - return EFI_SUCCESS; >> -} >> - >> -EFI_STATUS _SearchReplacePackageAddress( >> - IN EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, >> - IN EFI_ACPI_HANDLE ChildHandle, >> - IN UINTN Level, >> - IN OUT BOOLEAN *Found, >> - IN UINTN DevNextID, >> - IN DSDT_DEVICE_TYPE FoundDev >> - ) >> -{ >> - // ASL template for ethernet driver: >> -/* >> - * Name (_DSD, Package () { >> - * ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), >> - * Package () { >> - * Package (2) {"mac-address", Package (6) { 00, 11, 22, 33, 44, 55 }} >> - * Package (2) {"phy-channel", 0}, >> - * Package (2) {"phy-mode", "rgmii"}, >> - * Package (2) {"max-transfer-unit", 0x5dc}, // MTU of 1500 >> - * Package (2) {"max-speed", 0x3e8}, // 1000 Mbps >> - * } >> - * }) >> - */ >> - EFI_STATUS Status; >> - EFI_ACPI_DATA_TYPE DataType; >> - CONST UINT8 *Data; >> - CONST VOID *Buffer; >> - UINTN DataSize; >> - UINTN Count; >> - EFI_ACPI_HANDLE CurrentHandle; >> - EFI_ACPI_HANDLE NextHandle; >> - EFI_ACPI_HANDLE Level1Handle; >> - UINT8 *AddressBuffer; >> - UINT8 AddressByte = 0; >> - >> - DBG("In Level:%d\n", Level); >> - Level1Handle = NULL; >> - Status = EFI_SUCCESS; >> - for (CurrentHandle = NULL; ;) { >> - Status = AcpiTableProtocol->GetChild(ChildHandle, &CurrentHandle); >> - if (Level == 1) { >> - Level1Handle = CurrentHandle; >> - } >> - if (Level != 3 && (EFI_ERROR(Status) || CurrentHandle == NULL)) >> - break; >> - >> - Status = AcpiTableProtocol->GetOption(CurrentHandle, 0, &DataType, &Buffer, &DataSize); >> - Data = Buffer; >> - DBG("_DSD Child Subnode Store Op Code 0x%02X 0x%02X %02X\n", >> - DataSize, Data[0], DataSize > 1 ? Data[1] : 0); >> - >> - if (Level < 2 && Data[0] != AML_PACKAGE_OP) >> - continue; >> - >> - if (Level == 2 && Data[0] == AML_STRING_PREFIX) { >> - Status = AcpiTableProtocol->GetOption(CurrentHandle, 1, &DataType, &Buffer, &DataSize); >> - if (EFI_ERROR(Status)) >> - break; >> - >> - DBG(" _DSD Child Subnode Store Op Code 0x%02X 0x%02X %02X\n", >> - DataSize, Data[0], DataSize > 1 ? Data[1] : 0); >> - >> - Data = Buffer; >> - if ((DataType != EFI_ACPI_DATA_TYPE_STRING) || >> - ((AsciiStrCmp ((CHAR8 *) Data, ACPI_ETH_MAC_KEY) != 0) && >> - (AsciiStrCmp ((CHAR8 *) Data, ACPI_ETH_SAS_KEY) != 0))) { >> - ChildHandle = Level1Handle; >> - continue; >> - } >> - >> - DBG("_DSD Key Type %d. Found address key\n", DataType); >> - >> - // >> - // We found the node. >> - // >> - *Found = TRUE; >> - continue; >> - } >> - >> - if (Level == 3 && *Found) { >> - AddressBuffer = AllocateZeroPool (ADDRESS_MAX_LEN); >> - if (AddressBuffer == NULL) { >> - DEBUG ((DEBUG_ERROR, "%a:%d AllocateZeroPool failed\n", __FILE__, __LINE__)); >> - return EFI_OUT_OF_RESOURCES; >> - } >> - >> - switch (FoundDev) { >> - case DsdtDeviceLan: >> - //Update the MAC >> - Status = GetEnvMac (DevNextID, AddressBuffer); >> - AddressByte = 6; >> - break; >> - case DsdtDeviceSas: >> - //Update SAS Address. >> - Status = GetSasAddress (DevNextID, AddressBuffer); >> - AddressByte = 8; >> - break; >> - default: >> - Status = EFI_INVALID_PARAMETER; >> - } >> - if (EFI_ERROR (Status)) { >> - FreePool (AddressBuffer); >> - AddressBuffer = NULL; >> - break; >> - } >> - >> - for (Count = 0; Count < AddressByte; Count++) { >> - Status = AcpiTableProtocol->GetOption(CurrentHandle, 1, &DataType, &Buffer, &DataSize); >> - if (EFI_ERROR(Status)) >> - break; >> - >> - Data = Buffer; >> - DBG(" _DSD Child Subnode Store Op Code 0x%02X 0x%02X %02X DataType 0x%X\n", >> - DataSize, Data[0], DataSize > 1 ? Data[1] : 0, DataType); >> - >> - if (DataType != EFI_ACPI_DATA_TYPE_UINT) >> - break; >> - >> - // only need one byte. >> - // FIXME: Assume the CPU is little endian >> - Status = AcpiTableProtocol->SetOption (CurrentHandle, 1, AddressBuffer + Count, sizeof(UINT8)); >> - if (EFI_ERROR(Status)) >> - break; >> - Status = AcpiTableProtocol->GetChild(ChildHandle, &CurrentHandle); >> - if (EFI_ERROR(Status) || CurrentHandle == NULL) >> - break; >> - } >> - FreePool (AddressBuffer); >> - AddressBuffer = NULL; >> - break; >> - } >> - >> - if (Level > 3) >> - break; >> - >> - //Search next package >> - AcpiTableProtocol->Open((VOID *) Buffer, &NextHandle); >> - Status = _SearchReplacePackageAddress( >> - AcpiTableProtocol, >> - NextHandle, >> - Level + 1, >> - Found, >> - DevNextID, >> - FoundDev); >> - AcpiTableProtocol->Close(NextHandle); >> - if (!EFI_ERROR(Status)) >> - break; >> - } >> - >> - return Status; >> -} >> - >> -EFI_STATUS SearchReplacePackageAddress( >> - IN EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, >> - IN EFI_ACPI_HANDLE ChildHandle, >> - IN UINTN DevNextID, >> - IN DSDT_DEVICE_TYPE FoundDev >> - ) >> -{ >> - BOOLEAN Found = FALSE; >> - UINTN Level = 0; >> - >> - return _SearchReplacePackageAddress(AcpiTableProtocol, ChildHandle, Level, >> - &Found, DevNextID, FoundDev); >> -} >> - >> -EFI_STATUS >> -GetDeviceInfo ( >> - EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, >> - EFI_ACPI_HANDLE ChildHandle, >> - UINTN *DevID, >> - DSDT_DEVICE_TYPE *FoundDev >> - ) >> -{ >> - EFI_STATUS Status; >> - EFI_ACPI_DATA_TYPE DataType; >> - CHAR8 Data[5]; >> - CONST VOID *Buffer; >> - UINTN DataSize; >> - >> - // Get NameString >> - Status = AcpiTableProtocol->GetOption (ChildHandle, 1, &DataType, &Buffer, &DataSize); >> - if (EFI_ERROR (Status)) { >> - DEBUG ((EFI_D_ERROR, "[%a:%d] Get NameString failed: %r\n", __FUNCTION__, __LINE__, Status)); >> - return Status; >> - } >> - >> - CopyMem (Data, Buffer, 4); >> - DBG("Size %p Data %02x %02x %02x %02x\n", DataSize, Data[0], Data[1], Data[2], Data[3]); >> - >> - Data[4] = '\0'; >> - if ((DataSize != 4) || >> - (Data[3] > '9' || Data[3] < '0')) { >> - DEBUG ((DEBUG_ERROR, "The NameString %a is not ETHn or SASn\n", Data)); >> - return EFI_INVALID_PARAMETER; >> - } >> - >> - if (AsciiStrnCmp ("ETH", Data, 3) == 0) { >> - *FoundDev = DsdtDeviceLan; >> - } else if (AsciiStrnCmp ("SAS", Data, 3) == 0) { >> - *FoundDev = DsdtDeviceSas; >> - } else { >> - DEBUG ((DEBUG_ERROR, "[%a:%d] The NameString %a is not ETHn or SASn\n", >> - __FUNCTION__, __LINE__, Data)); >> - return EFI_INVALID_PARAMETER; >> - } >> - >> - *DevID = Data[3] - '0'; >> - return EFI_SUCCESS; >> -} >> - >> -EFI_STATUS ProcessDSDTDevice ( >> - EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, >> - EFI_ACPI_HANDLE ChildHandle) >> -{ >> - EFI_STATUS Status; >> - EFI_ACPI_DATA_TYPE DataType; >> - CONST UINT8 *Data; >> - CONST VOID *Buffer; >> - UINTN DataSize; >> - EFI_ACPI_HANDLE DevHandle; >> - DSDT_DEVICE_TYPE FoundDev = DsdtDeviceUnknown; >> - UINTN DevNextID; >> - BOOLEAN HisiAcpiDevNotFound; >> - UINTN Index; >> - >> - Status = AcpiTableProtocol->GetOption(ChildHandle, 0, &DataType, &Buffer, &DataSize); >> - if (EFI_ERROR(Status)) >> - return EFI_SUCCESS; >> - >> - Data = Buffer; >> - // >> - // Skip all non-device type >> - // >> - if (DataSize != 2 || Data[0] != AML_EXT_OP || Data[1] != AML_EXT_DEVICE_OP) >> - return EFI_SUCCESS; >> - >> - // >> - // Walk the device type node >> - // >> - for (DevHandle = NULL; ; ) { >> - Status = AcpiTableProtocol->GetChild(ChildHandle, &DevHandle); >> - if (EFI_ERROR(Status) || DevHandle == NULL) >> - break; >> - >> - // >> - // Search for _HID with Device ID >> - // >> - Status = AcpiTableProtocol->GetOption(DevHandle, 0, &DataType, &Buffer, &DataSize); >> - if (EFI_ERROR(Status)) >> - break; >> - >> - Data = Buffer; >> - DBG("Data Type 0x%02X %02X\n", Data[0], DataSize > 1 ? Data[1] : 0); >> - if (DataSize == 1 && Data[0] == AML_NAME_OP) { >> - Status = AcpiTableProtocol->GetOption(DevHandle, 1, &DataType, &Buffer, &DataSize); >> - if (EFI_ERROR(Status)) >> - break; >> - >> - Data = Buffer; >> - if (DataType == EFI_ACPI_DATA_TYPE_NAME_STRING) { >> - if (AsciiStrnCmp((CHAR8 *) Data, "_HID", 4) == 0) { >> - EFI_ACPI_HANDLE ValueHandle; >> - >> - Status = AcpiTableProtocol->GetOption(DevHandle, 2, &DataType, &Buffer, &DataSize); >> - if (EFI_ERROR(Status)) >> - break; >> - >> - if (DataType != EFI_ACPI_DATA_TYPE_CHILD) >> - continue; >> - >> - AcpiTableProtocol->Open((VOID *) Buffer, &ValueHandle); >> - Status = AcpiTableProtocol->GetOption(ValueHandle, 1, &DataType, &Buffer, &DataSize); >> - >> - Data = Buffer; >> - DBG("[%a:%d] - _HID = %a\n", __FUNCTION__, __LINE__, Data); >> - >> - if (EFI_ERROR(Status) || >> - DataType != EFI_ACPI_DATA_TYPE_STRING) { >> - AcpiTableProtocol->Close (ValueHandle); >> - FoundDev = DsdtDeviceUnknown; >> - continue; >> - } >> - >> - HisiAcpiDevNotFound = TRUE; >> - for (Index = 0; Index < ARRAY_SIZE (mHisiAcpiDevId); Index++) { >> - if (AsciiStrCmp ((CHAR8 *)Data, mHisiAcpiDevId[Index]) == 0) { >> - HisiAcpiDevNotFound = FALSE; >> - break; >> - } >> - } >> - if (HisiAcpiDevNotFound) { >> - AcpiTableProtocol->Close (ValueHandle); >> - FoundDev = DsdtDeviceUnknown; >> - continue; >> - } >> - >> - DBG("Found device\n"); >> - AcpiTableProtocol->Close(ValueHandle); >> - Status = GetDeviceInfo (AcpiTableProtocol, ChildHandle, &DevNextID, &FoundDev); >> - if (EFI_ERROR (Status)) { >> - continue; >> - } >> - } else if ((FoundDev != DsdtDeviceUnknown) && AsciiStrnCmp((CHAR8 *) Data, "_DSD", 4) == 0) { >> - // >> - // Patch DSD data >> - // >> - EFI_ACPI_HANDLE PkgHandle; >> - Status = AcpiTableProtocol->GetOption(DevHandle, 2, &DataType, &Buffer, &DataSize); >> - if (EFI_ERROR(Status)) >> - break; >> - >> - if (DataType != EFI_ACPI_DATA_TYPE_CHILD) >> - continue; >> - >> - // >> - // Open package data >> - // >> - AcpiTableProtocol->Open((VOID *) Buffer, &PkgHandle); >> - Status = AcpiTableProtocol->GetOption(PkgHandle, 0, &DataType, &Buffer, &DataSize); >> - >> - Data = Buffer; >> - DBG("_DSD Subnode Store Op Code 0x%02X %02X\n", >> - Data[0], DataSize > 1 ? Data[1] : 0); >> - >> - // >> - // Walk the _DSD node >> - // >> - if (DataSize == 1 && Data[0] == AML_PACKAGE_OP) { >> - Status = SearchReplacePackageAddress (AcpiTableProtocol, PkgHandle, DevNextID, FoundDev); >> - } >> - >> - AcpiTableProtocol->Close(PkgHandle); >> - } else if (AsciiStrnCmp ((CHAR8 *) Data, "_ADR", 4) == 0) { >> - Status = AcpiTableProtocol->GetOption (DevHandle, 2, &DataType, &Buffer, &DataSize); >> - if (EFI_ERROR (Status)) { >> - break; >> - } >> - >> - if (DataType != EFI_ACPI_DATA_TYPE_CHILD) { >> - continue; >> - } >> - >> - Status = GetDeviceInfo (AcpiTableProtocol, ChildHandle, &DevNextID, &FoundDev); >> - >> - if (EFI_ERROR (Status)) { >> - continue; >> - } >> - } >> - } >> - } else if ((DataSize == 2) && (Data[0] == AML_EXT_OP) && (Data[1] == AML_EXT_DEVICE_OP)) { >> - ProcessDSDTDevice (AcpiTableProtocol, DevHandle); >> - } >> - } >> - >> - return EFI_SUCCESS; >> -} >> - >> - >> -BOOLEAN >> -IsSbScope ( >> - EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, >> - EFI_ACPI_HANDLE ChildHandle >> - ) >> -{ >> - EFI_STATUS Status; >> - EFI_ACPI_DATA_TYPE DataType; >> - CONST UINT8 *Data; >> - CONST VOID *Buffer; >> - UINTN DataSize; >> - >> - Status = AcpiTableProtocol->GetOption (ChildHandle, 0, &DataType, &Buffer, &DataSize); >> - if (EFI_ERROR(Status)) return FALSE; >> - >> - Data = Buffer; >> - if (DataSize != 1 || Data[0] != AML_SCOPE_OP) { >> - return FALSE; >> - } >> - >> - return TRUE; >> -} >> - >> -EFI_STATUS ProcessDSDTChild( >> - EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, >> - EFI_ACPI_HANDLE ChildHandle) >> -{ >> - EFI_STATUS Status; >> - EFI_ACPI_HANDLE DevHandle; >> - >> - // Check Scope(_SB) at first >> - if (!IsSbScope (AcpiTableProtocol, ChildHandle)) { >> - return ProcessDSDTDevice (AcpiTableProtocol, ChildHandle); >> - } >> - >> - for (DevHandle = NULL; ; ) { >> - Status = AcpiTableProtocol->GetChild (ChildHandle, &DevHandle); >> - if (EFI_ERROR(Status) || DevHandle == NULL) { >> - break; >> - } >> - >> - ProcessDSDTDevice (AcpiTableProtocol, DevHandle); >> - } >> - >> - return EFI_SUCCESS; >> -} >> - >> -static EFI_STATUS ProcessDSDT( >> - EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, >> - EFI_ACPI_HANDLE TableHandle) >> -{ >> - EFI_STATUS Status; >> - EFI_ACPI_HANDLE ChildHandle; >> - // >> - // Parse table for device type >> - DBG ("[%a:%d] - TableHandle=%p\n", __FUNCTION__, __LINE__, TableHandle); >> - for (ChildHandle = NULL; ; ) { >> - Status = AcpiTableProtocol->GetChild(TableHandle, &ChildHandle); >> - DBG ("[%a:%d] - Child=%p, %r\n", __FUNCTION__, __LINE__, ChildHandle, Status); >> - if (EFI_ERROR(Status)) >> - break; >> - if (ChildHandle == NULL) >> - break; >> - >> - ProcessDSDTChild(AcpiTableProtocol, ChildHandle); >> - } >> - >> - return EFI_SUCCESS; >> -} >> - >> -STATIC >> -VOID >> -AcpiCheckSum ( >> - IN OUT EFI_ACPI_SDT_HEADER *Table >> - ) >> -{ >> - UINTN ChecksumOffset; >> - UINT8 *Buffer; >> - >> - ChecksumOffset = OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, Checksum); >> - Buffer = (UINT8 *)Table; >> - >> - // >> - // set checksum to 0 first >> - // >> - Buffer[ChecksumOffset] = 0; >> - >> - // >> - // Update checksum value >> - // >> - Buffer[ChecksumOffset] = CalculateCheckSum8 (Buffer, Table->Length); >> -} >> - >> -EFI_STATUS UpdateAcpiDsdtTable(void) >> -{ >> - EFI_STATUS Status; >> - EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol; >> - EFI_ACPI_SDT_HEADER *Table; >> - EFI_ACPI_TABLE_VERSION TableVersion; >> - UINTN TableKey; >> - EFI_ACPI_HANDLE TableHandle; >> - UINTN i; >> - >> - DEBUG ((EFI_D_ERROR, "Updating Ethernet MAC in ACPI DSDT...\n")); >> - >> - // >> - // Find the AcpiTable protocol >> - Status = gBS->LocateProtocol(&gEfiAcpiSdtProtocolGuid, NULL, (VOID**) &AcpiTableProtocol); >> - if (EFI_ERROR(Status)) { >> - DBG("Unable to locate ACPI table protocol\n"); >> - return EFI_SUCCESS; >> - } >> - >> - // >> - // Search for DSDT Table >> - for (i = 0; i < EFI_ACPI_MAX_NUM_TABLES; i++) { >> - Status = AcpiTableProtocol->GetAcpiTable(i, &Table, &TableVersion, &TableKey); >> - if (EFI_ERROR(Status)) >> - break; >> - if (Table->Signature != DSDT_SIGNATURE) >> - continue; >> - >> - Status = AcpiTableProtocol->OpenSdt(TableKey, &TableHandle); >> - if (EFI_ERROR(Status)) >> - break; >> - >> - ProcessDSDT(AcpiTableProtocol, TableHandle); >> - >> - AcpiTableProtocol->Close(TableHandle); >> - AcpiCheckSum (Table); >> - } >> - >> - return EFI_SUCCESS; >> -} >> diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h >> deleted file mode 100644 >> index a7e1eed..0000000 >> --- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h >> +++ /dev/null >> @@ -1,16 +0,0 @@ >> -/* >> - * >> - * Copyright (c) 2014, Applied Micro Circuits Corporation >> - * Copyright (c) 2015, Hisilicon Limited. All rights reserved. >> - * Copyright (c) 2015, Linaro Limited. All rights reserved. >> - * Author: Loc Ho <lho@apm.com> >> - * >> - * SPDX-License-Identifier: BSD-2-Clause-Patent >> - */ >> -#ifndef _ETH_MAC_H_ >> -#define _ETH_MAC_H_ >> - >> -EFI_STATUS UpdateAcpiDsdtTable (VOID); >> - >> -#endif >> - >> diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.c b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.c >> new file mode 100644 >> index 0000000..205f2f9 >> --- /dev/null >> +++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.c >> @@ -0,0 +1,612 @@ >> +/** @file >> + >> + Copyright (c) 2014 - 2020, Applied Micro Curcuit Corporation. All rights reserved.<BR> >> + Copyright (c) 2015 - 2020, Hisilicon Limited. All rights reserved.<BR> >> + Copyright (c) 2015 - 2020, Linaro Limited. All rights reserved.<BR> >> + SPDX-License-Identifier: BSD-2-Clause-Patent >> + >> + This driver is called to initialize the FW part of the PHY in preparation >> + for the OS. >> + >> +**/ >> + >> +#include <Guid/ShellVariableGuid.h> >> +#include <Library/UefiRuntimeServicesTableLib.h> >> +#include <Library/DebugLib.h> >> +#include <Library/TimerLib.h> >> + >> +#include <PiDxe.h> >> +#include <Guid/EventGroup.h> >> +#include <Protocol/AcpiTable.h> >> +#include <Protocol/FirmwareVolume2.h> >> +#include <Library/BaseLib.h> >> +#include <Library/UefiBootServicesTableLib.h> >> +#include <Protocol/AcpiSystemDescriptionTable.h> >> +#include <Library/DebugLib.h> >> +#include <Library/PcdLib.h> >> +#include <Library/PrintLib.h> >> +#include <Library/DebugLib.h> >> +#include <Library/BaseMemoryLib.h> >> +#include <Library/UefiRuntimeServicesTableLib.h> >> +#include <IndustryStandard/Acpi.h> >> +#include <IndustryStandard/AcpiAml.h> >> +#include <Library/MemoryAllocationLib.h> >> + >> +#include <Protocol/HisiBoardNicProtocol.h> >> + >> +// Turn on debug message by enabling below define >> +//#define ACPI_DEBUG >> + >> +#ifdef ACPI_DEBUG >> +#define DBG(arg...) DEBUG((EFI_D_ERROR,## arg)) >> +#else >> +#define DBG(arg...) >> +#endif >> + >> +#define EFI_ACPI_MAX_NUM_TABLES 20 >> +#define DSDT_SIGNATURE 0x54445344 >> + >> +#define ACPI_ETH_MAC_KEY "local-mac-address" >> +#define ACPI_ETH_SAS_KEY "sas-addr" >> + >> +#define PREFIX_VARIABLE_NAME L"MAC" >> +#define PREFIX_VARIABLE_NAME_COMPAT L"RGMII_MAC" >> +#define ADDRESS_MAX_LEN 30 >> + >> +CHAR8 *mHisiAcpiDevId[] = {"HISI00C1","HISI00C2","HISI0162"}; >> + >> +typedef enum { >> + DsdtDeviceUnknown, >> + DsdtDeviceLan, >> + DsdtDeviceSas >> +} DSDT_DEVICE_TYPE; >> + >> +EFI_STATUS GetEnvMac( >> + IN UINTN MacNextID, >> + IN OUT UINT8 *MacBuffer) >> +{ >> + EFI_MAC_ADDRESS Mac; >> + EFI_STATUS Status; >> + HISI_BOARD_NIC_PROTOCOL *OemNic = NULL; >> + >> + Status = gBS->LocateProtocol(&gHisiBoardNicProtocolGuid, NULL, (VOID **)&OemNic); >> + if(EFI_ERROR(Status)) >> + { >> + DEBUG((EFI_D_ERROR, "[%a]:[%dL] LocateProtocol failed %r\n", __FUNCTION__, __LINE__, Status)); >> + return Status; >> + } >> + >> + Status = OemNic->GetMac(&Mac, MacNextID); >> + if(EFI_ERROR(Status)) >> + { >> + DEBUG((EFI_D_ERROR, "[%a]:[%dL] GetMac failed %r\n", __FUNCTION__, __LINE__, Status)); >> + return Status; >> + } >> + >> + CopyMem (MacBuffer, &Mac, 6); >> + DEBUG((EFI_D_ERROR, "Port %d MAC %02x:%02x:%02x:%02x:%02x:%02x\n", >> + MacNextID, >> + MacBuffer[0], >> + MacBuffer[1], >> + MacBuffer[2], >> + MacBuffer[3], >> + MacBuffer[4], >> + MacBuffer[5] >> + )); >> + >> + return EFI_SUCCESS; >> +} >> + >> +EFI_STATUS GetSasAddress ( >> + IN UINT8 Index, >> + IN OUT UINT8 *SasAddrBuffer >> + ) >> +{ >> + if (SasAddrBuffer == NULL) { >> + return EFI_INVALID_PARAMETER; >> + } >> + >> + SasAddrBuffer[0] = 0x50; >> + SasAddrBuffer[1] = 0x01; >> + SasAddrBuffer[2] = 0x88; >> + SasAddrBuffer[3] = 0x20; >> + SasAddrBuffer[4] = 0x16; >> + SasAddrBuffer[5] = 0x00; >> + SasAddrBuffer[6] = 0x00; >> + SasAddrBuffer[7] = Index; >> + >> + return EFI_SUCCESS; >> +} >> + >> +EFI_STATUS _SearchReplacePackageAddress( >> + IN EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, >> + IN EFI_ACPI_HANDLE ChildHandle, >> + IN UINTN Level, >> + IN OUT BOOLEAN *Found, >> + IN UINTN DevNextID, >> + IN DSDT_DEVICE_TYPE FoundDev >> + ) >> +{ >> + // ASL template for ethernet driver: >> +/* >> + * Name (_DSD, Package () { >> + * ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), >> + * Package () { >> + * Package (2) {"mac-address", Package (6) { 00, 11, 22, 33, 44, 55 }} >> + * Package (2) {"phy-channel", 0}, >> + * Package (2) {"phy-mode", "rgmii"}, >> + * Package (2) {"max-transfer-unit", 0x5dc}, // MTU of 1500 >> + * Package (2) {"max-speed", 0x3e8}, // 1000 Mbps >> + * } >> + * }) >> + */ >> + EFI_STATUS Status; >> + EFI_ACPI_DATA_TYPE DataType; >> + CONST UINT8 *Data; >> + CONST VOID *Buffer; >> + UINTN DataSize; >> + UINTN Count; >> + EFI_ACPI_HANDLE CurrentHandle; >> + EFI_ACPI_HANDLE NextHandle; >> + EFI_ACPI_HANDLE Level1Handle; >> + UINT8 *AddressBuffer; >> + UINT8 AddressByte = 0; >> + >> + DBG("In Level:%d\n", Level); >> + Level1Handle = NULL; >> + Status = EFI_SUCCESS; >> + for (CurrentHandle = NULL; ;) { >> + Status = AcpiTableProtocol->GetChild(ChildHandle, &CurrentHandle); >> + if (Level == 1) { >> + Level1Handle = CurrentHandle; >> + } >> + if (Level != 3 && (EFI_ERROR(Status) || CurrentHandle == NULL)) >> + break; >> + >> + Status = AcpiTableProtocol->GetOption(CurrentHandle, 0, &DataType, &Buffer, &DataSize); >> + Data = Buffer; >> + DBG("_DSD Child Subnode Store Op Code 0x%02X 0x%02X %02X\n", >> + DataSize, Data[0], DataSize > 1 ? Data[1] : 0); >> + >> + if (Level < 2 && Data[0] != AML_PACKAGE_OP) >> + continue; >> + >> + if (Level == 2 && Data[0] == AML_STRING_PREFIX) { >> + Status = AcpiTableProtocol->GetOption(CurrentHandle, 1, &DataType, &Buffer, &DataSize); >> + if (EFI_ERROR(Status)) >> + break; >> + >> + DBG(" _DSD Child Subnode Store Op Code 0x%02X 0x%02X %02X\n", >> + DataSize, Data[0], DataSize > 1 ? Data[1] : 0); >> + >> + Data = Buffer; >> + if ((DataType != EFI_ACPI_DATA_TYPE_STRING) || >> + ((AsciiStrCmp ((CHAR8 *) Data, ACPI_ETH_MAC_KEY) != 0) && >> + (AsciiStrCmp ((CHAR8 *) Data, ACPI_ETH_SAS_KEY) != 0))) { >> + ChildHandle = Level1Handle; >> + continue; >> + } >> + >> + DBG("_DSD Key Type %d. Found address key\n", DataType); >> + >> + // >> + // We found the node. >> + // >> + *Found = TRUE; >> + continue; >> + } >> + >> + if (Level == 3 && *Found) { >> + AddressBuffer = AllocateZeroPool (ADDRESS_MAX_LEN); >> + if (AddressBuffer == NULL) { >> + DEBUG ((DEBUG_ERROR, "%a:%d AllocateZeroPool failed\n", __FILE__, __LINE__)); >> + return EFI_OUT_OF_RESOURCES; >> + } >> + >> + switch (FoundDev) { >> + case DsdtDeviceLan: >> + //Update the MAC >> + Status = GetEnvMac (DevNextID, AddressBuffer); >> + AddressByte = 6; >> + break; >> + case DsdtDeviceSas: >> + //Update SAS Address. >> + Status = GetSasAddress (DevNextID, AddressBuffer); >> + AddressByte = 8; >> + break; >> + default: >> + Status = EFI_INVALID_PARAMETER; >> + } >> + if (EFI_ERROR (Status)) { >> + FreePool (AddressBuffer); >> + AddressBuffer = NULL; >> + break; >> + } >> + >> + for (Count = 0; Count < AddressByte; Count++) { >> + Status = AcpiTableProtocol->GetOption(CurrentHandle, 1, &DataType, &Buffer, &DataSize); >> + if (EFI_ERROR(Status)) >> + break; >> + >> + Data = Buffer; >> + DBG(" _DSD Child Subnode Store Op Code 0x%02X 0x%02X %02X DataType 0x%X\n", >> + DataSize, Data[0], DataSize > 1 ? Data[1] : 0, DataType); >> + >> + if (DataType != EFI_ACPI_DATA_TYPE_UINT) >> + break; >> + >> + // only need one byte. >> + // FIXME: Assume the CPU is little endian >> + Status = AcpiTableProtocol->SetOption (CurrentHandle, 1, AddressBuffer + Count, sizeof(UINT8)); >> + if (EFI_ERROR(Status)) >> + break; >> + Status = AcpiTableProtocol->GetChild(ChildHandle, &CurrentHandle); >> + if (EFI_ERROR(Status) || CurrentHandle == NULL) >> + break; >> + } >> + FreePool (AddressBuffer); >> + AddressBuffer = NULL; >> + break; >> + } >> + >> + if (Level > 3) >> + break; >> + >> + //Search next package >> + AcpiTableProtocol->Open((VOID *) Buffer, &NextHandle); >> + Status = _SearchReplacePackageAddress( >> + AcpiTableProtocol, >> + NextHandle, >> + Level + 1, >> + Found, >> + DevNextID, >> + FoundDev); >> + AcpiTableProtocol->Close(NextHandle); >> + if (!EFI_ERROR(Status)) >> + break; >> + } >> + >> + return Status; >> +} >> + >> +EFI_STATUS SearchReplacePackageAddress( >> + IN EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, >> + IN EFI_ACPI_HANDLE ChildHandle, >> + IN UINTN DevNextID, >> + IN DSDT_DEVICE_TYPE FoundDev >> + ) >> +{ >> + BOOLEAN Found = FALSE; >> + UINTN Level = 0; >> + >> + return _SearchReplacePackageAddress(AcpiTableProtocol, ChildHandle, Level, >> + &Found, DevNextID, FoundDev); >> +} >> + >> +EFI_STATUS >> +GetDeviceInfo ( >> + EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, >> + EFI_ACPI_HANDLE ChildHandle, >> + UINTN *DevID, >> + DSDT_DEVICE_TYPE *FoundDev >> + ) >> +{ >> + EFI_STATUS Status; >> + EFI_ACPI_DATA_TYPE DataType; >> + CHAR8 Data[5]; >> + CONST VOID *Buffer; >> + UINTN DataSize; >> + >> + // Get NameString >> + Status = AcpiTableProtocol->GetOption (ChildHandle, 1, &DataType, &Buffer, &DataSize); >> + if (EFI_ERROR (Status)) { >> + DEBUG ((EFI_D_ERROR, "[%a:%d] Get NameString failed: %r\n", __FUNCTION__, __LINE__, Status)); >> + return Status; >> + } >> + >> + CopyMem (Data, Buffer, 4); >> + DBG("Size %p Data %02x %02x %02x %02x\n", DataSize, Data[0], Data[1], Data[2], Data[3]); >> + >> + Data[4] = '\0'; >> + if ((DataSize != 4) || >> + (Data[3] > '9' || Data[3] < '0')) { >> + DEBUG ((DEBUG_ERROR, "The NameString %a is not ETHn or SASn\n", Data)); >> + return EFI_INVALID_PARAMETER; >> + } >> + >> + if (AsciiStrnCmp ("ETH", Data, 3) == 0) { >> + *FoundDev = DsdtDeviceLan; >> + } else if (AsciiStrnCmp ("SAS", Data, 3) == 0) { >> + *FoundDev = DsdtDeviceSas; >> + } else { >> + DEBUG ((DEBUG_ERROR, "[%a:%d] The NameString %a is not ETHn or SASn\n", >> + __FUNCTION__, __LINE__, Data)); >> + return EFI_INVALID_PARAMETER; >> + } >> + >> + *DevID = Data[3] - '0'; >> + return EFI_SUCCESS; >> +} >> + >> +EFI_STATUS ProcessDSDTDevice ( >> + EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, >> + EFI_ACPI_HANDLE ChildHandle) >> +{ >> + EFI_STATUS Status; >> + EFI_ACPI_DATA_TYPE DataType; >> + CONST UINT8 *Data; >> + CONST VOID *Buffer; >> + UINTN DataSize; >> + EFI_ACPI_HANDLE DevHandle; >> + DSDT_DEVICE_TYPE FoundDev = DsdtDeviceUnknown; >> + UINTN DevNextID; >> + BOOLEAN HisiAcpiDevNotFound; >> + UINTN Index; >> + >> + Status = AcpiTableProtocol->GetOption(ChildHandle, 0, &DataType, &Buffer, &DataSize); >> + if (EFI_ERROR(Status)) >> + return EFI_SUCCESS; >> + >> + Data = Buffer; >> + // >> + // Skip all non-device type >> + // >> + if (DataSize != 2 || Data[0] != AML_EXT_OP || Data[1] != AML_EXT_DEVICE_OP) >> + return EFI_SUCCESS; >> + >> + // >> + // Walk the device type node >> + // >> + for (DevHandle = NULL; ; ) { >> + Status = AcpiTableProtocol->GetChild(ChildHandle, &DevHandle); >> + if (EFI_ERROR(Status) || DevHandle == NULL) >> + break; >> + >> + // >> + // Search for _HID with Device ID >> + // >> + Status = AcpiTableProtocol->GetOption(DevHandle, 0, &DataType, &Buffer, &DataSize); >> + if (EFI_ERROR(Status)) >> + break; >> + >> + Data = Buffer; >> + DBG("Data Type 0x%02X %02X\n", Data[0], DataSize > 1 ? Data[1] : 0); >> + if (DataSize == 1 && Data[0] == AML_NAME_OP) { >> + Status = AcpiTableProtocol->GetOption(DevHandle, 1, &DataType, &Buffer, &DataSize); >> + if (EFI_ERROR(Status)) >> + break; >> + >> + Data = Buffer; >> + if (DataType == EFI_ACPI_DATA_TYPE_NAME_STRING) { >> + if (AsciiStrnCmp((CHAR8 *) Data, "_HID", 4) == 0) { >> + EFI_ACPI_HANDLE ValueHandle; >> + >> + Status = AcpiTableProtocol->GetOption(DevHandle, 2, &DataType, &Buffer, &DataSize); >> + if (EFI_ERROR(Status)) >> + break; >> + >> + if (DataType != EFI_ACPI_DATA_TYPE_CHILD) >> + continue; >> + >> + AcpiTableProtocol->Open((VOID *) Buffer, &ValueHandle); >> + Status = AcpiTableProtocol->GetOption(ValueHandle, 1, &DataType, &Buffer, &DataSize); >> + >> + Data = Buffer; >> + DBG("[%a:%d] - _HID = %a\n", __FUNCTION__, __LINE__, Data); >> + >> + if (EFI_ERROR(Status) || >> + DataType != EFI_ACPI_DATA_TYPE_STRING) { >> + AcpiTableProtocol->Close (ValueHandle); >> + FoundDev = DsdtDeviceUnknown; >> + continue; >> + } >> + >> + HisiAcpiDevNotFound = TRUE; >> + for (Index = 0; Index < ARRAY_SIZE (mHisiAcpiDevId); Index++) { >> + if (AsciiStrCmp ((CHAR8 *)Data, mHisiAcpiDevId[Index]) == 0) { >> + HisiAcpiDevNotFound = FALSE; >> + break; >> + } >> + } >> + if (HisiAcpiDevNotFound) { >> + AcpiTableProtocol->Close (ValueHandle); >> + FoundDev = DsdtDeviceUnknown; >> + continue; >> + } >> + >> + DBG("Found device\n"); >> + AcpiTableProtocol->Close(ValueHandle); >> + Status = GetDeviceInfo (AcpiTableProtocol, ChildHandle, &DevNextID, &FoundDev); >> + if (EFI_ERROR (Status)) { >> + continue; >> + } >> + } else if ((FoundDev != DsdtDeviceUnknown) && AsciiStrnCmp((CHAR8 *) Data, "_DSD", 4) == 0) { >> + // >> + // Patch DSD data >> + // >> + EFI_ACPI_HANDLE PkgHandle; >> + Status = AcpiTableProtocol->GetOption(DevHandle, 2, &DataType, &Buffer, &DataSize); >> + if (EFI_ERROR(Status)) >> + break; >> + >> + if (DataType != EFI_ACPI_DATA_TYPE_CHILD) >> + continue; >> + >> + // >> + // Open package data >> + // >> + AcpiTableProtocol->Open((VOID *) Buffer, &PkgHandle); >> + Status = AcpiTableProtocol->GetOption(PkgHandle, 0, &DataType, &Buffer, &DataSize); >> + >> + Data = Buffer; >> + DBG("_DSD Subnode Store Op Code 0x%02X %02X\n", >> + Data[0], DataSize > 1 ? Data[1] : 0); >> + >> + // >> + // Walk the _DSD node >> + // >> + if (DataSize == 1 && Data[0] == AML_PACKAGE_OP) { >> + Status = SearchReplacePackageAddress (AcpiTableProtocol, PkgHandle, DevNextID, FoundDev); >> + } >> + >> + AcpiTableProtocol->Close(PkgHandle); >> + } else if (AsciiStrnCmp ((CHAR8 *) Data, "_ADR", 4) == 0) { >> + Status = AcpiTableProtocol->GetOption (DevHandle, 2, &DataType, &Buffer, &DataSize); >> + if (EFI_ERROR (Status)) { >> + break; >> + } >> + >> + if (DataType != EFI_ACPI_DATA_TYPE_CHILD) { >> + continue; >> + } >> + >> + Status = GetDeviceInfo (AcpiTableProtocol, ChildHandle, &DevNextID, &FoundDev); >> + >> + if (EFI_ERROR (Status)) { >> + continue; >> + } >> + } >> + } >> + } else if ((DataSize == 2) && (Data[0] == AML_EXT_OP) && (Data[1] == AML_EXT_DEVICE_OP)) { >> + ProcessDSDTDevice (AcpiTableProtocol, DevHandle); >> + } >> + } >> + >> + return EFI_SUCCESS; >> +} >> + >> + >> +BOOLEAN >> +IsSbScope ( >> + EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, >> + EFI_ACPI_HANDLE ChildHandle >> + ) >> +{ >> + EFI_STATUS Status; >> + EFI_ACPI_DATA_TYPE DataType; >> + CONST UINT8 *Data; >> + CONST VOID *Buffer; >> + UINTN DataSize; >> + >> + Status = AcpiTableProtocol->GetOption (ChildHandle, 0, &DataType, &Buffer, &DataSize); >> + if (EFI_ERROR(Status)) return FALSE; >> + >> + Data = Buffer; >> + if (DataSize != 1 || Data[0] != AML_SCOPE_OP) { >> + return FALSE; >> + } >> + >> + return TRUE; >> +} >> + >> +EFI_STATUS ProcessDSDTChild( >> + EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, >> + EFI_ACPI_HANDLE ChildHandle) >> +{ >> + EFI_STATUS Status; >> + EFI_ACPI_HANDLE DevHandle; >> + >> + // Check Scope(_SB) at first >> + if (!IsSbScope (AcpiTableProtocol, ChildHandle)) { >> + return ProcessDSDTDevice (AcpiTableProtocol, ChildHandle); >> + } >> + >> + for (DevHandle = NULL; ; ) { >> + Status = AcpiTableProtocol->GetChild (ChildHandle, &DevHandle); >> + if (EFI_ERROR(Status) || DevHandle == NULL) { >> + break; >> + } >> + >> + ProcessDSDTDevice (AcpiTableProtocol, DevHandle); >> + } >> + >> + return EFI_SUCCESS; >> +} >> + >> +static EFI_STATUS ProcessDSDT( >> + EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, >> + EFI_ACPI_HANDLE TableHandle) >> +{ >> + EFI_STATUS Status; >> + EFI_ACPI_HANDLE ChildHandle; >> + // >> + // Parse table for device type >> + DBG ("[%a:%d] - TableHandle=%p\n", __FUNCTION__, __LINE__, TableHandle); >> + for (ChildHandle = NULL; ; ) { >> + Status = AcpiTableProtocol->GetChild(TableHandle, &ChildHandle); >> + DBG ("[%a:%d] - Child=%p, %r\n", __FUNCTION__, __LINE__, ChildHandle, Status); >> + if (EFI_ERROR(Status)) >> + break; >> + if (ChildHandle == NULL) >> + break; >> + >> + ProcessDSDTChild(AcpiTableProtocol, ChildHandle); >> + } >> + >> + return EFI_SUCCESS; >> +} >> + >> +STATIC >> +VOID >> +AcpiCheckSum ( >> + IN OUT EFI_ACPI_SDT_HEADER *Table >> + ) >> +{ >> + UINTN ChecksumOffset; >> + UINT8 *Buffer; >> + >> + ChecksumOffset = OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, Checksum); >> + Buffer = (UINT8 *)Table; >> + >> + // >> + // set checksum to 0 first >> + // >> + Buffer[ChecksumOffset] = 0; >> + >> + // >> + // Update checksum value >> + // >> + Buffer[ChecksumOffset] = CalculateCheckSum8 (Buffer, Table->Length); >> +} >> + >> +EFI_STATUS UpdateAcpiDsdtTable(void) >> +{ >> + EFI_STATUS Status; >> + EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol; >> + EFI_ACPI_SDT_HEADER *Table; >> + EFI_ACPI_TABLE_VERSION TableVersion; >> + UINTN TableKey; >> + EFI_ACPI_HANDLE TableHandle; >> + UINTN i; >> + >> + DEBUG ((EFI_D_ERROR, "Updating Ethernet MAC in ACPI DSDT...\n")); >> + >> + // >> + // Find the AcpiTable protocol >> + Status = gBS->LocateProtocol(&gEfiAcpiSdtProtocolGuid, NULL, (VOID**) &AcpiTableProtocol); >> + if (EFI_ERROR(Status)) { >> + DBG("Unable to locate ACPI table protocol\n"); >> + return EFI_SUCCESS; >> + } >> + >> + // >> + // Search for DSDT Table >> + for (i = 0; i < EFI_ACPI_MAX_NUM_TABLES; i++) { >> + Status = AcpiTableProtocol->GetAcpiTable(i, &Table, &TableVersion, &TableKey); >> + if (EFI_ERROR(Status)) >> + break; >> + if (Table->Signature != DSDT_SIGNATURE) >> + continue; >> + >> + Status = AcpiTableProtocol->OpenSdt(TableKey, &TableHandle); >> + if (EFI_ERROR(Status)) >> + break; >> + >> + ProcessDSDT(AcpiTableProtocol, TableHandle); >> + >> + AcpiTableProtocol->Close(TableHandle); >> + AcpiCheckSum (Table); >> + } >> + >> + return EFI_SUCCESS; >> +} >> diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.h b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.h >> new file mode 100644 >> index 0000000..a7e1eed >> --- /dev/null >> +++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.h >> @@ -0,0 +1,16 @@ >> +/* >> + * >> + * Copyright (c) 2014, Applied Micro Circuits Corporation >> + * Copyright (c) 2015, Hisilicon Limited. All rights reserved. >> + * Copyright (c) 2015, Linaro Limited. All rights reserved. >> + * Author: Loc Ho <lho@apm.com> >> + * >> + * SPDX-License-Identifier: BSD-2-Clause-Patent >> + */ >> +#ifndef _ETH_MAC_H_ >> +#define _ETH_MAC_H_ >> + >> +EFI_STATUS UpdateAcpiDsdtTable (VOID); >> + >> +#endif >> + >> -- >> 2.8.1 >> > > . > ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [RFC edk2-platforms v1 0/3] Improve D0x 2020-05-21 14:43 [RFC edk2-platforms v1 0/3] Improve D0x Ming Huang ` (2 preceding siblings ...) 2020-05-21 14:43 ` [RFC edk2-platforms v1 3/3] Silicon/Hisilicon: Rename EthMac files Ming Huang @ 2020-05-26 18:09 ` Leif Lindholm 2020-05-27 14:31 ` Ming Huang 3 siblings, 1 reply; 12+ messages in thread From: Leif Lindholm @ 2020-05-26 18:09 UTC (permalink / raw) To: Ming Huang Cc: devel, ard.biesheuvel, lidongzhan, songdongkuang, wanghuiqiang, qiuliangen On trying to build the resulting output, I found the build breaks with /work/git/edk2-platforms/Silicon/Hisilicon/Drivers/FlashFvbDxe/FlashFvbDxe.c: In function ‘FlashFvbInitialize’: /work/git/edk2-platforms/Silicon/Hisilicon/Drivers/FlashFvbDxe/FlashFvbDxe.c:1231:20: error: ‘gEfiEventVirtualAddressChangeGuid’ undeclared (first use in this function); did you mean ‘EfiSetVirtualAddressMap’? &gEfiEventVirtualAddressChangeGuid, ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ EfiSetVirtualAddressMap The error would appear identical to that resolved by commit a327627dd3f9edc113b1de6d897222d0517834db Could you please provide a corresponding fix? Best Regards, Leif On Thu, May 21, 2020 at 22:43:01 +0800, Ming Huang wrote: > Main Changes: > Add update sas address feature in AcpiPlatformDxe. > > Ming Huang (3): > Silicon/Hisilicon: Change updating dsdt in ready to boot event > Silicon/Hisilicon/Acpi: Add update sas address feature > Silicon/Hisilicon: Rename EthMac files > > Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c | 62 +- > Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf | 8 +- > Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c | 500 ---------------- > Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h | 16 - > Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.c | 612 ++++++++++++++++++++ > Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.h | 16 + > 6 files changed, 689 insertions(+), 525 deletions(-) > delete mode 100644 Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c > delete mode 100644 Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h > create mode 100644 Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.c > create mode 100644 Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.h > > -- > 2.8.1 > ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [RFC edk2-platforms v1 0/3] Improve D0x 2020-05-26 18:09 ` [RFC edk2-platforms v1 0/3] Improve D0x Leif Lindholm @ 2020-05-27 14:31 ` Ming Huang 0 siblings, 0 replies; 12+ messages in thread From: Ming Huang @ 2020-05-27 14:31 UTC (permalink / raw) To: Leif Lindholm Cc: devel, ard.biesheuvel, lidongzhan, songdongkuang, wanghuiqiang, qiuliangen 在 2020/5/27 2:09, Leif Lindholm 写道: > On trying to build the resulting output, I found the build breaks with > /work/git/edk2-platforms/Silicon/Hisilicon/Drivers/FlashFvbDxe/FlashFvbDxe.c: > In function ‘FlashFvbInitialize’: > /work/git/edk2-platforms/Silicon/Hisilicon/Drivers/FlashFvbDxe/FlashFvbDxe.c:1231:20: > error: ‘gEfiEventVirtualAddressChangeGuid’ undeclared (first use in > this function); did you mean ‘EfiSetVirtualAddressMap’? > &gEfiEventVirtualAddressChangeGuid, > ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > EfiSetVirtualAddressMap > > The error would appear identical to that resolved by > commit a327627dd3f9edc113b1de6d897222d0517834db > > Could you please provide a corresponding fix? Ok, I will add a patch in v2. Thanks, Ming > > Best Regards, > > Leif > > On Thu, May 21, 2020 at 22:43:01 +0800, Ming Huang wrote: >> Main Changes: >> Add update sas address feature in AcpiPlatformDxe. >> >> Ming Huang (3): >> Silicon/Hisilicon: Change updating dsdt in ready to boot event >> Silicon/Hisilicon/Acpi: Add update sas address feature >> Silicon/Hisilicon: Rename EthMac files >> >> Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c | 62 +- >> Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf | 8 +- >> Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c | 500 ---------------- >> Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h | 16 - >> Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.c | 612 ++++++++++++++++++++ >> Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.h | 16 + >> 6 files changed, 689 insertions(+), 525 deletions(-) >> delete mode 100644 Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c >> delete mode 100644 Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h >> create mode 100644 Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.c >> create mode 100644 Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.h >> >> -- >> 2.8.1 >> > > . > ^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2020-05-27 14:31 UTC | newest] Thread overview: 12+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2020-05-21 14:43 [RFC edk2-platforms v1 0/3] Improve D0x Ming Huang 2020-05-21 14:43 ` [RFC edk2-platforms v1 1/3] Silicon/Hisilicon: Change updating dsdt in ready to boot event Ming Huang 2020-05-26 17:40 ` Leif Lindholm 2020-05-27 11:38 ` Ming Huang 2020-05-21 14:43 ` [RFC edk2-platforms v1 2/3] Silicon/Hisilicon/Acpi: Add update sas address feature Ming Huang 2020-05-26 18:49 ` Leif Lindholm 2020-05-27 14:21 ` Ming Huang 2020-05-21 14:43 ` [RFC edk2-platforms v1 3/3] Silicon/Hisilicon: Rename EthMac files Ming Huang 2020-05-26 18:50 ` Leif Lindholm 2020-05-27 14:22 ` Ming Huang 2020-05-26 18:09 ` [RFC edk2-platforms v1 0/3] Improve D0x Leif Lindholm 2020-05-27 14:31 ` Ming Huang
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox