Message ID | 20210128064312.16085-4-bmeng.cn@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | hw/sd: sd: erase operation fixes | expand |
On 1/28/21 7:43 AM, Bin Meng wrote: > From: Bin Meng <bin.meng@windriver.com> > > At present the sd_erase() does not erase the requested range of card > data to 0xFFs. Let's make the erase operation actually happen. > > Signed-off-by: Bin Meng <bin.meng@windriver.com> > > --- > > hw/sd/sd.c | 9 +++++++++ > 1 file changed, 9 insertions(+) > > diff --git a/hw/sd/sd.c b/hw/sd/sd.c > index 1886d4b30b..8c397d4ad7 100644 > --- a/hw/sd/sd.c > +++ b/hw/sd/sd.c > @@ -765,6 +765,8 @@ static void sd_erase(SDState *sd) > int i; > uint64_t erase_start = sd->erase_start; > uint64_t erase_end = sd->erase_end; > + uint64_t erase_addr; > + int erase_len = 1 << HWBLOCK_SHIFT; > > trace_sdcard_erase(sd->erase_start, sd->erase_end); > if (sd->erase_start == INVALID_ADDRESS > @@ -788,6 +790,13 @@ static void sd_erase(SDState *sd) > return; > } > > + memset(sd->data, 0xff, erase_len); > + erase_addr = erase_start; > + for (i = 0; i < (erase_end - erase_start) / erase_len + 1; i++) { > + BLK_WRITE_BLOCK(erase_addr, erase_len); > + erase_addr += erase_len; > + } Watch out, you are erasing eventual write-protected blocks. > erase_start = sd_addr_to_wpnum(erase_start); > erase_end = sd_addr_to_wpnum(erase_end); > sd->erase_start = INVALID_ADDRESS; >
diff --git a/hw/sd/sd.c b/hw/sd/sd.c index 1886d4b30b..8c397d4ad7 100644 --- a/hw/sd/sd.c +++ b/hw/sd/sd.c @@ -765,6 +765,8 @@ static void sd_erase(SDState *sd) int i; uint64_t erase_start = sd->erase_start; uint64_t erase_end = sd->erase_end; + uint64_t erase_addr; + int erase_len = 1 << HWBLOCK_SHIFT; trace_sdcard_erase(sd->erase_start, sd->erase_end); if (sd->erase_start == INVALID_ADDRESS @@ -788,6 +790,13 @@ static void sd_erase(SDState *sd) return; } + memset(sd->data, 0xff, erase_len); + erase_addr = erase_start; + for (i = 0; i < (erase_end - erase_start) / erase_len + 1; i++) { + BLK_WRITE_BLOCK(erase_addr, erase_len); + erase_addr += erase_len; + } + erase_start = sd_addr_to_wpnum(erase_start); erase_end = sd_addr_to_wpnum(erase_end); sd->erase_start = INVALID_ADDRESS;