[edk2-devel] [RFC edk2-platforms v1 3/3] Silicon/Hisilicon: Rename EthMac files

Ming Huang huangming23 at huawei.com
Wed May 27 14:22:12 UTC 2020



在 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 at 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 at 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 at 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/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-





More information about the edk2-devel-archive mailing list