ARM: add Raspberry Pi 3 64-bit config
On all Pis so far, the VC FW provides a short stub to set up the ARM CPU
before entering the kernel (a/k/a U-Boot for us). This feature is not
currently supported by the VC FW when booting in 64-bit mode. However,
this feature will likely appear in the near future, and this U-Boot port
assumes that such a feature is in place. Without that feature, or a
temporary workaround described below, U-Boot will not boot.
Once the VC FW does provide the ARM stub, u-boot.bin built for rpi_3 can
be used drectly as kernel7.img, in the same way as any other RPi port. The
following config.txt is required:
# Fix mini UART input frequency, and setup/enable up the UART.
# Without this option, U-Boot will not boot, even if you don't care
# about the serial console. This option will always be required for
# all RPi3 use-cases, unless the PL011 UART is used, which is not
# yet supported by rpi_3* builds of U-Boot.
enable_uart=1
# Boot in AArch64 (64-bit) mode.
# It is possible that a future VC FW will remove the need for this
# option, instead auto-setting 32-/64-bit mode based on the "kernel"
# filename present on the SD card.
arm_control=0x200
Prior to the VC FW providing the ARM boot stub, you can use the following
steps to build an equivalent stub into the U-Boot binary:
git clone https://github.com/swarren/rpi-3-aarch64-demo.git \
../rpi-3-aarch64-demo
(cd ../rpi-3-aarch64-demo && ./build.sh)
Build U-Boot for rpi_3 in the usual way
cat ../rpi-3-aarch64-demo/armstub64.bin u-boot.bin > u-boot.bin.stubbed
Use u-boot.bin.stubbed as kernel7.img on the Pi SD card.
In this case, the following additional entries are required in config.txt:
# Tell the FW to load the kernel image at address 0, the reset vector.
kernel_old=1
Signed-off-by: Stephen Warren <swarren@wwwdotorg.org>
Reviewed-by: Tom Rini <trini@konsulko.com>
This commit is contained in:
parent
7439b4399b
commit
d22a765755
|
|
@ -70,12 +70,18 @@ config TARGET_RPI_3_32B
|
||||||
select BCM2837
|
select BCM2837
|
||||||
select CPU_V7
|
select CPU_V7
|
||||||
|
|
||||||
|
config TARGET_RPI_3
|
||||||
|
bool "Raspberry Pi 3 64-bit build"
|
||||||
|
select ARM64
|
||||||
|
select BCM2837
|
||||||
|
|
||||||
endchoice
|
endchoice
|
||||||
|
|
||||||
config SYS_BOARD
|
config SYS_BOARD
|
||||||
default "rpi" if TARGET_RPI
|
default "rpi" if TARGET_RPI
|
||||||
default "rpi_2" if TARGET_RPI_2
|
default "rpi_2" if TARGET_RPI_2
|
||||||
default "rpi_3_32b" if TARGET_RPI_3_32B
|
default "rpi_3_32b" if TARGET_RPI_3_32B
|
||||||
|
default "rpi_3" if TARGET_RPI_3
|
||||||
|
|
||||||
config SYS_VENDOR
|
config SYS_VENDOR
|
||||||
default "raspberrypi"
|
default "raspberrypi"
|
||||||
|
|
@ -87,5 +93,6 @@ config SYS_CONFIG_NAME
|
||||||
default "rpi" if TARGET_RPI
|
default "rpi" if TARGET_RPI
|
||||||
default "rpi_2" if TARGET_RPI_2
|
default "rpi_2" if TARGET_RPI_2
|
||||||
default "rpi_3_32b" if TARGET_RPI_3_32B
|
default "rpi_3_32b" if TARGET_RPI_3_32B
|
||||||
|
default "rpi_3" if TARGET_RPI_3
|
||||||
|
|
||||||
endmenu
|
endmenu
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,9 @@
|
||||||
#include <asm/global_data.h>
|
#include <asm/global_data.h>
|
||||||
#include <dm/platform_data/serial_pl01x.h>
|
#include <dm/platform_data/serial_pl01x.h>
|
||||||
#include <dm/platform_data/serial_bcm283x_mu.h>
|
#include <dm/platform_data/serial_bcm283x_mu.h>
|
||||||
|
#ifdef CONFIG_ARM64
|
||||||
|
#include <asm/armv8/mmu.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
|
||||||
|
|
@ -228,6 +231,28 @@ static uint32_t rev_scheme;
|
||||||
static uint32_t rev_type;
|
static uint32_t rev_type;
|
||||||
static const struct rpi_model *model;
|
static const struct rpi_model *model;
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARM64
|
||||||
|
static struct mm_region bcm2837_mem_map[] = {
|
||||||
|
{
|
||||||
|
.base = 0x00000000UL,
|
||||||
|
.size = 0x3f000000UL,
|
||||||
|
.attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
|
||||||
|
PTE_BLOCK_INNER_SHARE
|
||||||
|
}, {
|
||||||
|
.base = 0x3f000000UL,
|
||||||
|
.size = 0x01000000UL,
|
||||||
|
.attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
|
||||||
|
PTE_BLOCK_NON_SHARE |
|
||||||
|
PTE_BLOCK_PXN | PTE_BLOCK_UXN
|
||||||
|
}, {
|
||||||
|
/* List terminator */
|
||||||
|
0,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct mm_region *mem_map = bcm2837_mem_map;
|
||||||
|
#endif
|
||||||
|
|
||||||
int dram_init(void)
|
int dram_init(void)
|
||||||
{
|
{
|
||||||
ALLOC_CACHE_ALIGN_BUFFER(struct msg_get_arm_mem, msg, 1);
|
ALLOC_CACHE_ALIGN_BUFFER(struct msg_get_arm_mem, msg, 1);
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
RPI_3_BOARD
|
||||||
|
M: Stephen Warren <swarren@wwwdotorg.org>
|
||||||
|
S: Maintained
|
||||||
|
F: board/raspberrypi/rpi_3/
|
||||||
|
F: include/configs/rpi_3.h
|
||||||
|
F: configs/rpi_3_defconfig
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
#
|
||||||
|
# (C) Copyright 2012-2016 Stephen Warren <swarren@wwwdotorg.org>
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
|
#
|
||||||
|
|
||||||
|
obj-y := ../rpi/rpi.o
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
CONFIG_ARM=y
|
||||||
|
CONFIG_ARCH_BCM283X=y
|
||||||
|
CONFIG_TARGET_RPI_3=y
|
||||||
|
CONFIG_OF_BOARD_SETUP=y
|
||||||
|
CONFIG_SYS_PROMPT="U-Boot> "
|
||||||
|
# CONFIG_CMD_IMLS is not set
|
||||||
|
# CONFIG_CMD_FLASH is not set
|
||||||
|
# CONFIG_CMD_FPGA is not set
|
||||||
|
CONFIG_CMD_GPIO=y
|
||||||
|
CONFIG_PHYS_TO_BUS=y
|
||||||
|
CONFIG_OF_LIBFDT=y
|
||||||
|
|
@ -13,9 +13,12 @@
|
||||||
/* Architecture, CPU, etc.*/
|
/* Architecture, CPU, etc.*/
|
||||||
#define CONFIG_ARCH_CPU_INIT
|
#define CONFIG_ARCH_CPU_INIT
|
||||||
|
|
||||||
|
/* Use SoC timer for AArch32, but architected timer for AArch64 */
|
||||||
|
#ifndef CONFIG_ARM64
|
||||||
#define CONFIG_SYS_TIMER_RATE 1000000
|
#define CONFIG_SYS_TIMER_RATE 1000000
|
||||||
#define CONFIG_SYS_TIMER_COUNTER \
|
#define CONFIG_SYS_TIMER_COUNTER \
|
||||||
(&((struct bcm2835_timer_regs *)BCM2835_TIMER_PHYSADDR)->clo)
|
(&((struct bcm2835_timer_regs *)BCM2835_TIMER_PHYSADDR)->clo)
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 2835 is a SKU in a series for which the 2708 is the first or primary SoC,
|
* 2835 is a SKU in a series for which the 2708 is the first or primary SoC,
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,14 @@
|
||||||
|
/*
|
||||||
|
* (C) Copyright 2012-2016 Stephen Warren <swarren@wwwdotorg.org>
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: GPL-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __CONFIG_H
|
||||||
|
#define __CONFIG_H
|
||||||
|
|
||||||
|
#define CONFIG_SYS_CACHELINE_SIZE 64
|
||||||
|
|
||||||
|
#include "rpi-common.h"
|
||||||
|
|
||||||
|
#endif
|
||||||
Loading…
Reference in New Issue