aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMaksim Lukoshkov <maksim.lukoshkov@intel.com>2016-08-29 08:28:31 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2016-08-31 11:00:50 -0400
commit93ba73fed31d0ec96489fedaeef1a1c402f9c8e4 (patch)
tree9f8050bbfce6bcce6b384a1b1cc8ff8b673ad975
parent98a3c465fe987f1e0ae87a50ce980d6560233285 (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.c20
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;