aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/crypto
diff options
context:
space:
mode:
authorAndrey Smirnov <andrew.smirnov@gmail.com>2019-08-20 16:23:57 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2019-08-30 04:05:30 -0400
commit6c5f898f12a3d65f04a928ffd7e38ae397c9a0d4 (patch)
tree9a9bb47c3fc9363bcf66f0b3582d2514dbf5bcc2 /drivers/crypto
parente27d96298bb893aacfeced1045c757b51abf301b (diff)
crypto: caam - drop explicit usage of struct jr_outentry
Using struct jr_outentry to specify the layout of JobR output ring is not appropriate for all 64-bit SoC, since some of them, like i.MX8MQ, use 32-bit pointers there which doesn't match 64-bit dma_addr_t. Convert existing code to use explicit helper functions to access any of the JobR output ring elements, so that the support for i.MX8MQ can be added later. No functional change intended. Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com> Cc: Chris Spencer <christopher.spencer@sea.co.uk> Cc: Cory Tusar <cory.tusar@zii.aero> Cc: Chris Healy <cphealy@gmail.com> Cc: Lucas Stach <l.stach@pengutronix.de> Cc: Horia Geantă <horia.geanta@nxp.com> Cc: Aymen Sghaier <aymen.sghaier@nxp.com> Cc: Leonard Crestez <leonard.crestez@nxp.com> Cc: linux-crypto@vger.kernel.org Cc: linux-kernel@vger.kernel.org Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'drivers/crypto')
-rw-r--r--drivers/crypto/caam/intern.h2
-rw-r--r--drivers/crypto/caam/jr.c10
-rw-r--r--drivers/crypto/caam/regs.h40
3 files changed, 43 insertions, 9 deletions
diff --git a/drivers/crypto/caam/intern.h b/drivers/crypto/caam/intern.h
index 1f01703f510a..081805c0f88b 100644
--- a/drivers/crypto/caam/intern.h
+++ b/drivers/crypto/caam/intern.h
@@ -58,7 +58,7 @@ struct caam_drv_private_jr {
58 dma_addr_t *inpring; /* Base of input ring, alloc DMA-safe */ 58 dma_addr_t *inpring; /* Base of input ring, alloc DMA-safe */
59 int out_ring_read_index; /* Output index "tail" */ 59 int out_ring_read_index; /* Output index "tail" */
60 int tail; /* entinfo (s/w ring) tail index */ 60 int tail; /* entinfo (s/w ring) tail index */
61 struct jr_outentry *outring; /* Base of output ring, DMA-safe */ 61 void *outring; /* Base of output ring, DMA-safe */
62}; 62};
63 63
64/* 64/*
diff --git a/drivers/crypto/caam/jr.c b/drivers/crypto/caam/jr.c
index 98b308de42c0..6c91f38862e4 100644
--- a/drivers/crypto/caam/jr.c
+++ b/drivers/crypto/caam/jr.c
@@ -211,7 +211,7 @@ static void caam_jr_dequeue(unsigned long devarg)
211 for (i = 0; CIRC_CNT(head, tail + i, JOBR_DEPTH) >= 1; i++) { 211 for (i = 0; CIRC_CNT(head, tail + i, JOBR_DEPTH) >= 1; i++) {
212 sw_idx = (tail + i) & (JOBR_DEPTH - 1); 212 sw_idx = (tail + i) & (JOBR_DEPTH - 1);
213 213
214 if (jrp->outring[hw_idx].desc == 214 if (jr_outentry_desc(jrp->outring, hw_idx) ==
215 caam_dma_to_cpu(jrp->entinfo[sw_idx].desc_addr_dma)) 215 caam_dma_to_cpu(jrp->entinfo[sw_idx].desc_addr_dma))
216 break; /* found */ 216 break; /* found */
217 } 217 }
@@ -220,7 +220,8 @@ static void caam_jr_dequeue(unsigned long devarg)
220 220
221 /* Unmap just-run descriptor so we can post-process */ 221 /* Unmap just-run descriptor so we can post-process */
222 dma_unmap_single(dev, 222 dma_unmap_single(dev,
223 caam_dma_to_cpu(jrp->outring[hw_idx].desc), 223 caam_dma_to_cpu(jr_outentry_desc(jrp->outring,
224 hw_idx)),
224 jrp->entinfo[sw_idx].desc_size, 225 jrp->entinfo[sw_idx].desc_size,
225 DMA_TO_DEVICE); 226 DMA_TO_DEVICE);
226 227
@@ -231,7 +232,8 @@ static void caam_jr_dequeue(unsigned long devarg)
231 usercall = jrp->entinfo[sw_idx].callbk; 232 usercall = jrp->entinfo[sw_idx].callbk;
232 userarg = jrp->entinfo[sw_idx].cbkarg; 233 userarg = jrp->entinfo[sw_idx].cbkarg;
233 userdesc = jrp->entinfo[sw_idx].desc_addr_virt; 234 userdesc = jrp->entinfo[sw_idx].desc_addr_virt;
234 userstatus = caam32_to_cpu(jrp->outring[hw_idx].jrstatus); 235 userstatus = caam32_to_cpu(jr_outentry_jrstatus(jrp->outring,
236 hw_idx));
235 237
236 /* 238 /*
237 * Make sure all information from the job has been obtained 239 * Make sure all information from the job has been obtained
@@ -438,7 +440,7 @@ static int caam_jr_init(struct device *dev)
438 if (!jrp->inpring) 440 if (!jrp->inpring)
439 return -ENOMEM; 441 return -ENOMEM;
440 442
441 jrp->outring = dmam_alloc_coherent(dev, sizeof(*jrp->outring) * 443 jrp->outring = dmam_alloc_coherent(dev, SIZEOF_JR_OUTENTRY *
442 JOBR_DEPTH, &outbusaddr, 444 JOBR_DEPTH, &outbusaddr,
443 GFP_KERNEL); 445 GFP_KERNEL);
444 if (!jrp->outring) 446 if (!jrp->outring)
diff --git a/drivers/crypto/caam/regs.h b/drivers/crypto/caam/regs.h
index 0df4cf32fe78..cf73015b3be0 100644
--- a/drivers/crypto/caam/regs.h
+++ b/drivers/crypto/caam/regs.h
@@ -71,6 +71,7 @@
71 71
72extern bool caam_little_end; 72extern bool caam_little_end;
73extern bool caam_imx; 73extern bool caam_imx;
74extern size_t caam_ptr_sz;
74 75
75#define caam_to_cpu(len) \ 76#define caam_to_cpu(len) \
76static inline u##len caam##len ## _to_cpu(u##len val) \ 77static inline u##len caam##len ## _to_cpu(u##len val) \
@@ -208,10 +209,41 @@ static inline u64 caam_dma_to_cpu(u64 value)
208 * jr_outentry 209 * jr_outentry
209 * Represents each entry in a JobR output ring 210 * Represents each entry in a JobR output ring
210 */ 211 */
211struct jr_outentry { 212
212 dma_addr_t desc;/* Pointer to completed descriptor */ 213static inline void jr_outentry_get(void *outring, int hw_idx, dma_addr_t *desc,
213 u32 jrstatus; /* Status for completed descriptor */ 214 u32 *jrstatus)
214} __packed; 215{
216 struct {
217 dma_addr_t desc;/* Pointer to completed descriptor */
218 u32 jrstatus; /* Status for completed descriptor */
219 } __packed *outentry = outring;
220
221 *desc = outentry[hw_idx].desc;
222 *jrstatus = outentry[hw_idx].jrstatus;
223}
224
225#define SIZEOF_JR_OUTENTRY (caam_ptr_sz + sizeof(u32))
226
227static inline dma_addr_t jr_outentry_desc(void *outring, int hw_idx)
228{
229 dma_addr_t desc;
230 u32 unused;
231
232 jr_outentry_get(outring, hw_idx, &desc, &unused);
233
234 return desc;
235}
236
237static inline u32 jr_outentry_jrstatus(void *outring, int hw_idx)
238{
239 dma_addr_t unused;
240 u32 jrstatus;
241
242 jr_outentry_get(outring, hw_idx, &unused, &jrstatus);
243
244 return jrstatus;
245}
246
215 247
216/* Version registers (Era 10+) e80-eff */ 248/* Version registers (Era 10+) e80-eff */
217struct version_regs { 249struct version_regs {