diff options
41 files changed, 519 insertions, 229 deletions
diff --git a/Documentation/boards/stm32mp.rst b/Documentation/boards/stm32mp.rst index 87fff7d125..24b7a19ceb 100644 --- a/Documentation/boards/stm32mp.rst +++ b/Documentation/boards/stm32mp.rst @@ -32,6 +32,7 @@ The resulting images will be placed under ``images/``: barebox-stm32mp15xx-dkx.img # both DK1 and DK2 barebox-stm32mp157c-lxa-mc1.img barebox-stm32mp157c-seeed-odyssey.img + barebox-stm32mp15x-ev1.img # stm32mp157c-ev1 and friends Flashing barebox @@ -94,8 +95,38 @@ acknowledge. Boot source selection --------------------- -The STM32MP BootROM samples three boot pins at reset. Usually BOOT1 is -pulled down and BOOT0 and BOOT2 are connected to a 2P DIP switch:: +The STM32MP BootROM samples three boot pins at reset. On official +eval kit, they are either connected to a 3P DIP switch or 2P (with +BOOT1 pulled down). + +EV-1 +^^^^ +SW1 on the DK boards sets boot mode as follows:: + + +-------+ + | --- | + BOOT2 | O-- | + BOOT1 | O --O | + BOOT0 | N O-- | <---- SD-Card + +-------+ + + +-------+ + | --- | + BOOT2 | --O | + BOOT1 | O O-- | + BOOT0 | N --O | <---- eMMC + +-------+ + + +-------+ + | --- | + BOOT2 | --O | + BOOT1 | O --O | + BOOT0 | N --O | <---- DFU on UART and USB OTG + +-------+ + +DK-1/DK-2 +^^^^^^^^^ +Boot mode on the DK board is set as follows:: +-------+ BOOT2 | O O-- | @@ -630,6 +630,13 @@ KBUILD_CFLAGS += $(call cc-option, -fno-delete-null-pointer-checks,) # disable invalid "can't wrap" optimizations for signed / pointers KBUILD_CFLAGS += $(call cc-option,-fno-strict-overflow) +# Make sure -fstack-check isn't enabled (like gentoo apparently did) +KBUILD_CFLAGS += $(call cc-option,-fno-stack-check) + +# ensure -fcf-protection is disabled as it is incompatible with our sjlj +# Platforms that have their setjmp appropriately implemented may override this +KBUILD_CFLAGS += $(call cc-option,-fcf-protection=none) + KBUILD_CFLAGS += $(call cc-disable-warning, address-of-packed-member) # Align the bit size of userspace programs with the kernel diff --git a/arch/arm/boards/Makefile b/arch/arm/boards/Makefile index 7a3645df11..9ccb75e27b 100644 --- a/arch/arm/boards/Makefile +++ b/arch/arm/boards/Makefile @@ -133,6 +133,7 @@ obj-$(CONFIG_MACH_SOLIDRUN_CUBOX) += solidrun-cubox/ obj-$(CONFIG_MACH_SOLIDRUN_MICROSOM) += solidrun-microsom/ obj-$(CONFIG_MACH_STM32MP15XX_DKX) += stm32mp15xx-dkx/ obj-$(CONFIG_MACH_LXA_MC1) += lxa-mc1/ +obj-$(CONFIG_MACH_STM32MP15X_EV1) += stm32mp15x-ev1/ obj-$(CONFIG_MACH_TECHNEXION_PICO_HOBBIT) += technexion-pico-hobbit/ obj-$(CONFIG_MACH_TECHNEXION_WANDBOARD) += technexion-wandboard/ obj-$(CONFIG_MACH_TNY_A9260) += tny-a926x/ diff --git a/arch/arm/boards/nxp-imx8mm-evk/board.c b/arch/arm/boards/nxp-imx8mm-evk/board.c index 2603a2ab07..6e4df60065 100644 --- a/arch/arm/boards/nxp-imx8mm-evk/board.c +++ b/arch/arm/boards/nxp-imx8mm-evk/board.c @@ -33,7 +33,7 @@ static int ar8031_phy_fixup(struct phy_device *phydev) static int nxp_imx8mm_evk_init(void) { int emmc_bbu_flag = 0; - int emmc_sd_flag = 0; + int sd_bbu_flag = 0; if (!of_machine_is_compatible("fsl,imx8mm-evk")) return 0; @@ -46,14 +46,14 @@ static int nxp_imx8mm_evk_init(void) emmc_bbu_flag = BBU_HANDLER_FLAG_DEFAULT; } else { of_device_enable_path("/chosen/environment-sd"); - emmc_sd_flag = BBU_HANDLER_FLAG_DEFAULT; + sd_bbu_flag = BBU_HANDLER_FLAG_DEFAULT; } } else { of_device_enable_path("/chosen/environment-emmc"); emmc_bbu_flag = BBU_HANDLER_FLAG_DEFAULT; } - imx8m_bbu_internal_mmc_register_handler("SD", "/dev/mmc1.barebox", emmc_sd_flag); + imx8m_bbu_internal_mmc_register_handler("SD", "/dev/mmc1.barebox", sd_bbu_flag); imx8m_bbu_internal_mmcboot_register_handler("eMMC", "/dev/mmc2", emmc_bbu_flag); phy_register_fixup_for_uid(PHY_ID_AR8031, AR_PHY_ID_MASK, diff --git a/arch/arm/boards/nxp-imx8mp-evk/board.c b/arch/arm/boards/nxp-imx8mp-evk/board.c index f64f466810..a3ff598108 100644 --- a/arch/arm/boards/nxp-imx8mp-evk/board.c +++ b/arch/arm/boards/nxp-imx8mp-evk/board.c @@ -17,7 +17,7 @@ static int nxp_imx8mp_evk_init(void) { int emmc_bbu_flag = 0; - int emmc_sd_flag = 0; + int sd_bbu_flag = 0; u32 val; if (!of_machine_is_compatible("fsl,imx8mp-evk")) @@ -29,14 +29,14 @@ static int nxp_imx8mp_evk_init(void) emmc_bbu_flag = BBU_HANDLER_FLAG_DEFAULT; } else { of_device_enable_path("/chosen/environment-sd"); - emmc_sd_flag = BBU_HANDLER_FLAG_DEFAULT; + sd_bbu_flag = BBU_HANDLER_FLAG_DEFAULT; } } else { of_device_enable_path("/chosen/environment-emmc"); emmc_bbu_flag = BBU_HANDLER_FLAG_DEFAULT; } - imx8m_bbu_internal_mmc_register_handler("SD", "/dev/mmc1.barebox", emmc_sd_flag); + imx8m_bbu_internal_mmc_register_handler("SD", "/dev/mmc1.barebox", sd_bbu_flag); imx8m_bbu_internal_mmc_register_handler("eMMC", "/dev/mmc2", emmc_bbu_flag); val = readl(MX8MP_IOMUXC_GPR_BASE_ADDR + MX8MP_IOMUXC_GPR1); diff --git a/arch/arm/boards/stm32mp15x-ev1/Makefile b/arch/arm/boards/stm32mp15x-ev1/Makefile new file mode 100644 index 0000000000..092c31d6b2 --- /dev/null +++ b/arch/arm/boards/stm32mp15x-ev1/Makefile @@ -0,0 +1,2 @@ +lwl-y += lowlevel.o +obj-y += board.o diff --git a/arch/arm/boards/stm32mp15x-ev1/board.c b/arch/arm/boards/stm32mp15x-ev1/board.c new file mode 100644 index 0000000000..b8e26cd37b --- /dev/null +++ b/arch/arm/boards/stm32mp15x-ev1/board.c @@ -0,0 +1,39 @@ +// SPDX-License-Identifier: GPL-2.0+ + +#include <bootsource.h> +#include <common.h> +#include <init.h> +#include <mach/bbu.h> + +static int ed1_probe(struct device_d *dev) +{ + int flags; + + flags = bootsource_get_instance() == 0 ? BBU_HANDLER_FLAG_DEFAULT : 0; + stm32mp_bbu_mmc_register_handler("sd", "/dev/mmc0.ssbl", flags); + + flags = bootsource_get_instance() == 1 ? BBU_HANDLER_FLAG_DEFAULT : 0; + stm32mp_bbu_mmc_register_handler("emmc", "/dev/mmc1.ssbl", flags); + + if (bootsource_get_instance() == 0) + of_device_enable_path("/chosen/environment-sd"); + else + of_device_enable_path("/chosen/environment-emmc"); + + barebox_set_model("STM32MP157C-ED1"); + + return 0; +} + +/* ED1 is the SoM on top of the EV1 */ +static const struct of_device_id ed1_of_match[] = { + { .compatible = "st,stm32mp157c-ed1" }, + { /* sentinel */ }, +}; + +static struct driver_d ed1_board_driver = { + .name = "board-stm32mp15x-ed1", + .probe = ed1_probe, + .of_compatible = ed1_of_match, +}; +postcore_platform_driver(ed1_board_driver); diff --git a/arch/arm/boards/stm32mp15x-ev1/lowlevel.c b/arch/arm/boards/stm32mp15x-ev1/lowlevel.c new file mode 100644 index 0000000000..06ff6291b8 --- /dev/null +++ b/arch/arm/boards/stm32mp15x-ev1/lowlevel.c @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: GPL-2.0+ +#include <common.h> +#include <mach/entry.h> +#include <debug_ll.h> + +extern char __dtb_z_stm32mp157c_ev1_start[]; + +static void setup_uart(void) +{ + /* first stage has set up the UART, so nothing to do here */ + putc_ll('>'); +} + +ENTRY_FUNCTION(start_stm32mp15x_ev1, r0, r1, r2) +{ + void *fdt; + + stm32mp_cpu_lowlevel_init(); + + if (IS_ENABLED(CONFIG_DEBUG_LL)) + setup_uart(); + + fdt = __dtb_z_stm32mp157c_ev1_start + get_runtime_offset(); + + stm32mp1_barebox_entry(fdt); +} diff --git a/arch/arm/configs/stm32mp_defconfig b/arch/arm/configs/stm32mp_defconfig index e1ee4ec082..49041b1f48 100644 --- a/arch/arm/configs/stm32mp_defconfig +++ b/arch/arm/configs/stm32mp_defconfig @@ -2,6 +2,7 @@ CONFIG_ARCH_STM32MP=y CONFIG_MACH_STM32MP15XX_DKX=y CONFIG_MACH_LXA_MC1=y CONFIG_MACH_SEEED_ODYSSEY=y +CONFIG_MACH_STM32MP15X_EV1=y CONFIG_THUMB2_BAREBOX=y CONFIG_ARM_BOARD_APPEND_ATAG=y CONFIG_ARM_OPTIMZED_STRING_FUNCTIONS=y @@ -92,7 +93,6 @@ CONFIG_CMD_TIME=y CONFIG_NET=y CONFIG_NET_NETCONSOLE=y CONFIG_NET_FASTBOOT=y -CONFIG_OFDEVICE=y CONFIG_OF_BAREBOX_DRIVERS=y CONFIG_AIODEV=y CONFIG_STM32_ADC=y @@ -105,6 +105,13 @@ CONFIG_REALTEK_PHY=y # CONFIG_SPI is not set CONFIG_I2C=y CONFIG_I2C_STM32=y +CONFIG_USB_HOST=y +CONFIG_USB_DWC2_HOST=y +CONFIG_USB_DWC2_GADGET=y +CONFIG_USB_GADGET=y +CONFIG_USB_GADGET_DFU=y +CONFIG_USB_GADGET_SERIAL=y +CONFIG_USB_GADGET_FASTBOOT=y CONFIG_VIDEO=y CONFIG_DRIVER_VIDEO_BACKLIGHT=y CONFIG_DRIVER_VIDEO_SIMPLE_PANEL=y diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile index 63bd73dfaa..d5f61768a5 100644 --- a/arch/arm/dts/Makefile +++ b/arch/arm/dts/Makefile @@ -113,6 +113,7 @@ lwl-$(CONFIG_MACH_SOLIDRUN_MICROSOM) += imx6dl-hummingboard.dtb.o imx6q-hummingb lwl-$(CONFIG_MACH_SEEED_ODYSSEY) += stm32mp157c-odyssey.dtb.o lwl-$(CONFIG_MACH_STM32MP15XX_DKX) += stm32mp157c-dk2.dtb.o stm32mp157a-dk1.dtb.o lwl-$(CONFIG_MACH_LXA_MC1) += stm32mp157c-lxa-mc1.dtb.o +lwl-$(CONFIG_MACH_STM32MP15X_EV1) += stm32mp157c-ev1.dtb.o lwl-$(CONFIG_MACH_SCB9328) += imx1-scb9328.dtb.o lwl-$(CONFIG_MACH_TECHNEXION_WANDBOARD) += imx6q-wandboard.dtb.o imx6dl-wandboard.dtb.o lwl-$(CONFIG_MACH_TECHNEXION_PICO_HOBBIT) += imx6ul-pico-hobbit.dtb.o diff --git a/arch/arm/dts/stm32mp157c-ev1.dts b/arch/arm/dts/stm32mp157c-ev1.dts new file mode 100644 index 0000000000..742eca7a33 --- /dev/null +++ b/arch/arm/dts/stm32mp157c-ev1.dts @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR X11) + +#include <arm/stm32mp157c-ev1.dts> +#include "stm32mp151.dtsi" + +/ { + chosen { + environment-sd { + compatible = "barebox,environment"; + device-path = &sdmmc1, "partname:barebox-environment"; + status = "disabled"; + }; + + environment-emmc { + compatible = "barebox,environment"; + device-path = &sdmmc2, "partname:barebox-environment"; + status = "disabled"; + }; + }; +}; diff --git a/arch/arm/dts/zynqmp-clk.dtsi b/arch/arm/dts/zynqmp-clk.dtsi deleted file mode 100644 index 68ece9aa67..0000000000 --- a/arch/arm/dts/zynqmp-clk.dtsi +++ /dev/null @@ -1,155 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0+ -/* - * Clock specification for Xilinx ZynqMP - * - * (C) Copyright 2017, Xilinx, Inc. - * - * Michal Simek <michal.simek@xilinx.com> - */ - -#include <dt-bindings/clock/xlnx-zynqmp-clk.h> - -&zynqmp_firmware { - zynqmp_clk: clock-controller { - #clock-cells = <1>; - compatible = "xlnx,zynqmp-clk"; - clocks = <&pss_ref_clk>, <&video_clk>, <&pss_alt_ref_clk>, <&aux_ref_clk>, <>_crx_ref_clk>; - clock-names = "pss_ref_clk", "video_clk", "pss_alt_ref_clk", "aux_ref_clk", "gt_crx_ref_clk"; - }; -}; - -/ { - pss_ref_clk: pss_ref_clk { - compatible = "fixed-clock"; - #clock-cells = <0>; - clock-frequency = <33333333>; - }; - - video_clk: video_clk { - compatible = "fixed-clock"; - #clock-cells = <0>; - clock-frequency = <27000000>; - }; - - pss_alt_ref_clk: pss_alt_ref_clk { - compatible = "fixed-clock"; - #clock-cells = <0>; - clock-frequency = <0>; - }; - - gt_crx_ref_clk: gt_crx_ref_clk { - compatible = "fixed-clock"; - #clock-cells = <0>; - clock-frequency = <108000000>; - }; - - aux_ref_clk: aux_ref_clk { - compatible = "fixed-clock"; - #clock-cells = <0>; - clock-frequency = <27000000>; - }; -}; - -&can0 { - clocks = <&zynqmp_clk CAN0_REF>, <&zynqmp_clk LPD_LSBUS>; -}; - -&can1 { - clocks = <&zynqmp_clk CAN1_REF>, <&zynqmp_clk LPD_LSBUS>; -}; - -&cpu0 { - clocks = <&zynqmp_clk ACPU>; -}; - -&gem0 { - clocks = <&zynqmp_clk LPD_LSBUS>, <&zynqmp_clk LPD_LSBUS>, <&zynqmp_clk GEM0_TX>, <&zynqmp_clk GEM0_REF>, <&zynqmp_clk GEM_TSU>; - clock-names = "pclk", "hclk", "tx_clk", "rx_clk", "tsu_clk"; -}; - -&gem1 { - clocks = <&zynqmp_clk LPD_LSBUS>, <&zynqmp_clk LPD_LSBUS>, <&zynqmp_clk GEM1_TX>, <&zynqmp_clk GEM1_REF>, <&zynqmp_clk GEM_TSU>; - clock-names = "pclk", "hclk", "tx_clk", "rx_clk", "tsu_clk"; -}; - -&gem2 { - clocks = <&zynqmp_clk LPD_LSBUS>, <&zynqmp_clk LPD_LSBUS>, <&zynqmp_clk GEM2_TX>, <&zynqmp_clk GEM2_REF>, <&zynqmp_clk GEM_TSU>; - clock-names = "pclk", "hclk", "tx_clk", "rx_clk", "tsu_clk"; -}; - -&gem3 { - clocks = <&zynqmp_clk LPD_LSBUS>, <&zynqmp_clk LPD_LSBUS>, <&zynqmp_clk GEM3_TX>, <&zynqmp_clk GEM3_REF>, <&zynqmp_clk GEM_TSU>; - clock-names = "pclk", "hclk", "tx_clk", "rx_clk", "tsu_clk"; -}; - -&gpio { - clocks = <&zynqmp_clk LPD_LSBUS>; -}; - -&i2c0 { - clocks = <&zynqmp_clk I2C0_REF>; -}; - -&i2c1 { - clocks = <&zynqmp_clk I2C1_REF>; -}; - -&pcie { - clocks = <&zynqmp_clk PCIE_REF>; -}; - -&sata { - clocks = <&zynqmp_clk SATA_REF>; -}; - -&sdhci0 { - clocks = <&zynqmp_clk SDIO0_REF>, <&zynqmp_clk LPD_LSBUS>; -}; - -&sdhci1 { - clocks = <&zynqmp_clk SDIO1_REF>, <&zynqmp_clk LPD_LSBUS>; -}; - -&spi0 { - clocks = <&zynqmp_clk SPI0_REF>, <&zynqmp_clk LPD_LSBUS>; -}; - -&spi1 { - clocks = <&zynqmp_clk SPI0_REF>, <&zynqmp_clk LPD_LSBUS>; -}; - -&ttc0 { - clocks = <&zynqmp_clk LPD_LSBUS>; -}; - -&ttc1 { - clocks = <&zynqmp_clk LPD_LSBUS>; -}; - -&ttc2 { - clocks = <&zynqmp_clk LPD_LSBUS>; -}; - -&ttc3 { - clocks = <&zynqmp_clk LPD_LSBUS>; -}; - -&uart0 { - clocks = <&zynqmp_clk UART0_REF>, <&zynqmp_clk LPD_LSBUS>; -}; - -&uart1 { - clocks = <&zynqmp_clk UART1_REF>, <&zynqmp_clk LPD_LSBUS>; -}; - -&usb0 { - clocks = <&zynqmp_clk USB0_BUS_REF>, <&zynqmp_clk USB3_DUAL_REF>; -}; - -&usb1 { - clocks = <&zynqmp_clk USB1_BUS_REF>, <&zynqmp_clk USB3_DUAL_REF>; -}; - -&watchdog0 { - clocks = <&zynqmp_clk WDT>; -}; diff --git a/arch/arm/dts/zynqmp-zcu104-revA.dts b/arch/arm/dts/zynqmp-zcu104-revA.dts index 8b8dd84c1d..8c467ee970 100644 --- a/arch/arm/dts/zynqmp-zcu104-revA.dts +++ b/arch/arm/dts/zynqmp-zcu104-revA.dts @@ -8,4 +8,3 @@ */ #include <arm64/xilinx/zynqmp-zcu104-revA.dts> -#include "zynqmp-clk.dtsi" diff --git a/arch/arm/mach-stm32mp/Kconfig b/arch/arm/mach-stm32mp/Kconfig index b8ccbaab67..95d3dc510d 100644 --- a/arch/arm/mach-stm32mp/Kconfig +++ b/arch/arm/mach-stm32mp/Kconfig @@ -23,4 +23,12 @@ config MACH_SEEED_ODYSSEY select ARCH_STM32MP157 bool "Seeed Studio Odyssey" +config MACH_STM32MP15X_EV1 + select ARCH_STM32MP157 + bool "STM32MP15X-EV1 board" + help + builds a single barebox-stm32mp15x-ev1.img that can be deployed + as SSBL on any STM32MP15X-EVAL platform, like the + STM32MP157C-EV1 + endif diff --git a/arch/mips/boards/qemu-malta/lowlevel.S b/arch/mips/boards/qemu-malta/lowlevel.S index e4ecde45cf..98821e0426 100644 --- a/arch/mips/boards/qemu-malta/lowlevel.S +++ b/arch/mips/boards/qemu-malta/lowlevel.S @@ -40,8 +40,7 @@ ENTRY_FUNCTION(BOARD_PBL_START) 0x1fc00010 address is reserved for BoardID */ .org 0x10 - .word 0xffffffff - .word 0xffffffff + .asciiz "barebox" __start: mips_disable_interrupts diff --git a/arch/sandbox/board/Makefile b/arch/sandbox/board/Makefile index c504c967de..ffb1dbc21e 100644 --- a/arch/sandbox/board/Makefile +++ b/arch/sandbox/board/Makefile @@ -7,5 +7,6 @@ obj-y += dtb.o obj-y += power.o obj-y += dev-random.o obj-y += watchdog.o +obj-$(CONFIG_LED) += led.o extra-y += barebox.lds diff --git a/arch/sandbox/board/led.c b/arch/sandbox/board/led.c new file mode 100644 index 0000000000..b7ab81112b --- /dev/null +++ b/arch/sandbox/board/led.c @@ -0,0 +1,67 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#include <common.h> +#include <init.h> +#include <led.h> +#include <mach/linux.h> +#include <of.h> + +static struct sandbox_led { + struct led led; + bool active; +} sandbox_led; + +static inline void terminal_puts(const char *s) +{ + linux_write(1, s, strlen(s)); +} + +static void sandbox_led_set(struct led *led, unsigned int brightness) +{ + terminal_puts("\x1b]2;barebox "); + while (brightness--) + terminal_puts("."); + terminal_puts("\a"); + + sandbox_led.active = true; +} + +static int sandbox_led_of_probe(struct device_d *dev) +{ + struct device_node *np = dev->device_node; + int ret; + + if (sandbox_led.led.set) + return -EBUSY; + + sandbox_led.led.name = xstrdup(np->name); + sandbox_led.led.max_value = 5; + sandbox_led.led.set = sandbox_led_set; + + ret = led_register(&sandbox_led.led); + if (ret) + return ret; + + led_of_parse_trigger(&sandbox_led.led, np); + + return 0; +} + +static void sandbox_led_of_remove(struct device_d *dev) +{ + if (sandbox_led.active) + sandbox_led_set(NULL, 0); +} + +static struct of_device_id sandbox_led_of_ids[] = { + { .compatible = "barebox,sandbox-led", }, + { } +}; + +static struct driver_d sandbox_led_of_driver = { + .name = "sandbox-led", + .probe = sandbox_led_of_probe, + .remove = sandbox_led_of_remove, + .of_compatible = sandbox_led_of_ids, +}; +device_platform_driver(sandbox_led_of_driver); diff --git a/arch/sandbox/dts/sandbox.dts b/arch/sandbox/dts/sandbox.dts index ef1fa7b866..e99986bb90 100644 --- a/arch/sandbox/dts/sandbox.dts +++ b/arch/sandbox/dts/sandbox.dts @@ -98,4 +98,8 @@ sound { compatible = "barebox,sandbox-sound"; }; + + led { + compatible = "barebox,sandbox-led"; + }; }; diff --git a/common/blspec.c b/common/blspec.c index c05d8a8297..ad80d7a8cd 100644 --- a/common/blspec.c +++ b/common/blspec.c @@ -729,7 +729,9 @@ static int blspec_scan_cdev(struct bootentries *bootentries, struct cdev *cdev) found += ret; } - rootpath = cdev_mount_default(cdev, NULL); + rootpath = cdev_get_mount_path(cdev); + if (!rootpath) + rootpath = cdev_mount_default(cdev, NULL); if (!IS_ERR(rootpath)) { ret = blspec_scan_directory(bootentries, rootpath); if (ret > 0) diff --git a/common/complete.c b/common/complete.c index ad630f4c95..e504b75606 100644 --- a/common/complete.c +++ b/common/complete.c @@ -101,14 +101,7 @@ static int path_command_complete(struct string_list *sl, char *instr) else strcat(tmp, " "); - /* This function is called - * after command_complete, - * so we check if a double - * entry exist */ - if (string_list_contains - (sl, tmp) == 0) { - string_list_add_sorted(sl, tmp); - } + string_list_add_sort_uniq(sl, tmp); } } diff --git a/common/image-fit.c b/common/image-fit.c index 538e61f51b..2c5ef7f687 100644 --- a/common/image-fit.c +++ b/common/image-fit.c @@ -230,11 +230,9 @@ static struct digest *fit_alloc_digest(struct device_node *sig_node, return ERR_PTR(-EINVAL); } - if (strcmp(algo_name, "sha1,rsa2048") == 0) { + if (strncmp(algo_name, "sha1,", 5) == 0) { algo = HASH_ALGO_SHA1; - } else if (strcmp(algo_name, "sha256,rsa2048") == 0) { - algo = HASH_ALGO_SHA256; - } else if (strcmp(algo_name, "sha256,rsa4096") == 0) { + } else if (strncmp(algo_name, "sha256,", 7) == 0) { algo = HASH_ALGO_SHA256; } else { pr_err("unknown algo %s\n", algo_name); diff --git a/common/oftree.c b/common/oftree.c index 075b9d6b8b..60d4327155 100644 --- a/common/oftree.c +++ b/common/oftree.c @@ -319,21 +319,27 @@ int of_fix_tree(struct device_node *node) struct fdt_header *of_get_fixed_tree(struct device_node *node) { int ret; - struct fdt_header *fdt; + struct fdt_header *fdt = NULL; + struct device_node *freenp = NULL; if (!node) { node = of_get_root_node(); if (!node) return NULL; + + freenp = node = of_copy_node(NULL, node); + if (!node) + return NULL; } ret = of_fix_tree(node); if (ret) - return NULL; + goto out; fdt = of_flatten_dtb(node); - if (!fdt) - return NULL; + +out: + of_delete_node(freenp); return fdt; } diff --git a/common/resource.c b/common/resource.c index 92fe96252f..ff4318a0d7 100644 --- a/common/resource.c +++ b/common/resource.c @@ -61,12 +61,14 @@ struct resource *__request_region(struct resource *parent, goto ok; if (start > r->end) continue; - debug("%s: 0x%08llx:0x%08llx conflicts with 0x%08llx:0x%08llx\n", + debug("%s: 0x%08llx:0x%08llx (%s) conflicts with 0x%08llx:0x%08llx (%s)\n", __func__, (unsigned long long)start, (unsigned long long)end, + name, (unsigned long long)r->start, - (unsigned long long)r->end); + (unsigned long long)r->end, + r->name); return ERR_PTR(-EBUSY); } diff --git a/drivers/mtd/core.c b/drivers/mtd/core.c index af33ad665c..22eb2a056c 100644 --- a/drivers/mtd/core.c +++ b/drivers/mtd/core.c @@ -222,8 +222,11 @@ static int mtd_op_erase(struct cdev *cdev, loff_t count, loff_t offset) printf("Skipping bad block at 0x%08llx\n", addr); } else { ret = mtd_erase(mtd, &erase); - if (ret) + if (ret) { + printf("%s: failed to erase block at 0x%08llx\n", + __func__, addr); return ret; + } } addr += mtd->erasesize; diff --git a/drivers/mtd/nor/cfi_flash.c b/drivers/mtd/nor/cfi_flash.c index 225b03ec3d..ba0bd1b4eb 100644 --- a/drivers/mtd/nor/cfi_flash.c +++ b/drivers/mtd/nor/cfi_flash.c @@ -969,6 +969,10 @@ static int cfi_probe_one(struct flash_info *info, int num) return PTR_ERR(iores); info->base = IOMEM(iores->start); + /* TODO: either remap memory region or disable NULL pointer page */ + if (IS_ENABLED(CONFIG_MMU) && iores->start == 0) + return -EPERM; + ret = flash_detect_size(info); if (ret) { dev_warn(info->dev, "## Unknown FLASH on Bank at 0x%p - Size = 0x%08lx = %ld MB\n", diff --git a/drivers/power/reset/reboot-mode.c b/drivers/power/reset/reboot-mode.c index df3be03edf..d9b51dfea6 100644 --- a/drivers/power/reset/reboot-mode.c +++ b/drivers/power/reset/reboot-mode.c @@ -71,10 +71,6 @@ static int of_reboot_mode_fixup(struct device_node *root, void *ctx) srcnp = reboot->dev->device_node; dstnp = of_get_node_by_reproducible_name(root, srcnp); - /* nothing to do when called on barebox-internal tree */ - if (srcnp == dstnp) - return 0; - if (dstnp) { dstparent = dstnp->parent; of_delete_node(dstnp); diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c index b8ec37be78..053a243d64 100644 --- a/drivers/usb/dwc2/gadget.c +++ b/drivers/usb/dwc2/gadget.c @@ -307,7 +307,7 @@ static void dwc2_gadget_start_req(struct dwc2 *dwc2, dwc2_writel(dwc2, ureq->dma, dma_reg); dwc2_dbg(dwc2, "%s: 0x%pad => 0x%08x\n", - __func__, (void *)ureq->dma, dma_reg); + __func__, &ureq->dma, dma_reg); } if (hs_ep->isochronous && hs_ep->interval == 1) { diff --git a/drivers/usb/dwc2/host.c b/drivers/usb/dwc2/host.c index 7a070d91f3..b5a51f5668 100644 --- a/drivers/usb/dwc2/host.c +++ b/drivers/usb/dwc2/host.c @@ -181,7 +181,7 @@ static int transfer_chunk(struct dwc2 *dwc2, u8 hc, } dwc2_dbg(dwc2, "chunk: pid=%d xfer_len=%u pkts=%u dma_addr=%pad\n", - *pid, xfer_len, num_packets, (void *)dma_addr); + *pid, xfer_len, num_packets, &dma_addr); dwc2_writel(dwc2, dma_addr, HCDMA(hc)); diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig index b6d468c63c..95d993dde8 100644 --- a/drivers/video/Kconfig +++ b/drivers/video/Kconfig @@ -101,8 +101,14 @@ source "drivers/video/imx-ipu-v3/Kconfig" source "drivers/video/bochs/Kconfig" +config DRIVER_VIDEO_SIMPLEFB_CLIENT + bool "Simple framebuffer client support" + depends on OFTREE + help + Add support for reusing a previously set up simple framebuffer. + config DRIVER_VIDEO_SIMPLEFB - bool "Simple framebuffer support" + bool "Simple framebuffer fixup support" depends on OFTREE help Add support for setting up the kernel's simple framebuffer driver diff --git a/drivers/video/Makefile b/drivers/video/Makefile index 28d0fe205b..2c002f7e53 100644 --- a/drivers/video/Makefile +++ b/drivers/video/Makefile @@ -19,7 +19,8 @@ obj-$(CONFIG_DRIVER_VIDEO_PXA) += pxa.o obj-$(CONFIG_DRIVER_VIDEO_SDL) += sdl.o obj-$(CONFIG_DRIVER_VIDEO_OMAP) += omap.o obj-$(CONFIG_DRIVER_VIDEO_BCM283X) += bcm2835.o -obj-$(CONFIG_DRIVER_VIDEO_SIMPLEFB) += simplefb.o +obj-$(CONFIG_DRIVER_VIDEO_SIMPLEFB_CLIENT) += simplefb-client.o +obj-$(CONFIG_DRIVER_VIDEO_SIMPLEFB) += simplefb-fixup.o obj-$(CONFIG_DRIVER_VIDEO_IMX_IPUV3) += imx-ipu-v3/ obj-$(CONFIG_DRIVER_VIDEO_EFI_GOP) += efi_gop.o obj-$(CONFIG_DRIVER_VIDEO_FB_SSD1307) += ssd1307fb.o diff --git a/drivers/video/simplefb-client.c b/drivers/video/simplefb-client.c new file mode 100644 index 0000000000..2d0495f616 --- /dev/null +++ b/drivers/video/simplefb-client.c @@ -0,0 +1,149 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Simplest possible simple frame-buffer driver, as a platform device + * + * Copyright (c) 2013, Stephen Warren + * + * Based on q40fb.c, which was: + * Copyright (C) 2001 Richard Zidlicky <rz@linux-m68k.org> + * + * Also based on offb.c, which was: + * Copyright (C) 1997 Geert Uytterhoeven + * Copyright (C) 1996 Paul Mackerras + */ + +#include <common.h> +#include <fb.h> +#include <io.h> +#include <linux/platform_data/simplefb.h> +#include <driver.h> +#include <of.h> + +static struct fb_ops simplefb_ops; + +static struct simplefb_format simplefb_formats[] = SIMPLEFB_FORMATS; + +struct simplefb_params { + u32 width; + u32 height; + u32 stride; + struct simplefb_format *format; +}; + +static int simplefb_parse_dt(struct device_d *dev, + struct simplefb_params *params) +{ + struct device_node *np = dev->device_node; + int ret; + const char *format; + int i; + + ret = of_property_read_u32(np, "width", ¶ms->width); + if (ret) { + dev_err(dev, "Can't parse width property\n"); + return ret; + } + + ret = of_property_read_u32(np, "height", ¶ms->height); + if (ret) { + dev_err(dev, "Can't parse height property\n"); + return ret; + } + + ret = of_property_read_u32(np, "stride", ¶ms->stride); + if (ret) { + dev_err(dev, "Can't parse stride property\n"); + return ret; + } + + ret = of_property_read_string(np, "format", &format); + if (ret) { + dev_err(dev, "Can't parse format property\n"); + return ret; + } + params->format = NULL; + for (i = 0; i < ARRAY_SIZE(simplefb_formats); i++) { + if (strcmp(format, simplefb_formats[i].name)) + continue; + params->format = &simplefb_formats[i]; + break; + } + if (!params->format) { + dev_err(dev, "Invalid format value\n"); + return -EINVAL; + } + + return 0; +} + +static int simplefb_probe(struct device_d *dev) +{ + int ret; + struct simplefb_params params; + struct fb_info *info; + struct resource *mem; + + ret = -ENODEV; + if (dev->device_node) + ret = simplefb_parse_dt(dev, ¶ms); + + if (ret) + return ret; + + mem = dev_request_mem_resource(dev, 0); + if (IS_ERR(mem)) { + dev_err(dev, "No memory resource\n"); + return PTR_ERR(mem); + } + + info = xzalloc(sizeof(*info)); + dev->priv = info; + + info->xres = params.width; + info->yres = params.height; + info->bits_per_pixel = params.format->bits_per_pixel; + info->red = params.format->red; + info->green = params.format->green; + info->blue = params.format->blue; + info->transp = params.format->transp; + info->line_length = params.stride; + + info->screen_base = (void *)mem->start; + info->screen_size = resource_size(mem); + + + info->fbops = &simplefb_ops; + + dev_info(dev, "framebuffer at 0x%p, 0x%lx bytes\n", + info->screen_base, info->screen_size); + dev_info(dev, "format=%s, mode=%dx%dx%d, linelength=%d\n", + params.format->name, + info->xres, info->yres, + info->bits_per_pixel, info->line_length); + + ret = register_framebuffer(info); + if (ret < 0) { + dev_err(dev, "Unable to register simplefb: %d\n", ret); + return ret; + } + + dev_info(dev, "simplefb registered!\n"); + + return 0; +} + +static const struct of_device_id simplefb_of_match[] = { + { .compatible = "simple-framebuffer", }, + { }, +}; + +static struct driver_d simplefb_driver = { + .name = "simple-framebuffer", + .of_compatible = simplefb_of_match, + .probe = simplefb_probe, +}; +device_platform_driver(simplefb_driver); + +MODULE_AUTHOR("Stephen Warren <swarren@wwwdotorg.org>"); +MODULE_DESCRIPTION("Simple framebuffer driver"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/video/simplefb.c b/drivers/video/simplefb-fixup.c index a2c59de364..a2c59de364 100644 --- a/drivers/video/simplefb.c +++ b/drivers/video/simplefb-fixup.c @@ -909,7 +909,6 @@ EXPORT_SYMBOL(readdir); static void stat_inode(struct inode *inode, struct stat *s) { - s->st_dev = 0; s->st_ino = inode->i_ino; s->st_mode = inode->i_mode; s->st_uid = inode->i_uid; @@ -951,9 +950,10 @@ const char *cdev_get_mount_path(struct cdev *cdev) /* * cdev_mount_default - mount a cdev to the default path * - * If a cdev is already mounted return the path it's mounted on, otherwise - * mount it to /mnt/<cdevname> and return the path. Returns an error pointer - * on failure. + * If a cdev is already mounted to the default mount path return the path + * it's mounted on. If it is mounted to any other path return EBUSY. + * Otherwise mount it to /mnt/<cdevname> and return the path. Returns an + * error pointer on failure. */ const char *cdev_mount_default(struct cdev *cdev, const char *fsoptions) { @@ -962,15 +962,24 @@ const char *cdev_mount_default(struct cdev *cdev, const char *fsoptions) int ret; /* - * If this cdev is already mounted somewhere use this path - * instead of mounting it again to avoid corruption on the - * filesystem. Note this ignores eventual fsoptions though. + * If this cdev is already mounted somewhere other than the + * default mount path return -EBUSY instead of mounting it + * again to avoid corruption on the filesystem. Note this + * ignores eventual fsoptions though. If the cdev is already + * mounted on the default path just return that path. */ path = cdev_get_mount_path(cdev); - if (path) - return path; - newpath = basprintf("/mnt/%s", cdev->name); + + if (path) { + if (strcmp(newpath, path)) { + free(newpath); + return ERR_PTR(-EBUSY); + } else { + return path; + } + } + make_directory(newpath); devpath = basprintf("/dev/%s", cdev->name); diff --git a/images/Makefile.stm32mp b/images/Makefile.stm32mp index eafe84a721..3384f5014b 100644 --- a/images/Makefile.stm32mp +++ b/images/Makefile.stm32mp @@ -27,3 +27,8 @@ pblb-$(CONFIG_MACH_SEEED_ODYSSEY) += start_stm32mp157c_seeed_odyssey FILE_barebox-stm32mp157c-seeed-odyssey.img = start_stm32mp157c_seeed_odyssey.pblb.stm32 OPTS_start_stm32mp157c_seeed_odyssey.pblb.stm32 = $(STM32MP1_OPTS) image-$(CONFIG_MACH_SEEED_ODYSSEY) += barebox-stm32mp157c-seeed-odyssey.img + +pblb-$(CONFIG_MACH_STM32MP15X_EV1) += start_stm32mp15x_ev1 +FILE_barebox-stm32mp15x-ev1.img = start_stm32mp15x_ev1.pblb.stm32 +OPTS_start_stm32mp15x_ev1.pblb.stm32 = $(STM32MP1_OPTS) +image-$(CONFIG_MACH_STM32MP15X_EV1) += barebox-stm32mp15x-ev1.img diff --git a/include/linux/platform_data/simplefb.h b/include/linux/platform_data/simplefb.h new file mode 100644 index 0000000000..a4f07eccd8 --- /dev/null +++ b/include/linux/platform_data/simplefb.h @@ -0,0 +1,46 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * simplefb.h - Simple Framebuffer Device + * + * Copyright (C) 2013 David Herrmann <dh.herrmann@gmail.com> + */ + +#ifndef __PLATFORM_DATA_SIMPLEFB_H__ +#define __PLATFORM_DATA_SIMPLEFB_H__ + +#include <video/fourcc.h> +#include <fb.h> +#include <linux/types.h> + +/* format array, use it to initialize a "struct simplefb_format" array */ +#define SIMPLEFB_FORMATS \ +{ \ + { "r5g6b5", 16, {11, 5}, {5, 6}, {0, 5}, {0, 0}, DRM_FORMAT_RGB565 }, \ + { "x1r5g5b5", 16, {10, 5}, {5, 5}, {0, 5}, {0, 0}, DRM_FORMAT_XRGB1555 }, \ + { "a1r5g5b5", 16, {10, 5}, {5, 5}, {0, 5}, {15, 1}, DRM_FORMAT_ARGB1555 }, \ + { "r8g8b8", 24, {16, 8}, {8, 8}, {0, 8}, {0, 0}, DRM_FORMAT_RGB888 }, \ + { "x8r8g8b8", 32, {16, 8}, {8, 8}, {0, 8}, {0, 0}, DRM_FORMAT_XRGB8888 }, \ + { "a8r8g8b8", 32, {16, 8}, {8, 8}, {0, 8}, {24, 8}, DRM_FORMAT_ARGB8888 }, \ + { "a8b8g8r8", 32, {0, 8}, {8, 8}, {16, 8}, {24, 8}, DRM_FORMAT_ABGR8888 }, \ + { "x2r10g10b10", 32, {20, 10}, {10, 10}, {0, 10}, {0, 0}, DRM_FORMAT_XRGB2101010 }, \ + { "a2r10g10b10", 32, {20, 10}, {10, 10}, {0, 10}, {30, 2}, DRM_FORMAT_ARGB2101010 }, \ +} + +/* + * Data-Format for Simple-Framebuffers + * @name: unique 0-terminated name that can be used to identify the mode + * @red,green,blue: Offsets and sizes of the single RGB parts + * @transp: Offset and size of the alpha bits. length=0 means no alpha + * @fourcc: 32bit DRM four-CC code (see drm_fourcc.h) + */ +struct simplefb_format { + const char *name; + u32 bits_per_pixel; + struct fb_bitfield red; + struct fb_bitfield green; + struct fb_bitfield blue; + struct fb_bitfield transp; + u32 fourcc; +}; + +#endif /* __PLATFORM_DATA_SIMPLEFB_H__ */ diff --git a/include/linux/reset.h b/include/linux/reset.h index 4a92a177bc..a166fe1cfe 100644 --- a/include/linux/reset.h +++ b/include/linux/reset.h @@ -21,43 +21,36 @@ int __must_check device_reset_us(struct device_d *dev, int us); static inline int reset_control_reset(struct reset_control *rstc) { - WARN_ON(1); return 0; } static inline int reset_control_assert(struct reset_control *rstc) { - WARN_ON(1); return 0; } static inline int reset_control_deassert(struct reset_control *rstc) { - WARN_ON(1); return 0; } static inline struct reset_control * reset_control_get(struct device_d *dev, const char *id) { - WARN_ON(1); return NULL; } static inline void reset_control_put(struct reset_control *rstc) { - WARN_ON(1); } static inline int device_reset_us(struct device_d *dev, int us) { - WARN_ON(1); return 0; } static inline int device_reset(struct device_d *dev) { - WARN_ON(1); return 0; } diff --git a/include/linux/stat.h b/include/linux/stat.h index 87fe068396..f5043d8bce 100644 --- a/include/linux/stat.h +++ b/include/linux/stat.h @@ -45,8 +45,6 @@ extern "C" { #define S_IRWXUGO (S_IRWXU|S_IRWXG|S_IRWXO) struct stat { - unsigned short st_dev; - unsigned short __pad1; unsigned long st_ino; unsigned short st_mode; unsigned short st_nlink; @@ -55,16 +53,6 @@ struct stat { unsigned short st_rdev; unsigned short __pad2; loff_t st_size; - unsigned long st_blksize; - unsigned long st_blocks; - unsigned long st_atime; - unsigned long __unused1; - unsigned long st_mtime; - unsigned long __unused2; - unsigned long st_ctime; - unsigned long __unused3; - unsigned long __unused4; - unsigned long __unused5; }; #ifdef __cplusplus diff --git a/include/stringlist.h b/include/stringlist.h index 5cd452ca5f..c5d6e70a36 100644 --- a/include/stringlist.h +++ b/include/stringlist.h @@ -12,12 +12,14 @@ struct string_list { int string_list_add(struct string_list *sl, const char *str); int string_list_add_asprintf(struct string_list *sl, const char *fmt, ...); int string_list_add_sorted(struct string_list *sl, const char *str); +int string_list_add_sort_uniq(struct string_list *sl, const char *str); int string_list_contains(struct string_list *sl, const char *str); void string_list_print_by_column(struct string_list *sl); static inline void string_list_init(struct string_list *sl) { INIT_LIST_HEAD(&sl->list); + sl->str = NULL; } static inline void string_list_free(struct string_list *sl) diff --git a/lib/parameter.c b/lib/parameter.c index f57b7d07fd..173420c58a 100644 --- a/lib/parameter.c +++ b/lib/parameter.c @@ -746,7 +746,6 @@ struct param_d *dev_add_param_bitmask(struct device_d *dev, const char *name, struct param_ip { struct param_d param; IPaddr_t *ip; - const char *format; int (*set)(struct param_d *p, void *priv); int (*get)(struct param_d *p, void *priv); }; @@ -825,7 +824,6 @@ struct param_mac { struct param_d param; char *mac; u8 mac_str[sizeof("xx:xx:xx:xx:xx:xx")]; - const char *format; int (*set)(struct param_d *p, void *priv); int (*get)(struct param_d *p, void *priv); }; diff --git a/lib/stringlist.c b/lib/stringlist.c index 8e92c1b207..719fecdaa4 100644 --- a/lib/stringlist.c +++ b/lib/stringlist.c @@ -60,6 +60,29 @@ int string_list_add_sorted(struct string_list *sl, const char *str) return 0; } +int string_list_add_sort_uniq(struct string_list *sl, const char *str) +{ + struct string_list *new, *entry = sl; + + string_list_for_each_entry(entry, sl) { + int cmp = strcmp(entry->str, str); + + if (cmp < 0) + continue; + if (cmp == 0) + return 0; + + break; + } + + new = xmalloc(sizeof(*new)); + new->str = xstrdup(str); + + list_add_tail(&new->list, &entry->list); + + return 0; +} + int string_list_contains(struct string_list *sl, const char *str) { struct string_list *entry; diff --git a/scripts/imx/imx-image.c b/scripts/imx/imx-image.c index 6cbee1d9bd..3e277e82fa 100644 --- a/scripts/imx/imx-image.c +++ b/scripts/imx/imx-image.c @@ -985,9 +985,18 @@ int main(int argc, char *argv[]) } if (add_barebox_header) { - pwrite(outfd, bb_header, sizeof_bb_header, 0); - if (data.cpu_type == IMX_CPU_IMX35) - pwrite(outfd, bb_header, sizeof_bb_header, header_len); + ret = pwrite(outfd, bb_header, sizeof_bb_header, 0); + if (ret < 0) { + fprintf(stderr, "pwrite failed: %s\n", strerror(errno)); + exit(1); + } + if (data.cpu_type == IMX_CPU_IMX35) { + ret = pwrite(outfd, bb_header, sizeof_bb_header, header_len); + if (ret < 0) { + fprintf(stderr, "pwrite failed: %s\n", strerror(errno)); + exit(1); + } + } } xwrite(outfd, infile, insize); |