1 /** @file
2   C1E feature.
3 
4   Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
5   SPDX-License-Identifier: BSD-2-Clause-Patent
6 
7 **/
8 
9 #include "CpuCommonFeatures.h"
10 
11 /**
12   Detects if C1E feature supported on current processor.
13 
14   @param[in]  ProcessorNumber  The index of the CPU executing this function.
15   @param[in]  CpuInfo          A pointer to the REGISTER_CPU_FEATURE_INFORMATION
16                                structure for the CPU executing this function.
17   @param[in]  ConfigData       A pointer to the configuration buffer returned
18                                by CPU_FEATURE_GET_CONFIG_DATA.  NULL if
19                                CPU_FEATURE_GET_CONFIG_DATA was not provided in
20                                RegisterCpuFeature().
21 
22   @retval TRUE     C1E feature is supported.
23   @retval FALSE    C1E feature is not supported.
24 
25   @note This service could be called by BSP/APs.
26 **/
27 BOOLEAN
28 EFIAPI
C1eSupport(IN UINTN ProcessorNumber,IN REGISTER_CPU_FEATURE_INFORMATION * CpuInfo,IN VOID * ConfigData OPTIONAL)29 C1eSupport (
30   IN UINTN                             ProcessorNumber,
31   IN REGISTER_CPU_FEATURE_INFORMATION  *CpuInfo,
32   IN VOID                              *ConfigData  OPTIONAL
33   )
34 {
35   return IS_NEHALEM_PROCESSOR (CpuInfo->DisplayFamily, CpuInfo->DisplayModel);
36 }
37 
38 /**
39   Initializes C1E feature to specific state.
40 
41   @param[in]  ProcessorNumber  The index of the CPU executing this function.
42   @param[in]  CpuInfo          A pointer to the REGISTER_CPU_FEATURE_INFORMATION
43                                structure for the CPU executing this function.
44   @param[in]  ConfigData       A pointer to the configuration buffer returned
45                                by CPU_FEATURE_GET_CONFIG_DATA.  NULL if
46                                CPU_FEATURE_GET_CONFIG_DATA was not provided in
47                                RegisterCpuFeature().
48   @param[in]  State            If TRUE, then the C1E feature must be enabled.
49                                If FALSE, then the C1E feature must be disabled.
50 
51   @retval RETURN_SUCCESS       C1E feature is initialized.
52 
53   @note This service could be called by BSP only.
54 **/
55 RETURN_STATUS
56 EFIAPI
C1eInitialize(IN UINTN ProcessorNumber,IN REGISTER_CPU_FEATURE_INFORMATION * CpuInfo,IN VOID * ConfigData,OPTIONAL IN BOOLEAN State)57 C1eInitialize (
58   IN UINTN                             ProcessorNumber,
59   IN REGISTER_CPU_FEATURE_INFORMATION  *CpuInfo,
60   IN VOID                              *ConfigData,  OPTIONAL
61   IN BOOLEAN                           State
62   )
63 {
64   //
65   // The scope of C1EEnable bit in the MSR_NEHALEM_POWER_CTL is Package, only program
66   // MSR_FEATURE_CONFIG for thread 0 core 0 in each package.
67   //
68   if ((CpuInfo->ProcessorInfo.Location.Thread != 0) || (CpuInfo->ProcessorInfo.Location.Core != 0)) {
69   return RETURN_SUCCESS;
70   }
71 
72   CPU_REGISTER_TABLE_WRITE_FIELD (
73     ProcessorNumber,
74     Msr,
75     MSR_NEHALEM_POWER_CTL,
76     MSR_NEHALEM_POWER_CTL_REGISTER,
77     Bits.C1EEnable,
78     (State) ? 1 : 0
79     );
80   return RETURN_SUCCESS;
81 }
82