1/* SPDX-License-Identifier: GPL-2.0+ */ 2/* 3 * Copyright (c) 2012 The Chromium OS Authors. 4 * (C) Copyright 2002-2010 5 * Wolfgang Denk, DENX Software Engineering, wd@denx.de. 6 */ 7 8#ifndef __ASM_GENERIC_GBL_DATA_H 9#define __ASM_GENERIC_GBL_DATA_H 10/* 11 * The following data structure is placed in some memory which is 12 * available very early after boot (like DPRAM on MPC8xx/MPC82xx, or 13 * some locked parts of the data cache) to allow for a minimum set of 14 * global variables during system initialization (until we have set 15 * up the memory controller so that we can use RAM). 16 * 17 * Keep it *SMALL* and remember to set GENERATED_GBL_DATA_SIZE > sizeof(gd_t) 18 * 19 * Each architecture has its own private fields. For now all are private 20 */ 21 22#ifndef __ASSEMBLY__ 23#include <fdtdec.h> 24#include <membuff.h> 25#include <linux/list.h> 26 27struct acpi_ctx; 28struct driver_rt; 29 30typedef struct global_data gd_t; 31 32/** 33 * struct global_data - global data structure 34 */ 35struct global_data { 36 /** 37 * @bd: board information 38 */ 39 struct bd_info *bd; 40 /** 41 * @flags: global data flags 42 * 43 * See &enum gd_flags 44 */ 45 unsigned long flags; 46 /** 47 * @baudrate: baud rate of the serial interface 48 */ 49 unsigned int baudrate; 50 /** 51 * @cpu_clk: CPU clock rate in Hz 52 */ 53 unsigned long cpu_clk; 54 /** 55 * @bus_clk: platform clock rate in Hz 56 */ 57 unsigned long bus_clk; 58 /** 59 * @pci_clk: PCI clock rate in Hz 60 */ 61 /* We cannot bracket this with CONFIG_PCI due to mpc5xxx */ 62 unsigned long pci_clk; 63 /** 64 * @mem_clk: memory clock rate in Hz 65 */ 66 unsigned long mem_clk; 67#if defined(CONFIG_LCD) || defined(CONFIG_VIDEO) || defined(CONFIG_DM_VIDEO) 68 /** 69 * @fb_base: base address of frame buffer memory 70 */ 71 unsigned long fb_base; 72#endif 73#if defined(CONFIG_POST) 74 /** 75 * @post_log_word: active POST tests 76 * 77 * @post_log_word is a bit mask defining which POST tests are recorded 78 * (see constants POST_*). 79 */ 80 unsigned long post_log_word; 81 /** 82 * @post_log_res: POST results 83 * 84 * @post_log_res is a bit mask with the POST results. A bit with value 1 85 * indicates successful execution. 86 */ 87 unsigned long post_log_res; 88 /** 89 * @post_init_f_time: time in ms when post_init_f() started 90 */ 91 unsigned long post_init_f_time; 92#endif 93#ifdef CONFIG_BOARD_TYPES 94 /** 95 * @board_type: board type 96 * 97 * If a U-Boot configuration supports multiple board types, the actual 98 * board type may be stored in this field. 99 */ 100 unsigned long board_type; 101#endif 102 /** 103 * @have_console: console is available 104 * 105 * A value of 1 indicates that serial_init() was called and a console 106 * is available. 107 * A value of 0 indicates that console input and output drivers shall 108 * not be called. 109 */ 110 unsigned long have_console; 111#if CONFIG_IS_ENABLED(PRE_CONSOLE_BUFFER) 112 /** 113 * @precon_buf_idx: pre-console buffer index 114 * 115 * @precon_buf_idx indicates the current position of the buffer used to 116 * collect output before the console becomes available 117 */ 118 unsigned long precon_buf_idx; 119#endif 120 /** 121 * @env_addr: address of environment structure 122 * 123 * @env_addr contains the address of the structure holding the 124 * environment variables. 125 */ 126 unsigned long env_addr; 127 /** 128 * @env_valid: environment is valid 129 * 130 * See &enum env_valid 131 */ 132 unsigned long env_valid; 133 /** 134 * @env_has_init: bit mask indicating environment locations 135 * 136 * &enum env_location defines which bit relates to which location 137 */ 138 unsigned long env_has_init; 139 /** 140 * @env_load_prio: priority of the loaded environment 141 */ 142 int env_load_prio; 143 /** 144 * @ram_base: base address of RAM used by U-Boot 145 */ 146 unsigned long ram_base; 147 /** 148 * @ram_top: top address of RAM used by U-Boot 149 */ 150 unsigned long ram_top; 151 /** 152 * @relocaddr: start address of U-Boot in RAM 153 * 154 * After relocation this field indicates the address to which U-Boot 155 * has been relocated. It can be displayed using the bdinfo command. 156 * Its value is needed to display the source code when debugging with 157 * GDB using the 'add-symbol-file u-boot <relocaddr>' command. 158 */ 159 unsigned long relocaddr; 160 /** 161 * @ram_size: RAM size in bytes 162 */ 163 phys_size_t ram_size; 164 /** 165 * @mon_len: monitor length in bytes 166 */ 167 unsigned long mon_len; 168 /** 169 * @irq_sp: IRQ stack pointer 170 */ 171 unsigned long irq_sp; 172 /** 173 * @start_addr_sp: initial stack pointer address 174 */ 175 unsigned long start_addr_sp; 176 /** 177 * @reloc_off: relocation offset 178 */ 179 unsigned long reloc_off; 180 /** 181 * @new_gd: pointer to relocated global data 182 */ 183 struct global_data *new_gd; 184 185#ifdef CONFIG_DM 186 /** 187 * @dm_root: root instance for Driver Model 188 */ 189 struct udevice *dm_root; 190 /** 191 * @dm_root_f: pre-relocation root instance 192 */ 193 struct udevice *dm_root_f; 194 /** 195 * @uclass_root: head of core tree 196 */ 197 struct list_head uclass_root; 198# if CONFIG_IS_ENABLED(OF_PLATDATA) 199 /** @dm_driver_rt: Dynamic info about the driver */ 200 struct driver_rt *dm_driver_rt; 201# endif 202#endif 203#ifdef CONFIG_TIMER 204 /** 205 * @timer: timer instance for Driver Model 206 */ 207 struct udevice *timer; 208#endif 209 /** 210 * @fdt_blob: U-Boot's own device tree, NULL if none 211 */ 212 const void *fdt_blob; 213 /** 214 * @new_fdt: relocated device tree 215 */ 216 void *new_fdt; 217 /** 218 * @fdt_size: space reserved for relocated device space 219 */ 220 unsigned long fdt_size; 221#if CONFIG_IS_ENABLED(OF_LIVE) 222 /** 223 * @of_root: root node of the live tree 224 */ 225 struct device_node *of_root; 226#endif 227 228#if CONFIG_IS_ENABLED(MULTI_DTB_FIT) 229 /** 230 * @multi_dtb_fit: pointer to uncompressed multi-dtb FIT image 231 */ 232 const void *multi_dtb_fit; 233#endif 234 /** 235 * @jt: jump table 236 * 237 * The jump table contains pointers to exported functions. A pointer to 238 * the jump table is passed to standalone applications. 239 */ 240 struct jt_funcs *jt; 241 /** 242 * @env_buf: buffer for env_get() before reloc 243 */ 244 char env_buf[32]; 245#ifdef CONFIG_TRACE 246 /** 247 * @trace_buff: trace buffer 248 * 249 * When tracing function in U-Boot this field points to the buffer 250 * recording the function calls. 251 */ 252 void *trace_buff; 253#endif 254#if defined(CONFIG_SYS_I2C) 255 /** 256 * @cur_i2c_bus: currently used I2C bus 257 */ 258 int cur_i2c_bus; 259#endif 260 /** 261 * @timebase_h: high 32 bits of timer 262 */ 263 unsigned int timebase_h; 264 /** 265 * @timebase_l: low 32 bits of timer 266 */ 267 unsigned int timebase_l; 268#if CONFIG_VAL(SYS_MALLOC_F_LEN) 269 /** 270 * @malloc_base: base address of early malloc() 271 */ 272 unsigned long malloc_base; 273 /** 274 * @malloc_limit: limit address of early malloc() 275 */ 276 unsigned long malloc_limit; 277 /** 278 * @malloc_ptr: current address of early malloc() 279 */ 280 unsigned long malloc_ptr; 281#endif 282#ifdef CONFIG_PCI 283 /** 284 * @hose: PCI hose for early use 285 */ 286 struct pci_controller *hose; 287 /** 288 * @pci_ram_top: top of region accessible to PCI 289 */ 290 phys_addr_t pci_ram_top; 291#endif 292#ifdef CONFIG_PCI_BOOTDELAY 293 /** 294 * @pcidelay_done: delay time before scanning of PIC hose expired 295 * 296 * If CONFIG_PCI_BOOTDELAY=y, pci_hose_scan() waits for the number of 297 * milliseconds defined by environment variable pcidelay before 298 * scanning. Once this delay has expired the flag @pcidelay_done 299 * is set to 1. 300 */ 301 int pcidelay_done; 302#endif 303 /** 304 * @cur_serial_dev: current serial device 305 */ 306 struct udevice *cur_serial_dev; 307 /** 308 * @arch: architecture-specific data 309 */ 310 struct arch_global_data arch; 311#ifdef CONFIG_CONSOLE_RECORD 312 /** 313 * @console_out: output buffer for console recording 314 * 315 * This buffer is used to collect output during console recording. 316 */ 317 struct membuff console_out; 318 /** 319 * @console_in: input buffer for console recording 320 * 321 * If console recording is activated, this buffer can be used to 322 * emulate input. 323 */ 324 struct membuff console_in; 325#endif 326#ifdef CONFIG_DM_VIDEO 327 /** 328 * @video_top: top of video frame buffer area 329 */ 330 ulong video_top; 331 /** 332 * @video_bottom: bottom of video frame buffer area 333 */ 334 ulong video_bottom; 335#endif 336#ifdef CONFIG_BOOTSTAGE 337 /** 338 * @bootstage: boot stage information 339 */ 340 struct bootstage_data *bootstage; 341 /** 342 * @new_bootstage: relocated boot stage information 343 */ 344 struct bootstage_data *new_bootstage; 345#endif 346#ifdef CONFIG_LOG 347 /** 348 * @log_drop_count: number of dropped log messages 349 * 350 * This counter is incremented for each log message which can not 351 * be processed because logging is not yet available as signaled by 352 * flag %GD_FLG_LOG_READY in @flags. 353 */ 354 int log_drop_count; 355 /** 356 * @default_log_level: default logging level 357 * 358 * For logging devices without filters @default_log_level defines the 359 * logging level, cf. &enum log_level_t. 360 */ 361 int default_log_level; 362 /** 363 * @log_head: list of logging devices 364 */ 365 struct list_head log_head; 366 /** 367 * @log_fmt: bit mask for logging format 368 * 369 * The @log_fmt bit mask selects the fields to be shown in log messages. 370 * &enum log_fmt defines the bits of the bit mask. 371 */ 372 int log_fmt; 373 374 /** 375 * @processing_msg: a log message is being processed 376 * 377 * This flag is used to suppress the creation of additional messages 378 * while another message is being processed. 379 */ 380 bool processing_msg; 381 /** 382 * @logc_prev: logging category of previous message 383 * 384 * This value is used as logging category for continuation messages. 385 */ 386 int logc_prev; 387 /** 388 * @logl_prev: logging level of the previous message 389 * 390 * This value is used as logging level for continuation messages. 391 */ 392 int logl_prev; 393#endif 394#if CONFIG_IS_ENABLED(BLOBLIST) 395 /** 396 * @bloblist: blob list information 397 */ 398 struct bloblist_hdr *bloblist; 399 /** 400 * @new_bloblist: relocated blob list information 401 */ 402 struct bloblist_hdr *new_bloblist; 403# ifdef CONFIG_SPL 404 /** 405 * @spl_handoff: SPL hand-off information 406 */ 407 struct spl_handoff *spl_handoff; 408# endif 409#endif 410#if defined(CONFIG_TRANSLATION_OFFSET) 411 /** 412 * @translation_offset: optional translation offset 413 * 414 * See CONFIG_TRANSLATION_OFFSET. 415 */ 416 fdt_addr_t translation_offset; 417#endif 418#if CONFIG_IS_ENABLED(WDT) 419 /** 420 * @watchdog_dev: watchdog device 421 */ 422 struct udevice *watchdog_dev; 423#endif 424#ifdef CONFIG_GENERATE_ACPI_TABLE 425 /** 426 * @acpi_ctx: ACPI context pointer 427 */ 428 struct acpi_ctx *acpi_ctx; 429#endif 430}; 431 432/** 433 * gd_board_type() - retrieve board type 434 * 435 * Return: global board type 436 */ 437#ifdef CONFIG_BOARD_TYPES 438#define gd_board_type() gd->board_type 439#else 440#define gd_board_type() 0 441#endif 442 443/* These macros help avoid #ifdefs in the code */ 444#if CONFIG_IS_ENABLED(OF_LIVE) 445#define gd_of_root() gd->of_root 446#define gd_of_root_ptr() &gd->of_root 447#define gd_set_of_root(_root) gd->of_root = (_root) 448#else 449#define gd_of_root() NULL 450#define gd_of_root_ptr() NULL 451#define gd_set_of_root(_root) 452#endif 453 454#if CONFIG_IS_ENABLED(OF_PLATDATA) 455#define gd_set_dm_driver_rt(dyn) gd->dm_driver_rt = dyn 456#define gd_dm_driver_rt() gd->dm_driver_rt 457#else 458#define gd_set_dm_driver_rt(dyn) 459#define gd_dm_driver_rt() NULL 460#endif 461 462#ifdef CONFIG_GENERATE_ACPI_TABLE 463#define gd_acpi_ctx() gd->acpi_ctx 464#else 465#define gd_acpi_ctx() NULL 466#endif 467 468/** 469 * enum gd_flags - global data flags 470 * 471 * See field flags of &struct global_data. 472 */ 473enum gd_flags { 474 /** 475 * @GD_FLG_RELOC: code was relocated to RAM 476 */ 477 GD_FLG_RELOC = 0x00001, 478 /** 479 * @GD_FLG_DEVINIT: devices have been initialized 480 */ 481 GD_FLG_DEVINIT = 0x00002, 482 /** 483 * @GD_FLG_SILENT: silent mode 484 */ 485 GD_FLG_SILENT = 0x00004, 486 /** 487 * @GD_FLG_POSTFAIL: critical POST test failed 488 */ 489 GD_FLG_POSTFAIL = 0x00008, 490 /** 491 * @GD_FLG_POSTSTOP: POST sequence aborted 492 */ 493 GD_FLG_POSTSTOP = 0x00010, 494 /** 495 * @GD_FLG_LOGINIT: log Buffer has been initialized 496 */ 497 GD_FLG_LOGINIT = 0x00020, 498 /** 499 * @GD_FLG_DISABLE_CONSOLE: disable console (in & out) 500 */ 501 GD_FLG_DISABLE_CONSOLE = 0x00040, 502 /** 503 * @GD_FLG_ENV_READY: environment imported into hash table 504 */ 505 GD_FLG_ENV_READY = 0x00080, 506 /** 507 * @GD_FLG_SERIAL_READY: pre-relocation serial console ready 508 */ 509 GD_FLG_SERIAL_READY = 0x00100, 510 /** 511 * @GD_FLG_FULL_MALLOC_INIT: full malloc() is ready 512 */ 513 GD_FLG_FULL_MALLOC_INIT = 0x00200, 514 /** 515 * @GD_FLG_SPL_INIT: spl_init() has been called 516 */ 517 GD_FLG_SPL_INIT = 0x00400, 518 /** 519 * @GD_FLG_SKIP_RELOC: don't relocate 520 */ 521 GD_FLG_SKIP_RELOC = 0x00800, 522 /** 523 * @GD_FLG_RECORD: record console 524 */ 525 GD_FLG_RECORD = 0x01000, 526 /** 527 * @GD_FLG_ENV_DEFAULT: default variable flag 528 */ 529 GD_FLG_ENV_DEFAULT = 0x02000, 530 /** 531 * @GD_FLG_SPL_EARLY_INIT: early SPL initialization is done 532 */ 533 GD_FLG_SPL_EARLY_INIT = 0x04000, 534 /** 535 * @GD_FLG_LOG_READY: log system is ready for use 536 */ 537 GD_FLG_LOG_READY = 0x08000, 538 /** 539 * @GD_FLG_WDT_READY: watchdog is ready for use 540 */ 541 GD_FLG_WDT_READY = 0x10000, 542 /** 543 * @GD_FLG_SKIP_LL_INIT: don't perform low-level initialization 544 */ 545 GD_FLG_SKIP_LL_INIT = 0x20000, 546 /** 547 * @GD_FLG_SMP_READY: SMP initialization is complete 548 */ 549 GD_FLG_SMP_READY = 0x40000, 550}; 551 552#endif /* __ASSEMBLY__ */ 553 554#endif /* __ASM_GENERIC_GBL_DATA_H */ 555