qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 0/8] hw/arm/raspi: QOM housekeeping to be able to add more machines
@ 2020-09-21  7:56 Philippe Mathieu-Daudé
  2020-09-21  7:56 ` [PATCH v3 1/8] hw/arm/raspi: Display the board revision in the machine description Philippe Mathieu-Daudé
                   ` (7 more replies)
  0 siblings, 8 replies; 14+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-09-21  7:56 UTC (permalink / raw)
  To: qemu-devel
  Cc: Peter Maydell, Philippe Mathieu-Daudé,
	Andrew Baumann, Paul Zimmerman, qemu-arm, Luc Michel

Machine-specific patches extracted from v2 [*] and rebased.

Housekeeping the QOM model to easily add more machines.

Patches missing review: 1-3,7.

[*] https://www.mail-archive.com/qemu-devel@nongnu.org/msg680135.html

Based-on: <20200921035257.434532-1-f4bug@amsat.org>

Philippe Mathieu-Daudé (8):
  hw/arm/raspi: Display the board revision in the machine description
  hw/arm/raspi: Load the firmware on the first core
  hw/arm/raspi: Move arm_boot_info structure to RaspiMachineState
  hw/arm/raspi: Avoid using TypeInfo::class_data pointer
  hw/arm/raspi: Use more specific machine names
  hw/arm/raspi: Introduce RaspiProcessorId enum
  hw/arm/raspi: Use RaspiProcessorId to set the firmware load address
  hw/arm/raspi: Remove use of the 'version' value in the board code

 hw/arm/raspi.c | 152 +++++++++++++++++++++++++++----------------------
 1 file changed, 83 insertions(+), 69 deletions(-)

-- 
2.26.2



^ permalink raw reply	[flat|nested] 14+ messages in thread

* [PATCH v3 1/8] hw/arm/raspi: Display the board revision in the machine description
  2020-09-21  7:56 [PATCH v3 0/8] hw/arm/raspi: QOM housekeeping to be able to add more machines Philippe Mathieu-Daudé
@ 2020-09-21  7:56 ` Philippe Mathieu-Daudé
  2020-09-21 19:53   ` Luc Michel
  2020-09-21  7:56 ` [PATCH v3 2/8] hw/arm/raspi: Load the firmware on the first core Philippe Mathieu-Daudé
                   ` (6 subsequent siblings)
  7 siblings, 1 reply; 14+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-09-21  7:56 UTC (permalink / raw)
  To: qemu-devel
  Cc: Peter Maydell, Philippe Mathieu-Daudé,
	Andrew Baumann, Paul Zimmerman, qemu-arm, Luc Michel

Display the board revision in the machine description.

Before:

  $ qemu-system-aarch64 -M help | fgrep raspi
  raspi2               Raspberry Pi 2B
  raspi3               Raspberry Pi 3B

After:

  raspi2               Raspberry Pi 2B (revision 1.1)
  raspi3               Raspberry Pi 3B (revision 1.2)

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
 hw/arm/raspi.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
index 811eaf52ff5..46d9ed7f054 100644
--- a/hw/arm/raspi.c
+++ b/hw/arm/raspi.c
@@ -312,7 +312,9 @@ static void raspi_machine_class_init(ObjectClass *oc, void *data)
     uint32_t board_rev = (uint32_t)(uintptr_t)data;
 
     rmc->board_rev = board_rev;
-    mc->desc = g_strdup_printf("Raspberry Pi %s", board_type(board_rev));
+    mc->desc = g_strdup_printf("Raspberry Pi %s (revision 1.%u)",
+                               board_type(board_rev),
+                               FIELD_EX32(board_rev, REV_CODE, REVISION));
     mc->init = raspi_machine_init;
     mc->block_default_type = IF_SD;
     mc->no_parallel = 1;
-- 
2.26.2



