crypto: inside-secure - dynamic ring configuration allocation
authorOfer Heifetz <oferh@marvell.com>
Thu, 28 Jun 2018 15:15:36 +0000 (17:15 +0200)
committerHerbert Xu <herbert@gondor.apana.org.au>
Sun, 8 Jul 2018 16:30:12 +0000 (00:30 +0800)
The Inside Secure SafeXcel driver currently uses 4 rings, but the
eip197d engines has 8 of them. This patch updates the driver so that
rings are allocated dynamically based on the number of available rings
supported by a given engine.

Signed-off-by: Ofer Heifetz <oferh@marvell.com>
Signed-off-by: Antoine Tenart <antoine.tenart@bootlin.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/inside-secure/safexcel.c
drivers/crypto/inside-secure/safexcel.h
drivers/crypto/inside-secure/safexcel_ring.c

index 579e7ae..baf8320 100644 (file)
@@ -981,6 +981,13 @@ static int safexcel_probe(struct platform_device *pdev)
 
        safexcel_configure(priv);
 
+       priv->ring = devm_kzalloc(dev, priv->config.rings * sizeof(*priv->ring),
+                                 GFP_KERNEL);
+       if (!priv->ring) {
+               ret = -ENOMEM;
+               goto err_reg_clk;
+       }
+
        for (i = 0; i < priv->config.rings; i++) {
                char irq_name[6] = {0}; /* "ringX\0" */
                char wq_name[9] = {0}; /* "wq_ringX\0" */
index f62111e..f370f05 100644 (file)
@@ -487,7 +487,7 @@ enum eip197_fw {
        FW_NB
 };
 
-struct safexcel_ring {
+struct safexcel_desc_ring {
        void *base;
        void *base_end;
        dma_addr_t base_dma;
@@ -528,6 +528,35 @@ struct safexcel_work_data {
        int ring;
 };
 
+struct safexcel_ring {
+       spinlock_t lock;
+       spinlock_t egress_lock;
+
+       struct list_head list;
+       struct workqueue_struct *workqueue;
+       struct safexcel_work_data work_data;
+
+       /* command/result rings */
+       struct safexcel_desc_ring cdr;
+       struct safexcel_desc_ring rdr;
+
+       /* queue */
+       struct crypto_queue queue;
+       spinlock_t queue_lock;
+
+       /* Number of requests in the engine. */
+       int requests;
+
+       /* The ring is currently handling at least one request */
+       bool busy;
+
+       /* Store for current requests when bailing out of the dequeueing
+        * function when no enough resources are available.
+        */
+       struct crypto_async_request *req;
+       struct crypto_async_request *backlog;
+};
+
 enum safexcel_eip_version {
        EIP97IES = BIT(0),
        EIP197B  = BIT(1),
@@ -566,34 +595,7 @@ struct safexcel_crypto_priv {
 
        atomic_t ring_used;
 
-       struct {
-               spinlock_t lock;
-               spinlock_t egress_lock;
-
-               struct list_head list;
-               struct workqueue_struct *workqueue;
-               struct safexcel_work_data work_data;
-
-               /* command/result rings */
-               struct safexcel_ring cdr;
-               struct safexcel_ring rdr;
-
-               /* queue */
-               struct crypto_queue queue;
-               spinlock_t queue_lock;
-
-               /* Number of requests in the engine. */
-               int requests;
-
-               /* The ring is currently handling at least one request */
-               bool busy;
-
-               /* Store for current requests when bailing out of the dequeueing
-                * function when no enough resources are available.
-                */
-               struct crypto_async_request *req;
-               struct crypto_async_request *backlog;
-       } ring[EIP197_MAX_RINGS];
+       struct safexcel_ring *ring;
 };
 
 struct safexcel_context {
@@ -651,13 +653,13 @@ int safexcel_invalidate_cache(struct crypto_async_request *async,
                              dma_addr_t ctxr_dma, int ring,
                              struct safexcel_request *request);
 int safexcel_init_ring_descriptors(struct safexcel_crypto_priv *priv,
-                                  struct safexcel_ring *cdr,
-                                  struct safexcel_ring *rdr);
+                                  struct safexcel_desc_ring *cdr,
+                                  struct safexcel_desc_ring *rdr);
 int safexcel_select_ring(struct safexcel_crypto_priv *priv);
 void *safexcel_ring_next_rptr(struct safexcel_crypto_priv *priv,
-                             struct safexcel_ring *ring);
+                             struct safexcel_desc_ring *ring);
 void safexcel_ring_rollback_wptr(struct safexcel_crypto_priv *priv,
-                                struct safexcel_ring *ring);
+                                struct safexcel_desc_ring *ring);
 struct safexcel_command_desc *safexcel_add_cdesc(struct safexcel_crypto_priv *priv,
                                                 int ring_id,
                                                 bool first, bool last,
index c9d2a87..cfd843b 100644 (file)
@@ -14,8 +14,8 @@
 #include "safexcel.h"
 
 int safexcel_init_ring_descriptors(struct safexcel_crypto_priv *priv,
-                                  struct safexcel_ring *cdr,
-                                  struct safexcel_ring *rdr)
+                                  struct safexcel_desc_ring *cdr,
+                                  struct safexcel_desc_ring *rdr)
 {
        cdr->offset = sizeof(u32) * priv->config.cd_offset;
        cdr->base = dmam_alloc_coherent(priv->dev,
@@ -46,7 +46,7 @@ inline int safexcel_select_ring(struct safexcel_crypto_priv *priv)
 }
 
 static void *safexcel_ring_next_wptr(struct safexcel_crypto_priv *priv,
-                                    struct safexcel_ring *ring)
+                                    struct safexcel_desc_ring *ring)
 {
        void *ptr = ring->write;
 
@@ -62,7 +62,7 @@ static void *safexcel_ring_next_wptr(struct safexcel_crypto_priv *priv,
 }
 
 void *safexcel_ring_next_rptr(struct safexcel_crypto_priv *priv,
-                             struct safexcel_ring *ring)
+                             struct safexcel_desc_ring *ring)
 {
        void *ptr = ring->read;
 
@@ -78,7 +78,7 @@ void *safexcel_ring_next_rptr(struct safexcel_crypto_priv *priv,
 }
 
 void safexcel_ring_rollback_wptr(struct safexcel_crypto_priv *priv,
-                                struct safexcel_ring *ring)
+                                struct safexcel_desc_ring *ring)
 {
        if (!ring->nr)
                return;