[Qemu-devel] [PATCH v3 00/28] riscv: sifive_u: Improve the emulation fidelity of sifive_u machine

Bin Meng posted 28 patches 4 years, 8 months ago
Only 26 patches received!
There is a newer version of this series
hw/riscv/Makefile.objs                             |   4 +-
hw/riscv/riscv_hart.c                              |  75 ++++++--
hw/riscv/sifive_e.c                                |  27 ++-
hw/riscv/{sifive_prci.c => sifive_e_prci.c}        |  16 +-
hw/riscv/sifive_u.c                                | 185 ++++++++++++++------
hw/riscv/sifive_u_otp.c                            | 194 +++++++++++++++++++++
hw/riscv/sifive_u_prci.c                           | 163 +++++++++++++++++
hw/riscv/virt.c                                    |  40 ++---
include/hw/riscv/sifive_cpu.h                      |  31 ++++
include/hw/riscv/sifive_e.h                        |   7 +-
.../hw/riscv/{sifive_prci.h => sifive_e_prci.h}    |  16 +-
include/hw/riscv/sifive_u.h                        |  22 +--
include/hw/riscv/sifive_u_otp.h                    |  90 ++++++++++
include/hw/riscv/sifive_u_prci.h                   | 100 +++++++++++
pc-bios/opensbi-riscv64-sifive_u-fw_jump.bin       | Bin 40968 -> 45064 bytes
roms/Makefile                                      |   4 +-
16 files changed, 830 insertions(+), 144 deletions(-)
rename hw/riscv/{sifive_prci.c => sifive_e_prci.c} (88%)
create mode 100644 hw/riscv/sifive_u_otp.c
create mode 100644 hw/riscv/sifive_u_prci.c
create mode 100644 include/hw/riscv/sifive_cpu.h
rename include/hw/riscv/{sifive_prci.h => sifive_e_prci.h} (80%)
create mode 100644 include/hw/riscv/sifive_u_otp.h
create mode 100644 include/hw/riscv/sifive_u_prci.h
[Qemu-devel] [PATCH v3 00/28] riscv: sifive_u: Improve the emulation fidelity of sifive_u machine
Posted by Bin Meng 4 years, 8 months ago
As of today, the QEMU 'sifive_u' machine is a special target that does
not boot the upstream OpenSBI/U-Boot firmware images built for the real
SiFive HiFive Unleashed board. Hence OpenSBI supports a special platform
"qemu/sifive_u". For U-Boot, the sifive_fu540_defconfig is referenced
in the OpenSBI doc as its payload, but that does not boot at all due
to various issues in current QEMU 'sifive_u' machine codes.

This series aims to improve the emulation fidelity of sifive_u machine,
so that the upstream OpenSBI, U-Boot and kernel images built for the
SiFive HiFive Unleashed board can be used out of the box without any
special hack.

The major changes include:
- Heterogeneous harts creation supported, so that we can create a CPU
  that exactly mirrors the real hardware: 1 E51 + 4 U54.
- Implemented a PRCI model for FU540
- Implemented an OTP model for FU540, primarily used for storing serial
  number of the board
- Fixed GEM support that was seriously broken on sifive_u
- Synced device tree with upstream Linux kernel on sifive_u
- Adding initramfs loading support on sifive_u

OpenSBI v0.4 image built for sifive/fu540 is included as the default
bios image for 'sifive_u' machine.

The series is tested against OpenSBI v0.4 image for sifive/fu540
paltform, U-Boot v2019.10-rc1 image for sifive_fu540_defconfig,
and Linux kernel v5.3-rc3 image with the following patch:

macb: Update compatibility string for SiFive FU540-C000
https://patchwork.kernel.org/patch/11050003/

OpenSBI + U-Boot, ping/tftpboot with U-Boot MACB driver works well.
Boot Linux 64-bit defconfig image, verified that system console on
the serial 0 and ping host work pretty well.

An OpenSBI patch was sent to drop the special "qemu/sifive_u" platform
support in OpenSBI. It will be applied after this QEMU series is merged.
http://lists.infradead.org/pipermail/opensbi/2019-August/000335.html

