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