SB700 southbridge: AMD SB700/SP5100 southbridge CIMX code
[coreboot.git] / src / vendorcode / amd / cimx / sb700 / SBCMNLIB.c
1 /*****************************************************************************
2  *
3  * Copyright (C) 2012 Advanced Micro Devices, Inc.
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions are met:
8  *     * Redistributions of source code must retain the above copyright
9  *       notice, this list of conditions and the following disclaimer.
10  *     * Redistributions in binary form must reproduce the above copyright
11  *       notice, this list of conditions and the following disclaimer in the
12  *       documentation and/or other materials provided with the distribution.
13  *     * Neither the name of Advanced Micro Devices, Inc. nor the names of
14  *       its contributors may be used to endorse or promote products derived
15  *       from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20  * DISCLAIMED. IN NO EVENT SHALL ADVANCED MICRO DEVICES, INC. BE LIABLE FOR ANY
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  *
28  *
29  ***************************************************************************/
30
31
32 #include        "Platform.h"
33
34 UINT8   isEcPresent(){
35         UINT8   dbFlag;
36         UINT16  dwVar0;
37
38         //Read the EC configuration register base address from LPCCfg_A4[15:1]
39         //Write 0x5A to the EC config index register to unlock the access
40         //Write 0x20 to the EC config index register to select the device ID register
41         //Read the value of device ID register from the EC config data register
42         //If the value read is 0xB7, then EC is enabled.
43         //Write 0xA5 to re-lock the EC config index register if EC is enabled.
44
45         ReadPCI((LPC_BUS_DEV_FUN << 16) + SB_LPC_REGA4, AccWidthUint16 | S3_SAVE, &dwVar0);
46         dwVar0 &= 0xFFFE;
47         RWIO(dwVar0, AccWidthUint8, 0, 0x5A);
48         RWIO(dwVar0, AccWidthUint8, 0, 0x20);
49         ReadIO(dwVar0+1, AccWidthUint8, &dbFlag);
50         RWIO(dwVar0, AccWidthUint8, 0, 0xA5);
51
52         return ( dbFlag == 0xB7);
53 }
54
55 void
56 getSbInformation        (
57 SB_INFORMATION *sbInfo){
58         UINT16 dwDevId;
59         UINT8   dbRev;
60
61         ReadPCI((SMBUS_BUS_DEV_FUN << 16) + SB_SMBUS_REG02, AccWidthUint16 | S3_SAVE, &dwDevId);
62         ReadPCI((SMBUS_BUS_DEV_FUN << 16) + SB_SMBUS_REG08, AccWidthUint8 | S3_SAVE, &dbRev);
63         sbInfo->sbModelMask = SB_MODEL_UNKNOWN;
64         if ( (dwDevId == SB7XX_DEVICE_ID) && (dbRev <= SB_Rev_Sb7xx_A14) ){
65                 sbInfo->sbModelMask |= SB_MODEL_SB700;
66                 sbInfo->sbModelMask |= SB_MODEL_SR5690;
67                 sbInfo->sbRev = dbRev;
68                 ReadPCI((LPC_BUS_DEV_FUN << 16) + SB_LPC_REG9C, AccWidthUint8 | S3_SAVE, &dbRev);
69                 if (dbRev & 01)
70                         sbInfo->sbModelMask |= SB_MODEL_SB750;
71                 if (isEcPresent())
72                         sbInfo->sbModelMask |= SB_MODEL_SB710;
73                 return;
74                 }
75 }
76
77
78 SB_CAPABILITY_SETTING
79 getSbCapability (
80 SB_CAPABILITY_ITEM sbCapabilityItem
81 )
82 {
83         SB_CAPABILITY_SETTING sbCapSetting=SB_UNKNOWN;
84         UINT32 ddTemp0;
85         RWPCI((SMBUS_BUS_DEV_FUN << 16) + SB_SMBUS_REG43, AccWidthUint8 | S3_SAVE, ~(UINT32)BIT3, 00);
86         ReadPCI((SMBUS_BUS_DEV_FUN << 16) + SB_SMBUS_REG10, AccWidthUint32, &ddTemp0);
87
88         if (sbCapabilityItem < Sb_Unknown_Capability)
89                 sbCapSetting = ((ddTemp0 >> (sbCapabilityItem << 1) ) & 0x03);
90
91         RWPCI((SMBUS_BUS_DEV_FUN << 16) + SB_SMBUS_REG43, AccWidthUint8 | S3_SAVE, 0xFF, BIT3);
92         return sbCapSetting;
93 }
94
95
96 void
97 setSbCapability (
98 SB_CAPABILITY_ITEM sbCapabilityItem, SB_CAPABILITY_SETTING sbCapSetting
99 )
100 {
101         UINT32 ddTemp0;
102         RWPCI((SMBUS_BUS_DEV_FUN << 16) + SB_SMBUS_REG43, AccWidthUint8 | S3_SAVE, ~(UINT32)BIT3, 00);
103         ReadPCI((SMBUS_BUS_DEV_FUN << 16) + SB_SMBUS_REG10, AccWidthUint32, &ddTemp0);
104         if ( (sbCapabilityItem < Sb_Unknown_Capability) & (sbCapSetting < Sb_Cap_Setting_Unknown) )
105                 ddTemp0 = (ddTemp0 & ~(0x03 << (sbCapabilityItem << 1))) | ( (sbCapSetting & 0x03) << (sbCapabilityItem << 1));
106         WritePCI((SMBUS_BUS_DEV_FUN << 16) + SB_SMBUS_REG10, AccWidthUint32, &ddTemp0);
107         RWPCI((SMBUS_BUS_DEV_FUN << 16) + SB_SMBUS_REG43, AccWidthUint8 | S3_SAVE, 0xFF, BIT3);
108 }