"Das U-Boot" Source Tree

arm: add initial support for the Phytium Durian Board

This adds platform code and the device tree for the Phytium Durian Board.
The initial support comprises the UART and the PCIE.

Cc: Bin Meng <bmeng.cn@gmail.com>
Cc: Kever Yang <kever.yang@rock-chips.com>
Cc: Tom Rini <trini@konsulko.com>
Cc: Heinrich Schuchardt <xypron.glpk@gmx.de>

Signed-off-by: Steven Hao <liuhao@phytium.com.cn>

authored by

liu hao and committed by
Tom Rini
e3aafef4 672c5705

+556
+7
MAINTAINERS
··· 481 481 T: git https://gitlab.denx.de/u-boot/custodians/u-boot-microblaze.git 482 482 F: arch/arm/mach-zynqmp-r5/ 483 483 484 + ARM PHYTIUM 485 + M: liuhao <liuhao@phytium.com.cn> 486 + M: shuyiqi <shuyiqi@phytium.com.cn> 487 + S: Maintained 488 + F: drivers/pci/pcie_phytium.c 489 + F: arch/arm/dts/phytium-durian.dts 490 + 484 491 BINMAN 485 492 M: Simon Glass <sjg@chromium.org> 486 493 S: Maintained
+8
arch/arm/Kconfig
··· 1631 1631 select OF_CONTROL 1632 1632 imply CMD_DM 1633 1633 1634 + config TARGET_DURIAN 1635 + bool "Support Phytium Durian Platform" 1636 + select ARM64 1637 + help 1638 + Support for durian platform. 1639 + It has 2GB Sdram, uart and pcie. 1640 + 1634 1641 endchoice 1635 1642 1636 1643 config ARCH_SUPPORT_TFABOOT ··· 1830 1837 source "board/xilinx/Kconfig" 1831 1838 source "board/xilinx/zynq/Kconfig" 1832 1839 source "board/xilinx/zynqmp/Kconfig" 1840 + source "board/phytium/durian/Kconfig" 1833 1841 1834 1842 source "arch/arm/Kconfig.debug" 1835 1843
+2
arch/arm/dts/Makefile
··· 834 834 dtb-$(CONFIG_TARGET_VEXPRESS_CA9X4) += vexpress-v2p-ca9.dtb 835 835 dtb-$(CONFIG_TARGET_VEXPRESS_CA15_TC2) += vexpress-v2p-ca15_a7.dtb 836 836 837 + dtb-$(CONFIG_TARGET_DURIAN) += phytium-durian.dtb 838 + 837 839 targets += $(dtb-y) 838 840 839 841 # Add any required device tree compiler flags here
+33
arch/arm/dts/phytium-durian.dts
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + /* 3 + * Copyright (C) 2019, Phytium Ltd. 4 + * shuyiqi <shuyiqi@phytium.com.cn> 5 + */ 6 + 7 + /dts-v1/; 8 + 9 + / { 10 + model = "Phytium Durian"; 11 + compatible = "phytium,durian"; 12 + #address-cells = <2>; 13 + #size-cells = <2>; 14 + 15 + pcie-controller@40000000 { 16 + compatible = "phytium,pcie-host-1.0"; 17 + device_type = "pci"; 18 + #address-cells = <3>; 19 + #size-cells = <2>; 20 + reg = <0x0 0x40000000 0x0 0x10000000>; 21 + bus-range = <0x0 0xff>; 22 + ranges = <0x1000000 0x0 0x0 0x0 0x50000000 0x0 0xF00000>, 23 + <0x2000000 0x0 0x58000000 0x0 0x58000000 0x0 0x28000000>, 24 + <0x43000000 0x10 0x00000000 0x10 0x00000000 0x10 0x00000000>; 25 + }; 26 + 27 + uart@28001000 { 28 + compatible = "arm,pl011"; 29 + reg = <0x0 0x28001000 0x0 0x1000>; 30 + clock = <48000000>; 31 + }; 32 + }; 33 +
+12
board/phytium/durian/Kconfig
··· 1 + if TARGET_DURIAN 2 + 3 + config SYS_BOARD 4 + default "durian" 5 + 6 + config SYS_VENDOR 7 + default "phytium" 8 + 9 + config SYS_CONFIG_NAME 10 + default "durian" 11 + 12 + endif
+8
board/phytium/durian/MAINTAINERS
··· 1 + DURIAN BOARD 2 + M: liuhao <liuhao@phytium.com.cn> 3 + M: shuyiqi <shuyiqi@phytium.com.cn> 4 + S: Maintained 5 + F: board/phytium/durian/* 6 + F: include/configs/durian.h 7 + F: configs/durian_defconfig 8 +
+9
board/phytium/durian/Makefile
··· 1 + # SPDX-License-Identifier: GPL-2.0+ 2 + # 3 + # Copyright (C) 2019 4 + # shuyiqi <shuyiqi@phytium.com.cn> 5 + # liuhao <liuhao@phytium.com.cn> 6 + # 7 + 8 + obj-y += durian.o 9 +
+59
board/phytium/durian/README
··· 1 + Here is the step-by-step to boot U-Boot on phytium durian board. 2 + 3 + Compile U-Boot 4 + ============== 5 + > make durian_defconfig 6 + > make 7 + 8 + Get the prebuild binary about BPF 9 + ================================= 10 + > cd ../ 11 + > git clone https://github.com/phytium-durian/bpf.git 12 + 13 + Package the image 14 + ================= 15 + > cd bpf 16 + > cp ../u-boot/u-boot.bin ./ 17 + > ./dopack 18 + 19 + The fip-all.bin is the final image. 20 + 21 + Flash the image into the spi nor-flash 22 + ====================================== 23 + Any spi nor-flash and appropriate tool can be used to flash. 24 + For example, we choose the S25FL256 chip that produced from 25 + SPANSION company and EZP_XPro V1.2. 26 + 27 + Reset the board, you can get U-Boot log message from boot console: 28 + 29 + Power on... 30 + Start pcie setup! 31 + End pcie setup! 32 + Start ddr setup! 33 + End ddr setup! 34 + Jump to entrypoint: 0x500000 35 + 36 + U-Boot 2019.10-00594-g9ccc1b17ea-dirty (Oct 18 2019 - 00:17:09 +0800) 37 + 38 + DRAM: 1.9 GiB 39 + In: uart@28001000 40 + Out: uart@28001000 41 + Err: uart@28001000 42 + scanning bus for devices... 43 + Target spinup took 0 ms. 44 + SATA link 1 timeout. 45 + SATA link 2 timeout. 46 + SATA link 3 timeout. 47 + AHCI 0001.0000 32 slots 4 ports 6 Gbps 0xf impl SATA mode 48 + flags: 64bit ncq led only pmp fbss pio slum part sxs 49 + Device 0: (0:0) Vendor: ATA Prod.: ST1000DM010-2EP1 Rev: CC43 50 + Type: Hard Disk 51 + Capacity: 953869.7 MB = 931.5 GB (1953525168 x 512) 52 + SATA link 0 timeout. 53 + SATA link 1 timeout. 54 + SATA link 2 timeout. 55 + SATA link 3 timeout. 56 + AHCI 0001.0000 32 slots 4 ports 6 Gbps 0xf impl SATA mode 57 + flags: 64bit ncq led only pmp fbss pio slum part sxs 58 + Hit any key to stop autoboot: 0 59 + durian#
+23
board/phytium/durian/cpu.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0+ */ 2 + /* 3 + * (C) Copyright 2019 4 + * Phytium Technology Ltd <www.phytium.com> 5 + * shuyiqi <shuyiqi@phytium.com.cn> 6 + */ 7 + 8 + #ifndef _FT_DURIAN_H 9 + #define _FT_DURIAN_H 10 + 11 + /* FLUSH L3 CASHE */ 12 + #define HNF_COUNT 0x8 13 + #define HNF_PSTATE_REQ (HNF_BASE + 0x10) 14 + #define HNF_PSTATE_STAT (HNF_BASE + 0x18) 15 + #define HNF_PSTATE_OFF 0x0 16 + #define HNF_PSTATE_SFONLY 0x1 17 + #define HNF_PSTATE_HALF 0x2 18 + #define HNF_PSTATE_FULL 0x3 19 + #define HNF_STRIDE 0x10000 20 + #define HNF_BASE (unsigned long)(0x3A200000) 21 + 22 + #endif /* _FT_DURIAN_H */ 23 +
+110
board/phytium/durian/durian.c
··· 1 + // SPDX-License-Identifier: GPL-2.0+ 2 + /* 3 + * Copyright (C) 2019 4 + * shuyiqi <shuyiqi@phytium.com.cn> 5 + * liuhao <liuhao@phytium.com.cn> 6 + */ 7 + 8 + #include <common.h> 9 + #include <asm/armv8/mmu.h> 10 + #include <asm/system.h> 11 + #include <asm/io.h> 12 + #include <linux/arm-smccc.h> 13 + #include <linux/kernel.h> 14 + #include <scsi.h> 15 + #include "cpu.h" 16 + 17 + DECLARE_GLOBAL_DATA_PTR; 18 + 19 + int dram_init(void) 20 + { 21 + gd->mem_clk = 0; 22 + gd->ram_size = PHYS_SDRAM_1_SIZE; 23 + return 0; 24 + } 25 + 26 + int dram_init_banksize(void) 27 + { 28 + gd->bd->bi_dram[0].start = PHYS_SDRAM_1; 29 + gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE; 30 + 31 + return 0; 32 + } 33 + 34 + int board_init(void) 35 + { 36 + return 0; 37 + } 38 + 39 + void reset_cpu(ulong addr) 40 + { 41 + struct arm_smccc_res res; 42 + 43 + arm_smccc_smc(0x84000009, 0, 0, 0, 0, 0, 0, 0, &res); 44 + debug("reset cpu error, %lx\n", res.a0); 45 + } 46 + 47 + static struct mm_region durian_mem_map[] = { 48 + { 49 + .virt = 0x0UL, 50 + .phys = 0x0UL, 51 + .size = 0x80000000UL, 52 + .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) | 53 + PTE_BLOCK_NON_SHARE | 54 + PTE_BLOCK_PXN | 55 + PTE_BLOCK_UXN 56 + }, 57 + { 58 + .virt = (u64)PHYS_SDRAM_1, 59 + .phys = (u64)PHYS_SDRAM_1, 60 + .size = (u64)PHYS_SDRAM_1_SIZE, 61 + .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) | 62 + PTE_BLOCK_NS | 63 + PTE_BLOCK_INNER_SHARE 64 + }, 65 + { 66 + 0, 67 + } 68 + }; 69 + 70 + struct mm_region *mem_map = durian_mem_map; 71 + 72 + int print_cpuinfo(void) 73 + { 74 + printf("CPU: Phytium ft2004 %ld MHz\n", gd->cpu_clk); 75 + return 0; 76 + } 77 + 78 + int __asm_flush_l3_dcache(void) 79 + { 80 + int i, pstate; 81 + 82 + for (i = 0; i < HNF_COUNT; i++) 83 + writeq(HNF_PSTATE_SFONLY, HNF_PSTATE_REQ + i * HNF_STRIDE); 84 + for (i = 0; i < HNF_COUNT; i++) { 85 + do { 86 + pstate = readq(HNF_PSTATE_STAT + i * HNF_STRIDE); 87 + } while ((pstate & 0xf) != (HNF_PSTATE_SFONLY << 2)); 88 + } 89 + 90 + for (i = 0; i < HNF_COUNT; i++) 91 + writeq(HNF_PSTATE_FULL, HNF_PSTATE_REQ + i * HNF_STRIDE); 92 + 93 + return 0; 94 + } 95 + 96 + int last_stage_init(void) 97 + { 98 + int ret; 99 + 100 + /* pci e */ 101 + pci_init(); 102 + /* scsi scan */ 103 + ret = scsi_scan(true); 104 + if (ret) { 105 + printf("scsi scan failed\n"); 106 + return CMD_RET_FAILURE; 107 + } 108 + return ret; 109 + } 110 +
+33
configs/durian_defconfig
··· 1 + CONFIG_ARM=y 2 + CONFIG_ARM_SMCCC=y 3 + CONFIG_TARGET_DURIAN=y 4 + CONFIG_SYS_TEXT_BASE=0x500000 5 + CONFIG_NR_DRAM_BANKS=1 6 + # CONFIG_PSCI_RESET is not set 7 + CONFIG_AHCI=y 8 + CONFIG_DISTRO_DEFAULTS=y 9 + CONFIG_USE_BOOTARGS=y 10 + CONFIG_BOOTARGS="console=ttyAMA0,115200 earlycon=pl011,0x28001000 root=/dev/sda2 rw" 11 + # CONFIG_DISPLAY_CPUINFO is not set 12 + # CONFIG_DISPLAY_BOARDINFO is not set 13 + CONFIG_LAST_STAGE_INIT=y 14 + CONFIG_SYS_PROMPT="durian#" 15 + # CONFIG_CMD_LZMADEC is not set 16 + # CONFIG_CMD_UNZIP is not set 17 + CONFIG_CMD_PCI=y 18 + CONFIG_OF_CONTROL=y 19 + CONFIG_DEFAULT_DEVICE_TREE="phytium-durian" 20 + # CONFIG_NET is not set 21 + CONFIG_DM=y 22 + CONFIG_SCSI_AHCI=y 23 + CONFIG_AHCI_PCI=y 24 + CONFIG_BLK=y 25 + # CONFIG_MMC is not set 26 + CONFIG_PCI=y 27 + CONFIG_DM_PCI=y 28 + CONFIG_DM_PCI_COMPAT=y 29 + CONFIG_PCI_PHYTIUM=y 30 + CONFIG_SCSI=y 31 + CONFIG_DM_SCSI=y 32 + CONFIG_DM_SERIAL=y 33 + CONFIG_PL01X_SERIAL=y
+7
drivers/pci/Kconfig
··· 51 51 Say Y here if you want to enable support for generic ECAM-based 52 52 PCIe host controllers, such as the one emulated by QEMU. 53 53 54 + config PCI_PHYTIUM 55 + bool "Phytium PCIe support" 56 + depends on DM_PCI 57 + help 58 + Say Y here if you want to enable PCIe controller support on 59 + Phytium SoCs. 60 + 54 61 config PCIE_DW_MVEBU 55 62 bool "Enable Armada-8K PCIe driver (DesignWare core)" 56 63 depends on DM_PCI
+1
drivers/pci/Makefile
··· 38 38 obj-$(CONFIG_PCIE_LAYERSCAPE_GEN4) += pcie_layerscape_gen4.o \ 39 39 pcie_layerscape_gen4_fixup.o 40 40 obj-$(CONFIG_PCI_XILINX) += pcie_xilinx.o 41 + obj-$(CONFIG_PCI_PHYTIUM) += pcie_phytium.o 41 42 obj-$(CONFIG_PCIE_INTEL_FPGA) += pcie_intel_fpga.o 42 43 obj-$(CONFIG_PCI_KEYSTONE) += pcie_dw_ti.o 43 44 obj-$(CONFIG_PCIE_MEDIATEK) += pcie_mediatek.o
+200
drivers/pci/pcie_phytium.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 2 + /* 3 + * Phytium PCIE host driver 4 + * 5 + * Heavily based on drivers/pci/pcie_xilinx.c 6 + * 7 + * Copyright (C) 2019 8 + */ 9 + 10 + #include <common.h> 11 + #include <dm.h> 12 + #include <pci.h> 13 + #include <asm/io.h> 14 + 15 + /** 16 + * struct phytium_pcie - phytium PCIe controller state 17 + * @cfg_base: The base address of memory mapped configuration space 18 + */ 19 + struct phytium_pcie { 20 + void *cfg_base; 21 + }; 22 + 23 + /* 24 + * phytium_pci_skip_dev() 25 + * @parent: Identifies the PCIe device to access 26 + * 27 + * Checks whether the parent of the PCIe device is bridge 28 + * 29 + * Return: true if it is bridge, else false. 30 + */ 31 + static int phytium_pci_skip_dev(pci_dev_t parent) 32 + { 33 + unsigned char pos, id; 34 + unsigned long addr = 0x40000000; 35 + unsigned short capreg; 36 + unsigned char port_type; 37 + 38 + addr += PCI_BUS(parent) << 20; 39 + addr += PCI_DEV(parent) << 15; 40 + addr += PCI_FUNC(parent) << 12; 41 + 42 + pos = 0x34; 43 + while (1) { 44 + pos = readb(addr + pos); 45 + if (pos < 0x40) 46 + break; 47 + pos &= ~3; 48 + id = readb(addr + pos); 49 + if (id == 0xff) 50 + break; 51 + if (id == 0x10) { 52 + capreg = readw(addr + pos + 2); 53 + port_type = (capreg >> 4) & 0xf; 54 + if (port_type == 0x6 || port_type == 0x4) 55 + return 1; 56 + else 57 + return 0; 58 + } 59 + pos += 1; 60 + } 61 + return 0; 62 + } 63 + 64 + /** 65 + * pci_phytium_conf_address() - Calculate the address of a config access 66 + * @bus: Pointer to the PCI bus 67 + * @bdf: Identifies the PCIe device to access 68 + * @offset: The offset into the device's configuration space 69 + * @paddress: Pointer to the pointer to write the calculates address to 70 + * 71 + * Calculates the address that should be accessed to perform a PCIe 72 + * configuration space access for a given device identified by the PCIe 73 + * controller device @pcie and the bus, device & function numbers in @bdf. If 74 + * access to the device is not valid then the function will return an error 75 + * code. Otherwise the address to access will be written to the pointer pointed 76 + * to by @paddress. 77 + */ 78 + static int pci_phytium_conf_address(struct udevice *bus, pci_dev_t bdf, 79 + uint offset, 80 + void **paddress) 81 + { 82 + struct phytium_pcie *pcie = dev_get_priv(bus); 83 + void *addr; 84 + pci_dev_t bdf_parent; 85 + 86 + unsigned int bus_no = PCI_BUS(bdf); 87 + unsigned int dev_no = PCI_DEV(bdf); 88 + 89 + bdf_parent = PCI_BDF((bus_no - 1), 0, 0); 90 + 91 + addr = pcie->cfg_base; 92 + addr += PCI_BUS(bdf) << 20; 93 + addr += PCI_DEV(bdf) << 15; 94 + addr += PCI_FUNC(bdf) << 12; 95 + 96 + if (bus_no > 0 && dev_no > 0) { 97 + if ((readb(addr + PCI_HEADER_TYPE) & 0x7f) != 98 + PCI_HEADER_TYPE_BRIDGE) 99 + return -ENODEV; 100 + if (phytium_pci_skip_dev(bdf_parent)) 101 + return -ENODEV; 102 + } 103 + 104 + addr += offset; 105 + *paddress = addr; 106 + 107 + return 0; 108 + } 109 + 110 + /** 111 + * pci_phytium_read_config() - Read from configuration space 112 + * @bus: Pointer to the PCI bus 113 + * @bdf: Identifies the PCIe device to access 114 + * @offset: The offset into the device's configuration space 115 + * @valuep: A pointer at which to store the read value 116 + * @size: Indicates the size of access to perform 117 + * 118 + * Read a value of size @size from offset @offset within the configuration 119 + * space of the device identified by the bus, device & function numbers in @bdf 120 + * on the PCI bus @bus. 121 + */ 122 + static int pci_phytium_read_config(struct udevice *bus, pci_dev_t bdf, 123 + uint offset, ulong *valuep, 124 + enum pci_size_t size) 125 + { 126 + return pci_generic_mmap_read_config(bus, pci_phytium_conf_address, 127 + bdf, offset, valuep, size); 128 + } 129 + 130 + /** 131 + * pci_phytium_write_config() - Write to configuration space 132 + * @bus: Pointer to the PCI bus 133 + * @bdf: Identifies the PCIe device to access 134 + * @offset: The offset into the device's configuration space 135 + * @value: The value to write 136 + * @size: Indicates the size of access to perform 137 + * 138 + * Write the value @value of size @size from offset @offset within the 139 + * configuration space of the device identified by the bus, device & function 140 + * numbers in @bdf on the PCI bus @bus. 141 + */ 142 + static int pci_phytium_write_config(struct udevice *bus, pci_dev_t bdf, 143 + uint offset, ulong value, 144 + enum pci_size_t size) 145 + { 146 + return pci_generic_mmap_write_config(bus, pci_phytium_conf_address, 147 + bdf, offset, value, size); 148 + } 149 + 150 + /** 151 + * pci_phytium_ofdata_to_platdata() - Translate from DT to device state 152 + * @dev: A pointer to the device being operated on 153 + * 154 + * Translate relevant data from the device tree pertaining to device @dev into 155 + * state that the driver will later make use of. This state is stored in the 156 + * device's private data structure. 157 + * 158 + * Return: 0 on success, else -EINVAL 159 + */ 160 + static int pci_phytium_ofdata_to_platdata(struct udevice *dev) 161 + { 162 + struct phytium_pcie *pcie = dev_get_priv(dev); 163 + struct fdt_resource reg_res; 164 + 165 + DECLARE_GLOBAL_DATA_PTR; 166 + 167 + int err; 168 + 169 + err = fdt_get_resource(gd->fdt_blob, dev_of_offset(dev), "reg", 170 + 0, &reg_res); 171 + if (err < 0) { 172 + pr_err("\"reg\" resource not found\n"); 173 + return err; 174 + } 175 + 176 + pcie->cfg_base = map_physmem(reg_res.start, 177 + fdt_resource_size(&reg_res), 178 + MAP_NOCACHE); 179 + 180 + return 0; 181 + } 182 + 183 + static const struct dm_pci_ops pci_phytium_ops = { 184 + .read_config = pci_phytium_read_config, 185 + .write_config = pci_phytium_write_config, 186 + }; 187 + 188 + static const struct udevice_id pci_phytium_ids[] = { 189 + { .compatible = "phytium,pcie-host-1.0" }, 190 + { } 191 + }; 192 + 193 + U_BOOT_DRIVER(pci_phytium) = { 194 + .name = "pci_phytium", 195 + .id = UCLASS_PCI, 196 + .of_match = pci_phytium_ids, 197 + .ops = &pci_phytium_ops, 198 + .ofdata_to_platdata = pci_phytium_ofdata_to_platdata, 199 + .priv_auto_alloc_size = sizeof(struct phytium_pcie), 200 + };
+44
include/configs/durian.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0+ */ 2 + /* 3 + * Copyright (C) 2019 4 + * shuyiqi <shuyiqi@phytium.com.cn> 5 + * liuhao <liuhao@phytium.com.cn> 6 + */ 7 + 8 + #ifndef __DURIAN_CONFIG_H__ 9 + #define __DURIAN_CONFIG_H__ 10 + 11 + /* Sdram Bank #1 Address */ 12 + #define PHYS_SDRAM_1 0x80000000 13 + #define PHYS_SDRAM_1_SIZE 0x7B000000 14 + #define CONFIG_SYS_SDRAM_BASE PHYS_SDRAM_1 15 + 16 + #define CONFIG_SYS_LOAD_ADDR (CONFIG_SYS_SDRAM_BASE + 0x10000000) 17 + 18 + /* Size of Malloc Pool */ 19 + #define CONFIG_ENV_SIZE 4096 20 + #define CONFIG_SYS_MALLOC_LEN (1 * 1024 * 1024 + CONFIG_ENV_SIZE) 21 + 22 + #define CONFIG_SYS_INIT_SP_ADDR (0x88000000 - 0x100000) 23 + 24 + /* PCI CONFIG */ 25 + #define CONFIG_SYS_PCI_64BIT 1 26 + #define CONFIG_PCI_SCAN_SHOW 27 + 28 + /* SCSI */ 29 + #define CONFIG_SYS_SCSI_MAX_SCSI_ID 4 30 + #define CONFIG_SYS_SCSI_MAX_LUN 1 31 + #define CONFIG_SYS_SCSI_MAX_DEVICE 128 32 + #define CONFIG_SCSI_AHCI_PLAT 33 + #define CONFIG_SYS_SATA_MAX_DEVICE 4 34 + 35 + /* BOOT */ 36 + #define CONFIG_SYS_BOOTM_LEN (60 * 1024 * 1024) 37 + 38 + #define CONFIG_EXTRA_ENV_SETTINGS \ 39 + "load_kernel=ext4load scsi 0:1 0x90100000 uImage-2004\0" \ 40 + "load_fdt=ext4load scsi 0:1 0x95000000 ft2004-pci-64.dtb\0"\ 41 + "boot_fdt=bootm 0x90100000 -:- 0x95000000\0" \ 42 + "distro_bootcmd=run load_kernel; run load_fdt; run boot_fdt" 43 + 44 + #endif