Changes in v3:
- changed to use macros for management and compute cpu count
- use management cpu count + 1 for the min_cpus
- update IRQ numbers of both UARTs to match hardware as well

Changes in v2:
- fixed the "interrupts-extended" property size
- update the file header to indicate at least 2 harts are created
- use create_unimplemented_device() to create the GEM management
  block instead of sifive_mmio_emulate()
- add "phy-handle" property to the ethernet node
- keep the PLIC compatible string unchanged as OpenSBI uses that
  for DT fix up
- drop patch "riscv: sifive: Move sifive_mmio_emulate() to a common place"
- new patch "riscv: sifive_e: Drop sifive_mmio_emulate()"

Bin Meng (28):
  riscv: hw: Remove superfluous "linux,phandle" property
  riscv: hw: Use qemu_fdt_setprop_cell() for property with only 1 cell
  riscv: Add a sifive_cpu.h to include both E and U cpu type defines
  riscv: hart: Extract hart realize to a separate routine
  riscv: hart: Support heterogeneous harts population
  riscv: sifive_u: Update hart configuration to reflect the real FU540
    SoC
  riscv: sifive_u: Set the minimum number of cpus to 2
  riscv: sifive_u: Update PLIC hart topology configuration string
  riscv: sifive_u: Update UART base addresses and IRQs
  riscv: sifive_u: Remove the unnecessary include of prci header
  riscv: sifive: Rename sifive_prci.{c,h} to sifive_e_prci.{c,h}
  riscv: sifive_e: prci: Fix a typo of hfxosccfg register programming
  riscv: sifive_e: prci: Update the PRCI register block size
  riscv: sifive: Implement PRCI model for FU540
  riscv: sifive_u: Generate hfclk and rtcclk nodes
  riscv: sifive_u: Add PRCI block to the SoC
  riscv: sifive_u: Change UART node name in device tree
  riscv: hw: Implement a model for SiFive FU540 OTP
  riscv: sifive_u: Instantiate OTP memory with a serial number
  riscv: roms: Update default bios for sifive_u machine
  riscv: sifive_u: Update UART and ethernet node clock properties
  riscv: sifive_u: Generate an aliases node in the device tree
  riscv: sifive_u: Fix broken GEM support
  riscv: sifive_u: Support loading initramfs
  riscv: hw: Remove not needed PLIC properties in device tree
  riscv: sifive_e: Drop sifive_mmio_emulate()
  riscv: virt: Change create_fdt() to return void
  riscv: sifive_u: Update model and compatible strings in device tree

 hw/riscv/Makefile.objs                             |   4 +-
 hw/riscv/riscv_hart.c                              |  75 ++++++--
 hw/riscv/sifive_e.c                                |  27 ++-
 hw/riscv/{sifive_prci.c => sifive_e_prci.c}        |  16 +-
 hw/riscv/sifive_u.c                                | 185 ++++++++++++++------
 hw/riscv/sifive_u_otp.c                            | 194 +++++++++++++++++++++
 hw/riscv/sifive_u_prci.c                           | 163 +++++++++++++++++
 hw/riscv/virt.c                                    |  40 ++---
 include/hw/riscv/sifive_cpu.h                      |  31 ++++
 include/hw/riscv/sifive_e.h                        |   7 +-
 .../hw/riscv/{sifive_prci.h => sifive_e_prci.h}    |  16 +-
 include/hw/riscv/sifive_u.h                        |  22 +--
 include/hw/riscv/sifive_u_otp.h                    |  90 ++++++++++
 include/hw/riscv/sifive_u_prci.h                   | 100 +++++++++++
 pc-bios/opensbi-riscv64-sifive_u-fw_jump.bin       | Bin 40968 -> 45064 bytes
 roms/Makefile                                      |   4 +-
 16 files changed, 830 insertions(+), 144 deletions(-)
 rename hw/riscv/{sifive_prci.c => sifive_e_prci.c} (88%)
 create mode 100644 hw/riscv/sifive_u_otp.c
 create mode 100644 hw/riscv/sifive_u_prci.c
 create mode 100644 include/hw/riscv/sifive_cpu.h
 rename include/hw/riscv/{sifive_prci.h => sifive_e_prci.h} (80%)
 create mode 100644 include/hw/riscv/sifive_u_otp.h
 create mode 100644 include/hw/riscv/sifive_u_prci.h

