diff options
Diffstat (limited to 'lib/crc32_c.c')
-rw-r--r-- | lib/crc32_c.c | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/lib/crc32_c.c b/lib/crc32_c.c new file mode 100644 index 0000000000..c5c510052d --- /dev/null +++ b/lib/crc32_c.c @@ -0,0 +1,108 @@ +/* + * Copied from Linux kernel crypto/crc32c.c + * Copyright (c) 2004 Cisco Systems, Inc. + * Copyright (c) 2008 Herbert Xu <herbert at gondor.apana.org.au> + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + */ +#include <linux/stat.h> +#include <command.h> +#include <asm/byteorder.h> +#include <linux/compiler.h> +#include <common.h> +#include <config.h> + +#if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG) +#include <watchdog.h> +#endif +#include <u-boot/crc.h> + +#define __BYTE_ORDER __LITTLE_ENDIAN + +static const uint32_t crc32c_table[256] = { + (0x00000000), (0xf26b8303), (0xe13b70f7), (0x1350f3f4), + (0xc79a971f), (0x35f1141c), (0x26a1e7e8), (0xd4ca64eb), + (0x8ad958cf), (0x78b2dbcc), (0x6be22838), (0x9989ab3b), + (0x4d43cfd0), (0xbf284cd3), (0xac78bf27), (0x5e133c24), + (0x105ec76f), (0xe235446c), (0xf165b798), (0x030e349b), + (0xd7c45070), (0x25afd373), (0x36ff2087), (0xc494a384), + (0x9a879fa0), (0x68ec1ca3), (0x7bbcef57), (0x89d76c54), + (0x5d1d08bf), (0xaf768bbc), (0xbc267848), (0x4e4dfb4b), + (0x20bd8ede), (0xd2d60ddd), (0xc186fe29), (0x33ed7d2a), + (0xe72719c1), (0x154c9ac2), (0x061c6936), (0xf477ea35), + (0xaa64d611), (0x580f5512), (0x4b5fa6e6), (0xb93425e5), + (0x6dfe410e), (0x9f95c20d), (0x8cc531f9), (0x7eaeb2fa), + (0x30e349b1), (0xc288cab2), (0xd1d83946), (0x23b3ba45), + (0xf779deae), (0x05125dad), (0x1642ae59), (0xe4292d5a), + (0xba3a117e), (0x4851927d), (0x5b016189), (0xa96ae28a), + (0x7da08661), (0x8fcb0562), (0x9c9bf696), (0x6ef07595), + (0x417b1dbc), (0xb3109ebf), (0xa0406d4b), (0x522bee48), + (0x86e18aa3), (0x748a09a0), (0x67dafa54), (0x95b17957), + (0xcba24573), (0x39c9c670), (0x2a993584), (0xd8f2b687), + (0x0c38d26c), (0xfe53516f), (0xed03a29b), (0x1f682198), + (0x5125dad3), (0xa34e59d0), (0xb01eaa24), (0x42752927), + (0x96bf4dcc), (0x64d4cecf), (0x77843d3b), (0x85efbe38), + (0xdbfc821c), (0x2997011f), (0x3ac7f2eb), (0xc8ac71e8), + (0x1c661503), (0xee0d9600), (0xfd5d65f4), (0x0f36e6f7), + (0x61c69362), (0x93ad1061), (0x80fde395), (0x72966096), + (0xa65c047d), (0x5437877e), (0x4767748a), (0xb50cf789), + (0xeb1fcbad), (0x197448ae), (0x0a24bb5a), (0xf84f3859), + (0x2c855cb2), (0xdeeedfb1), (0xcdbe2c45), (0x3fd5af46), + (0x7198540d), (0x83f3d70e), (0x90a324fa), (0x62c8a7f9), + (0xb602c312), (0x44694011), (0x5739b3e5), (0xa55230e6), + (0xfb410cc2), (0x092a8fc1), (0x1a7a7c35), (0xe811ff36), + (0x3cdb9bdd), (0xceb018de), (0xdde0eb2a), (0x2f8b6829), + (0x82f63b78), (0x709db87b), (0x63cd4b8f), (0x91a6c88c), + (0x456cac67), (0xb7072f64), (0xa457dc90), (0x563c5f93), + (0x082f63b7), (0xfa44e0b4), (0xe9141340), (0x1b7f9043), + (0xcfb5f4a8), (0x3dde77ab), (0x2e8e845f), (0xdce5075c), + (0x92a8fc17), (0x60c37f14), (0x73938ce0), (0x81f80fe3), + (0x55326b08), (0xa759e80b), (0xb4091bff), (0x466298fc), + (0x1871a4d8), (0xea1a27db), (0xf94ad42f), (0x0b21572c), + (0xdfeb33c7), (0x2d80b0c4), (0x3ed04330), (0xccbbc033), + (0xa24bb5a6), (0x502036a5), (0x4370c551), (0xb11b4652), + (0x65d122b9), (0x97baa1ba), (0x84ea524e), (0x7681d14d), + (0x2892ed69), (0xdaf96e6a), (0xc9a99d9e), (0x3bc21e9d), + (0xef087a76), (0x1d63f975), (0x0e330a81), (0xfc588982), + (0xb21572c9), (0x407ef1ca), (0x532e023e), (0xa145813d), + (0x758fe5d6), (0x87e466d5), (0x94b49521), (0x66df1622), + (0x38cc2a06), (0xcaa7a905), (0xd9f75af1), (0x2b9cd9f2), + (0xff56bd19), (0x0d3d3e1a), (0x1e6dcdee), (0xec064eed), + (0xc38d26c4), (0x31e6a5c7), (0x22b65633), (0xd0ddd530), + (0x0417b1db), (0xf67c32d8), (0xe52cc12c), (0x1747422f), + (0x49547e0b), (0xbb3ffd08), (0xa86f0efc), (0x5a048dff), + (0x8ecee914), (0x7ca56a17), (0x6ff599e3), (0x9d9e1ae0), + (0xd3d3e1ab), (0x21b862a8), (0x32e8915c), (0xc083125f), + (0x144976b4), (0xe622f5b7), (0xf5720643), (0x07198540), + (0x590ab964), (0xab613a67), (0xb831c993), (0x4a5a4a90), + (0x9e902e7b), (0x6cfbad78), (0x7fab5e8c), (0x8dc0dd8f), + (0xe330a81a), (0x115b2b19), (0x020bd8ed), (0xf0605bee), + (0x24aa3f05), (0xd6c1bc06), (0xc5914ff2), (0x37faccf1), + (0x69e9f0d5), (0x9b8273d6), (0x88d28022), (0x7ab90321), + (0xae7367ca), (0x5c18e4c9), (0x4f48173d), (0xbd23943e), + (0xf36e6f75), (0x0105ec76), (0x12551f82), (0xe03e9c81), + (0x34f4f86a), (0xc69f7b69), (0xd5cf889d), (0x27a40b9e), + (0x79b737ba), (0x8bdcb4b9), (0x988c474d), (0x6ae7c44e), + (0xbe2da0a5), (0x4c4623a6), (0x5f16d052), (0xad7d5351), +}; + +/* ========================================================================= */ +# if __BYTE_ORDER == __LITTLE_ENDIAN +# define DO_CRC(x) crc = crc32c_table[(crc ^ (x)) & 255] ^ (crc >> 8) +# else +# define DO_CRC(x) crc = crc32c_table[((crc >> 24) ^ (x)) & 255] ^ (crc << 8) +# endif + +u32 crc32c_cal(u32 crc, const char *data, size_t length) +{ + while (length--) + crc = DO_CRC(*data++); +#if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG) + WATCHDOG_RESET(); +#endif + return crc; +} |