1 /** 2 3 Copyright (c) 2012 - 2014, Intel Corporation. All rights reserved 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 @file 24 PchPlatformLib.c 25 26 @brief 27 PCH Platform Lib implementation. 28 29 **/ 30 31 #include "PchPlatformLibrary.h" 32 33 // 34 // Silicon Steppings 35 // 36 /** PchStepping(VOID)37 Return Pch stepping type 38 39 @param[in] None 40 41 @retval PCH_STEPPING Pch stepping type 42 43 **/ 44 PCH_STEPPING 45 EFIAPI 46 PchStepping ( 47 VOID 48 ) 49 { 50 UINT8 RevId; 51 52 RevId = MmioRead8 ( 53 MmPciAddress (0, 54 DEFAULT_PCI_BUS_NUMBER_PCH, 55 PCI_DEVICE_NUMBER_PCH_LPC, 56 PCI_FUNCTION_NUMBER_PCH_LPC, 57 R_PCH_LPC_RID_CC) 58 ); 59 60 switch (RevId) { 61 case V_PCH_LPC_RID_0: 62 case V_PCH_LPC_RID_1: 63 return PchA0; 64 break; 65 66 case V_PCH_LPC_RID_2: 67 case V_PCH_LPC_RID_3: 68 return PchA1; 69 break; 70 71 case V_PCH_LPC_RID_4: 72 case V_PCH_LPC_RID_5: 73 return PchB0; 74 break; 75 76 case V_PCH_LPC_RID_6: 77 case V_PCH_LPC_RID_7: 78 return PchB1; 79 break; 80 81 case V_PCH_LPC_RID_8: 82 case V_PCH_LPC_RID_9: 83 return PchB2; 84 break; 85 86 case V_PCH_LPC_RID_A: 87 case V_PCH_LPC_RID_B: 88 return PchB3; 89 break; 90 91 case V_PCH_LPC_RID_C: 92 case V_PCH_LPC_RID_D: 93 return PchC0; 94 break; 95 96 case V_PCH_LPC_RID_E: 97 case V_PCH_LPC_RID_F: 98 return PchD0; 99 break; 100 101 default: 102 return PchSteppingMax; 103 break; 104 105 } 106 } 107 108 /** IsPchSupported(VOID)109 Determine if PCH is supported 110 111 @param[in] None 112 113 @retval TRUE PCH is supported 114 @retval FALSE PCH is not supported 115 116 **/ 117 BOOLEAN 118 IsPchSupported ( 119 VOID 120 ) 121 { 122 UINT32 Identifiers; 123 UINT16 PcuVendorId; 124 UINT16 PcuDeviceId; 125 126 Identifiers = MmioRead32 ( 127 MmPciAddress (0, 128 DEFAULT_PCI_BUS_NUMBER_PCH, 129 PCI_DEVICE_NUMBER_PCH_LPC, 130 PCI_FUNCTION_NUMBER_PCH_LPC, 131 R_PCH_LPC_REG_ID) 132 ); 133 134 PcuDeviceId = (UINT16) ((Identifiers & B_PCH_LPC_DEVICE_ID) >> 16); 135 PcuVendorId = (UINT16) (Identifiers & B_PCH_LPC_VENDOR_ID); 136 137 // 138 // Verify that this is a supported chipset 139 // 140 if (PcuVendorId != (UINT16) V_PCH_LPC_VENDOR_ID || !IS_PCH_VLV_LPC_DEVICE_ID (PcuDeviceId)) { 141 DEBUG ((EFI_D_ERROR, "VLV SC code doesn't support the PcuDeviceId: 0x%04x!\n", PcuDeviceId)); 142 return FALSE; 143 } 144 return TRUE; 145 } 146