-- 
2.7.4


Re: [Qemu-devel] [PATCH v3 00/28] riscv: sifive_u: Improve the emulation fidelity of sifive_u machine
Posted by Bin Meng 4 years, 8 months ago
On Sun, Aug 11, 2019 at 4:07 PM Bin Meng <bmeng.cn@gmail.com> wrote:
>
> As of today, the QEMU 'sifive_u' machine is a special target that does
> not boot the upstream OpenSBI/U-Boot firmware images built for the real
> SiFive HiFive Unleashed board. Hence OpenSBI supports a special platform
> "qemu/sifive_u". For U-Boot, the sifive_fu540_defconfig is referenced
> in the OpenSBI doc as its payload, but that does not boot at all due
> to various issues in current QEMU 'sifive_u' machine codes.
>
> This series aims to improve the emulation fidelity of sifive_u machine,
> so that the upstream OpenSBI, U-Boot and kernel images built for the
> SiFive HiFive Unleashed board can be used out of the box without any
> special hack.
>
> The major changes include:
> - Heterogeneous harts creation supported, so that we can create a CPU
>   that exactly mirrors the real hardware: 1 E51 + 4 U54.
> - Implemented a PRCI model for FU540
> - Implemented an OTP model for FU540, primarily used for storing serial
>   number of the board
> - Fixed GEM support that was seriously broken on sifive_u
> - Synced device tree with upstream Linux kernel on sifive_u
> - Adding initramfs loading support on sifive_u
>
> OpenSBI v0.4 image built for sifive/fu540 is included as the default
> bios image for 'sifive_u' machine.
>
> The series is tested against OpenSBI v0.4 image for sifive/fu540
> paltform, U-Boot v2019.10-rc1 image for sifive_fu540_defconfig,
> and Linux kernel v5.3-rc3 image with the following patch:
>
> macb: Update compatibility string for SiFive FU540-C000
> https://patchwork.kernel.org/patch/11050003/
>
> OpenSBI + U-Boot, ping/tftpboot with U-Boot MACB driver works well.
> Boot Linux 64-bit defconfig image, verified that system console on
> the serial 0 and ping host work pretty well.
>
> An OpenSBI patch was sent to drop the special "qemu/sifive_u" platform
> support in OpenSBI. It will be applied after this QEMU series is merged.
> http://lists.infradead.org/pipermail/opensbi/2019-August/000335.html
>
> Changes in v3:
> - changed to use macros for management and compute cpu count
> - use management cpu count + 1 for the min_cpus
> - update IRQ numbers of both UARTs to match hardware as well
>
> Changes in v2:
> - fixed the "interrupts-extended" property size
> - update the file header to indicate at least 2 harts are created
> - use create_unimplemented_device() to create the GEM management
>   block instead of sifive_mmio_emulate()
> - add "phy-handle" property to the ethernet node
> - keep the PLIC compatible string unchanged as OpenSBI uses that
>   for DT fix up
> - drop patch "riscv: sifive: Move sifive_mmio_emulate() to a common place"
> - new patch "riscv: sifive_e: Drop sifive_mmio_emulate()"
>
> Bin Meng (28):
>   riscv: hw: Remove superfluous "linux,phandle" property
>   riscv: hw: Use qemu_fdt_setprop_cell() for property with only 1 cell
>   riscv: Add a sifive_cpu.h to include both E and U cpu type defines
>   riscv: hart: Extract hart realize to a separate routine
>   riscv: hart: Support heterogeneous harts population
>   riscv: sifive_u: Update hart configuration to reflect the real FU540
>     SoC
>   riscv: sifive_u: Set the minimum number of cpus to 2
>   riscv: sifive_u: Update PLIC hart topology configuration string
>   riscv: sifive_u: Update UART base addresses and IRQs
>   riscv: sifive_u: Remove the unnecessary include of prci header
>   riscv: sifive: Rename sifive_prci.{c,h} to sifive_e_prci.{c,h}
>   riscv: sifive_e: prci: Fix a typo of hfxosccfg register programming
>   riscv: sifive_e: prci: Update the PRCI register block size
>   riscv: sifive: Implement PRCI model for FU540
>   riscv: sifive_u: Generate hfclk and rtcclk nodes
>   riscv: sifive_u: Add PRCI block to the SoC
>   riscv: sifive_u: Change UART node name in device tree
>   riscv: hw: Implement a model for SiFive FU540 OTP
>   riscv: sifive_u: Instantiate OTP memory with a serial number
>   riscv: roms: Update default bios for sifive_u machine
>   riscv: sifive_u: Update UART and ethernet node clock properties
>   riscv: sifive_u: Generate an aliases node in the device tree
>   riscv: sifive_u: Fix broken GEM support
>   riscv: sifive_u: Support loading initramfs
>   riscv: hw: Remove not needed PLIC properties in device tree
>   riscv: sifive_e: Drop sifive_mmio_emulate()
>   riscv: virt: Change create_fdt() to return void
>   riscv: sifive_u: Update model and compatible strings in device tree
>

