Hi Jeff, Pierre,
Please findmy response inline marked [SAMI].
Regards,
Sami Mujawar
On 12/08/2022 02:36 pm, Pierre Gondois wrote:
Hi Jeff,
Please find some inline comments below:
On 8/5/22 17:14, Jeff Brasen via groups.io wrote:
Add APIs needed to build _DSD with different UUIDs.
This is per ACPI specification 6.4 s6.2.5.
Adds support for building data packages with format
Package {"Name", Integer}
Signed-off-by: Jeff Brasen <jbra...@nvidia.com>
---
.../Include/Library/AmlLib/AmlLib.h | 50 ++++
.../Common/AmlLib/CodeGen/AmlCodeGen.c | 236 ++++++++++++++++++
2 files changed, 286 insertions(+)
diff --git a/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h
b/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h
index 6f214c0dfa..30cab3f6bb 100644
--- a/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h
+++ b/DynamicTablesPkg/Include/Library/AmlLib/AmlLib.h
@@ -1280,6 +1280,56 @@ AmlAddLpiState (
IN AML_OBJECT_NODE_HANDLE LpiNode
);
+/** AML code generation for a _DSD device data object.
+
+ AmlAddDeviceDataDescriptorPackage (Uuid, ParentNode,
NewObjectNode) is
+ equivalent of the following ASL code:
+ ToUUID(Uuid),
+ Package () {}
+
+ @ingroup CodeGenApis
+
+ @param [in] Uuid The Uuid of the descriptor to be created
+ @param [in] DsdNode Node of the DSD Package.
+ @param [out] PackageNode If success, contains the created
package node.
+
+ @retval EFI_SUCCESS Success.
+ @retval EFI_INVALID_PARAMETER Invalid parameter.
+ @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
+**/
+EFI_STATUS
+EFIAPI
+AmlAddDeviceDataDescriptorPackage (
+ IN CONST EFI_GUID *Uuid,
+ IN AML_OBJECT_NODE_HANDLE DsdNode,
+ OUT AML_OBJECT_NODE_HANDLE *PackageNode
+ );
+
+/** AML code generation to add a package with a name and value,
+ * to a parent package> +
+ AmlAddNameValuePackage ("Name", Value, ParentNode) is
+ equivalent of the following ASL code:
+ Package (2) {"Name", Value}
+
+ @ingroup CodeGenApis
+
+ @param [in] Name String to place in first entry of package
+ @param [in] Value Integer to place in second entry of
package
+ @param [in] PackageNode Package to add new sub package to.
+
+ @retval EFI_SUCCESS Success.
+ @retval EFI_INVALID_PARAMETER Invalid parameter.
+ @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
+**/
+EFI_STATUS
+EFIAPI
+AmlAddNameIntegerPackage (
+ IN CHAR8 *Name,
+ IN UINT64 Value,
+ IN AML_OBJECT_NODE_HANDLE PackageNode
+ );
+
// DEPRECATED APIS
#ifndef DISABLE_NEW_DEPRECATED_INTERFACES
diff --git
a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c
b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c
index e51d2dd7f0..80e43d0e62 100644
--- a/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c
+++ b/DynamicTablesPkg/Library/Common/AmlLib/CodeGen/AmlCodeGen.c
@@ -2600,3 +2600,239 @@ error_handler:
return Status;
}
+
+/** AML code generation for a _DSD device data object.
+
+ AmlAddDeviceDataDescriptorPackage (Uuid, ParentNode,
NewObjectNode) is
I think this is DsdNode and PackageNode (same for the header file).
+ equivalent of the following ASL code:
+ ToUUID(Uuid),
+ Package () {}
+
+ @ingroup CodeGenApis
+
+ @param [in] Uuid The Uuid of the descriptor to be created
+ @param [in] DsdNode Node of the DSD Package.
+ @param [out] PackageNode If success, contains the created
package node.
+
+ @retval EFI_SUCCESS Success.
+ @retval EFI_INVALID_PARAMETER Invalid parameter.
+ @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
+**/
+EFI_STATUS
+EFIAPI
+AmlAddDeviceDataDescriptorPackage (
+ IN CONST EFI_GUID *Uuid,
+ IN AML_OBJECT_NODE_HANDLE DsdNode,
+ OUT AML_OBJECT_NODE_HANDLE *PackageNode
+ )
+{
+ EFI_STATUS Status;
+ AML_OBJECT_NODE *UuidNode;
+ AML_DATA_NODE *UuidDataNode;
+ AML_OBJECT_NODE_HANDLE DsdEntryList;
+
+ if ((Uuid == NULL) ||
+ (PackageNode == NULL) ||
+ (AmlGetNodeType ((AML_NODE_HANDLE)DsdNode) != EAmlNodeObject) ||
+ (!AmlNodeHasOpCode (DsdNode, AML_NAME_OP, 0)) ||
+ !AmlNameOpCompareName (DsdNode, "_DSD"))
+ {
+ ASSERT (0);
This is not consistent in the file, but it could be:
ASSERT_EFI_ERROR (ASSERT_EFI_ERROR)
[SAMI] I am fine with using either ASSERTxxx macros. The only think that
needs to be taken care of is that the errors are handled in release
builds (as the ASSERTxxx macros will vanish in release builds).
+ return EFI_INVALID_PARAMETER;
+ }
+
+ // Get the Package object node of the _DSD node,
+ // which is the 2nd fixed argument (i.e. index 1).
+ DsdEntryList = (AML_OBJECT_NODE_HANDLE)AmlGetFixedArgument (
+ DsdNode,
+ EAmlParseIndexTerm1
+ );
+ if ((DsdEntryList ==
NULL) ||
+ (AmlGetNodeType ((AML_NODE_HANDLE)DsdEntryList) !=
EAmlNodeObject) ||
+ (!AmlNodeHasOpCode (DsdEntryList, AML_PACKAGE_OP, 0)))
+ {
+ ASSERT (0);
+ return EFI_INVALID_PARAMETER;
+ }
+
+ *PackageNode = NULL;
+ UuidNode = NULL;
As UuidNode is the first node allocated, we either fail and return
(no need to free it), or succeed and the error handler should
free it. So it is not necessary to initialize it to NULL.
However UuidDataNode should be initialized to NULL.
+
+ Status = AmlCodeGenBuffer (NULL, 0, &UuidNode);
+ if (EFI_ERROR (Status)) {
+ ASSERT (0);
+ goto error_handler;
If it failed here then no allocation happened yet,
so it could just be a return.
+ }
+
+ Status = AmlCreateDataNode (
+ EAmlNodeDataTypeRaw,
+ (CONST UINT8 *)Uuid,
+ sizeof (EFI_GUID),
+ &UuidDataNode
+ );
+ if (EFI_ERROR (Status)) {
+ ASSERT (0);
+ goto error_handler;
+ }
For the record, I tested the function and the Uuid is correctly
generated.
For Sami: would it be good to have a ToUUID() function as in ASL ?
[SAMI] Yes, that could be useful.
+
+ Status = AmlVarListAddTail (
+ (AML_NODE_HEADER *)UuidNode,
+ (AML_NODE_HEADER *)UuidDataNode
+ );
+ if (EFI_ERROR (Status)) {
+ ASSERT (0);
+ goto error_handler;
+ }
+ UuidDataNode = NULL;
+
+ // Append to the the list of _DSD entries.
+ Status = AmlVarListAddTail (
+ (AML_NODE_HANDLE)DsdEntryList,
+ (AML_NODE_HANDLE)UuidNode
+ );
+ if (EFI_ERROR (Status)) {
+ ASSERT (0);
+ goto error_handler;
+ }
+
+ Status = AmlCodeGenPackage (PackageNode);
+ if (EFI_ERROR (Status)) {
+ ASSERT (0);
+ goto error_handler;
+ }
+
+ // Append to the the list of _DSD entries.
duplicated 'the' here and above
+ Status = AmlVarListAddTail (
+ (AML_NODE_HANDLE)DsdEntryList,
+ (AML_NODE_HANDLE)*PackageNode
+ );
+ if (EFI_ERROR (Status)) {
+ ASSERT (0);
+ goto error_handler;
+ }
+
+ return Status;
+
+error_handler:
+ if (UuidNode != NULL) {
+ //Need to check to detach as there is an error path that have
+ //this attached to the DsdEntry
+ if (AML_NODE_HAS_PARENT (UuidNode)) {
Would it be possible to have a second error_handler instead ?
Ideally AmlCodeGen.c should not be able to see the internal node
structure.
With the second error handler, it should look like:
Status = AmlCodeGenPackage (PackageNode);
if (EFI_ERROR (Status)) {
ASSERT (0);
goto error_handler1;
}
// Append to the the list of _DSD entries.
Status = AmlVarListAddTail (
(AML_NODE_HANDLE)DsdEntryList,
(AML_NODE_HANDLE)*PackageNode
);
if (EFI_ERROR (Status)) {
ASSERT (0);
goto error_handler1;
}
return Status;
error_handler1:
AmlDetachNode ((AML_NODE_HANDLE)UuidNode);
error_handler:
if (UuidNode != NULL) {
AmlDeleteTree ((AML_NODE_HANDLE)UuidNode);
}
...
+ AmlDetachNode ((AML_NODE_HANDLE)UuidNode);
+ }
+ AmlDeleteTree ((AML_NODE_HANDLE)UuidNode);
+ }
+
+ if (*PackageNode != NULL) {
+ AmlDeleteTree ((AML_NODE_HANDLE)*PackageNode);
+ *PackageNode = NULL;
+ }
+ if (UuidDataNode != NULL) {
+ AmlDeleteTree ((AML_NODE_HANDLE)UuidDataNode);
+ }
+
+ return Status;
+}
+
+/** AML code generation to add a package with a name and value,
+ * to a parent package
Is it possible to remove the '*' at the beginning of the line
(same for the prototype) and also add a reference to
s6.2.5 _DSD (Device Specific Data) in the two new function
descriptions ?
+
+ AmlAddNameValuePackage ("Name", Value, ParentNode) is
+ equivalent of the following ASL code:
+ Package (2) {"Name", Value}
+
+ @ingroup CodeGenApis
+
+ @param [in] Name String to place in first entry of package
+ @param [in] Value Integer to place in second entry of
package
+ @param [in] PackageNode Package to add new sub package to.
+
+ @retval EFI_SUCCESS Success.
+ @retval EFI_INVALID_PARAMETER Invalid parameter.
+ @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
+**/
+EFI_STATUS
+EFIAPI
+AmlAddNameIntegerPackage (
To regroup the functions related to _DSD objects,
would it be better to name this function:
AmlAddDsdIntegerProperty()
and the function above:
AmlAddDsdDescriptor()
(Sami/Jeff this is an open question)
[SAMI] Is there any other usecase where 'Package (2) {"Name", Value}'
may be required?
I think AmlAddNameIntegerPackage() is generic and could be useful
elsewhere. Would defining AmlAddDsdIntegerProperty as a macro that maps
to AmlAddNameIntegerPackage() be an alternative?
We could then use the macro in the DSD specific code.
[/SAMI]
+ IN CHAR8 *Name,
+ IN UINT64 Value,
+ IN AML_OBJECT_NODE_HANDLE PackageNode
+ )
+{
+ EFI_STATUS Status;
+ AML_OBJECT_NODE *NameNode;
+ AML_OBJECT_NODE *ValueNode;
+ AML_OBJECT_NODE *NewPackageNode;
+
+ if ((Name == NULL) ||
+ (AmlGetNodeType ((AML_NODE_HANDLE)PackageNode) !=
EAmlNodeObject) ||
+ (!AmlNodeHasOpCode (PackageNode, AML_PACKAGE_OP, 0)))
+ {
+ ASSERT (0);
+ return EFI_INVALID_PARAMETER;
+ }
+
+ NewPackageNode = NULL;
I think setting NewPackageNode to NULL is not necessary as:
- if AmlCodeGenPackage() fails, we return without going to the error
handler
and without trying to free it
- if we fail later, NameNode contains a valid node which is freed in the
error handler
However NameNode and ValueNode should be initialized to NULL as if
AmlCodeGenString() fails, we go to the error handler and try to free
non-initialized values.
+ // The new package entry.
+ Status = AmlCodeGenPackage (&NewPackageNode);
+ if (EFI_ERROR (Status)) {
+ ASSERT (0);
Even though this is not consistent in the file,
it could be ASSERT_EFI_ERROR (Status)
(same comment for the other ASSERT).
[SAMI] I am fine with either ASSERT versions being used. But please
handle errors for release builds.
+ return Status;
+ }
+
+ Status = AmlCodeGenString (Name, &NameNode);
+ if (EFI_ERROR (Status)) {
+ ASSERT_EFI_ERROR (Status);
+ goto error_handler;
+ }
+
+ Status = AmlVarListAddTail (
+ (AML_NODE_HANDLE)NewPackageNode,
+ (AML_NODE_HANDLE)NameNode
+ );
+ if (EFI_ERROR (Status)) {
+ ASSERT (0);
+ goto error_handler;
+ }
+ NameNode = NULL;
+
+ Status = AmlCodeGenInteger (Value, &ValueNode);
+ if (EFI_ERROR (Status)) {
+ ASSERT (0);
+ goto error_handler;
+ }
+
+ Status = AmlVarListAddTail (
+ (AML_NODE_HANDLE)NewPackageNode,
+ (AML_NODE_HANDLE)ValueNode
+ );
+ if (EFI_ERROR (Status)) {
+ ASSERT (0);
+ goto error_handler;
+ }
+ ValueNode = NULL;
+
+ Status = AmlVarListAddTail (
+ (AML_NODE_HANDLE)PackageNode,
+ (AML_NODE_HANDLE)NewPackageNode
+ );
+ if (EFI_ERROR (Status)) {
+ ASSERT (0);
+ goto error_handler;
+ }
+
+ return Status;
+
+error_handler:
+ if (NewPackageNode != NULL) {
+ AmlDeleteTree ((AML_NODE_HANDLE)NewPackageNode);
+ }
+ if (NameNode != NULL) {
+ AmlDeleteTree ((AML_NODE_HANDLE)NameNode);
+ }
+ if (ValueNode != NULL) {
+ AmlDeleteTree ((AML_NODE_HANDLE)ValueNode);
+ }
+
+ return Status;
+}
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#92423): https://edk2.groups.io/g/devel/message/92423
Mute This Topic: https://groups.io/mt/92836835/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-