diff mbox series

[v2,10/12] hw/arm/raspi: List models creatable by the generic 'raspi' machine

Message ID 20250204002240.97830-11-philmd@linaro.org
State New
Headers show
Series [v2,01/12] hw/arm/raspi: Access SoC parent object using BCM283X_BASE() macro | expand

Commit Message

Philippe Mathieu-Daudé Feb. 4, 2025, 12:22 a.m. UTC
All the following models can be created (with different RAM size):

  $ qemu-system-aarch64 -M raspi
  qemu-system-aarch64: Missing model, try -M raspi,model=help
  $ qemu-system-aarch64 -M raspi,model=help
  Available models (processor):
  - A          (BCM2835)
  - B          (BCM2835)
  - A+         (BCM2835)
  - B+         (BCM2835)
  - 2B         (BCM2836)
  - CM1        (BCM2835)
  - 3B         (BCM2837)
  - Zero       (BCM2835)
  - CM3        (BCM2837)
  - ZeroW      (BCM2835)
  - 3B+        (BCM2837)
  - 3A+        (BCM2837)
  - CM3+       (BCM2837)
  - 4B         (BCM2838)

Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
 hw/arm/raspi.c | 28 +++++++++++++++++++++++++++-
 1 file changed, 27 insertions(+), 1 deletion(-)
diff mbox series

Patch

diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
index b184ac3c446..8cae1ff6f93 100644
--- a/hw/arm/raspi.c
+++ b/hw/arm/raspi.c
@@ -445,7 +445,7 @@  static void raspi_generic_machine_init(MachineState *ms)
     uint64_t max_ramsize;
 
     if (!board_rev) {
-        error_report("Missing model");
+        error_report("Missing model, try -M raspi,model=help");
         exit(1);
     }
 
@@ -500,8 +500,33 @@  static void raspi_update_board_rev(RaspiBaseMachineState *s)
     ms->smp.max_cpus = soc_property[proc].cores_count;
 }
 
+static void raspi_list_machine_models(void)
+{
+    printf("Available models (processor):\n");
+
+    for (unsigned i = 0; i < ARRAY_SIZE(types); i++) {
+        const char *soc_type;
+
+        if (!types[i].model) {
+            continue;
+        }
+
+        soc_type = soc_property[types[i].proc_id].type;
+        if (!soc_type) {
+            continue;
+        }
+        printf("- %-10s (BCM%s)\n",
+               types[i].model,
+               soc_property[types[i].proc_id].type + 3);
+    }
+}
+
 static void raspi_set_machine_model(Object *obj, const char *value, Error **errp)
 {
+    if (!strcmp(value, "help")) {
+        raspi_list_machine_models();
+        exit(0);
+    }
     for (unsigned i = 0; i < ARRAY_SIZE(types); i++) {
         if (types[i].model && !strcmp(value, types[i].model)) {
             RaspiBaseMachineState *s = RASPI_BASE_MACHINE(obj);
@@ -512,6 +537,7 @@  static void raspi_set_machine_model(Object *obj, const char *value, Error **errp
         }
     }
     error_setg(errp, "Invalid model");
+    error_append_hint(errp, "Use model=help to list models.\n");
 }
 
 static char *raspi_get_machine_model(Object *obj, Error **errp)