| b.liu | e958203 | 2025-04-17 19:18:16 +0800 | [diff] [blame] | 1 | From 20f552cafd7dda6f5d25128bbc04ea2c91d9f5d1 Mon Sep 17 00:00:00 2001 |
| 2 | From: Radu Alexe <radu.alexe@nxp.com> |
| 3 | Date: Thu, 26 Oct 2017 10:45:14 +0300 |
| 4 | Subject: [PATCH] crypto: caam - add functionality used by the caam_dma driver |
| 5 | MIME-Version: 1.0 |
| 6 | Content-Type: text/plain; charset=UTF-8 |
| 7 | Content-Transfer-Encoding: 8bit |
| 8 | |
| 9 | The caam_dma is a memcpy DMA driver based on the DMA functionality of |
| 10 | the CAAM hardware block. It creates a DMA channel for each JR of the |
| 11 | CAAM. This patch adds functionality that is used by the caam_dma that is |
| 12 | not yet part of the JR driver. |
| 13 | |
| 14 | Signed-off-by: Radu Alexe <radu.alexe@nxp.com> |
| 15 | Signed-off-by: Horia Geantă <horia.geanta@nxp.com> |
| 16 | --- |
| 17 | drivers/crypto/caam/desc.h | 2 ++ |
| 18 | drivers/crypto/caam/jr.c | 41 +++++++++++++++++++++++++++++++++++++++++ |
| 19 | drivers/crypto/caam/jr.h | 2 ++ |
| 20 | 3 files changed, 45 insertions(+) |
| 21 | |
| 22 | --- a/drivers/crypto/caam/desc.h |
| 23 | +++ b/drivers/crypto/caam/desc.h |
| 24 | @@ -364,6 +364,7 @@ |
| 25 | #define FIFOLD_TYPE_PK_N (0x08 << FIFOLD_TYPE_SHIFT) |
| 26 | #define FIFOLD_TYPE_PK_A (0x0c << FIFOLD_TYPE_SHIFT) |
| 27 | #define FIFOLD_TYPE_PK_B (0x0d << FIFOLD_TYPE_SHIFT) |
| 28 | +#define FIFOLD_TYPE_IFIFO (0x0f << FIFOLD_TYPE_SHIFT) |
| 29 | |
| 30 | /* Other types. Need to OR in last/flush bits as desired */ |
| 31 | #define FIFOLD_TYPE_MSG_MASK (0x38 << FIFOLD_TYPE_SHIFT) |
| 32 | @@ -1522,6 +1523,7 @@ |
| 33 | #define MATH_SRC1_INFIFO (0x0a << MATH_SRC1_SHIFT) |
| 34 | #define MATH_SRC1_OUTFIFO (0x0b << MATH_SRC1_SHIFT) |
| 35 | #define MATH_SRC1_ONE (0x0c << MATH_SRC1_SHIFT) |
| 36 | +#define MATH_SRC1_ZERO (0x0f << MATH_SRC1_SHIFT) |
| 37 | |
| 38 | /* Destination selectors */ |
| 39 | #define MATH_DEST_SHIFT 8 |
| 40 | --- a/drivers/crypto/caam/jr.c |
| 41 | +++ b/drivers/crypto/caam/jr.c |
| 42 | @@ -62,6 +62,14 @@ algs_unlock: |
| 43 | mutex_unlock(&algs_lock); |
| 44 | } |
| 45 | |
| 46 | +static int jr_driver_probed; |
| 47 | + |
| 48 | +int caam_jr_driver_probed(void) |
| 49 | +{ |
| 50 | + return jr_driver_probed; |
| 51 | +} |
| 52 | +EXPORT_SYMBOL(caam_jr_driver_probed); |
| 53 | + |
| 54 | static int caam_reset_hw_jr(struct device *dev) |
| 55 | { |
| 56 | struct caam_drv_private_jr *jrp = dev_get_drvdata(dev); |
| 57 | @@ -147,6 +155,8 @@ static int caam_jr_remove(struct platfor |
| 58 | if (ret) |
| 59 | dev_err(jrdev, "Failed to shut down job ring\n"); |
| 60 | |
| 61 | + jr_driver_probed--; |
| 62 | + |
| 63 | return ret; |
| 64 | } |
| 65 | |
| 66 | @@ -311,6 +321,36 @@ struct device *caam_jr_alloc(void) |
| 67 | EXPORT_SYMBOL(caam_jr_alloc); |
| 68 | |
| 69 | /** |
| 70 | + * caam_jridx_alloc() - Alloc a specific job ring based on its index. |
| 71 | + * |
| 72 | + * returns : pointer to the newly allocated physical |
| 73 | + * JobR dev can be written to if successful. |
| 74 | + **/ |
| 75 | +struct device *caam_jridx_alloc(int idx) |
| 76 | +{ |
| 77 | + struct caam_drv_private_jr *jrpriv; |
| 78 | + struct device *dev = ERR_PTR(-ENODEV); |
| 79 | + |
| 80 | + spin_lock(&driver_data.jr_alloc_lock); |
| 81 | + |
| 82 | + if (list_empty(&driver_data.jr_list)) |
| 83 | + goto end; |
| 84 | + |
| 85 | + list_for_each_entry(jrpriv, &driver_data.jr_list, list_node) { |
| 86 | + if (jrpriv->ridx == idx) { |
| 87 | + atomic_inc(&jrpriv->tfm_count); |
| 88 | + dev = jrpriv->dev; |
| 89 | + break; |
| 90 | + } |
| 91 | + } |
| 92 | + |
| 93 | +end: |
| 94 | + spin_unlock(&driver_data.jr_alloc_lock); |
| 95 | + return dev; |
| 96 | +} |
| 97 | +EXPORT_SYMBOL(caam_jridx_alloc); |
| 98 | + |
| 99 | +/** |
| 100 | * caam_jr_free() - Free the Job Ring |
| 101 | * @rdev - points to the dev that identifies the Job ring to |
| 102 | * be released. |
| 103 | @@ -565,6 +605,7 @@ static int caam_jr_probe(struct platform |
| 104 | device_set_wakeup_enable(&pdev->dev, false); |
| 105 | |
| 106 | register_algs(jrdev->parent); |
| 107 | + jr_driver_probed++; |
| 108 | |
| 109 | return 0; |
| 110 | } |
| 111 | --- a/drivers/crypto/caam/jr.h |
| 112 | +++ b/drivers/crypto/caam/jr.h |
| 113 | @@ -9,7 +9,9 @@ |
| 114 | #define JR_H |
| 115 | |
| 116 | /* Prototypes for backend-level services exposed to APIs */ |
| 117 | +int caam_jr_driver_probed(void); |
| 118 | struct device *caam_jr_alloc(void); |
| 119 | +struct device *caam_jridx_alloc(int idx); |
| 120 | void caam_jr_free(struct device *rdev); |
| 121 | int caam_jr_enqueue(struct device *dev, u32 *desc, |
| 122 | void (*cbk)(struct device *dev, u32 *desc, u32 status, |