From 1a549c8961a6db72db374a4db2be598b30c9c46d Mon Sep 17 00:00:00 2001 From: Ilya Lukin <4.shket@gmail.com> Date: Fri, 14 Jul 2023 17:39:32 +0300 Subject: crc32: Drop duplicates crc header includes Fixes: 3db711085752 ("crc32: Use the crc.h header for crc functions") Signed-off-by: Ilya Lukin <4.shket@gmail.com> --- common/hash.c | 1 - 1 file changed, 1 deletion(-) (limited to 'common') diff --git a/common/hash.c b/common/hash.c index cbffdfd6db3..159179e7f21 100644 --- a/common/hash.c +++ b/common/hash.c @@ -21,7 +21,6 @@ #include #include #include -#include #else #include "mkimage.h" #include -- cgit v1.2.3 From d8cb1dc91413baf8ac3388aab2070a8f35b13c0b Mon Sep 17 00:00:00 2001 From: Bin Meng Date: Sat, 22 Jul 2023 00:15:21 +0800 Subject: board_f: Cosmetic style fix Some coding convention fixes for print_resetinfo(). Signed-off-by: Bin Meng Reviewed-by: Simon Glass --- common/board_f.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'common') diff --git a/common/board_f.c b/common/board_f.c index 7d2c380e91e..50edac5b7a8 100644 --- a/common/board_f.c +++ b/common/board_f.c @@ -148,11 +148,12 @@ static int print_resetinfo(void) bool status_printed = false; int ret; - /* Not all boards have sysreset drivers available during early + /* + * Not all boards have sysreset drivers available during early * boot, so don't fail if one can't be found. */ for (ret = uclass_first_device_check(UCLASS_SYSRESET, &dev); dev; - ret = uclass_next_device_check(&dev)) { + ret = uclass_next_device_check(&dev)) { if (ret) { debug("%s: %s sysreset device (error: %d)\n", __func__, dev->name, ret); -- cgit v1.2.3 From a077ac13d03c8cde646ddab30b03ec0f8b753e1e Mon Sep 17 00:00:00 2001 From: Tom Rini Date: Wed, 2 Aug 2023 11:09:43 -0400 Subject: Kconfigs: Correct default of "0" on hex type entries It is not a parse error to have a default value of "0" for a "hex" type entry, instead of "0x0". However, "0" and "0x0" are not treated the same even by the tools themselves. Correct this by changing the default value from "0" to "0x0" for all hex type questions that had the incorrect default. Fix one instance (in two configs) of a default of "0" being used on a hex question to be "0x0". Remove the cases where a defconfig had set a value of "0x0" to be used as the default had been "0". Signed-off-by: Tom Rini Reviewed-by: Simon Glass --- common/Kconfig | 2 +- common/spl/Kconfig | 2 +- common/spl/Kconfig.tpl | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) (limited to 'common') diff --git a/common/Kconfig b/common/Kconfig index cdb77a6a7da..0b09bd68bd1 100644 --- a/common/Kconfig +++ b/common/Kconfig @@ -1031,7 +1031,7 @@ config BLOBLIST_SIZE config BLOBLIST_SIZE_RELOC hex "Size of bloblist after relocation" default BLOBLIST_SIZE if BLOBLIST_FIXED || BLOBLIST_ALLOC - default 0 if BLOBLIST_PASSAGE + default 0x0 if BLOBLIST_PASSAGE help Sets the size of the bloblist in bytes after relocation. Since U-Boot has a lot more memory available then, it is possible to use a larger diff --git a/common/spl/Kconfig b/common/spl/Kconfig index c5dd476db58..1c2fe78e3e0 100644 --- a/common/spl/Kconfig +++ b/common/spl/Kconfig @@ -67,7 +67,7 @@ config SPL_SIZE_LIMIT_SUBTRACT_MALLOC config SPL_SIZE_LIMIT_PROVIDE_STACK hex "SPL image size check: provide stack space before relocation" depends on SPL_SIZE_LIMIT > 0 - default 0 + default 0x0 help If set, this size is reserved in SPL_SIZE_LIMIT check to ensure such an image does not overflow SRAM if SPL_SIZE_LIMIT describes the size diff --git a/common/spl/Kconfig.tpl b/common/spl/Kconfig.tpl index 3d6cf1e59f3..cc71578f646 100644 --- a/common/spl/Kconfig.tpl +++ b/common/spl/Kconfig.tpl @@ -126,7 +126,7 @@ config TPL_POWER config TPL_TEXT_BASE hex "Base address for the .text section of the TPL stage" - default 0 + default 0x0 help The base address for the .text section of the TPL stage. -- cgit v1.2.3 From ccea96f443e2d35cf5ecc341bb14569029eb93b8 Mon Sep 17 00:00:00 2001 From: Shiji Yang Date: Thu, 3 Aug 2023 09:47:17 +0800 Subject: treewide: unify the linker symbol reference format Now all linker symbols are declared as type char[]. Though we can reference the address via both the array name 'var' and its address '&var'. It's better to unify them to avoid confusing developers. This patch converts all '&var' linker symbol refrences to the most commonly used format 'var'. Signed-off-by: Shiji Yang Reviewed-by: Tom Rini --- common/board_f.c | 16 ++++++++-------- common/board_r.c | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) (limited to 'common') diff --git a/common/board_f.c b/common/board_f.c index 50edac5b7a8..77e3925a5ad 100644 --- a/common/board_f.c +++ b/common/board_f.c @@ -124,8 +124,8 @@ static int display_text_info(void) #if !defined(CONFIG_SANDBOX) && !defined(CONFIG_EFI_APP) ulong bss_start, bss_end, text_base; - bss_start = (ulong)&__bss_start; - bss_end = (ulong)&__bss_end; + bss_start = (ulong)__bss_start; + bss_end = (ulong)__bss_end; #ifdef CONFIG_TEXT_BASE text_base = CONFIG_TEXT_BASE; @@ -290,21 +290,21 @@ __weak int init_func_vid(void) static int setup_mon_len(void) { #if defined(__ARM__) || defined(__MICROBLAZE__) - gd->mon_len = (ulong)&__bss_end - (ulong)_start; + gd->mon_len = (ulong)__bss_end - (ulong)_start; #elif defined(CONFIG_SANDBOX) && !defined(__riscv) - gd->mon_len = (ulong)&_end - (ulong)_init; + gd->mon_len = (ulong)_end - (ulong)_init; #elif defined(CONFIG_SANDBOX) /* gcc does not provide _init in crti.o on RISC-V */ gd->mon_len = 0; #elif defined(CONFIG_EFI_APP) - gd->mon_len = (ulong)&_end - (ulong)_init; + gd->mon_len = (ulong)_end - (ulong)_init; #elif defined(CONFIG_NIOS2) || defined(CONFIG_XTENSA) gd->mon_len = CONFIG_SYS_MONITOR_LEN; #elif defined(CONFIG_SH) || defined(CONFIG_RISCV) - gd->mon_len = (ulong)(&__bss_end) - (ulong)(&_start); + gd->mon_len = (ulong)(__bss_end) - (ulong)(_start); #elif defined(CONFIG_SYS_MONITOR_BASE) - /* TODO: use (ulong)&__bss_end - (ulong)&__text_start; ? */ - gd->mon_len = (ulong)&__bss_end - CONFIG_SYS_MONITOR_BASE; + /* TODO: use (ulong)__bss_end - (ulong)__text_start; ? */ + gd->mon_len = (ulong)__bss_end - CONFIG_SYS_MONITOR_BASE; #endif return 0; } diff --git a/common/board_r.c b/common/board_r.c index 4aaa8940311..598155c7753 100644 --- a/common/board_r.c +++ b/common/board_r.c @@ -126,9 +126,9 @@ static int initr_reloc_global_data(void) #ifdef __ARM__ monitor_flash_len = _end - __image_copy_start; #elif defined(CONFIG_RISCV) - monitor_flash_len = (ulong)&_end - (ulong)&_start; + monitor_flash_len = (ulong)_end - (ulong)_start; #elif !defined(CONFIG_SANDBOX) && !defined(CONFIG_NIOS2) - monitor_flash_len = (ulong)&__init_end - gd->relocaddr; + monitor_flash_len = (ulong)__init_end - gd->relocaddr; #endif #if defined(CONFIG_MPC85xx) || defined(CONFIG_MPC86xx) /* -- cgit v1.2.3 From 688d62bfc8e336b06b5d6c445333dc04f1283d8d Mon Sep 17 00:00:00 2001 From: Heinrich Schuchardt Date: Sat, 22 Jul 2023 21:27:48 +0200 Subject: spl: add FIT support to semihosting boot method Allow loading a FIT image via semihosting in SPL. Signed-off-by: Heinrich Schuchardt --- common/spl/spl_semihosting.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'common') diff --git a/common/spl/spl_semihosting.c b/common/spl/spl_semihosting.c index 5b5e842a11b..f7dd289286d 100644 --- a/common/spl/spl_semihosting.c +++ b/common/spl/spl_semihosting.c @@ -21,6 +21,23 @@ static int smh_read_full(long fd, void *memp, size_t len) return 0; } +static ulong smh_fit_read(struct spl_load_info *load, ulong file_offset, + ulong size, void *buf) +{ + long fd; + ulong ret; + + fd = smh_open(load->filename, MODE_READ | MODE_BINARY); + if (fd < 0) { + log_debug("could not open %s: %ld\n", load->filename, fd); + return 0; + } + ret = smh_read(fd, buf, size); + smh_close(fd); + + return ret; +} + static int spl_smh_load_image(struct spl_image_info *spl_image, struct spl_boot_device *bootdev) { @@ -49,6 +66,20 @@ static int spl_smh_load_image(struct spl_image_info *spl_image, goto out; } + if (IS_ENABLED(CONFIG_SPL_LOAD_FIT) && + image_get_magic(header) == FDT_MAGIC) { + struct spl_load_info load; + + debug("Found FIT\n"); + load.read = smh_fit_read; + load.bl_len = 1; + load.filename = filename; + load.priv = NULL; + smh_close(fd); + + return spl_load_simple_fit(spl_image, &load, 0, header); + } + ret = spl_parse_image_header(spl_image, bootdev, header); if (ret) { log_debug("failed to parse image header: %d\n", ret); -- cgit v1.2.3 From 86b1aad5411c78f68af6b1d0b28b3c6d78b95ce1 Mon Sep 17 00:00:00 2001 From: Elena Popa Date: Tue, 8 Aug 2023 16:42:15 +0300 Subject: spl: mmc: Fix check of CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTOR When Falcon Mode is enabled, SPL needs to check the value of CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTOR. Unfortunately, it was using the CONFIG_VAL(SYS_MMCSD_RAW_MODE_ARGS_SECTOR) which converts it into CONFIG_SPL_SYS_MMCSD_RAW_MODE_ARGS_SECTOR when CONFIG_SPL_BUILD is enabled. CONFIG_SPL_SYS_MMCSD_RAW_MODE_ARGS_SECTOR does not exist in common/spl/Kconfig. Replaced with defined(CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTOR). Signed-off-by: Elena Popa Reviewed-by: Tom Rini --- common/spl/spl_mmc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'common') diff --git a/common/spl/spl_mmc.c b/common/spl/spl_mmc.c index a665091b00f..20f687e1389 100644 --- a/common/spl/spl_mmc.c +++ b/common/spl/spl_mmc.c @@ -229,7 +229,7 @@ static int mmc_load_image_raw_os(struct spl_image_info *spl_image, { int ret; -#if CONFIG_VAL(SYS_MMCSD_RAW_MODE_ARGS_SECTOR) +#if defined(CONFIG_SYS_MMCSD_RAW_MODE_ARGS_SECTOR) unsigned long count; count = blk_dread(mmc_get_blk_desc(mmc), -- cgit v1.2.3 From 3f9cff669bbc4ed48ede1705fbaf671f3f4ce0e1 Mon Sep 17 00:00:00 2001 From: Marek Vasut Date: Mon, 14 Aug 2023 01:47:47 +0200 Subject: common: bouncebuf: Add missing cast to dma_addr_t MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix the following warning produced on qemu-x86_64_defconfig: " common/bouncebuf.c: In function ‘bounce_buffer_stop’: common/bouncebuf.c:82:34: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] 82 | dma_unmap_single((dma_addr_t)state->bounce_buffer, | ^ " The warning is valid, the pointer has to be up-cast first. Signed-off-by: Marek Vasut Reviewed-by: Andrew Davis --- common/bouncebuf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'common') diff --git a/common/bouncebuf.c b/common/bouncebuf.c index 93a35668cc2..934b83f7ec3 100644 --- a/common/bouncebuf.c +++ b/common/bouncebuf.c @@ -79,7 +79,7 @@ int bounce_buffer_stop(struct bounce_buffer *state) { if (state->flags & GEN_BB_WRITE) { /* Invalidate cache so that CPU can see any newly DMA'd data */ - dma_unmap_single((dma_addr_t)state->bounce_buffer, + dma_unmap_single((dma_addr_t)(uintptr_t)state->bounce_buffer, state->len_aligned, DMA_BIDIRECTIONAL); } -- cgit v1.2.3 From ba5e3e1ed0afb3daa446d2168e5c8c9fe119cbaf Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Mon, 21 Aug 2023 21:16:48 -0600 Subject: event: Support a simple spy record The current event spy is always passed the event context and the event. The context is always NULL for a static spy. The event is not often used. Introduce a 'simple' spy which takes no arguments. This allows us to drop the adaptation code that many of these spy records use. Update the event script to find these in the image. Signed-off-by: Simon Glass --- common/event.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'common') diff --git a/common/event.c b/common/event.c index 3224e281222..7e2590eb040 100644 --- a/common/event.c +++ b/common/event.c @@ -71,7 +71,14 @@ static int notify_static(struct event *ev) log_debug("Sending event %x/%s to spy '%s'\n", ev->type, event_type_name(ev->type), event_spy_id(spy)); - ret = spy->func(NULL, ev); + if (spy->flags & EVSPYF_SIMPLE) { + const struct evspy_info_simple *simple; + + simple = (struct evspy_info_simple *)spy; + ret = simple->func(); + } else { + ret = spy->func(NULL, ev); + } /* * TODO: Handle various return codes to -- cgit v1.2.3 From e7f59dea880ea25078273473c575794dac08dca2 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Mon, 21 Aug 2023 21:16:49 -0600 Subject: Revert "initcall: Move to inline function" Somehow I do not see any inlining with initcalls now. I was sure I saw it when this commit went in, but now it seems to make things worse. This reverts commit 47870afab92fca6e672c03d0dea802a55e200675. Signed-off-by: Simon Glass --- common/board_r.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'common') diff --git a/common/board_r.c b/common/board_r.c index 598155c7753..85860861f0a 100644 --- a/common/board_r.c +++ b/common/board_r.c @@ -583,7 +583,10 @@ static int run_main_loop(void) } /* - * We hope to remove most of the driver-related init and do it if/when + * Over time we hope to remove these functions with code fragments and + * stub functions, and instead call the relevant function directly. + * + * We also hope to remove most of the driver-related init and do it if/when * the driver is later used. * * TODO: perhaps reset the watchdog in the initcall function after each call? -- cgit v1.2.3 From fb7dfca28ad256f27f89a79f96cb4617dc54731d Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Mon, 21 Aug 2023 21:16:53 -0600 Subject: event: Export event_type_name() Export this function so it can be used with initcall debugging. Signed-off-by: Simon Glass --- common/event.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'common') diff --git a/common/event.c b/common/event.c index 7e2590eb040..55f6932ef62 100644 --- a/common/event.c +++ b/common/event.c @@ -49,7 +49,7 @@ const char *const type_name[] = { _Static_assert(ARRAY_SIZE(type_name) == EVT_COUNT, "event type_name size"); #endif -static const char *event_type_name(enum event_t type) +const char *event_type_name(enum event_t type) { #if CONFIG_IS_ENABLED(EVENT_DEBUG) return type_name[type]; -- cgit v1.2.3 From c9eff0a6b6ea2bcd54d30f8a02281681f3730223 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Mon, 21 Aug 2023 21:16:54 -0600 Subject: initcall: Support emitting events At present the initcall list consists of a list of function pointers. Over time the initcall lists will likely change to mostly emitting events, since most of the calls are board- or arch-specific. As a first step, allow an initcall to be an event type instead of a function pointer. Add the required macro and update initcall_run_list() to emit an event in that case, or ignore it if events are not enabled. The bottom 8 bits of the function pointer are used to hold the event type, with the rest being all ones. This should avoid any collision, since initcalls should not be above 0xffffff00 in memory. Convert misc_init_f over to use this mechanism. Add comments to the initcall header file while we are here. Also fix up the trace test to handle the change. Signed-off-by: Simon Glass --- common/board_f.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) (limited to 'common') diff --git a/common/board_f.c b/common/board_f.c index 2f986d9b289..a485ba62fa1 100644 --- a/common/board_f.c +++ b/common/board_f.c @@ -836,11 +836,6 @@ __weak int clear_bss(void) return 0; } -static int misc_init_f(void) -{ - return event_notify_null(EVT_MISC_INIT_F); -} - static const init_fnc_t init_sequence_f[] = { setup_mon_len, #ifdef CONFIG_OF_CONTROL @@ -899,7 +894,7 @@ static const init_fnc_t init_sequence_f[] = { show_board_info, #endif INIT_FUNC_WATCHDOG_INIT - misc_init_f, + INITCALL_EVENT(EVT_MISC_INIT_F), INIT_FUNC_WATCHDOG_RESET #if CONFIG_IS_ENABLED(SYS_I2C_LEGACY) init_func_i2c, -- cgit v1.2.3 From dd802467f44b68d6ed9315ffe3002b17dc43b622 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Mon, 21 Aug 2023 21:16:55 -0600 Subject: initcall: Support manual relocation Move the manual-relocation code to the initcall file. Make sure to avoid manually relocating event types. Only true function pointers should be relocated. Signed-off-by: Simon Glass --- common/board_r.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'common') diff --git a/common/board_r.c b/common/board_r.c index 85860861f0a..7c1fbc69ed6 100644 --- a/common/board_r.c +++ b/common/board_r.c @@ -813,10 +813,8 @@ void board_init_r(gd_t *new_gd, ulong dest_addr) #endif gd->flags &= ~GD_FLG_LOG_READY; - if (IS_ENABLED(CONFIG_NEEDS_MANUAL_RELOC)) { - for (int i = 0; i < ARRAY_SIZE(init_sequence_r); i++) - MANUAL_RELOC(init_sequence_r[i]); - } + if (IS_ENABLED(CONFIG_NEEDS_MANUAL_RELOC)) + initcall_manual_reloc(init_sequence_r); if (initcall_run_list(init_sequence_r)) hang(); -- cgit v1.2.3 From 13a7db9ab1791736c69ce49be85db5f4c32dc581 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Mon, 21 Aug 2023 21:16:59 -0600 Subject: x86: Convert arch_fsp_init() to use events Convert this to use events instead of calling a function directly in the init sequence. Rename it to arch_fsp_init_f() to distinguish it from the one that happens after relocation. For FSPv2 nothing needs to be done here, so drop the empty function. Signed-off-by: Simon Glass --- common/board_f.c | 4 +--- common/event.c | 1 + 2 files changed, 2 insertions(+), 3 deletions(-) (limited to 'common') diff --git a/common/board_f.c b/common/board_f.c index a485ba62fa1..46008bac659 100644 --- a/common/board_f.c +++ b/common/board_f.c @@ -855,9 +855,7 @@ static const init_fnc_t init_sequence_f[] = { #if defined(CONFIG_CONSOLE_RECORD_INIT_F) console_record_init, #endif -#if defined(CONFIG_HAVE_FSP) - arch_fsp_init, -#endif + INITCALL_EVENT(EVT_FSP_INIT_F), arch_cpu_init, /* basic arch cpu dependent setup */ mach_cpu_init, /* SoC/machine dependent CPU setup */ initf_dm, diff --git a/common/event.c b/common/event.c index 55f6932ef62..8a619088884 100644 --- a/common/event.c +++ b/common/event.c @@ -35,6 +35,7 @@ const char *const type_name[] = { /* init hooks */ "misc_init_f", + "fsp_init_r", /* Fpga load hook */ "fpga_load", -- cgit v1.2.3 From 6a32bfae61652f9dae621410ca6e094f374a1f11 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Mon, 21 Aug 2023 21:17:00 -0600 Subject: freescale: Drop call to init_func_vid() in the init sequence Use the misc_init_f event instead, which is designed for this purpose. All boards with CONFIG_VID already enable CONFIG_EVENT. Signed-off-by: Simon Glass --- common/board_f.c | 10 ---------- 1 file changed, 10 deletions(-) (limited to 'common') diff --git a/common/board_f.c b/common/board_f.c index 46008bac659..aef395b1354 100644 --- a/common/board_f.c +++ b/common/board_f.c @@ -280,13 +280,6 @@ static int init_func_i2c(void) } #endif -#if defined(CONFIG_VID) -__weak int init_func_vid(void) -{ - return 0; -} -#endif - static int setup_mon_len(void) { #if defined(__ARM__) || defined(__MICROBLAZE__) @@ -896,9 +889,6 @@ static const init_fnc_t init_sequence_f[] = { INIT_FUNC_WATCHDOG_RESET #if CONFIG_IS_ENABLED(SYS_I2C_LEGACY) init_func_i2c, -#endif -#if defined(CONFIG_VID) && !defined(CONFIG_SPL) - init_func_vid, #endif announce_dram_init, dram_init, /* configure available RAM banks */ -- cgit v1.2.3 From 91caa3bb89b112a1421ee2ee3661baf67c64bab9 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Mon, 21 Aug 2023 21:17:01 -0600 Subject: event: Use an event to replace last_stage_init() Add a new event which handles this function. Convert existing use of the function to use the new event instead. Make sure that EVENT is enabled by affected boards, by selecting it from the LAST_STAGE_INIT option. For x86, enable it by default since all boards need it. For controlcenterdc, inline the get_tpm() function and make sure the event is not built in SPL. Signed-off-by: Simon Glass --- common/Kconfig | 1 + common/board_r.c | 9 +-------- common/event.c | 1 + 3 files changed, 3 insertions(+), 8 deletions(-) (limited to 'common') diff --git a/common/Kconfig b/common/Kconfig index 0b09bd68bd1..d916194b942 100644 --- a/common/Kconfig +++ b/common/Kconfig @@ -720,6 +720,7 @@ config SYS_FSL_CLK config LAST_STAGE_INIT bool "Call board-specific as last setup step" + select EVENT help Some boards need to perform initialisation immediately before control is passed to the command-line interpreter (e.g. for initializations diff --git a/common/board_r.c b/common/board_r.c index 7c1fbc69ed6..ad9a3cf6336 100644 --- a/common/board_r.c +++ b/common/board_r.c @@ -773,15 +773,8 @@ static init_fnc_t init_sequence_r[] = { #ifdef CONFIG_POST initr_post, #endif -#ifdef CONFIG_LAST_STAGE_INIT INIT_FUNC_WATCHDOG_RESET - /* - * Some parts can be only initialized if all others (like - * Interrupts) are up and running (i.e. the PC-style ISA - * keyboard). - */ - last_stage_init, -#endif + INITCALL_EVENT(EVT_LAST_STAGE_INIT), #if defined(CFG_PRAM) initr_mem, #endif diff --git a/common/event.c b/common/event.c index 8a619088884..4845104b17d 100644 --- a/common/event.c +++ b/common/event.c @@ -36,6 +36,7 @@ const char *const type_name[] = { /* init hooks */ "misc_init_f", "fsp_init_r", + "last_stage_init", /* Fpga load hook */ "fpga_load", -- cgit v1.2.3 From 4fa6511e8c05f2b1bd2d4b969b5c9d6cc49228ff Mon Sep 17 00:00:00 2001 From: Marek Vasut Date: Wed, 6 Sep 2023 23:29:42 +0200 Subject: blkcache: Remove unused NEEDS_MANUAL_RELOC code bits The last user of the NEEDS_MANUAL_RELOC has been removed in commit 26af162ac8f8 ("arch: m68k: Implement relocation") Remove now unused NEEDS_MANUAL_RELOC code. Signed-off-by: Marek Vasut --- common/board_r.c | 3 --- 1 file changed, 3 deletions(-) (limited to 'common') diff --git a/common/board_r.c b/common/board_r.c index ad9a3cf6336..697d4a5bd3d 100644 --- a/common/board_r.c +++ b/common/board_r.c @@ -657,9 +657,6 @@ static init_fnc_t init_sequence_r[] = { initr_watchdog, #endif INIT_FUNC_WATCHDOG_RESET -#if defined(CONFIG_NEEDS_MANUAL_RELOC) && defined(CONFIG_BLOCK_CACHE) - blkcache_init, -#endif #ifdef CONFIG_NEEDS_MANUAL_RELOC initr_manual_reloc_cmdtable, #endif -- cgit v1.2.3 From 49c59dd5ca3078a135f85bcd1cb00e57029a1cde Mon Sep 17 00:00:00 2001 From: Marek Vasut Date: Wed, 6 Sep 2023 23:29:44 +0200 Subject: common: board_r: Remove unused NEEDS_MANUAL_RELOC code bits The last user of the NEEDS_MANUAL_RELOC has been removed in commit 26af162ac8f8 ("arch: m68k: Implement relocation") Remove now unused NEEDS_MANUAL_RELOC code. Signed-off-by: Marek Vasut --- common/board_r.c | 22 ---------------------- 1 file changed, 22 deletions(-) (limited to 'common') diff --git a/common/board_r.c b/common/board_r.c index 697d4a5bd3d..630c104a985 100644 --- a/common/board_r.c +++ b/common/board_r.c @@ -151,13 +151,6 @@ static int initr_reloc_global_data(void) */ gd->env_addr += gd->reloc_off; #endif - /* - * The fdt_blob needs to be moved to new relocation address - * incase of FDT blob is embedded with in image - */ - if (IS_ENABLED(CONFIG_OF_EMBED) && IS_ENABLED(CONFIG_NEEDS_MANUAL_RELOC)) - gd->fdt_blob += gd->reloc_off; - #ifdef CONFIG_EFI_LOADER /* * On the ARM architecture gd is mapped to a fixed register (r9 or x18). @@ -295,15 +288,6 @@ static int initr_announce(void) return 0; } -#ifdef CONFIG_NEEDS_MANUAL_RELOC -static int initr_manual_reloc_cmdtable(void) -{ - fixup_cmdtable(ll_entry_start(struct cmd_tbl, cmd), - ll_entry_count(struct cmd_tbl, cmd)); - return 0; -} -#endif - static int initr_binman(void) { int ret; @@ -657,9 +641,6 @@ static init_fnc_t init_sequence_r[] = { initr_watchdog, #endif INIT_FUNC_WATCHDOG_RESET -#ifdef CONFIG_NEEDS_MANUAL_RELOC - initr_manual_reloc_cmdtable, -#endif arch_initr_trap, #if defined(CONFIG_BOARD_EARLY_INIT_R) board_early_init_r, @@ -803,9 +784,6 @@ void board_init_r(gd_t *new_gd, ulong dest_addr) #endif gd->flags &= ~GD_FLG_LOG_READY; - if (IS_ENABLED(CONFIG_NEEDS_MANUAL_RELOC)) - initcall_manual_reloc(init_sequence_r); - if (initcall_run_list(init_sequence_r)) hang(); -- cgit v1.2.3 From bb7c4dcc833f64c1c550d5875c3ec670edcf3e5f Mon Sep 17 00:00:00 2001 From: Marek Vasut Date: Wed, 6 Sep 2023 23:29:45 +0200 Subject: common: hush: Remove unused NEEDS_MANUAL_RELOC code bits The last user of the NEEDS_MANUAL_RELOC has been removed in commit 26af162ac8f8 ("arch: m68k: Implement relocation") Remove now unused NEEDS_MANUAL_RELOC code. Signed-off-by: Marek Vasut --- common/cli_hush.c | 16 ---------------- 1 file changed, 16 deletions(-) (limited to 'common') diff --git a/common/cli_hush.c b/common/cli_hush.c index cee87249bc2..9cda97f30e3 100644 --- a/common/cli_hush.c +++ b/common/cli_hush.c @@ -3305,19 +3305,6 @@ int parse_file_outer(void) } #ifdef __U_BOOT__ -#ifdef CONFIG_NEEDS_MANUAL_RELOC -static void u_boot_hush_reloc(void) -{ - unsigned long addr; - struct reserved_combo *r; - - for (r=reserved_list; rliteral) + gd->reloc_off; - r->literal = (char *)addr; - } -} -#endif - int u_boot_hush_start(void) { if (top_vars == NULL) { @@ -3327,9 +3314,6 @@ int u_boot_hush_start(void) top_vars->next = NULL; top_vars->flg_export = 0; top_vars->flg_read_only = 1; -#ifdef CONFIG_NEEDS_MANUAL_RELOC - u_boot_hush_reloc(); -#endif } return 0; } -- cgit v1.2.3 From 6a595c2f67e0647fc8360c86aa765dff6a667ced Mon Sep 17 00:00:00 2001 From: Marek Vasut Date: Wed, 6 Sep 2023 23:29:46 +0200 Subject: common: malloc: Remove unused NEEDS_MANUAL_RELOC code bits The last user of the NEEDS_MANUAL_RELOC has been removed in commit 26af162ac8f8 ("arch: m68k: Implement relocation") Remove now unused NEEDS_MANUAL_RELOC code. Signed-off-by: Marek Vasut --- common/dlmalloc.c | 14 -------------- 1 file changed, 14 deletions(-) (limited to 'common') diff --git a/common/dlmalloc.c b/common/dlmalloc.c index 0f9b7262d51..ebf0f27e165 100644 --- a/common/dlmalloc.c +++ b/common/dlmalloc.c @@ -575,19 +575,6 @@ static mbinptr av_[NAV * 2 + 2] = { IAV(120), IAV(121), IAV(122), IAV(123), IAV(124), IAV(125), IAV(126), IAV(127) }; -#ifdef CONFIG_NEEDS_MANUAL_RELOC -static void malloc_bin_reloc(void) -{ - mbinptr *p = &av_[2]; - size_t i; - - for (i = 2; i < ARRAY_SIZE(av_); ++i, ++p) - *p = (mbinptr)((ulong)*p + gd->reloc_off); -} -#else -static inline void malloc_bin_reloc(void) {} -#endif - #ifdef CONFIG_SYS_MALLOC_DEFAULT_TO_INIT static void malloc_init(void); #endif @@ -634,7 +621,6 @@ void mem_malloc_init(ulong start, ulong size) #ifdef CONFIG_SYS_MALLOC_CLEAR_ON_INIT memset((void *)mem_malloc_start, 0x0, size); #endif - malloc_bin_reloc(); } /* field-extraction macros */ -- cgit v1.2.3 From 1ee16b268d09d2e0427e3bcc2b56b5e27bbadfa3 Mon Sep 17 00:00:00 2001 From: Marek Vasut Date: Wed, 6 Sep 2023 23:29:47 +0200 Subject: common: event: Remove unused NEEDS_MANUAL_RELOC code bits The last user of the NEEDS_MANUAL_RELOC has been removed in commit 26af162ac8f8 ("arch: m68k: Implement relocation") Remove now unused NEEDS_MANUAL_RELOC code. Signed-off-by: Marek Vasut --- common/board_r.c | 3 --- common/event.c | 14 -------------- 2 files changed, 17 deletions(-) (limited to 'common') diff --git a/common/board_r.c b/common/board_r.c index 630c104a985..e30963339cf 100644 --- a/common/board_r.c +++ b/common/board_r.c @@ -590,9 +590,6 @@ static init_fnc_t init_sequence_r[] = { */ #endif initr_reloc_global_data, -#if IS_ENABLED(CONFIG_NEEDS_MANUAL_RELOC) && CONFIG_IS_ENABLED(EVENT) - event_manual_reloc, -#endif #if defined(CONFIG_SYS_INIT_RAM_LOCK) && defined(CONFIG_E500) initr_unlock_ram_in_cache, #endif diff --git a/common/event.c b/common/event.c index d11b37a1d80..3080d9ed754 100644 --- a/common/event.c +++ b/common/event.c @@ -168,20 +168,6 @@ void event_show_spy_list(void) } } -#if IS_ENABLED(CONFIG_NEEDS_MANUAL_RELOC) -int event_manual_reloc(void) -{ - struct evspy_info *spy, *end; - - spy = ll_entry_start(struct evspy_info, evspy_info); - end = ll_entry_end(struct evspy_info, evspy_info); - for (; spy < end; spy++) - MANUAL_RELOC(spy->func); - - return 0; -} -#endif - #if CONFIG_IS_ENABLED(EVENT_DYNAMIC) static void spy_free(struct event_spy *spy) { -- cgit v1.2.3 From 7bce7e8a9683cf6f89df32aac376ebf01585cae2 Mon Sep 17 00:00:00 2001 From: Marek Vasut Date: Wed, 6 Sep 2023 23:29:48 +0200 Subject: common: hash: Remove unused NEEDS_MANUAL_RELOC code bits The last user of the NEEDS_MANUAL_RELOC has been removed in commit 26af162ac8f8 ("arch: m68k: Implement relocation") Remove now unused NEEDS_MANUAL_RELOC code. Signed-off-by: Marek Vasut --- common/hash.c | 29 ----------------------------- 1 file changed, 29 deletions(-) (limited to 'common') diff --git a/common/hash.c b/common/hash.c index 159179e7f21..e837c56d443 100644 --- a/common/hash.c +++ b/common/hash.c @@ -36,12 +36,6 @@ #include #include -#if !defined(USE_HOSTCC) && defined(CONFIG_NEEDS_MANUAL_RELOC) -DECLARE_GLOBAL_DATA_PTR; -#endif - -static void reloc_update(void); - static int __maybe_unused hash_init_sha1(struct hash_algo *algo, void **ctxp) { sha1_context *ctx = malloc(sizeof(sha1_context)); @@ -333,31 +327,10 @@ static struct hash_algo hash_algo[] = { #define multi_hash() 0 #endif -static void reloc_update(void) -{ -#if !defined(USE_HOSTCC) && defined(CONFIG_NEEDS_MANUAL_RELOC) - int i; - static bool done; - - if (!done) { - done = true; - for (i = 0; i < ARRAY_SIZE(hash_algo); i++) { - hash_algo[i].name += gd->reloc_off; - hash_algo[i].hash_func_ws += gd->reloc_off; - hash_algo[i].hash_init += gd->reloc_off; - hash_algo[i].hash_update += gd->reloc_off; - hash_algo[i].hash_finish += gd->reloc_off; - } - } -#endif -} - int hash_lookup_algo(const char *algo_name, struct hash_algo **algop) { int i; - reloc_update(); - for (i = 0; i < ARRAY_SIZE(hash_algo); i++) { if (!strcmp(algo_name, hash_algo[i].name)) { *algop = &hash_algo[i]; @@ -374,8 +347,6 @@ int hash_progressive_lookup_algo(const char *algo_name, { int i; - reloc_update(); - for (i = 0; i < ARRAY_SIZE(hash_algo); i++) { if (!strcmp(algo_name, hash_algo[i].name)) { if (hash_algo[i].hash_init) { -- cgit v1.2.3 From 47512b2e26e3625de731906652ee15915ebac57c Mon Sep 17 00:00:00 2001 From: Marek Vasut Date: Wed, 6 Sep 2023 23:29:49 +0200 Subject: common: stdio: Remove unused NEEDS_MANUAL_RELOC code bits The last user of the NEEDS_MANUAL_RELOC has been removed in commit 26af162ac8f8 ("arch: m68k: Implement relocation") Remove now unused NEEDS_MANUAL_RELOC code. Signed-off-by: Marek Vasut --- common/stdio.c | 12 ------------ 1 file changed, 12 deletions(-) (limited to 'common') diff --git a/common/stdio.c b/common/stdio.c index 894cbd3fb44..010bf576af0 100644 --- a/common/stdio.c +++ b/common/stdio.c @@ -293,18 +293,6 @@ int stdio_deregister_dev(struct stdio_dev *dev, int force) int stdio_init_tables(void) { -#if defined(CONFIG_NEEDS_MANUAL_RELOC) - /* already relocated for current ARM implementation */ - ulong relocation_offset = gd->reloc_off; - int i; - - /* relocate device name pointers */ - for (i = 0; i < (sizeof (stdio_names) / sizeof (char *)); ++i) { - stdio_names[i] = (char *) (((ulong) stdio_names[i]) + - relocation_offset); - } -#endif /* CONFIG_NEEDS_MANUAL_RELOC */ - /* Initialize the list */ INIT_LIST_HEAD(&devs.list); -- cgit v1.2.3 From a8246503b1556852c03d7450c2a6b0e2e9b073ed Mon Sep 17 00:00:00 2001 From: Marek Vasut Date: Wed, 6 Sep 2023 23:29:50 +0200 Subject: cmd: bmp: Remove unused NEEDS_MANUAL_RELOC code bits The last user of the NEEDS_MANUAL_RELOC has been removed in commit 26af162ac8f8 ("arch: m68k: Implement relocation") Remove now unused NEEDS_MANUAL_RELOC code. Signed-off-by: Marek Vasut --- common/bmp.c | 7 ------- 1 file changed, 7 deletions(-) (limited to 'common') diff --git a/common/bmp.c b/common/bmp.c index 57764f3653e..bab6fa7265a 100644 --- a/common/bmp.c +++ b/common/bmp.c @@ -81,13 +81,6 @@ struct bmp_image *gunzip_bmp(unsigned long addr, unsigned long *lenp, return bmp; } -#ifdef CONFIG_NEEDS_MANUAL_RELOC -void bmp_reloc(void) -{ - fixup_cmdtable(cmd_bmp_sub, ARRAY_SIZE(cmd_bmp_sub)); -} -#endif - int bmp_info(ulong addr) { struct bmp_image *bmp = (struct bmp_image *)map_sysmem(addr, 0); -- cgit v1.2.3 From edd6042d450286d98b20667b20f1ca4e5c579ee0 Mon Sep 17 00:00:00 2001 From: Marek Vasut Date: Fri, 1 Sep 2023 11:49:55 +0200 Subject: dfu: Detach the controller on error In case anything errors out during the DFU registration, detach the controller instead of bailing out right away. This way, the controller can be reattached on next attempt. Reviewed-by: Mattijs Korpershoek Signed-off-by: Marek Vasut --- common/dfu.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'common') diff --git a/common/dfu.c b/common/dfu.c index 96190889ab7..32fba84da16 100644 --- a/common/dfu.c +++ b/common/dfu.c @@ -34,7 +34,8 @@ int run_usb_dnl_gadget(int usbctrl_index, char *usb_dnl_gadget) ret = g_dnl_register(usb_dnl_gadget); if (ret) { pr_err("g_dnl_register failed"); - return CMD_RET_FAILURE; + ret = CMD_RET_FAILURE; + goto err_detach; } #ifdef CONFIG_DFU_TIMEOUT @@ -106,6 +107,7 @@ int run_usb_dnl_gadget(int usbctrl_index, char *usb_dnl_gadget) } exit: g_dnl_unregister(); +err_detach: usb_gadget_release(usbctrl_index); if (dfu_reset) -- cgit v1.2.3 From 2dfae17512ec8fec4a44dbc35fb444ab2ed3b156 Mon Sep 17 00:00:00 2001 From: Marek Vasut Date: Fri, 1 Sep 2023 11:49:56 +0200 Subject: dfu: Use plain udevice for UDC controller interaction Convert to plain udevice interaction with UDC controller device, avoid the use of UDC uclass dev_array . Reviewed-by: Mattijs Korpershoek Signed-off-by: Marek Vasut --- common/dfu.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) (limited to 'common') diff --git a/common/dfu.c b/common/dfu.c index 32fba84da16..45206b9e225 100644 --- a/common/dfu.c +++ b/common/dfu.c @@ -23,11 +23,12 @@ int run_usb_dnl_gadget(int usbctrl_index, char *usb_dnl_gadget) { bool dfu_reset = false; + struct udevice *udc; int ret, i = 0; - ret = usb_gadget_initialize(usbctrl_index); + ret = udc_device_get_by_index(usbctrl_index, &udc); if (ret) { - pr_err("usb_gadget_initialize failed\n"); + pr_err("udc_device_get_by_index failed\n"); return CMD_RET_FAILURE; } g_dnl_clear_detach(); @@ -55,7 +56,7 @@ int run_usb_dnl_gadget(int usbctrl_index, char *usb_dnl_gadget) } /* - * This extra number of usb_gadget_handle_interrupts() + * This extra number of dm_usb_gadget_handle_interrupts() * calls is necessary to assure correct transmission * completion with dfu-util */ @@ -68,7 +69,7 @@ int run_usb_dnl_gadget(int usbctrl_index, char *usb_dnl_gadget) if (dfu_get_defer_flush()) { /* - * Call to usb_gadget_handle_interrupts() is necessary + * Call to dm_usb_gadget_handle_interrupts() is necessary * to act on ZLP OUT transaction from HOST PC after * transmitting the whole file. * @@ -77,7 +78,7 @@ int run_usb_dnl_gadget(int usbctrl_index, char *usb_dnl_gadget) * 5 seconds). In such situation the dfu-util program * exits with error message. */ - usb_gadget_handle_interrupts(usbctrl_index); + dm_usb_gadget_handle_interrupts(udc); ret = dfu_flush(dfu_get_defer_flush(), NULL, 0, 0); dfu_set_defer_flush(NULL); if (ret) { @@ -103,12 +104,12 @@ int run_usb_dnl_gadget(int usbctrl_index, char *usb_dnl_gadget) goto exit; schedule(); - usb_gadget_handle_interrupts(usbctrl_index); + dm_usb_gadget_handle_interrupts(udc); } exit: g_dnl_unregister(); err_detach: - usb_gadget_release(usbctrl_index); + udc_device_put(udc); if (dfu_reset) do_reset(NULL, 0, 0, NULL); -- cgit v1.2.3 From 99924db71f61ffb155cd4d0ce640376019126de8 Mon Sep 17 00:00:00 2001 From: Marek Vasut Date: Fri, 1 Sep 2023 11:49:57 +0200 Subject: spl: sdp: Detach the controller on error In case anything errors out during the SDP transfer, detach the controller instead of bailing out right away. This way, the controller can be reattached on next attempt. Reviewed-by: Mattijs Korpershoek Signed-off-by: Marek Vasut --- common/spl/spl_sdp.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'common') diff --git a/common/spl/spl_sdp.c b/common/spl/spl_sdp.c index cc4fb4f7cca..aae886d2e57 100644 --- a/common/spl/spl_sdp.c +++ b/common/spl/spl_sdp.c @@ -25,13 +25,13 @@ static int spl_sdp_load_image(struct spl_image_info *spl_image, ret = g_dnl_register("usb_dnl_sdp"); if (ret) { pr_err("SDP dnl register failed: %d\n", ret); - return ret; + goto err_detach; } ret = sdp_init(controller_index); if (ret) { pr_err("SDP init failed: %d\n", ret); - return -ENODEV; + goto err_unregister; } /* @@ -42,6 +42,9 @@ static int spl_sdp_load_image(struct spl_image_info *spl_image, ret = spl_sdp_handle(controller_index, spl_image, bootdev); debug("SDP ended\n"); +err_unregister: + g_dnl_unregister(); +err_detach: usb_gadget_release(controller_index); return ret; } -- cgit v1.2.3 From 6b84acc978d39d2e46ddceab292ae67174c66b40 Mon Sep 17 00:00:00 2001 From: Marek Vasut Date: Fri, 1 Sep 2023 11:49:58 +0200 Subject: sdp: Use plain udevice for UDC controller interaction Convert to plain udevice interaction with UDC controller device, avoid the use of UDC uclass dev_array . Reviewed-by: Mattijs Korpershoek Signed-off-by: Marek Vasut --- common/spl/spl_sdp.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'common') diff --git a/common/spl/spl_sdp.c b/common/spl/spl_sdp.c index aae886d2e57..5a5ccd0676c 100644 --- a/common/spl/spl_sdp.c +++ b/common/spl/spl_sdp.c @@ -14,10 +14,13 @@ static int spl_sdp_load_image(struct spl_image_info *spl_image, struct spl_boot_device *bootdev) { - int ret; const int controller_index = CONFIG_SPL_SDP_USB_DEV; + struct udevice *udc; + int ret; - usb_gadget_initialize(controller_index); + ret = udc_device_get_by_index(controller_index, &udc); + if (ret) + return ret; board_usb_init(controller_index, USB_INIT_DEVICE); @@ -28,7 +31,7 @@ static int spl_sdp_load_image(struct spl_image_info *spl_image, goto err_detach; } - ret = sdp_init(controller_index); + ret = sdp_init(udc); if (ret) { pr_err("SDP init failed: %d\n", ret); goto err_unregister; @@ -39,13 +42,13 @@ static int spl_sdp_load_image(struct spl_image_info *spl_image, * or it loads a FIT image and returns it to be handled by the SPL * code. */ - ret = spl_sdp_handle(controller_index, spl_image, bootdev); + ret = spl_sdp_handle(udc, spl_image, bootdev); debug("SDP ended\n"); err_unregister: g_dnl_unregister(); err_detach: - usb_gadget_release(controller_index); + udc_device_put(udc); return ret; } SPL_LOAD_IMAGE_METHOD("USB SDP", 0, BOOT_DEVICE_BOARD, spl_sdp_load_image); -- cgit v1.2.3 From 8168359160525c57e54e294a00abb8db43a8cee1 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Thu, 14 Sep 2023 10:55:41 -0600 Subject: video: Move bmp code to drivers/video This relates to graphics which is only active when CONFIG_VIDEO is enabled. Move it into that directory. For most boards there is no harm in compiling it always, since it if not used it will be dropped by the linker. But for the EFI app this is not the case, so retain use of the BMP Kconfig. Signed-off-by: Simon Glass Reviewed-by: Tom Rini --- common/Makefile | 1 - common/bmp.c | 142 -------------------------------------------------------- 2 files changed, 143 deletions(-) delete mode 100644 common/bmp.c (limited to 'common') diff --git a/common/Makefile b/common/Makefile index f5c3d90f067..0a3f75f2f1c 100644 --- a/common/Makefile +++ b/common/Makefile @@ -45,7 +45,6 @@ endif # !CONFIG_SPL_BUILD obj-$(CONFIG_$(SPL_TPL_)BOOTSTAGE) += bootstage.o obj-$(CONFIG_$(SPL_TPL_)BLOBLIST) += bloblist.o -obj-$(CONFIG_$(SPL_)BMP) += bmp.o ifdef CONFIG_SPL_BUILD ifdef CONFIG_SPL_DFU diff --git a/common/bmp.c b/common/bmp.c deleted file mode 100644 index bab6fa7265a..00000000000 --- a/common/bmp.c +++ /dev/null @@ -1,142 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0+ -/* - * (C) Copyright 2002 - * Detlev Zundel, DENX Software Engineering, dzu@denx.de. - */ - -/* - * BMP handling routines - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/* - * Allocate and decompress a BMP image using gunzip(). - * - * Returns a pointer to the decompressed image data. This pointer is - * aligned to 32-bit-aligned-address + 2. - * See doc/README.displaying-bmps for explanation. - * - * The allocation address is passed to 'alloc_addr' and must be freed - * by the caller after use. - * - * Returns NULL if decompression failed, or if the decompressed data - * didn't contain a valid BMP signature or decompression is not enabled in - * Kconfig. - */ -struct bmp_image *gunzip_bmp(unsigned long addr, unsigned long *lenp, - void **alloc_addr) -{ - void *dst; - unsigned long len; - struct bmp_image *bmp; - - if (!CONFIG_IS_ENABLED(VIDEO_BMP_GZIP)) - return NULL; - - /* - * Decompress bmp image - */ - len = CONFIG_VAL(VIDEO_LOGO_MAX_SIZE); - /* allocate extra 3 bytes for 32-bit-aligned-address + 2 alignment */ - dst = malloc(CONFIG_VAL(VIDEO_LOGO_MAX_SIZE) + 3); - if (!dst) { - puts("Error: malloc in gunzip failed!\n"); - return NULL; - } - - /* align to 32-bit-aligned-address + 2 */ - bmp = dst + 2; - - if (gunzip(bmp, CONFIG_VAL(VIDEO_LOGO_MAX_SIZE), map_sysmem(addr, 0), - &len)) { - free(dst); - return NULL; - } - if (len == CONFIG_VAL(VIDEO_LOGO_MAX_SIZE)) - puts("Image could be truncated (increase CONFIG_VIDEO_LOGO_MAX_SIZE)!\n"); - - /* - * Check for bmp mark 'BM' - */ - if (!((bmp->header.signature[0] == 'B') && - (bmp->header.signature[1] == 'M'))) { - free(dst); - return NULL; - } - - debug("Gzipped BMP image detected!\n"); - - *alloc_addr = dst; - return bmp; -} - -int bmp_info(ulong addr) -{ - struct bmp_image *bmp = (struct bmp_image *)map_sysmem(addr, 0); - void *bmp_alloc_addr = NULL; - unsigned long len; - - if (!((bmp->header.signature[0] == 'B') && - (bmp->header.signature[1] == 'M'))) - bmp = gunzip_bmp(addr, &len, &bmp_alloc_addr); - - if (!bmp) { - printf("There is no valid bmp file at the given address\n"); - return 1; - } - - printf("Image size : %d x %d\n", le32_to_cpu(bmp->header.width), - le32_to_cpu(bmp->header.height)); - printf("Bits per pixel: %d\n", le16_to_cpu(bmp->header.bit_count)); - printf("Compression : %d\n", le32_to_cpu(bmp->header.compression)); - - if (bmp_alloc_addr) - free(bmp_alloc_addr); - - return 0; -} - -int bmp_display(ulong addr, int x, int y) -{ - struct udevice *dev; - int ret; - struct bmp_image *bmp = map_sysmem(addr, 0); - void *bmp_alloc_addr = NULL; - unsigned long len; - - if (!((bmp->header.signature[0] == 'B') && - (bmp->header.signature[1] == 'M'))) - bmp = gunzip_bmp(addr, &len, &bmp_alloc_addr); - - if (!bmp) { - printf("There is no valid bmp file at the given address\n"); - return 1; - } - addr = map_to_sysmem(bmp); - - ret = uclass_first_device_err(UCLASS_VIDEO, &dev); - if (!ret) { - bool align = false; - - if (x == BMP_ALIGN_CENTER || y == BMP_ALIGN_CENTER) - align = true; - - ret = video_bmp_display(dev, addr, x, y, align); - } - - if (bmp_alloc_addr) - free(bmp_alloc_addr); - - return ret ? CMD_RET_FAILURE : 0; -} -- cgit v1.2.3 From 31b097a26540887b7c57552dd7dbbf7fb76dfe61 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Thu, 14 Sep 2023 10:55:42 -0600 Subject: video: Move the BMP options These appear prominently in the main menu at present. Move them to the video Kconfig where they belong. Signed-off-by: Simon Glass Reviewed-by: Tom Rini --- common/Kconfig | 11 ----------- 1 file changed, 11 deletions(-) (limited to 'common') diff --git a/common/Kconfig b/common/Kconfig index d916194b942..d11292f52c2 100644 --- a/common/Kconfig +++ b/common/Kconfig @@ -1168,14 +1168,3 @@ config FDT_SIMPLEFB config IO_TRACE bool - -config BMP - bool "Enable bmp image display" - help - Enable bmp functions to display bmp image and get bmp info. - -config SPL_BMP - bool "Enable bmp image display at SPL" - depends on SPL_VIDEO - help - Enable bmp functions to display bmp image and get bmp info at SPL. -- cgit v1.2.3 From b1a4b46734af68d734978cd5220b1af33d124814 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Thu, 14 Sep 2023 10:55:45 -0600 Subject: boot: Move fdt_support to boot/ This relates to booting since it fixes up the devicetree for the OS. Move it into the boot/ directory. Signed-off-by: Simon Glass Reviewed-by: Tom Rini --- common/Makefile | 2 - common/fdt_support.c | 2150 -------------------------------------------------- 2 files changed, 2152 deletions(-) delete mode 100644 common/fdt_support.c (limited to 'common') diff --git a/common/Makefile b/common/Makefile index 0a3f75f2f1c..0948721d0b4 100644 --- a/common/Makefile +++ b/common/Makefile @@ -18,7 +18,6 @@ obj-$(CONFIG_DISPLAY_BOARDINFO) += board_info.o obj-$(CONFIG_DISPLAY_BOARDINFO_LATE) += board_info.o obj-$(CONFIG_FDT_SIMPLEFB) += fdt_simplefb.o -obj-$(CONFIG_$(SPL_TPL_)OF_LIBFDT) += fdt_support.o obj-$(CONFIG_MII) += miiphyutil.o obj-$(CONFIG_CMD_MII) += miiphyutil.o obj-$(CONFIG_PHYLIB) += miiphyutil.o @@ -51,7 +50,6 @@ ifdef CONFIG_SPL_DFU obj-$(CONFIG_DFU_OVER_USB) += dfu.o endif obj-$(CONFIG_SPL_NET) += miiphyutil.o -obj-$(CONFIG_$(SPL_TPL_)OF_LIBFDT) += fdt_support.o obj-$(CONFIG_SPL_USB_HOST) += usb.o usb_hub.o obj-$(CONFIG_SPL_USB_STORAGE) += usb_storage.o diff --git a/common/fdt_support.c b/common/fdt_support.c deleted file mode 100644 index 5e49078f8c3..00000000000 --- a/common/fdt_support.c +++ /dev/null @@ -1,2150 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0+ -/* - * (C) Copyright 2007 - * Gerald Van Baren, Custom IDEAS, vanbaren@cideas.com - * - * Copyright 2010-2011 Freescale Semiconductor, Inc. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/** - * fdt_getprop_u32_default_node - Return a node's property or a default - * - * @fdt: ptr to device tree - * @off: offset of node - * @cell: cell offset in property - * @prop: property name - * @dflt: default value if the property isn't found - * - * Convenience function to return a node's property or a default value if - * the property doesn't exist. - */ -u32 fdt_getprop_u32_default_node(const void *fdt, int off, int cell, - const char *prop, const u32 dflt) -{ - const fdt32_t *val; - int len; - - val = fdt_getprop(fdt, off, prop, &len); - - /* Check if property exists */ - if (!val) - return dflt; - - /* Check if property is long enough */ - if (len < ((cell + 1) * sizeof(uint32_t))) - return dflt; - - return fdt32_to_cpu(*val); -} - -/** - * fdt_getprop_u32_default - Find a node and return it's property or a default - * - * @fdt: ptr to device tree - * @path: path of node - * @prop: property name - * @dflt: default value if the property isn't found - * - * Convenience function to find a node and return it's property or a - * default value if it doesn't exist. - */ -u32 fdt_getprop_u32_default(const void *fdt, const char *path, - const char *prop, const u32 dflt) -{ - int off; - - off = fdt_path_offset(fdt, path); - if (off < 0) - return dflt; - - return fdt_getprop_u32_default_node(fdt, off, 0, prop, dflt); -} - -/** - * fdt_find_and_setprop: Find a node and set it's property - * - * @fdt: ptr to device tree - * @node: path of node - * @prop: property name - * @val: ptr to new value - * @len: length of new property value - * @create: flag to create the property if it doesn't exist - * - * Convenience function to directly set a property given the path to the node. - */ -int fdt_find_and_setprop(void *fdt, const char *node, const char *prop, - const void *val, int len, int create) -{ - int nodeoff = fdt_path_offset(fdt, node); - - if (nodeoff < 0) - return nodeoff; - - if ((!create) && (fdt_get_property(fdt, nodeoff, prop, NULL) == NULL)) - return 0; /* create flag not set; so exit quietly */ - - return fdt_setprop(fdt, nodeoff, prop, val, len); -} - -/** - * fdt_find_or_add_subnode() - find or possibly add a subnode of a given node - * - * @fdt: pointer to the device tree blob - * @parentoffset: structure block offset of a node - * @name: name of the subnode to locate - * - * fdt_subnode_offset() finds a subnode of the node with a given name. - * If the subnode does not exist, it will be created. - */ -int fdt_find_or_add_subnode(void *fdt, int parentoffset, const char *name) -{ - int offset; - - offset = fdt_subnode_offset(fdt, parentoffset, name); - - if (offset == -FDT_ERR_NOTFOUND) - offset = fdt_add_subnode(fdt, parentoffset, name); - - if (offset < 0) - printf("%s: %s: %s\n", __func__, name, fdt_strerror(offset)); - - return offset; -} - -#if defined(CONFIG_OF_STDOUT_VIA_ALIAS) && defined(CONFIG_CONS_INDEX) -static int fdt_fixup_stdout(void *fdt, int chosenoff) -{ - int err; - int aliasoff; - char sername[9] = { 0 }; - const void *path; - int len; - char tmp[256]; /* long enough */ - - sprintf(sername, "serial%d", CONFIG_CONS_INDEX - 1); - - aliasoff = fdt_path_offset(fdt, "/aliases"); - if (aliasoff < 0) { - err = aliasoff; - goto noalias; - } - - path = fdt_getprop(fdt, aliasoff, sername, &len); - if (!path) { - err = len; - goto noalias; - } - - /* fdt_setprop may break "path" so we copy it to tmp buffer */ - memcpy(tmp, path, len); - - err = fdt_setprop(fdt, chosenoff, "linux,stdout-path", tmp, len); - if (err < 0) - printf("WARNING: could not set linux,stdout-path %s.\n", - fdt_strerror(err)); - - return err; - -noalias: - printf("WARNING: %s: could not read %s alias: %s\n", - __func__, sername, fdt_strerror(err)); - - return 0; -} -#else -static int fdt_fixup_stdout(void *fdt, int chosenoff) -{ - return 0; -} -#endif - -static inline int fdt_setprop_uxx(void *fdt, int nodeoffset, const char *name, - uint64_t val, int is_u64) -{ - if (is_u64) - return fdt_setprop_u64(fdt, nodeoffset, name, val); - else - return fdt_setprop_u32(fdt, nodeoffset, name, (uint32_t)val); -} - -int fdt_root(void *fdt) -{ - char *serial; - int err; - - err = fdt_check_header(fdt); - if (err < 0) { - printf("fdt_root: %s\n", fdt_strerror(err)); - return err; - } - - serial = env_get("serial#"); - if (serial) { - err = fdt_setprop(fdt, 0, "serial-number", serial, - strlen(serial) + 1); - - if (err < 0) { - printf("WARNING: could not set serial-number %s.\n", - fdt_strerror(err)); - return err; - } - } - - return 0; -} - -int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end) -{ - int nodeoffset; - int err, j, total; - int is_u64; - uint64_t addr, size; - - /* just return if the size of initrd is zero */ - if (initrd_start == initrd_end) - return 0; - - /* find or create "/chosen" node. */ - nodeoffset = fdt_find_or_add_subnode(fdt, 0, "chosen"); - if (nodeoffset < 0) - return nodeoffset; - - total = fdt_num_mem_rsv(fdt); - - /* - * Look for an existing entry and update it. If we don't find - * the entry, we will j be the next available slot. - */ - for (j = 0; j < total; j++) { - err = fdt_get_mem_rsv(fdt, j, &addr, &size); - if (addr == initrd_start) { - fdt_del_mem_rsv(fdt, j); - break; - } - } - - err = fdt_add_mem_rsv(fdt, initrd_start, initrd_end - initrd_start); - if (err < 0) { - printf("fdt_initrd: %s\n", fdt_strerror(err)); - return err; - } - - is_u64 = (fdt_address_cells(fdt, 0) == 2); - - err = fdt_setprop_uxx(fdt, nodeoffset, "linux,initrd-start", - (uint64_t)initrd_start, is_u64); - - if (err < 0) { - printf("WARNING: could not set linux,initrd-start %s.\n", - fdt_strerror(err)); - return err; - } - - err = fdt_setprop_uxx(fdt, nodeoffset, "linux,initrd-end", - (uint64_t)initrd_end, is_u64); - - if (err < 0) { - printf("WARNING: could not set linux,initrd-end %s.\n", - fdt_strerror(err)); - - return err; - } - - return 0; -} - -/** - * board_fdt_chosen_bootargs - boards may override this function to use - * alternative kernel command line arguments - */ -__weak char *board_fdt_chosen_bootargs(void) -{ - return env_get("bootargs"); -} - -int fdt_chosen(void *fdt) -{ - struct abuf buf = {}; - int nodeoffset; - int err; - char *str; /* used to set string properties */ - - err = fdt_check_header(fdt); - if (err < 0) { - printf("fdt_chosen: %s\n", fdt_strerror(err)); - return err; - } - - /* find or create "/chosen" node. */ - nodeoffset = fdt_find_or_add_subnode(fdt, 0, "chosen"); - if (nodeoffset < 0) - return nodeoffset; - - if (IS_ENABLED(CONFIG_BOARD_RNG_SEED) && !board_rng_seed(&buf)) { - err = fdt_setprop(fdt, nodeoffset, "rng-seed", - abuf_data(&buf), abuf_size(&buf)); - abuf_uninit(&buf); - if (err < 0) { - printf("WARNING: could not set rng-seed %s.\n", - fdt_strerror(err)); - return err; - } - } - - str = board_fdt_chosen_bootargs(); - - if (str) { - err = fdt_setprop(fdt, nodeoffset, "bootargs", str, - strlen(str) + 1); - if (err < 0) { - printf("WARNING: could not set bootargs %s.\n", - fdt_strerror(err)); - return err; - } - } - - /* add u-boot version */ - err = fdt_setprop(fdt, nodeoffset, "u-boot,version", PLAIN_VERSION, - strlen(PLAIN_VERSION) + 1); - if (err < 0) { - printf("WARNING: could not set u-boot,version %s.\n", - fdt_strerror(err)); - return err; - } - - return fdt_fixup_stdout(fdt, nodeoffset); -} - -void do_fixup_by_path(void *fdt, const char *path, const char *prop, - const void *val, int len, int create) -{ -#if defined(DEBUG) - int i; - debug("Updating property '%s/%s' = ", path, prop); - for (i = 0; i < len; i++) - debug(" %.2x", *(u8*)(val+i)); - debug("\n"); -#endif - int rc = fdt_find_and_setprop(fdt, path, prop, val, len, create); - if (rc) - printf("Unable to update property %s:%s, err=%s\n", - path, prop, fdt_strerror(rc)); -} - -void do_fixup_by_path_u32(void *fdt, const char *path, const char *prop, - u32 val, int create) -{ - fdt32_t tmp = cpu_to_fdt32(val); - do_fixup_by_path(fdt, path, prop, &tmp, sizeof(tmp), create); -} - -void do_fixup_by_prop(void *fdt, - const char *pname, const void *pval, int plen, - const char *prop, const void *val, int len, - int create) -{ - int off; -#if defined(DEBUG) - int i; - debug("Updating property '%s' = ", prop); - for (i = 0; i < len; i++) - debug(" %.2x", *(u8*)(val+i)); - debug("\n"); -#endif - off = fdt_node_offset_by_prop_value(fdt, -1, pname, pval, plen); - while (off != -FDT_ERR_NOTFOUND) { - if (create || (fdt_get_property(fdt, off, prop, NULL) != NULL)) - fdt_setprop(fdt, off, prop, val, len); - off = fdt_node_offset_by_prop_value(fdt, off, pname, pval, plen); - } -} - -void do_fixup_by_prop_u32(void *fdt, - const char *pname, const void *pval, int plen, - const char *prop, u32 val, int create) -{ - fdt32_t tmp = cpu_to_fdt32(val); - do_fixup_by_prop(fdt, pname, pval, plen, prop, &tmp, 4, create); -} - -void do_fixup_by_compat(void *fdt, const char *compat, - const char *prop, const void *val, int len, int create) -{ - int off = -1; -#if defined(DEBUG) - int i; - debug("Updating property '%s' = ", prop); - for (i = 0; i < len; i++) - debug(" %.2x", *(u8*)(val+i)); - debug("\n"); -#endif - fdt_for_each_node_by_compatible(off, fdt, -1, compat) - if (create || (fdt_get_property(fdt, off, prop, NULL) != NULL)) - fdt_setprop(fdt, off, prop, val, len); -} - -void do_fixup_by_compat_u32(void *fdt, const char *compat, - const char *prop, u32 val, int create) -{ - fdt32_t tmp = cpu_to_fdt32(val); - do_fixup_by_compat(fdt, compat, prop, &tmp, 4, create); -} - -#ifdef CONFIG_ARCH_FIXUP_FDT_MEMORY -/* - * fdt_pack_reg - pack address and size array into the "reg"-suitable stream - */ -static int fdt_pack_reg(const void *fdt, void *buf, u64 *address, u64 *size, - int n) -{ - int i; - int address_cells = fdt_address_cells(fdt, 0); - int size_cells = fdt_size_cells(fdt, 0); - char *p = buf; - - for (i = 0; i < n; i++) { - if (address_cells == 2) - *(fdt64_t *)p = cpu_to_fdt64(address[i]); - else - *(fdt32_t *)p = cpu_to_fdt32(address[i]); - p += 4 * address_cells; - - if (size_cells == 2) - *(fdt64_t *)p = cpu_to_fdt64(size[i]); - else - *(fdt32_t *)p = cpu_to_fdt32(size[i]); - p += 4 * size_cells; - } - - return p - (char *)buf; -} - -#if CONFIG_NR_DRAM_BANKS > 4 -#define MEMORY_BANKS_MAX CONFIG_NR_DRAM_BANKS -#else -#define MEMORY_BANKS_MAX 4 -#endif - -/** - * fdt_fixup_memory_banks - Update DT memory node - * @blob: Pointer to DT blob - * @start: Pointer to memory start addresses array - * @size: Pointer to memory sizes array - * @banks: Number of memory banks - * - * Return: 0 on success, negative value on failure - * - * Based on the passed number of banks and arrays, the function is able to - * update existing DT memory nodes to match run time detected/changed memory - * configuration. Implementation is handling one specific case with only one - * memory node where multiple tuples could be added/updated. - * The case where multiple memory nodes with a single tuple (base, size) are - * used, this function is only updating the first memory node without removing - * others. - */ -int fdt_fixup_memory_banks(void *blob, u64 start[], u64 size[], int banks) -{ - int err, nodeoffset; - int len, i; - u8 tmp[MEMORY_BANKS_MAX * 16]; /* Up to 64-bit address + 64-bit size */ - - if (banks > MEMORY_BANKS_MAX) { - printf("%s: num banks %d exceeds hardcoded limit %d." - " Recompile with higher MEMORY_BANKS_MAX?\n", - __FUNCTION__, banks, MEMORY_BANKS_MAX); - return -1; - } - - err = fdt_check_header(blob); - if (err < 0) { - printf("%s: %s\n", __FUNCTION__, fdt_strerror(err)); - return err; - } - - /* find or create "/memory" node. */ - nodeoffset = fdt_find_or_add_subnode(blob, 0, "memory"); - if (nodeoffset < 0) - return nodeoffset; - - err = fdt_setprop(blob, nodeoffset, "device_type", "memory", - sizeof("memory")); - if (err < 0) { - printf("WARNING: could not set %s %s.\n", "device_type", - fdt_strerror(err)); - return err; - } - - for (i = 0; i < banks; i++) { - if (start[i] == 0 && size[i] == 0) - break; - } - - banks = i; - - if (!banks) - return 0; - - len = fdt_pack_reg(blob, tmp, start, size, banks); - - err = fdt_setprop(blob, nodeoffset, "reg", tmp, len); - if (err < 0) { - printf("WARNING: could not set %s %s.\n", - "reg", fdt_strerror(err)); - return err; - } - return 0; -} - -int fdt_set_usable_memory(void *blob, u64 start[], u64 size[], int areas) -{ - int err, nodeoffset; - int len; - u8 tmp[8 * 16]; /* Up to 64-bit address + 64-bit size */ - - if (areas > 8) { - printf("%s: num areas %d exceeds hardcoded limit %d\n", - __func__, areas, 8); - return -1; - } - - err = fdt_check_header(blob); - if (err < 0) { - printf("%s: %s\n", __func__, fdt_strerror(err)); - return err; - } - - /* find or create "/memory" node. */ - nodeoffset = fdt_find_or_add_subnode(blob, 0, "memory"); - if (nodeoffset < 0) - return nodeoffset; - - len = fdt_pack_reg(blob, tmp, start, size, areas); - - err = fdt_setprop(blob, nodeoffset, "linux,usable-memory", tmp, len); - if (err < 0) { - printf("WARNING: could not set %s %s.\n", - "reg", fdt_strerror(err)); - return err; - } - - return 0; -} -#endif - -int fdt_fixup_memory(void *blob, u64 start, u64 size) -{ - return fdt_fixup_memory_banks(blob, &start, &size, 1); -} - -void fdt_fixup_ethernet(void *fdt) -{ - int i = 0, j, prop; - char *tmp, *end; - char mac[16]; - const char *path; - unsigned char mac_addr[ARP_HLEN]; - int offset; -#ifdef FDT_SEQ_MACADDR_FROM_ENV - int nodeoff; - const struct fdt_property *fdt_prop; -#endif - - if (fdt_path_offset(fdt, "/aliases") < 0) - return; - - /* Cycle through all aliases */ - for (prop = 0; ; prop++) { - const char *name; - - /* FDT might have been edited, recompute the offset */ - offset = fdt_first_property_offset(fdt, - fdt_path_offset(fdt, "/aliases")); - /* Select property number 'prop' */ - for (j = 0; j < prop; j++) - offset = fdt_next_property_offset(fdt, offset); - - if (offset < 0) - break; - - path = fdt_getprop_by_offset(fdt, offset, &name, NULL); - if (!strncmp(name, "ethernet", 8)) { - /* Treat plain "ethernet" same as "ethernet0". */ - if (!strcmp(name, "ethernet") -#ifdef FDT_SEQ_MACADDR_FROM_ENV - || !strcmp(name, "ethernet0") -#endif - ) - i = 0; -#ifndef FDT_SEQ_MACADDR_FROM_ENV - else - i = trailing_strtol(name); -#endif - if (i != -1) { - if (i == 0) - strcpy(mac, "ethaddr"); - else - sprintf(mac, "eth%daddr", i); - } else { - continue; - } -#ifdef FDT_SEQ_MACADDR_FROM_ENV - nodeoff = fdt_path_offset(fdt, path); - fdt_prop = fdt_get_property(fdt, nodeoff, "status", - NULL); - if (fdt_prop && !strcmp(fdt_prop->data, "disabled")) - continue; - i++; -#endif - tmp = env_get(mac); - if (!tmp) - continue; - - for (j = 0; j < 6; j++) { - mac_addr[j] = tmp ? - hextoul(tmp, &end) : 0; - if (tmp) - tmp = (*end) ? end + 1 : end; - } - - do_fixup_by_path(fdt, path, "mac-address", - &mac_addr, 6, 0); - do_fixup_by_path(fdt, path, "local-mac-address", - &mac_addr, 6, 1); - } - } -} - -int fdt_record_loadable(void *blob, u32 index, const char *name, - uintptr_t load_addr, u32 size, uintptr_t entry_point, - const char *type, const char *os, const char *arch) -{ - int err, node; - - err = fdt_check_header(blob); - if (err < 0) { - printf("%s: %s\n", __func__, fdt_strerror(err)); - return err; - } - - /* find or create "/fit-images" node */ - node = fdt_find_or_add_subnode(blob, 0, "fit-images"); - if (node < 0) - return node; - - /* find or create "/fit-images/" node */ - node = fdt_find_or_add_subnode(blob, node, name); - if (node < 0) - return node; - - fdt_setprop_u64(blob, node, "load", load_addr); - if (entry_point != -1) - fdt_setprop_u64(blob, node, "entry", entry_point); - fdt_setprop_u32(blob, node, "size", size); - if (type) - fdt_setprop_string(blob, node, "type", type); - if (os) - fdt_setprop_string(blob, node, "os", os); - if (arch) - fdt_setprop_string(blob, node, "arch", arch); - - return node; -} - -/* Resize the fdt to its actual size + a bit of padding */ -int fdt_shrink_to_minimum(void *blob, uint extrasize) -{ - int i; - uint64_t addr, size; - int total, ret; - uint actualsize; - int fdt_memrsv = 0; - - if (!blob) - return 0; - - total = fdt_num_mem_rsv(blob); - for (i = 0; i < total; i++) { - fdt_get_mem_rsv(blob, i, &addr, &size); - if (addr == (uintptr_t)blob) { - fdt_del_mem_rsv(blob, i); - fdt_memrsv = 1; - break; - } - } - - /* - * Calculate the actual size of the fdt - * plus the size needed for 5 fdt_add_mem_rsv, one - * for the fdt itself and 4 for a possible initrd - * ((initrd-start + initrd-end) * 2 (name & value)) - */ - actualsize = fdt_off_dt_strings(blob) + - fdt_size_dt_strings(blob) + 5 * sizeof(struct fdt_reserve_entry); - - actualsize += extrasize; - /* Make it so the fdt ends on a page boundary */ - actualsize = ALIGN(actualsize + ((uintptr_t)blob & 0xfff), 0x1000); - actualsize = actualsize - ((uintptr_t)blob & 0xfff); - - /* Change the fdt header to reflect the correct size */ - fdt_set_totalsize(blob, actualsize); - - if (fdt_memrsv) { - /* Add the new reservation */ - ret = fdt_add_mem_rsv(blob, map_to_sysmem(blob), actualsize); - if (ret < 0) - return ret; - } - - return actualsize; -} - -/** - * fdt_delete_disabled_nodes: Delete all nodes with status == "disabled" - * - * @blob: ptr to device tree - */ -int fdt_delete_disabled_nodes(void *blob) -{ - while (1) { - int ret, offset; - - offset = fdt_node_offset_by_prop_value(blob, -1, "status", - "disabled", 9); - if (offset < 0) - break; - - ret = fdt_del_node(blob, offset); - if (ret < 0) - return ret; - } - - return 0; -} - -#ifdef CONFIG_PCI -#define CFG_SYS_PCI_NR_INBOUND_WIN 4 - -#define FDT_PCI_PREFETCH (0x40000000) -#define FDT_PCI_MEM32 (0x02000000) -#define FDT_PCI_IO (0x01000000) -#define FDT_PCI_MEM64 (0x03000000) - -int fdt_pci_dma_ranges(void *blob, int phb_off, struct pci_controller *hose) { - - int addrcell, sizecell, len, r; - u32 *dma_range; - /* sized based on pci addr cells, size-cells, & address-cells */ - u32 dma_ranges[(3 + 2 + 2) * CFG_SYS_PCI_NR_INBOUND_WIN]; - - addrcell = fdt_getprop_u32_default(blob, "/", "#address-cells", 1); - sizecell = fdt_getprop_u32_default(blob, "/", "#size-cells", 1); - - dma_range = &dma_ranges[0]; - for (r = 0; r < hose->region_count; r++) { - u64 bus_start, phys_start, size; - - /* skip if !PCI_REGION_SYS_MEMORY */ - if (!(hose->regions[r].flags & PCI_REGION_SYS_MEMORY)) - continue; - - bus_start = (u64)hose->regions[r].bus_start; - phys_start = (u64)hose->regions[r].phys_start; - size = (u64)hose->regions[r].size; - - dma_range[0] = 0; - if (size >= 0x100000000ull) - dma_range[0] |= cpu_to_fdt32(FDT_PCI_MEM64); - else - dma_range[0] |= cpu_to_fdt32(FDT_PCI_MEM32); - if (hose->regions[r].flags & PCI_REGION_PREFETCH) - dma_range[0] |= cpu_to_fdt32(FDT_PCI_PREFETCH); -#ifdef CONFIG_SYS_PCI_64BIT - dma_range[1] = cpu_to_fdt32(bus_start >> 32); -#else - dma_range[1] = 0; -#endif - dma_range[2] = cpu_to_fdt32(bus_start & 0xffffffff); - - if (addrcell == 2) { - dma_range[3] = cpu_to_fdt32(phys_start >> 32); - dma_range[4] = cpu_to_fdt32(phys_start & 0xffffffff); - } else { - dma_range[3] = cpu_to_fdt32(phys_start & 0xffffffff); - } - - if (sizecell == 2) { - dma_range[3 + addrcell + 0] = - cpu_to_fdt32(size >> 32); - dma_range[3 + addrcell + 1] = - cpu_to_fdt32(size & 0xffffffff); - } else { - dma_range[3 + addrcell + 0] = - cpu_to_fdt32(size & 0xffffffff); - } - - dma_range += (3 + addrcell + sizecell); - } - - len = dma_range - &dma_ranges[0]; - if (len) - fdt_setprop(blob, phb_off, "dma-ranges", &dma_ranges[0], len*4); - - return 0; -} -#endif - -int fdt_increase_size(void *fdt, int add_len) -{ - int newlen; - - newlen = fdt_totalsize(fdt) + add_len; - - /* Open in place with a new len */ - return fdt_open_into(fdt, fdt, newlen); -} - -#ifdef CONFIG_FDT_FIXUP_PARTITIONS -#include -#include - -static int fdt_del_subnodes(const void *blob, int parent_offset) -{ - int off, ndepth; - int ret; - - for (ndepth = 0, off = fdt_next_node(blob, parent_offset, &ndepth); - (off >= 0) && (ndepth > 0); - off = fdt_next_node(blob, off, &ndepth)) { - if (ndepth == 1) { - debug("delete %s: offset: %x\n", - fdt_get_name(blob, off, 0), off); - ret = fdt_del_node((void *)blob, off); - if (ret < 0) { - printf("Can't delete node: %s\n", - fdt_strerror(ret)); - return ret; - } else { - ndepth = 0; - off = parent_offset; - } - } - } - return 0; -} - -static int fdt_del_partitions(void *blob, int parent_offset) -{ - const void *prop; - int ndepth = 0; - int off; - int ret; - - off = fdt_next_node(blob, parent_offset, &ndepth); - if (off > 0 && ndepth == 1) { - prop = fdt_getprop(blob, off, "label", NULL); - if (prop == NULL) { - /* - * Could not find label property, nand {}; node? - * Check subnode, delete partitions there if any. - */ - return fdt_del_partitions(blob, off); - } else { - ret = fdt_del_subnodes(blob, parent_offset); - if (ret < 0) { - printf("Can't remove subnodes: %s\n", - fdt_strerror(ret)); - return ret; - } - } - } - return 0; -} - -static int fdt_node_set_part_info(void *blob, int parent_offset, - struct mtd_device *dev) -{ - struct list_head *pentry; - struct part_info *part; - int off, ndepth = 0; - int part_num, ret; - int sizecell; - char buf[64]; - - ret = fdt_del_partitions(blob, parent_offset); - if (ret < 0) - return ret; - - /* - * Check if size/address is 1 or 2 cells. - * We assume #address-cells and #size-cells have same value. - */ - sizecell = fdt_getprop_u32_default_node(blob, parent_offset, - 0, "#size-cells", 1); - - /* - * Check if it is nand {}; subnode, adjust - * the offset in this case - */ - off = fdt_next_node(blob, parent_offset, &ndepth); - if (off > 0 && ndepth == 1) - parent_offset = off; - - part_num = 0; - list_for_each_prev(pentry, &dev->parts) { - int newoff; - - part = list_entry(pentry, struct part_info, link); - - debug("%2d: %-20s0x%08llx\t0x%08llx\t%d\n", - part_num, part->name, part->size, - part->offset, part->mask_flags); - - sprintf(buf, "partition@%llx", part->offset); -add_sub: - ret = fdt_add_subnode(blob, parent_offset, buf); - if (ret == -FDT_ERR_NOSPACE) { - ret = fdt_increase_size(blob, 512); - if (!ret) - goto add_sub; - else - goto err_size; - } else if (ret < 0) { - printf("Can't add partition node: %s\n", - fdt_strerror(ret)); - return ret; - } - newoff = ret; - - /* Check MTD_WRITEABLE_CMD flag */ - if (part->mask_flags & 1) { -add_ro: - ret = fdt_setprop(blob, newoff, "read_only", NULL, 0); - if (ret == -FDT_ERR_NOSPACE) { - ret = fdt_increase_size(blob, 512); - if (!ret) - goto add_ro; - else - goto err_size; - } else if (ret < 0) - goto err_prop; - } - -add_reg: - if (sizecell == 2) { - ret = fdt_setprop_u64(blob, newoff, - "reg", part->offset); - if (!ret) - ret = fdt_appendprop_u64(blob, newoff, - "reg", part->size); - } else { - ret = fdt_setprop_u32(blob, newoff, - "reg", part->offset); - if (!ret) - ret = fdt_appendprop_u32(blob, newoff, - "reg", part->size); - } - - if (ret == -FDT_ERR_NOSPACE) { - ret = fdt_increase_size(blob, 512); - if (!ret) - goto add_reg; - else - goto err_size; - } else if (ret < 0) - goto err_prop; - -add_label: - ret = fdt_setprop_string(blob, newoff, "label", part->name); - if (ret == -FDT_ERR_NOSPACE) { - ret = fdt_increase_size(blob, 512); - if (!ret) - goto add_label; - else - goto err_size; - } else if (ret < 0) - goto err_prop; - - part_num++; - } - return 0; -err_size: - printf("Can't increase blob size: %s\n", fdt_strerror(ret)); - return ret; -err_prop: - printf("Can't add property: %s\n", fdt_strerror(ret)); - return ret; -} - -/* - * Update partitions in nor/nand nodes using info from - * mtdparts environment variable. The nodes to update are - * specified by node_info structure which contains mtd device - * type and compatible string: E. g. the board code in - * ft_board_setup() could use: - * - * struct node_info nodes[] = { - * { "fsl,mpc5121-nfc", MTD_DEV_TYPE_NAND, }, - * { "cfi-flash", MTD_DEV_TYPE_NOR, }, - * }; - * - * fdt_fixup_mtdparts(blob, nodes, ARRAY_SIZE(nodes)); - */ -void fdt_fixup_mtdparts(void *blob, const struct node_info *node_info, - int node_info_size) -{ - struct mtd_device *dev; - int i, idx; - int noff, parts; - bool inited = false; - - for (i = 0; i < node_info_size; i++) { - idx = 0; - - fdt_for_each_node_by_compatible(noff, blob, -1, - node_info[i].compat) { - const char *prop; - - prop = fdt_getprop(blob, noff, "status", NULL); - if (prop && !strcmp(prop, "disabled")) - continue; - - debug("%s: %s, mtd dev type %d\n", - fdt_get_name(blob, noff, 0), - node_info[i].compat, node_info[i].type); - - if (!inited) { - if (mtdparts_init() != 0) - return; - inited = true; - } - - dev = device_find(node_info[i].type, idx++); - if (dev) { - parts = fdt_subnode_offset(blob, noff, - "partitions"); - if (parts < 0) - parts = noff; - - if (fdt_node_set_part_info(blob, parts, dev)) - return; /* return on error */ - } - } - } -} -#endif - -int fdt_copy_fixed_partitions(void *blob) -{ - ofnode node, subnode; - int off, suboff, res; - char path[256]; - int address_cells, size_cells; - u8 i, j, child_count; - - node = ofnode_by_compatible(ofnode_null(), "fixed-partitions"); - while (ofnode_valid(node)) { - /* copy the U-Boot fixed partition */ - address_cells = ofnode_read_simple_addr_cells(node); - size_cells = ofnode_read_simple_size_cells(node); - - res = ofnode_get_path(ofnode_get_parent(node), path, sizeof(path)); - if (res) - return res; - - off = fdt_path_offset(blob, path); - if (off < 0) - return -ENODEV; - - off = fdt_find_or_add_subnode(blob, off, "partitions"); - res = fdt_setprop_string(blob, off, "compatible", "fixed-partitions"); - if (res) - return res; - - res = fdt_setprop_u32(blob, off, "#address-cells", address_cells); - if (res) - return res; - - res = fdt_setprop_u32(blob, off, "#size-cells", size_cells); - if (res) - return res; - - /* - * parse partition in reverse order as fdt_find_or_add_subnode() only - * insert the new node after the parent's properties - */ - child_count = ofnode_get_child_count(node); - for (i = child_count; i > 0 ; i--) { - subnode = ofnode_first_subnode(node); - if (!ofnode_valid(subnode)) - break; - - for (j = 0; (j < i - 1); j++) - subnode = ofnode_next_subnode(subnode); - - if (!ofnode_valid(subnode)) - break; - - const u32 *reg; - int len; - - suboff = fdt_find_or_add_subnode(blob, off, ofnode_get_name(subnode)); - res = fdt_setprop_string(blob, suboff, "label", - ofnode_read_string(subnode, "label")); - if (res) - return res; - - reg = ofnode_get_property(subnode, "reg", &len); - res = fdt_setprop(blob, suboff, "reg", reg, len); - if (res) - return res; - } - - /* go to next fixed-partitions node */ - node = ofnode_by_compatible(node, "fixed-partitions"); - } - - return 0; -} - -void fdt_del_node_and_alias(void *blob, const char *alias) -{ - int off = fdt_path_offset(blob, alias); - - if (off < 0) - return; - - fdt_del_node(blob, off); - - off = fdt_path_offset(blob, "/aliases"); - fdt_delprop(blob, off, alias); -} - -/* Max address size we deal with */ -#define OF_MAX_ADDR_CELLS 4 -#define OF_CHECK_COUNTS(na, ns) ((na) > 0 && (na) <= OF_MAX_ADDR_CELLS && \ - (ns) > 0) - -/* Debug utility */ -#ifdef DEBUG -static void of_dump_addr(const char *s, const fdt32_t *addr, int na) -{ - printf("%s", s); - while(na--) - printf(" %08x", *(addr++)); - printf("\n"); -} -#else -static void of_dump_addr(const char *s, const fdt32_t *addr, int na) { } -#endif - -/** - * struct of_bus - Callbacks for bus specific translators - * @name: A string used to identify this bus in debug output. - * @addresses: The name of the DT property from which addresses are - * to be read, typically "reg". - * @match: Return non-zero if the node whose parent is at - * parentoffset in the FDT blob corresponds to a bus - * of this type, otherwise return zero. If NULL a match - * is assumed. - * @count_cells:Count how many cells (be32 values) a node whose parent - * is at parentoffset in the FDT blob will require to - * represent its address (written to *addrc) & size - * (written to *sizec). - * @map: Map the address addr from the address space of this - * bus to that of its parent, making use of the ranges - * read from DT to an array at range. na and ns are the - * number of cells (be32 values) used to hold and address - * or size, respectively, for this bus. pna is the number - * of cells used to hold an address for the parent bus. - * Returns the address in the address space of the parent - * bus. - * @translate: Update the value of the address cells at addr within an - * FDT by adding offset to it. na specifies the number of - * cells used to hold the address being translated. Returns - * zero on success, non-zero on error. - * - * Each bus type will include a struct of_bus in the of_busses array, - * providing implementations of some or all of the functions used to - * match the bus & handle address translation for its children. - */ -struct of_bus { - const char *name; - const char *addresses; - int (*match)(const void *blob, int parentoffset); - void (*count_cells)(const void *blob, int parentoffset, - int *addrc, int *sizec); - u64 (*map)(fdt32_t *addr, const fdt32_t *range, - int na, int ns, int pna); - int (*translate)(fdt32_t *addr, u64 offset, int na); -}; - -/* Default translator (generic bus) */ -void fdt_support_default_count_cells(const void *blob, int parentoffset, - int *addrc, int *sizec) -{ - const fdt32_t *prop; - - if (addrc) - *addrc = fdt_address_cells(blob, parentoffset); - - if (sizec) { - prop = fdt_getprop(blob, parentoffset, "#size-cells", NULL); - if (prop) - *sizec = be32_to_cpup(prop); - else - *sizec = 1; - } -} - -static u64 of_bus_default_map(fdt32_t *addr, const fdt32_t *range, - int na, int ns, int pna) -{ - u64 cp, s, da; - - cp = fdt_read_number(range, na); - s = fdt_read_number(range + na + pna, ns); - da = fdt_read_number(addr, na); - - debug("OF: default map, cp=%llx, s=%llx, da=%llx\n", cp, s, da); - - if (da < cp || da >= (cp + s)) - return OF_BAD_ADDR; - return da - cp; -} - -static int of_bus_default_translate(fdt32_t *addr, u64 offset, int na) -{ - u64 a = fdt_read_number(addr, na); - memset(addr, 0, na * 4); - a += offset; - if (na > 1) - addr[na - 2] = cpu_to_fdt32(a >> 32); - addr[na - 1] = cpu_to_fdt32(a & 0xffffffffu); - - return 0; -} - -#ifdef CONFIG_OF_ISA_BUS - -/* ISA bus translator */ -static int of_bus_isa_match(const void *blob, int parentoffset) -{ - const char *name; - - name = fdt_get_name(blob, parentoffset, NULL); - if (!name) - return 0; - - return !strcmp(name, "isa"); -} - -static void of_bus_isa_count_cells(const void *blob, int parentoffset, - int *addrc, int *sizec) -{ - if (addrc) - *addrc = 2; - if (sizec) - *sizec = 1; -} - -static u64 of_bus_isa_map(fdt32_t *addr, const fdt32_t *range, - int na, int ns, int pna) -{ - u64 cp, s, da; - - /* Check address type match */ - if ((addr[0] ^ range[0]) & cpu_to_be32(1)) - return OF_BAD_ADDR; - - cp = fdt_read_number(range + 1, na - 1); - s = fdt_read_number(range + na + pna, ns); - da = fdt_read_number(addr + 1, na - 1); - - debug("OF: ISA map, cp=%llx, s=%llx, da=%llx\n", cp, s, da); - - if (da < cp || da >= (cp + s)) - return OF_BAD_ADDR; - return da - cp; -} - -static int of_bus_isa_translate(fdt32_t *addr, u64 offset, int na) -{ - return of_bus_default_translate(addr + 1, offset, na - 1); -} - -#endif /* CONFIG_OF_ISA_BUS */ - -/* Array of bus specific translators */ -static struct of_bus of_busses[] = { -#ifdef CONFIG_OF_ISA_BUS - /* ISA */ - { - .name = "isa", - .addresses = "reg", - .match = of_bus_isa_match, - .count_cells = of_bus_isa_count_cells, - .map = of_bus_isa_map, - .translate = of_bus_isa_translate, - }, -#endif /* CONFIG_OF_ISA_BUS */ - /* Default */ - { - .name = "default", - .addresses = "reg", - .count_cells = fdt_support_default_count_cells, - .map = of_bus_default_map, - .translate = of_bus_default_translate, - }, -}; - -static struct of_bus *of_match_bus(const void *blob, int parentoffset) -{ - struct of_bus *bus; - - if (ARRAY_SIZE(of_busses) == 1) - return of_busses; - - for (bus = of_busses; bus; bus++) { - if (!bus->match || bus->match(blob, parentoffset)) - return bus; - } - - /* - * We should always have matched the default bus at least, since - * it has a NULL match field. If we didn't then it somehow isn't - * in the of_busses array or something equally catastrophic has - * gone wrong. - */ - assert(0); - return NULL; -} - -static int of_translate_one(const void *blob, int parent, struct of_bus *bus, - struct of_bus *pbus, fdt32_t *addr, - int na, int ns, int pna, const char *rprop) -{ - const fdt32_t *ranges; - int rlen; - int rone; - u64 offset = OF_BAD_ADDR; - - /* Normally, an absence of a "ranges" property means we are - * crossing a non-translatable boundary, and thus the addresses - * below the current not cannot be converted to CPU physical ones. - * Unfortunately, while this is very clear in the spec, it's not - * what Apple understood, and they do have things like /uni-n or - * /ht nodes with no "ranges" property and a lot of perfectly - * useable mapped devices below them. Thus we treat the absence of - * "ranges" as equivalent to an empty "ranges" property which means - * a 1:1 translation at that level. It's up to the caller not to try - * to translate addresses that aren't supposed to be translated in - * the first place. --BenH. - */ - ranges = fdt_getprop(blob, parent, rprop, &rlen); - if (ranges == NULL || rlen == 0) { - offset = fdt_read_number(addr, na); - memset(addr, 0, pna * 4); - debug("OF: no ranges, 1:1 translation\n"); - goto finish; - } - - debug("OF: walking ranges...\n"); - - /* Now walk through the ranges */ - rlen /= 4; - rone = na + pna + ns; - for (; rlen >= rone; rlen -= rone, ranges += rone) { - offset = bus->map(addr, ranges, na, ns, pna); - if (offset != OF_BAD_ADDR) - break; - } - if (offset == OF_BAD_ADDR) { - debug("OF: not found !\n"); - return 1; - } - memcpy(addr, ranges + na, 4 * pna); - - finish: - of_dump_addr("OF: parent translation for:", addr, pna); - debug("OF: with offset: %llu\n", offset); - - /* Translate it into parent bus space */ - return pbus->translate(addr, offset, pna); -} - -/* - * Translate an address from the device-tree into a CPU physical address, - * this walks up the tree and applies the various bus mappings on the - * way. - * - * Note: We consider that crossing any level with #size-cells == 0 to mean - * that translation is impossible (that is we are not dealing with a value - * that can be mapped to a cpu physical address). This is not really specified - * that way, but this is traditionally the way IBM at least do things - */ -static u64 __of_translate_address(const void *blob, int node_offset, - const fdt32_t *in_addr, const char *rprop) -{ - int parent; - struct of_bus *bus, *pbus; - fdt32_t addr[OF_MAX_ADDR_CELLS]; - int na, ns, pna, pns; - u64 result = OF_BAD_ADDR; - - debug("OF: ** translation for device %s **\n", - fdt_get_name(blob, node_offset, NULL)); - - /* Get parent & match bus type */ - parent = fdt_parent_offset(blob, node_offset); - if (parent < 0) - goto bail; - bus = of_match_bus(blob, parent); - - /* Cound address cells & copy address locally */ - bus->count_cells(blob, parent, &na, &ns); - if (!OF_CHECK_COUNTS(na, ns)) { - printf("%s: Bad cell count for %s\n", __FUNCTION__, - fdt_get_name(blob, node_offset, NULL)); - goto bail; - } - memcpy(addr, in_addr, na * 4); - - debug("OF: bus is %s (na=%d, ns=%d) on %s\n", - bus->name, na, ns, fdt_get_name(blob, parent, NULL)); - of_dump_addr("OF: translating address:", addr, na); - - /* Translate */ - for (;;) { - /* Switch to parent bus */ - node_offset = parent; - parent = fdt_parent_offset(blob, node_offset); - - /* If root, we have finished */ - if (parent < 0) { - debug("OF: reached root node\n"); - result = fdt_read_number(addr, na); - break; - } - - /* Get new parent bus and counts */ - pbus = of_match_bus(blob, parent); - pbus->count_cells(blob, parent, &pna, &pns); - if (!OF_CHECK_COUNTS(pna, pns)) { - printf("%s: Bad cell count for %s\n", __FUNCTION__, - fdt_get_name(blob, node_offset, NULL)); - break; - } - - debug("OF: parent bus is %s (na=%d, ns=%d) on %s\n", - pbus->name, pna, pns, fdt_get_name(blob, parent, NULL)); - - /* Apply bus translation */ - if (of_translate_one(blob, node_offset, bus, pbus, - addr, na, ns, pna, rprop)) - break; - - /* Complete the move up one level */ - na = pna; - ns = pns; - bus = pbus; - - of_dump_addr("OF: one level translation:", addr, na); - } - bail: - - return result; -} - -u64 fdt_translate_address(const void *blob, int node_offset, - const fdt32_t *in_addr) -{ - return __of_translate_address(blob, node_offset, in_addr, "ranges"); -} - -u64 fdt_translate_dma_address(const void *blob, int node_offset, - const fdt32_t *in_addr) -{ - return __of_translate_address(blob, node_offset, in_addr, "dma-ranges"); -} - -int fdt_get_dma_range(const void *blob, int node, phys_addr_t *cpu, - dma_addr_t *bus, u64 *size) -{ - bool found_dma_ranges = false; - struct of_bus *bus_node; - const fdt32_t *ranges; - int na, ns, pna, pns; - int parent = node; - int ret = 0; - int len; - - /* Find the closest dma-ranges property */ - while (parent >= 0) { - ranges = fdt_getprop(blob, parent, "dma-ranges", &len); - - /* Ignore empty ranges, they imply no translation required */ - if (ranges && len > 0) - break; - - /* Once we find 'dma-ranges', then a missing one is an error */ - if (found_dma_ranges && !ranges) { - ret = -EINVAL; - goto out; - } - - if (ranges) - found_dma_ranges = true; - - parent = fdt_parent_offset(blob, parent); - } - - if (!ranges || parent < 0) { - debug("no dma-ranges found for node %s\n", - fdt_get_name(blob, node, NULL)); - ret = -ENOENT; - goto out; - } - - /* switch to that node */ - node = parent; - parent = fdt_parent_offset(blob, node); - if (parent < 0) { - printf("Found dma-ranges in root node, shouldn't happen\n"); - ret = -EINVAL; - goto out; - } - - /* Get the address sizes both for the bus and its parent */ - bus_node = of_match_bus(blob, node); - bus_node->count_cells(blob, node, &na, &ns); - if (!OF_CHECK_COUNTS(na, ns)) { - printf("%s: Bad cell count for %s\n", __FUNCTION__, - fdt_get_name(blob, node, NULL)); - return -EINVAL; - goto out; - } - - bus_node = of_match_bus(blob, parent); - bus_node->count_cells(blob, parent, &pna, &pns); - if (!OF_CHECK_COUNTS(pna, pns)) { - printf("%s: Bad cell count for %s\n", __FUNCTION__, - fdt_get_name(blob, parent, NULL)); - return -EINVAL; - goto out; - } - - *bus = fdt_read_number(ranges, na); - *cpu = fdt_translate_dma_address(blob, node, ranges + na); - *size = fdt_read_number(ranges + na + pna, ns); -out: - return ret; -} - -/** - * fdt_node_offset_by_compat_reg: Find a node that matches compatible and - * who's reg property matches a physical cpu address - * - * @blob: ptr to device tree - * @compat: compatible string to match - * @compat_off: property name - * - */ -int fdt_node_offset_by_compat_reg(void *blob, const char *compat, - phys_addr_t compat_off) -{ - int len, off; - - fdt_for_each_node_by_compatible(off, blob, -1, compat) { - const fdt32_t *reg = fdt_getprop(blob, off, "reg", &len); - if (reg && compat_off == fdt_translate_address(blob, off, reg)) - return off; - } - - return -FDT_ERR_NOTFOUND; -} - -static int vnode_offset_by_pathf(void *blob, const char *fmt, va_list ap) -{ - char path[512]; - int len; - - len = vsnprintf(path, sizeof(path), fmt, ap); - if (len < 0 || len + 1 > sizeof(path)) - return -FDT_ERR_NOSPACE; - - return fdt_path_offset(blob, path); -} - -/** - * fdt_node_offset_by_pathf: Find node offset by sprintf formatted path - * - * @blob: ptr to device tree - * @fmt: path format - * @ap: vsnprintf arguments - */ -int fdt_node_offset_by_pathf(void *blob, const char *fmt, ...) -{ - va_list ap; - int res; - - va_start(ap, fmt); - res = vnode_offset_by_pathf(blob, fmt, ap); - va_end(ap); - - return res; -} - -/* - * fdt_set_phandle: Create a phandle property for the given node - * - * @fdt: ptr to device tree - * @nodeoffset: node to update - * @phandle: phandle value to set (must be unique) - */ -int fdt_set_phandle(void *fdt, int nodeoffset, uint32_t phandle) -{ - int ret; - -#ifdef DEBUG - int off = fdt_node_offset_by_phandle(fdt, phandle); - - if ((off >= 0) && (off != nodeoffset)) { - char buf[64]; - - fdt_get_path(fdt, nodeoffset, buf, sizeof(buf)); - printf("Trying to update node %s with phandle %u ", - buf, phandle); - - fdt_get_path(fdt, off, buf, sizeof(buf)); - printf("that already exists in node %s.\n", buf); - return -FDT_ERR_BADPHANDLE; - } -#endif - - ret = fdt_setprop_cell(fdt, nodeoffset, "phandle", phandle); - - return ret; -} - -/* - * fdt_create_phandle: Get or create a phandle property for the given node - * - * @fdt: ptr to device tree - * @nodeoffset: node to update - */ -unsigned int fdt_create_phandle(void *fdt, int nodeoffset) -{ - /* see if there is a phandle already */ - uint32_t phandle = fdt_get_phandle(fdt, nodeoffset); - - /* if we got 0, means no phandle so create one */ - if (phandle == 0) { - int ret; - - ret = fdt_generate_phandle(fdt, &phandle); - if (ret < 0) { - printf("Can't generate phandle: %s\n", - fdt_strerror(ret)); - return 0; - } - - ret = fdt_set_phandle(fdt, nodeoffset, phandle); - if (ret < 0) { - printf("Can't set phandle %u: %s\n", phandle, - fdt_strerror(ret)); - return 0; - } - } - - return phandle; -} - -/** - * fdt_create_phandle_by_compatible: Get or create a phandle for first node with - * given compatible - * - * @fdt: ptr to device tree - * @compat: node's compatible string - */ -unsigned int fdt_create_phandle_by_compatible(void *fdt, const char *compat) -{ - int offset = fdt_node_offset_by_compatible(fdt, -1, compat); - - if (offset < 0) { - printf("Can't find node with compatible \"%s\": %s\n", compat, - fdt_strerror(offset)); - return 0; - } - - return fdt_create_phandle(fdt, offset); -} - -/** - * fdt_create_phandle_by_pathf: Get or create a phandle for node given by - * sprintf-formatted path - * - * @fdt: ptr to device tree - * @fmt, ...: path format string and arguments to pass to sprintf - */ -unsigned int fdt_create_phandle_by_pathf(void *fdt, const char *fmt, ...) -{ - va_list ap; - int offset; - - va_start(ap, fmt); - offset = vnode_offset_by_pathf(fdt, fmt, ap); - va_end(ap); - - if (offset < 0) { - printf("Can't find node by given path: %s\n", - fdt_strerror(offset)); - return 0; - } - - return fdt_create_phandle(fdt, offset); -} - -/* - * fdt_set_node_status: Set status for the given node - * - * @fdt: ptr to device tree - * @nodeoffset: node to update - * @status: FDT_STATUS_OKAY, FDT_STATUS_DISABLED, FDT_STATUS_FAIL - */ -int fdt_set_node_status(void *fdt, int nodeoffset, enum fdt_status status) -{ - int ret = 0; - - if (nodeoffset < 0) - return nodeoffset; - - switch (status) { - case FDT_STATUS_OKAY: - ret = fdt_setprop_string(fdt, nodeoffset, "status", "okay"); - break; - case FDT_STATUS_DISABLED: - ret = fdt_setprop_string(fdt, nodeoffset, "status", "disabled"); - break; - case FDT_STATUS_FAIL: - ret = fdt_setprop_string(fdt, nodeoffset, "status", "fail"); - break; - default: - printf("Invalid fdt status: %x\n", status); - ret = -1; - break; - } - - return ret; -} - -/* - * fdt_set_status_by_alias: Set status for the given node given an alias - * - * @fdt: ptr to device tree - * @alias: alias of node to update - * @status: FDT_STATUS_OKAY, FDT_STATUS_DISABLED, FDT_STATUS_FAIL - */ -int fdt_set_status_by_alias(void *fdt, const char* alias, - enum fdt_status status) -{ - int offset = fdt_path_offset(fdt, alias); - - return fdt_set_node_status(fdt, offset, status); -} - -/** - * fdt_set_status_by_compatible: Set node status for first node with given - * compatible - * - * @fdt: ptr to device tree - * @compat: node's compatible string - * @status: FDT_STATUS_OKAY, FDT_STATUS_DISABLED, FDT_STATUS_FAIL - */ -int fdt_set_status_by_compatible(void *fdt, const char *compat, - enum fdt_status status) -{ - int offset = fdt_node_offset_by_compatible(fdt, -1, compat); - - if (offset < 0) - return offset; - - return fdt_set_node_status(fdt, offset, status); -} - -/** - * fdt_set_status_by_pathf: Set node status for node given by sprintf-formatted - * path - * - * @fdt: ptr to device tree - * @status: FDT_STATUS_OKAY, FDT_STATUS_DISABLED, FDT_STATUS_FAIL - * @fmt, ...: path format string and arguments to pass to sprintf - */ -int fdt_set_status_by_pathf(void *fdt, enum fdt_status status, const char *fmt, - ...) -{ - va_list ap; - int offset; - - va_start(ap, fmt); - offset = vnode_offset_by_pathf(fdt, fmt, ap); - va_end(ap); - - if (offset < 0) - return offset; - - return fdt_set_node_status(fdt, offset, status); -} - -/* - * Verify the physical address of device tree node for a given alias - * - * This function locates the device tree node of a given alias, and then - * verifies that the physical address of that device matches the given - * parameter. It displays a message if there is a mismatch. - * - * Returns 1 on success, 0 on failure - */ -int fdt_verify_alias_address(void *fdt, int anode, const char *alias, u64 addr) -{ - const char *path; - const fdt32_t *reg; - int node, len; - u64 dt_addr; - - path = fdt_getprop(fdt, anode, alias, NULL); - if (!path) { - /* If there's no such alias, then it's not a failure */ - return 1; - } - - node = fdt_path_offset(fdt, path); - if (node < 0) { - printf("Warning: device tree alias '%s' points to invalid " - "node %s.\n", alias, path); - return 0; - } - - reg = fdt_getprop(fdt, node, "reg", &len); - if (!reg) { - printf("Warning: device tree node '%s' has no address.\n", - path); - return 0; - } - - dt_addr = fdt_translate_address(fdt, node, reg); - if (addr != dt_addr) { - printf("Warning: U-Boot configured device %s at address %llu,\n" - "but the device tree has it address %llx.\n", - alias, addr, dt_addr); - return 0; - } - - return 1; -} - -/* - * Returns the base address of an SOC or PCI node - */ -u64 fdt_get_base_address(const void *fdt, int node) -{ - int size; - const fdt32_t *prop; - - prop = fdt_getprop(fdt, node, "reg", &size); - - return prop ? fdt_translate_address(fdt, node, prop) : OF_BAD_ADDR; -} - -/* - * Read a property of size . Currently only supports 1 or 2 cells, - * or 3 cells specially for a PCI address. - */ -static int fdt_read_prop(const fdt32_t *prop, int prop_len, int cell_off, - uint64_t *val, int cells) -{ - const fdt32_t *prop32; - const unaligned_fdt64_t *prop64; - - if ((cell_off + cells) > prop_len) - return -FDT_ERR_NOSPACE; - - prop32 = &prop[cell_off]; - - /* - * Special handling for PCI address in PCI bus - * - * PCI child address is made up of 3 cells. Advance the cell offset - * by 1 so that the PCI child address can be correctly read. - */ - if (cells == 3) - cell_off += 1; - prop64 = (const fdt64_t *)&prop[cell_off]; - - switch (cells) { - case 1: - *val = fdt32_to_cpu(*prop32); - break; - case 2: - case 3: - *val = fdt64_to_cpu(*prop64); - break; - default: - return -FDT_ERR_NOSPACE; - } - - return 0; -} - -/** - * fdt_read_range - Read a node's n'th range property - * - * @fdt: ptr to device tree - * @node: offset of node - * @n: range index - * @child_addr: pointer to storage for the "child address" field - * @addr: pointer to storage for the CPU view translated physical start - * @len: pointer to storage for the range length - * - * Convenience function that reads and interprets a specific range out of - * a number of the "ranges" property array. - */ -int fdt_read_range(void *fdt, int node, int n, uint64_t *child_addr, - uint64_t *addr, uint64_t *len) -{ - int pnode = fdt_parent_offset(fdt, node); - const fdt32_t *ranges; - int pacells; - int acells; - int scells; - int ranges_len; - int cell = 0; - int r = 0; - - /* - * The "ranges" property is an array of - * { } - * - * All 3 elements can span a diffent number of cells. Fetch their size. - */ - pacells = fdt_getprop_u32_default_node(fdt, pnode, 0, "#address-cells", 1); - acells = fdt_getprop_u32_default_node(fdt, node, 0, "#address-cells", 1); - scells = fdt_getprop_u32_default_node(fdt, node, 0, "#size-cells", 1); - - /* Now try to get the ranges property */ - ranges = fdt_getprop(fdt, node, "ranges", &ranges_len); - if (!ranges) - return -FDT_ERR_NOTFOUND; - ranges_len /= sizeof(uint32_t); - - /* Jump to the n'th entry */ - cell = n * (pacells + acells + scells); - - /* Read */ - if (child_addr) { - r = fdt_read_prop(ranges, ranges_len, cell, child_addr, - acells); - if (r) - return r; - } - cell += acells; - - /* Read */ - if (addr) - *addr = fdt_translate_address(fdt, node, ranges + cell); - cell += pacells; - - /* Read */ - if (len) { - r = fdt_read_prop(ranges, ranges_len, cell, len, scells); - if (r) - return r; - } - - return 0; -} - -/** - * fdt_setup_simplefb_node - Fill and enable a simplefb node - * - * @fdt: ptr to device tree - * @node: offset of the simplefb node - * @base_address: framebuffer base address - * @width: width in pixels - * @height: height in pixels - * @stride: bytes per line - * @format: pixel format string - * - * Convenience function to fill and enable a simplefb node. - */ -int fdt_setup_simplefb_node(void *fdt, int node, u64 base_address, u32 width, - u32 height, u32 stride, const char *format) -{ - char name[32]; - fdt32_t cells[4]; - int i, addrc, sizec, ret; - - fdt_support_default_count_cells(fdt, fdt_parent_offset(fdt, node), - &addrc, &sizec); - i = 0; - if (addrc == 2) - cells[i++] = cpu_to_fdt32(base_address >> 32); - cells[i++] = cpu_to_fdt32(base_address); - if (sizec == 2) - cells[i++] = 0; - cells[i++] = cpu_to_fdt32(height * stride); - - ret = fdt_setprop(fdt, node, "reg", cells, sizeof(cells[0]) * i); - if (ret < 0) - return ret; - - snprintf(name, sizeof(name), "framebuffer@%llx", base_address); - ret = fdt_set_name(fdt, node, name); - if (ret < 0) - return ret; - - ret = fdt_setprop_u32(fdt, node, "width", width); - if (ret < 0) - return ret; - - ret = fdt_setprop_u32(fdt, node, "height", height); - if (ret < 0) - return ret; - - ret = fdt_setprop_u32(fdt, node, "stride", stride); - if (ret < 0) - return ret; - - ret = fdt_setprop_string(fdt, node, "format", format); - if (ret < 0) - return ret; - - ret = fdt_setprop_string(fdt, node, "status", "okay"); - if (ret < 0) - return ret; - - return 0; -} - -/* - * Update native-mode in display-timings from display environment variable. - * The node to update are specified by path. - */ -int fdt_fixup_display(void *blob, const char *path, const char *display) -{ - int off, toff; - - if (!display || !path) - return -FDT_ERR_NOTFOUND; - - toff = fdt_path_offset(blob, path); - if (toff >= 0) - toff = fdt_subnode_offset(blob, toff, "display-timings"); - if (toff < 0) - return toff; - - for (off = fdt_first_subnode(blob, toff); - off >= 0; - off = fdt_next_subnode(blob, off)) { - uint32_t h = fdt_get_phandle(blob, off); - debug("%s:0x%x\n", fdt_get_name(blob, off, NULL), - fdt32_to_cpu(h)); - if (strcasecmp(fdt_get_name(blob, off, NULL), display) == 0) - return fdt_setprop_u32(blob, toff, "native-mode", h); - } - return toff; -} - -#ifdef CONFIG_OF_LIBFDT_OVERLAY -/** - * fdt_overlay_apply_verbose - Apply an overlay with verbose error reporting - * - * @fdt: ptr to device tree - * @fdto: ptr to device tree overlay - * - * Convenience function to apply an overlay and display helpful messages - * in the case of an error - */ -int fdt_overlay_apply_verbose(void *fdt, void *fdto) -{ - int err; - bool has_symbols; - - err = fdt_path_offset(fdt, "/__symbols__"); - has_symbols = err >= 0; - - err = fdt_overlay_apply(fdt, fdto); - if (err < 0) { - printf("failed on fdt_overlay_apply(): %s\n", - fdt_strerror(err)); - if (!has_symbols) { - printf("base fdt does did not have a /__symbols__ node\n"); - printf("make sure you've compiled with -@\n"); - } - } - return err; -} -#endif - -/** - * fdt_valid() - Check if an FDT is valid. If not, change it to NULL - * - * @blobp: Pointer to FDT pointer - * Return: 1 if OK, 0 if bad (in which case *blobp is set to NULL) - */ -int fdt_valid(struct fdt_header **blobp) -{ - const void *blob = *blobp; - int err; - - if (!blob) { - printf("The address of the fdt is invalid (NULL).\n"); - return 0; - } - - err = fdt_check_header(blob); - if (err == 0) - return 1; /* valid */ - - if (err < 0) { - printf("libfdt fdt_check_header(): %s", fdt_strerror(err)); - /* - * Be more informative on bad version. - */ - if (err == -FDT_ERR_BADVERSION) { - if (fdt_version(blob) < - FDT_FIRST_SUPPORTED_VERSION) { - printf(" - too old, fdt %d < %d", - fdt_version(blob), - FDT_FIRST_SUPPORTED_VERSION); - } - if (fdt_last_comp_version(blob) > - FDT_LAST_SUPPORTED_VERSION) { - printf(" - too new, fdt %d > %d", - fdt_version(blob), - FDT_LAST_SUPPORTED_VERSION); - } - } - printf("\n"); - *blobp = NULL; - return 0; - } - return 1; -} -- cgit v1.2.3 From ddc5f9b13ec6665e480e3415a3cd2a3e5668cb4d Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Thu, 14 Sep 2023 10:55:46 -0600 Subject: Move fdt_simplefb to boot/ This relates to booting, so move it there. Create a new Kconfig menu for things related to devicetree fixup. Signed-off-by: Simon Glass Reviewed-by: Tom Rini --- common/Kconfig | 9 ---- common/Makefile | 1 - common/fdt_simplefb.c | 116 -------------------------------------------------- 3 files changed, 126 deletions(-) delete mode 100644 common/fdt_simplefb.c (limited to 'common') diff --git a/common/Kconfig b/common/Kconfig index d11292f52c2..21eaa5e815f 100644 --- a/common/Kconfig +++ b/common/Kconfig @@ -1157,14 +1157,5 @@ config VPL_IMAGE_SIGN_INFO endif -config FDT_SIMPLEFB - bool "FDT tools for simplefb support" - depends on OF_LIBFDT - help - Enable the fdt tools to manage the simple fb nodes in device tree. - These functions can be used by board to indicate to the OS - the presence of the simple frame buffer with associated reserved - memory - config IO_TRACE bool diff --git a/common/Makefile b/common/Makefile index 0948721d0b4..5c1617206f0 100644 --- a/common/Makefile +++ b/common/Makefile @@ -17,7 +17,6 @@ obj-y += board_r.o obj-$(CONFIG_DISPLAY_BOARDINFO) += board_info.o obj-$(CONFIG_DISPLAY_BOARDINFO_LATE) += board_info.o -obj-$(CONFIG_FDT_SIMPLEFB) += fdt_simplefb.o obj-$(CONFIG_MII) += miiphyutil.o obj-$(CONFIG_CMD_MII) += miiphyutil.o obj-$(CONFIG_PHYLIB) += miiphyutil.o diff --git a/common/fdt_simplefb.c b/common/fdt_simplefb.c deleted file mode 100644 index 069ced75a7f..00000000000 --- a/common/fdt_simplefb.c +++ /dev/null @@ -1,116 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0+ -/* - * Simplefb device tree support - * - * (C) Copyright 2015 - * Stephen Warren - */ - -#include -#include -#include -#include -#include -#include - -DECLARE_GLOBAL_DATA_PTR; - -static int fdt_simplefb_configure_node(void *blob, int off) -{ - int xsize, ysize; - int bpix; /* log2 of bits per pixel */ - const char *name; - ulong fb_base; - struct video_uc_plat *plat; - struct video_priv *uc_priv; - struct udevice *dev; - int ret; - - ret = uclass_first_device_err(UCLASS_VIDEO, &dev); - if (ret) - return ret; - uc_priv = dev_get_uclass_priv(dev); - plat = dev_get_uclass_plat(dev); - xsize = uc_priv->xsize; - ysize = uc_priv->ysize; - bpix = uc_priv->bpix; - fb_base = plat->base; - switch (bpix) { - case 4: /* VIDEO_BPP16 */ - name = "r5g6b5"; - break; - case 5: /* VIDEO_BPP32 */ - name = "a8r8g8b8"; - break; - default: - return -EINVAL; - } - - return fdt_setup_simplefb_node(blob, off, fb_base, xsize, ysize, - xsize * (1 << bpix) / 8, name); -} - -int fdt_simplefb_add_node(void *blob) -{ - static const char compat[] = "simple-framebuffer"; - static const char disabled[] = "disabled"; - int off, ret; - - off = fdt_add_subnode(blob, 0, "framebuffer"); - if (off < 0) - return -1; - - ret = fdt_setprop(blob, off, "status", disabled, sizeof(disabled)); - if (ret < 0) - return -1; - - ret = fdt_setprop(blob, off, "compatible", compat, sizeof(compat)); - if (ret < 0) - return -1; - - return fdt_simplefb_configure_node(blob, off); -} - -/** - * fdt_simplefb_enable_existing_node() - enable simple-framebuffer DT node - * - * @blob: device-tree - * Return: 0 on success, non-zero otherwise - */ -static int fdt_simplefb_enable_existing_node(void *blob) -{ - int off; - - off = fdt_node_offset_by_compatible(blob, -1, "simple-framebuffer"); - if (off < 0) - return -1; - - return fdt_simplefb_configure_node(blob, off); -} - -#if IS_ENABLED(CONFIG_VIDEO) -int fdt_simplefb_enable_and_mem_rsv(void *blob) -{ - struct fdt_memory mem; - int ret; - - /* nothing to do when video is not active */ - if (!video_is_active()) - return 0; - - ret = fdt_simplefb_enable_existing_node(blob); - if (ret) - return ret; - - /* nothing to do when the frame buffer is not defined */ - if (gd->video_bottom == gd->video_top) - return 0; - - /* reserved with no-map tag the video buffer */ - mem.start = gd->video_bottom; - mem.end = gd->video_top - 1; - - return fdtdec_add_reserved_memory(blob, "framebuffer", &mem, NULL, 0, NULL, - FDTDEC_RESERVED_MEMORY_NO_MAP); -} -#endif -- cgit v1.2.3 From 63f0da65e16ff50a3f011b1107fcae67b24b4afb Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Thu, 14 Sep 2023 10:55:50 -0600 Subject: spl: Tidy up load address in spl_ram This CONFIG is used but is not given a value by some boards. Use a default value of 0 explicitly, rather than relying on the 0 value provided by CONFIG_SPL_LOAD_FIT_ADDRESS This will allow us to make SPL_LOAD_FIT_ADDRESS depend on SPL_LOAD_FIT as it should. Signed-off-by: Simon Glass Reviewed-by: Tom Rini --- common/spl/spl_ram.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) (limited to 'common') diff --git a/common/spl/spl_ram.c b/common/spl/spl_ram.c index 93cf420d810..4158ed1c32d 100644 --- a/common/spl/spl_ram.c +++ b/common/spl/spl_ram.c @@ -20,12 +20,16 @@ static ulong spl_ram_load_read(struct spl_load_info *load, ulong sector, ulong count, void *buf) { - ulong addr; + ulong addr = 0; debug("%s: sector %lx, count %lx, buf %lx\n", __func__, sector, count, (ulong)buf); - addr = (ulong)CONFIG_SPL_LOAD_FIT_ADDRESS + sector; + if (IS_ENABLED(CONFIG_SPL_LOAD_FIT)) { + addr = IF_ENABLED_INT(CONFIG_SPL_LOAD_FIT, + CONFIG_SPL_LOAD_FIT_ADDRESS); + } + addr += sector; if (CONFIG_IS_ENABLED(IMAGE_PRE_LOAD)) addr += image_load_offset; @@ -38,20 +42,23 @@ static int spl_ram_load_image(struct spl_image_info *spl_image, struct spl_boot_device *bootdev) { struct legacy_img_hdr *header; + ulong addr = 0; int ret; - header = (struct legacy_img_hdr *)CONFIG_SPL_LOAD_FIT_ADDRESS; + if (IS_ENABLED(CONFIG_SPL_LOAD_FIT)) { + addr = IF_ENABLED_INT(CONFIG_SPL_LOAD_FIT, + CONFIG_SPL_LOAD_FIT_ADDRESS); + } if (CONFIG_IS_ENABLED(IMAGE_PRE_LOAD)) { - unsigned long addr = (unsigned long)header; ret = image_pre_load(addr); if (ret) return ret; addr += image_load_offset; - header = (struct legacy_img_hdr *)addr; } + header = map_sysmem(addr, 0); #if CONFIG_IS_ENABLED(DFU) if (bootdev->boot_device == BOOT_DEVICE_DFU) @@ -84,7 +91,7 @@ static int spl_ram_load_image(struct spl_image_info *spl_image, u_boot_pos = (ulong)spl_get_load_buffer(-sizeof(*header), sizeof(*header)); } - header = (struct legacy_img_hdr *)map_sysmem(u_boot_pos, 0); + header = map_sysmem(u_boot_pos, 0); ret = spl_parse_image_header(spl_image, bootdev, header); } -- cgit v1.2.3 From 15a23b6f167ac89d9be8c1c676309253865e446f Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Thu, 7 Sep 2023 09:58:13 -0600 Subject: dm: core: Allow marking driver model as dead On x86 devices we use CAR (Cache-As-RAM) to hold the malloc() region in SPL, since SDRAM is not set up yet. This means that driver model stores its tables in this region. When preparing to jump from SPL to U-Boot proper, we must disable CAR, so that the CPU can uses the caches normally. This means that driver model tables become inaccessible. From there until we jump to U-Boot proper, we must avoid using driver model. This is only a problem on boards which operate this way, for example chromebook_link64 Add a flag to indicate that driver model is dead and should not be used. It can be used in SPL to avoid hanging the machine. Signed-off-by: Simon Glass Reviewed-by: Bin Meng --- common/spl/spl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'common') diff --git a/common/spl/spl.c b/common/spl/spl.c index 0062f3f45d9..045a5e89625 100644 --- a/common/spl/spl.c +++ b/common/spl/spl.c @@ -800,7 +800,7 @@ void board_init_r(gd_t *dummy1, ulong dummy2) IS_ENABLED(CONFIG_SPL_ATF)) dram_init_banksize(); - if (CONFIG_IS_ENABLED(PCI)) { + if (CONFIG_IS_ENABLED(PCI) && !(gd->flags & GD_FLG_DM_DEAD)) { ret = pci_init(); if (ret) puts(SPL_TPL_PROMPT "Cannot initialize PCI\n"); -- cgit v1.2.3 From 1e94b46f73cedcebbff73799203f3266c5b28d90 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Thu, 14 Sep 2023 18:21:46 -0600 Subject: common: Drop linux/printk.h from common header This old patch was marked as deferred. Bring it back to life, to continue towards the removal of common.h Move this out of the common header and include it only where needed. Signed-off-by: Simon Glass --- common/dfu.c | 1 + common/spl/spl_dfu.c | 1 + common/spl/spl_fit.c | 1 + common/spl/spl_opensbi.c | 1 + common/spl/spl_sdp.c | 1 + common/update.c | 1 + 6 files changed, 6 insertions(+) (limited to 'common') diff --git a/common/dfu.c b/common/dfu.c index 45206b9e225..0d154e8d4c4 100644 --- a/common/dfu.c +++ b/common/dfu.c @@ -19,6 +19,7 @@ #include #include #include +#include int run_usb_dnl_gadget(int usbctrl_index, char *usb_dnl_gadget) { diff --git a/common/spl/spl_dfu.c b/common/spl/spl_dfu.c index 5728d43ad3f..8a779da8fa1 100644 --- a/common/spl/spl_dfu.c +++ b/common/spl/spl_dfu.c @@ -15,6 +15,7 @@ #include #include #include +#include static int run_dfu(int usb_index, char *interface, char *devstring) { diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c index 730639f7562..cd73b256565 100644 --- a/common/spl/spl_fit.c +++ b/common/spl/spl_fit.c @@ -17,6 +17,7 @@ #include #include #include +#include DECLARE_GLOBAL_DATA_PTR; diff --git a/common/spl/spl_opensbi.c b/common/spl/spl_opensbi.c index b0f40076c34..9e98a566f89 100644 --- a/common/spl/spl_opensbi.c +++ b/common/spl/spl_opensbi.c @@ -15,6 +15,7 @@ #include #include #include +#include DECLARE_GLOBAL_DATA_PTR; diff --git a/common/spl/spl_sdp.c b/common/spl/spl_sdp.c index 5a5ccd0676c..9143c27bbf1 100644 --- a/common/spl/spl_sdp.c +++ b/common/spl/spl_sdp.c @@ -10,6 +10,7 @@ #include #include #include +#include static int spl_sdp_load_image(struct spl_image_info *spl_image, struct spl_boot_device *bootdev) diff --git a/common/update.c b/common/update.c index 3502713d7d8..ec302ca68fb 100644 --- a/common/update.c +++ b/common/update.c @@ -9,6 +9,7 @@ #include #include #include +#include #include #include -- cgit v1.2.3 From 6ab77bb14f61906b7ce0c486ebe46dbeab0502f3 Mon Sep 17 00:00:00 2001 From: Jesse Taube Date: Thu, 24 Aug 2023 21:59:48 -0400 Subject: Convert CFG_SYS_UBOOT_START to Kconfig Commit 65cc0e2a65d2 ("global: Move remaining CONFIG_SYS_* to CFG_SYS_*") renamed CONFIG_SYS_UBOOT_START to CFG_SYS_UBOOT_START. Unfortunately, this meant that the value was no longer available to the Makefile. This caused imxrt to fail to boot. All the other boards that used this variable were unaffected because they were using the default value which is CONFIG_TEXT_BASE. This commit converts CFG_SYS_UBOOT_START to Kconfig and sets the default value to CONFIG_TEXT_BASE. Suggested-by: Marek Vasut Suggested-by: Tom Rini Signed-off-by: Jesse Taube Reviewed-by: Tom Rini Reviewed-by: Simon Glass --- common/spl/spl.c | 6 +----- common/spl/spl_fit.c | 2 +- 2 files changed, 2 insertions(+), 6 deletions(-) (limited to 'common') diff --git a/common/spl/spl.c b/common/spl/spl.c index 045a5e89625..cd294e81b2a 100644 --- a/common/spl/spl.c +++ b/common/spl/spl.c @@ -45,10 +45,6 @@ DECLARE_GLOBAL_DATA_PTR; DECLARE_BINMAN_MAGIC_SYM; -#ifndef CFG_SYS_UBOOT_START -#define CFG_SYS_UBOOT_START CONFIG_TEXT_BASE -#endif - u32 *boot_params_ptr = NULL; #if CONFIG_IS_ENABLED(BINMAN_UBOOT_SYMBOLS) @@ -252,7 +248,7 @@ void spl_set_header_raw_uboot(struct spl_image_info *spl_image) spl_image->entry_point = u_boot_pos; spl_image->load_addr = u_boot_pos; } else { - spl_image->entry_point = CFG_SYS_UBOOT_START; + spl_image->entry_point = CONFIG_SYS_UBOOT_START; spl_image->load_addr = CONFIG_TEXT_BASE; } spl_image->os = IH_OS_U_BOOT; diff --git a/common/spl/spl_fit.c b/common/spl/spl_fit.c index cd73b256565..b1668c0396c 100644 --- a/common/spl/spl_fit.c +++ b/common/spl/spl_fit.c @@ -817,7 +817,7 @@ int spl_load_simple_fit(struct spl_image_info *spl_image, } /* - * If a platform does not provide CFG_SYS_UBOOT_START, U-Boot's + * If a platform does not provide CONFIG_SYS_UBOOT_START, U-Boot's * Makefile will set it to 0 and it will end up as the entry point * here. What it actually means is: use the load address. */ -- cgit v1.2.3