public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [PATCH edk2-platforms v3 0/4] Improve D0x
@ 2020-06-09 13:27 Ming Huang
  2020-06-09 13:27 ` [PATCH edk2-platforms v3 1/4] Silicon/Hisilicon: Change updating dsdt in ready to boot event Ming Huang
                   ` (3 more replies)
  0 siblings, 4 replies; 10+ messages in thread
From: Ming Huang @ 2020-06-09 13:27 UTC (permalink / raw)
  To: devel, leif, ard.biesheuvel
  Cc: lidongzhan, huangming23, songdongkuang, wanghuiqiang, qiuliangen,
	shenlimei, xiewenyi2

Main changes since v2:
1 Remove needless three lines.


Ming Huang (4):
  Silicon/Hisilicon: Change updating dsdt in ready to boot event
  Silicon/Hisilicon: Add HISI_SAS_CONFIG_PROTOCOL
  Silicon/Hisilicon/Acpi: Add update sas address feature
  Silicon/Hisilicon: Rename EthMac files

 Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c      |  58 +-
 Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf |   7 +-
 Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c            | 500 ---------------
 Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h            |  16 -
 Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.c        | 656 ++++++++++++++++++++
 Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.h        |  16 +
 Silicon/Hisilicon/HisiPkg.dec                                 |   1 +
 Silicon/Hisilicon/Include/Protocol/HisiSasConfig.h            |  43 ++
 8 files changed, 775 insertions(+), 522 deletions(-)
 delete mode 100644 Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c
 delete mode 100644 Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h
 create mode 100644 Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.c
 create mode 100644 Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.h
 create mode 100644 Silicon/Hisilicon/Include/Protocol/HisiSasConfig.h

-- 
2.8.1


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH edk2-platforms v3 1/4] Silicon/Hisilicon: Change updating dsdt in ready to boot event
  2020-06-09 13:27 [PATCH edk2-platforms v3 0/4] Improve D0x Ming Huang
@ 2020-06-09 13:27 ` Ming Huang
  2020-06-09 13:27 ` [PATCH edk2-platforms v3 2/4] Silicon/Hisilicon: Add HISI_SAS_CONFIG_PROTOCOL Ming Huang
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 10+ messages in thread
From: Ming Huang @ 2020-06-09 13:27 UTC (permalink / raw)
  To: devel, leif, ard.biesheuvel
  Cc: lidongzhan, huangming23, songdongkuang, wanghuiqiang, qiuliangen,
	shenlimei, xiewenyi2

The dsdt need be updated before boot to OS, so change the updating
to ready to boot event and can remove the needless dependence.

Signed-off-by: Ming Huang <huangming23@huawei.com>
Reviewed-by: Leif Lindholm <leif@nuviainc.com>
---
 Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c      | 56 +++++++++++++++++++-
 Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf |  4 +-
 2 files changed, 56 insertions(+), 4 deletions(-)

diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c
index b888cb1..c45a0bb 100644
--- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c
+++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c
@@ -1,7 +1,7 @@
 /** @file
 
   Copyright (c) 2014, Applied Micro Curcuit Corporation. All rights reserved.<BR>
-  Copyright (c) 2015, Hisilicon Limited. 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
 
@@ -23,6 +23,38 @@
 #include <IndustryStandard/AcpiAml.h>
 #include "EthMac.h"
 
+EFI_EVENT       mUpdateAcpiDsdtTableEvent;
+
+VOID
+EFIAPI
+UpdateAcpiDsdt (
+  IN EFI_EVENT         Event,
+  IN VOID              *Context
+  )
+{
+  EFI_ACPI_TABLE_PROTOCOL *AcpiTableProtocol;
+  EFI_STATUS              Status;
+
+  Status = gBS->LocateProtocol (
+                  &gEfiAcpiTableProtocolGuid,
+                  NULL,
+                  (VOID**)&AcpiTableProtocol
+                  );
+
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, " Unable to locate ACPI table protocol\n"));
+    return;
+  }
+
+  Status = EthMacInit ();
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, " UpdateAcpiDsdtTable Failed, Status = %r\n", Status));
+  }
+
+  gBS->CloseEvent (Event);
+  return;
+}
+
 EFI_STATUS
 EFIAPI
 AcpiPlatformEntryPoint (
@@ -30,5 +62,25 @@ AcpiPlatformEntryPoint (
   IN EFI_SYSTEM_TABLE   *SystemTable
   )
 {
-  return EthMacInit();
+  EFI_STATUS Status;
+
+  //
+  // Register notify function
+  //
+  Status = gBS->CreateEventEx (
+                  EVT_NOTIFY_SIGNAL,
+                  TPL_CALLBACK,
+                  UpdateAcpiDsdt,
+                  NULL,
+                  &gEfiEventReadyToBootGuid,
+                  &mUpdateAcpiDsdtTableEvent
+                  );
+
+  if (EFI_ERROR (Status)) {
+    DEBUG ((DEBUG_ERROR, "Create ReadyToBoot event for UpdateAcpiDsdt failed.\n"));
+  } else {
+    DEBUG ((DEBUG_INFO, "Create ReadyToBoot event for UpdateAcpiDsdt success.\n"));
+  }
+
+  return Status;
 }
diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf
index 53da731..866ff75 100644
--- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf
+++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf
@@ -1,7 +1,7 @@
 ## @file
 #
 #  Copyright (c) 2014, Applied Micro Curcuit Corp. All rights reserved.<BR>
-#  Copyright (c) 2015, Hisilicon Limited. 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
 #
@@ -62,5 +62,5 @@
   gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultCreatorRevision
 
 [Depex]
-  gEfiAcpiTableProtocolGuid AND gEfiAcpiSdtProtocolGuid AND gHisiBoardNicProtocolGuid AND gHisiInstalledAcpiProtocolGuid
+  TRUE
 
-- 
2.8.1


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH edk2-platforms v3 2/4] Silicon/Hisilicon: Add HISI_SAS_CONFIG_PROTOCOL
  2020-06-09 13:27 [PATCH edk2-platforms v3 0/4] Improve D0x Ming Huang
  2020-06-09 13:27 ` [PATCH edk2-platforms v3 1/4] Silicon/Hisilicon: Change updating dsdt in ready to boot event Ming Huang
@ 2020-06-09 13:27 ` Ming Huang
  2020-06-09 13:27 ` [PATCH edk2-platforms v3 3/4] Silicon/Hisilicon/Acpi: Add update sas address feature Ming Huang
  2020-06-09 13:27 ` [PATCH edk2-platforms v3 4/4] Silicon/Hisilicon: Rename EthMac files Ming Huang
  3 siblings, 0 replies; 10+ messages in thread
From: Ming Huang @ 2020-06-09 13:27 UTC (permalink / raw)
  To: devel, leif, ard.biesheuvel
  Cc: lidongzhan, huangming23, songdongkuang, wanghuiqiang, qiuliangen,
	shenlimei, xiewenyi2

Add HISI_SAS_CONFIG_PROTOCOL, provide get sas address interface,
this is prepare for adding update sas address feature.

Signed-off-by: Ming Huang <huangming23@huawei.com>
---
 Silicon/Hisilicon/HisiPkg.dec                      |  1 +
 Silicon/Hisilicon/Include/Protocol/HisiSasConfig.h | 43 ++++++++++++++++++++
 2 files changed, 44 insertions(+)

diff --git a/Silicon/Hisilicon/HisiPkg.dec b/Silicon/Hisilicon/HisiPkg.dec
index 63f50f7..051b5b8 100644
--- a/Silicon/Hisilicon/HisiPkg.dec
+++ b/Silicon/Hisilicon/HisiPkg.dec
@@ -34,6 +34,7 @@
   gHisiPlatformSasProtocolGuid = {0x20e9829f, 0x3a2c, 0x479a, {0x9a, 0x93, 0x45, 0x7d, 0x13, 0x50, 0x96, 0x6d}}
   gHisiSnpPlatformProtocolGuid = {0x81321f27, 0xff58, 0x4a1d, {0x99, 0x97, 0xd, 0xcc, 0xfa, 0x82, 0xf4, 0x6f}}
   gHisiInstalledAcpiProtocolGuid = {0x31505f6a, 0xe496, 0x4c7e, {0xba, 0xbb, 0x71, 0x7b, 0xe2, 0xc4, 0xb4, 0x59}}
+  gHisiSasConfigProtocolGuid = {0x3A236669, 0x6666, 0x4d04, {0xb2, 0x83, 0x7, 0x9f, 0x3c, 0xc4, 0x71, 0x66}}
 
 [Guids]
   gHisiTokenSpaceGuid = {0xc8bc553e, 0x12bf, 0x11e6, {0x97, 0x4f, 0x87, 0xf7, 0x7c, 0xfd, 0x52, 0x1d}}
diff --git a/Silicon/Hisilicon/Include/Protocol/HisiSasConfig.h b/Silicon/Hisilicon/Include/Protocol/HisiSasConfig.h
new file mode 100644
index 0000000..6b850c8
--- /dev/null
+++ b/Silicon/Hisilicon/Include/Protocol/HisiSasConfig.h
@@ -0,0 +1,43 @@
+/** @file
+
+  Copyright (c) 2020, Hisilicon Limited. All rights reserved.<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef HISI_SAS_CONFIG_H_
+#define HISI_SAS_CONFIG_H_
+
+typedef struct{
+  UINT32                             CtrlId;
+  BOOLEAN                            Enable;
+  UINT32                             Bar32;
+  UINT64                             ResetBase;
+  UINTN                              Segment;
+  UINTN                              Bus;
+  UINTN                              Device;
+  UINTN                              Fun;
+} SAS_CONTROLLER_DATA;
+
+typedef
+VOID *
+(EFIAPI *HISI_SAS_GET_CONTROLLER_DATA) (
+  VOID
+  );
+
+typedef
+EFI_STATUS
+(EFIAPI *HISI_SAS_GET_ADDRESS) (
+  IN     UINT8 Index,
+  IN OUT UINT8 *SasAddrBuffer
+  );
+
+typedef struct {
+  HISI_SAS_GET_ADDRESS GetAddr;
+  HISI_SAS_GET_CONTROLLER_DATA GetControllerData;
+} HISI_SAS_CONFIG_PROTOCOL;
+
+extern EFI_GUID gHisiSasConfigProtocolGuid;
+
+#endif
-- 
2.8.1


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH edk2-platforms v3 3/4] Silicon/Hisilicon/Acpi: Add update sas address feature
  2020-06-09 13:27 [PATCH edk2-platforms v3 0/4] Improve D0x Ming Huang
  2020-06-09 13:27 ` [PATCH edk2-platforms v3 1/4] Silicon/Hisilicon: Change updating dsdt in ready to boot event Ming Huang
  2020-06-09 13:27 ` [PATCH edk2-platforms v3 2/4] Silicon/Hisilicon: Add HISI_SAS_CONFIG_PROTOCOL Ming Huang
@ 2020-06-09 13:27 ` Ming Huang
  2020-06-16 14:20   ` [edk2-devel] " Leif Lindholm
  2020-06-09 13:27 ` [PATCH edk2-platforms v3 4/4] Silicon/Hisilicon: Rename EthMac files Ming Huang
  3 siblings, 1 reply; 10+ messages in thread
From: Ming Huang @ 2020-06-09 13:27 UTC (permalink / raw)
  To: devel, leif, ard.biesheuvel
  Cc: lidongzhan, huangming23, songdongkuang, wanghuiqiang, qiuliangen,
	shenlimei, xiewenyi2

The updating sas address feature is similar with apdating mac address.
Modify updating dsdt flow for add this feature.

Signed-off-by: Ming Huang <huangming23@huawei.com>
---
 Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c      |   2 +-
 Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf |   1 +
 Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c            | 292 +++++++++++++++-----
 Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h            |   2 +-
 4 files changed, 227 insertions(+), 70 deletions(-)

diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c
index c45a0bb..9cdf710 100644
--- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c
+++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c
@@ -46,7 +46,7 @@ UpdateAcpiDsdt (
     return;
   }
 
-  Status = EthMacInit ();
+  Status = UpdateAcpiDsdtTable ();
   if (EFI_ERROR (Status)) {
     DEBUG ((DEBUG_ERROR, " UpdateAcpiDsdtTable Failed, Status = %r\n", Status));
   }
diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf
index 866ff75..856309a 100644
--- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf
+++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf
@@ -46,6 +46,7 @@
   gEfiAcpiTableProtocolGuid                     # PROTOCOL ALWAYS_CONSUMED
   gEfiAcpiSdtProtocolGuid                       # PROTOCOL ALWAYS_CONSUMED
   gHisiBoardNicProtocolGuid                           # PROTOCOL ALWAYS_CONSUMED
+  gHisiSasConfigProtocolGuid
 
 [FeaturePcd]
   gEfiMdeModulePkgTokenSpaceGuid.PcdInstallAcpiSdtProtocol
diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c
index cd98506..841c94e 100644
--- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c
+++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c
@@ -1,7 +1,7 @@
 /** @file
 
   Copyright (c) 2014, Applied Micro Curcuit Corporation. All rights reserved.<BR>
-  Copyright (c) 2015, Hisilicon Limited. 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
 
@@ -23,6 +23,7 @@
 #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>
@@ -32,6 +33,7 @@
 #include <IndustryStandard/AcpiAml.h>
 
 #include <Protocol/HisiBoardNicProtocol.h>
+#include <Protocol/HisiSasConfig.h>
 
 // Turn on debug message by enabling below define
 //#define ACPI_DEBUG
@@ -45,17 +47,27 @@
 #define EFI_ACPI_MAX_NUM_TABLES         20
 #define DSDT_SIGNATURE                  0x54445344
 
-#define D03_ACPI_ETH_ID                     "HISI00C2"
-
 #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 MAC_MAX_LEN                     30
+#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)
+STATIC
+EFI_STATUS
+GetEnvMac(
+  IN     UINTN    MacNextID,
+  IN OUT UINT8    *MacBuffer
+  )
 {
   EFI_MAC_ADDRESS Mac;
   EFI_STATUS Status;
@@ -89,12 +101,121 @@ EFI_STATUS GetEnvMac(
   return EFI_SUCCESS;
 }
 
-EFI_STATUS _SearchReplacePackageMACAddress(
+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 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;
+    }
+
+    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                  MacNextID)
+  IN UINTN                  DevNextID,
+  IN DSDT_DEVICE_TYPE       FoundDev
+  )
 {
   // ASL template for ethernet driver:
 /*
@@ -114,15 +235,18 @@ EFI_STATUS _SearchReplacePackageMACAddress(
   CONST UINT8         *Data;
   CONST VOID          *Buffer;
   UINTN               DataSize;
-  UINTN               Count;
   EFI_ACPI_HANDLE     CurrentHandle;
   EFI_ACPI_HANDLE     NextHandle;
-  UINT8               MACBuffer[MAC_MAX_LEN];
+  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;
 
@@ -143,11 +267,14 @@ EFI_STATUS _SearchReplacePackageMACAddress(
               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)
+      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 MAC address key\n", DataType);
+      DBG("_DSD Key Type %d. Found address key\n", DataType);
 
       //
       // We found the node.
@@ -157,33 +284,7 @@ EFI_STATUS _SearchReplacePackageMACAddress(
     }
 
     if (Level == 3 && *Found) {
-
-      //Update the MAC
-      Status = GetEnvMac(MacNextID, MACBuffer);
-      if (EFI_ERROR(Status))
-        break;
-
-      for (Count = 0; Count < 6; 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, (VOID *)&MACBuffer[Count], sizeof(UINT8));
-        if (EFI_ERROR(Status))
-          break;
-        Status = AcpiTableProtocol->GetChild(ChildHandle, &CurrentHandle);
-        if (EFI_ERROR(Status) || CurrentHandle == NULL)
-          break;
-      }
+      Status = UpdateAddressInOption (AcpiTableProtocol, ChildHandle, DevNextID, FoundDev);
       break;
     }
 
@@ -192,7 +293,13 @@ EFI_STATUS _SearchReplacePackageMACAddress(
 
     //Search next package
     AcpiTableProtocol->Open((VOID *) Buffer, &NextHandle);
-    Status = _SearchReplacePackageMACAddress(AcpiTableProtocol, NextHandle, Level + 1, Found, MacNextID);
+    Status = UpdateAddressInPackage (
+               AcpiTableProtocol,
+               NextHandle,
+               Level + 1,
+               Found,
+               DevNextID,
+               FoundDev);
     AcpiTableProtocol->Close(NextHandle);
     if (!EFI_ERROR(Status))
       break;
@@ -201,22 +308,28 @@ EFI_STATUS _SearchReplacePackageMACAddress(
   return Status;
 }
 
-EFI_STATUS SearchReplacePackageMACAddress(
+STATIC
+EFI_STATUS
+SearchReplacePackageAddress (
   IN EFI_ACPI_SDT_PROTOCOL  *AcpiTableProtocol,
   IN EFI_ACPI_HANDLE        ChildHandle,
-  IN UINTN                  MacNextID)
+  IN UINTN                  DevNextID,
+  IN DSDT_DEVICE_TYPE       FoundDev
+  )
 {
   BOOLEAN Found = FALSE;
   UINTN Level = 0;
 
-  return _SearchReplacePackageMACAddress(AcpiTableProtocol, ChildHandle, Level, &Found, MacNextID);
+  return UpdateAddressInPackage (AcpiTableProtocol, ChildHandle, Level,
+                                 &Found, DevNextID, FoundDev);
 }
 
 EFI_STATUS
-GetEthID (
+GetDeviceInfo (
   EFI_ACPI_SDT_PROTOCOL   *AcpiTableProtocol,
   EFI_ACPI_HANDLE         ChildHandle,
-  UINTN                   *EthID
+  UINTN                   *DevID,
+  DSDT_DEVICE_TYPE        *FoundDev
   )
 {
   EFI_STATUS Status;
@@ -225,7 +338,7 @@ GetEthID (
   CONST VOID          *Buffer;
   UINTN               DataSize;
 
-  // Get NameString ETHx
+  // 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));
@@ -236,14 +349,23 @@ GetEthID (
   DBG("Size %p Data %02x %02x %02x %02x\n", DataSize, Data[0], Data[1], Data[2], Data[3]);
 
   Data[4] = '\0';
-  if (DataSize != 4 ||
-      AsciiStrnCmp ("ETH", Data, 3) != 0 ||
-      Data[3] > '9' || Data[3] < '0') {
-    DEBUG ((EFI_D_ERROR, "[%a:%d] The NameString %a is not ETHn\n", __FUNCTION__, __LINE__, Data));
+  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;
   }
 
-  *EthID = Data[3] - '0';
+  *DevID = Data[3] - '0';
   return EFI_SUCCESS;
 }
 
@@ -257,8 +379,10 @@ EFI_STATUS ProcessDSDTDevice (
   CONST VOID          *Buffer;
   UINTN               DataSize;
   EFI_ACPI_HANDLE     DevHandle;
-  INTN                Found = 0;
-  UINTN               MacNextID;
+  DSDT_DEVICE_TYPE    FoundDev = DsdtDeviceUnknown;
+  UINTN               DevNextID;
+  BOOLEAN             HisiAcpiDevNotFound;
+  UINTN               Index;
 
   Status = AcpiTableProtocol->GetOption(ChildHandle, 0, &DataType, &Buffer, &DataSize);
   if (EFI_ERROR(Status))
@@ -280,7 +404,7 @@ EFI_STATUS ProcessDSDTDevice (
       break;
 
     //
-    // Search for _HID with Ethernet ID
+    // Search for _HID with Device ID
     //
     Status = AcpiTableProtocol->GetOption(DevHandle, 0, &DataType, &Buffer, &DataSize);
     if (EFI_ERROR(Status))
@@ -312,23 +436,34 @@ EFI_STATUS ProcessDSDTDevice (
           DBG("[%a:%d] - _HID = %a\n", __FUNCTION__, __LINE__, Data);
 
           if (EFI_ERROR(Status) ||
-              DataType != EFI_ACPI_DATA_TYPE_STRING ||
-              (AsciiStrCmp((CHAR8 *) Data, D03_ACPI_ETH_ID) != 0)) {
-            AcpiTableProtocol->Close(ValueHandle);
-            Found = 0;
+              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 Ethernet device\n");
+          DBG("Found device\n");
           AcpiTableProtocol->Close(ValueHandle);
-          Status = GetEthID (AcpiTableProtocol, ChildHandle, &MacNextID);
+          Status = GetDeviceInfo (AcpiTableProtocol, ChildHandle, &DevNextID, &FoundDev);
           if (EFI_ERROR (Status)) {
             continue;
           }
-          Found = 1;
-        } else if (Found == 1 && AsciiStrnCmp((CHAR8 *) Data, "_DSD", 4) == 0) {
+        } else if ((FoundDev != DsdtDeviceUnknown) && AsciiStrnCmp((CHAR8 *) Data, "_DSD", 4) == 0) {
           //
-          // Patch MAC address for open source kernel
+          // Patch DSD data
           //
           EFI_ACPI_HANDLE    PkgHandle;
           Status = AcpiTableProtocol->GetOption(DevHandle, 2, &DataType, &Buffer, &DataSize);
@@ -351,12 +486,30 @@ EFI_STATUS ProcessDSDTDevice (
           //
           // Walk the _DSD node
           //
-          if (DataSize == 1 && Data[0] == AML_PACKAGE_OP)
-            Status = SearchReplacePackageMACAddress(AcpiTableProtocol, PkgHandle, MacNextID);
+          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);
     }
   }
 
@@ -457,7 +610,10 @@ AcpiCheckSum (
   Buffer[ChecksumOffset] = CalculateCheckSum8 (Buffer, Table->Length);
 }
 
-EFI_STATUS EthMacInit(void)
+EFI_STATUS
+UpdateAcpiDsdtTable (
+  VOID
+  )
 {
   EFI_STATUS              Status;
   EFI_ACPI_SDT_PROTOCOL   *AcpiTableProtocol;
diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h
index 0a3e811..a7e1eed 100644
--- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h
+++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h
@@ -10,7 +10,7 @@
 #ifndef _ETH_MAC_H_
 #define _ETH_MAC_H_
 
-EFI_STATUS EthMacInit(VOID);
+EFI_STATUS UpdateAcpiDsdtTable (VOID);
 
 #endif
 
-- 
2.8.1


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH edk2-platforms v3 4/4] Silicon/Hisilicon: Rename EthMac files
  2020-06-09 13:27 [PATCH edk2-platforms v3 0/4] Improve D0x Ming Huang
                   ` (2 preceding siblings ...)
  2020-06-09 13:27 ` [PATCH edk2-platforms v3 3/4] Silicon/Hisilicon/Acpi: Add update sas address feature Ming Huang
@ 2020-06-09 13:27 ` Ming Huang
  3 siblings, 0 replies; 10+ messages in thread
From: Ming Huang @ 2020-06-09 13:27 UTC (permalink / raw)
  To: devel, leif, ard.biesheuvel
  Cc: lidongzhan, huangming23, songdongkuang, wanghuiqiang, qiuliangen,
	shenlimei, xiewenyi2

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            | 656 --------------------
 Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h            |  16 -
 Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.c        | 656 ++++++++++++++++++++
 Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.h        |  16 +
 6 files changed, 674 insertions(+), 674 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 841c94e..0000000
--- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c
+++ /dev/null
@@ -1,656 +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 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;
-    }
-
-    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..841c94e
--- /dev/null
+++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.c
@@ -0,0 +1,656 @@
+/** @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 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;
+    }
+
+    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


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [edk2-devel] [PATCH edk2-platforms v3 3/4] Silicon/Hisilicon/Acpi: Add update sas address feature
  2020-06-09 13:27 ` [PATCH edk2-platforms v3 3/4] Silicon/Hisilicon/Acpi: Add update sas address feature Ming Huang
@ 2020-06-16 14:20   ` Leif Lindholm
  2020-06-17  2:07     ` Ming Huang
  0 siblings, 1 reply; 10+ messages in thread
From: Leif Lindholm @ 2020-06-16 14:20 UTC (permalink / raw)
  To: devel, huangming23
  Cc: ard.biesheuvel, lidongzhan, songdongkuang, wanghuiqiang,
	qiuliangen, shenlimei, xiewenyi2

One remaining question, then this set is ready to go in:

On Tue, Jun 09, 2020 at 21:27:24 +0800, Ming Huang wrote:
> The updating sas address feature is similar with apdating mac address.
> Modify updating dsdt flow for add this feature.
> 
> Signed-off-by: Ming Huang <huangming23@huawei.com>
> ---
>  Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c      |   2 +-
>  Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf |   1 +
>  Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c            | 292 +++++++++++++++-----
>  Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h            |   2 +-
>  4 files changed, 227 insertions(+), 70 deletions(-)
> 
> diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c
> index c45a0bb..9cdf710 100644
> --- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c
> +++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c
> @@ -46,7 +46,7 @@ UpdateAcpiDsdt (
>      return;
>    }
>  
> -  Status = EthMacInit ();
> +  Status = UpdateAcpiDsdtTable ();
>    if (EFI_ERROR (Status)) {
>      DEBUG ((DEBUG_ERROR, " UpdateAcpiDsdtTable Failed, Status = %r\n", Status));
>    }
> diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf
> index 866ff75..856309a 100644
> --- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf
> +++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf
> @@ -46,6 +46,7 @@
>    gEfiAcpiTableProtocolGuid                     # PROTOCOL ALWAYS_CONSUMED
>    gEfiAcpiSdtProtocolGuid                       # PROTOCOL ALWAYS_CONSUMED
>    gHisiBoardNicProtocolGuid                           # PROTOCOL ALWAYS_CONSUMED
> +  gHisiSasConfigProtocolGuid
>  
>  [FeaturePcd]
>    gEfiMdeModulePkgTokenSpaceGuid.PcdInstallAcpiSdtProtocol
> diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c
> index cd98506..841c94e 100644
> --- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c
> +++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c
> @@ -1,7 +1,7 @@
>  /** @file
>  
>    Copyright (c) 2014, Applied Micro Curcuit Corporation. All rights reserved.<BR>
> -  Copyright (c) 2015, Hisilicon Limited. 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
>  
> @@ -23,6 +23,7 @@
>  #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>
> @@ -32,6 +33,7 @@
>  #include <IndustryStandard/AcpiAml.h>
>  
>  #include <Protocol/HisiBoardNicProtocol.h>
> +#include <Protocol/HisiSasConfig.h>
>  
>  // Turn on debug message by enabling below define
>  //#define ACPI_DEBUG
> @@ -45,17 +47,27 @@
>  #define EFI_ACPI_MAX_NUM_TABLES         20
>  #define DSDT_SIGNATURE                  0x54445344
>  
> -#define D03_ACPI_ETH_ID                     "HISI00C2"
> -
>  #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 MAC_MAX_LEN                     30
> +#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)
> +STATIC
> +EFI_STATUS
> +GetEnvMac(
> +  IN     UINTN    MacNextID,
> +  IN OUT UINT8    *MacBuffer
> +  )
>  {
>    EFI_MAC_ADDRESS Mac;
>    EFI_STATUS Status;
> @@ -89,12 +101,121 @@ EFI_STATUS GetEnvMac(
>    return EFI_SUCCESS;
>  }
>  
> -EFI_STATUS _SearchReplacePackageMACAddress(
> +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;

This is still a sompletely random-looking value being stuffed into the
buffer. What is it?

/
    Leif

> +    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 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;
> +    }
> +
> +    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                  MacNextID)
> +  IN UINTN                  DevNextID,
> +  IN DSDT_DEVICE_TYPE       FoundDev
> +  )
>  {
>    // ASL template for ethernet driver:
>  /*
> @@ -114,15 +235,18 @@ EFI_STATUS _SearchReplacePackageMACAddress(
>    CONST UINT8         *Data;
>    CONST VOID          *Buffer;
>    UINTN               DataSize;
> -  UINTN               Count;
>    EFI_ACPI_HANDLE     CurrentHandle;
>    EFI_ACPI_HANDLE     NextHandle;
> -  UINT8               MACBuffer[MAC_MAX_LEN];
> +  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;
>  
> @@ -143,11 +267,14 @@ EFI_STATUS _SearchReplacePackageMACAddress(
>                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)
> +      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 MAC address key\n", DataType);
> +      DBG("_DSD Key Type %d. Found address key\n", DataType);
>  
>        //
>        // We found the node.
> @@ -157,33 +284,7 @@ EFI_STATUS _SearchReplacePackageMACAddress(
>      }
>  
>      if (Level == 3 && *Found) {
> -
> -      //Update the MAC
> -      Status = GetEnvMac(MacNextID, MACBuffer);
> -      if (EFI_ERROR(Status))
> -        break;
> -
> -      for (Count = 0; Count < 6; 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, (VOID *)&MACBuffer[Count], sizeof(UINT8));
> -        if (EFI_ERROR(Status))
> -          break;
> -        Status = AcpiTableProtocol->GetChild(ChildHandle, &CurrentHandle);
> -        if (EFI_ERROR(Status) || CurrentHandle == NULL)
> -          break;
> -      }
> +      Status = UpdateAddressInOption (AcpiTableProtocol, ChildHandle, DevNextID, FoundDev);
>        break;
>      }
>  
> @@ -192,7 +293,13 @@ EFI_STATUS _SearchReplacePackageMACAddress(
>  
>      //Search next package
>      AcpiTableProtocol->Open((VOID *) Buffer, &NextHandle);
> -    Status = _SearchReplacePackageMACAddress(AcpiTableProtocol, NextHandle, Level + 1, Found, MacNextID);
> +    Status = UpdateAddressInPackage (
> +               AcpiTableProtocol,
> +               NextHandle,
> +               Level + 1,
> +               Found,
> +               DevNextID,
> +               FoundDev);
>      AcpiTableProtocol->Close(NextHandle);
>      if (!EFI_ERROR(Status))
>        break;
> @@ -201,22 +308,28 @@ EFI_STATUS _SearchReplacePackageMACAddress(
>    return Status;
>  }
>  
> -EFI_STATUS SearchReplacePackageMACAddress(
> +STATIC
> +EFI_STATUS
> +SearchReplacePackageAddress (
>    IN EFI_ACPI_SDT_PROTOCOL  *AcpiTableProtocol,
>    IN EFI_ACPI_HANDLE        ChildHandle,
> -  IN UINTN                  MacNextID)
> +  IN UINTN                  DevNextID,
> +  IN DSDT_DEVICE_TYPE       FoundDev
> +  )
>  {
>    BOOLEAN Found = FALSE;
>    UINTN Level = 0;
>  
> -  return _SearchReplacePackageMACAddress(AcpiTableProtocol, ChildHandle, Level, &Found, MacNextID);
> +  return UpdateAddressInPackage (AcpiTableProtocol, ChildHandle, Level,
> +                                 &Found, DevNextID, FoundDev);
>  }
>  
>  EFI_STATUS
> -GetEthID (
> +GetDeviceInfo (
>    EFI_ACPI_SDT_PROTOCOL   *AcpiTableProtocol,
>    EFI_ACPI_HANDLE         ChildHandle,
> -  UINTN                   *EthID
> +  UINTN                   *DevID,
> +  DSDT_DEVICE_TYPE        *FoundDev
>    )
>  {
>    EFI_STATUS Status;
> @@ -225,7 +338,7 @@ GetEthID (
>    CONST VOID          *Buffer;
>    UINTN               DataSize;
>  
> -  // Get NameString ETHx
> +  // 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));
> @@ -236,14 +349,23 @@ GetEthID (
>    DBG("Size %p Data %02x %02x %02x %02x\n", DataSize, Data[0], Data[1], Data[2], Data[3]);
>  
>    Data[4] = '\0';
> -  if (DataSize != 4 ||
> -      AsciiStrnCmp ("ETH", Data, 3) != 0 ||
> -      Data[3] > '9' || Data[3] < '0') {
> -    DEBUG ((EFI_D_ERROR, "[%a:%d] The NameString %a is not ETHn\n", __FUNCTION__, __LINE__, Data));
> +  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;
>    }
>  
> -  *EthID = Data[3] - '0';
> +  *DevID = Data[3] - '0';
>    return EFI_SUCCESS;
>  }
>  
> @@ -257,8 +379,10 @@ EFI_STATUS ProcessDSDTDevice (
>    CONST VOID          *Buffer;
>    UINTN               DataSize;
>    EFI_ACPI_HANDLE     DevHandle;
> -  INTN                Found = 0;
> -  UINTN               MacNextID;
> +  DSDT_DEVICE_TYPE    FoundDev = DsdtDeviceUnknown;
> +  UINTN               DevNextID;
> +  BOOLEAN             HisiAcpiDevNotFound;
> +  UINTN               Index;
>  
>    Status = AcpiTableProtocol->GetOption(ChildHandle, 0, &DataType, &Buffer, &DataSize);
>    if (EFI_ERROR(Status))
> @@ -280,7 +404,7 @@ EFI_STATUS ProcessDSDTDevice (
>        break;
>  
>      //
> -    // Search for _HID with Ethernet ID
> +    // Search for _HID with Device ID
>      //
>      Status = AcpiTableProtocol->GetOption(DevHandle, 0, &DataType, &Buffer, &DataSize);
>      if (EFI_ERROR(Status))
> @@ -312,23 +436,34 @@ EFI_STATUS ProcessDSDTDevice (
>            DBG("[%a:%d] - _HID = %a\n", __FUNCTION__, __LINE__, Data);
>  
>            if (EFI_ERROR(Status) ||
> -              DataType != EFI_ACPI_DATA_TYPE_STRING ||
> -              (AsciiStrCmp((CHAR8 *) Data, D03_ACPI_ETH_ID) != 0)) {
> -            AcpiTableProtocol->Close(ValueHandle);
> -            Found = 0;
> +              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 Ethernet device\n");
> +          DBG("Found device\n");
>            AcpiTableProtocol->Close(ValueHandle);
> -          Status = GetEthID (AcpiTableProtocol, ChildHandle, &MacNextID);
> +          Status = GetDeviceInfo (AcpiTableProtocol, ChildHandle, &DevNextID, &FoundDev);
>            if (EFI_ERROR (Status)) {
>              continue;
>            }
> -          Found = 1;
> -        } else if (Found == 1 && AsciiStrnCmp((CHAR8 *) Data, "_DSD", 4) == 0) {
> +        } else if ((FoundDev != DsdtDeviceUnknown) && AsciiStrnCmp((CHAR8 *) Data, "_DSD", 4) == 0) {
>            //
> -          // Patch MAC address for open source kernel
> +          // Patch DSD data
>            //
>            EFI_ACPI_HANDLE    PkgHandle;
>            Status = AcpiTableProtocol->GetOption(DevHandle, 2, &DataType, &Buffer, &DataSize);
> @@ -351,12 +486,30 @@ EFI_STATUS ProcessDSDTDevice (
>            //
>            // Walk the _DSD node
>            //
> -          if (DataSize == 1 && Data[0] == AML_PACKAGE_OP)
> -            Status = SearchReplacePackageMACAddress(AcpiTableProtocol, PkgHandle, MacNextID);
> +          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);
>      }
>    }
>  
> @@ -457,7 +610,10 @@ AcpiCheckSum (
>    Buffer[ChecksumOffset] = CalculateCheckSum8 (Buffer, Table->Length);
>  }
>  
> -EFI_STATUS EthMacInit(void)
> +EFI_STATUS
> +UpdateAcpiDsdtTable (
> +  VOID
> +  )
>  {
>    EFI_STATUS              Status;
>    EFI_ACPI_SDT_PROTOCOL   *AcpiTableProtocol;
> diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h
> index 0a3e811..a7e1eed 100644
> --- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h
> +++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h
> @@ -10,7 +10,7 @@
>  #ifndef _ETH_MAC_H_
>  #define _ETH_MAC_H_
>  
> -EFI_STATUS EthMacInit(VOID);
> +EFI_STATUS UpdateAcpiDsdtTable (VOID);
>  
>  #endif
>  
> -- 
> 2.8.1
> 
> 
> 
> 

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [edk2-devel] [PATCH edk2-platforms v3 3/4] Silicon/Hisilicon/Acpi: Add update sas address feature
  2020-06-16 14:20   ` [edk2-devel] " Leif Lindholm
@ 2020-06-17  2:07     ` Ming Huang
  2020-06-17 11:07       ` Leif Lindholm
  0 siblings, 1 reply; 10+ messages in thread
From: Ming Huang @ 2020-06-17  2:07 UTC (permalink / raw)
  To: Leif Lindholm, devel
  Cc: ard.biesheuvel, lidongzhan, songdongkuang, wanghuiqiang,
	qiuliangen, shenlimei, xiewenyi2



在 2020/6/16 22:20, Leif Lindholm 写道:
> One remaining question, then this set is ready to go in:
> 
> On Tue, Jun 09, 2020 at 21:27:24 +0800, Ming Huang wrote:
>> The updating sas address feature is similar with apdating mac address.
>> Modify updating dsdt flow for add this feature.
>>
>> Signed-off-by: Ming Huang <huangming23@huawei.com>
>> ---
>>  Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c      |   2 +-
>>  Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf |   1 +
>>  Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c            | 292 +++++++++++++++-----
>>  Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h            |   2 +-
>>  4 files changed, 227 insertions(+), 70 deletions(-)
>>
>> diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c
>> index c45a0bb..9cdf710 100644
>> --- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c
>> +++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c
>> @@ -46,7 +46,7 @@ UpdateAcpiDsdt (
>>      return;
>>    }
>>
>> -  Status = EthMacInit ();
>> +  Status = UpdateAcpiDsdtTable ();
>>    if (EFI_ERROR (Status)) {
>>      DEBUG ((DEBUG_ERROR, " UpdateAcpiDsdtTable Failed, Status = %r\n", Status));
>>    }
>> diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf
>> index 866ff75..856309a 100644
>> --- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf
>> +++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf
>> @@ -46,6 +46,7 @@
>>    gEfiAcpiTableProtocolGuid                     # PROTOCOL ALWAYS_CONSUMED
>>    gEfiAcpiSdtProtocolGuid                       # PROTOCOL ALWAYS_CONSUMED
>>    gHisiBoardNicProtocolGuid                           # PROTOCOL ALWAYS_CONSUMED
>> +  gHisiSasConfigProtocolGuid
>>
>>  [FeaturePcd]
>>    gEfiMdeModulePkgTokenSpaceGuid.PcdInstallAcpiSdtProtocol
>> diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c
>> index cd98506..841c94e 100644
>> --- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c
>> +++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c
>> @@ -1,7 +1,7 @@
>>  /** @file
>>
>>    Copyright (c) 2014, Applied Micro Curcuit Corporation. All rights reserved.<BR>
>> -  Copyright (c) 2015, Hisilicon Limited. 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
>>
>> @@ -23,6 +23,7 @@
>>  #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>
>> @@ -32,6 +33,7 @@
>>  #include <IndustryStandard/AcpiAml.h>
>>
>>  #include <Protocol/HisiBoardNicProtocol.h>
>> +#include <Protocol/HisiSasConfig.h>
>>
>>  // Turn on debug message by enabling below define
>>  //#define ACPI_DEBUG
>> @@ -45,17 +47,27 @@
>>  #define EFI_ACPI_MAX_NUM_TABLES         20
>>  #define DSDT_SIGNATURE                  0x54445344
>>
>> -#define D03_ACPI_ETH_ID                     "HISI00C2"
>> -
>>  #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 MAC_MAX_LEN                     30
>> +#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)
>> +STATIC
>> +EFI_STATUS
>> +GetEnvMac(
>> +  IN     UINTN    MacNextID,
>> +  IN OUT UINT8    *MacBuffer
>> +  )
>>  {
>>    EFI_MAC_ADDRESS Mac;
>>    EFI_STATUS Status;
>> @@ -89,12 +101,121 @@ EFI_STATUS GetEnvMac(
>>    return EFI_SUCCESS;
>>  }
>>
>> -EFI_STATUS _SearchReplacePackageMACAddress(
>> +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;
> 
> This is still a sompletely random-looking value being stuffed into the
> buffer. What is it?

This is a random value. Maybe it is more appropriate to stuff zero into the
buffer here.

Thanks,
Ming

> 
> /
>     Leif
> 
>> +    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 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;
>> +    }
>> +
>> +    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                  MacNextID)
>> +  IN UINTN                  DevNextID,
>> +  IN DSDT_DEVICE_TYPE       FoundDev
>> +  )
>>  {
>>    // ASL template for ethernet driver:
>>  /*
>> @@ -114,15 +235,18 @@ EFI_STATUS _SearchReplacePackageMACAddress(
>>    CONST UINT8         *Data;
>>    CONST VOID          *Buffer;
>>    UINTN               DataSize;
>> -  UINTN               Count;
>>    EFI_ACPI_HANDLE     CurrentHandle;
>>    EFI_ACPI_HANDLE     NextHandle;
>> -  UINT8               MACBuffer[MAC_MAX_LEN];
>> +  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;
>>
>> @@ -143,11 +267,14 @@ EFI_STATUS _SearchReplacePackageMACAddress(
>>                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)
>> +      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 MAC address key\n", DataType);
>> +      DBG("_DSD Key Type %d. Found address key\n", DataType);
>>
>>        //
>>        // We found the node.
>> @@ -157,33 +284,7 @@ EFI_STATUS _SearchReplacePackageMACAddress(
>>      }
>>
>>      if (Level == 3 && *Found) {
>> -
>> -      //Update the MAC
>> -      Status = GetEnvMac(MacNextID, MACBuffer);
>> -      if (EFI_ERROR(Status))
>> -        break;
>> -
>> -      for (Count = 0; Count < 6; 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, (VOID *)&MACBuffer[Count], sizeof(UINT8));
>> -        if (EFI_ERROR(Status))
>> -          break;
>> -        Status = AcpiTableProtocol->GetChild(ChildHandle, &CurrentHandle);
>> -        if (EFI_ERROR(Status) || CurrentHandle == NULL)
>> -          break;
>> -      }
>> +      Status = UpdateAddressInOption (AcpiTableProtocol, ChildHandle, DevNextID, FoundDev);
>>        break;
>>      }
>>
>> @@ -192,7 +293,13 @@ EFI_STATUS _SearchReplacePackageMACAddress(
>>
>>      //Search next package
>>      AcpiTableProtocol->Open((VOID *) Buffer, &NextHandle);
>> -    Status = _SearchReplacePackageMACAddress(AcpiTableProtocol, NextHandle, Level + 1, Found, MacNextID);
>> +    Status = UpdateAddressInPackage (
>> +               AcpiTableProtocol,
>> +               NextHandle,
>> +               Level + 1,
>> +               Found,
>> +               DevNextID,
>> +               FoundDev);
>>      AcpiTableProtocol->Close(NextHandle);
>>      if (!EFI_ERROR(Status))
>>        break;
>> @@ -201,22 +308,28 @@ EFI_STATUS _SearchReplacePackageMACAddress(
>>    return Status;
>>  }
>>
>> -EFI_STATUS SearchReplacePackageMACAddress(
>> +STATIC
>> +EFI_STATUS
>> +SearchReplacePackageAddress (
>>    IN EFI_ACPI_SDT_PROTOCOL  *AcpiTableProtocol,
>>    IN EFI_ACPI_HANDLE        ChildHandle,
>> -  IN UINTN                  MacNextID)
>> +  IN UINTN                  DevNextID,
>> +  IN DSDT_DEVICE_TYPE       FoundDev
>> +  )
>>  {
>>    BOOLEAN Found = FALSE;
>>    UINTN Level = 0;
>>
>> -  return _SearchReplacePackageMACAddress(AcpiTableProtocol, ChildHandle, Level, &Found, MacNextID);
>> +  return UpdateAddressInPackage (AcpiTableProtocol, ChildHandle, Level,
>> +                                 &Found, DevNextID, FoundDev);
>>  }
>>
>>  EFI_STATUS
>> -GetEthID (
>> +GetDeviceInfo (
>>    EFI_ACPI_SDT_PROTOCOL   *AcpiTableProtocol,
>>    EFI_ACPI_HANDLE         ChildHandle,
>> -  UINTN                   *EthID
>> +  UINTN                   *DevID,
>> +  DSDT_DEVICE_TYPE        *FoundDev
>>    )
>>  {
>>    EFI_STATUS Status;
>> @@ -225,7 +338,7 @@ GetEthID (
>>    CONST VOID          *Buffer;
>>    UINTN               DataSize;
>>
>> -  // Get NameString ETHx
>> +  // 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));
>> @@ -236,14 +349,23 @@ GetEthID (
>>    DBG("Size %p Data %02x %02x %02x %02x\n", DataSize, Data[0], Data[1], Data[2], Data[3]);
>>
>>    Data[4] = '\0';
>> -  if (DataSize != 4 ||
>> -      AsciiStrnCmp ("ETH", Data, 3) != 0 ||
>> -      Data[3] > '9' || Data[3] < '0') {
>> -    DEBUG ((EFI_D_ERROR, "[%a:%d] The NameString %a is not ETHn\n", __FUNCTION__, __LINE__, Data));
>> +  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;
>>    }
>>
>> -  *EthID = Data[3] - '0';
>> +  *DevID = Data[3] - '0';
>>    return EFI_SUCCESS;
>>  }
>>
>> @@ -257,8 +379,10 @@ EFI_STATUS ProcessDSDTDevice (
>>    CONST VOID          *Buffer;
>>    UINTN               DataSize;
>>    EFI_ACPI_HANDLE     DevHandle;
>> -  INTN                Found = 0;
>> -  UINTN               MacNextID;
>> +  DSDT_DEVICE_TYPE    FoundDev = DsdtDeviceUnknown;
>> +  UINTN               DevNextID;
>> +  BOOLEAN             HisiAcpiDevNotFound;
>> +  UINTN               Index;
>>
>>    Status = AcpiTableProtocol->GetOption(ChildHandle, 0, &DataType, &Buffer, &DataSize);
>>    if (EFI_ERROR(Status))
>> @@ -280,7 +404,7 @@ EFI_STATUS ProcessDSDTDevice (
>>        break;
>>
>>      //
>> -    // Search for _HID with Ethernet ID
>> +    // Search for _HID with Device ID
>>      //
>>      Status = AcpiTableProtocol->GetOption(DevHandle, 0, &DataType, &Buffer, &DataSize);
>>      if (EFI_ERROR(Status))
>> @@ -312,23 +436,34 @@ EFI_STATUS ProcessDSDTDevice (
>>            DBG("[%a:%d] - _HID = %a\n", __FUNCTION__, __LINE__, Data);
>>
>>            if (EFI_ERROR(Status) ||
>> -              DataType != EFI_ACPI_DATA_TYPE_STRING ||
>> -              (AsciiStrCmp((CHAR8 *) Data, D03_ACPI_ETH_ID) != 0)) {
>> -            AcpiTableProtocol->Close(ValueHandle);
>> -            Found = 0;
>> +              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 Ethernet device\n");
>> +          DBG("Found device\n");
>>            AcpiTableProtocol->Close(ValueHandle);
>> -          Status = GetEthID (AcpiTableProtocol, ChildHandle, &MacNextID);
>> +          Status = GetDeviceInfo (AcpiTableProtocol, ChildHandle, &DevNextID, &FoundDev);
>>            if (EFI_ERROR (Status)) {
>>              continue;
>>            }
>> -          Found = 1;
>> -        } else if (Found == 1 && AsciiStrnCmp((CHAR8 *) Data, "_DSD", 4) == 0) {
>> +        } else if ((FoundDev != DsdtDeviceUnknown) && AsciiStrnCmp((CHAR8 *) Data, "_DSD", 4) == 0) {
>>            //
>> -          // Patch MAC address for open source kernel
>> +          // Patch DSD data
>>            //
>>            EFI_ACPI_HANDLE    PkgHandle;
>>            Status = AcpiTableProtocol->GetOption(DevHandle, 2, &DataType, &Buffer, &DataSize);
>> @@ -351,12 +486,30 @@ EFI_STATUS ProcessDSDTDevice (
>>            //
>>            // Walk the _DSD node
>>            //
>> -          if (DataSize == 1 && Data[0] == AML_PACKAGE_OP)
>> -            Status = SearchReplacePackageMACAddress(AcpiTableProtocol, PkgHandle, MacNextID);
>> +          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);
>>      }
>>    }
>>
>> @@ -457,7 +610,10 @@ AcpiCheckSum (
>>    Buffer[ChecksumOffset] = CalculateCheckSum8 (Buffer, Table->Length);
>>  }
>>
>> -EFI_STATUS EthMacInit(void)
>> +EFI_STATUS
>> +UpdateAcpiDsdtTable (
>> +  VOID
>> +  )
>>  {
>>    EFI_STATUS              Status;
>>    EFI_ACPI_SDT_PROTOCOL   *AcpiTableProtocol;
>> diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h
>> index 0a3e811..a7e1eed 100644
>> --- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h
>> +++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h
>> @@ -10,7 +10,7 @@
>>  #ifndef _ETH_MAC_H_
>>  #define _ETH_MAC_H_
>>
>> -EFI_STATUS EthMacInit(VOID);
>> +EFI_STATUS UpdateAcpiDsdtTable (VOID);
>>
>>  #endif
>>
>> -- 
>> 2.8.1
>>
>>
>> 
>>
> 
> .
> 


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [edk2-devel] [PATCH edk2-platforms v3 3/4] Silicon/Hisilicon/Acpi: Add update sas address feature
  2020-06-17  2:07     ` Ming Huang
@ 2020-06-17 11:07       ` Leif Lindholm
  2020-06-17 11:23         ` Ming Huang
  0 siblings, 1 reply; 10+ messages in thread
From: Leif Lindholm @ 2020-06-17 11:07 UTC (permalink / raw)
  To: Ming Huang
  Cc: devel, ard.biesheuvel, lidongzhan, songdongkuang, wanghuiqiang,
	qiuliangen, shenlimei, xiewenyi2

On Wed, Jun 17, 2020 at 10:07:39 +0800, Ming Huang wrote:
> 
> 
> 在 2020/6/16 22:20, Leif Lindholm 写道:
> > One remaining question, then this set is ready to go in:
> > 
> > On Tue, Jun 09, 2020 at 21:27:24 +0800, Ming Huang wrote:
> >> The updating sas address feature is similar with apdating mac address.
> >> Modify updating dsdt flow for add this feature.
> >>
> >> Signed-off-by: Ming Huang <huangming23@huawei.com>
> >> ---
> >>  Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c      |   2 +-
> >>  Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf |   1 +
> >>  Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c            | 292 +++++++++++++++-----
> >>  Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h            |   2 +-
> >>  4 files changed, 227 insertions(+), 70 deletions(-)
> >>
> >> diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c
> >> index c45a0bb..9cdf710 100644
> >> --- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c
> >> +++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c
> >> @@ -46,7 +46,7 @@ UpdateAcpiDsdt (
> >>      return;
> >>    }
> >>  
> >> -  Status = EthMacInit ();
> >> +  Status = UpdateAcpiDsdtTable ();
> >>    if (EFI_ERROR (Status)) {
> >>      DEBUG ((DEBUG_ERROR, " UpdateAcpiDsdtTable Failed, Status = %r\n", Status));
> >>    }
> >> diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf
> >> index 866ff75..856309a 100644
> >> --- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf
> >> +++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf
> >> @@ -46,6 +46,7 @@
> >>    gEfiAcpiTableProtocolGuid                     # PROTOCOL ALWAYS_CONSUMED
> >>    gEfiAcpiSdtProtocolGuid                       # PROTOCOL ALWAYS_CONSUMED
> >>    gHisiBoardNicProtocolGuid                           # PROTOCOL ALWAYS_CONSUMED
> >> +  gHisiSasConfigProtocolGuid
> >>  
> >>  [FeaturePcd]
> >>    gEfiMdeModulePkgTokenSpaceGuid.PcdInstallAcpiSdtProtocol
> >> diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c
> >> index cd98506..841c94e 100644
> >> --- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c
> >> +++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c
> >> @@ -1,7 +1,7 @@
> >>  /** @file
> >>  
> >>    Copyright (c) 2014, Applied Micro Curcuit Corporation. All rights reserved.<BR>
> >> -  Copyright (c) 2015, Hisilicon Limited. 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
> >>  
> >> @@ -23,6 +23,7 @@
> >>  #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>
> >> @@ -32,6 +33,7 @@
> >>  #include <IndustryStandard/AcpiAml.h>
> >>  
> >>  #include <Protocol/HisiBoardNicProtocol.h>
> >> +#include <Protocol/HisiSasConfig.h>
> >>  
> >>  // Turn on debug message by enabling below define
> >>  //#define ACPI_DEBUG
> >> @@ -45,17 +47,27 @@
> >>  #define EFI_ACPI_MAX_NUM_TABLES         20
> >>  #define DSDT_SIGNATURE                  0x54445344
> >>  
> >> -#define D03_ACPI_ETH_ID                     "HISI00C2"
> >> -
> >>  #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 MAC_MAX_LEN                     30
> >> +#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)
> >> +STATIC
> >> +EFI_STATUS
> >> +GetEnvMac(
> >> +  IN     UINTN    MacNextID,
> >> +  IN OUT UINT8    *MacBuffer
> >> +  )
> >>  {
> >>    EFI_MAC_ADDRESS Mac;
> >>    EFI_STATUS Status;
> >> @@ -89,12 +101,121 @@ EFI_STATUS GetEnvMac(
> >>    return EFI_SUCCESS;
> >>  }
> >>  
> >> -EFI_STATUS _SearchReplacePackageMACAddress(
> >> +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;
> > 
> > This is still a sompletely random-looking value being stuffed into the
> > buffer. What is it?
> 
> This is a random value. Maybe it is more appropriate to stuff zero into the
> buffer here.

I think so.
Would you be happy for me to fold that in before pushing?

Regards

Leif

> Thanks,
> Ming
> 
> > 
> > /
> >     Leif
> > 
> >> +    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 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;
> >> +    }
> >> +
> >> +    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                  MacNextID)
> >> +  IN UINTN                  DevNextID,
> >> +  IN DSDT_DEVICE_TYPE       FoundDev
> >> +  )
> >>  {
> >>    // ASL template for ethernet driver:
> >>  /*
> >> @@ -114,15 +235,18 @@ EFI_STATUS _SearchReplacePackageMACAddress(
> >>    CONST UINT8         *Data;
> >>    CONST VOID          *Buffer;
> >>    UINTN               DataSize;
> >> -  UINTN               Count;
> >>    EFI_ACPI_HANDLE     CurrentHandle;
> >>    EFI_ACPI_HANDLE     NextHandle;
> >> -  UINT8               MACBuffer[MAC_MAX_LEN];
> >> +  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;
> >>  
> >> @@ -143,11 +267,14 @@ EFI_STATUS _SearchReplacePackageMACAddress(
> >>                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)
> >> +      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 MAC address key\n", DataType);
> >> +      DBG("_DSD Key Type %d. Found address key\n", DataType);
> >>  
> >>        //
> >>        // We found the node.
> >> @@ -157,33 +284,7 @@ EFI_STATUS _SearchReplacePackageMACAddress(
> >>      }
> >>  
> >>      if (Level == 3 && *Found) {
> >> -
> >> -      //Update the MAC
> >> -      Status = GetEnvMac(MacNextID, MACBuffer);
> >> -      if (EFI_ERROR(Status))
> >> -        break;
> >> -
> >> -      for (Count = 0; Count < 6; 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, (VOID *)&MACBuffer[Count], sizeof(UINT8));
> >> -        if (EFI_ERROR(Status))
> >> -          break;
> >> -        Status = AcpiTableProtocol->GetChild(ChildHandle, &CurrentHandle);
> >> -        if (EFI_ERROR(Status) || CurrentHandle == NULL)
> >> -          break;
> >> -      }
> >> +      Status = UpdateAddressInOption (AcpiTableProtocol, ChildHandle, DevNextID, FoundDev);
> >>        break;
> >>      }
> >>  
> >> @@ -192,7 +293,13 @@ EFI_STATUS _SearchReplacePackageMACAddress(
> >>  
> >>      //Search next package
> >>      AcpiTableProtocol->Open((VOID *) Buffer, &NextHandle);
> >> -    Status = _SearchReplacePackageMACAddress(AcpiTableProtocol, NextHandle, Level + 1, Found, MacNextID);
> >> +    Status = UpdateAddressInPackage (
> >> +               AcpiTableProtocol,
> >> +               NextHandle,
> >> +               Level + 1,
> >> +               Found,
> >> +               DevNextID,
> >> +               FoundDev);
> >>      AcpiTableProtocol->Close(NextHandle);
> >>      if (!EFI_ERROR(Status))
> >>        break;
> >> @@ -201,22 +308,28 @@ EFI_STATUS _SearchReplacePackageMACAddress(
> >>    return Status;
> >>  }
> >>  
> >> -EFI_STATUS SearchReplacePackageMACAddress(
> >> +STATIC
> >> +EFI_STATUS
> >> +SearchReplacePackageAddress (
> >>    IN EFI_ACPI_SDT_PROTOCOL  *AcpiTableProtocol,
> >>    IN EFI_ACPI_HANDLE        ChildHandle,
> >> -  IN UINTN                  MacNextID)
> >> +  IN UINTN                  DevNextID,
> >> +  IN DSDT_DEVICE_TYPE       FoundDev
> >> +  )
> >>  {
> >>    BOOLEAN Found = FALSE;
> >>    UINTN Level = 0;
> >>  
> >> -  return _SearchReplacePackageMACAddress(AcpiTableProtocol, ChildHandle, Level, &Found, MacNextID);
> >> +  return UpdateAddressInPackage (AcpiTableProtocol, ChildHandle, Level,
> >> +                                 &Found, DevNextID, FoundDev);
> >>  }
> >>  
> >>  EFI_STATUS
> >> -GetEthID (
> >> +GetDeviceInfo (
> >>    EFI_ACPI_SDT_PROTOCOL   *AcpiTableProtocol,
> >>    EFI_ACPI_HANDLE         ChildHandle,
> >> -  UINTN                   *EthID
> >> +  UINTN                   *DevID,
> >> +  DSDT_DEVICE_TYPE        *FoundDev
> >>    )
> >>  {
> >>    EFI_STATUS Status;
> >> @@ -225,7 +338,7 @@ GetEthID (
> >>    CONST VOID          *Buffer;
> >>    UINTN               DataSize;
> >>  
> >> -  // Get NameString ETHx
> >> +  // 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));
> >> @@ -236,14 +349,23 @@ GetEthID (
> >>    DBG("Size %p Data %02x %02x %02x %02x\n", DataSize, Data[0], Data[1], Data[2], Data[3]);
> >>  
> >>    Data[4] = '\0';
> >> -  if (DataSize != 4 ||
> >> -      AsciiStrnCmp ("ETH", Data, 3) != 0 ||
> >> -      Data[3] > '9' || Data[3] < '0') {
> >> -    DEBUG ((EFI_D_ERROR, "[%a:%d] The NameString %a is not ETHn\n", __FUNCTION__, __LINE__, Data));
> >> +  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;
> >>    }
> >>  
> >> -  *EthID = Data[3] - '0';
> >> +  *DevID = Data[3] - '0';
> >>    return EFI_SUCCESS;
> >>  }
> >>  
> >> @@ -257,8 +379,10 @@ EFI_STATUS ProcessDSDTDevice (
> >>    CONST VOID          *Buffer;
> >>    UINTN               DataSize;
> >>    EFI_ACPI_HANDLE     DevHandle;
> >> -  INTN                Found = 0;
> >> -  UINTN               MacNextID;
> >> +  DSDT_DEVICE_TYPE    FoundDev = DsdtDeviceUnknown;
> >> +  UINTN               DevNextID;
> >> +  BOOLEAN             HisiAcpiDevNotFound;
> >> +  UINTN               Index;
> >>  
> >>    Status = AcpiTableProtocol->GetOption(ChildHandle, 0, &DataType, &Buffer, &DataSize);
> >>    if (EFI_ERROR(Status))
> >> @@ -280,7 +404,7 @@ EFI_STATUS ProcessDSDTDevice (
> >>        break;
> >>  
> >>      //
> >> -    // Search for _HID with Ethernet ID
> >> +    // Search for _HID with Device ID
> >>      //
> >>      Status = AcpiTableProtocol->GetOption(DevHandle, 0, &DataType, &Buffer, &DataSize);
> >>      if (EFI_ERROR(Status))
> >> @@ -312,23 +436,34 @@ EFI_STATUS ProcessDSDTDevice (
> >>            DBG("[%a:%d] - _HID = %a\n", __FUNCTION__, __LINE__, Data);
> >>  
> >>            if (EFI_ERROR(Status) ||
> >> -              DataType != EFI_ACPI_DATA_TYPE_STRING ||
> >> -              (AsciiStrCmp((CHAR8 *) Data, D03_ACPI_ETH_ID) != 0)) {
> >> -            AcpiTableProtocol->Close(ValueHandle);
> >> -            Found = 0;
> >> +              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 Ethernet device\n");
> >> +          DBG("Found device\n");
> >>            AcpiTableProtocol->Close(ValueHandle);
> >> -          Status = GetEthID (AcpiTableProtocol, ChildHandle, &MacNextID);
> >> +          Status = GetDeviceInfo (AcpiTableProtocol, ChildHandle, &DevNextID, &FoundDev);
> >>            if (EFI_ERROR (Status)) {
> >>              continue;
> >>            }
> >> -          Found = 1;
> >> -        } else if (Found == 1 && AsciiStrnCmp((CHAR8 *) Data, "_DSD", 4) == 0) {
> >> +        } else if ((FoundDev != DsdtDeviceUnknown) && AsciiStrnCmp((CHAR8 *) Data, "_DSD", 4) == 0) {
> >>            //
> >> -          // Patch MAC address for open source kernel
> >> +          // Patch DSD data
> >>            //
> >>            EFI_ACPI_HANDLE    PkgHandle;
> >>            Status = AcpiTableProtocol->GetOption(DevHandle, 2, &DataType, &Buffer, &DataSize);
> >> @@ -351,12 +486,30 @@ EFI_STATUS ProcessDSDTDevice (
> >>            //
> >>            // Walk the _DSD node
> >>            //
> >> -          if (DataSize == 1 && Data[0] == AML_PACKAGE_OP)
> >> -            Status = SearchReplacePackageMACAddress(AcpiTableProtocol, PkgHandle, MacNextID);
> >> +          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);
> >>      }
> >>    }
> >>  
> >> @@ -457,7 +610,10 @@ AcpiCheckSum (
> >>    Buffer[ChecksumOffset] = CalculateCheckSum8 (Buffer, Table->Length);
> >>  }
> >>  
> >> -EFI_STATUS EthMacInit(void)
> >> +EFI_STATUS
> >> +UpdateAcpiDsdtTable (
> >> +  VOID
> >> +  )
> >>  {
> >>    EFI_STATUS              Status;
> >>    EFI_ACPI_SDT_PROTOCOL   *AcpiTableProtocol;
> >> diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h
> >> index 0a3e811..a7e1eed 100644
> >> --- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h
> >> +++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h
> >> @@ -10,7 +10,7 @@
> >>  #ifndef _ETH_MAC_H_
> >>  #define _ETH_MAC_H_
> >>  
> >> -EFI_STATUS EthMacInit(VOID);
> >> +EFI_STATUS UpdateAcpiDsdtTable (VOID);
> >>  
> >>  #endif
> >>  
> >> -- 
> >> 2.8.1
> >>
> >>
> >> 
> >>
> > 
> > .
> > 
> 

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [edk2-devel] [PATCH edk2-platforms v3 3/4] Silicon/Hisilicon/Acpi: Add update sas address feature
  2020-06-17 11:07       ` Leif Lindholm
@ 2020-06-17 11:23         ` Ming Huang
  2020-06-17 12:07           ` Leif Lindholm
  0 siblings, 1 reply; 10+ messages in thread
From: Ming Huang @ 2020-06-17 11:23 UTC (permalink / raw)
  To: Leif Lindholm
  Cc: devel, ard.biesheuvel, lidongzhan, songdongkuang, wanghuiqiang,
	qiuliangen, shenlimei, xiewenyi2



在 2020/6/17 19:07, Leif Lindholm 写道:
> On Wed, Jun 17, 2020 at 10:07:39 +0800, Ming Huang wrote:
>>
>>
>> 在 2020/6/16 22:20, Leif Lindholm 写道:
>>> One remaining question, then this set is ready to go in:
>>>
>>> On Tue, Jun 09, 2020 at 21:27:24 +0800, Ming Huang wrote:
>>>> The updating sas address feature is similar with apdating mac address.
>>>> Modify updating dsdt flow for add this feature.
>>>>
>>>> Signed-off-by: Ming Huang <huangming23@huawei.com>
>>>> ---
>>>>  Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c      |   2 +-
>>>>  Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf |   1 +
>>>>  Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c            | 292 +++++++++++++++-----
>>>>  Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h            |   2 +-
>>>>  4 files changed, 227 insertions(+), 70 deletions(-)
>>>>
>>>> diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c
>>>> index c45a0bb..9cdf710 100644
>>>> --- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c
>>>> +++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c
>>>> @@ -46,7 +46,7 @@ UpdateAcpiDsdt (
>>>>      return;
>>>>    }
>>>>
>>>> -  Status = EthMacInit ();
>>>> +  Status = UpdateAcpiDsdtTable ();
>>>>    if (EFI_ERROR (Status)) {
>>>>      DEBUG ((DEBUG_ERROR, " UpdateAcpiDsdtTable Failed, Status = %r\n", Status));
>>>>    }
>>>> diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf
>>>> index 866ff75..856309a 100644
>>>> --- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf
>>>> +++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf
>>>> @@ -46,6 +46,7 @@
>>>>    gEfiAcpiTableProtocolGuid                     # PROTOCOL ALWAYS_CONSUMED
>>>>    gEfiAcpiSdtProtocolGuid                       # PROTOCOL ALWAYS_CONSUMED
>>>>    gHisiBoardNicProtocolGuid                           # PROTOCOL ALWAYS_CONSUMED
>>>> +  gHisiSasConfigProtocolGuid
>>>>
>>>>  [FeaturePcd]
>>>>    gEfiMdeModulePkgTokenSpaceGuid.PcdInstallAcpiSdtProtocol
>>>> diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c
>>>> index cd98506..841c94e 100644
>>>> --- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c
>>>> +++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c
>>>> @@ -1,7 +1,7 @@
>>>>  /** @file
>>>>
>>>>    Copyright (c) 2014, Applied Micro Curcuit Corporation. All rights reserved.<BR>
>>>> -  Copyright (c) 2015, Hisilicon Limited. 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
>>>>
>>>> @@ -23,6 +23,7 @@
>>>>  #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>
>>>> @@ -32,6 +33,7 @@
>>>>  #include <IndustryStandard/AcpiAml.h>
>>>>
>>>>  #include <Protocol/HisiBoardNicProtocol.h>
>>>> +#include <Protocol/HisiSasConfig.h>
>>>>
>>>>  // Turn on debug message by enabling below define
>>>>  //#define ACPI_DEBUG
>>>> @@ -45,17 +47,27 @@
>>>>  #define EFI_ACPI_MAX_NUM_TABLES         20
>>>>  #define DSDT_SIGNATURE                  0x54445344
>>>>
>>>> -#define D03_ACPI_ETH_ID                     "HISI00C2"
>>>> -
>>>>  #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 MAC_MAX_LEN                     30
>>>> +#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)
>>>> +STATIC
>>>> +EFI_STATUS
>>>> +GetEnvMac(
>>>> +  IN     UINTN    MacNextID,
>>>> +  IN OUT UINT8    *MacBuffer
>>>> +  )
>>>>  {
>>>>    EFI_MAC_ADDRESS Mac;
>>>>    EFI_STATUS Status;
>>>> @@ -89,12 +101,121 @@ EFI_STATUS GetEnvMac(
>>>>    return EFI_SUCCESS;
>>>>  }
>>>>
>>>> -EFI_STATUS _SearchReplacePackageMACAddress(
>>>> +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;
>>>
>>> This is still a sompletely random-looking value being stuffed into the
>>> buffer. What is it?
>>
>> This is a random value. Maybe it is more appropriate to stuff zero into the
>> buffer here.
> 
> I think so.
> Would you be happy for me to fold that in before pushing?

Yes.
Thanks.

> 
> Regards
> 
> Leif
> 
>> Thanks,
>> Ming
>>
>>>
>>> /
>>>     Leif
>>>
>>>> +    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 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;
>>>> +    }
>>>> +
>>>> +    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                  MacNextID)
>>>> +  IN UINTN                  DevNextID,
>>>> +  IN DSDT_DEVICE_TYPE       FoundDev
>>>> +  )
>>>>  {
>>>>    // ASL template for ethernet driver:
>>>>  /*
>>>> @@ -114,15 +235,18 @@ EFI_STATUS _SearchReplacePackageMACAddress(
>>>>    CONST UINT8         *Data;
>>>>    CONST VOID          *Buffer;
>>>>    UINTN               DataSize;
>>>> -  UINTN               Count;
>>>>    EFI_ACPI_HANDLE     CurrentHandle;
>>>>    EFI_ACPI_HANDLE     NextHandle;
>>>> -  UINT8               MACBuffer[MAC_MAX_LEN];
>>>> +  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;
>>>>
>>>> @@ -143,11 +267,14 @@ EFI_STATUS _SearchReplacePackageMACAddress(
>>>>                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)
>>>> +      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 MAC address key\n", DataType);
>>>> +      DBG("_DSD Key Type %d. Found address key\n", DataType);
>>>>
>>>>        //
>>>>        // We found the node.
>>>> @@ -157,33 +284,7 @@ EFI_STATUS _SearchReplacePackageMACAddress(
>>>>      }
>>>>
>>>>      if (Level == 3 && *Found) {
>>>> -
>>>> -      //Update the MAC
>>>> -      Status = GetEnvMac(MacNextID, MACBuffer);
>>>> -      if (EFI_ERROR(Status))
>>>> -        break;
>>>> -
>>>> -      for (Count = 0; Count < 6; 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, (VOID *)&MACBuffer[Count], sizeof(UINT8));
>>>> -        if (EFI_ERROR(Status))
>>>> -          break;
>>>> -        Status = AcpiTableProtocol->GetChild(ChildHandle, &CurrentHandle);
>>>> -        if (EFI_ERROR(Status) || CurrentHandle == NULL)
>>>> -          break;
>>>> -      }
>>>> +      Status = UpdateAddressInOption (AcpiTableProtocol, ChildHandle, DevNextID, FoundDev);
>>>>        break;
>>>>      }
>>>>
>>>> @@ -192,7 +293,13 @@ EFI_STATUS _SearchReplacePackageMACAddress(
>>>>
>>>>      //Search next package
>>>>      AcpiTableProtocol->Open((VOID *) Buffer, &NextHandle);
>>>> -    Status = _SearchReplacePackageMACAddress(AcpiTableProtocol, NextHandle, Level + 1, Found, MacNextID);
>>>> +    Status = UpdateAddressInPackage (
>>>> +               AcpiTableProtocol,
>>>> +               NextHandle,
>>>> +               Level + 1,
>>>> +               Found,
>>>> +               DevNextID,
>>>> +               FoundDev);
>>>>      AcpiTableProtocol->Close(NextHandle);
>>>>      if (!EFI_ERROR(Status))
>>>>        break;
>>>> @@ -201,22 +308,28 @@ EFI_STATUS _SearchReplacePackageMACAddress(
>>>>    return Status;
>>>>  }
>>>>
>>>> -EFI_STATUS SearchReplacePackageMACAddress(
>>>> +STATIC
>>>> +EFI_STATUS
>>>> +SearchReplacePackageAddress (
>>>>    IN EFI_ACPI_SDT_PROTOCOL  *AcpiTableProtocol,
>>>>    IN EFI_ACPI_HANDLE        ChildHandle,
>>>> -  IN UINTN                  MacNextID)
>>>> +  IN UINTN                  DevNextID,
>>>> +  IN DSDT_DEVICE_TYPE       FoundDev
>>>> +  )
>>>>  {
>>>>    BOOLEAN Found = FALSE;
>>>>    UINTN Level = 0;
>>>>
>>>> -  return _SearchReplacePackageMACAddress(AcpiTableProtocol, ChildHandle, Level, &Found, MacNextID);
>>>> +  return UpdateAddressInPackage (AcpiTableProtocol, ChildHandle, Level,
>>>> +                                 &Found, DevNextID, FoundDev);
>>>>  }
>>>>
>>>>  EFI_STATUS
>>>> -GetEthID (
>>>> +GetDeviceInfo (
>>>>    EFI_ACPI_SDT_PROTOCOL   *AcpiTableProtocol,
>>>>    EFI_ACPI_HANDLE         ChildHandle,
>>>> -  UINTN                   *EthID
>>>> +  UINTN                   *DevID,
>>>> +  DSDT_DEVICE_TYPE        *FoundDev
>>>>    )
>>>>  {
>>>>    EFI_STATUS Status;
>>>> @@ -225,7 +338,7 @@ GetEthID (
>>>>    CONST VOID          *Buffer;
>>>>    UINTN               DataSize;
>>>>
>>>> -  // Get NameString ETHx
>>>> +  // 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));
>>>> @@ -236,14 +349,23 @@ GetEthID (
>>>>    DBG("Size %p Data %02x %02x %02x %02x\n", DataSize, Data[0], Data[1], Data[2], Data[3]);
>>>>
>>>>    Data[4] = '\0';
>>>> -  if (DataSize != 4 ||
>>>> -      AsciiStrnCmp ("ETH", Data, 3) != 0 ||
>>>> -      Data[3] > '9' || Data[3] < '0') {
>>>> -    DEBUG ((EFI_D_ERROR, "[%a:%d] The NameString %a is not ETHn\n", __FUNCTION__, __LINE__, Data));
>>>> +  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;
>>>>    }
>>>>
>>>> -  *EthID = Data[3] - '0';
>>>> +  *DevID = Data[3] - '0';
>>>>    return EFI_SUCCESS;
>>>>  }
>>>>
>>>> @@ -257,8 +379,10 @@ EFI_STATUS ProcessDSDTDevice (
>>>>    CONST VOID          *Buffer;
>>>>    UINTN               DataSize;
>>>>    EFI_ACPI_HANDLE     DevHandle;
>>>> -  INTN                Found = 0;
>>>> -  UINTN               MacNextID;
>>>> +  DSDT_DEVICE_TYPE    FoundDev = DsdtDeviceUnknown;
>>>> +  UINTN               DevNextID;
>>>> +  BOOLEAN             HisiAcpiDevNotFound;
>>>> +  UINTN               Index;
>>>>
>>>>    Status = AcpiTableProtocol->GetOption(ChildHandle, 0, &DataType, &Buffer, &DataSize);
>>>>    if (EFI_ERROR(Status))
>>>> @@ -280,7 +404,7 @@ EFI_STATUS ProcessDSDTDevice (
>>>>        break;
>>>>
>>>>      //
>>>> -    // Search for _HID with Ethernet ID
>>>> +    // Search for _HID with Device ID
>>>>      //
>>>>      Status = AcpiTableProtocol->GetOption(DevHandle, 0, &DataType, &Buffer, &DataSize);
>>>>      if (EFI_ERROR(Status))
>>>> @@ -312,23 +436,34 @@ EFI_STATUS ProcessDSDTDevice (
>>>>            DBG("[%a:%d] - _HID = %a\n", __FUNCTION__, __LINE__, Data);
>>>>
>>>>            if (EFI_ERROR(Status) ||
>>>> -              DataType != EFI_ACPI_DATA_TYPE_STRING ||
>>>> -              (AsciiStrCmp((CHAR8 *) Data, D03_ACPI_ETH_ID) != 0)) {
>>>> -            AcpiTableProtocol->Close(ValueHandle);
>>>> -            Found = 0;
>>>> +              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 Ethernet device\n");
>>>> +          DBG("Found device\n");
>>>>            AcpiTableProtocol->Close(ValueHandle);
>>>> -          Status = GetEthID (AcpiTableProtocol, ChildHandle, &MacNextID);
>>>> +          Status = GetDeviceInfo (AcpiTableProtocol, ChildHandle, &DevNextID, &FoundDev);
>>>>            if (EFI_ERROR (Status)) {
>>>>              continue;
>>>>            }
>>>> -          Found = 1;
>>>> -        } else if (Found == 1 && AsciiStrnCmp((CHAR8 *) Data, "_DSD", 4) == 0) {
>>>> +        } else if ((FoundDev != DsdtDeviceUnknown) && AsciiStrnCmp((CHAR8 *) Data, "_DSD", 4) == 0) {
>>>>            //
>>>> -          // Patch MAC address for open source kernel
>>>> +          // Patch DSD data
>>>>            //
>>>>            EFI_ACPI_HANDLE    PkgHandle;
>>>>            Status = AcpiTableProtocol->GetOption(DevHandle, 2, &DataType, &Buffer, &DataSize);
>>>> @@ -351,12 +486,30 @@ EFI_STATUS ProcessDSDTDevice (
>>>>            //
>>>>            // Walk the _DSD node
>>>>            //
>>>> -          if (DataSize == 1 && Data[0] == AML_PACKAGE_OP)
>>>> -            Status = SearchReplacePackageMACAddress(AcpiTableProtocol, PkgHandle, MacNextID);
>>>> +          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);
>>>>      }
>>>>    }
>>>>
>>>> @@ -457,7 +610,10 @@ AcpiCheckSum (
>>>>    Buffer[ChecksumOffset] = CalculateCheckSum8 (Buffer, Table->Length);
>>>>  }
>>>>
>>>> -EFI_STATUS EthMacInit(void)
>>>> +EFI_STATUS
>>>> +UpdateAcpiDsdtTable (
>>>> +  VOID
>>>> +  )
>>>>  {
>>>>    EFI_STATUS              Status;
>>>>    EFI_ACPI_SDT_PROTOCOL   *AcpiTableProtocol;
>>>> diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h
>>>> index 0a3e811..a7e1eed 100644
>>>> --- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h
>>>> +++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h
>>>> @@ -10,7 +10,7 @@
>>>>  #ifndef _ETH_MAC_H_
>>>>  #define _ETH_MAC_H_
>>>>
>>>> -EFI_STATUS EthMacInit(VOID);
>>>> +EFI_STATUS UpdateAcpiDsdtTable (VOID);
>>>>
>>>>  #endif
>>>>
>>>> -- 
>>>> 2.8.1
>>>>
>>>>
>>>> 
>>>>
>>>
>>> .
>>>
>>
> 
> .
> 


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [edk2-devel] [PATCH edk2-platforms v3 3/4] Silicon/Hisilicon/Acpi: Add update sas address feature
  2020-06-17 11:23         ` Ming Huang
@ 2020-06-17 12:07           ` Leif Lindholm
  0 siblings, 0 replies; 10+ messages in thread
From: Leif Lindholm @ 2020-06-17 12:07 UTC (permalink / raw)
  To: devel, huangming23
  Cc: ard.biesheuvel, lidongzhan, songdongkuang, wanghuiqiang,
	qiuliangen, shenlimei, xiewenyi2

On Wed, Jun 17, 2020 at 19:23:47 +0800, Ming Huang wrote:
> >>>> +  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;
> >>>
> >>> This is still a sompletely random-looking value being stuffed into the
> >>> buffer. What is it?
> >>
> >> This is a random value. Maybe it is more appropriate to stuff zero into the
> >> buffer here.
> > 
> > I think so.
> > Would you be happy for me to fold that in before pushing?
> 
> Yes.
> Thanks.

Done.
For the remaining patches:
Reviewed-by: Leif Lindholm <leif@nuviainc.com>
Series pushed as 5f13ce8a65f2..73efee74df87.

/
    Leif

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2020-06-17 12:08 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-06-09 13:27 [PATCH edk2-platforms v3 0/4] Improve D0x Ming Huang
2020-06-09 13:27 ` [PATCH edk2-platforms v3 1/4] Silicon/Hisilicon: Change updating dsdt in ready to boot event Ming Huang
2020-06-09 13:27 ` [PATCH edk2-platforms v3 2/4] Silicon/Hisilicon: Add HISI_SAS_CONFIG_PROTOCOL Ming Huang
2020-06-09 13:27 ` [PATCH edk2-platforms v3 3/4] Silicon/Hisilicon/Acpi: Add update sas address feature Ming Huang
2020-06-16 14:20   ` [edk2-devel] " Leif Lindholm
2020-06-17  2:07     ` Ming Huang
2020-06-17 11:07       ` Leif Lindholm
2020-06-17 11:23         ` Ming Huang
2020-06-17 12:07           ` Leif Lindholm
2020-06-09 13:27 ` [PATCH edk2-platforms v3 4/4] Silicon/Hisilicon: Rename EthMac files Ming Huang

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox