]> git.sur5r.net Git - u-boot/commitdiff
Merge git://git.denx.de/u-boot-uniphier
authorTom Rini <trini@konsulko.com>
Mon, 4 Dec 2017 15:24:35 +0000 (10:24 -0500)
committerTom Rini <trini@konsulko.com>
Mon, 4 Dec 2017 15:24:35 +0000 (10:24 -0500)
57 files changed:
arch/arm/config.mk
arch/arm/cpu/armv8/cache_v8.c
arch/arm/cpu/armv8/exceptions.S
arch/arm/dts/Makefile
arch/arm/dts/bcm2835-rpi-zero-w.dts [new file with mode: 0644]
arch/arm/dts/meson-gxl-s905x-khadas-vim.dts [new file with mode: 0644]
arch/arm/dts/meson-gxl-s905x-libretech-cc.dts [new file with mode: 0644]
arch/arm/include/asm/arch-meson/eth.h [new file with mode: 0644]
arch/arm/include/asm/arch-meson/gxbb.h
arch/arm/include/asm/arch-meson/mem.h [new file with mode: 0644]
arch/arm/include/asm/armv8/mmu.h
arch/arm/lib/interrupts_64.c
arch/arm/mach-bcm283x/Kconfig
arch/arm/mach-meson/Kconfig
arch/arm/mach-meson/Makefile
arch/arm/mach-meson/board.c
arch/arm/mach-meson/eth.c [new file with mode: 0644]
arch/arm/mach-omap2/utils.c
board/amlogic/khadas-vim/Kconfig [new file with mode: 0644]
board/amlogic/khadas-vim/MAINTAINERS [new file with mode: 0644]
board/amlogic/khadas-vim/Makefile [new file with mode: 0644]
board/amlogic/khadas-vim/README [new file with mode: 0644]
board/amlogic/khadas-vim/khadas-vim.c [new file with mode: 0644]
board/amlogic/libretech-cc/Kconfig [new file with mode: 0644]
board/amlogic/libretech-cc/MAINTAINERS [new file with mode: 0644]
board/amlogic/libretech-cc/Makefile [new file with mode: 0644]
board/amlogic/libretech-cc/README [new file with mode: 0644]
board/amlogic/libretech-cc/libretech-cc.c [new file with mode: 0644]
board/amlogic/odroid-c2/odroid-c2.c
board/amlogic/p212/p212.c
board/raspberrypi/rpi/rpi.c
configs/khadas-vim_defconfig [new file with mode: 0644]
configs/libretech-cc_defconfig [new file with mode: 0644]
configs/odroid-c2_defconfig
configs/omap3_evm_defconfig
configs/p212_defconfig
configs/rpi_0_w_defconfig [new file with mode: 0644]
drivers/firmware/psci.c
drivers/mtd/cfi_flash.c
include/configs/khadas-vim.h [new file with mode: 0644]
include/configs/libretech-cc.h [new file with mode: 0644]
include/configs/meson-gxbb-common.h
include/configs/omap3_evm.h
include/configs/rpi.h
include/test/compression.h [new file with mode: 0644]
include/test/suites.h
lib/libfdt/Makefile
lib/libfdt/fdt_region.c
lib/libfdt/fdt_wip.c
scripts/Makefile.uncmd_spl
test/cmd_ut.c
test/compression.c
test/env/cmd_ut_env.c
test/overlay/cmd_ut_overlay.c
test/py/conftest.py
tools/Makefile
tools/libfdt/fdt_wip.c [new file with mode: 0644]

index 1a77779db4dec99041a639f504e1ec2f363648a1..02f61fcc3cba247fce802f55b9398d1af6496ae4 100644 (file)
@@ -68,8 +68,8 @@ endif
 checkgcc6:
        @if test "$(call cc-name)" = "gcc" -a \
                        "$(call cc-version)" -lt "0600"; then \
-               echo -n '*** Your GCC is older than 6.0 and will not be '; \
-               echo 'supported starting in v2018.01.'; \
+               echo '*** Your GCC is older than 6.0 and is not supported'; \
+               false; \
        fi
 
 
index adc7e1746f5ca01bea6487da069167a92f762182..6548f3c9121f2bfe3823259a65b0c5bcc53735f2 100644 (file)
@@ -230,7 +230,10 @@ static void add_map(struct mm_region *map)
                                /* Page fits, create block PTE */
                                debug("Setting PTE %p to block virt=%llx\n",
                                      pte, virt);
-                               *pte = phys | attrs;
+                               if (level == 3)
+                                       *pte = phys | attrs | PTE_TYPE_PAGE;
+                               else
+                                       *pte = phys | attrs;
                                virt += blocksize;
                                phys += blocksize;
                                size -= blocksize;
index 4f4f526f9320ef348317f9f543456a8db08da3ac..8c7c1d3eb80f6883595927e0509d5705be60799d 100644 (file)
 #include <asm/macro.h>
 #include <linux/linkage.h>
 
+/*
+ * Exception vectors.
+ */
+       .align  11
+       .globl  vectors
+vectors:
+       .align  7               /* Current EL Synchronous Thread */
+       stp     x29, x30, [sp, #-16]!
+       bl      _exception_entry
+       bl      do_bad_sync
+       b       exception_exit
+
+       .align  7               /* Current EL IRQ Thread */
+       stp     x29, x30, [sp, #-16]!
+       bl      _exception_entry
+       bl      do_bad_irq
+       b       exception_exit
+
+       .align  7               /* Current EL FIQ Thread */
+       stp     x29, x30, [sp, #-16]!
+       bl      _exception_entry
+       bl      do_bad_fiq
+       b       exception_exit
+
+       .align  7               /* Current EL Error Thread */
+       stp     x29, x30, [sp, #-16]!
+       bl      _exception_entry
+       bl      do_bad_error
+       b       exception_exit
+
+       .align  7                /* Current EL Synchronous Handler */
+       stp     x29, x30, [sp, #-16]!
+       bl      _exception_entry
+       bl      do_sync
+       b       exception_exit
+
+       .align  7                /* Current EL IRQ Handler */
+       stp     x29, x30, [sp, #-16]!
+       bl      _exception_entry
+       bl      do_irq
+       b       exception_exit
+
+       .align  7                /* Current EL FIQ Handler */
+       stp     x29, x30, [sp, #-16]!
+       bl      _exception_entry
+       bl      do_fiq
+       b       exception_exit
+
+       .align  7                /* Current EL Error Handler */
+       stp     x29, x30, [sp, #-16]!
+       bl      _exception_entry
+       bl      do_error
+       b       exception_exit
+
 /*
  * Enter Exception.
  * This will save the processor state that is ELR/X0~X30
  * to the stack frame.
  */
-.macro exception_entry
-       stp     x29, x30, [sp, #-16]!
+_exception_entry:
        stp     x27, x28, [sp, #-16]!
        stp     x25, x26, [sp, #-16]!
        stp     x23, x24, [sp, #-16]!
 0:
        stp     x2, x0, [sp, #-16]!
        mov     x0, sp
-.endm
+       ret
 
-/*
- * Exception vectors.
- */
-       .align  11
-       .globl  vectors
-vectors:
-       .align  7
-       b       _do_bad_sync    /* Current EL Synchronous Thread */
-
-       .align  7
-       b       _do_bad_irq     /* Current EL IRQ Thread */
-
-       .align  7
-       b       _do_bad_fiq     /* Current EL FIQ Thread */
-
-       .align  7
-       b       _do_bad_error   /* Current EL Error Thread */
-
-       .align  7
-       b       _do_sync        /* Current EL Synchronous Handler */
-
-       .align  7
-       b       _do_irq         /* Current EL IRQ Handler */
-
-       .align  7
-       b       _do_fiq         /* Current EL FIQ Handler */
-
-       .align  7
-       b       _do_error       /* Current EL Error Handler */
-
-
-_do_bad_sync:
-       exception_entry
-       bl      do_bad_sync
-       b       exception_exit
-
-_do_bad_irq:
-       exception_entry
-       bl      do_bad_irq
-       b       exception_exit
-
-_do_bad_fiq:
-       exception_entry
-       bl      do_bad_fiq
-       b       exception_exit
-
-_do_bad_error:
-       exception_entry
-       bl      do_bad_error
-       b       exception_exit
-
-_do_sync:
-       exception_entry
-       bl      do_sync
-       b       exception_exit
-
-_do_irq:
-       exception_entry
-       bl      do_irq
-       b       exception_exit
-
-_do_fiq:
-       exception_entry
-       bl      do_fiq
-       b       exception_exit
-
-_do_error:
-       exception_entry
-       bl      do_error
-       b       exception_exit
 
 exception_exit:
        ldp     x2, x0, [sp],#16
index 1518616bfb52f87836c3325c82b9abf5bd674196..ed85349d3fcd12c84be9e1c8e5383b7dda1ebe66 100644 (file)
@@ -56,7 +56,9 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += \
        rv1108-evb.dtb
 dtb-$(CONFIG_ARCH_MESON) += \
        meson-gxbb-odroidc2.dtb \
-       meson-gxl-s905x-p212.dtb
+       meson-gxl-s905x-p212.dtb \
+       meson-gxl-s905x-libretech-cc.dtb \
+       meson-gxl-s905x-khadas-vim.dtb
 dtb-$(CONFIG_TEGRA) += tegra20-harmony.dtb \
        tegra20-medcom-wide.dtb \
        tegra20-paz00.dtb \
diff --git a/arch/arm/dts/bcm2835-rpi-zero-w.dts b/arch/arm/dts/bcm2835-rpi-zero-w.dts
new file mode 100644 (file)
index 0000000..7817054
--- /dev/null
@@ -0,0 +1,26 @@
+/dts-v1/;
+#include "bcm2835.dtsi"
+#include "bcm2835-rpi.dtsi"
+#include "bcm283x-rpi-smsc9512.dtsi"
+#include "bcm283x-rpi-usb-host.dtsi"
+
+/ {
+       compatible = "raspberrypi,model-zero-w", "brcm,bcm2835";
+       model = "Raspberry Pi Zero W";
+
+       leds {
+               act {
+                       gpios = <&gpio 47 0>;
+               };
+       };
+};
+
+&uart1 {
+    pinctrl-names = "default";
+    pinctrl-0 = <&uart1_gpio14>;
+    status = "okay";
+};
+
+&hdmi {
+       hpd-gpios = <&gpio 46 GPIO_ACTIVE_LOW>;
+};
diff --git a/arch/arm/dts/meson-gxl-s905x-khadas-vim.dts b/arch/arm/dts/meson-gxl-s905x-khadas-vim.dts
new file mode 100644 (file)
index 0000000..94567eb
--- /dev/null
@@ -0,0 +1,137 @@
+/*
+ * Copyright (c) 2017 Martin Blumenstingl <martin.blumenstingl@googlemail.com>.
+ *
+ * SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+ */
+
+/dts-v1/;
+
+#include <dt-bindings/input/input.h>
+
+#include "meson-gxl-s905x-p212.dtsi"
+
+/ {
+       compatible = "khadas,vim", "amlogic,s905x", "amlogic,meson-gxl";
+       model = "Khadas VIM";
+
+       adc-keys {
+               compatible = "adc-keys";
+               io-channels = <&saradc 0>;
+               io-channel-names = "buttons";
+               keyup-threshold-microvolt = <1710000>;
+
+               button-function {
+                       label = "Function";
+                       linux,code = <KEY_FN>;
+                       press-threshold-microvolt = <10000>;
+               };
+       };
+
+       aliases {
+               serial2 = &uart_AO_B;
+       };
+
+       gpio-keys-polled {
+               compatible = "gpio-keys-polled";
+               #address-cells = <1>;
+               #size-cells = <0>;
+               poll-interval = <100>;
+
+               button@0 {
+                       label = "power";
+                       linux,code = <KEY_POWER>;
+                       gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_LOW>;
+               };
+       };
+
+       pwmleds {
+               compatible = "pwm-leds";
+
+               power {
+                       label = "vim:red:power";
+                       pwms = <&pwm_AO_ab 1 7812500 0>;
+                       max-brightness = <255>;
+                       linux,default-trigger = "default-on";
+               };
+       };
+
+       hdmi-connector {
+               compatible = "hdmi-connector";
+               type = "a";
+
+               port {
+                       hdmi_connector_in: endpoint {
+                               remote-endpoint = <&hdmi_tx_tmds_out>;
+                       };
+               };
+       };
+};
+
+&hdmi_tx {
+       status = "okay";
+       pinctrl-0 = <&hdmi_hpd_pins>, <&hdmi_i2c_pins>;
+       pinctrl-names = "default";
+};
+
+&hdmi_tx_tmds_port {
+       hdmi_tx_tmds_out: endpoint {
+               remote-endpoint = <&hdmi_connector_in>;
+       };
+};
+
+&i2c_A {
+       status = "okay";
+       pinctrl-0 = <&i2c_a_pins>;
+       pinctrl-names = "default";
+};
+
+&i2c_B {
+       status = "okay";
+       pinctrl-0 = <&i2c_b_pins>;
+       pinctrl-names = "default";
+
+       rtc: rtc@51 {
+               /* has to be enabled manually when a battery is connected: */
+               status = "disabled";
+               compatible = "haoyu,hym8563";
+               reg = <0x51>;
+               #clock-cells = <0>;
+               clock-frequency = <32768>;
+               clock-output-names = "xin32k";
+       };
+};
+
+&ir {
+       linux,rc-map-name = "rc-geekbox";
+};
+
+&pwm_AO_ab {
+       status = "okay";
+       pinctrl-0 = <&pwm_ao_a_3_pins>, <&pwm_ao_b_pins>;
+       pinctrl-names = "default";
+       clocks = <&xtal> , <&xtal>;
+       clock-names = "clkin0", "clkin1" ;
+};
+
+&pwm_ef {
+       pinctrl-0 = <&pwm_e_pins>, <&pwm_f_clk_pins>;
+};
+
+&sd_emmc_a {
+       brcmf: wifi@1 {
+               reg = <1>;
+               compatible = "brcm,bcm4329-fmac";
+       };
+};
+
+/* This is brought out on the Linux_RX (18) and Linux_TX (19) pins: */
+&uart_AO {
+       status = "okay";
+};
+
+/* This is brought out on the UART_RX_AO_B (15) and UART_TX_AO_B (16) pins: */
+&uart_AO_B {
+       status = "okay";
+       pinctrl-0 = <&uart_ao_b_pins>;
+       pinctrl-names = "default";
+};
diff --git a/arch/arm/dts/meson-gxl-s905x-libretech-cc.dts b/arch/arm/dts/meson-gxl-s905x-libretech-cc.dts
new file mode 100644 (file)
index 0000000..266fbcf
--- /dev/null
@@ -0,0 +1,171 @@
+/*
+ * Copyright (c) 2017 BayLibre, SAS.
+ * Author: Neil Armstrong <narmstrong@baylibre.com>
+ * Author: Jerome Brunet <jbrunet@baylibre.com>
+ *
+ * SPDX-License-Identifier: (GPL-2.0+ OR MIT)
+ */
+
+/dts-v1/;
+
+#include <dt-bindings/input/input.h>
+
+#include "meson-gxl-s905x.dtsi"
+
+/ {
+       compatible = "libretech,cc", "amlogic,s905x", "amlogic,meson-gxl";
+       model = "Libre Technology CC";
+
+       aliases {
+               serial0 = &uart_AO;
+       };
+
+       chosen {
+               stdout-path = "serial0:115200n8";
+       };
+
+       cvbs-connector {
+               compatible = "composite-video-connector";
+
+               port {
+                       cvbs_connector_in: endpoint {
+                               remote-endpoint = <&cvbs_vdac_out>;
+                       };
+               };
+       };
+
+       emmc_pwrseq: emmc-pwrseq {
+               compatible = "mmc-pwrseq-emmc";
+               reset-gpios = <&gpio BOOT_9 GPIO_ACTIVE_LOW>;
+       };
+
+       hdmi-connector {
+               compatible = "hdmi-connector";
+               type = "a";
+
+               port {
+                       hdmi_connector_in: endpoint {
+                               remote-endpoint = <&hdmi_tx_tmds_out>;
+                       };
+               };
+       };
+
+       leds {
+               compatible = "gpio-leds";
+
+               system {
+                       label = "librecomputer:system-status";
+                       gpios = <&gpio GPIODV_24 GPIO_ACTIVE_HIGH>;
+                       default-state = "on";
+                       panic-indicator;
+               };
+
+               blue {
+                       label = "librecomputer:blue";
+                       gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>;
+                       linux,default-trigger = "heartbeat";
+               };
+       };
+
+       memory@0 {
+               device_type = "memory";
+               reg = <0x0 0x0 0x0 0x80000000>;
+       };
+
+       vcc_3v3: regulator-vcc_3v3 {
+               compatible = "regulator-fixed";
+               regulator-name = "VCC_3V3";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+       };
+
+       vcc_card: regulator-vcc-card {
+               compatible = "regulator-gpio";
+
+               regulator-name = "VCC_CARD";
+               regulator-min-microvolt = <1800000>;
+               regulator-max-microvolt = <3300000>;
+
+               gpios = <&gpio_ao GPIOAO_3 GPIO_ACTIVE_HIGH>;
+               gpios-states = <0>;
+
+               states = <3300000 0>,
+                        <1800000 1>;
+       };
+
+       vddio_boot: regulator-vddio_boot {
+               compatible = "regulator-fixed";
+               regulator-name = "VDDIO_BOOT";
+               regulator-min-microvolt = <3300000>;
+               regulator-max-microvolt = <3300000>;
+       };
+};
+
+&cvbs_vdac_port {
+       cvbs_vdac_out: endpoint {
+               remote-endpoint = <&cvbs_connector_in>;
+       };
+};
+
+&ethmac {
+       status = "okay";
+};
+
+&ir {
+       status = "okay";
+       pinctrl-0 = <&remote_input_ao_pins>;
+       pinctrl-names = "default";
+};
+
+&hdmi_tx {
+       status = "okay";
+       pinctrl-0 = <&hdmi_hpd_pins>, <&hdmi_i2c_pins>;
+       pinctrl-names = "default";
+};
+
+&hdmi_tx_tmds_port {
+       hdmi_tx_tmds_out: endpoint {
+               remote-endpoint = <&hdmi_connector_in>;
+       };
+};
+
+/* SD card */
+&sd_emmc_b {
+       status = "okay";
+       pinctrl-0 = <&sdcard_pins>;
+       pinctrl-names = "default";
+
+       bus-width = <4>;
+       cap-sd-highspeed;
+       max-frequency = <100000000>;
+       disable-wp;
+
+       cd-gpios = <&gpio CARD_6 GPIO_ACTIVE_HIGH>;
+       cd-inverted;
+
+       vmmc-supply = <&vcc_3v3>;
+       vqmmc-supply = <&vcc_card>;
+};
+
+/* eMMC */
+&sd_emmc_c {
+       status = "okay";
+       pinctrl-0 = <&emmc_pins>;
+       pinctrl-names = "default";
+
+       bus-width = <8>;
+       cap-mmc-highspeed;
+       max-frequency = <50000000>;
+       non-removable;
+       disable-wp;
+
+       mmc-pwrseq = <&emmc_pwrseq>;
+       vmmc-supply = <&vcc_3v3>;
+       vqmmc-supply = <&vddio_boot>;
+};
+
+&uart_AO {
+       status = "okay";
+       pinctrl-0 = <&uart_ao_a_pins>;
+       pinctrl-names = "default";
+};
diff --git a/arch/arm/include/asm/arch-meson/eth.h b/arch/arm/include/asm/arch-meson/eth.h
new file mode 100644 (file)
index 0000000..3089f13
--- /dev/null
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2016 BayLibre, SAS
+ * Author: Neil Armstrong <narmstrong@baylibre.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef __MESON_ETH_H__
+#define __MESON_ETH_H__
+
+#include <phy.h>
+
+enum {
+       /* Use GXL Internal RMII PHY */
+       MESON_GXL_USE_INTERNAL_RMII_PHY = 1,
+};
+
+/* Configure the Ethernet MAC with the requested interface mode
+ * with some optional flags.
+ */
+void meson_gx_eth_init(phy_interface_t mode, unsigned int flags);
+
+#endif /* __MESON_ETH_H__ */
index 95a6fe6998e249b2baed5e743bc3eecc82543e61..ef63dea44964d2be1ea80b1166d838bf2d30ac90 100644 (file)
@@ -7,10 +7,27 @@
 #ifndef __GXBB_H__
 #define __GXBB_H__
 
+#define GXBB_FIRMWARE_MEM_SIZE 0x1000000
+
+#define GXBB_AOBUS_BASE                0xc8100000
 #define GXBB_PERIPHS_BASE      0xc8834400
 #define GXBB_HIU_BASE          0xc883c000
 #define GXBB_ETH_BASE          0xc9410000
 
+/* Always-On Peripherals registers */
+#define GXBB_AO_ADDR(off)      (GXBB_AOBUS_BASE + ((off) << 2))
+
+#define GXBB_AO_SEC_GP_CFG0    GXBB_AO_ADDR(0x90)
+#define GXBB_AO_SEC_GP_CFG3    GXBB_AO_ADDR(0x93)
+#define GXBB_AO_SEC_GP_CFG4    GXBB_AO_ADDR(0x94)
+#define GXBB_AO_SEC_GP_CFG5    GXBB_AO_ADDR(0x95)
+
+#define GXBB_AO_MEM_SIZE_MASK  0xFFFF0000
+#define GXBB_AO_MEM_SIZE_SHIFT 16
+#define GXBB_AO_BL31_RSVMEM_SIZE_MASK  0xFFFF0000
+#define GXBB_AO_BL31_RSVMEM_SIZE_SHIFT 16
+#define GXBB_AO_BL32_RSVMEM_SIZE_MASK  0xFFFF
+
 /* Peripherals registers */
 #define GXBB_PERIPHS_ADDR(off) (GXBB_PERIPHS_BASE + ((off) << 2))
 
diff --git a/arch/arm/include/asm/arch-meson/mem.h b/arch/arm/include/asm/arch-meson/mem.h
new file mode 100644 (file)
index 0000000..86a8417
--- /dev/null
@@ -0,0 +1,16 @@
+/*
+ * Copyright (C) 2016 BayLibre, SAS
+ * Author: Neil Armstrong <narmstrong@baylibre.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef __MESON_MEM_H__
+#define __MESON_MEM_H__
+
+/* Configure the reserved memory zones exported by the secure registers
+ * into EFI and DTB reserved memory entries.
+ */
+void meson_gx_init_reserved_memory(void *fdt);
+
+#endif /* __MESON_MEM_H__ */
index 6121aab547fc8a0f8015c05479ef8b4ef77edc35..765914c7e269f03adf1d1d9ead59bd21d2f86ee8 100644 (file)
@@ -43,6 +43,7 @@
 #define PTE_TYPE_MASK          (3 << 0)
 #define PTE_TYPE_FAULT         (0 << 0)
 #define PTE_TYPE_TABLE         (3 << 0)
+#define PTE_TYPE_PAGE          (3 << 0)
 #define PTE_TYPE_BLOCK         (1 << 0)
 #define PTE_TYPE_VALID         (1 << 0)
 
index 7c9cfce69fafe7f1ef4055e2af69a1d67ca3c7ca..cbcfeec2b030056094f9c2d76da2dc9734c28cf8 100644 (file)
@@ -9,6 +9,7 @@
 #include <linux/compiler.h>
 #include <efi_loader.h>
 
+DECLARE_GLOBAL_DATA_PTR;
 
 int interrupt_init(void)
 {
@@ -29,8 +30,13 @@ void show_regs(struct pt_regs *regs)
 {
        int i;
 
-       printf("ELR:     %lx\n", regs->elr);
-       printf("LR:      %lx\n", regs->regs[30]);
+       if (gd->flags & GD_FLG_RELOC) {
+               printf("ELR:     %lx\n", regs->elr - gd->reloc_off);
+               printf("LR:      %lx\n", regs->regs[30] - gd->reloc_off);
+       } else {
+               printf("ELR:     %lx\n", regs->elr);
+               printf("LR:      %lx\n", regs->regs[30]);
+       }
        for (i = 0; i < 29; i += 2)
                printf("x%-2d: %016lx x%-2d: %016lx\n",
                       i, regs->regs[i], i+1, regs->regs[i+1]);
index 69f7a4663cfd185b79ea9baf6fb481e3e70987f3..a78239d63e4cd9cdf7a0c9c1fe7657b2892c6510 100644 (file)
@@ -44,6 +44,22 @@ config TARGET_RPI
          This option creates a build targetting the ARM1176 ISA.
        select BCM2835
 
+config TARGET_RPI_0_W
+       bool "Raspberry Pi Zero W"
+       help
+         Support for all ARM1176-/BCM2835-based Raspberry Pi variants, such as
+         the RPi Zero model W.
+
+         This option assumes the VideoCore firmware is configured to use the
+         mini UART (rather than PL011) for the serial console. This is the
+         default on the RPi Zero W. To enable the UART console, the following
+         non-default option must be present in config.txt: enable_uart=1.
+         This is required for U-Boot to operate correctly, even if you only
+         care about the HDMI/usbkbd console.
+
+         This option creates a build targetting the ARMv7/AArch32 ISA.
+       select BCM2835
+
 config TARGET_RPI_2
        bool "Raspberry Pi 2"
        help
index d4bd230be3b05e335b8f547fcb24d73334c37522..0350787daa79f3de397b19f6d4b14db22c070d3e 100644 (file)
@@ -38,6 +38,20 @@ config TARGET_P212
          with 2 GiB of RAM, Ethernet, HDMI, 2 USB, micro-SD slot,
          eMMC, IR receiver, CVBS+Audio jack and a SDIO WiFi module.
 
+config TARGET_LIBRETECH_CC
+       bool "LIBRETECH-CC"
+       help
+         LibreTech CC is a single board computer based on Meson GXL
+         with 2 GiB of RAM, Ethernet, HDMI, 4 USB, micro-SD slot,
+         eMMC, IR receiver and a 40-pin GPIO header.
+
+config TARGET_KHADAS_VIM
+       bool "KHADAS-VIM"
+       help
+         Khadas VIM is a single board computer based on Meson GXL
+         with 2 GiB of RAM, Ethernet, HDMI, 4 USB, micro-SD slot,
+         eMMC, IR receiver and a 40-pin GPIO header.
+
 endif
 
 config SYS_SOC
@@ -50,4 +64,8 @@ source "board/amlogic/odroid-c2/Kconfig"
 
 source "board/amlogic/p212/Kconfig"
 
+source "board/amlogic/libretech-cc/Kconfig"
+
+source "board/amlogic/khadas-vim/Kconfig"
+
 endif
index bf49b8b1e57debab1f259234ea046bb9d4bdb6f7..b4e8dded14cab264c3f157ea42a48bd11dd85631 100644 (file)
@@ -4,4 +4,4 @@
 # SPDX-License-Identifier:     GPL-2.0+
 #
 
-obj-y += board.o sm.o
+obj-y += board.o sm.o eth.o
index e89c6aace98d6e021ee5b86030ac7529623aafc5..908a0cae5607a09798ecc281d34800b15056d4a7 100644 (file)
@@ -11,6 +11,9 @@
 #include <asm/arch/sm.h>
 #include <asm/armv8/mmu.h>
 #include <asm/unaligned.h>
+#include <linux/sizes.h>
+#include <efi_loader.h>
+#include <asm/io.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -34,15 +37,70 @@ int dram_init(void)
        return 0;
 }
 
-int dram_init_banksize(void)
+phys_size_t get_effective_memsize(void)
 {
-       /* Reserve first 16 MiB of RAM for firmware */
-       gd->bd->bi_dram[0].start = 0x1000000;
-       gd->bd->bi_dram[0].size  = 0xf000000;
-       /* Reserve 2 MiB for ARM Trusted Firmware (BL31) */
-       gd->bd->bi_dram[1].start = 0x10000000;
-       gd->bd->bi_dram[1].size  = gd->ram_size - 0x10200000;
-       return 0;
+       /* Size is reported in MiB, convert it in bytes */
+       return ((readl(GXBB_AO_SEC_GP_CFG0) & GXBB_AO_MEM_SIZE_MASK)
+                       >> GXBB_AO_MEM_SIZE_SHIFT) * SZ_1M;
+}
+
+static void meson_board_add_reserved_memory(void *fdt, u64 start, u64 size)
+{
+       int ret;
+
+       ret = fdt_add_mem_rsv(fdt, start, size);
+       if (ret)
+               printf("Could not reserve zone @ 0x%llx\n", start);
+
+       if (IS_ENABLED(CONFIG_EFI_LOADER)) {
+               efi_add_memory_map(start,
+                                  ALIGN(size, EFI_PAGE_SIZE) >> EFI_PAGE_SHIFT,
+                                  EFI_RESERVED_MEMORY_TYPE, false);
+       }
+}
+
+void meson_gx_init_reserved_memory(void *fdt)
+{
+       u64 bl31_size, bl31_start;
+       u64 bl32_size, bl32_start;
+       u32 reg;
+
+       /*
+        * Get ARM Trusted Firmware reserved memory zones in :
+        * - AO_SEC_GP_CFG3: bl32 & bl31 size in KiB, can be 0
+        * - AO_SEC_GP_CFG5: bl31 physical start address, can be NULL
+        * - AO_SEC_GP_CFG4: bl32 physical start address, can be NULL
+        */
+
+       reg = readl(GXBB_AO_SEC_GP_CFG3);
+
+       bl31_size = ((reg & GXBB_AO_BL31_RSVMEM_SIZE_MASK)
+                       >> GXBB_AO_BL31_RSVMEM_SIZE_SHIFT) * SZ_1K;
+       bl32_size = (reg & GXBB_AO_BL32_RSVMEM_SIZE_MASK) * SZ_1K;
+
+       bl31_start = readl(GXBB_AO_SEC_GP_CFG5);
+       bl32_start = readl(GXBB_AO_SEC_GP_CFG4);
+
+       /*
+        * Early Meson GXBB Firmware revisions did not provide the reserved
+        * memory zones in the registers, keep fixed memory zone handling.
+        */
+       if (IS_ENABLED(CONFIG_MESON_GXBB) &&
+           !reg && !bl31_start && !bl32_start) {
+               bl31_start = 0x10000000;
+               bl31_size = 0x200000;
+       }
+
+       /* Add first 16MiB reserved zone */
+       meson_board_add_reserved_memory(fdt, 0, GXBB_FIRMWARE_MEM_SIZE);
+
+       /* Add BL31 reserved zone */
+       if (bl31_start && bl31_size)
+               meson_board_add_reserved_memory(fdt, bl31_start, bl31_size);
+
+       /* Add BL32 reserved zone */
+       if (bl32_start && bl32_size)
+               meson_board_add_reserved_memory(fdt, bl32_start, bl32_size);
 }
 
 void reset_cpu(ulong addr)
diff --git a/arch/arm/mach-meson/eth.c b/arch/arm/mach-meson/eth.c
new file mode 100644 (file)
index 0000000..2debe93
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2016 BayLibre, SAS
+ * Author: Neil Armstrong <narmstrong@baylibre.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <asm/io.h>
+#include <asm/arch/gxbb.h>
+#include <asm/arch/eth.h>
+#include <phy.h>
+
+/* Configure the Ethernet MAC with the requested interface mode
+ * with some optional flags.
+ */
+void meson_gx_eth_init(phy_interface_t mode, unsigned int flags)
+{
+       switch (mode) {
+       case PHY_INTERFACE_MODE_RGMII:
+       case PHY_INTERFACE_MODE_RGMII_ID:
+       case PHY_INTERFACE_MODE_RGMII_RXID:
+       case PHY_INTERFACE_MODE_RGMII_TXID:
+               /* Set RGMII mode */
+               setbits_le32(GXBB_ETH_REG_0, GXBB_ETH_REG_0_PHY_INTF |
+                            GXBB_ETH_REG_0_TX_PHASE(1) |
+                            GXBB_ETH_REG_0_TX_RATIO(4) |
+                            GXBB_ETH_REG_0_PHY_CLK_EN |
+                            GXBB_ETH_REG_0_CLK_EN);
+               break;
+
+       case PHY_INTERFACE_MODE_RMII:
+               /* Set RMII mode */
+               out_le32(GXBB_ETH_REG_0, GXBB_ETH_REG_0_INVERT_RMII_CLK |
+                                        GXBB_ETH_REG_0_CLK_EN);
+
+               /* Use GXL RMII Internal PHY */
+               if (IS_ENABLED(CONFIG_MESON_GXL) &&
+                   (flags & MESON_GXL_USE_INTERNAL_RMII_PHY)) {
+                       writel(GXBB_ETH_REG_2, 0x10110181);
+                       writel(GXBB_ETH_REG_3, 0xe40908ff);
+               }
+
+               break;
+
+       default:
+               printf("Invalid Ethernet interface mode\n");
+               return;
+       }
+
+       /* Enable power and clock gate */
+       setbits_le32(GXBB_GCLK_MPEG_1, GXBB_GCLK_MPEG_1_ETH);
+       clrbits_le32(GXBB_MEM_PD_REG_0, GXBB_MEM_PD_REG_0_ETH_MASK);
+}
index 2e8778043b7063e5af1cfcf598cbbe1cc8687266..d11670c0eee0cb161d96d479441bdeaf1abdecb1 100644 (file)
@@ -215,6 +215,9 @@ void omap_die_id_usbethaddr(void)
                mac[5] = (die_id[0] >> 8) & 0xff;
 
                eth_env_set_enetaddr("usbethaddr", mac);
+
+               if (!env_get("ethaddr"))
+                       eth_env_set_enetaddr("ethaddr", mac);
        }
 }
 
diff --git a/board/amlogic/khadas-vim/Kconfig b/board/amlogic/khadas-vim/Kconfig
new file mode 100644 (file)
index 0000000..0fa8db9
--- /dev/null
@@ -0,0 +1,12 @@
+if TARGET_KHADAS_VIM
+
+config SYS_BOARD
+       default "khadas-vim"
+
+config SYS_VENDOR
+       default "amlogic"
+
+config SYS_CONFIG_NAME
+       default "khadas-vim"
+
+endif
diff --git a/board/amlogic/khadas-vim/MAINTAINERS b/board/amlogic/khadas-vim/MAINTAINERS
new file mode 100644 (file)
index 0000000..024220a
--- /dev/null
@@ -0,0 +1,6 @@
+KHADAS-VIM
+M:     Neil Armstrong <narmstrong@baylibre.com>
+S:     Maintained
+F:     board/amlogic/khadas-vim/
+F:     include/configs/khadas-vim.h
+F:     configs/khadas-vim_defconfig
diff --git a/board/amlogic/khadas-vim/Makefile b/board/amlogic/khadas-vim/Makefile
new file mode 100644 (file)
index 0000000..eedc1bf
--- /dev/null
@@ -0,0 +1,8 @@
+#
+# (C) Copyright 2016 BayLibre, SAS
+# Author: Neil Armstrong <narmstrong@baylibre.com>
+#
+# SPDX-License-Identifier:     GPL-2.0+
+#
+
+obj-y  := khadas-vim.o
diff --git a/board/amlogic/khadas-vim/README b/board/amlogic/khadas-vim/README
new file mode 100644 (file)
index 0000000..0478eee
--- /dev/null
@@ -0,0 +1,96 @@
+U-Boot for Khadas VIM
+=======================
+
+Khadas VIM is an Open Source DIY Box manufactured by Shenzhen Tomato
+Technology Co., Ltd with the following specifications:
+
+ - Amlogic S905x ARM Cortex-A53 quad-core SoC @ 2GHz
+ - ARM Mali 450 GPU
+ - 2GB DDR3 SDRAM
+ - 10/100 Ethernet
+ - HDMI 2.0 4K/60Hz display
+ - 40-pin GPIO header
+ - 2 x USB 2.0 Host, 1 x USB 2.0 Type-C OTG
+ - 8GB/16GBeMMC
+ - microSD
+ - SDIO Wifi Module, Bluetooth
+ - Two channels IR receiver
+
+Currently the u-boot port supports the following devices:
+ - serial
+ - eMMC, microSD
+ - Ethernet
+
+U-Boot compilation
+==================
+
+ > export ARCH=arm
+ > export CROSS_COMPILE=aarch64-none-elf-
+ > make khadas-vim_defconfig
+ > make
+
+Image creation
+==============
+
+Amlogic doesn't provide sources for the firmware and for tools needed
+to create the bootloader image, so it is necessary to obtain them from
+the git tree published by the board vendor:
+
+ > wget https://releases.linaro.org/archive/13.11/components/toolchain/binaries/gcc-linaro-aarch64-none-elf-4.8-2013.11_linux.tar.xz
+ > wget https://releases.linaro.org/archive/13.11/components/toolchain/binaries/gcc-linaro-arm-none-eabi-4.8-2013.11_linux.tar.xz
+ > tar xvfJ gcc-linaro-aarch64-none-elf-4.8-2013.11_linux.tar.xz
+ > tar xvfJ gcc-linaro-arm-none-eabi-4.8-2013.11_linux.tar.xz
+ > export PATH=$PWD/gcc-linaro-aarch64-none-elf-4.8-2013.11_linux/bin:$PWD/gcc-linaro-arm-none-eabi-4.8-2013.11_linux/bin:$PATH
+ > git clone https://github.com/khadas/u-boot -b Vim vim-u-boot
+ > cd vim-u-boot
+ > make kvim_defconfig
+ > make
+ > export FIPDIR=$PWD/fip
+
+Go back to mainline U-Boot source tree then :
+ > mkdir fip
+
+ > cp $FIPDIR/gxl/bl2.bin fip/
+ > cp $FIPDIR/gxl/acs.bin fip/
+ > cp $FIPDIR/gxl/bl21.bin fip/
+ > cp $FIPDIR/gxl/bl30.bin fip/
+ > cp $FIPDIR/gxl/bl301.bin fip/
+ > cp $FIPDIR/gxl/bl31.img fip/
+ > cp u-boot.bin fip/bl33.bin
+
+ > $FIPDIR/blx_fix.sh \
+       fip/bl30.bin \
+       fip/zero_tmp \
+       fip/bl30_zero.bin \
+       fip/bl301.bin \
+       fip/bl301_zero.bin \
+       fip/bl30_new.bin \
+       bl30
+
+ > $FIPDIR/acs_tool.pyc fip/bl2.bin fip/bl2_acs.bin fip/acs.bin 0
+
+ > $FIPDIR/blx_fix.sh \
+       fip/bl2_acs.bin \
+       fip/zero_tmp \
+       fip/bl2_zero.bin \
+       fip/bl21.bin \
+       fip/bl21_zero.bin \
+       fip/bl2_new.bin \
+       bl2
+
+ > $FIPDIR/gxl/aml_encrypt_gxl --bl3enc --input fip/bl30_new.bin
+ > $FIPDIR/gxl/aml_encrypt_gxl --bl3enc --input fip/bl31.img
+ > $FIPDIR/gxl/aml_encrypt_gxl --bl3enc --input fip/bl33.bin
+ > $FIPDIR/gxl/aml_encrypt_gxl --bl2sig --input fip/bl2_new.bin --output fip/bl2.n.bin.sig
+ > $FIPDIR/gxl/aml_encrypt_gxl --bootmk \
+               --output fip/u-boot.bin \
+               --bl2 fip/bl2.n.bin.sig \
+               --bl30 fip/bl30_new.bin.enc \
+               --bl31 fip/bl31.img.enc \
+               --bl33 fip/bl33.bin.enc
+
+and then write the image to SD with:
+
+ > DEV=/dev/your_sd_device
+ > dd if=fip/u-boot.bin.sd.bin of=$DEV conv=fsync,notrunc bs=512 skip=1 seek=1
+ > dd if=fip/u-boot.bin.sd.bin of=$DEV conv=fsync,notrunc bs=1 count=444
diff --git a/board/amlogic/khadas-vim/khadas-vim.c b/board/amlogic/khadas-vim/khadas-vim.c
new file mode 100644 (file)
index 0000000..5e19856
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2016 BayLibre, SAS
+ * Author: Neil Armstrong <narmstrong@baylibre.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <asm/io.h>
+#include <asm/arch/gxbb.h>
+#include <asm/arch/mem.h>
+#include <asm/arch/sm.h>
+#include <asm/arch/eth.h>
+
+#define EFUSE_SN_OFFSET                20
+#define EFUSE_SN_SIZE          16
+#define EFUSE_MAC_OFFSET       52
+#define EFUSE_MAC_SIZE         6
+
+int board_init(void)
+{
+       return 0;
+}
+
+int misc_init_r(void)
+{
+       u8 mac_addr[EFUSE_MAC_SIZE];
+       char serial[EFUSE_SN_SIZE];
+       ssize_t len;
+
+       meson_gx_eth_init(PHY_INTERFACE_MODE_RMII,
+                         MESON_GXL_USE_INTERNAL_RMII_PHY);
+
+       if (!eth_env_get_enetaddr("ethaddr", mac_addr)) {
+               len = meson_sm_read_efuse(EFUSE_MAC_OFFSET,
+                                         mac_addr, EFUSE_MAC_SIZE);
+               if (len == EFUSE_MAC_SIZE && is_valid_ethaddr(mac_addr))
+                       eth_env_set_enetaddr("ethaddr", mac_addr);
+       }
+
+       if (!env_get("serial#")) {
+               len = meson_sm_read_efuse(EFUSE_SN_OFFSET, serial,
+                                         EFUSE_SN_SIZE);
+               if (len == EFUSE_SN_SIZE)
+                       env_set("serial#", serial);
+       }
+
+       return 0;
+}
+
+int ft_board_setup(void *blob, bd_t *bd)
+{
+       meson_gx_init_reserved_memory(blob);
+
+       return 0;
+}
diff --git a/board/amlogic/libretech-cc/Kconfig b/board/amlogic/libretech-cc/Kconfig
new file mode 100644 (file)
index 0000000..7a6f916
--- /dev/null
@@ -0,0 +1,12 @@
+if TARGET_LIBRETECH_CC
+
+config SYS_BOARD
+       default "libretech-cc"
+
+config SYS_VENDOR
+       default "amlogic"
+
+config SYS_CONFIG_NAME
+       default "libretech-cc"
+
+endif
diff --git a/board/amlogic/libretech-cc/MAINTAINERS b/board/amlogic/libretech-cc/MAINTAINERS
new file mode 100644 (file)
index 0000000..398ce57
--- /dev/null
@@ -0,0 +1,6 @@
+LIBRETECH-CC
+M:     Neil Armstrong <narmstrong@baylibre.com>
+S:     Maintained
+F:     board/amlogic/libretech-cc/
+F:     include/configs/libretech-cc.h
+F:     configs/libretech-cc_defconfig
diff --git a/board/amlogic/libretech-cc/Makefile b/board/amlogic/libretech-cc/Makefile
new file mode 100644 (file)
index 0000000..d0e3bbb
--- /dev/null
@@ -0,0 +1,8 @@
+#
+# (C) Copyright 2016 BayLibre, SAS
+# Author: Neil Armstrong <narmstrong@baylibre.com>
+#
+# SPDX-License-Identifier:     GPL-2.0+
+#
+
+obj-y  := libretech-cc.o
diff --git a/board/amlogic/libretech-cc/README b/board/amlogic/libretech-cc/README
new file mode 100644 (file)
index 0000000..c06a392
--- /dev/null
@@ -0,0 +1,96 @@
+U-Boot for LibreTech CC
+=======================
+
+LibreTech CC is a single board computer manufactured by Libre Technology
+with the following specifications:
+
+ - Amlogic S905X ARM Cortex-A53 quad-core SoC @ 2GHz
+ - ARM Mali 450 GPU
+ - 2GB DDR3 SDRAM
+ - Gigabit Ethernet
+ - HDMI 2.0 4K/60Hz display
+ - 40-pin GPIO header
+ - 4 x USB 2.0 Host, 1 x USB OTG
+ - eMMC, microSD
+ - Infrared receiver
+
+Schematics are available on the manufacturer website.
+
+Currently the U-Boot port supports the following devices:
+ - serial
+ - eMMC, microSD
+ - Ethernet
+
+U-Boot compilation
+==================
+
+ > export ARCH=arm
+ > export CROSS_COMPILE=aarch64-none-elf-
+ > make libretech-cc_defconfig
+ > make
+
+Image creation
+==============
+
+Amlogic doesn't provide sources for the firmware and for tools needed
+to create the bootloader image, so it is necessary to obtain them from
+the git tree published by the board vendor:
+
+ > wget https://releases.linaro.org/archive/13.11/components/toolchain/binaries/gcc-linaro-aarch64-none-elf-4.8-2013.11_linux.tar.xz
+ > wget https://releases.linaro.org/archive/13.11/components/toolchain/binaries/gcc-linaro-arm-none-eabi-4.8-2013.11_linux.tar.xz
+ > tar xvfJ gcc-linaro-aarch64-none-elf-4.8-2013.11_linux.tar.xz
+ > tar xvfJ gcc-linaro-arm-none-eabi-4.8-2013.11_linux.tar.xz
+ > export PATH=$PWD/gcc-linaro-aarch64-none-elf-4.8-2013.11_linux/bin:$PWD/gcc-linaro-arm-none-eabi-4.8-2013.11_linux/bin:$PATH
+ > git clone https://github.com/BayLibre/u-boot.git -b libretech-cc amlogic-u-boot
+ > cd amlogic-u-boot
+ > make libretech_cc_defconfig
+ > make
+ > export FIPDIR=$PWD/fip
+
+Go back to mainline U-Boot source tree then :
+ > mkdir fip
+
+ > cp $FIPDIR/gxl/bl2.bin fip/
+ > cp $FIPDIR/gxl/acs.bin fip/
+ > cp $FIPDIR/gxl/bl21.bin fip/
+ > cp $FIPDIR/gxl/bl30.bin fip/
+ > cp $FIPDIR/gxl/bl301.bin fip/
+ > cp $FIPDIR/gxl/bl31.img fip/
+ > cp u-boot.bin fip/bl33.bin
+
+ > $FIPDIR/blx_fix.sh \
+       fip/bl30.bin \
+       fip/zero_tmp \
+       fip/bl30_zero.bin \
+       fip/bl301.bin \
+       fip/bl301_zero.bin \
+       fip/bl30_new.bin \
+       bl30
+
+ > $FIPDIR/acs_tool.pyc fip/bl2.bin fip/bl2_acs.bin fip/acs.bin 0
+
+ > $FIPDIR/blx_fix.sh \
+       fip/bl2_acs.bin \
+       fip/zero_tmp \
+       fip/bl2_zero.bin \
+       fip/bl21.bin \
+       fip/bl21_zero.bin \
+       fip/bl2_new.bin \
+       bl2
+
+ > $FIPDIR/gxl/aml_encrypt_gxl --bl3enc --input fip/bl30_new.bin
+ > $FIPDIR/gxl/aml_encrypt_gxl --bl3enc --input fip/bl31.img
+ > $FIPDIR/gxl/aml_encrypt_gxl --bl3enc --input fip/bl33.bin
+ > $FIPDIR/gxl/aml_encrypt_gxl --bl2sig --input fip/bl2_new.bin --output fip/bl2.n.bin.sig
+ > $FIPDIR/gxl/aml_encrypt_gxl --bootmk \
+               --output fip/u-boot.bin \
+               --bl2 fip/bl2.n.bin.sig \
+               --bl30 fip/bl30_new.bin.enc \
+               --bl31 fip/bl31.img.enc \
+               --bl33 fip/bl33.bin.enc
+
+and then write the image to SD with:
+
+ > DEV=/dev/your_sd_device
+ > dd if=fip/u-boot.bin.sd.bin of=$DEV conv=fsync,notrunc bs=512 skip=1 seek=1
+ > dd if=fip/u-boot.bin.sd.bin of=$DEV conv=fsync,notrunc bs=1 count=444
diff --git a/board/amlogic/libretech-cc/libretech-cc.c b/board/amlogic/libretech-cc/libretech-cc.c
new file mode 100644 (file)
index 0000000..6be6e2a
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2016 BayLibre, SAS
+ * Author: Neil Armstrong <narmstrong@baylibre.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#include <common.h>
+#include <dm.h>
+#include <asm/io.h>
+#include <asm/arch/gxbb.h>
+#include <asm/arch/sm.h>
+#include <asm/arch/eth.h>
+#include <asm/arch/mem.h>
+
+#define EFUSE_SN_OFFSET                20
+#define EFUSE_SN_SIZE          16
+#define EFUSE_MAC_OFFSET       52
+#define EFUSE_MAC_SIZE         6
+
+int board_init(void)
+{
+       return 0;
+}
+
+int misc_init_r(void)
+{
+       u8 mac_addr[EFUSE_MAC_SIZE];
+       char serial[EFUSE_SN_SIZE];
+       ssize_t len;
+
+       meson_gx_eth_init(PHY_INTERFACE_MODE_RMII,
+                         MESON_GXL_USE_INTERNAL_RMII_PHY);
+
+       /* Enable power and clock gate */
+       setbits_le32(GXBB_GCLK_MPEG_1, GXBB_GCLK_MPEG_1_ETH);
+       clrbits_le32(GXBB_MEM_PD_REG_0, GXBB_MEM_PD_REG_0_ETH_MASK);
+
+       if (!eth_env_get_enetaddr("ethaddr", mac_addr)) {
+               len = meson_sm_read_efuse(EFUSE_MAC_OFFSET,
+                                         mac_addr, EFUSE_MAC_SIZE);
+               if (len == EFUSE_MAC_SIZE && is_valid_ethaddr(mac_addr))
+                       eth_env_set_enetaddr("ethaddr", mac_addr);
+       }
+
+       if (!env_get("serial#")) {
+               len = meson_sm_read_efuse(EFUSE_SN_OFFSET, serial,
+                                         EFUSE_SN_SIZE);
+               if (len == EFUSE_SN_SIZE)
+                       env_set("serial#", serial);
+       }
+
+       return 0;
+}
+
+int ft_board_setup(void *blob, bd_t *bd)
+{
+       meson_gx_init_reserved_memory(blob);
+
+       return 0;
+}
index a5ea8dc5af2ff40fe22c7fac5289d771890264ee..0cb571432f0bc46157cc136fc2f7231df369f310 100644 (file)
@@ -9,7 +9,8 @@
 #include <asm/io.h>
 #include <asm/arch/gxbb.h>
 #include <asm/arch/sm.h>
-#include <phy.h>
+#include <asm/arch/eth.h>
+#include <asm/arch/mem.h>
 
 #define EFUSE_SN_OFFSET                20
 #define EFUSE_SN_SIZE          16
@@ -27,17 +28,10 @@ int misc_init_r(void)
        char serial[EFUSE_SN_SIZE];
        ssize_t len;
 
-       /* Set RGMII mode */
-       setbits_le32(GXBB_ETH_REG_0, GXBB_ETH_REG_0_PHY_INTF |
-                                    GXBB_ETH_REG_0_TX_PHASE(1) |
-                                    GXBB_ETH_REG_0_TX_RATIO(4) |
-                                    GXBB_ETH_REG_0_PHY_CLK_EN |
-                                    GXBB_ETH_REG_0_CLK_EN);
+       meson_gx_eth_init(PHY_INTERFACE_MODE_RGMII, 0);
 
        /* Enable power and clock gate */
        setbits_le32(GXBB_GCLK_MPEG_0, GXBB_GCLK_MPEG_0_I2C);
-       setbits_le32(GXBB_GCLK_MPEG_1, GXBB_GCLK_MPEG_1_ETH);
-       clrbits_le32(GXBB_MEM_PD_REG_0, GXBB_MEM_PD_REG_0_ETH_MASK);
 
        /* Reset PHY on GPIOZ_14 */
        clrbits_le32(GXBB_GPIO_EN(3), BIT(14));
@@ -61,3 +55,10 @@ int misc_init_r(void)
 
        return 0;
 }
+
+int ft_board_setup(void *blob, bd_t *bd)
+{
+       meson_gx_init_reserved_memory(blob);
+
+       return 0;
+}
index ece8096c5cc2cf6e0ef0e4de87abe157bb5c9fa0..5fde53438ecd5f1f293f1e27f84ed07916f18870 100644 (file)
@@ -10,7 +10,8 @@
 #include <asm/io.h>
 #include <asm/arch/gxbb.h>
 #include <asm/arch/sm.h>
-#include <phy.h>
+#include <asm/arch/eth.h>
+#include <asm/arch/mem.h>
 
 #define EFUSE_SN_OFFSET                20
 #define EFUSE_SN_SIZE          16
@@ -28,17 +29,7 @@ int misc_init_r(void)
        char serial[EFUSE_SN_SIZE];
        ssize_t len;
 
-       /* Set RMII mode */
-       out_le32(GXBB_ETH_REG_0, GXBB_ETH_REG_0_INVERT_RMII_CLK |
-                                GXBB_ETH_REG_0_CLK_EN);
-
-       /* Use Internal PHY */
-       out_le32(GXBB_ETH_REG_2, 0x10110181);
-       out_le32(GXBB_ETH_REG_3, 0xe40908ff);
-
-       /* Enable power and clock gate */
-       setbits_le32(GXBB_GCLK_MPEG_1, GXBB_GCLK_MPEG_1_ETH);
-       clrbits_le32(GXBB_MEM_PD_REG_0, GXBB_MEM_PD_REG_0_ETH_MASK);
+       meson_gx_eth_init(PHY_INTERFACE_MODE_RMII, 0);
 
        if (!eth_env_get_enetaddr("ethaddr", mac_addr)) {
                len = meson_sm_read_efuse(EFUSE_MAC_OFFSET,
@@ -56,3 +47,10 @@ int misc_init_r(void)
 
        return 0;
 }
+
+int ft_board_setup(void *blob, bd_t *bd)
+{
+       meson_gx_init_reserved_memory(blob);
+
+       return 0;
+}
index 530f1496171b406875b2d31d6c08f30aeadf306b..3b7a54f519d701de8f83543038d696873a415601 100644 (file)
@@ -105,6 +105,11 @@ static const struct rpi_model rpi_models_new_scheme[] = {
                DTB_DIR "bcm2835-rpi-zero.dtb",
                false,
        },
+       [0xC] = {
+               "Zero W",
+               DTB_DIR "bcm2835-rpi-zero-w.dtb",
+               false,
+       },
 };
 
 static const struct rpi_model rpi_models_old_scheme[] = {
diff --git a/configs/khadas-vim_defconfig b/configs/khadas-vim_defconfig
new file mode 100644 (file)
index 0000000..f2a30a8
--- /dev/null
@@ -0,0 +1,36 @@
+CONFIG_ARM=y
+CONFIG_ARCH_MESON=y
+CONFIG_MESON_GXL=y
+CONFIG_TARGET_KHADAS_VIM=y
+CONFIG_IDENT_STRING=" khadas-vim"
+CONFIG_DEFAULT_DEVICE_TREE="meson-gxl-s905x-khadas-vim"
+CONFIG_DEBUG_UART=y
+CONFIG_ENV_IS_NOWHERE=y
+# CONFIG_DISPLAY_CPUINFO is not set
+# CONFIG_DISPLAY_BOARDINFO is not set
+# CONFIG_CMD_BDI is not set
+# CONFIG_CMD_IMI is not set
+# CONFIG_CMD_IMLS is not set
+# CONFIG_CMD_LOADS is not set
+CONFIG_CMD_MMC=y
+# CONFIG_CMD_FPGA is not set
+CONFIG_CMD_GPIO=y
+# CONFIG_CMD_SETEXPR is not set
+CONFIG_OF_CONTROL=y
+CONFIG_OF_BOARD_SETUP=y
+CONFIG_DM_GPIO=y
+CONFIG_DM_MMC=y
+CONFIG_MMC_MESON_GX=y
+CONFIG_DM_ETH=y
+CONFIG_ETH_DESIGNWARE=y
+CONFIG_PHY_MESON_GXL=y
+CONFIG_NET_RANDOM_ETHADDR=y
+CONFIG_PINCTRL=y
+CONFIG_PINCTRL_MESON_GXL=y
+CONFIG_DEBUG_UART_MESON=y
+CONFIG_DEBUG_UART_BASE=0xc81004c0
+CONFIG_DEBUG_UART_CLOCK=24000000
+CONFIG_DEBUG_UART_ANNOUNCE=y
+CONFIG_DEBUG_UART_SKIP_INIT=y
+CONFIG_MESON_SERIAL=y
+CONFIG_OF_LIBFDT_OVERLAY=y
diff --git a/configs/libretech-cc_defconfig b/configs/libretech-cc_defconfig
new file mode 100644 (file)
index 0000000..6583c43
--- /dev/null
@@ -0,0 +1,36 @@
+CONFIG_ARM=y
+CONFIG_ARCH_MESON=y
+CONFIG_MESON_GXL=y
+CONFIG_TARGET_LIBRETECH_CC=y
+CONFIG_IDENT_STRING=" libretech-cc"
+CONFIG_DEFAULT_DEVICE_TREE="meson-gxl-s905x-libretech-cc"
+CONFIG_DEBUG_UART=y
+CONFIG_ENV_IS_NOWHERE=y
+# CONFIG_DISPLAY_CPUINFO is not set
+# CONFIG_DISPLAY_BOARDINFO is not set
+# CONFIG_CMD_BDI is not set
+# CONFIG_CMD_IMI is not set
+# CONFIG_CMD_IMLS is not set
+# CONFIG_CMD_LOADS is not set
+CONFIG_CMD_MMC=y
+# CONFIG_CMD_FPGA is not set
+CONFIG_CMD_GPIO=y
+# CONFIG_CMD_SETEXPR is not set
+CONFIG_OF_CONTROL=y
+CONFIG_OF_BOARD_SETUP=y
+CONFIG_DM_GPIO=y
+CONFIG_DM_MMC=y
+CONFIG_MMC_MESON_GX=y
+CONFIG_DM_ETH=y
+CONFIG_ETH_DESIGNWARE=y
+CONFIG_PHY_MESON_GXL=y
+CONFIG_NET_RANDOM_ETHADDR=y
+CONFIG_PINCTRL=y
+CONFIG_PINCTRL_MESON_GXL=y
+CONFIG_DEBUG_UART_MESON=y
+CONFIG_DEBUG_UART_BASE=0xc81004c0
+CONFIG_DEBUG_UART_CLOCK=24000000
+CONFIG_DEBUG_UART_ANNOUNCE=y
+CONFIG_DEBUG_UART_SKIP_INIT=y
+CONFIG_MESON_SERIAL=y
+CONFIG_OF_LIBFDT_OVERLAY=y
index 1afd2fc1113302dbc674e50b7ac48c4cbdf3ba83..18d2b6825d539912e34216d2e9ec50badd200527 100644 (file)
@@ -16,6 +16,7 @@ CONFIG_CMD_I2C=y
 CONFIG_CMD_MMC=y
 # CONFIG_CMD_SETEXPR is not set
 CONFIG_OF_CONTROL=y
+CONFIG_OF_BOARD_SETUP=y
 CONFIG_NET_RANDOM_ETHADDR=y
 CONFIG_DM_GPIO=y
 CONFIG_DM_I2C=y
index f67bcb18953134309df56b2fd8b1238c1e260954..0c513664feaa8c81cd6b4c0ef602a692520fc378 100644 (file)
@@ -6,8 +6,8 @@ CONFIG_SYS_MALLOC_F_LEN=0x2000
 CONFIG_SYS_MPUCLK=720
 CONFIG_TARGET_OMAP3_EVM=y
 CONFIG_DISTRO_DEFAULTS=y
-# CONFIG_USE_BOOTCOMMAND is not set
 CONFIG_BOOTDELAY=3
+CONFIG_USE_BOOTCOMMAND=y
 CONFIG_SYS_CONSOLE_INFO_QUIET=y
 CONFIG_DEFAULT_FDT_FILE="omap3-evm.dtb"
 CONFIG_VERSION_VARIABLE=y
index d4b534954ee0397f221eab096d7f600e5fb3673e..b6e788b09898c9d38d076e024ec443da2da22f3c 100644 (file)
@@ -17,6 +17,7 @@ CONFIG_CMD_MMC=y
 CONFIG_CMD_GPIO=y
 # CONFIG_CMD_SETEXPR is not set
 CONFIG_OF_CONTROL=y
+CONFIG_OF_BOARD_SETUP=y
 CONFIG_DM_GPIO=y
 CONFIG_DM_MMC=y
 CONFIG_MMC_MESON_GX=y
diff --git a/configs/rpi_0_w_defconfig b/configs/rpi_0_w_defconfig
new file mode 100644 (file)
index 0000000..092f378
--- /dev/null
@@ -0,0 +1,28 @@
+CONFIG_ARM=y
+CONFIG_ARCH_BCM283X=y
+CONFIG_TARGET_RPI_0_W=y
+CONFIG_DEFAULT_DEVICE_TREE="bcm2835-rpi-zero-w"
+CONFIG_DISTRO_DEFAULTS=y
+CONFIG_OF_BOARD_SETUP=y
+# CONFIG_DISPLAY_CPUINFO is not set
+# CONFIG_DISPLAY_BOARDINFO is not set
+CONFIG_SYS_PROMPT="U-Boot> "
+# CONFIG_CMD_IMLS is not set
+# CONFIG_CMD_FLASH is not set
+CONFIG_CMD_MMC=y
+CONFIG_CMD_USB=y
+# CONFIG_CMD_FPGA is not set
+CONFIG_CMD_GPIO=y
+CONFIG_DM_MMC=y
+CONFIG_MMC_SDHCI=y
+CONFIG_MMC_SDHCI_BCM2835=y
+CONFIG_DM_ETH=y
+CONFIG_USB=y
+CONFIG_DM_USB=y
+CONFIG_USB_STORAGE=y
+CONFIG_USB_KEYBOARD=y
+CONFIG_DM_VIDEO=y
+CONFIG_SYS_WHITE_ON_BLACK=y
+CONFIG_CONSOLE_SCROLL_LINES=10
+CONFIG_PHYS_TO_BUS=y
+CONFIG_OF_LIBFDT_OVERLAY=y
index 451fbdebba39e1dd8ea3c071d30ca1df6a489253..cef8adc81758318a3daae2e21fd02060f7fe893a 100644 (file)
@@ -13,6 +13,7 @@
 #include <libfdt.h>
 #include <linux/arm-smccc.h>
 #include <linux/errno.h>
+#include <linux/printk.h>
 #include <linux/psci.h>
 
 psci_fn *invoke_psci_fn;
@@ -48,7 +49,7 @@ static int psci_bind(struct udevice *dev)
                ret = device_bind_driver(dev, "psci-sysreset", "psci-sysreset",
                                         NULL);
                if (ret)
-                       debug("PSCI System Reset was not bound.\n");
+                       pr_debug("PSCI System Reset was not bound.\n");
        }
 
        return 0;
@@ -62,7 +63,7 @@ static int psci_probe(struct udevice *dev)
        method = fdt_stringlist_get(gd->fdt_blob, dev_of_offset(dev), "method",
                                    0, NULL);
        if (!method) {
-               printf("missing \"method\" property\n");
+               pr_warn("missing \"method\" property\n");
                return -ENXIO;
        }
 
@@ -71,7 +72,7 @@ static int psci_probe(struct udevice *dev)
        } else if (!strcmp("smc", method)) {
                invoke_psci_fn = __invoke_psci_fn_smc;
        } else {
-               printf("invalid \"method\" property: %s\n", method);
+               pr_warn("invalid \"method\" property: %s\n", method);
                return -EINVAL;
        }
 
index 8a5babea7b3593efc64717cdbf40a8f3be816e08..f096e039cbcbdcd03c066e6975561ac3ba787ea4 100644 (file)
@@ -1694,7 +1694,7 @@ static void cmdset_amd_read_jedec_ids(flash_info_t *info)
 {
        ushort bankId = 0;
        uchar  manuId;
-       uchar  lsbits;
+       uchar  feature;
 
        flash_write_cmd(info, 0, 0, AMD_CMD_RESET);
        flash_unlock_seq(info, 0);
@@ -1710,8 +1710,14 @@ static void cmdset_amd_read_jedec_ids(flash_info_t *info)
        }
        info->manufacturer_id = manuId;
 
-       lsbits = flash_read_uchar(info, FLASH_OFFSET_LOWER_SW_BITS);
-       info->sr_supported = lsbits & BIT(0);
+       debug("info->ext_addr = 0x%x, cfi_version = 0x%x\n",
+             info->ext_addr, info->cfi_version);
+       if (info->ext_addr && info->cfi_version >= 0x3134) {
+               /* read software feature (at 0x53) */
+               feature = flash_read_uchar(info, info->ext_addr + 0x13);
+               debug("feature = 0x%x\n", feature);
+               info->sr_supported = feature & 0x1;
+       }
 
        switch (info->chipwidth){
        case FLASH_CFI_8BIT:
diff --git a/include/configs/khadas-vim.h b/include/configs/khadas-vim.h
new file mode 100644 (file)
index 0000000..9d99bc5
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * Configuration for Khadas VIM
+ *
+ * Copyright (C) 2017 Baylibre, SAS
+ * Author: Neil Armstrong <narmstrong@baylibre.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+#define CONFIG_MISC_INIT_R
+
+#define CONFIG_PHY_ADDR                8
+
+#define MESON_FDTFILE_SETTING "fdtfile=amlogic/meson-gxl-s905x-khadas-vim.dtb\0"
+
+#include <configs/meson-gxbb-common.h>
+
+#endif /* __CONFIG_H */
diff --git a/include/configs/libretech-cc.h b/include/configs/libretech-cc.h
new file mode 100644 (file)
index 0000000..ffaca26
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * Configuration for LibreTech CC
+ *
+ * Copyright (C) 2017 Baylibre, SAS
+ * Author: Neil Armstrong <narmstrong@baylibre.com>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef __CONFIG_H
+#define __CONFIG_H
+
+#define CONFIG_MISC_INIT_R
+
+#define CONFIG_PHY_ADDR                8
+
+#define MESON_FDTFILE_SETTING "fdtfile=amlogic/meson-gxl-s905x-libretech-cc.dtb\0"
+
+#include <configs/meson-gxbb-common.h>
+
+#endif /* __CONFIG_H */
index d88d42de9ac2ff99b7468dc3f054f8bb789a58b0..c2b306ad2e6203142b53134a58bfbf9eca872cdf 100644 (file)
@@ -10,7 +10,7 @@
 
 #define CONFIG_CPU_ARMV8
 #define CONFIG_REMAKE_ELF
-#define CONFIG_NR_DRAM_BANKS           2
+#define CONFIG_NR_DRAM_BANKS           1
 #define CONFIG_ENV_SIZE                        0x2000
 #define CONFIG_SYS_MAXARGS             32
 #define CONFIG_SYS_MALLOC_LEN          (32 << 20)
index df50325ab66da93688d95405ee23aae0409a304c..42f21536379b1238b96ac0c24e33b13e7f82fb5e 100644 (file)
 /* Environment */
 #define CONFIG_PREBOOT                  "usb start"
 
+#if !defined(CONFIG_SPL_BUILD)
+
+#include <config_distro_defaults.h>
+
+#define MEM_LAYOUT_ENV_SETTINGS \
+       DEFAULT_LINUX_BOOT_ENV
+
+#if defined(CONFIG_NAND)
+#define BOOTENV_DEV_NAND(devtypeu, devtypel, instance) \
+       "bootcmd_" #devtypel #instance "=" \
+       "run nandboot\0"
+
+#define BOOTENV_DEV_NAME_NAND(devtypeu, devtypel, instance) \
+       #devtypel #instance " "
+#endif /* CONFIG_NAND */
+
+#define BOOTENV_DEV_UIMAGE_MMC(devtypeu, devtypel, instance) \
+       "bootcmd_" #devtypel #instance "=" \
+               "setenv mmcdev " #instance"; " \
+               "run mmcboot\0"
+
+#define BOOTENV_DEV_NAME_UIMAGE_MMC(devtypeu, devtypel, instance) \
+       #devtypel #instance " "
+
+#define BOOTENV_DEV_ZIMAGE_MMC(devtypeu, devtypel, instance) \
+       "bootcmd_" #devtypel #instance "=" \
+               "setenv mmcdev " #instance"; " \
+               "run mmcbootz\0"
+
+#define BOOTENV_DEV_NAME_ZIMAGE_MMC(devtypeu, devtypel, instance) \
+       #devtypel #instance " "
+
+#define BOOT_TARGET_DEVICES(func) \
+       func(MMC, mmc, 0) \
+       func(ZIMAGE_MMC, zimage_mmc, 0) \
+       func(UIMAGE_MMC, uimage_mmc, 0) \
+       func(NAND, nand, 0)
+
+#include <config_distro_bootcmd.h>
+
 #define CONFIG_EXTRA_ENV_SETTINGS \
-       DEFAULT_LINUX_BOOT_ENV \
+       MEM_LAYOUT_ENV_SETTINGS \
+       "fdtfile=" CONFIG_DEFAULT_FDT_FILE "\0" \
        "mtdids=" CONFIG_MTDIDS_DEFAULT "\0" \
        "mtdparts=" CONFIG_MTDPARTS_DEFAULT "\0" \
        "bootenv=uEnv.txt\0" \
        "loadbootenv=fatload mmc ${mmcdev} ${loadaddr} ${bootenv}\0" \
        "importbootenv=echo Importing environment from mmc ...; " \
                "env import -t ${loadaddr} ${filesize}\0" \
-       "bootscript=echo Running bootscript from mmc ...; " \
-               "source ${loadaddr}\0" \
+       "mmcbootenv=" \
+               "mmc dev ${mmcdev}; " \
+               "if mmc rescan && run loadbootenv; then " \
+                       "run importbootenv; " \
+                       "if test -n $uenvcmd; then " \
+                               "echo Running uenvcmd ...; " \
+                               "run uenvcmd; " \
+                       "fi; " \
+               "fi\0" \
        "loaduimage=setenv bootfile uImage; " \
                "fatload mmc ${mmcdev} ${loadaddr} uImage\0" \
        "loadzimage=setenv bootfile zImage; " \
                "fatload mmc ${mmcdev} ${loadaddr} zImage\0" \
-       "loaddtb=fatload mmc ${mmcdev} ${fdtaddr} " CONFIG_DEFAULT_FDT_FILE "\0" \
-       "mmcboot=echo Booting ${bootfile} from mmc ...; " \
-               "run mmcargs; " \
-               "bootm ${loadaddr} - ${fdtaddr}\0" \
-       "mmcbootz=echo Booting ${bootfile} from mmc ...; " \
-               "run mmcargs; " \
-               "bootz ${loadaddr} - ${fdtaddr}\0" \
+       "loaddtb=fatload mmc ${mmcdev} ${fdtaddr} ${fdtfile}\0" \
+       "mmcboot=run mmcbootenv; " \
+               "if run loaduimage && run loaddtb; then " \
+                       "echo Booting ${bootfile} from mmc ...; " \
+                       "run mmcargs; " \
+                       "bootm ${loadaddr} - ${fdtaddr}; " \
+               "fi\0" \
+       "mmcbootz=run mmcbootenv; " \
+               "if run loadzimage && run loaddtb; then " \
+                       "echo Booting ${bootfile} from mmc ...; " \
+                       "run mmcargs; " \
+                       "bootz ${loadaddr} - ${fdtaddr};" \
+               "fi\0" \
        "nandboot=echo Booting uImage from nand ...; " \
                "run nandargs; " \
                "nand read ${loadaddr} kernel; " \
                "nand read ${fdtaddr} dtb; " \
-               "bootm ${loadaddr} - ${fdtaddr}\0"
+               "bootm ${loadaddr} - ${fdtaddr}\0" \
+       BOOTENV
 
-#define CONFIG_BOOTCOMMAND \
-       "mmc dev ${mmcdev}; if mmc rescan; then " \
-               "if run loadbootenv; then " \
-                       "run importbootenv; " \
-                       "if test -n $uenvcmd; then " \
-                               "echo Running uenvcmd ...; " \
-                               "run uenvcmd; " \
-                       "fi; " \
-               "else " \
-                       "if run loadzimage && run loaddtb; then " \
-                               "run mmcbootz; fi; " \
-                       "if run loaduimage && run loaddtb; then " \
-                               "run mmcboot; fi; " \
-                       "run nandboot; " \
-               "fi; " \
-       "else run nandboot; fi"
+#endif /* !CONFIG_SPL_BUILD */
 
 #endif /* __CONFIG_H */
index c499b45b320a4840b72cab3dee165d9d92f8f657..cab8661779e0460a5991afd3ae4697fd02ce6afb 100644 (file)
@@ -76,7 +76,7 @@
 #endif
 
 /* Console UART */
-#ifdef CONFIG_BCM2837
+#if defined (CONFIG_BCM2837) || defined(CONFIG_TARGET_RPI_0_W)
 #define CONFIG_BCM283X_MU_SERIAL
 #else
 #define CONFIG_PL01X_SERIAL
diff --git a/include/test/compression.h b/include/test/compression.h
new file mode 100644 (file)
index 0000000..646f117
--- /dev/null
@@ -0,0 +1,17 @@
+/*
+ * Copyright (c) 2017 Google, Inc
+ * Written by Simon Glass <sjg@chromium.org>
+ *
+ * SPDX-License-Identifier:     GPL-2.0+
+ */
+
+#ifndef __TEST_COMPRESSION_H__
+#define __TEST_COMPRESSION_H__
+
+#include <test/test.h>
+
+/* Declare a new compression test */
+#define COMPRESSION_TEST(_name, _flags) \
+               UNIT_TEST(_name, _flags, compression_test)
+
+#endif /* __TEST_ENV_H__ */
index 0e94feb07a7963f81b36fce98e6c17b7968058a8..5f2e519084f2f3e6c92d9214f253217e24884d4b 100644 (file)
@@ -8,9 +8,26 @@
 #ifndef __TEST_SUITES_H__
 #define __TEST_SUITES_H__
 
+struct unit_test;
+
+/**
+ * cmd_ut_category() - Run a category of unit tests
+ *
+ * @name:      Category name
+ * @tests:     List of tests to run
+ * @n_ents:    Number of tests in @tests
+ * @argc:      Argument count provided. Must be <= 1. If this is 1 then all
+ *             tests are run, otherwise only the one named @argv[1] is run.
+ * @argv:      Arguments: argv[1] is the test to run (if @argc >= 2)
+ * @return 0 if OK, CMD_RET_FAILURE on failure
+ */
+int cmd_ut_category(const char *name, struct unit_test *tests, int n_ents,
+                   int argc, char * const argv[]);
+
 int do_ut_dm(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
 int do_ut_env(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
 int do_ut_overlay(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
 int do_ut_time(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
+int do_ut_compression(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]);
 
 #endif /* __TEST_SUITES_H__ */
index 369bbf9ba36480fa3218eb59257ae5f875779502..be42e946b794d5a43a6a24cbb72e54fee439050e 100644 (file)
@@ -8,6 +8,7 @@
 # Use upstream code.
 obj-y += \
        fdt.o \
+       fdt_wip.o \
        fdt_strerror.o \
        fdt_sw.o \
        fdt_empty_tree.o \
@@ -19,8 +20,7 @@ obj-$(CONFIG_OF_LIBFDT_OVERLAY) += fdt_overlay.o
 # TODO: split out the local modifiction.
 obj-y += \
        fdt_ro.o \
-       fdt_rw.o \
-       fdt_wip.o \
+       fdt_rw.o
 
 # U-Boot own file
 obj-y += fdt_region.o
index 63099f1d969218f9184dff96a3238888ac1759f8..5bfc4da37076c32347b2c9aac6406aaaa515cbc2 100644 (file)
 
 #include "libfdt_internal.h"
 
+#define FDT_MAX_DEPTH  32
+
+static int str_in_list(const char *str, char * const list[], int count)
+{
+       int i;
+
+       for (i = 0; i < count; i++)
+               if (!strcmp(list[i], str))
+                       return 1;
+
+       return 0;
+}
+
+int fdt_find_regions(const void *fdt, char * const inc[], int inc_count,
+                    char * const exc_prop[], int exc_prop_count,
+                    struct fdt_region region[], int max_regions,
+                    char *path, int path_len, int add_string_tab)
+{
+       int stack[FDT_MAX_DEPTH] = { 0 };
+       char *end;
+       int nextoffset = 0;
+       uint32_t tag;
+       int count = 0;
+       int start = -1;
+       int depth = -1;
+       int want = 0;
+       int base = fdt_off_dt_struct(fdt);
+
+       end = path;
+       *end = '\0';
+       do {
+               const struct fdt_property *prop;
+               const char *name;
+               const char *str;
+               int include = 0;
+               int stop_at = 0;
+               int offset;
+               int len;
+
+               offset = nextoffset;
+               tag = fdt_next_tag(fdt, offset, &nextoffset);
+               stop_at = nextoffset;
+
+               switch (tag) {
+               case FDT_PROP:
+                       include = want >= 2;
+                       stop_at = offset;
+                       prop = fdt_get_property_by_offset(fdt, offset, NULL);
+                       str = fdt_string(fdt, fdt32_to_cpu(prop->nameoff));
+                       if (str_in_list(str, exc_prop, exc_prop_count))
+                               include = 0;
+                       break;
+
+               case FDT_NOP:
+                       include = want >= 2;
+                       stop_at = offset;
+                       break;
+
+               case FDT_BEGIN_NODE:
+                       depth++;
+                       if (depth == FDT_MAX_DEPTH)
+                               return -FDT_ERR_BADSTRUCTURE;
+                       name = fdt_get_name(fdt, offset, &len);
+                       if (end - path + 2 + len >= path_len)
+                               return -FDT_ERR_NOSPACE;
+                       if (end != path + 1)
+                               *end++ = '/';
+                       strcpy(end, name);
+                       end += len;
+                       stack[depth] = want;
+                       if (want == 1)
+                               stop_at = offset;
+                       if (str_in_list(path, inc, inc_count))
+                               want = 2;
+                       else if (want)
+                               want--;
+                       else
+                               stop_at = offset;
+                       include = want;
+                       break;
+
+               case FDT_END_NODE:
+                       include = want;
+                       want = stack[depth--];
+                       while (end > path && *--end != '/')
+                               ;
+                       *end = '\0';
+                       break;
+
+               case FDT_END:
+                       include = 1;
+                       break;
+               }
+
+               if (include && start == -1) {
+                       /* Should we merge with previous? */
+                       if (count && count <= max_regions &&
+                           offset == region[count - 1].offset +
+                                       region[count - 1].size - base)
+                               start = region[--count].offset - base;
+                       else
+                               start = offset;
+               }
+
+               if (!include && start != -1) {
+                       if (count < max_regions) {
+                               region[count].offset = base + start;
+                               region[count].size = stop_at - start;
+                       }
+                       count++;
+                       start = -1;
+               }
+       } while (tag != FDT_END);
+
+       if (nextoffset != fdt_size_dt_struct(fdt))
+               return -FDT_ERR_BADLAYOUT;
+
+       /* Add a region for the END tag and the string table */
+       if (count < max_regions) {
+               region[count].offset = base + start;
+               region[count].size = nextoffset - start;
+               if (add_string_tab)
+                       region[count].size += fdt_size_dt_strings(fdt);
+       }
+       count++;
+
+       return count;
+}
+
 /**
  * fdt_add_region() - Add a new region to our list
  * @info:      State information
index 01adad0ee97b18693cbd90f2b6f19f9b23f6e410..6a771d06603eecffd2c90ba817ebffe9aa5db3a3 100644 (file)
@@ -1,227 +1,2 @@
-/*
- * libfdt - Flat Device Tree manipulation
- * Copyright (C) 2006 David Gibson, IBM Corporation.
- * SPDX-License-Identifier:    GPL-2.0+ BSD-2-Clause
- */
-#include <libfdt_env.h>
-
-#ifndef USE_HOSTCC
-#include <fdt.h>
-#include <libfdt.h>
-#else
-#include "fdt_host.h"
-#endif
-
-#include "libfdt_internal.h"
-
-int fdt_setprop_inplace_namelen_partial(void *fdt, int nodeoffset,
-                                       const char *name, int namelen,
-                                       uint32_t idx, const void *val,
-                                       int len)
-{
-       void *propval;
-       int proplen;
-
-       propval = fdt_getprop_namelen_w(fdt, nodeoffset, name, namelen,
-                                       &proplen);
-       if (!propval)
-               return proplen;
-
-       if (proplen < (len + idx))
-               return -FDT_ERR_NOSPACE;
-
-       memcpy((char *)propval + idx, val, len);
-       return 0;
-}
-
-int fdt_setprop_inplace(void *fdt, int nodeoffset, const char *name,
-                       const void *val, int len)
-{
-       const void *propval;
-       int proplen;
-
-       propval = fdt_getprop(fdt, nodeoffset, name, &proplen);
-       if (!propval)
-               return proplen;
-
-       if (proplen != len)
-               return -FDT_ERR_NOSPACE;
-
-       return fdt_setprop_inplace_namelen_partial(fdt, nodeoffset, name,
-                                                  strlen(name), 0,
-                                                  val, len);
-}
-
-static void _fdt_nop_region(void *start, int len)
-{
-       fdt32_t *p;
-
-       for (p = start; (char *)p < ((char *)start + len); p++)
-               *p = cpu_to_fdt32(FDT_NOP);
-}
-
-int fdt_nop_property(void *fdt, int nodeoffset, const char *name)
-{
-       struct fdt_property *prop;
-       int len;
-
-       prop = fdt_get_property_w(fdt, nodeoffset, name, &len);
-       if (!prop)
-               return len;
-
-       _fdt_nop_region(prop, len + sizeof(*prop));
-
-       return 0;
-}
-
-int _fdt_node_end_offset(void *fdt, int offset)
-{
-       int depth = 0;
-
-       while ((offset >= 0) && (depth >= 0))
-               offset = fdt_next_node(fdt, offset, &depth);
-
-       return offset;
-}
-
-int fdt_nop_node(void *fdt, int nodeoffset)
-{
-       int endoffset;
-
-       endoffset = _fdt_node_end_offset(fdt, nodeoffset);
-       if (endoffset < 0)
-               return endoffset;
-
-       _fdt_nop_region(fdt_offset_ptr_w(fdt, nodeoffset, 0),
-                       endoffset - nodeoffset);
-       return 0;
-}
-
-#define FDT_MAX_DEPTH  32
-
-static int str_in_list(const char *str, char * const list[], int count)
-{
-       int i;
-
-       for (i = 0; i < count; i++)
-               if (!strcmp(list[i], str))
-                       return 1;
-
-       return 0;
-}
-
-int fdt_find_regions(const void *fdt, char * const inc[], int inc_count,
-                    char * const exc_prop[], int exc_prop_count,
-                    struct fdt_region region[], int max_regions,
-                    char *path, int path_len, int add_string_tab)
-{
-       int stack[FDT_MAX_DEPTH] = { 0 };
-       char *end;
-       int nextoffset = 0;
-       uint32_t tag;
-       int count = 0;
-       int start = -1;
-       int depth = -1;
-       int want = 0;
-       int base = fdt_off_dt_struct(fdt);
-
-       end = path;
-       *end = '\0';
-       do {
-               const struct fdt_property *prop;
-               const char *name;
-               const char *str;
-               int include = 0;
-               int stop_at = 0;
-               int offset;
-               int len;
-
-               offset = nextoffset;
-               tag = fdt_next_tag(fdt, offset, &nextoffset);
-               stop_at = nextoffset;
-
-               switch (tag) {
-               case FDT_PROP:
-                       include = want >= 2;
-                       stop_at = offset;
-                       prop = fdt_get_property_by_offset(fdt, offset, NULL);
-                       str = fdt_string(fdt, fdt32_to_cpu(prop->nameoff));
-                       if (str_in_list(str, exc_prop, exc_prop_count))
-                               include = 0;
-                       break;
-
-               case FDT_NOP:
-                       include = want >= 2;
-                       stop_at = offset;
-                       break;
-
-               case FDT_BEGIN_NODE:
-                       depth++;
-                       if (depth == FDT_MAX_DEPTH)
-                               return -FDT_ERR_BADSTRUCTURE;
-                       name = fdt_get_name(fdt, offset, &len);
-                       if (end - path + 2 + len >= path_len)
-                               return -FDT_ERR_NOSPACE;
-                       if (end != path + 1)
-                               *end++ = '/';
-                       strcpy(end, name);
-                       end += len;
-                       stack[depth] = want;
-                       if (want == 1)
-                               stop_at = offset;
-                       if (str_in_list(path, inc, inc_count))
-                               want = 2;
-                       else if (want)
-                               want--;
-                       else
-                               stop_at = offset;
-                       include = want;
-                       break;
-
-               case FDT_END_NODE:
-                       include = want;
-                       want = stack[depth--];
-                       while (end > path && *--end != '/')
-                               ;
-                       *end = '\0';
-                       break;
-
-               case FDT_END:
-                       include = 1;
-                       break;
-               }
-
-               if (include && start == -1) {
-                       /* Should we merge with previous? */
-                       if (count && count <= max_regions &&
-                           offset == region[count - 1].offset +
-                                       region[count - 1].size - base)
-                               start = region[--count].offset - base;
-                       else
-                               start = offset;
-               }
-
-               if (!include && start != -1) {
-                       if (count < max_regions) {
-                               region[count].offset = base + start;
-                               region[count].size = stop_at - start;
-                       }
-                       count++;
-                       start = -1;
-               }
-       } while (tag != FDT_END);
-
-       if (nextoffset != fdt_size_dt_struct(fdt))
-               return -FDT_ERR_BADLAYOUT;
-
-       /* Add a region for the END tag and the string table */
-       if (count < max_regions) {
-               region[count].offset = base + start;
-               region[count].size = nextoffset - start;
-               if (add_string_tab)
-                       region[count].size += fdt_size_dt_strings(fdt);
-       }
-       count++;
-
-       return count;
-}
+#include <linux/libfdt_env.h>
+#include "../../scripts/dtc/libfdt/fdt_wip.c"
index 15d0836b49a9079122d72e5a05d30027c586fe6c..b3994110dc7437960f38ec0557891a78b0f525b4 100644 (file)
@@ -9,7 +9,7 @@ ifdef CONFIG_SPL_BUILD
 ifndef CONFIG_SPL_DM
 CONFIG_DM_SERIAL=
 CONFIG_DM_GPIO=
-CONIFG_DM_I2C=
+CONFIG_DM_I2C=
 CONFIG_DM_SPI=
 CONFIG_DM_SPI_FLASH=
 endif
index 14333423a17856cd0f10c32b202eaaf10cc1e000..6b24f463f3329d2eb300e1999e94a636cfb89ab0 100644 (file)
@@ -8,9 +8,34 @@
 #include <common.h>
 #include <command.h>
 #include <test/suites.h>
+#include <test/test.h>
 
 static int do_ut_all(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
 
+int cmd_ut_category(const char *name, struct unit_test *tests, int n_ents,
+                   int argc, char * const argv[])
+{
+       struct unit_test_state uts = { .fail_count = 0 };
+       struct unit_test *test;
+
+       if (argc == 1)
+               printf("Running %d %s tests\n", n_ents, name);
+
+       for (test = tests; test < tests + n_ents; test++) {
+               if (argc > 1 && strcmp(argv[1], test->name))
+                       continue;
+               printf("Test: %s\n", test->name);
+
+               uts.start = mallinfo();
+
+               test->func(&uts);
+       }
+
+       printf("Failures: %d\n", uts.fail_count);
+
+       return uts.fail_count ? CMD_RET_FAILURE : 0;
+}
+
 static cmd_tbl_t cmd_ut_sub[] = {
        U_BOOT_CMD_MKENT(all, CONFIG_SYS_MAXARGS, 1, do_ut_all, "", ""),
 #if defined(CONFIG_UT_DM)
@@ -25,6 +50,10 @@ static cmd_tbl_t cmd_ut_sub[] = {
 #ifdef CONFIG_UT_TIME
        U_BOOT_CMD_MKENT(time, CONFIG_SYS_MAXARGS, 1, do_ut_time, "", ""),
 #endif
+#ifdef CONFIG_SANDBOX
+       U_BOOT_CMD_MKENT(compression, CONFIG_SYS_MAXARGS, 1, do_ut_compression,
+                        "", ""),
+#endif
 };
 
 static int do_ut_all(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
@@ -76,6 +105,9 @@ static char ut_help_text[] =
 #endif
 #ifdef CONFIG_UT_TIME
        "ut time - Very basic test of time functions\n"
+#endif
+#ifdef CONFIG_SANDBOX
+       "ut compression - Test compressors and bootm decompression\n"
 #endif
        ;
 #endif
index be4e04e6cc0b8c0352ba2839119ebb858b4b807e..fe27ad66ea44f27167643feac988daa67c68ce2a 100644 (file)
@@ -4,8 +4,6 @@
  * SPDX-License-Identifier:    GPL-2.0+
  */
 
-#define DEBUG
-
 #include <common.h>
 #include <bootm.h>
 #include <command.h>
@@ -21,6 +19,9 @@
 #include <lzma/LzmaTools.h>
 
 #include <linux/lzo.h>
+#include <test/compression.h>
+#include <test/suites.h>
+#include <test/ut.h>
 
 static const char plain[] =
        "I am a highly compressable bit of text.\n"
@@ -120,10 +121,11 @@ static const unsigned long lz4_compressed_size = 276;
 
 #define TEST_BUFFER_SIZE       512
 
-typedef int (*mutate_func)(void *, unsigned long, void *, unsigned long,
-                          unsigned long *);
+typedef int (*mutate_func)(struct unit_test_state *uts, void *, unsigned long,
+                          void *, unsigned long, unsigned long *);
 
-static int compress_using_gzip(void *in, unsigned long in_size,
+static int compress_using_gzip(struct unit_test_state *uts,
+                              void *in, unsigned long in_size,
                               void *out, unsigned long out_max,
                               unsigned long *out_size)
 {
@@ -137,7 +139,8 @@ static int compress_using_gzip(void *in, unsigned long in_size,
        return ret;
 }
 
-static int uncompress_using_gzip(void *in, unsigned long in_size,
+static int uncompress_using_gzip(struct unit_test_state *uts,
+                                void *in, unsigned long in_size,
                                 void *out, unsigned long out_max,
                                 unsigned long *out_size)
 {
@@ -151,13 +154,14 @@ static int uncompress_using_gzip(void *in, unsigned long in_size,
        return ret;
 }
 
-static int compress_using_bzip2(void *in, unsigned long in_size,
+static int compress_using_bzip2(struct unit_test_state *uts,
+                               void *in, unsigned long in_size,
                                void *out, unsigned long out_max,
                                unsigned long *out_size)
 {
        /* There is no bzip2 compression in u-boot, so fake it. */
-       assert(in_size == strlen(plain));
-       assert(memcmp(plain, in, in_size) == 0);
+       ut_asserteq(in_size, strlen(plain));
+       ut_asserteq(0, memcmp(plain, in, in_size));
 
        if (bzip2_compressed_size > out_max)
                return -1;
@@ -169,7 +173,8 @@ static int compress_using_bzip2(void *in, unsigned long in_size,
        return 0;
 }
 
-static int uncompress_using_bzip2(void *in, unsigned long in_size,
+static int uncompress_using_bzip2(struct unit_test_state *uts,
+                                 void *in, unsigned long in_size,
                                  void *out, unsigned long out_max,
                                  unsigned long *out_size)
 {
@@ -184,13 +189,14 @@ static int uncompress_using_bzip2(void *in, unsigned long in_size,
        return (ret != BZ_OK);
 }
 
-static int compress_using_lzma(void *in, unsigned long in_size,
+static int compress_using_lzma(struct unit_test_state *uts,
+                              void *in, unsigned long in_size,
                               void *out, unsigned long out_max,
                               unsigned long *out_size)
 {
        /* There is no lzma compression in u-boot, so fake it. */
-       assert(in_size == strlen(plain));
-       assert(memcmp(plain, in, in_size) == 0);
+       ut_asserteq(in_size,  strlen(plain));
+       ut_asserteq(0, memcmp(plain, in, in_size));
 
        if (lzma_compressed_size > out_max)
                return -1;
@@ -202,7 +208,8 @@ static int compress_using_lzma(void *in, unsigned long in_size,
        return 0;
 }
 
-static int uncompress_using_lzma(void *in, unsigned long in_size,
+static int uncompress_using_lzma(struct unit_test_state *uts,
+                                void *in, unsigned long in_size,
                                 void *out, unsigned long out_max,
                                 unsigned long *out_size)
 {
@@ -216,13 +223,14 @@ static int uncompress_using_lzma(void *in, unsigned long in_size,
        return (ret != SZ_OK);
 }
 
-static int compress_using_lzo(void *in, unsigned long in_size,
+static int compress_using_lzo(struct unit_test_state *uts,
+                             void *in, unsigned long in_size,
                              void *out, unsigned long out_max,
                              unsigned long *out_size)
 {
        /* There is no lzo compression in u-boot, so fake it. */
-       assert(in_size == strlen(plain));
-       assert(memcmp(plain, in, in_size) == 0);
+       ut_asserteq(in_size,  strlen(plain));
+       ut_asserteq(0, memcmp(plain, in, in_size));
 
        if (lzo_compressed_size > out_max)
                return -1;
@@ -234,7 +242,8 @@ static int compress_using_lzo(void *in, unsigned long in_size,
        return 0;
 }
 
-static int uncompress_using_lzo(void *in, unsigned long in_size,
+static int uncompress_using_lzo(struct unit_test_state *uts,
+                               void *in, unsigned long in_size,
                                void *out, unsigned long out_max,
                                unsigned long *out_size)
 {
@@ -249,13 +258,14 @@ static int uncompress_using_lzo(void *in, unsigned long in_size,
        return (ret != LZO_E_OK);
 }
 
-static int compress_using_lz4(void *in, unsigned long in_size,
+static int compress_using_lz4(struct unit_test_state *uts,
+                             void *in, unsigned long in_size,
                              void *out, unsigned long out_max,
                              unsigned long *out_size)
 {
        /* There is no lz4 compression in u-boot, so fake it. */
-       assert(in_size == strlen(plain));
-       assert(memcmp(plain, in, in_size) == 0);
+       ut_asserteq(in_size,  strlen(plain));
+       ut_asserteq(0, memcmp(plain, in, in_size));
 
        if (lz4_compressed_size > out_max)
                return -1;
@@ -267,7 +277,8 @@ static int compress_using_lz4(void *in, unsigned long in_size,
        return 0;
 }
 
-static int uncompress_using_lz4(void *in, unsigned long in_size,
+static int uncompress_using_lz4(struct unit_test_state *uts,
+                               void *in, unsigned long in_size,
                                void *out, unsigned long out_max,
                                unsigned long *out_size)
 {
@@ -288,106 +299,146 @@ static int uncompress_using_lz4(void *in, unsigned long in_size,
        goto out; \
 }
 
-static int run_test(char *name, mutate_func compress, mutate_func uncompress)
-{
-       ulong orig_size, compressed_size, uncompressed_size;
+struct buf_state {
+       ulong orig_size;
+       ulong compressed_size;
+       ulong uncompressed_size;
        void *orig_buf;
-       void *compressed_buf = NULL;
-       void *uncompressed_buf = NULL;
-       void *compare_buf = NULL;
+       void *compressed_buf;
+       void *uncompressed_buf;
+       void *compare_buf;
+};
+
+static int run_test_internal(struct unit_test_state *uts, char *name,
+                            mutate_func compress, mutate_func uncompress,
+                            struct buf_state *buf)
+{
        int ret;
 
-       printf(" testing %s ...\n", name);
-
-       orig_buf = (void *)plain;
-       orig_size = strlen(orig_buf); /* Trailing NULL not included. */
-       errcheck(orig_size > 0);
-
-       compressed_size = uncompressed_size = TEST_BUFFER_SIZE;
-       compressed_buf = malloc(compressed_size);
-       errcheck(compressed_buf != NULL);
-       uncompressed_buf = malloc(uncompressed_size);
-       errcheck(uncompressed_buf != NULL);
-       compare_buf = malloc(uncompressed_size);
-       errcheck(compare_buf != NULL);
-
        /* Compress works as expected. */
-       printf("\torig_size:%lu\n", orig_size);
-       memset(compressed_buf, 'A', TEST_BUFFER_SIZE);
-       errcheck(compress(orig_buf, orig_size,
-                       compressed_buf, compressed_size,
-                       &compressed_size) == 0);
-       printf("\tcompressed_size:%lu\n", compressed_size);
-       errcheck(compressed_size > 0);
-       errcheck(compressed_size < orig_size);
-       errcheck(((char *)compressed_buf)[compressed_size-1] != 'A');
-       errcheck(((char *)compressed_buf)[compressed_size] == 'A');
+       printf("\torig_size:%lu\n", buf->orig_size);
+       memset(buf->compressed_buf, 'A', TEST_BUFFER_SIZE);
+       errcheck(compress(uts, buf->orig_buf, buf->orig_size,
+                         buf->compressed_buf, buf->compressed_size,
+                         &buf->compressed_size) == 0);
+       printf("\tcompressed_size:%lu\n", buf->compressed_size);
+       errcheck(buf->compressed_size > 0);
+       errcheck(buf->compressed_size < buf->orig_size);
+       errcheck(((char *)buf->compressed_buf)[buf->compressed_size - 1] !=
+                       'A');
+       errcheck(((char *)buf->compressed_buf)[buf->compressed_size] == 'A');
 
        /* Uncompresses with space remaining. */
-       errcheck(uncompress(compressed_buf, compressed_size,
-                         uncompressed_buf, uncompressed_size,
-                         &uncompressed_size) == 0);
-       printf("\tuncompressed_size:%lu\n", uncompressed_size);
-       errcheck(uncompressed_size == orig_size);
-       errcheck(memcmp(orig_buf, uncompressed_buf, orig_size) == 0);
+       errcheck(uncompress(uts, buf->compressed_buf, buf->compressed_size,
+                           buf->uncompressed_buf, buf->uncompressed_size,
+                           &buf->uncompressed_size) == 0);
+       printf("\tuncompressed_size:%lu\n", buf->uncompressed_size);
+       errcheck(buf->uncompressed_size == buf->orig_size);
+       errcheck(memcmp(buf->orig_buf, buf->uncompressed_buf,
+                       buf->orig_size) == 0);
 
        /* Uncompresses with exactly the right size output buffer. */
-       memset(uncompressed_buf, 'A', TEST_BUFFER_SIZE);
-       errcheck(uncompress(compressed_buf, compressed_size,
-                         uncompressed_buf, orig_size,
-                         &uncompressed_size) == 0);
-       errcheck(uncompressed_size == orig_size);
-       errcheck(memcmp(orig_buf, uncompressed_buf, orig_size) == 0);
-       errcheck(((char *)uncompressed_buf)[orig_size] == 'A');
+       memset(buf->uncompressed_buf, 'A', TEST_BUFFER_SIZE);
+       errcheck(uncompress(uts, buf->compressed_buf, buf->compressed_size,
+                           buf->uncompressed_buf, buf->orig_size,
+                           &buf->uncompressed_size) == 0);
+       errcheck(buf->uncompressed_size == buf->orig_size);
+       errcheck(memcmp(buf->orig_buf, buf->uncompressed_buf,
+                       buf->orig_size) == 0);
+       errcheck(((char *)buf->uncompressed_buf)[buf->orig_size] == 'A');
 
        /* Make sure compression does not over-run. */
-       memset(compare_buf, 'A', TEST_BUFFER_SIZE);
-       ret = compress(orig_buf, orig_size,
-                      compare_buf, compressed_size - 1,
+       memset(buf->compare_buf, 'A', TEST_BUFFER_SIZE);
+       ret = compress(uts, buf->orig_buf, buf->orig_size,
+                      buf->compare_buf, buf->compressed_size - 1,
                       NULL);
-       errcheck(((char *)compare_buf)[compressed_size] == 'A');
+       errcheck(((char *)buf->compare_buf)[buf->compressed_size] == 'A');
        errcheck(ret != 0);
        printf("\tcompress does not overrun\n");
 
        /* Make sure decompression does not over-run. */
-       memset(compare_buf, 'A', TEST_BUFFER_SIZE);
-       ret = uncompress(compressed_buf, compressed_size,
-                        compare_buf, uncompressed_size - 1,
+       memset(buf->compare_buf, 'A', TEST_BUFFER_SIZE);
+       ret = uncompress(uts, buf->compressed_buf, buf->compressed_size,
+                        buf->compare_buf, buf->uncompressed_size - 1,
                         NULL);
-       errcheck(((char *)compare_buf)[uncompressed_size - 1] == 'A');
+       errcheck(((char *)buf->compare_buf)[buf->uncompressed_size - 1] == 'A');
        errcheck(ret != 0);
        printf("\tuncompress does not overrun\n");
 
        /* Got here, everything is fine. */
        ret = 0;
 
+out:
+       return ret;
+}
+
+static int run_test(struct unit_test_state *uts, char *name,
+                   mutate_func compress, mutate_func uncompress)
+{
+       struct buf_state sbuf, *buf = &sbuf;
+       int ret;
+
+       printf(" testing %s ...\n", name);
+
+       buf->orig_buf = (void *)plain;
+       buf->orig_size = strlen(buf->orig_buf); /* Trailing NUL not included */
+       errcheck(buf->orig_size > 0);
+
+       buf->compressed_size = TEST_BUFFER_SIZE;
+       buf->uncompressed_size = TEST_BUFFER_SIZE;
+       buf->compressed_buf = malloc(buf->compressed_size);
+       errcheck(buf->compressed_buf);
+       buf->uncompressed_buf = malloc(buf->uncompressed_size);
+       errcheck(buf->uncompressed_buf);
+       buf->compare_buf = malloc(buf->uncompressed_size);
+       errcheck(buf->compare_buf);
+
+       ret = run_test_internal(uts, name, compress, uncompress, buf);
 out:
        printf(" %s: %s\n", name, ret == 0 ? "ok" : "FAILED");
 
-       free(compare_buf);
-       free(uncompressed_buf);
-       free(compressed_buf);
+       free(buf->compare_buf);
+       free(buf->uncompressed_buf);
+       free(buf->compressed_buf);
 
        return ret;
 }
 
-static int do_ut_compression(cmd_tbl_t *cmdtp, int flag, int argc,
-                            char *const argv[])
+static int compression_test_gzip(struct unit_test_state *uts)
 {
-       int err = 0;
+       return run_test(uts, "gzip", compress_using_gzip,
+                       uncompress_using_gzip);
+}
+COMPRESSION_TEST(compression_test_gzip, 0);
+
+static int compression_test_bzip2(struct unit_test_state *uts)
+{
+       return run_test(uts, "bzip2", compress_using_bzip2,
+                       uncompress_using_bzip2);
+}
+COMPRESSION_TEST(compression_test_bzip2, 0);
 
-       err += run_test("gzip", compress_using_gzip, uncompress_using_gzip);
-       err += run_test("bzip2", compress_using_bzip2, uncompress_using_bzip2);
-       err += run_test("lzma", compress_using_lzma, uncompress_using_lzma);
-       err += run_test("lzo", compress_using_lzo, uncompress_using_lzo);
-       err += run_test("lz4", compress_using_lz4, uncompress_using_lz4);
+static int compression_test_lzma(struct unit_test_state *uts)
+{
+       return run_test(uts, "lzma", compress_using_lzma,
+                       uncompress_using_lzma);
+}
+COMPRESSION_TEST(compression_test_lzma, 0);
 
-       printf("ut_compression %s\n", err == 0 ? "ok" : "FAILED");
+static int compression_test_lzo(struct unit_test_state *uts)
+{
+       return run_test(uts, "lzo", compress_using_lzo, uncompress_using_lzo);
+}
+COMPRESSION_TEST(compression_test_lzo, 0);
 
-       return err;
+static int compression_test_lz4(struct unit_test_state *uts)
+{
+       return run_test(uts, "lz4", compress_using_lz4, uncompress_using_lz4);
 }
+COMPRESSION_TEST(compression_test_lz4, 0);
 
-static int compress_using_none(void *in, unsigned long in_size,
+static int compress_using_none(struct unit_test_state *uts,
+                              void *in, unsigned long in_size,
                               void *out, unsigned long out_max,
                               unsigned long *out_size)
 {
@@ -405,7 +456,8 @@ static int compress_using_none(void *in, unsigned long in_size,
  * @compress:  Our function to compress data
  * @return 0 if OK, non-zero on failure
  */
-static int run_bootm_test(int comp_type, mutate_func compress)
+static int run_bootm_test(struct unit_test_state *uts, int comp_type,
+                         mutate_func compress)
 {
        ulong compress_size = 1024;
        void *compress_buff;
@@ -418,20 +470,18 @@ static int run_bootm_test(int comp_type, mutate_func compress)
        printf("Testing: %s\n", genimg_get_comp_name(comp_type));
        compress_buff = map_sysmem(image_start, 0);
        unc_len = strlen(plain);
-       compress((void *)plain, unc_len, compress_buff, compress_size,
+       compress(uts, (void *)plain, unc_len, compress_buff, compress_size,
                 &compress_size);
        err = bootm_decomp_image(comp_type, load_addr, image_start,
                                 IH_TYPE_KERNEL, map_sysmem(load_addr, 0),
                                 compress_buff, compress_size, unc_len,
                                 &load_end);
-       if (err)
-               return err;
+       ut_assertok(err);
        err = bootm_decomp_image(comp_type, load_addr, image_start,
                                 IH_TYPE_KERNEL, map_sysmem(load_addr, 0),
                                 compress_buff, compress_size, unc_len - 1,
                                 &load_end);
-       if (!err)
-               return -EINVAL;
+       ut_assert(err);
 
        /* We can't detect corruption when not decompressing */
        if (comp_type == IH_COMP_NONE)
@@ -442,35 +492,52 @@ static int run_bootm_test(int comp_type, mutate_func compress)
                                 IH_TYPE_KERNEL, map_sysmem(load_addr, 0),
                                 compress_buff, compress_size, 0x10000,
                                 &load_end);
-       if (!err)
-               return -EINVAL;
+       ut_assert(err);
 
        return 0;
 }
 
-static int do_ut_image_decomp(cmd_tbl_t *cmdtp, int flag, int argc,
-                             char *const argv[])
+static int compression_test_bootm_gzip(struct unit_test_state *uts)
 {
-       int err = 0;
+       return run_bootm_test(uts, IH_COMP_GZIP, compress_using_gzip);
+}
+COMPRESSION_TEST(compression_test_bootm_gzip, 0);
+
+static int compression_test_bootm_bzip2(struct unit_test_state *uts)
+{
+       return run_bootm_test(uts, IH_COMP_BZIP2, compress_using_bzip2);
+}
+COMPRESSION_TEST(compression_test_bootm_bzip2, 0);
 
-       err = run_bootm_test(IH_COMP_GZIP, compress_using_gzip);
-       err |= run_bootm_test(IH_COMP_BZIP2, compress_using_bzip2);
-       err |= run_bootm_test(IH_COMP_LZMA, compress_using_lzma);
-       err |= run_bootm_test(IH_COMP_LZO, compress_using_lzo);
-       err |= run_bootm_test(IH_COMP_LZ4, compress_using_lz4);
-       err |= run_bootm_test(IH_COMP_NONE, compress_using_none);
+static int compression_test_bootm_lzma(struct unit_test_state *uts)
+{
+       return run_bootm_test(uts, IH_COMP_LZMA, compress_using_lzma);
+}
+COMPRESSION_TEST(compression_test_bootm_lzma, 0);
 
-       printf("ut_image_decomp %s\n", err == 0 ? "ok" : "FAILED");
+static int compression_test_bootm_lzo(struct unit_test_state *uts)
+{
+       return run_bootm_test(uts, IH_COMP_LZO, compress_using_lzo);
+}
+COMPRESSION_TEST(compression_test_bootm_lzo, 0);
 
-       return 0;
+static int compression_test_bootm_lz4(struct unit_test_state *uts)
+{
+       return run_bootm_test(uts, IH_COMP_LZ4, compress_using_lz4);
 }
+COMPRESSION_TEST(compression_test_bootm_lz4, 0);
 
-U_BOOT_CMD(
-       ut_compression, 5,      1,      do_ut_compression,
-       "Basic test of compressors: gzip bzip2 lzma lzo", ""
-);
+static int compression_test_bootm_none(struct unit_test_state *uts)
+{
+       return run_bootm_test(uts, IH_COMP_NONE, compress_using_none);
+}
+COMPRESSION_TEST(compression_test_bootm_none, 0);
 
-U_BOOT_CMD(
-       ut_image_decomp,        5,      1, do_ut_image_decomp,
-       "Basic test of bootm decompression", ""
-);
+int do_ut_compression(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+       struct unit_test *tests = ll_entry_start(struct unit_test,
+                                                compression_test);
+       const int n_ents = ll_entry_count(struct unit_test, compression_test);
+
+       return cmd_ut_category("compression", tests, n_ents, argc, argv);
+}
index 893e5e6a6d6def70d11352ddf8fa23b1c6979aae..096afa83dde1a5b34288000763b495bd11bf0084 100644 (file)
@@ -15,23 +15,6 @@ int do_ut_env(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
        struct unit_test *tests = ll_entry_start(struct unit_test, env_test);
        const int n_ents = ll_entry_count(struct unit_test, env_test);
-       struct unit_test_state uts = { .fail_count = 0 };
-       struct unit_test *test;
 
-       if (argc == 1)
-               printf("Running %d environment tests\n", n_ents);
-
-       for (test = tests; test < tests + n_ents; test++) {
-               if (argc > 1 && strcmp(argv[1], test->name))
-                       continue;
-               printf("Test: %s\n", test->name);
-
-               uts.start = mallinfo();
-
-               test->func(&uts);
-       }
-
-       printf("Failures: %d\n", uts.fail_count);
-
-       return uts.fail_count ? CMD_RET_FAILURE : 0;
+       return cmd_ut_category("environment", tests, n_ents, argc, argv);
 }
index c730a11f518883b5cbc83fc82dabedc365bea1d6..6279e6d0c20a7d70077b02af254ecc2f99eabcb5 100644 (file)
@@ -14,6 +14,7 @@
 
 #include <test/ut.h>
 #include <test/overlay.h>
+#include <test/suites.h>
 
 /* 4k ought to be enough for anybody */
 #define FDT_COPY_SIZE  (4 * SZ_1K)
@@ -221,7 +222,6 @@ int do_ut_overlay(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                                                 overlay_test);
        const int n_ents = ll_entry_count(struct unit_test, overlay_test);
        struct unit_test_state *uts;
-       struct unit_test *test;
        void *fdt_base = &__dtb_test_fdt_base_begin;
        void *fdt_overlay = &__dtb_test_fdt_overlay_begin;
        void *fdt_overlay_stacked = &__dtb_test_fdt_overlay_stacked_begin;
@@ -280,24 +280,7 @@ int do_ut_overlay(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
        /* Apply the stacked overlay */
        ut_assertok(fdt_overlay_apply(fdt_base_copy, fdt_overlay_stacked_copy));
 
-       if (argc == 1)
-               printf("Running %d environment tests\n", n_ents);
-
-       for (test = tests; test < tests + n_ents; test++) {
-               if (argc > 1 && strcmp(argv[1], test->name))
-                       continue;
-               printf("Test: %s\n", test->name);
-
-               uts->start = mallinfo();
-
-               test->func(uts);
-       }
-
-       printf("Failures: %d\n", uts->fail_count);
-       if (!uts->fail_count)
-               ret = 0;
-       else
-               ret = CMD_RET_FAILURE;
+       ret = cmd_ut_category("overlay", tests, n_ents, argc, argv);
 
        free(fdt_overlay_stacked_copy);
 err3:
index 6e66a48c15fdad796150467da5d6589bcf5758fb..3fe91e874606b58de55e2da485fd2fa2c377d1f4 100644 (file)
@@ -200,7 +200,7 @@ def pytest_configure(config):
         import u_boot_console_exec_attach
         console = u_boot_console_exec_attach.ConsoleExecAttach(log, ubconfig)
 
-re_ut_test_list = re.compile(r'_u_boot_list_2_(dm|env)_test_2_\1_test_(.*)\s*$')
+re_ut_test_list = re.compile(r'_u_boot_list_2_(.*)_test_2_\1_test_(.*)\s*$')
 def generate_ut_subtest(metafunc, fixture_name):
     """Provide parametrization for a ut_subtest fixture.
 
index acbcd87af28e75d92c6571cfe91d7d293fe97ed3..4d32fe5910f22a97553446db5839374585c525e6 100644 (file)
@@ -61,11 +61,11 @@ FIT_SIG_OBJS-$(CONFIG_FIT_SIGNATURE) := common/image-sig.o
 
 # The following files are synced with upstream DTC.
 # Use synced versions from scripts/dtc/libfdt/.
-LIBFDT_SRCS_SYNCED := fdt.c fdt_sw.c fdt_strerror.c fdt_empty_tree.c \
+LIBFDT_SRCS_SYNCED := fdt.c fdt_wip.c fdt_sw.c fdt_strerror.c fdt_empty_tree.c \
                      fdt_addresses.c fdt_overlay.c
 # The following files are locally modified for U-Boot (unfotunately).
 # Use U-Boot own versions from lib/libfdt/.
-LIBFDT_SRCS_UNSYNCED := fdt_ro.c fdt_wip.c fdt_rw.c fdt_region.c
+LIBFDT_SRCS_UNSYNCED := fdt_ro.c fdt_rw.c fdt_region.c
 
 LIBFDT_OBJS := $(addprefix libfdt/, $(patsubst %.c, %.o, $(LIBFDT_SRCS_SYNCED))) \
               $(addprefix lib/libfdt/, $(patsubst %.c, %.o, $(LIBFDT_SRCS_UNSYNCED)))
diff --git a/tools/libfdt/fdt_wip.c b/tools/libfdt/fdt_wip.c
new file mode 100644 (file)
index 0000000..bad73ed
--- /dev/null
@@ -0,0 +1,2 @@
+#include "fdt_host.h"
+#include "../scripts/dtc/libfdt/fdt_wip.c"