diff options
author | Maksim Lukoshkov <maksim.lukoshkov@intel.com> | 2016-08-29 08:28:31 -0400 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2016-08-31 11:00:50 -0400 |
commit | 93ba73fed31d0ec96489fedaeef1a1c402f9c8e4 (patch) | |
tree | 9f8050bbfce6bcce6b384a1b1cc8ff8b673ad975 | |
parent | 98a3c465fe987f1e0ae87a50ce980d6560233285 (diff) |
crypto: qat - fix constants table DMA
Copy const_tab array into DMA-able memory (accesible by qat hw).
Signed-off-by: Maksim Lukoshkov <maksim.lukoshkov@intel.com>
Signed-off-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r-- | drivers/crypto/qat/qat_common/adf_admin.c | 20 |
1 files changed, 12 insertions, 8 deletions
diff --git a/drivers/crypto/qat/qat_common/adf_admin.c b/drivers/crypto/qat/qat_common/adf_admin.c index ce7c4626c983..3744b22f0c46 100644 --- a/drivers/crypto/qat/qat_common/adf_admin.c +++ b/drivers/crypto/qat/qat_common/adf_admin.c | |||
@@ -146,6 +146,7 @@ struct adf_admin_comms { | |||
146 | dma_addr_t phy_addr; | 146 | dma_addr_t phy_addr; |
147 | dma_addr_t const_tbl_addr; | 147 | dma_addr_t const_tbl_addr; |
148 | void *virt_addr; | 148 | void *virt_addr; |
149 | void *virt_tbl_addr; | ||
149 | void __iomem *mailbox_addr; | 150 | void __iomem *mailbox_addr; |
150 | struct mutex lock; /* protects adf_admin_comms struct */ | 151 | struct mutex lock; /* protects adf_admin_comms struct */ |
151 | }; | 152 | }; |
@@ -251,17 +252,19 @@ int adf_init_admin_comms(struct adf_accel_dev *accel_dev) | |||
251 | return -ENOMEM; | 252 | return -ENOMEM; |
252 | } | 253 | } |
253 | 254 | ||
254 | admin->const_tbl_addr = dma_map_single(&GET_DEV(accel_dev), | 255 | admin->virt_tbl_addr = dma_zalloc_coherent(&GET_DEV(accel_dev), |
255 | (void *) const_tab, 1024, | 256 | PAGE_SIZE, |
256 | DMA_TO_DEVICE); | 257 | &admin->const_tbl_addr, |
257 | 258 | GFP_KERNEL); | |
258 | if (unlikely(dma_mapping_error(&GET_DEV(accel_dev), | 259 | if (!admin->virt_tbl_addr) { |
259 | admin->const_tbl_addr))) { | 260 | dev_err(&GET_DEV(accel_dev), "Failed to allocate const_tbl\n"); |
260 | dma_free_coherent(&GET_DEV(accel_dev), PAGE_SIZE, | 261 | dma_free_coherent(&GET_DEV(accel_dev), PAGE_SIZE, |
261 | admin->virt_addr, admin->phy_addr); | 262 | admin->virt_addr, admin->phy_addr); |
262 | kfree(admin); | 263 | kfree(admin); |
263 | return -ENOMEM; | 264 | return -ENOMEM; |
264 | } | 265 | } |
266 | |||
267 | memcpy(admin->virt_tbl_addr, const_tab, sizeof(const_tab)); | ||
265 | reg_val = (u64)admin->phy_addr; | 268 | reg_val = (u64)admin->phy_addr; |
266 | ADF_CSR_WR(csr, ADF_DH895XCC_ADMINMSGUR_OFFSET, reg_val >> 32); | 269 | ADF_CSR_WR(csr, ADF_DH895XCC_ADMINMSGUR_OFFSET, reg_val >> 32); |
267 | ADF_CSR_WR(csr, ADF_DH895XCC_ADMINMSGLR_OFFSET, reg_val); | 270 | ADF_CSR_WR(csr, ADF_DH895XCC_ADMINMSGLR_OFFSET, reg_val); |
@@ -282,9 +285,10 @@ void adf_exit_admin_comms(struct adf_accel_dev *accel_dev) | |||
282 | if (admin->virt_addr) | 285 | if (admin->virt_addr) |
283 | dma_free_coherent(&GET_DEV(accel_dev), PAGE_SIZE, | 286 | dma_free_coherent(&GET_DEV(accel_dev), PAGE_SIZE, |
284 | admin->virt_addr, admin->phy_addr); | 287 | admin->virt_addr, admin->phy_addr); |
288 | if (admin->virt_tbl_addr) | ||
289 | dma_free_coherent(&GET_DEV(accel_dev), PAGE_SIZE, | ||
290 | admin->virt_tbl_addr, admin->const_tbl_addr); | ||
285 | 291 | ||
286 | dma_unmap_single(&GET_DEV(accel_dev), admin->const_tbl_addr, 1024, | ||
287 | DMA_TO_DEVICE); | ||
288 | mutex_destroy(&admin->lock); | 292 | mutex_destroy(&admin->lock); |
289 | kfree(admin); | 293 | kfree(admin); |
290 | accel_dev->admin = NULL; | 294 | accel_dev->admin = NULL; |