diff options
author | Dmitry Kasatkin <dmitry.kasatkin@nokia.com> | 2010-11-19 09:04:27 -0500 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2010-11-27 03:37:18 -0500 |
commit | 3c8d758ab528317ecd6d91f8651170ffd2331899 (patch) | |
tree | 573bd8ac00f9a71ce2062bef99cd7d317b1f5aaa /drivers/crypto | |
parent | 798eed5d9204b01862985ba0643ce5cf84114072 (diff) |
crypto: omap-sham - hash-in-progress is stored in hw format
Hash-in-progress is now stored in hw format.
Only on final call, hash is converted to correct format.
Speedup copy procedure and will allow to use OMAP burst mode.
Signed-off-by: Dmitry Kasatkin <dmitry.kasatkin@nokia.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'drivers/crypto')
-rw-r--r-- | drivers/crypto/omap-sham.c | 38 |
1 files changed, 24 insertions, 14 deletions
diff --git a/drivers/crypto/omap-sham.c b/drivers/crypto/omap-sham.c index 85d627774538..c8d30eb4794a 100644 --- a/drivers/crypto/omap-sham.c +++ b/drivers/crypto/omap-sham.c | |||
@@ -204,24 +204,35 @@ static void omap_sham_copy_hash(struct ahash_request *req, int out) | |||
204 | u32 *hash = (u32 *)ctx->digest; | 204 | u32 *hash = (u32 *)ctx->digest; |
205 | int i; | 205 | int i; |
206 | 206 | ||
207 | /* MD5 is almost unused. So copy sha1 size to reduce code */ | ||
208 | for (i = 0; i < SHA1_DIGEST_SIZE / sizeof(u32); i++) { | ||
209 | if (out) | ||
210 | hash[i] = omap_sham_read(ctx->dd, | ||
211 | SHA_REG_DIGEST(i)); | ||
212 | else | ||
213 | omap_sham_write(ctx->dd, | ||
214 | SHA_REG_DIGEST(i), hash[i]); | ||
215 | } | ||
216 | } | ||
217 | |||
218 | static void omap_sham_copy_ready_hash(struct ahash_request *req) | ||
219 | { | ||
220 | struct omap_sham_reqctx *ctx = ahash_request_ctx(req); | ||
221 | u32 *in = (u32 *)ctx->digest; | ||
222 | u32 *hash = (u32 *)req->result; | ||
223 | int i; | ||
224 | |||
225 | if (!hash) | ||
226 | return; | ||
227 | |||
207 | if (likely(ctx->flags & FLAGS_SHA1)) { | 228 | if (likely(ctx->flags & FLAGS_SHA1)) { |
208 | /* SHA1 results are in big endian */ | 229 | /* SHA1 results are in big endian */ |
209 | for (i = 0; i < SHA1_DIGEST_SIZE / sizeof(u32); i++) | 230 | for (i = 0; i < SHA1_DIGEST_SIZE / sizeof(u32); i++) |
210 | if (out) | 231 | hash[i] = be32_to_cpu(in[i]); |
211 | hash[i] = be32_to_cpu(omap_sham_read(ctx->dd, | ||
212 | SHA_REG_DIGEST(i))); | ||
213 | else | ||
214 | omap_sham_write(ctx->dd, SHA_REG_DIGEST(i), | ||
215 | cpu_to_be32(hash[i])); | ||
216 | } else { | 232 | } else { |
217 | /* MD5 results are in little endian */ | 233 | /* MD5 results are in little endian */ |
218 | for (i = 0; i < MD5_DIGEST_SIZE / sizeof(u32); i++) | 234 | for (i = 0; i < MD5_DIGEST_SIZE / sizeof(u32); i++) |
219 | if (out) | 235 | hash[i] = le32_to_cpu(in[i]); |
220 | hash[i] = le32_to_cpu(omap_sham_read(ctx->dd, | ||
221 | SHA_REG_DIGEST(i))); | ||
222 | else | ||
223 | omap_sham_write(ctx->dd, SHA_REG_DIGEST(i), | ||
224 | cpu_to_le32(hash[i])); | ||
225 | } | 236 | } |
226 | } | 237 | } |
227 | 238 | ||
@@ -474,8 +485,7 @@ static void omap_sham_cleanup(struct ahash_request *req) | |||
474 | spin_unlock_irqrestore(&dd->lock, flags); | 485 | spin_unlock_irqrestore(&dd->lock, flags); |
475 | 486 | ||
476 | if (ctx->digcnt) | 487 | if (ctx->digcnt) |
477 | memcpy(req->result, ctx->digest, (ctx->flags & FLAGS_SHA1) ? | 488 | omap_sham_copy_ready_hash(req); |
478 | SHA1_DIGEST_SIZE : MD5_DIGEST_SIZE); | ||
479 | 489 | ||
480 | dev_dbg(dd->dev, "digcnt: %d, bufcnt: %d\n", ctx->digcnt, ctx->bufcnt); | 490 | dev_dbg(dd->dev, "digcnt: %d, bufcnt: %d\n", ctx->digcnt, ctx->bufcnt); |
481 | } | 491 | } |