Compare commits

..

10 Commits

Author SHA1 Message Date
ccf41b441d Merge branch 'lagarto-ox' into 'master'
Lagarto OX support

See merge request rarias/nixos-riscv!1
2024-10-11 14:14:29 +02:00
52101b0d9a Disable U-Boot verbose build 2024-10-11 11:11:51 +02:00
8d1bb60476 Print a message before we drop to a shell
This may be used by another script to determine where we managed to
boot.
2024-10-11 11:06:36 +02:00
ad5dd72928 Switch to debug2 instead of bench2
No need to run the SPEC benchmarks all the time. Stopping at the stage2
shell is enough to test most of the system.
2024-10-11 11:05:45 +02:00
4333f8074e Configure SPI addresses in header
We use the ENABLE_SPI toggle to also set the PLIC number of inputs.
2024-10-11 11:01:48 +02:00
4d1e8d3dea Fix squeue script
Now we can see jobs from other users.
2024-10-11 10:35:12 +02:00
36fdfb93f5 Add SPEC mini result 2024-10-11 09:40:40 +02:00
2c23e3d554 Update README 2024-10-11 09:34:18 +02:00
a9a8a0a40d Increase timeout for SPEC benchmarks 2024-10-10 20:51:16 +02:00
7d3fe35dfb Reduce RAM to 4 GiB
It seems to be hanging now in LVM.
2024-10-10 16:09:44 +02:00
8 changed files with 101 additions and 73 deletions

View File

@ -5291,3 +5291,17 @@ benchmarks too.
At some point we may want to be able to specify the bootcmd from fpgactl At some point we may want to be able to specify the bootcmd from fpgactl
directly. directly.
## 2024-10-11
Another successful execution of SPEC mini:
<https://pm.bsc.es/gitlab/rarias/nixos-riscv/-/jobs/34518>
benchmark size tune iter time_s
600.perlbench_s test base 1 5380.726590000
602.gcc_s test base 1 2.525468000
605.mcf_s test base 1 1927.921307000
620.omnetpp_s test base 1 1110.200756000
641.leela_s test base 1 779.333069000
648.exchange2_s test base 1 2916.464893000

View File

@ -2,45 +2,49 @@
This repository contains NixOS configurations for different RISC-V machines. This repository contains NixOS configurations for different RISC-V machines.
## QEMU ## Lagarto Ox on FPGA Alveo U55C
To boot the system in QEMU, first enter the development shell: To build the system and boot it on an FPGA of the MEEP cluster, you can run the
following:
``` ```
$ nix develop $ nix develop -L '.#lagarto-ox' --command fpga/run-remotely.sh fpgalogin1:ci
``` ```
Then run the boot script: To do it manually, you can first enter the development shell:
``` ```
$ ./boot.sh $ nix develop -L '.#lagarto-ox'
``` ```
To prevent the GC from erasing the system: Then upload the files to the target machine (fpgalogin1 by default):
```
$ nix build .#devShells.x86_64-linux.default --out-link result-env
```
## Lagarto Hun on FPGA Alveo U55C
First build required dependencies:
```
$ nix develop '.#lagarto-hun'
```
Then upload to destination:
``` ```
$ fpga/upload.sh $ fpga/upload.sh
``` ```
And then boot the system there: Then connect to the fpgalogin1 machine, allocate a FPGA node and load the
environment there:
``` ```
cucu$ ./boot.sh $ cd nixos
... $ . env.sh
``` ```
In the U-Boot prompt, paste the commands of the `uboot.env` file. Flash the images to the FPGA:
```
$ ./fpgactl -w bitstream.bit -b opensbi.bin -k kernel.bin -i initrd.bin -r rootfs.img
```
And monitor the serial line:
```
$ picocom -q -b 115200 $FPGACTL_UART
```
It should boot without any user interaction.
## Lagarto Hun
WIP

View File

