hw/arm/npcm8xx_boards.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-)
Fix flash device part number to `mx66l1g45g` according image-bmc run on npcm8xx
evb board (SPIFlash...SF: Detected mx66l1g45g, total 128 MiB)
And add auto zero flash image size to resolve error below after executing
`./qemu-system-aarch64 -machine npcm845-evb -drive file=image-bmc`
Error message:
qemu-system-aarch64: mx66l1g45g device '/machine/unattached/device[73]'
requires 134217728 bytes, mtd0 block backend provides 67108864 bytes
Tested:
Build passes and runs ./qemu-system-aarch64 -machine npcm845-evb normally
Signed-off-by: Tim Lee <timlee660101@gmail.com>
---
hw/arm/npcm8xx_boards.c | 15 ++++++++++++++-
1 file changed, 14 insertions(+), 1 deletion(-)
diff --git a/hw/arm/npcm8xx_boards.c b/hw/arm/npcm8xx_boards.c
index 3fb8478e72..11b792c613 100644
--- a/hw/arm/npcm8xx_boards.c
+++ b/hw/arm/npcm8xx_boards.c
@@ -27,6 +27,7 @@
#include "qemu/error-report.h"
#include "qemu/datadir.h"
#include "qemu/units.h"
+#include "system/block-backend.h"
#define NPCM845_EVB_POWER_ON_STRAPS 0x000017ff
@@ -59,10 +60,21 @@ static void npcm8xx_connect_flash(NPCM7xxFIUState *fiu, int cs_no,
{
DeviceState *flash;
qemu_irq flash_cs;
+ BlockBackend *blk;
+ uint64_t blk_size, perm, shared_perm;
flash = qdev_new(flash_type);
if (dinfo) {
qdev_prop_set_drive(flash, "drive", blk_by_legacy_dinfo(dinfo));
+ blk = blk_by_legacy_dinfo(dinfo);
+ blk_size = blk_getlength(blk);
+ if (blk_size < fiu->flash_size) {
+ blk_get_perm(blk, &perm, &shared_perm);
+ blk_set_perm(blk, BLK_PERM_ALL, BLK_PERM_ALL, &error_abort);
+ blk_truncate(blk, fiu->flash_size, true, PREALLOC_MODE_OFF,
+ BDRV_REQ_ZERO_WRITE, &error_abort);
+ blk_set_perm(blk, perm, shared_perm, &error_abort);
+ }
}
qdev_realize_and_unref(flash, BUS(fiu->spi), &error_fatal);
@@ -194,7 +206,8 @@ static void npcm845_evb_init(MachineState *machine)
qdev_realize(DEVICE(soc), NULL, &error_fatal);
npcm8xx_load_bootrom(machine, soc);
- npcm8xx_connect_flash(&soc->fiu[0], 0, "w25q256", drive_get(IF_MTD, 0, 0));
+ npcm8xx_connect_flash(&soc->fiu[0], 0, "mx66l1g45g",
+ drive_get(IF_MTD, 0, 0));
npcm845_evb_i2c_init(soc);
npcm845_evb_fan_init(NPCM8XX_MACHINE(machine), soc);
npcm8xx_load_kernel(machine, soc);
--
2.34.1
On 1/4/25 10:59, Tim Lee wrote: > Fix flash device part number to `mx66l1g45g` according image-bmc run on npcm8xx > evb board (SPIFlash...SF: Detected mx66l1g45g, total 128 MiB) > > And add auto zero flash image size to resolve error below after executing > `./qemu-system-aarch64 -machine npcm845-evb -drive file=image-bmc` > > Error message: > qemu-system-aarch64: mx66l1g45g device '/machine/unattached/device[73]' > requires 134217728 bytes, mtd0 block backend provides 67108864 bytes > > Tested: > Build passes and runs ./qemu-system-aarch64 -machine npcm845-evb normally > > Signed-off-by: Tim Lee <timlee660101@gmail.com> > --- > hw/arm/npcm8xx_boards.c | 15 ++++++++++++++- > 1 file changed, 14 insertions(+), 1 deletion(-) > > diff --git a/hw/arm/npcm8xx_boards.c b/hw/arm/npcm8xx_boards.c > index 3fb8478e72..11b792c613 100644 > --- a/hw/arm/npcm8xx_boards.c > +++ b/hw/arm/npcm8xx_boards.c > @@ -27,6 +27,7 @@ > #include "qemu/error-report.h" > #include "qemu/datadir.h" > #include "qemu/units.h" > +#include "system/block-backend.h" > > #define NPCM845_EVB_POWER_ON_STRAPS 0x000017ff > > @@ -59,10 +60,21 @@ static void npcm8xx_connect_flash(NPCM7xxFIUState *fiu, int cs_no, > { > DeviceState *flash; > qemu_irq flash_cs; > + BlockBackend *blk; > + uint64_t blk_size, perm, shared_perm; > > flash = qdev_new(flash_type); > if (dinfo) { > qdev_prop_set_drive(flash, "drive", blk_by_legacy_dinfo(dinfo)); > + blk = blk_by_legacy_dinfo(dinfo); > + blk_size = blk_getlength(blk); > + if (blk_size < fiu->flash_size) { > + blk_get_perm(blk, &perm, &shared_perm); > + blk_set_perm(blk, BLK_PERM_ALL, BLK_PERM_ALL, &error_abort); > + blk_truncate(blk, fiu->flash_size, true, PREALLOC_MODE_OFF, > + BDRV_REQ_ZERO_WRITE, &error_abort); > + blk_set_perm(blk, perm, shared_perm, &error_abort); This won't work on read-only storage. > + } > } > qdev_realize_and_unref(flash, BUS(fiu->spi), &error_fatal); > > @@ -194,7 +206,8 @@ static void npcm845_evb_init(MachineState *machine) > qdev_realize(DEVICE(soc), NULL, &error_fatal); > > npcm8xx_load_bootrom(machine, soc); > - npcm8xx_connect_flash(&soc->fiu[0], 0, "w25q256", drive_get(IF_MTD, 0, 0)); > + npcm8xx_connect_flash(&soc->fiu[0], 0, "mx66l1g45g", > + drive_get(IF_MTD, 0, 0)); > npcm845_evb_i2c_init(soc); > npcm845_evb_fan_init(NPCM8XX_MACHINE(machine), soc); > npcm8xx_load_kernel(machine, soc);
> This won't work on read-only storage. > > > + } > > } > > qdev_realize_and_unref(flash, BUS(fiu->spi), &error_fatal); > > > > @@ -194,7 +206,8 @@ static void npcm845_evb_init(MachineState *machine) > > qdev_realize(DEVICE(soc), NULL, &error_fatal); > > > > npcm8xx_load_bootrom(machine, soc); > > - npcm8xx_connect_flash(&soc->fiu[0], 0, "w25q256", drive_get(IF_MTD, 0, 0)); > > + npcm8xx_connect_flash(&soc->fiu[0], 0, "mx66l1g45g", > > + drive_get(IF_MTD, 0, 0)); > > npcm845_evb_i2c_init(soc); > > npcm845_evb_fan_init(NPCM8XX_MACHINE(machine), soc); > > npcm8xx_load_kernel(machine, soc); > Indeed, we didn't consider the read-only storage case. Should we add bdrv_is_read_only() to check as shown in the code below? Thanks. if (bdrv_is_read_only(bs)) { // Handle read-only storage if (blk_size < fiu->flash_size) { error_report("Read-only storage is too small for flash device"); return; } } else { // Handle writable storage if (blk_size < fiu->flash_size) { blk_get_perm(blk, &perm, &shared_perm); blk_set_perm(blk, BLK_PERM_ALL, BLK_PERM_ALL, &error_abort); blk_truncate(blk, fiu->flash_size, true, PREALLOC_MODE_OFF, BDRV_REQ_ZERO_WRITE, &error_abort); blk_set_perm(blk, perm, shared_perm, &error_abort); } } -- Best regards, Tim Lee
From: Tim Lee <timlee660101@gmail.com>
Sent: Tuesday, April 1, 2025 4:59 PM
To: peter.maydell@linaro.org
Cc: qemu-arm@nongnu.org; qemu-devel@nongnu.org; wuhaotsh@google.com; CS20 CHLi30 <CHLI30@nuvoton.com>; CS20 KFTing <KFTING@nuvoton.com>; Tim Lee <timlee660101@gmail.com>
Subject: [PATCH] hw/arm/npcm8xx_boards: Add auto zero flash image and device part number
Fix flash device part number to `mx66l1g45g` according image-bmc run on npcm8xx evb board (SPIFlash...SF: Detected mx66l1g45g, total 128 MiB)
And add auto zero flash image size to resolve error below after executing
`./qemu-system-aarch64 -machine npcm845-evb -drive file=image-bmc`
Error message:
qemu-system-aarch64: mx66l1g45g device '/machine/unattached/device[73]'
requires 134217728 bytes, mtd0 block backend provides 67108864 bytes
Tested:
Build passes and runs ./qemu-system-aarch64 -machine npcm845-evb normally
Signed-off-by: Tim Lee <timlee660101@gmail.com>
---
hw/arm/npcm8xx_boards.c | 15 ++++++++++++++-
1 file changed, 14 insertions(+), 1 deletion(-)
diff --git a/hw/arm/npcm8xx_boards.c b/hw/arm/npcm8xx_boards.c index 3fb8478e72..11b792c613 100644
--- a/hw/arm/npcm8xx_boards.c
+++ b/hw/arm/npcm8xx_boards.c
@@ -27,6 +27,7 @@
#include "qemu/error-report.h"
#include "qemu/datadir.h"
#include "qemu/units.h"
+#include "system/block-backend.h"
#define NPCM845_EVB_POWER_ON_STRAPS 0x000017ff
@@ -59,10 +60,21 @@ static void npcm8xx_connect_flash(NPCM7xxFIUState *fiu, int cs_no, {
DeviceState *flash;
qemu_irq flash_cs;
+ BlockBackend *blk;
+ uint64_t blk_size, perm, shared_perm;
flash = qdev_new(flash_type);
if (dinfo) {
qdev_prop_set_drive(flash, "drive", blk_by_legacy_dinfo(dinfo));
+ blk = blk_by_legacy_dinfo(dinfo);
+ blk_size = blk_getlength(blk);
+ if (blk_size < fiu->flash_size) {
+ blk_get_perm(blk, &perm, &shared_perm);
+ blk_set_perm(blk, BLK_PERM_ALL, BLK_PERM_ALL, &error_abort);
+ blk_truncate(blk, fiu->flash_size, true, PREALLOC_MODE_OFF,
+ BDRV_REQ_ZERO_WRITE, &error_abort);
+ blk_set_perm(blk, perm, shared_perm, &error_abort);
+ }
}
qdev_realize_and_unref(flash, BUS(fiu->spi), &error_fatal);
@@ -194,7 +206,8 @@ static void npcm845_evb_init(MachineState *machine)
qdev_realize(DEVICE(soc), NULL, &error_fatal);
npcm8xx_load_bootrom(machine, soc);
- npcm8xx_connect_flash(&soc->fiu[0], 0, "w25q256", drive_get(IF_MTD, 0, 0));
+ npcm8xx_connect_flash(&soc->fiu[0], 0, "mx66l1g45g",
+ drive_get(IF_MTD, 0, 0));
npcm845_evb_i2c_init(soc);
npcm845_evb_fan_init(NPCM8XX_MACHINE(machine), soc);
npcm8xx_load_kernel(machine, soc);
--
2.34.1
Reviewed-by: Tyrone Ting <kfting@nuvoton.com>
________________________________
________________________________
The privileged confidential information contained in this email is intended for use only by the addressees as indicated by the original sender of this email. If you are not the addressee indicated in this email or are not responsible for delivery of the email to such a person, please kindly reply to the sender indicating this fact and delete all copies of it from your computer and network server immediately. Your cooperation is highly appreciated. It is advised that any unauthorized use of confidential information of Nuvoton is strictly prohibited; and any information in this email irrelevant to the official business of Nuvoton shall be deemed as neither given nor endorsed by Nuvoton.
© 2016 - 2025 Red Hat, Inc.