xref: /openbmc/u-boot/include/common.h (revision 624656314f5684995fb9f499d38ad18d378802a5)
183d290c5STom Rini /* SPDX-License-Identifier: GPL-2.0+ */
2e2211743Swdenk /*
33b74e7ecSWolfgang Denk  * (C) Copyright 2000-2009
4e2211743Swdenk  * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
5e2211743Swdenk  */
6e2211743Swdenk 
7e2211743Swdenk #ifndef __COMMON_H_
8d0b8feefSWolfgang Denk #define __COMMON_H_	1
9e2211743Swdenk 
10fcd3c87eSWolfgang Denk #ifndef __ASSEMBLY__		/* put C only stuff in this section */
11fcd3c87eSWolfgang Denk 
12e2211743Swdenk typedef unsigned char		uchar;
13e2211743Swdenk typedef volatile unsigned long	vu_long;
14e2211743Swdenk typedef volatile unsigned short vu_short;
15e2211743Swdenk typedef volatile unsigned char	vu_char;
16e2211743Swdenk 
17e2211743Swdenk #include <config.h>
182307ea40SJoe Hershberger #include <errno.h>
19a7b81769SMasahiro Yamada #include <time.h>
2025ddd1fbSWolfgang Denk #include <asm-offsets.h>
21e2211743Swdenk #include <linux/bitops.h>
220a70fb4cSMasahiro Yamada #include <linux/bug.h>
235bc516edSMasahiro Yamada #include <linux/delay.h>
24e2211743Swdenk #include <linux/types.h>
25b44b3026SMasahiro Yamada #include <linux/printk.h>
26e2211743Swdenk #include <linux/string.h>
279aed5080SMarek Vasut #include <linux/stringify.h>
28e2211743Swdenk #include <asm/ptrace.h>
29e2211743Swdenk #include <stdarg.h>
307fea7b1aSMasahiro Yamada #include <stdio.h>
31cba1da49SMasahiro Yamada #include <linux/kernel.h>
3285043159SSimon Glass 
33e2211743Swdenk #include <part.h>
34e2211743Swdenk #include <flash.h>
35e2211743Swdenk #include <image.h>
36e2211743Swdenk 
374d1fd7f1SYork Sun #ifdef __LP64__
384d1fd7f1SYork Sun #define CONFIG_SYS_SUPPORT_64BIT_DATA
394d1fd7f1SYork Sun #endif
404d1fd7f1SYork Sun 
410e98b0a6SSimon Glass #include <log.h>
4221726a7aSSimon Glass 
43e2211743Swdenk typedef void (interrupt_handler_t)(void *);
44e2211743Swdenk 
45e2211743Swdenk #include <asm/u-boot.h> /* boot information for Linux kernel */
46e2211743Swdenk #include <asm/global_data.h>	/* global data used for startup functions */
47e2211743Swdenk 
483fbeeea6SHeiko Schocher #if defined(CONFIG_ENV_IS_EMBEDDED)
493fbeeea6SHeiko Schocher #define TOTAL_MALLOC_LEN	CONFIG_SYS_MALLOC_LEN
503fbeeea6SHeiko Schocher #elif ( ((CONFIG_ENV_ADDR+CONFIG_ENV_SIZE) < CONFIG_SYS_MONITOR_BASE) || \
513fbeeea6SHeiko Schocher 	(CONFIG_ENV_ADDR >= (CONFIG_SYS_MONITOR_BASE + CONFIG_SYS_MONITOR_LEN)) ) || \
523fbeeea6SHeiko Schocher       defined(CONFIG_ENV_IS_IN_NVRAM)
533fbeeea6SHeiko Schocher #define	TOTAL_MALLOC_LEN	(CONFIG_SYS_MALLOC_LEN + CONFIG_ENV_SIZE)
543fbeeea6SHeiko Schocher #else
553fbeeea6SHeiko Schocher #define	TOTAL_MALLOC_LEN	CONFIG_SYS_MALLOC_LEN
563fbeeea6SHeiko Schocher #endif
57c7de829cSwdenk 
58d6f87712SPatrick Delaunay /* startup functions, used in:
59d6f87712SPatrick Delaunay  * common/board_f.c
6011f86cbaSPatrick Delaunay  * common/init/board_init.c
61e2c219cdSPatrick Delaunay  * common/board_r.c
62fc22ee21SPatrick Delaunay  * common/board_info.c
63d6f87712SPatrick Delaunay  */
64dafa84d2SPatrick Delaunay #include <init.h>
65dafa84d2SPatrick Delaunay 
66c7de829cSwdenk /*
67e2211743Swdenk  * Function Prototypes
68e2211743Swdenk  */
69e2211743Swdenk void	hang		(void) __attribute__ ((noreturn));
70e2211743Swdenk 
71f6c019c4SWolfgang Denk int	cpu_init(void);
72f6c019c4SWolfgang Denk 
732ea09c83SSimon Glass #include <display_options.h>
74e2211743Swdenk 
75e2211743Swdenk /* common/main.c */
76e2211743Swdenk void	main_loop	(void);
77009dde19SSimon Glass int run_command(const char *cmd, int flag);
781d43bfd2SThomas Betker int run_command_repeatable(const char *cmd, int flag);
79d51004a8SSimon Glass 
80d51004a8SSimon Glass /**
81d51004a8SSimon Glass  * Run a list of commands separated by ; or even \0
82d51004a8SSimon Glass  *
83d51004a8SSimon Glass  * Note that if 'len' is not -1, then the command does not need to be nul
84d51004a8SSimon Glass  * terminated, Memory will be allocated for the command in that case.
85d51004a8SSimon Glass  *
86d51004a8SSimon Glass  * @param cmd	List of commands to run, each separated bu semicolon
87d51004a8SSimon Glass  * @param len	Length of commands excluding terminator if known (-1 if not)
88d51004a8SSimon Glass  * @param flag	Execution flags (CMD_FLAG_...)
89d51004a8SSimon Glass  * @return 0 on success, or != 0 on error.
90d51004a8SSimon Glass  */
91d51004a8SSimon Glass int run_command_list(const char *cmd, int len, int flag);
92e2211743Swdenk 
93e2c219cdSPatrick Delaunay int checkflash(void);
94e2c219cdSPatrick Delaunay int checkdram(void);
956ab6b2afSMasahiro Yamada extern u8 __dtb_dt_begin[];	/* embedded device tree blob */
969bd76b80SGoldschmidt Simon extern u8 __dtb_dt_spl_begin[];	/* embedded device tree blob for SPL/TPL */
97d6f87712SPatrick Delaunay int mdm_init(void);
98e2211743Swdenk 
9915a33e49SSimon Glass /**
10015a33e49SSimon Glass  * Show the DRAM size in a board-specific way
10115a33e49SSimon Glass  *
10215a33e49SSimon Glass  * This is used by boards to display DRAM information in their own way.
10315a33e49SSimon Glass  *
10415a33e49SSimon Glass  * @param size	Size of DRAM (which should be displayed along with other info)
10515a33e49SSimon Glass  */
106ea11b401SAndrew Bradford void board_show_dram(phys_size_t size);
10715a33e49SSimon Glass 
10813d06981SSimon Glass /**
1097b78d643SAlexander Graf  * Get the uppermost pointer that is valid to access
1107b78d643SAlexander Graf  *
1117b78d643SAlexander Graf  * Some systems may not map all of their address space. This function allows
1127b78d643SAlexander Graf  * boards to indicate what their highest support pointer value is for DRAM
1137b78d643SAlexander Graf  * access.
1147b78d643SAlexander Graf  *
1157b78d643SAlexander Graf  * @param total_size	Size of U-Boot (unused?)
1167b78d643SAlexander Graf  */
1177b78d643SAlexander Graf ulong board_get_usable_ram_top(ulong total_size);
1187b78d643SAlexander Graf 
1197b78d643SAlexander Graf /**
120e29607edSMa Haijun  * arch_fixup_fdt() - Write arch-specific information to fdt
12113d06981SSimon Glass  *
122e29607edSMa Haijun  * Defined in arch/$(ARCH)/lib/bootm-fdt.c
12313d06981SSimon Glass  *
12413d06981SSimon Glass  * @blob:	FDT blob to write to
12513d06981SSimon Glass  * @return 0 if ok, or -ve FDT_ERR_... on failure
12613d06981SSimon Glass  */
127e29607edSMa Haijun int arch_fixup_fdt(void *blob);
12813d06981SSimon Glass 
129e2211743Swdenk /* common/flash.c */
130e2211743Swdenk void flash_perror (int);
131e2211743Swdenk 
13274de7aefSWolfgang Denk /* common/cmd_source.c */
13374de7aefSWolfgang Denk int	source (ulong addr, const char *fit_uname);
134e2211743Swdenk 
135e2211743Swdenk extern ulong load_addr;		/* Default Load Address */
1361aec244aSSimon Glass extern ulong save_addr;		/* Default Save Address */
1371aec244aSSimon Glass extern ulong save_size;		/* Default Save Size */
138e2211743Swdenk 
13906283a64SJason Hobbs /* common/cmd_net.c */
14006283a64SJason Hobbs int do_tftpb(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
14106283a64SJason Hobbs 
142669df7e4SRob Herring /* common/cmd_fat.c */
143669df7e4SRob Herring int do_fat_fsload(cmd_tbl_t *, int, int, char * const []);
144669df7e4SRob Herring 
145669df7e4SRob Herring /* common/cmd_ext2.c */
146669df7e4SRob Herring int do_ext2load(cmd_tbl_t *, int, int, char * const []);
147669df7e4SRob Herring 
148e2211743Swdenk /* common/cmd_nvedit.c */
149e2211743Swdenk int	env_init     (void);
150e2211743Swdenk void	env_relocate (void);
15126a41790SRafal Jaworowski int	envmatch     (uchar *, int);
15220f86a0aSSimon Glass 
15300caae6dSSimon Glass /**
15400caae6dSSimon Glass  * env_get() - Look up the value of an environment variable
15500caae6dSSimon Glass  *
15600caae6dSSimon Glass  * In U-Boot proper this can be called before relocation (which is when the
15700caae6dSSimon Glass  * environment is loaded from storage, i.e. GD_FLG_ENV_READY is 0). In that
15800caae6dSSimon Glass  * case this function calls env_get_f().
15900caae6dSSimon Glass  *
16000caae6dSSimon Glass  * @varname:	Variable to look up
16100caae6dSSimon Glass  * @return value of variable, or NULL if not found
16200caae6dSSimon Glass  */
16300caae6dSSimon Glass char *env_get(const char *varname);
16400caae6dSSimon Glass 
16500caae6dSSimon Glass /**
16600caae6dSSimon Glass  * env_get_f() - Look up the value of an environment variable (early)
16700caae6dSSimon Glass  *
16800caae6dSSimon Glass  * This function is called from env_get() if the environment has not been
16900caae6dSSimon Glass  * loaded yet (GD_FLG_ENV_READY flag is 0). Some environment locations will
17000caae6dSSimon Glass  * support reading the value (slowly) and some will not.
17100caae6dSSimon Glass  *
17200caae6dSSimon Glass  * @varname:	Variable to look up
17300caae6dSSimon Glass  * @return value of variable, or NULL if not found
17400caae6dSSimon Glass  */
17500caae6dSSimon Glass int env_get_f(const char *name, char *buf, unsigned len);
17600caae6dSSimon Glass 
177bfebc8c9SSimon Glass /**
178bfebc8c9SSimon Glass  * env_get_ulong() - Return an environment variable as an integer value
179bfebc8c9SSimon Glass  *
180bfebc8c9SSimon Glass  * Most U-Boot environment variables store hex values. For those which store
181bfebc8c9SSimon Glass  * (e.g.) base-10 integers, this function can be used to read the value.
182bfebc8c9SSimon Glass  *
183bfebc8c9SSimon Glass  * @name:	Variable to look up
184bfebc8c9SSimon Glass  * @base:	Base to use (e.g. 10 for base 10, 2 for binary)
185bfebc8c9SSimon Glass  * @default_val: Default value to return if no value is found
186bfebc8c9SSimon Glass  * @return the value found, or @default_val if none
187bfebc8c9SSimon Glass  */
188bfebc8c9SSimon Glass ulong env_get_ulong(const char *name, int base, ulong default_val);
18976b8f79cSSimon Glass 
19076b8f79cSSimon Glass /**
191bfebc8c9SSimon Glass  * env_get_hex() - Return an environment variable as a hex value
19276b8f79cSSimon Glass  *
19376b8f79cSSimon Glass  * Decode an environment as a hex number (it may or may not have a 0x
19476b8f79cSSimon Glass  * prefix). If the environment variable cannot be found, or does not start
19576b8f79cSSimon Glass  * with hex digits, the default value is returned.
19676b8f79cSSimon Glass  *
19776b8f79cSSimon Glass  * @varname:		Variable to decode
19876b8f79cSSimon Glass  * @default_val:	Value to return on error
19976b8f79cSSimon Glass  */
200bfebc8c9SSimon Glass ulong env_get_hex(const char *varname, ulong default_val);
20176b8f79cSSimon Glass 
202ec8a252cSJoe Hershberger /*
203ec8a252cSJoe Hershberger  * Read an environment variable as a boolean
204ec8a252cSJoe Hershberger  * Return -1 if variable does not exist (default to true)
205ec8a252cSJoe Hershberger  */
206bfebc8c9SSimon Glass int env_get_yesno(const char *var);
207382bee57SSimon Glass 
208382bee57SSimon Glass /**
209382bee57SSimon Glass  * env_set() - set an environment variable
210382bee57SSimon Glass  *
211382bee57SSimon Glass  * This sets or deletes the value of an environment variable. For setting the
212382bee57SSimon Glass  * value the variable is created if it does not already exist.
213382bee57SSimon Glass  *
214382bee57SSimon Glass  * @varname: Variable to adjust
215382bee57SSimon Glass  * @value: Value to set for the variable, or NULL or "" to delete the variable
216382bee57SSimon Glass  * @return 0 if OK, 1 on error
217382bee57SSimon Glass  */
218382bee57SSimon Glass int env_set(const char *varname, const char *value);
219382bee57SSimon Glass 
220bfc59966SSimon Glass /**
221018f5303SSimon Glass  * env_set_ulong() - set an environment variable to an integer
222018f5303SSimon Glass  *
223018f5303SSimon Glass  * @varname: Variable to adjust
224018f5303SSimon Glass  * @value: Value to set for the variable (will be converted to a string)
225018f5303SSimon Glass  * @return 0 if OK, 1 on error
226018f5303SSimon Glass  */
227018f5303SSimon Glass int env_set_ulong(const char *varname, ulong value);
228018f5303SSimon Glass 
229018f5303SSimon Glass /**
230018f5303SSimon Glass  * env_set_hex() - set an environment variable to a hex value
231018f5303SSimon Glass  *
232018f5303SSimon Glass  * @varname: Variable to adjust
233018f5303SSimon Glass  * @value: Value to set for the variable (will be converted to a hex string)
234018f5303SSimon Glass  * @return 0 if OK, 1 on error
235018f5303SSimon Glass  */
236018f5303SSimon Glass int env_set_hex(const char *varname, ulong value);
237018f5303SSimon Glass 
238018f5303SSimon Glass /**
239018f5303SSimon Glass  * env_set_addr - Set an environment variable to an address in hex
240bfc59966SSimon Glass  *
2411bce2aebSRobert P. J. Day  * @varname:	Environment variable to set
242bfc59966SSimon Glass  * @addr:	Value to set it to
243bfc59966SSimon Glass  * @return 0 if ok, 1 on error
244bfc59966SSimon Glass  */
env_set_addr(const char * varname,const void * addr)245018f5303SSimon Glass static inline int env_set_addr(const char *varname, const void *addr)
246bfc59966SSimon Glass {
247018f5303SSimon Glass 	return env_set_hex(varname, (ulong)addr);
248bfc59966SSimon Glass }
249bfc59966SSimon Glass 
25004a85b3bSwdenk #ifdef CONFIG_AUTO_COMPLETE
251*03dcf17dSBoris Brezillon int env_complete(char *var, int maxv, char *cmdv[], int maxsz, char *buf,
252*03dcf17dSBoris Brezillon 		 bool dollar_comp);
25304a85b3bSwdenk #endif
2542f70c49eSHeiko Schocher int get_env_id (void);
25504a85b3bSwdenk 
256ad10dd9aSstroese void	pci_init_board(void);
257e2211743Swdenk 
25827b207fdSwdenk /* common/exports.c */
25927b207fdSwdenk void	jumptable_init(void);
26027b207fdSwdenk 
261ecb1dc89SMike Frysinger /* common/kallsysm.c */
262ecb1dc89SMike Frysinger const char *symbol_lookup(unsigned long addr, unsigned long *caddr);
263ecb1dc89SMike Frysinger 
264c83bf6a2Swdenk /* common/memsize.c */
265a55d23ccSAlbert ARIBAUD long	get_ram_size  (long *, long);
266e3866163SYork Sun phys_size_t get_effective_memsize(void);
267c83bf6a2Swdenk 
268e2211743Swdenk /* $(BOARD)/$(BOARD).c */
269e2211743Swdenk void	reset_phy     (void);
2707f6c2cbcSwdenk void	fdc_hw_init   (void);
271e2211743Swdenk 
272f1b1f770SAdam Ford #if !defined(CONFIG_ENV_EEPROM_IS_ON_I2C) && defined(CONFIG_SYS_I2C_EEPROM_ADDR)
2736d0f6bcfSJean-Christophe PLAGNIOL-VILLARD # define CONFIG_SYS_DEF_EEPROM_ADDR CONFIG_SYS_I2C_EEPROM_ADDR
274548738b4SHeiko Schocher #endif
275e2211743Swdenk 
276e2211743Swdenk /* $(BOARD)/$(BOARD).c */
277c837dcb1Swdenk int board_early_init_f (void);
2782a792753Smario.six@gdsys.cc int board_fix_fdt (void *rw_fdt_blob); /* manipulate the U-Boot fdt before its relocation */
279c837dcb1Swdenk int board_late_init (void);
280e2211743Swdenk int board_postclk_init (void); /* after clocks/timebase, before env/serial */
281c837dcb1Swdenk int board_early_init_r (void);
282e2211743Swdenk 
2836d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_SYS_DRAM_TEST)
284e2211743Swdenk int testdram(void);
2856d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #endif /* CONFIG_SYS_DRAM_TEST */
286e2211743Swdenk 
287e2211743Swdenk /* $(CPU)/start.S */
288e2211743Swdenk int	icache_status (void);
289e2211743Swdenk void	icache_enable (void);
290e2211743Swdenk void	icache_disable(void);
291e2211743Swdenk int	dcache_status (void);
292e2211743Swdenk void	dcache_enable (void);
293e2211743Swdenk void	dcache_disable(void);
2942c451f78SAneesh V void	mmu_disable(void);
2955c6db120SBenoît Thébaudeau #if defined(CONFIG_ARM)
2965c6db120SBenoît Thébaudeau void	relocate_code(ulong);
2975c6db120SBenoît Thébaudeau #else
2985c6db120SBenoît Thébaudeau void	relocate_code(ulong, gd_t *, ulong) __attribute__ ((noreturn));
299959eaa74SBenoît Thébaudeau #endif
300e2211743Swdenk ulong	get_endaddr   (void);
301e2211743Swdenk void	trap_init     (ulong);
3026e2941d7SSimon Glass 
303e2211743Swdenk /* $(CPU)/cpu.c */
cpumask_next(int cpu,unsigned int mask)304fbb9ecf7STimur Tabi static inline int cpumask_next(int cpu, unsigned int mask)
305fbb9ecf7STimur Tabi {
306fbb9ecf7STimur Tabi 	for (cpu++; !((1 << cpu) & mask); cpu++)
307fbb9ecf7STimur Tabi 		;
308fbb9ecf7STimur Tabi 
309fbb9ecf7STimur Tabi 	return cpu;
310fbb9ecf7STimur Tabi }
311fbb9ecf7STimur Tabi 
312fbb9ecf7STimur Tabi #define for_each_cpu(iter, cpu, num_cpus, mask) \
313fbb9ecf7STimur Tabi 	for (iter = 0, cpu = cpumask_next(-1, mask); \
314fbb9ecf7STimur Tabi 		iter < num_cpus; \
315fbb9ecf7STimur Tabi 		iter++, cpu = cpumask_next(cpu, mask)) \
316fbb9ecf7STimur Tabi 
3170e870980SPoonam Aggrwal int	cpu_numcores  (void);
318b8bf0adcSShaveta Leekha int	cpu_num_dspcores(void);
319fbb9ecf7STimur Tabi u32	cpu_mask      (void);
320b8bf0adcSShaveta Leekha u32	cpu_dsp_mask(void);
321fbb9ecf7STimur Tabi int	is_core_valid (unsigned int);
322cbcbf71bSSimon Glass 
323026d7958SDiego Dorta void s_init(void);
324026d7958SDiego Dorta 
325e2211743Swdenk int	checkcpu      (void);
326e2211743Swdenk int	checkicache   (void);
327e2211743Swdenk int	checkdcache   (void);
328e2211743Swdenk void	upmconfig     (unsigned int, unsigned int *, unsigned int);
329e2211743Swdenk ulong	get_tbclk     (void);
3301fb4dab2SPrzemyslaw Marczak void	reset_misc    (void);
3313ec924a3Swdenk void	reset_cpu     (ulong addr);
3326a16e0dfSKim Phillips void ft_cpu_setup(void *blob, bd_t *bd);
3336a16e0dfSKim Phillips void ft_pci_setup(void *blob, bd_t *bd);
3346a16e0dfSKim Phillips 
335ba6a1698SAndre Przywara void smp_set_core_boot_addr(unsigned long addr, int corenr);
336ba6a1698SAndre Przywara void smp_kick_all_cpus(void);
337e2211743Swdenk 
338e2211743Swdenk /* $(CPU)/serial.c */
339e2211743Swdenk int	serial_init   (void);
340e2211743Swdenk void	serial_setbrg (void);
341e2211743Swdenk void	serial_putc   (const char);
342756f586aSwdenk void	serial_putc_raw(const char);
343e2211743Swdenk void	serial_puts   (const char *);
344e2211743Swdenk int	serial_getc   (void);
345e2211743Swdenk int	serial_tstc   (void);
346e2211743Swdenk 
347e2211743Swdenk /* $(CPU)/speed.c */
348e2211743Swdenk int	get_clocks (void);
349e2211743Swdenk ulong	get_bus_freq  (ulong);
350550650ddSStefan Roese int get_serial_clock(void);
351e2211743Swdenk 
352e2211743Swdenk /* $(CPU)/interrupts.c */
353e2211743Swdenk int	interrupt_init	   (void);
354e2211743Swdenk void	timer_interrupt	   (struct pt_regs *);
355e2211743Swdenk void	external_interrupt (struct pt_regs *);
356e2211743Swdenk void	irq_install_handler(int, interrupt_handler_t *, void *);
357e2211743Swdenk void	irq_free_handler   (int);
358e2211743Swdenk void	reset_timer	   (void);
359b2e16a85SSimon Glass 
360b2e16a85SSimon Glass /* Return value of monotonic microsecond timer */
361b2e16a85SSimon Glass unsigned long timer_get_us(void);
362b2e16a85SSimon Glass 
363e2211743Swdenk void	enable_interrupts  (void);
364e2211743Swdenk int	disable_interrupts (void);
365e2211743Swdenk 
366e2211743Swdenk /* $(CPU)/.../commproc.c */
367e2211743Swdenk int	dpram_init (void);
368e2211743Swdenk uint	dpram_base(void);
369e2211743Swdenk uint	dpram_base_align(uint align);
370e2211743Swdenk uint	dpram_alloc(uint size);
371e2211743Swdenk uint	dpram_alloc_align(uint size,uint align);
372bdccc4feSwdenk void	bootcount_store (ulong);
373bdccc4feSwdenk ulong	bootcount_load (void);
374e2211743Swdenk 
375e2211743Swdenk /* $(CPU)/.../<eth> */
376c5bded3cSWolfgang Denk void mii_init (void);
377e2211743Swdenk 
378e2211743Swdenk /* $(CPU)/.../lcd.c */
379e2211743Swdenk ulong	lcd_setmem (ulong);
380e2211743Swdenk 
381e2211743Swdenk /* $(CPU)/.../video.c */
382e2211743Swdenk ulong	video_setmem (ulong);
383e2211743Swdenk 
384ea0364f1SPeter Tyser /* arch/$(ARCH)/lib/cache.c */
385cba4b180SAneesh V void	enable_caches(void);
386e2211743Swdenk void	flush_cache   (unsigned long, unsigned long);
3872c451f78SAneesh V void	flush_dcache_all(void);
38803d3bfb0SStefan Roese void	flush_dcache_range(unsigned long start, unsigned long stop);
38903d3bfb0SStefan Roese void	invalidate_dcache_range(unsigned long start, unsigned long stop);
3902c451f78SAneesh V void	invalidate_dcache_all(void);
3912c451f78SAneesh V void	invalidate_icache_all(void);
3920db5bca8Swdenk 
3934d24a11eSSimon Glass enum {
3944d24a11eSSimon Glass 	/* Disable caches (else flush caches but leave them active) */
3954d24a11eSSimon Glass 	CBL_DISABLE_CACHES		= 1 << 0,
3964d24a11eSSimon Glass 	CBL_SHOW_BOOTSTAGE_REPORT	= 1 << 1,
3974d24a11eSSimon Glass 
3984d24a11eSSimon Glass 	CBL_ALL				= 3,
3994d24a11eSSimon Glass };
4004d24a11eSSimon Glass 
4014d24a11eSSimon Glass /**
4024d24a11eSSimon Glass  * Clean up ready for linux
4034d24a11eSSimon Glass  *
4044d24a11eSSimon Glass  * @param flags		Flags to control what is done
4054d24a11eSSimon Glass  */
4064d24a11eSSimon Glass int cleanup_before_linux_select(int flags);
4074d24a11eSSimon Glass 
408ea0364f1SPeter Tyser /* arch/$(ARCH)/lib/ticks.S */
40919ea4678SSimon Glass uint64_t get_ticks(void);
410e2211743Swdenk void	wait_ticks    (unsigned long);
411e2211743Swdenk 
412ea0364f1SPeter Tyser /* arch/$(ARCH)/lib/time.c */
413e2211743Swdenk ulong	usec2ticks    (unsigned long usec);
414e2211743Swdenk ulong	ticks2usec    (unsigned long ticks);
415e2211743Swdenk 
41678acc472SPeter Tyser /* lib/gunzip.c */
417376ddf9dSJean-Jacques Hiblot int gzip_parse_header(const unsigned char *src, unsigned long len);
41887d93a1bSWolfgang Wegner int gunzip(void *, int, unsigned char *, unsigned long *);
41987d93a1bSWolfgang Wegner int zunzip(void *dst, int dstlen, unsigned char *src, unsigned long *lenp,
42087d93a1bSWolfgang Wegner 						int stoponerr, int offset);
42187d93a1bSWolfgang Wegner 
422918e9ebbSEric Nelson /**
423918e9ebbSEric Nelson  * gzwrite progress indicators: defined weak to allow board-specific
424918e9ebbSEric Nelson  * overrides:
425918e9ebbSEric Nelson  *
426918e9ebbSEric Nelson  *	gzwrite_progress_init called on startup
427918e9ebbSEric Nelson  *	gzwrite_progress called during decompress/write loop
428918e9ebbSEric Nelson  *	gzwrite_progress_finish called at end of loop to
429918e9ebbSEric Nelson  *		indicate success (retcode=0) or failure
430918e9ebbSEric Nelson  */
431918e9ebbSEric Nelson void gzwrite_progress_init(u64 expected_size);
432918e9ebbSEric Nelson 
433918e9ebbSEric Nelson void gzwrite_progress(int iteration,
434918e9ebbSEric Nelson 		     u64 bytes_written,
435918e9ebbSEric Nelson 		     u64 total_bytes);
436918e9ebbSEric Nelson 
437918e9ebbSEric Nelson void gzwrite_progress_finish(int retcode,
438918e9ebbSEric Nelson 			     u64 totalwritten,
439918e9ebbSEric Nelson 			     u64 totalsize,
440918e9ebbSEric Nelson 			     u32 expected_crc,
441918e9ebbSEric Nelson 			     u32 calculated_crc);
442918e9ebbSEric Nelson 
443918e9ebbSEric Nelson /**
444918e9ebbSEric Nelson  * decompress and write gzipped image from memory to block device
445918e9ebbSEric Nelson  *
446918e9ebbSEric Nelson  * @param	src		compressed image address
447918e9ebbSEric Nelson  * @param	len		compressed image length in bytes
448918e9ebbSEric Nelson  * @param	dev		block device descriptor
449918e9ebbSEric Nelson  * @param	szwritebuf	bytes per write (pad to erase size)
450918e9ebbSEric Nelson  * @param	startoffs	offset in bytes of first write
451918e9ebbSEric Nelson  * @param	szexpected	expected uncompressed length
452918e9ebbSEric Nelson  *				may be zero to use gzip trailer
453918e9ebbSEric Nelson  *				for files under 4GiB
454918e9ebbSEric Nelson  */
455918e9ebbSEric Nelson int gzwrite(unsigned char *src, int len,
4564101f687SSimon Glass 	    struct blk_desc *dev,
457918e9ebbSEric Nelson 	    unsigned long szwritebuf,
458918e9ebbSEric Nelson 	    u64 startoffs,
459918e9ebbSEric Nelson 	    u64 szexpected);
460918e9ebbSEric Nelson 
461027b728dSJulius Werner /* lib/lz4_wrapper.c */
462027b728dSJulius Werner int ulz4fn(const void *src, size_t srcn, void *dst, size_t *dstn);
463027b728dSJulius Werner 
46454c6977eSWolfgang Denk /* lib/qsort.c */
46554c6977eSWolfgang Denk void qsort(void *base, size_t nmemb, size_t size,
46654c6977eSWolfgang Denk 	   int(*compar)(const void *, const void *));
467560d424bSMike Frysinger int strcmp_compar(const void *, const void *);
46854c6977eSWolfgang Denk 
469e11938eaSJason Hobbs /* lib/uuid.c */
470d718ded0SPrzemyslaw Marczak #include <uuid.h>
471e11938eaSJason Hobbs 
47278acc472SPeter Tyser /* lib/vsprintf.c */
4739785c905SSimon Glass #include <vsprintf.h>
474e2211743Swdenk 
47578acc472SPeter Tyser /* lib/strmhz.c */
47655f7934dSEd Swarthout char *	strmhz(char *buf, unsigned long hz);
4770768b7a8SHaavard Skinnemoen 
47878acc472SPeter Tyser /* lib/crc32.c */
479449609f5SPrafulla Wadaskar #include <u-boot/crc.h>
480e2211743Swdenk 
4819acf1ca5SMichael Walle /* lib/rand.c */
4829acf1ca5SMichael Walle #define RAND_MAX -1U
4839acf1ca5SMichael Walle void srand(unsigned int seed);
4849acf1ca5SMichael Walle unsigned int rand(void);
4859acf1ca5SMichael Walle unsigned int rand_r(unsigned int *seedp);
4869acf1ca5SMichael Walle 
487e2211743Swdenk /*
488e2211743Swdenk  * STDIO based functions (can always be used)
489e2211743Swdenk  */
490e2211743Swdenk /* serial stuff */
491d9c27253SWolfgang Denk int	serial_printf (const char *fmt, ...)
492dc4b0b38SAndrew Klossner 		__attribute__ ((format (__printf__, 1, 2)));
493e2211743Swdenk 
49488d52c6aSLei Wen /* lib/gzip.c */
49588d52c6aSLei Wen int gzip(void *dst, unsigned long *lenp,
49688d52c6aSLei Wen 		unsigned char *src, unsigned long srclen);
49788d52c6aSLei Wen int zzip(void *dst, unsigned long *lenp, unsigned char *src,
49888d52c6aSLei Wen 		unsigned long srclen, int stoponerr,
49988d52c6aSLei Wen 		int (*func)(unsigned long, unsigned long));
50088d52c6aSLei Wen 
5014ef8d53cSJoe Hershberger /* lib/net_utils.c */
5024ef8d53cSJoe Hershberger #include <net.h>
env_get_ip(char * var)503723806ccSSimon Glass static inline struct in_addr env_get_ip(char *var)
5044ef8d53cSJoe Hershberger {
50500caae6dSSimon Glass 	return string_to_ip(env_get(var));
5064ef8d53cSJoe Hershberger }
5074ef8d53cSJoe Hershberger 
508e2211743Swdenk int	pcmcia_init (void);
509e2211743Swdenk 
5102d8d190cSUri Mashiach #ifdef CONFIG_LED_STATUS
511fb364becSWolfgang Denk # include <status_led.h>
512fb364becSWolfgang Denk #endif
513097e1783SSimon Glass 
514097e1783SSimon Glass #include <bootstage.h>
515e2211743Swdenk 
51648522bb5SJoe Hershberger #ifdef CONFIG_SHOW_ACTIVITY
51748522bb5SJoe Hershberger void show_activity(int arg);
51848522bb5SJoe Hershberger #endif
51948522bb5SJoe Hershberger 
520fcd3c87eSWolfgang Denk /* Multicore arch functions */
521fcd3c87eSWolfgang Denk #ifdef CONFIG_MP
52220b016a3SMichal Simek int cpu_status(u32 nr);
52320b016a3SMichal Simek int cpu_reset(u32 nr);
52420b016a3SMichal Simek int cpu_disable(u32 nr);
52520b016a3SMichal Simek int cpu_release(u32 nr, int argc, char * const argv[]);
526fcd3c87eSWolfgang Denk #endif
527fcd3c87eSWolfgang Denk 
5282a6713b0SAndre Przywara #else	/* __ASSEMBLY__ */
5292a6713b0SAndre Przywara 
530fcd3c87eSWolfgang Denk #endif	/* __ASSEMBLY__ */
531fcd3c87eSWolfgang Denk 
532fcd3c87eSWolfgang Denk /* Put only stuff here that the assembler can digest */
533fcd3c87eSWolfgang Denk 
534fcd3c87eSWolfgang Denk #ifdef CONFIG_POST
535fcd3c87eSWolfgang Denk #define CONFIG_HAS_POST
536800eb096SMichael Zaidman #ifndef CONFIG_POST_ALT_LIST
537800eb096SMichael Zaidman #define CONFIG_POST_STD_LIST
538800eb096SMichael Zaidman #endif
539fcd3c87eSWolfgang Denk #endif
540fcd3c87eSWolfgang Denk 
541155cfb5eSAnton Staaf #define ROUND(a,b)		(((a) + (b) - 1) & ~((b) - 1))
5424b03ac8bSAndy Fleming 
5431e41f5adSAnton Staaf /*
544c9689ca3SSimon Glass  * check_member() - Check the offset of a structure member
545c9689ca3SSimon Glass  *
546c9689ca3SSimon Glass  * @structure:	Name of structure (e.g. global_data)
547c9689ca3SSimon Glass  * @member:	Name of member (e.g. baudrate)
548c9689ca3SSimon Glass  * @offset:	Expected offset in bytes
549c9689ca3SSimon Glass  */
550c9689ca3SSimon Glass #define check_member(structure, member, offset) _Static_assert( \
551c9689ca3SSimon Glass 	offsetof(struct structure, member) == offset, \
552c9689ca3SSimon Glass 	"`struct " #structure "` offset for `" #member "` is not " #offset)
553c9689ca3SSimon Glass 
554476476e7SSimon Glass /* Avoid using CONFIG_EFI_STUB directly as we may boot from other loaders */
555476476e7SSimon Glass #ifdef CONFIG_EFI_STUB
556476476e7SSimon Glass #define ll_boot_init()	false
557476476e7SSimon Glass #else
558476476e7SSimon Glass #define ll_boot_init()	true
559476476e7SSimon Glass #endif
560476476e7SSimon Glass 
561c3eb3fe4SMike Frysinger /* Pull in stuff for the build system */
562c3eb3fe4SMike Frysinger #ifdef DO_DEPS_ONLY
563c3eb3fe4SMike Frysinger # include <environment.h>
564c3eb3fe4SMike Frysinger #endif
565c3eb3fe4SMike Frysinger 
566e2211743Swdenk #endif	/* __COMMON_H_ */
567