]> git.proxmox.com Git - mirror_edk2.git/blame - Vlv2TbltDevicePkg/SmBiosMiscDxe/MiscProcessorCacheFunction.c
Upload BSD-licensed Vlv2TbltDevicePkg and Vlv2DeviceRefCodePkg to
[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
31\r
32extern SMBIOS_TABLE_TYPE7 *SmbiosRecordL1;\r
33extern SMBIOS_TABLE_TYPE7 *SmbiosRecordL2;\r
34extern SMBIOS_TABLE_TYPE7 *SmbiosRecordL3;\r
35\r
36\r
37UINT32\r
38ConvertBase2ToRaw (\r
39 IN EFI_EXP_BASE2_DATA *Data)\r
40{\r
41 UINTN Index;\r
42 UINT32 RawData;\r
43\r
44 RawData = Data->Value;\r
45 for (Index = 0; Index < (UINTN) Data->Exponent; Index++) {\r
46 RawData <<= 1;\r
47 }\r
48\r
49 return RawData;\r
50}\r
51\r
52\r
53MISC_SMBIOS_TABLE_FUNCTION(MiscProcessorCache)\r
54{\r
55 EFI_SMBIOS_HANDLE SmbiosHandle;\r
56 SMBIOS_TABLE_TYPE7 *SmbiosRecordL1;\r
57 SMBIOS_TABLE_TYPE7 *SmbiosRecordL2;\r
58\r
59 EFI_CACHE_SRAM_TYPE_DATA CacheSramType;\r
60 CHAR16 *SocketDesignation;\r
61 CHAR8 *OptionalStrStart;\r
62 UINTN SocketStrLen;\r
63 STRING_REF TokenToGet;\r
64 EFI_DATA_HUB_PROTOCOL *DataHub;\r
65 UINT64 MonotonicCount;\r
66 EFI_DATA_RECORD_HEADER *Record;\r
67 EFI_SUBCLASS_TYPE1_HEADER *DataHeader;\r
68 UINT8 *SrcData;\r
69 UINT32 SrcDataSize;\r
70 EFI_STATUS Status;\r
71\r
72 //\r
73 // Memory Device LOcator\r
74 //\r
75 DEBUG ((EFI_D_ERROR, "type 7\n"));\r
76\r
77 TokenToGet = STRING_TOKEN (STR_SOCKET_DESIGNATION);\r
78 SocketDesignation = SmbiosMiscGetString (TokenToGet);\r
79 SocketStrLen = StrLen(SocketDesignation);\r
80 if (SocketStrLen > SMBIOS_STRING_MAX_LENGTH) {\r
81 return EFI_UNSUPPORTED;\r
82 }\r
83\r
84 SmbiosRecordL1 = AllocatePool(sizeof (SMBIOS_TABLE_TYPE7) + 7 + 1 + 1);\r
85 ASSERT (SmbiosRecordL1 != NULL);\r
86 ZeroMem(SmbiosRecordL1, sizeof (SMBIOS_TABLE_TYPE7) + 7 + 1 + 1);\r
87\r
88 SmbiosRecordL2 = AllocatePool(sizeof (SMBIOS_TABLE_TYPE7) + 7 + 1 + 1);\r
89 ASSERT (SmbiosRecordL2 != NULL);\r
90 ZeroMem(SmbiosRecordL2, sizeof (SMBIOS_TABLE_TYPE7) + 7 + 1 + 1);\r
91\r
92 //\r
93 // Get the Data Hub Protocol. Assume only one instance\r
94 //\r
95 Status = gBS->LocateProtocol (\r
96 &gEfiDataHubProtocolGuid,\r
97 NULL,\r
98 (VOID **)&DataHub\r
99 );\r
100 ASSERT_EFI_ERROR(Status);\r
101\r
102 MonotonicCount = 0;\r
103 Record = NULL;\r
104\r
105 do {\r
106 Status = DataHub->GetNextRecord (\r
107 DataHub,\r
108 &MonotonicCount,\r
109 NULL,\r
110 &Record\r
111 );\r
112 if (!EFI_ERROR(Status)) {\r
113 if (Record->DataRecordClass == EFI_DATA_RECORD_CLASS_DATA) {\r
114 DataHeader = (EFI_SUBCLASS_TYPE1_HEADER *)(Record + 1);\r
115 SrcData = (UINT8 *)(DataHeader + 1);\r
116 SrcDataSize = Record->RecordSize - Record->HeaderSize - sizeof (EFI_SUBCLASS_TYPE1_HEADER);\r
117 if (CompareGuid(&Record->DataRecordGuid, &gEfiCacheSubClassGuid) && (DataHeader->RecordType == CacheSizeRecordType)) {\r
118 if (DataHeader->SubInstance == EFI_CACHE_L1) {\r
119 SmbiosRecordL1->InstalledSize += (UINT16) (ConvertBase2ToRaw((EFI_EXP_BASE2_DATA *)SrcData) >> 10);\r
120 SmbiosRecordL1->MaximumCacheSize = SmbiosRecordL1->InstalledSize;\r
121 }\r
122 else if (DataHeader->SubInstance == EFI_CACHE_L2) {\r
123 SmbiosRecordL2->InstalledSize += (UINT16) (ConvertBase2ToRaw((EFI_EXP_BASE2_DATA *)SrcData) >> 10);\r
124 SmbiosRecordL2->MaximumCacheSize = SmbiosRecordL2->InstalledSize;\r
125 } else {\r
126 continue;\r
127 }\r
128 }\r
129 }\r
130 }\r
131 } while (!EFI_ERROR(Status) && (MonotonicCount != 0));\r
132\r
133 //\r
134 //Filling SMBIOS type 7 information for different cache levels.\r
135 //\r
136\r
137 SmbiosRecordL1->Hdr.Type = EFI_SMBIOS_TYPE_CACHE_INFORMATION;\r
138 SmbiosRecordL1->Hdr.Length = (UINT8) sizeof (SMBIOS_TABLE_TYPE7);\r
139 SmbiosRecordL1->Hdr.Handle = 0;\r
140\r
141 SmbiosRecordL1->Associativity = CacheAssociativity8Way;\r
142 SmbiosRecordL1->SystemCacheType = CacheTypeUnknown;\r
143 SmbiosRecordL1->SocketDesignation = 0x01;\r
144 SmbiosRecordL1->CacheSpeed = 0;\r
145 SmbiosRecordL1->CacheConfiguration = 0x0180;\r
146 ZeroMem (&CacheSramType, sizeof (EFI_CACHE_SRAM_TYPE_DATA));\r
147 CacheSramType.Synchronous = 1;\r
148 CopyMem(&SmbiosRecordL1->SupportedSRAMType, &CacheSramType, 2);\r
149 CopyMem(&SmbiosRecordL1->CurrentSRAMType, &CacheSramType, 2);\r
150 SmbiosRecordL1->ErrorCorrectionType = EfiCacheErrorSingleBit;\r
151\r
152\r
153 SmbiosRecordL2->Hdr.Type = EFI_SMBIOS_TYPE_CACHE_INFORMATION;\r
154 SmbiosRecordL2->Hdr.Length = (UINT8) sizeof (SMBIOS_TABLE_TYPE7);\r
155 SmbiosRecordL2->Hdr.Handle = 0;\r
156\r
157 SmbiosRecordL2->Associativity = CacheAssociativity16Way;\r
158 SmbiosRecordL2->SystemCacheType = CacheTypeInstruction;\r
159 SmbiosRecordL2->SocketDesignation = 0x01;\r
160 SmbiosRecordL2->CacheSpeed = 0;\r
161 SmbiosRecordL2->CacheConfiguration = 0x0281;\r
162 ZeroMem (&CacheSramType, sizeof (EFI_CACHE_SRAM_TYPE_DATA));\r
163 CacheSramType.Synchronous = 1;\r
164 CopyMem(&SmbiosRecordL2->SupportedSRAMType, &CacheSramType, 2);\r
165 CopyMem(&SmbiosRecordL2->CurrentSRAMType, &CacheSramType, 2);\r
166 SmbiosRecordL2->ErrorCorrectionType = EfiCacheErrorSingleBit;\r
167\r
168\r
169\r
170 //\r
171 //Adding SMBIOS type 7 records to SMBIOS table.\r
172 //\r
173 SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;\r
174 OptionalStrStart = (CHAR8 *)(SmbiosRecordL1 + 1);\r
175 UnicodeStrToAsciiStr(SocketDesignation, OptionalStrStart);\r
176\r
177 Smbios-> Add(\r
178 Smbios,\r
179 NULL,\r
180 &SmbiosHandle,\r
181 (EFI_SMBIOS_TABLE_HEADER *) SmbiosRecordL1\r
182 );\r
183\r
184 //\r
185 //VLV2 incorporates two SLM modules (quad cores) in the SoC. 2 cores share BIU/L2 cache\r
186 //\r
187 SmbiosRecordL2->InstalledSize = (SmbiosRecordL2->InstalledSize)/2;\r
188 SmbiosRecordL2->MaximumCacheSize = SmbiosRecordL2->InstalledSize;\r
189 SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;\r
190\r
191 OptionalStrStart = (CHAR8 *)(SmbiosRecordL2 + 1);\r
192 UnicodeStrToAsciiStr(SocketDesignation, OptionalStrStart);\r
193\r
194 Smbios-> Add(\r
195 Smbios,\r
196 NULL,\r
197 &SmbiosHandle,\r
198 (EFI_SMBIOS_TABLE_HEADER *) SmbiosRecordL2\r
199 );\r
200\r
201 return EFI_SUCCESS;\r
202}\r