]> git.proxmox.com Git - mirror_edk2.git/blame - DynamicTablesPkg/Library/Common/TableHelperLib/TableHelper.c
DynamicTablesPkg: Add OEM Info
[mirror_edk2.git] / DynamicTablesPkg / Library / Common / TableHelperLib / TableHelper.c
CommitLineData
7130bcef
SM
1/** @file\r
2 Table Helper\r
3\r
4Copyright (c) 2017 - 2019, ARM Limited. All rights reserved.\r
5This program and the accompanying materials\r
6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12**/\r
13\r
14#include <Protocol/AcpiTable.h>\r
15#include <Library/BaseLib.h>\r
16#include <Library/DebugLib.h>\r
17#include <Library/BaseMemoryLib.h>\r
18\r
19// Module specific include files.\r
20#include <AcpiTableGenerator.h>\r
21#include <ConfigurationManagerObject.h>\r
22#include <Protocol/ConfigurationManagerProtocol.h>\r
23\r
24/** The GetCgfMgrInfo function gets the CM_STD_OBJ_CONFIGURATION_MANAGER_INFO\r
25 object from the Configuration Manager.\r
26\r
27 @param [in] CfgMgrProtocol Pointer to the Configuration Manager protocol\r
28 interface.\r
29 @param [out] CfgMfrInfo Pointer to the Configuration Manager Info\r
30 object structure.\r
31\r
32 @retval EFI_SUCCESS The object is returned.\r
33 @retval EFI_INVALID_PARAMETER The Object ID is invalid.\r
34 @retval EFI_NOT_FOUND The requested Object is not found.\r
35 @retval EFI_BAD_BUFFER_SIZE The size returned by the Configuration\r
36 Manager is less than the Object size.\r
37**/\r
38EFI_STATUS\r
39EFIAPI\r
40GetCgfMgrInfo (\r
41 IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST CfgMgrProtocol,\r
42 OUT CM_STD_OBJ_CONFIGURATION_MANAGER_INFO ** CfgMfrInfo\r
43 )\r
44{\r
45 EFI_STATUS Status;\r
46 CM_OBJ_DESCRIPTOR CmObjectDesc;\r
47\r
48 ASSERT (CfgMgrProtocol != NULL);\r
49 ASSERT (CfgMfrInfo != NULL);\r
50\r
51 *CfgMfrInfo = NULL;\r
52 Status = CfgMgrProtocol->GetObject (\r
53 CfgMgrProtocol,\r
54 CREATE_CM_STD_OBJECT_ID (EStdObjCfgMgrInfo),\r
55 CM_NULL_TOKEN,\r
56 &CmObjectDesc\r
57 );\r
58 if (EFI_ERROR (Status)) {\r
59 DEBUG ((\r
60 DEBUG_ERROR,\r
61 "ERROR: Failed to Get Configuration Manager Info. Status = %r\n",\r
62 Status\r
63 ));\r
64 return Status;\r
65 }\r
66\r
67 if (CmObjectDesc.ObjectId != CREATE_CM_STD_OBJECT_ID (EStdObjCfgMgrInfo)) {\r
68 DEBUG ((\r
69 DEBUG_ERROR,\r
70 "ERROR: EStdObjCfgMgrInfo: Invalid ObjectId = 0x%x, expected Id = 0x%x\n",\r
71 CmObjectDesc.ObjectId,\r
72 CREATE_CM_STD_OBJECT_ID (EStdObjCfgMgrInfo)\r
73 ));\r
74 ASSERT (FALSE);\r
75 return EFI_INVALID_PARAMETER;\r
76 }\r
77\r
78 if (CmObjectDesc.Size <\r
79 (sizeof (CM_STD_OBJ_CONFIGURATION_MANAGER_INFO) * CmObjectDesc.Count)) {\r
80 DEBUG ((\r
81 DEBUG_ERROR,\r
82 "ERROR: EStdObjCfgMgrInfo: Buffer too small, size = 0x%x\n",\r
83 CmObjectDesc.Size\r
84 ));\r
85 ASSERT (FALSE);\r
86 return EFI_BAD_BUFFER_SIZE;\r
87 }\r
88\r
89 *CfgMfrInfo = (CM_STD_OBJ_CONFIGURATION_MANAGER_INFO*)CmObjectDesc.Data;\r
90 return Status;\r
91}\r
92\r
93/** The AddAcpiHeader function updates the ACPI header structure pointed by\r
94 the AcpiHeader. It utilizes the ACPI table Generator and the Configuration\r
95 Manager protocol to obtain any information required for constructing the\r
96 header.\r
97\r
98 @param [in] CfgMgrProtocol Pointer to the Configuration Manager\r
99 protocol interface.\r
100 @param [in] Generator Pointer to the ACPI table Generator.\r
101 @param [in,out] AcpiHeader Pointer to the ACPI table header to be\r
102 updated.\r
e12bdeb1 103 @param [in] AcpiTableInfo Pointer to the ACPI table info structure.\r
7130bcef
SM
104 @param [in] Length Length of the ACPI table.\r
105\r
106 @retval EFI_SUCCESS The ACPI table is updated successfully.\r
107 @retval EFI_INVALID_PARAMETER A parameter is invalid.\r
108 @retval EFI_NOT_FOUND The required object information is not found.\r
109 @retval EFI_BAD_BUFFER_SIZE The size returned by the Configuration\r
110 Manager is less than the Object size for the\r
111 requested object.\r
112**/\r
113EFI_STATUS\r
114EFIAPI\r
115AddAcpiHeader (\r
116 IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST CfgMgrProtocol,\r
117 IN CONST ACPI_TABLE_GENERATOR * CONST Generator,\r
118 IN OUT EFI_ACPI_DESCRIPTION_HEADER * CONST AcpiHeader,\r
e12bdeb1 119 IN CONST CM_STD_OBJ_ACPI_TABLE_INFO * CONST AcpiTableInfo,\r
7130bcef
SM
120 IN CONST UINT32 Length\r
121 )\r
122{\r
123 EFI_STATUS Status;\r
124 CM_STD_OBJ_CONFIGURATION_MANAGER_INFO * CfgMfrInfo;\r
125\r
126 ASSERT (CfgMgrProtocol != NULL);\r
127 ASSERT (Generator != NULL);\r
128 ASSERT (AcpiHeader != NULL);\r
129 ASSERT (Length >= sizeof (EFI_ACPI_DESCRIPTION_HEADER));\r
130\r
131 if ((CfgMgrProtocol == NULL) ||\r
132 (Generator == NULL) ||\r
133 (AcpiHeader == NULL) ||\r
134 (Length < sizeof (EFI_ACPI_DESCRIPTION_HEADER))\r
135 ) {\r
136 return EFI_INVALID_PARAMETER;\r
137 }\r
138\r
139 Status = GetCgfMgrInfo (CfgMgrProtocol, &CfgMfrInfo);\r
140 if (EFI_ERROR (Status)) {\r
141 DEBUG ((\r
142 DEBUG_ERROR,\r
143 "ERROR: Failed to get Configuration Manager info. Status = %r\n",\r
144 Status\r
145 ));\r
146 goto error_handler;\r
147 }\r
148\r
149 // UINT32 Signature\r
150 AcpiHeader->Signature = Generator->AcpiTableSignature;\r
151 // UINT32 Length\r
152 AcpiHeader->Length = Length;\r
153 // UINT8 Revision\r
e12bdeb1 154 AcpiHeader->Revision = AcpiTableInfo->AcpiTableRevision;\r
7130bcef
SM
155 // UINT8 Checksum\r
156 AcpiHeader->Checksum = 0;\r
157\r
158 // UINT8 OemId[6]\r
159 CopyMem (AcpiHeader->OemId, CfgMfrInfo->OemId, sizeof (AcpiHeader->OemId));\r
160\r
161 // UINT64 OemTableId\r
e12bdeb1
SM
162 if (AcpiTableInfo->OemTableId != 0) {\r
163 AcpiHeader->OemTableId = AcpiTableInfo->OemTableId;\r
164 } else {\r
165 AcpiHeader->OemTableId = SIGNATURE_32 (\r
166 CfgMfrInfo->OemId[0],\r
167 CfgMfrInfo->OemId[1],\r
168 CfgMfrInfo->OemId[2],\r
169 CfgMfrInfo->OemId[3]\r
170 ) |\r
171 ((UINT64)Generator->AcpiTableSignature << 32);\r
172 }\r
7130bcef
SM
173\r
174 // UINT32 OemRevision\r
e12bdeb1
SM
175 if (AcpiTableInfo->OemRevision != 0) {\r
176 AcpiHeader->OemRevision = AcpiTableInfo->OemRevision;\r
177 } else {\r
178 AcpiHeader->OemRevision = CfgMfrInfo->Revision;\r
179 }\r
7130bcef
SM
180\r
181 // UINT32 CreatorId\r
182 AcpiHeader->CreatorId = Generator->CreatorId;\r
183 // UINT32 CreatorRevision\r
184 AcpiHeader->CreatorRevision = Generator->CreatorRevision;\r
185\r
186error_handler:\r
187 return Status;\r
188}\r