I have no idea on why patch [20/28] and [26/28] failed to arrive on
the mailing list. The "git send-email" logs said OK when these two
patches were sent. In v2, these 2 patches are missing on patchwork,
and unfortunately this is the same situation for v3.

Attached these 2 patches.

Regards,
Bin
From e8bb57b3423b096f1efc851e0361232fde205f09 Mon Sep 17 00:00:00 2001
From: Bin Meng <bmeng.cn@gmail.com>
Date: Sat, 3 Aug 2019 13:48:24 +0800
Subject: [PATCH v3 20/28] riscv: roms: Update default bios for sifive_u
 machine

With the support of heterogeneous harts and PRCI model, it's now
possible to use the opensbi image built for the real hardware.

Signed-off-by: Bin Meng <bmeng.cn@gmail.com>

---
This patch should be applied after http://patchwork.ozlabs.org/patch/1141443/

Changes in v3: None
Changes in v2: None

 pc-bios/opensbi-riscv64-sifive_u-fw_jump.bin | Bin 40968 -> 45064 bytes
 roms/Makefile                                |   4 ++--
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/pc-bios/opensbi-riscv64-sifive_u-fw_jump.bin b/pc-bios/opensbi-riscv64-sifive_u-fw_jump.bin
index 5d7a1ef6818994bac4a36818ad36043b592ce309..f29b3bed6fa8b57a735436d9c684740aa0a6bb16 100755
GIT binary patch
delta 10830
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

delta 5317
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

diff --git a/roms/Makefile b/roms/Makefile
index 775c963..6cf07d3 100644
--- a/roms/Makefile
+++ b/roms/Makefile
@@ -182,8 +182,8 @@ opensbi64-virt:
 opensbi64-sifive_u:
 	$(MAKE) -C opensbi \
 		CROSS_COMPILE=$(riscv64_cross_prefix) \
-		PLATFORM="qemu/sifive_u"
-	cp opensbi/build/platform/qemu/sifive_u/firmware/fw_jump.bin ../pc-bios/opensbi-riscv64-sifive_u-fw_jump.bin
+		PLATFORM="sifive/fu540"
+	cp opensbi/build/platform/sifive/fu540/firmware/fw_jump.bin ../pc-bios/opensbi-riscv64-sifive_u-fw_jump.bin
 
 clean:
 	rm -rf seabios/.config seabios/out seabios/builds
-- 
2.7.4

From b611512239ea23629d89bbcdf12fe8ee6a0459c1 Mon Sep 17 00:00:00 2001
From: Bin Meng <bmeng.cn@gmail.com>
Date: Wed, 7 Aug 2019 14:56:09 +0800
Subject: [PATCH v3 26/28] riscv: sifive_e: Drop sifive_mmio_emulate()

Use create_unimplemented_device() instead.

Signed-off-by: Bin Meng <bmeng.cn@gmail.com>

---

Changes in v3: None
Changes in v2:
- drop patch "riscv: sifive: Move sifive_mmio_emulate() to a common place"
- new patch "riscv: sifive_e: Drop sifive_mmio_emulate()"

 hw/riscv/sifive_e.c | 23 ++++++++---------------
 1 file changed, 8 insertions(+), 15 deletions(-)

