diff options
| author | Ruchika Gupta <ruchika.gupta@freescale.com> | 2013-10-25 02:31:03 -0400 |
|---|---|---|
| committer | Herbert Xu <herbert@gondor.apana.org.au> | 2013-10-30 00:02:58 -0400 |
| commit | cfc6f11b768a9bdda17aac280474de1f0e344fea (patch) | |
| tree | 54fdff4a8b4878c575ef85745b1dffd643c069dd /drivers | |
| parent | 07defbfb0fd662272dff5207001a0a5e09aeaeec (diff) | |
crypto: caam - Modify the interface layers to use JR API's
- Earlier interface layers - caamalg, caamhash, caamrng were
directly using the Controller driver private structure to access
the Job ring.
- Changed the above to use alloc/free API's provided by Job Ring Drive
Signed-off-by: Ruchika Gupta <ruchika.gupta@freescale.com>
Reviewed-by: Garg Vakul-B16394 <vakul@freescale.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/crypto/caam/caamalg.c | 92 | ||||
| -rw-r--r-- | drivers/crypto/caam/caamhash.c | 97 | ||||
| -rw-r--r-- | drivers/crypto/caam/caamrng.c | 37 | ||||
| -rw-r--r-- | drivers/crypto/caam/intern.h | 7 |
4 files changed, 55 insertions, 178 deletions
diff --git a/drivers/crypto/caam/caamalg.c b/drivers/crypto/caam/caamalg.c index ad9781e646c0..4f44b71b9e24 100644 --- a/drivers/crypto/caam/caamalg.c +++ b/drivers/crypto/caam/caamalg.c | |||
| @@ -86,6 +86,7 @@ | |||
| 86 | #else | 86 | #else |
| 87 | #define debug(format, arg...) | 87 | #define debug(format, arg...) |
| 88 | #endif | 88 | #endif |
| 89 | static struct list_head alg_list; | ||
| 89 | 90 | ||
| 90 | /* Set DK bit in class 1 operation if shared */ | 91 | /* Set DK bit in class 1 operation if shared */ |
| 91 | static inline void append_dec_op1(u32 *desc, u32 type) | 92 | static inline void append_dec_op1(u32 *desc, u32 type) |
| @@ -2057,7 +2058,6 @@ static struct caam_alg_template driver_algs[] = { | |||
| 2057 | 2058 | ||
| 2058 | struct caam_crypto_alg { | 2059 | struct caam_crypto_alg { |
| 2059 | struct list_head entry; | 2060 | struct list_head entry; |
| 2060 | struct device *ctrldev; | ||
| 2061 | int class1_alg_type; | 2061 | int class1_alg_type; |
| 2062 | int class2_alg_type; | 2062 | int class2_alg_type; |
| 2063 | int alg_op; | 2063 | int alg_op; |
| @@ -2070,16 +2070,12 @@ static int caam_cra_init(struct crypto_tfm *tfm) | |||
| 2070 | struct caam_crypto_alg *caam_alg = | 2070 | struct caam_crypto_alg *caam_alg = |
| 2071 | container_of(alg, struct caam_crypto_alg, crypto_alg); | 2071 | container_of(alg, struct caam_crypto_alg, crypto_alg); |
| 2072 | struct caam_ctx *ctx = crypto_tfm_ctx(tfm); | 2072 | struct caam_ctx *ctx = crypto_tfm_ctx(tfm); |
| 2073 | struct caam_drv_private *priv = dev_get_drvdata(caam_alg->ctrldev); | ||
| 2074 | struct platform_device *pdev; | ||
| 2075 | int tgt_jr = atomic_inc_return(&priv->tfm_count); | ||
| 2076 | 2073 | ||
| 2077 | /* | 2074 | ctx->jrdev = caam_jr_alloc(); |
| 2078 | * distribute tfms across job rings to ensure in-order | 2075 | if (IS_ERR(ctx->jrdev)) { |
| 2079 | * crypto request processing per tfm | 2076 | pr_err("Job Ring Device allocation for transform failed\n"); |
| 2080 | */ | 2077 | return PTR_ERR(ctx->jrdev); |
| 2081 | pdev = priv->jrpdev[(tgt_jr / 2) % priv->total_jobrs]; | 2078 | } |
| 2082 | ctx->jrdev = &pdev->dev; | ||
| 2083 | 2079 | ||
| 2084 | /* copy descriptor header template value */ | 2080 | /* copy descriptor header template value */ |
| 2085 | ctx->class1_alg_type = OP_TYPE_CLASS1_ALG | caam_alg->class1_alg_type; | 2081 | ctx->class1_alg_type = OP_TYPE_CLASS1_ALG | caam_alg->class1_alg_type; |
| @@ -2106,44 +2102,26 @@ static void caam_cra_exit(struct crypto_tfm *tfm) | |||
| 2106 | dma_unmap_single(ctx->jrdev, ctx->sh_desc_givenc_dma, | 2102 | dma_unmap_single(ctx->jrdev, ctx->sh_desc_givenc_dma, |
| 2107 | desc_bytes(ctx->sh_desc_givenc), | 2103 | desc_bytes(ctx->sh_desc_givenc), |
| 2108 | DMA_TO_DEVICE); | 2104 | DMA_TO_DEVICE); |
| 2105 | |||
| 2106 | caam_jr_free(ctx->jrdev); | ||
| 2109 | } | 2107 | } |
| 2110 | 2108 | ||
| 2111 | static void __exit caam_algapi_exit(void) | 2109 | static void __exit caam_algapi_exit(void) |
| 2112 | { | 2110 | { |
| 2113 | 2111 | ||
| 2114 | struct device_node *dev_node; | ||
| 2115 | struct platform_device *pdev; | ||
| 2116 | struct device *ctrldev; | ||
| 2117 | struct caam_drv_private *priv; | ||
| 2118 | struct caam_crypto_alg *t_alg, *n; | 2112 | struct caam_crypto_alg *t_alg, *n; |
| 2119 | 2113 | ||
| 2120 | dev_node = of_find_compatible_node(NULL, NULL, "fsl,sec-v4.0"); | 2114 | if (!alg_list.next) |
| 2121 | if (!dev_node) { | ||
| 2122 | dev_node = of_find_compatible_node(NULL, NULL, "fsl,sec4.0"); | ||
| 2123 | if (!dev_node) | ||
| 2124 | return; | ||
| 2125 | } | ||
| 2126 | |||
| 2127 | pdev = of_find_device_by_node(dev_node); | ||
| 2128 | if (!pdev) | ||
| 2129 | return; | ||
| 2130 | |||
| 2131 | ctrldev = &pdev->dev; | ||
| 2132 | of_node_put(dev_node); | ||
| 2133 | priv = dev_get_drvdata(ctrldev); | ||
| 2134 | |||
| 2135 | if (!priv->alg_list.next) | ||
| 2136 | return; | 2115 | return; |
| 2137 | 2116 | ||
| 2138 | list_for_each_entry_safe(t_alg, n, &priv->alg_list, entry) { | 2117 | list_for_each_entry_safe(t_alg, n, &alg_list, entry) { |
| 2139 | crypto_unregister_alg(&t_alg->crypto_alg); | 2118 | crypto_unregister_alg(&t_alg->crypto_alg); |
| 2140 | list_del(&t_alg->entry); | 2119 | list_del(&t_alg->entry); |
| 2141 | kfree(t_alg); | 2120 | kfree(t_alg); |
| 2142 | } | 2121 | } |
| 2143 | } | 2122 | } |
| 2144 | 2123 | ||
| 2145 | static struct caam_crypto_alg *caam_alg_alloc(struct device *ctrldev, | 2124 | static struct caam_crypto_alg *caam_alg_alloc(struct caam_alg_template |
| 2146 | struct caam_alg_template | ||
| 2147 | *template) | 2125 | *template) |
| 2148 | { | 2126 | { |
| 2149 | struct caam_crypto_alg *t_alg; | 2127 | struct caam_crypto_alg *t_alg; |
| @@ -2151,7 +2129,7 @@ static struct caam_crypto_alg *caam_alg_alloc(struct device *ctrldev, | |||
| 2151 | 2129 | ||
| 2152 | t_alg = kzalloc(sizeof(struct caam_crypto_alg), GFP_KERNEL); | 2130 | t_alg = kzalloc(sizeof(struct caam_crypto_alg), GFP_KERNEL); |
| 2153 | if (!t_alg) { | 2131 | if (!t_alg) { |
| 2154 | dev_err(ctrldev, "failed to allocate t_alg\n"); | 2132 | pr_err("failed to allocate t_alg\n"); |
| 2155 | return ERR_PTR(-ENOMEM); | 2133 | return ERR_PTR(-ENOMEM); |
| 2156 | } | 2134 | } |
| 2157 | 2135 | ||
| @@ -2183,69 +2161,39 @@ static struct caam_crypto_alg *caam_alg_alloc(struct device *ctrldev, | |||
| 2183 | t_alg->class1_alg_type = template->class1_alg_type; | 2161 | t_alg->class1_alg_type = template->class1_alg_type; |
| 2184 | t_alg->class2_alg_type = template->class2_alg_type; | 2162 | t_alg->class2_alg_type = template->class2_alg_type; |
| 2185 | t_alg->alg_op = template->alg_op; | 2163 | t_alg->alg_op = template->alg_op; |
| 2186 | t_alg->ctrldev = ctrldev; | ||
| 2187 | 2164 | ||
| 2188 | return t_alg; | 2165 | return t_alg; |
| 2189 | } | 2166 | } |
| 2190 | 2167 | ||
| 2191 | static int __init caam_algapi_init(void) | 2168 | static int __init caam_algapi_init(void) |
| 2192 | { | 2169 | { |
| 2193 | struct device_node *dev_node; | ||
| 2194 | struct platform_device *pdev; | ||
| 2195 | struct device *ctrldev; | ||
| 2196 | struct caam_drv_private *priv; | ||
| 2197 | int i = 0, err = 0; | 2170 | int i = 0, err = 0; |
| 2198 | 2171 | ||
| 2199 | dev_node = of_find_compatible_node(NULL, NULL, "fsl,sec-v4.0"); | 2172 | INIT_LIST_HEAD(&alg_list); |
| 2200 | if (!dev_node) { | ||
| 2201 | dev_node = of_find_compatible_node(NULL, NULL, "fsl,sec4.0"); | ||
| 2202 | if (!dev_node) | ||
| 2203 | return -ENODEV; | ||
| 2204 | } | ||
| 2205 | |||
| 2206 | pdev = of_find_device_by_node(dev_node); | ||
| 2207 | if (!pdev) | ||
| 2208 | return -ENODEV; | ||
| 2209 | |||
| 2210 | ctrldev = &pdev->dev; | ||
| 2211 | priv = dev_get_drvdata(ctrldev); | ||
| 2212 | of_node_put(dev_node); | ||
| 2213 | |||
| 2214 | /* | ||
| 2215 | * If priv is NULL, it's probably because the caam driver wasn't | ||
| 2216 | * properly initialized (e.g. RNG4 init failed). Thus, bail out here. | ||
| 2217 | */ | ||
| 2218 | if (!priv) | ||
| 2219 | return -ENODEV; | ||
| 2220 | |||
| 2221 | INIT_LIST_HEAD(&priv->alg_list); | ||
| 2222 | |||
| 2223 | atomic_set(&priv->tfm_count, -1); | ||
| 2224 | 2173 | ||
| 2225 | /* register crypto algorithms the device supports */ | 2174 | /* register crypto algorithms the device supports */ |
| 2226 | for (i = 0; i < ARRAY_SIZE(driver_algs); i++) { | 2175 | for (i = 0; i < ARRAY_SIZE(driver_algs); i++) { |
| 2227 | /* TODO: check if h/w supports alg */ | 2176 | /* TODO: check if h/w supports alg */ |
| 2228 | struct caam_crypto_alg *t_alg; | 2177 | struct caam_crypto_alg *t_alg; |
| 2229 | 2178 | ||
| 2230 | t_alg = caam_alg_alloc(ctrldev, &driver_algs[i]); | 2179 | t_alg = caam_alg_alloc(&driver_algs[i]); |
| 2231 | if (IS_ERR(t_alg)) { | 2180 | if (IS_ERR(t_alg)) { |
| 2232 | err = PTR_ERR(t_alg); | 2181 | err = PTR_ERR(t_alg); |
| 2233 | dev_warn(ctrldev, "%s alg allocation failed\n", | 2182 | pr_warn("%s alg allocation failed\n", |
| 2234 | driver_algs[i].driver_name); | 2183 | driver_algs[i].driver_name); |
| 2235 | continue; | 2184 | continue; |
| 2236 | } | 2185 | } |
| 2237 | 2186 | ||
| 2238 | err = crypto_register_alg(&t_alg->crypto_alg); | 2187 | err = crypto_register_alg(&t_alg->crypto_alg); |
| 2239 | if (err) { | 2188 | if (err) { |
| 2240 | dev_warn(ctrldev, "%s alg registration failed\n", | 2189 | pr_warn("%s alg registration failed\n", |
| 2241 | t_alg->crypto_alg.cra_driver_name); | 2190 | t_alg->crypto_alg.cra_driver_name); |
| 2242 | kfree(t_alg); | 2191 | kfree(t_alg); |
| 2243 | } else | 2192 | } else |
| 2244 | list_add_tail(&t_alg->entry, &priv->alg_list); | 2193 | list_add_tail(&t_alg->entry, &alg_list); |
| 2245 | } | 2194 | } |
| 2246 | if (!list_empty(&priv->alg_list)) | 2195 | if (!list_empty(&alg_list)) |
| 2247 | dev_info(ctrldev, "%s algorithms registered in /proc/crypto\n", | 2196 | pr_info("caam algorithms registered in /proc/crypto\n"); |
| 2248 | (char *)of_get_property(dev_node, "compatible", NULL)); | ||
| 2249 | 2197 | ||
| 2250 | return err; | 2198 | return err; |
| 2251 | } | 2199 | } |
diff --git a/drivers/crypto/caam/caamhash.c b/drivers/crypto/caam/caamhash.c index 91a93541ed7f..0378328f47a7 100644 --- a/drivers/crypto/caam/caamhash.c +++ b/drivers/crypto/caam/caamhash.c | |||
| @@ -94,6 +94,9 @@ | |||
| 94 | #define debug(format, arg...) | 94 | #define debug(format, arg...) |
| 95 | #endif | 95 | #endif |
| 96 | 96 | ||
| 97 | |||
| 98 | static struct list_head hash_list; | ||
| 99 | |||
| 97 | /* ahash per-session context */ | 100 | /* ahash per-session context */ |
| 98 | struct caam_hash_ctx { | 101 | struct caam_hash_ctx { |
| 99 | struct device *jrdev; | 102 | struct device *jrdev; |
| @@ -1653,7 +1656,6 @@ static struct caam_hash_template driver_hash[] = { | |||
| 1653 | 1656 | ||
| 1654 | struct caam_hash_alg { | 1657 | struct caam_hash_alg { |
| 1655 | struct list_head entry; | 1658 | struct list_head entry; |
| 1656 | struct device *ctrldev; | ||
| 1657 | int alg_type; | 1659 | int alg_type; |
| 1658 | int alg_op; | 1660 | int alg_op; |
| 1659 | struct ahash_alg ahash_alg; | 1661 | struct ahash_alg ahash_alg; |
| @@ -1670,7 +1672,6 @@ static int caam_hash_cra_init(struct crypto_tfm *tfm) | |||
| 1670 | struct caam_hash_alg *caam_hash = | 1672 | struct caam_hash_alg *caam_hash = |
| 1671 | container_of(alg, struct caam_hash_alg, ahash_alg); | 1673 | container_of(alg, struct caam_hash_alg, ahash_alg); |
| 1672 | struct caam_hash_ctx *ctx = crypto_tfm_ctx(tfm); | 1674 | struct caam_hash_ctx *ctx = crypto_tfm_ctx(tfm); |
| 1673 | struct caam_drv_private *priv = dev_get_drvdata(caam_hash->ctrldev); | ||
| 1674 | /* Sizes for MDHA running digests: MD5, SHA1, 224, 256, 384, 512 */ | 1675 | /* Sizes for MDHA running digests: MD5, SHA1, 224, 256, 384, 512 */ |
| 1675 | static const u8 runninglen[] = { HASH_MSG_LEN + MD5_DIGEST_SIZE, | 1676 | static const u8 runninglen[] = { HASH_MSG_LEN + MD5_DIGEST_SIZE, |
| 1676 | HASH_MSG_LEN + SHA1_DIGEST_SIZE, | 1677 | HASH_MSG_LEN + SHA1_DIGEST_SIZE, |
| @@ -1678,17 +1679,17 @@ static int caam_hash_cra_init(struct crypto_tfm *tfm) | |||
| 1678 | HASH_MSG_LEN + SHA256_DIGEST_SIZE, | 1679 | HASH_MSG_LEN + SHA256_DIGEST_SIZE, |
| 1679 | HASH_MSG_LEN + 64, | 1680 | HASH_MSG_LEN + 64, |
| 1680 | HASH_MSG_LEN + SHA512_DIGEST_SIZE }; | 1681 | HASH_MSG_LEN + SHA512_DIGEST_SIZE }; |
| 1681 | int tgt_jr = atomic_inc_return(&priv->tfm_count); | ||
| 1682 | int ret = 0; | 1682 | int ret = 0; |
| 1683 | struct platform_device *pdev; | ||
| 1684 | 1683 | ||
| 1685 | /* | 1684 | /* |
| 1686 | * distribute tfms across job rings to ensure in-order | 1685 | * Get a Job ring from Job Ring driver to ensure in-order |
| 1687 | * crypto request processing per tfm | 1686 | * crypto request processing per tfm |
| 1688 | */ | 1687 | */ |
| 1689 | pdev = priv->jrpdev[tgt_jr % priv->total_jobrs]; | 1688 | ctx->jrdev = caam_jr_alloc(); |
| 1690 | ctx->jrdev = &pdev->dev; | 1689 | if (IS_ERR(ctx->jrdev)) { |
| 1691 | 1690 | pr_err("Job Ring Device allocation for transform failed\n"); | |
| 1691 | return PTR_ERR(ctx->jrdev); | ||
| 1692 | } | ||
| 1692 | /* copy descriptor header template value */ | 1693 | /* copy descriptor header template value */ |
| 1693 | ctx->alg_type = OP_TYPE_CLASS2_ALG | caam_hash->alg_type; | 1694 | ctx->alg_type = OP_TYPE_CLASS2_ALG | caam_hash->alg_type; |
| 1694 | ctx->alg_op = OP_TYPE_CLASS2_ALG | caam_hash->alg_op; | 1695 | ctx->alg_op = OP_TYPE_CLASS2_ALG | caam_hash->alg_op; |
| @@ -1731,35 +1732,18 @@ static void caam_hash_cra_exit(struct crypto_tfm *tfm) | |||
| 1731 | !dma_mapping_error(ctx->jrdev, ctx->sh_desc_finup_dma)) | 1732 | !dma_mapping_error(ctx->jrdev, ctx->sh_desc_finup_dma)) |
| 1732 | dma_unmap_single(ctx->jrdev, ctx->sh_desc_finup_dma, | 1733 | dma_unmap_single(ctx->jrdev, ctx->sh_desc_finup_dma, |
| 1733 | desc_bytes(ctx->sh_desc_finup), DMA_TO_DEVICE); | 1734 | desc_bytes(ctx->sh_desc_finup), DMA_TO_DEVICE); |
| 1735 | |||
| 1736 | caam_jr_free(ctx->jrdev); | ||
| 1734 | } | 1737 | } |
| 1735 | 1738 | ||
| 1736 | static void __exit caam_algapi_hash_exit(void) | 1739 | static void __exit caam_algapi_hash_exit(void) |
| 1737 | { | 1740 | { |
| 1738 | struct device_node *dev_node; | ||
| 1739 | struct platform_device *pdev; | ||
| 1740 | struct device *ctrldev; | ||
| 1741 | struct caam_drv_private *priv; | ||
| 1742 | struct caam_hash_alg *t_alg, *n; | 1741 | struct caam_hash_alg *t_alg, *n; |
| 1743 | 1742 | ||
| 1744 | dev_node = of_find_compatible_node(NULL, NULL, "fsl,sec-v4.0"); | 1743 | if (!hash_list.next) |
| 1745 | if (!dev_node) { | ||
| 1746 | dev_node = of_find_compatible_node(NULL, NULL, "fsl,sec4.0"); | ||
| 1747 | if (!dev_node) | ||
| 1748 | return; | ||
| 1749 | } | ||
| 1750 | |||
| 1751 | pdev = of_find_device_by_node(dev_node); | ||
| 1752 | if (!pdev) | ||
| 1753 | return; | ||
| 1754 | |||
| 1755 | ctrldev = &pdev->dev; | ||
| 1756 | of_node_put(dev_node); | ||
| 1757 | priv = dev_get_drvdata(ctrldev); | ||
| 1758 | |||
| 1759 | if (!priv->hash_list.next) | ||
| 1760 | return; | 1744 | return; |
| 1761 | 1745 | ||
| 1762 | list_for_each_entry_safe(t_alg, n, &priv->hash_list, entry) { | 1746 | list_for_each_entry_safe(t_alg, n, &hash_list, entry) { |
| 1763 | crypto_unregister_ahash(&t_alg->ahash_alg); | 1747 | crypto_unregister_ahash(&t_alg->ahash_alg); |
| 1764 | list_del(&t_alg->entry); | 1748 | list_del(&t_alg->entry); |
| 1765 | kfree(t_alg); | 1749 | kfree(t_alg); |
| @@ -1767,7 +1751,7 @@ static void __exit caam_algapi_hash_exit(void) | |||
| 1767 | } | 1751 | } |
| 1768 | 1752 | ||
| 1769 | static struct caam_hash_alg * | 1753 | static struct caam_hash_alg * |
| 1770 | caam_hash_alloc(struct device *ctrldev, struct caam_hash_template *template, | 1754 | caam_hash_alloc(struct caam_hash_template *template, |
| 1771 | bool keyed) | 1755 | bool keyed) |
| 1772 | { | 1756 | { |
| 1773 | struct caam_hash_alg *t_alg; | 1757 | struct caam_hash_alg *t_alg; |
| @@ -1776,7 +1760,7 @@ caam_hash_alloc(struct device *ctrldev, struct caam_hash_template *template, | |||
| 1776 | 1760 | ||
| 1777 | t_alg = kzalloc(sizeof(struct caam_hash_alg), GFP_KERNEL); | 1761 | t_alg = kzalloc(sizeof(struct caam_hash_alg), GFP_KERNEL); |
| 1778 | if (!t_alg) { | 1762 | if (!t_alg) { |
| 1779 | dev_err(ctrldev, "failed to allocate t_alg\n"); | 1763 | pr_err("failed to allocate t_alg\n"); |
| 1780 | return ERR_PTR(-ENOMEM); | 1764 | return ERR_PTR(-ENOMEM); |
| 1781 | } | 1765 | } |
| 1782 | 1766 | ||
| @@ -1807,44 +1791,15 @@ caam_hash_alloc(struct device *ctrldev, struct caam_hash_template *template, | |||
| 1807 | 1791 | ||
| 1808 | t_alg->alg_type = template->alg_type; | 1792 | t_alg->alg_type = template->alg_type; |
| 1809 | t_alg->alg_op = template->alg_op; | 1793 | t_alg->alg_op = template->alg_op; |
| 1810 | t_alg->ctrldev = ctrldev; | ||
| 1811 | 1794 | ||
| 1812 | return t_alg; | 1795 | return t_alg; |
| 1813 | } | 1796 | } |
| 1814 | 1797 | ||
| 1815 | static int __init caam_algapi_hash_init(void) | 1798 | static int __init caam_algapi_hash_init(void) |
| 1816 | { | 1799 | { |
| 1817 | struct device_node *dev_node; | ||
| 1818 | struct platform_device *pdev; | ||
| 1819 | struct device *ctrldev; | ||
| 1820 | struct caam_drv_private *priv; | ||
| 1821 | int i = 0, err = 0; | 1800 | int i = 0, err = 0; |
| 1822 | 1801 | ||
| 1823 | dev_node = of_find_compatible_node(NULL, NULL, "fsl,sec-v4.0"); | 1802 | INIT_LIST_HEAD(&hash_list); |
| 1824 | if (!dev_node) { | ||
| 1825 | dev_node = of_find_compatible_node(NULL, NULL, "fsl,sec4.0"); | ||
| 1826 | if (!dev_node) | ||
| 1827 | return -ENODEV; | ||
| 1828 | } | ||
| 1829 | |||
| 1830 | pdev = of_find_device_by_node(dev_node); | ||
| 1831 | if (!pdev) | ||
| 1832 | return -ENODEV; | ||
| 1833 | |||
| 1834 | ctrldev = &pdev->dev; | ||
| 1835 | priv = dev_get_drvdata(ctrldev); | ||
| 1836 | of_node_put(dev_node); | ||
| 1837 | |||
| 1838 | /* | ||
| 1839 | * If priv is NULL, it's probably because the caam driver wasn't | ||
| 1840 | * properly initialized (e.g. RNG4 init failed). Thus, bail out here. | ||
| 1841 | */ | ||
| 1842 | if (!priv) | ||
| 1843 | return -ENODEV; | ||
| 1844 | |||
| 1845 | INIT_LIST_HEAD(&priv->hash_list); | ||
| 1846 | |||
| 1847 | atomic_set(&priv->tfm_count, -1); | ||
| 1848 | 1803 | ||
| 1849 | /* register crypto algorithms the device supports */ | 1804 | /* register crypto algorithms the device supports */ |
| 1850 | for (i = 0; i < ARRAY_SIZE(driver_hash); i++) { | 1805 | for (i = 0; i < ARRAY_SIZE(driver_hash); i++) { |
| @@ -1852,38 +1807,38 @@ static int __init caam_algapi_hash_init(void) | |||
| 1852 | struct caam_hash_alg *t_alg; | 1807 | struct caam_hash_alg *t_alg; |
| 1853 | 1808 | ||
| 1854 | /* register hmac version */ | 1809 | /* register hmac version */ |
| 1855 | t_alg = caam_hash_alloc(ctrldev, &driver_hash[i], true); | 1810 | t_alg = caam_hash_alloc(&driver_hash[i], true); |
| 1856 | if (IS_ERR(t_alg)) { | 1811 | if (IS_ERR(t_alg)) { |
| 1857 | err = PTR_ERR(t_alg); | 1812 | err = PTR_ERR(t_alg); |
| 1858 | dev_warn(ctrldev, "%s alg allocation failed\n", | 1813 | pr_warn("%s alg allocation failed\n", |
| 1859 | driver_hash[i].driver_name); | 1814 | driver_hash[i].driver_name); |
| 1860 | continue; | 1815 | continue; |
| 1861 | } | 1816 | } |
| 1862 | 1817 | ||
| 1863 | err = crypto_register_ahash(&t_alg->ahash_alg); | 1818 | err = crypto_register_ahash(&t_alg->ahash_alg); |
| 1864 | if (err) { | 1819 | if (err) { |
| 1865 | dev_warn(ctrldev, "%s alg registration failed\n", | 1820 | pr_warn("%s alg registration failed\n", |
| 1866 | t_alg->ahash_alg.halg.base.cra_driver_name); | 1821 | t_alg->ahash_alg.halg.base.cra_driver_name); |
| 1867 | kfree(t_alg); | 1822 | kfree(t_alg); |
| 1868 | } else | 1823 | } else |
| 1869 | list_add_tail(&t_alg->entry, &priv->hash_list); | 1824 | list_add_tail(&t_alg->entry, &hash_list); |
| 1870 | 1825 | ||
| 1871 | /* register unkeyed version */ | 1826 | /* register unkeyed version */ |
| 1872 | t_alg = caam_hash_alloc(ctrldev, &driver_hash[i], false); | 1827 | t_alg = caam_hash_alloc(&driver_hash[i], false); |
| 1873 | if (IS_ERR(t_alg)) { | 1828 | if (IS_ERR(t_alg)) { |
| 1874 | err = PTR_ERR(t_alg); | 1829 | err = PTR_ERR(t_alg); |
| 1875 | dev_warn(ctrldev, "%s alg allocation failed\n", | 1830 | pr_warn("%s alg allocation failed\n", |
| 1876 | driver_hash[i].driver_name); | 1831 | driver_hash[i].driver_name); |
| 1877 | continue; | 1832 | continue; |
| 1878 | } | 1833 | } |
| 1879 | 1834 | ||
| 1880 | err = crypto_register_ahash(&t_alg->ahash_alg); | 1835 | err = crypto_register_ahash(&t_alg->ahash_alg); |
| 1881 | if (err) { | 1836 | if (err) { |
| 1882 | dev_warn(ctrldev, "%s alg registration failed\n", | 1837 | pr_warn("%s alg registration failed\n", |
| 1883 | t_alg->ahash_alg.halg.base.cra_driver_name); | 1838 | t_alg->ahash_alg.halg.base.cra_driver_name); |
| 1884 | kfree(t_alg); | 1839 | kfree(t_alg); |
| 1885 | } else | 1840 | } else |
| 1886 | list_add_tail(&t_alg->entry, &priv->hash_list); | 1841 | list_add_tail(&t_alg->entry, &hash_list); |
| 1887 | } | 1842 | } |
| 1888 | 1843 | ||
| 1889 | return err; | 1844 | return err; |
diff --git a/drivers/crypto/caam/caamrng.c b/drivers/crypto/caam/caamrng.c index 4e4ed155c5be..28486b19fc36 100644 --- a/drivers/crypto/caam/caamrng.c +++ b/drivers/crypto/caam/caamrng.c | |||
| @@ -273,42 +273,23 @@ static struct hwrng caam_rng = { | |||
| 273 | 273 | ||
| 274 | static void __exit caam_rng_exit(void) | 274 | static void __exit caam_rng_exit(void) |
| 275 | { | 275 | { |
| 276 | caam_jr_free(rng_ctx.jrdev); | ||
| 276 | hwrng_unregister(&caam_rng); | 277 | hwrng_unregister(&caam_rng); |
| 277 | } | 278 | } |
| 278 | 279 | ||
| 279 | static int __init caam_rng_init(void) | 280 | static int __init caam_rng_init(void) |
| 280 | { | 281 | { |
| 281 | struct device_node *dev_node; | 282 | struct device *dev; |
| 282 | struct platform_device *pdev, *jrpdev; | ||
| 283 | struct device *ctrldev; | ||
| 284 | struct caam_drv_private *priv; | ||
| 285 | |||
| 286 | dev_node = of_find_compatible_node(NULL, NULL, "fsl,sec-v4.0"); | ||
| 287 | if (!dev_node) { | ||
| 288 | dev_node = of_find_compatible_node(NULL, NULL, "fsl,sec4.0"); | ||
| 289 | if (!dev_node) | ||
| 290 | return -ENODEV; | ||
| 291 | } | ||
| 292 | |||
| 293 | pdev = of_find_device_by_node(dev_node); | ||
| 294 | if (!pdev) | ||
| 295 | return -ENODEV; | ||
| 296 | 283 | ||
| 297 | ctrldev = &pdev->dev; | 284 | dev = caam_jr_alloc(); |
| 298 | priv = dev_get_drvdata(ctrldev); | 285 | if (IS_ERR(dev)) { |
| 299 | of_node_put(dev_node); | 286 | pr_err("Job Ring Device allocation for transform failed\n"); |
| 300 | 287 | return PTR_ERR(dev); | |
| 301 | /* | 288 | } |
| 302 | * If priv is NULL, it's probably because the caam driver wasn't | ||
| 303 | * properly initialized (e.g. RNG4 init failed). Thus, bail out here. | ||
| 304 | */ | ||
| 305 | if (!priv) | ||
| 306 | return -ENODEV; | ||
| 307 | 289 | ||
| 308 | jrpdev = priv->jrpdev[0]; | 290 | caam_init_rng(&rng_ctx, dev); |
| 309 | caam_init_rng(&rng_ctx, &jrpdev->dev); | ||
| 310 | 291 | ||
| 311 | dev_info(&jrpdev->dev, "registering rng-caam\n"); | 292 | dev_info(dev, "registering rng-caam\n"); |
| 312 | return hwrng_register(&caam_rng); | 293 | return hwrng_register(&caam_rng); |
| 313 | } | 294 | } |
| 314 | 295 | ||
diff --git a/drivers/crypto/caam/intern.h b/drivers/crypto/caam/intern.h index b781445d2fcc..6d85fcc5bd0a 100644 --- a/drivers/crypto/caam/intern.h +++ b/drivers/crypto/caam/intern.h | |||
| @@ -83,13 +83,6 @@ struct caam_drv_private { | |||
| 83 | u8 qi_present; /* Nonzero if QI present in device */ | 83 | u8 qi_present; /* Nonzero if QI present in device */ |
| 84 | int secvio_irq; /* Security violation interrupt number */ | 84 | int secvio_irq; /* Security violation interrupt number */ |
| 85 | 85 | ||
| 86 | /* which jr allocated to scatterlist crypto */ | ||
| 87 | atomic_t tfm_count ____cacheline_aligned; | ||
| 88 | /* list of registered crypto algorithms (mk generic context handle?) */ | ||
| 89 | struct list_head alg_list; | ||
| 90 | /* list of registered hash algorithms (mk generic context handle?) */ | ||
| 91 | struct list_head hash_list; | ||
| 92 | |||
| 93 | #define RNG4_MAX_HANDLES 2 | 86 | #define RNG4_MAX_HANDLES 2 |
| 94 | /* RNG4 block */ | 87 | /* RNG4 block */ |
| 95 | u32 rng4_sh_init; /* This bitmap shows which of the State | 88 | u32 rng4_sh_init; /* This bitmap shows which of the State |
