qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/8] aspeed: Add boot from eMMC support (AST2600)
@ 2024-07-17  6:30 Cédric Le Goater
  2024-07-17  6:30 ` [PATCH v2 1/8] aspeed: Change type of eMMC device Cédric Le Goater
                   ` (9 more replies)
  0 siblings, 10 replies; 13+ messages in thread
From: Cédric Le Goater @ 2024-07-17  6:30 UTC (permalink / raw)
  To: qemu-arm, qemu-devel
  Cc: Andrew Jeffery, Joel Stanley, Steven Lee, Troy Lee, Jamin Lin,
	Peter Maydell, Philippe Mathieu-Daudé, Cédric Le Goater

Hello,

This series enables boot from eMMC on the rainier-bmc machine, which
is the default behavior and also on the AST2600 EVB using a machine
option to change the default.

First 6 patches adjust the machine setup and HW strapping to boot from
eMMC, the last 2 are for the AST2600 EVB and are optional.

Thanks,

C.

Changes since v1:

 - Rebased on upstream, now that the eMMC device model is available
 - Rephrased commit logs
 - Fixed SCU prefix of bit definitions
 - Tuned 'boot-config' and 'boot-partition-size' eMMC properties

Cédric Le Goater (8):
  aspeed: Change type of eMMC device
  aspeed: Load eMMC first boot area as a boot rom
  aspeed/scu: Add boot-from-eMMC HW strapping bit for AST2600 SoC
  aspeed: Introduce a AspeedSoCClass 'boot_from_emmc' handler
  aspeed: Tune eMMC device properties to reflect HW strapping
  aspeed: Add boot-from-eMMC HW strapping bit to rainier-bmc machine
  aspeed: Introduce a 'hw_strap1' machine attribute
  aspeed: Introduce a 'boot-emmc' machine option

 docs/system/arm/aspeed.rst   |  2 ++
 include/hw/arm/aspeed_soc.h  |  1 +
 include/hw/misc/aspeed_scu.h |  4 +++
 hw/arm/aspeed.c              | 62 +++++++++++++++++++++++++++++++-----
 hw/arm/aspeed_ast2600.c      |  8 +++++
 hw/arm/aspeed_soc_common.c   |  7 ++++
 6 files changed, 76 insertions(+), 8 deletions(-)

-- 
2.45.2



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

* [PATCH v2 1/8] aspeed: Change type of eMMC device
  2024-07-17  6:30 [PATCH v2 0/8] aspeed: Add boot from eMMC support (AST2600) Cédric Le Goater
@ 2024-07-17  6:30 ` Cédric Le Goater
  2024-07-17  6:30 ` [PATCH v2 2/8] aspeed: Load eMMC first boot area as a boot rom Cédric Le Goater
                   ` (8 subsequent siblings)
  9 siblings, 0 replies; 13+ messages in thread
From: Cédric Le Goater @ 2024-07-17  6:30 UTC (permalink / raw)
  To: qemu-arm, qemu-devel
  Cc: Andrew Jeffery, Joel Stanley, Steven Lee, Troy Lee, Jamin Lin,
	Peter Maydell, Philippe Mathieu-Daudé, Cédric Le Goater

From: Cédric Le Goater <clg@kaod.org>

The QEMU device model representing the eMMC device of the machine is
currently created with type SD_CARD. Change the type to EMMC now that
it is available.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Reviewed-by: Andrew Jeffery <andrew@codeconstruct.com.au>
Tested-by: Andrew Jeffery <andrew@codeconstruct.com.au>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
 hw/arm/aspeed.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
index 53a4f665d0d0..105b990233fa 100644
--- a/hw/arm/aspeed.c
+++ b/hw/arm/aspeed.c
@@ -327,14 +327,14 @@ void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype,
     }
 }
 
-static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo)
+static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo, bool emmc)
 {
         DeviceState *card;
 
         if (!dinfo) {
             return;
         }
-        card = qdev_new(TYPE_SD_CARD);
+        card = qdev_new(emmc ? TYPE_EMMC : TYPE_SD_CARD);
         qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
                                 &error_fatal);
         qdev_realize_and_unref(card,
@@ -436,12 +436,13 @@ static void aspeed_machine_init(MachineState *machine)
 
     for (i = 0; i < bmc->soc->sdhci.num_slots; i++) {
         sdhci_attach_drive(&bmc->soc->sdhci.slots[i],
-                           drive_get(IF_SD, 0, i));
+                           drive_get(IF_SD, 0, i), false);
     }
 
     if (bmc->soc->emmc.num_slots) {
         sdhci_attach_drive(&bmc->soc->emmc.slots[0],
-                           drive_get(IF_SD, 0, bmc->soc->sdhci.num_slots));
+                           drive_get(IF_SD, 0, bmc->soc->sdhci.num_slots),
+                           true);
     }
 
     if (!bmc->mmio_exec) {
-- 
2.45.2



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

* [PATCH v2 2/8] aspeed: Load eMMC first boot area as a boot rom
  2024-07-17  6:30 [PATCH v2 0/8] aspeed: Add boot from eMMC support (AST2600) Cédric Le Goater
  2024-07-17  6:30 ` [PATCH v2 1/8] aspeed: Change type of eMMC device Cédric Le Goater