^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH v3 2/8] hw/arm/raspi: Load the firmware on the first core
  2020-09-21  7:56 [PATCH v3 0/8] hw/arm/raspi: QOM housekeeping to be able to add more machines Philippe Mathieu-Daudé
  2020-09-21  7:56 ` [PATCH v3 1/8] hw/arm/raspi: Display the board revision in the machine description Philippe Mathieu-Daudé
@ 2020-09-21  7:56 ` Philippe Mathieu-Daudé
  2020-09-21 19:55   ` Luc Michel
  2020-09-21  7:56 ` [PATCH v3 3/8] hw/arm/raspi: Move arm_boot_info structure to RaspiMachineState Philippe Mathieu-Daudé
                   ` (5 subsequent siblings)
  7 siblings, 1 reply; 14+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-09-21  7:56 UTC (permalink / raw)
  To: qemu-devel
  Cc: Peter Maydell, Philippe Mathieu-Daudé,
	Andrew Baumann, Paul Zimmerman, qemu-arm, Luc Michel

The 'first_cpu' is more a QEMU accelerator-related concept
than a variable the machine requires to use.
Since the machine is aware of its CPUs, directly use the
first one to load the firmware.

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
 hw/arm/raspi.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
index 46d9ed7f054..8716a80a75e 100644
--- a/hw/arm/raspi.c
+++ b/hw/arm/raspi.c
@@ -205,6 +205,7 @@ static void reset_secondary(ARMCPU *cpu, const struct arm_boot_info *info)
 
 static void setup_boot(MachineState *machine, int version, size_t ram_size)
 {
+    RaspiMachineState *s = RASPI_MACHINE(machine);
     static struct arm_boot_info binfo;
     int r;
 
@@ -253,7 +254,7 @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
         binfo.firmware_loaded = true;
     }
 
-    arm_load_kernel(ARM_CPU(first_cpu), machine, &binfo);
+    arm_load_kernel(&s->soc.cpu[0].core, machine, &binfo);
 }
 
 static void raspi_machine_init(MachineState *machine)
-- 
2.26.2



^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH v3 3/8] hw/arm/raspi: Move arm_boot_info structure to RaspiMachineState
  2020-09-21  7:56 [PATCH v3 0/8] hw/arm/raspi: QOM housekeeping to be able to add more machines Philippe Mathieu-Daudé
  2020-09-21  7:56 ` [PATCH v3 1/8] hw/arm/raspi: Display the board revision in the machine description Philippe Mathieu-Daudé
  2020-09-21  7:56 ` [PATCH v3 2/8] hw/arm/raspi: Load the firmware on the first core Philippe Mathieu-Daudé
@ 2020-09-21  7:56 ` Philippe Mathieu-Daudé
  2020-09-21 19:55   ` Luc Michel
  2020-09-21  7:56 ` [PATCH v3 4/8] hw/arm/raspi: Avoid using TypeInfo::class_data pointer Philippe Mathieu-Daudé
                   ` (4 subsequent siblings)
  7 siblings, 1 reply; 14+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-09-21  7:56 UTC (permalink / raw)
  To: qemu-devel
  Cc: Peter Maydell, Philippe Mathieu-Daudé,
	Andrew Baumann, Paul Zimmerman, qemu-arm, Luc Michel

The arm_boot_info structure belong to the machine,
move it to RaspiMachineState.

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
 hw/arm/raspi.c | 30 +++++++++++++++---------------
 1 file changed, 15 insertions(+), 15 deletions(-)

diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
index 8716a80a75e..16e6c83c925 100644
--- a/hw/arm/raspi.c
+++ b/hw/arm/raspi.c
@@ -41,6 +41,7 @@ struct RaspiMachineState {
     MachineState parent_obj;
     /*< public >*/
     BCM283XState soc;
+    struct arm_boot_info binfo;
 };
 typedef struct RaspiMachineState RaspiMachineState;
 
@@ -206,12 +207,11 @@ static void reset_secondary(ARMCPU *cpu, const struct arm_boot_info *info)
 static void setup_boot(MachineState *machine, int version, size_t ram_size)
 {
     RaspiMachineState *s = RASPI_MACHINE(machine);
-    static struct arm_boot_info binfo;
     int r;
 
-    binfo.board_id = MACH_TYPE_BCM2708;
-    binfo.ram_size = ram_size;
-    binfo.nb_cpus = machine->smp.cpus;
+    s->binfo.board_id = MACH_TYPE_BCM2708;
+    s->binfo.ram_size = ram_size;
+    s->binfo.nb_cpus = machine->smp.cpus;
 
     if (version <= 2) {
         /* The rpi1 and 2 require some custom setup code to run in Secure
@@ -220,21 +220,21 @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
          * firmware for some cache maintenance operations.
          * The rpi3 doesn't need this.
          */
-        binfo.board_setup_addr = BOARDSETUP_ADDR;
-        binfo.write_board_setup = write_board_setup;
-        binfo.secure_board_setup = true;
-        binfo.secure_boot = true;
+        s->binfo.board_setup_addr = BOARDSETUP_ADDR;
+        s->binfo.write_board_setup = write_board_setup;
+        s->binfo.secure_board_setup = true;
+        s->binfo.secure_boot = true;
     }
 
     /* Pi2 and Pi3 requires SMP setup */
     if (version >= 2) {
-        binfo.smp_loader_start = SMPBOOT_ADDR;
+        s->binfo.smp_loader_start = SMPBOOT_ADDR;
         if (version == 2) {
-            binfo.write_secondary_boot = write_smpboot;
+            s->binfo.write_secondary_boot = write_smpboot;
         } else {
-            binfo.write_secondary_boot = write_smpboot64;
+            s->binfo.write_secondary_boot = write_smpboot64;
         }
-        binfo.secondary_cpu_reset_hook = reset_secondary;
+        s->binfo.secondary_cpu_reset_hook = reset_secondary;
     }
 
     /* If the user specified a "firmware" image (e.g. UEFI), we bypass
@@ -250,11 +250,11 @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
             exit(1);
         }
 
-        binfo.entry = firmware_addr;
-        binfo.firmware_loaded = true;
+        s->binfo.entry = firmware_addr;
+        s->binfo.firmware_loaded = true;
     }
 
-    arm_load_kernel(&s->soc.cpu[0].core, machine, &binfo);
+    arm_load_kernel(&s->soc.cpu[0].core, machine, &s->binfo);
 }
 
 static void raspi_machine_init(MachineState *machine)
-- 
2.26.2



^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH v3 4/8] hw/arm/raspi: Avoid using TypeInfo::class_data pointer
  2020-09-21  7:56 [PATCH v3 0/8] hw/arm/raspi: QOM housekeeping to be able to add more machines Philippe Mathieu-Daudé
                   ` (2 preceding siblings ...)
  2020-09-21  7:56 ` [PATCH v3 3/8] hw/arm/raspi: Move arm_boot_info structure to RaspiMachineState Philippe Mathieu-Daudé
@ 2020-09-21  7:56 ` Philippe Mathieu-Daudé
  2020-09-21  7:56 ` [PATCH v3 5/8] hw/arm/raspi: Use more specific machine names Philippe Mathieu-Daudé
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 14+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-09-21  7:56 UTC (permalink / raw)
  To: qemu-devel
  Cc: Peter Maydell, Richard Henderson, Philippe Mathieu-Daudé,
	Andrew Baumann, Paul Zimmerman, qemu-arm, Igor Mammedov,
	Luc Michel

Using class_data pointer to create a MachineClass is not
the recommended way anymore. The correct way is to open-code
the MachineClass::fields in the class_init() method.

We can not use TYPE_RASPI_MACHINE::class_base_init() because
it is called *before* each machine class_init(), therefore the
board_rev field is not populated. We have to manually call
raspi_machine_class_common_init() for each machine.

This partly reverts commit a03bde3674e.

Suggested-by: Igor Mammedov <imammedo@redhat.com>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
 hw/arm/raspi.c | 34 ++++++++++++++++++++++++----------
 1 file changed, 24 insertions(+), 10 deletions(-)

diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
index 16e6c83c925..3000e6d57e6 100644
--- a/hw/arm/raspi.c
+++ b/hw/arm/raspi.c
@@ -306,13 +306,9 @@ static void raspi_machine_init(MachineState *machine)
     setup_boot(machine, version, machine->ram_size - vcram_size);
 }
 
-static void raspi_machine_class_init(ObjectClass *oc, void *data)
+static void raspi_machine_class_common_init(MachineClass *mc,
+                                            uint32_t board_rev)
 {
-    MachineClass *mc = MACHINE_CLASS(oc);
-    RaspiMachineClass *rmc = RASPI_MACHINE_CLASS(oc);
-    uint32_t board_rev = (uint32_t)(uintptr_t)data;
-
-    rmc->board_rev = board_rev;
     mc->desc = g_strdup_printf("Raspberry Pi %s (revision 1.%u)",
                                board_type(board_rev),
                                FIELD_EX32(board_rev, REV_CODE, REVISION));
@@ -326,18 +322,36 @@ static void raspi_machine_class_init(ObjectClass *oc, void *data)
     mc->default_ram_id = "ram";
 };
 
+static void raspi2b_machine_class_init(ObjectClass *oc, void *data)
+{
+    MachineClass *mc = MACHINE_CLASS(oc);
+    RaspiMachineClass *rmc = RASPI_MACHINE_CLASS(oc);
+
+    rmc->board_rev = 0xa21041;
+    raspi_machine_class_common_init(mc, rmc->board_rev);
+};
+
+#ifdef TARGET_AARCH64
+static void raspi3b_machine_class_init(ObjectClass *oc, void *data)
+{
+    MachineClass *mc = MACHINE_CLASS(oc);
+    RaspiMachineClass *rmc = RASPI_MACHINE_CLASS(oc);
+
+    rmc->board_rev = 0xa02082;
+    raspi_machine_class_common_init(mc, rmc->board_rev);
+};
+#endif /* TARGET_AARCH64 */
+
 static const TypeInfo raspi_machine_types[] = {
     {
         .name           = MACHINE_TYPE_NAME("raspi2"),
         .parent         = TYPE_RASPI_MACHINE,
-        .class_init     = raspi_machine_class_init,
-        .class_data     = (void *)0xa21041,
+        .class_init     = raspi2b_machine_class_init,
 #ifdef TARGET_AARCH64
     }, {
         .name           = MACHINE_TYPE_NAME("raspi3"),
         .parent         = TYPE_RASPI_MACHINE,
-        .class_init     = raspi_machine_class_init,
-        .class_data     = (void *)0xa02082,
+        .class_init     = raspi3b_machine_class_init,
 #endif
     }, {
         .name           = TYPE_RASPI_MACHINE,
-- 
2.26.2



^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH v3 5/8] hw/arm/raspi: Use more specific machine names
  2020-09-21  7:56 [PATCH v3 0/8] hw/arm/raspi: QOM housekeeping to be able to add more machines Philippe Mathieu-Daudé
                   ` (3 preceding siblings ...)
  2020-09-21  7:56 ` [PATCH v3 4/8] hw/arm/raspi: Avoid using TypeInfo::class_data pointer Philippe Mathieu-Daudé
@ 2020-09-21  7:56 ` Philippe Mathieu-Daudé
  2020-09-21  7:56 ` [PATCH v3 6/8] hw/arm/raspi: Introduce RaspiProcessorId enum Philippe Mathieu-Daudé
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 14+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-09-21  7:56 UTC (permalink / raw)
  To: qemu-devel
  Cc: Peter Maydell, Philippe Mathieu-Daudé,
	Andrew Baumann, Paul Zimmerman, qemu-arm, Luc Michel

Now that we can instantiate different machines based on their
board_rev register value, we can have various raspi2 and raspi3.

In commit fc78a990ec103 we corrected the machine description.
Correct the machine names too. For backward compatibility, add
an alias to the previous generic name.

Reviewed-by: Luc Michel <luc.michel@greensocs.com>
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
 hw/arm/raspi.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
index 3000e6d57e6..3426521379e 100644
--- a/hw/arm/raspi.c
+++ b/hw/arm/raspi.c
@@ -327,6 +327,7 @@ static void raspi2b_machine_class_init(ObjectClass *oc, void *data)
     MachineClass *mc = MACHINE_CLASS(oc);
     RaspiMachineClass *rmc = RASPI_MACHINE_CLASS(oc);
 
+    mc->alias = "raspi2";
     rmc->board_rev = 0xa21041;
     raspi_machine_class_common_init(mc, rmc->board_rev);
 };
@@ -337,6 +338,7 @@ static void raspi3b_machine_class_init(ObjectClass *oc, void *data)
     MachineClass *mc = MACHINE_CLASS(oc);
     RaspiMachineClass *rmc = RASPI_MACHINE_CLASS(oc);
 
+    mc->alias = "raspi3";
     rmc->board_rev = 0xa02082;
     raspi_machine_class_common_init(mc, rmc->board_rev);
 };
@@ -344,12 +346,12 @@ static void raspi3b_machine_class_init(ObjectClass *oc, void *data)
 
 static const TypeInfo raspi_machine_types[] = {
     {
-        .name           = MACHINE_TYPE_NAME("raspi2"),
+        .name           = MACHINE_TYPE_NAME("raspi2b"),
         .parent         = TYPE_RASPI_MACHINE,
         .class_init     = raspi2b_machine_class_init,
 #ifdef TARGET_AARCH64
     }, {
-        .name           = MACHINE_TYPE_NAME("raspi3"),
+        .name           = MACHINE_TYPE_NAME("raspi3b"),
         .parent         = TYPE_RASPI_MACHINE,
         .class_init     = raspi3b_machine_class_init,
 #endif
-- 
2.26.2



^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH v3 6/8] hw/arm/raspi: Introduce RaspiProcessorId enum
  2020-09-21  7:56 [PATCH v3 0/8] hw/arm/raspi: QOM housekeeping to be able to add more machines Philippe Mathieu-Daudé
                   ` (4 preceding siblings ...)
  2020-09-21  7:56 ` [PATCH v3 5/8] hw/arm/raspi: Use more specific machine names Philippe Mathieu-Daudé
@ 2020-09-21  7:56 ` Philippe Mathieu-Daudé
  2020-09-21  7:56 ` [PATCH v3 7/8] hw/arm/raspi: Use RaspiProcessorId to set the firmware load address Philippe Mathieu-Daudé
  2020-09-21  7:56 ` [PATCH v3 8/8] hw/arm/raspi: Remove use of the 'version' value in the board code Philippe Mathieu-Daudé
  7 siblings, 0 replies; 14+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-09-21  7:56 UTC (permalink / raw)
  To: qemu-devel
  Cc: Peter Maydell, Philippe Mathieu-Daudé,
	Andrew Baumann, Paul Zimmerman, qemu-arm, Luc Michel

