From: "Tomas Pilar (tpilar)" <tomas@nuviainc.com>
To: devel@edk2.groups.io
Cc: Sami Mujawar <Sami.Mujawar@arm.com>,
Alexei Fedorov <Alexei.Fedorov@arm.com>
Subject: [PATCH 5/8] DynamicTablesPkg: Add CfgMgrProtocol helper functions
Date: Fri, 31 Jul 2020 17:19:23 +0100 [thread overview]
Message-ID: <20200731161926.341330-6-tomas@nuviainc.com> (raw)
In-Reply-To: <20200731161926.341330-1-tomas@nuviainc.com>
Add functions abstracting adding and removing of objects using
the ConfigurationManagerProtocol to TableHelperLib. Also add
helpers for writing component library constructors for component
libraries populating a ConfigurationManager.
Cc: Sami Mujawar <Sami.Mujawar@arm.com>
Cc: Alexei Fedorov <Alexei.Fedorov@arm.com>
Signed-off-by: Tomas Pilar <tomas@nuviainc.com>
---
.../Include/Library/TableHelperLib.h | 170 ++++++++
.../Common/TableHelperLib/TableHelper.c | 379 +++++++++++++++++-
.../Common/TableHelperLib/TableHelperLib.inf | 6 +
3 files changed, 554 insertions(+), 1 deletion(-)
diff --git a/DynamicTablesPkg/Include/Library/TableHelperLib.h b/DynamicTablesPkg/Include/Library/TableHelperLib.h
index e4a8dfa046..0d3d1bbd60 100644
--- a/DynamicTablesPkg/Include/Library/TableHelperLib.h
+++ b/DynamicTablesPkg/Include/Library/TableHelperLib.h
@@ -12,6 +12,176 @@
#ifndef TABLE_HELPER_LIB_H_
#define TABLE_HELPER_LIB_H_
+#include <Protocol/ConfigurationManagerProtocol.h>
+
+/**
+ Get a unique token that can be used for configuration object
+ cross referencing.
+
+ @retval Unique arbitrary cross reference token.
+**/
+UINTN
+EFIAPI
+GetNewToken();
+
+/**
+ Return the count of objects of a given ObjectId.
+
+ @param[in] CmObjectId The id of the desired configuration objects.
+ @param[out] ItemCount Number of objects with given ObjectId.
+**/
+EFI_STATUS
+EFIAPI
+CfgMgrCountObjects (
+ IN CONST CM_OBJECT_ID CmObjectId,
+ OUT UINT32 *ItemCount
+ );
+
+/**
+ Get a single object form the configuration manager with the
+ matching ObjectId regardless of any cross reference tokens.
+
+ @param[in] CmObjectId The id of the desired configuration object
+ @param[out] Buffer Buffer containing the payload of the CmObject.
+
+ @retval EFI_SUCCESS Payload was successfully returned
+ @retval EFI_NOT_FOUND There was no such object
+ @retval EFI_UNSUPPORTED ConfigurationManangerProtocol is not installed
+**/
+EFI_STATUS
+EFIAPI
+CfgMgrGetSimpleObject(
+ IN CONST CM_OBJECT_ID CmObjectId,
+ OUT VOID ** Buffer
+ );
+
+/**
+ Prototype for an initialiser function to be used by component
+ libraries that are linked as NULL libraries to a Configuration
+ Manager binary and used to populate said Configuration Manager
+ with objects.
+
+ @param[in] CfgMgrProtocol The newly installed ConfigurationManagerProtocol
+ that can be used by the library to populate the
+ Configuration Manager with objects.
+**/
+typedef EFI_STATUS (EFIAPI *CFG_MGR_COMPONENT_LIB_INIT) (
+ IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CfgMgrProtocol
+ );
+
+/**
+ Register a callback inintialiser to be called when a configuration
+ manager is installed. The initialiser function is expected to
+ populate the newly installed configuration manager with objects when
+ called.
+
+ This helper should be used by component libraries that want to
+ provide configuration objects and are to be linked in as NULL
+ libraries into the configuration manager binary.
+
+ @param[in] InitFunction An initialiser function that will be called when
+ a configuration manager becomes available.
+ @retval EFI_OUT_OF_RESOURCES Failed to allocate necessary memory.
+ @retval EFI_SUCCESS Registration was successful.
+**/
+EFI_STATUS
+EFIAPI
+RegisterForCfgManager (
+ IN CONST CFG_MGR_COMPONENT_LIB_INIT InitFunction
+ );
+
+/**
+ Remove a configuration object from the configuration manager. If a
+ cross reference token is supplied, only objects referenced by that
+ token will be removed. If a token is not supplied, all objects of the
+ given type will be removed.
+
+ @param[in] CmObjectId The id of the object that is to be removed.
+ @param[in] Token Unique cross-reference token of the object to be removed.
+
+ @retval EFI_UNSUPPORTED There is no configuration manager installed.
+ @retval EFI_NOT_FOUND The combination of id and token was not found in the
+ configuration manager.
+ @retval EFI_SUCCESS Object was successfully deleted.
+**/
+EFI_STATUS
+EFIAPI
+CfgMgrRemoveObject (
+ IN CONST CM_OBJECT_ID CmObjectId,
+ IN CONST CM_OBJECT_TOKEN Token OPTIONAL
+ );
+
+/**
+ Add an instance of object to the configuration manager. If an object with
+ the specified object id and token already exists in the manager, append the
+ provided object to the existing list. Otherwise, create a new list with this
+ object being the only member.
+
+ @param[in] CmObjectId The id of the object that is to be added.
+ @param[in] Token The unique cross-reference token for this object.
+ @param[in] Buffer The instance of the object being added.
+ @param[in] BufferSize Size of Buffer in bytes.
+
+ @retval EFI_OUT_OF_RESOURCES Failed to allocate required memory when appending data
+ @retval EFI_UNSUPPORTED There is no Configuration Manager installed
+ @retval EFI_SUCCESS Object was successfully added to the Configuration Manager
+**/
+EFI_STATUS
+EFIAPI
+CfgMgrAddObject (
+ IN CONST CM_OBJECT_ID CmObjectId,
+ IN CONST CM_OBJECT_TOKEN Token OPTIONAL,
+ IN VOID * Buffer,
+ IN UINTN BufferSize
+ );
+
+/**
+ Add multiple objects of the same type/token to the configuration manager.
+ If an object with the specified object id and token already exists in the
+ manager, append the provided objects to the existing list. Otherwise, create
+ a new list.
+
+ @param[in] CmObjectId The id of the object that is to be added.
+ @param[in] Token The unique cross-reference token for this object.
+ @param[in] Buffer The instance of the objects being added.
+ @param[in] BufferSize Size of Buffer in bytes.
+ @param[in] ItemCount Number of instances of object in the Buffer.
+
+ @retval EFI_OUT_OF_RESOURCES Failed to allocate required memory when appending data.
+ @retval EFI_UNSUPPORTED There is no Configuration Manager installed.
+ @retval EFI_SUCCESS Object was successfully added to the Configuration Manager.
+**/
+EFI_STATUS
+EFIAPI
+CfgMgrAddObjects (
+ IN CONST CM_OBJECT_ID CmObjectId,
+ IN CONST CM_OBJECT_TOKEN Token OPTIONAL,
+ IN VOID * Buffer,
+ IN UINTN BufferSize,
+ IN UINT32 ItemCount
+ );
+
+/**
+ Retrieve an object with a given id from the installed configuration
+ manager. If a token is not specified, returns all objects of given
+ id, regardless of token. The methods unwraps the CmObject abstraction
+ and only returns the payloads.
+
+ @param[in] CmObjectId The id of the desired configuration objects.
+ @param[in] Token Optional cross reference token. If not supplied, all.
+ objects of the given id are returned.
+ @param[out] Buffer Buffer containing a number of payloads of CmObjects.
+ @param[out] ItemCount The count of payloads in Buffer.
+**/
+EFI_STATUS
+EFIAPI
+CfgMgrGetObjects (
+ IN CONST CM_OBJECT_ID CmObjectId,
+ IN CONST CM_OBJECT_TOKEN Token OPTIONAL,
+ OUT VOID ** Buffer OPTIONAL,
+ OUT UINT32 * ItemCount OPTIONAL
+ );
+
/** The GetCgfMgrInfo function gets the CM_STD_OBJ_CONFIGURATION_MANAGER_INFO
object from the Configuration Manager.
diff --git a/DynamicTablesPkg/Library/Common/TableHelperLib/TableHelper.c b/DynamicTablesPkg/Library/Common/TableHelperLib/TableHelper.c
index fc6cf3b088..18c0e95e0d 100644
--- a/DynamicTablesPkg/Library/Common/TableHelperLib/TableHelper.c
+++ b/DynamicTablesPkg/Library/Common/TableHelperLib/TableHelper.c
@@ -6,9 +6,13 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include <Protocol/AcpiTable.h>
+
#include <Library/BaseLib.h>
-#include <Library/DebugLib.h>
#include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/PrintLib.h>
// Module specific include files.
#include <AcpiTableGenerator.h>
@@ -16,6 +20,378 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include <Library/TableHelperLib.h>
#include <Protocol/ConfigurationManagerProtocol.h>
+/**
+ Get a unique token that can be used for configuration object
+ cross referencing.
+
+ @retval Unique arbitrary cross reference token
+**/
+UINTN
+EFIAPI
+GetNewToken()
+{
+ UINTN Token;
+ EFI_STATUS Status = gBS->GetNextMonotonicCount(&Token);
+ if (EFI_ERROR(Status)) {
+ return CM_NULL_TOKEN;
+ }
+
+ return Token;
+}
+
+/**
+ Event callback for executing the registered component library
+ inintialiser with the newly installed ConfigurationManagerProtocol
+ as the only parameter.
+**/
+STATIC
+VOID
+EFIAPI
+ComponentInitEvent (
+ IN EFI_EVENT Event,
+ IN VOID *Context
+ )
+{
+ ASSERT (Context != NULL);
+
+ CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL *CfgMgrProtocol;
+ CFG_MGR_COMPONENT_LIB_INIT InitFunction = Context;
+
+ EFI_STATUS Status = gBS->LocateProtocol (
+ &gEdkiiConfigurationManagerProtocolGuid,
+ NULL,
+ (VOID **) &CfgMgrProtocol);
+
+
+ if (EFI_ERROR(Status)) { // Should never happen
+ gBS->CloseEvent(Event);
+ RegisterForCfgManager(InitFunction);
+ return;
+ }
+
+ InitFunction(CfgMgrProtocol);
+}
+
+/**
+ Register a callback inintialiser to be called when a configuration
+ manager is installed. The initialiser function is expected to
+ populate the newly installed configuration manager with objects when
+ called.
+
+ This helper should be used by component libraries that want to
+ provide configuration objects and are to be linked in as NULL
+ libraries into the configuration manager binary.
+
+ @param[in] InitFunction An initialiser function that will be called when
+ a configuration manager becomes available.
+ @retval EFI_OUT_OF_RESOURCES Failed to allocate necessary memory
+ @retval EFI_SUCCESS Registration was successful
+**/
+EFI_STATUS
+EFIAPI
+RegisterForCfgManager (
+ CONST CFG_MGR_COMPONENT_LIB_INIT InitFunction
+ )
+{
+ EFI_STATUS Status = EFI_NOT_STARTED;
+ EFI_EVENT InitEvent;
+ VOID *Registration;
+
+ ASSERT(InitFunction != NULL);
+
+ Status = gBS->CreateEvent (
+ EVT_NOTIFY_SIGNAL,
+ TPL_NOTIFY,
+ ComponentInitEvent,
+ InitFunction,
+ &InitEvent);
+
+ if (EFI_ERROR(Status)) {
+ return Status;
+ }
+
+ Status = gBS->RegisterProtocolNotify (
+ &gEdkiiConfigurationManagerProtocolGuid,
+ InitEvent,
+ &Registration);
+
+ if (EFI_ERROR(Status)) {
+ gBS->CloseEvent(InitEvent);
+ }
+
+ return Status;
+}
+
+/**
+ Return the count of objects of a given ObjectId.
+ If there are no objects, ItemCount is set to zero.
+
+ @param[in] CmObjectId The id of the desired configuration objects.
+ @param[out] ItemCount Number of objects with given ObjectId.
+**/
+EFI_STATUS
+EFIAPI
+CfgMgrCountObjects (
+ IN CONST CM_OBJECT_ID CmObjectId,
+ OUT UINT32 *ItemCount
+ )
+{
+ EFI_STATUS Status = EFI_NOT_STARTED;
+
+ Status = CfgMgrGetObjects (CmObjectId, CM_NULL_TOKEN, NULL, ItemCount);
+ if (Status == EFI_NOT_FOUND) {
+ *ItemCount = 0;
+ }
+
+ return Status;
+}
+
+/**
+ Retrieve an object with a given id from the installed configuration
+ manager. If a token is not specified, returns all objects of given
+ id, regardless of token. The methods unwraps the CmObject abstraction
+ and only returns the payloads.
+
+ If Buffer is not NULL, the data will be returned in allocated memory. The
+ caller must free this memory when they are done with the data.
+
+ If ItemCount is not NULL, the count of items matching the criteria
+ is returned.
+
+ @param[in] CmObjectId The id of the desired configuration objects
+ @param[in] Token Optional cross reference token. If not supplied, all
+ objects of the given id are returned.
+ @param[out] Buffer Buffer containing a number of payloads of CmObjects.
+ @param[out] ItemCount The count of payloads in Buffer
+**/
+EFI_STATUS
+EFIAPI
+CfgMgrGetObjects (
+ IN CONST CM_OBJECT_ID CmObjectId,
+ IN CONST CM_OBJECT_TOKEN Token OPTIONAL,
+ OUT VOID ** Buffer OPTIONAL,
+ OUT UINT32 * ItemCount OPTIONAL
+ )
+{
+ EDKII_CONFIGURATION_MANAGER_PROTOCOL *CfgMgr;
+ EFI_STATUS Status;
+
+ Status = gBS->LocateProtocol (
+ &gEdkiiConfigurationManagerProtocolGuid, NULL, (VOID **) &CfgMgr);
+ if (EFI_ERROR(Status)) {
+ DEBUG ((DEBUG_ERROR, "ERROR: No Configuration Manager Protocol Found!\n"));
+ return EFI_UNSUPPORTED;
+ }
+
+ CM_OBJ_DESCRIPTOR Object;
+
+ Status = CfgMgr->GetObject(CfgMgr, CmObjectId, Token, &Object);
+ if (EFI_ERROR(Status)) {
+ if (Status != EFI_NOT_FOUND) {
+ DEBUG (
+ (DEBUG_ERROR,
+ "ERROR: FADT: Failed to get <%s> [%r]\n",
+ CmObjectIdName (CmObjectId),
+ Status));
+ }
+
+ return Status;
+ }
+
+ if (Buffer) {
+ *Buffer = AllocateCopyPool (Object.Size, Object.Data);
+ if (Buffer == NULL) {
+ return EFI_OUT_OF_RESOURCES;
+ }
+ }
+
+ if (ItemCount) {
+ *ItemCount = Object.Count;
+ }
+
+ if (CfgMgr->Revision >= CREATE_REVISION(1, 1)) {
+ CfgMgr->FreeObject(CfgMgr, &Object);
+ }
+
+ return EFI_SUCCESS;
+}
+
+/**
+ Get a single object form the configuration manager with the
+ matching ObjectId regardless of any cross reference tokens.
+
+ @param[in] CmObjectId The id of the desired configuration object
+ @param[out] Buffer Buffer containing the payload of the CmObject.
+
+ @retval EFI_SUCCESS Payload was successfully returned
+ @retval EFI_NOT_FOUND There was no such object
+ @retval EFI_UNSUPPORTED ConfigurationManangerProtocol is not installed
+**/
+EFI_STATUS
+EFIAPI
+CfgMgrGetSimpleObject(
+ IN CONST CM_OBJECT_ID CmObjectId,
+ OUT VOID ** Buffer
+ )
+{
+ EFI_STATUS Status;
+
+ Status = CfgMgrGetObjects(CmObjectId, CM_NULL_TOKEN, Buffer, NULL);
+ if (Status == EFI_NOT_FOUND) {
+ DEBUG ((DEBUG_ERROR,
+ "ERROR: Failed to get <%s> [%r]\n",
+ CmObjectIdName (CmObjectId),
+ Status));
+ }
+ return Status;
+}
+
+/**
+ Add an instance of object to the configuration manager. If an object with
+ the specified object id and token already exists in the manager, append the
+ provided object to the existing list. Otherwise, create a new list with this
+ object being the only member.
+
+ @param[in] CmObjectId The id of the object that is to be added
+ @param[in] Token The unique cross-reference token for this object
+ @param[in] Buffer The instance of the object being added
+ @param[in] BufferSize Size of Buffer in bytes
+
+ @retval EFI_OUT_OF_RESOURCES Failed to allocate required memory when appending data
+ @retval EFI_UNSUPPORTED There is no Configuration Manager installed
+ @retval EFI_SUCCESS Object was successfully added to the Configuration Manager
+**/
+EFI_STATUS
+EFIAPI
+CfgMgrAddObject (
+ IN CONST CM_OBJECT_ID CmObjectId,
+ IN CONST CM_OBJECT_TOKEN Token OPTIONAL,
+ IN VOID * Buffer,
+ IN UINTN BufferSize
+ )
+{
+ EFI_STATUS Status;
+ EDKII_CONFIGURATION_MANAGER_PROTOCOL *CfgMgrProtocol;
+ CM_OBJ_DESCRIPTOR CurrentObject = { 0 };
+ CM_OBJ_DESCRIPTOR NewObject;
+
+ ASSERT(Buffer != NULL);
+ ASSERT(BufferSize != 0);
+
+ Status = gBS->LocateProtocol (
+ &gEdkiiConfigurationManagerProtocolGuid, NULL, (VOID **) &CfgMgrProtocol);
+
+ if (EFI_ERROR(Status)) {
+ return EFI_UNSUPPORTED;
+ }
+
+ Status = CfgMgrProtocol->GetObject (
+ CfgMgrProtocol, CmObjectId, Token, &CurrentObject);
+
+ NewObject.ObjectId = CmObjectId;
+ NewObject.Count = 1 + CurrentObject.Count;
+ NewObject.Size = BufferSize +CurrentObject.Size;
+
+ NewObject.Data = AllocateZeroPool(NewObject.Size);
+ if (NewObject.Data == NULL) {
+ return EFI_OUT_OF_RESOURCES;
+ }
+
+ CopyMem(NewObject.Data, CurrentObject.Data, CurrentObject.Size); // NOP if CurrentObject does not exist
+ CopyMem((UINT8 *) NewObject.Data + CurrentObject.Size, Buffer, BufferSize);
+
+ Status =
+ CfgMgrProtocol->SetObject (CfgMgrProtocol, CmObjectId, Token, &NewObject);
+
+ FreePool (NewObject.Data);
+ return Status;
+}
+
+/**
+ Add multiple objects of the same type/token to the configuration manager.
+ If an object with the specified object id and token already exists in the
+ manager, append the provided objects to the existing list. Otherwise, create
+ a new list.
+
+ @param[in] CmObjectId The id of the object that is to be added.
+ @param[in] Token The unique cross-reference token for this object.
+ @param[in] Buffer The instance of the objects being added.
+ @param[in] BufferSize Size of Buffer in bytes.
+ @param[in] ItemCount Number of instances of object in the Buffer.
+
+ @retval EFI_OUT_OF_RESOURCES Failed to allocate required memory when appending data.
+ @retval EFI_UNSUPPORTED There is no Configuration Manager installed.
+ @retval EFI_SUCCESS Object was successfully added to the Configuration Manager.
+**/
+EFI_STATUS
+EFIAPI
+CfgMgrAddObjects (
+ IN CONST CM_OBJECT_ID CmObjectId,
+ IN CONST CM_OBJECT_TOKEN Token OPTIONAL,
+ IN VOID * Buffer,
+ IN UINTN BufferSize,
+ IN UINT32 ItemCount
+ )
+{
+ UINTN Index;
+ UINT8 *Cursor = Buffer;
+ UINTN ItemSize = BufferSize / ItemCount;
+ EFI_STATUS Status = EFI_NOT_STARTED;
+
+ for (Index = 0; Index < ItemCount; Index++) {
+ Status = CfgMgrAddObject(CmObjectId, Token, Cursor, ItemSize);
+ if (EFI_ERROR(Status)) {
+ return Status;
+ }
+ Cursor += ItemSize;
+ }
+
+ return EFI_SUCCESS;
+}
+
+/**
+ Remove a configuration object from the configuration manager. If a
+ cross reference token is supplied, only objects referenced by that
+ token will be removed. If a token is not supplied, all objects of the
+ given type will be removed.
+
+ @param[in] CmObjectId The id of object that is to be removed
+ @param[in] Token Unique cross-reference token of the object to be removed
+
+ @retval EFI_UNSUPPORTED There is no configuration manager installed
+ @retval EFI_NOT_FOUND The combination of id and token was not found in the
+ configuration manager
+ @retval EFI_SUCCESS Object was successfully deleted
+**/
+EFI_STATUS
+EFIAPI
+CfgMgrRemoveObject (
+ IN CONST CM_OBJECT_ID CmObjectId,
+ IN CONST CM_OBJECT_TOKEN Token OPTIONAL
+ )
+{
+ EFI_STATUS Status = EFI_NOT_STARTED;
+ EDKII_CONFIGURATION_MANAGER_PROTOCOL *CfgMgrProtocol;
+ CM_OBJ_DESCRIPTOR CurrentObject;
+
+ Status = gBS->LocateProtocol (
+ &gEdkiiConfigurationManagerProtocolGuid, NULL, (VOID **) &CfgMgrProtocol);
+
+ if (EFI_ERROR(Status)) {
+ return EFI_UNSUPPORTED;
+ }
+
+ Status = CfgMgrProtocol->GetObject (
+ CfgMgrProtocol, CmObjectId, Token, &CurrentObject);
+
+ if (EFI_ERROR(Status)) {
+ return Status;
+ }
+
+ return CfgMgrProtocol->SetObject (CfgMgrProtocol, CmObjectId, Token, NULL);
+}
+
+
/** The GetCgfMgrInfo function gets the CM_STD_OBJ_CONFIGURATION_MANAGER_INFO
object from the Configuration Manager.
@@ -44,6 +420,7 @@ GetCgfMgrInfo (
ASSERT (CfgMfrInfo != NULL);
*CfgMfrInfo = NULL;
+
Status = CfgMgrProtocol->GetObject (
CfgMgrProtocol,
CREATE_CM_STD_OBJECT_ID (EStdObjCfgMgrInfo),
diff --git a/DynamicTablesPkg/Library/Common/TableHelperLib/TableHelperLib.inf b/DynamicTablesPkg/Library/Common/TableHelperLib/TableHelperLib.inf
index 26d82e6850..e12380073e 100644
--- a/DynamicTablesPkg/Library/Common/TableHelperLib/TableHelperLib.inf
+++ b/DynamicTablesPkg/Library/Common/TableHelperLib/TableHelperLib.inf
@@ -23,8 +23,14 @@
[LibraryClasses]
BaseLib
+ BaseMemoryLib
+ DebugLib
+ PrintLib
+ MemoryAllocationLib
+ UefiBootServicesTableLib
[Protocols]
+ gEfiSerialIoProtocolGuid
[Guids]
--
2.25.1
next prev parent reply other threads:[~2020-07-31 16:19 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-07-31 16:19 [PATCH 0/8] ConfigurationManagerProtocol update Tomas Pilar (tpilar)
2020-07-31 16:19 ` [PATCH 1/8] DynamicTablesPkg: Include BaseStackCheckLib Tomas Pilar (tpilar)
2020-07-31 16:19 ` [PATCH 2/8] DynamicTablesPkg: Fold Namespaces into CmObjectId Enums Tomas Pilar (tpilar)
2020-07-31 16:19 ` [PATCH 3/8] DynamicTablesPkg: Add ConfigurationManagerDumpApp Tomas Pilar (tpilar)
2020-07-31 16:19 ` [PATCH 4/8] DynamicTablesPkg: Update ConfigurationManagerProtocol Tomas Pilar (tpilar)
2020-07-31 16:19 ` Tomas Pilar (tpilar) [this message]
2020-07-31 16:19 ` [PATCH 6/8] DynamicTablesPkg/TableHelperLib: User friendly strings Tomas Pilar (tpilar)
2020-07-31 16:19 ` [PATCH 7/8] DynamicTablesPkg: Simplify AddAcpiHeader, CfgMgrGetInfo Tomas Pilar (tpilar)
2020-07-31 16:19 ` [PATCH 8/8] DynamicTablesPkg: Remove GET_OBJECT_LIST Tomas Pilar (tpilar)
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200731161926.341330-6-tomas@nuviainc.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox