public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: Ming Huang <huangming23@huawei.com>
To: <devel@edk2.groups.io>, <jian.j.wang@intel.com>,
	<hao.a.wu@intel.com>, <liming.gao@intel.com>
Cc: <lidongzhan@huawei.com>, <huangming23@huawei.com>,
	<songdongkuang@huawei.com>, <wanghuiqiang@huawei.com>,
	<qiuliangen@huawei.com>, <shenlimei@huawei.com>
Subject: [PATCH edk2 v2 4/5] Silicon/Hisilicon: Rename EthMac files
Date: Wed, 27 May 2020 22:33:57 +0800	[thread overview]
Message-ID: <1590590038-19724-5-git-send-email-huangming23@huawei.com> (raw)
In-Reply-To: <1590590038-19724-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 |   2 +-
 Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c            | 661 --------------------
 Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h            |  16 -
 Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.c        | 661 ++++++++++++++++++++
 Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.h        |  16 +
 6 files changed, 679 insertions(+), 679 deletions(-)

diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c
index 9cdf710..34a1dc9 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 856309a..efb7ff3 100644
--- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf
+++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf
@@ -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 6afdddf..0000000
--- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c
+++ /dev/null
@@ -1,661 +0,0 @@
-/** @file
-
-  Copyright (c) 2014, Applied Micro Curcuit Corporation. All rights reserved.<BR>
-  Copyright (c) 2015 - 2020, Hisilicon Limited. All rights reserved.<BR>
-  Copyright (c) 2015, 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/MemoryAllocationLib.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 <Protocol/HisiBoardNicProtocol.h>
-#include <Protocol/HisiSasConfig.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;
-
-STATIC
-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;
-}
-
-STATIC
-EFI_STATUS
-GetSasAddress (
-  IN UINT8        Index,
-  IN OUT UINT8    *SasAddrBuffer
-  )
-{
-  EFI_STATUS Status;
-  HISI_SAS_CONFIG_PROTOCOL *HisiSasConf;
-
-  if (SasAddrBuffer == NULL) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  Status = gBS->LocateProtocol (&gHisiSasConfigProtocolGuid, NULL, (VOID **)&HisiSasConf);
-  if (EFI_ERROR (Status)) {
-    DEBUG ((DEBUG_ERROR, "Locate Sas Config Protocol failed %r\n", Status));
-    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 Status;
-  }
-
-  return HisiSasConf->GetAddr (Index, SasAddrBuffer);
-}
-
-STATIC
-EFI_STATUS
-UpdateAddressInOption (
-  IN EFI_ACPI_SDT_PROTOCOL  *AcpiTableProtocol,
-  IN EFI_ACPI_HANDLE        ChildHandle,
-  IN UINTN                  DevNextID,
-  IN DSDT_DEVICE_TYPE       FoundDev
-  )
-{
-  EFI_STATUS          Status;
-  EFI_ACPI_DATA_TYPE  DataType;
-  CONST UINT8         *Data;
-  CONST VOID          *Buffer;
-  UINTN               DataSize;
-  UINTN               Count;
-  EFI_ACPI_HANDLE     CurrentHandle;
-  UINT8               *AddressBuffer;
-  UINT8               AddressByte;
-
-  AddressByte = 0;
-  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);
-    return Status;
-  }
-
-  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);
-  return Status;
-}
-
-STATIC
-EFI_STATUS
-UpdateAddressInPackage (
-  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;
-  EFI_ACPI_HANDLE     CurrentHandle;
-  EFI_ACPI_HANDLE     NextHandle;
-  EFI_ACPI_HANDLE     Level1Handle;
-
-  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) {
-      Status = UpdateAddressInOption (AcpiTableProtocol, ChildHandle, DevNextID, FoundDev);
-      break;
-    }
-
-    if (Level > 3)
-      break;
-
-    //Search next package
-    AcpiTableProtocol->Open((VOID *) Buffer, &NextHandle);
-    Status = UpdateAddressInPackage (
-               AcpiTableProtocol,
-               NextHandle,
-               Level + 1,
-               Found,
-               DevNextID,
-               FoundDev);
-    AcpiTableProtocol->Close(NextHandle);
-    if (!EFI_ERROR(Status))
-      break;
-  }
-
-  return Status;
-}
-
-STATIC
-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 UpdateAddressInPackage (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..6afdddf
--- /dev/null
+++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.c
@@ -0,0 +1,661 @@
+/** @file
+
+  Copyright (c) 2014, Applied Micro Curcuit Corporation. All rights reserved.<BR>
+  Copyright (c) 2015 - 2020, Hisilicon Limited. All rights reserved.<BR>
+  Copyright (c) 2015, 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/MemoryAllocationLib.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 <Protocol/HisiBoardNicProtocol.h>
+#include <Protocol/HisiSasConfig.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;
+
+STATIC
+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;
+}
+
+STATIC
+EFI_STATUS
+GetSasAddress (
+  IN UINT8        Index,
+  IN OUT UINT8    *SasAddrBuffer
+  )
+{
+  EFI_STATUS Status;
+  HISI_SAS_CONFIG_PROTOCOL *HisiSasConf;
+
+  if (SasAddrBuffer == NULL) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  Status = gBS->LocateProtocol (&gHisiSasConfigProtocolGuid, NULL, (VOID **)&HisiSasConf);
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "Locate Sas Config Protocol failed %r\n", Status));
+    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 Status;
+  }
+
+  return HisiSasConf->GetAddr (Index, SasAddrBuffer);
+}
+
+STATIC
+EFI_STATUS
+UpdateAddressInOption (
+  IN EFI_ACPI_SDT_PROTOCOL  *AcpiTableProtocol,
+  IN EFI_ACPI_HANDLE        ChildHandle,
+  IN UINTN                  DevNextID,
+  IN DSDT_DEVICE_TYPE       FoundDev
+  )
+{
+  EFI_STATUS          Status;
+  EFI_ACPI_DATA_TYPE  DataType;
+  CONST UINT8         *Data;
+  CONST VOID          *Buffer;
+  UINTN               DataSize;
+  UINTN               Count;
+  EFI_ACPI_HANDLE     CurrentHandle;
+  UINT8               *AddressBuffer;
+  UINT8               AddressByte;
+
+  AddressByte = 0;
+  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);
+    return Status;
+  }
+
+  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);
+  return Status;
+}
+
+STATIC
+EFI_STATUS
+UpdateAddressInPackage (
+  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;
+  EFI_ACPI_HANDLE     CurrentHandle;
+  EFI_ACPI_HANDLE     NextHandle;
+  EFI_ACPI_HANDLE     Level1Handle;
+
+  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) {
+      Status = UpdateAddressInOption (AcpiTableProtocol, ChildHandle, DevNextID, FoundDev);
+      break;
+    }
+
+    if (Level > 3)
+      break;
+
+    //Search next package
+    AcpiTableProtocol->Open((VOID *) Buffer, &NextHandle);
+    Status = UpdateAddressInPackage (
+               AcpiTableProtocol,
+               NextHandle,
+               Level + 1,
+               Found,
+               DevNextID,
+               FoundDev);
+    AcpiTableProtocol->Close(NextHandle);
+    if (!EFI_ERROR(Status))
+      break;
+  }
+
+  return Status;
+}
+
+STATIC
+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 UpdateAddressInPackage (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..246eb92
--- /dev/null
+++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.h
@@ -0,0 +1,16 @@
+/*
+ *
+ * Copyright (c) 2014, Applied Micro Circuits Corporation
+ * Copyright (c) 2020, 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 UPDATE_DSDT_H_
+#define UPDATE_DSDT_H_
+
+EFI_STATUS UpdateAcpiDsdtTable (VOID);
+
+#endif
+
-- 
2.8.1


  parent reply	other threads:[~2020-05-27 14:36 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-05-27 14:33 [PATCH edk2 v2 0/5] Improve D0x Ming Huang
2020-05-27 14:33 ` [PATCH edk2 v2 1/5] Silicon/Hisilicon: Change updating dsdt in ready to boot event Ming Huang
2020-06-08 17:23   ` [edk2-devel] " Leif Lindholm
2020-05-27 14:33 ` [PATCH edk2 v2 2/5] Silicon/Hisilicon: Add HISI_SAS_CONFIG_PROTOCOL Ming Huang
2020-05-27 14:33 ` [PATCH edk2 v2 3/5] Silicon/Hisilicon/Acpi: Add update sas address feature Ming Huang
2020-06-08 17:15   ` [edk2-devel] " Leif Lindholm
2020-06-09 13:24     ` Ming Huang
2020-06-09 13:28       ` Leif Lindholm
2020-05-27 14:33 ` Ming Huang [this message]
2020-05-27 14:33 ` [PATCH edk2 v2 5/5] Silicon/Hisilicon/FlashFvbDxe: Declare missing GUID dependency Ming Huang
2020-06-08 17:21   ` [edk2-devel] " Leif Lindholm

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=1590590038-19724-5-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