As we only support a reduced set of the REV_CODE_PROCESSOR id
encoded in the board revision, define the PROCESSOR_ID values
as an enum. We can simplify the board_soc_type and cores_count
methods.

Reviewed-by: Luc Michel <luc.michel@greensocs.com>
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
 hw/arm/raspi.c | 45 +++++++++++++++++++++------------------------
 1 file changed, 21 insertions(+), 24 deletions(-)

diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
index 3426521379e..0d8e5a34c78 100644
--- a/hw/arm/raspi.c
+++ b/hw/arm/raspi.c
@@ -69,16 +69,33 @@ FIELD(REV_CODE, MANUFACTURER,      16, 4);
 FIELD(REV_CODE, MEMORY_SIZE,       20, 3);
 FIELD(REV_CODE, STYLE,             23, 1);
 
+typedef enum RaspiProcessorId {
+    PROCESSOR_ID_BCM2836 = 1,
+    PROCESSOR_ID_BCM2837 = 2,
+} RaspiProcessorId;
+
+static const struct {
+    const char *type;
+    int cores_count;
+} soc_property[] = {
+    [PROCESSOR_ID_BCM2836] = {TYPE_BCM2836, BCM283X_NCPUS},
+    [PROCESSOR_ID_BCM2837] = {TYPE_BCM2837, BCM283X_NCPUS},
+};
+
 static uint64_t board_ram_size(uint32_t board_rev)
 {
     assert(FIELD_EX32(board_rev, REV_CODE, STYLE)); /* Only new style */
     return 256 * MiB << FIELD_EX32(board_rev, REV_CODE, MEMORY_SIZE);
 }
 
