]> git.sur5r.net Git - u-boot/blobdiff - common/hash.c
sdhci: Add sdhci support for spear devices
[u-boot] / common / hash.c
index ef6fe375d289edcfd313c0d65eaf10efe8e5cf0f..c9ac33e2c40ac3d48c4db79f323b0ed645a27274 100644 (file)
 
 #include <common.h>
 #include <command.h>
+#include <hw_sha.h>
 #include <hash.h>
 #include <sha1.h>
 #include <sha256.h>
+#include <asm/io.h>
 
 /*
  * These are the hash algorithms we support. Chips which support accelerated
- * crypto could perhaps add named version of these algorithms here.
+ * crypto could perhaps add named version of these algorithms here. Note that
+ * algorithm names must be in lower case.
  */
 static struct hash_algo hash_algo[] = {
+       /*
+        * CONFIG_SHA_HW_ACCEL is defined if hardware acceleration is
+        * available.
+        */
+#ifdef CONFIG_SHA_HW_ACCEL
+       {
+               "sha1",
+               SHA1_SUM_LEN,
+               hw_sha1,
+               CHUNKSZ_SHA1,
+       }, {
+               "sha256",
+               SHA256_SUM_LEN,
+               hw_sha256,
+               CHUNKSZ_SHA256,
+       },
+#endif
        /*
         * This is CONFIG_CMD_SHA1SUM instead of CONFIG_SHA1 since otherwise
         * it bloats the code for boards which use SHA1 but not the 'hash'
@@ -41,7 +61,7 @@ static struct hash_algo hash_algo[] = {
         */
 #ifdef CONFIG_CMD_SHA1SUM
        {
-               "SHA1",
+               "sha1",
                SHA1_SUM_LEN,
                sha1_csum_wd,
                CHUNKSZ_SHA1,
@@ -50,7 +70,7 @@ static struct hash_algo hash_algo[] = {
 #endif
 #ifdef CONFIG_SHA256
        {
-               "SHA256",
+               "sha256",
                SHA256_SUM_LEN,
                sha256_csum_wd,
                CHUNKSZ_SHA256,
@@ -58,7 +78,7 @@ static struct hash_algo hash_algo[] = {
 #define MULTI_HASH
 #endif
        {
-               "CRC32",
+               "crc32",
                4,
                crc32_wd_buf,
                CHUNKSZ_CRC32,
@@ -117,10 +137,13 @@ static void store_result(struct hash_algo *algo, const u8 *sum,
                str_ptr = '\0';
                setenv(dest, str_output);
        } else {
-               u8 *ptr;
+               ulong addr;
+               void *buf;
 
-               ptr = (u8 *)simple_strtoul(dest, NULL, 16);
-               memcpy(ptr, sum, algo->digest_size);
+               addr = simple_strtoul(dest, NULL, 16);
+               buf = map_sysmem(addr, algo->digest_size);
+               memcpy(buf, sum, algo->digest_size);
+               unmap_sysmem(buf);
        }
 }
 
@@ -154,10 +177,12 @@ static int parse_verify_sum(struct hash_algo *algo, char *verify_str, u8 *vsum,
        }
 
        if (env_var) {
-               u8 *ptr;
+               ulong addr;
+               void *buf;
 
-               ptr = (u8 *)simple_strtoul(verify_str, NULL, 16);
-               memcpy(vsum, ptr, algo->digest_size);
+               addr = simple_strtoul(verify_str, NULL, 16);
+               buf = map_sysmem(addr, algo->digest_size);
+               memcpy(vsum, buf, algo->digest_size);
        } else {
                unsigned int i;
                char *vsum_str;
@@ -196,7 +221,7 @@ static struct hash_algo *find_hash_algo(const char *name)
        int i;
 
        for (i = 0; i < ARRAY_SIZE(hash_algo); i++) {
-               if (!strcasecmp(name, hash_algo[i].name))
+               if (!strcmp(name, hash_algo[i].name))
                        return &hash_algo[i];
        }
 
@@ -228,6 +253,7 @@ int hash_command(const char *algo_name, int flags, cmd_tbl_t *cmdtp, int flag,
                struct hash_algo *algo;
                u8 output[HASH_MAX_DIGEST_SIZE];
                u8 vsum[HASH_MAX_DIGEST_SIZE];
+               void *buf;
 
                algo = find_hash_algo(algo_name);
                if (!algo) {
@@ -241,8 +267,9 @@ int hash_command(const char *algo_name, int flags, cmd_tbl_t *cmdtp, int flag,
                        return 1;
                }
 
-               algo->hash_func_ws((const unsigned char *)addr, len, output,
-                                  algo->chunk_size);
+               buf = map_sysmem(addr, len);
+               algo->hash_func_ws(buf, len, output, algo->chunk_size);
+               unmap_sysmem(buf);
 
                /* Try to avoid code bloat when verify is not needed */
 #ifdef CONFIG_HASH_VERIFY