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

crypto: qat - add support for MMP FW

Load Modular Math Processor(MMP) firmware into QAT devices to support
public key algorithm acceleration.

Signed-off-by: Pingchao Yang <pingchao.yang@intel.com>
Signed-off-by: Tadeusz Struk <tadeusz.struk@intel.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

authored by

Pingchao Yang and committed by
Herbert Xu
f3dd7e60 544c436a

+24 -26
+1
drivers/crypto/qat/qat_common/adf_accel_devices.h
··· 135 135 struct adf_hw_device_class *dev_class; 136 136 uint32_t (*get_accel_mask)(uint32_t fuse); 137 137 uint32_t (*get_ae_mask)(uint32_t fuse); 138 + uint32_t (*get_sram_bar_id)(struct adf_hw_device_data *self); 138 139 uint32_t (*get_misc_bar_id)(struct adf_hw_device_data *self); 139 140 uint32_t (*get_etr_bar_id)(struct adf_hw_device_data *self); 140 141 uint32_t (*get_num_aes)(struct adf_hw_device_data *self);
+2
drivers/crypto/qat/qat_common/adf_common_drv.h
··· 196 196 void qat_uclo_del_uof_obj(struct icp_qat_fw_loader_handle *handle); 197 197 int qat_uclo_map_uof_obj(struct icp_qat_fw_loader_handle *handle, 198 198 void *addr_ptr, int mem_size); 199 + void qat_uclo_wr_mimage(struct icp_qat_fw_loader_handle *handle, 200 + void *addr_ptr, int mem_size); 199 201 #endif
+8 -5
drivers/crypto/qat/qat_common/qat_hal.c
··· 679 679 struct icp_qat_fw_loader_handle *handle; 680 680 struct adf_accel_pci *pci_info = &accel_dev->accel_pci_dev; 681 681 struct adf_hw_device_data *hw_data = accel_dev->hw_device; 682 - struct adf_bar *bar = 682 + struct adf_bar *misc_bar = 683 683 &pci_info->pci_bars[hw_data->get_misc_bar_id(hw_data)]; 684 + struct adf_bar *sram_bar = 685 + &pci_info->pci_bars[hw_data->get_sram_bar_id(hw_data)]; 684 686 685 687 handle = kzalloc(sizeof(*handle), GFP_KERNEL); 686 688 if (!handle) 687 689 return -ENOMEM; 688 690 689 - handle->hal_cap_g_ctl_csr_addr_v = bar->virt_addr + 691 + handle->hal_cap_g_ctl_csr_addr_v = misc_bar->virt_addr + 690 692 ICP_DH895XCC_CAP_OFFSET; 691 - handle->hal_cap_ae_xfer_csr_addr_v = bar->virt_addr + 693 + handle->hal_cap_ae_xfer_csr_addr_v = misc_bar->virt_addr + 692 694 ICP_DH895XCC_AE_OFFSET; 693 - handle->hal_ep_csr_addr_v = bar->virt_addr + ICP_DH895XCC_EP_OFFSET; 695 + handle->hal_ep_csr_addr_v = misc_bar->virt_addr + 696 + ICP_DH895XCC_EP_OFFSET; 694 697 handle->hal_cap_ae_local_csr_addr_v = 695 698 handle->hal_cap_ae_xfer_csr_addr_v + LOCAL_TO_XFER_REG_OFFSET; 696 - 699 + handle->hal_sram_addr_v = sram_bar->virt_addr; 697 700 handle->hal_handle = kzalloc(sizeof(*handle->hal_handle), GFP_KERNEL); 698 701 if (!handle->hal_handle) 699 702 goto out_hal_handle;
+6 -21
drivers/crypto/qat/qat_common/qat_uclo.c
··· 359 359 static int qat_uclo_init_ae_memory(struct icp_qat_fw_loader_handle *handle, 360 360 struct icp_qat_uof_initmem *init_mem) 361 361 { 362 - unsigned int i; 363 - struct icp_qat_uof_memvar_attr *mem_val_attr; 364 - 365 - mem_val_attr = 366 - (struct icp_qat_uof_memvar_attr *)((unsigned long)init_mem + 367 - sizeof(struct icp_qat_uof_initmem)); 368 - 369 362 switch (init_mem->region) { 370 - case ICP_QAT_UOF_SRAM_REGION: 371 - if ((init_mem->addr + init_mem->num_in_bytes) > 372 - ICP_DH895XCC_PESRAM_BAR_SIZE) { 373 - pr_err("QAT: initmem on SRAM is out of range"); 374 - return -EINVAL; 375 - } 376 - for (i = 0; i < init_mem->val_attr_num; i++) { 377 - qat_uclo_wr_sram_by_words(handle, 378 - init_mem->addr + 379 - mem_val_attr->offset_in_byte, 380 - &mem_val_attr->value, 4); 381 - mem_val_attr++; 382 - } 383 - break; 384 363 case ICP_QAT_UOF_LMEM_REGION: 385 364 if (qat_uclo_init_lmem_seg(handle, init_mem)) 386 365 return -EINVAL; ··· 967 988 out_err: 968 989 kfree(obj_handle->uword_buf); 969 990 return -EFAULT; 991 + } 992 + 993 + void qat_uclo_wr_mimage(struct icp_qat_fw_loader_handle *handle, 994 + void *addr_ptr, int mem_size) 995 + { 996 + qat_uclo_wr_sram_by_words(handle, 0, addr_ptr, ALIGN(mem_size, 4)); 970 997 } 971 998 972 999 int qat_uclo_map_uof_obj(struct icp_qat_fw_loader_handle *handle,
+6
drivers/crypto/qat/qat_dh895xcc/adf_dh895xcc_hw_data.c
··· 117 117 return ADF_DH895XCC_ETR_BAR; 118 118 } 119 119 120 + static uint32_t get_sram_bar_id(struct adf_hw_device_data *self) 121 + { 122 + return ADF_DH895XCC_SRAM_BAR; 123 + } 124 + 120 125 static enum dev_sku_info get_sku(struct adf_hw_device_data *self) 121 126 { 122 127 int sku = (self->fuses & ADF_DH895XCC_FUSECTL_SKU_MASK) ··· 224 219 hw_data->get_num_aes = get_num_aes; 225 220 hw_data->get_etr_bar_id = get_etr_bar_id; 226 221 hw_data->get_misc_bar_id = get_misc_bar_id; 222 + hw_data->get_sram_bar_id = get_sram_bar_id; 227 223 hw_data->get_sku = get_sku; 228 224 hw_data->fw_name = ADF_DH895XCC_FW; 229 225 hw_data->init_admin_comms = adf_init_admin_comms;
+1
drivers/crypto/qat/qat_dh895xcc/adf_dh895xcc_hw_data.h
··· 48 48 #define ADF_DH895x_HW_DATA_H_ 49 49 50 50 /* PCIe configuration space */ 51 + #define ADF_DH895XCC_SRAM_BAR 0 51 52 #define ADF_DH895XCC_PMISC_BAR 1 52 53 #define ADF_DH895XCC_ETR_BAR 2 53 54 #define ADF_DH895XCC_RX_RINGS_OFFSET 8