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