public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Leif Lindholm" <leif@nuviainc.com>
To: Ming Huang <huangming23@huawei.com>
Cc: devel@edk2.groups.io, ard.biesheuvel@linaro.org,
	lidongzhan@huawei.com, songdongkuang@huawei.com,
	wanghuiqiang@huawei.com, qiuliangen@huawei.com
Subject: Re: [RFC edk2-platforms v1 3/3] Silicon/Hisilicon: Rename EthMac files
Date: Tue, 26 May 2020 19:50:49 +0100	[thread overview]
Message-ID: <20200526185049.GQ1923@vanye> (raw)
In-Reply-To: <1590072184-16219-4-git-send-email-huangming23@huawei.com>

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
> 

  reply	other threads:[~2020-05-26 18:50 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
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 [this message]
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

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200526185049.GQ1923@vanye \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox