mirror of
				https://github.com/smaeul/u-boot.git
				synced 2025-11-03 21:48:15 +00:00 
			
		
		
		
	SPL is creating fit-images DT node when loadables are recorded in selected
configuration. Entries which are created are using entry-point and
load-addr property names. But there shouldn't be a need to use non standard
properties because entry/load are standard FIT properties. But using
standard FIT properties enables option to use generic FIT functions to
descrease SPL size. Here is result for ZynqMP virt configuration:
xilinx_zynqmp_virt: spl/u-boot-spl:all -82 spl/u-boot-spl:rodata -22 spl/u-boot-spl:text -60
The patch causes change in run time fit image record.
Before:
fit-images {
        uboot {
                os = "u-boot";
                type = "firmware";
                size = <0xfd520>;
                entry-point = <0x8000000>;
                load-addr = <0x8000000>;
        };
};
After:
fit-images {
        uboot {
                os = "u-boot";
                type = "firmware";
                size = <0xfd520>;
                entry = <0x8000000>;
                load = <0x8000000>;
        };
};
Replacing calling fdt_getprop_u32() by fit_image_get_entry/load() also
enables support for reading entry/load properties recorded in 64bit format.
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
		
	
			
		
			
				
	
	
		
			99 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			99 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
// SPDX-License-Identifier: GPL-2.0+
 | 
						|
/*
 | 
						|
 * Copyright (C) 2019 Fraunhofer AISEC,
 | 
						|
 * Lukas Auer <lukas.auer@aisec.fraunhofer.de>
 | 
						|
 *
 | 
						|
 * Based on common/spl/spl_atf.c
 | 
						|
 */
 | 
						|
#include <common.h>
 | 
						|
#include <cpu_func.h>
 | 
						|
#include <errno.h>
 | 
						|
#include <hang.h>
 | 
						|
#include <image.h>
 | 
						|
#include <spl.h>
 | 
						|
#include <asm/smp.h>
 | 
						|
#include <opensbi.h>
 | 
						|
#include <linux/libfdt.h>
 | 
						|
 | 
						|
DECLARE_GLOBAL_DATA_PTR;
 | 
						|
 | 
						|
struct fw_dynamic_info opensbi_info;
 | 
						|
 | 
						|
static int spl_opensbi_find_uboot_node(void *blob, int *uboot_node)
 | 
						|
{
 | 
						|
	int fit_images_node, node;
 | 
						|
	const char *fit_os;
 | 
						|
 | 
						|
	fit_images_node = fdt_path_offset(blob, "/fit-images");
 | 
						|
	if (fit_images_node < 0)
 | 
						|
		return -ENODEV;
 | 
						|
 | 
						|
	fdt_for_each_subnode(node, blob, fit_images_node) {
 | 
						|
		fit_os = fdt_getprop(blob, node, FIT_OS_PROP, NULL);
 | 
						|
		if (!fit_os)
 | 
						|
			continue;
 | 
						|
 | 
						|
		if (genimg_get_os_id(fit_os) == IH_OS_U_BOOT) {
 | 
						|
			*uboot_node = node;
 | 
						|
			return 0;
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	return -ENODEV;
 | 
						|
}
 | 
						|
 | 
						|
void spl_invoke_opensbi(struct spl_image_info *spl_image)
 | 
						|
{
 | 
						|
	int ret, uboot_node;
 | 
						|
	ulong uboot_entry;
 | 
						|
	void (*opensbi_entry)(ulong hartid, ulong dtb, ulong info);
 | 
						|
 | 
						|
	if (!spl_image->fdt_addr) {
 | 
						|
		pr_err("No device tree specified in SPL image\n");
 | 
						|
		hang();
 | 
						|
	}
 | 
						|
 | 
						|
	/* Find U-Boot image in /fit-images */
 | 
						|
	ret = spl_opensbi_find_uboot_node(spl_image->fdt_addr, &uboot_node);
 | 
						|
	if (ret) {
 | 
						|
		pr_err("Can't find U-Boot node, %d\n", ret);
 | 
						|
		hang();
 | 
						|
	}
 | 
						|
 | 
						|
	/* Get U-Boot entry point */
 | 
						|
	ret = fit_image_get_entry(spl_image->fdt_addr, uboot_node, &uboot_entry);
 | 
						|
	if (ret)
 | 
						|
		ret = fit_image_get_load(spl_image->fdt_addr, uboot_node, &uboot_entry);
 | 
						|
 | 
						|
	/* Prepare obensbi_info object */
 | 
						|
	opensbi_info.magic = FW_DYNAMIC_INFO_MAGIC_VALUE;
 | 
						|
	opensbi_info.version = FW_DYNAMIC_INFO_VERSION;
 | 
						|
	opensbi_info.next_addr = uboot_entry;
 | 
						|
	opensbi_info.next_mode = FW_DYNAMIC_INFO_NEXT_MODE_S;
 | 
						|
	opensbi_info.options = SBI_SCRATCH_NO_BOOT_PRINTS;
 | 
						|
	opensbi_info.boot_hart = gd->arch.boot_hart;
 | 
						|
 | 
						|
	opensbi_entry = (void (*)(ulong, ulong, ulong))spl_image->entry_point;
 | 
						|
	invalidate_icache_all();
 | 
						|
 | 
						|
#ifdef CONFIG_SPL_SMP
 | 
						|
	/*
 | 
						|
	 * Start OpenSBI on all secondary harts and wait for acknowledgment.
 | 
						|
	 *
 | 
						|
	 * OpenSBI first relocates itself to its link address. This is done by
 | 
						|
	 * the main hart. To make sure no hart is still running U-Boot SPL
 | 
						|
	 * during relocation, we wait for all secondary harts to acknowledge
 | 
						|
	 * the call-function request before entering OpenSBI on the main hart.
 | 
						|
	 * Otherwise, code corruption can occur if the link address ranges of
 | 
						|
	 * U-Boot SPL and OpenSBI overlap.
 | 
						|
	 */
 | 
						|
	ret = smp_call_function((ulong)spl_image->entry_point,
 | 
						|
				(ulong)spl_image->fdt_addr,
 | 
						|
				(ulong)&opensbi_info, 1);
 | 
						|
	if (ret)
 | 
						|
		hang();
 | 
						|
#endif
 | 
						|
	opensbi_entry(gd->arch.boot_hart, (ulong)spl_image->fdt_addr,
 | 
						|
		      (ulong)&opensbi_info);
 | 
						|
}
 |