diff --git a/dts/nutshell.dts.in b/dts/nutshell.dts.in index 7a1bc51..8d37310 100644 --- a/dts/nutshell.dts.in +++ b/dts/nutshell.dts.in @@ -30,8 +30,8 @@ chosen { bootargs = "console=hvc0 earlycon=sbi"; - linux,initrd-start = <0x0 INITRAMFS_BEGIN>; - linux,initrd-end = <0x0 INITRAMFS_END>; + linux,initrd-start = ; + linux,initrd-end = ; }; memory@100000000 { diff --git a/dts/spike-2core.dts.in b/dts/spike-2core.dts.in index 5538711..3af76b9 100644 --- a/dts/spike-2core.dts.in +++ b/dts/spike-2core.dts.in @@ -8,8 +8,8 @@ chosen { stdout-path = &SERIAL0; bootargs = "console=ttyS0 earlycon"; - linux,initrd-start = <0x0 INITRAMFS_BEGIN>; - linux,initrd-end = <0x0 INITRAMFS_END>; + linux,initrd-start = ; + linux,initrd-end = ; }; cpus { #address-cells = <1>; diff --git a/dts/spike.dts.in b/dts/spike.dts.in index 9036de1..20620e5 100644 --- a/dts/spike.dts.in +++ b/dts/spike.dts.in @@ -8,8 +8,8 @@ chosen { stdout-path = &SERIAL0; bootargs = "console=ttyS0 earlycon"; - linux,initrd-start = <0x0 INITRAMFS_BEGIN>; - linux,initrd-end = <0x0 INITRAMFS_END>; + linux,initrd-start = ; + linux,initrd-end = ; }; cpus { #address-cells = <1>; diff --git a/dts/xiangshan-fpga-noAIA-mem128g-novec.dts.in b/dts/xiangshan-fpga-noAIA-mem128g-novec.dts.in new file mode 100644 index 0000000..f4d7498 --- /dev/null +++ b/dts/xiangshan-fpga-noAIA-mem128g-novec.dts.in @@ -0,0 +1,184 @@ +/* + * XiangShan FPGA DTS used by the fpga board flow. + * + * 1. AIA is disabled, so Linux should only see the legacy CLINT + PLIC path. + * 2. UART16550 is exposed as the serial console. + */ + +/dts-v1/; + +/ { + compatible = "freechips,rocketchip-unknown-dev"; + model = "xiangshan,Kunminghu-dev"; + #address-cells = <2>; + #size-cells = <2>; + cpus { + #address-cells = <1>; + #size-cells = <0>; + timebase-frequency = <1000000>; + + cpu0: cpu@0 { + compatible = "ICT,xiangshan", "riscv"; + device_type = "cpu"; + reg = <0x0>; + status = "okay"; + + d-cache-block-size = <64>; + d-cache-sets = <256>; + d-cache-size = <65536>; + d-tlb-sets = <1>; + d-tlb-size = <48>; + i-cache-block-size = <64>; + i-cache-sets = <256>; + i-cache-size = <65536>; + i-tlb-sets = <1>; + i-tlb-size = <48>; + mmu-type = "riscv,sv48"; + clock-frequency = <0>; + timebase-frequency = <1000000>; + tlb-split; + + /* + * Keep the Linux-friendly CPU capability description from the + * workload template while using the FPGA board interrupt/peripheral + * map below. + */ + riscv,isa = "rv64imafdcvh_smstateen_sscofpmf_sstc_zicntr_zihpm_svpbmt_sdtrig_smcsrind_sscsrind_svade"; + riscv,isa-base = "rv64i"; + riscv,isa-extensions = + "i", "m", "a", "f", "d", "c", "h", + "sdtrig", "sha", "shcounterenw", "shgatpa", + "shlcofideleg", "shtvala", "shvsatpa", "shvstvala", + "shvstvecd", "smcsrind", "smdbltrp", + "smmpm", "smnpm", "smrnmi", "smstateen", + "ss1p13", "ssccptr", "sscofpmf", + "sscounterenw", "sscsrind", "ssdbltrp", "ssnpm", + "sspm", "ssstateen", "ssstrict", "sstc", + "sstvala", "sstvecd", "ssu64xl", "supm", + "sv39", "sv48", "svade", "svbare", "svinval", + "svnapot", "svpbmt", "za64rs", "zacas", "zawrs", + "zba", "zbb", "zbc", "zbkb", "zbkc", "zbkx", + "zbs", "zcb", "zcmop", "zfa", "zfh", "zfhmin", + "zic64b", + "ziccamoa", "ziccif", "zicclsm", "ziccrse", + "zicntr", "zicond", "zicsr", "zifencei", + "zihintntl", "zihintpause", "zihpm", "zimop", + "zkn", "zknd", "zkne", "zknh", "zksed", + "zksh", "zkt"; + riscv,cbom-block-size = <0x40>; + riscv,cboz-block-size = <0x40>; + + next-level-cache = <&l2_cache>; + + intc_cpu0: interrupt-controller { + #interrupt-cells = <1>; + compatible = "riscv,cpu-intc"; + interrupt-controller; + }; + }; + }; + + l2_cache: l2-cache { + compatible = "cache"; + cache-level = <2>; + cache-block-size = <64>; + cache-size = <1048576>; + }; + + memory: memory@80000000 { + device_type = "memory"; + /* + * Static 64 GiB memory profile for SPEC CPU2026 speed workloads. + */ + reg = <0x0 0x80000000 0x20 0x00000000>; + }; + + reserved-memory { + #address-cells = <2>; + #size-cells = <2>; + ranges; + + reserved0: buffer@0 { + no-map; + reg = <0x0 0x80000000 0x0 0x100000>; + }; + }; + + soc { + #address-cells = <2>; + #size-cells = <2>; + compatible = "freechips,rocketchip-unknown-soc", "simple-bus"; + ranges; + + /* + * This FPGA image boots without AIA. Describe only the CLINT + PLIC + * interrupt topology that the software stack should probe. + */ + clint: clint@38000000 { + compatible = "riscv,clint0"; + reg = <0x0 0x38000000 0x0 0x10000>; + reg-names = "control"; + interrupts-extended = <&intc_cpu0 3 &intc_cpu0 7>; + }; + + debug-controller@38020000 { + compatible = "sifive,debug-013", "riscv,debug-013"; + debug-attach = "jtag"; + reg = <0x0 0x38020000 0x0 0x1000>; + reg-names = "control"; + interrupts-extended = <&intc_cpu0 65535>; + }; + + PLIC: interrupt-controller@3c000000 { + compatible = "riscv,plic0"; + #interrupt-cells = <1>; + interrupt-controller; + reg = <0x0 0x3c000000 0x0 0x4000000>; + reg-names = "control"; + interrupts-extended = <&intc_cpu0 11 &intc_cpu0 9>; + riscv,max-priority = <7>; + riscv,ndev = <66>; + }; + + /* + * Board-specific FPGA peripheral: the external AXI UART16550 used as + * the Linux console on fpga. Keep the 32-bit MMIO spacing and the + * 50 MHz input clock to match the FPGA wrapper. + */ + uart0: serial@310b0000 { + compatible = "ns16550a"; + reg = <0x0 0x310b0000 0x0 0x10000>; + reg-shift = <0x2>; + reg-io-width = <0x4>; + clock-frequency = <50000000>; + current-speed = <115200>; + //interrupt-parent = <&PLIC>; + //interrupts = <40>; + status = "okay"; + }; + }; + + aliases { + serial0 = &uart0; + }; + + chosen { + /* + * On this FPGA DTS the UART16550 interrupt is not wired into Linux + * (`interrupt-parent` / `interrupts` are intentionally absent above). + * `ttyS0` can still print early boot logs via polling/earlycon, but the + * normal console path becomes unreliable once Linux switches away from + * earlycon. When the UART interrupt is absent, use the SBI console + * (`hvc0`) instead. + */ + bootargs = "console=hvc0 earlycon=sbi loglevel=8"; + stdout-path = "serial0:115200n8"; + linux,initrd-start = ; + linux,initrd-end = ; + + opensbi-config { + compatible = "opensbi,config"; + cold-boot-harts = <&cpu0>; + }; + }; +}; diff --git a/dts/xiangshan-fpga-noAIA-mem24g-novec.dts.in b/dts/xiangshan-fpga-noAIA-mem24g-novec.dts.in index 74c2f57..0a49655 100644 --- a/dts/xiangshan-fpga-noAIA-mem24g-novec.dts.in +++ b/dts/xiangshan-fpga-noAIA-mem24g-novec.dts.in @@ -173,8 +173,8 @@ */ bootargs = "console=hvc0 earlycon=sbi loglevel=8"; stdout-path = "serial0:115200n8"; - linux,initrd-start = <0x0 INITRAMFS_BEGIN>; - linux,initrd-end = <0x0 INITRAMFS_END>; + linux,initrd-start = ; + linux,initrd-end = ; opensbi-config { compatible = "opensbi,config"; diff --git a/dts/xiangshan-fpga-noAIA-mem24g.dts.in b/dts/xiangshan-fpga-noAIA-mem24g.dts.in index 57f61c2..74e3688 100644 --- a/dts/xiangshan-fpga-noAIA-mem24g.dts.in +++ b/dts/xiangshan-fpga-noAIA-mem24g.dts.in @@ -174,8 +174,8 @@ */ bootargs = "console=hvc0 earlycon=sbi loglevel=8"; stdout-path = "serial0:115200n8"; - linux,initrd-start = <0x0 INITRAMFS_BEGIN>; - linux,initrd-end = <0x0 INITRAMFS_END>; + linux,initrd-start = ; + linux,initrd-end = ; opensbi-config { compatible = "opensbi,config"; diff --git a/dts/xiangshan-fpga-noAIA-mem64g-novec.dts.in b/dts/xiangshan-fpga-noAIA-mem64g-novec.dts.in index 7e2eb26..910c148 100644 --- a/dts/xiangshan-fpga-noAIA-mem64g-novec.dts.in +++ b/dts/xiangshan-fpga-noAIA-mem64g-novec.dts.in @@ -173,8 +173,8 @@ */ bootargs = "console=hvc0 earlycon=sbi loglevel=8"; stdout-path = "serial0:115200n8"; - linux,initrd-start = <0x0 INITRAMFS_BEGIN>; - linux,initrd-end = <0x0 INITRAMFS_END>; + linux,initrd-start = ; + linux,initrd-end = ; opensbi-config { compatible = "opensbi,config"; diff --git a/dts/xiangshan-fpga-noAIA-mem64g.dts.in b/dts/xiangshan-fpga-noAIA-mem64g.dts.in index 350b118..9d866bc 100644 --- a/dts/xiangshan-fpga-noAIA-mem64g.dts.in +++ b/dts/xiangshan-fpga-noAIA-mem64g.dts.in @@ -174,8 +174,8 @@ */ bootargs = "console=hvc0 earlycon=sbi loglevel=8"; stdout-path = "serial0:115200n8"; - linux,initrd-start = <0x0 INITRAMFS_BEGIN>; - linux,initrd-end = <0x0 INITRAMFS_END>; + linux,initrd-start = ; + linux,initrd-end = ; opensbi-config { compatible = "opensbi,config"; diff --git a/dts/xiangshan-fpga-noAIA-mem8g-novec.dts.in b/dts/xiangshan-fpga-noAIA-mem8g-novec.dts.in index dd51c7a..ef92f24 100644 --- a/dts/xiangshan-fpga-noAIA-mem8g-novec.dts.in +++ b/dts/xiangshan-fpga-noAIA-mem8g-novec.dts.in @@ -174,8 +174,8 @@ */ bootargs = "console=hvc0 earlycon=sbi loglevel=8"; stdout-path = "serial0:115200n8"; - linux,initrd-start = <0x0 INITRAMFS_BEGIN>; - linux,initrd-end = <0x0 INITRAMFS_END>; + linux,initrd-start = ; + linux,initrd-end = ; opensbi-config { compatible = "opensbi,config"; diff --git a/dts/xiangshan-fpga-noAIA-mem8g.dts.in b/dts/xiangshan-fpga-noAIA-mem8g.dts.in index b0f7fd1..2a79165 100644 --- a/dts/xiangshan-fpga-noAIA-mem8g.dts.in +++ b/dts/xiangshan-fpga-noAIA-mem8g.dts.in @@ -175,8 +175,8 @@ */ bootargs = "console=hvc0 earlycon=sbi loglevel=8"; stdout-path = "serial0:115200n8"; - linux,initrd-start = <0x0 INITRAMFS_BEGIN>; - linux,initrd-end = <0x0 INITRAMFS_END>; + linux,initrd-start = ; + linux,initrd-end = ; opensbi-config { compatible = "opensbi,config"; diff --git a/dts/xiangshan-fpga-noAIA-novec.dts.in b/dts/xiangshan-fpga-noAIA-novec.dts.in index 8af193d..02e5682 100644 --- a/dts/xiangshan-fpga-noAIA-novec.dts.in +++ b/dts/xiangshan-fpga-noAIA-novec.dts.in @@ -174,8 +174,8 @@ */ bootargs = "console=hvc0 earlycon=sbi loglevel=8"; stdout-path = "serial0:115200n8"; - linux,initrd-start = <0x0 INITRAMFS_BEGIN>; - linux,initrd-end = <0x0 INITRAMFS_END>; + linux,initrd-start = ; + linux,initrd-end = ; opensbi-config { compatible = "opensbi,config"; diff --git a/dts/xiangshan-fpga-noAIA.dts.in b/dts/xiangshan-fpga-noAIA.dts.in index 99d9661..bb26306 100644 --- a/dts/xiangshan-fpga-noAIA.dts.in +++ b/dts/xiangshan-fpga-noAIA.dts.in @@ -175,8 +175,8 @@ */ bootargs = "console=hvc0 earlycon=sbi loglevel=8"; stdout-path = "serial0:115200n8"; - linux,initrd-start = <0x0 INITRAMFS_BEGIN>; - linux,initrd-end = <0x0 INITRAMFS_END>; + linux,initrd-start = ; + linux,initrd-end = ; opensbi-config { compatible = "opensbi,config"; diff --git a/dts/xiangshan.dts.in b/dts/xiangshan.dts.in index 994ee23..cc8b399 100644 --- a/dts/xiangshan.dts.in +++ b/dts/xiangshan.dts.in @@ -35,8 +35,8 @@ }; chosen { bootargs = "console=hvc0 earlycon=sbi"; - linux,initrd-start = <0x0 INITRAMFS_BEGIN>; - linux,initrd-end = <0x0 INITRAMFS_END>; + linux,initrd-start = ; + linux,initrd-end = ; }; L11: memory@80000000 { device_type = "memory"; diff --git a/dts/yanqihu-2core.dts.in b/dts/yanqihu-2core.dts.in index 778ed10..14c55cb 100644 --- a/dts/yanqihu-2core.dts.in +++ b/dts/yanqihu-2core.dts.in @@ -35,8 +35,8 @@ }; chosen { bootargs = "console=hvc0 earlycon=sbi"; - linux,initrd-start = <0x0 INITRAMFS_BEGIN>; - linux,initrd-end = <0x0 INITRAMFS_END>; + linux,initrd-start = ; + linux,initrd-end = ; }; L11: memory@80000000 { device_type = "memory"; diff --git a/dts/yanqihu.dts.in b/dts/yanqihu.dts.in index 2fb3ae2..bb056ce 100644 --- a/dts/yanqihu.dts.in +++ b/dts/yanqihu.dts.in @@ -35,8 +35,8 @@ }; chosen { bootargs = "console=hvc0 earlycon=sbi"; - linux,initrd-start = <0x0 INITRAMFS_BEGIN>; - linux,initrd-end = <0x0 INITRAMFS_END>; + linux,initrd-start = ; + linux,initrd-end = ; }; L11: memory@80000000 { device_type = "memory"; diff --git a/scripts/build-firmware-linux.sh b/scripts/build-firmware-linux.sh index 56b5545..c8c768f 100644 --- a/scripts/build-firmware-linux.sh +++ b/scripts/build-firmware-linux.sh @@ -22,8 +22,14 @@ KERNEL_SIZE=$(stat -c%s "$KERNEL_IMAGE") KERNEL_SIZE_MB=$(( (KERNEL_SIZE + MEGABYTE - 1) / MEGABYTE )) INITRAMFS_OFFSET_MB=$(( KERNEL_OFFSET_MB + KERNEL_SIZE_MB )) INITRAMFS_SIZE=$(stat -c%s "$CPIO_ARCHIVE") -INITRAMFS_BEGIN_HEX=$(printf "0x%x" $(( MEM_BEGIN + INITRAMFS_OFFSET_MB*MEGABYTE ))) -INITRAMFS_END_HEX=$(printf "0x%x" $(( INITRAMFS_BEGIN_HEX + INITRAMFS_SIZE ))) +INITRAMFS_BEGIN_ADDR=$(( MEM_BEGIN + INITRAMFS_OFFSET_MB*MEGABYTE )) +INITRAMFS_END_ADDR=$(( INITRAMFS_BEGIN_ADDR + INITRAMFS_SIZE )) +INITRAMFS_BEGIN_HEX=$(printf "0x%x" "$INITRAMFS_BEGIN_ADDR") +INITRAMFS_END_HEX=$(printf "0x%x" "$INITRAMFS_END_ADDR") +INITRAMFS_BEGIN_HI=$(printf "0x%x" $(( INITRAMFS_BEGIN_ADDR >> 32 ))) +INITRAMFS_BEGIN_LO=$(printf "0x%x" $(( INITRAMFS_BEGIN_ADDR & 0xffffffff ))) +INITRAMFS_END_HI=$(printf "0x%x" $(( INITRAMFS_END_ADDR >> 32 ))) +INITRAMFS_END_LO=$(printf "0x%x" $(( INITRAMFS_END_ADDR & 0xffffffff ))) # Build device tree files DTC="${DTC:-dtc}" @@ -84,7 +90,11 @@ build-dtb() { local dts_file="$dt_dir/$dts_base.dts" local dtb_file="$dt_dir/$dts_base.dtb" mkdir -p "$dt_dir" - sed -e "s/INITRAMFS_BEGIN/$INITRAMFS_BEGIN_HEX/g" \ + sed -e "s/INITRAMFS_BEGIN_HI/$INITRAMFS_BEGIN_HI/g" \ + -e "s/INITRAMFS_BEGIN_LO/$INITRAMFS_BEGIN_LO/g" \ + -e "s/INITRAMFS_END_HI/$INITRAMFS_END_HI/g" \ + -e "s/INITRAMFS_END_LO/$INITRAMFS_END_LO/g" \ + -e "s/INITRAMFS_BEGIN/$INITRAMFS_BEGIN_HEX/g" \ -e "s/INITRAMFS_END/$INITRAMFS_END_HEX/g" \ "$dts_template" > "$dts_file" "$DTC" -I dts -O dtb -o "$dtb_file" "$dts_file"