aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/crypto/qat/qat_common
diff options
context:
space:
mode:
authorTadeusz Struk <tadeusz.struk@intel.com>2015-07-15 18:28:32 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2015-07-17 09:20:16 -0400
commit28cfaf67e5c1f5b6b0d549eea398f8401a40e566 (patch)
tree4a440fd2ca2cb8e119d2f17c74f2d7005a0bfbc6 /drivers/crypto/qat/qat_common
parentf3dd7e60d2028b8391dea7a3b214e3083dadf6d6 (diff)
crypto: qat - add MMP FW support to accel engine
Add code that loads the MMP firmware Signed-off-by: Tadeusz Struk <tadeusz.struk@intel.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'drivers/crypto/qat/qat_common')
-rw-r--r--drivers/crypto/qat/qat_common/adf_accel_devices.h2
-rw-r--r--drivers/crypto/qat/qat_common/adf_accel_engine.c42
2 files changed, 39 insertions, 5 deletions
diff --git a/drivers/crypto/qat/qat_common/adf_accel_devices.h b/drivers/crypto/qat/qat_common/adf_accel_devices.h
index 91c969eb6e6b..45db8d53a9d3 100644
--- a/drivers/crypto/qat/qat_common/adf_accel_devices.h
+++ b/drivers/crypto/qat/qat_common/adf_accel_devices.h
@@ -152,6 +152,7 @@ struct adf_hw_device_data {
152 void (*exit_arb)(struct adf_accel_dev *accel_dev); 152 void (*exit_arb)(struct adf_accel_dev *accel_dev);
153 void (*enable_ints)(struct adf_accel_dev *accel_dev); 153 void (*enable_ints)(struct adf_accel_dev *accel_dev);
154 const char *fw_name; 154 const char *fw_name;
155 const char *fw_mmp_name;
155 uint32_t pci_dev_id; 156 uint32_t pci_dev_id;
156 uint32_t fuses; 157 uint32_t fuses;
157 uint32_t accel_capabilities_mask; 158 uint32_t accel_capabilities_mask;
@@ -185,6 +186,7 @@ struct icp_qat_fw_loader_handle;
185struct adf_fw_loader_data { 186struct adf_fw_loader_data {
186 struct icp_qat_fw_loader_handle *fw_loader; 187 struct icp_qat_fw_loader_handle *fw_loader;
187 const struct firmware *uof_fw; 188 const struct firmware *uof_fw;
189 const struct firmware *mmp_fw;
188}; 190};
189 191
190struct adf_accel_dev { 192struct adf_accel_dev {
diff --git a/drivers/crypto/qat/qat_common/adf_accel_engine.c b/drivers/crypto/qat/qat_common/adf_accel_engine.c
index fdda8e7ae302..20b08bdcb146 100644
--- a/drivers/crypto/qat/qat_common/adf_accel_engine.c
+++ b/drivers/crypto/qat/qat_common/adf_accel_engine.c
@@ -55,24 +55,36 @@ int adf_ae_fw_load(struct adf_accel_dev *accel_dev)
55{ 55{
56 struct adf_fw_loader_data *loader_data = accel_dev->fw_loader; 56 struct adf_fw_loader_data *loader_data = accel_dev->fw_loader;
57 struct adf_hw_device_data *hw_device = accel_dev->hw_device; 57 struct adf_hw_device_data *hw_device = accel_dev->hw_device;
58 void *uof_addr; 58 void *uof_addr, *mmp_addr;
59 uint32_t uof_size; 59 u32 uof_size, mmp_size;
60 60
61 if (!hw_device->fw_name)
62 return 0;
63
64 if (request_firmware(&loader_data->mmp_fw, hw_device->fw_mmp_name,
65 &accel_dev->accel_pci_dev.pci_dev->dev)) {
66 dev_err(&GET_DEV(accel_dev), "Failed to load MMP firmware %s\n",
67 hw_device->fw_mmp_name);
68 return -EFAULT;
69 }
61 if (request_firmware(&loader_data->uof_fw, hw_device->fw_name, 70 if (request_firmware(&loader_data->uof_fw, hw_device->fw_name,
62 &accel_dev->accel_pci_dev.pci_dev->dev)) { 71 &accel_dev->accel_pci_dev.pci_dev->dev)) {
63 dev_err(&GET_DEV(accel_dev), "Failed to load firmware %s\n", 72 dev_err(&GET_DEV(accel_dev), "Failed to load UOF firmware %s\n",
64 hw_device->fw_name); 73 hw_device->fw_name);
65 return -EFAULT; 74 goto out_err;
66 } 75 }
67 76
68 uof_size = loader_data->uof_fw->size; 77 uof_size = loader_data->uof_fw->size;
69 uof_addr = (void *)loader_data->uof_fw->data; 78 uof_addr = (void *)loader_data->uof_fw->data;
79 mmp_size = loader_data->mmp_fw->size;
80 mmp_addr = (void *)loader_data->mmp_fw->data;
81 qat_uclo_wr_mimage(loader_data->fw_loader, mmp_addr, mmp_size);
70 if (qat_uclo_map_uof_obj(loader_data->fw_loader, uof_addr, uof_size)) { 82 if (qat_uclo_map_uof_obj(loader_data->fw_loader, uof_addr, uof_size)) {
71 dev_err(&GET_DEV(accel_dev), "Failed to map UOF\n"); 83 dev_err(&GET_DEV(accel_dev), "Failed to map UOF\n");
72 goto out_err; 84 goto out_err;
73 } 85 }
74 if (qat_uclo_wr_all_uimage(loader_data->fw_loader)) { 86 if (qat_uclo_wr_all_uimage(loader_data->fw_loader)) {
75 dev_err(&GET_DEV(accel_dev), "Failed to map UOF\n"); 87 dev_err(&GET_DEV(accel_dev), "Failed to load UOF\n");
76 goto out_err; 88 goto out_err;
77 } 89 }
78 return 0; 90 return 0;
@@ -85,11 +97,17 @@ out_err:
85void adf_ae_fw_release(struct adf_accel_dev *accel_dev) 97void adf_ae_fw_release(struct adf_accel_dev *accel_dev)
86{ 98{
87 struct adf_fw_loader_data *loader_data = accel_dev->fw_loader; 99 struct adf_fw_loader_data *loader_data = accel_dev->fw_loader;
100 struct adf_hw_device_data *hw_device = accel_dev->hw_device;
101
102 if (!hw_device->fw_name)
103 return;
88 104
89 qat_uclo_del_uof_obj(loader_data->fw_loader); 105 qat_uclo_del_uof_obj(loader_data->fw_loader);
90 qat_hal_deinit(loader_data->fw_loader); 106 qat_hal_deinit(loader_data->fw_loader);
91 release_firmware(loader_data->uof_fw); 107 release_firmware(loader_data->uof_fw);
108 release_firmware(loader_data->mmp_fw);
92 loader_data->uof_fw = NULL; 109 loader_data->uof_fw = NULL;
110 loader_data->mmp_fw = NULL;
93 loader_data->fw_loader = NULL; 111 loader_data->fw_loader = NULL;
94} 112}
95 113
@@ -99,6 +117,9 @@ int adf_ae_start(struct adf_accel_dev *accel_dev)
99 struct adf_hw_device_data *hw_data = accel_dev->hw_device; 117 struct adf_hw_device_data *hw_data = accel_dev->hw_device;
100 uint32_t ae_ctr, ae, max_aes = GET_MAX_ACCELENGINES(accel_dev); 118 uint32_t ae_ctr, ae, max_aes = GET_MAX_ACCELENGINES(accel_dev);
101 119
120 if (!hw_data->fw_name)
121 return 0;
122
102 for (ae = 0, ae_ctr = 0; ae < max_aes; ae++) { 123 for (ae = 0, ae_ctr = 0; ae < max_aes; ae++) {
103 if (hw_data->ae_mask & (1 << ae)) { 124 if (hw_data->ae_mask & (1 << ae)) {
104 qat_hal_start(loader_data->fw_loader, ae, 0xFF); 125 qat_hal_start(loader_data->fw_loader, ae, 0xFF);
@@ -117,6 +138,9 @@ int adf_ae_stop(struct adf_accel_dev *accel_dev)
117 struct adf_hw_device_data *hw_data = accel_dev->hw_device; 138 struct adf_hw_device_data *hw_data = accel_dev->hw_device;
118 uint32_t ae_ctr, ae, max_aes = GET_MAX_ACCELENGINES(accel_dev); 139 uint32_t ae_ctr, ae, max_aes = GET_MAX_ACCELENGINES(accel_dev);
119 140
141 if (!hw_data->fw_name)
142 return 0;
143
120 for (ae = 0, ae_ctr = 0; ae < max_aes; ae++) { 144 for (ae = 0, ae_ctr = 0; ae < max_aes; ae++) {
121 if (hw_data->ae_mask & (1 << ae)) { 145 if (hw_data->ae_mask & (1 << ae)) {
122 qat_hal_stop(loader_data->fw_loader, ae, 0xFF); 146 qat_hal_stop(loader_data->fw_loader, ae, 0xFF);
@@ -143,6 +167,10 @@ static int adf_ae_reset(struct adf_accel_dev *accel_dev, int ae)
143int adf_ae_init(struct adf_accel_dev *accel_dev) 167int adf_ae_init(struct adf_accel_dev *accel_dev)
144{ 168{
145 struct adf_fw_loader_data *loader_data; 169 struct adf_fw_loader_data *loader_data;
170 struct adf_hw_device_data *hw_device = accel_dev->hw_device;
171
172 if (!hw_device->fw_name)
173 return 0;
146 174
147 loader_data = kzalloc(sizeof(*loader_data), GFP_KERNEL); 175 loader_data = kzalloc(sizeof(*loader_data), GFP_KERNEL);
148 if (!loader_data) 176 if (!loader_data)
@@ -166,6 +194,10 @@ int adf_ae_init(struct adf_accel_dev *accel_dev)
166int adf_ae_shutdown(struct adf_accel_dev *accel_dev) 194int adf_ae_shutdown(struct adf_accel_dev *accel_dev)
167{ 195{
168 struct adf_fw_loader_data *loader_data = accel_dev->fw_loader; 196 struct adf_fw_loader_data *loader_data = accel_dev->fw_loader;
197 struct adf_hw_device_data *hw_device = accel_dev->hw_device;
198
199 if (!hw_device->fw_name)
200 return 0;
169 201
170 qat_hal_deinit(loader_data->fw_loader); 202 qat_hal_deinit(loader_data->fw_loader);
171 kfree(accel_dev->fw_loader); 203 kfree(accel_dev->fw_loader);