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