SB700 southbridge: AMD SB700/SP5100 southbridge CIMX wrapper
[coreboot.git] / src / southbridge / amd / cimx / sb700 / Amd.h
1 /*
2  * This file is part of the coreboot project.
3  *
4  * Copyright (C) 2012 Advanced Micro Devices, Inc.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; version 2 of the License.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
18  */
19
20 #ifndef _AMD_H_
21 #define _AMD_H_
22
23 // AGESA Types and Definitions
24 #ifndef NULL
25 #define NULL 0
26 #endif
27
28 #define LAST_ENTRY 0xFFFFFFFF
29 #define IOCF8 0xCF8
30 #define IOCFC 0xCFC
31 #define IN
32 #define OUT
33
34 #ifndef Int16FromChar
35 #define Int16FromChar(a,b) ((a) << 0 | (b) << 8)
36 #endif
37 #ifndef Int32FromChar
38 #define Int32FromChar(a,b,c,d) ((a) << 0 | (b) << 8 | (c) << 16 | (d) << 24)
39 #endif
40
41 #define IMAGE_SIGNATURE     Int32FromChar ('$', 'A', 'M', 'D')
42
43 typedef unsigned int AGESA_STATUS;
44
45 #define AGESA_SUCCESS       ((AGESA_STATUS) 0x0)
46 #define AGESA_ALERT         ((AGESA_STATUS) 0x40000000)
47 #define AGESA_WARNING       ((AGESA_STATUS) 0x40000001)
48 #define AGESA_UNSUPPORTED   ((AGESA_STATUS) 0x80000003)
49 #define AGESA_ERROR         ((AGESA_STATUS) 0xC0000001)
50 #define AGESA_CRITICAL      ((AGESA_STATUS) 0xC0000002)
51 #define AGESA_FATAL         ((AGESA_STATUS) 0xC0000003)
52
53 typedef AGESA_STATUS (*CALLOUT_ENTRY) (unsigned int Param1, unsigned int Param2, void* ConfigPtr);
54 typedef AGESA_STATUS (*IMAGE_ENTRY) (IN OUT void* ConfigPtr);
55 typedef AGESA_STATUS (*MODULE_ENTRY) (IN OUT void* ConfigPtr);
56
57 ///This allocation type is used by the AmdCreateStruct entry point
58 typedef enum {
59         PreMemHeap = 0,                                           ///< Create heap in cache.
60         PostMemDram,                                              ///< Create heap in memory.
61         ByHost                                                    ///< Create heap by Host.
62 } ALLOCATION_METHOD;
63
64 /// These width descriptors are used by the library function, and others, to specify the data size
65 typedef enum ACCESS_WIDTH {
66         AccessWidth8 = 1,                                         ///< Access width is 8 bits.
67         AccessWidth16,                                            ///< Access width is 16 bits.
68         AccessWidth32,                                            ///< Access width is 32 bits.
69         AccessWidth64,                                            ///< Access width is 64 bits.
70
71         AccessS3SaveWidth8 = 0x81,                                ///< Save 8 bits data.
72         AccessS3SaveWidth16,                                      ///< Save 16 bits data.
73         AccessS3SaveWidth32,                                      ///< Save 32 bits data.
74         AccessS3SaveWidth64,                                      ///< Save 64 bits data.
75 } ACCESS_WIDTH;
76
77 // AGESA Structures
78
79 /// The standard header for all AGESA services.
80 typedef struct _AMD_CONFIG_PARAMS {
81         IN       unsigned int          ImageBasePtr;     ///< The AGESA Image base address.
82         IN       unsigned int          Func;             ///< The service desired, @sa dispatch.h.
83         IN       unsigned int          AltImageBasePtr;  ///< Alternate Image location
84         IN       unsigned int          PcieBasePtr;      ///< PCIe MMIO Base address, if configured.
85         union {                                    ///< Callback pointer
86                 IN       unsigned long long          PlaceHolder;    ///< Place holder
87                 IN       CALLOUT_ENTRY   CalloutPtr;     ///< For Callout from AGESA
88         } CALLBACK;
89         IN OUT   unsigned int          Reserved[2];      ///< This space is reserved for future use.
90 } AMD_CONFIG_PARAMS;
91
92
93 /// AGESA Binary module header structure
94 typedef struct _AMD_IMAGE_HEADER {
95         IN       unsigned int  Signature;                          ///< Binary Signature
96         IN       signed char   CreatorID[8];                       ///< 8 characters ID
97         IN       signed char   Version[12];                        ///< 12 characters version
98         IN       unsigned int  ModuleInfoOffset;                   ///< Offset of module
99         IN       unsigned int  EntryPointAddress;                  ///< Entry address
100         IN       unsigned int  ImageBase;                          ///< Image base
101         IN       unsigned int  RelocTableOffset;                   ///< Relocate Table offset
102         IN       unsigned int  ImageSize;                          ///< Size
103         IN       unsigned short  Checksum;                           ///< Checksum
104         IN       unsigned char   ImageType;                          ///< Type
105         IN       unsigned char   V_Reserved;                         ///< Reserved
106 } AMD_IMAGE_HEADER;
107
108 /// AGESA Binary module header structure
109 typedef struct _AMD_MODULE_HEADER {
110         IN       unsigned int          ModuleHeaderSignature;      ///< Module signature
111         IN       signed char           ModuleIdentifier[8];        ///< 8 characters ID
112         IN       signed char           ModuleVersion[12];          ///< 12 characters version
113         IN       MODULE_ENTRY    ModuleDispatcherPtr;        ///< A pointer point to dispatcher
114         IN       struct _AMD_MODULE_HEADER  *NextBlockPtr;    ///< Next module header link
115 } AMD_MODULE_HEADER;
116
117 #define FUNC_0    0   // bit-placed for PCI address creation
118 #define FUNC_1    1
119 #define FUNC_2    2
120 #define FUNC_3    3
121 #define FUNC_4    4
122 #define FUNC_5    5
123 #define FUNC_6    6
124 #define FUNC_7    7
125
126 //   SBDFO - Segment Bus Device Function Offset
127 //   31:28   Segment (4-bits)
128 //   27:20   Bus     (8-bits)
129 //   19:15   Device  (5-bits)
130 //   14:12   Function (3-bits)
131 //   11:00   Offset  (12-bits)
132
133 #if 0
134 #define MAKE_SBDFO(Seg, Bus, Dev, Fun, Off) ((((unsigned int) (Seg)) << 28) | (((unsigned int) (Bus)) << 20) | \
135                 (((unsigned int) (Dev)) << 15) | (((unsigned int) (Fun)) << 12) | ((unsigned int) (Off)))
136 #endif
137 #define ILLEGAL_SBDFO 0xFFFFFFFF
138
139 /// CPUID data received registers format
140 typedef struct _SB_CPUID_DATA {
141         IN OUT   unsigned int          EAX_Reg;                ///< CPUID instruction result in EAX
142         IN OUT   unsigned int          EBX_Reg;                ///< CPUID instruction result in EBX
143         IN OUT   unsigned int          ECX_Reg;                ///< CPUID instruction result in ECX
144         IN OUT   unsigned int          EDX_Reg;                ///< CPUID instruction result in EDX
145 } SB_CPUID_DATA;
146
147 #define WARM_RESET 1
148 #define COLD_RESET 2      // Cold reset
149 #define RESET_CPU  4      // Triggers a CPU reset
150
151 /// HT frequency for external callbacks
152 typedef enum {
153         HT_FREQUENCY_200M          = 0,                 ///< HT speed 200 for external callbacks
154         HT_FREQUENCY_400M          = 2,                 ///< HT speed 400 for external callbacks
155         HT_FREQUENCY_600M          = 4,                 ///< HT speed 600 for external callbacks
156         HT_FREQUENCY_800M          = 5,                 ///< HT speed 800 for external callbacks
157         HT_FREQUENCY_1000M         = 6,                 ///< HT speed 1000 for external callbacks
158         HT_FREQUENCY_1200M         = 7,                 ///< HT speed 1200 for external callbacks
159         HT_FREQUENCY_1400M         = 8,                 ///< HT speed 1400 for external callbacks
160         HT_FREQUENCY_1600M         = 9,                 ///< HT speed 1600 for external callbacks
161         HT_FREQUENCY_1800M         = 10,                ///< HT speed 1800 for external callbacks
162         HT_FREQUENCY_2000M         = 11,                ///< HT speed 2000 for external callbacks
163         HT_FREQUENCY_2200M         = 12,                ///< HT speed 2200 for external callbacks
164         HT_FREQUENCY_2400M         = 13,                ///< HT speed 2400 for external callbacks
165         HT_FREQUENCY_2600M         = 14,                ///< HT speed 2600 for external callbacks
166         HT_FREQUENCY_2800M         = 17,                ///< HT speed 2800 for external callbacks
167         HT_FREQUENCY_3000M         = 18,                ///< HT speed 3000 for external callbacks
168         HT_FREQUENCY_3200M         = 19                 ///< HT speed 3200 for external callbacks
169 } HT_FREQUENCIES;
170
171 #ifndef BIT0
172 #define BIT0        0x0000000000000001ull
173 #endif
174 #ifndef BIT1
175 #define BIT1        0x0000000000000002ull
176 #endif
177 #ifndef BIT2
178 #define BIT2        0x0000000000000004ull
179 #endif
180 #ifndef BIT3
181 #define BIT3        0x0000000000000008ull
182 #endif
183 #ifndef BIT4
184 #define BIT4        0x0000000000000010ull
185 #endif
186 #ifndef BIT5
187 #define BIT5        0x0000000000000020ull
188 #endif
189 #ifndef BIT6
190 #define BIT6        0x0000000000000040ull
191 #endif
192 #ifndef BIT7
193 #define BIT7        0x0000000000000080ull
194 #endif
195 #ifndef BIT8
196 #define BIT8        0x0000000000000100ull
197 #endif
198 #ifndef BIT9
199 #define BIT9        0x0000000000000200ull
200 #endif
201 #ifndef BIT10
202 #define BIT10       0x0000000000000400ull
203 #endif
204 #ifndef BIT11
205 #define BIT11       0x0000000000000800ull
206 #endif
207 #ifndef BIT12
208 #define BIT12       0x0000000000001000ull
209 #endif
210 #ifndef BIT13
211 #define BIT13       0x0000000000002000ull
212 #endif
213 #ifndef BIT14
214 #define BIT14       0x0000000000004000ull
215 #endif
216 #ifndef BIT15
217 #define BIT15       0x0000000000008000ull
218 #endif
219 #ifndef BIT16
220 #define BIT16       0x0000000000010000ull
221 #endif
222 #ifndef BIT17
223 #define BIT17       0x0000000000020000ull
224 #endif
225 #ifndef BIT18
226 #define BIT18       0x0000000000040000ull
227 #endif
228 #ifndef BIT19
229 #define BIT19       0x0000000000080000ull
230 #endif
231 #ifndef BIT20
232 #define BIT20       0x0000000000100000ull
233 #endif
234 #ifndef BIT21
235 #define BIT21       0x0000000000200000ull
236 #endif
237 #ifndef BIT22
238 #define BIT22       0x0000000000400000ull
239 #endif
240 #ifndef BIT23
241 #define BIT23       0x0000000000800000ull
242 #endif
243 #ifndef BIT24
244 #define BIT24       0x0000000001000000ull
245 #endif
246 #ifndef BIT25
247 #define BIT25       0x0000000002000000ull
248 #endif
249 #ifndef BIT26
250 #define BIT26       0x0000000004000000ull
251 #endif
252 #ifndef BIT27
253 #define BIT27       0x0000000008000000ull
254 #endif
255 #ifndef BIT28
256 #define BIT28       0x0000000010000000ull
257 #endif
258 #ifndef BIT29
259 #define BIT29       0x0000000020000000ull
260 #endif
261 #ifndef BIT30
262 #define BIT30       0x0000000040000000ull
263 #endif
264 #ifndef BIT31
265 #define BIT31       0x0000000080000000ull
266 #endif
267 #ifndef BIT32
268 #define BIT32       0x0000000100000000ull
269 #endif
270 #ifndef BIT33
271 #define BIT33       0x0000000200000000ull
272 #endif
273 #ifndef BIT34
274 #define BIT34       0x0000000400000000ull
275 #endif
276 #ifndef BIT35
277 #define BIT35       0x0000000800000000ull
278 #endif
279 #ifndef BIT36
280 #define BIT36       0x0000001000000000ull
281 #endif
282 #ifndef BIT37
283 #define BIT37       0x0000002000000000ull
284 #endif
285 #ifndef BIT38
286 #define BIT38       0x0000004000000000ull
287 #endif
288 #ifndef BIT39
289 #define BIT39       0x0000008000000000ull
290 #endif
291 #ifndef BIT40
292 #define BIT40       0x0000010000000000ull
293 #endif
294 #ifndef BIT41
295 #define BIT41       0x0000020000000000ull
296 #endif
297 #ifndef BIT42
298 #define BIT42       0x0000040000000000ull
299 #endif
300 #ifndef BIT43
301 #define BIT43       0x0000080000000000ull
302 #endif
303 #ifndef BIT44
304 #define BIT44       0x0000100000000000ull
305 #endif
306 #ifndef BIT45
307 #define BIT45       0x0000200000000000ull
308 #endif
309 #ifndef BIT46
310 #define BIT46       0x0000400000000000ull
311 #endif
312 #ifndef BIT47
313 #define BIT47       0x0000800000000000ull
314 #endif
315 #ifndef BIT48
316 #define BIT48       0x0001000000000000ull
317 #endif
318 #ifndef BIT49
319 #define BIT49       0x0002000000000000ull
320 #endif
321 #ifndef BIT50
322 #define BIT50       0x0004000000000000ull
323 #endif
324 #ifndef BIT51
325 #define BIT51       0x0008000000000000ull
326 #endif
327 #ifndef BIT52
328 #define BIT52       0x0010000000000000ull
329 #endif
330 #ifndef BIT53
331 #define BIT53       0x0020000000000000ull
332 #endif
333 #ifndef BIT54
334 #define BIT54       0x0040000000000000ull
335 #endif
336 #ifndef BIT55
337 #define BIT55       0x0080000000000000ull
338 #endif
339 #ifndef BIT56
340 #define BIT56       0x0100000000000000ull
341 #endif
342 #ifndef BIT57
343 #define BIT57       0x0200000000000000ull
344 #endif
345 #ifndef BIT58
346 #define BIT58       0x0400000000000000ull
347 #endif
348 #ifndef BIT59
349 #define BIT59       0x0800000000000000ull
350 #endif
351 #ifndef BIT60
352 #define BIT60       0x1000000000000000ull
353 #endif
354 #ifndef BIT61
355 #define BIT61       0x2000000000000000ull
356 #endif
357 #ifndef BIT62
358 #define BIT62       0x4000000000000000ull
359 #endif
360 #ifndef BIT63
361 #define BIT63       0x8000000000000000ull
362 #endif
363 #endif