On Thu, Oct 15, 2020 at 12:15 PM Green Wan <green....@sifive.com> wrote: > > Add '-drive' support to OTP device. Allow users to assign a raw file > as OTP image. > > test commands for 16k otp.img filled with zero: > > $ dd if=/dev/zero of=./otp.img bs=1k count=16 > $ ./qemu-system-riscv64 -M sifive_u -m 256M -nographic -bios none \ > -kernel ../opensbi/build/platform/sifive/fu540/firmware/fw_payload.elf \ > -d guest_errors -drive if=none,format=raw,file=otp.img > > Signed-off-by: Green Wan <green....@sifive.com> > --- > hw/misc/sifive_u_otp.c | 67 +++++++++++++++++++++++++++++++++- > include/hw/misc/sifive_u_otp.h | 2 + > 2 files changed, 68 insertions(+), 1 deletion(-) > > diff --git a/hw/misc/sifive_u_otp.c b/hw/misc/sifive_u_otp.c > index 565eec082f..60066375ab 100644 > --- a/hw/misc/sifive_u_otp.c > +++ b/hw/misc/sifive_u_otp.c > @@ -19,11 +19,14 @@ > */ > > #include "qemu/osdep.h" > +#include "qapi/error.h" > #include "hw/qdev-properties.h" > #include "hw/sysbus.h" > #include "qemu/log.h" > #include "qemu/module.h" > #include "hw/misc/sifive_u_otp.h" > +#include "sysemu/blockdev.h" > +#include "sysemu/block-backend.h" > > #define WRITTEN_BIT_ON 0x1 > > @@ -54,6 +57,16 @@ static uint64_t sifive_u_otp_read(void *opaque, hwaddr > addr, unsigned int size) > if ((s->pce & SIFIVE_U_OTP_PCE_EN) && > (s->pdstb & SIFIVE_U_OTP_PDSTB_EN) && > (s->ptrim & SIFIVE_U_OTP_PTRIM_EN)) { > + > + /* read from backend */ > + if (s->blk) { > + int32_t buf; > + > + blk_pread(s->blk, s->pa * SIFIVE_U_OTP_FUSE_WORD, &buf, > + SIFIVE_U_OTP_FUSE_WORD); > + return buf; > + } > + > return s->fuse[s->pa & SIFIVE_U_OTP_PA_MASK]; > } else { > return 0xff; > @@ -137,7 +150,7 @@ static void sifive_u_otp_write(void *opaque, hwaddr addr, > if (s->pwe && !s->pas) { > if (GET_FUSEARRAY_BIT(s->fuse_wo, s->pa, s->paio)) { > qemu_log_mask(LOG_GUEST_ERROR, > - "Error: write idx<%u>, bit<%u>\n", > + "write once error: idx<%u>, bit<%u>\n",
This should be in the patch 1. > s->pa, s->paio); > break; > } > @@ -145,6 +158,12 @@ static void sifive_u_otp_write(void *opaque, hwaddr addr, > /* write bit data */ > SET_FUSEARRAY_BIT(s->fuse, s->pa, s->paio, s->pdin); > > + /* write to backend */ > + if (s->blk) { > + blk_pwrite(s->blk, s->pa * SIFIVE_U_OTP_FUSE_WORD, > + &s->fuse[s->pa], SIFIVE_U_OTP_FUSE_WORD, 0); > + } > + > /* update written bit */ > SET_FUSEARRAY_BIT(s->fuse_wo, s->pa, s->paio, WRITTEN_BIT_ON); > } > @@ -168,16 +187,48 @@ static const MemoryRegionOps sifive_u_otp_ops = { > > static Property sifive_u_otp_properties[] = { > DEFINE_PROP_UINT32("serial", SiFiveUOTPState, serial, 0), > + DEFINE_PROP_DRIVE("drive", SiFiveUOTPState, blk), > DEFINE_PROP_END_OF_LIST(), > }; > Otherwise, Reviewed-by: Bin Meng <bin.m...@windriver.com> Tested-by: Bin Meng <bin.m...@windriver.com> You can drop the "RFC" tag in the next version.