@ 2024-07-17  6:30 ` Cédric Le Goater
  2024-07-17 10:06   ` Philippe Mathieu-Daudé
  2024-07-17  6:30 ` [PATCH v2 3/8] aspeed/scu: Add boot-from-eMMC HW strapping bit for AST2600 SoC Cédric Le Goater
                   ` (7 subsequent siblings)
  9 siblings, 1 reply; 13+ messages in thread
From: Cédric Le Goater @ 2024-07-17  6:30 UTC (permalink / raw)
  To: qemu-arm, qemu-devel
  Cc: Andrew Jeffery, Joel Stanley, Steven Lee, Troy Lee, Jamin Lin,
	Peter Maydell, Philippe Mathieu-Daudé, Cédric Le Goater

From: Cédric Le Goater <clg@kaod.org>

The first boot area partition (64K) of the eMMC device should contain
an initial boot loader (u-boot SPL). Load it as a ROM only if an eMMC
device is available to boot from but no flash device is.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Reviewed-by: Andrew Jeffery <andrew@codeconstruct.com.au>
Tested-by: Andrew Jeffery <andrew@codeconstruct.com.au>
---
 hw/arm/aspeed.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
index 105b990233fa..756deb91efd1 100644
--- a/hw/arm/aspeed.c
+++ b/hw/arm/aspeed.c
@@ -364,6 +364,7 @@ static void aspeed_machine_init(MachineState *machine)
     AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
     AspeedSoCClass *sc;
     int i;
+    DriveInfo *emmc0 = NULL;
 
     bmc->soc = ASPEED_SOC(object_new(amc->soc_name));
     object_property_add_child(OBJECT(machine), "soc", OBJECT(bmc->soc));
@@ -440,9 +441,8 @@ static void aspeed_machine_init(MachineState *machine)
     }
 
     if (bmc->soc->emmc.num_slots) {
-        sdhci_attach_drive(&bmc->soc->emmc.slots[0],
-                           drive_get(IF_SD, 0, bmc->soc->sdhci.num_slots),
-                           true);
+        emmc0 = drive_get(IF_SD, 0, bmc->soc->sdhci.num_slots);
+        sdhci_attach_drive(&bmc->soc->emmc.slots[0], emmc0, true);
     }
 
     if (!bmc->mmio_exec) {
@@ -452,6 +452,8 @@ static void aspeed_machine_init(MachineState *machine)
         if (fmc0) {
             uint64_t rom_size = memory_region_size(&bmc->soc->spi_boot);
             aspeed_install_boot_rom(bmc, fmc0, rom_size);
+        } else if (emmc0) {
+            aspeed_install_boot_rom(bmc, blk_by_legacy_dinfo(emmc0), 64 * KiB);
         }
     }
 
-- 
2.45.2



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

* [PATCH v2 3/8] aspeed/scu: Add boot-from-eMMC HW strapping bit for AST2600 SoC
  2024-07-17  6:30 [PATCH v2 0/8] aspeed: Add boot from eMMC support (AST2600) Cédric Le Goater
  2024-07-17  6:30 ` [PATCH v2 1/8] aspeed: Change type of eMMC device Cédric Le Goater
  2024-07-17  6:30 ` [PATCH v2 2/8] aspeed: Load eMMC first boot area as a boot rom Cédric Le Goater
