From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from huawei.com (huawei.com [45.249.212.191]) by mx.groups.io with SMTP id smtpd.web12.5262.1592393035722196751 for ; Wed, 17 Jun 2020 04:23:56 -0700 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: huawei.com, ip: 45.249.212.191, mailfrom: huangming23@huawei.com) Received: from DGGEMS411-HUB.china.huawei.com (unknown [172.30.72.59]) by Forcepoint Email with ESMTP id 18B1F54063E60CC1F551; Wed, 17 Jun 2020 19:23:53 +0800 (CST) Received: from [127.0.0.1] (10.78.51.60) by DGGEMS411-HUB.china.huawei.com (10.3.19.211) with Microsoft SMTP Server id 14.3.487.0; Wed, 17 Jun 2020 19:23:47 +0800 Subject: Re: [edk2-devel] [PATCH edk2-platforms v3 3/4] Silicon/Hisilicon/Acpi: Add update sas address feature To: Leif Lindholm CC: , , , , , , , References: <1591709245-44527-1-git-send-email-huangming23@huawei.com> <1591709245-44527-4-git-send-email-huangming23@huawei.com> <20200616142006.GE6739@vanye> <9564872f-ba0f-22c3-fb4f-d05db39802a3@huawei.com> <20200617110703.GI6739@vanye> From: "Ming Huang" Message-ID: Date: Wed, 17 Jun 2020 19:23:47 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.3.0 MIME-Version: 1.0 In-Reply-To: <20200617110703.GI6739@vanye> X-Originating-IP: [10.78.51.60] X-CFilter-Loop: Reflected Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable =E5=9C=A8 2020/6/17 19:07, Leif Lindholm =E5=86=99=E9=81=93: > On Wed, Jun 17, 2020 at 10:07:39 +0800, Ming Huang wrote: >> >> >> =E5=9C=A8 2020/6/16 22:20, Leif Lindholm =E5=86=99=E9=81=93: >>> 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 >>>> --- >>>> 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 =3D EthMacInit (); >>>> + Status =3D UpdateAcpiDsdtTable (); >>>> if (EFI_ERROR (Status)) { >>>> DEBUG ((DEBUG_ERROR, " UpdateAcpiDsdtTable Failed, Status =3D %r= \n", Status)); >>>> } >>>> diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDx= e.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_CO= NSUMED >>>> gEfiAcpiSdtProtocolGuid # PROTOCOL ALWAYS_CO= NSUMED >>>> gHisiBoardNicProtocolGuid # PROTOCOL ALW= AYS_CONSUMED >>>> + gHisiSasConfigProtocolGuid >>>> >>>> [FeaturePcd] >>>> gEfiMdeModulePkgTokenSpaceGuid.PcdInstallAcpiSdtProtocol >>>> diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c b/Sil= icon/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.
>>>> - Copyright (c) 2015, Hisilicon Limited. All rights reserved.
>>>> + Copyright (c) 2015 - 2020, Hisilicon Limited. All rights reserved.=
>>>> Copyright (c) 2015, Linaro Limited. All rights reserved.
>>>> SPDX-License-Identifier: BSD-2-Clause-Patent >>>> >>>> @@ -23,6 +23,7 @@ >>>> #include >>>> #include >>>> #include >>>> +#include >>>> #include >>>> #include >>>> #include >>>> @@ -32,6 +33,7 @@ >>>> #include >>>> >>>> #include >>>> +#include >>>> >>>> // 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[] =3D {"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 =3D=3D NULL) { >>>> + return EFI_INVALID_PARAMETER; >>>> + } >>>> + >>>> + Status =3D gBS->LocateProtocol (&gHisiSasConfigProtocolGuid, NULL,= (VOID **)&HisiSasConf); >>>> + if (EFI_ERROR (Status)) { >>>> + DEBUG ((DEBUG_ERROR, "Locate Sas Config Protocol failed %r\n", S= tatus)); >>>> + SasAddrBuffer[0] =3D 0x50; >>>> + SasAddrBuffer[1] =3D 0x01; >>>> + SasAddrBuffer[2] =3D 0x88; >>>> + SasAddrBuffer[3] =3D 0x20; >>>> + SasAddrBuffer[4] =3D 0x16; >>>> + SasAddrBuffer[5] =3D 0x00; >>>> + SasAddrBuffer[6] =3D 0x00; >>>> + SasAddrBuffer[7] =3D 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. >=20 > I think so. > Would you be happy for me to fold that in before pushing? Yes. Thanks. >=20 > Regards >=20 > Leif >=20 >> 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 =3D 0; >>>> + AddressBuffer =3D AllocateZeroPool (ADDRESS_MAX_LEN); >>>> + if (AddressBuffer =3D=3D NULL) { >>>> + DEBUG ((DEBUG_ERROR, "%a:%d AllocateZeroPool failed\n", __FILE__= , __LINE__)); >>>> + return EFI_OUT_OF_RESOURCES; >>>> + } >>>> + >>>> + switch (FoundDev) { >>>> + case DsdtDeviceLan: >>>> + //Update the MAC >>>> + Status =3D GetEnvMac (DevNextID, AddressBuffer); >>>> + AddressByte =3D 6; >>>> + break; >>>> + case DsdtDeviceSas: >>>> + //Update SAS Address. >>>> + Status =3D GetSasAddress (DevNextID, AddressBuffer); >>>> + AddressByte =3D 8; >>>> + break; >>>> + default: >>>> + Status =3D EFI_INVALID_PARAMETER; >>>> + } >>>> + if (EFI_ERROR (Status)) { >>>> + FreePool (AddressBuffer); >>>> + return Status; >>>> + } >>>> + >>>> + for (Count =3D 0; Count < AddressByte; Count++) { >>>> + Status =3D AcpiTableProtocol->GetOption (CurrentHandle, 1, &Data= Type, &Buffer, &DataSize); >>>> + if (EFI_ERROR (Status)) { >>>> + break; >>>> + } >>>> + >>>> + if (DataType !=3D EFI_ACPI_DATA_TYPE_UINT) >>>> + break; >>>> + >>>> + // only need one byte. >>>> + // FIXME: Assume the CPU is little endian >>>> + Status =3D AcpiTableProtocol->SetOption ( >>>> + CurrentHandle, >>>> + 1, >>>> + AddressBuffer + Count, >>>> + sizeof(UINT8)); >>>> + if (EFI_ERROR (Status)) { >>>> + break; >>>> + } >>>> + >>>> + Status =3D AcpiTableProtocol->GetChild (ChildHandle, &CurrentHan= dle); >>>> + if (EFI_ERROR (Status) || CurrentHandle =3D=3D 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 =3D NULL; >>>> Status =3D EFI_SUCCESS; >>>> for (CurrentHandle =3D NULL; ;) { >>>> Status =3D AcpiTableProtocol->GetChild(ChildHandle, &CurrentHand= le); >>>> + if (Level =3D=3D 1) { >>>> + Level1Handle =3D CurrentHandle; >>>> + } >>>> if (Level !=3D 3 && (EFI_ERROR(Status) || CurrentHandle =3D=3D N= ULL)) >>>> break; >>>> >>>> @@ -143,11 +267,14 @@ EFI_STATUS _SearchReplacePackageMACAddress( >>>> DataSize, Data[0], DataSize > 1 ? Data[1] : 0); >>>> >>>> Data =3D Buffer; >>>> - if (DataType !=3D EFI_ACPI_DATA_TYPE_STRING >>>> - || AsciiStrCmp((CHAR8 *) Data, ACPI_ETH_MAC_KEY) !=3D = 0) >>>> + if ((DataType !=3D EFI_ACPI_DATA_TYPE_STRING) || >>>> + ((AsciiStrCmp ((CHAR8 *) Data, ACPI_ETH_MAC_KEY) !=3D 0) &= & >>>> + (AsciiStrCmp ((CHAR8 *) Data, ACPI_ETH_SAS_KEY) !=3D 0)))= { >>>> + ChildHandle =3D 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 =3D=3D 3 && *Found) { >>>> - >>>> - //Update the MAC >>>> - Status =3D GetEnvMac(MacNextID, MACBuffer); >>>> - if (EFI_ERROR(Status)) >>>> - break; >>>> - >>>> - for (Count =3D 0; Count < 6; Count++) { >>>> - Status =3D AcpiTableProtocol->GetOption(CurrentHandle, 1, &D= ataType, &Buffer, &DataSize); >>>> - if (EFI_ERROR(Status)) >>>> - break; >>>> - >>>> - Data =3D 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 !=3D EFI_ACPI_DATA_TYPE_UINT) >>>> - break; >>>> - >>>> - // only need one byte. >>>> - // FIXME: Assume the CPU is little endian >>>> - Status =3D AcpiTableProtocol->SetOption(CurrentHandle, 1, (V= OID *)&MACBuffer[Count], sizeof(UINT8)); >>>> - if (EFI_ERROR(Status)) >>>> - break; >>>> - Status =3D AcpiTableProtocol->GetChild(ChildHandle, &Current= Handle); >>>> - if (EFI_ERROR(Status) || CurrentHandle =3D=3D NULL) >>>> - break; >>>> - } >>>> + Status =3D UpdateAddressInOption (AcpiTableProtocol, ChildHand= le, DevNextID, FoundDev); >>>> break; >>>> } >>>> >>>> @@ -192,7 +293,13 @@ EFI_STATUS _SearchReplacePackageMACAddress( >>>> >>>> //Search next package >>>> AcpiTableProtocol->Open((VOID *) Buffer, &NextHandle); >>>> - Status =3D _SearchReplacePackageMACAddress(AcpiTableProtocol, Ne= xtHandle, Level + 1, Found, MacNextID); >>>> + Status =3D 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 =3D FALSE; >>>> UINTN Level =3D 0; >>>> >>>> - return _SearchReplacePackageMACAddress(AcpiTableProtocol, ChildHan= dle, Level, &Found, MacNextID); >>>> + return UpdateAddressInPackage (AcpiTableProtocol, ChildHandle, Lev= el, >>>> + &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 =3D AcpiTableProtocol->GetOption (ChildHandle, 1, &DataType= , &Buffer, &DataSize); >>>> if (EFI_ERROR (Status)) { >>>> DEBUG ((EFI_D_ERROR, "[%a:%d] Get NameString failed: %r\n", __FU= NCTION__, __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] =3D '\0'; >>>> - if (DataSize !=3D 4 || >>>> - AsciiStrnCmp ("ETH", Data, 3) !=3D 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 !=3D 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) =3D=3D 0) { >>>> + *FoundDev =3D DsdtDeviceLan; >>>> + } else if (AsciiStrnCmp ("SAS", Data, 3) =3D=3D 0) { >>>> + *FoundDev =3D DsdtDeviceSas; >>>> + } else { >>>> + DEBUG ((DEBUG_ERROR, "[%a:%d] The NameString %a is not ETHn or S= ASn\n", >>>> + __FUNCTION__, __LINE__, Data)); >>>> return EFI_INVALID_PARAMETER; >>>> } >>>> >>>> - *EthID =3D Data[3] - '0'; >>>> + *DevID =3D Data[3] - '0'; >>>> return EFI_SUCCESS; >>>> } >>>> >>>> @@ -257,8 +379,10 @@ EFI_STATUS ProcessDSDTDevice ( >>>> CONST VOID *Buffer; >>>> UINTN DataSize; >>>> EFI_ACPI_HANDLE DevHandle; >>>> - INTN Found =3D 0; >>>> - UINTN MacNextID; >>>> + DSDT_DEVICE_TYPE FoundDev =3D DsdtDeviceUnknown; >>>> + UINTN DevNextID; >>>> + BOOLEAN HisiAcpiDevNotFound; >>>> + UINTN Index; >>>> >>>> Status =3D 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 =3D AcpiTableProtocol->GetOption(DevHandle, 0, &DataType,= &Buffer, &DataSize); >>>> if (EFI_ERROR(Status)) >>>> @@ -312,23 +436,34 @@ EFI_STATUS ProcessDSDTDevice ( >>>> DBG("[%a:%d] - _HID =3D %a\n", __FUNCTION__, __LINE__, Dat= a); >>>> >>>> if (EFI_ERROR(Status) || >>>> - DataType !=3D EFI_ACPI_DATA_TYPE_STRING || >>>> - (AsciiStrCmp((CHAR8 *) Data, D03_ACPI_ETH_ID) !=3D 0))= { >>>> - AcpiTableProtocol->Close(ValueHandle); >>>> - Found =3D 0; >>>> + DataType !=3D EFI_ACPI_DATA_TYPE_STRING) { >>>> + AcpiTableProtocol->Close (ValueHandle); >>>> + FoundDev =3D DsdtDeviceUnknown; >>>> + continue; >>>> + } >>>> + >>>> + HisiAcpiDevNotFound =3D TRUE; >>>> + for (Index =3D 0; Index < ARRAY_SIZE (mHisiAcpiDevId); Ind= ex++) { >>>> + if (AsciiStrCmp ((CHAR8 *)Data, mHisiAcpiDevId[Index]) = =3D=3D 0) { >>>> + HisiAcpiDevNotFound =3D FALSE; >>>> + break; >>>> + } >>>> + } >>>> + if (HisiAcpiDevNotFound) { >>>> + AcpiTableProtocol->Close (ValueHandle); >>>> + FoundDev =3D DsdtDeviceUnknown; >>>> continue; >>>> } >>>> >>>> - DBG("Found Ethernet device\n"); >>>> + DBG("Found device\n"); >>>> AcpiTableProtocol->Close(ValueHandle); >>>> - Status =3D GetEthID (AcpiTableProtocol, ChildHandle, &MacN= extID); >>>> + Status =3D GetDeviceInfo (AcpiTableProtocol, ChildHandle, = &DevNextID, &FoundDev); >>>> if (EFI_ERROR (Status)) { >>>> continue; >>>> } >>>> - Found =3D 1; >>>> - } else if (Found =3D=3D 1 && AsciiStrnCmp((CHAR8 *) Data, "_= DSD", 4) =3D=3D 0) { >>>> + } else if ((FoundDev !=3D DsdtDeviceUnknown) && AsciiStrnCmp= ((CHAR8 *) Data, "_DSD", 4) =3D=3D 0) { >>>> // >>>> - // Patch MAC address for open source kernel >>>> + // Patch DSD data >>>> // >>>> EFI_ACPI_HANDLE PkgHandle; >>>> Status =3D AcpiTableProtocol->GetOption(DevHandle, 2, &Dat= aType, &Buffer, &DataSize); >>>> @@ -351,12 +486,30 @@ EFI_STATUS ProcessDSDTDevice ( >>>> // >>>> // Walk the _DSD node >>>> // >>>> - if (DataSize =3D=3D 1 && Data[0] =3D=3D AML_PACKAGE_OP) >>>> - Status =3D SearchReplacePackageMACAddress(AcpiTableProto= col, PkgHandle, MacNextID); >>>> + if (DataSize =3D=3D 1 && Data[0] =3D=3D AML_PACKAGE_OP) { >>>> + Status =3D SearchReplacePackageAddress (AcpiTableProtoco= l, PkgHandle, DevNextID, FoundDev); >>>> + } >>>> >>>> AcpiTableProtocol->Close(PkgHandle); >>>> + } else if (AsciiStrnCmp ((CHAR8 *) Data, "_ADR", 4) =3D=3D 0= ) { >>>> + Status =3D AcpiTableProtocol->GetOption (DevHandle, 2, &Da= taType, &Buffer, &DataSize); >>>> + if (EFI_ERROR (Status)) { >>>> + break; >>>> + } >>>> + >>>> + if (DataType !=3D EFI_ACPI_DATA_TYPE_CHILD) { >>>> + continue; >>>> + } >>>> + >>>> + Status =3D GetDeviceInfo (AcpiTableProtocol, ChildHandle, = &DevNextID, &FoundDev); >>>> + >>>> + if (EFI_ERROR (Status)) { >>>> + continue; >>>> + } >>>> } >>>> } >>>> + } else if ((DataSize =3D=3D 2) && (Data[0] =3D=3D AML_EXT_OP) &&= (Data[1] =3D=3D AML_EXT_DEVICE_OP)) { >>>> + ProcessDSDTDevice (AcpiTableProtocol, DevHandle); >>>> } >>>> } >>>> >>>> @@ -457,7 +610,10 @@ AcpiCheckSum ( >>>> Buffer[ChecksumOffset] =3D CalculateCheckSum8 (Buffer, Table->Leng= th); >>>> } >>>> >>>> -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/Sil= icon/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 >>>> >>>> --=20 >>>> 2.8.1 >>>> >>>> >>>>=20 >>>> >>> >>> . >>> >> >=20 > . >=20