* [PATCH v2 1/7] hw/arm/aspeed: Move aspeed_board_init_flashes() to common SoC code
  2025-09-24  5:55 [PATCH v2 0/7] Support VBOOTROM to ast2700fc machine Jamin Lin via
@ 2025-09-24  5:55 ` Jamin Lin via
  2025-09-24  9:47   ` Cédric Le Goater
  2025-09-24  5:55 ` [PATCH v2 2/7] hw/arm/aspeed: Move write_boot_rom " Jamin Lin via
                   ` (5 subsequent siblings)
  6 siblings, 1 reply; 17+ messages in thread
From: Jamin Lin via @ 2025-09-24  5:55 UTC (permalink / raw)
  To: Cédric Le Goater, Peter Maydell, Steven Lee, Troy Lee,
	Andrew Jeffery, Joel Stanley, open list:ASPEED BMCs,
	open list:All patches CC here
  Cc: jamin_lin, troy_lee
Relocate aspeed_board_init_flashes() from hw/arm/aspeed.c into
hw/arm/aspeed_soc_common.c so the helper can be reused by all
ASPEED machines. The API was already declared in
include/hw/arm/aspeed_soc.h; this change moves its
implementation out of the machine file to keep aspeed.c cleaner.
No functional change.
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
---
 hw/arm/aspeed.c            | 22 ----------------------
 hw/arm/aspeed_soc_common.c | 23 +++++++++++++++++++++++
 2 files changed, 23 insertions(+), 22 deletions(-)
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
index d21b21965a..55f0afe0a4 100644
--- a/hw/arm/aspeed.c
+++ b/hw/arm/aspeed.c
@@ -337,28 +337,6 @@ static void aspeed_load_vbootrom(AspeedMachineState *bmc, const char *bios_name,
     }
 }
 
-void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype,
-                                      unsigned int count, int unit0)
-{
-    int i;
-
-    if (!flashtype) {
-        return;
-    }
-
-    for (i = 0; i < count; ++i) {
-        DriveInfo *dinfo = drive_get(IF_MTD, 0, unit0 + i);
-        DeviceState *dev;
-
-        dev = qdev_new(flashtype);
-        if (dinfo) {
-            qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo));
-        }
-        qdev_prop_set_uint8(dev, "cs", i);
-        qdev_realize_and_unref(dev, BUS(s->spi), &error_fatal);
-    }
-}
-
 static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo, bool emmc,
                                bool boot_emmc)
 {
diff --git a/hw/arm/aspeed_soc_common.c b/hw/arm/aspeed_soc_common.c
index 1c4ac93a0f..31b1e683c3 100644
--- a/hw/arm/aspeed_soc_common.c
+++ b/hw/arm/aspeed_soc_common.c
@@ -16,6 +16,7 @@
 #include "hw/misc/unimp.h"
 #include "hw/arm/aspeed_soc.h"
 #include "hw/char/serial-mm.h"
+#include "system/blockdev.h"
 
 
 const char *aspeed_soc_cpu_type(AspeedSoCClass *sc)
@@ -124,6 +125,28 @@ void aspeed_mmio_map_unimplemented(AspeedSoCState *s, SysBusDevice *dev,
                                         sysbus_mmio_get_region(dev, 0), -1000);
 }
 
