From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wr1-f67.google.com (mail-wr1-f67.google.com [209.85.221.67]) by mx.groups.io with SMTP id smtpd.web10.2064.1590519053530463629 for ; Tue, 26 May 2020 11:50:54 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@nuviainc-com.20150623.gappssmtp.com header.s=20150623 header.b=gsVNpEzh; spf=pass (domain: nuviainc.com, ip: 209.85.221.67, mailfrom: leif@nuviainc.com) Received: by mail-wr1-f67.google.com with SMTP id r7so4815095wro.1 for ; Tue, 26 May 2020 11:50:53 -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:in-reply-to:user-agent; bh=CiezaTgz+Lk8XLAcKdOkl0BXb+48JCO7x1Z8QDw4Ppo=; b=gsVNpEzhV+IqaM1EdB/RtpP00+sRdnfKbV6iK7TuUVPbLTsfaaeM8d7gwcsVJc2P/y brdapeHrqqObWdTXdHoP0bs2sQgudAUK79i8YxA/XDOCOR+9bdqJcAblBawCbCJn9xOr Eg+iICkuPUnouUxSYj98bY773mYGqje2nW9GERwbJ+8LBR9PfQOIw6bJyHnO/QexmUW5 VAoAeZbyirvjYCjEbRBvdFinlepdZ5Z2qJdZlKRuNzeqTTfXRUvI9tqloB/29M2/jS3s Dfb9CC4ZBvoObsxQqtTha4M0ZTJFr6uKvEmhfaLjWsa+31wPWJ1bv8jYNPsduyUKqo1g 1Xcw== 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:in-reply-to:user-agent; bh=CiezaTgz+Lk8XLAcKdOkl0BXb+48JCO7x1Z8QDw4Ppo=; b=FCjh/4uz+4+cYr4LFqveHGmCdVnwy2LQtggbpCFCIHZYlzgbvjtTicPYSbzLFT5CSn q9CgSABj9LfmHhWOrbPVcxIqdDTKZ6FceIpgyP2Sbg9us4s9OVUw9+6VyMGZd+EEvNpT lFVhepvgeFSbnj3G7bcAtU5GPnq4pHNUpck38A1m0T6PHC4Wj4vrr/sS+HmsbiQNVLXu 7Jwin9SX8xYu0nmp9yjj+DePSy2EKVl6ML5fm/Smnz8VAwszYX5J7Byua3Hn3SAxyPeu jYqNS3qluL40FntqgF1JQJOetxrOawETdsEtI1wUp9G+UYeJOfD7iqbyirNPfWl4m6LE 4rng== X-Gm-Message-State: AOAM532htSy2ocx1GXVNLM7ColXINOi7FWVMBZa1Fi+NroQcQQ7jO15V UPrDKnOmfu6FjCYJP+5rs7UARQ== X-Google-Smtp-Source: ABdhPJxet2BRj6WHZO2CbSSgRyvvlpkyaB+uTtxMNja1hfQFETPWMfDLw7bzKAAbaNYjGUqtrZ3ELg== X-Received: by 2002:adf:c44e:: with SMTP id a14mr18903596wrg.50.1590519051786; Tue, 26 May 2020 11:50:51 -0700 (PDT) Return-Path: Received: from vanye ([2001:470:1f09:12f0:b26e:bfff:fea9:f1b8]) by smtp.gmail.com with ESMTPSA id a81sm335115wmd.25.2020.05.26.11.50.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 May 2020 11:50:51 -0700 (PDT) Date: Tue, 26 May 2020 19:50:49 +0100 From: "Leif Lindholm" To: Ming Huang Cc: devel@edk2.groups.io, ard.biesheuvel@linaro.org, lidongzhan@huawei.com, songdongkuang@huawei.com, wanghuiqiang@huawei.com, qiuliangen@huawei.com Subject: Re: [RFC edk2-platforms v1 3/3] Silicon/Hisilicon: Rename EthMac files Message-ID: <20200526185049.GQ1923@vanye> References: <1590072184-16219-1-git-send-email-huangming23@huawei.com> <1590072184-16219-4-git-send-email-huangming23@huawei.com> MIME-Version: 1.0 In-Reply-To: <1590072184-16219-4-git-send-email-huangming23@huawei.com> User-Agent: Mutt/1.10.1 (2018-07-13) Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Thu, May 21, 2020 at 22:43:04 +0800, Ming Huang wrote: > As not only update mac address feature in EthMac files, so rename > them to UpdateDsdt. > > Signed-off-by: Ming Huang > --- > Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c | 2 +- > Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf | 8 +- > Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c | 612 -------------------- > Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h | 16 - > Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.c | 612 ++++++++++++++++++++ > Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.h | 16 + > 6 files changed, 633 insertions(+), 633 deletions(-) > > diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c > index d3ea051..fd67677 100644 > --- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c > +++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatform.c > @@ -21,7 +21,7 @@ > #include > #include > #include > -#include "EthMac.h" > +#include "UpdateDsdt.h" > > EFI_EVENT mUpdateAcpiDsdtTableEvent; > > diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf > index 53da731..a2b669d 100644 > --- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf > +++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/AcpiPlatformDxe.inf > @@ -1,8 +1,8 @@ > ## @file > # > -# Copyright (c) 2014, Applied Micro Curcuit Corp. All rights reserved.
> -# Copyright (c) 2015, Hisilicon Limited. All rights reserved.
> -# Copyright (c) 2015, Linaro Limited. All rights reserved.
> +# Copyright (c) 2014 - 2020, Applied Micro Curcuit Corp. All rights reserved.
> +# Copyright (c) 2015 - 2020, Hisilicon Limited. All rights reserved.
> +# Copyright (c) 2015 - 2020, Linaro Limited. All rights reserved.
Same comment on copyright as on 1/3 and 2/3. / Leif > # SPDX-License-Identifier: BSD-2-Clause-Patent > # > ## > @@ -18,7 +18,7 @@ > > [Sources] > AcpiPlatform.c > - EthMac.c > + UpdateDsdt.c > > [Packages] > MdePkg/MdePkg.dec > diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c > deleted file mode 100644 > index 205f2f9..0000000 > --- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.c > +++ /dev/null > @@ -1,612 +0,0 @@ > -/** @file > - > - Copyright (c) 2014 - 2020, Applied Micro Curcuit Corporation. All rights reserved.
> - Copyright (c) 2015 - 2020, Hisilicon Limited. All rights reserved.
> - Copyright (c) 2015 - 2020, Linaro Limited. All rights reserved.
> - 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 > -#include > -#include > -#include > - > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > - > -#include > - > -// Turn on debug message by enabling below define > -//#define ACPI_DEBUG > - > -#ifdef ACPI_DEBUG > -#define DBG(arg...) DEBUG((EFI_D_ERROR,## arg)) > -#else > -#define DBG(arg...) > -#endif > - > -#define EFI_ACPI_MAX_NUM_TABLES 20 > -#define DSDT_SIGNATURE 0x54445344 > - > -#define ACPI_ETH_MAC_KEY "local-mac-address" > -#define ACPI_ETH_SAS_KEY "sas-addr" > - > -#define PREFIX_VARIABLE_NAME L"MAC" > -#define PREFIX_VARIABLE_NAME_COMPAT L"RGMII_MAC" > -#define ADDRESS_MAX_LEN 30 > - > -CHAR8 *mHisiAcpiDevId[] = {"HISI00C1","HISI00C2","HISI0162"}; > - > -typedef enum { > - DsdtDeviceUnknown, > - DsdtDeviceLan, > - DsdtDeviceSas > -} DSDT_DEVICE_TYPE; > - > -EFI_STATUS GetEnvMac( > - IN UINTN MacNextID, > - IN OUT UINT8 *MacBuffer) > -{ > - EFI_MAC_ADDRESS Mac; > - EFI_STATUS Status; > - HISI_BOARD_NIC_PROTOCOL *OemNic = NULL; > - > - Status = gBS->LocateProtocol(&gHisiBoardNicProtocolGuid, NULL, (VOID **)&OemNic); > - if(EFI_ERROR(Status)) > - { > - DEBUG((EFI_D_ERROR, "[%a]:[%dL] LocateProtocol failed %r\n", __FUNCTION__, __LINE__, Status)); > - return Status; > - } > - > - Status = OemNic->GetMac(&Mac, MacNextID); > - if(EFI_ERROR(Status)) > - { > - DEBUG((EFI_D_ERROR, "[%a]:[%dL] GetMac failed %r\n", __FUNCTION__, __LINE__, Status)); > - return Status; > - } > - > - CopyMem (MacBuffer, &Mac, 6); > - DEBUG((EFI_D_ERROR, "Port %d MAC %02x:%02x:%02x:%02x:%02x:%02x\n", > - MacNextID, > - MacBuffer[0], > - MacBuffer[1], > - MacBuffer[2], > - MacBuffer[3], > - MacBuffer[4], > - MacBuffer[5] > - )); > - > - return EFI_SUCCESS; > -} > - > -EFI_STATUS GetSasAddress ( > - IN UINT8 Index, > - IN OUT UINT8 *SasAddrBuffer > - ) > -{ > - if (SasAddrBuffer == NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - SasAddrBuffer[0] = 0x50; > - SasAddrBuffer[1] = 0x01; > - SasAddrBuffer[2] = 0x88; > - SasAddrBuffer[3] = 0x20; > - SasAddrBuffer[4] = 0x16; > - SasAddrBuffer[5] = 0x00; > - SasAddrBuffer[6] = 0x00; > - SasAddrBuffer[7] = Index; > - > - return EFI_SUCCESS; > -} > - > -EFI_STATUS _SearchReplacePackageAddress( > - IN EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, > - IN EFI_ACPI_HANDLE ChildHandle, > - IN UINTN Level, > - IN OUT BOOLEAN *Found, > - IN UINTN DevNextID, > - IN DSDT_DEVICE_TYPE FoundDev > - ) > -{ > - // ASL template for ethernet driver: > -/* > - * Name (_DSD, Package () { > - * ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), > - * Package () { > - * Package (2) {"mac-address", Package (6) { 00, 11, 22, 33, 44, 55 }} > - * Package (2) {"phy-channel", 0}, > - * Package (2) {"phy-mode", "rgmii"}, > - * Package (2) {"max-transfer-unit", 0x5dc}, // MTU of 1500 > - * Package (2) {"max-speed", 0x3e8}, // 1000 Mbps > - * } > - * }) > - */ > - EFI_STATUS Status; > - EFI_ACPI_DATA_TYPE DataType; > - CONST UINT8 *Data; > - CONST VOID *Buffer; > - UINTN DataSize; > - UINTN Count; > - EFI_ACPI_HANDLE CurrentHandle; > - EFI_ACPI_HANDLE NextHandle; > - EFI_ACPI_HANDLE Level1Handle; > - UINT8 *AddressBuffer; > - UINT8 AddressByte = 0; > - > - DBG("In Level:%d\n", Level); > - Level1Handle = NULL; > - Status = EFI_SUCCESS; > - for (CurrentHandle = NULL; ;) { > - Status = AcpiTableProtocol->GetChild(ChildHandle, &CurrentHandle); > - if (Level == 1) { > - Level1Handle = CurrentHandle; > - } > - if (Level != 3 && (EFI_ERROR(Status) || CurrentHandle == NULL)) > - break; > - > - Status = AcpiTableProtocol->GetOption(CurrentHandle, 0, &DataType, &Buffer, &DataSize); > - Data = Buffer; > - DBG("_DSD Child Subnode Store Op Code 0x%02X 0x%02X %02X\n", > - DataSize, Data[0], DataSize > 1 ? Data[1] : 0); > - > - if (Level < 2 && Data[0] != AML_PACKAGE_OP) > - continue; > - > - if (Level == 2 && Data[0] == AML_STRING_PREFIX) { > - Status = AcpiTableProtocol->GetOption(CurrentHandle, 1, &DataType, &Buffer, &DataSize); > - if (EFI_ERROR(Status)) > - break; > - > - DBG(" _DSD Child Subnode Store Op Code 0x%02X 0x%02X %02X\n", > - DataSize, Data[0], DataSize > 1 ? Data[1] : 0); > - > - Data = Buffer; > - if ((DataType != EFI_ACPI_DATA_TYPE_STRING) || > - ((AsciiStrCmp ((CHAR8 *) Data, ACPI_ETH_MAC_KEY) != 0) && > - (AsciiStrCmp ((CHAR8 *) Data, ACPI_ETH_SAS_KEY) != 0))) { > - ChildHandle = Level1Handle; > - continue; > - } > - > - DBG("_DSD Key Type %d. Found address key\n", DataType); > - > - // > - // We found the node. > - // > - *Found = TRUE; > - continue; > - } > - > - if (Level == 3 && *Found) { > - AddressBuffer = AllocateZeroPool (ADDRESS_MAX_LEN); > - if (AddressBuffer == NULL) { > - DEBUG ((DEBUG_ERROR, "%a:%d AllocateZeroPool failed\n", __FILE__, __LINE__)); > - return EFI_OUT_OF_RESOURCES; > - } > - > - switch (FoundDev) { > - case DsdtDeviceLan: > - //Update the MAC > - Status = GetEnvMac (DevNextID, AddressBuffer); > - AddressByte = 6; > - break; > - case DsdtDeviceSas: > - //Update SAS Address. > - Status = GetSasAddress (DevNextID, AddressBuffer); > - AddressByte = 8; > - break; > - default: > - Status = EFI_INVALID_PARAMETER; > - } > - if (EFI_ERROR (Status)) { > - FreePool (AddressBuffer); > - AddressBuffer = NULL; > - break; > - } > - > - for (Count = 0; Count < AddressByte; Count++) { > - Status = AcpiTableProtocol->GetOption(CurrentHandle, 1, &DataType, &Buffer, &DataSize); > - if (EFI_ERROR(Status)) > - break; > - > - Data = Buffer; > - DBG(" _DSD Child Subnode Store Op Code 0x%02X 0x%02X %02X DataType 0x%X\n", > - DataSize, Data[0], DataSize > 1 ? Data[1] : 0, DataType); > - > - if (DataType != EFI_ACPI_DATA_TYPE_UINT) > - break; > - > - // only need one byte. > - // FIXME: Assume the CPU is little endian > - Status = AcpiTableProtocol->SetOption (CurrentHandle, 1, AddressBuffer + Count, sizeof(UINT8)); > - if (EFI_ERROR(Status)) > - break; > - Status = AcpiTableProtocol->GetChild(ChildHandle, &CurrentHandle); > - if (EFI_ERROR(Status) || CurrentHandle == NULL) > - break; > - } > - FreePool (AddressBuffer); > - AddressBuffer = NULL; > - break; > - } > - > - if (Level > 3) > - break; > - > - //Search next package > - AcpiTableProtocol->Open((VOID *) Buffer, &NextHandle); > - Status = _SearchReplacePackageAddress( > - AcpiTableProtocol, > - NextHandle, > - Level + 1, > - Found, > - DevNextID, > - FoundDev); > - AcpiTableProtocol->Close(NextHandle); > - if (!EFI_ERROR(Status)) > - break; > - } > - > - return Status; > -} > - > -EFI_STATUS SearchReplacePackageAddress( > - IN EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, > - IN EFI_ACPI_HANDLE ChildHandle, > - IN UINTN DevNextID, > - IN DSDT_DEVICE_TYPE FoundDev > - ) > -{ > - BOOLEAN Found = FALSE; > - UINTN Level = 0; > - > - return _SearchReplacePackageAddress(AcpiTableProtocol, ChildHandle, Level, > - &Found, DevNextID, FoundDev); > -} > - > -EFI_STATUS > -GetDeviceInfo ( > - EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, > - EFI_ACPI_HANDLE ChildHandle, > - UINTN *DevID, > - DSDT_DEVICE_TYPE *FoundDev > - ) > -{ > - EFI_STATUS Status; > - EFI_ACPI_DATA_TYPE DataType; > - CHAR8 Data[5]; > - CONST VOID *Buffer; > - UINTN DataSize; > - > - // Get NameString > - Status = AcpiTableProtocol->GetOption (ChildHandle, 1, &DataType, &Buffer, &DataSize); > - if (EFI_ERROR (Status)) { > - DEBUG ((EFI_D_ERROR, "[%a:%d] Get NameString failed: %r\n", __FUNCTION__, __LINE__, Status)); > - return Status; > - } > - > - CopyMem (Data, Buffer, 4); > - DBG("Size %p Data %02x %02x %02x %02x\n", DataSize, Data[0], Data[1], Data[2], Data[3]); > - > - Data[4] = '\0'; > - if ((DataSize != 4) || > - (Data[3] > '9' || Data[3] < '0')) { > - DEBUG ((DEBUG_ERROR, "The NameString %a is not ETHn or SASn\n", Data)); > - return EFI_INVALID_PARAMETER; > - } > - > - if (AsciiStrnCmp ("ETH", Data, 3) == 0) { > - *FoundDev = DsdtDeviceLan; > - } else if (AsciiStrnCmp ("SAS", Data, 3) == 0) { > - *FoundDev = DsdtDeviceSas; > - } else { > - DEBUG ((DEBUG_ERROR, "[%a:%d] The NameString %a is not ETHn or SASn\n", > - __FUNCTION__, __LINE__, Data)); > - return EFI_INVALID_PARAMETER; > - } > - > - *DevID = Data[3] - '0'; > - return EFI_SUCCESS; > -} > - > -EFI_STATUS ProcessDSDTDevice ( > - EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, > - EFI_ACPI_HANDLE ChildHandle) > -{ > - EFI_STATUS Status; > - EFI_ACPI_DATA_TYPE DataType; > - CONST UINT8 *Data; > - CONST VOID *Buffer; > - UINTN DataSize; > - EFI_ACPI_HANDLE DevHandle; > - DSDT_DEVICE_TYPE FoundDev = DsdtDeviceUnknown; > - UINTN DevNextID; > - BOOLEAN HisiAcpiDevNotFound; > - UINTN Index; > - > - Status = AcpiTableProtocol->GetOption(ChildHandle, 0, &DataType, &Buffer, &DataSize); > - if (EFI_ERROR(Status)) > - return EFI_SUCCESS; > - > - Data = Buffer; > - // > - // Skip all non-device type > - // > - if (DataSize != 2 || Data[0] != AML_EXT_OP || Data[1] != AML_EXT_DEVICE_OP) > - return EFI_SUCCESS; > - > - // > - // Walk the device type node > - // > - for (DevHandle = NULL; ; ) { > - Status = AcpiTableProtocol->GetChild(ChildHandle, &DevHandle); > - if (EFI_ERROR(Status) || DevHandle == NULL) > - break; > - > - // > - // Search for _HID with Device ID > - // > - Status = AcpiTableProtocol->GetOption(DevHandle, 0, &DataType, &Buffer, &DataSize); > - if (EFI_ERROR(Status)) > - break; > - > - Data = Buffer; > - DBG("Data Type 0x%02X %02X\n", Data[0], DataSize > 1 ? Data[1] : 0); > - if (DataSize == 1 && Data[0] == AML_NAME_OP) { > - Status = AcpiTableProtocol->GetOption(DevHandle, 1, &DataType, &Buffer, &DataSize); > - if (EFI_ERROR(Status)) > - break; > - > - Data = Buffer; > - if (DataType == EFI_ACPI_DATA_TYPE_NAME_STRING) { > - if (AsciiStrnCmp((CHAR8 *) Data, "_HID", 4) == 0) { > - EFI_ACPI_HANDLE ValueHandle; > - > - Status = AcpiTableProtocol->GetOption(DevHandle, 2, &DataType, &Buffer, &DataSize); > - if (EFI_ERROR(Status)) > - break; > - > - if (DataType != EFI_ACPI_DATA_TYPE_CHILD) > - continue; > - > - AcpiTableProtocol->Open((VOID *) Buffer, &ValueHandle); > - Status = AcpiTableProtocol->GetOption(ValueHandle, 1, &DataType, &Buffer, &DataSize); > - > - Data = Buffer; > - DBG("[%a:%d] - _HID = %a\n", __FUNCTION__, __LINE__, Data); > - > - if (EFI_ERROR(Status) || > - DataType != EFI_ACPI_DATA_TYPE_STRING) { > - AcpiTableProtocol->Close (ValueHandle); > - FoundDev = DsdtDeviceUnknown; > - continue; > - } > - > - HisiAcpiDevNotFound = TRUE; > - for (Index = 0; Index < ARRAY_SIZE (mHisiAcpiDevId); Index++) { > - if (AsciiStrCmp ((CHAR8 *)Data, mHisiAcpiDevId[Index]) == 0) { > - HisiAcpiDevNotFound = FALSE; > - break; > - } > - } > - if (HisiAcpiDevNotFound) { > - AcpiTableProtocol->Close (ValueHandle); > - FoundDev = DsdtDeviceUnknown; > - continue; > - } > - > - DBG("Found device\n"); > - AcpiTableProtocol->Close(ValueHandle); > - Status = GetDeviceInfo (AcpiTableProtocol, ChildHandle, &DevNextID, &FoundDev); > - if (EFI_ERROR (Status)) { > - continue; > - } > - } else if ((FoundDev != DsdtDeviceUnknown) && AsciiStrnCmp((CHAR8 *) Data, "_DSD", 4) == 0) { > - // > - // Patch DSD data > - // > - EFI_ACPI_HANDLE PkgHandle; > - Status = AcpiTableProtocol->GetOption(DevHandle, 2, &DataType, &Buffer, &DataSize); > - if (EFI_ERROR(Status)) > - break; > - > - if (DataType != EFI_ACPI_DATA_TYPE_CHILD) > - continue; > - > - // > - // Open package data > - // > - AcpiTableProtocol->Open((VOID *) Buffer, &PkgHandle); > - Status = AcpiTableProtocol->GetOption(PkgHandle, 0, &DataType, &Buffer, &DataSize); > - > - Data = Buffer; > - DBG("_DSD Subnode Store Op Code 0x%02X %02X\n", > - Data[0], DataSize > 1 ? Data[1] : 0); > - > - // > - // Walk the _DSD node > - // > - if (DataSize == 1 && Data[0] == AML_PACKAGE_OP) { > - Status = SearchReplacePackageAddress (AcpiTableProtocol, PkgHandle, DevNextID, FoundDev); > - } > - > - AcpiTableProtocol->Close(PkgHandle); > - } else if (AsciiStrnCmp ((CHAR8 *) Data, "_ADR", 4) == 0) { > - Status = AcpiTableProtocol->GetOption (DevHandle, 2, &DataType, &Buffer, &DataSize); > - if (EFI_ERROR (Status)) { > - break; > - } > - > - if (DataType != EFI_ACPI_DATA_TYPE_CHILD) { > - continue; > - } > - > - Status = GetDeviceInfo (AcpiTableProtocol, ChildHandle, &DevNextID, &FoundDev); > - > - if (EFI_ERROR (Status)) { > - continue; > - } > - } > - } > - } else if ((DataSize == 2) && (Data[0] == AML_EXT_OP) && (Data[1] == AML_EXT_DEVICE_OP)) { > - ProcessDSDTDevice (AcpiTableProtocol, DevHandle); > - } > - } > - > - return EFI_SUCCESS; > -} > - > - > -BOOLEAN > -IsSbScope ( > - EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, > - EFI_ACPI_HANDLE ChildHandle > - ) > -{ > - EFI_STATUS Status; > - EFI_ACPI_DATA_TYPE DataType; > - CONST UINT8 *Data; > - CONST VOID *Buffer; > - UINTN DataSize; > - > - Status = AcpiTableProtocol->GetOption (ChildHandle, 0, &DataType, &Buffer, &DataSize); > - if (EFI_ERROR(Status)) return FALSE; > - > - Data = Buffer; > - if (DataSize != 1 || Data[0] != AML_SCOPE_OP) { > - return FALSE; > - } > - > - return TRUE; > -} > - > -EFI_STATUS ProcessDSDTChild( > - EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, > - EFI_ACPI_HANDLE ChildHandle) > -{ > - EFI_STATUS Status; > - EFI_ACPI_HANDLE DevHandle; > - > - // Check Scope(_SB) at first > - if (!IsSbScope (AcpiTableProtocol, ChildHandle)) { > - return ProcessDSDTDevice (AcpiTableProtocol, ChildHandle); > - } > - > - for (DevHandle = NULL; ; ) { > - Status = AcpiTableProtocol->GetChild (ChildHandle, &DevHandle); > - if (EFI_ERROR(Status) || DevHandle == NULL) { > - break; > - } > - > - ProcessDSDTDevice (AcpiTableProtocol, DevHandle); > - } > - > - return EFI_SUCCESS; > -} > - > -static EFI_STATUS ProcessDSDT( > - EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, > - EFI_ACPI_HANDLE TableHandle) > -{ > - EFI_STATUS Status; > - EFI_ACPI_HANDLE ChildHandle; > - // > - // Parse table for device type > - DBG ("[%a:%d] - TableHandle=%p\n", __FUNCTION__, __LINE__, TableHandle); > - for (ChildHandle = NULL; ; ) { > - Status = AcpiTableProtocol->GetChild(TableHandle, &ChildHandle); > - DBG ("[%a:%d] - Child=%p, %r\n", __FUNCTION__, __LINE__, ChildHandle, Status); > - if (EFI_ERROR(Status)) > - break; > - if (ChildHandle == NULL) > - break; > - > - ProcessDSDTChild(AcpiTableProtocol, ChildHandle); > - } > - > - return EFI_SUCCESS; > -} > - > -STATIC > -VOID > -AcpiCheckSum ( > - IN OUT EFI_ACPI_SDT_HEADER *Table > - ) > -{ > - UINTN ChecksumOffset; > - UINT8 *Buffer; > - > - ChecksumOffset = OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, Checksum); > - Buffer = (UINT8 *)Table; > - > - // > - // set checksum to 0 first > - // > - Buffer[ChecksumOffset] = 0; > - > - // > - // Update checksum value > - // > - Buffer[ChecksumOffset] = CalculateCheckSum8 (Buffer, Table->Length); > -} > - > -EFI_STATUS UpdateAcpiDsdtTable(void) > -{ > - EFI_STATUS Status; > - EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol; > - EFI_ACPI_SDT_HEADER *Table; > - EFI_ACPI_TABLE_VERSION TableVersion; > - UINTN TableKey; > - EFI_ACPI_HANDLE TableHandle; > - UINTN i; > - > - DEBUG ((EFI_D_ERROR, "Updating Ethernet MAC in ACPI DSDT...\n")); > - > - // > - // Find the AcpiTable protocol > - Status = gBS->LocateProtocol(&gEfiAcpiSdtProtocolGuid, NULL, (VOID**) &AcpiTableProtocol); > - if (EFI_ERROR(Status)) { > - DBG("Unable to locate ACPI table protocol\n"); > - return EFI_SUCCESS; > - } > - > - // > - // Search for DSDT Table > - for (i = 0; i < EFI_ACPI_MAX_NUM_TABLES; i++) { > - Status = AcpiTableProtocol->GetAcpiTable(i, &Table, &TableVersion, &TableKey); > - if (EFI_ERROR(Status)) > - break; > - if (Table->Signature != DSDT_SIGNATURE) > - continue; > - > - Status = AcpiTableProtocol->OpenSdt(TableKey, &TableHandle); > - if (EFI_ERROR(Status)) > - break; > - > - ProcessDSDT(AcpiTableProtocol, TableHandle); > - > - AcpiTableProtocol->Close(TableHandle); > - AcpiCheckSum (Table); > - } > - > - return EFI_SUCCESS; > -} > diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h > deleted file mode 100644 > index a7e1eed..0000000 > --- a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/EthMac.h > +++ /dev/null > @@ -1,16 +0,0 @@ > -/* > - * > - * Copyright (c) 2014, Applied Micro Circuits Corporation > - * Copyright (c) 2015, Hisilicon Limited. All rights reserved. > - * Copyright (c) 2015, Linaro Limited. All rights reserved. > - * Author: Loc Ho > - * > - * SPDX-License-Identifier: BSD-2-Clause-Patent > - */ > -#ifndef _ETH_MAC_H_ > -#define _ETH_MAC_H_ > - > -EFI_STATUS UpdateAcpiDsdtTable (VOID); > - > -#endif > - > diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.c b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.c > new file mode 100644 > index 0000000..205f2f9 > --- /dev/null > +++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.c > @@ -0,0 +1,612 @@ > +/** @file > + > + Copyright (c) 2014 - 2020, Applied Micro Curcuit Corporation. All rights reserved.
> + Copyright (c) 2015 - 2020, Hisilicon Limited. All rights reserved.
> + Copyright (c) 2015 - 2020, Linaro Limited. All rights reserved.
> + 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 > +#include > +#include > +#include > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include > + > +// Turn on debug message by enabling below define > +//#define ACPI_DEBUG > + > +#ifdef ACPI_DEBUG > +#define DBG(arg...) DEBUG((EFI_D_ERROR,## arg)) > +#else > +#define DBG(arg...) > +#endif > + > +#define EFI_ACPI_MAX_NUM_TABLES 20 > +#define DSDT_SIGNATURE 0x54445344 > + > +#define ACPI_ETH_MAC_KEY "local-mac-address" > +#define ACPI_ETH_SAS_KEY "sas-addr" > + > +#define PREFIX_VARIABLE_NAME L"MAC" > +#define PREFIX_VARIABLE_NAME_COMPAT L"RGMII_MAC" > +#define ADDRESS_MAX_LEN 30 > + > +CHAR8 *mHisiAcpiDevId[] = {"HISI00C1","HISI00C2","HISI0162"}; > + > +typedef enum { > + DsdtDeviceUnknown, > + DsdtDeviceLan, > + DsdtDeviceSas > +} DSDT_DEVICE_TYPE; > + > +EFI_STATUS GetEnvMac( > + IN UINTN MacNextID, > + IN OUT UINT8 *MacBuffer) > +{ > + EFI_MAC_ADDRESS Mac; > + EFI_STATUS Status; > + HISI_BOARD_NIC_PROTOCOL *OemNic = NULL; > + > + Status = gBS->LocateProtocol(&gHisiBoardNicProtocolGuid, NULL, (VOID **)&OemNic); > + if(EFI_ERROR(Status)) > + { > + DEBUG((EFI_D_ERROR, "[%a]:[%dL] LocateProtocol failed %r\n", __FUNCTION__, __LINE__, Status)); > + return Status; > + } > + > + Status = OemNic->GetMac(&Mac, MacNextID); > + if(EFI_ERROR(Status)) > + { > + DEBUG((EFI_D_ERROR, "[%a]:[%dL] GetMac failed %r\n", __FUNCTION__, __LINE__, Status)); > + return Status; > + } > + > + CopyMem (MacBuffer, &Mac, 6); > + DEBUG((EFI_D_ERROR, "Port %d MAC %02x:%02x:%02x:%02x:%02x:%02x\n", > + MacNextID, > + MacBuffer[0], > + MacBuffer[1], > + MacBuffer[2], > + MacBuffer[3], > + MacBuffer[4], > + MacBuffer[5] > + )); > + > + return EFI_SUCCESS; > +} > + > +EFI_STATUS GetSasAddress ( > + IN UINT8 Index, > + IN OUT UINT8 *SasAddrBuffer > + ) > +{ > + if (SasAddrBuffer == NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + SasAddrBuffer[0] = 0x50; > + SasAddrBuffer[1] = 0x01; > + SasAddrBuffer[2] = 0x88; > + SasAddrBuffer[3] = 0x20; > + SasAddrBuffer[4] = 0x16; > + SasAddrBuffer[5] = 0x00; > + SasAddrBuffer[6] = 0x00; > + SasAddrBuffer[7] = Index; > + > + return EFI_SUCCESS; > +} > + > +EFI_STATUS _SearchReplacePackageAddress( > + IN EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, > + IN EFI_ACPI_HANDLE ChildHandle, > + IN UINTN Level, > + IN OUT BOOLEAN *Found, > + IN UINTN DevNextID, > + IN DSDT_DEVICE_TYPE FoundDev > + ) > +{ > + // ASL template for ethernet driver: > +/* > + * Name (_DSD, Package () { > + * ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"), > + * Package () { > + * Package (2) {"mac-address", Package (6) { 00, 11, 22, 33, 44, 55 }} > + * Package (2) {"phy-channel", 0}, > + * Package (2) {"phy-mode", "rgmii"}, > + * Package (2) {"max-transfer-unit", 0x5dc}, // MTU of 1500 > + * Package (2) {"max-speed", 0x3e8}, // 1000 Mbps > + * } > + * }) > + */ > + EFI_STATUS Status; > + EFI_ACPI_DATA_TYPE DataType; > + CONST UINT8 *Data; > + CONST VOID *Buffer; > + UINTN DataSize; > + UINTN Count; > + EFI_ACPI_HANDLE CurrentHandle; > + EFI_ACPI_HANDLE NextHandle; > + EFI_ACPI_HANDLE Level1Handle; > + UINT8 *AddressBuffer; > + UINT8 AddressByte = 0; > + > + DBG("In Level:%d\n", Level); > + Level1Handle = NULL; > + Status = EFI_SUCCESS; > + for (CurrentHandle = NULL; ;) { > + Status = AcpiTableProtocol->GetChild(ChildHandle, &CurrentHandle); > + if (Level == 1) { > + Level1Handle = CurrentHandle; > + } > + if (Level != 3 && (EFI_ERROR(Status) || CurrentHandle == NULL)) > + break; > + > + Status = AcpiTableProtocol->GetOption(CurrentHandle, 0, &DataType, &Buffer, &DataSize); > + Data = Buffer; > + DBG("_DSD Child Subnode Store Op Code 0x%02X 0x%02X %02X\n", > + DataSize, Data[0], DataSize > 1 ? Data[1] : 0); > + > + if (Level < 2 && Data[0] != AML_PACKAGE_OP) > + continue; > + > + if (Level == 2 && Data[0] == AML_STRING_PREFIX) { > + Status = AcpiTableProtocol->GetOption(CurrentHandle, 1, &DataType, &Buffer, &DataSize); > + if (EFI_ERROR(Status)) > + break; > + > + DBG(" _DSD Child Subnode Store Op Code 0x%02X 0x%02X %02X\n", > + DataSize, Data[0], DataSize > 1 ? Data[1] : 0); > + > + Data = Buffer; > + if ((DataType != EFI_ACPI_DATA_TYPE_STRING) || > + ((AsciiStrCmp ((CHAR8 *) Data, ACPI_ETH_MAC_KEY) != 0) && > + (AsciiStrCmp ((CHAR8 *) Data, ACPI_ETH_SAS_KEY) != 0))) { > + ChildHandle = Level1Handle; > + continue; > + } > + > + DBG("_DSD Key Type %d. Found address key\n", DataType); > + > + // > + // We found the node. > + // > + *Found = TRUE; > + continue; > + } > + > + if (Level == 3 && *Found) { > + AddressBuffer = AllocateZeroPool (ADDRESS_MAX_LEN); > + if (AddressBuffer == NULL) { > + DEBUG ((DEBUG_ERROR, "%a:%d AllocateZeroPool failed\n", __FILE__, __LINE__)); > + return EFI_OUT_OF_RESOURCES; > + } > + > + switch (FoundDev) { > + case DsdtDeviceLan: > + //Update the MAC > + Status = GetEnvMac (DevNextID, AddressBuffer); > + AddressByte = 6; > + break; > + case DsdtDeviceSas: > + //Update SAS Address. > + Status = GetSasAddress (DevNextID, AddressBuffer); > + AddressByte = 8; > + break; > + default: > + Status = EFI_INVALID_PARAMETER; > + } > + if (EFI_ERROR (Status)) { > + FreePool (AddressBuffer); > + AddressBuffer = NULL; > + break; > + } > + > + for (Count = 0; Count < AddressByte; Count++) { > + Status = AcpiTableProtocol->GetOption(CurrentHandle, 1, &DataType, &Buffer, &DataSize); > + if (EFI_ERROR(Status)) > + break; > + > + Data = Buffer; > + DBG(" _DSD Child Subnode Store Op Code 0x%02X 0x%02X %02X DataType 0x%X\n", > + DataSize, Data[0], DataSize > 1 ? Data[1] : 0, DataType); > + > + if (DataType != EFI_ACPI_DATA_TYPE_UINT) > + break; > + > + // only need one byte. > + // FIXME: Assume the CPU is little endian > + Status = AcpiTableProtocol->SetOption (CurrentHandle, 1, AddressBuffer + Count, sizeof(UINT8)); > + if (EFI_ERROR(Status)) > + break; > + Status = AcpiTableProtocol->GetChild(ChildHandle, &CurrentHandle); > + if (EFI_ERROR(Status) || CurrentHandle == NULL) > + break; > + } > + FreePool (AddressBuffer); > + AddressBuffer = NULL; > + break; > + } > + > + if (Level > 3) > + break; > + > + //Search next package > + AcpiTableProtocol->Open((VOID *) Buffer, &NextHandle); > + Status = _SearchReplacePackageAddress( > + AcpiTableProtocol, > + NextHandle, > + Level + 1, > + Found, > + DevNextID, > + FoundDev); > + AcpiTableProtocol->Close(NextHandle); > + if (!EFI_ERROR(Status)) > + break; > + } > + > + return Status; > +} > + > +EFI_STATUS SearchReplacePackageAddress( > + IN EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, > + IN EFI_ACPI_HANDLE ChildHandle, > + IN UINTN DevNextID, > + IN DSDT_DEVICE_TYPE FoundDev > + ) > +{ > + BOOLEAN Found = FALSE; > + UINTN Level = 0; > + > + return _SearchReplacePackageAddress(AcpiTableProtocol, ChildHandle, Level, > + &Found, DevNextID, FoundDev); > +} > + > +EFI_STATUS > +GetDeviceInfo ( > + EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, > + EFI_ACPI_HANDLE ChildHandle, > + UINTN *DevID, > + DSDT_DEVICE_TYPE *FoundDev > + ) > +{ > + EFI_STATUS Status; > + EFI_ACPI_DATA_TYPE DataType; > + CHAR8 Data[5]; > + CONST VOID *Buffer; > + UINTN DataSize; > + > + // Get NameString > + Status = AcpiTableProtocol->GetOption (ChildHandle, 1, &DataType, &Buffer, &DataSize); > + if (EFI_ERROR (Status)) { > + DEBUG ((EFI_D_ERROR, "[%a:%d] Get NameString failed: %r\n", __FUNCTION__, __LINE__, Status)); > + return Status; > + } > + > + CopyMem (Data, Buffer, 4); > + DBG("Size %p Data %02x %02x %02x %02x\n", DataSize, Data[0], Data[1], Data[2], Data[3]); > + > + Data[4] = '\0'; > + if ((DataSize != 4) || > + (Data[3] > '9' || Data[3] < '0')) { > + DEBUG ((DEBUG_ERROR, "The NameString %a is not ETHn or SASn\n", Data)); > + return EFI_INVALID_PARAMETER; > + } > + > + if (AsciiStrnCmp ("ETH", Data, 3) == 0) { > + *FoundDev = DsdtDeviceLan; > + } else if (AsciiStrnCmp ("SAS", Data, 3) == 0) { > + *FoundDev = DsdtDeviceSas; > + } else { > + DEBUG ((DEBUG_ERROR, "[%a:%d] The NameString %a is not ETHn or SASn\n", > + __FUNCTION__, __LINE__, Data)); > + return EFI_INVALID_PARAMETER; > + } > + > + *DevID = Data[3] - '0'; > + return EFI_SUCCESS; > +} > + > +EFI_STATUS ProcessDSDTDevice ( > + EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, > + EFI_ACPI_HANDLE ChildHandle) > +{ > + EFI_STATUS Status; > + EFI_ACPI_DATA_TYPE DataType; > + CONST UINT8 *Data; > + CONST VOID *Buffer; > + UINTN DataSize; > + EFI_ACPI_HANDLE DevHandle; > + DSDT_DEVICE_TYPE FoundDev = DsdtDeviceUnknown; > + UINTN DevNextID; > + BOOLEAN HisiAcpiDevNotFound; > + UINTN Index; > + > + Status = AcpiTableProtocol->GetOption(ChildHandle, 0, &DataType, &Buffer, &DataSize); > + if (EFI_ERROR(Status)) > + return EFI_SUCCESS; > + > + Data = Buffer; > + // > + // Skip all non-device type > + // > + if (DataSize != 2 || Data[0] != AML_EXT_OP || Data[1] != AML_EXT_DEVICE_OP) > + return EFI_SUCCESS; > + > + // > + // Walk the device type node > + // > + for (DevHandle = NULL; ; ) { > + Status = AcpiTableProtocol->GetChild(ChildHandle, &DevHandle); > + if (EFI_ERROR(Status) || DevHandle == NULL) > + break; > + > + // > + // Search for _HID with Device ID > + // > + Status = AcpiTableProtocol->GetOption(DevHandle, 0, &DataType, &Buffer, &DataSize); > + if (EFI_ERROR(Status)) > + break; > + > + Data = Buffer; > + DBG("Data Type 0x%02X %02X\n", Data[0], DataSize > 1 ? Data[1] : 0); > + if (DataSize == 1 && Data[0] == AML_NAME_OP) { > + Status = AcpiTableProtocol->GetOption(DevHandle, 1, &DataType, &Buffer, &DataSize); > + if (EFI_ERROR(Status)) > + break; > + > + Data = Buffer; > + if (DataType == EFI_ACPI_DATA_TYPE_NAME_STRING) { > + if (AsciiStrnCmp((CHAR8 *) Data, "_HID", 4) == 0) { > + EFI_ACPI_HANDLE ValueHandle; > + > + Status = AcpiTableProtocol->GetOption(DevHandle, 2, &DataType, &Buffer, &DataSize); > + if (EFI_ERROR(Status)) > + break; > + > + if (DataType != EFI_ACPI_DATA_TYPE_CHILD) > + continue; > + > + AcpiTableProtocol->Open((VOID *) Buffer, &ValueHandle); > + Status = AcpiTableProtocol->GetOption(ValueHandle, 1, &DataType, &Buffer, &DataSize); > + > + Data = Buffer; > + DBG("[%a:%d] - _HID = %a\n", __FUNCTION__, __LINE__, Data); > + > + if (EFI_ERROR(Status) || > + DataType != EFI_ACPI_DATA_TYPE_STRING) { > + AcpiTableProtocol->Close (ValueHandle); > + FoundDev = DsdtDeviceUnknown; > + continue; > + } > + > + HisiAcpiDevNotFound = TRUE; > + for (Index = 0; Index < ARRAY_SIZE (mHisiAcpiDevId); Index++) { > + if (AsciiStrCmp ((CHAR8 *)Data, mHisiAcpiDevId[Index]) == 0) { > + HisiAcpiDevNotFound = FALSE; > + break; > + } > + } > + if (HisiAcpiDevNotFound) { > + AcpiTableProtocol->Close (ValueHandle); > + FoundDev = DsdtDeviceUnknown; > + continue; > + } > + > + DBG("Found device\n"); > + AcpiTableProtocol->Close(ValueHandle); > + Status = GetDeviceInfo (AcpiTableProtocol, ChildHandle, &DevNextID, &FoundDev); > + if (EFI_ERROR (Status)) { > + continue; > + } > + } else if ((FoundDev != DsdtDeviceUnknown) && AsciiStrnCmp((CHAR8 *) Data, "_DSD", 4) == 0) { > + // > + // Patch DSD data > + // > + EFI_ACPI_HANDLE PkgHandle; > + Status = AcpiTableProtocol->GetOption(DevHandle, 2, &DataType, &Buffer, &DataSize); > + if (EFI_ERROR(Status)) > + break; > + > + if (DataType != EFI_ACPI_DATA_TYPE_CHILD) > + continue; > + > + // > + // Open package data > + // > + AcpiTableProtocol->Open((VOID *) Buffer, &PkgHandle); > + Status = AcpiTableProtocol->GetOption(PkgHandle, 0, &DataType, &Buffer, &DataSize); > + > + Data = Buffer; > + DBG("_DSD Subnode Store Op Code 0x%02X %02X\n", > + Data[0], DataSize > 1 ? Data[1] : 0); > + > + // > + // Walk the _DSD node > + // > + if (DataSize == 1 && Data[0] == AML_PACKAGE_OP) { > + Status = SearchReplacePackageAddress (AcpiTableProtocol, PkgHandle, DevNextID, FoundDev); > + } > + > + AcpiTableProtocol->Close(PkgHandle); > + } else if (AsciiStrnCmp ((CHAR8 *) Data, "_ADR", 4) == 0) { > + Status = AcpiTableProtocol->GetOption (DevHandle, 2, &DataType, &Buffer, &DataSize); > + if (EFI_ERROR (Status)) { > + break; > + } > + > + if (DataType != EFI_ACPI_DATA_TYPE_CHILD) { > + continue; > + } > + > + Status = GetDeviceInfo (AcpiTableProtocol, ChildHandle, &DevNextID, &FoundDev); > + > + if (EFI_ERROR (Status)) { > + continue; > + } > + } > + } > + } else if ((DataSize == 2) && (Data[0] == AML_EXT_OP) && (Data[1] == AML_EXT_DEVICE_OP)) { > + ProcessDSDTDevice (AcpiTableProtocol, DevHandle); > + } > + } > + > + return EFI_SUCCESS; > +} > + > + > +BOOLEAN > +IsSbScope ( > + EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, > + EFI_ACPI_HANDLE ChildHandle > + ) > +{ > + EFI_STATUS Status; > + EFI_ACPI_DATA_TYPE DataType; > + CONST UINT8 *Data; > + CONST VOID *Buffer; > + UINTN DataSize; > + > + Status = AcpiTableProtocol->GetOption (ChildHandle, 0, &DataType, &Buffer, &DataSize); > + if (EFI_ERROR(Status)) return FALSE; > + > + Data = Buffer; > + if (DataSize != 1 || Data[0] != AML_SCOPE_OP) { > + return FALSE; > + } > + > + return TRUE; > +} > + > +EFI_STATUS ProcessDSDTChild( > + EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, > + EFI_ACPI_HANDLE ChildHandle) > +{ > + EFI_STATUS Status; > + EFI_ACPI_HANDLE DevHandle; > + > + // Check Scope(_SB) at first > + if (!IsSbScope (AcpiTableProtocol, ChildHandle)) { > + return ProcessDSDTDevice (AcpiTableProtocol, ChildHandle); > + } > + > + for (DevHandle = NULL; ; ) { > + Status = AcpiTableProtocol->GetChild (ChildHandle, &DevHandle); > + if (EFI_ERROR(Status) || DevHandle == NULL) { > + break; > + } > + > + ProcessDSDTDevice (AcpiTableProtocol, DevHandle); > + } > + > + return EFI_SUCCESS; > +} > + > +static EFI_STATUS ProcessDSDT( > + EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol, > + EFI_ACPI_HANDLE TableHandle) > +{ > + EFI_STATUS Status; > + EFI_ACPI_HANDLE ChildHandle; > + // > + // Parse table for device type > + DBG ("[%a:%d] - TableHandle=%p\n", __FUNCTION__, __LINE__, TableHandle); > + for (ChildHandle = NULL; ; ) { > + Status = AcpiTableProtocol->GetChild(TableHandle, &ChildHandle); > + DBG ("[%a:%d] - Child=%p, %r\n", __FUNCTION__, __LINE__, ChildHandle, Status); > + if (EFI_ERROR(Status)) > + break; > + if (ChildHandle == NULL) > + break; > + > + ProcessDSDTChild(AcpiTableProtocol, ChildHandle); > + } > + > + return EFI_SUCCESS; > +} > + > +STATIC > +VOID > +AcpiCheckSum ( > + IN OUT EFI_ACPI_SDT_HEADER *Table > + ) > +{ > + UINTN ChecksumOffset; > + UINT8 *Buffer; > + > + ChecksumOffset = OFFSET_OF (EFI_ACPI_DESCRIPTION_HEADER, Checksum); > + Buffer = (UINT8 *)Table; > + > + // > + // set checksum to 0 first > + // > + Buffer[ChecksumOffset] = 0; > + > + // > + // Update checksum value > + // > + Buffer[ChecksumOffset] = CalculateCheckSum8 (Buffer, Table->Length); > +} > + > +EFI_STATUS UpdateAcpiDsdtTable(void) > +{ > + EFI_STATUS Status; > + EFI_ACPI_SDT_PROTOCOL *AcpiTableProtocol; > + EFI_ACPI_SDT_HEADER *Table; > + EFI_ACPI_TABLE_VERSION TableVersion; > + UINTN TableKey; > + EFI_ACPI_HANDLE TableHandle; > + UINTN i; > + > + DEBUG ((EFI_D_ERROR, "Updating Ethernet MAC in ACPI DSDT...\n")); > + > + // > + // Find the AcpiTable protocol > + Status = gBS->LocateProtocol(&gEfiAcpiSdtProtocolGuid, NULL, (VOID**) &AcpiTableProtocol); > + if (EFI_ERROR(Status)) { > + DBG("Unable to locate ACPI table protocol\n"); > + return EFI_SUCCESS; > + } > + > + // > + // Search for DSDT Table > + for (i = 0; i < EFI_ACPI_MAX_NUM_TABLES; i++) { > + Status = AcpiTableProtocol->GetAcpiTable(i, &Table, &TableVersion, &TableKey); > + if (EFI_ERROR(Status)) > + break; > + if (Table->Signature != DSDT_SIGNATURE) > + continue; > + > + Status = AcpiTableProtocol->OpenSdt(TableKey, &TableHandle); > + if (EFI_ERROR(Status)) > + break; > + > + ProcessDSDT(AcpiTableProtocol, TableHandle); > + > + AcpiTableProtocol->Close(TableHandle); > + AcpiCheckSum (Table); > + } > + > + return EFI_SUCCESS; > +} > diff --git a/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.h b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.h > new file mode 100644 > index 0000000..a7e1eed > --- /dev/null > +++ b/Silicon/Hisilicon/Drivers/AcpiPlatformDxe/UpdateDsdt.h > @@ -0,0 +1,16 @@ > +/* > + * > + * Copyright (c) 2014, Applied Micro Circuits Corporation > + * Copyright (c) 2015, Hisilicon Limited. All rights reserved. > + * Copyright (c) 2015, Linaro Limited. All rights reserved. > + * Author: Loc Ho > + * > + * SPDX-License-Identifier: BSD-2-Clause-Patent > + */ > +#ifndef _ETH_MAC_H_ > +#define _ETH_MAC_H_ > + > +EFI_STATUS UpdateAcpiDsdtTable (VOID); > + > +#endif > + > -- > 2.8.1 >