]> git.proxmox.com Git - mirror_edk2.git/blame - Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscProcessorCacheFunction.c
BaseTools/BinToPcd: Fix Python 2.7.x compatibility issue
[mirror_edk2.git] / Vlv2TbltDevicePkg / SmBiosMiscDxe / MiscProcessorCacheFunction.c
CommitLineData
3cbfba02
DW
1/*++\r
2\r
3Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>\r
4 \r\r
5 This program and the accompanying materials are licensed and made available under\r\r
6 the terms and conditions of the BSD License that accompanies this distribution. \r\r
7 The full text of the license may be found at \r\r
8 http://opensource.org/licenses/bsd-license.php. \r\r
9 \r\r
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r\r
12 \r\r
13\r
14\r
15Module Name:\r
16\r
17 MiscProcessorCacheFunction.c\r
18\r
19Abstract:\r
20\r
21 BIOS processor cache details.\r
22 Misc. subclass type 7.\r
23 SMBIOS type 7.\r
24\r
25--*/\r
26#include "CommonHeader.h"\r
27#include "MiscSubclassDriver.h"\r
28#include <Protocol/DataHub.h>\r
29#include <Guid/DataHubRecords.h>\r
30\r
3cbfba02
DW
31UINT32\r
32ConvertBase2ToRaw (\r
33 IN EFI_EXP_BASE2_DATA *Data)\r
34{\r
35 UINTN Index;\r
36 UINT32 RawData;\r
37\r
38 RawData = Data->Value;\r
39 for (Index = 0; Index < (UINTN) Data->Exponent; Index++) {\r
40 RawData <<= 1;\r
41 }\r
42\r
43 return RawData;\r
44}\r
45\r
46\r
47MISC_SMBIOS_TABLE_FUNCTION(MiscProcessorCache)\r
48{\r
49 EFI_SMBIOS_HANDLE SmbiosHandle;\r
50 SMBIOS_TABLE_TYPE7 *SmbiosRecordL1;\r
51 SMBIOS_TABLE_TYPE7 *SmbiosRecordL2;\r
52\r
53 EFI_CACHE_SRAM_TYPE_DATA CacheSramType;\r
54 CHAR16 *SocketDesignation;\r
55 CHAR8 *OptionalStrStart;\r
56 UINTN SocketStrLen;\r
57 STRING_REF TokenToGet;\r
58 EFI_DATA_HUB_PROTOCOL *DataHub;\r
59 UINT64 MonotonicCount;\r
60 EFI_DATA_RECORD_HEADER *Record;\r
61 EFI_SUBCLASS_TYPE1_HEADER *DataHeader;\r
62 UINT8 *SrcData;\r
3cbfba02
DW
63 EFI_STATUS Status;\r
64\r
65 //\r
66 // Memory Device LOcator\r
67 //\r
68 DEBUG ((EFI_D_ERROR, "type 7\n"));\r
69\r
70 TokenToGet = STRING_TOKEN (STR_SOCKET_DESIGNATION);\r
71 SocketDesignation = SmbiosMiscGetString (TokenToGet);\r
72 SocketStrLen = StrLen(SocketDesignation);\r
73 if (SocketStrLen > SMBIOS_STRING_MAX_LENGTH) {\r
74 return EFI_UNSUPPORTED;\r
75 }\r
76\r
77 SmbiosRecordL1 = AllocatePool(sizeof (SMBIOS_TABLE_TYPE7) + 7 + 1 + 1);\r
78 ASSERT (SmbiosRecordL1 != NULL);\r
79 ZeroMem(SmbiosRecordL1, sizeof (SMBIOS_TABLE_TYPE7) + 7 + 1 + 1);\r
80\r
81 SmbiosRecordL2 = AllocatePool(sizeof (SMBIOS_TABLE_TYPE7) + 7 + 1 + 1);\r
82 ASSERT (SmbiosRecordL2 != NULL);\r
83 ZeroMem(SmbiosRecordL2, sizeof (SMBIOS_TABLE_TYPE7) + 7 + 1 + 1);\r
84\r
85 //\r
86 // Get the Data Hub Protocol. Assume only one instance\r
87 //\r
88 Status = gBS->LocateProtocol (\r
89 &gEfiDataHubProtocolGuid,\r
90 NULL,\r
91 (VOID **)&DataHub\r
92 );\r
93 ASSERT_EFI_ERROR(Status);\r
94\r
95 MonotonicCount = 0;\r
96 Record = NULL;\r
97\r
98 do {\r
99 Status = DataHub->GetNextRecord (\r
100 DataHub,\r
101 &MonotonicCount,\r
102 NULL,\r
103 &Record\r
104 );\r
105 if (!EFI_ERROR(Status)) {\r
106 if (Record->DataRecordClass == EFI_DATA_RECORD_CLASS_DATA) {\r
107 DataHeader = (EFI_SUBCLASS_TYPE1_HEADER *)(Record + 1);\r
108 SrcData = (UINT8 *)(DataHeader + 1);\r
3cbfba02
DW
109 if (CompareGuid(&Record->DataRecordGuid, &gEfiCacheSubClassGuid) && (DataHeader->RecordType == CacheSizeRecordType)) {\r
110 if (DataHeader->SubInstance == EFI_CACHE_L1) {\r
111 SmbiosRecordL1->InstalledSize += (UINT16) (ConvertBase2ToRaw((EFI_EXP_BASE2_DATA *)SrcData) >> 10);\r
112 SmbiosRecordL1->MaximumCacheSize = SmbiosRecordL1->InstalledSize;\r
113 }\r
114 else if (DataHeader->SubInstance == EFI_CACHE_L2) {\r
115 SmbiosRecordL2->InstalledSize += (UINT16) (ConvertBase2ToRaw((EFI_EXP_BASE2_DATA *)SrcData) >> 10);\r
116 SmbiosRecordL2->MaximumCacheSize = SmbiosRecordL2->InstalledSize;\r
117 } else {\r
118 continue;\r
119 }\r
120 }\r
121 }\r
122 }\r
123 } while (!EFI_ERROR(Status) && (MonotonicCount != 0));\r
124\r
125 //\r
126 //Filling SMBIOS type 7 information for different cache levels.\r
127 //\r
128\r
129 SmbiosRecordL1->Hdr.Type = EFI_SMBIOS_TYPE_CACHE_INFORMATION;\r
130 SmbiosRecordL1->Hdr.Length = (UINT8) sizeof (SMBIOS_TABLE_TYPE7);\r
131 SmbiosRecordL1->Hdr.Handle = 0;\r
132\r
133 SmbiosRecordL1->Associativity = CacheAssociativity8Way;\r
134 SmbiosRecordL1->SystemCacheType = CacheTypeUnknown;\r
135 SmbiosRecordL1->SocketDesignation = 0x01;\r
136 SmbiosRecordL1->CacheSpeed = 0;\r
137 SmbiosRecordL1->CacheConfiguration = 0x0180;\r
138 ZeroMem (&CacheSramType, sizeof (EFI_CACHE_SRAM_TYPE_DATA));\r
139 CacheSramType.Synchronous = 1;\r
140 CopyMem(&SmbiosRecordL1->SupportedSRAMType, &CacheSramType, 2);\r
141 CopyMem(&SmbiosRecordL1->CurrentSRAMType, &CacheSramType, 2);\r
142 SmbiosRecordL1->ErrorCorrectionType = EfiCacheErrorSingleBit;\r
143\r
144\r
145 SmbiosRecordL2->Hdr.Type = EFI_SMBIOS_TYPE_CACHE_INFORMATION;\r
146 SmbiosRecordL2->Hdr.Length = (UINT8) sizeof (SMBIOS_TABLE_TYPE7);\r
147 SmbiosRecordL2->Hdr.Handle = 0;\r
148\r
149 SmbiosRecordL2->Associativity = CacheAssociativity16Way;\r
150 SmbiosRecordL2->SystemCacheType = CacheTypeInstruction;\r
151 SmbiosRecordL2->SocketDesignation = 0x01;\r
152 SmbiosRecordL2->CacheSpeed = 0;\r
153 SmbiosRecordL2->CacheConfiguration = 0x0281;\r
154 ZeroMem (&CacheSramType, sizeof (EFI_CACHE_SRAM_TYPE_DATA));\r
155 CacheSramType.Synchronous = 1;\r
156 CopyMem(&SmbiosRecordL2->SupportedSRAMType, &CacheSramType, 2);\r
157 CopyMem(&SmbiosRecordL2->CurrentSRAMType, &CacheSramType, 2);\r
158 SmbiosRecordL2->ErrorCorrectionType = EfiCacheErrorSingleBit;\r
159\r
160\r
161\r
162 //\r
163 //Adding SMBIOS type 7 records to SMBIOS table.\r
164 //\r
165 SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;\r
166 OptionalStrStart = (CHAR8 *)(SmbiosRecordL1 + 1);\r
167 UnicodeStrToAsciiStr(SocketDesignation, OptionalStrStart);\r
168\r
169 Smbios-> Add(\r
170 Smbios,\r
171 NULL,\r
172 &SmbiosHandle,\r
173 (EFI_SMBIOS_TABLE_HEADER *) SmbiosRecordL1\r
174 );\r
175\r
176 //\r
177 //VLV2 incorporates two SLM modules (quad cores) in the SoC. 2 cores share BIU/L2 cache\r
178 //\r
179 SmbiosRecordL2->InstalledSize = (SmbiosRecordL2->InstalledSize)/2;\r
180 SmbiosRecordL2->MaximumCacheSize = SmbiosRecordL2->InstalledSize;\r
181 SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;\r
182\r
183 OptionalStrStart = (CHAR8 *)(SmbiosRecordL2 + 1);\r
184 UnicodeStrToAsciiStr(SocketDesignation, OptionalStrStart);\r
185\r
186 Smbios-> Add(\r
187 Smbios,\r
188 NULL,\r
189 &SmbiosHandle,\r
190 (EFI_SMBIOS_TABLE_HEADER *) SmbiosRecordL2\r
191 );\r
192\r
193 return EFI_SUCCESS;\r
194}\r