uboot/include/common.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0+ */
   2/*
   3 * (C) Copyright 2000-2009
   4 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
   5 */
   6
   7#ifndef __COMMON_H_
   8#define __COMMON_H_     1
   9
  10#ifndef __ASSEMBLY__            /* put C only stuff in this section */
  11
  12typedef unsigned char           uchar;
  13typedef volatile unsigned long  vu_long;
  14typedef volatile unsigned short vu_short;
  15typedef volatile unsigned char  vu_char;
  16
  17#include <config.h>
  18#include <errno.h>
  19#include <time.h>
  20#include <asm-offsets.h>
  21#include <linux/bitops.h>
  22#include <linux/bug.h>
  23#include <linux/delay.h>
  24#include <linux/types.h>
  25#include <linux/printk.h>
  26#include <linux/string.h>
  27#include <linux/stringify.h>
  28#include <asm/ptrace.h>
  29#include <stdarg.h>
  30#include <stdio.h>
  31#include <linux/kernel.h>
  32
  33#include <part.h>
  34#include <flash.h>
  35#include <image.h>
  36
  37#ifdef __LP64__
  38#define CONFIG_SYS_SUPPORT_64BIT_DATA
  39#endif
  40
  41#include <log.h>
  42
  43typedef void (interrupt_handler_t)(void *);
  44
  45#include <asm/u-boot.h> /* boot information for Linux kernel */
  46#include <asm/global_data.h>    /* global data used for startup functions */
  47
  48#if defined(CONFIG_ENV_IS_EMBEDDED)
  49#define TOTAL_MALLOC_LEN        CONFIG_SYS_MALLOC_LEN
  50#elif ( ((CONFIG_ENV_ADDR+CONFIG_ENV_SIZE) < CONFIG_SYS_MONITOR_BASE) || \
  51        (CONFIG_ENV_ADDR >= (CONFIG_SYS_MONITOR_BASE + CONFIG_SYS_MONITOR_LEN)) ) || \
  52      defined(CONFIG_ENV_IS_IN_NVRAM)
  53#define TOTAL_MALLOC_LEN        (CONFIG_SYS_MALLOC_LEN + CONFIG_ENV_SIZE)
  54#else
  55#define TOTAL_MALLOC_LEN        CONFIG_SYS_MALLOC_LEN
  56#endif
  57
  58/* startup functions, used in:
  59 * common/board_f.c
  60 * common/init/board_init.c
  61 * common/board_r.c
  62 * common/board_info.c
  63 */
  64#include <init.h>
  65
  66/*
  67 * Function Prototypes
  68 */
  69void    hang            (void) __attribute__ ((noreturn));
  70
  71int     cpu_init(void);
  72
  73#include <display_options.h>
  74
  75/* common/main.c */
  76void    main_loop       (void);
  77int run_command(const char *cmd, int flag);
  78int run_command_repeatable(const char *cmd, int flag);
  79
  80/**
  81 * Run a list of commands separated by ; or even \0
  82 *
  83 * Note that if 'len' is not -1, then the command does not need to be nul
  84 * terminated, Memory will be allocated for the command in that case.
  85 *
  86 * @param cmd   List of commands to run, each separated bu semicolon
  87 * @param len   Length of commands excluding terminator if known (-1 if not)
  88 * @param flag  Execution flags (CMD_FLAG_...)
  89 * @return 0 on success, or != 0 on error.
  90 */
  91int run_command_list(const char *cmd, int len, int flag);
  92
  93int checkflash(void);
  94int checkdram(void);
  95extern u8 __dtb_dt_begin[];     /* embedded device tree blob */
  96extern u8 __dtb_dt_spl_begin[]; /* embedded device tree blob for SPL/TPL */
  97int mdm_init(void);
  98
  99/**
 100 * Show the DRAM size in a board-specific way
 101 *
 102 * This is used by boards to display DRAM information in their own way.
 103 *
 104 * @param size  Size of DRAM (which should be displayed along with other info)
 105 */
 106void board_show_dram(phys_size_t size);
 107
 108/**
 109 * Get the uppermost pointer that is valid to access
 110 *
 111 * Some systems may not map all of their address space. This function allows
 112 * boards to indicate what their highest support pointer value is for DRAM
 113 * access.
 114 *
 115 * @param total_size    Size of U-Boot (unused?)
 116 */
 117ulong board_get_usable_ram_top(ulong total_size);
 118
 119/**
 120 * arch_fixup_fdt() - Write arch-specific information to fdt
 121 *
 122 * Defined in arch/$(ARCH)/lib/bootm-fdt.c
 123 *
 124 * @blob:       FDT blob to write to
 125 * @return 0 if ok, or -ve FDT_ERR_... on failure
 126 */
 127int arch_fixup_fdt(void *blob);
 128
 129/* common/flash.c */
 130void flash_perror (int);
 131
 132/* common/cmd_source.c */
 133int     source (ulong addr, const char *fit_uname);
 134
 135extern ulong load_addr;         /* Default Load Address */
 136extern ulong save_addr;         /* Default Save Address */
 137extern ulong save_size;         /* Default Save Size */
 138
 139/* common/cmd_net.c */
 140int do_tftpb(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
 141
 142/* common/cmd_fat.c */
 143int do_fat_fsload(cmd_tbl_t *, int, int, char * const []);
 144
 145/* common/cmd_ext2.c */
 146int do_ext2load(cmd_tbl_t *, int, int, char * const []);
 147
 148/* common/cmd_nvedit.c */
 149int     env_init     (void);
 150void    env_relocate (void);
 151int     envmatch     (uchar *, int);
 152
 153/**
 154 * env_get() - Look up the value of an environment variable
 155 *
 156 * In U-Boot proper this can be called before relocation (which is when the
 157 * environment is loaded from storage, i.e. GD_FLG_ENV_READY is 0). In that
 158 * case this function calls env_get_f().
 159 *
 160 * @varname:    Variable to look up
 161 * @return value of variable, or NULL if not found
 162 */
 163char *env_get(const char *varname);
 164
 165/**
 166 * env_get_f() - Look up the value of an environment variable (early)
 167 *
 168 * This function is called from env_get() if the environment has not been
 169 * loaded yet (GD_FLG_ENV_READY flag is 0). Some environment locations will
 170 * support reading the value (slowly) and some will not.
 171 *
 172 * @varname:    Variable to look up
 173 * @return value of variable, or NULL if not found
 174 */
 175int env_get_f(const char *name, char *buf, unsigned len);
 176
 177/**
 178 * env_get_ulong() - Return an environment variable as an integer value
 179 *
 180 * Most U-Boot environment variables store hex values. For those which store
 181 * (e.g.) base-10 integers, this function can be used to read the value.
 182 *
 183 * @name:       Variable to look up
 184 * @base:       Base to use (e.g. 10 for base 10, 2 for binary)
 185 * @default_val: Default value to return if no value is found
 186 * @return the value found, or @default_val if none
 187 */
 188ulong env_get_ulong(const char *name, int base, ulong default_val);
 189
 190/**
 191 * env_get_hex() - Return an environment variable as a hex value
 192 *
 193 * Decode an environment as a hex number (it may or may not have a 0x
 194 * prefix). If the environment variable cannot be found, or does not start
 195 * with hex digits, the default value is returned.
 196 *
 197 * @varname:            Variable to decode
 198 * @default_val:        Value to return on error
 199 */
 200ulong env_get_hex(const char *varname, ulong default_val);
 201
 202/*
 203 * Read an environment variable as a boolean
 204 * Return -1 if variable does not exist (default to true)
 205 */
 206int env_get_yesno(const char *var);
 207
 208/**
 209 * env_set() - set an environment variable
 210 *
 211 * This sets or deletes the value of an environment variable. For setting the
 212 * value the variable is created if it does not already exist.
 213 *
 214 * @varname: Variable to adjust
 215 * @value: Value to set for the variable, or NULL or "" to delete the variable
 216 * @return 0 if OK, 1 on error
 217 */
 218int env_set(const char *varname, const char *value);
 219
 220/**
 221 * env_set_ulong() - set an environment variable to an integer
 222 *
 223 * @varname: Variable to adjust
 224 * @value: Value to set for the variable (will be converted to a string)
 225 * @return 0 if OK, 1 on error
 226 */
 227int env_set_ulong(const char *varname, ulong value);
 228
 229/**
 230 * env_set_hex() - set an environment variable to a hex value
 231 *
 232 * @varname: Variable to adjust
 233 * @value: Value to set for the variable (will be converted to a hex string)
 234 * @return 0 if OK, 1 on error
 235 */
 236int env_set_hex(const char *varname, ulong value);
 237
 238/**
 239 * env_set_addr - Set an environment variable to an address in hex
 240 *
 241 * @varname:    Environment variable to set
 242 * @addr:       Value to set it to
 243 * @return 0 if ok, 1 on error
 244 */
 245static inline int env_set_addr(const char *varname, const void *addr)
 246{
 247        return env_set_hex(varname, (ulong)addr);
 248}
 249
 250#ifdef CONFIG_AUTO_COMPLETE
 251int env_complete(char *var, int maxv, char *cmdv[], int maxsz, char *buf,
 252                 bool dollar_comp);
 253#endif
 254int get_env_id (void);
 255
 256void    pci_init_board(void);
 257
 258/* common/exports.c */
 259void    jumptable_init(void);
 260
 261/* common/kallsysm.c */
 262const char *symbol_lookup(unsigned long addr, unsigned long *caddr);
 263
 264/* common/memsize.c */
 265long    get_ram_size  (long *, long);
 266phys_size_t get_effective_memsize(void);
 267
 268/* $(BOARD)/$(BOARD).c */
 269void    reset_phy     (void);
 270void    fdc_hw_init   (void);
 271
 272/* $(BOARD)/eeprom.c */
 273#ifdef CONFIG_CMD_EEPROM
 274void eeprom_init  (int bus);
 275int  eeprom_read  (unsigned dev_addr, unsigned offset, uchar *buffer, unsigned cnt);
 276int  eeprom_write (unsigned dev_addr, unsigned offset, uchar *buffer, unsigned cnt);
 277#else
 278/*
 279 * Some EEPROM code is depecated because it used the legacy I2C interface. Add
 280 * some macros here so we don't have to touch every one of those uses
 281 */
 282#define eeprom_init(bus)
 283#define eeprom_read(dev_addr, offset, buffer, cnt) ((void)-ENOSYS)
 284#define eeprom_write(dev_addr, offset, buffer, cnt) ((void)-ENOSYS)
 285#endif
 286
 287#if !defined(CONFIG_ENV_EEPROM_IS_ON_I2C) && defined(CONFIG_SYS_I2C_EEPROM_ADDR)
 288# define CONFIG_SYS_DEF_EEPROM_ADDR CONFIG_SYS_I2C_EEPROM_ADDR
 289#endif
 290
 291/* $(BOARD)/$(BOARD).c */
 292int board_early_init_f (void);
 293int board_fix_fdt (void *rw_fdt_blob); /* manipulate the U-Boot fdt before its relocation */
 294int board_late_init (void);
 295int board_postclk_init (void); /* after clocks/timebase, before env/serial */
 296int board_early_init_r (void);
 297
 298#if defined(CONFIG_SYS_DRAM_TEST)
 299int testdram(void);
 300#endif /* CONFIG_SYS_DRAM_TEST */
 301
 302/* $(CPU)/start.S */
 303int     icache_status (void);
 304void    icache_enable (void);
 305void    icache_disable(void);
 306int     dcache_status (void);
 307void    dcache_enable (void);
 308void    dcache_disable(void);
 309void    mmu_disable(void);
 310#if defined(CONFIG_ARM)
 311void    relocate_code(ulong);
 312#else
 313void    relocate_code(ulong, gd_t *, ulong) __attribute__ ((noreturn));
 314#endif
 315ulong   get_endaddr   (void);
 316void    trap_init     (ulong);
 317
 318/* $(CPU)/cpu.c */
 319static inline int cpumask_next(int cpu, unsigned int mask)
 320{
 321        for (cpu++; !((1 << cpu) & mask); cpu++)
 322                ;
 323
 324        return cpu;
 325}
 326
 327#define for_each_cpu(iter, cpu, num_cpus, mask) \
 328        for (iter = 0, cpu = cpumask_next(-1, mask); \
 329                iter < num_cpus; \
 330                iter++, cpu = cpumask_next(cpu, mask)) \
 331
 332int     cpu_numcores  (void);
 333int     cpu_num_dspcores(void);
 334u32     cpu_mask      (void);
 335u32     cpu_dsp_mask(void);
 336int     is_core_valid (unsigned int);
 337
 338void s_init(void);
 339
 340int     checkcpu      (void);
 341int     checkicache   (void);
 342int     checkdcache   (void);
 343void    upmconfig     (unsigned int, unsigned int *, unsigned int);
 344ulong   get_tbclk     (void);
 345void    reset_misc    (void);
 346void    reset_cpu     (ulong addr);
 347void ft_cpu_setup(void *blob, bd_t *bd);
 348void ft_pci_setup(void *blob, bd_t *bd);
 349
 350void smp_set_core_boot_addr(unsigned long addr, int corenr);
 351void smp_kick_all_cpus(void);
 352
 353/* $(CPU)/serial.c */
 354int     serial_init   (void);
 355void    serial_setbrg (void);
 356void    serial_putc   (const char);
 357void    serial_putc_raw(const char);
 358void    serial_puts   (const char *);
 359int     serial_getc   (void);
 360int     serial_tstc   (void);
 361
 362/* $(CPU)/speed.c */
 363int     get_clocks (void);
 364ulong   get_bus_freq  (ulong);
 365int get_serial_clock(void);
 366
 367/* $(CPU)/interrupts.c */
 368int     interrupt_init     (void);
 369void    timer_interrupt    (struct pt_regs *);
 370void    external_interrupt (struct pt_regs *);
 371void    irq_install_handler(int, interrupt_handler_t *, void *);
 372void    irq_free_handler   (int);
 373void    reset_timer        (void);
 374
 375/* Return value of monotonic microsecond timer */
 376unsigned long timer_get_us(void);
 377
 378void    enable_interrupts  (void);
 379int     disable_interrupts (void);
 380
 381/* $(CPU)/.../commproc.c */
 382int     dpram_init (void);
 383uint    dpram_base(void);
 384uint    dpram_base_align(uint align);
 385uint    dpram_alloc(uint size);
 386uint    dpram_alloc_align(uint size,uint align);
 387void    bootcount_store (ulong);
 388ulong   bootcount_load (void);
 389
 390/* $(CPU)/.../<eth> */
 391void mii_init (void);
 392
 393/* $(CPU)/.../lcd.c */
 394ulong   lcd_setmem (ulong);
 395
 396/* $(CPU)/.../video.c */
 397ulong   video_setmem (ulong);
 398
 399/* arch/$(ARCH)/lib/cache.c */
 400void    enable_caches(void);
 401void    flush_cache   (unsigned long, unsigned long);
 402void    flush_dcache_all(void);
 403void    flush_dcache_range(unsigned long start, unsigned long stop);
 404void    invalidate_dcache_range(unsigned long start, unsigned long stop);
 405void    invalidate_dcache_all(void);
 406void    invalidate_icache_all(void);
 407
 408enum {
 409        /* Disable caches (else flush caches but leave them active) */
 410        CBL_DISABLE_CACHES              = 1 << 0,
 411        CBL_SHOW_BOOTSTAGE_REPORT       = 1 << 1,
 412
 413        CBL_ALL                         = 3,
 414};
 415
 416/**
 417 * Clean up ready for linux
 418 *
 419 * @param flags         Flags to control what is done
 420 */
 421int cleanup_before_linux_select(int flags);
 422
 423/* arch/$(ARCH)/lib/ticks.S */
 424uint64_t get_ticks(void);
 425void    wait_ticks    (unsigned long);
 426
 427/* arch/$(ARCH)/lib/time.c */
 428ulong   usec2ticks    (unsigned long usec);
 429ulong   ticks2usec    (unsigned long ticks);
 430
 431/* lib/gunzip.c */
 432int gzip_parse_header(const unsigned char *src, unsigned long len);
 433int gunzip(void *, int, unsigned char *, unsigned long *);
 434int zunzip(void *dst, int dstlen, unsigned char *src, unsigned long *lenp,
 435                                                int stoponerr, int offset);
 436
 437/**
 438 * gzwrite progress indicators: defined weak to allow board-specific
 439 * overrides:
 440 *
 441 *      gzwrite_progress_init called on startup
 442 *      gzwrite_progress called during decompress/write loop
 443 *      gzwrite_progress_finish called at end of loop to
 444 *              indicate success (retcode=0) or failure
 445 */
 446void gzwrite_progress_init(u64 expected_size);
 447
 448void gzwrite_progress(int iteration,
 449                     u64 bytes_written,
 450                     u64 total_bytes);
 451
 452void gzwrite_progress_finish(int retcode,
 453                             u64 totalwritten,
 454                             u64 totalsize,
 455                             u32 expected_crc,
 456                             u32 calculated_crc);
 457
 458/**
 459 * decompress and write gzipped image from memory to block device
 460 *
 461 * @param       src             compressed image address
 462 * @param       len             compressed image length in bytes
 463 * @param       dev             block device descriptor
 464 * @param       szwritebuf      bytes per write (pad to erase size)
 465 * @param       startoffs       offset in bytes of first write
 466 * @param       szexpected      expected uncompressed length
 467 *                              may be zero to use gzip trailer
 468 *                              for files under 4GiB
 469 */
 470int gzwrite(unsigned char *src, int len,
 471            struct blk_desc *dev,
 472            unsigned long szwritebuf,
 473            u64 startoffs,
 474            u64 szexpected);
 475
 476/* lib/lz4_wrapper.c */
 477int ulz4fn(const void *src, size_t srcn, void *dst, size_t *dstn);
 478
 479/* lib/qsort.c */
 480void qsort(void *base, size_t nmemb, size_t size,
 481           int(*compar)(const void *, const void *));
 482int strcmp_compar(const void *, const void *);
 483
 484/* lib/uuid.c */
 485#include <uuid.h>
 486
 487/* lib/vsprintf.c */
 488#include <vsprintf.h>
 489
 490/* lib/strmhz.c */
 491char *  strmhz(char *buf, unsigned long hz);
 492
 493/* lib/crc32.c */
 494#include <u-boot/crc.h>
 495
 496/* lib/rand.c */
 497#define RAND_MAX -1U
 498void srand(unsigned int seed);
 499unsigned int rand(void);
 500unsigned int rand_r(unsigned int *seedp);
 501
 502/*
 503 * STDIO based functions (can always be used)
 504 */
 505/* serial stuff */
 506int     serial_printf (const char *fmt, ...)
 507                __attribute__ ((format (__printf__, 1, 2)));
 508
 509/* lib/gzip.c */
 510int gzip(void *dst, unsigned long *lenp,
 511                unsigned char *src, unsigned long srclen);
 512int zzip(void *dst, unsigned long *lenp, unsigned char *src,
 513                unsigned long srclen, int stoponerr,
 514                int (*func)(unsigned long, unsigned long));
 515
 516/* lib/net_utils.c */
 517#include <net.h>
 518static inline struct in_addr env_get_ip(char *var)
 519{
 520        return string_to_ip(env_get(var));
 521}
 522
 523int     pcmcia_init (void);
 524
 525#ifdef CONFIG_LED_STATUS
 526# include <status_led.h>
 527#endif
 528
 529#include <bootstage.h>
 530
 531#ifdef CONFIG_SHOW_ACTIVITY
 532void show_activity(int arg);
 533#endif
 534
 535/* Multicore arch functions */
 536#ifdef CONFIG_MP
 537int cpu_status(u32 nr);
 538int cpu_reset(u32 nr);
 539int cpu_disable(u32 nr);
 540int cpu_release(u32 nr, int argc, char * const argv[]);
 541#endif
 542
 543#else   /* __ASSEMBLY__ */
 544
 545#endif  /* __ASSEMBLY__ */
 546
 547/* Put only stuff here that the assembler can digest */
 548
 549#ifdef CONFIG_POST
 550#define CONFIG_HAS_POST
 551#ifndef CONFIG_POST_ALT_LIST
 552#define CONFIG_POST_STD_LIST
 553#endif
 554#endif
 555
 556#define ROUND(a,b)              (((a) + (b) - 1) & ~((b) - 1))
 557
 558/*
 559 * check_member() - Check the offset of a structure member
 560 *
 561 * @structure:  Name of structure (e.g. global_data)
 562 * @member:     Name of member (e.g. baudrate)
 563 * @offset:     Expected offset in bytes
 564 */
 565#define check_member(structure, member, offset) _Static_assert( \
 566        offsetof(struct structure, member) == offset, \
 567        "`struct " #structure "` offset for `" #member "` is not " #offset)
 568
 569/* Avoid using CONFIG_EFI_STUB directly as we may boot from other loaders */
 570#ifdef CONFIG_EFI_STUB
 571#define ll_boot_init()  false
 572#else
 573#define ll_boot_init()  true
 574#endif
 575
 576/* Pull in stuff for the build system */
 577#ifdef DO_DEPS_ONLY
 578# include <environment.h>
 579#endif
 580
 581#endif  /* __COMMON_H_ */
 582