From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59533) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bGMAY-0007js-BA for qemu-devel@nongnu.org; Fri, 24 Jun 2016 04:09:15 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bGMAG-00087R-Ji for qemu-devel@nongnu.org; Fri, 24 Jun 2016 04:08:54 -0400 Received: from mail-db3on0118.outbound.protection.outlook.com ([157.55.234.118]:32846 helo=emea01-db3-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bGMAF-00086b-Vx for qemu-devel@nongnu.org; Fri, 24 Jun 2016 04:08:36 -0400 From: Date: Fri, 24 Jun 2016 10:07:09 +0200 Message-ID: <1466755631-25201-9-git-send-email-marcin.krzeminski@nokia.com> In-Reply-To: <1466755631-25201-1-git-send-email-marcin.krzeminski@nokia.com> References: <1466755631-25201-1-git-send-email-marcin.krzeminski@nokia.com> MIME-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PATCH v3 08/10] m25p80: Fast read commands family changes. List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: crosthwaitepeter@gmail.com, pawel.lenkow@itlen.com, rfsw-patches@mlist.emea.nsn-intra.net, peter.maydell@linaro.org, clg@fr.ibm.com, clg@kaod.org From: Marcin Krzeminski 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 Reviewed-by: C=C3=A9dric Le Goater --- hw/block/m25p80.c | 154 +++++++++++++++++++++++++++++++++++++++++---------= ---- 1 file changed, 117 insertions(+), 37 deletions(-) diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c index 21998db..92ce118 100644 --- a/hw/block/m25p80.c +++ b/hw/block/m25p80.c @@ -142,6 +142,13 @@ typedef struct FlashPartInfo { #define SPANSION_ADDR_LEN_POS 7 #define SPANSION_ADDR_LEN_LEN 1 =20 +/* + * Spansion read mode command length in bytes, + * the mode is currently not supported. +*/ + +#define SPANSION_CONTINUOUS_READ_MODE_CMD_LEN 1 + static const FlashPartInfo known_devices[] =3D { /* Atmel -- some are (confusingly) marketed as "DataFlash" */ { INFO("at25fs010", 0x1f6601, 0, 32 << 10, 4, ER_4K) }, @@ -719,6 +726,113 @@ static void reset_memory(Flash *s) DB_PRINT_L(0, "Reset done.\n"); } =20 +static void decode_fast_read_cmd(Flash *s) +{ + s->needed_bytes =3D get_addr_length(s); + switch (get_man(s)) { + /* Dummy cycles - modeled with bytes writes instead of bits */ + case MAN_NUMONYX: + s->needed_bytes +=3D extract32(s->volatile_cfg, 4, 4); + break; + case MAN_MACRONIX: + if (extract32(s->volatile_cfg, 6, 2) =3D=3D 1) { + s->needed_bytes +=3D 6; + } else { + s->needed_bytes +=3D 8; + } + break; + case MAN_SPANSION: + s->needed_bytes +=3D extract32(s->spansion_cr2v, + SPANSION_DUMMY_CLK_POS, + SPANSION_DUMMY_CLK_LEN + ); + break; + default: + break; + } + s->pos =3D 0; + s->len =3D 0; + s->state =3D STATE_COLLECTING_DATA; +} + +static void decode_dio_read_cmd(Flash *s) +{ + s->needed_bytes =3D get_addr_length(s); + /* Dummy cycles modeled with bytes writes instead of bits */ + switch (get_man(s)) { + case MAN_WINBOND: + s->needed_bytes =3D 4; + break; + case MAN_SPANSION: + s->needed_bytes +=3D SPANSION_CONTINUOUS_READ_MODE_CMD_LEN; + s->needed_bytes +=3D extract32(s->spansion_cr2v, + SPANSION_DUMMY_CLK_POS, + SPANSION_DUMMY_CLK_LEN + ); + break; + case MAN_NUMONYX: + s->needed_bytes +=3D extract32(s->volatile_cfg, 4, 4); + break; + case MAN_MACRONIX: + switch (extract32(s->volatile_cfg, 6, 2)) { + case 1: + s->needed_bytes +=3D 6; + break; + case 2: + s->needed_bytes +=3D 8; + break; + default: + s->needed_bytes +=3D 4; + break; + } + break; + default: + break; + } + s->pos =3D 0; + s->len =3D 0; + s->state =3D STATE_COLLECTING_DATA; +} + +static void decode_qio_read_cmd(Flash *s) +{ + s->needed_bytes =3D get_addr_length(s); + /* Dummy cycles modeled with bytes writes instead of bits */ + switch (get_man(s)) { + case MAN_WINBOND: + s->needed_bytes =3D 6; + break; + case MAN_SPANSION: + s->needed_bytes +=3D SPANSION_CONTINUOUS_READ_MODE_CMD_LEN; + s->needed_bytes +=3D extract32(s->spansion_cr2v, + SPANSION_DUMMY_CLK_POS, + SPANSION_DUMMY_CLK_LEN + ); + break; + case MAN_NUMONYX: + s->needed_bytes +=3D extract32(s->volatile_cfg, 4, 4); + break; + case MAN_MACRONIX: + switch (extract32(s->volatile_cfg, 6, 2)) { + case 1: + s->needed_bytes +=3D 4; + break; + case 2: + s->needed_bytes +=3D 8; + break; + default: + s->needed_bytes +=3D 6; + break; + } + break; + default: + break; + } + s->pos =3D 0; + s->len =3D 0; + s->state =3D STATE_COLLECTING_DATA; +} + static void decode_new_cmd(Flash *s, uint32_t value) { s->cmd_in_progress =3D value; @@ -756,51 +870,17 @@ static void decode_new_cmd(Flash *s, uint32_t value) case DOR4: case QOR: case QOR4: - s->needed_bytes =3D get_addr_length(s); - switch (get_man(s)) { - case MAN_NUMONYX: - s->needed_bytes +=3D extract32(s->volatile_cfg, 4, 4); - break; - default: - break; - } - s->pos =3D 0; - s->len =3D 0; - s->state =3D STATE_COLLECTING_DATA; + decode_fast_read_cmd(s); break; =20 case DIOR: case DIOR4: - switch (get_man(s)) { - case MAN_WINBOND: - case MAN_SPANSION: - s->needed_bytes =3D 4; - break; - default: - s->needed_bytes =3D get_addr_length(s); - /* Dummy cycles modeled with bytes writes instead of bits */ - s->needed_bytes +=3D extract32(s->volatile_cfg, 4, 4); - } - s->pos =3D 0; - s->len =3D 0; - s->state =3D STATE_COLLECTING_DATA; + decode_dio_read_cmd(s); break; =20 case QIOR: case QIOR4: - switch (get_man(s)) { - case MAN_WINBOND: - case MAN_SPANSION: - s->needed_bytes =3D 6; - break; - default: - s->needed_bytes =3D get_addr_length(s); - /* Dummy cycles modeled with bytes writes instead of bits */ - s->needed_bytes +=3D extract32(s->volatile_cfg, 4, 4); - } - s->pos =3D 0; - s->len =3D 0; - s->state =3D STATE_COLLECTING_DATA; + decode_qio_read_cmd(s); break; =20 case WRSR: --=20 2.7.4