[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 15/15] hw/onenand: program actions can only clea
From: |
andrzej zaborowski |
Subject: |
Re: [Qemu-devel] [PATCH 15/15] hw/onenand: program actions can only clear bits |
Date: |
Sat, 30 Jul 2011 07:19:46 +0200 |
On 29 July 2011 17:35, Peter Maydell <address@hidden> wrote:
> From: Juha Riihimäki <address@hidden>
>
> The program actions onenand_prog_main() and onenand_prog_spare()
> can only set bits.
>
> This implies a rewrite of onenand_erase() to not use the program
> functions, since erase does need to set bits.
>
> Signed-off-by: Juha Riihimäki <address@hidden>
> [Riku Voipio: Fixes and restructuring patchset]
> Signed-off-by: Riku Voipio <address@hidden>
> [Peter Maydell: More fixes and cleanups for upstream submission]
> Signed-off-by: Peter Maydell <address@hidden>
> ---
> hw/onenand.c | 135 +++++++++++++++++++++++++++++++++++++++++++++------------
> 1 files changed, 106 insertions(+), 29 deletions(-)
>
> diff --git a/hw/onenand.c b/hw/onenand.c
...
> static inline int onenand_erase(OneNANDState *s, int sec, int num)
> {
> - /* TODO: optimise */
> - uint8_t buf[512];
> -
> - memset(buf, 0xff, sizeof(buf));
> - for (; num > 0; num --, sec ++) {
> - if (onenand_prog_main(s, sec, 1, buf))
> - return 1;
> - if (onenand_prog_spare(s, sec, 1, buf))
> - return 1;
> + uint8_t *blankbuf, *tmpbuf;
> + blankbuf = qemu_malloc(512);
> + if (!blankbuf) {
> + return 1;
> + }
> + tmpbuf = qemu_malloc(512);
> + if (!tmpbuf) {
> + qemu_free(blankbuf);
> + return 1;
> + }
> + memset(blankbuf, 0xff, 512);
> + for (; num > 0; num--, sec++) {
> + if (s->bdrv_cur) {
> + int erasesec = s->secs_cur + (sec >> 5);
> + if (bdrv_write(s->bdrv_cur, sec, blankbuf, 1)) {
> + goto fail;
> + }
> + if (bdrv_read(s->bdrv_cur, erasesec, tmpbuf, 1) < 0) {
> + goto fail;
> + }
> + memcpy(tmpbuf + ((sec & 31) << 4), blankbuf, 1 << 4);
> + if (bdrv_write(s->bdrv_cur, erasesec, tmpbuf, 1) < 0) {
> + goto fail;
> + }
By the way it seems that this can be optimised to require just one
read for the entire erase.
Cheers
- [Qemu-devel] [PATCH 10/15] hw/nand: Writing to NAND can only clear bits, (continued)
- [Qemu-devel] [PATCH 10/15] hw/nand: Writing to NAND can only clear bits, Peter Maydell, 2011/07/29
- [Qemu-devel] [PATCH 06/15] hw/nand: Pass block device state to init function, Peter Maydell, 2011/07/29
- [Qemu-devel] [PATCH 14/15] onenand: Ignore zero writes to boot command space, Peter Maydell, 2011/07/29
- [Qemu-devel] [PATCH 01/15] hw/omap_l4.c: Add helper function omap_l4_region_base, Peter Maydell, 2011/07/29
- [Qemu-devel] [PATCH 08/15] hw/nand: Support devices wider than 8 bits, Peter Maydell, 2011/07/29
- [Qemu-devel] [PATCH 02/15] hw/omap_gpio.c: Don't complain about some writes to r/o registers, Peter Maydell, 2011/07/29
- [Qemu-devel] [PATCH 11/15] hw/nand: qdevify, Peter Maydell, 2011/07/29
- [Qemu-devel] [PATCH 15/15] hw/onenand: program actions can only clear bits, Peter Maydell, 2011/07/29
- Re: [Qemu-devel] [PATCH 15/15] hw/onenand: program actions can only clear bits,
andrzej zaborowski <=
- [Qemu-devel] [PATCH 09/15] hw/nand: Support multiple reads following READ STATUS, Peter Maydell, 2011/07/29
- [Qemu-devel] [PATCH 13/15] onenand: Handle various ID fields separately, Peter Maydell, 2011/07/29
- [Qemu-devel] [PATCH 04/15] hw/omap_gpio.c: Convert to qdev, Peter Maydell, 2011/07/29
- [Qemu-devel] [PATCH 07/15] hw/nand: Support large NAND devices, Peter Maydell, 2011/07/29
- [Qemu-devel] [PATCH 05/15] lm832x: Take DeviceState pointer in lm832x_key_event(), Peter Maydell, 2011/07/29
- [Qemu-devel] [PATCH 12/15] onenand: Pass BlockDriverState to init function, Peter Maydell, 2011/07/29
- [Qemu-devel] [PATCH 03/15] hw/omap_clk: Add the clock for the OMAP2430-specific fifth GPIO module, Peter Maydell, 2011/07/29