+void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype,
+                               unsigned int count, int unit0)
+{
+    int i;
+
+    if (!flashtype) {
+        return;
+    }
+
+    for (i = 0; i < count; ++i) {
+        DriveInfo *dinfo = drive_get(IF_MTD, 0, unit0 + i);
+        DeviceState *dev;
+
+        dev = qdev_new(flashtype);
+        if (dinfo) {
+            qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo));
+        }
+        qdev_prop_set_uint8(dev, "cs", i);
+        qdev_realize_and_unref(dev, BUS(s->spi), &error_fatal);
+    }
+}
+
 static void aspeed_soc_realize(DeviceState *dev, Error **errp)
 {
     AspeedSoCState *s = ASPEED_SOC(dev);
-- 
2.43.0
^ permalink raw reply related	[flat|nested] 17+ messages in thread* Re: [PATCH v2 1/7] hw/arm/aspeed: Move aspeed_board_init_flashes() to common SoC code
  2025-09-24  5:55 ` [PATCH v2 1/7] hw/arm/aspeed: Move aspeed_board_init_flashes() to common SoC code Jamin Lin via
@ 2025-09-24  9:47   ` Cédric Le Goater
  0 siblings, 0 replies; 17+ messages in thread
From: Cédric Le Goater @ 2025-09-24  9:47 UTC (permalink / raw)
  To: Jamin Lin, Peter Maydell, Steven Lee, Troy Lee, Andrew Jeffery,
	Joel Stanley, open list:ASPEED BMCs,
	open list:All patches CC here
  Cc: troy_lee
On 9/24/25 07:55, Jamin Lin wrote:
> Relocate aspeed_board_init_flashes() from hw/arm/aspeed.c into
> hw/arm/aspeed_soc_common.c so the helper can be reused by all
> ASPEED machines. The API was already declared in
> include/hw/arm/aspeed_soc.h; this change moves its
> implementation out of the machine file to keep aspeed.c cleaner.
> 
> No functional change.
> 
> Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
Reviewed-by: Cédric Le Goater <clg@redhat.com>
Thanks,
C.
> ---
>   hw/arm/aspeed.c            | 22 ----------------------
>   hw/arm/aspeed_soc_common.c | 23 +++++++++++++++++++++++
>   2 files changed, 23 insertions(+), 22 deletions(-)
> 
> diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
> index d21b21965a..55f0afe0a4 100644
> --- a/hw/arm/aspeed.c
> +++ b/hw/arm/aspeed.c
> @@ -337,28 +337,6 @@ static void aspeed_load_vbootrom(AspeedMachineState *bmc, const char *bios_name,
>       }
>   }
>   
> -void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype,
> -                                      unsigned int count, int unit0)
> -{
> -    int i;
> -
> -    if (!flashtype) {
> -        return;
> -    }
> -
> -    for (i = 0; i < count; ++i) {
> -        DriveInfo *dinfo = drive_get(IF_MTD, 0, unit0 + i);
> -        DeviceState *dev;
> -
> -        dev = qdev_new(flashtype);
> -        if (dinfo) {
> -            qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo));
> -        }
> -        qdev_prop_set_uint8(dev, "cs", i);
> -        qdev_realize_and_unref(dev, BUS(s->spi), &error_fatal);
> -    }
> -}
> -
>   static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo, bool emmc,
>                                  bool boot_emmc)
>   {
> diff --git a/hw/arm/aspeed_soc_common.c b/hw/arm/aspeed_soc_common.c
> index 1c4ac93a0f..31b1e683c3 100644
> --- a/hw/arm/aspeed_soc_common.c
> +++ b/hw/arm/aspeed_soc_common.c
> @@ -16,6 +16,7 @@
>   #include "hw/misc/unimp.h"
>   #include "hw/arm/aspeed_soc.h"
>   #include "hw/char/serial-mm.h"
> +#include "system/blockdev.h"
>   
>   
>   const char *aspeed_soc_cpu_type(AspeedSoCClass *sc)
> @@ -124,6 +125,28 @@ void aspeed_mmio_map_unimplemented(AspeedSoCState *s, SysBusDevice *dev,
>                                           sysbus_mmio_get_region(dev, 0), -1000);
>   }
>   
> +void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype,
> +                               unsigned int count, int unit0)
> +{
> +    int i;
> +
> +    if (!flashtype) {
> +        return;
> +    }
> +
> +    for (i = 0; i < count; ++i) {
> +        DriveInfo *dinfo = drive_get(IF_MTD, 0, unit0 + i);
> +        DeviceState *dev;
> +
> +        dev = qdev_new(flashtype);
> +        if (dinfo) {
> +            qdev_prop_set_drive(dev, "drive", blk_by_legacy_dinfo(dinfo));
> +        }
> +        qdev_prop_set_uint8(dev, "cs", i);
> +        qdev_realize_and_unref(dev, BUS(s->spi), &error_fatal);
> +    }
> +}
> +
>   static void aspeed_soc_realize(DeviceState *dev, Error **errp)
>   {
>       AspeedSoCState *s = ASPEED_SOC(dev);
^ permalink raw reply	[flat|nested] 17+ messages in thread
* [PATCH v2 2/7] hw/arm/aspeed: Move write_boot_rom to common SoC code
  2025-09-24  5:55 [PATCH v2 0/7] Support VBOOTROM to ast2700fc machine Jamin Lin via
  2025-09-24  5:55 ` [PATCH v2 1/7] hw/arm/aspeed: Move aspeed_board_init_flashes() to common SoC code Jamin Lin via
@ 2025-09-24  5:55 ` Jamin Lin via
  2025-09-24  9:47   ` Cédric Le Goater
  2025-09-24  5:55 ` [PATCH v2 3/7] hw/arm/aspeed: Move aspeed_install_boot_rom " Jamin Lin via
                   ` (4 subsequent siblings)
  6 siblings, 1 reply; 17+ messages in thread
From: Jamin Lin via @ 2025-09-24  5:55 UTC (permalink / raw)
  To: Cédric Le Goater, Peter Maydell, Steven Lee, Troy Lee,
	Andrew Jeffery, Joel Stanley, open list:ASPEED BMCs,
	open list:All patches CC here
  Cc: jamin_lin, troy_lee
Move the write_boot_rom helper from hw/arm/aspeed.c into
hw/arm/aspeed_soc_common.c so it can be reused by all ASPEED
machines. Export the API as aspeed_write_boot_rom() in
include/hw/arm/aspeed_soc.h and update the existing call site
to use the new helper.
No functional change.
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
---
 include/hw/arm/aspeed_soc.h |  2 ++
 hw/arm/aspeed.c             | 33 ++-------------------------------
 hw/arm/aspeed_soc_common.c  | 31 +++++++++++++++++++++++++++++++
 3 files changed, 35 insertions(+), 31 deletions(-)
diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
index aaf518d179..5567bdcb69 100644
--- a/include/hw/arm/aspeed_soc.h
+++ b/include/hw/arm/aspeed_soc.h
@@ -312,6 +312,8 @@ void aspeed_mmio_map_unimplemented(AspeedSoCState *s, SysBusDevice *dev,
                                    uint64_t size);
 void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype,
                                unsigned int count, int unit0);
+void aspeed_write_boot_rom(BlockBackend *blk, hwaddr addr, size_t rom_size,
+                           Error **errp);
 
 static inline int aspeed_uart_index(int uart_dev)
 {
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
index 55f0afe0a4..4d0d935836 100644
--- a/hw/arm/aspeed.c
+++ b/hw/arm/aspeed.c
@@ -263,35 +263,6 @@ static void aspeed_reset_secondary(ARMCPU *cpu,
     cpu_set_pc(cs, info->smp_loader_start);
 }
 
-static void write_boot_rom(BlockBackend *blk, hwaddr addr, size_t rom_size,
-                           Error **errp)
-{
-    g_autofree void *storage = NULL;
-    int64_t size;
-
-    /*
-     * The block backend size should have already been 'validated' by
-     * the creation of the m25p80 object.
-     */
-    size = blk_getlength(blk);
-    if (size <= 0) {
-        error_setg(errp, "failed to get flash size");
-        return;
-    }
-
-    if (rom_size > size) {
-        rom_size = size;
-    }
-
-    storage = g_malloc0(rom_size);
-    if (blk_pread(blk, 0, rom_size, storage, 0) < 0) {
-        error_setg(errp, "failed to read the initial flash content");
-        return;
-    }
-
-    rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr);
-}
-
 /*
  * Create a ROM and copy the flash contents at the expected address
  * (0x0). Boots faster than execute-in-place.
@@ -306,8 +277,8 @@ static void aspeed_install_boot_rom(AspeedMachineState *bmc, BlockBackend *blk,
                            &error_abort);
     memory_region_add_subregion_overlap(&soc->spi_boot_container, 0,
                                         &bmc->boot_rom, 1);
-    write_boot_rom(blk, sc->memmap[ASPEED_DEV_SPI_BOOT],
-                   rom_size, &error_abort);
+    aspeed_write_boot_rom(blk, sc->memmap[ASPEED_DEV_SPI_BOOT], rom_size,
+                          &error_abort);
 }
 
 #define VBOOTROM_FILE_NAME  "ast27x0_bootrom.bin"
diff --git a/hw/arm/aspeed_soc_common.c b/hw/arm/aspeed_soc_common.c
index 31b1e683c3..d0a400725f 100644
--- a/hw/arm/aspeed_soc_common.c
+++ b/hw/arm/aspeed_soc_common.c
@@ -17,6 +17,8 @@
 #include "hw/arm/aspeed_soc.h"
 #include "hw/char/serial-mm.h"
 #include "system/blockdev.h"
+#include "system/block-backend.h"
+#include "hw/loader.h"
 
 
 const char *aspeed_soc_cpu_type(AspeedSoCClass *sc)
@@ -147,6 +149,35 @@ void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype,
     }
 }
 
+void aspeed_write_boot_rom(BlockBackend *blk, hwaddr addr, size_t rom_size,
+                           Error **errp)
+{
+    g_autofree void *storage = NULL;
+    int64_t size;
+
+    /*
+     * The block backend size should have already been 'validated' by
+     * the creation of the m25p80 object.
+     */
+    size = blk_getlength(blk);
+    if (size <= 0) {
+        error_setg(errp, "failed to get flash size");
+        return;
+    }
+
+    if (rom_size > size) {
+        rom_size = size;
+    }
+
+    storage = g_malloc0(rom_size);
+    if (blk_pread(blk, 0, rom_size, storage, 0) < 0) {
+        error_setg(errp, "failed to read the initial flash content");
+        return;
+    }
+
+    rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr);
+}
+
 static void aspeed_soc_realize(DeviceState *dev, Error **errp)
 {
     AspeedSoCState *s = ASPEED_SOC(dev);
-- 
2.43.0
^ permalink raw reply related	[flat|nested] 17+ messages in thread* Re: [PATCH v2 2/7] hw/arm/aspeed: Move write_boot_rom to common SoC code
  2025-09-24  5:55 ` [PATCH v2 2/7] hw/arm/aspeed: Move write_boot_rom " Jamin Lin via
@ 2025-09-24  9:47   ` Cédric Le Goater
  0 siblings, 0 replies; 17+ messages in thread
From: Cédric Le Goater @ 2025-09-24  9:47 UTC (permalink / raw)
  To: Jamin Lin, Peter Maydell, Steven Lee, Troy Lee, Andrew Jeffery,
	Joel Stanley, open list:ASPEED BMCs,
	open list:All patches CC here
  Cc: troy_lee
On 9/24/25 07:55, Jamin Lin wrote:
> Move the write_boot_rom helper from hw/arm/aspeed.c into
> hw/arm/aspeed_soc_common.c so it can be reused by all ASPEED
> machines. Export the API as aspeed_write_boot_rom() in
> include/hw/arm/aspeed_soc.h and update the existing call site
> to use the new helper.
> 
> No functional change.
> 
> Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
Reviewed-by: Cédric Le Goater <clg@redhat.com>
Thanks,
C.
> ---
>   include/hw/arm/aspeed_soc.h |  2 ++
>   hw/arm/aspeed.c             | 33 ++-------------------------------
>   hw/arm/aspeed_soc_common.c  | 31 +++++++++++++++++++++++++++++++
>   3 files changed, 35 insertions(+), 31 deletions(-)
> 
> diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
> index aaf518d179..5567bdcb69 100644
> --- a/include/hw/arm/aspeed_soc.h
> +++ b/include/hw/arm/aspeed_soc.h
> @@ -312,6 +312,8 @@ void aspeed_mmio_map_unimplemented(AspeedSoCState *s, SysBusDevice *dev,
>                                      uint64_t size);
>   void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype,
>                                  unsigned int count, int unit0);
> +void aspeed_write_boot_rom(BlockBackend *blk, hwaddr addr, size_t rom_size,
> +                           Error **errp);
>   
>   static inline int aspeed_uart_index(int uart_dev)
>   {
> diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
> index 55f0afe0a4..4d0d935836 100644
> --- a/hw/arm/aspeed.c
> +++ b/hw/arm/aspeed.c
> @@ -263,35 +263,6 @@ static void aspeed_reset_secondary(ARMCPU *cpu,
>       cpu_set_pc(cs, info->smp_loader_start);
>   }
>   
> -static void write_boot_rom(BlockBackend *blk, hwaddr addr, size_t rom_size,
> -                           Error **errp)
> -{
> -    g_autofree void *storage = NULL;
> -    int64_t size;
> -
> -    /*
> -     * The block backend size should have already been 'validated' by
> -     * the creation of the m25p80 object.
> -     */
> -    size = blk_getlength(blk);
> -    if (size <= 0) {
> -        error_setg(errp, "failed to get flash size");
> -        return;
> -    }
> -
> -    if (rom_size > size) {
> -        rom_size = size;
> -    }
> -
> -    storage = g_malloc0(rom_size);
> -    if (blk_pread(blk, 0, rom_size, storage, 0) < 0) {
> -        error_setg(errp, "failed to read the initial flash content");
> -        return;
> -    }
> -
> -    rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr);
> -}
> -
>   /*
>    * Create a ROM and copy the flash contents at the expected address
>    * (0x0). Boots faster than execute-in-place.
> @@ -306,8 +277,8 @@ static void aspeed_install_boot_rom(AspeedMachineState *bmc, BlockBackend *blk,
>                              &error_abort);
>       memory_region_add_subregion_overlap(&soc->spi_boot_container, 0,
>                                           &bmc->boot_rom, 1);
> -    write_boot_rom(blk, sc->memmap[ASPEED_DEV_SPI_BOOT],
> -                   rom_size, &error_abort);
> +    aspeed_write_boot_rom(blk, sc->memmap[ASPEED_DEV_SPI_BOOT], rom_size,
> +                          &error_abort);
>   }
>   
>   #define VBOOTROM_FILE_NAME  "ast27x0_bootrom.bin"
> diff --git a/hw/arm/aspeed_soc_common.c b/hw/arm/aspeed_soc_common.c
> index 31b1e683c3..d0a400725f 100644
> --- a/hw/arm/aspeed_soc_common.c
> +++ b/hw/arm/aspeed_soc_common.c
> @@ -17,6 +17,8 @@
>   #include "hw/arm/aspeed_soc.h"
>   #include "hw/char/serial-mm.h"
>   #include "system/blockdev.h"
> +#include "system/block-backend.h"
> +#include "hw/loader.h"
>   
>   
>   const char *aspeed_soc_cpu_type(AspeedSoCClass *sc)
> @@ -147,6 +149,35 @@ void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype,
>       }
>   }
>   
> +void aspeed_write_boot_rom(BlockBackend *blk, hwaddr addr, size_t rom_size,
> +                           Error **errp)
> +{
> +    g_autofree void *storage = NULL;
> +    int64_t size;
> +
> +    /*
> +     * The block backend size should have already been 'validated' by
> +     * the creation of the m25p80 object.
> +     */
> +    size = blk_getlength(blk);
> +    if (size <= 0) {
> +        error_setg(errp, "failed to get flash size");
> +        return;
> +    }
> +
> +    if (rom_size > size) {
> +        rom_size = size;
> +    }
> +
> +    storage = g_malloc0(rom_size);
> +    if (blk_pread(blk, 0, rom_size, storage, 0) < 0) {
> +        error_setg(errp, "failed to read the initial flash content");
> +        return;
> +    }
> +
> +    rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr);
> +}
> +
>   static void aspeed_soc_realize(DeviceState *dev, Error **errp)
>   {
>       AspeedSoCState *s = ASPEED_SOC(dev);
^ permalink raw reply	[flat|nested] 17+ messages in thread
* [PATCH v2 3/7] hw/arm/aspeed: Move aspeed_install_boot_rom to common SoC code
  2025-09-24  5:55 [PATCH v2 0/7] Support VBOOTROM to ast2700fc machine Jamin Lin via
  2025-09-24  5:55 ` [PATCH v2 1/7] hw/arm/aspeed: Move aspeed_board_init_flashes() to common SoC code Jamin Lin via
  2025-09-24  5:55 ` [PATCH v2 2/7] hw/arm/aspeed: Move write_boot_rom " Jamin Lin via
@ 2025-09-24  5:55 ` Jamin Lin via
  2025-09-24  9:47   ` Cédric Le Goater
  2025-09-24  5:55 ` [PATCH v2 4/7] hw/arm/aspeed: Move aspeed_load_vbootrom " Jamin Lin via
                   ` (3 subsequent siblings)
  6 siblings, 1 reply; 17+ messages in thread
From: Jamin Lin via @ 2025-09-24  5:55 UTC (permalink / raw)
  To: Cédric Le Goater, Peter Maydell, Steven Lee, Troy Lee,
	Andrew Jeffery, Joel Stanley, open list:ASPEED BMCs,
	open list:All patches CC here
  Cc: jamin_lin, troy_lee
Move the boot ROM install helper into common SoC code so it can be reused
by all ASPEED boards, and decouple the API from AspeedMachineState.
Specifically:
 - Move aspeed_install_boot_rom() to hw/arm/aspeed_soc_common.c and
   declare it in include/hw/arm/aspeed_soc.h.
 - Change the helper’s signature to take AspeedSoCState * and a
   MemoryRegion * provided by the caller, instead of AspeedMachineState *.
 - Update aspeed_machine_init() call sites accordingly.
No functional change.
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
---
 include/hw/arm/aspeed_soc.h |  2 ++
 hw/arm/aspeed.c             | 23 +++--------------------
 hw/arm/aspeed_soc_common.c  | 17 +++++++++++++++++
 3 files changed, 22 insertions(+), 20 deletions(-)
diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
index 5567bdcb69..aea210a8e2 100644
--- a/include/hw/arm/aspeed_soc.h
+++ b/include/hw/arm/aspeed_soc.h
@@ -314,6 +314,8 @@ void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype,
                                unsigned int count, int unit0);
 void aspeed_write_boot_rom(BlockBackend *blk, hwaddr addr, size_t rom_size,
                            Error **errp);
+void aspeed_install_boot_rom(AspeedSoCState *soc, BlockBackend *blk,
+                             MemoryRegion *boot_rom, uint64_t rom_size);
 
 static inline int aspeed_uart_index(int uart_dev)
 {
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
index 4d0d935836..429f4c6d77 100644
--- a/hw/arm/aspeed.c
+++ b/hw/arm/aspeed.c
@@ -263,24 +263,6 @@ static void aspeed_reset_secondary(ARMCPU *cpu,
     cpu_set_pc(cs, info->smp_loader_start);
 }
 
-/*
- * Create a ROM and copy the flash contents at the expected address
- * (0x0). Boots faster than execute-in-place.
- */
-static void aspeed_install_boot_rom(AspeedMachineState *bmc, BlockBackend *blk,
-                                    uint64_t rom_size)
-{
-    AspeedSoCState *soc = bmc->soc;
-    AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(soc);
-
-    memory_region_init_rom(&bmc->boot_rom, NULL, "aspeed.boot_rom", rom_size,
-                           &error_abort);
-    memory_region_add_subregion_overlap(&soc->spi_boot_container, 0,
-                                        &bmc->boot_rom, 1);
-    aspeed_write_boot_rom(blk, sc->memmap[ASPEED_DEV_SPI_BOOT], rom_size,
-                          &error_abort);
-}
-
 #define VBOOTROM_FILE_NAME  "ast27x0_bootrom.bin"
 
 /*
@@ -460,9 +442,10 @@ static void aspeed_machine_init(MachineState *machine)
 
         if (fmc0 && !boot_emmc) {
             uint64_t rom_size = memory_region_size(&bmc->soc->spi_boot);
-            aspeed_install_boot_rom(bmc, fmc0, rom_size);
+            aspeed_install_boot_rom(bmc->soc, fmc0, &bmc->boot_rom, rom_size);
         } else if (emmc0) {
-            aspeed_install_boot_rom(bmc, blk_by_legacy_dinfo(emmc0), 64 * KiB);
+            aspeed_install_boot_rom(bmc->soc, blk_by_legacy_dinfo(emmc0),
+                                    &bmc->boot_rom, 64 * KiB);
         }
     }
 
diff --git a/hw/arm/aspeed_soc_common.c b/hw/arm/aspeed_soc_common.c
index d0a400725f..7f104f8de5 100644
--- a/hw/arm/aspeed_soc_common.c
+++ b/hw/arm/aspeed_soc_common.c
@@ -178,6 +178,23 @@ void aspeed_write_boot_rom(BlockBackend *blk, hwaddr addr, size_t rom_size,
     rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr);
 }
 
+/*
+ * Create a ROM and copy the flash contents at the expected address
+ * (0x0). Boots faster than execute-in-place.
+ */
+void aspeed_install_boot_rom(AspeedSoCState *soc, BlockBackend *blk,
+                             MemoryRegion *boot_rom, uint64_t rom_size)
+{
+    AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(soc);
+
+    memory_region_init_rom(boot_rom, NULL, "aspeed.boot_rom", rom_size,
+                           &error_abort);
+    memory_region_add_subregion_overlap(&soc->spi_boot_container, 0,
+                                        boot_rom, 1);
+    aspeed_write_boot_rom(blk, sc->memmap[ASPEED_DEV_SPI_BOOT], rom_size,
+                          &error_abort);
+}
+
 static void aspeed_soc_realize(DeviceState *dev, Error **errp)
 {
     AspeedSoCState *s = ASPEED_SOC(dev);
-- 
2.43.0
^ permalink raw reply related	[flat|nested] 17+ messages in thread* Re: [PATCH v2 3/7] hw/arm/aspeed: Move aspeed_install_boot_rom to common SoC code
  2025-09-24  5:55 ` [PATCH v2 3/7] hw/arm/aspeed: Move aspeed_install_boot_rom " Jamin Lin via
@ 2025-09-24  9:47   ` Cédric Le Goater
  0 siblings, 0 replies; 17+ messages in thread
From: Cédric Le Goater @ 2025-09-24  9:47 UTC (permalink / raw)
  To: Jamin Lin, Peter Maydell, Steven Lee, Troy Lee, Andrew Jeffery,
	Joel Stanley, open list:ASPEED BMCs,
	open list:All patches CC here
  Cc: troy_lee
On 9/24/25 07:55, Jamin Lin wrote:
> Move the boot ROM install helper into common SoC code so it can be reused
> by all ASPEED boards, and decouple the API from AspeedMachineState.
> 
> Specifically:
>   - Move aspeed_install_boot_rom() to hw/arm/aspeed_soc_common.c and
>     declare it in include/hw/arm/aspeed_soc.h.
>   - Change the helper’s signature to take AspeedSoCState * and a
>     MemoryRegion * provided by the caller, instead of AspeedMachineState *.
>   - Update aspeed_machine_init() call sites accordingly.
> 
> No functional change.
> 
> Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
Reviewed-by: Cédric Le Goater <clg@redhat.com>
Thanks,
C.
> ---
>   include/hw/arm/aspeed_soc.h |  2 ++
>   hw/arm/aspeed.c             | 23 +++--------------------
>   hw/arm/aspeed_soc_common.c  | 17 +++++++++++++++++
>   3 files changed, 22 insertions(+), 20 deletions(-)
> 
> diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
> index 5567bdcb69..aea210a8e2 100644
> --- a/include/hw/arm/aspeed_soc.h
> +++ b/include/hw/arm/aspeed_soc.h
> @@ -314,6 +314,8 @@ void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype,
>                                  unsigned int count, int unit0);
>   void aspeed_write_boot_rom(BlockBackend *blk, hwaddr addr, size_t rom_size,
>                              Error **errp);
> +void aspeed_install_boot_rom(AspeedSoCState *soc, BlockBackend *blk,
> +                             MemoryRegion *boot_rom, uint64_t rom_size);
>   
>   static inline int aspeed_uart_index(int uart_dev)
>   {
> diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
> index 4d0d935836..429f4c6d77 100644
> --- a/hw/arm/aspeed.c
> +++ b/hw/arm/aspeed.c
> @@ -263,24 +263,6 @@ static void aspeed_reset_secondary(ARMCPU *cpu,
>       cpu_set_pc(cs, info->smp_loader_start);
>   }
>   
> -/*
> - * Create a ROM and copy the flash contents at the expected address
> - * (0x0). Boots faster than execute-in-place.
> - */
> -static void aspeed_install_boot_rom(AspeedMachineState *bmc, BlockBackend *blk,
> -                                    uint64_t rom_size)
> -{
> -    AspeedSoCState *soc = bmc->soc;
> -    AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(soc);
> -
> -    memory_region_init_rom(&bmc->boot_rom, NULL, "aspeed.boot_rom", rom_size,
> -                           &error_abort);
> -    memory_region_add_subregion_overlap(&soc->spi_boot_container, 0,
> -                                        &bmc->boot_rom, 1);
> -    aspeed_write_boot_rom(blk, sc->memmap[ASPEED_DEV_SPI_BOOT], rom_size,
> -                          &error_abort);
> -}
> -
>   #define VBOOTROM_FILE_NAME  "ast27x0_bootrom.bin"
>   
>   /*
> @@ -460,9 +442,10 @@ static void aspeed_machine_init(MachineState *machine)
>   
>           if (fmc0 && !boot_emmc) {
>               uint64_t rom_size = memory_region_size(&bmc->soc->spi_boot);
> -            aspeed_install_boot_rom(bmc, fmc0, rom_size);
> +            aspeed_install_boot_rom(bmc->soc, fmc0, &bmc->boot_rom, rom_size);
>           } else if (emmc0) {
> -            aspeed_install_boot_rom(bmc, blk_by_legacy_dinfo(emmc0), 64 * KiB);
> +            aspeed_install_boot_rom(bmc->soc, blk_by_legacy_dinfo(emmc0),
> +                                    &bmc->boot_rom, 64 * KiB);
>           }
>       }
>   
> diff --git a/hw/arm/aspeed_soc_common.c b/hw/arm/aspeed_soc_common.c
> index d0a400725f..7f104f8de5 100644
> --- a/hw/arm/aspeed_soc_common.c
> +++ b/hw/arm/aspeed_soc_common.c
> @@ -178,6 +178,23 @@ void aspeed_write_boot_rom(BlockBackend *blk, hwaddr addr, size_t rom_size,
>       rom_add_blob_fixed("aspeed.boot_rom", storage, rom_size, addr);
>   }
>   
> +/*
> + * Create a ROM and copy the flash contents at the expected address
> + * (0x0). Boots faster than execute-in-place.
> + */
> +void aspeed_install_boot_rom(AspeedSoCState *soc, BlockBackend *blk,
> +                             MemoryRegion *boot_rom, uint64_t rom_size)
> +{
> +    AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(soc);
> +
> +    memory_region_init_rom(boot_rom, NULL, "aspeed.boot_rom", rom_size,
> +                           &error_abort);
> +    memory_region_add_subregion_overlap(&soc->spi_boot_container, 0,
> +                                        boot_rom, 1);
> +    aspeed_write_boot_rom(blk, sc->memmap[ASPEED_DEV_SPI_BOOT], rom_size,
> +                          &error_abort);
> +}
> +
>   static void aspeed_soc_realize(DeviceState *dev, Error **errp)
>   {
>       AspeedSoCState *s = ASPEED_SOC(dev);
^ permalink raw reply	[flat|nested] 17+ messages in thread
* [PATCH v2 4/7] hw/arm/aspeed: Move aspeed_load_vbootrom to common SoC code
  2025-09-24  5:55 [PATCH v2 0/7] Support VBOOTROM to ast2700fc machine Jamin Lin via
                   ` (2 preceding siblings ...)
  2025-09-24  5:55 ` [PATCH v2 3/7] hw/arm/aspeed: Move aspeed_install_boot_rom " Jamin Lin via
@ 2025-09-24  5:55 ` Jamin Lin via
  2025-09-24  9:47   ` Cédric Le Goater
  2025-09-24  5:55 ` [PATCH v2 5/7] hw/arm/aspeed_ast27x0-fc: Replace error_abort with local errp Jamin Lin via
                   ` (2 subsequent siblings)
  6 siblings, 1 reply; 17+ messages in thread
From: Jamin Lin via @ 2025-09-24  5:55 UTC (permalink / raw)
  To: Cédric Le Goater, Peter Maydell, Steven Lee, Troy Lee,
	Andrew Jeffery, Joel Stanley, open list:ASPEED BMCs,
	open list:All patches CC here
  Cc: jamin_lin, troy_lee
Move the vbootrom loader helper into common SoC code so it can be reused
by all ASPEED boards, and decouple the API from AspeedMachineState.
Specifically:
- Move aspeed_load_vbootrom() to hw/arm/aspeed_soc_common.c and
declare it in include/hw/arm/aspeed_soc.h.
- Change the helper’s signature to take AspeedSoCState * instead of
AspeedMachineState *.
- Update aspeed_machine_init() call sites accordingly.
No functional change.
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
---
 include/hw/arm/aspeed_soc.h |  4 ++++
 hw/arm/aspeed.c             | 31 +------------------------------
 hw/arm/aspeed_soc_common.c  | 25 +++++++++++++++++++++++++
 3 files changed, 30 insertions(+), 30 deletions(-)
diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
index aea210a8e2..ed32efb543 100644
--- a/include/hw/arm/aspeed_soc.h
+++ b/include/hw/arm/aspeed_soc.h
@@ -43,6 +43,8 @@
 #include "hw/char/serial-mm.h"
 #include "hw/intc/arm_gicv3.h"
 
+#define VBOOTROM_FILE_NAME  "ast27x0_bootrom.bin"
+
 #define ASPEED_SPIS_NUM  3
 #define ASPEED_EHCIS_NUM 4
 #define ASPEED_WDTS_NUM  8
@@ -316,6 +318,8 @@ void aspeed_write_boot_rom(BlockBackend *blk, hwaddr addr, size_t rom_size,
                            Error **errp);
 void aspeed_install_boot_rom(AspeedSoCState *soc, BlockBackend *blk,
                              MemoryRegion *boot_rom, uint64_t rom_size);
+void aspeed_load_vbootrom(AspeedSoCState *soc, const char *bios_name,
+                          Error **errp);
 
 static inline int aspeed_uart_index(int uart_dev)
 {
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
index 429f4c6d77..6046ec0bb2 100644
--- a/hw/arm/aspeed.c
+++ b/hw/arm/aspeed.c
@@ -26,9 +26,7 @@
 #include "hw/qdev-properties.h"
 #include "system/block-backend.h"
 #include "system/reset.h"
-#include "hw/loader.h"
 #include "qemu/error-report.h"
-#include "qemu/datadir.h"
 #include "qemu/units.h"
 #include "hw/qdev-clock.h"
 #include "system/system.h"
@@ -263,33 +261,6 @@ static void aspeed_reset_secondary(ARMCPU *cpu,
     cpu_set_pc(cs, info->smp_loader_start);
 }
 
-#define VBOOTROM_FILE_NAME  "ast27x0_bootrom.bin"
-
-/*
- * This function locates the vbootrom image file specified via the command line
- * using the -bios option. It loads the specified image into the vbootrom
- * memory region and handles errors if the file cannot be found or loaded.
- */
-static void aspeed_load_vbootrom(AspeedMachineState *bmc, const char *bios_name,
-                                 Error **errp)
-{
-    g_autofree char *filename = NULL;
-    AspeedSoCState *soc = bmc->soc;
-    int ret;
-
-    filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
-    if (!filename) {
-        error_setg(errp, "Could not find vbootrom image '%s'", bios_name);
-        return;
-    }
-
-    ret = load_image_mr(filename, &soc->vbootrom);
-    if (ret < 0) {
-        error_setg(errp, "Failed to load vbootrom image '%s'", bios_name);
-        return;
-    }
-}
-
 static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo, bool emmc,
                                bool boot_emmc)
 {
@@ -451,7 +422,7 @@ static void aspeed_machine_init(MachineState *machine)
 
     if (amc->vbootrom) {
         bios_name = machine->firmware ?: VBOOTROM_FILE_NAME;
-        aspeed_load_vbootrom(bmc, bios_name, &error_abort);
+        aspeed_load_vbootrom(bmc->soc, bios_name, &error_abort);
     }
 
     arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo);
diff --git a/hw/arm/aspeed_soc_common.c b/hw/arm/aspeed_soc_common.c
index 7f104f8de5..bc70e864fb 100644
--- a/hw/arm/aspeed_soc_common.c
+++ b/hw/arm/aspeed_soc_common.c
@@ -19,6 +19,7 @@
 #include "system/blockdev.h"
 #include "system/block-backend.h"
 #include "hw/loader.h"
+#include "qemu/datadir.h"
 
 
 const char *aspeed_soc_cpu_type(AspeedSoCClass *sc)
@@ -195,6 +196,30 @@ void aspeed_install_boot_rom(AspeedSoCState *soc, BlockBackend *blk,
                           &error_abort);
 }
 
+/*
+ * This function locates the vbootrom image file specified via the command line
+ * using the -bios option. It loads the specified image into the vbootrom
+ * memory region and handles errors if the file cannot be found or loaded.
+ */
+void aspeed_load_vbootrom(AspeedSoCState *soc, const char *bios_name,
+                          Error **errp)
+{
+    g_autofree char *filename = NULL;
+    int ret;
+
+    filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
+    if (!filename) {
+        error_setg(errp, "Could not find vbootrom image '%s'", bios_name);
+        return;
+    }
+
+    ret = load_image_mr(filename, &soc->vbootrom);
+    if (ret < 0) {
+        error_setg(errp, "Failed to load vbootrom image '%s'", bios_name);
+        return;
+    }
+}
+
 static void aspeed_soc_realize(DeviceState *dev, Error **errp)
 {
     AspeedSoCState *s = ASPEED_SOC(dev);
-- 
2.43.0
^ permalink raw reply related	[flat|nested] 17+ messages in thread* Re: [PATCH v2 4/7] hw/arm/aspeed: Move aspeed_load_vbootrom to common SoC code
  2025-09-24  5:55 ` [PATCH v2 4/7] hw/arm/aspeed: Move aspeed_load_vbootrom " Jamin Lin via
@ 2025-09-24  9:47   ` Cédric Le Goater
  0 siblings, 0 replies; 17+ messages in thread
From: Cédric Le Goater @ 2025-09-24  9:47 UTC (permalink / raw)
  To: Jamin Lin, Peter Maydell, Steven Lee, Troy Lee, Andrew Jeffery,
	Joel Stanley, open list:ASPEED BMCs,
	open list:All patches CC here
  Cc: troy_lee
On 9/24/25 07:55, Jamin Lin wrote:
> Move the vbootrom loader helper into common SoC code so it can be reused
> by all ASPEED boards, and decouple the API from AspeedMachineState.
> 
> Specifically:
> - Move aspeed_load_vbootrom() to hw/arm/aspeed_soc_common.c and
> declare it in include/hw/arm/aspeed_soc.h.
> - Change the helper’s signature to take AspeedSoCState * instead of
> AspeedMachineState *.
> - Update aspeed_machine_init() call sites accordingly.
> 
> No functional change.
> 
> Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
Reviewed-by: Cédric Le Goater <clg@redhat.com>
Thanks,
C.
> ---
>   include/hw/arm/aspeed_soc.h |  4 ++++
>   hw/arm/aspeed.c             | 31 +------------------------------
>   hw/arm/aspeed_soc_common.c  | 25 +++++++++++++++++++++++++
>   3 files changed, 30 insertions(+), 30 deletions(-)
> 
> diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
> index aea210a8e2..ed32efb543 100644
> --- a/include/hw/arm/aspeed_soc.h
> +++ b/include/hw/arm/aspeed_soc.h
> @@ -43,6 +43,8 @@
>   #include "hw/char/serial-mm.h"
>   #include "hw/intc/arm_gicv3.h"
>   
> +#define VBOOTROM_FILE_NAME  "ast27x0_bootrom.bin"
> +
>   #define ASPEED_SPIS_NUM  3
>   #define ASPEED_EHCIS_NUM 4
>   #define ASPEED_WDTS_NUM  8
> @@ -316,6 +318,8 @@ void aspeed_write_boot_rom(BlockBackend *blk, hwaddr addr, size_t rom_size,
>                              Error **errp);
>   void aspeed_install_boot_rom(AspeedSoCState *soc, BlockBackend *blk,
>                                MemoryRegion *boot_rom, uint64_t rom_size);
> +void aspeed_load_vbootrom(AspeedSoCState *soc, const char *bios_name,
> +                          Error **errp);
>   
>   static inline int aspeed_uart_index(int uart_dev)
>   {
> diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
> index 429f4c6d77..6046ec0bb2 100644
> --- a/hw/arm/aspeed.c
> +++ b/hw/arm/aspeed.c
> @@ -26,9 +26,7 @@
>   #include "hw/qdev-properties.h"
>   #include "system/block-backend.h"
>   #include "system/reset.h"
> -#include "hw/loader.h"
>   #include "qemu/error-report.h"
> -#include "qemu/datadir.h"
>   #include "qemu/units.h"
>   #include "hw/qdev-clock.h"
>   #include "system/system.h"
> @@ -263,33 +261,6 @@ static void aspeed_reset_secondary(ARMCPU *cpu,
>       cpu_set_pc(cs, info->smp_loader_start);
>   }
>   
> -#define VBOOTROM_FILE_NAME  "ast27x0_bootrom.bin"
> -
> -/*
> - * This function locates the vbootrom image file specified via the command line
> - * using the -bios option. It loads the specified image into the vbootrom
> - * memory region and handles errors if the file cannot be found or loaded.
> - */
> -static void aspeed_load_vbootrom(AspeedMachineState *bmc, const char *bios_name,
> -                                 Error **errp)
> -{
> -    g_autofree char *filename = NULL;
> -    AspeedSoCState *soc = bmc->soc;
> -    int ret;
> -
> -    filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
> -    if (!filename) {
> -        error_setg(errp, "Could not find vbootrom image '%s'", bios_name);
> -        return;
> -    }
> -
> -    ret = load_image_mr(filename, &soc->vbootrom);
> -    if (ret < 0) {
> -        error_setg(errp, "Failed to load vbootrom image '%s'", bios_name);
> -        return;
> -    }
> -}
> -
>   static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo, bool emmc,
>                                  bool boot_emmc)
>   {
> @@ -451,7 +422,7 @@ static void aspeed_machine_init(MachineState *machine)
>   
>       if (amc->vbootrom) {
>           bios_name = machine->firmware ?: VBOOTROM_FILE_NAME;
> -        aspeed_load_vbootrom(bmc, bios_name, &error_abort);
> +        aspeed_load_vbootrom(bmc->soc, bios_name, &error_abort);
>       }
>   
>       arm_load_kernel(ARM_CPU(first_cpu), machine, &aspeed_board_binfo);
> diff --git a/hw/arm/aspeed_soc_common.c b/hw/arm/aspeed_soc_common.c
> index 7f104f8de5..bc70e864fb 100644
> --- a/hw/arm/aspeed_soc_common.c
> +++ b/hw/arm/aspeed_soc_common.c
> @@ -19,6 +19,7 @@
>   #include "system/blockdev.h"
>   #include "system/block-backend.h"
>   #include "hw/loader.h"
> +#include "qemu/datadir.h"
>   
>   
>   const char *aspeed_soc_cpu_type(AspeedSoCClass *sc)
> @@ -195,6 +196,30 @@ void aspeed_install_boot_rom(AspeedSoCState *soc, BlockBackend *blk,
>                             &error_abort);
>   }
>   
> +/*
> + * This function locates the vbootrom image file specified via the command line
> + * using the -bios option. It loads the specified image into the vbootrom
> + * memory region and handles errors if the file cannot be found or loaded.
> + */
> +void aspeed_load_vbootrom(AspeedSoCState *soc, const char *bios_name,
> +                          Error **errp)
> +{
> +    g_autofree char *filename = NULL;
> +    int ret;
> +
> +    filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
> +    if (!filename) {
> +        error_setg(errp, "Could not find vbootrom image '%s'", bios_name);
> +        return;
> +    }
> +
> +    ret = load_image_mr(filename, &soc->vbootrom);
> +    if (ret < 0) {
> +        error_setg(errp, "Failed to load vbootrom image '%s'", bios_name);
> +        return;
> +    }
> +}
> +
>   static void aspeed_soc_realize(DeviceState *dev, Error **errp)
>   {
>       AspeedSoCState *s = ASPEED_SOC(dev);
^ permalink raw reply	[flat|nested] 17+ messages in thread
* [PATCH v2 5/7] hw/arm/aspeed_ast27x0-fc: Replace error_abort with local errp
  2025-09-24  5:55 [PATCH v2 0/7] Support VBOOTROM to ast2700fc machine Jamin Lin via
                   ` (3 preceding siblings ...)
  2025-09-24  5:55 ` [PATCH v2 4/7] hw/arm/aspeed: Move aspeed_load_vbootrom " Jamin Lin via
@ 2025-09-24  5:55 ` Jamin Lin via
  2025-09-24 10:06   ` Cédric Le Goater
  2025-09-24  5:56 ` [PATCH v2 6/7] hw/arm/aspeed_ast27x0-fc: Map FMC0 flash contents into CA35 boot ROM Jamin Lin via
  2025-09-24  5:56 ` [PATCH v2 7/7] hw/arm/aspeed_ast27x0-fc: Add VBOOTROM support Jamin Lin via
  6 siblings, 1 reply; 17+ messages in thread
From: Jamin Lin via @ 2025-09-24  5:55 UTC (permalink / raw)
  To: Cédric Le Goater, Peter Maydell, Steven Lee, Troy Lee,
	Andrew Jeffery, Joel Stanley, open list:ASPEED BMCs,
	open list:All patches CC here
  Cc: jamin_lin, troy_lee
This patch introduces a local Error **errp = NULL and
replaces error_abort with errp in these paths.
This makes error handling more consistent with QEMU guidelines and avoids
using error_abort in cases where failure should not be treated as a
programming error.
Discussion:
object_property_set_link() can return false only when it fails, and it
sets an error when it fails. Since passing &error_abort causes an abort,
the function never returns false, and the return statement is effectively
dead code. If failure is considered a programming error, using
&error_abort is correct. However, if failure is not a programming error,
passing &error_abort is wrong, and errp should be used instead. This
patch follows the latter approach by replacing error_abort with errp.
https://patchwork.kernel.org/project/qemu-devel/patch/20250717034054.1903991-3-jamin_lin@aspeedtech.com/#26540626
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
---
 hw/arm/aspeed_ast27x0-fc.c | 27 ++++++++++++++++-----------
 1 file changed, 16 insertions(+), 11 deletions(-)
diff --git a/hw/arm/aspeed_ast27x0-fc.c b/hw/arm/aspeed_ast27x0-fc.c
index 7087be4288..b15cb94c39 100644
--- a/hw/arm/aspeed_ast27x0-fc.c
+++ b/hw/arm/aspeed_ast27x0-fc.c
@@ -61,6 +61,7 @@ static void ast2700fc_ca35_init(MachineState *machine)
     Ast2700FCState *s = AST2700A1FC(machine);
     AspeedSoCState *soc;
     AspeedSoCClass *sc;
+    Error **errp = NULL;
 
     object_initialize_child(OBJECT(s), "ca35", &s->ca35, "ast2700-a1");
     soc = ASPEED_SOC(&s->ca35);
@@ -71,20 +72,20 @@ static void ast2700fc_ca35_init(MachineState *machine)
     memory_region_add_subregion(get_system_memory(), 0, &s->ca35_memory);
 
     if (!memory_region_init_ram(&s->ca35_dram, OBJECT(&s->ca35), "ca35-dram",
-                                AST2700FC_BMC_RAM_SIZE, &error_abort)) {
+                                AST2700FC_BMC_RAM_SIZE, errp)) {
         return;
     }
     if (!object_property_set_link(OBJECT(&s->ca35), "memory",
                                   OBJECT(&s->ca35_memory),
-                                  &error_abort)) {
+                                  errp)) {
         return;
     };
     if (!object_property_set_link(OBJECT(&s->ca35), "dram",
-                                  OBJECT(&s->ca35_dram), &error_abort)) {
+                                  OBJECT(&s->ca35_dram), errp)) {
         return;
     }
     if (!object_property_set_int(OBJECT(&s->ca35), "ram-size",
-                                 AST2700FC_BMC_RAM_SIZE, &error_abort)) {
+                                 AST2700FC_BMC_RAM_SIZE, errp)) {
         return;
     }
 
@@ -95,15 +96,15 @@ static void ast2700fc_ca35_init(MachineState *machine)
         }
     }
     if (!object_property_set_int(OBJECT(&s->ca35), "hw-strap1",
-                                 AST2700FC_HW_STRAP1, &error_abort)) {
+                                 AST2700FC_HW_STRAP1, errp)) {
         return;
     }
     if (!object_property_set_int(OBJECT(&s->ca35), "hw-strap2",
-                                 AST2700FC_HW_STRAP2, &error_abort)) {
+                                 AST2700FC_HW_STRAP2, errp)) {
         return;
     }
     aspeed_soc_uart_set_chr(soc, ASPEED_DEV_UART12, serial_hd(0));
-    if (!qdev_realize(DEVICE(&s->ca35), NULL, &error_abort)) {
+    if (!qdev_realize(DEVICE(&s->ca35), NULL, errp)) {
         return;
     }
 
@@ -125,6 +126,8 @@ static void ast2700fc_ssp_init(MachineState *machine)
 {
     AspeedSoCState *soc;
     Ast2700FCState *s = AST2700A1FC(machine);
+    Error **errp = NULL;
+
     s->ssp_sysclk = clock_new(OBJECT(s), "SSP_SYSCLK");
     clock_set_hz(s->ssp_sysclk, 200000000ULL);
 
@@ -134,13 +137,13 @@ static void ast2700fc_ssp_init(MachineState *machine)
 
     qdev_connect_clock_in(DEVICE(&s->ssp), "sysclk", s->ssp_sysclk);
     if (!object_property_set_link(OBJECT(&s->ssp), "memory",
-                                  OBJECT(&s->ssp_memory), &error_abort)) {
+                                  OBJECT(&s->ssp_memory), errp)) {
         return;
     }
 
     soc = ASPEED_SOC(&s->ssp);
     aspeed_soc_uart_set_chr(soc, ASPEED_DEV_UART4, serial_hd(1));
-    if (!qdev_realize(DEVICE(&s->ssp), NULL, &error_abort)) {
+    if (!qdev_realize(DEVICE(&s->ssp), NULL, errp)) {
         return;
     }
 }
@@ -149,6 +152,8 @@ static void ast2700fc_tsp_init(MachineState *machine)
 {
     AspeedSoCState *soc;
     Ast2700FCState *s = AST2700A1FC(machine);
+    Error **errp = NULL;
+
     s->tsp_sysclk = clock_new(OBJECT(s), "TSP_SYSCLK");
     clock_set_hz(s->tsp_sysclk, 200000000ULL);
 
@@ -158,13 +163,13 @@ static void ast2700fc_tsp_init(MachineState *machine)
 
     qdev_connect_clock_in(DEVICE(&s->tsp), "sysclk", s->tsp_sysclk);
     if (!object_property_set_link(OBJECT(&s->tsp), "memory",
-                                  OBJECT(&s->tsp_memory), &error_abort)) {
+                                  OBJECT(&s->tsp_memory), errp)) {
         return;
     }
 
     soc = ASPEED_SOC(&s->tsp);
     aspeed_soc_uart_set_chr(soc, ASPEED_DEV_UART7, serial_hd(2));
-    if (!qdev_realize(DEVICE(&s->tsp), NULL, &error_abort)) {
+    if (!qdev_realize(DEVICE(&s->tsp), NULL, errp)) {
         return;
     }
 }
-- 
2.43.0
^ permalink raw reply related	[flat|nested] 17+ messages in thread* Re: [PATCH v2 5/7] hw/arm/aspeed_ast27x0-fc: Replace error_abort with local errp
  2025-09-24  5:55 ` [PATCH v2 5/7] hw/arm/aspeed_ast27x0-fc: Replace error_abort with local errp Jamin Lin via
@ 2025-09-24 10:06   ` Cédric Le Goater
  2025-09-25  2:13     ` Jamin Lin
  0 siblings, 1 reply; 17+ messages in thread
From: Cédric Le Goater @ 2025-09-24 10:06 UTC (permalink / raw)
  To: Jamin Lin, Peter Maydell, Steven Lee, Troy Lee, Andrew Jeffery,
	Joel Stanley, open list:ASPEED BMCs,
	open list:All patches CC here
  Cc: troy_lee
On 9/24/25 07:55, Jamin Lin wrote:
> This patch introduces a local Error **errp = NULL and
> replaces error_abort with errp in these paths.
> 
> This makes error handling more consistent with QEMU guidelines and avoids
> using error_abort in cases where failure should not be treated as a
> programming error.
> 
> Discussion:
> object_property_set_link() can return false only when it fails, and it
> sets an error when it fails. Since passing &error_abort causes an abort,
> the function never returns false, and the return statement is effectively
> dead code. If failure is considered a programming error, using
> &error_abort is correct. However, if failure is not a programming error,
> passing &error_abort is wrong, and errp should be used instead. This
> patch follows the latter approach by replacing error_abort with errp.
> https://patchwork.kernel.org/project/qemu-devel/patch/20250717034054.1903991-3-jamin_lin@aspeedtech.com/#26540626
> 
> Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
> ---
>   hw/arm/aspeed_ast27x0-fc.c | 27 ++++++++++++++++-----------
>   1 file changed, 16 insertions(+), 11 deletions(-)
> 
> diff --git a/hw/arm/aspeed_ast27x0-fc.c b/hw/arm/aspeed_ast27x0-fc.c
> index 7087be4288..b15cb94c39 100644
> --- a/hw/arm/aspeed_ast27x0-fc.c
> +++ b/hw/arm/aspeed_ast27x0-fc.c
> @@ -61,6 +61,7 @@ static void ast2700fc_ca35_init(MachineState *machine)
ast2700fc_ca35_init(), and others below, should to take an 'Error **errp'
parameter and return a bool, which should be false in case of error. The
caller, ast2700fc_init() would then check the returned value and possibly
report the error.
A good reading on the error topic is in file "include/qapi/error.h".
  
>       Ast2700FCState *s = AST2700A1FC(machine);
>       AspeedSoCState *soc;
>       AspeedSoCClass *sc;
> +    Error **errp = NULL;
>   
>       object_initialize_child(OBJECT(s), "ca35", &s->ca35, "ast2700-a1");
>       soc = ASPEED_SOC(&s->ca35);
> @@ -71,20 +72,20 @@ static void ast2700fc_ca35_init(MachineState *machine)
>       memory_region_add_subregion(get_system_memory(), 0, &s->ca35_memory);
>   
>       if (!memory_region_init_ram(&s->ca35_dram, OBJECT(&s->ca35), "ca35-dram",
> -                                AST2700FC_BMC_RAM_SIZE, &error_abort)) {
> +                                AST2700FC_BMC_RAM_SIZE, errp)) {
>           return;
>       }
>       if (!object_property_set_link(OBJECT(&s->ca35), "memory",
>                                     OBJECT(&s->ca35_memory),
> -                                  &error_abort)) {
> +                                  errp)) {
>           return;
>       };
>       if (!object_property_set_link(OBJECT(&s->ca35), "dram",
> -                                  OBJECT(&s->ca35_dram), &error_abort)) {
> +                                  OBJECT(&s->ca35_dram), errp)) {
>           return;
>       }
>       if (!object_property_set_int(OBJECT(&s->ca35), "ram-size",
> -                                 AST2700FC_BMC_RAM_SIZE, &error_abort)) {
> +                                 AST2700FC_BMC_RAM_SIZE, errp)) {
object_property_set_int() is considered as a routine which shouldn't fail.
So the common practice in models is to pass &error_abort and ignore the
returned value.
Thanks,
C.
>           return;
>       }
>   
> @@ -95,15 +96,15 @@ static void ast2700fc_ca35_init(MachineState *machine)
>           }
>       }
>       if (!object_property_set_int(OBJECT(&s->ca35), "hw-strap1",
> -                                 AST2700FC_HW_STRAP1, &error_abort)) {
> +                                 AST2700FC_HW_STRAP1, errp)) {
>           return;
>       }
>       if (!object_property_set_int(OBJECT(&s->ca35), "hw-strap2",
> -                                 AST2700FC_HW_STRAP2, &error_abort)) {
> +                                 AST2700FC_HW_STRAP2, errp)) {
>           return;
>       }
>       aspeed_soc_uart_set_chr(soc, ASPEED_DEV_UART12, serial_hd(0));
> -    if (!qdev_realize(DEVICE(&s->ca35), NULL, &error_abort)) {
> +    if (!qdev_realize(DEVICE(&s->ca35), NULL, errp)) {
>           return;
>       }
>   
> @@ -125,6 +126,8 @@ static void ast2700fc_ssp_init(MachineState *machine)
>   {
>       AspeedSoCState *soc;
>       Ast2700FCState *s = AST2700A1FC(machine);
> +    Error **errp = NULL;
> +
>       s->ssp_sysclk = clock_new(OBJECT(s), "SSP_SYSCLK");
>       clock_set_hz(s->ssp_sysclk, 200000000ULL);
>   
> @@ -134,13 +137,13 @@ static void ast2700fc_ssp_init(MachineState *machine)
>   
>       qdev_connect_clock_in(DEVICE(&s->ssp), "sysclk", s->ssp_sysclk);
>       if (!object_property_set_link(OBJECT(&s->ssp), "memory",
> -                                  OBJECT(&s->ssp_memory), &error_abort)) {
> +                                  OBJECT(&s->ssp_memory), errp)) {
>           return;
>       }
>   
>       soc = ASPEED_SOC(&s->ssp);
>       aspeed_soc_uart_set_chr(soc, ASPEED_DEV_UART4, serial_hd(1));
> -    if (!qdev_realize(DEVICE(&s->ssp), NULL, &error_abort)) {
> +    if (!qdev_realize(DEVICE(&s->ssp), NULL, errp)) {
>           return;
>       }
>   }
> @@ -149,6 +152,8 @@ static void ast2700fc_tsp_init(MachineState *machine)
>   {
>       AspeedSoCState *soc;
>       Ast2700FCState *s = AST2700A1FC(machine);
> +    Error **errp = NULL;
> +
>       s->tsp_sysclk = clock_new(OBJECT(s), "TSP_SYSCLK");
>       clock_set_hz(s->tsp_sysclk, 200000000ULL);
>   
> @@ -158,13 +163,13 @@ static void ast2700fc_tsp_init(MachineState *machine)
>   
>       qdev_connect_clock_in(DEVICE(&s->tsp), "sysclk", s->tsp_sysclk);
>       if (!object_property_set_link(OBJECT(&s->tsp), "memory",
> -                                  OBJECT(&s->tsp_memory), &error_abort)) {
> +                                  OBJECT(&s->tsp_memory), errp)) {
>           return;
>       }
>   
>       soc = ASPEED_SOC(&s->tsp);
>       aspeed_soc_uart_set_chr(soc, ASPEED_DEV_UART7, serial_hd(2));
> -    if (!qdev_realize(DEVICE(&s->tsp), NULL, &error_abort)) {
> +    if (!qdev_realize(DEVICE(&s->tsp), NULL, errp)) {
>           return;
>       }
>   }
^ permalink raw reply	[flat|nested] 17+ messages in thread* RE: [PATCH v2 5/7] hw/arm/aspeed_ast27x0-fc: Replace error_abort with local errp
  2025-09-24 10:06   ` Cédric Le Goater
@ 2025-09-25  2:13     ` Jamin Lin
  0 siblings, 0 replies; 17+ messages in thread
From: Jamin Lin @ 2025-09-25  2:13 UTC (permalink / raw)
  To: Cédric Le Goater, Peter Maydell, Steven Lee, Troy Lee,
	Andrew Jeffery, Joel Stanley, open list:ASPEED BMCs,
	open list:All patches CC here
  Cc: Troy Lee
Hi Cédric
> Subject: Re: [PATCH v2 5/7] hw/arm/aspeed_ast27x0-fc: Replace error_abort
> with local errp
> 
> On 9/24/25 07:55, Jamin Lin wrote:
> > This patch introduces a local Error **errp = NULL and replaces
> > error_abort with errp in these paths.
> >
> > This makes error handling more consistent with QEMU guidelines and
> > avoids using error_abort in cases where failure should not be treated
> > as a programming error.
> >
> > Discussion:
> > object_property_set_link() can return false only when it fails, and it
> > sets an error when it fails. Since passing &error_abort causes an
> > abort, the function never returns false, and the return statement is
> > effectively dead code. If failure is considered a programming error,
> > using &error_abort is correct. However, if failure is not a
> > programming error, passing &error_abort is wrong, and errp should be
> > used instead. This patch follows the latter approach by replacing error_abort
> with errp.
> > https://patchwork.kernel.org/project/qemu-devel/patch/20250717034054.1
> > 903991-3-jamin_lin@aspeedtech.com/#26540626
> >
> > Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
> > ---
> >   hw/arm/aspeed_ast27x0-fc.c | 27 ++++++++++++++++-----------
> >   1 file changed, 16 insertions(+), 11 deletions(-)
> >
> > diff --git a/hw/arm/aspeed_ast27x0-fc.c b/hw/arm/aspeed_ast27x0-fc.c
> > index 7087be4288..b15cb94c39 100644
> > --- a/hw/arm/aspeed_ast27x0-fc.c
> > +++ b/hw/arm/aspeed_ast27x0-fc.c
> > @@ -61,6 +61,7 @@ static void ast2700fc_ca35_init(MachineState
> > *machine)
> 
> 
> ast2700fc_ca35_init(), and others below, should to take an 'Error **errp'
> parameter and return a bool, which should be false in case of error. The caller,
> ast2700fc_init() would then check the returned value and possibly report the
> error.
Thanks for your review and suggestion.
Will fix it.
> 
> A good reading on the error topic is in file "include/qapi/error.h".
> 
> >       Ast2700FCState *s = AST2700A1FC(machine);
> >       AspeedSoCState *soc;
> >       AspeedSoCClass *sc;
> > +    Error **errp = NULL;
> >
> >       object_initialize_child(OBJECT(s), "ca35", &s->ca35, "ast2700-a1");
> >       soc = ASPEED_SOC(&s->ca35);
> > @@ -71,20 +72,20 @@ static void ast2700fc_ca35_init(MachineState
> *machine)
> >       memory_region_add_subregion(get_system_memory(), 0,
> > &s->ca35_memory);
> >
> >       if (!memory_region_init_ram(&s->ca35_dram, OBJECT(&s->ca35),
> "ca35-dram",
> > -                                AST2700FC_BMC_RAM_SIZE,
> &error_abort)) {
> > +                                AST2700FC_BMC_RAM_SIZE, errp))
> {
> >           return;
> >       }
> >       if (!object_property_set_link(OBJECT(&s->ca35), "memory",
> >                                     OBJECT(&s->ca35_memory),
> > -                                  &error_abort)) {
> > +                                  errp)) {
> >           return;
> >       };
> >       if (!object_property_set_link(OBJECT(&s->ca35), "dram",
> > -                                  OBJECT(&s->ca35_dram),
> &error_abort)) {
> > +                                  OBJECT(&s->ca35_dram), errp)) {
> >           return;
> >       }
> >       if (!object_property_set_int(OBJECT(&s->ca35), "ram-size",
> > -                                 AST2700FC_BMC_RAM_SIZE,
> &error_abort)) {
> > +                                 AST2700FC_BMC_RAM_SIZE, errp))
> {
> 
> object_property_set_int() is considered as a routine which shouldn't fail.
> So the common practice in models is to pass &error_abort and ignore the
> returned value.
>
Will fix it.
Thanks-Jamin
> 
> Thanks,
> 
> C.
> 
> 
> 
> >           return;
> >       }
> >
> > @@ -95,15 +96,15 @@ static void ast2700fc_ca35_init(MachineState
> *machine)
> >           }
> >       }
> >       if (!object_property_set_int(OBJECT(&s->ca35), "hw-strap1",
> > -                                 AST2700FC_HW_STRAP1,
> &error_abort)) {
> > +                                 AST2700FC_HW_STRAP1, errp)) {
> >           return;
> >       }
> >       if (!object_property_set_int(OBJECT(&s->ca35), "hw-strap2",
> > -                                 AST2700FC_HW_STRAP2,
> &error_abort)) {
> > +                                 AST2700FC_HW_STRAP2, errp)) {
> >           return;
> >       }
> >       aspeed_soc_uart_set_chr(soc, ASPEED_DEV_UART12, serial_hd(0));
> > -    if (!qdev_realize(DEVICE(&s->ca35), NULL, &error_abort)) {
> > +    if (!qdev_realize(DEVICE(&s->ca35), NULL, errp)) {
> >           return;
> >       }
> >
> > @@ -125,6 +126,8 @@ static void ast2700fc_ssp_init(MachineState
> *machine)
> >   {
> >       AspeedSoCState *soc;
> >       Ast2700FCState *s = AST2700A1FC(machine);
> > +    Error **errp = NULL;
> > +
> >       s->ssp_sysclk = clock_new(OBJECT(s), "SSP_SYSCLK");
> >       clock_set_hz(s->ssp_sysclk, 200000000ULL);
> >
> > @@ -134,13 +137,13 @@ static void ast2700fc_ssp_init(MachineState
> > *machine)
> >
> >       qdev_connect_clock_in(DEVICE(&s->ssp), "sysclk", s->ssp_sysclk);
> >       if (!object_property_set_link(OBJECT(&s->ssp), "memory",
> > -                                  OBJECT(&s->ssp_memory),
> &error_abort)) {
> > +                                  OBJECT(&s->ssp_memory), errp))
> {
> >           return;
> >       }
> >
> >       soc = ASPEED_SOC(&s->ssp);
> >       aspeed_soc_uart_set_chr(soc, ASPEED_DEV_UART4, serial_hd(1));
> > -    if (!qdev_realize(DEVICE(&s->ssp), NULL, &error_abort)) {
> > +    if (!qdev_realize(DEVICE(&s->ssp), NULL, errp)) {
> >           return;
> >       }
> >   }
> > @@ -149,6 +152,8 @@ static void ast2700fc_tsp_init(MachineState
> *machine)
> >   {
> >       AspeedSoCState *soc;
> >       Ast2700FCState *s = AST2700A1FC(machine);
> > +    Error **errp = NULL;
> > +
> >       s->tsp_sysclk = clock_new(OBJECT(s), "TSP_SYSCLK");
> >       clock_set_hz(s->tsp_sysclk, 200000000ULL);
> >
> > @@ -158,13 +163,13 @@ static void ast2700fc_tsp_init(MachineState
> > *machine)
> >
> >       qdev_connect_clock_in(DEVICE(&s->tsp), "sysclk", s->tsp_sysclk);
> >       if (!object_property_set_link(OBJECT(&s->tsp), "memory",
> > -                                  OBJECT(&s->tsp_memory),
> &error_abort)) {
> > +                                  OBJECT(&s->tsp_memory), errp))
> {
> >           return;
> >       }
> >
> >       soc = ASPEED_SOC(&s->tsp);
> >       aspeed_soc_uart_set_chr(soc, ASPEED_DEV_UART7, serial_hd(2));
> > -    if (!qdev_realize(DEVICE(&s->tsp), NULL, &error_abort)) {
> > +    if (!qdev_realize(DEVICE(&s->tsp), NULL, errp)) {
> >           return;
> >       }
> >   }
^ permalink raw reply	[flat|nested] 17+ messages in thread
* [PATCH v2 6/7] hw/arm/aspeed_ast27x0-fc: Map FMC0 flash contents into CA35 boot ROM
  2025-09-24  5:55 [PATCH v2 0/7] Support VBOOTROM to ast2700fc machine Jamin Lin via
                   ` (4 preceding siblings ...)
  2025-09-24  5:55 ` [PATCH v2 5/7] hw/arm/aspeed_ast27x0-fc: Replace error_abort with local errp Jamin Lin via
@ 2025-09-24  5:56 ` Jamin Lin via
  2025-09-24 10:17   ` Cédric Le Goater
  2025-09-24  5:56 ` [PATCH v2 7/7] hw/arm/aspeed_ast27x0-fc: Add VBOOTROM support Jamin Lin via
  6 siblings, 1 reply; 17+ messages in thread
From: Jamin Lin via @ 2025-09-24  5:56 UTC (permalink / raw)
  To: Cédric Le Goater, Peter Maydell, Steven Lee, Troy Lee,
	Andrew Jeffery, Joel Stanley, open list:ASPEED BMCs,
	open list:All patches CC here
  Cc: jamin_lin, troy_lee
This patch introduces a dedicated ca35_boot_rom memory region and
copies the FMC0 flash data into it when mmio_exec is disabled.
The main purpose of this change is to support the upcoming VBOOTROM
, which can directly fetch data from FMC0 flash at the SPI boot ROM
base address (0x100000000) without requiring any SPI controller
drivers.
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
---
 hw/arm/aspeed_ast27x0-fc.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)
diff --git a/hw/arm/aspeed_ast27x0-fc.c b/hw/arm/aspeed_ast27x0-fc.c
index b15cb94c39..2e6036b192 100644
--- a/hw/arm/aspeed_ast27x0-fc.c
+++ b/hw/arm/aspeed_ast27x0-fc.c
@@ -35,6 +35,7 @@ struct Ast2700FCState {
 
     MemoryRegion ca35_memory;
     MemoryRegion ca35_dram;
+    MemoryRegion ca35_boot_rom;
     MemoryRegion ssp_memory;
     MemoryRegion tsp_memory;
 
@@ -61,7 +62,10 @@ static void ast2700fc_ca35_init(MachineState *machine)
     Ast2700FCState *s = AST2700A1FC(machine);
     AspeedSoCState *soc;
     AspeedSoCClass *sc;
+    BlockBackend *fmc0 = NULL;
+    DeviceState *dev = NULL;
     Error **errp = NULL;
+    uint64_t rom_size;
 
     object_initialize_child(OBJECT(s), "ca35", &s->ca35, "ast2700-a1");
     soc = ASPEED_SOC(&s->ca35);
@@ -119,6 +123,16 @@ static void ast2700fc_ca35_init(MachineState *machine)
     ast2700fc_board_info.ram_size = machine->ram_size;
     ast2700fc_board_info.loader_start = sc->memmap[ASPEED_DEV_SDRAM];
 
+    if (!s->mmio_exec) {
+        dev = ssi_get_cs(soc->fmc.spi, 0);
+        fmc0 = dev ? m25p80_get_blk(dev) : NULL;
+
+        if (fmc0) {
+            rom_size = memory_region_size(&soc->spi_boot);
+            aspeed_install_boot_rom(soc, fmc0, &s->ca35_boot_rom, rom_size);
+        }
+    }
+
     arm_load_kernel(ARM_CPU(first_cpu), machine, &ast2700fc_board_info);
 }
 
-- 
2.43.0
^ permalink raw reply related	[flat|nested] 17+ messages in thread* Re: [PATCH v2 6/7] hw/arm/aspeed_ast27x0-fc: Map FMC0 flash contents into CA35 boot ROM
  2025-09-24  5:56 ` [PATCH v2 6/7] hw/arm/aspeed_ast27x0-fc: Map FMC0 flash contents into CA35 boot ROM Jamin Lin via
@ 2025-09-24 10:17   ` Cédric Le Goater
  2025-09-25  2:27     ` Jamin Lin
  0 siblings, 1 reply; 17+ messages in thread
From: Cédric Le Goater @ 2025-09-24 10:17 UTC (permalink / raw)
  To: Jamin Lin, Peter Maydell, Steven Lee, Troy Lee, Andrew Jeffery,
	Joel Stanley, open list:ASPEED BMCs,
	open list:All patches CC here
  Cc: troy_lee
On 9/24/25 07:56, Jamin Lin wrote:
> This patch introduces a dedicated ca35_boot_rom memory region and
> copies the FMC0 flash data into it when mmio_exec is disabled.
> 
> The main purpose of this change is to support the upcoming VBOOTROM
> , which can directly fetch data from FMC0 flash at the SPI boot ROM
> base address (0x100000000) without requiring any SPI controller
> drivers.
That's the 'execute-in-place' case but the property activating
'execute-in-place' is always false in this machine. Could you
explain why booting from vbootrom needs the fmc0 contents to be
mapped in memory too ?
> Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
> ---
>   hw/arm/aspeed_ast27x0-fc.c | 14 ++++++++++++++
>   1 file changed, 14 insertions(+)
> 
> diff --git a/hw/arm/aspeed_ast27x0-fc.c b/hw/arm/aspeed_ast27x0-fc.c
> index b15cb94c39..2e6036b192 100644
> --- a/hw/arm/aspeed_ast27x0-fc.c
> +++ b/hw/arm/aspeed_ast27x0-fc.c
> @@ -35,6 +35,7 @@ struct Ast2700FCState {
>   
>       MemoryRegion ca35_memory;
>       MemoryRegion ca35_dram;
> +    MemoryRegion ca35_boot_rom;
>       MemoryRegion ssp_memory;
>       MemoryRegion tsp_memory;
>   
> @@ -61,7 +62,10 @@ static void ast2700fc_ca35_init(MachineState *machine)
>       Ast2700FCState *s = AST2700A1FC(machine);
>       AspeedSoCState *soc;
>       AspeedSoCClass *sc;
> +    BlockBackend *fmc0 = NULL;
> +    DeviceState *dev = NULL;
>       Error **errp = NULL;
> +    uint64_t rom_size;
>   
>       object_initialize_child(OBJECT(s), "ca35", &s->ca35, "ast2700-a1");
>       soc = ASPEED_SOC(&s->ca35);
> @@ -119,6 +123,16 @@ static void ast2700fc_ca35_init(MachineState *machine)
>       ast2700fc_board_info.ram_size = machine->ram_size;
>       ast2700fc_board_info.loader_start = sc->memmap[ASPEED_DEV_SDRAM];
>   
> +    if (!s->mmio_exec) {
bool 'mmio_exec' is always false in this machine. Should we keep it ?
Thanks,
C.
> +        dev = ssi_get_cs(soc->fmc.spi, 0);
> +        fmc0 = dev ? m25p80_get_blk(dev) : NULL;
> +
> +        if (fmc0) {
> +            rom_size = memory_region_size(&soc->spi_boot);
> +            aspeed_install_boot_rom(soc, fmc0, &s->ca35_boot_rom, rom_size);
> +        }
> +    }
> +
>       arm_load_kernel(ARM_CPU(first_cpu), machine, &ast2700fc_board_info);
>   }
>   
^ permalink raw reply	[flat|nested] 17+ messages in thread* RE: [PATCH v2 6/7] hw/arm/aspeed_ast27x0-fc: Map FMC0 flash contents into CA35 boot ROM
  2025-09-24 10:17   ` Cédric Le Goater
@ 2025-09-25  2:27     ` Jamin Lin
  0 siblings, 0 replies; 17+ messages in thread
From: Jamin Lin @ 2025-09-25  2:27 UTC (permalink / raw)
  To: Cédric Le Goater, Peter Maydell, Steven Lee, Troy Lee,
	Andrew Jeffery, Joel Stanley, open list:ASPEED BMCs,
	open list:All patches CC here
  Cc: Troy Lee
Hi Cédric
> Subject: Re: [PATCH v2 6/7] hw/arm/aspeed_ast27x0-fc: Map FMC0 flash
> contents into CA35 boot ROM
> 
> On 9/24/25 07:56, Jamin Lin wrote:
> > This patch introduces a dedicated ca35_boot_rom memory region and
> > copies the FMC0 flash data into it when mmio_exec is disabled.
> >
> > The main purpose of this change is to support the upcoming VBOOTROM ,
> > which can directly fetch data from FMC0 flash at the SPI boot ROM base
> > address (0x100000000) without requiring any SPI controller drivers.
> 
> That's the 'execute-in-place' case but the property activating
> 'execute-in-place' is always false in this machine. Could you explain why
> booting from vbootrom needs the fmc0 contents to be mapped in memory
> too ?
> 
The main goal of vbootrom is to replace bootmuc (RISC-V 32).
Our current bootmuc firmware is SPL.
The SPL reads flash data (image-bmc) via FMC_CS0 and loads the following components into different DRAM addresses:
Trusted Firmware-A
OP-TEE OS
u-boot-nodtb.bin
u-boot.dtb
After loading, it(BOOTMCU) releases the CA35(PSP) reset so that CA35 can run Trusted Firmware-A.
The vbootrom performs the same sequence: it reads flash data (image-bmc), parses the FIT image,
and loads each image into its designated DRAM address. Finally, it jumps to Trusted Firmware-A.
https://github.com/google/vbootrom/blob/master/ast27x0/include/image.h#L21
https://github.com/google/vbootrom/blob/master/ast27x0/image.c#L30 
https://github.com/google/vbootrom/blob/master/ast27x0/image.c#L457
https://github.com/google/vbootrom/blob/master/ast27x0/image.c#L488-L505
That is why I need to copy FMC0 data into the its memory region to make vbootrom work correctly.
> 
> 
> 
> > Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
> > ---
> >   hw/arm/aspeed_ast27x0-fc.c | 14 ++++++++++++++
> >   1 file changed, 14 insertions(+)
> >
> > diff --git a/hw/arm/aspeed_ast27x0-fc.c b/hw/arm/aspeed_ast27x0-fc.c
> > index b15cb94c39..2e6036b192 100644
> > --- a/hw/arm/aspeed_ast27x0-fc.c
> > +++ b/hw/arm/aspeed_ast27x0-fc.c
> > @@ -35,6 +35,7 @@ struct Ast2700FCState {
> >
> >       MemoryRegion ca35_memory;
> >       MemoryRegion ca35_dram;
> > +    MemoryRegion ca35_boot_rom;
> >       MemoryRegion ssp_memory;
> >       MemoryRegion tsp_memory;
> >
> > @@ -61,7 +62,10 @@ static void ast2700fc_ca35_init(MachineState
> *machine)
> >       Ast2700FCState *s = AST2700A1FC(machine);
> >       AspeedSoCState *soc;
> >       AspeedSoCClass *sc;
> > +    BlockBackend *fmc0 = NULL;
> > +    DeviceState *dev = NULL;
> >       Error **errp = NULL;
> > +    uint64_t rom_size;
> >
> >       object_initialize_child(OBJECT(s), "ca35", &s->ca35, "ast2700-a1");
> >       soc = ASPEED_SOC(&s->ca35);
> > @@ -119,6 +123,16 @@ static void ast2700fc_ca35_init(MachineState
> *machine)
> >       ast2700fc_board_info.ram_size = machine->ram_size;
> >       ast2700fc_board_info.loader_start =
> > sc->memmap[ASPEED_DEV_SDRAM];
> >
> > +    if (!s->mmio_exec) {
> 
> bool 'mmio_exec' is always false in this machine. Should we keep it ?
> 
Will remove it.
Thanks-Jamin
> Thanks,
> 
> C.
> 
> 
> 
> > +        dev = ssi_get_cs(soc->fmc.spi, 0);
> > +        fmc0 = dev ? m25p80_get_blk(dev) : NULL;
> > +
> > +        if (fmc0) {
> > +            rom_size = memory_region_size(&soc->spi_boot);
> > +            aspeed_install_boot_rom(soc, fmc0, &s->ca35_boot_rom,
> rom_size);
> > +        }
> > +    }
> > +
> >       arm_load_kernel(ARM_CPU(first_cpu), machine,
> &ast2700fc_board_info);
> >   }
> >
^ permalink raw reply	[flat|nested] 17+ messages in thread
* [PATCH v2 7/7] hw/arm/aspeed_ast27x0-fc: Add VBOOTROM support
  2025-09-24  5:55 [PATCH v2 0/7] Support VBOOTROM to ast2700fc machine Jamin Lin via
                   ` (5 preceding siblings ...)
  2025-09-24  5:56 ` [PATCH v2 6/7] hw/arm/aspeed_ast27x0-fc: Map FMC0 flash contents into CA35 boot ROM Jamin Lin via
@ 2025-09-24  5:56 ` Jamin Lin via
  2025-09-24 10:18   ` Cédric Le Goater
  6 siblings, 1 reply; 17+ messages in thread
From: Jamin Lin via @ 2025-09-24  5:56 UTC (permalink / raw)
  To: Cédric Le Goater, Peter Maydell, Steven Lee, Troy Lee,
	Andrew Jeffery, Joel Stanley, open list:ASPEED BMCs,
	open list:All patches CC here
  Cc: jamin_lin, troy_lee
Introduces support for loading a vbootrom image into the dedicated vbootrom
memory region in the AST2700 Full Core machine.
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
---
 hw/arm/aspeed_ast27x0-fc.c | 5 +++++
 1 file changed, 5 insertions(+)
diff --git a/hw/arm/aspeed_ast27x0-fc.c b/hw/arm/aspeed_ast27x0-fc.c
index 2e6036b192..b2d963e1fe 100644
--- a/hw/arm/aspeed_ast27x0-fc.c
+++ b/hw/arm/aspeed_ast27x0-fc.c
@@ -62,6 +62,7 @@ static void ast2700fc_ca35_init(MachineState *machine)
     Ast2700FCState *s = AST2700A1FC(machine);
     AspeedSoCState *soc;
     AspeedSoCClass *sc;
+    const char *bios_name = NULL;
     BlockBackend *fmc0 = NULL;
     DeviceState *dev = NULL;
     Error **errp = NULL;
@@ -133,6 +134,10 @@ static void ast2700fc_ca35_init(MachineState *machine)
         }
     }
 
