On 19/9/25 14:34, Christian Speich wrote:
Currently, erased blocks are filled with 0xFF. However SCR Bit 55
(DATA_STAT_AFTER_ERASE) indicates that an erase produces zeros. One of
them is wrong.

You are right, we don't set DATA_STAT_AFTER_ERASE correctly.

As erasing to zero is more performant and allows block devices to
use optimizations, we the erase to produce 0x00.

Signed-off-by: Christian Speich <[email protected]>
---
  hw/sd/sd.c | 4 ++--
  1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index 
23764ed99f36cf39ee7abe02f08e51897c05e718..94ef3cc62582717ee044c4b114b7f22bd1b4a256
 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -1115,7 +1115,6 @@ static void sd_erase(SDState *sd)
      sd->erase_end = INVALID_ADDRESS;
      sd->csd[14] |= 0x40;
- memset(sd->data, 0xff, erase_len);
      for (erase_addr = erase_start; erase_addr <= erase_end;
           erase_addr += erase_len) {
          if (sdsc) {
@@ -1127,7 +1126,8 @@ static void sd_erase(SDState *sd)
                  continue;
              }
          }
-        sd_blk_write(sd, erase_addr, erase_len);
+        blk_pwrite_zeroes(sd->blk, erase_addr + sd_part_offset(sd),
+                          erase_len, 0);
      }
  }

I'm OK with this change, but I'd rather having a device boolean property
so we can keep the old behavior for backward compatibility. Maybe
'erase-block-as-zero'? Do you mind updating this patch?

Regards,

Phil.

Reply via email to