@ 2024-07-17  6:30 ` Cédric Le Goater
  2024-07-17  6:30 ` [PATCH v2 4/8] aspeed: Introduce a AspeedSoCClass 'boot_from_emmc' handler Cédric Le Goater
                   ` (6 subsequent siblings)
  9 siblings, 0 replies; 13+ messages in thread
From: Cédric Le Goater @ 2024-07-17  6:30 UTC (permalink / raw)
  To: qemu-arm, qemu-devel
  Cc: Andrew Jeffery, Joel Stanley, Steven Lee, Troy Lee, Jamin Lin,
	Peter Maydell, Philippe Mathieu-Daudé, Cédric Le Goater

From: Cédric Le Goater <clg@kaod.org>

Bit SCU500[2] of the AST2600 controls the boot device of the SoC.

Future changes will configure this bit to boot from eMMC disk images
specially built for this purpose.

Signed-off-by: Joel Stanley <joel@jms.id.au>
Signed-off-by: Cédric Le Goater <clg@kaod.org>
Reviewed-by: Andrew Jeffery <andrew@codeconstruct.com.au>
Tested-by: Andrew Jeffery <andrew@codeconstruct.com.au>
---
 include/hw/misc/aspeed_scu.h | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/include/hw/misc/aspeed_scu.h b/include/hw/misc/aspeed_scu.h
index 58db28db45aa..356be95e4585 100644
--- a/include/hw/misc/aspeed_scu.h
+++ b/include/hw/misc/aspeed_scu.h
@@ -349,6 +349,10 @@ uint32_t aspeed_scu_get_apb_freq(AspeedSCUState *s);
 #define SCU_AST2600_H_PLL_BYPASS_EN                        (0x1 << 24)
 #define SCU_AST2600_H_PLL_OFF                              (0x1 << 23)
 
+/* STRAP1 SCU500 */
+#define SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC            (0x1 << 2)
+#define SCU_AST2600_HW_STRAP_BOOT_SRC_SPI             (0x0 << 2)
+
 /*
  * SCU310   Clock Selection Register Set 4 (for Aspeed AST1030 SOC)
  *
-- 
2.45.2



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

* [PATCH v2 4/8] aspeed: Introduce a AspeedSoCClass 'boot_from_emmc' handler
  2024-07-17  6:30 [PATCH v2 0/8] aspeed: Add boot from eMMC support (AST2600) Cédric Le Goater
                   ` (2 preceding siblings ...)
  2024-07-17  6:30 ` [PATCH v2 3/8] aspeed/scu: Add boot-from-eMMC HW strapping bit for AST2600 SoC Cédric Le Goater
@ 2024-07-17  6:30 ` Cédric Le Goater
  2024-07-17  6:30 ` [PATCH v2 5/8] aspeed: Tune eMMC device properties to reflect HW strapping Cédric Le Goater
                   ` (5 subsequent siblings)
  9 siblings, 0 replies; 13+ messages in thread
From: Cédric Le Goater @ 2024-07-17  6:30 UTC (permalink / raw)
  To: qemu-arm, qemu-devel
  Cc: Andrew Jeffery, Joel Stanley, Steven Lee, Troy Lee, Jamin Lin,
	Peter Maydell, Philippe Mathieu-Daudé, Cédric Le Goater

From: Cédric Le Goater <clg@kaod.org>

Report support on the AST2600 SoC if the boot-from-eMMC HW strapping
bit is set at the board level. AST2700 also has support but it is not
yet ready in QEMU and others SoCs do not have support, so return false
always for these.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Reviewed-by: Andrew Jeffery <andrew@codeconstruct.com.au>
Tested-by: Andrew Jeffery <andrew@codeconstruct.com.au>
---
 include/hw/arm/aspeed_soc.h | 1 +
 hw/arm/aspeed_ast2600.c     | 8 ++++++++
 hw/arm/aspeed_soc_common.c  | 7 +++++++
 3 files changed, 16 insertions(+)

diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
index 849ba37f9524..624d489e0d63 100644
--- a/include/hw/arm/aspeed_soc.h
+++ b/include/hw/arm/aspeed_soc.h
@@ -164,6 +164,7 @@ struct AspeedSoCClass {
     const hwaddr *memmap;
     uint32_t num_cpus;
     qemu_irq (*get_irq)(AspeedSoCState *s, int dev);
+    bool (*boot_from_emmc)(AspeedSoCState *s);
 };
 
 const char *aspeed_soc_cpu_type(AspeedSoCClass *sc);
diff --git a/hw/arm/aspeed_ast2600.c b/hw/arm/aspeed_ast2600.c
index 31713de74a5f..be3eb70cdd77 100644
--- a/hw/arm/aspeed_ast2600.c
+++ b/hw/arm/aspeed_ast2600.c
@@ -646,6 +646,13 @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
     }
 }
 
+static bool aspeed_soc_ast2600_boot_from_emmc(AspeedSoCState *s)
+{
+    uint32_t hw_strap1 = object_property_get_uint(OBJECT(&s->scu),
+                                                  "hw-strap1", &error_abort);
+    return !!(hw_strap1 & SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC);
+}
+
 static void aspeed_soc_ast2600_class_init(ObjectClass *oc, void *data)
 {
     static const char * const valid_cpu_types[] = {
@@ -673,6 +680,7 @@ static void aspeed_soc_ast2600_class_init(ObjectClass *oc, void *data)
     sc->memmap       = aspeed_soc_ast2600_memmap;
     sc->num_cpus     = 2;
     sc->get_irq      = aspeed_soc_ast2600_get_irq;
+    sc->boot_from_emmc = aspeed_soc_ast2600_boot_from_emmc;
 }
 
 static const TypeInfo aspeed_soc_ast2600_types[] = {
diff --git a/hw/arm/aspeed_soc_common.c b/hw/arm/aspeed_soc_common.c
index 1e8f2558fdc2..05551461aea0 100644
--- a/hw/arm/aspeed_soc_common.c
+++ b/hw/arm/aspeed_soc_common.c
@@ -134,6 +134,11 @@ static void aspeed_soc_realize(DeviceState *dev, Error **errp)
     }
 }
 
