All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH] lib/crc8: Add crc start value
@ 2016-04-08 13:56 Stefan Roese
  2016-04-11 12:00 ` Simon Glass
  2016-04-12  2:30 ` [U-Boot] " Tom Rini
  0 siblings, 2 replies; 3+ messages in thread
From: Stefan Roese @ 2016-04-08 13:56 UTC (permalink / raw)
  To: u-boot

To make the usage of this function more flexible, lets add the CRC start
value as parameter to this function. This way it can be used by other
functions requiring different start values than 0 as well.

For non-zero CRC start values to work, I've reworked the function a bit.
The new implementation is copied from the Linux version in
drivers/i2c/i2c-core.c / i2c_smbus_pec(). Which supports non-zero
CRC stating values.

I've double-checked that the results for zero starting values are
identical to the results from the original version of this function.

Signed-off-by: Stefan Roese <sr@denx.de>
Cc: Simon Glass <sjg@chromium.org>
---
 drivers/tpm/tpm_tis_sandbox.c |  2 +-
 include/linux/crc8.h          |  3 ++-
 lib/crc8.c                    | 33 ++++++++++++++++++++-------------
 3 files changed, 23 insertions(+), 15 deletions(-)

diff --git a/drivers/tpm/tpm_tis_sandbox.c b/drivers/tpm/tpm_tis_sandbox.c
index 9ea9807..4aade56 100644
--- a/drivers/tpm/tpm_tis_sandbox.c
+++ b/drivers/tpm/tpm_tis_sandbox.c
@@ -217,7 +217,7 @@ static int sandbox_tpm_xfer(struct udevice *dev, const uint8_t *sendbuf,
 			rsk.struct_version = 2;
 			rsk.uid = ROLLBACK_SPACE_KERNEL_UID;
 			rsk.kernel_versions = 0;
-			rsk.crc8 = crc8((unsigned char *)&rsk,
+			rsk.crc8 = crc8(0, (unsigned char *)&rsk,
 					offsetof(struct rollback_space_kernel,
 						 crc8));
 			memcpy(data, &rsk, sizeof(rsk));
diff --git a/include/linux/crc8.h b/include/linux/crc8.h
index b5fd2ac..f7c300a 100644
--- a/include/linux/crc8.h
+++ b/include/linux/crc8.h
@@ -14,10 +14,11 @@
  * This uses an x^8 + x^2 + x + 1 polynomial.  A table-based algorithm would
  * be faster, but for only a few bytes it isn't worth the code size
  *
+ * @crc_start: CRC8 start value
  * @vptr: Buffer to checksum
  * @len: Length of buffer in bytes
  * @return CRC8 checksum
  */
-unsigned int crc8(const unsigned char *vptr, int len);
+unsigned int crc8(unsigned int crc_start, const unsigned char *vptr, int len);
 
 #endif
diff --git a/lib/crc8.c b/lib/crc8.c
index 8b68a29..51d540f 100644
--- a/lib/crc8.c
+++ b/lib/crc8.c
@@ -6,20 +6,27 @@
 
 #include "linux/crc8.h"
 
-unsigned int crc8(const unsigned char *vptr, int len)
+#define POLY	(0x1070U << 3)
+
+static unsigned char _crc8(unsigned short data)
 {
-	const unsigned char *data = vptr;
-	unsigned int crc = 0;
-	int i, j;
-
-	for (j = len; j; j--, data++) {
-		crc ^= (*data << 8);
-		for (i = 8; i; i--) {
-			if (crc & 0x8000)
-				crc ^= (0x1070 << 3);
-			crc <<= 1;
-		}
+	int i;
+
+	for (i = 0; i < 8; i++) {
+		if (data & 0x8000)
+			data = data ^ POLY;
+		data = data << 1;
 	}
 
-	return (crc >> 8) & 0xff;
+	return (unsigned char)(data >> 8);
+}
+
+unsigned int crc8(unsigned int crc, const unsigned char *vptr, int len)
+{
+	int i;
+
+	for (i = 0; i < len; i++)
+		crc = _crc8((crc ^ vptr[i]) << 8);
+
+	return crc;
 }
-- 
2.8.1

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [U-Boot] [PATCH] lib/crc8: Add crc start value
  2016-04-08 13:56 [U-Boot] [PATCH] lib/crc8: Add crc start value Stefan Roese
@ 2016-04-11 12:00 ` Simon Glass
  2016-04-12  2:30 ` [U-Boot] " Tom Rini
  1 sibling, 0 replies; 3+ messages in thread
From: Simon Glass @ 2016-04-11 12:00 UTC (permalink / raw)
  To: u-boot

On 8 April 2016 at 07:56, Stefan Roese <sr@denx.de> wrote:
>
> To make the usage of this function more flexible, lets add the CRC start
> value as parameter to this function. This way it can be used by other
> functions requiring different start values than 0 as well.
>
> For non-zero CRC start values to work, I've reworked the function a bit.
> The new implementation is copied from the Linux version in
> drivers/i2c/i2c-core.c / i2c_smbus_pec(). Which supports non-zero
> CRC stating values.
>
> I've double-checked that the results for zero starting values are
> identical to the results from the original version of this function.
>
> Signed-off-by: Stefan Roese <sr@denx.de>
> Cc: Simon Glass <sjg@chromium.org>
> ---
>  drivers/tpm/tpm_tis_sandbox.c |  2 +-
>  include/linux/crc8.h          |  3 ++-
>  lib/crc8.c                    | 33 ++++++++++++++++++++-------------
>  3 files changed, 23 insertions(+), 15 deletions(-)


Reviewed-by: Simon Glass <sjg@chromium.org>

^ permalink raw reply	[flat|nested] 3+ messages in thread

* [U-Boot] lib/crc8: Add crc start value
  2016-04-08 13:56 [U-Boot] [PATCH] lib/crc8: Add crc start value Stefan Roese
  2016-04-11 12:00 ` Simon Glass
@ 2016-04-12  2:30 ` Tom Rini
  1 sibling, 0 replies; 3+ messages in thread
From: Tom Rini @ 2016-04-12  2:30 UTC (permalink / raw)
  To: u-boot

On Fri, Apr 08, 2016 at 03:56:29PM +0200, Stefan Roese wrote:

> To make the usage of this function more flexible, lets add the CRC start
> value as parameter to this function. This way it can be used by other
> functions requiring different start values than 0 as well.
> 
> For non-zero CRC start values to work, I've reworked the function a bit.
> The new implementation is copied from the Linux version in
> drivers/i2c/i2c-core.c / i2c_smbus_pec(). Which supports non-zero
> CRC stating values.
> 
> I've double-checked that the results for zero starting values are
> identical to the results from the original version of this function.
> 
> Signed-off-by: Stefan Roese <sr@denx.de>
> Cc: Simon Glass <sjg@chromium.org>
> Reviewed-by: Simon Glass <sjg@chromium.org>

Applied to u-boot/master, thanks!

-- 
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20160411/32ec9af9/attachment.sig>

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2016-04-12  2:30 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-04-08 13:56 [U-Boot] [PATCH] lib/crc8: Add crc start value Stefan Roese
2016-04-11 12:00 ` Simon Glass
2016-04-12  2:30 ` [U-Boot] " Tom Rini

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.