Skip to contentSkip to conversation

add initial RISC-V architecture support

RFC Superseded Antony Pavlov 2 participants 5 messages Dec 12, 2016 – Dec 13, 2016

Subsystems (6)

v3 of 4 Superseded Latest is v4 →

lore
Share & tools
lore
#0 lore raw

v3 cover add initial RISC-V architecture support

This patchseries adds initial RISC-V architecture support for barebox.

See Documentation/boards/riscv.rst for instructions.

You can obtain this patchseries from github:

    $ git clone -b 20161212.riscv https://github.com/frantony/barebox

Changes since RFC v2 (20161113) (http://lists.infradead.org/pipermail/barebox/2016-November/028533.html):

* add RV32 support.

Changes since RFC v1 (20161013) (http://lists.infradead.org/pipermail/barebox/2016-October/028309.html):

* drop spike pk support;
* add qemu-sifive board support;
* add Documentation/boards/riscv.rst;
* fix guard macro names.

TODOs:
* add nmon for RISC-V;
* run barebox on a real FPGA board.

Antony Pavlov (2):
serial: add driver for SiFive UART
Add initial RISC-V architecture support

 Documentation/boards/riscv.rst                 |  93 +++++++++++++++++++++
 arch/riscv/Kconfig                             |  76 +++++++++++++++++
 arch/riscv/Makefile                            |  51 ++++++++++++
 arch/riscv/boards/qemu-sifive/.gitignore       |   1 +
 arch/riscv/boards/qemu-sifive/Makefile         |   1 +
 arch/riscv/boards/qemu-sifive/board.c          |  28 +++++++
 arch/riscv/boot/Makefile                       |   2 +
 arch/riscv/boot/main_entry.c                   |  40 +++++++++
 arch/riscv/boot/start.S                        |  44 ++++++++++
 arch/riscv/configs/qemu-sifive-e300_defconfig  |  76 +++++++++++++++++
 arch/riscv/configs/qemu-sifive-u500_defconfig  |  75 +++++++++++++++++
 arch/riscv/dts/.gitignore                      |   1 +
 arch/riscv/dts/Makefile                        |   9 ++
 arch/riscv/dts/qemu-sifive.dts                 |  19 +++++
 arch/riscv/dts/skeleton.dtsi                   |  13 +++
 arch/riscv/include/asm/barebox.h               |   1 +
 arch/riscv/include/asm/bitops.h                |  35 ++++++++
 arch/riscv/include/asm/bitsperlong.h           |  10 +++
 arch/riscv/include/asm/byteorder.h             |  12 +++
 arch/riscv/include/asm/common.h                |   6 ++
 arch/riscv/include/asm/elf.h                   |  11 +++
 arch/riscv/include/asm/io.h                    |   8 ++
 arch/riscv/include/asm/posix_types.h           |   1 +
 arch/riscv/include/asm/sections.h              |   1 +
 arch/riscv/include/asm/string.h                |   1 +
 arch/riscv/include/asm/swab.h                  |   6 ++
 arch/riscv/include/asm/types.h                 |  60 ++++++++++++++
 arch/riscv/include/asm/unaligned.h             |  19 +++++
 arch/riscv/lib/.gitignore                      |   1 +
 arch/riscv/lib/Makefile                        |   7 ++
 arch/riscv/lib/ashldi3.c                       |  28 +++++++
 arch/riscv/lib/ashrdi3.c                       |  30 +++++++
 arch/riscv/lib/asm-offsets.c                   |  12 +++
 arch/riscv/lib/barebox.lds.S                   |  87 ++++++++++++++++++++
 arch/riscv/lib/dtb.c                           |  41 ++++++++++
 arch/riscv/lib/libgcc.h                        |  29 +++++++
 arch/riscv/lib/lshrdi3.c                       |  28 +++++++
 arch/riscv/mach-sifive/Kconfig                 |  16 ++++
 arch/riscv/mach-sifive/Makefile                |   3 +
 arch/riscv/mach-sifive/include/mach/debug_ll.h |  38 +++++++++
 drivers/of/Kconfig                             |   2 +-
 drivers/serial/Kconfig                         |   3 +
 drivers/serial/Makefile                        |   1 +
 drivers/serial/serial_sifive.c                 | 109 +++++++++++++++++++++++++
 44 files changed, 1134 insertions(+), 1 deletion(-)
 create mode 100644 Documentation/boards/riscv.rst
 create mode 100644 arch/riscv/Kconfig
 create mode 100644 arch/riscv/Makefile
 create mode 100644 arch/riscv/boards/qemu-sifive/.gitignore
 create mode 100644 arch/riscv/boards/qemu-sifive/Makefile
 create mode 100644 arch/riscv/boards/qemu-sifive/board.c
 create mode 100644 arch/riscv/boot/Makefile
 create mode 100644 arch/riscv/boot/main_entry.c
 create mode 100644 arch/riscv/boot/start.S
 create mode 100644 arch/riscv/configs/qemu-sifive-e300_defconfig
 create mode 100644 arch/riscv/configs/qemu-sifive-u500_defconfig
 create mode 100644 arch/riscv/dts/.gitignore
 create mode 100644 arch/riscv/dts/Makefile
 create mode 100644 arch/riscv/dts/qemu-sifive.dts
 create mode 100644 arch/riscv/dts/skeleton.dtsi
 create mode 100644 arch/riscv/include/asm/barebox.h
 create mode 100644 arch/riscv/include/asm/bitops.h
 create mode 100644 arch/riscv/include/asm/bitsperlong.h
 create mode 100644 arch/riscv/include/asm/byteorder.h
 create mode 100644 arch/riscv/include/asm/common.h
 create mode 100644 arch/riscv/include/asm/elf.h
 create mode 100644 arch/riscv/include/asm/io.h
 create mode 100644 arch/riscv/include/asm/posix_types.h
 create mode 100644 arch/riscv/include/asm/sections.h
 create mode 100644 arch/riscv/include/asm/string.h
 create mode 100644 arch/riscv/include/asm/swab.h
 create mode 100644 arch/riscv/include/asm/types.h
 create mode 100644 arch/riscv/include/asm/unaligned.h
 create mode 100644 arch/riscv/lib/.gitignore
 create mode 100644 arch/riscv/lib/Makefile
 create mode 100644 arch/riscv/lib/ashldi3.c
 create mode 100644 arch/riscv/lib/ashrdi3.c
 create mode 100644 arch/riscv/lib/asm-offsets.c
 create mode 100644 arch/riscv/lib/barebox.lds.S
 create mode 100644 arch/riscv/lib/dtb.c
 create mode 100644 arch/riscv/lib/libgcc.h
 create mode 100644 arch/riscv/lib/lshrdi3.c
 create mode 100644 arch/riscv/mach-sifive/Kconfig
 create mode 100644 arch/riscv/mach-sifive/Makefile
 create mode 100644 arch/riscv/mach-sifive/include/mach/debug_ll.h
 create mode 100644 drivers/serial/serial_sifive.c
Signature · 7 lines
2.10.2


_______________________________________________
barebox mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/barebox
#1 lore raw

RFC v3 1/2 serial: add driver for SiFive UART

--
TODO:

* add speed setup support;
* add Tx FIFO check.

---
 drivers/serial/Kconfig         |   3 ++
 drivers/serial/Makefile        |   1 +
 drivers/serial/serial_sifive.c | 109 +++++++++++++++++++++++++++++++++++++++++
 3 files changed, 113 insertions(+)
drivers/serial/Kconfig +3 -0
index b112d7e..70509b9 100644
@@ -117,6 +117,9 @@ config DRIVER_SERIAL_S3C_AUTOSYNC
 	  Say Y here if you want to use the auto flow feature of this
 	  UART. RTS and CTS will be handled by the hardware when enabled.
 
+config DRIVER_SERIAL_SIFIVE
+	bool "SiFive serial driver"
+
 config DRIVER_SERIAL_PXA
 	bool "PXA serial driver"
 	depends on ARCH_PXA
drivers/serial/Makefile +1 -0
index 189e777..368e992 100644
@@ -20,3 +20,4 @@ obj-$(CONFIG_DRIVER_SERIAL_AUART)		+= serial_auart.o
 obj-$(CONFIG_DRIVER_SERIAL_CADENCE)		+= serial_cadence.o
 obj-$(CONFIG_DRIVER_SERIAL_EFI_STDIO)		+= efi-stdio.o
 obj-$(CONFIG_DRIVER_SERIAL_DIGIC)		+= serial_digic.o
+obj-$(CONFIG_DRIVER_SERIAL_SIFIVE)		+= serial_sifive.o
drivers/serial/serial_sifive.c new file +109 -0

109 lines not on this page · raw message

Signature · 7 lines
2.10.2


_______________________________________________
barebox mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/barebox
#2 lore raw

RFC v3 2/2 Add initial RISC-V architecture support

In reply to Antony Pavlov

--
TODOs:

* split patch;
* use sifive timer IP-block.

---
 Documentation/boards/riscv.rst                 | 93 ++++++++++++++++++++++++++
 arch/riscv/Kconfig                             | 76 +++++++++++++++++++++
 arch/riscv/Makefile                            | 51 ++++++++++++++
 arch/riscv/boards/qemu-sifive/.gitignore       |  1 +
 arch/riscv/boards/qemu-sifive/Makefile         |  1 +
 arch/riscv/boards/qemu-sifive/board.c          | 28 ++++++++
 arch/riscv/boot/Makefile                       |  2 +
 arch/riscv/boot/main_entry.c                   | 40 +++++++++++
 arch/riscv/boot/start.S                        | 44 ++++++++++++
 arch/riscv/configs/qemu-sifive-e300_defconfig  | 76 +++++++++++++++++++++
 arch/riscv/configs/qemu-sifive-u500_defconfig  | 75 +++++++++++++++++++++
 arch/riscv/dts/.gitignore                      |  1 +
 arch/riscv/dts/Makefile                        |  9 +++
 arch/riscv/dts/qemu-sifive.dts                 | 19 ++++++
 arch/riscv/dts/skeleton.dtsi                   | 13 ++++
 arch/riscv/include/asm/barebox.h               |  1 +
 arch/riscv/include/asm/bitops.h                | 35 ++++++++++
 arch/riscv/include/asm/bitsperlong.h           | 10 +++
 arch/riscv/include/asm/byteorder.h             | 12 ++++
 arch/riscv/include/asm/common.h                |  6 ++
 arch/riscv/include/asm/elf.h                   | 11 +++
 arch/riscv/include/asm/io.h                    |  8 +++
 arch/riscv/include/asm/posix_types.h           |  1 +
 arch/riscv/include/asm/sections.h              |  1 +
 arch/riscv/include/asm/string.h                |  1 +
 arch/riscv/include/asm/swab.h                  |  6 ++
 arch/riscv/include/asm/types.h                 | 60 +++++++++++++++++
 arch/riscv/include/asm/unaligned.h             | 19 ++++++
 arch/riscv/lib/.gitignore                      |  1 +
 arch/riscv/lib/Makefile                        |  7 ++
 arch/riscv/lib/ashldi3.c                       | 28 ++++++++
 arch/riscv/lib/ashrdi3.c                       | 30 +++++++++
 arch/riscv/lib/asm-offsets.c                   | 12 ++++
 arch/riscv/lib/barebox.lds.S                   | 87 ++++++++++++++++++++++++
 arch/riscv/lib/dtb.c                           | 41 ++++++++++++
 arch/riscv/lib/libgcc.h                        | 29 ++++++++
 arch/riscv/lib/lshrdi3.c                       | 28 ++++++++
 arch/riscv/mach-sifive/Kconfig                 | 16 +++++
 arch/riscv/mach-sifive/Makefile                |  3 +
 arch/riscv/mach-sifive/include/mach/debug_ll.h | 38 +++++++++++
 drivers/of/Kconfig                             |  2 +-
 41 files changed, 1021 insertions(+), 1 deletion(-)
Documentation/boards/riscv.rst new file +93 -0
new file mode 100644
index 0000000..dfb985a
@@ -0,0 +1,93 @@
+RISC-V
+======
+
+At the moment only qemu emulator is supported (see https://github.com/riscv/riscv-isa-sim
+for details).
+
+Running RISC-V barebox
+----------------------
+
+Obtain RISC-V GCC/Newlib Toolchain,
+see https://github.com/riscv/riscv-tools/blob/master/README.md
+for details. The ``build.sh`` script from ``riscv-tools`` should
+create toolchain.
+
+Next compile qemu emulator::
+
+  $ git clone https://github.com/riscv/riscv-qemu
+  $ cd riscv-qemu
+  $ cap="no" ./configure \
+    --extra-cflags="-Wno-maybe-uninitialized" \
+    --audio-drv-list="" \
+    --disable-attr \
+    --disable-blobs \
+    --disable-bluez \
+    --disable-brlapi \
+    --disable-curl \
+    --disable-curses \
+    --disable-docs \
+    --disable-kvm \
+    --disable-spice \
+    --disable-sdl \
+    --disable-vde \
+    --disable-vnc-sasl \
+    --disable-werror \
+    --enable-trace-backend=simple \
+    --disable-stack-protector \
+    --target-list=riscv32-softmmu,riscv64-softmmu
+  $ make
+
+
+### barebox 32bit ###
+
+Next compile barebox::
+
+  $ make qemu-sifive-e300_defconfig ARCH=riscv
+  ...
+  $ make ARCH=riscv CROSS_COMPILE=<path to your riscv toolchain>/riscv32-unknown-elf-
+
+Run barebox::
+
+  $ <path to riscv-qemu source>/riscv32-softmmu/qemu-system-riscv32 \
+      -nographic -M sifive -kernel <path to barebox sources >/barebox \
+      -serial stdio -monitor none -trace file=/dev/null
+
+  Switch to console [cs0]
+  
+  
+  barebox 2016.11.0-00006-g3c29f61 #1 Mon Nov 13 22:21:03 MSK 2016
+  
+  
+  Board: QEMU SiFive
+  Warning: Using dummy clocksource
+  malloc space: 0x00800000 -> 0x00bfffff (size 4 MiB)
+  running /env/bin/init...
+  /env/bin/init not found
+  barebox:/
+
+### barebox 64bit ###
+
+Next compile barebox::
+
+  $ make qemu-sifive-u500_defconfig ARCH=riscv
+  ...
+  $ make ARCH=riscv CROSS_COMPILE=<path to your riscv toolchain>/riscv64-unknown-elf-
+
+Run barebox::
+
+  $ <path to riscv-qemu source>/riscv64-softmmu/qemu-system-riscv64 \
+      -nographic -M sifive -kernel <path to barebox sources >/barebox \
+      -serial stdio -monitor none -trace file=/dev/null
+
+  Switch to console [cs0]
+  
+  
+  barebox 2016.11.0-00006-g3c29f61 #1 Mon Nov 13 22:21:03 MSK 2016
+  
+  
+  Board: QEMU SiFive
+  Warning: Using dummy clocksource
+  malloc space: 0x00800000 -> 0x00bfffff (size 4 MiB)
+  running /env/bin/init...
+  /env/bin/init not found
+  barebox:/
arch/riscv/Kconfig new file +76 -0

76 lines not on this page · raw message

arch/riscv/Makefile new file +51 -0

51 lines not on this page · raw message

arch/riscv/boards/qemu-sifive/.gitignore new file +1 -0
new file mode 100644
index 0000000..d116578
@@ -0,0 +1 @@
+barebox.lds
arch/riscv/boards/qemu-sifive/Makefile new file +1 -0
new file mode 100644
index 0000000..dcfc293
@@ -0,0 +1 @@
+obj-y += board.o
arch/riscv/boards/qemu-sifive/board.c new file +28 -0
new file mode 100644
index 0000000..ecda850
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2016 Antony Pavlov <[email protected]>
+ *
+ * This file is part of barebox.
+ * See file CREDITS for list of people who contributed to this project.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#include <common.h>
+#include <driver.h>
+#include <init.h>
+
+static int hostname_init(void)
+{
+	barebox_set_hostname("barebox");
+
+	return 0;
+}
+postcore_initcall(hostname_init);
arch/riscv/boot/Makefile new file +2 -0
new file mode 100644
index 0000000..d6d28ce
@@ -0,0 +1,2 @@
+obj-y += start.o
+obj-y += main_entry.o
arch/riscv/boot/main_entry.c new file +40 -0
new file mode 100644
index 0000000..18db86d
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2016 Antony Pavlov <[email protected]>
+ *
+ * This file is part of barebox.
+ * See file CREDITS for list of people who contributed to this project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#include <common.h>
+#include <memory.h>
+#include <asm-generic/memory_layout.h>
+#include <asm/sections.h>
+
+void main_entry(void);
+
+/**
+ * Called plainly from assembler code
+ *
+ * @note The C environment isn't initialized yet
+ */
+void main_entry(void)
+{
+	/* clear the BSS first */
+	memset(__bss_start, 0x00, __bss_stop - __bss_start);
+
+	mem_malloc_init((void *)MALLOC_BASE,
+			(void *)(MALLOC_BASE + MALLOC_SIZE - 1));
+
+	start_barebox();
+}
arch/riscv/boot/start.S new file +44 -0

44 lines not on this page · raw message

arch/riscv/configs/qemu-sifive-e300_defconfig new file +76 -0

76 lines not on this page · raw message

arch/riscv/configs/qemu-sifive-u500_defconfig new file +75 -0

75 lines not on this page · raw message

arch/riscv/dts/.gitignore new file +1 -0
new file mode 100644
index 0000000..077903c
@@ -0,0 +1 @@
+*dtb*
arch/riscv/dts/Makefile new file +9 -0
new file mode 100644
index 0000000..f8380b1
@@ -0,0 +1,9 @@
+BUILTIN_DTB := $(patsubst "%",%,$(CONFIG_BUILTIN_DTB_NAME))
+obj-$(CONFIG_BUILTIN_DTB) += $(BUILTIN_DTB).dtb.o
+
+# just to build a built-in.o. Otherwise compilation fails when no devicetree is
+# created.
+obj- += dummy.o
+
+always := $(dtb-y)
+clean-files := *.dtb *.dtb.S .*.dtc .*.pre .*.dts
arch/riscv/dts/qemu-sifive.dts new file +19 -0
new file mode 100644
index 0000000..dcf1925
@@ -0,0 +1,19 @@
+/dts-v1/;
+
+#include "skeleton.dtsi"
+
+/ {
+	model = "QEMU SiFive";
+	compatible = "sifive,qemu";
+
+	/* Digilent Arty has 256MB DDR3L */
+	memory {
+		device_type = "memory";
+		reg = <0 0x80000000 0x10000000>;
+	};
+
+	uart: uart {
+		compatible = "sifive,uart";
+		reg = <0 0x40002000 0x10>;
+	};
+};
arch/riscv/dts/skeleton.dtsi new file +13 -0
new file mode 100644
index 0000000..38ead82
@@ -0,0 +1,13 @@
+/*
+ * Skeleton device tree; the bare minimum needed to boot; just include and
+ * add a compatible value.  The bootloader will typically populate the memory
+ * node.
+ */
+
+/ {
+	#address-cells = <2>;
+	#size-cells = <1>;
+	chosen { };
+	aliases { };
+	memory { device_type = "memory"; reg = <0 0 0>; };
+};
arch/riscv/include/asm/barebox.h new file +1 -0
new file mode 100644
index 0000000..2997587
@@ -0,0 +1 @@
+/* dummy */
arch/riscv/include/asm/bitops.h new file +35 -0
new file mode 100644
index 0000000..e77ab83
@@ -0,0 +1,35 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ *
+ */
+
+#ifndef _ASM_BITOPS_H_
+#define _ASM_BITOPS_H_
+
+#include <asm-generic/bitops/__ffs.h>
+#include <asm-generic/bitops/__fls.h>
+#include <asm-generic/bitops/ffs.h>
+#include <asm-generic/bitops/fls.h>
+#include <asm-generic/bitops/ffz.h>
+#include <asm-generic/bitops/hweight.h>
+#include <asm-generic/bitops/fls64.h>
+#include <asm-generic/bitops/find.h>
+#include <asm-generic/bitops/ops.h>
+
+#define set_bit(x, y)			__set_bit(x, y)
+#define clear_bit(x, y)			__clear_bit(x, y)
+#define change_bit(x, y)		__change_bit(x, y)
+#define test_and_set_bit(x, y)		__test_and_set_bit(x, y)
+#define test_and_clear_bit(x, y)	__test_and_clear_bit(x, y)
+#define test_and_change_bit(x, y)	__test_and_change_bit(x, y)
+
+#endif /* _ASM_BITOPS_H_ */
arch/riscv/include/asm/bitsperlong.h new file +10 -0
new file mode 100644
index 0000000..4641e7e
@@ -0,0 +1,10 @@
+#ifndef __ASM_BITSPERLONG_H
+#define __ASM_BITSPERLONG_H
+
+#ifdef __riscv64
+#define BITS_PER_LONG 64
+#else
+#define BITS_PER_LONG 32
+#endif
+
+#endif /* __ASM_BITSPERLONG_H */
arch/riscv/include/asm/byteorder.h new file +12 -0
new file mode 100644
index 0000000..994a61a
@@ -0,0 +1,12 @@
+#ifndef _ASM_RISCV_BYTEORDER_H
+#define _ASM_RISCV_BYTEORDER_H
+
+#if defined(__RISCVEL__)
+#include <linux/byteorder/little_endian.h>
+#elif defined(__RISCVEB__)
+#include <linux/byteorder/big_endian.h>
+#else
+#error "Unknown endianness"
+#endif
+
+#endif /* _ASM_RISCV_BYTEORDER_H */
arch/riscv/include/asm/common.h new file +6 -0
new file mode 100644
index 0000000..bc8a17e
@@ -0,0 +1,6 @@
+#ifndef ASM_RISCV_COMMON_H
+#define ASM_RISCV_COMMON_H
+
+/* nothing special yet */
+
+#endif /* ASM_RISCV_COMMON_H */
arch/riscv/include/asm/elf.h new file +11 -0
new file mode 100644
index 0000000..7134fa0
@@ -0,0 +1,11 @@
+#ifndef __ASM_RISCV_ELF_H__
+#define __ASM_RISCV_ELF_H__
+
+#if __SIZEOF_POINTER__ == 8
+#define ELF_CLASS	ELFCLASS64
+#define CONFIG_PHYS_ADDR_T_64BIT
+#else
+#define ELF_CLASS	ELFCLASS32
+#endif
+
+#endif /* __ASM_RISCV_ELF_H__ */
arch/riscv/include/asm/io.h new file +8 -0
new file mode 100644
index 0000000..d9aca42
@@ -0,0 +1,8 @@
+#ifndef __ASM_RISCV_IO_H
+#define __ASM_RISCV_IO_H
+
+#include <asm-generic/io.h>
+
+#define IO_SPACE_LIMIT 0
+
+#endif /* __ASM_RISCV_IO_H */
arch/riscv/include/asm/posix_types.h new file +1 -0
new file mode 100644
index 0000000..22cae62
@@ -0,0 +1 @@
+#include <asm-generic/posix_types.h>
arch/riscv/include/asm/sections.h new file +1 -0
new file mode 100644
index 0000000..2b8c516
@@ -0,0 +1 @@
+#include <asm-generic/sections.h>
arch/riscv/include/asm/string.h new file +1 -0
new file mode 100644
index 0000000..2997587
@@ -0,0 +1 @@
+/* dummy */
arch/riscv/include/asm/swab.h new file +6 -0
new file mode 100644
index 0000000..60a9012
@@ -0,0 +1,6 @@
+#ifndef _ASM_SWAB_H
+#define _ASM_SWAB_H
+
+/* nothing. use generic functions */
+
+#endif /* _ASM_SWAB_H */
arch/riscv/include/asm/types.h new file +60 -0

60 lines not on this page · raw message

arch/riscv/include/asm/unaligned.h new file +19 -0
new file mode 100644
index 0000000..aaebc06
@@ -0,0 +1,19 @@
+#ifndef _ASM_RISCV_UNALIGNED_H
+#define _ASM_RISCV_UNALIGNED_H
+
+/*
+ * FIXME: this file is copy-n-pasted from sandbox's unaligned.h
+ */
+
+#include <linux/unaligned/access_ok.h>
+#include <linux/unaligned/generic.h>
+
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+#define get_unaligned __get_unaligned_le
+#define put_unaligned __put_unaligned_le
+#else
+#define get_unaligned __get_unaligned_be
+#define put_unaligned __put_unaligned_be
+#endif
+
+#endif /* _ASM_RISCV_UNALIGNED_H */
arch/riscv/lib/.gitignore new file +1 -0
new file mode 100644
index 0000000..d116578
@@ -0,0 +1 @@
+barebox.lds
arch/riscv/lib/Makefile new file +7 -0
new file mode 100644
index 0000000..97f2fb8
@@ -0,0 +1,7 @@
+extra-$(CONFIG_GENERIC_LINKER_SCRIPT) += barebox.lds
+
+obj-$(CONFIG_32BIT) += lshrdi3.o
+obj-$(CONFIG_32BIT) += ashldi3.o
+obj-$(CONFIG_32BIT) += ashrdi3.o
+
+obj-$(CONFIG_BUILTIN_DTB) += dtb.o
arch/riscv/lib/ashldi3.c new file +28 -0
new file mode 100644
index 0000000..cbdbcbb
@@ -0,0 +1,28 @@
+#include <module.h>
+
+#include "libgcc.h"
+
+long long __ashldi3(long long u, word_type b)
+{
+	DWunion uu, w;
+	word_type bm;
+
+	if (b == 0)
+		return u;
+
+	uu.ll = u;
+	bm = 32 - b;
+
+	if (bm <= 0) {
+		w.s.low = 0;
+		w.s.high = (unsigned int) uu.s.low << -bm;
+	} else {
+		const unsigned int carries = (unsigned int) uu.s.low >> bm;
+
+		w.s.low = (unsigned int) uu.s.low << b;
+		w.s.high = ((unsigned int) uu.s.high << b) | carries;
+	}
+
+	return w.ll;
+}
+EXPORT_SYMBOL(__ashldi3);
arch/riscv/lib/ashrdi3.c new file +30 -0
new file mode 100644
index 0000000..928d6d9
@@ -0,0 +1,30 @@
+#include <module.h>
+
+#include "libgcc.h"
+
+long long __ashrdi3(long long u, word_type b)
+{
+	DWunion uu, w;
+	word_type bm;
+
+	if (b == 0)
+		return u;
+
+	uu.ll = u;
+	bm = 32 - b;
+
+	if (bm <= 0) {
+		/* w.s.high = 1..1 or 0..0 */
+		w.s.high =
+		    uu.s.high >> 31;
+		w.s.low = uu.s.high >> -bm;
+	} else {
+		const unsigned int carries = (unsigned int) uu.s.high << bm;
+
+		w.s.high = uu.s.high >> b;
+		w.s.low = ((unsigned int) uu.s.low >> b) | carries;
+	}
+
+	return w.ll;
+}
+EXPORT_SYMBOL(__ashrdi3);
arch/riscv/lib/asm-offsets.c new file +12 -0
new file mode 100644
index 0000000..22f382b
@@ -0,0 +1,12 @@
+/*
+ * Generate definitions needed by assembly language modules.
+ * This code generates raw asm output which is post-processed to extract
+ * and format the required data.
+ */
+
+#include <linux/kbuild.h>
+
+int main(void)
+{
+	return 0;
+}
arch/riscv/lib/barebox.lds.S new file +87 -0

87 lines not on this page · raw message

arch/riscv/lib/dtb.c new file +41 -0

41 lines not on this page · raw message

arch/riscv/lib/libgcc.h new file +29 -0
new file mode 100644
index 0000000..593e598
@@ -0,0 +1,29 @@
+#ifndef __ASM_LIBGCC_H
+#define __ASM_LIBGCC_H
+
+#include <asm/byteorder.h>
+
+typedef int word_type __attribute__ ((mode (__word__)));
+
+#ifdef __BIG_ENDIAN
+struct DWstruct {
+	int high, low;
+};
+#elif defined(__LITTLE_ENDIAN)
+struct DWstruct {
+	int low, high;
+};
+#else
+#error I feel sick.
+#endif
+
+typedef union {
+	struct DWstruct s;
+	long long ll;
+} DWunion;
+
+long long __lshrdi3(long long u, word_type b);
+long long __ashldi3(long long u, word_type b);
+long long __ashrdi3(long long u, word_type b);
+
+#endif /* __ASM_LIBGCC_H */
arch/riscv/lib/lshrdi3.c new file +28 -0
new file mode 100644
index 0000000..74a4846
@@ -0,0 +1,28 @@
+#include <module.h>
+
+#include "libgcc.h"
+
+long long __lshrdi3(long long u, word_type b)
+{
+	DWunion uu, w;
+	word_type bm;
+
+	if (b == 0)
+		return u;
+
+	uu.ll = u;
+	bm = 32 - b;
+
+	if (bm <= 0) {
+		w.s.high = 0;
+		w.s.low = (unsigned int) uu.s.high >> -bm;
+	} else {
+		const unsigned int carries = (unsigned int) uu.s.high << bm;
+
+		w.s.high = (unsigned int) uu.s.high >> b;
+		w.s.low = ((unsigned int) uu.s.low >> b) | carries;
+	}
+
+	return w.ll;
+}
+EXPORT_SYMBOL(__lshrdi3);
arch/riscv/mach-sifive/Kconfig new file +16 -0
new file mode 100644
index 0000000..11251dd
@@ -0,0 +1,16 @@
+if MACH_SIFIVE
+
+config ARCH_TEXT_BASE
+	hex
+	default 0x00001000
+
+choice
+	prompt "Board type"
+
+config BOARD_QEMU_SIFIVE
+	bool "qemu sifive"
+	select HAS_DEBUG_LL
+
+endchoice
+
+endif
arch/riscv/mach-sifive/Makefile new file +3 -0
new file mode 100644
index 0000000..d9c51e7
@@ -0,0 +1,3 @@
+# just to build a built-in.o. Otherwise compilation fails when no o-files is
+# created.
+obj- += dummy.o
arch/riscv/mach-sifive/include/mach/debug_ll.h new file +38 -0
new file mode 100644
index 0000000..b2dbfc2
@@ -0,0 +1,38 @@
+/*
+ * Copyright (C) 2016 Antony Pavlov <[email protected]>
+ *
+ * This file is part of barebox.
+ * See file CREDITS for list of people who contributed to this project.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#ifndef __MACH_SIFIVE_DEBUG_LL__
+#define __MACH_SIFIVE_DEBUG_LL__
+
+/** @file
+ *  This File contains declaration for early output support
+ */
+
+#include <linux/kconfig.h>
+#include <asm/io.h>
+
+#define UART_BASE 0x40002000
+#define R_DATA          (0 << 2)
+#define R_RXCNT         (2 << 2)
+
+static inline void PUTC_LL(int ch)
+{
+	if (IS_ENABLED(CONFIG_DEBUG_LL))
+		__raw_writeb(ch, (u8 *)UART_BASE + R_DATA);
+}
+
+#endif /* __MACH_SIFIVE_DEBUG_LL__ */
drivers/of/Kconfig +1 -1
index d0a62bd..0824b04 100644
@@ -4,7 +4,7 @@ config OFTREE
 
 config OFTREE_MEM_GENERIC
 	depends on OFTREE
-	depends on PPC || ARM || ARCH_EFI || OPENRISC || SANDBOX
+	depends on PPC || ARM || ARCH_EFI || OPENRISC || SANDBOX || RISCV
 	def_bool y
 
 config DTC
Signature · 7 lines
2.10.2


_______________________________________________
barebox mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/barebox
#3 lore raw

Re: [RFC v3 2/2] Add initial RISC-V architecture support

arch/riscv/configs/qemu-sifive-e300_defconfig line 9

Quoted 5 lines
arch/riscv/configs/qemu-sifive-e300_defconfig new file +5 -0
+CONFIG_TEXT_BASE=0x80000000
+CONFIG_MEMORY_LAYOUT_FIXED=y
+CONFIG_STACK_BASE=0x807f0000
+CONFIG_STACK_SIZE=0x10000
+CONFIG_MALLOC_BASE=0x80800000

Due to changed offsets in e300/u500 configurations (as compared to v2- qemu config) linkage fails with binutils-2.25.1 and gcc-5.3.0:

arch/riscv/boot/built-in.o: In function `main_entry':
/build/barebox/arch/riscv/boot/main_entry.c:34:(.text+0x0): relocation truncated to fit: R_RISCV_HI20 against symbol `__bss_start' defined in .bss section in barebox
Makefile:756: recipe for target 'barebox' failed

_______________________________________________
barebox mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/barebox

#4 lore raw

Re: [RFC v3 2/2] Add initial RISC-V architecture support

Quoted 9 lines · On Tue, 13 Dec 2016 20:02:41 +0300 Andrey Korolyov <[email protected]> wrote:

Review

Quoted 5 lines
(quoted diff) +5 -0
+CONFIG_TEXT_BASE=0x80000000
+CONFIG_MEMORY_LAYOUT_FIXED=y
+CONFIG_STACK_BASE=0x807f0000
+CONFIG_STACK_SIZE=0x10000
+CONFIG_MALLOC_BASE=0x80800000

Due to changed offsets in e300/u500 configurations (as compared to v2- qemu config) linkage fails with binutils-2.25.1 and gcc-5.3.0:

Quoted 5 lines

arch/riscv/boot/built-in.o: In function `main_entry':
/build/barebox/arch/riscv/boot/main_entry.c:34:(.text+0x0): relocation truncated to fit: R_RISCV_HI20 against symbol `__bss_start' defined in .bss section in barebox
Makefile:756: recipe for target 'barebox' failed

You can fix the problem by explicitly selecting the 'Medium/Anywhere' gcc code model, e.g.

arch/riscv/Makefile +1 -1
@@ -2,7 +2,7 @@ CPPFLAGS += -fno-strict-aliasing
 
 cflags-y += -fno-pic -pipe
 cflags-y += -Wall -Wmissing-prototypes -Wstrict-prototypes \
-	-Wno-uninitialized -Wno-format -Wno-main
+	-Wno-uninitialized -Wno-format -Wno-main -mcmodel=medany
 
 LDFLAGS += $(ldflags-y)
 LDFLAGS_barebox += -nostdlib
Signature · 7 lines
Best regards,
  Antony Pavlov

_______________________________________________
barebox mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/barebox