diff options
author | Kim Phillips <kim.phillips@freescale.com> | 2012-06-22 20:48:54 -0400 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2012-06-27 02:42:06 -0400 |
commit | 4bba1e9f41d68279ff2c17db53fbd379692b10bc (patch) | |
tree | 8d0ed5e6e7b51131cd0c53b3fce00bceb0612d9e | |
parent | 1a076689cda8a1d623dcda170b2dc2b476cc6f1a (diff) |
crypto: caam - use non-irq versions of spinlocks for job rings
The enqueue lock isn't used in any interrupt context, and
the dequeue lock isn't used in the h/w interrupt context,
only in bh context.
Signed-off-by: Kim Phillips <kim.phillips@freescale.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r-- | drivers/crypto/caam/jr.c | 30 |
1 files changed, 13 insertions, 17 deletions
diff --git a/drivers/crypto/caam/jr.c b/drivers/crypto/caam/jr.c index 9f16b2c03613..11d93f243705 100644 --- a/drivers/crypto/caam/jr.c +++ b/drivers/crypto/caam/jr.c | |||
@@ -2,7 +2,7 @@ | |||
2 | * CAAM/SEC 4.x transport/backend driver | 2 | * CAAM/SEC 4.x transport/backend driver |
3 | * JobR backend functionality | 3 | * JobR backend functionality |
4 | * | 4 | * |
5 | * Copyright 2008-2011 Freescale Semiconductor, Inc. | 5 | * Copyright 2008-2012 Freescale Semiconductor, Inc. |
6 | */ | 6 | */ |
7 | 7 | ||
8 | #include "compat.h" | 8 | #include "compat.h" |
@@ -58,9 +58,8 @@ static void caam_jr_dequeue(unsigned long devarg) | |||
58 | void (*usercall)(struct device *dev, u32 *desc, u32 status, void *arg); | 58 | void (*usercall)(struct device *dev, u32 *desc, u32 status, void *arg); |
59 | u32 *userdesc, userstatus; | 59 | u32 *userdesc, userstatus; |
60 | void *userarg; | 60 | void *userarg; |
61 | unsigned long flags; | ||
62 | 61 | ||
63 | spin_lock_irqsave(&jrp->outlock, flags); | 62 | spin_lock_bh(&jrp->outlock); |
64 | 63 | ||
65 | head = ACCESS_ONCE(jrp->head); | 64 | head = ACCESS_ONCE(jrp->head); |
66 | sw_idx = tail = jrp->tail; | 65 | sw_idx = tail = jrp->tail; |
@@ -118,18 +117,18 @@ static void caam_jr_dequeue(unsigned long devarg) | |||
118 | /* set done */ | 117 | /* set done */ |
119 | wr_reg32(&jrp->rregs->outring_rmvd, 1); | 118 | wr_reg32(&jrp->rregs->outring_rmvd, 1); |
120 | 119 | ||
121 | spin_unlock_irqrestore(&jrp->outlock, flags); | 120 | spin_unlock_bh(&jrp->outlock); |
122 | 121 | ||
123 | /* Finally, execute user's callback */ | 122 | /* Finally, execute user's callback */ |
124 | usercall(dev, userdesc, userstatus, userarg); | 123 | usercall(dev, userdesc, userstatus, userarg); |
125 | 124 | ||
126 | spin_lock_irqsave(&jrp->outlock, flags); | 125 | spin_lock_bh(&jrp->outlock); |
127 | 126 | ||
128 | head = ACCESS_ONCE(jrp->head); | 127 | head = ACCESS_ONCE(jrp->head); |
129 | sw_idx = tail = jrp->tail; | 128 | sw_idx = tail = jrp->tail; |
130 | } | 129 | } |
131 | 130 | ||
132 | spin_unlock_irqrestore(&jrp->outlock, flags); | 131 | spin_unlock_bh(&jrp->outlock); |
133 | 132 | ||
134 | /* reenable / unmask IRQs */ | 133 | /* reenable / unmask IRQs */ |
135 | clrbits32(&jrp->rregs->rconfig_lo, JRCFG_IMSK); | 134 | clrbits32(&jrp->rregs->rconfig_lo, JRCFG_IMSK); |
@@ -148,23 +147,22 @@ int caam_jr_register(struct device *ctrldev, struct device **rdev) | |||
148 | { | 147 | { |
149 | struct caam_drv_private *ctrlpriv = dev_get_drvdata(ctrldev); | 148 | struct caam_drv_private *ctrlpriv = dev_get_drvdata(ctrldev); |
150 | struct caam_drv_private_jr *jrpriv = NULL; | 149 | struct caam_drv_private_jr *jrpriv = NULL; |
151 | unsigned long flags; | ||
152 | int ring; | 150 | int ring; |
153 | 151 | ||
154 | /* Lock, if free ring - assign, unlock */ | 152 | /* Lock, if free ring - assign, unlock */ |
155 | spin_lock_irqsave(&ctrlpriv->jr_alloc_lock, flags); | 153 | spin_lock(&ctrlpriv->jr_alloc_lock); |
156 | for (ring = 0; ring < ctrlpriv->total_jobrs; ring++) { | 154 | for (ring = 0; ring < ctrlpriv->total_jobrs; ring++) { |
157 | jrpriv = dev_get_drvdata(ctrlpriv->jrdev[ring]); | 155 | jrpriv = dev_get_drvdata(ctrlpriv->jrdev[ring]); |
158 | if (jrpriv->assign == JOBR_UNASSIGNED) { | 156 | if (jrpriv->assign == JOBR_UNASSIGNED) { |
159 | jrpriv->assign = JOBR_ASSIGNED; | 157 | jrpriv->assign = JOBR_ASSIGNED; |
160 | *rdev = ctrlpriv->jrdev[ring]; | 158 | *rdev = ctrlpriv->jrdev[ring]; |
161 | spin_unlock_irqrestore(&ctrlpriv->jr_alloc_lock, flags); | 159 | spin_unlock(&ctrlpriv->jr_alloc_lock); |
162 | return ring; | 160 | return ring; |
163 | } | 161 | } |
164 | } | 162 | } |
165 | 163 | ||
166 | /* If assigned, write dev where caller needs it */ | 164 | /* If assigned, write dev where caller needs it */ |
167 | spin_unlock_irqrestore(&ctrlpriv->jr_alloc_lock, flags); | 165 | spin_unlock(&ctrlpriv->jr_alloc_lock); |
168 | *rdev = NULL; | 166 | *rdev = NULL; |
169 | 167 | ||
170 | return -ENODEV; | 168 | return -ENODEV; |
@@ -182,7 +180,6 @@ int caam_jr_deregister(struct device *rdev) | |||
182 | { | 180 | { |
183 | struct caam_drv_private_jr *jrpriv = dev_get_drvdata(rdev); | 181 | struct caam_drv_private_jr *jrpriv = dev_get_drvdata(rdev); |
184 | struct caam_drv_private *ctrlpriv; | 182 | struct caam_drv_private *ctrlpriv; |
185 | unsigned long flags; | ||
186 | 183 | ||
187 | /* Get the owning controller's private space */ | 184 | /* Get the owning controller's private space */ |
188 | ctrlpriv = dev_get_drvdata(jrpriv->parentdev); | 185 | ctrlpriv = dev_get_drvdata(jrpriv->parentdev); |
@@ -195,9 +192,9 @@ int caam_jr_deregister(struct device *rdev) | |||
195 | return -EBUSY; | 192 | return -EBUSY; |
196 | 193 | ||
197 | /* Release ring */ | 194 | /* Release ring */ |
198 | spin_lock_irqsave(&ctrlpriv->jr_alloc_lock, flags); | 195 | spin_lock(&ctrlpriv->jr_alloc_lock); |
199 | jrpriv->assign = JOBR_UNASSIGNED; | 196 | jrpriv->assign = JOBR_UNASSIGNED; |
200 | spin_unlock_irqrestore(&ctrlpriv->jr_alloc_lock, flags); | 197 | spin_unlock(&ctrlpriv->jr_alloc_lock); |
201 | 198 | ||
202 | return 0; | 199 | return 0; |
203 | } | 200 | } |
@@ -238,7 +235,6 @@ int caam_jr_enqueue(struct device *dev, u32 *desc, | |||
238 | { | 235 | { |
239 | struct caam_drv_private_jr *jrp = dev_get_drvdata(dev); | 236 | struct caam_drv_private_jr *jrp = dev_get_drvdata(dev); |
240 | struct caam_jrentry_info *head_entry; | 237 | struct caam_jrentry_info *head_entry; |
241 | unsigned long flags; | ||
242 | int head, tail, desc_size; | 238 | int head, tail, desc_size; |
243 | dma_addr_t desc_dma; | 239 | dma_addr_t desc_dma; |
244 | 240 | ||
@@ -249,14 +245,14 @@ int caam_jr_enqueue(struct device *dev, u32 *desc, | |||
249 | return -EIO; | 245 | return -EIO; |
250 | } | 246 | } |
251 | 247 | ||
252 | spin_lock_irqsave(&jrp->inplock, flags); | 248 | spin_lock(&jrp->inplock); |
253 | 249 | ||
254 | head = jrp->head; | 250 | head = jrp->head; |
255 | tail = ACCESS_ONCE(jrp->tail); | 251 | tail = ACCESS_ONCE(jrp->tail); |
256 | 252 | ||
257 | if (!rd_reg32(&jrp->rregs->inpring_avail) || | 253 | if (!rd_reg32(&jrp->rregs->inpring_avail) || |
258 | CIRC_SPACE(head, tail, JOBR_DEPTH) <= 0) { | 254 | CIRC_SPACE(head, tail, JOBR_DEPTH) <= 0) { |
259 | spin_unlock_irqrestore(&jrp->inplock, flags); | 255 | spin_unlock(&jrp->inplock); |
260 | dma_unmap_single(dev, desc_dma, desc_size, DMA_TO_DEVICE); | 256 | dma_unmap_single(dev, desc_dma, desc_size, DMA_TO_DEVICE); |
261 | return -EBUSY; | 257 | return -EBUSY; |
262 | } | 258 | } |
@@ -280,7 +276,7 @@ int caam_jr_enqueue(struct device *dev, u32 *desc, | |||
280 | 276 | ||
281 | wr_reg32(&jrp->rregs->inpring_jobadd, 1); | 277 | wr_reg32(&jrp->rregs->inpring_jobadd, 1); |
282 | 278 | ||
283 | spin_unlock_irqrestore(&jrp->inplock, flags); | 279 | spin_unlock(&jrp->inplock); |
284 | 280 | ||
285 | return 0; | 281 | return 0; |
286 | } | 282 | } |