From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44799) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bDsxd-0006qV-M5 for qemu-devel@nongnu.org; Fri, 17 Jun 2016 08:33:23 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1bDsxZ-00075k-G7 for qemu-devel@nongnu.org; Fri, 17 Jun 2016 08:33:20 -0400 Received: from 6.mo53.mail-out.ovh.net ([46.105.58.122]:47102) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1bDsxZ-00075g-6b for qemu-devel@nongnu.org; Fri, 17 Jun 2016 08:33:17 -0400 Received: from player158.ha.ovh.net (b7.ovh.net [213.186.33.57]) by mo53.mail-out.ovh.net (Postfix) with ESMTP id 4800CFF9546 for ; Fri, 17 Jun 2016 14:33:16 +0200 (CEST) References: <1466159314-28597-1-git-send-email-marcin.krzeminski@nokia.com> <1466159314-28597-7-git-send-email-marcin.krzeminski@nokia.com> From: =?UTF-8?Q?C=c3=a9dric_Le_Goater?= Message-ID: <60157ef6-4387-779a-f97b-5a7ab1a1fbd0@kaod.org> Date: Fri, 17 Jun 2016 14:33:10 +0200 MIME-Version: 1.0 In-Reply-To: <1466159314-28597-7-git-send-email-marcin.krzeminski@nokia.com> Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: quoted-printable Subject: Re: [Qemu-devel] [PATCH v2 06/10] m25p80: Introduce quad and equad modes. List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: marcin.krzeminski@nokia.com, qemu-devel@nongnu.org Cc: crosthwaitepeter@gmail.com, pawel.lenkow@itlen.com, peter.maydell@linaro.org, clg@fr.ibm.com On 06/17/2016 12:28 PM, marcin.krzeminski@nokia.com wrote: > From: Marcin Krzeminski >=20 > Quad and Equad modes for Spansion and Macronix flash devices. > This commit also includes modification and new command to manipulate > quad mode (status registers and dedicated commands). > This work is based on Pawel Lenkow work. >=20 > Signed-off-by: Marcin Krzeminski Reviewed-by: C=E9dric Le Goater Thanks, C. > --- > hw/block/m25p80.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++= ++++---- > 1 file changed, 65 insertions(+), 5 deletions(-) >=20 > diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c > index 55b4377..d1c4d46 100644 > --- a/hw/block/m25p80.c > +++ b/hw/block/m25p80.c > @@ -281,6 +281,7 @@ typedef enum { > JEDEC_READ =3D 0x9f, > BULK_ERASE =3D 0xc7, > READ_FSR =3D 0x70, > + RDCR =3D 0x15, > =20 > READ =3D 0x03, > READ4 =3D 0x13, > @@ -317,6 +318,13 @@ typedef enum { > RESET_ENABLE =3D 0x66, > RESET_MEMORY =3D 0x99, > =20 > + /* > + * Micron: 0x35 - enable QPI > + * Spansion: 0x35 - read control register > + */ > + RDCR_EQIO =3D 0x35, > + RSTQIO =3D 0xf5, > + > RNVCR =3D 0xB5, > WNVCR =3D 0xB1, > =20 > @@ -366,6 +374,7 @@ typedef struct Flash { > bool write_enable; > bool four_bytes_address_mode; > bool reset_enable; > + bool quad_enable; > uint8_t ear; > =20 > int64_t dirty_page; > @@ -586,6 +595,16 @@ static void complete_collecting_data(Flash *s) > flash_erase(s, s->cur_addr, s->cmd_in_progress); > break; > case WRSR: > + switch (get_man(s)) { > + case MAN_SPANSION: > + s->quad_enable =3D !!(s->data[1] & 0x02); > + break; > + case MAN_MACRONIX: > + s->quad_enable =3D extract32(s->data[0], 6, 1); > + break; > + default: > + break; > + } > if (s->write_enable) { > s->write_enable =3D false; > } > @@ -619,6 +638,7 @@ static void reset_memory(Flash *s) > s->state =3D STATE_IDLE; > s->write_enable =3D false; > s->reset_enable =3D false; > + s->quad_enable =3D false; > =20 > switch (get_man(s)) { > case MAN_NUMONYX: > @@ -747,10 +767,20 @@ static void decode_new_cmd(Flash *s, uint32_t val= ue) > =20 > case WRSR: > if (s->write_enable) { > - s->needed_bytes =3D 1; > + switch (get_man(s)) { > + case MAN_SPANSION: > + s->needed_bytes =3D 2; > + s->state =3D STATE_COLLECTING_DATA; > + break; > + case MAN_MACRONIX: > + s->needed_bytes =3D 2; > + s->state =3D STATE_COLLECTING_VAR_LEN_DATA; > + break; > + default: > + s->needed_bytes =3D 1; > + s->state =3D STATE_COLLECTING_DATA; > + } > s->pos =3D 0; > - s->len =3D 0; > - s->state =3D STATE_COLLECTING_DATA; > } > break; > =20 > @@ -763,6 +793,9 @@ static void decode_new_cmd(Flash *s, uint32_t value= ) > =20 > case RDSR: > s->data[0] =3D (!!s->write_enable) << 1; > + if (get_man(s) =3D=3D MAN_MACRONIX) { > + s->data[0] |=3D (!!s->quad_enable) << 6; > + } > s->pos =3D 0; > s->len =3D 1; > s->state =3D STATE_READING_DATA; > @@ -789,6 +822,14 @@ static void decode_new_cmd(Flash *s, uint32_t valu= e) > s->state =3D STATE_READING_DATA; > break; > =20 > + case RDCR: > + s->data[0] =3D s->volatile_cfg & 0xFF; > + s->data[0] |=3D (!!s->four_bytes_address_mode) << 5; > + s->pos =3D 0; > + s->len =3D 1; > + s->state =3D STATE_READING_DATA; > + break; > + > case BULK_ERASE: > if (s->write_enable) { > DB_PRINT_L(0, "chip erase\n"); > @@ -828,7 +869,7 @@ static void decode_new_cmd(Flash *s, uint32_t value= ) > s->state =3D STATE_READING_DATA; > break; > case WNVCR: > - if (s->write_enable) { > + if (s->write_enable && get_man(s) =3D=3D MAN_NUMONYX) { > s->needed_bytes =3D 2; > s->pos =3D 0; > s->len =3D 0; > @@ -871,6 +912,24 @@ static void decode_new_cmd(Flash *s, uint32_t valu= e) > reset_memory(s); > } > break; > + case RDCR_EQIO: > + switch (get_man(s)) { > + case MAN_SPANSION: > + s->data[0] =3D (!!s->quad_enable) << 1; > + s->pos =3D 0; > + s->len =3D 1; > + s->state =3D STATE_READING_DATA; > + break; > + case MAN_MACRONIX: > + s->quad_enable =3D true; > + break; > + default: > + break; > + } > + break; > + case RSTQIO: > + s->quad_enable =3D false; > + break; > default: > qemu_log_mask(LOG_GUEST_ERROR, "M25P80: Unknown cmd %x\n", val= ue); > break; > @@ -999,7 +1058,7 @@ static Property m25p80_properties[] =3D { > =20 > static const VMStateDescription vmstate_m25p80 =3D { > .name =3D "xilinx_spi", > - .version_id =3D 2, > + .version_id =3D 3, > .minimum_version_id =3D 1, > .pre_save =3D m25p80_pre_save, > .fields =3D (VMStateField[]) { > @@ -1017,6 +1076,7 @@ static const VMStateDescription vmstate_m25p80 =3D= { > VMSTATE_UINT32_V(nonvolatile_cfg, Flash, 2), > VMSTATE_UINT32_V(volatile_cfg, Flash, 2), > VMSTATE_UINT32_V(enh_volatile_cfg, Flash, 2), > + VMSTATE_BOOL_V(quad_enable, Flash, 3), > VMSTATE_END_OF_LIST() > } > }; >=20