public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: Ming Huang <huangming23@huawei.com>
To: <devel@edk2.groups.io>, <leif@nuviainc.com>, <ard.biesheuvel@linaro.org>
Cc: <lidongzhan@huawei.com>, <huangming23@huawei.com>,
	<songdongkuang@huawei.com>, <wanghuiqiang@huawei.com>,
	<qiuliangen@huawei.com>
Subject: [RFC edk2-platforms v1 3/3] Silicon/Hisilicon: Rename EthMac files
Date: Thu, 21 May 2020 22:43:04 +0800	[thread overview]
Message-ID: <1590072184-16219-4-git-send-email-huangming23@huawei.com> (raw)
In-Reply-To: <1590072184-16219-1-git-send-email-huangming23@huawei.com>

As not only update mac address feature in EthMac files, so rename
them to UpdateDsdt.

Signed-off-by: Ming Huang <huangming23@huawei.com>
---
 Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c      |   2 +-
 Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf |   8 +-
 Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c            | 612 --------------------
 Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h            |  16 -
 Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.c        | 612 ++++++++++++++++++++
 Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.h        |  16 +
 6 files changed, 633 insertions(+), 633 deletions(-)

diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c
index d3ea051..fd67677 100644
--- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c
+++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c
@@ -21,7 +21,7 @@
 #include <Library/UefiRuntimeServicesTableLib.h>
 #include <IndustryStandard/Acpi.h>
 #include <IndustryStandard/AcpiAml.h>
-#include "EthMac.h"
+#include "UpdateDsdt.h"
 
 EFI_EVENT       mUpdateAcpiDsdtTableEvent;
 
diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf
index 53da731..a2b669d 100644
--- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf
+++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf
@@ -1,8 +1,8 @@
 ## @file
 #
-#  Copyright (c) 2014, Applied Micro Curcuit Corp. All rights reserved.<BR>
-#  Copyright (c) 2015, Hisilicon Limited. All rights reserved.<BR>
-#  Copyright (c) 2015, Linaro Limited. All rights reserved.<BR>
+#  Copyright (c) 2014 - 2020, Applied Micro Curcuit Corp. All rights reserved.<BR>
+#  Copyright (c) 2015 - 2020, Hisilicon Limited. All rights reserved.<BR>
+#  Copyright (c) 2015 - 2020, Linaro Limited. All rights reserved.<BR>
 #  SPDX-License-Identifier: BSD-2-Clause-Patent
 #
 ##
@@ -18,7 +18,7 @@
 
 [Sources]
   AcpiPlatform.c
-  EthMac.c
+  UpdateDsdt.c
 
 [Packages]
   MdePkg/MdePkg.dec
diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c
deleted file mode 100644
index 205f2f9..0000000
--- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c
+++ /dev/null
@@ -1,612 +0,0 @@
-/** @file
-
-  Copyright (c) 2014 - 2020, Applied Micro Curcuit Corporation. All rights reserved.<BR>
-  Copyright (c) 2015 - 2020, Hisilicon Limited. All rights reserved.<BR>
-  Copyright (c) 2015 - 2020, Linaro Limited. All rights reserved.<BR>
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-  This driver is called to initialize the FW part of the PHY in preparation
-  for the OS.
-
-**/
-
-#include <Guid/ShellVariableGuid.h>
-#include <Library/UefiRuntimeServicesTableLib.h>
-#include <Library/DebugLib.h>
-#include <Library/TimerLib.h>
-
-#include <PiDxe.h>
-#include <Guid/EventGroup.h>
-#include <Protocol/AcpiTable.h>
-#include <Protocol/FirmwareVolume2.h>
-#include <Library/BaseLib.h>
-#include <Library/UefiBootServicesTableLib.h>
-#include <Protocol/AcpiSystemDescriptionTable.h>
-#include <Library/DebugLib.h>
-#include <Library/PcdLib.h>
-#include <Library/PrintLib.h>
-#include <Library/DebugLib.h>
-#include <Library/BaseMemoryLib.h>
-#include <Library/UefiRuntimeServicesTableLib.h>
-#include <IndustryStandard/Acpi.h>
-#include <IndustryStandard/AcpiAml.h>
-#include <Library/MemoryAllocationLib.h>
-
-#include <Protocol/HisiBoardNicProtocol.h>
-
-// Turn on debug message by enabling below define
-//#define ACPI_DEBUG
-
-#ifdef ACPI_DEBUG
-#define DBG(arg...) DEBUG((EFI_D_ERROR,## arg))
-#else
-#define DBG(arg...)
-#endif
-
-#define EFI_ACPI_MAX_NUM_TABLES         20
-#define DSDT_SIGNATURE                  0x54445344
-
-#define ACPI_ETH_MAC_KEY                "local-mac-address"
-#define ACPI_ETH_SAS_KEY                 "sas-addr"
-
-#define PREFIX_VARIABLE_NAME            L"MAC"
-#define PREFIX_VARIABLE_NAME_COMPAT     L"RGMII_MAC"
-#define ADDRESS_MAX_LEN                     30
-
-CHAR8 *mHisiAcpiDevId[] = {"HISI00C1","HISI00C2","HISI0162"};
-
-typedef enum {
-  DsdtDeviceUnknown,
-  DsdtDeviceLan,
-  DsdtDeviceSas
-} DSDT_DEVICE_TYPE;
-
-EFI_STATUS GetEnvMac(
-  IN          UINTN    MacNextID,
-  IN OUT      UINT8    *MacBuffer)
-{
-  EFI_MAC_ADDRESS Mac;
-  EFI_STATUS Status;
-  HISI_BOARD_NIC_PROTOCOL *OemNic = NULL;
-
-  Status = gBS->LocateProtocol(&gHisiBoardNicProtocolGuid, NULL, (VOID **)&OemNic);
-  if(EFI_ERROR(Status))
-  {
-    DEBUG((EFI_D_ERROR, "[%a]:[%dL] LocateProtocol failed %r\n", __FUNCTION__, __LINE__, Status));
-    return Status;
-  }
-
-  Status = OemNic->GetMac(&Mac, MacNextID);
-  if(EFI_ERROR(Status))
-  {
-    DEBUG((EFI_D_ERROR, "[%a]:[%dL] GetMac failed %r\n", __FUNCTION__, __LINE__, Status));
-    return Status;
-  }
-
-  CopyMem (MacBuffer, &Mac, 6);
-  DEBUG((EFI_D_ERROR, "Port %d MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
-        MacNextID,
-        MacBuffer[0],
-        MacBuffer[1],
-        MacBuffer[2],
-        MacBuffer[3],
-        MacBuffer[4],
-        MacBuffer[5]
-        ));
-
-  return EFI_SUCCESS;
-}
-
-EFI_STATUS GetSasAddress (
-  IN UINT8        Index,
-  IN OUT UINT8    *SasAddrBuffer
-  )
-{
-  if (SasAddrBuffer == NULL) {
-      return EFI_INVALID_PARAMETER;
-  }
-
-  SasAddrBuffer[0] = 0x50;
-  SasAddrBuffer[1] = 0x01;
-  SasAddrBuffer[2] = 0x88;
-  SasAddrBuffer[3] = 0x20;
-  SasAddrBuffer[4] = 0x16;
-  SasAddrBuffer[5] = 0x00;
-  SasAddrBuffer[6] = 0x00;
-  SasAddrBuffer[7] = Index;
-
-  return EFI_SUCCESS;
-}
-
-EFI_STATUS _SearchReplacePackageAddress(
-  IN EFI_ACPI_SDT_PROTOCOL  *AcpiTableProtocol,
-  IN EFI_ACPI_HANDLE        ChildHandle,
-  IN UINTN                  Level,
-  IN OUT BOOLEAN            *Found,
-  IN UINTN                  DevNextID,
-  IN DSDT_DEVICE_TYPE       FoundDev
-  )
-{
-  // ASL template for ethernet driver:
-/*
- *   Name (_DSD, Package () {
- *   ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
- *   Package () {
- *     Package (2) {"mac-address", Package (6) { 00, 11, 22, 33, 44, 55 }}
- *     Package (2) {"phy-channel", 0},
- *     Package (2) {"phy-mode", "rgmii"},
- *     Package (2) {"max-transfer-unit", 0x5dc},   // MTU of 1500
- *     Package (2) {"max-speed", 0x3e8},            // 1000 Mbps
- *   }
- * })
- */
-  EFI_STATUS          Status;
-  EFI_ACPI_DATA_TYPE  DataType;
-  CONST UINT8         *Data;
-  CONST VOID          *Buffer;
-  UINTN               DataSize;
-  UINTN               Count;
-  EFI_ACPI_HANDLE     CurrentHandle;
-  EFI_ACPI_HANDLE     NextHandle;
-  EFI_ACPI_HANDLE     Level1Handle;
-  UINT8               *AddressBuffer;
-  UINT8               AddressByte = 0;
-
-  DBG("In Level:%d\n", Level);
-  Level1Handle = NULL;
-  Status = EFI_SUCCESS;
-  for (CurrentHandle = NULL; ;) {
-    Status = AcpiTableProtocol->GetChild(ChildHandle, &CurrentHandle);
-    if (Level == 1) {
-      Level1Handle = CurrentHandle;
-    }
-    if (Level != 3 && (EFI_ERROR(Status) || CurrentHandle == NULL))
-       break;
-
-    Status = AcpiTableProtocol->GetOption(CurrentHandle, 0, &DataType, &Buffer, &DataSize);
-    Data = Buffer;
-    DBG("_DSD Child Subnode Store Op Code 0x%02X 0x%02X %02X\n",
-        DataSize, Data[0], DataSize > 1 ? Data[1] : 0);
-
-    if (Level < 2 && Data[0] != AML_PACKAGE_OP)
-      continue;
-
-    if (Level == 2 && Data[0] == AML_STRING_PREFIX) {
-      Status = AcpiTableProtocol->GetOption(CurrentHandle, 1, &DataType, &Buffer, &DataSize);
-      if (EFI_ERROR(Status))
-        break;
-
-      DBG("  _DSD Child Subnode Store Op Code 0x%02X 0x%02X %02X\n",
-              DataSize, Data[0], DataSize > 1 ? Data[1] : 0);
-
-      Data = Buffer;
-      if ((DataType != EFI_ACPI_DATA_TYPE_STRING) ||
-            ((AsciiStrCmp ((CHAR8 *) Data, ACPI_ETH_MAC_KEY) != 0) &&
-            (AsciiStrCmp ((CHAR8 *) Data, ACPI_ETH_SAS_KEY) != 0))) {
-        ChildHandle = Level1Handle;
-        continue;
-      }
-
-      DBG("_DSD Key Type %d. Found address key\n", DataType);
-
-      //
-      // We found the node.
-      //
-      *Found = TRUE;
-      continue;
-    }
-
-    if (Level == 3 && *Found) {
-      AddressBuffer = AllocateZeroPool (ADDRESS_MAX_LEN);
-      if (AddressBuffer == NULL) {
-        DEBUG ((DEBUG_ERROR, "%a:%d AllocateZeroPool failed\n", __FILE__, __LINE__));
-        return EFI_OUT_OF_RESOURCES;
-      }
-
-      switch (FoundDev) {
-        case DsdtDeviceLan:
-          //Update the MAC
-          Status = GetEnvMac (DevNextID, AddressBuffer);
-          AddressByte = 6;
-          break;
-        case DsdtDeviceSas:
-          //Update SAS Address.
-          Status = GetSasAddress (DevNextID, AddressBuffer);
-          AddressByte = 8;
-          break;
-        default:
-          Status = EFI_INVALID_PARAMETER;
-      }
-      if (EFI_ERROR (Status)) {
-        FreePool (AddressBuffer);
-        AddressBuffer = NULL;
-        break;
-      }
-
-      for (Count = 0; Count < AddressByte; Count++) {
-        Status = AcpiTableProtocol->GetOption(CurrentHandle, 1, &DataType, &Buffer, &DataSize);
-        if (EFI_ERROR(Status))
-          break;
-
-        Data = Buffer;
-        DBG("    _DSD Child Subnode Store Op Code 0x%02X 0x%02X %02X DataType 0x%X\n",
-            DataSize, Data[0], DataSize > 1 ? Data[1] : 0, DataType);
-
-        if (DataType != EFI_ACPI_DATA_TYPE_UINT)
-          break;
-
-        // only need one byte.
-        // FIXME: Assume the CPU is little endian
-        Status = AcpiTableProtocol->SetOption (CurrentHandle, 1, AddressBuffer + Count, sizeof(UINT8));
-        if (EFI_ERROR(Status))
-          break;
-        Status = AcpiTableProtocol->GetChild(ChildHandle, &CurrentHandle);
-        if (EFI_ERROR(Status) || CurrentHandle == NULL)
-          break;
-      }
-      FreePool (AddressBuffer);
-      AddressBuffer = NULL;
-      break;
-    }
-
-    if (Level > 3)
-      break;
-
-    //Search next package
-    AcpiTableProtocol->Open((VOID *) Buffer, &NextHandle);
-    Status = _SearchReplacePackageAddress(
-               AcpiTableProtocol,
-               NextHandle,
-               Level + 1,
-               Found,
-               DevNextID,
-               FoundDev);
-    AcpiTableProtocol->Close(NextHandle);
-    if (!EFI_ERROR(Status))
-      break;
-  }
-
-  return Status;
-}
-
-EFI_STATUS SearchReplacePackageAddress(
-  IN EFI_ACPI_SDT_PROTOCOL  *AcpiTableProtocol,
-  IN EFI_ACPI_HANDLE        ChildHandle,
-  IN UINTN                  DevNextID,
-  IN DSDT_DEVICE_TYPE       FoundDev
-  )
-{
-  BOOLEAN Found = FALSE;
-  UINTN Level = 0;
-
-  return _SearchReplacePackageAddress(AcpiTableProtocol, ChildHandle, Level,
-                                      &Found, DevNextID, FoundDev);
-}
-
-EFI_STATUS
-GetDeviceInfo (
-  EFI_ACPI_SDT_PROTOCOL   *AcpiTableProtocol,
-  EFI_ACPI_HANDLE         ChildHandle,
-  UINTN                   *DevID,
-  DSDT_DEVICE_TYPE        *FoundDev
-  )
-{
-  EFI_STATUS Status;
-  EFI_ACPI_DATA_TYPE  DataType;
-  CHAR8               Data[5];
-  CONST VOID          *Buffer;
-  UINTN               DataSize;
-
-  // Get NameString
-  Status = AcpiTableProtocol->GetOption (ChildHandle, 1, &DataType, &Buffer, &DataSize);
-  if (EFI_ERROR (Status)) {
-    DEBUG ((EFI_D_ERROR, "[%a:%d] Get NameString failed: %r\n", __FUNCTION__, __LINE__, Status));
-    return Status;
-  }
-
-  CopyMem (Data, Buffer, 4);
-  DBG("Size %p Data %02x %02x %02x %02x\n", DataSize, Data[0], Data[1], Data[2], Data[3]);
-
-  Data[4] = '\0';
-  if ((DataSize != 4) ||
-    (Data[3] > '9' || Data[3] < '0')) {
-    DEBUG ((DEBUG_ERROR, "The NameString %a is not ETHn or SASn\n", Data));
-    return EFI_INVALID_PARAMETER;
-  }
-
-  if (AsciiStrnCmp ("ETH", Data, 3) == 0) {
-    *FoundDev = DsdtDeviceLan;
-  } else if (AsciiStrnCmp ("SAS", Data, 3) == 0) {
-    *FoundDev = DsdtDeviceSas;
-  } else {
-    DEBUG ((DEBUG_ERROR, "[%a:%d] The NameString %a is not ETHn or SASn\n",
-            __FUNCTION__, __LINE__, Data));
-    return EFI_INVALID_PARAMETER;
-  }
-
-  *DevID = Data[3] - '0';
-  return EFI_SUCCESS;
-}
-
-EFI_STATUS ProcessDSDTDevice (
-  EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol,
-  EFI_ACPI_HANDLE ChildHandle)
-{
-  EFI_STATUS          Status;
-  EFI_ACPI_DATA_TYPE  DataType;
-  CONST UINT8         *Data;
-  CONST VOID          *Buffer;
-  UINTN               DataSize;
-  EFI_ACPI_HANDLE     DevHandle;
-  DSDT_DEVICE_TYPE    FoundDev = DsdtDeviceUnknown;
-  UINTN               DevNextID;
-  BOOLEAN             HisiAcpiDevNotFound;
-  UINTN               Index;
-
-  Status = AcpiTableProtocol->GetOption(ChildHandle, 0, &DataType, &Buffer, &DataSize);
-  if (EFI_ERROR(Status))
-    return EFI_SUCCESS;
-
-  Data = Buffer;
-  //
-  // Skip all non-device type
-  //
-  if (DataSize != 2 || Data[0] != AML_EXT_OP || Data[1] != AML_EXT_DEVICE_OP)
-    return EFI_SUCCESS;
-
-  //
-  // Walk the device type node
-  //
-  for (DevHandle = NULL; ; ) {
-    Status = AcpiTableProtocol->GetChild(ChildHandle, &DevHandle);
-    if (EFI_ERROR(Status) || DevHandle == NULL)
-      break;
-
-    //
-    // Search for _HID with Device ID
-    //
-    Status = AcpiTableProtocol->GetOption(DevHandle, 0, &DataType, &Buffer, &DataSize);
-    if (EFI_ERROR(Status))
-      break;
-
-    Data = Buffer;
-    DBG("Data Type 0x%02X %02X\n", Data[0], DataSize > 1 ? Data[1] : 0);
-    if (DataSize == 1 && Data[0] == AML_NAME_OP) {
-      Status = AcpiTableProtocol->GetOption(DevHandle, 1, &DataType, &Buffer, &DataSize);
-      if (EFI_ERROR(Status))
-        break;
-
-      Data = Buffer;
-      if (DataType == EFI_ACPI_DATA_TYPE_NAME_STRING) {
-        if (AsciiStrnCmp((CHAR8 *) Data, "_HID", 4) == 0) {
-          EFI_ACPI_HANDLE ValueHandle;
-
-          Status = AcpiTableProtocol->GetOption(DevHandle, 2, &DataType, &Buffer, &DataSize);
-          if (EFI_ERROR(Status))
-            break;
-
-          if (DataType != EFI_ACPI_DATA_TYPE_CHILD)
-            continue;
-
-          AcpiTableProtocol->Open((VOID *) Buffer, &ValueHandle);
-          Status = AcpiTableProtocol->GetOption(ValueHandle, 1, &DataType, &Buffer, &DataSize);
-
-          Data = Buffer;
-          DBG("[%a:%d] - _HID = %a\n", __FUNCTION__, __LINE__, Data);
-
-          if (EFI_ERROR(Status) ||
-              DataType != EFI_ACPI_DATA_TYPE_STRING) {
-            AcpiTableProtocol->Close (ValueHandle);
-            FoundDev = DsdtDeviceUnknown;
-            continue;
-          }
-
-          HisiAcpiDevNotFound = TRUE;
-          for (Index = 0; Index < ARRAY_SIZE (mHisiAcpiDevId); Index++) {
-            if (AsciiStrCmp ((CHAR8 *)Data, mHisiAcpiDevId[Index]) == 0) {
-              HisiAcpiDevNotFound = FALSE;
-              break;
-            }
-          }
-          if (HisiAcpiDevNotFound) {
-            AcpiTableProtocol->Close (ValueHandle);
-            FoundDev = DsdtDeviceUnknown;
-            continue;
-          }
-
-          DBG("Found device\n");
-          AcpiTableProtocol->Close(ValueHandle);
-          Status = GetDeviceInfo (AcpiTableProtocol, ChildHandle, &DevNextID, &FoundDev);
-          if (EFI_ERROR (Status)) {
-            continue;
-          }
-        } else if ((FoundDev != DsdtDeviceUnknown) && AsciiStrnCmp((CHAR8 *) Data, "_DSD", 4) == 0) {
-          //
-          // Patch DSD data
-          //
-          EFI_ACPI_HANDLE    PkgHandle;
-          Status = AcpiTableProtocol->GetOption(DevHandle, 2, &DataType, &Buffer, &DataSize);
-          if (EFI_ERROR(Status))
-            break;
-
-          if (DataType != EFI_ACPI_DATA_TYPE_CHILD)
-            continue;
-
-          //
-          // Open package data
-          //
-          AcpiTableProtocol->Open((VOID *) Buffer, &PkgHandle);
-          Status = AcpiTableProtocol->GetOption(PkgHandle, 0, &DataType, &Buffer, &DataSize);
-
-          Data = Buffer;
-          DBG("_DSD Subnode Store Op Code 0x%02X %02X\n",
-                Data[0], DataSize > 1 ? Data[1] : 0);
-
-          //
-          // Walk the _DSD node
-          //
-          if (DataSize == 1 && Data[0] == AML_PACKAGE_OP) {
-            Status = SearchReplacePackageAddress (AcpiTableProtocol, PkgHandle, DevNextID, FoundDev);
-          }
-
-          AcpiTableProtocol->Close(PkgHandle);
-        } else if (AsciiStrnCmp ((CHAR8 *) Data, "_ADR", 4) == 0) {
-          Status = AcpiTableProtocol->GetOption (DevHandle, 2, &DataType, &Buffer, &DataSize);
-          if (EFI_ERROR (Status)) {
-            break;
-          }
-
-          if (DataType != EFI_ACPI_DATA_TYPE_CHILD) {
-            continue;
-          }
-
-          Status = GetDeviceInfo (AcpiTableProtocol, ChildHandle, &DevNextID, &FoundDev);
-
-          if (EFI_ERROR (Status)) {
-            continue;
-          }
-        }
-      }
-    } else if ((DataSize == 2) && (Data[0] == AML_EXT_OP) && (Data[1] == AML_EXT_DEVICE_OP)) {
-      ProcessDSDTDevice (AcpiTableProtocol, DevHandle);
-    }
-  }
-
-  return EFI_SUCCESS;
-}
-
-
-BOOLEAN
-IsSbScope (
-  EFI_ACPI_SDT_PROTOCOL   *AcpiTableProtocol,
-  EFI_ACPI_HANDLE         ChildHandle
-  )
-{
-  EFI_STATUS          Status;
-  EFI_ACPI_DATA_TYPE  DataType;
-  CONST UINT8         *Data;
-  CONST VOID          *Buffer;
-  UINTN               DataSize;
-
-  Status = AcpiTableProtocol->GetOption (ChildHandle, 0, &DataType, &Buffer, &DataSize);
-  if (EFI_ERROR(Status)) return FALSE;
-
-  Data = Buffer;
-  if (DataSize != 1 || Data[0] != AML_SCOPE_OP) {
-    return FALSE;
-  }
-
-  return TRUE;
-}
-
-EFI_STATUS ProcessDSDTChild(
-  EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol,
-  EFI_ACPI_HANDLE ChildHandle)
-{
-  EFI_STATUS          Status;
-  EFI_ACPI_HANDLE     DevHandle;
-
-  // Check Scope(_SB) at first
-  if (!IsSbScope (AcpiTableProtocol, ChildHandle)) {
-    return ProcessDSDTDevice (AcpiTableProtocol, ChildHandle);
-  }
-
-  for (DevHandle = NULL; ; ) {
-    Status = AcpiTableProtocol->GetChild (ChildHandle, &DevHandle);
-    if (EFI_ERROR(Status) || DevHandle == NULL) {
-      break;
-    }
-
-    ProcessDSDTDevice (AcpiTableProtocol, DevHandle);
-  }
-
-  return EFI_SUCCESS;
-}
-
-static EFI_STATUS ProcessDSDT(
-  EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol,
-  EFI_ACPI_HANDLE TableHandle)
-{
-  EFI_STATUS              Status;
-  EFI_ACPI_HANDLE         ChildHandle;
-  //
-  // Parse table for device type
-  DBG ("[%a:%d] - TableHandle=%p\n", __FUNCTION__, __LINE__, TableHandle);
-  for (ChildHandle = NULL; ; ) {
-    Status = AcpiTableProtocol->GetChild(TableHandle, &ChildHandle);
-    DBG ("[%a:%d] - Child=%p, %r\n", __FUNCTION__, __LINE__, ChildHandle, Status);
-    if (EFI_ERROR(Status))
-      break;
-    if (ChildHandle == NULL)
-      break;
-
-    ProcessDSDTChild(AcpiTableProtocol, ChildHandle);
-  }
-
-  return EFI_SUCCESS;
-}
-
-STATIC
-VOID
-AcpiCheckSum (
-  IN OUT  EFI_ACPI_SDT_HEADER *Table
-  )
-{
-  UINTN ChecksumOffset;
-  UINT8 *Buffer;
-
-  ChecksumOffset = OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, Checksum);
-  Buffer = (UINT8 *)Table;
-
-  //
-  // set checksum to 0 first
-  //
-  Buffer[ChecksumOffset] = 0;
-
-  //
-  // Update checksum value
-  //
-  Buffer[ChecksumOffset] = CalculateCheckSum8 (Buffer, Table->Length);
-}
-
-EFI_STATUS UpdateAcpiDsdtTable(void)
-{
-  EFI_STATUS              Status;
-  EFI_ACPI_SDT_PROTOCOL   *AcpiTableProtocol;
-  EFI_ACPI_SDT_HEADER     *Table;
-  EFI_ACPI_TABLE_VERSION  TableVersion;
-  UINTN                   TableKey;
-  EFI_ACPI_HANDLE         TableHandle;
-  UINTN                   i;
-
-  DEBUG ((EFI_D_ERROR, "Updating Ethernet MAC in ACPI DSDT...\n"));
-
-  //
-  // Find the AcpiTable protocol
-  Status = gBS->LocateProtocol(&gEfiAcpiSdtProtocolGuid, NULL, (VOID**) &AcpiTableProtocol);
-  if (EFI_ERROR(Status)) {
-    DBG("Unable to locate ACPI table protocol\n");
-    return EFI_SUCCESS;
-  }
-
-  //
-  // Search for DSDT Table
-  for (i = 0; i < EFI_ACPI_MAX_NUM_TABLES; i++) {
-    Status = AcpiTableProtocol->GetAcpiTable(i, &Table, &TableVersion, &TableKey);
-    if (EFI_ERROR(Status))
-      break;
-    if (Table->Signature != DSDT_SIGNATURE)
-      continue;
-
-    Status = AcpiTableProtocol->OpenSdt(TableKey, &TableHandle);
-    if (EFI_ERROR(Status))
-      break;
-
-    ProcessDSDT(AcpiTableProtocol, TableHandle);
-
-    AcpiTableProtocol->Close(TableHandle);
-    AcpiCheckSum (Table);
-  }
-
-  return EFI_SUCCESS;
-}
diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h
deleted file mode 100644
index a7e1eed..0000000
--- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- *
- * Copyright (c) 2014, Applied Micro Circuits Corporation
- * Copyright (c) 2015, Hisilicon Limited. All rights reserved.
- * Copyright (c) 2015, Linaro Limited. All rights reserved.
- * Author: Loc Ho <lho@apm.com>
- *
- * SPDX-License-Identifier: BSD-2-Clause-Patent
- */
-#ifndef _ETH_MAC_H_
-#define _ETH_MAC_H_
-
-EFI_STATUS UpdateAcpiDsdtTable (VOID);
-
-#endif
-
diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.c b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.c
new file mode 100644
index 0000000..205f2f9
--- /dev/null
+++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.c
@@ -0,0 +1,612 @@
+/** @file
+
+  Copyright (c) 2014 - 2020, Applied Micro Curcuit Corporation. All rights reserved.<BR>
+  Copyright (c) 2015 - 2020, Hisilicon Limited. All rights reserved.<BR>
+  Copyright (c) 2015 - 2020, Linaro Limited. All rights reserved.<BR>
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+  This driver is called to initialize the FW part of the PHY in preparation
+  for the OS.
+
+**/
+
+#include <Guid/ShellVariableGuid.h>
+#include <Library/UefiRuntimeServicesTableLib.h>
+#include <Library/DebugLib.h>
+#include <Library/TimerLib.h>
+
+#include <PiDxe.h>
+#include <Guid/EventGroup.h>
+#include <Protocol/AcpiTable.h>
+#include <Protocol/FirmwareVolume2.h>
+#include <Library/BaseLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Protocol/AcpiSystemDescriptionTable.h>
+#include <Library/DebugLib.h>
+#include <Library/PcdLib.h>
+#include <Library/PrintLib.h>
+#include <Library/DebugLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/UefiRuntimeServicesTableLib.h>
+#include <IndustryStandard/Acpi.h>
+#include <IndustryStandard/AcpiAml.h>
+#include <Library/MemoryAllocationLib.h>
+
+#include <Protocol/HisiBoardNicProtocol.h>
+
+// Turn on debug message by enabling below define
+//#define ACPI_DEBUG
+
+#ifdef ACPI_DEBUG
+#define DBG(arg...) DEBUG((EFI_D_ERROR,## arg))
+#else
+#define DBG(arg...)
+#endif
+
+#define EFI_ACPI_MAX_NUM_TABLES         20
+#define DSDT_SIGNATURE                  0x54445344
+
+#define ACPI_ETH_MAC_KEY                "local-mac-address"
+#define ACPI_ETH_SAS_KEY                 "sas-addr"
+
+#define PREFIX_VARIABLE_NAME            L"MAC"
+#define PREFIX_VARIABLE_NAME_COMPAT     L"RGMII_MAC"
+#define ADDRESS_MAX_LEN                     30
+
+CHAR8 *mHisiAcpiDevId[] = {"HISI00C1","HISI00C2","HISI0162"};
+
+typedef enum {
+  DsdtDeviceUnknown,
+  DsdtDeviceLan,
+  DsdtDeviceSas
+} DSDT_DEVICE_TYPE;
+
+EFI_STATUS GetEnvMac(
+  IN          UINTN    MacNextID,
+  IN OUT      UINT8    *MacBuffer)
+{
+  EFI_MAC_ADDRESS Mac;
+  EFI_STATUS Status;
+  HISI_BOARD_NIC_PROTOCOL *OemNic = NULL;
+
+  Status = gBS->LocateProtocol(&gHisiBoardNicProtocolGuid, NULL, (VOID **)&OemNic);
+  if(EFI_ERROR(Status))
+  {
+    DEBUG((EFI_D_ERROR, "[%a]:[%dL] LocateProtocol failed %r\n", __FUNCTION__, __LINE__, Status));
+    return Status;
+  }
+
+  Status = OemNic->GetMac(&Mac, MacNextID);
+  if(EFI_ERROR(Status))
+  {
+    DEBUG((EFI_D_ERROR, "[%a]:[%dL] GetMac failed %r\n", __FUNCTION__, __LINE__, Status));
+    return Status;
+  }
+
+  CopyMem (MacBuffer, &Mac, 6);
+  DEBUG((EFI_D_ERROR, "Port %d MAC %02x:%02x:%02x:%02x:%02x:%02x\n",
+        MacNextID,
+        MacBuffer[0],
+        MacBuffer[1],
+        MacBuffer[2],
+        MacBuffer[3],
+        MacBuffer[4],
+        MacBuffer[5]
+        ));
+
+  return EFI_SUCCESS;
+}
+
+EFI_STATUS GetSasAddress (
+  IN UINT8        Index,
+  IN OUT UINT8    *SasAddrBuffer
+  )
+{
+  if (SasAddrBuffer == NULL) {
+      return EFI_INVALID_PARAMETER;
+  }
+
+  SasAddrBuffer[0] = 0x50;
+  SasAddrBuffer[1] = 0x01;
+  SasAddrBuffer[2] = 0x88;
+  SasAddrBuffer[3] = 0x20;
+  SasAddrBuffer[4] = 0x16;
+  SasAddrBuffer[5] = 0x00;
+  SasAddrBuffer[6] = 0x00;
+  SasAddrBuffer[7] = Index;
+
+  return EFI_SUCCESS;
+}
+
+EFI_STATUS _SearchReplacePackageAddress(
+  IN EFI_ACPI_SDT_PROTOCOL  *AcpiTableProtocol,
+  IN EFI_ACPI_HANDLE        ChildHandle,
+  IN UINTN                  Level,
+  IN OUT BOOLEAN            *Found,
+  IN UINTN                  DevNextID,
+  IN DSDT_DEVICE_TYPE       FoundDev
+  )
+{
+  // ASL template for ethernet driver:
+/*
+ *   Name (_DSD, Package () {
+ *   ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
+ *   Package () {
+ *     Package (2) {"mac-address", Package (6) { 00, 11, 22, 33, 44, 55 }}
+ *     Package (2) {"phy-channel", 0},
+ *     Package (2) {"phy-mode", "rgmii"},
+ *     Package (2) {"max-transfer-unit", 0x5dc},   // MTU of 1500
+ *     Package (2) {"max-speed", 0x3e8},            // 1000 Mbps
+ *   }
+ * })
+ */
+  EFI_STATUS          Status;
+  EFI_ACPI_DATA_TYPE  DataType;
+  CONST UINT8         *Data;
+  CONST VOID          *Buffer;
+  UINTN               DataSize;
+  UINTN               Count;
+  EFI_ACPI_HANDLE     CurrentHandle;
+  EFI_ACPI_HANDLE     NextHandle;
+  EFI_ACPI_HANDLE     Level1Handle;
+  UINT8               *AddressBuffer;
+  UINT8               AddressByte = 0;
+
+  DBG("In Level:%d\n", Level);
+  Level1Handle = NULL;
+  Status = EFI_SUCCESS;
+  for (CurrentHandle = NULL; ;) {
+    Status = AcpiTableProtocol->GetChild(ChildHandle, &CurrentHandle);
+    if (Level == 1) {
+      Level1Handle = CurrentHandle;
+    }
+    if (Level != 3 && (EFI_ERROR(Status) || CurrentHandle == NULL))
+       break;
+
+    Status = AcpiTableProtocol->GetOption(CurrentHandle, 0, &DataType, &Buffer, &DataSize);
+    Data = Buffer;
+    DBG("_DSD Child Subnode Store Op Code 0x%02X 0x%02X %02X\n",
+        DataSize, Data[0], DataSize > 1 ? Data[1] : 0);
+
+    if (Level < 2 && Data[0] != AML_PACKAGE_OP)
+      continue;
+
+    if (Level == 2 && Data[0] == AML_STRING_PREFIX) {
+      Status = AcpiTableProtocol->GetOption(CurrentHandle, 1, &DataType, &Buffer, &DataSize);
+      if (EFI_ERROR(Status))
+        break;
+
+      DBG("  _DSD Child Subnode Store Op Code 0x%02X 0x%02X %02X\n",
+              DataSize, Data[0], DataSize > 1 ? Data[1] : 0);
+
+      Data = Buffer;
+      if ((DataType != EFI_ACPI_DATA_TYPE_STRING) ||
+            ((AsciiStrCmp ((CHAR8 *) Data, ACPI_ETH_MAC_KEY) != 0) &&
+            (AsciiStrCmp ((CHAR8 *) Data, ACPI_ETH_SAS_KEY) != 0))) {
+        ChildHandle = Level1Handle;
+        continue;
+      }
+
+      DBG("_DSD Key Type %d. Found address key\n", DataType);
+
+      //
+      // We found the node.
+      //
+      *Found = TRUE;
+      continue;
+    }
+
+    if (Level == 3 && *Found) {
+      AddressBuffer = AllocateZeroPool (ADDRESS_MAX_LEN);
+      if (AddressBuffer == NULL) {
+        DEBUG ((DEBUG_ERROR, "%a:%d AllocateZeroPool failed\n", __FILE__, __LINE__));
+        return EFI_OUT_OF_RESOURCES;
+      }
+
+      switch (FoundDev) {
+        case DsdtDeviceLan:
+          //Update the MAC
+          Status = GetEnvMac (DevNextID, AddressBuffer);
+          AddressByte = 6;
+          break;
+        case DsdtDeviceSas:
+          //Update SAS Address.
+          Status = GetSasAddress (DevNextID, AddressBuffer);
+          AddressByte = 8;
+          break;
+        default:
+          Status = EFI_INVALID_PARAMETER;
+      }
+      if (EFI_ERROR (Status)) {
+        FreePool (AddressBuffer);
+        AddressBuffer = NULL;
+        break;
+      }
+
+      for (Count = 0; Count < AddressByte; Count++) {
+        Status = AcpiTableProtocol->GetOption(CurrentHandle, 1, &DataType, &Buffer, &DataSize);
+        if (EFI_ERROR(Status))
+          break;
+
+        Data = Buffer;
+        DBG("    _DSD Child Subnode Store Op Code 0x%02X 0x%02X %02X DataType 0x%X\n",
+            DataSize, Data[0], DataSize > 1 ? Data[1] : 0, DataType);
+
+        if (DataType != EFI_ACPI_DATA_TYPE_UINT)
+          break;
+
+        // only need one byte.
+        // FIXME: Assume the CPU is little endian
+        Status = AcpiTableProtocol->SetOption (CurrentHandle, 1, AddressBuffer + Count, sizeof(UINT8));
+        if (EFI_ERROR(Status))
+          break;
+        Status = AcpiTableProtocol->GetChild(ChildHandle, &CurrentHandle);
+        if (EFI_ERROR(Status) || CurrentHandle == NULL)
+          break;
+      }
+      FreePool (AddressBuffer);
+      AddressBuffer = NULL;
+      break;
+    }
+
+    if (Level > 3)
+      break;
+
+    //Search next package
+    AcpiTableProtocol->Open((VOID *) Buffer, &NextHandle);
+    Status = _SearchReplacePackageAddress(
+               AcpiTableProtocol,
+               NextHandle,
+               Level + 1,
+               Found,
+               DevNextID,
+               FoundDev);
+    AcpiTableProtocol->Close(NextHandle);
+    if (!EFI_ERROR(Status))
+      break;
+  }
+
+  return Status;
+}
+
+EFI_STATUS SearchReplacePackageAddress(
+  IN EFI_ACPI_SDT_PROTOCOL  *AcpiTableProtocol,
+  IN EFI_ACPI_HANDLE        ChildHandle,
+  IN UINTN                  DevNextID,
+  IN DSDT_DEVICE_TYPE       FoundDev
+  )
+{
+  BOOLEAN Found = FALSE;
+  UINTN Level = 0;
+
+  return _SearchReplacePackageAddress(AcpiTableProtocol, ChildHandle, Level,
+                                      &Found, DevNextID, FoundDev);
+}
+
+EFI_STATUS
+GetDeviceInfo (
+  EFI_ACPI_SDT_PROTOCOL   *AcpiTableProtocol,
+  EFI_ACPI_HANDLE         ChildHandle,
+  UINTN                   *DevID,
+  DSDT_DEVICE_TYPE        *FoundDev
+  )
+{
+  EFI_STATUS Status;
+  EFI_ACPI_DATA_TYPE  DataType;
+  CHAR8               Data[5];
+  CONST VOID          *Buffer;
+  UINTN               DataSize;
+
+  // Get NameString
+  Status = AcpiTableProtocol->GetOption (ChildHandle, 1, &DataType, &Buffer, &DataSize);
+  if (EFI_ERROR (Status)) {
+    DEBUG ((EFI_D_ERROR, "[%a:%d] Get NameString failed: %r\n", __FUNCTION__, __LINE__, Status));
+    return Status;
+  }
+
+  CopyMem (Data, Buffer, 4);
+  DBG("Size %p Data %02x %02x %02x %02x\n", DataSize, Data[0], Data[1], Data[2], Data[3]);
+
+  Data[4] = '\0';
+  if ((DataSize != 4) ||
+    (Data[3] > '9' || Data[3] < '0')) {
+    DEBUG ((DEBUG_ERROR, "The NameString %a is not ETHn or SASn\n", Data));
+    return EFI_INVALID_PARAMETER;
+  }
+
+  if (AsciiStrnCmp ("ETH", Data, 3) == 0) {
+    *FoundDev = DsdtDeviceLan;
+  } else if (AsciiStrnCmp ("SAS", Data, 3) == 0) {
+    *FoundDev = DsdtDeviceSas;
+  } else {
+    DEBUG ((DEBUG_ERROR, "[%a:%d] The NameString %a is not ETHn or SASn\n",
+            __FUNCTION__, __LINE__, Data));
+    return EFI_INVALID_PARAMETER;
+  }
+
+  *DevID = Data[3] - '0';
+  return EFI_SUCCESS;
+}
+
+EFI_STATUS ProcessDSDTDevice (
+  EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol,
+  EFI_ACPI_HANDLE ChildHandle)
+{
+  EFI_STATUS          Status;
+  EFI_ACPI_DATA_TYPE  DataType;
+  CONST UINT8         *Data;
+  CONST VOID          *Buffer;
+  UINTN               DataSize;
+  EFI_ACPI_HANDLE     DevHandle;
+  DSDT_DEVICE_TYPE    FoundDev = DsdtDeviceUnknown;
+  UINTN               DevNextID;
+  BOOLEAN             HisiAcpiDevNotFound;
+  UINTN               Index;
+
+  Status = AcpiTableProtocol->GetOption(ChildHandle, 0, &DataType, &Buffer, &DataSize);
+  if (EFI_ERROR(Status))
+    return EFI_SUCCESS;
+
+  Data = Buffer;
+  //
+  // Skip all non-device type
+  //
+  if (DataSize != 2 || Data[0] != AML_EXT_OP || Data[1] != AML_EXT_DEVICE_OP)
+    return EFI_SUCCESS;
+
+  //
+  // Walk the device type node
+  //
+  for (DevHandle = NULL; ; ) {
+    Status = AcpiTableProtocol->GetChild(ChildHandle, &DevHandle);
+    if (EFI_ERROR(Status) || DevHandle == NULL)
+      break;
+
+    //
+    // Search for _HID with Device ID
+    //
+    Status = AcpiTableProtocol->GetOption(DevHandle, 0, &DataType, &Buffer, &DataSize);
+    if (EFI_ERROR(Status))
+      break;
+
+    Data = Buffer;
+    DBG("Data Type 0x%02X %02X\n", Data[0], DataSize > 1 ? Data[1] : 0);
+    if (DataSize == 1 && Data[0] == AML_NAME_OP) {
+      Status = AcpiTableProtocol->GetOption(DevHandle, 1, &DataType, &Buffer, &DataSize);
+      if (EFI_ERROR(Status))
+        break;
+
+      Data = Buffer;
+      if (DataType == EFI_ACPI_DATA_TYPE_NAME_STRING) {
+        if (AsciiStrnCmp((CHAR8 *) Data, "_HID", 4) == 0) {
+          EFI_ACPI_HANDLE ValueHandle;
+
+          Status = AcpiTableProtocol->GetOption(DevHandle, 2, &DataType, &Buffer, &DataSize);
+          if (EFI_ERROR(Status))
+            break;
+
+          if (DataType != EFI_ACPI_DATA_TYPE_CHILD)
+            continue;
+
+          AcpiTableProtocol->Open((VOID *) Buffer, &ValueHandle);
+          Status = AcpiTableProtocol->GetOption(ValueHandle, 1, &DataType, &Buffer, &DataSize);
+
+          Data = Buffer;
+          DBG("[%a:%d] - _HID = %a\n", __FUNCTION__, __LINE__, Data);
+
+          if (EFI_ERROR(Status) ||
+              DataType != EFI_ACPI_DATA_TYPE_STRING) {
+            AcpiTableProtocol->Close (ValueHandle);
+            FoundDev = DsdtDeviceUnknown;
+            continue;
+          }
+
+          HisiAcpiDevNotFound = TRUE;
+          for (Index = 0; Index < ARRAY_SIZE (mHisiAcpiDevId); Index++) {
+            if (AsciiStrCmp ((CHAR8 *)Data, mHisiAcpiDevId[Index]) == 0) {
+              HisiAcpiDevNotFound = FALSE;
+              break;
+            }
+          }
+          if (HisiAcpiDevNotFound) {
+            AcpiTableProtocol->Close (ValueHandle);
+            FoundDev = DsdtDeviceUnknown;
+            continue;
+          }
+
+          DBG("Found device\n");
+          AcpiTableProtocol->Close(ValueHandle);
+          Status = GetDeviceInfo (AcpiTableProtocol, ChildHandle, &DevNextID, &FoundDev);
+          if (EFI_ERROR (Status)) {
+            continue;
+          }
+        } else if ((FoundDev != DsdtDeviceUnknown) && AsciiStrnCmp((CHAR8 *) Data, "_DSD", 4) == 0) {
+          //
+          // Patch DSD data
+          //
+          EFI_ACPI_HANDLE    PkgHandle;
+          Status = AcpiTableProtocol->GetOption(DevHandle, 2, &DataType, &Buffer, &DataSize);
+          if (EFI_ERROR(Status))
+            break;
+
+          if (DataType != EFI_ACPI_DATA_TYPE_CHILD)
+            continue;
+
+          //
+          // Open package data
+          //
+          AcpiTableProtocol->Open((VOID *) Buffer, &PkgHandle);
+          Status = AcpiTableProtocol->GetOption(PkgHandle, 0, &DataType, &Buffer, &DataSize);
+
+          Data = Buffer;
+          DBG("_DSD Subnode Store Op Code 0x%02X %02X\n",
+                Data[0], DataSize > 1 ? Data[1] : 0);
+
+          //
+          // Walk the _DSD node
+          //
+          if (DataSize == 1 && Data[0] == AML_PACKAGE_OP) {
+            Status = SearchReplacePackageAddress (AcpiTableProtocol, PkgHandle, DevNextID, FoundDev);
+          }
+
+          AcpiTableProtocol->Close(PkgHandle);
+        } else if (AsciiStrnCmp ((CHAR8 *) Data, "_ADR", 4) == 0) {
+          Status = AcpiTableProtocol->GetOption (DevHandle, 2, &DataType, &Buffer, &DataSize);
+          if (EFI_ERROR (Status)) {
+            break;
+          }
+
+          if (DataType != EFI_ACPI_DATA_TYPE_CHILD) {
+            continue;
+          }
+
+          Status = GetDeviceInfo (AcpiTableProtocol, ChildHandle, &DevNextID, &FoundDev);
+
+          if (EFI_ERROR (Status)) {
+            continue;
+          }
+        }
+      }
+    } else if ((DataSize == 2) && (Data[0] == AML_EXT_OP) && (Data[1] == AML_EXT_DEVICE_OP)) {
+      ProcessDSDTDevice (AcpiTableProtocol, DevHandle);
+    }
+  }
+
+  return EFI_SUCCESS;
+}
+
+
+BOOLEAN
+IsSbScope (
+  EFI_ACPI_SDT_PROTOCOL   *AcpiTableProtocol,
+  EFI_ACPI_HANDLE         ChildHandle
+  )
+{
+  EFI_STATUS          Status;
+  EFI_ACPI_DATA_TYPE  DataType;
+  CONST UINT8         *Data;
+  CONST VOID          *Buffer;
+  UINTN               DataSize;
+
+  Status = AcpiTableProtocol->GetOption (ChildHandle, 0, &DataType, &Buffer, &DataSize);
+  if (EFI_ERROR(Status)) return FALSE;
+
+  Data = Buffer;
+  if (DataSize != 1 || Data[0] != AML_SCOPE_OP) {
+    return FALSE;
+  }
+
+  return TRUE;
+}
+
+EFI_STATUS ProcessDSDTChild(
+  EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol,
+  EFI_ACPI_HANDLE ChildHandle)
+{
+  EFI_STATUS          Status;
+  EFI_ACPI_HANDLE     DevHandle;
+
+  // Check Scope(_SB) at first
+  if (!IsSbScope (AcpiTableProtocol, ChildHandle)) {
+    return ProcessDSDTDevice (AcpiTableProtocol, ChildHandle);
+  }
+
+  for (DevHandle = NULL; ; ) {
+    Status = AcpiTableProtocol->GetChild (ChildHandle, &DevHandle);
+    if (EFI_ERROR(Status) || DevHandle == NULL) {
+      break;
+    }
+
+    ProcessDSDTDevice (AcpiTableProtocol, DevHandle);
+  }
+
+  return EFI_SUCCESS;
+}
+
+static EFI_STATUS ProcessDSDT(
+  EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol,
+  EFI_ACPI_HANDLE TableHandle)
+{
+  EFI_STATUS              Status;
+  EFI_ACPI_HANDLE         ChildHandle;
+  //
+  // Parse table for device type
+  DBG ("[%a:%d] - TableHandle=%p\n", __FUNCTION__, __LINE__, TableHandle);
+  for (ChildHandle = NULL; ; ) {
+    Status = AcpiTableProtocol->GetChild(TableHandle, &ChildHandle);
+    DBG ("[%a:%d] - Child=%p, %r\n", __FUNCTION__, __LINE__, ChildHandle, Status);
+    if (EFI_ERROR(Status))
+      break;
+    if (ChildHandle == NULL)
+      break;
+
+    ProcessDSDTChild(AcpiTableProtocol, ChildHandle);
+  }
+
+  return EFI_SUCCESS;
+}
+
+STATIC
+VOID
+AcpiCheckSum (
+  IN OUT  EFI_ACPI_SDT_HEADER *Table
+  )
+{
+  UINTN ChecksumOffset;
+  UINT8 *Buffer;
+
+  ChecksumOffset = OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, Checksum);
+  Buffer = (UINT8 *)Table;
+
+  //
+  // set checksum to 0 first
+  //
+  Buffer[ChecksumOffset] = 0;
+
+  //
+  // Update checksum value
+  //
+  Buffer[ChecksumOffset] = CalculateCheckSum8 (Buffer, Table->Length);
+}
+
+EFI_STATUS UpdateAcpiDsdtTable(void)
+{
+  EFI_STATUS              Status;
+  EFI_ACPI_SDT_PROTOCOL   *AcpiTableProtocol;
+  EFI_ACPI_SDT_HEADER     *Table;
+  EFI_ACPI_TABLE_VERSION  TableVersion;
+  UINTN                   TableKey;
+  EFI_ACPI_HANDLE         TableHandle;
+  UINTN                   i;
+
+  DEBUG ((EFI_D_ERROR, "Updating Ethernet MAC in ACPI DSDT...\n"));
+
+  //
+  // Find the AcpiTable protocol
+  Status = gBS->LocateProtocol(&gEfiAcpiSdtProtocolGuid, NULL, (VOID**) &AcpiTableProtocol);
+  if (EFI_ERROR(Status)) {
+    DBG("Unable to locate ACPI table protocol\n");
+    return EFI_SUCCESS;
+  }
+
+  //
+  // Search for DSDT Table
+  for (i = 0; i < EFI_ACPI_MAX_NUM_TABLES; i++) {
+    Status = AcpiTableProtocol->GetAcpiTable(i, &Table, &TableVersion, &TableKey);
+    if (EFI_ERROR(Status))
+      break;
+    if (Table->Signature != DSDT_SIGNATURE)
+      continue;
+
+    Status = AcpiTableProtocol->OpenSdt(TableKey, &TableHandle);
+    if (EFI_ERROR(Status))
+      break;
+
+    ProcessDSDT(AcpiTableProtocol, TableHandle);
+
+    AcpiTableProtocol->Close(TableHandle);
+    AcpiCheckSum (Table);
+  }
+
+  return EFI_SUCCESS;
+}
diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.h b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.h
new file mode 100644
index 0000000..a7e1eed
--- /dev/null
+++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.h
@@ -0,0 +1,16 @@
+/*
+ *
+ * Copyright (c) 2014, Applied Micro Circuits Corporation
+ * Copyright (c) 2015, Hisilicon Limited. All rights reserved.
+ * Copyright (c) 2015, Linaro Limited. All rights reserved.
+ * Author: Loc Ho <lho@apm.com>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause-Patent
+ */
+#ifndef _ETH_MAC_H_
+#define _ETH_MAC_H_
+
+EFI_STATUS UpdateAcpiDsdtTable (VOID);
+
+#endif
+
-- 
2.8.1


  parent reply	other threads:[~2020-05-21 14:45 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 ` Ming Huang [this message]
2020-05-26 18:50   ` [RFC edk2-platforms v1 3/3] Silicon/Hisilicon: Rename EthMac files Leif Lindholm
2020-05-27 14:22     ` Ming Huang
2020-05-26 18:09 ` [RFC edk2-platforms v1 0/3] Improve D0x Leif Lindholm
2020-05-27 14:31   ` Ming Huang

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=1590072184-16219-4-git-send-email-huangming23@huawei.com \
    --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