• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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