在 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 <huangmin...@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 <l...@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 <l...@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
>>
>
> .
>
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#60354): https://edk2.groups.io/g/devel/message/60354
Mute This Topic: https://groups.io/mt/74377143/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-