From patchwork Fri Nov 3 00:00:57 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Francisco Iglesias X-Patchwork-Id: 833591 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="Itbm0MQf"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3yShw44nMlz9sPs for ; Fri, 3 Nov 2017 11:02:12 +1100 (AEDT) Received: from localhost ([::1]:34267 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eAPR4-0008He-Ks for incoming@patchwork.ozlabs.org; Thu, 02 Nov 2017 20:02:10 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48360) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eAPQE-0008FF-W5 for qemu-devel@nongnu.org; Thu, 02 Nov 2017 20:01:19 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eAPQC-0000nU-08 for qemu-devel@nongnu.org; Thu, 02 Nov 2017 20:01:19 -0400 Received: from mail-lf0-x242.google.com ([2a00:1450:4010:c07::242]:53305) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1eAPQB-0000n1-OX for qemu-devel@nongnu.org; Thu, 02 Nov 2017 20:01:15 -0400 Received: by mail-lf0-x242.google.com with SMTP id l23so1282541lfk.10 for ; Thu, 02 Nov 2017 17:01:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=tRiQkX/przE7N5e0vwU+TPXF6nAlHs3EAhkR4JuDfDs=; b=Itbm0MQf8YcYp3qT9nTvzU/Knd6cfOllTKo32I6wxd22t2PhYGlfdj+b+09Nwet6Zj 3epPndPXWnNU9wDKHD56XYGp0fLPUwzyh8dUN7m6mWjEJZIszNi9cCZghuIQG6pS4iP6 rP7gIvoC+iJM6ffU/T+IBA0KtR6WNEg4rM6lJIJSYRyW8YzMf4UkR3LQqpfM5bPhgkxu UWN6Lgt/p7gjoVjDSTZXC73cfC9duY6izz27mG4pWlWbt9HPZWvPnVi82YWKRbuyOABO grBFxSADOFGhU9ISJMASHpcc4G1cazzdEtKiCeb9GSqW2WGu9w4lyTzuKnLrFX7PhrqK aomw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=tRiQkX/przE7N5e0vwU+TPXF6nAlHs3EAhkR4JuDfDs=; b=UbGLkvMFo84UKKxCdSimPUvZlXwM+SjJcIjBoNQcArDYqfTYLjKmTT1m168Ay8Pkb7 xKxz3SA7JtG+HScYmqwHgXvrNOZXqs8508ly+Dwy+rONFcwG/bVfn3/leXMSbAIqJ1jr ISlFB/KnL+dNVTyyX++d9cZbPGjDhTB/daQw0nrLX/4DKtW+a6wb7H6ChAvoIyf2ZhDJ 6qtppowGxitus2Pwpw01yf3oq6uJubIOuZOeLsr5T2SZxmo+lgylbnPCFi/c8DJIocb4 jf7ijmMEUzmMj+BzU9YjNS4DYqL2mnTGAA0ES8VumYIiRAbbiThmj9/nDco2DltpXU+E w8Xw== X-Gm-Message-State: AJaThX4FCC+6yox4z6sRxTVQUgpw7wWgqagScUr9FIsHtBg67DzP6/1K OGfKXlknt4/G8iq+o7JTYKG27g== X-Google-Smtp-Source: ABhQp+R6XAXL4lCYz50QZxmkD4xhT7sAgj/SiXuvuAE/HPpp9FhEkyB7CzMlzJ5r2AlRfr9eqDY4hg== X-Received: by 10.25.44.139 with SMTP id s133mr1847671lfs.122.1509667274173; Thu, 02 Nov 2017 17:01:14 -0700 (PDT) Received: from localhost.localdomain (c83-254-152-225.bredband.comhem.se. [83.254.152.225]) by smtp.gmail.com with ESMTPSA id m27sm937278lje.21.2017.11.02.17.01.12 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 02 Nov 2017 17:01:13 -0700 (PDT) From: Francisco Iglesias To: qemu-devel@nongnu.org Date: Fri, 3 Nov 2017 01:00:57 +0100 Message-Id: <20171103000109.28244-2-frasse.iglesias@gmail.com> X-Mailer: git-send-email 2.9.3 In-Reply-To: <20171103000109.28244-1-frasse.iglesias@gmail.com> References: <20171103000109.28244-1-frasse.iglesias@gmail.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4010:c07::242 Subject: [Qemu-devel] [PATCH v7 01/13] m25p80: Add support for continuous read out of RDSR and READ_FSR X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: peter.maydell@linaro.org, edgari@xilinx.com, alistai@xilinx.com, francisco.iglesias@feimtech.se, mar.krzeminski@gmail.com Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Add support for continuous read out of the RDSR and READ_FSR status registers until the chip select is deasserted. This feature is supported by amongst others 1 or more flashtypes manufactured by Numonyx (Micron), Windbond, SST, Gigadevice, Eon and Macronix. Signed-off-by: Francisco Iglesias Acked-by: Marcin KrzemiƄski --- hw/block/m25p80.c | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c index a2438b9..d50acc1 100644 --- a/hw/block/m25p80.c +++ b/hw/block/m25p80.c @@ -423,6 +423,7 @@ typedef struct Flash { uint8_t data[M25P80_INTERNAL_DATA_BUFFER_SZ]; uint32_t len; uint32_t pos; + bool data_read_loop; uint8_t needed_bytes; uint8_t cmd_in_progress; uint32_t cur_addr; @@ -983,6 +984,7 @@ static void decode_new_cmd(Flash *s, uint32_t value) } s->pos = 0; s->len = 1; + s->data_read_loop = true; s->state = STATE_READING_DATA; break; @@ -993,6 +995,7 @@ static void decode_new_cmd(Flash *s, uint32_t value) } s->pos = 0; s->len = 1; + s->data_read_loop = true; s->state = STATE_READING_DATA; break; @@ -1133,6 +1136,7 @@ static int m25p80_cs(SSISlave *ss, bool select) s->pos = 0; s->state = STATE_IDLE; flash_sync_dirty(s, -1); + s->data_read_loop = false; } DB_PRINT_L(0, "%sselect\n", select ? "de" : ""); @@ -1198,7 +1202,9 @@ static uint32_t m25p80_transfer8(SSISlave *ss, uint32_t tx) s->pos++; if (s->pos == s->len) { s->pos = 0; - s->state = STATE_IDLE; + if (!s->data_read_loop) { + s->state = STATE_IDLE; + } } break; @@ -1269,11 +1275,38 @@ static Property m25p80_properties[] = { DEFINE_PROP_END_OF_LIST(), }; +static int m25p80_pre_load(void *opaque) +{ + Flash *s = (Flash *)opaque; + + s->data_read_loop = false; + return 0; +} + +static bool m25p80_data_read_loop_needed(void *opaque) +{ + Flash *s = (Flash *)opaque; + + return s->data_read_loop; +} + +static const VMStateDescription vmstate_m25p80_data_read_loop = { + .name = "m25p80/data_read_loop", + .version_id = 1, + .minimum_version_id = 1, + .needed = m25p80_data_read_loop_needed, + .fields = (VMStateField[]) { + VMSTATE_BOOL(data_read_loop, Flash), + VMSTATE_END_OF_LIST() + } +}; + static const VMStateDescription vmstate_m25p80 = { .name = "m25p80", .version_id = 0, .minimum_version_id = 0, .pre_save = m25p80_pre_save, + .pre_load = m25p80_pre_load, .fields = (VMStateField[]) { VMSTATE_UINT8(state, Flash), VMSTATE_UINT8_ARRAY(data, Flash, M25P80_INTERNAL_DATA_BUFFER_SZ), @@ -1295,6 +1328,10 @@ static const VMStateDescription vmstate_m25p80 = { VMSTATE_UINT8(spansion_cr3nv, Flash), VMSTATE_UINT8(spansion_cr4nv, Flash), VMSTATE_END_OF_LIST() + }, + .subsections = (const VMStateDescription * []) { + &vmstate_m25p80_data_read_loop, + NULL } };