-static int board_processor_id(uint32_t board_rev)
+static RaspiProcessorId board_processor_id(uint32_t board_rev)
 {
+    int proc_id = FIELD_EX32(board_rev, REV_CODE, PROCESSOR);
+
     assert(FIELD_EX32(board_rev, REV_CODE, STYLE)); /* Only new style */
-    return FIELD_EX32(board_rev, REV_CODE, PROCESSOR);
+    assert(proc_id < ARRAY_SIZE(soc_property) && soc_property[proc_id].type);
+
+    return proc_id;
 }
 
 static int board_version(uint32_t board_rev)
@@ -88,32 +105,12 @@ static int board_version(uint32_t board_rev)
 
 static const char *board_soc_type(uint32_t board_rev)
 {
-    static const char *soc_types[] = {
-        NULL, TYPE_BCM2836, TYPE_BCM2837,
-    };
-    int proc_id = board_processor_id(board_rev);
-
-    if (proc_id >= ARRAY_SIZE(soc_types) || !soc_types[proc_id]) {
-        error_report("Unsupported processor id '%d' (board revision: 0x%x)",
-                     proc_id, board_rev);
-        exit(1);
-    }
-    return soc_types[proc_id];
+    return soc_property[board_processor_id(board_rev)].type;
 }
 
 static int cores_count(uint32_t board_rev)
 {
-    static const int soc_cores_count[] = {
-        0, BCM283X_NCPUS, BCM283X_NCPUS,
-    };
-    int proc_id = board_processor_id(board_rev);
-
-    if (proc_id >= ARRAY_SIZE(soc_cores_count) || !soc_cores_count[proc_id]) {
-        error_report("Unsupported processor id '%d' (board revision: 0x%x)",
-                     proc_id, board_rev);
-        exit(1);
-    }
-    return soc_cores_count[proc_id];
+    return soc_property[board_processor_id(board_rev)].cores_count;
 }
 
 static const char *board_type(uint32_t board_rev)
