* [PATCH 0/3] hw/sd: sd: erase operation fixes
@ 2021-01-28 6:43 Bin Meng
2021-01-28 6:43 ` [PATCH 1/3] hw/sd: sd: Fix address check in sd_erase() Bin Meng
` (3 more replies)
0 siblings, 4 replies; 9+ messages in thread
From: Bin Meng @ 2021-01-28 6:43 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, qemu-block, qemu-devel; +Cc: Bin Meng
From: Bin Meng <bin.meng@windriver.com>
This includes several fixes related to erase operation of a SD card.
Based-on:
http://patchwork.ozlabs.org/project/qemu-devel/list/?series=226785
Bin Meng (3):
hw/sd: sd: Fix address check in sd_erase()
hw/sd: sd: Move the sd_block_{read,write} and macros ahead
hw/sd: sd: Actually perform the erase operation
hw/sd/sd.c | 53 +++++++++++++++++++++++++++++++----------------------
1 file changed, 31 insertions(+), 22 deletions(-)
--
2.25.1
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 1/3] hw/sd: sd: Fix address check in sd_erase()
2021-01-28 6:43 [PATCH 0/3] hw/sd: sd: erase operation fixes Bin Meng
@ 2021-01-28 6:43 ` Bin Meng
2021-02-08 10:06 ` Philippe Mathieu-Daudé
2021-01-28 6:43 ` [PATCH 2/3] hw/sd: sd: Move the sd_block_{read, write} and macros ahead Bin Meng
` (2 subsequent siblings)
3 siblings, 1 reply; 9+ messages in thread
From: Bin Meng @ 2021-01-28 6:43 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, qemu-block, qemu-devel; +Cc: Bin Meng
From: Bin Meng <bin.meng@windriver.com>
For high capacity memory cards, the erase start address and end
address are multiplied by 512, but the address check is still
based on the original block number in sd->erase_{start, end}.
Fixes: 1bd6fd8ed593 ("hw/sd/sdcard: Do not attempt to erase out of range addresses")
Signed-off-by: Bin Meng <bin.meng@windriver.com>
---
hw/sd/sd.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index c99c0e93bb..a6a0b3dcc6 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -760,7 +760,7 @@ static void sd_erase(SDState *sd)
erase_end *= 512;
}
- if (sd->erase_start > sd->size || sd->erase_end > sd->size) {
+ if (erase_start > sd->size || erase_end > sd->size) {
sd->card_status |= OUT_OF_RANGE;
sd->erase_start = INVALID_ADDRESS;
sd->erase_end = INVALID_ADDRESS;
--
2.25.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 2/3] hw/sd: sd: Move the sd_block_{read, write} and macros ahead
2021-01-28 6:43 [PATCH 0/3] hw/sd: sd: erase operation fixes Bin Meng
2021-01-28 6:43 ` [PATCH 1/3] hw/sd: sd: Fix address check in sd_erase() Bin Meng
@ 2021-01-28 6:43 ` Bin Meng
2021-01-28 7:04 ` Cédric Le Goater
2021-01-28 6:43 ` [PATCH 3/3] hw/sd: sd: Actually perform the erase operation Bin Meng
2021-02-08 3:52 ` [PATCH 0/3] hw/sd: sd: erase operation fixes Bin Meng
3 siblings, 1 reply; 9+ messages in thread
From: Bin Meng @ 2021-01-28 6:43 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, qemu-block, qemu-devel; +Cc: Bin Meng
From: Bin Meng <bin.meng@windriver.com>
These APIs and macros may be referenced by functions that are
currently before them. Move them ahead a little bit.
Signed-off-by: Bin Meng <bin.meng@windriver.com>
---
hw/sd/sd.c | 42 +++++++++++++++++++++---------------------
1 file changed, 21 insertions(+), 21 deletions(-)
diff --git a/hw/sd/sd.c b/hw/sd/sd.c
index a6a0b3dcc6..1886d4b30b 100644
--- a/hw/sd/sd.c
+++ b/hw/sd/sd.c
@@ -739,6 +739,27 @@ void sd_set_cb(SDState *sd, qemu_irq readonly, qemu_irq insert)
qemu_set_irq(insert, sd->blk ? blk_is_inserted(sd->blk) : 0);
}
+static void sd_blk_read(SDState *sd, uint64_t addr, uint32_t len)
+{
+ trace_sdcard_read_block(addr, len);
+ if (!sd->blk || blk_pread(sd->blk, addr, sd->data, len) < 0) {
+ fprintf(stderr, "sd_blk_read: read error on host side\n");
+ }
+}
+
+static void sd_blk_write(SDState *sd, uint64_t addr, uint32_t len)
+{
+ trace_sdcard_write_block(addr, len);
+ if (!sd->blk || blk_pwrite(sd->blk, addr, sd->data, len, 0) < 0) {
+ fprintf(stderr, "sd_blk_write: write error on host side\n");
+ }
+}
+
+#define BLK_READ_BLOCK(a, len) sd_blk_read(sd, a, len)
+#define BLK_WRITE_BLOCK(a, len) sd_blk_write(sd, a, len)
+#define APP_READ_BLOCK(a, len) memset(sd->data, 0xec, len)
+#define APP_WRITE_BLOCK(a, len)
+
static void sd_erase(SDState *sd)
{
int i;
@@ -1742,27 +1763,6 @@ send_response:
return rsplen;
}
-static void sd_blk_read(SDState *sd, uint64_t addr, uint32_t len)
-{
- trace_sdcard_read_block(addr, len);
- if (!sd->blk || blk_pread(sd->blk, addr, sd->data, len) < 0) {
- fprintf(stderr, "sd_blk_read: read error on host side\n");
- }
-}
-
-static void sd_blk_write(SDState *sd, uint64_t addr, uint32_t len)
-{
- trace_sdcard_write_block(addr, len);
- if (!sd->blk || blk_pwrite(sd->blk, addr, sd->data, len, 0) < 0) {
- fprintf(stderr, "sd_blk_write: write error on host side\n");
- }
-}
-
-#define BLK_READ_BLOCK(a, len) sd_blk_read(sd, a, len)
-#define BLK_WRITE_BLOCK(a, len) sd_blk_write(sd, a, len)
-#define APP_READ_BLOCK(a, len) memset(sd->data, 0xec, len)
-#define APP_WRITE_BLOCK(a, len)
-
void sd_write_byte(SDState *sd, uint8_t value)
{
int i;
--
2.25.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 3/3] hw/sd: sd: Actually perform the erase operation
2021-01-28 6:43 [PATCH 0/3] hw/sd: sd: erase operation fixes Bin Meng
2021-01-28 6:43 ` [PATCH 1/3] hw/sd: sd: Fix address check in sd_erase() Bin Meng
2021-01-28 6:43 ` [PATCH 2/3] hw/sd: sd: Move the sd_block_{read, write} and macros ahead Bin Meng
@ 2021-01-28 6:43 ` Bin Meng
2021-02-08 10:17 ` Philippe Mathieu-Daudé
2021-02-08 3:52 ` [PATCH 0/3] hw/sd: sd: erase operation fixes Bin Meng
3 siblings, 1 reply; 9+ messages in thread
From: Bin Meng @ 2021-01-28 6:43 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, qemu-block, qemu-devel; +Cc: Bin Meng
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;
+ }
+
erase_start = sd_addr_to_wpnum(erase_start);
erase_end = sd_addr_to_wpnum(erase_end);
sd->erase_start = INVALID_ADDRESS;
--
2.25.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 2/3] hw/sd: sd: Move the sd_block_{read, write} and macros ahead
2021-01-28 6:43 ` [PATCH 2/3] hw/sd: sd: Move the sd_block_{read, write} and macros ahead Bin Meng
@ 2021-01-28 7:04 ` Cédric Le Goater
2021-02-08 10:12 ` Philippe Mathieu-Daudé
0 siblings, 1 reply; 9+ messages in thread
From: Cédric Le Goater @ 2021-01-28 7:04 UTC (permalink / raw)
To: Bin Meng, Philippe Mathieu-Daudé, qemu-block, qemu-devel; +Cc: Bin Meng
Hello Bin,
On 1/28/21 7:43 AM, Bin Meng wrote:
> From: Bin Meng <bin.meng@windriver.com>
>
> These APIs and macros may be referenced by functions that are
> currently before them. Move them ahead a little bit.
We could also change fprintf() by qemu_log_mask()
Thanks,
C.
> Signed-off-by: Bin Meng <bin.meng@windriver.com>
> ---
>
> hw/sd/sd.c | 42 +++++++++++++++++++++---------------------
> 1 file changed, 21 insertions(+), 21 deletions(-)
>
> diff --git a/hw/sd/sd.c b/hw/sd/sd.c
> index a6a0b3dcc6..1886d4b30b 100644
> --- a/hw/sd/sd.c
> +++ b/hw/sd/sd.c
> @@ -739,6 +739,27 @@ void sd_set_cb(SDState *sd, qemu_irq readonly, qemu_irq insert)
> qemu_set_irq(insert, sd->blk ? blk_is_inserted(sd->blk) : 0);
> }
>
> +static void sd_blk_read(SDState *sd, uint64_t addr, uint32_t len)
> +{
> + trace_sdcard_read_block(addr, len);
> + if (!sd->blk || blk_pread(sd->blk, addr, sd->data, len) < 0) {
> + fprintf(stderr, "sd_blk_read: read error on host side\n");
> + }
> +}
> +
> +static void sd_blk_write(SDState *sd, uint64_t addr, uint32_t len)
> +{
> + trace_sdcard_write_block(addr, len);
> + if (!sd->blk || blk_pwrite(sd->blk, addr, sd->data, len, 0) < 0) {
> + fprintf(stderr, "sd_blk_write: write error on host side\n");
> + }
> +}
> +
> +#define BLK_READ_BLOCK(a, len) sd_blk_read(sd, a, len)
> +#define BLK_WRITE_BLOCK(a, len) sd_blk_write(sd, a, len)
> +#define APP_READ_BLOCK(a, len) memset(sd->data, 0xec, len)
> +#define APP_WRITE_BLOCK(a, len)
> +
> static void sd_erase(SDState *sd)
> {
> int i;
> @@ -1742,27 +1763,6 @@ send_response:
> return rsplen;
> }
>
> -static void sd_blk_read(SDState *sd, uint64_t addr, uint32_t len)
> -{
> - trace_sdcard_read_block(addr, len);
> - if (!sd->blk || blk_pread(sd->blk, addr, sd->data, len) < 0) {
> - fprintf(stderr, "sd_blk_read: read error on host side\n");
> - }
> -}
> -
> -static void sd_blk_write(SDState *sd, uint64_t addr, uint32_t len)
> -{
> - trace_sdcard_write_block(addr, len);
> - if (!sd->blk || blk_pwrite(sd->blk, addr, sd->data, len, 0) < 0) {
> - fprintf(stderr, "sd_blk_write: write error on host side\n");
> - }
> -}
> -
> -#define BLK_READ_BLOCK(a, len) sd_blk_read(sd, a, len)
> -#define BLK_WRITE_BLOCK(a, len) sd_blk_write(sd, a, len)
> -#define APP_READ_BLOCK(a, len) memset(sd->data, 0xec, len)
> -#define APP_WRITE_BLOCK(a, len)
> -
> void sd_write_byte(SDState *sd, uint8_t value)
> {
> int i;
>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 0/3] hw/sd: sd: erase operation fixes
2021-01-28 6:43 [PATCH 0/3] hw/sd: sd: erase operation fixes Bin Meng
` (2 preceding siblings ...)
2021-01-28 6:43 ` [PATCH 3/3] hw/sd: sd: Actually perform the erase operation Bin Meng
@ 2021-02-08 3:52 ` Bin Meng
3 siblings, 0 replies; 9+ messages in thread
From: Bin Meng @ 2021-02-08 3:52 UTC (permalink / raw)
To: Philippe Mathieu-Daudé, Qemu-block,
qemu-devel@nongnu.org Developers
Cc: Bin Meng
On Thu, Jan 28, 2021 at 2:43 PM Bin Meng <bmeng.cn@gmail.com> wrote:
>
> From: Bin Meng <bin.meng@windriver.com>
>
> This includes several fixes related to erase operation of a SD card.
>
> Based-on:
> http://patchwork.ozlabs.org/project/qemu-devel/list/?series=226785
>
>
> Bin Meng (3):
> hw/sd: sd: Fix address check in sd_erase()
> hw/sd: sd: Move the sd_block_{read,write} and macros ahead
> hw/sd: sd: Actually perform the erase operation
>
> hw/sd/sd.c | 53 +++++++++++++++++++++++++++++++----------------------
> 1 file changed, 31 insertions(+), 22 deletions(-)
Ping?
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/3] hw/sd: sd: Fix address check in sd_erase()
2021-01-28 6:43 ` [PATCH 1/3] hw/sd: sd: Fix address check in sd_erase() Bin Meng
@ 2021-02-08 10:06 ` Philippe Mathieu-Daudé
0 siblings, 0 replies; 9+ messages in thread
From: Philippe Mathieu-Daudé @ 2021-02-08 10:06 UTC (permalink / raw)
To: Bin Meng, qemu-block, qemu-devel; +Cc: Bin Meng
On 1/28/21 7:43 AM, Bin Meng wrote:
> From: Bin Meng <bin.meng@windriver.com>
>
> For high capacity memory cards, the erase start address and end
> address are multiplied by 512, but the address check is still
> based on the original block number in sd->erase_{start, end}.
Oops, good catch.
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
>
> Fixes: 1bd6fd8ed593 ("hw/sd/sdcard: Do not attempt to erase out of range addresses")
> Signed-off-by: Bin Meng <bin.meng@windriver.com>
> ---
>
> hw/sd/sd.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/3] hw/sd: sd: Move the sd_block_{read, write} and macros ahead
2021-01-28 7:04 ` Cédric Le Goater
@ 2021-02-08 10:12 ` Philippe Mathieu-Daudé
0 siblings, 0 replies; 9+ messages in thread
From: Philippe Mathieu-Daudé @ 2021-02-08 10:12 UTC (permalink / raw)
To: Cédric Le Goater, Bin Meng, qemu-block, qemu-devel; +Cc: Bin Meng
On 1/28/21 8:04 AM, Cédric Le Goater wrote:
> Hello Bin,
>
> On 1/28/21 7:43 AM, Bin Meng wrote:
>> From: Bin Meng <bin.meng@windriver.com>
>>
>> These APIs and macros may be referenced by functions that are
>> currently before them. Move them ahead a little bit.
>
> We could also change fprintf() by qemu_log_mask()
Hmm in this case warn_report() maybe, as IIUC QEMU aims
to support using smaller block drive (which this model
currently rejects), in which case this wouldn't be a
GUEST_ERROR. Can be done on top in another patch, since
this is pure code movement.
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 3/3] hw/sd: sd: Actually perform the erase operation
2021-01-28 6:43 ` [PATCH 3/3] hw/sd: sd: Actually perform the erase operation Bin Meng
@ 2021-02-08 10:17 ` Philippe Mathieu-Daudé
0 siblings, 0 replies; 9+ messages in thread
From: Philippe Mathieu-Daudé @ 2021-02-08 10:17 UTC (permalink / raw)
To: Bin Meng, qemu-block, qemu-devel; +Cc: Bin Meng
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;
>
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2021-02-08 17:30 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-01-28 6:43 [PATCH 0/3] hw/sd: sd: erase operation fixes Bin Meng
2021-01-28 6:43 ` [PATCH 1/3] hw/sd: sd: Fix address check in sd_erase() Bin Meng
2021-02-08 10:06 ` Philippe Mathieu-Daudé
2021-01-28 6:43 ` [PATCH 2/3] hw/sd: sd: Move the sd_block_{read, write} and macros ahead Bin Meng
2021-01-28 7:04 ` Cédric Le Goater
2021-02-08 10:12 ` Philippe Mathieu-Daudé
2021-01-28 6:43 ` [PATCH 3/3] hw/sd: sd: Actually perform the erase operation Bin Meng
2021-02-08 10:17 ` Philippe Mathieu-Daudé
2021-02-08 3:52 ` [PATCH 0/3] hw/sd: sd: erase operation fixes Bin Meng
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).