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