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