-- 
2.26.2



^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH v3 7/8] hw/arm/raspi: Use RaspiProcessorId to set the firmware load address
  2020-09-21  7:56 [PATCH v3 0/8] hw/arm/raspi: QOM housekeeping to be able to add more machines Philippe Mathieu-Daudé
                   ` (5 preceding siblings ...)
  2020-09-21  7:56 ` [PATCH v3 6/8] hw/arm/raspi: Introduce RaspiProcessorId enum Philippe Mathieu-Daudé
@ 2020-09-21  7:56 ` Philippe Mathieu-Daudé
  2020-09-21 16:41   ` Philippe Mathieu-Daudé
  2020-09-21 19:59   ` Luc Michel
  2020-09-21  7:56 ` [PATCH v3 8/8] hw/arm/raspi: Remove use of the 'version' value in the board code Philippe Mathieu-Daudé
  7 siblings, 2 replies; 14+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-09-21  7:56 UTC (permalink / raw)
  To: qemu-devel
  Cc: Peter Maydell, Philippe Mathieu-Daudé,
	Andrew Baumann, Paul Zimmerman, qemu-arm, Luc Michel

The firmware load address depends of the SoC ("processor id") used,
not of the version of the board.

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
 hw/arm/raspi.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
index 0d8e5a34c78..ae98a2fbfca 100644
--- a/hw/arm/raspi.c
+++ b/hw/arm/raspi.c
@@ -238,7 +238,8 @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
      * the normal Linux boot process
      */
     if (machine->firmware) {
-        hwaddr firmware_addr = version == 3 ? FIRMWARE_ADDR_3 : FIRMWARE_ADDR_2;
+        hwaddr firmware_addr = processor_id <= PROCESSOR_ID_BCM2836
+                             ? FIRMWARE_ADDR_2 : FIRMWARE_ADDR_3;
         /* load the firmware image (typically kernel.img) */
         r = load_image_targphys(machine->firmware, firmware_addr,
                                 ram_size - firmware_addr);
-- 
2.26.2



^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH v3 8/8] hw/arm/raspi: Remove use of the 'version' value in the board code
  2020-09-21  7:56 [PATCH v3 0/8] hw/arm/raspi: QOM housekeeping to be able to add more machines Philippe Mathieu-Daudé
                   ` (6 preceding siblings ...)
  2020-09-21  7:56 ` [PATCH v3 7/8] hw/arm/raspi: Use RaspiProcessorId to set the firmware load address Philippe Mathieu-Daudé