+static bool aspeed_soc_boot_from_emmc(AspeedSoCState *s)
+{
+    return false;
+}
+
 static Property aspeed_soc_properties[] = {
     DEFINE_PROP_LINK("dram", AspeedSoCState, dram_mr, TYPE_MEMORY_REGION,
                      MemoryRegion *),
@@ -145,9 +150,11 @@ static Property aspeed_soc_properties[] = {
 static void aspeed_soc_class_init(ObjectClass *oc, void *data)
 {
     DeviceClass *dc = DEVICE_CLASS(oc);
+    AspeedSoCClass *sc = ASPEED_SOC_CLASS(oc);
 
     dc->realize = aspeed_soc_realize;
     device_class_set_props(dc, aspeed_soc_properties);
+    sc->boot_from_emmc = aspeed_soc_boot_from_emmc;
 }
 
 static const TypeInfo aspeed_soc_types[] = {
-- 
2.45.2



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

* [PATCH v2 5/8] aspeed: Tune eMMC device properties to reflect HW strapping
  2024-07-17  6:30 [PATCH v2 0/8] aspeed: Add boot from eMMC support (AST2600) Cédric Le Goater
                   ` (3 preceding siblings ...)
  2024-07-17  6:30 ` [PATCH v2 4/8] aspeed: Introduce a AspeedSoCClass 'boot_from_emmc' handler Cédric Le Goater
@ 2024-07-17  6:30 ` Cédric Le Goater
  2024-07-17 10:07   ` Philippe Mathieu-Daudé
  2024-07-17  6:30 ` [PATCH v2 6/8] aspeed: Add boot-from-eMMC HW strapping bit to rainier-bmc machine Cédric Le Goater
                   ` (4 subsequent siblings)
  9 siblings, 1 reply; 13+ messages in thread
From: Cédric Le Goater @ 2024-07-17  6:30 UTC (permalink / raw)
  To: qemu-arm, qemu-devel
  Cc: Andrew Jeffery, Joel Stanley, Steven Lee, Troy Lee, Jamin Lin,
	Peter Maydell, Philippe Mathieu-Daudé, Cédric Le Goater

From: Cédric Le Goater <clg@kaod.org>

When the boot-from-eMMC HW strapping bit is set, use the 'boot-config'
property to set the boot config register to boot from the first boot
area partition of the eMMC device. Also set the boot partition size
of the device.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Reviewed-by: Andrew Jeffery <andrew@codeconstruct.com.au>
Tested-by: Andrew Jeffery <andrew@codeconstruct.com.au>
---
 hw/arm/aspeed.c | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
index 756deb91efd1..bc4ca1754213 100644
--- a/hw/arm/aspeed.c
+++ b/hw/arm/aspeed.c
@@ -327,7 +327,8 @@ void aspeed_board_init_flashes(AspeedSMCState *s, const char *flashtype,
     }
 }
 
-static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo, bool emmc)
+static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo, bool emmc,
+                               bool boot_emmc)
 {
         DeviceState *card;
 
@@ -335,6 +336,11 @@ static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo, bool emmc)
             return;
         }
         card = qdev_new(emmc ? TYPE_EMMC : TYPE_SD_CARD);
+        if (emmc) {
+            qdev_prop_set_uint64(card, "boot-partition-size", 1 * MiB);
+            qdev_prop_set_uint8(card, "boot-config",
+                                boot_emmc ? 0x1 << 3 : 0x0);
+        }
         qdev_prop_set_drive_err(card, "drive", blk_by_legacy_dinfo(dinfo),
                                 &error_fatal);
         qdev_realize_and_unref(card,
@@ -365,6 +371,7 @@ static void aspeed_machine_init(MachineState *machine)
     AspeedSoCClass *sc;
     int i;
     DriveInfo *emmc0 = NULL;
+    bool boot_emmc;
 
     bmc->soc = ASPEED_SOC(object_new(amc->soc_name));
     object_property_add_child(OBJECT(machine), "soc", OBJECT(bmc->soc));
@@ -437,19 +444,21 @@ static void aspeed_machine_init(MachineState *machine)
 
     for (i = 0; i < bmc->soc->sdhci.num_slots; i++) {
         sdhci_attach_drive(&bmc->soc->sdhci.slots[i],
-                           drive_get(IF_SD, 0, i), false);
+                           drive_get(IF_SD, 0, i), false, false);
     }
 
