[PATCH v2] Porting barebox to a new SoC
Ahmad Fatoum
ahmad at a3f.at
Sun May 28 08:37:35 PDT 2023
From: Lior Weintraub <liorw at pliops.com>
Hi,
I tried to follow the porting guide on https://www.barebox.org/doc/latest/devel/porting.html# but couldn't follow the instructions.
I would like to port barebox to a new SoC (which is not a derivative of any known SoC).
It has the following:
* Single Cortex A53
* SRAM (4MB) located on address 0xC000000000
The below patch shows my initial test to try and have a starting point.
I am setting env variables:
export ARCH=arm64
export CROSS_COMPILE=/home/pliops/workspace/ARM/arm-gnu-toolchain/bin/aarch64-none-elf-
Then I build with:
make spider_defconfig && make
This gives an error:
aarch64-none-elf-gcc: error: unrecognized argument in option '-mabi=apcs-gnu'
aarch64-none-elf-gcc: note: valid arguments to '-mabi=' are: ilp32 lp64
aarch64-none-elf-gcc: error: unrecognized command-line option '-msoft-float'
aarch64-none-elf-gcc: error: unrecognized command-line option '-mno-unaligned-access'
/home/pliops/workspace/simplest-linux-demo/barebox/scripts/Makefile.build:140: recipe for target 'scripts/mod/empty.o' failed
make[2]: *** [scripts/mod/empty.o] Error 1
Not sure why the compiler flags get -mabi=apcs-gnu when I explicitly set CONFIG_CPU_V8 and the arch/arm/Makefile has:
ifeq ($(CONFIG_CPU_V8), y)
CFLAGS_ABI :=-mabi=lp64
The changes I did:
>From 848b5f9b18bb1bb96d197cbc1b368ee0a729d581 Mon Sep 17 00:00:00 2001
---
arch/arm/Kconfig | 13 ++++++++
arch/arm/Makefile | 1 +
arch/arm/boards/Makefile | 1 +
arch/arm/boards/spider-evk/Makefile | 4 +++
arch/arm/boards/spider-evk/board.c | 26 +++++++++++++++
arch/arm/boards/spider-evk/lowlevel.c | 30 +++++++++++++++++
arch/arm/configs/spider_defconfig | 8 +++++
arch/arm/dts/Makefile | 1 +
arch/arm/dts/spider-mk1-evk.dts | 10 ++++++
arch/arm/dts/spider-mk1.dtsi | 46 +++++++++++++++++++++++++++
arch/arm/mach-spider/Kconfig | 16 ++++++++++
arch/arm/mach-spider/Makefile | 1 +
arch/arm/mach-spider/lowlevel.c | 14 ++++++++
images/Makefile | 1 +
images/Makefile.spider | 5 +++
include/mach/spider/lowlevel.h | 7 ++++
16 files changed, 184 insertions(+)
create mode 100644 arch/arm/boards/spider-evk/Makefile
create mode 100644 arch/arm/boards/spider-evk/board.c
create mode 100644 arch/arm/boards/spider-evk/lowlevel.c
create mode 100644 arch/arm/configs/spider_defconfig
create mode 100644 arch/arm/dts/spider-mk1-evk.dts
create mode 100644 arch/arm/dts/spider-mk1.dtsi
create mode 100644 arch/arm/mach-spider/Kconfig
create mode 100644 arch/arm/mach-spider/Makefile
create mode 100644 arch/arm/mach-spider/lowlevel.c
create mode 100644 images/Makefile.spider
create mode 100644 include/mach/spider/lowlevel.h
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index e76ee0f6dfe1..e5dcf128447e 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -255,6 +255,18 @@ config ARCH_ROCKCHIP
select HAS_DEBUG_LL
imply GPIO_ROCKCHIP
+config ARCH_SPIDER
+ bool "Pliops Spider based"
+ depends on 64BIT
+ depends on ARCH_MULTIARCH
+ select GPIOLIB
+ select HAVE_PBL_MULTI_IMAGES
+ select COMMON_CLK
+ select CLKDEV_LOOKUP
+ select COMMON_CLK_OF_PROVIDER
+ select OFTREE
+ select OFDEVICE
+
config ARCH_STM32MP
bool "STMicroelectronics STM32MP"
depends on 32BIT
@@ -331,6 +343,7 @@ source "arch/arm/mach-omap/Kconfig"
source "arch/arm/mach-pxa/Kconfig"
source "arch/arm/mach-rockchip/Kconfig"
source "arch/arm/mach-socfpga/Kconfig"
+source "arch/arm/mach-spider/Kconfig"
source "arch/arm/mach-stm32mp/Kconfig"
source "arch/arm/mach-versatile/Kconfig"
source "arch/arm/mach-vexpress/Kconfig"
diff --git a/arch/arm/Makefile b/arch/arm/Makefile
index 35ebc70f44e2..4c63dfee48f4 100644
--- a/arch/arm/Makefile
+++ b/arch/arm/Makefile
@@ -101,6 +101,7 @@ machine-$(CONFIG_ARCH_MXS) += mxs
machine-$(CONFIG_ARCH_MVEBU) += mvebu
machine-$(CONFIG_ARCH_NOMADIK) += nomadik
machine-$(CONFIG_ARCH_OMAP) += omap
+machine-$(CONFIG_ARCH_SPIDER) += spider
machine-$(CONFIG_ARCH_PXA) += pxa
machine-$(CONFIG_ARCH_ROCKCHIP) += rockchip
machine-$(CONFIG_ARCH_SAMSUNG) += samsung
diff --git a/arch/arm/boards/Makefile b/arch/arm/boards/Makefile
index 2877debad535..6fe0a90c81ea 100644
--- a/arch/arm/boards/Makefile
+++ b/arch/arm/boards/Makefile
@@ -135,6 +135,7 @@ obj-$(CONFIG_MACH_SOCFPGA_TERASIC_DE10_NANO) += terasic-de10-nano/
obj-$(CONFIG_MACH_SOCFPGA_TERASIC_SOCKIT) += terasic-sockit/
obj-$(CONFIG_MACH_SOLIDRUN_CUBOX) += solidrun-cubox/
obj-$(CONFIG_MACH_SOLIDRUN_MICROSOM) += solidrun-microsom/
+obj-$(CONFIG_MACH_SPIDER_MK1_EVK) += spider-evk/
obj-$(CONFIG_MACH_STM32MP15XX_DKX) += stm32mp15xx-dkx/
obj-$(CONFIG_MACH_STM32MP13XX_DK) += stm32mp13xx-dk/
obj-$(CONFIG_MACH_LXA_MC1) += lxa-mc1/
diff --git a/arch/arm/boards/spider-evk/Makefile b/arch/arm/boards/spider-evk/Makefile
new file mode 100644
index 000000000000..da63d2625f7a
--- /dev/null
+++ b/arch/arm/boards/spider-evk/Makefile
@@ -0,0 +1,4 @@
+# SPDX-License-Identifier: GPL-2.0-only
+
+obj-y += board.o
+lwl-y += lowlevel.o
diff --git a/arch/arm/boards/spider-evk/board.c b/arch/arm/boards/spider-evk/board.c
new file mode 100644
index 000000000000..3920e83b457d
--- /dev/null
+++ b/arch/arm/boards/spider-evk/board.c
@@ -0,0 +1,26 @@
+#include <bbu.h>
+#include <boot.h>
+#include <bootm.h>
+#include <common.h>
+#include <deep-probe.h>
+#include <environment.h>
+#include <fcntl.h>
+#include <globalvar.h>
+
+static int spider_board_probe(struct device *dev)
+{
+ /* Do some board-specific setup */
+ return 0;
+}
+
+static const struct of_device_id spider_board_of_match[] = {
+ { .compatible = "pliops,spider-mk1-evk" },
+ { /* sentinel */ },
+};
+
+static struct driver spider_board_driver = {
+ .name = "board-spider",
+ .probe = spider_board_probe,
+ .of_compatible = spider_board_of_match,
+};
+device_platform_driver(spider_board_driver);
diff --git a/arch/arm/boards/spider-evk/lowlevel.c b/arch/arm/boards/spider-evk/lowlevel.c
new file mode 100644
index 000000000000..e36fcde4208e
--- /dev/null
+++ b/arch/arm/boards/spider-evk/lowlevel.c
@@ -0,0 +1,30 @@
+#include <common.h>
+#include <asm/barebox-arm.h>
+#include <mach/spider/lowlevel.h>
+
+#define BASE_ADDR (0xD000307000)
+#define GPRAM_ADDR (0xC000000000)
+#define MY_STACK_TOP (0xC000000000 + SZ_2M) // Set the stack 2MB from GPRAM start (excatly in the middle)
+static inline void spider_serial_putc(void *base, int c)
+{
+// if (!(readl(base + UCR1) & UCR1_UARTEN))
+// return;
+//
+// while (!(readl(base + USR2) & USR2_TXDC));
+//
+// writel(c, base + URTX0);
+}
+
+ENTRY_FUNCTION_WITHSTACK(start_spider_mk1_evk, MY_STACK_TOP, r0, r1, r2)
+{
+ extern char __dtb_spider_mk1_evk_start[];
+
+ spider_lowlevel_init();
+
+ relocate_to_current_adr();
+ setup_c();
+
+ pbl_set_putc(spider_serial_putc, (void *)BASE_ADDR);
+
+ barebox_arm_entry(GPRAM_ADDR, SZ_2M, __dtb_spider_mk1_evk_start);
+}
diff --git a/arch/arm/configs/spider_defconfig b/arch/arm/configs/spider_defconfig
new file mode 100644
index 000000000000..c91bb889d97f
--- /dev/null
+++ b/arch/arm/configs/spider_defconfig
@@ -0,0 +1,8 @@
+CONFIG_ARCH_SPIDER=y
+CONFIG_MACH_SPIDER_MK1_EVK=y
+CONFIG_BOARD_ARM_GENERIC_DT=y
+CONFIG_MALLOC_TLSF=y
+CONFIG_KALLSYMS=y
+CONFIG_RELOCATABLE=y
+CONFIG_CONSOLE_ALLOW_COLOR=y
+CONFIG_PBL_CONSOLE=y
diff --git a/arch/arm/dts/Makefile b/arch/arm/dts/Makefile
index 98f4c4e0194b..94b304d4878f 100644
--- a/arch/arm/dts/Makefile
+++ b/arch/arm/dts/Makefile
@@ -134,6 +134,7 @@ lwl-$(CONFIG_MACH_SOLIDRUN_CUBOX) += dove-cubox-bb.dtb.o
lwl-$(CONFIG_MACH_SOLIDRUN_MICROSOM) += imx6dl-hummingboard.dtb.o imx6q-hummingboard.dtb.o \
imx6dl-hummingboard2.dtb.o imx6q-hummingboard2.dtb.o \
imx6q-h100.dtb.o
+lwl-$(CONFIG_MACH_SPIDER_MK1_EVK) += spider-mk1-evk.dtb.o
lwl-$(CONFIG_MACH_SKOV_IMX6) += imx6s-skov-imx6.dtb.o imx6dl-skov-imx6.dtb.o imx6q-skov-imx6.dtb.o
lwl-$(CONFIG_MACH_SKOV_ARM9CPU) += at91-skov-arm9cpu.dtb.o
lwl-$(CONFIG_MACH_SEEED_ODYSSEY) += stm32mp157c-odyssey.dtb.o
diff --git a/arch/arm/dts/spider-mk1-evk.dts b/arch/arm/dts/spider-mk1-evk.dts
new file mode 100644
index 000000000000..b8081cb85bf8
--- /dev/null
+++ b/arch/arm/dts/spider-mk1-evk.dts
@@ -0,0 +1,10 @@
+// SPDX-License-Identifier: GPL-2.0 OR X11
+
+/dts-v1/;
+
+#include "spider-mk1.dtsi"
+
+/ {
+ model = "Pliops Spider MK-I EVK";
+ compatible = "pliops,spider-mk1-evk";
+};
diff --git a/arch/arm/dts/spider-mk1.dtsi b/arch/arm/dts/spider-mk1.dtsi
new file mode 100644
index 000000000000..d4613848169d
--- /dev/null
+++ b/arch/arm/dts/spider-mk1.dtsi
@@ -0,0 +1,46 @@
+// SPDX-License-Identifier: GPL-2.0 OR X11
+
+/ {
+ #address-cells = <2>;
+ #size-cells = <2>;
+
+ chosen {
+ stdout-path = &uart0;
+ };
+
+ aliases {
+ serial0 = &uart0;
+ };
+
+ cpus {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ cpu0: cpu at 0 {
+ device_type = "cpu";
+ compatible = "arm,cortex-a53";
+ reg = <0x0>;
+ };
+ };
+
+ memory at 1000000 {
+ reg = <0x0 0x1000000 0x0 0x400000>; /* 128M */
+ device_type = "memory";
+ };
+
+ soc {
+ #address-cells = <2>;
+ #size-cells = <2>;
+ ranges;
+
+ sram at c000000000 {
+ compatible = "mmio-sram";
+ reg = <0xc0 0x0 0x0 0x400000>;
+ };
+
+ uart0: serial at d000307000 {
+ compatible = "pliops,spider-uart";
+ reg = <0xd0 0x307000 0 0x1000>;
+ };
+ };
+};
diff --git a/arch/arm/mach-spider/Kconfig b/arch/arm/mach-spider/Kconfig
new file mode 100644
index 000000000000..6d2f888a5fd8
--- /dev/null
+++ b/arch/arm/mach-spider/Kconfig
@@ -0,0 +1,16 @@
+# SPDX-License-Identifier: GPL-2.0-only
+
+if ARCH_SPIDER
+
+config ARCH_SPIDER_MK1
+ bool
+ select CPU_V8
+ help
+ The first Cortex-A53-based SoC of the spider family.
+ This symbol is invisble and select by boards
+
+config MACH_SPIDER_MK1_EVK
+ bool "Pliops Spider Reference Design Board"
+ select ARCH_SPIDER_MK1
+
+endif
diff --git a/arch/arm/mach-spider/Makefile b/arch/arm/mach-spider/Makefile
new file mode 100644
index 000000000000..b08c4a93ca27
--- /dev/null
+++ b/arch/arm/mach-spider/Makefile
@@ -0,0 +1 @@
+lwl-y += lowlevel.o
diff --git a/arch/arm/mach-spider/lowlevel.c b/arch/arm/mach-spider/lowlevel.c
new file mode 100644
index 000000000000..5d62ef0f39e5
--- /dev/null
+++ b/arch/arm/mach-spider/lowlevel.c
@@ -0,0 +1,14 @@
+// SPDX-License-Identifier: GPL-2.0+
+
+#include <linux/types.h>
+#include <mach/spider/lowlevel.h>
+#include <asm/barebox-arm-head.h>
+
+void spider_lowlevel_init(void)
+{
+ arm_cpu_lowlevel_init();
+ /*
+ * not yet relocated, only do writel/readl for stuff that's
+ * critical to run early. No global variables allowed.
+ */
+}
diff --git a/images/Makefile b/images/Makefile
index c93f9e268978..97521e713228 100644
--- a/images/Makefile
+++ b/images/Makefile
@@ -150,6 +150,7 @@ include $(srctree)/images/Makefile.mxs
include $(srctree)/images/Makefile.omap3
include $(srctree)/images/Makefile.rockchip
include $(srctree)/images/Makefile.socfpga
+include $(srctree)/images/Makefile.spider
include $(srctree)/images/Makefile.stm32mp
include $(srctree)/images/Makefile.tegra
include $(srctree)/images/Makefile.versatile
diff --git a/images/Makefile.spider b/images/Makefile.spider
new file mode 100644
index 000000000000..c32f2762df04
--- /dev/null
+++ b/images/Makefile.spider
@@ -0,0 +1,5 @@
+# SPDX-License-Identifier: GPL-2.0-only
+
+pblb-$(CONFIG_MACH_SPIDER_MK1_EVK) += start_spider_mk1_evk
+FILE_barebox-spider-mk1-evk.img = start_spider_mk1_evk.pblb
+image-$(CONFIG_MACH_SPIDER_MK1_EVK) += barebox-spider-mk1-evk.img
diff --git a/include/mach/spider/lowlevel.h b/include/mach/spider/lowlevel.h
new file mode 100644
index 000000000000..6e0ce1c77f7e
--- /dev/null
+++ b/include/mach/spider/lowlevel.h
@@ -0,0 +1,7 @@
+/* SPDX-License-Identifier: GPL-2.0+ */
+#ifndef __MACH_SPIDER_H_
+#define __MACH_SPIDER_H_
+
+void spider_lowlevel_init(void);
+
+#endif
--
2.38.4
More information about the barebox
mailing list