@ -205,7 +205,7 @@
* property is described in * property is described in
* Documentation/devicetree/bindings/riscv/cpus.yaml * Documentation/devicetree/bindings/riscv/cpus.yaml
*/ */
clint: clint@40100000 { clint: clint@CLINT_ADDR {
reg = /bits/ 64 <CLINT_ADDR CLINT_SIZE>; reg = /bits/ 64 <CLINT_ADDR CLINT_SIZE>;
reg-names = "control"; reg-names = "control";
interrupts-extended = <&HLIC0 3>, <&HLIC0 7>; interrupts-extended = <&HLIC0 3>, <&HLIC0 7>;
@ -217,8 +217,8 @@
/* There is another auxiliar clint (timer) at 40010000 for /* There is another auxiliar clint (timer) at 40010000 for
* tests, but we don't tell the kernel so we can use it for * tests, but we don't tell the kernel so we can use it for
* testing interrupts manually. */ * testing interrupts manually. */
aux_timer: clint@40010000 { aux_timer: clint@AUXTIMER_ADDR {
reg = /bits/ 64 <0x0 0x40010000 0x0 0x00010000>; reg = /bits/ 64 <AUXTIMER_ADDR AUXTIMER_SIZE>;
reg-names = "control"; reg-names = "control";
interrupts = <4>; /* PLIC input source 4 */ interrupts = <4>; /* PLIC input source 4 */
interrupt-parent = <&PLIC>; interrupt-parent = <&PLIC>;
@ -227,23 +227,23 @@
#endif #endif
#ifdef ENABLE_SPI #ifdef ENABLE_SPI
uart16750: serial@40005000 { serial@UART2_ADDR {
compatible = "ns16750"; compatible = "ns16750";
reg = <0x00000000 0x40005000 0x00000000 0x00001000>; reg = /bits/ 64 <UART2_ADDR UART2_SIZE>;
interrupt-parent = <&PLIC>; interrupt-parent = <&PLIC>;
interrupts = <5>; interrupts = <5>;
clock-frequency = <CPU_FREQ>; clock-frequency = <CPU_FREQ>;
current-speed = <0x0001c200>; current-speed = <UART2_SPEED>;
status = "okay"; status = "okay";
}; };
spi0: spi@40007000 { spi@SPI_ADDR {
compatible = "ti,keystone-spi"; compatible = "ti,keystone-spi";
reg = <0x00000000 0x40007000 0x00000000 0x00001000>; reg = /bits/ 64 <SPI_ADDR SPI_SIZE>;
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
interrupt-parent = <&PLIC>; interrupt-parent = <&PLIC>;
interrupt-names = "intvec0", "intvec1"; interrupt-names = "intvec0", "intvec1";
interrupts = <6 0>, <0x00000007 0>; interrupts = <6 0>, <7 0>;
ti,davinci-spi-intr-line = <0>; ti,davinci-spi-intr-line = <0>;
spi-max-frequency = <24000000>; spi-max-frequency = <24000000>;
loopback-mode = <1>; loopback-mode = <1>;

View File

@ -1,3 +1,13 @@
/* Toggles */
#define ENABLE_UART0
#define ENABLE_UART1
#define ENABLE_ETHERNET
#define ENABLE_AXIDMA
#define ENABLE_PLIC
#define ENABLE_CLINT
//#define ENABLE_SPI
#define CPU_FREQ 50000000 /* 50 MHz */ #define CPU_FREQ 50000000 /* 50 MHz */
/* FIXME: The real RTC frequency is around half that, as the divider was wrongly /* FIXME: The real RTC frequency is around half that, as the divider was wrongly
* configured. So for now lets use the real frequency: * configured. So for now lets use the real frequency:
@ -9,7 +19,8 @@
* [0x0_4000_0000, 0x0_6000_0000) -> IO (512 MiB) * [0x0_4000_0000, 0x0_6000_0000) -> IO (512 MiB)
* [0x0_6000_0000, 0x0_7000_0000) -> DMA pool (256 MiB) * [0x0_6000_0000, 0x0_7000_0000) -> DMA pool (256 MiB)
* [0x0_7000_0000, 0x0_8000_0000) -> DMA pool (256 MiB) * [0x0_7000_0000, 0x0_8000_0000) -> DMA pool (256 MiB)
* [0x0_8000_0000, 0x1_c000_0000) -> RAM memory (5 GiB) * [0x0_8000_0000, 0x1_8000_0000) -> RAM memory (4 GiB)
* [0x1_8000_0000, 0x1_c000_0000) -> Unused (1 GiB)
* [0x1_c000_0000, 0x2_8000_0000) -> PMEM (3 GiB) * [0x1_c000_0000, 0x2_8000_0000) -> PMEM (3 GiB)
*/ */
@ -21,6 +32,14 @@
#define UART1_ADDR 0x40003000 #define UART1_ADDR 0x40003000
#define UART1_SIZE 0x00001000 #define UART1_SIZE 0x00001000
/* UART2 via SPI */
#define UART2_SPEED UART0_SPEED
#define UART2_ADDR 0x40005000
#define UART2_SIZE 0x00001000
#define SPI_ADDR 0x40007000
#define SPI_SIZE 0x00001000
#define AUXTIMER_ADDR 0x40010000 #define AUXTIMER_ADDR 0x40010000
#define AUXTIMER_SIZE 0x00010000 #define AUXTIMER_SIZE 0x00010000
@ -35,7 +54,12 @@
#define PLIC_ADDR 0x40800000 #define PLIC_ADDR 0x40800000
#define PLIC_SIZE 0x00400000 #define PLIC_SIZE 0x00400000
#define PLIC_NDEV 4
#ifdef ENABLE_SPI
# define PLIC_NDEV 7 /* extra UART2 + 2 x SPI */
#else
# define PLIC_NDEV 4
#endif
#define ETHPOOL_ADDR 0x60000000 #define ETHPOOL_ADDR 0x60000000
#define ETHPOOL_SIZE 0x10000000 #define ETHPOOL_SIZE 0x10000000
@ -46,17 +70,7 @@
/* Notice addresses > 32 bits from here */ /* Notice addresses > 32 bits from here */
#define MEM_ADDR 0x080000000 #define MEM_ADDR 0x080000000
#define MEM_SIZE 0x140000000 #define MEM_SIZE 0x100000000
#define PMEM_ADDR 0x1c0000000 #define PMEM_ADDR 0x1c0000000
#define PMEM_SIZE 0x0c0000000 #define PMEM_SIZE 0x0c0000000
/* Toggles */
#define ENABLE_UART0
#define ENABLE_UART1
#define ENABLE_ETHERNET
#define ENABLE_AXIDMA
#define ENABLE_PLIC
#define ENABLE_CLINT
//#define ENABLE_SPI

View File

@ -42,7 +42,7 @@ fi
# If this point is reached there is one job running # If this point is reached there is one job running
host=$(squeue -h -o %N) host=$(squeue --me -h -o %N)
echo "Switching to $host" echo "Switching to $host"
# Continue the execution there # Continue the execution there

View File

@ -21,12 +21,12 @@ set -x
./fpgactl -w bitstream.bit -b opensbi.bin -k kernel.bin -i initrd.bin -r rootfs.img ./fpgactl -w bitstream.bit -b opensbi.bin -k kernel.bin -i initrd.bin -r rootfs.img
# Normal timeouts # Normal timeouts
#timeout=$((30 * 60)) # Always stop after 30 min timeout=$((30 * 60)) # Always stop after 30 min
#timeout_silent=$((3 * 60)) # Stop if 3 min without output timeout_silent=$((3 * 60)) # Stop if 3 min without output
# Timeouts for SPEC benchmarks # Timeouts for SPEC benchmarks
timeout=$((6 * 60 * 60)) # Always stop after 6 h #timeout=$((12 * 60 * 60)) # Always stop after 12 h
timeout_silent=$((2 * 60 * 60)) # Stop if 2 h without output (some benchmarks take 1.6h) #timeout_silent=$((4 * 60 * 60)) # Stop if 4 h without output (some benchmarks take 1.6h)
# Set dead switch # Set dead switch
sleep $timeout && killall picocom & sleep $timeout && killall picocom &

View File

@ -453,16 +453,16 @@
preConfigure = '' preConfigure = ''
cp ${final.uboot-env} board/emulation/qemu-riscv/environ.env cp ${final.uboot-env} board/emulation/qemu-riscv/environ.env
''; '';
postConfigure = '' #postConfigure = ''
echo --------------------------- generated config: # echo --------------------------- generated config:
cat .config # cat .config
echo --------------------------- # echo ---------------------------
''; #'';
postBuild = '' #postBuild = ''
echo --------------------------- generated env starts # echo --------------------------- generated env starts
cat include/generated/env.in # cat include/generated/env.in
echo --------------------------- generated env ends # echo --------------------------- generated env ends
''; #'';
# #
# CONFIG_SERIAL_PRESENT=n # CONFIG_SERIAL_PRESENT=n
# CONFIG_SYS_NS16550=n # CONFIG_SYS_NS16550=n
@ -502,7 +502,7 @@
# '' # ''
; ;
extraMakeFlags = [ extraMakeFlags = [
"V=1" #"V=1"
#"KCPPFLAGS=-DLOG_DEBUG" #"KCPPFLAGS=-DLOG_DEBUG"
#"EXT_DTB=${final.ox-dtb}/lagarto_ox.dtb" #"EXT_DTB=${final.ox-dtb}/lagarto_ox.dtb"
]; ];
@ -540,7 +540,7 @@
in prev.runCommand "uboot.txt" {} '' in prev.runCommand "uboot.txt" {} ''
cat > $out <<EOF cat > $out <<EOF
xtrace=yes xtrace=yes
bootargs=root=/dev/ram0 loglevel=7 rw earlycon=sbi console=hvc0 bench2 init=${init} bootargs=root=/dev/ram0 loglevel=7 rw earlycon=sbi console=hvc0 debug2 init=${init}
ramdisk_size=$(stat --format %s $(readlink -f ${initrd})) ramdisk_size=$(stat --format %s $(readlink -f ${initrd}))
bootcmd=fdt print; booti \''${kernel_addr_r} \''${ramdisk_addr_r}:\''${ramdisk_size} \''${fdtcontroladdr} bootcmd=fdt print; booti \''${kernel_addr_r} \''${ramdisk_addr_r}:\''${ramdisk_size} \''${fdtcontroladdr}
EOF EOF

View File

@ -1,8 +1,6 @@
#! @shell@ #! @shell@
set -x #set -x
echo "--- starting stage 2 ---"
systemConfig=@systemConfig@ systemConfig=@systemConfig@
@ -10,6 +8,11 @@ export HOME=/root PATH="@path@"
if [ "${IN_NIXOS_SYSTEMD_STAGE1:-}" != true ]; then if [ "${IN_NIXOS_SYSTEMD_STAGE1:-}" != true ]; then
# Print a greeting.
echo
echo -e "\e[1;32m<<< @distroName@ Stage 2 >>>\e[0m"
echo
# Process the kernel command line. # Process the kernel command line.
for o in $(</proc/cmdline); do for o in $(</proc/cmdline); do
case $o in case $o in
@ -28,13 +31,6 @@ if [ "${IN_NIXOS_SYSTEMD_STAGE1:-}" != true ]; then
esac esac
done done
# Print a greeting.
echo
echo -e "\e[1;32m<<< @distroName@ Stage 2 >>>\e[0m"
echo
# Normally, stage 1 mounts the root filesystem read/writable. # Normally, stage 1 mounts the root filesystem read/writable.
# However, in some environments, stage 2 is executed directly, and the # However, in some environments, stage 2 is executed directly, and the
# root is read-only. So make it writable here. # root is read-only. So make it writable here.