From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wr1-f53.google.com (mail-wr1-f53.google.com [209.85.221.53]) by mx.groups.io with SMTP id smtpd.web11.7132.1591709341382026039 for ; Tue, 09 Jun 2020 06:29:01 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@nuviainc-com.20150623.gappssmtp.com header.s=20150623 header.b=qR8N7NIm; spf=pass (domain: nuviainc.com, ip: 209.85.221.53, mailfrom: leif@nuviainc.com) Received: by mail-wr1-f53.google.com with SMTP id t18so21326507wru.6 for ; Tue, 09 Jun 2020 06:29:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nuviainc-com.20150623.gappssmtp.com; s=20150623; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:content-transfer-encoding:in-reply-to :user-agent; bh=W6j8Me4p882BMhLVMLnJa3ADdtjvo2TexVCP6MTjNRs=; b=qR8N7NImGg+a0KPOnobPUjiyC+5p5NizAvT6ZGKPxY7pytqlEric9AY7rTOIIy8qUJ IKwjH0z/OIT3Hq/J5nv4p5Wh0Lo9+gQNe9+PJR9RamThjTUdt5srcTnk0O+FZRJplC73 0xEhyF2YmWV8CfGJZF5sR7xxxeRx41w+O+AvpqLk8Ya32QNYg9CA90noKLl1KIICFJQ0 Q1BTTORFvOgvGONNX0tqRQsySeucRLiL8sVC1mPr8MhZVaTxQ/8jXSZ8Mao+wG4wq620 bUkJ26fCxErvTg4SMbqOezDXwlUhEIU9xnle4crhsHABEyfDmiTmADCsSHGQY3nlTIHV GkfQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to:user-agent; bh=W6j8Me4p882BMhLVMLnJa3ADdtjvo2TexVCP6MTjNRs=; b=msuBO9p0/3zDdSNFiPI0o9WJeCA4zsGumIoSW7A+aHALcJJCZ8wE7TAhVAOrw88yaN mbAmqY+hBBDalIPm5h+5x/zRXpyZ7qAWLIwsjzzD83NxsqqcLTfuLeP+Okln3oWGq3mO LTx6GAlbFCkNx1owgMjAzcFjyemtykSa16yr7E2WYW4g1qYr0G+/yLb42GAzBwV0uqPf CH+FJUNKcRT3TBXaniY0xzgF4zzoGAla5wyqw7qQJQEq0t1Sqg4Lms8HwTGiXV/tc/ly YUbu5kWSJ4hz/iYIx+dpNoS1ukpGOzLm6D7/z1V0gMJ4qukjFaw/eA9r/scpWlemgMat g7GQ== X-Gm-Message-State: AOAM532Y07lz6+U5uY6KfKM8/WiT+WlBntB2JkqpVe+v9wl17mYE1zZv /26mO0CAiLyOm/Grfo74REahpRH8RoAQiSGtLkENNcTleSt57ZpB8+Y+7AQAS8za4z755DTkO7t Xs384I86OKBYxG3asgOLY9E+l348GMyRKDRSSX/rncLnTh85SpUd1wzorpYqbYtc= X-Google-Smtp-Source: ABdhPJwXAJsm3WWl0arKy5ScSFXexLWGOYk/iV7Gxi1mO4kFzMK4ziYIl3UBbFwkh4EpebOh3bRLbQ== X-Received: by 2002:a5d:4841:: with SMTP id n1mr4740317wrs.64.1591709339330; Tue, 09 Jun 2020 06:28:59 -0700 (PDT) Return-Path: Received: from vanye ([2001:470:1f09:12f0:b26e:bfff:fea9:f1b8]) by smtp.gmail.com with ESMTPSA id i3sm3374438wrm.83.2020.06.09.06.28.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 09 Jun 2020 06:28:58 -0700 (PDT) Date: Tue, 9 Jun 2020 14:28:56 +0100 From: "Leif Lindholm" To: devel@edk2.groups.io, huangming23@huawei.com Cc: jian.j.wang@intel.com, hao.a.wu@intel.com, liming.gao@intel.com, lidongzhan@huawei.com, songdongkuang@huawei.com, wanghuiqiang@huawei.com, qiuliangen@huawei.com, shenlimei@huawei.com Subject: Re: [edk2-devel] [PATCH edk2 v2 3/5] Silicon/Hisilicon/Acpi: Add update sas address feature Message-ID: <20200609132856.GA28566@vanye> References: <1590590038-19724-1-git-send-email-huangming23@huawei.com> <1590590038-19724-4-git-send-email-huangming23@huawei.com> <20200608171551.GU28566@vanye> <472abc37-41ac-bbd6-63c1-1d4ba4188a0e@huawei.com> MIME-Version: 1.0 In-Reply-To: <472abc37-41ac-bbd6-63c1-1d4ba4188a0e@huawei.com> User-Agent: Mutt/1.10.1 (2018-07-13) Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit On Tue, Jun 09, 2020 at 21:24:28 +0800, Ming Huang wrote: > > > 在 2020/6/9 1:15, Leif Lindholm 写道: > > Hi Ming, > > > > On Wed, May 27, 2020 at 22:33:56 +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 | 297 +++++++++++++++----- > >> Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h | 2 +- > >> 4 files changed, 232 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..6afdddf 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[] = {"HISI00C1","HISI00C2","HISI0162"}; > >> > >> -EFI_STATUS GetEnvMac( > >> - IN UINTN MacNextID, > >> - IN OUT UINT8 *MacBuffer) > >> +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; > >> @@ -89,12 +101,126 @@ 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 UINT8 *Data; > >> + CONST VOID *Buffer; > >> + UINTN DataSize; > >> + UINTN Count; > >> + EFI_ACPI_HANDLE CurrentHandle; > >> + UINT8 *AddressBuffer; > >> + UINT8 AddressByte; > >> + > >> + AddressByte = 0; > >> + AddressBuffer = AllocateZeroPool (ADDRESS_MAX_LEN); > >> + if (AddressBuffer == NULL) { > >> + DEBUG ((DEBUG_ERROR, "%a:%d AllocateZeroPool failed\n", __FILE__, __LINE__)); > >> + return EFI_OUT_OF_RESOURCES; > >> + } > >> + > >> + switch (FoundDev) { > >> + case DsdtDeviceLan: > >> + //Update the MAC > >> + Status = GetEnvMac (DevNextID, AddressBuffer); > >> + AddressByte = 6; > >> + break; > >> + case DsdtDeviceSas: > >> + //Update SAS Address. > >> + Status = GetSasAddress (DevNextID, AddressBuffer); > >> + AddressByte = 8; > >> + break; > >> + default: > >> + Status = EFI_INVALID_PARAMETER; > >> + } > >> + if (EFI_ERROR (Status)) { > >> + FreePool (AddressBuffer); > >> + return Status; > >> + } > >> + > >> + for (Count = 0; Count < AddressByte; Count++) { > >> + Status = AcpiTableProtocol->GetOption (CurrentHandle, 1, &DataType, &Buffer, &DataSize); > >> + if (EFI_ERROR (Status)) { > >> + break; > >> + } > >> + > >> + Data = Buffer; > > > > After applying this patch, the NOOPT build fails with > > Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c: In function ‘UpdateAddressInOption’: > > Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c:146:24: error: variable ‘Data’ set but not used [-Werror=unused-but-set-variable] > > CONST UINT8 *Data; > > ^~~~ > > You will need to move this line, and the subsequent DBG line inside an > > #ifdef ACPI_DEBUG if you want to keep it. > > I think the DBG line can be remove, so I prefer remove this tow lines. That works too. I can do that locally for now, and see if I have any comments on the rest of the patches. Regards, Leif > Thanks, > Ming > > > > > / > > Leif > > > >> + DBG(" _DSD Child Subnode Store Op Code 0x%02X 0x%02X %02X DataType 0x%X\n", > >> + DataSize, Data[0], DataSize > 1 ? Data[1] : 0, DataType); > >> + > >> + if (DataType != EFI_ACPI_DATA_TYPE_UINT) > >> + break; > >> + > >> + // only need one byte. > >> + // FIXME: Assume the CPU is little endian > >> + Status = AcpiTableProtocol->SetOption ( > >> + CurrentHandle, > >> + 1, > >> + AddressBuffer + Count, > >> + sizeof(UINT8)); > >> + if (EFI_ERROR (Status)) { > >> + break; > >> + } > >> + > >> + Status = AcpiTableProtocol->GetChild (ChildHandle, &CurrentHandle); > >> + if (EFI_ERROR (Status) || CurrentHandle == NULL) { > >> + break; > >> + } > >> + } > >> + > >> + FreePool (AddressBuffer); > >> + return Status; > >> +} > >> + > >> +STATIC > >> +EFI_STATUS > >> +UpdateAddressInPackage ( > >> IN EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, > >> IN EFI_ACPI_HANDLE ChildHandle, > >> IN UINTN Level, > >> IN OUT BOOLEAN *Found, > >> - IN UINTN MacNextID) > >> + IN UINTN DevNextID, > >> + IN DSDT_DEVICE_TYPE FoundDev > >> + ) > >> { > >> // ASL template for ethernet driver: > >> /* > >> @@ -114,15 +240,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 +272,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 +289,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 +298,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 +313,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 +343,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 +354,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 +384,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 +409,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 +441,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; > >> } > >> > >> - DBG("Found Ethernet device\n"); > >> + 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 = 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 +491,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 +615,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 > >> > >> > >> > >> > > > > . > > > > > >