@ 2020-09-21  7:56 ` Philippe Mathieu-Daudé
  7 siblings, 0 replies; 14+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-09-21  7:56 UTC (permalink / raw)
  To: qemu-devel
  Cc: Peter Maydell, Philippe Mathieu-Daudé,
	Andrew Baumann, Paul Zimmerman, qemu-arm, Luc Michel

We expected the 'version' ID to match the board processor ID,
but this is not always true (for example boards with revision
id 0xa02042/0xa22042 are Raspberry Pi 2 with a BCM2837 SoC).
This was not important because we were not modelling them, but
since the recent refactor now allow to model these boards, it
is safer to check the processor id directly. Remove the version
check.

Suggested-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Luc Michel <luc.michel@greensocs.com>
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
 hw/arm/raspi.c | 29 +++++++++++++----------------
 1 file changed, 13 insertions(+), 16 deletions(-)

diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
index ae98a2fbfca..b5b30f0f38f 100644
--- a/hw/arm/raspi.c
+++ b/hw/arm/raspi.c
@@ -98,11 +98,6 @@ static RaspiProcessorId board_processor_id(uint32_t board_rev)
     return proc_id;
 }
 
-static int board_version(uint32_t board_rev)
-{
-    return board_processor_id(board_rev) + 1;
-}
-
 static const char *board_soc_type(uint32_t board_rev)
 {
     return soc_property[board_processor_id(board_rev)].type;
@@ -201,7 +196,8 @@ static void reset_secondary(ARMCPU *cpu, const struct arm_boot_info *info)
     cpu_set_pc(cs, info->smp_loader_start);
 }
 
-static void setup_boot(MachineState *machine, int version, size_t ram_size)
+static void setup_boot(MachineState *machine, RaspiProcessorId processor_id,
+                       size_t ram_size)
 {
     RaspiMachineState *s = RASPI_MACHINE(machine);
     int r;
@@ -210,12 +206,13 @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
     s->binfo.ram_size = ram_size;
     s->binfo.nb_cpus = machine->smp.cpus;
 
-    if (version <= 2) {
-        /* The rpi1 and 2 require some custom setup code to run in Secure
-         * mode before booting a kernel (to set up the SMC vectors so
-         * that we get a no-op SMC; this is used by Linux to call the
+    if (processor_id <= PROCESSOR_ID_BCM2836) {
+        /*
+         * The BCM2835 and BCM2836 require some custom setup code to run
+         * in Secure mode before booting a kernel (to set up the SMC vectors
+         * so that we get a no-op SMC; this is used by Linux to call the
          * firmware for some cache maintenance operations.
-         * The rpi3 doesn't need this.
+         * The BCM2837 doesn't need this.
          */
         s->binfo.board_setup_addr = BOARDSETUP_ADDR;
         s->binfo.write_board_setup = write_board_setup;
@@ -223,10 +220,10 @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
         s->binfo.secure_boot = true;
     }
 
-    /* Pi2 and Pi3 requires SMP setup */
-    if (version >= 2) {
+    /* BCM2836 and BCM2837 requires SMP setup */
+    if (processor_id >= PROCESSOR_ID_BCM2836) {
         s->binfo.smp_loader_start = SMPBOOT_ADDR;
-        if (version == 2) {
+        if (processor_id == PROCESSOR_ID_BCM2836) {
             s->binfo.write_secondary_boot = write_smpboot;
         } else {
             s->binfo.write_secondary_boot = write_smpboot64;
@@ -260,7 +257,6 @@ static void raspi_machine_init(MachineState *machine)
     RaspiMachineClass *mc = RASPI_MACHINE_GET_CLASS(machine);
     RaspiMachineState *s = RASPI_MACHINE(machine);
     uint32_t board_rev = mc->board_rev;
-    int version = board_version(board_rev);
     uint64_t ram_size = board_ram_size(board_rev);
     uint32_t vcram_size;
     DriveInfo *di;
@@ -301,7 +297,8 @@ static void raspi_machine_init(MachineState *machine)
 
     vcram_size = object_property_get_uint(OBJECT(&s->soc), "vcram-size",
                                           &error_abort);
-    setup_boot(machine, version, machine->ram_size - vcram_size);
+    setup_boot(machine, board_processor_id(mc->board_rev),
+               machine->ram_size - vcram_size);
 }
 
 static void raspi_machine_class_common_init(MachineClass *mc,
-- 
2.26.2



^ permalink raw reply related	[flat|nested] 14+ messages in thread

* Re: [PATCH v3 7/8] hw/arm/raspi: Use RaspiProcessorId to set the firmware load address
  2020-09-21  7:56 ` [PATCH v3 7/8] hw/arm/raspi: Use RaspiProcessorId to set the firmware load address Philippe Mathieu-Daudé
@ 2020-09-21 16:41   ` Philippe Mathieu-Daudé
  2020-09-21 19:59   ` Luc Michel
  1 sibling, 0 replies; 14+ messages in thread
From: Philippe Mathieu-Daudé @ 2020-09-21 16:41 UTC (permalink / raw)
  To: qemu-devel
  Cc: Peter Maydell, qemu-arm, Luc Michel, Andrew Baumann, Paul Zimmerman

On 9/21/20 9:56 AM, Philippe Mathieu-Daudé wrote:
> The firmware load address depends of the SoC ("processor id") used,
> not of the version of the board.
> 

I forgot:
Suggested-by: Luc Michel <luc.michel@greensocs.com>

> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
> ---
>  hw/arm/raspi.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
> index 0d8e5a34c78..ae98a2fbfca 100644
> --- a/hw/arm/raspi.c
> +++ b/hw/arm/raspi.c
> @@ -238,7 +238,8 @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
>       * the normal Linux boot process
>       */
>      if (machine->firmware) {
> -        hwaddr firmware_addr = version == 3 ? FIRMWARE_ADDR_3 : FIRMWARE_ADDR_2;
> +        hwaddr firmware_addr = processor_id <= PROCESSOR_ID_BCM2836
> +                             ? FIRMWARE_ADDR_2 : FIRMWARE_ADDR_3;
>          /* load the firmware image (typically kernel.img) */
>          r = load_image_targphys(machine->firmware, firmware_addr,
>                                  ram_size - firmware_addr);
> 


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH v3 1/8] hw/arm/raspi: Display the board revision in the machine description
  2020-09-21  7:56 ` [PATCH v3 1/8] hw/arm/raspi: Display the board revision in the machine description Philippe Mathieu-Daudé
@ 2020-09-21 19:53   ` Luc Michel
  0 siblings, 0 replies; 14+ messages in thread
From: Luc Michel @ 2020-09-21 19:53 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, qemu-devel
  Cc: Peter Maydell, qemu-arm, Andrew Baumann, Paul Zimmerman

On 9/21/20 9:56 AM, Philippe Mathieu-Daudé wrote:
> Display the board revision in the machine description.
> 
> Before:
> 
>    $ qemu-system-aarch64 -M help | fgrep raspi
>    raspi2               Raspberry Pi 2B
>    raspi3               Raspberry Pi 3B
> 
> After:
> 
>    raspi2               Raspberry Pi 2B (revision 1.1)
>    raspi3               Raspberry Pi 3B (revision 1.2)
> 
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>

Reviewed-by: Luc Michel <luc.michel@greensocs.com>

> ---
>   hw/arm/raspi.c | 4 +++-
>   1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
> index 811eaf52ff5..46d9ed7f054 100644
> --- a/hw/arm/raspi.c
> +++ b/hw/arm/raspi.c
> @@ -312,7 +312,9 @@ static void raspi_machine_class_init(ObjectClass *oc, void *data)
>       uint32_t board_rev = (uint32_t)(uintptr_t)data;
>   
>       rmc->board_rev = board_rev;
> -    mc->desc = g_strdup_printf("Raspberry Pi %s", board_type(board_rev));
> +    mc->desc = g_strdup_printf("Raspberry Pi %s (revision 1.%u)",
> +                               board_type(board_rev),
> +                               FIELD_EX32(board_rev, REV_CODE, REVISION));
>       mc->init = raspi_machine_init;
>       mc->block_default_type = IF_SD;
>       mc->no_parallel = 1;
> 


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH v3 2/8] hw/arm/raspi: Load the firmware on the first core
  2020-09-21  7:56 ` [PATCH v3 2/8] hw/arm/raspi: Load the firmware on the first core Philippe Mathieu-Daudé
@ 2020-09-21 19:55   ` Luc Michel
  0 siblings, 0 replies; 14+ messages in thread
From: Luc Michel @ 2020-09-21 19:55 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, qemu-devel
  Cc: Peter Maydell, qemu-arm, Andrew Baumann, Paul Zimmerman

On 9/21/20 9:56 AM, Philippe Mathieu-Daudé wrote:
> The 'first_cpu' is more a QEMU accelerator-related concept
> than a variable the machine requires to use.
> Since the machine is aware of its CPUs, directly use the
> first one to load the firmware.
> 
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>

Reviewed-by: Luc Michel <luc.michel@greensocs.com>

> ---
>   hw/arm/raspi.c | 3 ++-
>   1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
> index 46d9ed7f054..8716a80a75e 100644
> --- a/hw/arm/raspi.c
> +++ b/hw/arm/raspi.c
> @@ -205,6 +205,7 @@ static void reset_secondary(ARMCPU *cpu, const struct arm_boot_info *info)
>   
>   static void setup_boot(MachineState *machine, int version, size_t ram_size)
>   {
> +    RaspiMachineState *s = RASPI_MACHINE(machine);
>       static struct arm_boot_info binfo;
>       int r;
>   
> @@ -253,7 +254,7 @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
>           binfo.firmware_loaded = true;
>       }
>   
> -    arm_load_kernel(ARM_CPU(first_cpu), machine, &binfo);
> +    arm_load_kernel(&s->soc.cpu[0].core, machine, &binfo);
>   }
>   
>   static void raspi_machine_init(MachineState *machine)
> 


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH v3 3/8] hw/arm/raspi: Move arm_boot_info structure to RaspiMachineState
  2020-09-21  7:56 ` [PATCH v3 3/8] hw/arm/raspi: Move arm_boot_info structure to RaspiMachineState Philippe Mathieu-Daudé
@ 2020-09-21 19:55   ` Luc Michel
  0 siblings, 0 replies; 14+ messages in thread
From: Luc Michel @ 2020-09-21 19:55 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, qemu-devel
  Cc: Peter Maydell, qemu-arm, Andrew Baumann, Paul Zimmerman

On 9/21/20 9:56 AM, Philippe Mathieu-Daudé wrote:
> The arm_boot_info structure belong to the machine,
> move it to RaspiMachineState.
> 
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>

Reviewed-by: Luc Michel <luc.michel@greensocs.com>