+    /* VBOOTROM */
+    bios_name = machine->firmware ?: VBOOTROM_FILE_NAME;
+    aspeed_load_vbootrom(soc, bios_name, errp);
+
     arm_load_kernel(ARM_CPU(first_cpu), machine, &ast2700fc_board_info);
 }
 
-- 
2.43.0
^ permalink raw reply related	[flat|nested] 17+ messages in thread* Re: [PATCH v2 7/7] hw/arm/aspeed_ast27x0-fc: Add VBOOTROM support
  2025-09-24  5:56 ` [PATCH v2 7/7] hw/arm/aspeed_ast27x0-fc: Add VBOOTROM support Jamin Lin via
@ 2025-09-24 10:18   ` Cédric Le Goater
  0 siblings, 0 replies; 17+ messages in thread
From: Cédric Le Goater @ 2025-09-24 10:18 UTC (permalink / raw)
  To: Jamin Lin, Peter Maydell, Steven Lee, Troy Lee, Andrew Jeffery,
	Joel Stanley, open list:ASPEED BMCs,
	open list:All patches CC here
  Cc: troy_lee
On 9/24/25 07:56, Jamin Lin wrote:
> Introduces support for loading a vbootrom image into the dedicated vbootrom
> memory region in the AST2700 Full Core machine.
> 
> Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
> ---
>   hw/arm/aspeed_ast27x0-fc.c | 5 +++++
>   1 file changed, 5 insertions(+)
> 
> diff --git a/hw/arm/aspeed_ast27x0-fc.c b/hw/arm/aspeed_ast27x0-fc.c
> index 2e6036b192..b2d963e1fe 100644
> --- a/hw/arm/aspeed_ast27x0-fc.c
> +++ b/hw/arm/aspeed_ast27x0-fc.c
> @@ -62,6 +62,7 @@ static void ast2700fc_ca35_init(MachineState *machine)
>       Ast2700FCState *s = AST2700A1FC(machine);
>       AspeedSoCState *soc;
>       AspeedSoCClass *sc;
> +    const char *bios_name = NULL;
>       BlockBackend *fmc0 = NULL;
>       DeviceState *dev = NULL;
>       Error **errp = NULL;
> @@ -133,6 +134,10 @@ static void ast2700fc_ca35_init(MachineState *machine)
>           }
>       }
>   
> +    /* VBOOTROM */
> +    bios_name = machine->firmware ?: VBOOTROM_FILE_NAME;
> +    aspeed_load_vbootrom(soc, bios_name, errp);
> +
>       arm_load_kernel(ARM_CPU(first_cpu), machine, &ast2700fc_board_info);
>   }
>   
Reviewed-by: Cédric Le Goater <clg@redhat.com>
Thanks,
C.
^ permalink raw reply	[flat|nested] 17+ messages in thread