1 /** @file 2 3 Processor power management initialization code. 4 5 Copyright (c) 2013-2015 Intel Corporation. 6 7 This program and the accompanying materials 8 are licensed and made available under the terms and conditions of the BSD License 9 which accompanies this distribution. The full text of the license may be found at 10 http://opensource.org/licenses/bsd-license.php 11 12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 14 15 16 **/ 17 18 #ifndef _PPM_H 19 #define _PPM_H 20 21 // 22 // Bit definitions of PPMFlags 23 // 24 #define PPM_GV3 (1 << 0) // Geyserville 3 25 #define PPM_TURBO (1 << 1) // Turbo Mode 26 #define PPM_SUPER_LFM (1 << 2) // N/2 Ratio 27 #define PPM_C1 (1 << 4) // C1 Capable, Enabled 28 #define PPM_C2 (1 << 5) // C2 Capable, Enabled 29 #define PPM_C3 (1 << 6) // C3 Capable, Enabled 30 #define PPM_C4 (1 << 7) // C4 Capable, Enabled 31 #define PPM_C5 (1 << 8) // C5/Deep C4 Capable, Enabled 32 #define PPM_C6 (1 << 9) // C6 Capable, Enabled 33 #define PPM_C1E (1 << 10) // C1E Enabled 34 #define PPM_C2E (1 << 11) // C2E Enabled 35 #define PPM_C3E (1 << 12) // C3E Enabled 36 #define PPM_C4E (1 << 13) // C4E Enabled 37 #define PPM_HARD_C4E (1 << 14) // Hard C4E Capable, Enabled 38 #define PPM_TM1 (1 << 16) // Thermal Monitor 1 39 #define PPM_TM2 (1 << 17) // Thermal Monitor 2 40 #define PPM_PHOT (1 << 19) // Bi-directional ProcHot 41 #define PPM_MWAIT_EXT (1 << 21) // MWAIT extensions supported 42 #define PPM_CMP (1 << 24) // CMP supported, Enabled 43 #define PPM_TSTATE (1 << 28) // CPU T states supported 44 45 #define PPM_C_STATES (PPM_C1 + PPM_C2 + PPM_C3 + PPM_C4 + PPM_C5 + PPM_C6) 46 #define PPM_CE_STATES (PPM_C1E + PPM_C2E + PPM_C3E + PPM_C4E + PPM_HARD_C4E) 47 48 49 #define MAX_P_STATES_NUM 12 50 51 #define AML_NAME_OP 0x08 52 #define AML_SCOPE_OP 0x10 53 #define AML_PACKAGE_OP 0x12 54 #define AML_METHOD_OP 0x14 55 56 #define S3_CPU_REGISTER_TABLE_GUID \ 57 { \ 58 0xc4ef988d, 0xe5e, 0x4403, { 0xbe, 0xeb, 0xf1, 0xbb, 0x6, 0x79, 0x6e, 0xdf } \ 59 } 60 61 #pragma pack(1) 62 typedef struct { 63 UINT8 StartByte; 64 UINT32 NameStr; 65 UINT8 OpCode; 66 UINT16 Size; // Hardcode to 16bit width because the table we use is fixed size 67 UINT8 NumEntries; 68 } EFI_ACPI_NAME_COMMAND; 69 70 typedef struct { 71 UINT8 PackageOp; 72 UINT8 PkgLeadByte; 73 UINT8 NumEntries; 74 UINT8 DwordPrefix0; 75 UINT32 CoreFreq; 76 UINT8 DwordPrefix1; 77 UINT32 Power; 78 UINT8 DwordPrefix2; 79 UINT32 TransLatency; 80 UINT8 DwordPrefix3; 81 UINT32 BMLatency; 82 UINT8 DwordPrefix4; 83 UINT32 Control; 84 UINT8 DwordPrefix5; 85 UINT32 Status; 86 } EFI_PSS_PACKAGE; 87 #pragma pack() 88 89 typedef struct { 90 UINT32 Index; 91 UINT64 Value; 92 } S3_CPU_REGISTER; 93 94 // 95 // Function prototypes 96 // 97 98 /** 99 This function is the entry of processor power management initialization code. 100 It initializes the processor's power management features based on the user 101 configurations and hardware capablities. 102 **/ 103 VOID 104 PpmInit ( 105 VOID 106 ); 107 108 /** 109 This function is to determine the Processor Power Management Flags 110 based on the hardware capability. 111 **/ 112 VOID 113 PpmDetectCapability ( 114 VOID 115 ); 116 117 /** 118 This function is to determine the user configuration mask 119 **/ 120 VOID 121 PpmGetUserConfigurationMask ( 122 VOID 123 ); 124 125 /** 126 This function is to patch and publish power management related acpi tables. 127 **/ 128 VOID 129 PpmPatchAndPublishAcpiTables ( 130 VOID 131 ); 132 133 /** 134 This function is to patch PLvl2Lat and PLvl3Lat to enable C2, C3 support in OS. 135 **/ 136 VOID 137 PpmPatchFadtTable ( 138 VOID 139 ); 140 141 /** 142 This function is to load all the power management acpi tables and patch IST table. 143 **/ 144 VOID 145 PpmLoadAndPatchPMTables ( 146 VOID 147 ); 148 149 /** 150 This function is to save cpu registers for s3 resume. 151 **/ 152 VOID 153 PpmS3SaveRegisters ( 154 VOID 155 ); 156 #endif 157