> ---
>   hw/arm/raspi.c | 30 +++++++++++++++---------------
>   1 file changed, 15 insertions(+), 15 deletions(-)
> 
> diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
> index 8716a80a75e..16e6c83c925 100644
> --- a/hw/arm/raspi.c
> +++ b/hw/arm/raspi.c
> @@ -41,6 +41,7 @@ struct RaspiMachineState {
>       MachineState parent_obj;
>       /*< public >*/
>       BCM283XState soc;
> +    struct arm_boot_info binfo;
>   };
>   typedef struct RaspiMachineState RaspiMachineState;
>   
> @@ -206,12 +207,11 @@ static void reset_secondary(ARMCPU *cpu, const struct arm_boot_info *info)
>   static void setup_boot(MachineState *machine, int version, size_t ram_size)
>   {
>       RaspiMachineState *s = RASPI_MACHINE(machine);
> -    static struct arm_boot_info binfo;
>       int r;
>   
> -    binfo.board_id = MACH_TYPE_BCM2708;
> -    binfo.ram_size = ram_size;
> -    binfo.nb_cpus = machine->smp.cpus;
> +    s->binfo.board_id = MACH_TYPE_BCM2708;
> +    s->binfo.ram_size = ram_size;
> +    s->binfo.nb_cpus = machine->smp.cpus;
>   
>       if (version <= 2) {
>           /* The rpi1 and 2 require some custom setup code to run in Secure
> @@ -220,21 +220,21 @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
>            * firmware for some cache maintenance operations.
>            * The rpi3 doesn't need this.
>            */
> -        binfo.board_setup_addr = BOARDSETUP_ADDR;
> -        binfo.write_board_setup = write_board_setup;
> -        binfo.secure_board_setup = true;
> -        binfo.secure_boot = true;
> +        s->binfo.board_setup_addr = BOARDSETUP_ADDR;
> +        s->binfo.write_board_setup = write_board_setup;
> +        s->binfo.secure_board_setup = true;
> +        s->binfo.secure_boot = true;
>       }
>   
>       /* Pi2 and Pi3 requires SMP setup */
>       if (version >= 2) {
> -        binfo.smp_loader_start = SMPBOOT_ADDR;
> +        s->binfo.smp_loader_start = SMPBOOT_ADDR;
>           if (version == 2) {
> -            binfo.write_secondary_boot = write_smpboot;
> +            s->binfo.write_secondary_boot = write_smpboot;
>           } else {
> -            binfo.write_secondary_boot = write_smpboot64;
> +            s->binfo.write_secondary_boot = write_smpboot64;
>           }
> -        binfo.secondary_cpu_reset_hook = reset_secondary;
> +        s->binfo.secondary_cpu_reset_hook = reset_secondary;
>       }
>   
>       /* If the user specified a "firmware" image (e.g. UEFI), we bypass
> @@ -250,11 +250,11 @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
>               exit(1);
>           }
>   
> -        binfo.entry = firmware_addr;
> -        binfo.firmware_loaded = true;
> +        s->binfo.entry = firmware_addr;
> +        s->binfo.firmware_loaded = true;
>       }
>   
> -    arm_load_kernel(&s->soc.cpu[0].core, machine, &binfo);
> +    arm_load_kernel(&s->soc.cpu[0].core, machine, &s->binfo);
>   }
>   
>   static void raspi_machine_init(MachineState *machine)
> 


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH v3 7/8] hw/arm/raspi: Use RaspiProcessorId to set the firmware load address
  2020-09-21  7:56 ` [PATCH v3 7/8] hw/arm/raspi: Use RaspiProcessorId to set the firmware load address Philippe Mathieu-Daudé
  2020-09-21 16:41   ` Philippe Mathieu-Daudé
@ 2020-09-21 19:59   ` Luc Michel
  1 sibling, 0 replies; 14+ messages in thread
From: Luc Michel @ 2020-09-21 19:59 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, qemu-devel
  Cc: Peter Maydell, qemu-arm, Andrew Baumann, Paul Zimmerman

Hi Phil,

Just two small typos in the commit message.

On 9/21/20 9:56 AM, Philippe Mathieu-Daudé wrote:
> The firmware load address depends of the SoC ("processor id") used,
"depends on"
> not of the version of the board.
"not on"

Otherwise:

Reviewed-by: Luc Michel <luc.michel@greensocs.com>


> 
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
> ---
>   hw/arm/raspi.c | 3 ++-
>   1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c
> index 0d8e5a34c78..ae98a2fbfca 100644
> --- a/hw/arm/raspi.c
> +++ b/hw/arm/raspi.c
> @@ -238,7 +238,8 @@ static void setup_boot(MachineState *machine, int version, size_t ram_size)
>        * the normal Linux boot process
>        */
>       if (machine->firmware) {
> -        hwaddr firmware_addr = version == 3 ? FIRMWARE_ADDR_3 : FIRMWARE_ADDR_2;
> +        hwaddr firmware_addr = processor_id <= PROCESSOR_ID_BCM2836
> +                             ? FIRMWARE_ADDR_2 : FIRMWARE_ADDR_3;
>           /* load the firmware image (typically kernel.img) */
>           r = load_image_targphys(machine->firmware, firmware_addr,
>                                   ram_size - firmware_addr);
> 


^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2020-09-21 20:09 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-09-21  7:56 [PATCH v3 0/8] hw/arm/raspi: QOM housekeeping to be able to add more machines Philippe Mathieu-Daudé
2020-09-21  7:56 ` [PATCH v3 1/8] hw/arm/raspi: Display the board revision in the machine description Philippe Mathieu-Daudé
2020-09-21 19:53   ` Luc Michel
2020-09-21  7:56 ` [PATCH v3 2/8] hw/arm/raspi: Load the firmware on the first core Philippe Mathieu-Daudé
2020-09-21 19:55   ` Luc Michel
2020-09-21  7:56 ` [PATCH v3 3/8] hw/arm/raspi: Move arm_boot_info structure to RaspiMachineState Philippe Mathieu-Daudé
2020-09-21 19:55   ` Luc Michel
2020-09-21  7:56 ` [PATCH v3 4/8] hw/arm/raspi: Avoid using TypeInfo::class_data pointer Philippe Mathieu-Daudé
2020-09-21  7:56 ` [PATCH v3 5/8] hw/arm/raspi: Use more specific machine names Philippe Mathieu-Daudé
2020-09-21  7:56 ` [PATCH v3 6/8] hw/arm/raspi: Introduce RaspiProcessorId enum Philippe Mathieu-Daudé
2020-09-21  7:56 ` [PATCH v3 7/8] hw/arm/raspi: Use RaspiProcessorId to set the firmware load address Philippe Mathieu-Daudé
2020-09-21 16:41   ` Philippe Mathieu-Daudé
2020-09-21 19:59   ` Luc Michel
2020-09-21  7:56 ` [PATCH v3 8/8] hw/arm/raspi: Remove use of the 'version' value in the board code Philippe Mathieu-Daudé

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).