]> git.proxmox.com Git - mirror_edk2.git/blame - Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscMemoryDeviceFunction.c
ArmPkg/ArmSmcPsciResetSystemLib: Add a new API ResetSystem
[mirror_edk2.git] / Vlv2TbltDevicePkg / SmBiosMiscDxe / MiscMemoryDeviceFunction.c
CommitLineData
3cbfba02
DW
1/*++\r
2\r
3Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>\r
4 \r\r
9dc8036d
MK
5 SPDX-License-Identifier: BSD-2-Clause-Patent\r
6\r
3cbfba02
DW
7 \r\r
8\r
9\r
10Module Name:\r
11\r
12 MiscMemoryDeviceFunction.c\r
13\r
14Abstract:\r
15\r
16 Memory Device\r
17 Misc. subclass type 17.\r
18 SMBIOS type 17.\r
19\r
20--*/\r
21\r
22\r
23#include "CommonHeader.h"\r
24#include "MiscSubclassDriver.h"\r
25#include <Protocol/DataHub.h>\r
26#include <Guid/DataHubRecords.h>\r
27#include <Protocol/MemInfo.h>\r
28\r
29\r
30#define FREQ_800 0x00\r
31#define FREQ_1066 0x01\r
32#define FREQ_1333 0x02\r
33#define FREQ_1600 0x03\r
34\r
35#define MAX_SOCKETS 2\r
36#define EfiMemoryTypeDdr3 0x18\r
37\r
38enum {\r
39 DDRType_DDR3 = 0,\r
40 DDRType_DDR3L = 1,\r
41 DDRType_DDR3U = 2,\r
42 DDRType_DDR3All = 3,\r
43 DDRType_LPDDR2 = 4,\r
44 DDRType_LPDDR3 = 5,\r
45 DDRType_DDR4 = 6\r
46};\r
47\r
48\r
49typedef struct {\r
50 EFI_PHYSICAL_ADDRESS MemoryArrayStartAddress;\r
51 EFI_PHYSICAL_ADDRESS MemoryArrayEndAddress;\r
52 EFI_INTER_LINK_DATA PhysicalMemoryArrayLink;\r
53 UINT16 MemoryArrayPartitionWidth;\r
54} EFI_MEMORY_ARRAY_START_ADDRESS;\r
55\r
56/**\r
57 This function makes boot time changes to the contents of the\r
58 MiscBiosVendor (Type 0).\r
59\r
60 @param RecordData Pointer to copy of RecordData from the Data Table.\r
61\r
62 @retval EFI_SUCCESS All parameters were valid.\r
63 @retval EFI_UNSUPPORTED Unexpected RecordType value.\r
64 @retval EFI_INVALID_PARAMETER Invalid parameter was found.\r
65\r
66**/\r
67VOID\r
68GetType16Hndl (\r
69 IN EFI_SMBIOS_PROTOCOL *Smbios,\r
70 OUT EFI_SMBIOS_HANDLE *Handle\r
71 )\r
72{\r
73 EFI_STATUS Status;\r
74 EFI_SMBIOS_TYPE RecordType;\r
75 EFI_SMBIOS_TABLE_HEADER *Buffer;\r
76\r
77 *Handle = 0;\r
78 RecordType = EFI_SMBIOS_TYPE_PHYSICAL_MEMORY_ARRAY;\r
79\r
80 Status = Smbios->GetNext (\r
81 Smbios,\r
82 Handle,\r
83 &RecordType,\r
84 &Buffer,\r
85 NULL\r
86 );\r
87 if (!EFI_ERROR(Status)) {\r
88 return;\r
89 }\r
90 *Handle = 0xFFFF;\r
91}\r
92\r
93MISC_SMBIOS_TABLE_FUNCTION( MiscMemoryDevice )\r
94{\r
95 CHAR8 *OptionalStrStart;\r
96 UINTN MemDeviceStrLen;\r
97 UINTN MemBankLocatorStrLen;\r
98 UINTN MemManufacturerStrLen;\r
99 UINTN MemSerialNumberStrLen;\r
100 UINTN MemAssetTagStrLen;\r
101 UINTN MemPartNumberStrLen;\r
102 CHAR16 *MemDevice;\r
103 CHAR16 *MemBankLocator;\r
104 CHAR16 *MemManufacturer;\r
105 CHAR16 *MemSerialNumber;\r
106 CHAR16 *MemAssetTag;\r
107 CHAR16 *MemPartNumber;\r
108 EFI_STATUS Status;\r
109 STRING_REF TokenToGet;\r
110 SMBIOS_TABLE_TYPE17 *SmbiosRecord;\r
111 EFI_SMBIOS_HANDLE SmbiosHandle;\r
112 EFI_MEMORY_ARRAY_LINK_DATA *ForType17InputData;\r
113 UINT16 DdrFreq=0;\r
114 UINT16 Type16Handle=0;\r
115 MEM_INFO_PROTOCOL *MemInfoHob;\r
116 UINT8 MemoryType;\r
117\r
118 UINT8 Dimm;\r
119 UINT8 NumSlots;\r
120 STRING_REF DevLocator[] = {\r
121 STRING_TOKEN(STR_MISC_MEM_DEV_LOCATOR0), STRING_TOKEN(STR_MISC_MEM_DEV_LOCATOR1)\r
122 };\r
123 STRING_REF BankLocator[] = {\r
124 STRING_TOKEN(STR_MISC_MEM_BANK_LOCATOR0), STRING_TOKEN(STR_MISC_MEM_BANK_LOCATOR1)\r
125 };\r
126\r
127 //\r
128 // First check for invalid parameters.\r
129 //\r
130 if (RecordData == NULL) {\r
131 return EFI_INVALID_PARAMETER;\r
132 }\r
133 ForType17InputData = (EFI_MEMORY_ARRAY_LINK_DATA *)RecordData;\r
134\r
135 //\r
136 // Get Memory size parameters for each rank from the chipset registers\r
137 //\r
138 Status = gBS->LocateProtocol (\r
139 &gMemInfoProtocolGuid,\r
140 NULL,\r
141 (void **)&MemInfoHob\r
142 );\r
143 ASSERT_EFI_ERROR (Status);\r
144\r
145 NumSlots = (UINT8)(MAX_SOCKETS);\r
146\r
147 //\r
148 // Memory Freq\r
149 //\r
150 switch (MemInfoHob->MemInfoData.ddrFreq){\r
151 case FREQ_800:\r
152 DdrFreq = 800;\r
153 break;\r
154 case FREQ_1066:\r
155 DdrFreq = 1066;\r
156 break;\r
157 case FREQ_1333:\r
158 DdrFreq = 1333;\r
159 break;\r
160 case FREQ_1600:\r
161 DdrFreq = 1600;\r
162 break;\r
163 default:\r
164 DdrFreq = 0;\r
165 break;\r
166 }\r
167\r
168 //\r
169 // Memory Type\r
170 //\r
171 switch (MemInfoHob->MemInfoData.ddrType) {\r
172 case DDRType_LPDDR2:\r
173 MemoryType = EfiMemoryTypeDdr2;\r
174 break;\r
175 case DDRType_DDR3:\r
176 case DDRType_DDR3L:\r
177 case DDRType_DDR3U:\r
178 case DDRType_LPDDR3:\r
179 MemoryType = EfiMemoryTypeDdr3;\r
180 break;\r
181 default:\r
182 MemoryType = EfiMemoryTypeUnknown;\r
183 break;\r
184 }\r
185\r
186 for (Dimm = 0; Dimm < NumSlots; Dimm++) {\r
187 //\r
188 // Memory Device Locator\r
189 //\r
190 TokenToGet = DevLocator[Dimm];\r
191 MemDevice = SmbiosMiscGetString (TokenToGet);\r
192 MemDeviceStrLen = StrLen(MemDevice);\r
193 if (MemDeviceStrLen > SMBIOS_STRING_MAX_LENGTH) {\r
194 return EFI_UNSUPPORTED;\r
195 }\r
196\r
197 TokenToGet = DevLocator[Dimm];\r
198 MemDevice = SmbiosMiscGetString (TokenToGet);\r
199 MemDeviceStrLen = StrLen(MemDevice);\r
200 if (MemDeviceStrLen > SMBIOS_STRING_MAX_LENGTH) {\r
201 return EFI_UNSUPPORTED;\r
202 }\r
203\r
204 //\r
205 // Memory Bank Locator\r
206 //\r
207 TokenToGet = BankLocator[Dimm];\r
208 MemBankLocator = SmbiosMiscGetString (TokenToGet);\r
209 MemBankLocatorStrLen = StrLen(MemBankLocator);\r
210 if (MemBankLocatorStrLen > SMBIOS_STRING_MAX_LENGTH) {\r
211 return EFI_UNSUPPORTED;\r
212 }\r
213\r
214 //\r
215 // Memory Manufacturer\r
216 //\r
217 TokenToGet = STRING_TOKEN (STR_MISC_MEM_MANUFACTURER);\r
218 MemManufacturer = SmbiosMiscGetString (TokenToGet);\r
219 MemManufacturerStrLen = StrLen(MemManufacturer);\r
220 if (MemManufacturerStrLen > SMBIOS_STRING_MAX_LENGTH) {\r
221 return EFI_UNSUPPORTED;\r
222 }\r
223\r
224 //\r
225 // Memory Serial Number\r
226 //\r
227 TokenToGet = STRING_TOKEN (STR_MISC_MEM_SERIAL_NO);\r
228 MemSerialNumber = SmbiosMiscGetString (TokenToGet);\r
229 MemSerialNumberStrLen = StrLen(MemSerialNumber);\r
230 if (MemSerialNumberStrLen > SMBIOS_STRING_MAX_LENGTH) {\r
231 return EFI_UNSUPPORTED;\r
232 }\r
233\r
234 //\r
235 // Memory Asset Tag Number\r
236 //\r
237 TokenToGet = STRING_TOKEN (STR_MISC_MEM_ASSET_TAG);\r
238 MemAssetTag = SmbiosMiscGetString (TokenToGet);\r
239 MemAssetTagStrLen = StrLen(MemAssetTag);\r
240 if (MemAssetTagStrLen > SMBIOS_STRING_MAX_LENGTH) {\r
241 return EFI_UNSUPPORTED;\r
242 }\r
243\r
244 //\r
245 // Memory Part Number\r
246 //\r
247 TokenToGet = STRING_TOKEN (STR_MISC_MEM_PART_NUMBER);\r
248 MemPartNumber = SmbiosMiscGetString (TokenToGet);\r
249 MemPartNumberStrLen = StrLen(MemPartNumber);\r
250 if (MemPartNumberStrLen > SMBIOS_STRING_MAX_LENGTH) {\r
251 return EFI_UNSUPPORTED;\r
252 }\r
253\r
254 //\r
255 // Two zeros following the last string.\r
256 //\r
257 SmbiosRecord = AllocatePool(sizeof (SMBIOS_TABLE_TYPE17) + MemDeviceStrLen + 1 + MemBankLocatorStrLen + 1 + MemManufacturerStrLen + 1 + MemSerialNumberStrLen + 1 + MemAssetTagStrLen+1 + MemPartNumberStrLen + 1 + 1);\r
258 ZeroMem(SmbiosRecord, sizeof (SMBIOS_TABLE_TYPE17) + MemDeviceStrLen + 1 + MemBankLocatorStrLen + 1 + MemManufacturerStrLen + 1 + MemSerialNumberStrLen + 1 + MemAssetTagStrLen+1 + MemPartNumberStrLen + 1 + 1);\r
259\r
260 SmbiosRecord->Hdr.Type = EFI_SMBIOS_TYPE_MEMORY_DEVICE;\r
261 SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE17);\r
262\r
263 //\r
264 // Make handle chosen by smbios protocol.add automatically.\r
265 //\r
266 SmbiosRecord->Hdr.Handle = 0;\r
267\r
268 //\r
269 // Memory Array Handle will be the 3rd optional string following the formatted structure.\r
270 //\r
271 GetType16Hndl( Smbios, &Type16Handle);\r
272 SmbiosRecord->MemoryArrayHandle = Type16Handle;\r
273\r
274 //\r
275 // Memory Size\r
276 //\r
277 if ((MemInfoHob->MemInfoData.dimmSize[Dimm])!=0){\r
278 SmbiosRecord->TotalWidth = 32;\r
279 SmbiosRecord->DataWidth = 32;\r
280 SmbiosRecord->Size = MemInfoHob->MemInfoData.dimmSize[Dimm];\r
281 SmbiosRecord->Speed = DdrFreq;\r
282 SmbiosRecord->ConfiguredMemoryClockSpeed = DdrFreq;\r
283 SmbiosRecord->FormFactor = EfiMemoryFormFactorDimm;\r
284 }\r
285\r
286 SmbiosRecord->DeviceSet =(UINT8) ForType17InputData->MemoryDeviceSet;\r
287 SmbiosRecord->DeviceLocator= 1;\r
288 SmbiosRecord->BankLocator = 2;\r
289\r
290\r
291 SmbiosRecord->Manufacturer = 3;\r
292 SmbiosRecord->SerialNumber= 4;\r
293 SmbiosRecord->AssetTag= 5;\r
294 SmbiosRecord->PartNumber= 6;\r
295 SmbiosRecord->Attributes = (UINT8) ForType17InputData->MemoryState;\r
296 SmbiosRecord->MemoryType = MemoryType;\r
297\r
298 OptionalStrStart = (CHAR8 *)(SmbiosRecord + 1);\r
299 UnicodeStrToAsciiStr(MemDevice, OptionalStrStart);\r
300 UnicodeStrToAsciiStr(MemBankLocator, OptionalStrStart + MemDeviceStrLen + 1);\r
301 UnicodeStrToAsciiStr(MemManufacturer, OptionalStrStart + MemDeviceStrLen + 1 + MemBankLocatorStrLen + 1);\r
302 UnicodeStrToAsciiStr(MemSerialNumber, OptionalStrStart + MemDeviceStrLen + 1 + MemBankLocatorStrLen + 1 + MemManufacturerStrLen + 1);\r
303 UnicodeStrToAsciiStr(MemAssetTag, OptionalStrStart + MemDeviceStrLen + 1 + MemBankLocatorStrLen + 1 + MemManufacturerStrLen + 1 + MemSerialNumberStrLen + 1);\r
304 UnicodeStrToAsciiStr(MemPartNumber, OptionalStrStart + MemDeviceStrLen + 1 + MemBankLocatorStrLen + 1 + MemManufacturerStrLen + 1 + MemSerialNumberStrLen + 1+ MemAssetTagStrLen+1 );\r
305\r
306 //\r
307 // Now we have got the full smbios record, call smbios protocol to add this record.\r
308 //\r
309 SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;\r
310 Status = Smbios-> Add(\r
311 Smbios,\r
312 NULL,\r
313 &SmbiosHandle,\r
314 (EFI_SMBIOS_TABLE_HEADER *) SmbiosRecord\r
315 );\r
316 FreePool(SmbiosRecord);\r
317 }\r
318 return Status;\r
319}\r