3 Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
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.
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.
17 MiscProcessorCacheFunction.c
21 BIOS processor cache details.
22 Misc. subclass type 7.
26 #include "CommonHeader.h"
27 #include "MiscSubclassDriver.h"
28 #include <Protocol/DataHub.h>
29 #include <Guid/DataHubRecords.h>
32 extern SMBIOS_TABLE_TYPE7
*SmbiosRecordL1
;
33 extern SMBIOS_TABLE_TYPE7
*SmbiosRecordL2
;
34 extern SMBIOS_TABLE_TYPE7
*SmbiosRecordL3
;
39 IN EFI_EXP_BASE2_DATA
*Data
)
44 RawData
= Data
->Value
;
45 for (Index
= 0; Index
< (UINTN
) Data
->Exponent
; Index
++) {
53 MISC_SMBIOS_TABLE_FUNCTION(MiscProcessorCache
)
55 EFI_SMBIOS_HANDLE SmbiosHandle
;
56 SMBIOS_TABLE_TYPE7
*SmbiosRecordL1
;
57 SMBIOS_TABLE_TYPE7
*SmbiosRecordL2
;
59 EFI_CACHE_SRAM_TYPE_DATA CacheSramType
;
60 CHAR16
*SocketDesignation
;
61 CHAR8
*OptionalStrStart
;
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
;
72 // Memory Device LOcator
74 DEBUG ((EFI_D_ERROR
, "type 7\n"));
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
;
83 SmbiosRecordL1
= AllocatePool(sizeof (SMBIOS_TABLE_TYPE7
) + 7 + 1 + 1);
84 ASSERT (SmbiosRecordL1
!= NULL
);
85 ZeroMem(SmbiosRecordL1
, sizeof (SMBIOS_TABLE_TYPE7
) + 7 + 1 + 1);
87 SmbiosRecordL2
= AllocatePool(sizeof (SMBIOS_TABLE_TYPE7
) + 7 + 1 + 1);
88 ASSERT (SmbiosRecordL2
!= NULL
);
89 ZeroMem(SmbiosRecordL2
, sizeof (SMBIOS_TABLE_TYPE7
) + 7 + 1 + 1);
92 // Get the Data Hub Protocol. Assume only one instance
94 Status
= gBS
->LocateProtocol (
95 &gEfiDataHubProtocolGuid
,
99 ASSERT_EFI_ERROR(Status
);
105 Status
= DataHub
->GetNextRecord (
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
;
120 else if (DataHeader
->SubInstance
== EFI_CACHE_L2
) {
121 SmbiosRecordL2
->InstalledSize
+= (UINT16
) (ConvertBase2ToRaw((EFI_EXP_BASE2_DATA
*)SrcData
) >> 10);
122 SmbiosRecordL2
->MaximumCacheSize
= SmbiosRecordL2
->InstalledSize
;
129 } while (!EFI_ERROR(Status
) && (MonotonicCount
!= 0));
132 //Filling SMBIOS type 7 information for different cache levels.
135 SmbiosRecordL1
->Hdr
.Type
= EFI_SMBIOS_TYPE_CACHE_INFORMATION
;
136 SmbiosRecordL1
->Hdr
.Length
= (UINT8
) sizeof (SMBIOS_TABLE_TYPE7
);
137 SmbiosRecordL1
->Hdr
.Handle
= 0;
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
;
151 SmbiosRecordL2
->Hdr
.Type
= EFI_SMBIOS_TYPE_CACHE_INFORMATION
;
152 SmbiosRecordL2
->Hdr
.Length
= (UINT8
) sizeof (SMBIOS_TABLE_TYPE7
);
153 SmbiosRecordL2
->Hdr
.Handle
= 0;
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
;
169 //Adding SMBIOS type 7 records to SMBIOS table.
171 SmbiosHandle
= SMBIOS_HANDLE_PI_RESERVED
;
172 OptionalStrStart
= (CHAR8
*)(SmbiosRecordL1
+ 1);
173 UnicodeStrToAsciiStr(SocketDesignation
, OptionalStrStart
);
179 (EFI_SMBIOS_TABLE_HEADER
*) SmbiosRecordL1
183 //VLV2 incorporates two SLM modules (quad cores) in the SoC. 2 cores share BIU/L2 cache
185 SmbiosRecordL2
->InstalledSize
= (SmbiosRecordL2
->InstalledSize
)/2;
186 SmbiosRecordL2
->MaximumCacheSize
= SmbiosRecordL2
->InstalledSize
;
187 SmbiosHandle
= SMBIOS_HANDLE_PI_RESERVED
;
189 OptionalStrStart
= (CHAR8
*)(SmbiosRecordL2
+ 1);
190 UnicodeStrToAsciiStr(SocketDesignation
, OptionalStrStart
);
196 (EFI_SMBIOS_TABLE_HEADER
*) SmbiosRecordL2