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