DPDK patches and discussions
 help / color / mirror / Atom feed
From: Andrew Rybchenko <arybchenko@solarflare.com>
To: <dev@dpdk.org>
Cc: Andy Moreton <amoreton@solarflare.com>
Subject: [dpdk-dev] [PATCH 12/53] net/sfc/base: precheck and verify flash writes
Date: Thu, 16 Nov 2017 08:04:00 +0000	[thread overview]
Message-ID: <1510819481-6809-13-git-send-email-arybchenko@solarflare.com> (raw)
In-Reply-To: <1510819481-6809-1-git-send-email-arybchenko@solarflare.com>

From: Andy Moreton <amoreton@solarflare.com>

Read existing flash content before writing, so the flash write can be
avoided if the existing partition content matches the new image. This
avoids unnecessary write cycles for the flash device, and may also be
faster. If the flash does need to be updated, verify the content after
writing.

Note that reading the flash content after writing but before calling
efx_nvram-rw_finish() avoids firmware bug68170, which can lead to
signed image updates failing on Medford.

Signed-off-by: Andy Moreton <amoreton@solarflare.com>
Signed-off-by: Andrew Rybchenko <arybchenko@solarflare.com>
---
 drivers/net/sfc/base/ef10_impl.h  |  8 +++++++
 drivers/net/sfc/base/ef10_nvram.c | 27 ++++++++++++++++++++++--
 drivers/net/sfc/base/efx.h        |  8 +++++++
 drivers/net/sfc/base/efx_impl.h   |  2 ++
 drivers/net/sfc/base/efx_nvram.c  | 44 +++++++++++++++++++++++++++++++++++++++
 5 files changed, 87 insertions(+), 2 deletions(-)

diff --git a/drivers/net/sfc/base/ef10_impl.h b/drivers/net/sfc/base/ef10_impl.h
index 4624113..97922f3 100644
--- a/drivers/net/sfc/base/ef10_impl.h
+++ b/drivers/net/sfc/base/ef10_impl.h
@@ -443,6 +443,14 @@ ef10_nvram_partn_read(
 	__in			size_t size);
 
 extern	__checkReturn		efx_rc_t
