|
@@ -146,6 +146,7 @@ struct adf_admin_comms {
|
|
|
dma_addr_t phy_addr;
|
|
|
dma_addr_t const_tbl_addr;
|
|
|
void *virt_addr;
|
|
|
+ void *virt_tbl_addr;
|
|
|
void __iomem *mailbox_addr;
|
|
|
struct mutex lock; /* protects adf_admin_comms struct */
|
|
|
};
|
|
@@ -251,17 +252,19 @@ int adf_init_admin_comms(struct adf_accel_dev *accel_dev)
|
|
|
return -ENOMEM;
|
|
|
}
|
|
|
|
|
|
- admin->const_tbl_addr = dma_map_single(&GET_DEV(accel_dev),
|
|
|
- (void *) const_tab, 1024,
|
|
|
- DMA_TO_DEVICE);
|
|
|
-
|
|
|
- if (unlikely(dma_mapping_error(&GET_DEV(accel_dev),
|
|
|
- admin->const_tbl_addr))) {
|
|
|
+ admin->virt_tbl_addr = dma_zalloc_coherent(&GET_DEV(accel_dev),
|
|
|
+ PAGE_SIZE,
|
|
|
+ &admin->const_tbl_addr,
|
|
|
+ GFP_KERNEL);
|
|
|
+ if (!admin->virt_tbl_addr) {
|
|
|
+ dev_err(&GET_DEV(accel_dev), "Failed to allocate const_tbl\n");
|
|
|
dma_free_coherent(&GET_DEV(accel_dev), PAGE_SIZE,
|
|
|
admin->virt_addr, admin->phy_addr);
|
|
|
kfree(admin);
|
|
|
return -ENOMEM;
|
|
|
}
|
|
|
+
|
|
|
+ memcpy(admin->virt_tbl_addr, const_tab, sizeof(const_tab));
|
|
|
reg_val = (u64)admin->phy_addr;
|
|
|
ADF_CSR_WR(csr, ADF_DH895XCC_ADMINMSGUR_OFFSET, reg_val >> 32);
|
|
|
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)
|
|
|
if (admin->virt_addr)
|
|
|
dma_free_coherent(&GET_DEV(accel_dev), PAGE_SIZE,
|
|
|
admin->virt_addr, admin->phy_addr);
|
|
|
+ if (admin->virt_tbl_addr)
|
|
|
+ dma_free_coherent(&GET_DEV(accel_dev), PAGE_SIZE,
|
|
|
+ admin->virt_tbl_addr, admin->const_tbl_addr);
|
|
|
|
|
|
- dma_unmap_single(&GET_DEV(accel_dev), admin->const_tbl_addr, 1024,
|
|
|
- DMA_TO_DEVICE);
|
|
|
mutex_destroy(&admin->lock);
|
|
|
kfree(admin);
|
|
|
accel_dev->admin = NULL;
|