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 | } |
