diff options
author | Tadeusz Struk <tadeusz.struk@intel.com> | 2015-07-15 18:28:32 -0400 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2015-07-17 09:20:16 -0400 |
commit | 28cfaf67e5c1f5b6b0d549eea398f8401a40e566 (patch) | |
tree | 4a440fd2ca2cb8e119d2f17c74f2d7005a0bfbc6 /drivers/crypto/qat/qat_common | |
parent | f3dd7e60d2028b8391dea7a3b214e3083dadf6d6 (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.h | 2 | ||||
-rw-r--r-- | drivers/crypto/qat/qat_common/adf_accel_engine.c | 42 |
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; | |||
185 | struct adf_fw_loader_data { | 186 | struct 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 | ||
190 | struct adf_accel_dev { | 192 | struct 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: | |||
85 | void adf_ae_fw_release(struct adf_accel_dev *accel_dev) | 97 | void 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) | |||
143 | int adf_ae_init(struct adf_accel_dev *accel_dev) | 167 | int 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) | |||
166 | int adf_ae_shutdown(struct adf_accel_dev *accel_dev) | 194 | int 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); |