]> git.ipfire.org Git - people/ms/u-boot.git/blame - include/common.h
Use uint64_t for time types
[people/ms/u-boot.git] / include / common.h
CommitLineData
e2211743 1/*
3b74e7ec 2 * (C) Copyright 2000-2009
e2211743
WD
3 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
4 *
3765b3e7 5 * SPDX-License-Identifier: GPL-2.0+
e2211743
WD
6 */
7
8#ifndef __COMMON_H_
d0b8feef 9#define __COMMON_H_ 1
e2211743 10
fcd3c87e
WD
11#ifndef __ASSEMBLY__ /* put C only stuff in this section */
12
e2211743
WD
13typedef unsigned char uchar;
14typedef volatile unsigned long vu_long;
180d3f74 15typedef volatile unsigned short vu_short;
e2211743
WD
16typedef volatile unsigned char vu_char;
17
18#include <config.h>
25ddd1fb 19#include <asm-offsets.h>
e2211743
WD
20#include <linux/bitops.h>
21#include <linux/types.h>
22#include <linux/string.h>
9aed5080 23#include <linux/stringify.h>
e2211743
WD
24#include <asm/ptrace.h>
25#include <stdarg.h>
a821d08d 26#if defined(CONFIG_PCI) && defined(CONFIG_4xx)
e2211743
WD
27#include <pci.h>
28#endif
180d3f74 29#if defined(CONFIG_8xx)
e2211743 30#include <asm/8xx_immap.h>
03f9d7d1
MY
31#if defined(CONFIG_MPC859) || defined(CONFIG_MPC859T) || \
32 defined(CONFIG_MPC866) || \
d4ca31c4 33 defined(CONFIG_MPC866P)
d0b8feef 34# define CONFIG_MPC866_FAMILY 1
0ace4d9d 35#elif defined(CONFIG_MPC885)
d0b8feef 36# define CONFIG_MPC885_FAMILY 1
180d3f74
WD
37#endif
38#if defined(CONFIG_MPC860) \
39 || defined(CONFIG_MPC860T) \
1114257c
WD
40 || defined(CONFIG_MPC866_FAMILY) \
41 || defined(CONFIG_MPC885_FAMILY)
d0b8feef 42# define CONFIG_MPC86x 1
2535d602 43#endif
0db5bca8
WD
44#elif defined(CONFIG_5xx)
45#include <asm/5xx_immap.h>
7e6bf358
WD
46#elif defined(CONFIG_MPC5xxx)
47#include <mpc5xxx.h>
8993e54b 48#elif defined(CONFIG_MPC512X)
8993e54b 49#include <asm/immap_512x.h>
58dac327 50#elif defined(CONFIG_MPC8260)
04a85b3b 51#if defined(CONFIG_MPC8247) \
04a85b3b 52 || defined(CONFIG_MPC8272)
d0b8feef 53#define CONFIG_MPC8272_FAMILY 1
04a85b3b 54#endif
e2211743
WD
55#include <asm/immap_8260.h>
56#endif
debb7354
JL
57#ifdef CONFIG_MPC86xx
58#include <mpc86xx.h>
59#include <asm/immap_86xx.h>
60#endif
42d1f039
WD
61#ifdef CONFIG_MPC85xx
62#include <mpc85xx.h>
63#include <asm/immap_85xx.h>
64#endif
0f898604 65#ifdef CONFIG_MPC83xx
f046ccd1
EL
66#include <mpc83xx.h>
67#include <asm/immap_83xx.h>
68#endif
e2211743 69#ifdef CONFIG_4xx
b36df561 70#include <asm/ppc4xx.h>
e2211743 71#endif
e2211743
WD
72#ifdef CONFIG_ARM
73#define asmlinkage /* nothing */
74#endif
6cfcce67
MF
75#ifdef CONFIG_BLACKFIN
76#include <asm/blackfin.h>
77#endif
2819e136
SN
78#ifdef CONFIG_SOC_DA8XX
79#include <asm/arch/hardware.h>
80#endif
e2211743
WD
81
82#include <part.h>
83#include <flash.h>
84#include <image.h>
85
4166ecb2
GB
86/* Bring in printf format macros if inttypes.h is included */
87#define __STDC_FORMAT_MACROS
88
4d1fd7f1
YS
89#ifdef __LP64__
90#define CONFIG_SYS_SUPPORT_64BIT_DATA
91#endif
92
21726a7a 93#ifdef DEBUG
88a85fb9 94#define _DEBUG 1
21726a7a 95#else
88a85fb9 96#define _DEBUG 0
21726a7a
SG
97#endif
98
88a85fb9
MV
99/*
100 * Output a debug text when condition "cond" is met. The "cond" should be
101 * computed by a preprocessor in the best case, allowing for the best
102 * optimization.
103 */
104#define debug_cond(cond, fmt, args...) \
105 do { \
106 if (cond) \
107 printf(fmt, ##args); \
108 } while (0)
109
110#define debug(fmt, args...) \
111 debug_cond(_DEBUG, fmt, ##args)
112
21726a7a
SG
113/*
114 * An assertion is run-time check done in debug mode only. If DEBUG is not
115 * defined then it is skipped. If DEBUG is defined and the assertion fails,
116 * then it calls panic*( which may or may not reset/halt U-Boot (see
117 * CONFIG_PANIC_HANG), It is hoped that all failing assertions are found
118 * before release, and after release it is hoped that they don't matter. But
119 * in any case these failing assertions cannot be fixed with a reset (which
120 * may just do the same assertion again).
121 */
122void __assert_fail(const char *assertion, const char *file, unsigned line,
123 const char *function);
124#define assert(x) \
125 ({ if (!(x) && _DEBUG) \
126 __assert_fail(#x, __FILE__, __LINE__, __func__); })
127
594d57d0
MK
128#define error(fmt, args...) do { \
129 printf("ERROR: " fmt "\nat %s:%d/%s()\n", \
130 ##args, __FILE__, __LINE__, __func__); \
131} while (0)
132
cfa460ad 133#ifndef BUG
43835aac 134#define BUG() do { \
511d0c72 135 printf("BUG: failure at %s:%d/%s()!\n", __FILE__, __LINE__, __FUNCTION__); \
43835aac
DZ
136 panic("BUG!"); \
137} while (0)
138#define BUG_ON(condition) do { if (unlikely((condition)!=0)) BUG(); } while(0)
cfa460ad 139#endif /* BUG */
43835aac 140
c00e17c7
HS
141/* Force a compilation error if condition is true */
142#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))
143
c83bf6a2 144typedef void (interrupt_handler_t)(void *);
e2211743 145
c83bf6a2 146#include <asm/u-boot.h> /* boot information for Linux kernel */
e2211743
WD
147#include <asm/global_data.h> /* global data used for startup functions */
148
71f95118
WD
149/*
150 * enable common handling for all TQM8xxL/M boards:
11d9eec4 151 * - CONFIG_TQM8xxM will be defined for all TQM8xxM boards
71f95118 152 * - CONFIG_TQM8xxL will be defined for all TQM8xxL _and_ TQM8xxM boards
11d9eec4 153 * and for the TQM885D board
71f95118
WD
154 */
155#if defined(CONFIG_TQM823M) || defined(CONFIG_TQM850M) || \
156 defined(CONFIG_TQM855M) || defined(CONFIG_TQM860M) || \
11d9eec4 157 defined(CONFIG_TQM862M) || defined(CONFIG_TQM866M)
71f95118
WD
158# ifndef CONFIG_TQM8xxM
159# define CONFIG_TQM8xxM
160# endif
161#endif
e2211743 162#if defined(CONFIG_TQM823L) || defined(CONFIG_TQM850L) || \
d126bfbd 163 defined(CONFIG_TQM855L) || defined(CONFIG_TQM860L) || \
11d9eec4
MK
164 defined(CONFIG_TQM862L) || defined(CONFIG_TQM8xxM) || \
165 defined(CONFIG_TQM885D)
e2211743
WD
166# ifndef CONFIG_TQM8xxL
167# define CONFIG_TQM8xxL
168# endif
169#endif
170
c7de829c
WD
171/*
172 * General Purpose Utilities
173 */
174#define min(X, Y) \
4f4eab4d
VG
175 ({ typeof(X) __x = (X); \
176 typeof(Y) __y = (Y); \
c7de829c
WD
177 (__x < __y) ? __x : __y; })
178
179#define max(X, Y) \
4f4eab4d
VG
180 ({ typeof(X) __x = (X); \
181 typeof(Y) __y = (Y); \
c7de829c
WD
182 (__x > __y) ? __x : __y; })
183
4f4eab4d
VG
184#define min3(X, Y, Z) \
185 ({ typeof(X) __x = (X); \
186 typeof(Y) __y = (Y); \
187 typeof(Z) __z = (Z); \
188 __x < __y ? (__x < __z ? __x : __z) : \
189 (__y < __z ? __y : __z); })
190
191#define max3(X, Y, Z) \
192 ({ typeof(X) __x = (X); \
193 typeof(Y) __y = (Y); \
194 typeof(Z) __z = (Z); \
195 __x > __y ? (__x > __z ? __x : __z) : \
196 (__y > __z ? __y : __z); })
197
a35925b8
SG
198/*
199 * Return the absolute value of a number.
200 *
201 * This handles unsigned and signed longs, ints, shorts and chars. For all
202 * input types abs() returns a signed long.
203 *
204 * For 64-bit types, use abs64()
205 */
206#define abs(x) ({ \
207 long ret; \
208 if (sizeof(x) == sizeof(long)) { \
209 long __x = (x); \
210 ret = (__x < 0) ? -__x : __x; \
211 } else { \
212 int __x = (x); \
213 ret = (__x < 0) ? -__x : __x; \
214 } \
215 ret; \
216 })
217
218#define abs64(x) ({ \
219 s64 __x = (x); \
220 (__x < 0) ? -__x : __x; \
221 })
222
3fbeeea6
HS
223#if defined(CONFIG_ENV_IS_EMBEDDED)
224#define TOTAL_MALLOC_LEN CONFIG_SYS_MALLOC_LEN
225#elif ( ((CONFIG_ENV_ADDR+CONFIG_ENV_SIZE) < CONFIG_SYS_MONITOR_BASE) || \
226 (CONFIG_ENV_ADDR >= (CONFIG_SYS_MONITOR_BASE + CONFIG_SYS_MONITOR_LEN)) ) || \
227 defined(CONFIG_ENV_IS_IN_NVRAM)
228#define TOTAL_MALLOC_LEN (CONFIG_SYS_MALLOC_LEN + CONFIG_ENV_SIZE)
229#else
230#define TOTAL_MALLOC_LEN CONFIG_SYS_MALLOC_LEN
231#endif
c7de829c 232
28901120
HS
233/**
234 * container_of - cast a member of a structure out to the containing structure
235 * @ptr: the pointer to the member.
236 * @type: the type of the container struct this is embedded in.
237 * @member: the name of the member within the struct.
238 *
239 */
240#define container_of(ptr, type, member) ({ \
241 const typeof( ((type *)0)->member ) *__mptr = (ptr); \
242 (type *)( (char *)__mptr - offsetof(type,member) );})
243
e2211743
WD
244/*
245 * Function Prototypes
246 */
247
c83bf6a2 248void hang (void) __attribute__ ((noreturn));
e2211743 249
f6c019c4
WD
250int timer_init(void);
251int cpu_init(void);
252
e2211743 253/* */
9973e3c6 254phys_size_t initdram (int);
c83bf6a2 255int display_options (void);
4b42c905 256void print_size(unsigned long long, const char *);
bda32ffc
SG
257int print_buffer(ulong addr, const void *data, uint width, uint count,
258 uint linelen);
e2211743
WD
259
260/* common/main.c */
261void main_loop (void);
009dde19 262int run_command(const char *cmd, int flag);
1d43bfd2 263int run_command_repeatable(const char *cmd, int flag);
d51004a8
SG
264
265/**
266 * Run a list of commands separated by ; or even \0
267 *
268 * Note that if 'len' is not -1, then the command does not need to be nul
269 * terminated, Memory will be allocated for the command in that case.
270 *
271 * @param cmd List of commands to run, each separated bu semicolon
272 * @param len Length of commands excluding terminator if known (-1 if not)
273 * @param flag Execution flags (CMD_FLAG_...)
274 * @return 0 on success, or != 0 on error.
275 */
276int run_command_list(const char *cmd, int len, int flag);
e3150460 277extern char console_buffer[];
e2211743 278
ea0364f1 279/* arch/$(ARCH)/lib/board.c */
e05e5de7 280void board_init_f(ulong);
6d1b6f9f 281void board_init_r (gd_t *, ulong) __attribute__ ((noreturn));
e2211743
WD
282int checkboard (void);
283int checkflash (void);
284int checkdram (void);
e2211743 285int last_stage_init(void);
3b57fe0a 286extern ulong monitor_flash_len;
bea3f28d 287int mac_read_from_eeprom(void);
6ab6b2af 288extern u8 __dtb_dt_begin[]; /* embedded device tree blob */
8f5d4687 289int set_cpu_clk_info(void);
9272a9b4 290int mdm_init(void);
365475e6 291#if defined(CONFIG_DISPLAY_CPUINFO)
1938f4a5 292int print_cpuinfo(void);
365475e6
MY
293#else
294static inline int print_cpuinfo(void)
295{
296 return 0;
297}
298#endif
c2240d4d 299int update_flash_size(int flash_size);
2c072c95 300int arch_early_init_r(void);
e2211743 301
15a33e49
SG
302/**
303 * Show the DRAM size in a board-specific way
304 *
305 * This is used by boards to display DRAM information in their own way.
306 *
307 * @param size Size of DRAM (which should be displayed along with other info)
308 */
309void board_show_dram(ulong size);
310
13d06981 311/**
e29607ed 312 * arch_fixup_fdt() - Write arch-specific information to fdt
13d06981 313 *
e29607ed 314 * Defined in arch/$(ARCH)/lib/bootm-fdt.c
13d06981
SG
315 *
316 * @blob: FDT blob to write to
317 * @return 0 if ok, or -ve FDT_ERR_... on failure
318 */
e29607ed 319int arch_fixup_fdt(void *blob);
13d06981 320
e2211743
WD
321/* common/flash.c */
322void flash_perror (int);
323
74de7aef
WD
324/* common/cmd_source.c */
325int source (ulong addr, const char *fit_uname);
e2211743 326
c83bf6a2 327extern ulong load_addr; /* Default Load Address */
1aec244a
SG
328extern ulong save_addr; /* Default Save Address */
329extern ulong save_size; /* Default Save Size */
e2211743 330
4394f9a8
WD
331/* common/cmd_doc.c */
332void doc_probe(unsigned long physadr);
333
06283a64
JH
334/* common/cmd_net.c */
335int do_tftpb(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
336
669df7e4
RH
337/* common/cmd_fat.c */
338int do_fat_fsload(cmd_tbl_t *, int, int, char * const []);
339
340/* common/cmd_ext2.c */
341int do_ext2load(cmd_tbl_t *, int, int, char * const []);
342
e2211743
WD
343/* common/cmd_nvedit.c */
344int env_init (void);
345void env_relocate (void);
26a41790 346int envmatch (uchar *, int);
20f86a0a
SG
347
348/* Avoid unfortunate conflict with libc's getenv() */
349#ifdef CONFIG_SANDBOX
350#define getenv uboot_getenv
351#endif
84b5e802
WD
352char *getenv (const char *);
353int getenv_f (const char *name, char *buf, unsigned len);
4a9b4131 354ulong getenv_ulong(const char *name, int base, ulong default_val);
76b8f79c
SG
355
356/**
357 * getenv_hex() - Return an environment variable as a hex value
358 *
359 * Decode an environment as a hex number (it may or may not have a 0x
360 * prefix). If the environment variable cannot be found, or does not start
361 * with hex digits, the default value is returned.
362 *
363 * @varname: Variable to decode
364 * @default_val: Value to return on error
365 */
366ulong getenv_hex(const char *varname, ulong default_val);
367
ec8a252c
JH
368/*
369 * Read an environment variable as a boolean
370 * Return -1 if variable does not exist (default to true)
371 */
372int getenv_yesno(const char *var);
c83bf6a2 373int saveenv (void);
84b5e802 374int setenv (const char *, const char *);
d67f10ce 375int setenv_ulong(const char *varname, ulong value);
bfc59966
SG
376int setenv_hex(const char *varname, ulong value);
377/**
378 * setenv_addr - Set an environment variable to an address in hex
379 *
1bce2aeb 380 * @varname: Environment variable to set
bfc59966
SG
381 * @addr: Value to set it to
382 * @return 0 if ok, 1 on error
383 */
384static inline int setenv_addr(const char *varname, const void *addr)
385{
386 return setenv_hex(varname, (ulong)addr);
387}
388
e2211743 389#ifdef CONFIG_ARM
96085e34 390# include <asm/mach-types.h>
b6e4c403 391# include <asm/setup.h>
e2211743
WD
392# include <asm/u-boot-arm.h> /* ARM version to be fixed! */
393#endif /* CONFIG_ARM */
fea25720
GR
394#ifdef CONFIG_X86 /* x86 version to be fixed! */
395# include <asm/u-boot-x86.h>
396#endif /* CONFIG_X86 */
744d9859
SG
397#ifdef CONFIG_SANDBOX
398# include <asm/u-boot-sandbox.h> /* TODO(sjg) what needs to be fixed? */
399#endif
e7083844
ML
400#ifdef CONFIG_NDS32
401# include <asm/mach-types.h>
e3c58b02 402# include <asm/setup.h>
e7083844
ML
403# include <asm/u-boot-nds32.h>
404#endif /* CONFIG_NDS32 */
e034ea3b
DS
405#ifdef CONFIG_MIPS
406# include <asm/u-boot-mips.h>
407#endif /* CONFIG_MIPS */
bc5d5428
AB
408#ifdef CONFIG_ARC
409# include <asm/u-boot-arc.h>
410#endif /* CONFIG_ARC */
e2211743 411
04a85b3b
WD
412#ifdef CONFIG_AUTO_COMPLETE
413int env_complete(char *var, int maxv, char *cmdv[], int maxsz, char *buf);
414#endif
2f70c49e 415int get_env_id (void);
04a85b3b 416
c83bf6a2
WD
417void pci_init (void);
418void pci_init_board(void);
419void pciinfo (int, int);
e2211743 420
a821d08d 421#if defined(CONFIG_PCI) && defined(CONFIG_4xx)
c71103f9
MF
422 int pci_pre_init (struct pci_controller *);
423 int is_pci_host (struct pci_controller *);
466fff1a
SR
424#endif
425
dbbd1257 426#if defined(CONFIG_PCI) && (defined(CONFIG_440) || defined(CONFIG_405EX))
6d0f6bcf 427# if defined(CONFIG_SYS_PCI_TARGET_INIT)
c83bf6a2 428 void pci_target_init (struct pci_controller *);
e2211743 429# endif
6d0f6bcf 430# if defined(CONFIG_SYS_PCI_MASTER_INIT)
c83bf6a2 431 void pci_master_init (struct pci_controller *);
e2211743 432# endif
6f2eb3f3
SR
433#if defined(CONFIG_440SPE) || \
434 defined(CONFIG_460EX) || defined(CONFIG_460GT) || \
435 defined(CONFIG_405EX)
7f191393 436 void pcie_setup_hoses(int busno);
692519b1 437#endif
e2211743
WD
438#endif
439
440int misc_init_f (void);
441int misc_init_r (void);
442
27b207fd
WD
443/* common/exports.c */
444void jumptable_init(void);
445
ecb1dc89
MF
446/* common/kallsysm.c */
447const char *symbol_lookup(unsigned long addr, unsigned long *caddr);
448
500856eb
RJ
449/* api/api.c */
450void api_init (void);
451
c83bf6a2 452/* common/memsize.c */
a55d23cc 453long get_ram_size (long *, long);
e3866163 454phys_size_t get_effective_memsize(void);
c83bf6a2 455
e2211743
WD
456/* $(BOARD)/$(BOARD).c */
457void reset_phy (void);
c83bf6a2 458void fdc_hw_init (void);
e2211743
WD
459
460/* $(BOARD)/eeprom.c */
461void eeprom_init (void);
6dd652fa
WD
462#ifndef CONFIG_SPI
463int eeprom_probe (unsigned dev_addr, unsigned offset);
464#endif
e2211743
WD
465int eeprom_read (unsigned dev_addr, unsigned offset, uchar *buffer, unsigned cnt);
466int eeprom_write (unsigned dev_addr, unsigned offset, uchar *buffer, unsigned cnt);
467#ifdef CONFIG_LWMON
468extern uchar pic_read (uchar reg);
469extern void pic_write (uchar reg, uchar val);
470#endif
471
472/*
473 * Set this up regardless of board
474 * type, to prevent errors.
475 */
6d0f6bcf
JCPV
476#if defined(CONFIG_SPI) || !defined(CONFIG_SYS_I2C_EEPROM_ADDR)
477# define CONFIG_SYS_DEF_EEPROM_ADDR 0
e2211743 478#else
548738b4 479#if !defined(CONFIG_ENV_EEPROM_IS_ON_I2C)
6d0f6bcf 480# define CONFIG_SYS_DEF_EEPROM_ADDR CONFIG_SYS_I2C_EEPROM_ADDR
548738b4 481#endif
6d0f6bcf 482#endif /* CONFIG_SPI || !defined(CONFIG_SYS_I2C_EEPROM_ADDR) */
e2211743 483
bdccc4fe 484#if defined(CONFIG_SPI)
e2211743
WD
485extern void spi_init_f (void);
486extern void spi_init_r (void);
c83bf6a2 487extern ssize_t spi_read (uchar *, int, uchar *, int);
e2211743
WD
488extern ssize_t spi_write (uchar *, int, uchar *, int);
489#endif
490
e2211743
WD
491#ifdef CONFIG_HERMES
492/* $(BOARD)/hermes.c */
493void hermes_start_lxt980 (int speed);
494#endif
495
496#ifdef CONFIG_EVB64260
497void evb64260_init(void);
498void debug_led(int, int);
499void display_mem_map(void);
500void perform_soft_reset(void);
501#endif
502
e2211743 503/* $(BOARD)/$(BOARD).c */
c837dcb1
WD
504int board_early_init_f (void);
505int board_late_init (void);
e2211743 506int board_postclk_init (void); /* after clocks/timebase, before env/serial */
c837dcb1 507int board_early_init_r (void);
e2211743
WD
508void board_poweroff (void);
509
6d0f6bcf 510#if defined(CONFIG_SYS_DRAM_TEST)
e2211743 511int testdram(void);
6d0f6bcf 512#endif /* CONFIG_SYS_DRAM_TEST */
e2211743
WD
513
514/* $(CPU)/start.S */
c83bf6a2 515#if defined(CONFIG_5xx) || \
0db5bca8 516 defined(CONFIG_8xx)
e2211743
WD
517uint get_immr (uint);
518#endif
c83bf6a2 519uint get_pir (void);
36c72877
WD
520#if defined(CONFIG_MPC5xxx)
521uint get_svr (void);
522#endif
e2211743 523uint get_pvr (void);
547b4cb2 524uint get_svr (void);
e2211743
WD
525uint rd_ic_cst (void);
526void wr_ic_cst (uint);
527void wr_ic_adr (uint);
528uint rd_dc_cst (void);
529void wr_dc_cst (uint);
530void wr_dc_adr (uint);
531int icache_status (void);
532void icache_enable (void);
533void icache_disable(void);
534int dcache_status (void);
535void dcache_enable (void);
536void dcache_disable(void);
2c451f78 537void mmu_disable(void);
5c6db120
BT
538#if defined(CONFIG_ARM)
539void relocate_code(ulong);
540#else
541void relocate_code(ulong, gd_t *, ulong) __attribute__ ((noreturn));
959eaa74 542#endif
e2211743
WD
543ulong get_endaddr (void);
544void trap_init (ulong);
545#if defined (CONFIG_4xx) || \
eeb1b77b 546 defined (CONFIG_MPC5xxx) || \
e2211743
WD
547 defined (CONFIG_74xx_7xx) || \
548 defined (CONFIG_74x) || \
549 defined (CONFIG_75x) || \
0ac6f8b7 550 defined (CONFIG_74xx) || \
cd94ba39 551 defined (CONFIG_MPC85xx) || \
debb7354 552 defined (CONFIG_MPC86xx) || \
0f898604 553 defined (CONFIG_MPC83xx)
c83bf6a2
WD
554unsigned char in8(unsigned int);
555void out8(unsigned int, unsigned char);
556unsigned short in16(unsigned int);
557unsigned short in16r(unsigned int);
558void out16(unsigned int, unsigned short value);
559void out16r(unsigned int, unsigned short value);
560unsigned long in32(unsigned int);
561unsigned long in32r(unsigned int);
562void out32(unsigned int, unsigned long value);
563void out32r(unsigned int, unsigned long value);
564void ppcDcbf(unsigned long value);
565void ppcDcbi(unsigned long value);
566void ppcSync(void);
0ac6f8b7 567void ppcDcbz(unsigned long value);
e2211743 568#endif
0643631a
MS
569#if defined (CONFIG_MICROBLAZE)
570unsigned short in16(unsigned int);
571void out16(unsigned int, unsigned short value);
572#endif
e2211743 573
0f898604 574#if defined (CONFIG_MPC83xx)
90f30a71
DL
575void ppcDWload(unsigned int *addr, unsigned int *ret);
576void ppcDWstore(unsigned int *addr, unsigned int *value);
7c6db910
HS
577void disable_addr_trans(void);
578void enable_addr_trans(void);
579#if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRCONTROLLER)
580void ddr_enable_ecc(unsigned int dram_size);
581#endif
90f30a71
DL
582#endif
583
fc9ae1ba
RS
584/*
585 * Return the current value of a monotonically increasing microsecond timer.
586 * Granularity may be larger than 1us if hardware does not support this.
587 */
588ulong timer_get_us(void);
589
e2211743 590/* $(CPU)/cpu.c */
fbb9ecf7
TT
591static inline int cpumask_next(int cpu, unsigned int mask)
592{
593 for (cpu++; !((1 << cpu) & mask); cpu++)
594 ;
595
596 return cpu;
597}
598
599#define for_each_cpu(iter, cpu, num_cpus, mask) \
600 for (iter = 0, cpu = cpumask_next(-1, mask); \
601 iter < num_cpus; \
602 iter++, cpu = cpumask_next(cpu, mask)) \
603
0e870980 604int cpu_numcores (void);
fbb9ecf7
TT
605u32 cpu_mask (void);
606int is_core_valid (unsigned int);
0e870980 607int probecpu (void);
e2211743
WD
608int checkcpu (void);
609int checkicache (void);
610int checkdcache (void);
611void upmconfig (unsigned int, unsigned int *, unsigned int);
612ulong get_tbclk (void);
1fb4dab2 613void reset_misc (void);
3ec924a3 614void reset_cpu (ulong addr);
6a16e0df
KP
615#if defined (CONFIG_OF_LIBFDT) && defined (CONFIG_OF_BOARD_SETUP)
616void ft_cpu_setup(void *blob, bd_t *bd);
617#ifdef CONFIG_PCI
618void ft_pci_setup(void *blob, bd_t *bd);
619#endif
620#endif
621
ba6a1698
AP
622void smp_set_core_boot_addr(unsigned long addr, int corenr);
623void smp_kick_all_cpus(void);
e2211743
WD
624
625/* $(CPU)/serial.c */
626int serial_init (void);
627void serial_setbrg (void);
628void serial_putc (const char);
756f586a 629void serial_putc_raw(const char);
e2211743 630void serial_puts (const char *);
e2211743
WD
631int serial_getc (void);
632int serial_tstc (void);
633
709ea543
SG
634/* These versions take a stdio_dev pointer */
635struct stdio_dev;
636int serial_stub_getc(struct stdio_dev *sdev);
637int serial_stub_tstc(struct stdio_dev *sdev);
638
e2211743
WD
639/* $(CPU)/speed.c */
640int get_clocks (void);
c178d3da
WD
641int get_clocks_866 (void);
642int sdram_adjust_866 (void);
e9132ea9 643int adjust_sdram_tbs_8xx (void);
58dac327 644#if defined(CONFIG_MPC8260)
e2211743 645int prt_8260_clks (void);
f046ccd1 646#elif defined(CONFIG_MPC5xxx)
945af8d7
WD
647int prt_mpc5xxx_clks (void);
648#endif
e2211743
WD
649#ifdef CONFIG_4xx
650ulong get_OPB_freq (void);
651ulong get_PCI_freq (void);
652#endif
ac67804f 653#if defined(CONFIG_S3C24X0) || \
654 defined(CONFIG_LH7A40X) || \
fcfb632b 655 defined(CONFIG_EP93XX)
e2211743
WD
656ulong get_FCLK (void);
657ulong get_HCLK (void);
658ulong get_PCLK (void);
659ulong get_UCLK (void);
660#endif
f39748ae
WD
661#if defined(CONFIG_LH7A40X)
662ulong get_PLLCLK (void);
663#endif
281e00a3
WD
664#if defined(CONFIG_IMX)
665ulong get_systemPLLCLK(void);
666ulong get_FCLK(void);
667ulong get_HCLK(void);
668ulong get_BCLK(void);
669ulong get_PERCLK1(void);
670ulong get_PERCLK2(void);
671ulong get_PERCLK3(void);
672#endif
e2211743 673ulong get_bus_freq (ulong);
550650dd 674int get_serial_clock(void);
e2211743 675
42d1f039
WD
676#if defined(CONFIG_MPC85xx)
677typedef MPC85xx_SYS_INFO sys_info_t;
c83bf6a2 678void get_sys_info ( sys_info_t * );
871a57bb
MY
679# if defined(CONFIG_OF_LIBFDT)
680 void ft_fixup_cpu(void *, u64);
681 void ft_fixup_num_cores(void *);
682# endif
42d1f039 683#endif
debb7354
JL
684#if defined(CONFIG_MPC86xx)
685typedef MPC86xx_SYS_INFO sys_info_t;
686void get_sys_info ( sys_info_t * );
5df4b0ad
KG
687static inline ulong get_ddr_freq(ulong dummy)
688{
689 return get_bus_freq(dummy);
690}
2f78eae5
YS
691#else
692ulong get_ddr_freq(ulong);
debb7354 693#endif
42d1f039 694
99bcad18 695#if defined(CONFIG_4xx)
e2211743 696# if defined(CONFIG_440)
6c5879f3
MB
697# if defined(CONFIG_440SPE)
698 unsigned long determine_sysper(void);
699 unsigned long determine_pci_clock_per(void);
700# endif
e2211743 701# endif
087dfdb7 702typedef PPC4xx_SYS_INFO sys_info_t;
f31d38b9 703int ppc440spe_revB(void);
c83bf6a2 704void get_sys_info ( sys_info_t * );
e2211743
WD
705#endif
706
707/* $(CPU)/cpu_init.c */
58dac327 708#if defined(CONFIG_8xx) || defined(CONFIG_MPC8260)
e2211743
WD
709void cpu_init_f (volatile immap_t *immr);
710#endif
701e6401 711#if defined(CONFIG_4xx) || defined(CONFIG_MCF52x2) || defined(CONFIG_MPC86xx)
e2211743
WD
712void cpu_init_f (void);
713#endif
701e6401
YS
714#ifdef CONFIG_MPC85xx
715ulong cpu_init_f(void);
716#endif
bf9e3b38 717
e2211743 718int cpu_init_r (void);
58dac327 719#if defined(CONFIG_MPC8260)
e2211743 720int prt_8260_rsr (void);
0f898604 721#elif defined(CONFIG_MPC83xx)
9be39a67 722int prt_83xx_rsr (void);
e2211743
WD
723#endif
724
725/* $(CPU)/interrupts.c */
c83bf6a2
WD
726int interrupt_init (void);
727void timer_interrupt (struct pt_regs *);
e2211743
WD
728void external_interrupt (struct pt_regs *);
729void irq_install_handler(int, interrupt_handler_t *, void *);
730void irq_free_handler (int);
731void reset_timer (void);
732ulong get_timer (ulong base);
b2e16a85
SG
733
734/* Return value of monotonic microsecond timer */
735unsigned long timer_get_us(void);
736
e2211743
WD
737void enable_interrupts (void);
738int disable_interrupts (void);
739
740/* $(CPU)/.../commproc.c */
741int dpram_init (void);
742uint dpram_base(void);
743uint dpram_base_align(uint align);
744uint dpram_alloc(uint size);
745uint dpram_alloc_align(uint size,uint align);
bdccc4fe
WD
746void bootcount_store (ulong);
747ulong bootcount_load (void);
748#define BOOTCOUNT_MAGIC 0xB001C041
e2211743
WD
749
750/* $(CPU)/.../<eth> */
c5bded3c 751void mii_init (void);
e2211743
WD
752
753/* $(CPU)/.../lcd.c */
754ulong lcd_setmem (ulong);
755
e2211743
WD
756/* $(CPU)/.../video.c */
757ulong video_setmem (ulong);
758
ea0364f1 759/* arch/$(ARCH)/lib/cache.c */
cba4b180 760void enable_caches(void);
e2211743 761void flush_cache (unsigned long, unsigned long);
2c451f78 762void flush_dcache_all(void);
03d3bfb0
SR
763void flush_dcache_range(unsigned long start, unsigned long stop);
764void invalidate_dcache_range(unsigned long start, unsigned long stop);
2c451f78
A
765void invalidate_dcache_all(void);
766void invalidate_icache_all(void);
0db5bca8 767
ea0364f1 768/* arch/$(ARCH)/lib/ticks.S */
19ea4678 769uint64_t get_ticks(void);
e2211743
WD
770void wait_ticks (unsigned long);
771
ea0364f1 772/* arch/$(ARCH)/lib/time.c */
3eb90bad 773void __udelay (unsigned long);
e2211743
WD
774ulong usec2ticks (unsigned long usec);
775ulong ticks2usec (unsigned long ticks);
776int init_timebase (void);
777
78acc472 778/* lib/gunzip.c */
87d93a1b
WW
779int gunzip(void *, int, unsigned char *, unsigned long *);
780int zunzip(void *dst, int dstlen, unsigned char *src, unsigned long *lenp,
781 int stoponerr, int offset);
782
54c6977e
WD
783/* lib/qsort.c */
784void qsort(void *base, size_t nmemb, size_t size,
785 int(*compar)(const void *, const void *));
560d424b 786int strcmp_compar(const void *, const void *);
54c6977e 787
78acc472 788/* lib/time.c */
3eb90bad 789void udelay (unsigned long);
c4c9fbeb 790void mdelay(unsigned long);
3eb90bad 791
e11938ea 792/* lib/uuid.c */
d718ded0 793#include <uuid.h>
e11938ea 794
78acc472 795/* lib/vsprintf.c */
9785c905 796#include <vsprintf.h>
e2211743 797
78acc472 798/* lib/strmhz.c */
55f7934d 799char * strmhz(char *buf, unsigned long hz);
0768b7a8 800
78acc472 801/* lib/crc32.c */
449609f5 802#include <u-boot/crc.h>
e2211743 803
9acf1ca5 804/* lib/rand.c */
9acf1ca5
MW
805#define RAND_MAX -1U
806void srand(unsigned int seed);
807unsigned int rand(void);
808unsigned int rand_r(unsigned int *seedp);
9acf1ca5 809
e2211743 810/* common/console.c */
e2211743
WD
811int console_init_f(void); /* Before relocation; uses the serial stuff */
812int console_init_r(void); /* After relocation; uses the console stuff */
d7be3056 813int console_assign(int file, const char *devname); /* Assign the console */
e2211743
WD
814int ctrlc (void);
815int had_ctrlc (void); /* have we had a Control-C since last clear? */
816void clear_ctrlc (void); /* clear the Control-C condition */
817int disable_ctrlc (int); /* 1 to disable, 0 to enable Control-C detect */
a5dffa4b 818int confirm_yesno(void); /* 1 if input is "y", "Y", "yes" or "YES" */
e2211743
WD
819/*
820 * STDIO based functions (can always be used)
821 */
e2211743 822/* serial stuff */
d9c27253 823int serial_printf (const char *fmt, ...)
dc4b0b38 824 __attribute__ ((format (__printf__, 1, 2)));
e2211743
WD
825/* stdin */
826int getc(void);
827int tstc(void);
828
829/* stdout */
830void putc(const char c);
831void puts(const char *s);
d9c27253 832int printf(const char *fmt, ...)
dc4b0b38 833 __attribute__ ((format (__printf__, 1, 2)));
d9c27253 834int vprintf(const char *fmt, va_list args);
e2211743
WD
835
836/* stderr */
837#define eputc(c) fputc(stderr, c)
838#define eputs(s) fputs(stderr, s)
839#define eprintf(fmt,args...) fprintf(stderr,fmt ,##args)
840
841/*
842 * FILE based functions (can only be used AFTER relocation!)
843 */
e2211743
WD
844#define stdin 0
845#define stdout 1
846#define stderr 2
847#define MAX_FILES 3
848
d9c27253 849int fprintf(int file, const char *fmt, ...)
dc4b0b38 850 __attribute__ ((format (__printf__, 2, 3)));
e2211743
WD
851void fputs(int file, const char *s);
852void fputc(int file, const char c);
853int ftstc(int file);
854int fgetc(int file);
855
88d52c6a
LW
856/* lib/gzip.c */
857int gzip(void *dst, unsigned long *lenp,
858 unsigned char *src, unsigned long srclen);
859int zzip(void *dst, unsigned long *lenp, unsigned char *src,
860 unsigned long srclen, int stoponerr,
861 int (*func)(unsigned long, unsigned long));
862
4ef8d53c
JH
863/* lib/net_utils.c */
864#include <net.h>
865static inline IPaddr_t getenv_IPaddr(char *var)
866{
867 return string_to_ip(getenv(var));
868}
869
16a28ef2
GJ
870/*
871 * CONSOLE multiplexing.
872 */
873#ifdef CONFIG_CONSOLE_MUX
874#include <iomux.h>
875#endif
876
e2211743
WD
877int pcmcia_init (void);
878
fb364bec
WD
879#ifdef CONFIG_STATUS_LED
880# include <status_led.h>
881#endif
097e1783
SG
882
883#include <bootstage.h>
e2211743 884
48522bb5
JH
885#ifdef CONFIG_SHOW_ACTIVITY
886void show_activity(int arg);
887#endif
888
fcd3c87e
WD
889/* Multicore arch functions */
890#ifdef CONFIG_MP
891int cpu_status(int nr);
892int cpu_reset(int nr);
4194b366 893int cpu_disable(int nr);
54841ab5 894int cpu_release(int nr, int argc, char * const argv[]);
fcd3c87e
WD
895#endif
896
4213fc29
SG
897/* Define a null map_sysmem() if the architecture doesn't use it */
898# ifndef CONFIG_ARCH_MAP_SYSMEM
899static inline void *map_sysmem(phys_addr_t paddr, unsigned long len)
900{
901 return (void *)(uintptr_t)paddr;
902}
903
904static inline void unmap_sysmem(const void *vaddr)
905{
906}
781adb57 907
ed072b96 908static inline phys_addr_t map_to_sysmem(const void *ptr)
781adb57
SG
909{
910 return (phys_addr_t)(uintptr_t)ptr;
911}
4213fc29
SG
912# endif
913
fcd3c87e
WD
914#endif /* __ASSEMBLY__ */
915
13e95e42
SR
916#ifdef CONFIG_PPC
917/*
918 * Has to be included outside of the #ifndef __ASSEMBLY__ section.
919 * Otherwise might lead to compilation errors in assembler files.
920 */
921#include <asm/cache.h>
922#endif
923
fcd3c87e
WD
924/* Put only stuff here that the assembler can digest */
925
926#ifdef CONFIG_POST
927#define CONFIG_HAS_POST
800eb096
MZ
928#ifndef CONFIG_POST_ALT_LIST
929#define CONFIG_POST_STD_LIST
930#endif
fcd3c87e
WD
931#endif
932
8aa1a2d1 933#ifdef CONFIG_INIT_CRITICAL
2f6fa46d 934#error CONFIG_INIT_CRITICAL is deprecated!
8aa1a2d1
WD
935#error Read section CONFIG_SKIP_LOWLEVEL_INIT in README.
936#endif
937
3cfb0c51
KG
938#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
939
155cfb5e 940#define ROUND(a,b) (((a) + (b) - 1) & ~((b) - 1))
d50c7d4b
WD
941#define DIV_ROUND(n,d) (((n) + ((d)/2)) / (d))
942#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
943#define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y))
022f1216 944
23d5c738
SB
945/*
946 * Divide positive or negative dividend by positive divisor and round
947 * to closest integer. Result is undefined for negative divisors and
948 * for negative dividends if the divisor variable type is unsigned.
949 */
950#define DIV_ROUND_CLOSEST(x, divisor)( \
951{ \
952 typeof(x) __x = x; \
953 typeof(divisor) __d = divisor; \
954 (((typeof(x))-1) > 0 || \
955 ((typeof(divisor))-1) > 0 || (__x) > 0) ? \
956 (((__x) + ((__d) / 2)) / (__d)) : \
957 (((__x) - ((__d) / 2)) / (__d)); \
958} \
959)
960
4b03ac8b
AF
961#define ALIGN(x,a) __ALIGN_MASK((x),(typeof(x))(a)-1)
962#define __ALIGN_MASK(x,mask) (((x)+(mask))&~(mask))
963
1e41f5ad
AS
964/*
965 * ARCH_DMA_MINALIGN is defined in asm/cache.h for each architecture. It
966 * is used to align DMA buffers.
967 */
968#ifndef __ASSEMBLY__
969#include <asm/cache.h>
970#endif
971
46a6d51c
A
972/*
973 * The ALLOC_CACHE_ALIGN_BUFFER macro is used to allocate a buffer on the
974 * stack that meets the minimum architecture alignment requirements for DMA.
975 * Such a buffer is useful for DMA operations where flushing and invalidating
976 * the cache before and after a read and/or write operation is required for
977 * correct operations.
978 *
979 * When called the macro creates an array on the stack that is sized such
980 * that:
981 *
982 * 1) The beginning of the array can be advanced enough to be aligned.
983 *
984 * 2) The size of the aligned portion of the array is a multiple of the minimum
985 * architecture alignment required for DMA.
986 *
987 * 3) The aligned portion contains enough space for the original number of
988 * elements requested.
989 *
990 * The macro then creates a pointer to the aligned portion of this array and
991 * assigns to the pointer the address of the first element in the aligned
992 * portion of the array.
993 *
994 * Calling the macro as:
995 *
996 * ALLOC_CACHE_ALIGN_BUFFER(uint32_t, buffer, 1024);
997 *
998 * Will result in something similar to saying:
999 *
1000 * uint32_t buffer[1024];
1001 *
1002 * The following differences exist:
1003 *
1004 * 1) The resulting buffer is guaranteed to be aligned to the value of
1005 * ARCH_DMA_MINALIGN.
1006 *
1007 * 2) The buffer variable created by the macro is a pointer to the specified
1008 * type, and NOT an array of the specified type. This can be very important
1009 * if you want the address of the buffer, which you probably do, to pass it
1010 * to the DMA hardware. The value of &buffer is different in the two cases.
1011 * In the macro case it will be the address of the pointer, not the address
1012 * of the space reserved for the buffer. However, in the second case it
1013 * would be the address of the buffer. So if you are replacing hard coded
1014 * stack buffers with this macro you need to make sure you remove the & from
1015 * the locations where you are taking the address of the buffer.
1016 *
1017 * Note that the size parameter is the number of array elements to allocate,
1018 * not the number of bytes.
1019 *
1020 * This macro can not be used outside of function scope, or for the creation
1021 * of a function scoped static buffer. It can not be used to create a cache
1022 * line aligned global buffer.
1023 */
e8232fea 1024#define PAD_COUNT(s, pad) (((s) - 1) / (pad) + 1)
ae1768a7
EE
1025#define PAD_SIZE(s, pad) (PAD_COUNT(s, pad) * pad)
1026#define ALLOC_ALIGN_BUFFER_PAD(type, name, size, align, pad) \
e8232fea 1027 char __##name[ROUND(PAD_SIZE((size) * sizeof(type), pad), align) \
ae1768a7 1028 + (align - 1)]; \
de4d1135
MV
1029 \
1030 type *name = (type *) ALIGN((uintptr_t)__##name, align)
ae1768a7
EE
1031#define ALLOC_ALIGN_BUFFER(type, name, size, align) \
1032 ALLOC_ALIGN_BUFFER_PAD(type, name, size, align, 1)
1033#define ALLOC_CACHE_ALIGN_BUFFER_PAD(type, name, size, pad) \
1034 ALLOC_ALIGN_BUFFER_PAD(type, name, size, ARCH_DMA_MINALIGN, pad)
46a6d51c 1035#define ALLOC_CACHE_ALIGN_BUFFER(type, name, size) \
de4d1135
MV
1036 ALLOC_ALIGN_BUFFER(type, name, size, ARCH_DMA_MINALIGN)
1037
1038/*
1039 * DEFINE_CACHE_ALIGN_BUFFER() is similar to ALLOC_CACHE_ALIGN_BUFFER, but it's
1040 * purpose is to allow allocating aligned buffers outside of function scope.
1041 * Usage of this macro shall be avoided or used with extreme care!
1042 */
1043#define DEFINE_ALIGN_BUFFER(type, name, size, align) \
1044 static char __##name[roundup(size * sizeof(type), align)] \
d7ea4d4d 1045 __aligned(align); \
46a6d51c 1046 \
de4d1135
MV
1047 static type *name = (type *)__##name
1048#define DEFINE_CACHE_ALIGN_BUFFER(type, name, size) \
1049 DEFINE_ALIGN_BUFFER(type, name, size, ARCH_DMA_MINALIGN)
46a6d51c 1050
c3eb3fe4
MF
1051/* Pull in stuff for the build system */
1052#ifdef DO_DEPS_ONLY
1053# include <environment.h>
1054#endif
1055
e2211743 1056#endif /* __COMMON_H_ */