]>
Commit | Line | Data |
---|---|---|
7130bcef SM |
1 | /** @file\r |
2 | Table Helper\r | |
3 | \r | |
4 | Copyright (c) 2017 - 2019, ARM Limited. All rights reserved.\r | |
5 | This program and the accompanying materials\r | |
6 | are licensed and made available under the terms and conditions of the BSD License\r | |
7 | which accompanies this distribution. The full text of the license may be found at\r | |
8 | http://opensource.org/licenses/bsd-license.php\r | |
9 | \r | |
10 | THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r | |
11 | WITHOUT 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 | |
38 | EFI_STATUS\r | |
39 | EFIAPI\r | |
40 | GetCgfMgrInfo (\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 | |
bdbbedea | 103 | @param [in] Revision Revision of the ACPI table.\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 | |
113 | EFI_STATUS\r | |
114 | EFIAPI\r | |
115 | AddAcpiHeader (\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 | |
bdbbedea | 119 | IN CONST UINT32 Revision,\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 | |
bdbbedea | 154 | AcpiHeader->Revision = Revision;\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 | |
bdbbedea SM |
162 | AcpiHeader->OemTableId = Generator->CreatorId;\r |
163 | AcpiHeader->OemTableId <<= 32;\r | |
164 | AcpiHeader->OemTableId |= Generator->AcpiTableSignature;\r | |
7130bcef SM |
165 | \r |
166 | // UINT32 OemRevision\r | |
bdbbedea | 167 | AcpiHeader->OemRevision = CfgMfrInfo->Revision;\r |
7130bcef SM |
168 | \r |
169 | // UINT32 CreatorId\r | |
170 | AcpiHeader->CreatorId = Generator->CreatorId;\r | |
171 | // UINT32 CreatorRevision\r | |
172 | AcpiHeader->CreatorRevision = Generator->CreatorRevision;\r | |
173 | \r | |
174 | error_handler:\r | |
175 | return Status;\r | |
176 | }\r |