change a readable way to fix SB800 CIMX "multi-character constant warning".
[coreboot.git] / src / vendorcode / amd / cimx / sb800 / DISPATCHER.c
1 /**\r
2  * @file\r
3  *\r
4  *  Function dispatcher.\r
5  *\r
6  *\r
7  *\r
8  * @xrefitem bom "File Content Label" "Release Content"\r
9  * @e project:      CIMx-SB\r
10  * @e sub-project:\r
11  * @e \$Revision:$   @e \$Date:$\r
12  *\r
13  */\r
14 \r
15 /*\r
16  *****************************************************************************\r
17  *\r
18  * This file is part of the coreboot project.\r
19  *\r
20  * Copyright (C) 2010 Advanced Micro Devices, Inc.\r
21  *\r
22  * This program is free software; you can redistribute it and/or modify\r
23  * it under the terms of the GNU General Public License as published by\r
24  * the Free Software Foundation; version 2 of the License.\r
25  *\r
26  * This program is distributed in the hope that it will be useful,\r
27  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
28  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
29  * GNU General Public License for more details.\r
30  *\r
31  * You should have received a copy of the GNU General Public License\r
32  * along with this program; if not, write to the Free Software\r
33  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA\r
34  * ***************************************************************************\r
35  *\r
36  */\r
37 /*----------------------------------------------------------------------------------------\r
38  *                             M O D U L E S    U S E D\r
39  *----------------------------------------------------------------------------------------\r
40  */\r
41 \r
42 #include "SBPLATFORM.h"\r
43 \r
44 /*----------------------------------------------------------------------------------------\r
45  *           P R O T O T Y P E S     O F     L O C A L     F U  N C T I O N S\r
46  *----------------------------------------------------------------------------------------\r
47 */\r
48 \r
49 \r
50 //\r
51 // Declaration of local functions\r
52 //\r
53 \r
54 VOID  saveConfigPointer (IN AMDSBCFG* pConfig);\r
55 VOID* VerifyImage (IN UINT64 Signature, IN VOID* ImagePtr);\r
56 VOID* LocateImage (IN UINT64 Signature);\r
57 \r
58 /*----------------------------------------------------------------------------------------\r
59  *                  T Y P E D E F S     A N D     S T R U C T U  R E S\r
60  *----------------------------------------------------------------------------------------\r
61  */\r
62 \r
63 /*----------------------------------------------------------------------------------------\r
64  *                          E X P O R T E D    F U N C T I O N S\r
65  *----------------------------------------------------------------------------------------\r
66  */\r
67 \r
68 /**\r
69  * AmdSbDispatcher - Dispatch Southbridge function\r
70  *\r
71  *\r
72  *\r
73  * @param[in] pConfig   Southbridge configuration structure pointer.\r
74  *\r
75  */\r
76 AGESA_STATUS\r
77 AmdSbDispatcher (\r
78   IN       VOID *pConfig\r
79   )\r
80 {\r
81   AGESA_STATUS Status;\r
82 \r
83 #ifdef B1_IMAGE\r
84   VOID *pAltImagePtr;\r
85   CIM_IMAGE_ENTRY   AltImageEntry;\r
86 #endif\r
87 \r
88   UINT64  tdValue;\r
89   tdValue = 0x32314130384253ULL;\r
90 \r
91 #ifdef B1_IMAGE\r
92   pAltImagePtr = NULL;\r
93 #endif\r
94   Status = AGESA_UNSUPPORTED;\r
95 \r
96 #ifdef B1_IMAGE\r
97   if ((UINT32) (UINTN) (((AMD_CONFIG_PARAMS*)pConfig)->AltImageBasePtr) != 0xffffffff ) {\r
98     if ( ((AMD_CONFIG_PARAMS*)pConfig)->AltImageBasePtr ) {\r
99       pAltImagePtr = VerifyImage ( tdValue, (VOID*) (UINTN) ((AMD_CONFIG_PARAMS*)pConfig)->AltImageBasePtr);\r
100     }\r
101     if ( pAltImagePtr == NULL ) {\r
102       pAltImagePtr = LocateImage ( tdValue );\r
103     }\r
104     if ( pAltImagePtr != NULL ) {\r
105       ((AMD_CONFIG_PARAMS*)pConfig)->ImageBasePtr = (UINT32) (UINTN) pAltImagePtr;\r
106       AltImageEntry = (CIM_IMAGE_ENTRY) (UINTN) ((UINT32) (UINTN) pAltImagePtr + (UINT32) (((AMD_IMAGE_HEADER*) (UINTN) pAltImagePtr)->EntryPointAddress));\r
107       (*AltImageEntry) (pConfig);\r
108       return Status;\r
109     }\r
110   }\r
111 #endif\r
112   saveConfigPointer (pConfig);\r
113 \r
114   if ( ((AMD_CONFIG_PARAMS*)pConfig)->Func == SB_POWERON_INIT ) {\r
115     sbPowerOnInit ((AMDSBCFG*) pConfig);\r
116   }\r
117 \r
118 #ifndef B1_IMAGE\r
119   if ( ((AMD_CONFIG_PARAMS*)pConfig)->Func == SB_BEFORE_PCI_INIT ) {\r
120     sbBeforePciInit ((AMDSBCFG*)pConfig);\r
121   }\r
122 \r
123   if ( ((AMD_CONFIG_PARAMS*)pConfig)->Func == SB_AFTER_PCI_INIT ) {\r
124     sbAfterPciInit ((AMDSBCFG*)pConfig);\r
125   }\r
126 \r
127   if ( ((AMD_CONFIG_PARAMS*)pConfig)->Func == SB_MID_POST_INIT ) {\r
128     sbMidPostInit ((AMDSBCFG*)pConfig);\r
129   }\r
130 \r
131   if ( ((AMD_CONFIG_PARAMS*)pConfig)->Func == SB_LATE_POST_INIT ) {\r
132     sbLatePost ((AMDSBCFG*)pConfig);\r
133   }\r
134 \r
135   if ( ((AMD_CONFIG_PARAMS*)pConfig)->Func == SB_BEFORE_PCI_RESTORE_INIT ) {\r
136     sbBeforePciRestoreInit ((AMDSBCFG*)pConfig);\r
137   }\r
138 \r
139   if ( ((AMD_CONFIG_PARAMS*)pConfig)->Func == SB_AFTER_PCI_RESTORE_INIT ) {\r
140     sbAfterPciRestoreInit ((AMDSBCFG*)pConfig);\r
141   }\r
142 \r
143   if ( ((AMD_CONFIG_PARAMS*)pConfig)->Func == SB_SMM_SERVICE ) {\r
144     sbSmmService ((AMDSBCFG*)pConfig);\r
145   }\r
146 \r
147   if ( ((AMD_CONFIG_PARAMS*)pConfig)->Func == SB_SMM_ACPION ) {\r
148     sbSmmAcpiOn ((AMDSBCFG*)pConfig);\r
149   }\r
150 \r
151   if ( ((AMD_CONFIG_PARAMS*)pConfig)->Func == SB_EC_FANCONTROL ) {\r
152     sbECfancontrolservice((AMDSBCFG*)pConfig);;\r
153   }\r
154 #endif\r
155   return Status;\r
156 }\r
157 \r
158 /**\r
159  * LocateImage - Locate Southbridge CIMx module\r
160  *\r
161  *\r
162  *\r
163  * @param[in] Signature   Southbridge CIMx image signature.\r
164  *\r
165  */\r
166 VOID*\r
167 LocateImage (\r
168   IN       UINT64 Signature\r
169   )\r
170 {\r
171   VOID  *Result;\r
172   UINT32   ImagePtr;\r
173   ImagePtr = 0xffffffff - (IMAGE_ALIGN - 1);\r
174 \r
175   while ( ImagePtr >= (0xfffffff - (NUM_IMAGE_LOCATION * IMAGE_ALIGN - 1)) ) {\r
176 #ifdef x64\r
177     12346789\r
178 #else\r
179     Result = VerifyImage (Signature, (VOID*) ImagePtr);\r
180 #endif\r
181     if ( Result != NULL ) {\r
182       return Result;\r
183     }\r
184     ImagePtr -= IMAGE_ALIGN;\r
185   }\r
186   return NULL;\r
187 }\r
188 \r
189 /**\r
190  * VerifyImage - Verify Southbridge CIMx module\r
191  *\r
192  *\r
193  * @param[in] Signature   Southbridge CIMx image signature.\r
194  * @param[in] ImagePtr    Southbridge CIMx image address.\r
195  *\r
196  */\r
197 VOID*\r
198 VerifyImage (\r
199   IN       UINT64 Signature,\r
200   IN       VOID* ImagePtr\r
201   )\r
202 {\r
203   UINT16 *TempImagePtr;\r
204   UINT16 Sum;\r
205   UINT32  i;\r
206   Sum = 0;\r
207   if ( (*((UINT32*)ImagePtr) == Int32FromChar('$', 'A', 'M', 'D') && ((CIMFILEHEADER*)ImagePtr)->CreatorID == Signature) ) {\r
208     //GetImage Image size\r
209     TempImagePtr = (UINT16*)ImagePtr;\r
210     for ( i = 0; i < (((CIMFILEHEADER*)ImagePtr)->ImageSize); i += 2 ) {\r
211       Sum = Sum + *TempImagePtr;\r
212       TempImagePtr++;\r
213     }\r
214     if ( Sum == 0 ) {\r
215       return ImagePtr;\r
216     }\r
217   }\r
218   return NULL;\r
219 }\r
220 \r
221 /**\r
222  * saveConfigPointer - Verify Southbridge CIMx module\r
223  *\r
224  *\r
225  * @param[in] pConfig   Southbridge configuration structure pointer.\r
226  *\r
227  */\r
228 VOID\r
229 saveConfigPointer (\r
230   IN       AMDSBCFG* pConfig\r
231   )\r
232 {\r
233   UINT8   dbReg;\r
234   UINT8   i;\r
235   UINT32   ddValue;\r
236 \r
237   ddValue =  (UINT32) (UINTN)pConfig;\r
238   dbReg = SB_ECMOS_REG08;\r
239 \r
240   for ( i = 0; i <= 3; i++ ) {\r
241     WriteIO (SB_IOMAP_REG72, AccWidthUint8, &dbReg);\r
242     WriteIO (SB_IOMAP_REG73, AccWidthUint8, (UINT8*)&ddValue);\r
243     ddValue = (ddValue >> 8);\r
244     dbReg++;\r
245   }\r
246 }\r