Good idea.

I did consider DSDT and multiple SSDTs cases. But I did not find any real case 
for them.
So I made the code simply for current cases, and the code can be easily 
enhanced later for DSDT, a new API can be added later for multiple SSDTs.

About adding the new API in UefiLib VS new library class, I did also consider 
it and even created code for new library class 
(g...@github.com:lzeng14/edk2.git branch 
FindAcpiTableBySignature_UefiAcpiTableLib).
But I remember I did discuss it with Mike and Jiewen, we recommended UefiLib as 
it will do not require any platform change.



Thanks,
Star
-----Original Message-----
From: Yao, Jiewen 
Sent: Saturday, September 1, 2018 7:04 AM
To: Ni, Ruiyu <ruiyu...@intel.com>
Cc: Zeng, Star <star.z...@intel.com>; edk2-devel@lists.01.org; Kinney, Michael 
D <michael.d.kin...@intel.com>; Younas khan <pmdyounaskhan...@gmail.com>; Gao, 
Liming <liming....@intel.com>
Subject: RE: [edk2] [PATCH 1/6] MdePkg UefiLib: Add new 
EfiFindAcpiTableBySignature() API

Good idea on LocateNextAcpiTable().


> -----Original Message-----
> From: Ni, Ruiyu
> Sent: Saturday, September 1, 2018 12:29 AM
> To: Yao, Jiewen <jiewen....@intel.com>
> Cc: Zeng, Star <star.z...@intel.com>; edk2-devel@lists.01.org; Kinney, 
> Michael D <michael.d.kin...@intel.com>; Younas khan 
> <pmdyounaskhan...@gmail.com>; Gao, Liming <liming....@intel.com>
> Subject: Re: [edk2] [PATCH 1/6] MdePkg UefiLib: Add new
> EfiFindAcpiTableBySignature() API
> 
> I think LocateNextAcpiTable() is more proper to handle the multiple 
> tables with same signature. It will carry three parameters, one is the 
> table header stored in configuration table, one is the signature, another is 
> the previous located table.
> Can we return a common table header other than void*?
> 
> Is there better place other than UefiLib?
> Do we need to add a new library class like AcpiLib?
> 
> 发自我的 iPhone
> 
> > 在 2018年8月31日,下午8:00,Yao, Jiewen <jiewen....@intel.com> 写
> 道:
> >
> > Good enhancement.
> >
> > I have 2 additional thought:
> >
> > 1) How to handle DSDT?
> > We have special code to handle FACS, but no DSDT.
> >
> > 2) How to handle SSDT or other multiple ACPI tables?
> > We may have multiple SSDT. Usually, it is identified as OEMID.
> > Do we want to provide similar function for them?
> >
> > Anyway, just *additional* thought. :-) Current implementation is 
> > good enough for check in.
> >
> > Reviewed-by: jiewen....@intel.com
> >
> > Thank you
> > Yao Jiewen
> >
> >
> >> -----Original Message-----
> >> From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf 
> >> Of
> Star
> >> Zeng
> >> Sent: Friday, August 31, 2018 7:29 PM
> >> To: edk2-devel@lists.01.org
> >> Cc: Kinney, Michael D <michael.d.kin...@intel.com>; Younas khan 
> >> <pmdyounaskhan...@gmail.com>; Yao, Jiewen <jiewen....@intel.com>;
> Gao,
> >> Liming <liming....@intel.com>; Zeng, Star <star.z...@intel.com>
> >> Subject: [edk2] [PATCH 1/6] MdePkg UefiLib: Add new
> >> EfiFindAcpiTableBySignature() API
> >>
> >> https://bugzilla.tianocore.org/show_bug.cgi?id=967
> >> Request to add a library function for GetAcpiTable() in order to 
> >> get ACPI table using signature as input.
> >>
> >> After evaluation, we found there are many duplicated code to find 
> >> ACPI table by signature in different modules.
> >>
> >> This patch adds new EfiFindAcpiTableBySignature() API in UefiLib 
> >> for the request and also the following patch to remove the 
> >> duplicated code.
> >>
> >> Cc: Younas khan <pmdyounaskhan...@gmail.com>
> >> Cc: Michael D Kinney <michael.d.kin...@intel.com>
> >> Cc: Liming Gao <liming....@intel.com>
> >> Cc: Jiewen Yao <jiewen....@intel.com>
> >> Contributed-under: TianoCore Contribution Agreement 1.1
> >> Signed-off-by: Star Zeng <star.z...@intel.com>
> >> ---
> >> MdePkg/Include/Library/UefiLib.h   |  17 +++
> >> MdePkg/Library/UefiLib/Acpi.c      | 226
> >> +++++++++++++++++++++++++++++++++++++
> >> MdePkg/Library/UefiLib/UefiLib.inf |   3 +
> >> 3 files changed, 246 insertions(+)
> >> create mode 100644 MdePkg/Library/UefiLib/Acpi.c
> >>
> >> diff --git a/MdePkg/Include/Library/UefiLib.h
> >> b/MdePkg/Include/Library/UefiLib.h
> >> index f80067f11103..8dd25f324fd2 100644
> >> --- a/MdePkg/Include/Library/UefiLib.h
> >> +++ b/MdePkg/Include/Library/UefiLib.h
> >> @@ -1595,4 +1595,21 @@ EfiOpenFileByDevicePath (
> >>  IN     UINT64                    OpenMode,
> >>  IN     UINT64                    Attributes
> >>  );
> >> +
> >> +/**
> >> +  This function finds ACPI table by signature.
> >> +  It will find the table in gEfiAcpi20TableGuid system 
> >> +configuration table
> first,
> >> +  and then gEfiAcpi10TableGuid system configuration table.
> >> +
> >> +  @param Signature  ACPI table signature.
> >> +
> >> +  @return ACPI table or NULL if not found.
> >> +
> >> +**/
> >> +VOID *
> >> +EFIAPI
> >> +EfiFindAcpiTableBySignature (
> >> +  IN UINT32     Signature
> >> +  );
> >> +
> >> #endif
> >> diff --git a/MdePkg/Library/UefiLib/Acpi.c 
> >> b/MdePkg/Library/UefiLib/Acpi.c new file mode 100644 index 
> >> 000000000000..5cb93966b59f
> >> --- /dev/null
> >> +++ b/MdePkg/Library/UefiLib/Acpi.c
> >> @@ -0,0 +1,226 @@
> >> +/** @file
> >> +  This module provides help function for finding ACPI table.
> >> +
> >> +  Copyright (c) 2018, Intel Corporation. All rights reserved.<BR>  
> >> + This program and the accompanying materials  are licensed and 
> >> + made available under the terms and conditions of the
> BSD
> >> License
> >> +  which accompanies this distribution.  The full text of the 
> >> + license may be
> >> found at
> >> +  http://opensource.org/licenses/bsd-license.php.
> >> +
> >> +  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> >> BASIS,
> >> +  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> >> EXPRESS OR IMPLIED.
> >> +
> >> +**/
> >> +
> >> +#include "UefiLibInternal.h"
> >> +#include <IndustryStandard/Acpi.h> #include <Guid/Acpi.h>
> >> +
> >> +/**
> >> +  This function scans ACPI table in RSDT.
> >> +
> >> +  @param Rsdt       ACPI RSDT
> >> +  @param Signature  ACPI table signature
> >> +
> >> +  @return ACPI table or NULL if not found.
> >> +
> >> +**/
> >> +VOID *
> >> +ScanTableInRSDT (
> >> +  IN EFI_ACPI_DESCRIPTION_HEADER    *Rsdt,
> >> +  IN UINT32                         Signature
> >> +  )
> >> +{
> >> +  UINTN                              Index;
> >> +  UINT32                             EntryCount;
> >> +  UINT32                             *EntryPtr;
> >> +  EFI_ACPI_DESCRIPTION_HEADER        *Table;
> >> +
> >> +  if (Rsdt == NULL) {
> >> +    return NULL;
> >> +  }
> >> +
> >> +  EntryCount = (Rsdt->Length - sizeof 
> >> + (EFI_ACPI_DESCRIPTION_HEADER)) /
> >> sizeof(UINT32);
> >> +
> >> +  EntryPtr = (UINT32 *)(Rsdt + 1);  for (Index = 0; Index < 
> >> + EntryCount; Index ++, EntryPtr ++) {
> >> +    Table = (EFI_ACPI_DESCRIPTION_HEADER *)((UINTN)(*EntryPtr));
> >> +    if (Table->Signature == Signature) {
> >> +      return Table;
> >> +    }
> >> +  }
> >> +
> >> +  return NULL;
> >> +}
> >> +
> >> +/**
> >> +  This function scans ACPI table in XSDT.
> >> +
> >> +  @param Xsdt       ACPI XSDT
> >> +  @param Signature  ACPI table signature
> >> +
> >> +  @return ACPI table or NULL if not found.
> >> +
> >> +**/
> >> +VOID *
> >> +ScanTableInXSDT (
> >> +  IN EFI_ACPI_DESCRIPTION_HEADER    *Xsdt,
> >> +  IN UINT32                         Signature
> >> +  )
> >> +{
> >> +  UINTN                          Index;
> >> +  UINT32                         EntryCount;
> >> +  UINT64                         EntryPtr;
> >> +  UINTN                          BasePtr;
> >> +  EFI_ACPI_DESCRIPTION_HEADER    *Table;
> >> +
> >> +  if (Xsdt == NULL) {
> >> +    return NULL;
> >> +  }
> >> +
> >> +  EntryCount = (Xsdt->Length - sizeof 
> >> + (EFI_ACPI_DESCRIPTION_HEADER)) /
> >> sizeof(UINT64);
> >> +
> >> +  BasePtr = (UINTN)(Xsdt + 1);
> >> +  for (Index = 0; Index < EntryCount; Index ++) {
> >> +    CopyMem (&EntryPtr, (VOID *)(BasePtr + Index * 
> >> + sizeof(UINT64)),
> >> sizeof(UINT64));
> >> +    Table = (EFI_ACPI_DESCRIPTION_HEADER *)((UINTN)(EntryPtr));
> >> +    if (Table->Signature == Signature) {
> >> +      return Table;
> >> +    }
> >> +  }
> >> +
> >> +  return NULL;
> >> +}
> >> +
> >> +/**
> >> +  To find Facs in FADT.
> >> +
> >> +  @param Fadt   FADT table pointer
> >> +
> >> +  @return Facs table pointer or NULL if not found.
> >> +
> >> +**/
> >> +EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE * 
> >> +FindAcpiFacsFromFadt (
> >> +  IN EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE  *Fadt
> >> +  )
> >> +{
> >> +  EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE  *Facs;
> >> +  UINT64                                        Data64;
> >> +
> >> +  if (Fadt == NULL) {
> >> +    return NULL;
> >> +  }
> >> +
> >> +  if (Fadt->Header.Revision <
> >> EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE_REVISION) {
> >> +    Facs = (EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE
> >> *)(UINTN)Fadt->FirmwareCtrl;
> >> +  } else {
> >> +    CopyMem (&Data64, &Fadt->XFirmwareCtrl, sizeof(UINT64));
> >> +    if (Data64 != 0) {
> >> +      Facs = (EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE
> >> *)(UINTN)Data64;
> >> +    } else {
> >> +      Facs = (EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE
> >> *)(UINTN)Fadt->FirmwareCtrl;
> >> +    }
> >> +  }
> >> +  return Facs;
> >> +}
> >> +
> >> +/**
> >> +  To find ACPI table in ACPI ConfigurationTable.
> >> +
> >> +  @param AcpiTableGuid  The guid used to find ACPI ConfigurationTable.
> >> +  @param Signature      ACPI table signature.
> >> +
> >> +  @return ACPI table or NULL if not found.
> >> +
> >> +**/
> >> +VOID  *
> >> +FindAcpiTableInAcpiConfigurationTable (
> >> +  IN EFI_GUID   *AcpiGuid,
> >> +  IN UINT32     Signature
> >> +
> >> +  )
> >> +{
> >> +  EFI_STATUS                                    Status;
> >> +  VOID                                          *Table;
> >> +  EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER  *Rsdp;
> >> +  EFI_ACPI_DESCRIPTION_HEADER                   *Rsdt;
> >> +  EFI_ACPI_DESCRIPTION_HEADER                   *Xsdt;
> >> +  EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE     *Fadt;
> >> +
> >> +  Rsdp = NULL;
> >> +  //
> >> +  // Find ACPI ConfigurationTable (RSD_PTR)  //  Status = 
> >> + EfiGetSystemConfigurationTable(AcpiGuid, (VOID **)&Rsdp);  if 
> >> + (EFI_ERROR (Status) || (Rsdp == NULL)) {
> >> +    return NULL;
> >> +  }
> >> +
> >> +  Table = NULL;
> >> +
> >> +  //
> >> +  // Search XSDT
> >> +  //
> >> +  if (Rsdp->Revision >=
> >> EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER_REVISION) {
> >> +    Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)
> Rsdp->XsdtAddress;
> >> +    if (Signature ==
> >> EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_SIGNATURE) {
> >> +      //
> >> +      // It is to find FACS ACPI table,
> >> +      // need find FADT first.
> >> +      //
> >> +      Fadt = ScanTableInXSDT (Xsdt,
> >> EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE);
> >> +      Table = FindAcpiFacsFromFadt (Fadt);
> >> +    } else {
> >> +      Table = ScanTableInXSDT (Xsdt, Signature);
> >> +    }
> >> +  }
> >> +
> >> +  if (Table != NULL) {
> >> +    return Table;
> >> +  }
> >> +
> >> +  //
> >> +  // Search RSDT
> >> +  //
> >> +  Rsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN) Rsdp->RsdtAddress;  
> >> + if (Signature ==
> >> EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_SIGNATURE) {
> >> +    //
> >> +    // It is to find FACS ACPI table,
> >> +    // need find FADT first.
> >> +    //
> >> +    Fadt = ScanTableInRSDT (Rsdt,
> >> EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE_SIGNATURE);
> >> +    Table = FindAcpiFacsFromFadt (Fadt);  } else {
> >> +    Table = ScanTableInRSDT (Rsdt, Signature);  }
> >> +
> >> +  return Table;
> >> +}
> >> +
> >> +/**
> >> +  This function finds ACPI table by signature.
> >> +  It will find the table in gEfiAcpi20TableGuid system 
> >> +configuration table
> first,
> >> +  and then gEfiAcpi10TableGuid system configuration table.
> >> +
> >> +  @param Signature  ACPI table signature.
> >> +
> >> +  @return ACPI table or NULL if not found.
> >> +
> >> +**/
> >> +VOID *
> >> +EFIAPI
> >> +EfiFindAcpiTableBySignature (
> >> +  IN UINT32     Signature
> >> +  )
> >> +{
> >> +  VOID          *Table;
> >> +
> >> +  Table = FindAcpiTableInAcpiConfigurationTable 
> >> + (&gEfiAcpi20TableGuid,
> >> Signature);
> >> +  if (Table != NULL) {
> >> +    return Table;
> >> +  }
> >> +
> >> +  return FindAcpiTableInAcpiConfigurationTable 
> >> + (&gEfiAcpi10TableGuid,
> >> Signature);
> >> +}
> >> +
> >> diff --git a/MdePkg/Library/UefiLib/UefiLib.inf
> >> b/MdePkg/Library/UefiLib/UefiLib.inf
> >> index a6c739ef3d6d..aea20fe67153 100644
> >> --- a/MdePkg/Library/UefiLib/UefiLib.inf
> >> +++ b/MdePkg/Library/UefiLib/UefiLib.inf
> >> @@ -41,6 +41,7 @@ [Sources]
> >>  Console.c
> >>  UefiLib.c
> >>  UefiLibInternal.h
> >> +  Acpi.c
> >>
> >>
> >> [Packages]
> >> @@ -62,6 +63,8 @@ [Guids]
> >>  gEfiEventReadyToBootGuid                      ##
> >> SOMETIMES_CONSUMES  ## Event
> >>  gEfiEventLegacyBootGuid                       ##
> >> SOMETIMES_CONSUMES  ## Event
> >>  gEfiGlobalVariableGuid                        ##
> >> SOMETIMES_CONSUMES  ## Variable
> >> +  gEfiAcpi20TableGuid                           ##
> >> SOMETIMES_CONSUMES  ## SystemTable
> >> +  gEfiAcpi10TableGuid                           ##
> >> SOMETIMES_CONSUMES  ## SystemTable
> >>
> >> [Protocols]
> >>  gEfiDriverBindingProtocolGuid                   ##
> >> SOMETIMES_PRODUCES
> >> --
> >> 2.7.0.windows.1
> >>
> >> _______________________________________________
> >> edk2-devel mailing list
> >> edk2-devel@lists.01.org
> >> https://lists.01.org/mailman/listinfo/edk2-devel
> > _______________________________________________
> > edk2-devel mailing list
> > edk2-devel@lists.01.org
> > https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to