[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v2 08/10] m25p80: Fast read commands family chan
From: |
Cédric Le Goater |
Subject: |
Re: [Qemu-devel] [PATCH v2 08/10] m25p80: Fast read commands family changes. |
Date: |
Fri, 17 Jun 2016 14:30:54 +0200 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Icedove/45.1.0 |
On 06/17/2016 12:28 PM, address@hidden wrote:
> From: Marcin Krzeminski <address@hidden>
>
> Support for Spansion and Macronix flashes.
> Additionally Numonyx(Micron) moved from default
> in fast read commands family. Also moved fast read
> command decoding to functions.
>
> Signed-off-by: Marcin Krzeminski <address@hidden>
Reviewed-by: Cédric Le Goater <address@hidden>
Thanks, it looks better.
C.
> ---
> hw/block/m25p80.c | 145
> ++++++++++++++++++++++++++++++++++++++++--------------
> 1 file changed, 108 insertions(+), 37 deletions(-)
>
> diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
> index 21998db..f40fa99 100644
> --- a/hw/block/m25p80.c
> +++ b/hw/block/m25p80.c
> @@ -719,6 +719,111 @@ static void reset_memory(Flash *s)
> DB_PRINT_L(0, "Reset done.\n");
> }
>
> +static void decode_fast_read_cmd(Flash *s)
> +{
> + s->needed_bytes = get_addr_length(s);
> + switch (get_man(s)) {
> + /* Dummy cycles - modeled with bytes writes instead of bits */
> + case MAN_NUMONYX:
> + s->needed_bytes += extract32(s->volatile_cfg, 4, 4);
> + break;
> + case MAN_MACRONIX:
> + if (extract32(s->volatile_cfg, 6, 2) == 1) {
> + s->needed_bytes += 6;
> + } else {
> + s->needed_bytes += 8;
> + }
> + break;
> + case MAN_SPANSION:
> + s->needed_bytes += extract32(s->spansion_cr2v,
> + SPANSION_DUMMY_CLK_POS,
> + SPANSION_DUMMY_CLK_LEN
> + );
> + break;
> + default:
> + break;
> + }
> + s->pos = 0;
> + s->len = 0;
> + s->state = STATE_COLLECTING_DATA;
> +}
> +
> +static void decode_dio_read_cmd(Flash *s)
> +{
> + s->needed_bytes = get_addr_length(s);
> + /* Dummy cycles modeled with bytes writes instead of bits */
> + switch (get_man(s)) {
> + case MAN_WINBOND:
> + s->needed_bytes = 4;
> + break;
> + case MAN_SPANSION:
> + s->needed_bytes += extract32(s->spansion_cr2v,
> + SPANSION_DUMMY_CLK_POS,
> + SPANSION_DUMMY_CLK_LEN
> + );
> + break;
> + case MAN_NUMONYX:
> + s->needed_bytes += extract32(s->volatile_cfg, 4, 4);
> + break;
> + case MAN_MACRONIX:
> + switch (extract32(s->volatile_cfg, 6, 2)) {
> + case 1:
> + s->needed_bytes += 6;
> + break;
> + case 2:
> + s->needed_bytes += 8;
> + break;
> + default:
> + s->needed_bytes += 4;
> + break;
> + }
> + break;
> + default:
> + break;
> + }
> + s->pos = 0;
> + s->len = 0;
> + s->state = STATE_COLLECTING_DATA;
> +}
> +
> +static void decode_qio_read_cmd(Flash *s)
> +{
> + s->needed_bytes = get_addr_length(s);
> + /* Dummy cycles modeled with bytes writes instead of bits */
> + switch (get_man(s)) {
> + case MAN_WINBOND:
> + s->needed_bytes = 6;
> + break;
> + case MAN_SPANSION:
> + s->needed_bytes += extract32(s->spansion_cr2v,
> + SPANSION_DUMMY_CLK_POS,
> + SPANSION_DUMMY_CLK_LEN
> + );
> + break;
> + case MAN_NUMONYX:
> + s->needed_bytes += extract32(s->volatile_cfg, 4, 4);
> + break;
> + case MAN_MACRONIX:
> + switch (extract32(s->volatile_cfg, 6, 2)) {
> + case 1:
> + s->needed_bytes += 4;
> + break;
> + case 2:
> + s->needed_bytes += 8;
> + break;
> + default:
> + s->needed_bytes += 6;
> + break;
> + }
> + break;
> + default:
> + break;
> + }
> + s->pos = 0;
> + s->len = 0;
> + s->state = STATE_COLLECTING_DATA;
> +}
> +
> static void decode_new_cmd(Flash *s, uint32_t value)
> {
> s->cmd_in_progress = value;
> @@ -756,51 +861,17 @@ static void decode_new_cmd(Flash *s, uint32_t value)
> case DOR4:
> case QOR:
> case QOR4:
> - s->needed_bytes = get_addr_length(s);
> - switch (get_man(s)) {
> - case MAN_NUMONYX:
> - s->needed_bytes += extract32(s->volatile_cfg, 4, 4);
> - break;
> - default:
> - break;
> - }
> - s->pos = 0;
> - s->len = 0;
> - s->state = STATE_COLLECTING_DATA;
> + decode_fast_read_cmd(s);
> break;
>
> case DIOR:
> case DIOR4:
> - switch (get_man(s)) {
> - case MAN_WINBOND:
> - case MAN_SPANSION:
> - s->needed_bytes = 4;
> - break;
> - default:
> - s->needed_bytes = get_addr_length(s);
> - /* Dummy cycles modeled with bytes writes instead of bits */
> - s->needed_bytes += extract32(s->volatile_cfg, 4, 4);
> - }
> - s->pos = 0;
> - s->len = 0;
> - s->state = STATE_COLLECTING_DATA;
> + decode_dio_read_cmd(s);
> break;
>
> case QIOR:
> case QIOR4:
> - switch (get_man(s)) {
> - case MAN_WINBOND:
> - case MAN_SPANSION:
> - s->needed_bytes = 6;
> - break;
> - default:
> - s->needed_bytes = get_addr_length(s);
> - /* Dummy cycles modeled with bytes writes instead of bits */
> - s->needed_bytes += extract32(s->volatile_cfg, 4, 4);
> - }
> - s->pos = 0;
> - s->len = 0;
> - s->state = STATE_COLLECTING_DATA;
> + decode_qio_read_cmd(s);
> break;
>
> case WRSR:
>
- [Qemu-devel] [PATCH v2 00/10] m25p80: Add new 512Mbit and 1Gbit devices., marcin.krzeminski, 2016/06/17
- [Qemu-devel] [PATCH v2 05/10] m25p80: Add additional flash commands:, marcin.krzeminski, 2016/06/17
- [Qemu-devel] [PATCH v2 09/10] m25p80: New flash devices., marcin.krzeminski, 2016/06/17
- [Qemu-devel] [PATCH v2 10/10] m25p80.c: Fix WINBOND fast read command handling, marcin.krzeminski, 2016/06/17
- [Qemu-devel] [PATCH v2 02/10] m25p80: Make a table for JEDEC ID., marcin.krzeminski, 2016/06/17
- [Qemu-devel] [PATCH v2 06/10] m25p80: Introduce quad and equad modes., marcin.krzeminski, 2016/06/17
- [Qemu-devel] [PATCH v2 08/10] m25p80: Fast read commands family changes., marcin.krzeminski, 2016/06/17
- Re: [Qemu-devel] [PATCH v2 08/10] m25p80: Fast read commands family changes.,
Cédric Le Goater <=
- [Qemu-devel] [PATCH v2 04/10] m25p80: Introduce COLLECTING_VAR_LEN_DATA state., marcin.krzeminski, 2016/06/17
- [Qemu-devel] [PATCH v2 03/10] m25p80: Allow more than four banks., marcin.krzeminski, 2016/06/17
- [Qemu-devel] [PATCH v2 07/10] m25p80: Introduce configuration registers., marcin.krzeminski, 2016/06/17
- [Qemu-devel] [PATCH v2 01/10] m25p80: Replace JEDEC ID masking with function., marcin.krzeminski, 2016/06/17