|
@@ -9,6 +9,7 @@
|
|
|
#include <crypto/aes.h>
|
|
|
#include <crypto/algapi.h>
|
|
|
#include <linux/crypto.h>
|
|
|
+#include <linux/genalloc.h>
|
|
|
#include <linux/interrupt.h>
|
|
|
#include <linux/io.h>
|
|
|
#include <linux/kthread.h>
|
|
@@ -29,6 +30,8 @@
|
|
|
#define MAX_HW_HASH_SIZE 0xFFFF
|
|
|
#define MV_CESA_EXPIRE 500 /* msec */
|
|
|
|
|
|
+#define MV_CESA_DEFAULT_SRAM_SIZE 2048
|
|
|
+
|
|
|
/*
|
|
|
* STM:
|
|
|
* /---------------------------------------\
|
|
@@ -83,6 +86,8 @@ struct req_progress {
|
|
|
struct crypto_priv {
|
|
|
void __iomem *reg;
|
|
|
void __iomem *sram;
|
|
|
+ struct gen_pool *sram_pool;
|
|
|
+ dma_addr_t sram_dma;
|
|
|
int irq;
|
|
|
struct clk *clk;
|
|
|
struct task_struct *queue_th;
|
|
@@ -1019,6 +1024,39 @@ static struct ahash_alg mv_hmac_sha1_alg = {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
+static int mv_cesa_get_sram(struct platform_device *pdev,
|
|
|
+ struct crypto_priv *cp)
|
|
|
+{
|
|
|
+ struct resource *res;
|
|
|
+ u32 sram_size = MV_CESA_DEFAULT_SRAM_SIZE;
|
|
|
+
|
|
|
+ of_property_read_u32(pdev->dev.of_node, "marvell,crypto-sram-size",
|
|
|
+ &sram_size);
|
|
|
+
|
|
|
+ cp->sram_size = sram_size;
|
|
|
+ cp->sram_pool = of_get_named_gen_pool(&pdev->dev.of_node,
|
|
|
+ "marvell,crypto-srams", 0);
|
|
|
+ if (cp->sram_pool) {
|
|
|
+ cp->sram = gen_pool_dma_alloc(cp->sram_pool, sram_size,
|
|
|
+ &cp->sram_dma);
|
|
|
+ if (cp->sram)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ return -ENOMEM;
|
|
|
+ }
|
|
|
+
|
|
|
+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
|
|
|
+ "sram");
|
|
|
+ if (!res || resource_size(res) < cp->sram_size)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ cp->sram = devm_ioremap_resource(&pdev->dev, res);
|
|
|
+ if (IS_ERR(cp->sram))
|
|
|
+ return PTR_ERR(cp->sram);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static int mv_probe(struct platform_device *pdev)
|
|
|
{
|
|
|
struct crypto_priv *cp;
|
|
@@ -1047,18 +1085,11 @@ static int mv_probe(struct platform_device *pdev)
|
|
|
goto err;
|
|
|
}
|
|
|
|
|
|
- res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "sram");
|
|
|
- if (!res) {
|
|
|
- ret = -ENXIO;
|
|
|
+ ret = mv_cesa_get_sram(pdev, cp);
|
|
|
+ if (ret)
|
|
|
goto err;
|
|
|
- }
|
|
|
- cp->sram_size = resource_size(res);
|
|
|
+
|
|
|
cp->max_req_size = cp->sram_size - SRAM_CFG_SPACE;
|
|
|
- cp->sram = ioremap(res->start, cp->sram_size);
|
|
|
- if (!cp->sram) {
|
|
|
- ret = -ENOMEM;
|
|
|
- goto err;
|
|
|
- }
|
|
|
|
|
|
if (pdev->dev.of_node)
|
|
|
irq = irq_of_parse_and_map(pdev->dev.of_node, 0);
|
|
@@ -1066,7 +1097,7 @@ static int mv_probe(struct platform_device *pdev)
|
|
|
irq = platform_get_irq(pdev, 0);
|
|
|
if (irq < 0 || irq == NO_IRQ) {
|
|
|
ret = irq;
|
|
|
- goto err_unmap_sram;
|
|
|
+ goto err;
|
|
|
}
|
|
|
cp->irq = irq;
|
|
|
|
|
@@ -1076,7 +1107,7 @@ static int mv_probe(struct platform_device *pdev)
|
|
|
cp->queue_th = kthread_run(queue_manag, cp, "mv_crypto");
|
|
|
if (IS_ERR(cp->queue_th)) {
|
|
|
ret = PTR_ERR(cp->queue_th);
|
|
|
- goto err_unmap_sram;
|
|
|
+ goto err;
|
|
|
}
|
|
|
|
|
|
ret = request_irq(irq, crypto_int, 0, dev_name(&pdev->dev),
|
|
@@ -1134,8 +1165,6 @@ err_irq:
|
|
|
}
|
|
|
err_thread:
|
|
|
kthread_stop(cp->queue_th);
|
|
|
-err_unmap_sram:
|
|
|
- iounmap(cp->sram);
|
|
|
err:
|
|
|
kfree(cp);
|
|
|
cpg = NULL;
|
|
@@ -1155,7 +1184,6 @@ static int mv_remove(struct platform_device *pdev)
|
|
|
kthread_stop(cp->queue_th);
|
|
|
free_irq(cp->irq, cp);
|
|
|
memset(cp->sram, 0, cp->sram_size);
|
|
|
- iounmap(cp->sram);
|
|
|
|
|
|
if (!IS_ERR(cp->clk)) {
|
|
|
clk_disable_unprepare(cp->clk);
|