Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Maksim Lukoshkov and committed by
Herbert Xu
93ba73fe 98a3c465

+12 -8
+12 -8
drivers/crypto/qat/qat_common/adf_admin.c
··· 146 146 dma_addr_t phy_addr; 147 147 dma_addr_t const_tbl_addr; 148 148 void *virt_addr; 149 + void *virt_tbl_addr; 149 150 void __iomem *mailbox_addr; 150 151 struct mutex lock; /* protects adf_admin_comms struct */ 151 152 }; ··· 252 251 return -ENOMEM; 253 252 } 254 253 255 - admin->const_tbl_addr = dma_map_single(&GET_DEV(accel_dev), 256 - (void *) const_tab, 1024, 257 - DMA_TO_DEVICE); 258 - 259 - if (unlikely(dma_mapping_error(&GET_DEV(accel_dev), 260 - admin->const_tbl_addr))) { 254 + admin->virt_tbl_addr = dma_zalloc_coherent(&GET_DEV(accel_dev), 255 + PAGE_SIZE, 256 + &admin->const_tbl_addr, 257 + GFP_KERNEL); 258 + if (!admin->virt_tbl_addr) { 259 + dev_err(&GET_DEV(accel_dev), "Failed to allocate const_tbl\n"); 261 260 dma_free_coherent(&GET_DEV(accel_dev), PAGE_SIZE, 262 261 admin->virt_addr, admin->phy_addr); 263 262 kfree(admin); 264 263 return -ENOMEM; 265 264 } 265 + 266 + memcpy(admin->virt_tbl_addr, const_tab, sizeof(const_tab)); 266 267 reg_val = (u64)admin->phy_addr; 267 268 ADF_CSR_WR(csr, ADF_DH895XCC_ADMINMSGUR_OFFSET, reg_val >> 32); 268 269 ADF_CSR_WR(csr, ADF_DH895XCC_ADMINMSGLR_OFFSET, reg_val); ··· 285 282 if (admin->virt_addr) 286 283 dma_free_coherent(&GET_DEV(accel_dev), PAGE_SIZE, 287 284 admin->virt_addr, admin->phy_addr); 285 + if (admin->virt_tbl_addr) 286 + dma_free_coherent(&GET_DEV(accel_dev), PAGE_SIZE, 287 + admin->virt_tbl_addr, admin->const_tbl_addr); 288 288 289 - dma_unmap_single(&GET_DEV(accel_dev), admin->const_tbl_addr, 1024, 290 - DMA_TO_DEVICE); 291 289 mutex_destroy(&admin->lock); 292 290 kfree(admin); 293 291 accel_dev->admin = NULL;