xref: /openbmc/u-boot/include/configs/rpi.h (revision e6b48dfde594339538ac59361a838ab3b3d7fdd8)
1  /* SPDX-License-Identifier: GPL-2.0 */
2  /*
3   * (C) Copyright 2012-2016 Stephen Warren
4   */
5  
6  #ifndef __CONFIG_H
7  #define __CONFIG_H
8  
9  #include <linux/sizes.h>
10  #include <asm/arch/timer.h>
11  
12  #if defined(CONFIG_TARGET_RPI_2) || defined(CONFIG_TARGET_RPI_3_32B)
13  #define CONFIG_SKIP_LOWLEVEL_INIT
14  #endif
15  
16  /* Architecture, CPU, etc.*/
17  #define CONFIG_ARCH_CPU_INIT
18  
19  /* Use SoC timer for AArch32, but architected timer for AArch64 */
20  #ifndef CONFIG_ARM64
21  #define CONFIG_SYS_TIMER_RATE		1000000
22  #define CONFIG_SYS_TIMER_COUNTER	\
23  	(&((struct bcm2835_timer_regs *)BCM2835_TIMER_PHYSADDR)->clo)
24  #endif
25  
26  /*
27   * 2835 is a SKU in a series for which the 2708 is the first or primary SoC,
28   * so 2708 has historically been used rather than a dedicated 2835 ID.
29   *
30   * We don't define a machine type for bcm2709/bcm2836 since the RPi Foundation
31   * chose to use someone else's previously registered machine ID (3139, MX51_GGC)
32   * rather than obtaining a valid ID:-/
33   *
34   * For the bcm2837, hopefully a machine type is not needed, since everything
35   * is DT.
36   */
37  #ifdef CONFIG_BCM2835
38  #define CONFIG_MACH_TYPE		MACH_TYPE_BCM2708
39  #endif
40  
41  /* Memory layout */
42  #define CONFIG_SYS_SDRAM_BASE		0x00000000
43  #define CONFIG_SYS_UBOOT_BASE		CONFIG_SYS_TEXT_BASE
44  /*
45   * The board really has 256M. However, the VC (VideoCore co-processor) shares
46   * the RAM, and uses a configurable portion at the top. We tell U-Boot that a
47   * smaller amount of RAM is present in order to avoid stomping on the area
48   * the VC uses.
49   */
50  #define CONFIG_SYS_SDRAM_SIZE		SZ_128M
51  #define CONFIG_SYS_INIT_SP_ADDR		(CONFIG_SYS_SDRAM_BASE + \
52  					 CONFIG_SYS_SDRAM_SIZE - \
53  					 GENERATED_GBL_DATA_SIZE)
54  #define CONFIG_SYS_MALLOC_LEN		SZ_4M
55  #define CONFIG_SYS_MEMTEST_START	0x00100000
56  #define CONFIG_SYS_MEMTEST_END		0x00200000
57  #define CONFIG_LOADADDR			0x00200000
58  
59  /* Devices */
60  /* GPIO */
61  #define CONFIG_BCM2835_GPIO
62  /* LCD */
63  #define CONFIG_LCD_DT_SIMPLEFB
64  #define CONFIG_VIDEO_BCM2835
65  
66  #ifdef CONFIG_CMD_USB
67  #define CONFIG_TFTP_TSIZE
68  #endif
69  
70  /* Console configuration */
71  #define CONFIG_SYS_CBSIZE		1024
72  
73  /* Environment */
74  #define CONFIG_ENV_SIZE			SZ_16K
75  #define CONFIG_SYS_LOAD_ADDR		0x1000000
76  #define CONFIG_PREBOOT			"usb start"
77  
78  /* Shell */
79  
80  /* ATAGs support for bootm/bootz */
81  #define CONFIG_SETUP_MEMORY_TAGS
82  #define CONFIG_CMDLINE_TAG
83  #define CONFIG_INITRD_TAG
84  
85  /* Environment */
86  #define ENV_DEVICE_SETTINGS \
87  	"stdin=serial,usbkbd\0" \
88  	"stdout=serial,vidconsole\0" \
89  	"stderr=serial,vidconsole\0"
90  
91  #ifdef CONFIG_ARM64
92  #define FDT_HIGH "ffffffffffffffff"
93  #define INITRD_HIGH "ffffffffffffffff"
94  #else
95  #define FDT_HIGH "ffffffff"
96  #define INITRD_HIGH "ffffffff"
97  #endif
98  
99  /*
100   * Memory layout for where various images get loaded by boot scripts:
101   *
102   * I suspect address 0 is used as the SMP pen on the RPi2, so avoid this.
103   *
104   * Older versions of the boot firmware place the firmware-loaded DTB at 0x100,
105   * newer versions place it in high memory. So prevent U-Boot from doing its own
106   * DTB + initrd relocation so that we won't accidentally relocate the initrd
107   * over the firmware-loaded DTB and generally try to lay out things starting
108   * from the bottom of RAM.
109   *
110   * kernel_addr_r has different constraints on ARM and Aarch64.  For 32-bit ARM,
111   * it must be within the first 128M of RAM in order for the kernel's
112   * CONFIG_AUTO_ZRELADDR option to work. The kernel itself will be decompressed
113   * to 0x8000 but the decompressor clobbers 0x4000-0x8000 as well. The
114   * decompressor also likes to relocate itself to right past the end of the
115   * decompressed kernel, so in total the sum of the compressed and and
116   * decompressed kernel needs to be reserved.
117   *
118   *   For Aarch64, the kernel image is uncompressed and must be loaded at
119   *   text_offset bytes (specified in the header of the Image) into a 2MB
120   *   boundary. The 'booti' command relocates the image if necessary. Linux uses
121   *   a default text_offset of 0x80000.  In summary, loading at 0x80000
122   *   satisfies all these constraints and reserving memory up to 0x02400000
123   *   permits fairly large (roughly 36M) kernels.
124   *
125   * scriptaddr and pxefile_addr_r can be pretty much anywhere that doesn't
126   * conflict with something else. Reserving 1M for each of them at
127   * 0x02400000-0x02500000 and 0x02500000-0x02600000 should be plenty.
128   *
129   * On ARM, both the DTB and any possible initrd must be loaded such that they
130   * fit inside the lowmem mapping in Linux. In practice, this usually means not
131   * more than ~700M away from the start of the kernel image but this number can
132   * be larger OR smaller depending on e.g. the 'vmalloc=xxxM' command line
133   * parameter given to the kernel. So reserving memory from low to high
134   * satisfies this constraint again. Reserving 1M at 0x02600000-0x02700000 for
135   * the DTB leaves rest of the free RAM to the initrd starting at 0x02700000.
136   * Even with the smallest possible CPU-GPU memory split of the CPU getting
137   * only 64M, the remaining 25M starting at 0x02700000 should allow quite
138   * large initrds before they start colliding with U-Boot.
139   */
140  #define ENV_MEM_LAYOUT_SETTINGS \
141  	"fdt_high=" FDT_HIGH "\0" \
142  	"initrd_high=" INITRD_HIGH "\0" \
143  	"kernel_addr_r=0x00080000\0" \
144  	"scriptaddr=0x02400000\0" \
145  	"pxefile_addr_r=0x02500000\0" \
146  	"fdt_addr_r=0x02600000\0" \
147  	"ramdisk_addr_r=0x02700000\0"
148  
149  #define BOOT_TARGET_DEVICES(func) \
150  	func(MMC, mmc, 0) \
151  	func(MMC, mmc, 1) \
152  	func(USB, usb, 0) \
153  	func(PXE, pxe, na) \
154  	func(DHCP, dhcp, na)
155  #include <config_distro_bootcmd.h>
156  
157  #define CONFIG_EXTRA_ENV_SETTINGS \
158  	"dhcpuboot=usb start; dhcp u-boot.uimg; bootm\0" \
159  	ENV_DEVICE_SETTINGS \
160  	ENV_MEM_LAYOUT_SETTINGS \
161  	BOOTENV
162  
163  
164  #endif
165