* [PATCH v3 0/6] Improve Microchip Polarfire SoC customization
@ 2025-03-19 6:13 Sebastian Huber
2025-03-19 6:13 ` [PATCH v3 1/6] hw/misc: Add MPFS system reset support Sebastian Huber
` (6 more replies)
0 siblings, 7 replies; 16+ messages in thread
From: Sebastian Huber @ 2025-03-19 6:13 UTC (permalink / raw)
To: qemu-devel; +Cc: qemu-riscv, Alistair Francis, Daniel Henrique Barboza
Booting the microchip-icicle-kit machine using the latest PolarFire SoC
Hart Software Services (HSS) no longer works since Qemu lacks support
for several registers (clocks, DRAM controller). Also reading from the
SDCard does not work currently.
In order to allow tests runs for real-time kernels such as RTEMS and
Zephyr, improve the boot customization. This patch set enables a direct
run of kernel executables, for example:
qemu-system-riscv64 -no-reboot -nographic \
-serial null -serial mon:stdio \
-smp 2 \
-bios none \
-machine microchip-icicle-kit,clint-timebase-frequency=10000000 \
-kernel rtos.elf
v2:
* Add documentation update.
* In patch 3, warn if no device tree is specified.
* In patch 4, use riscv_find_firmware() to locate the firmware shipped with Qemu.
v3:
* In patch 4, add support for Qemu test runs.
Sebastian Huber (6):
hw/misc: Add MPFS system reset support
hw/riscv: More flexible FDT placement for MPFS
hw/riscv: Make FDT optional for MPFS
hw/riscv: Allow direct start of kernel for MPFS
hw/riscv: Configurable MPFS CLINT timebase freq
hw/riscv: microchip_pfsoc: Rework documentation
docs/system/riscv/microchip-icicle-kit.rst | 124 ++++++-----------
hw/misc/mchp_pfsoc_sysreg.c | 7 +
hw/riscv/microchip_pfsoc.c | 153 +++++++++++++++------
include/hw/riscv/microchip_pfsoc.h | 1 +
4 files changed, 164 insertions(+), 121 deletions(-)
--
2.43.0
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH v3 1/6] hw/misc: Add MPFS system reset support
2025-03-19 6:13 [PATCH v3 0/6] Improve Microchip Polarfire SoC customization Sebastian Huber
@ 2025-03-19 6:13 ` Sebastian Huber
2025-04-04 1:48 ` Alistair Francis
2025-03-19 6:13 ` [PATCH v3 2/6] hw/riscv: More flexible FDT placement for MPFS Sebastian Huber
` (5 subsequent siblings)
6 siblings, 1 reply; 16+ messages in thread
From: Sebastian Huber @ 2025-03-19 6:13 UTC (permalink / raw)
To: qemu-devel; +Cc: qemu-riscv, Alistair Francis, Daniel Henrique Barboza
Signed-off-by: Sebastian Huber <sebastian.huber@embedded-brains.de>
---
hw/misc/mchp_pfsoc_sysreg.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/hw/misc/mchp_pfsoc_sysreg.c b/hw/misc/mchp_pfsoc_sysreg.c
index 7876fe0c5b..08196525aa 100644
--- a/hw/misc/mchp_pfsoc_sysreg.c
+++ b/hw/misc/mchp_pfsoc_sysreg.c
@@ -27,7 +27,9 @@
#include "hw/irq.h"
#include "hw/sysbus.h"
#include "hw/misc/mchp_pfsoc_sysreg.h"
+#include "system/runstate.h"
+#define MSS_RESET_CR 0x18
#define ENVM_CR 0xb8
#define MESSAGE_INT 0x118c
@@ -56,6 +58,11 @@ static void mchp_pfsoc_sysreg_write(void *opaque, hwaddr offset,
{
MchpPfSoCSysregState *s = opaque;
switch (offset) {
+ case MSS_RESET_CR:
+ if (value == 0xdead) {
+ qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET);
+ }
+ break;
case MESSAGE_INT:
qemu_irq_lower(s->irq);
break;
--
2.43.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v3 2/6] hw/riscv: More flexible FDT placement for MPFS
2025-03-19 6:13 [PATCH v3 0/6] Improve Microchip Polarfire SoC customization Sebastian Huber
2025-03-19 6:13 ` [PATCH v3 1/6] hw/misc: Add MPFS system reset support Sebastian Huber
@ 2025-03-19 6:13 ` Sebastian Huber
2025-03-19 6:13 ` [PATCH v3 3/6] hw/riscv: Make FDT optional " Sebastian Huber
` (4 subsequent siblings)
6 siblings, 0 replies; 16+ messages in thread
From: Sebastian Huber @ 2025-03-19 6:13 UTC (permalink / raw)
To: qemu-devel; +Cc: qemu-riscv, Alistair Francis, Daniel Henrique Barboza
If the kernel entry is in the high DRAM area, place the FDT into this
area.
Signed-off-by: Sebastian Huber <sebastian.huber@embedded-brains.de>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
---
hw/riscv/microchip_pfsoc.c | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/hw/riscv/microchip_pfsoc.c b/hw/riscv/microchip_pfsoc.c
index 9c846f9b5b..f477d2791e 100644
--- a/hw/riscv/microchip_pfsoc.c
+++ b/hw/riscv/microchip_pfsoc.c
@@ -626,8 +626,15 @@ static void microchip_icicle_kit_machine_init(MachineState *machine)
kernel_entry = boot_info.image_low_addr;
/* Compute the fdt load address in dram */
- fdt_load_addr = riscv_compute_fdt_addr(memmap[MICROCHIP_PFSOC_DRAM_LO].base,
- memmap[MICROCHIP_PFSOC_DRAM_LO].size,
+ hwaddr kernel_ram_base = memmap[MICROCHIP_PFSOC_DRAM_LO].base;
+ hwaddr kernel_ram_size = memmap[MICROCHIP_PFSOC_DRAM_LO].size;
+
+ if (kernel_entry - kernel_ram_base >= kernel_ram_size) {
+ kernel_ram_base = memmap[MICROCHIP_PFSOC_DRAM_HI].base;
+ kernel_ram_size = mem_high_size;
+ }
+
+ fdt_load_addr = riscv_compute_fdt_addr(kernel_ram_base, kernel_ram_size,
machine, &boot_info);
riscv_load_fdt(fdt_load_addr, machine->fdt);
--
2.43.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v3 3/6] hw/riscv: Make FDT optional for MPFS
2025-03-19 6:13 [PATCH v3 0/6] Improve Microchip Polarfire SoC customization Sebastian Huber
2025-03-19 6:13 ` [PATCH v3 1/6] hw/misc: Add MPFS system reset support Sebastian Huber
2025-03-19 6:13 ` [PATCH v3 2/6] hw/riscv: More flexible FDT placement for MPFS Sebastian Huber
@ 2025-03-19 6:13 ` Sebastian Huber
2025-04-04 1:51 ` Alistair Francis
2025-10-04 21:17 ` Guenter Roeck
2025-03-19 6:13 ` [PATCH v3 4/6] hw/riscv: Allow direct start of kernel " Sebastian Huber
` (3 subsequent siblings)
6 siblings, 2 replies; 16+ messages in thread
From: Sebastian Huber @ 2025-03-19 6:13 UTC (permalink / raw)
To: qemu-devel; +Cc: qemu-riscv, Alistair Francis, Daniel Henrique Barboza
Real-time kernels such as RTEMS or Zephyr may use a static device tree
built into the kernel image. Do not require to use the -dtb option if
-kernel is used for the microchip-icicle-kit machine. Issue a warning
if no device tree is provided by the user since the machine does not
generate one.
Signed-off-by: Sebastian Huber <sebastian.huber@embedded-brains.de>
---
hw/riscv/microchip_pfsoc.c | 56 +++++++++++++++++++-------------------
1 file changed, 28 insertions(+), 28 deletions(-)
diff --git a/hw/riscv/microchip_pfsoc.c b/hw/riscv/microchip_pfsoc.c
index f477d2791e..844dc0545c 100644
--- a/hw/riscv/microchip_pfsoc.c
+++ b/hw/riscv/microchip_pfsoc.c
@@ -516,7 +516,6 @@ static void microchip_icicle_kit_machine_init(MachineState *machine)
uint64_t mem_low_size, mem_high_size;
hwaddr firmware_load_addr;
const char *firmware_name;
- bool kernel_as_payload = false;
target_ulong firmware_end_addr, kernel_start_addr;
uint64_t kernel_entry;
uint64_t fdt_load_addr;
@@ -589,25 +588,12 @@ static void microchip_icicle_kit_machine_init(MachineState *machine)
*
* This ensures backwards compatibility with how we used to expose -bios
* to users but allows them to run through direct kernel booting as well.
- *
- * When -kernel is used for direct boot, -dtb must be present to provide
- * a valid device tree for the board, as we don't generate device tree.
*/
- if (machine->kernel_filename && machine->dtb) {
- int fdt_size;
- machine->fdt = load_device_tree(machine->dtb, &fdt_size);
- if (!machine->fdt) {
- error_report("load_device_tree() failed");
- exit(1);
- }
-
+ if (machine->kernel_filename) {
firmware_name = RISCV64_BIOS_BIN;
firmware_load_addr = memmap[MICROCHIP_PFSOC_DRAM_LO].base;
- kernel_as_payload = true;
- }
-
- if (!kernel_as_payload) {
+ } else {
firmware_name = BIOS_FILENAME;
firmware_load_addr = RESET_VECTOR;
}
@@ -617,7 +603,7 @@ static void microchip_icicle_kit_machine_init(MachineState *machine)
&firmware_load_addr, NULL);
riscv_boot_info_init(&boot_info, &s->soc.u_cpus);
- if (kernel_as_payload) {
+ if (machine->kernel_filename) {
kernel_start_addr = riscv_calc_kernel_start_addr(&boot_info,
firmware_end_addr);
@@ -625,19 +611,33 @@ static void microchip_icicle_kit_machine_init(MachineState *machine)
true, NULL);
kernel_entry = boot_info.image_low_addr;
- /* Compute the fdt load address in dram */
- hwaddr kernel_ram_base = memmap[MICROCHIP_PFSOC_DRAM_LO].base;
- hwaddr kernel_ram_size = memmap[MICROCHIP_PFSOC_DRAM_LO].size;
-
- if (kernel_entry - kernel_ram_base >= kernel_ram_size) {
- kernel_ram_base = memmap[MICROCHIP_PFSOC_DRAM_HI].base;
- kernel_ram_size = mem_high_size;
+ if (machine->dtb) {
+ int fdt_size;
+ machine->fdt = load_device_tree(machine->dtb, &fdt_size);
+ if (!machine->fdt) {
+ error_report("load_device_tree() failed");
+ exit(1);
+ }
+
+ /* Compute the FDT load address in DRAM */
+ hwaddr kernel_ram_base = memmap[MICROCHIP_PFSOC_DRAM_LO].base;
+ hwaddr kernel_ram_size = memmap[MICROCHIP_PFSOC_DRAM_LO].size;
+
+ if (kernel_entry - kernel_ram_base >= kernel_ram_size) {
+ kernel_ram_base = memmap[MICROCHIP_PFSOC_DRAM_HI].base;
+ kernel_ram_size = mem_high_size;
+ }
+
+ fdt_load_addr = riscv_compute_fdt_addr(kernel_ram_base, kernel_ram_size,
+ machine, &boot_info);
+ riscv_load_fdt(fdt_load_addr, machine->fdt);
+ } else {
+ warn_report_once("The QEMU microchip-icicle-kit machine does not "
+ "generate a device tree, so no device tree is "
+ "being provided to the guest.");
+ fdt_load_addr = 0;
}
- fdt_load_addr = riscv_compute_fdt_addr(kernel_ram_base, kernel_ram_size,
- machine, &boot_info);
- riscv_load_fdt(fdt_load_addr, machine->fdt);
-
/* Load the reset vector */
riscv_setup_rom_reset_vec(machine, &s->soc.u_cpus, firmware_load_addr,
memmap[MICROCHIP_PFSOC_ENVM_DATA].base,
--
2.43.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v3 4/6] hw/riscv: Allow direct start of kernel for MPFS
2025-03-19 6:13 [PATCH v3 0/6] Improve Microchip Polarfire SoC customization Sebastian Huber
` (2 preceding siblings ...)
2025-03-19 6:13 ` [PATCH v3 3/6] hw/riscv: Make FDT optional " Sebastian Huber
@ 2025-03-19 6:13 ` Sebastian Huber
2025-04-04 2:00 ` Alistair Francis
2025-03-19 6:13 ` [PATCH v3 5/6] hw/riscv: Configurable MPFS CLINT timebase freq Sebastian Huber
` (2 subsequent siblings)
6 siblings, 1 reply; 16+ messages in thread
From: Sebastian Huber @ 2025-03-19 6:13 UTC (permalink / raw)
To: qemu-devel; +Cc: qemu-riscv, Alistair Francis, Daniel Henrique Barboza
Further customize the -bios and -kernel options behaviour for the
microchip-icicle-kit machine. If "-bios none -kernel filename" is
specified, then do not load a firmware and instead only load and start
the kernel image.
For test runs, use an approach similar to
riscv_find_and_load_firmware().
Signed-off-by: Sebastian Huber <sebastian.huber@embedded-brains.de>
---
hw/riscv/microchip_pfsoc.c | 59 +++++++++++++++++++++++++++-----------
1 file changed, 42 insertions(+), 17 deletions(-)
diff --git a/hw/riscv/microchip_pfsoc.c b/hw/riscv/microchip_pfsoc.c
index 844dc0545c..5c9f7f643f 100644
--- a/hw/riscv/microchip_pfsoc.c
+++ b/hw/riscv/microchip_pfsoc.c
@@ -578,29 +578,47 @@ static void microchip_icicle_kit_machine_init(MachineState *machine)
}
/*
- * We follow the following table to select which payload we execute.
+ * We follow the following table to select which firmware we use.
*
- * -bios | -kernel | payload
- * -------+------------+--------
- * N | N | HSS
- * Y | don't care | HSS
- * N | Y | kernel
- *
- * This ensures backwards compatibility with how we used to expose -bios
- * to users but allows them to run through direct kernel booting as well.
+ * -bios | -kernel | firmware
+ * --------------+------------+--------
+ * none | N | error
+ * none | Y | kernel
+ * NULL, default | N | BIOS_FILENAME
+ * NULL, default | Y | RISCV64_BIOS_BIN
+ * other | don't care | other
*/
+ if (machine->firmware && !strcmp(machine->firmware, "none")) {
+ if (!machine->kernel_filename) {
+ error_report("for -bios none, a kernel is required");
+ exit(1);
+ }
- if (machine->kernel_filename) {
- firmware_name = RISCV64_BIOS_BIN;
- firmware_load_addr = memmap[MICROCHIP_PFSOC_DRAM_LO].base;
+ firmware_name = NULL;
+ firmware_load_addr = RESET_VECTOR;
+ } else if (!machine->firmware || !strcmp(machine->firmware, "default")) {
+ if (machine->kernel_filename) {
+ firmware_name = RISCV64_BIOS_BIN;
+ firmware_load_addr = memmap[MICROCHIP_PFSOC_DRAM_LO].base;
+ } else {
+ firmware_name = BIOS_FILENAME;
+ firmware_load_addr = RESET_VECTOR;
+ }
} else {
- firmware_name = BIOS_FILENAME;
+ firmware_name = machine->firmware;
firmware_load_addr = RESET_VECTOR;
}
- /* Load the firmware */
- firmware_end_addr = riscv_find_and_load_firmware(machine, firmware_name,
- &firmware_load_addr, NULL);
+ /* Load the firmware if necessary */
+ firmware_end_addr = firmware_load_addr;
+ if (firmware_name) {
+ char *filename = riscv_find_firmware(firmware_name, NULL);
+ if (filename) {
+ firmware_end_addr = riscv_load_firmware(filename,
+ &firmware_load_addr, NULL);
+ g_free(filename);
+ }
+ }
riscv_boot_info_init(&boot_info, &s->soc.u_cpus);
if (machine->kernel_filename) {
@@ -638,8 +656,15 @@ static void microchip_icicle_kit_machine_init(MachineState *machine)
fdt_load_addr = 0;
}
+ hwaddr start_addr;
+ if (firmware_name) {
+ start_addr = firmware_load_addr;
+ } else {
+ start_addr = kernel_entry;
+ }
+
/* Load the reset vector */
- riscv_setup_rom_reset_vec(machine, &s->soc.u_cpus, firmware_load_addr,
+ riscv_setup_rom_reset_vec(machine, &s->soc.u_cpus, start_addr,
memmap[MICROCHIP_PFSOC_ENVM_DATA].base,
memmap[MICROCHIP_PFSOC_ENVM_DATA].size,
kernel_entry, fdt_load_addr);
--
2.43.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v3 5/6] hw/riscv: Configurable MPFS CLINT timebase freq
2025-03-19 6:13 [PATCH v3 0/6] Improve Microchip Polarfire SoC customization Sebastian Huber
` (3 preceding siblings ...)
2025-03-19 6:13 ` [PATCH v3 4/6] hw/riscv: Allow direct start of kernel " Sebastian Huber
@ 2025-03-19 6:13 ` Sebastian Huber
2025-04-04 2:11 ` Alistair Francis
2025-03-19 6:13 ` [PATCH v3 6/6] hw/riscv: microchip_pfsoc: Rework documentation Sebastian Huber
2025-04-04 2:33 ` [PATCH v3 0/6] Improve Microchip Polarfire SoC customization Alistair Francis
6 siblings, 1 reply; 16+ messages in thread
From: Sebastian Huber @ 2025-03-19 6:13 UTC (permalink / raw)
To: qemu-devel; +Cc: qemu-riscv, Alistair Francis, Daniel Henrique Barboza
This property enables the setting of the CLINT timebase frequency
through the command line, for example:
-machine microchip-icicle-kit,clint-timebase-frequency=10000000
Signed-off-by: Sebastian Huber <sebastian.huber@embedded-brains.de>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
hw/riscv/microchip_pfsoc.c | 49 +++++++++++++++++++++++++++---
include/hw/riscv/microchip_pfsoc.h | 1 +
2 files changed, 46 insertions(+), 4 deletions(-)
diff --git a/hw/riscv/microchip_pfsoc.c b/hw/riscv/microchip_pfsoc.c
index 5c9f7f643f..616bb63982 100644
--- a/hw/riscv/microchip_pfsoc.c
+++ b/hw/riscv/microchip_pfsoc.c
@@ -39,6 +39,7 @@
#include "qemu/units.h"
#include "qemu/cutils.h"
#include "qapi/error.h"
+#include "qapi/visitor.h"
#include "hw/boards.h"
#include "hw/loader.h"
#include "hw/sysbus.h"
@@ -61,9 +62,6 @@
#define BIOS_FILENAME "hss.bin"
#define RESET_VECTOR 0x20220000
-/* CLINT timebase frequency */
-#define CLINT_TIMEBASE_FREQ 1000000
-
/* GEM version */
#define GEM_REVISION 0x0107010c
@@ -193,6 +191,7 @@ static void microchip_pfsoc_soc_instance_init(Object *obj)
static void microchip_pfsoc_soc_realize(DeviceState *dev, Error **errp)
{
MachineState *ms = MACHINE(qdev_get_machine());
+ MicrochipIcicleKitState *iks = MICROCHIP_ICICLE_KIT_MACHINE(ms);
MicrochipPFSoCState *s = MICROCHIP_PFSOC(dev);
const MemMapEntry *memmap = microchip_pfsoc_memmap;
MemoryRegion *system_memory = get_system_memory();
@@ -253,7 +252,7 @@ static void microchip_pfsoc_soc_realize(DeviceState *dev, Error **errp)
memmap[MICROCHIP_PFSOC_CLINT].base + RISCV_ACLINT_SWI_SIZE,
RISCV_ACLINT_DEFAULT_MTIMER_SIZE, 0, ms->smp.cpus,
RISCV_ACLINT_DEFAULT_MTIMECMP, RISCV_ACLINT_DEFAULT_MTIME,
- CLINT_TIMEBASE_FREQ, false);
+ iks->clint_timebase_freq, false);
/* L2 cache controller */
create_unimplemented_device("microchip.pfsoc.l2cc",
@@ -671,6 +670,40 @@ static void microchip_icicle_kit_machine_init(MachineState *machine)
}
}
+static void microchip_icicle_kit_set_clint_timebase_freq(Object *obj,
+ Visitor *v,
+ const char *name,
+ void *opaque,
+ Error **errp)
+{
+ MicrochipIcicleKitState *s = MICROCHIP_ICICLE_KIT_MACHINE(obj);
+ uint32_t value;
+
+ if (!visit_type_uint32(v, name, &value, errp)) {
+ return;
+ }
+
+ s->clint_timebase_freq = value;
+}
+
+static void microchip_icicle_kit_get_clint_timebase_freq(Object *obj,
+ Visitor *v,
+ const char *name,
+ void *opaque,
+ Error **errp)
+{
+ MicrochipIcicleKitState *s = MICROCHIP_ICICLE_KIT_MACHINE(obj);
+ uint32_t value = s->clint_timebase_freq;
+
+ visit_type_uint32(v, name, &value, errp);
+}
+
+static void microchip_icicle_kit_machine_instance_init(Object *obj)
+{
+ MicrochipIcicleKitState *m = MICROCHIP_ICICLE_KIT_MACHINE(obj);
+ m->clint_timebase_freq = 1000000;
+}
+
static void microchip_icicle_kit_machine_class_init(ObjectClass *oc, void *data)
{
MachineClass *mc = MACHINE_CLASS(oc);
@@ -692,12 +725,20 @@ static void microchip_icicle_kit_machine_class_init(ObjectClass *oc, void *data)
* See memory_tests() in mss_ddr.c in the HSS source code.
*/
mc->default_ram_size = 1537 * MiB;
+
+ object_class_property_add(oc, "clint-timebase-frequency", "uint32_t",
+ microchip_icicle_kit_get_clint_timebase_freq,
+ microchip_icicle_kit_set_clint_timebase_freq,
+ NULL, NULL);
+ object_class_property_set_description(oc, "clint-timebase-frequency",
+ "Set CLINT timebase frequency in Hz.");
}
static const TypeInfo microchip_icicle_kit_machine_typeinfo = {
.name = MACHINE_TYPE_NAME("microchip-icicle-kit"),
.parent = TYPE_MACHINE,
.class_init = microchip_icicle_kit_machine_class_init,
+ .instance_init = microchip_icicle_kit_machine_instance_init,
.instance_size = sizeof(MicrochipIcicleKitState),
};
diff --git a/include/hw/riscv/microchip_pfsoc.h b/include/hw/riscv/microchip_pfsoc.h
index daef086da6..7ca9b976c1 100644
--- a/include/hw/riscv/microchip_pfsoc.h
+++ b/include/hw/riscv/microchip_pfsoc.h
@@ -67,6 +67,7 @@ typedef struct MicrochipIcicleKitState {
MachineState parent_obj;
/*< public >*/
+ uint32_t clint_timebase_freq;
MicrochipPFSoCState soc;
} MicrochipIcicleKitState;
--
2.43.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH v3 6/6] hw/riscv: microchip_pfsoc: Rework documentation
2025-03-19 6:13 [PATCH v3 0/6] Improve Microchip Polarfire SoC customization Sebastian Huber
` (4 preceding siblings ...)
2025-03-19 6:13 ` [PATCH v3 5/6] hw/riscv: Configurable MPFS CLINT timebase freq Sebastian Huber
@ 2025-03-19 6:13 ` Sebastian Huber
2025-04-04 2:25 ` Alistair Francis
2025-04-04 2:33 ` [PATCH v3 0/6] Improve Microchip Polarfire SoC customization Alistair Francis
6 siblings, 1 reply; 16+ messages in thread
From: Sebastian Huber @ 2025-03-19 6:13 UTC (permalink / raw)
To: qemu-devel; +Cc: qemu-riscv, Alistair Francis, Daniel Henrique Barboza
Mention that running the HSS no longer works. Document the changed boot
options. Reorder documentation blocks. Update URLs.
Signed-off-by: Sebastian Huber <sebastian.huber@embedded-brains.de>
---
docs/system/riscv/microchip-icicle-kit.rst | 124 +++++++--------------
1 file changed, 43 insertions(+), 81 deletions(-)
diff --git a/docs/system/riscv/microchip-icicle-kit.rst b/docs/system/riscv/microchip-icicle-kit.rst
index 40798b1aae..9809e94b84 100644
--- a/docs/system/riscv/microchip-icicle-kit.rst
+++ b/docs/system/riscv/microchip-icicle-kit.rst
@@ -5,10 +5,10 @@ Microchip PolarFire SoC Icicle Kit integrates a PolarFire SoC, with one
SiFive's E51 plus four U54 cores and many on-chip peripherals and an FPGA.
For more details about Microchip PolarFire SoC, please see:
-https://www.microsemi.com/product-directory/soc-fpgas/5498-polarfire-soc-fpga
+https://www.microchip.com/en-us/products/fpgas-and-plds/system-on-chip-fpgas/polarfire-soc-fpgas
The Icicle Kit board information can be found here:
-https://www.microsemi.com/existing-parts/parts/152514
+https://www.microchip.com/en-us/development-tool/mpfs-icicle-kit-es
Supported devices
-----------------
@@ -26,95 +26,48 @@ The ``microchip-icicle-kit`` machine supports the following devices:
* 2 GEM Ethernet controllers
* 1 SDHC storage controller
+The memory is set to 1537 MiB by default. A sanity check on RAM size is
+performed in the machine init routine to prompt user to increase the RAM size
+to > 1537 MiB when less than 1537 MiB RAM is detected.
+
Boot options
------------
-The ``microchip-icicle-kit`` machine can start using the standard -bios
-functionality for loading its BIOS image, aka Hart Software Services (HSS_).
-HSS loads the second stage bootloader U-Boot from an SD card. Then a kernel
-can be loaded from U-Boot. It also supports direct kernel booting via the
--kernel option along with the device tree blob via -dtb. When direct kernel
-boot is used, the OpenSBI fw_dynamic BIOS image is used to boot a payload
-like U-Boot or OS kernel directly.
-
-The user provided DTB should have the following requirements:
-
-* The /cpus node should contain at least one subnode for E51 and the number
- of subnodes should match QEMU's ``-smp`` option
-* The /memory reg size should match QEMU’s selected ram_size via ``-m``
-* Should contain a node for the CLINT device with a compatible string
- "riscv,clint0"
-
-QEMU follows below truth table to select which payload to execute:
-
-===== ========== ========== =======
--bios -kernel -dtb payload
-===== ========== ========== =======
- N N don't care HSS
- Y don't care don't care HSS
- N Y Y kernel
-===== ========== ========== =======
-
-The memory is set to 1537 MiB by default which is the minimum required high
-memory size by HSS. A sanity check on ram size is performed in the machine
-init routine to prompt user to increase the RAM size to > 1537 MiB when less
-than 1537 MiB ram is detected.
-
-Running HSS
------------
-
-HSS 2020.12 release is tested at the time of writing. To build an HSS image
-that can be booted by the ``microchip-icicle-kit`` machine, type the following
-in the HSS source tree:
-
-.. code-block:: bash
-
- $ export CROSS_COMPILE=riscv64-linux-
- $ cp boards/mpfs-icicle-kit-es/def_config .config
- $ make BOARD=mpfs-icicle-kit-es
-
-Download the official SD card image released by Microchip and prepare it for
-QEMU usage:
-
-.. code-block:: bash
-
- $ wget ftp://ftpsoc.microsemi.com/outgoing/core-image-minimal-dev-icicle-kit-es-sd-20201009141623.rootfs.wic.gz
- $ gunzip core-image-minimal-dev-icicle-kit-es-sd-20201009141623.rootfs.wic.gz
- $ qemu-img resize core-image-minimal-dev-icicle-kit-es-sd-20201009141623.rootfs.wic 4G
-
-Then we can boot the machine by:
-
-.. code-block:: bash
-
- $ qemu-system-riscv64 -M microchip-icicle-kit -smp 5 \
- -bios path/to/hss.bin -sd path/to/sdcard.img \
- -nic user,model=cadence_gem \
- -nic tap,ifname=tap,model=cadence_gem,script=no \
- -display none -serial stdio \
- -chardev socket,id=serial1,path=serial1.sock,server=on,wait=on \
- -serial chardev:serial1
+The ``microchip-icicle-kit`` machine provides some options to run a firmware
+(BIOS) or a kernel image. QEMU follows below truth table to select the
+firmware:
-With above command line, current terminal session will be used for the first
-serial port. Open another terminal window, and use ``minicom`` to connect the
-second serial port.
+============= =========== ======================================
+-bios -kernel firmware
+============= =========== ======================================
+none N this is an error
+none Y the kernel image
+NULL, default N hss.bin
+NULL, default Y opensbi-riscv64-generic-fw_dynamic.bin
+other don't care the BIOS image
+============= =========== ======================================
-.. code-block:: bash
+Direct Kernel Boot
+------------------
- $ minicom -D unix\#serial1.sock
+Use the ``-kernel`` option to directly run a kernel image. When a direct
+kernel boot is requested, a device tree blob may be specified via the ``-dtb``
+option. Unlike other QEMU machines, this machine does not generate a device
+tree for the kernel. It shall be provided by the user. The user provided DTB
+should meet the following requirements:
-HSS output is on the first serial port (stdio) and U-Boot outputs on the
-second serial port. U-Boot will automatically load the Linux kernel from
-the SD card image.
+* The ``/cpus`` node should contain at least one subnode for E51 and the number
+ of subnodes should match QEMU's ``-smp`` option.
-Direct Kernel Boot
-------------------
+* The ``/memory`` reg size should match QEMU’s selected RAM size via the ``-m``
+ option.
-Sometimes we just want to test booting a new kernel, and transforming the
-kernel image to the format required by the HSS bootflow is tedious. We can
-use '-kernel' for direct kernel booting just like other RISC-V machines do.
+* It should contain a node for the CLINT device with a compatible string
+ "riscv,clint0".
-In this mode, the OpenSBI fw_dynamic BIOS image for 'generic' platform is
-used to boot an S-mode payload like U-Boot or OS kernel directly.
+When ``-bios`` is not specified or set to ``default``, the OpenSBI
+``fw_dynamic`` BIOS image for the ``generic`` platform is used to boot an
+S-mode payload like U-Boot or OS kernel directly.
For example, the following commands show building a U-Boot image from U-Boot
mainline v2021.07 for the Microchip Icicle Kit board:
@@ -146,4 +99,13 @@ CAVEATS:
``u-boot.bin`` has to be used which does contain one. To use the ELF image,
we need to change to CONFIG_OF_EMBED or CONFIG_OF_PRIOR_STAGE.
+Running HSS
+-----------
+
+The machine ``microchip-icicle-kit`` used to run the Hart Software Services
+(HSS_), however, the HSS development progressed and the QEMU machine
+implementation lacks behind. Currently, running the HSS no longer works.
+There is missing support in the clock and memory controller devices. In
+particular, reading from the SD card does not work.
+
.. _HSS: https://github.com/polarfire-soc/hart-software-services
--
2.43.0
^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH v3 1/6] hw/misc: Add MPFS system reset support
2025-03-19 6:13 ` [PATCH v3 1/6] hw/misc: Add MPFS system reset support Sebastian Huber
@ 2025-04-04 1:48 ` Alistair Francis
0 siblings, 0 replies; 16+ messages in thread
From: Alistair Francis @ 2025-04-04 1:48 UTC (permalink / raw)
To: Sebastian Huber; +Cc: qemu-devel, qemu-riscv, Daniel Henrique Barboza
On Wed, Mar 19, 2025 at 4:13 PM Sebastian Huber
<sebastian.huber@embedded-brains.de> wrote:
>
> Signed-off-by: Sebastian Huber <sebastian.huber@embedded-brains.de>
Acked-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> hw/misc/mchp_pfsoc_sysreg.c | 7 +++++++
> 1 file changed, 7 insertions(+)
>
> diff --git a/hw/misc/mchp_pfsoc_sysreg.c b/hw/misc/mchp_pfsoc_sysreg.c
> index 7876fe0c5b..08196525aa 100644
> --- a/hw/misc/mchp_pfsoc_sysreg.c
> +++ b/hw/misc/mchp_pfsoc_sysreg.c
> @@ -27,7 +27,9 @@
> #include "hw/irq.h"
> #include "hw/sysbus.h"
> #include "hw/misc/mchp_pfsoc_sysreg.h"
> +#include "system/runstate.h"
>
> +#define MSS_RESET_CR 0x18
> #define ENVM_CR 0xb8
> #define MESSAGE_INT 0x118c
>
> @@ -56,6 +58,11 @@ static void mchp_pfsoc_sysreg_write(void *opaque, hwaddr offset,
> {
> MchpPfSoCSysregState *s = opaque;
> switch (offset) {
> + case MSS_RESET_CR:
> + if (value == 0xdead) {
> + qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET);
> + }
> + break;
> case MESSAGE_INT:
> qemu_irq_lower(s->irq);
> break;
> --
> 2.43.0
>
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v3 3/6] hw/riscv: Make FDT optional for MPFS
2025-03-19 6:13 ` [PATCH v3 3/6] hw/riscv: Make FDT optional " Sebastian Huber
@ 2025-04-04 1:51 ` Alistair Francis
2025-10-04 21:17 ` Guenter Roeck
1 sibling, 0 replies; 16+ messages in thread
From: Alistair Francis @ 2025-04-04 1:51 UTC (permalink / raw)
To: Sebastian Huber; +Cc: qemu-devel, qemu-riscv, Daniel Henrique Barboza
On Wed, Mar 19, 2025 at 4:13 PM Sebastian Huber
<sebastian.huber@embedded-brains.de> wrote:
>
> Real-time kernels such as RTEMS or Zephyr may use a static device tree
> built into the kernel image. Do not require to use the -dtb option if
> -kernel is used for the microchip-icicle-kit machine. Issue a warning
> if no device tree is provided by the user since the machine does not
> generate one.
>
> Signed-off-by: Sebastian Huber <sebastian.huber@embedded-brains.de>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> hw/riscv/microchip_pfsoc.c | 56 +++++++++++++++++++-------------------
> 1 file changed, 28 insertions(+), 28 deletions(-)
>
> diff --git a/hw/riscv/microchip_pfsoc.c b/hw/riscv/microchip_pfsoc.c
> index f477d2791e..844dc0545c 100644
> --- a/hw/riscv/microchip_pfsoc.c
> +++ b/hw/riscv/microchip_pfsoc.c
> @@ -516,7 +516,6 @@ static void microchip_icicle_kit_machine_init(MachineState *machine)
> uint64_t mem_low_size, mem_high_size;
> hwaddr firmware_load_addr;
> const char *firmware_name;
> - bool kernel_as_payload = false;
> target_ulong firmware_end_addr, kernel_start_addr;
> uint64_t kernel_entry;
> uint64_t fdt_load_addr;
> @@ -589,25 +588,12 @@ static void microchip_icicle_kit_machine_init(MachineState *machine)
> *
> * This ensures backwards compatibility with how we used to expose -bios
> * to users but allows them to run through direct kernel booting as well.
> - *
> - * When -kernel is used for direct boot, -dtb must be present to provide
> - * a valid device tree for the board, as we don't generate device tree.
> */
>
> - if (machine->kernel_filename && machine->dtb) {
> - int fdt_size;
> - machine->fdt = load_device_tree(machine->dtb, &fdt_size);
> - if (!machine->fdt) {
> - error_report("load_device_tree() failed");
> - exit(1);
> - }
> -
> + if (machine->kernel_filename) {
> firmware_name = RISCV64_BIOS_BIN;
> firmware_load_addr = memmap[MICROCHIP_PFSOC_DRAM_LO].base;
> - kernel_as_payload = true;
> - }
> -
> - if (!kernel_as_payload) {
> + } else {
> firmware_name = BIOS_FILENAME;
> firmware_load_addr = RESET_VECTOR;
> }
> @@ -617,7 +603,7 @@ static void microchip_icicle_kit_machine_init(MachineState *machine)
> &firmware_load_addr, NULL);
>
> riscv_boot_info_init(&boot_info, &s->soc.u_cpus);
> - if (kernel_as_payload) {
> + if (machine->kernel_filename) {
> kernel_start_addr = riscv_calc_kernel_start_addr(&boot_info,
> firmware_end_addr);
>
> @@ -625,19 +611,33 @@ static void microchip_icicle_kit_machine_init(MachineState *machine)
> true, NULL);
> kernel_entry = boot_info.image_low_addr;
>
> - /* Compute the fdt load address in dram */
> - hwaddr kernel_ram_base = memmap[MICROCHIP_PFSOC_DRAM_LO].base;
> - hwaddr kernel_ram_size = memmap[MICROCHIP_PFSOC_DRAM_LO].size;
> -
> - if (kernel_entry - kernel_ram_base >= kernel_ram_size) {
> - kernel_ram_base = memmap[MICROCHIP_PFSOC_DRAM_HI].base;
> - kernel_ram_size = mem_high_size;
> + if (machine->dtb) {
> + int fdt_size;
> + machine->fdt = load_device_tree(machine->dtb, &fdt_size);
> + if (!machine->fdt) {
> + error_report("load_device_tree() failed");
> + exit(1);
> + }
> +
> + /* Compute the FDT load address in DRAM */
> + hwaddr kernel_ram_base = memmap[MICROCHIP_PFSOC_DRAM_LO].base;
> + hwaddr kernel_ram_size = memmap[MICROCHIP_PFSOC_DRAM_LO].size;
> +
> + if (kernel_entry - kernel_ram_base >= kernel_ram_size) {
> + kernel_ram_base = memmap[MICROCHIP_PFSOC_DRAM_HI].base;
> + kernel_ram_size = mem_high_size;
> + }
> +
> + fdt_load_addr = riscv_compute_fdt_addr(kernel_ram_base, kernel_ram_size,
> + machine, &boot_info);
> + riscv_load_fdt(fdt_load_addr, machine->fdt);
> + } else {
> + warn_report_once("The QEMU microchip-icicle-kit machine does not "
> + "generate a device tree, so no device tree is "
> + "being provided to the guest.");
> + fdt_load_addr = 0;
> }
>
> - fdt_load_addr = riscv_compute_fdt_addr(kernel_ram_base, kernel_ram_size,
> - machine, &boot_info);
> - riscv_load_fdt(fdt_load_addr, machine->fdt);
> -
> /* Load the reset vector */
> riscv_setup_rom_reset_vec(machine, &s->soc.u_cpus, firmware_load_addr,
> memmap[MICROCHIP_PFSOC_ENVM_DATA].base,
> --
> 2.43.0
>
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v3 4/6] hw/riscv: Allow direct start of kernel for MPFS
2025-03-19 6:13 ` [PATCH v3 4/6] hw/riscv: Allow direct start of kernel " Sebastian Huber
@ 2025-04-04 2:00 ` Alistair Francis
0 siblings, 0 replies; 16+ messages in thread
From: Alistair Francis @ 2025-04-04 2:00 UTC (permalink / raw)
To: Sebastian Huber; +Cc: qemu-devel, qemu-riscv, Daniel Henrique Barboza
On Wed, Mar 19, 2025 at 4:13 PM Sebastian Huber
<sebastian.huber@embedded-brains.de> wrote:
>
> Further customize the -bios and -kernel options behaviour for the
> microchip-icicle-kit machine. If "-bios none -kernel filename" is
> specified, then do not load a firmware and instead only load and start
> the kernel image.
>
> For test runs, use an approach similar to
> riscv_find_and_load_firmware().
>
> Signed-off-by: Sebastian Huber <sebastian.huber@embedded-brains.de>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> hw/riscv/microchip_pfsoc.c | 59 +++++++++++++++++++++++++++-----------
> 1 file changed, 42 insertions(+), 17 deletions(-)
>
> diff --git a/hw/riscv/microchip_pfsoc.c b/hw/riscv/microchip_pfsoc.c
> index 844dc0545c..5c9f7f643f 100644
> --- a/hw/riscv/microchip_pfsoc.c
> +++ b/hw/riscv/microchip_pfsoc.c
> @@ -578,29 +578,47 @@ static void microchip_icicle_kit_machine_init(MachineState *machine)
> }
>
> /*
> - * We follow the following table to select which payload we execute.
> + * We follow the following table to select which firmware we use.
> *
> - * -bios | -kernel | payload
> - * -------+------------+--------
> - * N | N | HSS
> - * Y | don't care | HSS
> - * N | Y | kernel
> - *
> - * This ensures backwards compatibility with how we used to expose -bios
> - * to users but allows them to run through direct kernel booting as well.
> + * -bios | -kernel | firmware
> + * --------------+------------+--------
> + * none | N | error
> + * none | Y | kernel
> + * NULL, default | N | BIOS_FILENAME
> + * NULL, default | Y | RISCV64_BIOS_BIN
> + * other | don't care | other
> */
> + if (machine->firmware && !strcmp(machine->firmware, "none")) {
> + if (!machine->kernel_filename) {
> + error_report("for -bios none, a kernel is required");
> + exit(1);
> + }
>
> - if (machine->kernel_filename) {
> - firmware_name = RISCV64_BIOS_BIN;
> - firmware_load_addr = memmap[MICROCHIP_PFSOC_DRAM_LO].base;
> + firmware_name = NULL;
> + firmware_load_addr = RESET_VECTOR;
> + } else if (!machine->firmware || !strcmp(machine->firmware, "default")) {
> + if (machine->kernel_filename) {
> + firmware_name = RISCV64_BIOS_BIN;
> + firmware_load_addr = memmap[MICROCHIP_PFSOC_DRAM_LO].base;
> + } else {
> + firmware_name = BIOS_FILENAME;
> + firmware_load_addr = RESET_VECTOR;
> + }
> } else {
> - firmware_name = BIOS_FILENAME;
> + firmware_name = machine->firmware;
> firmware_load_addr = RESET_VECTOR;
> }
>
> - /* Load the firmware */
> - firmware_end_addr = riscv_find_and_load_firmware(machine, firmware_name,
> - &firmware_load_addr, NULL);
> + /* Load the firmware if necessary */
> + firmware_end_addr = firmware_load_addr;
> + if (firmware_name) {
> + char *filename = riscv_find_firmware(firmware_name, NULL);
> + if (filename) {
> + firmware_end_addr = riscv_load_firmware(filename,
> + &firmware_load_addr, NULL);
> + g_free(filename);
> + }
> + }
>
> riscv_boot_info_init(&boot_info, &s->soc.u_cpus);
> if (machine->kernel_filename) {
> @@ -638,8 +656,15 @@ static void microchip_icicle_kit_machine_init(MachineState *machine)
> fdt_load_addr = 0;
> }
>
> + hwaddr start_addr;
> + if (firmware_name) {
> + start_addr = firmware_load_addr;
> + } else {
> + start_addr = kernel_entry;
> + }
> +
> /* Load the reset vector */
> - riscv_setup_rom_reset_vec(machine, &s->soc.u_cpus, firmware_load_addr,
> + riscv_setup_rom_reset_vec(machine, &s->soc.u_cpus, start_addr,
> memmap[MICROCHIP_PFSOC_ENVM_DATA].base,
> memmap[MICROCHIP_PFSOC_ENVM_DATA].size,
> kernel_entry, fdt_load_addr);
> --
> 2.43.0
>
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v3 5/6] hw/riscv: Configurable MPFS CLINT timebase freq
2025-03-19 6:13 ` [PATCH v3 5/6] hw/riscv: Configurable MPFS CLINT timebase freq Sebastian Huber
@ 2025-04-04 2:11 ` Alistair Francis
0 siblings, 0 replies; 16+ messages in thread
From: Alistair Francis @ 2025-04-04 2:11 UTC (permalink / raw)
To: Sebastian Huber; +Cc: qemu-devel, qemu-riscv, Daniel Henrique Barboza
On Wed, Mar 19, 2025 at 4:13 PM Sebastian Huber
<sebastian.huber@embedded-brains.de> wrote:
>
> This property enables the setting of the CLINT timebase frequency
> through the command line, for example:
>
> -machine microchip-icicle-kit,clint-timebase-frequency=10000000
>
> Signed-off-by: Sebastian Huber <sebastian.huber@embedded-brains.de>
> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> hw/riscv/microchip_pfsoc.c | 49 +++++++++++++++++++++++++++---
> include/hw/riscv/microchip_pfsoc.h | 1 +
> 2 files changed, 46 insertions(+), 4 deletions(-)
>
> diff --git a/hw/riscv/microchip_pfsoc.c b/hw/riscv/microchip_pfsoc.c
> index 5c9f7f643f..616bb63982 100644
> --- a/hw/riscv/microchip_pfsoc.c
> +++ b/hw/riscv/microchip_pfsoc.c
> @@ -39,6 +39,7 @@
> #include "qemu/units.h"
> #include "qemu/cutils.h"
> #include "qapi/error.h"
> +#include "qapi/visitor.h"
> #include "hw/boards.h"
> #include "hw/loader.h"
> #include "hw/sysbus.h"
> @@ -61,9 +62,6 @@
> #define BIOS_FILENAME "hss.bin"
> #define RESET_VECTOR 0x20220000
>
> -/* CLINT timebase frequency */
> -#define CLINT_TIMEBASE_FREQ 1000000
> -
> /* GEM version */
> #define GEM_REVISION 0x0107010c
>
> @@ -193,6 +191,7 @@ static void microchip_pfsoc_soc_instance_init(Object *obj)
> static void microchip_pfsoc_soc_realize(DeviceState *dev, Error **errp)
> {
> MachineState *ms = MACHINE(qdev_get_machine());
> + MicrochipIcicleKitState *iks = MICROCHIP_ICICLE_KIT_MACHINE(ms);
> MicrochipPFSoCState *s = MICROCHIP_PFSOC(dev);
> const MemMapEntry *memmap = microchip_pfsoc_memmap;
> MemoryRegion *system_memory = get_system_memory();
> @@ -253,7 +252,7 @@ static void microchip_pfsoc_soc_realize(DeviceState *dev, Error **errp)
> memmap[MICROCHIP_PFSOC_CLINT].base + RISCV_ACLINT_SWI_SIZE,
> RISCV_ACLINT_DEFAULT_MTIMER_SIZE, 0, ms->smp.cpus,
> RISCV_ACLINT_DEFAULT_MTIMECMP, RISCV_ACLINT_DEFAULT_MTIME,
> - CLINT_TIMEBASE_FREQ, false);
> + iks->clint_timebase_freq, false);
>
> /* L2 cache controller */
> create_unimplemented_device("microchip.pfsoc.l2cc",
> @@ -671,6 +670,40 @@ static void microchip_icicle_kit_machine_init(MachineState *machine)
> }
> }
>
> +static void microchip_icicle_kit_set_clint_timebase_freq(Object *obj,
> + Visitor *v,
> + const char *name,
> + void *opaque,
> + Error **errp)
> +{
> + MicrochipIcicleKitState *s = MICROCHIP_ICICLE_KIT_MACHINE(obj);
> + uint32_t value;
> +
> + if (!visit_type_uint32(v, name, &value, errp)) {
> + return;
> + }
> +
> + s->clint_timebase_freq = value;
> +}
> +
> +static void microchip_icicle_kit_get_clint_timebase_freq(Object *obj,
> + Visitor *v,
> + const char *name,
> + void *opaque,
> + Error **errp)
> +{
> + MicrochipIcicleKitState *s = MICROCHIP_ICICLE_KIT_MACHINE(obj);
> + uint32_t value = s->clint_timebase_freq;
> +
> + visit_type_uint32(v, name, &value, errp);
> +}
> +
> +static void microchip_icicle_kit_machine_instance_init(Object *obj)
> +{
> + MicrochipIcicleKitState *m = MICROCHIP_ICICLE_KIT_MACHINE(obj);
> + m->clint_timebase_freq = 1000000;
> +}
> +
> static void microchip_icicle_kit_machine_class_init(ObjectClass *oc, void *data)
> {
> MachineClass *mc = MACHINE_CLASS(oc);
> @@ -692,12 +725,20 @@ static void microchip_icicle_kit_machine_class_init(ObjectClass *oc, void *data)
> * See memory_tests() in mss_ddr.c in the HSS source code.
> */
> mc->default_ram_size = 1537 * MiB;
> +
> + object_class_property_add(oc, "clint-timebase-frequency", "uint32_t",
> + microchip_icicle_kit_get_clint_timebase_freq,
> + microchip_icicle_kit_set_clint_timebase_freq,
> + NULL, NULL);
> + object_class_property_set_description(oc, "clint-timebase-frequency",
> + "Set CLINT timebase frequency in Hz.");
> }
>
> static const TypeInfo microchip_icicle_kit_machine_typeinfo = {
> .name = MACHINE_TYPE_NAME("microchip-icicle-kit"),
> .parent = TYPE_MACHINE,
> .class_init = microchip_icicle_kit_machine_class_init,
> + .instance_init = microchip_icicle_kit_machine_instance_init,
> .instance_size = sizeof(MicrochipIcicleKitState),
> };
>
> diff --git a/include/hw/riscv/microchip_pfsoc.h b/include/hw/riscv/microchip_pfsoc.h
> index daef086da6..7ca9b976c1 100644
> --- a/include/hw/riscv/microchip_pfsoc.h
> +++ b/include/hw/riscv/microchip_pfsoc.h
> @@ -67,6 +67,7 @@ typedef struct MicrochipIcicleKitState {
> MachineState parent_obj;
>
> /*< public >*/
> + uint32_t clint_timebase_freq;
> MicrochipPFSoCState soc;
> } MicrochipIcicleKitState;
>
> --
> 2.43.0
>
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v3 6/6] hw/riscv: microchip_pfsoc: Rework documentation
2025-03-19 6:13 ` [PATCH v3 6/6] hw/riscv: microchip_pfsoc: Rework documentation Sebastian Huber
@ 2025-04-04 2:25 ` Alistair Francis
0 siblings, 0 replies; 16+ messages in thread
From: Alistair Francis @ 2025-04-04 2:25 UTC (permalink / raw)
To: Sebastian Huber; +Cc: qemu-devel, qemu-riscv, Daniel Henrique Barboza
On Wed, Mar 19, 2025 at 4:14 PM Sebastian Huber
<sebastian.huber@embedded-brains.de> wrote:
>
> Mention that running the HSS no longer works. Document the changed boot
> options. Reorder documentation blocks. Update URLs.
>
> Signed-off-by: Sebastian Huber <sebastian.huber@embedded-brains.de>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> docs/system/riscv/microchip-icicle-kit.rst | 124 +++++++--------------
> 1 file changed, 43 insertions(+), 81 deletions(-)
>
> diff --git a/docs/system/riscv/microchip-icicle-kit.rst b/docs/system/riscv/microchip-icicle-kit.rst
> index 40798b1aae..9809e94b84 100644
> --- a/docs/system/riscv/microchip-icicle-kit.rst
> +++ b/docs/system/riscv/microchip-icicle-kit.rst
> @@ -5,10 +5,10 @@ Microchip PolarFire SoC Icicle Kit integrates a PolarFire SoC, with one
> SiFive's E51 plus four U54 cores and many on-chip peripherals and an FPGA.
>
> For more details about Microchip PolarFire SoC, please see:
> -https://www.microsemi.com/product-directory/soc-fpgas/5498-polarfire-soc-fpga
> +https://www.microchip.com/en-us/products/fpgas-and-plds/system-on-chip-fpgas/polarfire-soc-fpgas
>
> The Icicle Kit board information can be found here:
> -https://www.microsemi.com/existing-parts/parts/152514
> +https://www.microchip.com/en-us/development-tool/mpfs-icicle-kit-es
>
> Supported devices
> -----------------
> @@ -26,95 +26,48 @@ The ``microchip-icicle-kit`` machine supports the following devices:
> * 2 GEM Ethernet controllers
> * 1 SDHC storage controller
>
> +The memory is set to 1537 MiB by default. A sanity check on RAM size is
> +performed in the machine init routine to prompt user to increase the RAM size
> +to > 1537 MiB when less than 1537 MiB RAM is detected.
> +
> Boot options
> ------------
>
> -The ``microchip-icicle-kit`` machine can start using the standard -bios
> -functionality for loading its BIOS image, aka Hart Software Services (HSS_).
> -HSS loads the second stage bootloader U-Boot from an SD card. Then a kernel
> -can be loaded from U-Boot. It also supports direct kernel booting via the
> --kernel option along with the device tree blob via -dtb. When direct kernel
> -boot is used, the OpenSBI fw_dynamic BIOS image is used to boot a payload
> -like U-Boot or OS kernel directly.
> -
> -The user provided DTB should have the following requirements:
> -
> -* The /cpus node should contain at least one subnode for E51 and the number
> - of subnodes should match QEMU's ``-smp`` option
> -* The /memory reg size should match QEMU’s selected ram_size via ``-m``
> -* Should contain a node for the CLINT device with a compatible string
> - "riscv,clint0"
> -
> -QEMU follows below truth table to select which payload to execute:
> -
> -===== ========== ========== =======
> --bios -kernel -dtb payload
> -===== ========== ========== =======
> - N N don't care HSS
> - Y don't care don't care HSS
> - N Y Y kernel
> -===== ========== ========== =======
> -
> -The memory is set to 1537 MiB by default which is the minimum required high
> -memory size by HSS. A sanity check on ram size is performed in the machine
> -init routine to prompt user to increase the RAM size to > 1537 MiB when less
> -than 1537 MiB ram is detected.
> -
> -Running HSS
> ------------
> -
> -HSS 2020.12 release is tested at the time of writing. To build an HSS image
> -that can be booted by the ``microchip-icicle-kit`` machine, type the following
> -in the HSS source tree:
> -
> -.. code-block:: bash
> -
> - $ export CROSS_COMPILE=riscv64-linux-
> - $ cp boards/mpfs-icicle-kit-es/def_config .config
> - $ make BOARD=mpfs-icicle-kit-es
> -
> -Download the official SD card image released by Microchip and prepare it for
> -QEMU usage:
> -
> -.. code-block:: bash
> -
> - $ wget ftp://ftpsoc.microsemi.com/outgoing/core-image-minimal-dev-icicle-kit-es-sd-20201009141623.rootfs.wic.gz
> - $ gunzip core-image-minimal-dev-icicle-kit-es-sd-20201009141623.rootfs.wic.gz
> - $ qemu-img resize core-image-minimal-dev-icicle-kit-es-sd-20201009141623.rootfs.wic 4G
> -
> -Then we can boot the machine by:
> -
> -.. code-block:: bash
> -
> - $ qemu-system-riscv64 -M microchip-icicle-kit -smp 5 \
> - -bios path/to/hss.bin -sd path/to/sdcard.img \
> - -nic user,model=cadence_gem \
> - -nic tap,ifname=tap,model=cadence_gem,script=no \
> - -display none -serial stdio \
> - -chardev socket,id=serial1,path=serial1.sock,server=on,wait=on \
> - -serial chardev:serial1
> +The ``microchip-icicle-kit`` machine provides some options to run a firmware
> +(BIOS) or a kernel image. QEMU follows below truth table to select the
> +firmware:
>
> -With above command line, current terminal session will be used for the first
> -serial port. Open another terminal window, and use ``minicom`` to connect the
> -second serial port.
> +============= =========== ======================================
> +-bios -kernel firmware
> +============= =========== ======================================
> +none N this is an error
> +none Y the kernel image
> +NULL, default N hss.bin
> +NULL, default Y opensbi-riscv64-generic-fw_dynamic.bin
> +other don't care the BIOS image
> +============= =========== ======================================
>
> -.. code-block:: bash
> +Direct Kernel Boot
> +------------------
>
> - $ minicom -D unix\#serial1.sock
> +Use the ``-kernel`` option to directly run a kernel image. When a direct
> +kernel boot is requested, a device tree blob may be specified via the ``-dtb``
> +option. Unlike other QEMU machines, this machine does not generate a device
> +tree for the kernel. It shall be provided by the user. The user provided DTB
> +should meet the following requirements:
>
> -HSS output is on the first serial port (stdio) and U-Boot outputs on the
> -second serial port. U-Boot will automatically load the Linux kernel from
> -the SD card image.
> +* The ``/cpus`` node should contain at least one subnode for E51 and the number
> + of subnodes should match QEMU's ``-smp`` option.
>
> -Direct Kernel Boot
> -------------------
> +* The ``/memory`` reg size should match QEMU’s selected RAM size via the ``-m``
> + option.
>
> -Sometimes we just want to test booting a new kernel, and transforming the
> -kernel image to the format required by the HSS bootflow is tedious. We can
> -use '-kernel' for direct kernel booting just like other RISC-V machines do.
> +* It should contain a node for the CLINT device with a compatible string
> + "riscv,clint0".
>
> -In this mode, the OpenSBI fw_dynamic BIOS image for 'generic' platform is
> -used to boot an S-mode payload like U-Boot or OS kernel directly.
> +When ``-bios`` is not specified or set to ``default``, the OpenSBI
> +``fw_dynamic`` BIOS image for the ``generic`` platform is used to boot an
> +S-mode payload like U-Boot or OS kernel directly.
>
> For example, the following commands show building a U-Boot image from U-Boot
> mainline v2021.07 for the Microchip Icicle Kit board:
> @@ -146,4 +99,13 @@ CAVEATS:
> ``u-boot.bin`` has to be used which does contain one. To use the ELF image,
> we need to change to CONFIG_OF_EMBED or CONFIG_OF_PRIOR_STAGE.
>
> +Running HSS
> +-----------
> +
> +The machine ``microchip-icicle-kit`` used to run the Hart Software Services
> +(HSS_), however, the HSS development progressed and the QEMU machine
> +implementation lacks behind. Currently, running the HSS no longer works.
> +There is missing support in the clock and memory controller devices. In
> +particular, reading from the SD card does not work.
> +
> .. _HSS: https://github.com/polarfire-soc/hart-software-services
> --
> 2.43.0
>
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v3 0/6] Improve Microchip Polarfire SoC customization
2025-03-19 6:13 [PATCH v3 0/6] Improve Microchip Polarfire SoC customization Sebastian Huber
` (5 preceding siblings ...)
2025-03-19 6:13 ` [PATCH v3 6/6] hw/riscv: microchip_pfsoc: Rework documentation Sebastian Huber
@ 2025-04-04 2:33 ` Alistair Francis
6 siblings, 0 replies; 16+ messages in thread
From: Alistair Francis @ 2025-04-04 2:33 UTC (permalink / raw)
To: Sebastian Huber; +Cc: qemu-devel, qemu-riscv, Daniel Henrique Barboza
On Wed, Mar 19, 2025 at 4:13 PM Sebastian Huber
<sebastian.huber@embedded-brains.de> wrote:
>
> Booting the microchip-icicle-kit machine using the latest PolarFire SoC
> Hart Software Services (HSS) no longer works since Qemu lacks support
> for several registers (clocks, DRAM controller). Also reading from the
> SDCard does not work currently.
>
> In order to allow tests runs for real-time kernels such as RTEMS and
> Zephyr, improve the boot customization. This patch set enables a direct
> run of kernel executables, for example:
>
> qemu-system-riscv64 -no-reboot -nographic \
> -serial null -serial mon:stdio \
> -smp 2 \
> -bios none \
> -machine microchip-icicle-kit,clint-timebase-frequency=10000000 \
> -kernel rtos.elf
>
> v2:
>
> * Add documentation update.
>
> * In patch 3, warn if no device tree is specified.
>
> * In patch 4, use riscv_find_firmware() to locate the firmware shipped with Qemu.
>
> v3:
>
> * In patch 4, add support for Qemu test runs.
>
> Sebastian Huber (6):
> hw/misc: Add MPFS system reset support
> hw/riscv: More flexible FDT placement for MPFS
> hw/riscv: Make FDT optional for MPFS
> hw/riscv: Allow direct start of kernel for MPFS
> hw/riscv: Configurable MPFS CLINT timebase freq
> hw/riscv: microchip_pfsoc: Rework documentation
Thanks!
Applied to riscv-to-apply.next
Alistair
>
> docs/system/riscv/microchip-icicle-kit.rst | 124 ++++++-----------
> hw/misc/mchp_pfsoc_sysreg.c | 7 +
> hw/riscv/microchip_pfsoc.c | 153 +++++++++++++++------
> include/hw/riscv/microchip_pfsoc.h | 1 +
> 4 files changed, 164 insertions(+), 121 deletions(-)
>
> --
> 2.43.0
>
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v3 3/6] hw/riscv: Make FDT optional for MPFS
2025-03-19 6:13 ` [PATCH v3 3/6] hw/riscv: Make FDT optional " Sebastian Huber
2025-04-04 1:51 ` Alistair Francis
@ 2025-10-04 21:17 ` Guenter Roeck
2025-10-06 5:14 ` Sebastian Huber
1 sibling, 1 reply; 16+ messages in thread
From: Guenter Roeck @ 2025-10-04 21:17 UTC (permalink / raw)
To: Sebastian Huber
Cc: qemu-devel, qemu-riscv, Alistair Francis, Daniel Henrique Barboza
Hi,
On Wed, Mar 19, 2025 at 07:13:35AM +0100, Sebastian Huber wrote:
> Real-time kernels such as RTEMS or Zephyr may use a static device tree
> built into the kernel image. Do not require to use the -dtb option if
> -kernel is used for the microchip-icicle-kit machine. Issue a warning
> if no device tree is provided by the user since the machine does not
> generate one.
>
> Signed-off-by: Sebastian Huber <sebastian.huber@embedded-brains.de>
> Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Starting with qemu v10.1.0, the command line is no longer passed to
the kernel when booting Linux on the Icicle machine. Looking into the
patch, the reason is quite obvious: The /chosen property is set in
riscv_load_kernel(), which is now called before the devicetree is
loaded.
I was unable to find a clean solution other than reverting this and the
next patch of the series, so this is just to let people know about the
problem.
Guenter
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v3 3/6] hw/riscv: Make FDT optional for MPFS
2025-10-04 21:17 ` Guenter Roeck
@ 2025-10-06 5:14 ` Sebastian Huber
2025-10-06 20:34 ` Guenter Roeck
0 siblings, 1 reply; 16+ messages in thread
From: Sebastian Huber @ 2025-10-06 5:14 UTC (permalink / raw)
To: Guenter Roeck
Cc: qemu-devel, qemu-riscv, Alistair Francis, Daniel Henrique Barboza
Hello Guenter,
thanks for the report. Do you have a Linux image and a Qemu command line so that I can test this?
--
embedded brains GmbH & Co. KG
Herr Sebastian HUBER
Dornierstr. 4
82178 Puchheim
Germany
email: sebastian.huber@embedded-brains.de
phone: +49-89-18 94 741 - 16
fax: +49-89-18 94 741 - 08
Registergericht: Amtsgericht München
Registernummer: HRB 157899
Vertretungsberechtigte Geschäftsführer: Peter Rasmussen, Thomas Dörfler
Unsere Datenschutzerklärung finden Sie hier:
https://embedded-brains.de/datenschutzerklaerung/
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH v3 3/6] hw/riscv: Make FDT optional for MPFS
2025-10-06 5:14 ` Sebastian Huber
@ 2025-10-06 20:34 ` Guenter Roeck
0 siblings, 0 replies; 16+ messages in thread
From: Guenter Roeck @ 2025-10-06 20:34 UTC (permalink / raw)
To: Sebastian Huber
Cc: qemu-devel, qemu-riscv, Alistair Francis, Daniel Henrique Barboza
On 10/5/25 22:14, Sebastian Huber wrote:
> Hello Guenter,
>
> thanks for the report. Do you have a Linux image and a Qemu command line so that I can test this?
>
See http://server.roeck-us.net/qemu/riscv64/
run.sh executed with qemu 10.1 or later should trigger the problem
(the command line is not passed to the kernel).
Guenter
^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2025-10-06 20:35 UTC | newest]
Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-03-19 6:13 [PATCH v3 0/6] Improve Microchip Polarfire SoC customization Sebastian Huber
2025-03-19 6:13 ` [PATCH v3 1/6] hw/misc: Add MPFS system reset support Sebastian Huber
2025-04-04 1:48 ` Alistair Francis
2025-03-19 6:13 ` [PATCH v3 2/6] hw/riscv: More flexible FDT placement for MPFS Sebastian Huber
2025-03-19 6:13 ` [PATCH v3 3/6] hw/riscv: Make FDT optional " Sebastian Huber
2025-04-04 1:51 ` Alistair Francis
2025-10-04 21:17 ` Guenter Roeck
2025-10-06 5:14 ` Sebastian Huber
2025-10-06 20:34 ` Guenter Roeck
2025-03-19 6:13 ` [PATCH v3 4/6] hw/riscv: Allow direct start of kernel " Sebastian Huber
2025-04-04 2:00 ` Alistair Francis
2025-03-19 6:13 ` [PATCH v3 5/6] hw/riscv: Configurable MPFS CLINT timebase freq Sebastian Huber
2025-04-04 2:11 ` Alistair Francis
2025-03-19 6:13 ` [PATCH v3 6/6] hw/riscv: microchip_pfsoc: Rework documentation Sebastian Huber
2025-04-04 2:25 ` Alistair Francis
2025-04-04 2:33 ` [PATCH v3 0/6] Improve Microchip Polarfire SoC customization Alistair Francis
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).