Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1612210

[PATCH v4 04/23] drivers/fsi: Add crc4 helpers

From Christopher Bostic <cbostic@linux.vnet.ibm.com>
Newsgroups linux.kernel
Subject [PATCH v4 04/23] drivers/fsi: Add crc4 helpers
Date 2017-03-29 20:00 +0200
Message-ID <tqq2Z-1Wd-1@gated-at.bofh.it> (permalink)
References <tqpTj-1P5-13@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


From: Jeremy Kerr <jk@ozlabs.org>

Add some helpers for the crc checks for the slave configuration table.
This works 4-bits-at-a-time, using a simple table approach.

We will need this in the FSI core code, as well as any master
implementations that need to calculate CRCs in software.

We add this to the fsi code (rather than lib/), as we need a specific
polynomial for FSI CRCs.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Signed-off-by: Chris Bostic <cbostic@linux.vnet.ibm.com>
Signed-off-by: Joel Stanley <joel@jms.id.au>
---
 drivers/fsi/fsi-core.c   | 24 ++++++++++++++++++++++++
 drivers/fsi/fsi-master.h | 21 +++++++++++++++++++++
 2 files changed, 45 insertions(+)

diff --git a/drivers/fsi/fsi-core.c b/drivers/fsi/fsi-core.c
index e90d45d..4bbca95 100644
--- a/drivers/fsi/fsi-core.c
+++ b/drivers/fsi/fsi-core.c
@@ -32,6 +32,30 @@ struct fsi_slave {
 
 #define to_fsi_slave(d) container_of(d, struct fsi_slave, dev)
 
+/* crc helpers */
+static const uint8_t crc4_tab[] = {
+	0x0, 0x7, 0xe, 0x9, 0xb, 0xc, 0x5, 0x2,
+	0x1, 0x6, 0xf, 0x8, 0xa, 0xd, 0x4, 0x3,
+};
+
+uint8_t fsi_crc4(uint8_t c, uint64_t x, int bits)
+{
+	int i;
+
+	/* Align to 4-bits */
+	bits = (bits + 3) & ~0x3;
+
+	/* mask off anything above the top bit */
+	x &= (1ull << bits) - 1;
+
+	/* Calculate crc4 over four-bit nibbles, starting at the MSbit */
+	for (i = bits - 4; i >= 0; i -= 4)
+		c = crc4_tab[c ^ ((x >> i) & 0xf)];
+
+	return c;
+}
+EXPORT_SYMBOL_GPL(fsi_crc4);
+
 /* FSI slave support */
 static int fsi_slave_init(struct fsi_master *master, int link, uint8_t id)
 {
diff --git a/drivers/fsi/fsi-master.h b/drivers/fsi/fsi-master.h
index 7764b00..d6a4885 100644
--- a/drivers/fsi/fsi-master.h
+++ b/drivers/fsi/fsi-master.h
@@ -38,4 +38,25 @@ struct fsi_master {
 extern int fsi_master_register(struct fsi_master *master);
 extern void fsi_master_unregister(struct fsi_master *master);
 
+/**
+ * crc4 helper: Given a starting crc4 state @c, calculate the crc4 vaue of @x,
+ * which is @bits in length. This may be required by master implementations
+ * that do not provide their own hardware checksums.
+ *
+ * The crc4 is performed on 4-bit chunks (which is all we need for FSI
+ * calculations). Typically, we'll want a starting state of 0:
+ *
+ *  c = fsi_crc4(0, msg, len);
+ *
+ * To crc4 a message that includes a single start bit, initialise crc4 state
+ * with:
+ *
+ *  c = fsi_crc4(0, 1, 1);
+ *
+ * Then update with message data:
+ *
+ *  c = fsi_crc4(c, msg, len);
+ */
+uint8_t fsi_crc4(uint8_t c, uint64_t x, int bits);
+
 #endif /* DRIVERS_FSI_MASTER_H */
-- 
1.8.2.2

Back to linux.kernel | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread


Thread

[PATCH v4 00/23] FSI device driver implementation Christopher Bostic <cbostic@linux.vnet.ibm.com> - 2017-03-29 19:50 +0200
  [PATCH v4 16/23] drivers/fsi: Add tracepoints for low-level operations Christopher Bostic <cbostic@linux.vnet.ibm.com> - 2017-03-29 19:50 +0200
  [PATCH v4 10/23] drivers/fsi: Add device read/write/peek API Christopher Bostic <cbostic@linux.vnet.ibm.com> - 2017-03-29 19:50 +0200
  [PATCH v4 22/23] drivers/fsi: Add hub master support Christopher Bostic <cbostic@linux.vnet.ibm.com> - 2017-03-29 19:50 +0200
  [PATCH v4 12/23] drivers/fsi: Add documentation for GPIO bindings Christopher Bostic <cbostic@linux.vnet.ibm.com> - 2017-03-29 19:50 +0200
    Re: [PATCH v4 12/23] drivers/fsi: Add documentation for GPIO bindings Rob Herring <robh@kernel.org> - 2017-04-03 17:30 +0200
  [PATCH v4 05/23] drivers/fsi: Add slave & master read/write APIs Christopher Bostic <cbostic@linux.vnet.ibm.com> - 2017-03-29 19:50 +0200
  [PATCH v4 18/23] drivers/fsi: Document FSI master sysfs files in ABI Christopher Bostic <cbostic@linux.vnet.ibm.com> - 2017-03-29 19:50 +0200
  [PATCH v4 01/23] drivers/fsi: Add fsi master definition Christopher Bostic <cbostic@linux.vnet.ibm.com> - 2017-03-29 19:50 +0200
  [PATCH v4 07/23] drivers/fsi: Implement slave initialisation Christopher Bostic <cbostic@linux.vnet.ibm.com> - 2017-03-29 19:50 +0200
  [PATCH v4 20/23] drivers/fsi/gpio: Add tracepoints for GPIO master Christopher Bostic <cbostic@linux.vnet.ibm.com> - 2017-03-29 19:50 +0200
  [PATCH v4 13/23] drivers/fsi: Add client driver register utilities Christopher Bostic <cbostic@linux.vnet.ibm.com> - 2017-03-29 19:50 +0200
  [PATCH v4 14/23] drivers/fsi: Add sysfs files for FSI master & slave accesses Christopher Bostic <cbostic@linux.vnet.ibm.com> - 2017-03-29 19:50 +0200
  [PATCH v4 15/23] drivers/fsi: expose direct-access slave API Christopher Bostic <cbostic@linux.vnet.ibm.com> - 2017-03-29 19:50 +0200
  [PATCH v4 04/23] drivers/fsi: Add crc4 helpers Christopher Bostic <cbostic@linux.vnet.ibm.com> - 2017-03-29 20:00 +0200
  [PATCH v4 02/23] drivers/fsi: Add slave definition Christopher Bostic <cbostic@linux.vnet.ibm.com> - 2017-03-29 20:00 +0200
  [PATCH v4 08/23] drivers/fsi: Set slave SMODE to init communication Christopher Bostic <cbostic@linux.vnet.ibm.com> - 2017-03-29 20:00 +0200
  [PATCH v4 03/23] drivers/fsi: Add empty master scan Christopher Bostic <cbostic@linux.vnet.ibm.com> - 2017-03-29 20:00 +0200

csiph-web