mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-10 15:14:43 +00:00
arm: juno: Enable OF_CONTROL
The Arm Juno board was still somewhat stuck in "hardcoded land", even though there are stable DTs around, and one happens to actually be on the memory mapped NOR flash. Enable the configuration options to let the board use OF_CONTROL, and add a routine to find the address of the DTB partition in NOR flash, to use that for U-Boot's own purposes. This can also passed on via $fdtcontroladdr to any kernel or EFI application, removing the need to actually load a device tree. Since the existing "afs" command and its flash routines require flash_init() to be called before being usable, and this is done much later in the boot process, we introduce a stripped-down partition finder routine in vexpress64.c, to scan the NOR flash partitions for the DT partition. This location is then used for U-Boot to find and probe devices. The name of the partition can be configured, if needed, but defaults to "board.dtb", which is used by Linaro's firmware image provided. Signed-off-by: Andre Przywara <andre.przywara@arm.com> Reviewed-by: Linus Walleij <linus.walleij@linaro.org> Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
deaa511d87
commit
b3270e9138
4 changed files with 70 additions and 3 deletions
|
@ -1162,6 +1162,11 @@ config TARGET_VEXPRESS64_JUNO
|
|||
bool "Support Versatile Express Juno Development Platform"
|
||||
select ARM64
|
||||
select PL01X_SERIAL
|
||||
select DM
|
||||
select OF_CONTROL
|
||||
select OF_BOARD
|
||||
select CLK
|
||||
select DM_SERIAL
|
||||
|
||||
config TARGET_LS2080A_EMU
|
||||
bool "Support ls2080a_emu"
|
||||
|
|
|
@ -9,4 +9,11 @@ config SYS_VENDOR
|
|||
config SYS_CONFIG_NAME
|
||||
default "vexpress_aemv8a"
|
||||
|
||||
config JUNO_DTB_PART
|
||||
string "NOR flash partition holding DTB"
|
||||
default "board.dtb"
|
||||
help
|
||||
The ARM partition name in the NOR flash memory holding the
|
||||
device tree blob to configure U-Boot.
|
||||
|
||||
endif
|
||||
|
|
|
@ -82,6 +82,63 @@ int dram_init_banksize(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_OF_BOARD
|
||||
#define JUNO_FLASH_SEC_SIZE (256 * 1024)
|
||||
static phys_addr_t find_dtb_in_nor_flash(const char *partname)
|
||||
{
|
||||
phys_addr_t sector = CONFIG_SYS_FLASH_BASE;
|
||||
int i;
|
||||
|
||||
for (i = 0;
|
||||
i < CONFIG_SYS_MAX_FLASH_SECT;
|
||||
i++, sector += JUNO_FLASH_SEC_SIZE) {
|
||||
int len = strlen(partname) + 1;
|
||||
int offs;
|
||||
phys_addr_t imginfo;
|
||||
u32 reg;
|
||||
|
||||
reg = readl(sector + JUNO_FLASH_SEC_SIZE - 0x04);
|
||||
/* This makes up the string "HSLFTOOF" flash footer */
|
||||
if (reg != 0x464F4F54U)
|
||||
continue;
|
||||
reg = readl(sector + JUNO_FLASH_SEC_SIZE - 0x08);
|
||||
if (reg != 0x464C5348U)
|
||||
continue;
|
||||
|
||||
for (offs = 0; offs < 32; offs += 4, len -= 4) {
|
||||
reg = readl(sector + JUNO_FLASH_SEC_SIZE - 0x30 + offs);
|
||||
if (strncmp(partname + offs, (char *)®,
|
||||
len > 4 ? 4 : len))
|
||||
break;
|
||||
|
||||
if (len > 4)
|
||||
continue;
|
||||
|
||||
reg = readl(sector + JUNO_FLASH_SEC_SIZE - 0x10);
|
||||
imginfo = sector + JUNO_FLASH_SEC_SIZE - 0x30 - reg;
|
||||
reg = readl(imginfo + 0x54);
|
||||
|
||||
return CONFIG_SYS_FLASH_BASE +
|
||||
reg * JUNO_FLASH_SEC_SIZE;
|
||||
}
|
||||
}
|
||||
|
||||
printf("No DTB found\n");
|
||||
|
||||
return ~0;
|
||||
}
|
||||
|
||||
void *board_fdt_blob_setup(void)
|
||||
{
|
||||
phys_addr_t fdt_rom_addr = find_dtb_in_nor_flash(CONFIG_JUNO_DTB_PART);
|
||||
|
||||
if (fdt_rom_addr == ~0UL)
|
||||
return NULL;
|
||||
|
||||
return (void *)fdt_rom_addr;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Board specific reset that is system reset.
|
||||
*/
|
||||
|
|
|
@ -10,6 +10,7 @@ CONFIG_DISTRO_DEFAULTS=y
|
|||
CONFIG_BOOTDELAY=1
|
||||
CONFIG_USE_BOOTARGS=y
|
||||
CONFIG_BOOTARGS="console=ttyAMA0,115200n8 root=/dev/sda2 rw rootwait earlycon=pl011,0x7ff80000 debug user_debug=31 androidboot.hardware=juno loglevel=9"
|
||||
CONFIG_OF_BOARD=y
|
||||
# CONFIG_USE_BOOTCOMMAND is not set
|
||||
# CONFIG_DISPLAY_CPUINFO is not set
|
||||
# CONFIG_DISPLAY_BOARDINFO is not set
|
||||
|
@ -30,7 +31,6 @@ CONFIG_CMD_UBI=y
|
|||
# CONFIG_EFI_PARTITION is not set
|
||||
CONFIG_ENV_IS_IN_FLASH=y
|
||||
CONFIG_ENV_ADDR=0xBFC0000
|
||||
CONFIG_DM=y
|
||||
# CONFIG_MMC is not set
|
||||
CONFIG_MTD=y
|
||||
CONFIG_MTD_NOR_FLASH=y
|
||||
|
@ -41,5 +41,3 @@ CONFIG_SYS_FLASH_CFI=y
|
|||
CONFIG_SMC911X=y
|
||||
CONFIG_SMC911X_BASE=0x018000000
|
||||
CONFIG_SMC911X_32_BIT=y
|
||||
CONFIG_DM_SERIAL=y
|
||||
CONFIG_OF_LIBFDT=y
|
||||
|
|
Loading…
Reference in a new issue