+    boot_emmc = sc->boot_from_emmc(bmc->soc);
+
     if (bmc->soc->emmc.num_slots) {
         emmc0 = drive_get(IF_SD, 0, bmc->soc->sdhci.num_slots);
-        sdhci_attach_drive(&bmc->soc->emmc.slots[0], emmc0, true);
+        sdhci_attach_drive(&bmc->soc->emmc.slots[0], emmc0, true, boot_emmc);
     }
 
     if (!bmc->mmio_exec) {
         DeviceState *dev = ssi_get_cs(bmc->soc->fmc.spi, 0);
         BlockBackend *fmc0 = dev ? m25p80_get_blk(dev) : NULL;
 
-        if (fmc0) {
+        if (fmc0 && !boot_emmc) {
             uint64_t rom_size = memory_region_size(&bmc->soc->spi_boot);
             aspeed_install_boot_rom(bmc, fmc0, rom_size);
         } else if (emmc0) {
-- 
2.45.2



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

* [PATCH v2 6/8] aspeed: Add boot-from-eMMC HW strapping bit to rainier-bmc machine
  2024-07-17  6:30 [PATCH v2 0/8] aspeed: Add boot from eMMC support (AST2600) Cédric Le Goater
                   ` (4 preceding siblings ...)
  2024-07-17  6:30 ` [PATCH v2 5/8] aspeed: Tune eMMC device properties to reflect HW strapping Cédric Le Goater
@ 2024-07-17  6:30 ` Cédric Le Goater
  2024-07-17  6:30 ` [PATCH v2 7/8] aspeed: Introduce a 'hw_strap1' machine attribute Cédric Le Goater
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 13+ messages in thread
From: Cédric Le Goater @ 2024-07-17  6:30 UTC (permalink / raw)
  To: qemu-arm, qemu-devel
  Cc: Andrew Jeffery, Joel Stanley, Steven Lee, Troy Lee, Jamin Lin,
	Peter Maydell, Philippe Mathieu-Daudé, Cédric Le Goater

From: Cédric Le Goater <clg@kaod.org>

This value is taken from a running Rainier machine.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Reviewed-by: Andrew Jeffery <andrew@codeconstruct.com.au>
Tested-by: Andrew Jeffery <andrew@codeconstruct.com.au>
---
 hw/arm/aspeed.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
index bc4ca1754213..a8f5c14ae535 100644
--- a/hw/arm/aspeed.c
+++ b/hw/arm/aspeed.c
@@ -189,7 +189,7 @@ struct AspeedMachineState {
 #define TACOMA_BMC_HW_STRAP2  0x00000040
 
 /* Rainier hardware value: (QEMU prototype) */
-#define RAINIER_BMC_HW_STRAP1 0x00422016
+#define RAINIER_BMC_HW_STRAP1 (0x00422016 | SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC)
 #define RAINIER_BMC_HW_STRAP2 0x80000848
 
 /* Fuji hardware value */
-- 
2.45.2



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

* [PATCH v2 7/8] aspeed: Introduce a 'hw_strap1' machine attribute
  2024-07-17  6:30 [PATCH v2 0/8] aspeed: Add boot from eMMC support (AST2600) Cédric Le Goater
                   ` (5 preceding siblings ...)
  2024-07-17  6:30 ` [PATCH v2 6/8] aspeed: Add boot-from-eMMC HW strapping bit to rainier-bmc machine Cédric Le Goater
@ 2024-07-17  6:30 ` Cédric Le Goater
  2024-07-17  6:30 ` [PATCH v2 8/8] aspeed: Introduce a 'boot-emmc' machine option Cédric Le Goater
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 13+ messages in thread
From: Cédric Le Goater @ 2024-07-17  6:30 UTC (permalink / raw)
  To: qemu-arm, qemu-devel
  Cc: Andrew Jeffery, Joel Stanley, Steven Lee, Troy Lee, Jamin Lin,
	Peter Maydell, Philippe Mathieu-Daudé, Cédric Le Goater

From: Cédric Le Goater <clg@kaod.org>

To change default behavior of a machine and boot from eMMC, future
changes will add a machine option to let the user configure the
boot-from-eMMC HW strapping bit. Add a new machine attribute first.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Reviewed-by: Andrew Jeffery <andrew@codeconstruct.com.au>
Tested-by: Andrew Jeffery <andrew@codeconstruct.com.au>
---
 hw/arm/aspeed.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
index a8f5c14ae535..9939559f6dd0 100644
--- a/hw/arm/aspeed.c
+++ b/hw/arm/aspeed.c
@@ -46,6 +46,7 @@ struct AspeedMachineState {
     uint32_t uart_chosen;
     char *fmc_model;
     char *spi_model;
+    uint32_t hw_strap1;
 };
 
 /* On 32-bit hosts, lower RAM to 1G because of the 2047 MB limit */
@@ -393,7 +394,7 @@ static void aspeed_machine_init(MachineState *machine)
         }
     }
 
-    object_property_set_int(OBJECT(bmc->soc), "hw-strap1", amc->hw_strap1,
+    object_property_set_int(OBJECT(bmc->soc), "hw-strap1", bmc->hw_strap1,
                             &error_abort);
     object_property_set_int(OBJECT(bmc->soc), "hw-strap2", amc->hw_strap2,
                             &error_abort);
@@ -1077,7 +1078,10 @@ static void aspeed_set_mmio_exec(Object *obj, bool value, Error **errp)
 
 static void aspeed_machine_instance_init(Object *obj)
 {
+    AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(obj);
+
     ASPEED_MACHINE(obj)->mmio_exec = false;
+    ASPEED_MACHINE(obj)->hw_strap1 = amc->hw_strap1;
 }
 
 static char *aspeed_get_fmc_model(Object *obj, Error **errp)
-- 
2.45.2



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

* [PATCH v2 8/8] aspeed: Introduce a 'boot-emmc' machine option
  2024-07-17  6:30 [PATCH v2 0/8] aspeed: Add boot from eMMC support (AST2600) Cédric Le Goater
                   ` (6 preceding siblings ...)
  2024-07-17  6:30 ` [PATCH v2 7/8] aspeed: Introduce a 'hw_strap1' machine attribute Cédric Le Goater
@ 2024-07-17  6:30 ` Cédric Le Goater
  2024-07-17 10:06 ` [PATCH v2 0/8] aspeed: Add boot from eMMC support (AST2600) Philippe Mathieu-Daudé
  2024-07-18 16:18 ` Cédric Le Goater
  9 siblings, 0 replies; 13+ messages in thread
From: Cédric Le Goater @ 2024-07-17  6:30 UTC (permalink / raw)
  To: qemu-arm, qemu-devel
  Cc: Andrew Jeffery, Joel Stanley, Steven Lee, Troy Lee, Jamin Lin,
	Peter Maydell, Philippe Mathieu-Daudé, Cédric Le Goater

From: Cédric Le Goater <clg@kaod.org>

The default behavior of some Aspeed machines is to boot from the eMMC
device, like the rainier-bmc. Others like ast2600-evb could also boot
from eMMC if the HW strapping boot-from-eMMC bit was set. Add a
property to set or unset this bit. This is useful to test boot images.

For now, only activate this property on the ast2600-evb and rainier-bmc
machines for which eMMC images are available or can be built.

Signed-off-by: Cédric Le Goater <clg@kaod.org>
Reviewed-by: Andrew Jeffery <andrew@codeconstruct.com.au>
Tested-by: Andrew Jeffery <andrew@codeconstruct.com.au>
---
 docs/system/arm/aspeed.rst |  2 ++
 hw/arm/aspeed.c            | 30 ++++++++++++++++++++++++++++++
 2 files changed, 32 insertions(+)

diff --git a/docs/system/arm/aspeed.rst b/docs/system/arm/aspeed.rst
index cd9559e3e291..6733ffd2b941 100644
--- a/docs/system/arm/aspeed.rst
+++ b/docs/system/arm/aspeed.rst
@@ -123,6 +123,8 @@ To boot the machine from the flash image, use an MTD drive :
 
 Options specific to Aspeed machines are :
 
+ * ``boot-emmc`` to set or unset boot from eMMC (AST2600).
+
  * ``execute-in-place`` which emulates the boot from the CE0 flash
    device by using the FMC controller to load the instructions, and
    not simply from RAM. This takes a little longer.
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
index 9939559f6dd0..5cdef873a5fc 100644
--- a/hw/arm/aspeed.c
+++ b/hw/arm/aspeed.c
@@ -1178,6 +1178,34 @@ static void aspeed_machine_class_init_cpus_defaults(MachineClass *mc)
     mc->valid_cpu_types = sc->valid_cpu_types;
 }
 
+static bool aspeed_machine_ast2600_get_boot_from_emmc(Object *obj, Error **errp)
+{
+    AspeedMachineState *bmc = ASPEED_MACHINE(obj);
+
+    return !!(bmc->hw_strap1 & SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC);
+}
+
+static void aspeed_machine_ast2600_set_boot_from_emmc(Object *obj, bool value,
+                                                      Error **errp)
+{
+    AspeedMachineState *bmc = ASPEED_MACHINE(obj);
+
+    if (value) {
+        bmc->hw_strap1 |= SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC;
+    } else {
+        bmc->hw_strap1 &= ~SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC;
+    }
+}
+
+static void aspeed_machine_ast2600_class_emmc_init(ObjectClass *oc)
+{
+    object_class_property_add_bool(oc, "boot-emmc",
+                                   aspeed_machine_ast2600_get_boot_from_emmc,
+                                   aspeed_machine_ast2600_set_boot_from_emmc);
+    object_class_property_set_description(oc, "boot-emmc",
+                                          "Set or unset boot from EMMC");
+}
+
 static void aspeed_machine_class_init(ObjectClass *oc, void *data)
 {
     MachineClass *mc = MACHINE_CLASS(oc);
@@ -1377,6 +1405,7 @@ static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data)
     amc->i2c_init  = ast2600_evb_i2c_init;
     mc->default_ram_size = 1 * GiB;
     aspeed_machine_class_init_cpus_defaults(mc);
+    aspeed_machine_ast2600_class_emmc_init(oc);
 };
 
 static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data)
@@ -1449,6 +1478,7 @@ static void aspeed_machine_rainier_class_init(ObjectClass *oc, void *data)
     amc->i2c_init  = rainier_bmc_i2c_init;
     mc->default_ram_size = 1 * GiB;
     aspeed_machine_class_init_cpus_defaults(mc);
+    aspeed_machine_ast2600_class_emmc_init(oc);
 };
 
 #define FUJI_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB)
-- 
2.45.2



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

* Re: [PATCH v2 0/8] aspeed: Add boot from eMMC support (AST2600)
  2024-07-17  6:30 [PATCH v2 0/8] aspeed: Add boot from eMMC support (AST2600) Cédric Le Goater
                   ` (7 preceding siblings ...)
  2024-07-17  6:30 ` [PATCH v2 8/8] aspeed: Introduce a 'boot-emmc' machine option Cédric Le Goater
@ 2024-07-17 10:06 ` Philippe Mathieu-Daudé
  2024-07-18 16:18 ` Cédric Le Goater
  9 siblings, 0 replies; 13+ messages in thread
From: Philippe Mathieu-Daudé @ 2024-07-17 10:06 UTC (permalink / raw)
  To: Cédric Le Goater, qemu-arm, qemu-devel
  Cc: Andrew Jeffery, Joel Stanley, Steven Lee, Troy Lee, Jamin Lin,
	Peter Maydell

On 17/7/24 08:30, Cédric Le Goater wrote:

> Cédric Le Goater (8):
>    aspeed: Change type of eMMC device
>    aspeed: Load eMMC first boot area as a boot rom
>    aspeed/scu: Add boot-from-eMMC HW strapping bit for AST2600 SoC
>    aspeed: Introduce a AspeedSoCClass 'boot_from_emmc' handler
>    aspeed: Tune eMMC device properties to reflect HW strapping
>    aspeed: Add boot-from-eMMC HW strapping bit to rainier-bmc machine
>    aspeed: Introduce a 'hw_strap1' machine attribute
>    aspeed: Introduce a 'boot-emmc' machine option

Series:
Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org>



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

* Re: [PATCH v2 2/8] aspeed: Load eMMC first boot area as a boot rom
  2024-07-17  6:30 ` [PATCH v2 2/8] aspeed: Load eMMC first boot area as a boot rom Cédric Le Goater
@ 2024-07-17 10:06   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 13+ messages in thread
From: Philippe Mathieu-Daudé @ 2024-07-17 10:06 UTC (permalink / raw)
  To: Cédric Le Goater, qemu-arm, qemu-devel
  Cc: Andrew Jeffery, Joel Stanley, Steven Lee, Troy Lee, Jamin Lin,
	Peter Maydell, Cédric Le Goater

On 17/7/24 08:30, Cédric Le Goater wrote:
> From: Cédric Le Goater <clg@kaod.org>
> 
> The first boot area partition (64K) of the eMMC device should contain
> an initial boot loader (u-boot SPL). Load it as a ROM only if an eMMC
> device is available to boot from but no flash device is.
> 
> Signed-off-by: Cédric Le Goater <clg@kaod.org>
> Reviewed-by: Andrew Jeffery <andrew@codeconstruct.com.au>
> Tested-by: Andrew Jeffery <andrew@codeconstruct.com.au>
> ---
>   hw/arm/aspeed.c | 8 +++++---
>   1 file changed, 5 insertions(+), 3 deletions(-)

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>



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

* Re: [PATCH v2 5/8] aspeed: Tune eMMC device properties to reflect HW strapping
  2024-07-17  6:30 ` [PATCH v2 5/8] aspeed: Tune eMMC device properties to reflect HW strapping Cédric Le Goater
@ 2024-07-17 10:07   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 13+ messages in thread
From: Philippe Mathieu-Daudé @ 2024-07-17 10:07 UTC (permalink / raw)
  To: Cédric Le Goater, qemu-arm, qemu-devel
  Cc: Andrew Jeffery, Joel Stanley, Steven Lee, Troy Lee, Jamin Lin,
	Peter Maydell, Cédric Le Goater

On 17/7/24 08:30, Cédric Le Goater wrote:
> From: Cédric Le Goater <clg@kaod.org>
> 
> When the boot-from-eMMC HW strapping bit is set, use the 'boot-config'
> property to set the boot config register to boot from the first boot
> area partition of the eMMC device. Also set the boot partition size
> of the device.
> 
> Signed-off-by: Cédric Le Goater <clg@kaod.org>
> Reviewed-by: Andrew Jeffery <andrew@codeconstruct.com.au>
> Tested-by: Andrew Jeffery <andrew@codeconstruct.com.au>
> ---
>   hw/arm/aspeed.c | 17 +++++++++++++----
>   1 file changed, 13 insertions(+), 4 deletions(-)

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>



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

* Re: [PATCH v2 0/8] aspeed: Add boot from eMMC support (AST2600)
  2024-07-17  6:30 [PATCH v2 0/8] aspeed: Add boot from eMMC support (AST2600) Cédric Le Goater
                   ` (8 preceding siblings ...)
  2024-07-17 10:06 ` [PATCH v2 0/8] aspeed: Add boot from eMMC support (AST2600) Philippe Mathieu-Daudé
@ 2024-07-18 16:18 ` Cédric Le Goater
  9 siblings, 0 replies; 13+ messages in thread
From: Cédric Le Goater @ 2024-07-18 16:18 UTC (permalink / raw)
  To: Cédric Le Goater, qemu-arm, qemu-devel
  Cc: Andrew Jeffery, Joel Stanley, Steven Lee, Troy Lee, Jamin Lin,
	Peter Maydell, Philippe Mathieu-Daudé

On 7/17/24 08:30, Cédric Le Goater wrote:
> Hello,
> 
> This series enables boot from eMMC on the rainier-bmc machine, which
> is the default behavior and also on the AST2600 EVB using a machine
> option to change the default.
> 
> First 6 patches adjust the machine setup and HW strapping to boot from
> eMMC, the last 2 are for the AST2600 EVB and are optional.
> 
> Thanks,
> 
> C.
> 
> Changes since v1:
> 
>   - Rebased on upstream, now that the eMMC device model is available
>   - Rephrased commit logs
>   - Fixed SCU prefix of bit definitions
>   - Tuned 'boot-config' and 'boot-partition-size' eMMC properties
> 
> Cédric Le Goater (8):
>    aspeed: Change type of eMMC device
>    aspeed: Load eMMC first boot area as a boot rom
>    aspeed/scu: Add boot-from-eMMC HW strapping bit for AST2600 SoC
>    aspeed: Introduce a AspeedSoCClass 'boot_from_emmc' handler
>    aspeed: Tune eMMC device properties to reflect HW strapping
>    aspeed: Add boot-from-eMMC HW strapping bit to rainier-bmc machine
>    aspeed: Introduce a 'hw_strap1' machine attribute
>    aspeed: Introduce a 'boot-emmc' machine option
> 
>   docs/system/arm/aspeed.rst   |  2 ++
>   include/hw/arm/aspeed_soc.h  |  1 +
>   include/hw/misc/aspeed_scu.h |  4 +++
>   hw/arm/aspeed.c              | 62 +++++++++++++++++++++++++++++++-----
>   hw/arm/aspeed_ast2600.c      |  8 +++++
>   hw/arm/aspeed_soc_common.c   |  7 ++++
>   6 files changed, 76 insertions(+), 8 deletions(-)
> 


Applied to aspeed-next.

Thanks,

C.




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

end of thread, other threads:[~2024-07-18 16:19 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-07-17  6:30 [PATCH v2 0/8] aspeed: Add boot from eMMC support (AST2600) Cédric Le Goater
2024-07-17  6:30 ` [PATCH v2 1/8] aspeed: Change type of eMMC device Cédric Le Goater
2024-07-17  6:30 ` [PATCH v2 2/8] aspeed: Load eMMC first boot area as a boot rom Cédric Le Goater
2024-07-17 10:06   ` Philippe Mathieu-Daudé
2024-07-17  6:30 ` [PATCH v2 3/8] aspeed/scu: Add boot-from-eMMC HW strapping bit for AST2600 SoC Cédric Le Goater
2024-07-17  6:30 ` [PATCH v2 4/8] aspeed: Introduce a AspeedSoCClass 'boot_from_emmc' handler Cédric Le Goater
2024-07-17  6:30 ` [PATCH v2 5/8] aspeed: Tune eMMC device properties to reflect HW strapping Cédric Le Goater
2024-07-17 10:07   ` Philippe Mathieu-Daudé
2024-07-17  6:30 ` [PATCH v2 6/8] aspeed: Add boot-from-eMMC HW strapping bit to rainier-bmc machine Cédric Le Goater
2024-07-17  6:30 ` [PATCH v2 7/8] aspeed: Introduce a 'hw_strap1' machine attribute Cédric Le Goater
2024-07-17  6:30 ` [PATCH v2 8/8] aspeed: Introduce a 'boot-emmc' machine option Cédric Le Goater
2024-07-17 10:06 ` [PATCH v2 0/8] aspeed: Add boot from eMMC support (AST2600) Philippe Mathieu-Daudé
2024-07-18 16:18 ` Cédric Le Goater

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