Lines Matching +full:crypto +full:- +full:engine
1 // SPDX-License-Identifier: GPL-2.0+
6 #include "aspeed-hace.h"
7 #include <crypto/engine.h>
9 #include <linux/dma-mapping.h>
21 dev_info((d)->dev, "%s() " fmt, __func__, ##__VA_ARGS__)
24 dev_dbg((d)->dev, "%s() " fmt, __func__, ##__VA_ARGS__)
31 struct aspeed_engine_crypto *crypto_engine = &hace_dev->crypto_engine; in aspeed_hace_irq()
32 struct aspeed_engine_hash *hash_engine = &hace_dev->hash_engine; in aspeed_hace_irq()
41 if (hash_engine->flags & CRYPTO_FLAGS_BUSY) in aspeed_hace_irq()
42 tasklet_schedule(&hash_engine->done_task); in aspeed_hace_irq()
44 dev_warn(hace_dev->dev, "HASH no active requests.\n"); in aspeed_hace_irq()
48 if (crypto_engine->flags & CRYPTO_FLAGS_BUSY) in aspeed_hace_irq()
49 tasklet_schedule(&crypto_engine->done_task); in aspeed_hace_irq()
51 dev_warn(hace_dev->dev, "CRYPTO no active requests.\n"); in aspeed_hace_irq()
60 struct aspeed_engine_crypto *crypto_engine = &hace_dev->crypto_engine; in aspeed_hace_crypto_done_task()
62 crypto_engine->resume(hace_dev); in aspeed_hace_crypto_done_task()
68 struct aspeed_engine_hash *hash_engine = &hace_dev->hash_engine; in aspeed_hace_hash_done_task()
70 hash_engine->resume(hace_dev); in aspeed_hace_hash_done_task()
94 { .compatible = "aspeed,ast2500-hace", .data = (void *)5, },
95 { .compatible = "aspeed,ast2600-hace", .data = (void *)6, },
106 hace_dev = devm_kzalloc(&pdev->dev, sizeof(struct aspeed_hace_dev), in aspeed_hace_probe()
109 return -ENOMEM; in aspeed_hace_probe()
111 hace_dev->version = (uintptr_t)device_get_match_data(&pdev->dev); in aspeed_hace_probe()
112 if (!hace_dev->version) { in aspeed_hace_probe()
113 dev_err(&pdev->dev, "Failed to match hace dev id\n"); in aspeed_hace_probe()
114 return -EINVAL; in aspeed_hace_probe()
117 hace_dev->dev = &pdev->dev; in aspeed_hace_probe()
118 hash_engine = &hace_dev->hash_engine; in aspeed_hace_probe()
119 crypto_engine = &hace_dev->crypto_engine; in aspeed_hace_probe()
123 hace_dev->regs = devm_platform_get_and_ioremap_resource(pdev, 0, NULL); in aspeed_hace_probe()
124 if (IS_ERR(hace_dev->regs)) in aspeed_hace_probe()
125 return PTR_ERR(hace_dev->regs); in aspeed_hace_probe()
128 hace_dev->irq = platform_get_irq(pdev, 0); in aspeed_hace_probe()
129 if (hace_dev->irq < 0) in aspeed_hace_probe()
130 return -ENXIO; in aspeed_hace_probe()
132 rc = devm_request_irq(&pdev->dev, hace_dev->irq, aspeed_hace_irq, 0, in aspeed_hace_probe()
133 dev_name(&pdev->dev), hace_dev); in aspeed_hace_probe()
135 dev_err(&pdev->dev, "Failed to request interrupt\n"); in aspeed_hace_probe()
140 hace_dev->clk = devm_clk_get(&pdev->dev, NULL); in aspeed_hace_probe()
141 if (IS_ERR(hace_dev->clk)) { in aspeed_hace_probe()
142 dev_err(&pdev->dev, "Failed to get clk\n"); in aspeed_hace_probe()
143 return -ENODEV; in aspeed_hace_probe()
146 rc = clk_prepare_enable(hace_dev->clk); in aspeed_hace_probe()
148 dev_err(&pdev->dev, "Failed to enable clock 0x%x\n", rc); in aspeed_hace_probe()
152 /* Initialize crypto hardware engine structure for hash */ in aspeed_hace_probe()
153 hace_dev->crypt_engine_hash = crypto_engine_alloc_init(hace_dev->dev, in aspeed_hace_probe()
155 if (!hace_dev->crypt_engine_hash) { in aspeed_hace_probe()
156 rc = -ENOMEM; in aspeed_hace_probe()
160 rc = crypto_engine_start(hace_dev->crypt_engine_hash); in aspeed_hace_probe()
164 tasklet_init(&hash_engine->done_task, aspeed_hace_hash_done_task, in aspeed_hace_probe()
167 /* Initialize crypto hardware engine structure for crypto */ in aspeed_hace_probe()
168 hace_dev->crypt_engine_crypto = crypto_engine_alloc_init(hace_dev->dev, in aspeed_hace_probe()
170 if (!hace_dev->crypt_engine_crypto) { in aspeed_hace_probe()
171 rc = -ENOMEM; in aspeed_hace_probe()
175 rc = crypto_engine_start(hace_dev->crypt_engine_crypto); in aspeed_hace_probe()
179 tasklet_init(&crypto_engine->done_task, aspeed_hace_crypto_done_task, in aspeed_hace_probe()
182 /* Allocate DMA buffer for hash engine input used */ in aspeed_hace_probe()
183 hash_engine->ahash_src_addr = in aspeed_hace_probe()
184 dmam_alloc_coherent(&pdev->dev, in aspeed_hace_probe()
186 &hash_engine->ahash_src_dma_addr, in aspeed_hace_probe()
188 if (!hash_engine->ahash_src_addr) { in aspeed_hace_probe()
189 dev_err(&pdev->dev, "Failed to allocate dma buffer\n"); in aspeed_hace_probe()
190 rc = -ENOMEM; in aspeed_hace_probe()
194 /* Allocate DMA buffer for crypto engine context used */ in aspeed_hace_probe()
195 crypto_engine->cipher_ctx = in aspeed_hace_probe()
196 dmam_alloc_coherent(&pdev->dev, in aspeed_hace_probe()
198 &crypto_engine->cipher_ctx_dma, in aspeed_hace_probe()
200 if (!crypto_engine->cipher_ctx) { in aspeed_hace_probe()
201 dev_err(&pdev->dev, "Failed to allocate cipher ctx dma\n"); in aspeed_hace_probe()
202 rc = -ENOMEM; in aspeed_hace_probe()
206 /* Allocate DMA buffer for crypto engine input used */ in aspeed_hace_probe()
207 crypto_engine->cipher_addr = in aspeed_hace_probe()
208 dmam_alloc_coherent(&pdev->dev, in aspeed_hace_probe()
210 &crypto_engine->cipher_dma_addr, in aspeed_hace_probe()
212 if (!crypto_engine->cipher_addr) { in aspeed_hace_probe()
213 dev_err(&pdev->dev, "Failed to allocate cipher addr dma\n"); in aspeed_hace_probe()
214 rc = -ENOMEM; in aspeed_hace_probe()
218 /* Allocate DMA buffer for crypto engine output used */ in aspeed_hace_probe()
219 if (hace_dev->version == AST2600_VERSION) { in aspeed_hace_probe()
220 crypto_engine->dst_sg_addr = in aspeed_hace_probe()
221 dmam_alloc_coherent(&pdev->dev, in aspeed_hace_probe()
223 &crypto_engine->dst_sg_dma_addr, in aspeed_hace_probe()
225 if (!crypto_engine->dst_sg_addr) { in aspeed_hace_probe()
226 dev_err(&pdev->dev, "Failed to allocate dst_sg dma\n"); in aspeed_hace_probe()
227 rc = -ENOMEM; in aspeed_hace_probe()
234 dev_info(&pdev->dev, "Aspeed Crypto Accelerator successfully registered\n"); in aspeed_hace_probe()
239 crypto_engine_exit(hace_dev->crypt_engine_crypto); in aspeed_hace_probe()
241 crypto_engine_exit(hace_dev->crypt_engine_hash); in aspeed_hace_probe()
243 clk_disable_unprepare(hace_dev->clk); in aspeed_hace_probe()
251 struct aspeed_engine_crypto *crypto_engine = &hace_dev->crypto_engine; in aspeed_hace_remove()
252 struct aspeed_engine_hash *hash_engine = &hace_dev->hash_engine; in aspeed_hace_remove()
256 crypto_engine_exit(hace_dev->crypt_engine_hash); in aspeed_hace_remove()
257 crypto_engine_exit(hace_dev->crypt_engine_crypto); in aspeed_hace_remove()
259 tasklet_kill(&hash_engine->done_task); in aspeed_hace_remove()
260 tasklet_kill(&crypto_engine->done_task); in aspeed_hace_remove()
262 clk_disable_unprepare(hace_dev->clk); in aspeed_hace_remove()
279 MODULE_DESCRIPTION("Aspeed HACE driver Crypto Accelerator");