diff --git a/hw/riscv/sifive_e.c b/hw/riscv/sifive_e.c
index 2d67670..040d59f 100644
--- a/hw/riscv/sifive_e.c
+++ b/hw/riscv/sifive_e.c
@@ -37,6 +37,7 @@
 #include "hw/loader.h"
 #include "hw/sysbus.h"
 #include "hw/char/serial.h"
+#include "hw/misc/unimp.h"
 #include "target/riscv/cpu.h"
 #include "hw/riscv/riscv_hart.h"
 #include "hw/riscv/sifive_plic.h"
@@ -74,14 +75,6 @@ static const struct MemmapEntry {
     [SIFIVE_E_DTIM] =     { 0x80000000,     0x4000 }
 };
 
-static void sifive_mmio_emulate(MemoryRegion *parent, const char *name,
-                             uintptr_t offset, uintptr_t length)
-{
-    MemoryRegion *mock_mmio = g_new(MemoryRegion, 1);
-    memory_region_init_ram(mock_mmio, NULL, name, length, &error_fatal);
-    memory_region_add_subregion(parent, offset, mock_mmio);
-}
-
 static void riscv_sifive_e_init(MachineState *machine)
 {
     const struct MemmapEntry *memmap = sifive_e_memmap;
@@ -172,7 +165,7 @@ static void riscv_sifive_e_soc_realize(DeviceState *dev, Error **errp)
     sifive_clint_create(memmap[SIFIVE_E_CLINT].base,
         memmap[SIFIVE_E_CLINT].size, ms->smp.cpus,
         SIFIVE_SIP_BASE, SIFIVE_TIMECMP_BASE, SIFIVE_TIME_BASE);
-    sifive_mmio_emulate(sys_mem, "riscv.sifive.e.aon",
+    create_unimplemented_device("riscv.sifive.e.aon",
         memmap[SIFIVE_E_AON].base, memmap[SIFIVE_E_AON].size);
     sifive_e_prci_create(memmap[SIFIVE_E_PRCI].base);
 
@@ -199,19 +192,19 @@ static void riscv_sifive_e_soc_realize(DeviceState *dev, Error **errp)
 
     sifive_uart_create(sys_mem, memmap[SIFIVE_E_UART0].base,
         serial_hd(0), qdev_get_gpio_in(DEVICE(s->plic), SIFIVE_E_UART0_IRQ));
-    sifive_mmio_emulate(sys_mem, "riscv.sifive.e.qspi0",
+    create_unimplemented_device("riscv.sifive.e.qspi0",
         memmap[SIFIVE_E_QSPI0].base, memmap[SIFIVE_E_QSPI0].size);
-    sifive_mmio_emulate(sys_mem, "riscv.sifive.e.pwm0",
+    create_unimplemented_device("riscv.sifive.e.pwm0",
         memmap[SIFIVE_E_PWM0].base, memmap[SIFIVE_E_PWM0].size);
     sifive_uart_create(sys_mem, memmap[SIFIVE_E_UART1].base,
         serial_hd(1), qdev_get_gpio_in(DEVICE(s->plic), SIFIVE_E_UART1_IRQ));
-    sifive_mmio_emulate(sys_mem, "riscv.sifive.e.qspi1",
+    create_unimplemented_device("riscv.sifive.e.qspi1",
         memmap[SIFIVE_E_QSPI1].base, memmap[SIFIVE_E_QSPI1].size);
-    sifive_mmio_emulate(sys_mem, "riscv.sifive.e.pwm1",
+    create_unimplemented_device("riscv.sifive.e.pwm1",
         memmap[SIFIVE_E_PWM1].base, memmap[SIFIVE_E_PWM1].size);
-    sifive_mmio_emulate(sys_mem, "riscv.sifive.e.qspi2",
+    create_unimplemented_device("riscv.sifive.e.qspi2",
         memmap[SIFIVE_E_QSPI2].base, memmap[SIFIVE_E_QSPI2].size);
-    sifive_mmio_emulate(sys_mem, "riscv.sifive.e.pwm2",
+    create_unimplemented_device("riscv.sifive.e.pwm2",
         memmap[SIFIVE_E_PWM2].base, memmap[SIFIVE_E_PWM2].size);
 
     /* Flash memory */
-- 
2.7.4