+ef10_nvram_partn_read_backup(
+	__in			efx_nic_t *enp,
+	__in			uint32_t partn,
+	__in			unsigned int offset,
+	__out_bcount(size)	caddr_t data,
+	__in			size_t size);
+
+extern	__checkReturn		efx_rc_t
 ef10_nvram_partn_erase(
 	__in			efx_nic_t *enp,
 	__in			uint32_t partn,
diff --git a/drivers/net/sfc/base/ef10_nvram.c b/drivers/net/sfc/base/ef10_nvram.c
index a70838b..68f14d5 100644
--- a/drivers/net/sfc/base/ef10_nvram.c
+++ b/drivers/net/sfc/base/ef10_nvram.c
@@ -1937,14 +1937,37 @@ ef10_nvram_partn_read(
 	__in			size_t size)
 {
 	/*
-	 * Read requests which come in through the EFX API expect to
-	 * read the current, active partition.
+	 * An A/B partition has two data stores (current and backup).
+	 * Read requests which come in through the EFX API expect to read the
+	 * current, active store of an A/B partition. For non A/B partitions,
+	 * there is only a single store and so the mode param is ignored.
 	 */
 	return ef10_nvram_partn_read_mode(enp, partn, offset, data, size,
 			    MC_CMD_NVRAM_READ_IN_V2_TARGET_CURRENT);
 }
 
 	__checkReturn		efx_rc_t
+ef10_nvram_partn_read_backup(
+	__in			efx_nic_t *enp,
+	__in			uint32_t partn,
+	__in			unsigned int offset,
+	__out_bcount(size)	caddr_t data,
+	__in			size_t size)
+{
+	/*
+	 * An A/B partition has two data stores (current and backup).
+	 * Read the backup store of an A/B partition (i.e. the store currently
+	 * being written to if the partition is locked).
+	 *
+	 * This is needed when comparing the existing partition content to avoid
+	 * unnecessary writes, or to read back what has been written to check
+	 * that the writes have succeeded.
+	 */
+	return ef10_nvram_partn_read_mode(enp, partn, offset, data, size,
+			    MC_CMD_NVRAM_READ_IN_V2_TARGET_BACKUP);
+}
+
+	__checkReturn		efx_rc_t
 ef10_nvram_partn_erase(
 	__in			efx_nic_t *enp,
 	__in			uint32_t partn,
diff --git a/drivers/net/sfc/base/efx.h b/drivers/net/sfc/base/efx.h
index b298a75..834eea0 100644
--- a/drivers/net/sfc/base/efx.h
+++ b/drivers/net/sfc/base/efx.h
@@ -1430,6 +1430,14 @@ efx_nvram_read_chunk(
 	__in			size_t size);
 
 extern	__checkReturn		efx_rc_t
+efx_nvram_read_backup(
+	__in			efx_nic_t *enp,
+	__in			efx_nvram_type_t type,
+	__in			unsigned int offset,
+	__out_bcount(size)	caddr_t data,
+	__in			size_t size);
+
+extern	__checkReturn		efx_rc_t
 efx_nvram_set_version(
 	__in			efx_nic_t *enp,
 	__in			efx_nvram_type_t type,
diff --git a/drivers/net/sfc/base/efx_impl.h b/drivers/net/sfc/base/efx_impl.h
index 7b07f34..2be8b9c 100644
--- a/drivers/net/sfc/base/efx_impl.h
+++ b/drivers/net/sfc/base/efx_impl.h
@@ -475,6 +475,8 @@ typedef struct efx_nvram_ops_s {
 	efx_rc_t	(*envo_partn_rw_start)(efx_nic_t *, uint32_t, size_t *);
 	efx_rc_t	(*envo_partn_read)(efx_nic_t *, uint32_t,
 					    unsigned int, caddr_t, size_t);
+	efx_rc_t	(*envo_partn_read_backup)(efx_nic_t *, uint32_t,
+					    unsigned int, caddr_t, size_t);
 	efx_rc_t	(*envo_partn_erase)(efx_nic_t *, uint32_t,
 					    unsigned int, size_t);
 	efx_rc_t	(*envo_partn_write)(efx_nic_t *, uint32_t,
diff --git a/drivers/net/sfc/base/efx_nvram.c b/drivers/net/sfc/base/efx_nvram.c
index bdad5d5..affe496 100644
--- a/drivers/net/sfc/base/efx_nvram.c
+++ b/drivers/net/sfc/base/efx_nvram.c
@@ -43,6 +43,7 @@ static const efx_nvram_ops_t	__efx_nvram_siena_ops = {
 	siena_nvram_partn_size,		/* envo_partn_size */
 	siena_nvram_partn_rw_start,	/* envo_partn_rw_start */
 	siena_nvram_partn_read,		/* envo_partn_read */
+	siena_nvram_partn_read,		/* envo_partn_read_backup */
 	siena_nvram_partn_erase,	/* envo_partn_erase */
 	siena_nvram_partn_write,	/* envo_partn_write */
 	siena_nvram_partn_rw_finish,	/* envo_partn_rw_finish */
@@ -63,6 +64,7 @@ static const efx_nvram_ops_t	__efx_nvram_ef10_ops = {
 	ef10_nvram_partn_size,		/* envo_partn_size */
 	ef10_nvram_partn_rw_start,	/* envo_partn_rw_start */
 	ef10_nvram_partn_read,		/* envo_partn_read */
+	ef10_nvram_partn_read_backup,	/* envo_partn_read_backup */
 	ef10_nvram_partn_erase,		/* envo_partn_erase */
 	ef10_nvram_partn_write,		/* envo_partn_write */
 	ef10_nvram_partn_rw_finish,	/* envo_partn_rw_finish */
@@ -285,6 +287,48 @@ efx_nvram_read_chunk(
 	return (rc);
 }
 
+/*
+ * Read from the backup (writeable) store of an A/B partition.
+ * For non A/B partitions, there is only a single store, and so this
+ * function has the same behaviour as efx_nvram_read_chunk().
+ */
+	__checkReturn		efx_rc_t
+efx_nvram_read_backup(
+	__in			efx_nic_t *enp,
+	__in			efx_nvram_type_t type,
+	__in			unsigned int offset,
+	__out_bcount(size)	caddr_t data,
+	__in			size_t size)
+{
+	const efx_nvram_ops_t *envop = enp->en_envop;
+	uint32_t partn;
+	efx_rc_t rc;
+
+	EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
+	EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_NVRAM);
+
+	EFSYS_ASSERT3U(type, <, EFX_NVRAM_NTYPES);
+	EFSYS_ASSERT3U(type, !=, EFX_NVRAM_INVALID);
+
+	if ((rc = envop->envo_type_to_partn(enp, type, &partn)) != 0)
+		goto fail1;
+
+	EFSYS_ASSERT3U(enp->en_nvram_partn_locked, ==, partn);
+
+	if ((rc = envop->envo_partn_read_backup(enp, partn, offset,
+		    data, size)) != 0)
+		goto fail2;
+
+	return (0);
+
+fail2:
+	EFSYS_PROBE(fail2);
+fail1:
+	EFSYS_PROBE1(fail1, efx_rc_t, rc);
+
+	return (rc);
+}
+
 	__checkReturn		efx_rc_t
 efx_nvram_erase(
 	__in			efx_nic_t *enp,
-- 
2.7.4

  parent reply	other threads:[~2017-11-16  8:04 UTC|newest]

Thread overview: 71+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-11-16  8:03 [dpdk-dev] [PATCH 00/53] net/sfc: base driver update Andrew Rybchenko
2017-11-16  8:03 ` [dpdk-dev] [PATCH 01/53] net/sfc/base: copy new header from firmwaresrc Andrew Rybchenko
2017-11-27 19:58   ` Ferruh Yigit
2017-11-29  9:49     ` Andrew Rybchenko
2017-11-27 19:58   ` Ferruh Yigit
2017-11-16  8:03 ` [dpdk-dev] [PATCH 02/53] net/sfc/base: do not use Tx desc push with TSO descriptors Andrew Rybchenko
2017-11-16  8:03 ` [dpdk-dev] [PATCH 03/53] net/sfc/base: fix result code in MCDI NVRAM update finish Andrew Rybchenko
2017-11-16  8:03 ` [dpdk-dev] [PATCH 04/53] net/sfc/base: simplify verify result handling Andrew Rybchenko
2017-11-16  8:03 ` [dpdk-dev] [PATCH 05/53] net/sfc/base: report verify result from RW finish callback Andrew Rybchenko
2017-11-16  8:03 ` [dpdk-dev] [PATCH 06/53] net/sfc/base: extend NVRAM RW finish to return verify result Andrew Rybchenko
2017-11-16  8:03 ` [dpdk-dev] [PATCH 07/53] net/sfc/base: rename firmware update verify result cap field Andrew Rybchenko
2017-11-16  8:03 ` [dpdk-dev] [PATCH 08/53] net/sfc/base: simplify NVRAM type to partition mappings Andrew Rybchenko
2017-11-16  8:03 ` [dpdk-dev] [PATCH 09/53] net/sfc/base: check NVRAM locking by partition ID Andrew Rybchenko
2017-11-16  8:03 ` [dpdk-dev] [PATCH 10/53] net/sfc/base: report correct partition write chunk size Andrew Rybchenko
2017-11-16  8:03 ` [dpdk-dev] [PATCH 11/53] net/sfc/base: fix check in NVRAM validate Andrew Rybchenko
2017-11-16  8:04 ` Andrew Rybchenko [this message]
2017-11-16  8:04 ` [dpdk-dev] [PATCH 13/53] net/sfc/base: remove duplicate NVRAM asserts Andrew Rybchenko
2017-11-16  8:04 ` [dpdk-dev] [PATCH 14/53] net/sfc/base: quieten get version methods Andrew Rybchenko
2017-11-16  8:04 ` [dpdk-dev] [PATCH 15/53] net/sfc/base: fix PreFAST issues Andrew Rybchenko
2017-11-27 19:58   ` [dpdk-dev] [dpdk-stable] " Ferruh Yigit
2017-11-28 11:49     ` Andrew Rybchenko
2017-11-16  8:04 ` [dpdk-dev] [PATCH 16/53] net/sfc/base: add support for MUM/SUC firmware partitions Andrew Rybchenko
2017-11-16  8:04 ` [dpdk-dev] [PATCH 17/53] net/sfc/base: improve PS credits push function name Andrew Rybchenko
2017-11-27 19:59   ` Ferruh Yigit
2017-11-28  9:20     ` Andrew Rybchenko
2017-11-16  8:04 ` [dpdk-dev] [PATCH 18/53] net/sfc/base: improve RxQ label init prototype Andrew Rybchenko
2017-11-16  8:04 ` [dpdk-dev] [PATCH 19/53] net/sfc/base: add description of the PS packets layout Andrew Rybchenko
2017-11-16  8:04 ` [dpdk-dev] [PATCH 20/53] net/sfc/base: clarify meaning of Rx desc lbits in PS mode Andrew Rybchenko
2017-11-16  8:04 ` [dpdk-dev] [PATCH 21/53] net/sfc/base: optimize credits overflow check Andrew Rybchenko
2017-11-16  8:04 ` [dpdk-dev] [PATCH 22/53] net/sfc/base: provide simple access to RxQ state in EvQ Andrew Rybchenko
2017-11-16  8:04 ` [dpdk-dev] [PATCH 23/53] net/sfc/base: enforce packed stream fake buffer size Andrew Rybchenko
2017-11-16  8:04 ` [dpdk-dev] [PATCH 24/53] net/sfc/base: more accurately calculate number of PS credits Andrew Rybchenko
2017-11-16  8:04 ` [dpdk-dev] [PATCH 25/53] net/sfc/base: make MAC naming consistent with other modules Andrew Rybchenko
2017-11-16  8:04 ` [dpdk-dev] [PATCH 26/53] net/sfc/base: support inner checksum offload on transmit Andrew Rybchenko
2017-11-16  8:04 ` [dpdk-dev] [PATCH 27/53] net/sfc/base: use MCDIv2 for requests with too long response Andrew Rybchenko
2017-11-16  8:04 ` [dpdk-dev] [PATCH 28/53] net/sfc/base: ignore error in completion event on MCDIv2 HW Andrew Rybchenko
2017-11-16  8:04 ` [dpdk-dev] [PATCH 29/53] net/sfc/base: request info about outer frame in Rx events Andrew Rybchenko
2017-11-27 19:57   ` Ferruh Yigit
2017-11-28 10:48     ` Andrew Rybchenko
2017-11-16  8:04 ` [dpdk-dev] [PATCH 30/53] net/sfc/base: remove assertion on no longer used define Andrew Rybchenko
2017-11-16  8:04 ` [dpdk-dev] [PATCH 31/53] net/sfc/base: improve names for EVQ descriptor counts Andrew Rybchenko
2017-11-16  8:04 ` [dpdk-dev] [PATCH 32/53] net/sfc/base: improve names for RXQ " Andrew Rybchenko
2017-11-16  8:04 ` [dpdk-dev] [PATCH 33/53] net/sfc/base: improve names for TXQ " Andrew Rybchenko
2017-11-16  8:04 ` [dpdk-dev] [PATCH 34/53] net/sfc/base: fix build issue with PHY LED control enabled Andrew Rybchenko
2017-11-27 19:59   ` [dpdk-dev] [dpdk-stable] " Ferruh Yigit
2017-11-16  8:04 ` [dpdk-dev] [PATCH 35/53] net/sfc/base: move Siena-specific defs to right header Andrew Rybchenko
2017-11-16  8:04 ` [dpdk-dev] [PATCH 36/53] net/sfc/base: run mkconfig.py to add a new sensors Andrew Rybchenko
2017-11-27 19:58   ` Ferruh Yigit
2017-11-28 12:01     ` Andrew Rybchenko
2017-11-16  8:04 ` [dpdk-dev] [PATCH 37/53] net/sfc/base: add support for " Andrew Rybchenko
2017-11-16  8:04 ` [dpdk-dev] [PATCH 38/53] net/sfc/base: remove unused defined for WPTR alignment Andrew Rybchenko
2017-11-16  8:04 ` [dpdk-dev] [PATCH 39/53] net/sfc/base: cstyle fixes Andrew Rybchenko
2017-11-16  8:04 ` [dpdk-dev] [PATCH 40/53] net/sfc/base: allow to use PHY stats on Huntington/Medford Andrew Rybchenko
2017-11-16  8:04 ` [dpdk-dev] [PATCH 41/53] net/sfc/base: fix diagnostics support build without Siena Andrew Rybchenko
2017-11-16  8:04 ` [dpdk-dev] [PATCH 42/53] net/sfc/base: fix probes in licensing support Andrew Rybchenko
2017-11-27 19:58   ` [dpdk-dev] [dpdk-stable] " Ferruh Yigit
2017-11-28 10:17     ` Andrew Rybchenko
2017-11-28 21:38       ` Ferruh Yigit
2017-11-29  9:51         ` Andrew Rybchenko
2017-11-16  8:04 ` [dpdk-dev] [PATCH 43/53] net/sfc/base: fix warnings from VS2015 C compiler (C4310) Andrew Rybchenko
2017-11-16  8:04 ` [dpdk-dev] [PATCH 44/53] net/sfc/base: fix warnings from VS2015 C compiler (C4244) Andrew Rybchenko
2017-11-16  8:04 ` [dpdk-dev] [PATCH 45/53] net/sfc/base: fix warnings from VS2015 C compiler (C4245) Andrew Rybchenko
2017-11-16  8:04 ` [dpdk-dev] [PATCH 46/53] net/sfc/base: fix warnings from VS2015 C compiler (C4100) Andrew Rybchenko
2017-11-16  8:04 ` [dpdk-dev] [PATCH 47/53] net/sfc/base: fix warnings from VS2015 C compiler (C4189) Andrew Rybchenko
2017-11-16  8:04 ` [dpdk-dev] [PATCH 48/53] net/sfc/base: fix warnings from VS2015 C compiler (C4057) Andrew Rybchenko
2017-11-16  8:04 ` [dpdk-dev] [PATCH 49/53] net/sfc/base: fix warnings from VS2015 C compiler (C4214) Andrew Rybchenko
2017-11-16  8:04 ` [dpdk-dev] [PATCH 50/53] net/sfc/base: remove obsolete check for pre-Siena hardware Andrew Rybchenko
2017-11-16  8:04 ` [dpdk-dev] [PATCH 51/53] net/sfc/base: expand on comment on number of queues field Andrew Rybchenko
2017-11-16  8:04 ` [dpdk-dev] [PATCH 52/53] net/sfc/base: fix PreFAST static analysis warning (C6001) Andrew Rybchenko
2017-11-16  8:04 ` [dpdk-dev] [PATCH 53/53] net/sfc/base: move BIU test code into Siena-specific file Andrew Rybchenko
2017-11-27 19:59 ` [dpdk-dev] [PATCH 00/53] net/sfc: base driver update Ferruh Yigit

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1510819481-6809-13-git-send-email-arybchenko@solarflare.com \
    --to=arybchenko@solarflare.com \
    --cc=amoreton@solarflare.com \
    --cc=dev@dpdk.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).