1a4b16dadSTom Zanussi // SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0-only)
2a4b16dadSTom Zanussi /* Copyright(c) 2020 Intel Corporation */
3a4b16dadSTom Zanussi #include <linux/device.h>
4a4b16dadSTom Zanussi #include <linux/module.h>
5a4b16dadSTom Zanussi #include <linux/pci.h>
6a4b16dadSTom Zanussi 
7a4b16dadSTom Zanussi #include <adf_accel_devices.h>
8a4b16dadSTom Zanussi #include <adf_cfg.h>
9a4b16dadSTom Zanussi #include <adf_common_drv.h>
109260db66SDamian Muszynski #include <adf_dbgfs.h>
11359b84f8SDamian Muszynski #include <adf_heartbeat.h>
12a4b16dadSTom Zanussi 
13a4b16dadSTom Zanussi #include "adf_4xxx_hw_data.h"
14b7284784SGiovanni Cabiddu #include "adf_cfg_services.h"
15a4b16dadSTom Zanussi #include "qat_compression.h"
16a4b16dadSTom Zanussi #include "qat_crypto.h"
17a4b16dadSTom Zanussi #include "adf_transport_access_macros.h"
18a4b16dadSTom Zanussi 
19a4b16dadSTom Zanussi static const struct pci_device_id adf_pci_tbl[] = {
20a4b16dadSTom Zanussi 	{ PCI_VDEVICE(INTEL, ADF_4XXX_PCI_DEVICE_ID), },
21a4b16dadSTom Zanussi 	{ PCI_VDEVICE(INTEL, ADF_401XX_PCI_DEVICE_ID), },
22a4b16dadSTom Zanussi 	{ PCI_VDEVICE(INTEL, ADF_402XX_PCI_DEVICE_ID), },
23a4b16dadSTom Zanussi 	{ }
24a4b16dadSTom Zanussi };
25a4b16dadSTom Zanussi MODULE_DEVICE_TABLE(pci, adf_pci_tbl);
26a4b16dadSTom Zanussi 
adf_cleanup_accel(struct adf_accel_dev * accel_dev)27a4b16dadSTom Zanussi static void adf_cleanup_accel(struct adf_accel_dev *accel_dev)
28a4b16dadSTom Zanussi {
29a4b16dadSTom Zanussi 	if (accel_dev->hw_device) {
30a4b16dadSTom Zanussi 		adf_clean_hw_data_4xxx(accel_dev->hw_device);
31a4b16dadSTom Zanussi 		accel_dev->hw_device = NULL;
32a4b16dadSTom Zanussi 	}
339260db66SDamian Muszynski 	adf_dbgfs_exit(accel_dev);
34a4b16dadSTom Zanussi 	adf_cfg_dev_remove(accel_dev);
35a4b16dadSTom Zanussi 	adf_devmgr_rm_dev(accel_dev, NULL);
36a4b16dadSTom Zanussi }
37a4b16dadSTom Zanussi 
adf_cfg_dev_init(struct adf_accel_dev * accel_dev)38a4b16dadSTom Zanussi static int adf_cfg_dev_init(struct adf_accel_dev *accel_dev)
39a4b16dadSTom Zanussi {
40a4b16dadSTom Zanussi 	const char *config;
41a4b16dadSTom Zanussi 	int ret;
42a4b16dadSTom Zanussi 
43a4b16dadSTom Zanussi 	config = accel_dev->accel_id % 2 ? ADF_CFG_DC : ADF_CFG_CY;
44a4b16dadSTom Zanussi 
45a4b16dadSTom Zanussi 	ret = adf_cfg_section_add(accel_dev, ADF_GENERAL_SEC);
46a4b16dadSTom Zanussi 	if (ret)
47a4b16dadSTom Zanussi 		return ret;
48a4b16dadSTom Zanussi 
49a4b16dadSTom Zanussi 	/* Default configuration is crypto only for even devices
50a4b16dadSTom Zanussi 	 * and compression for odd devices
51a4b16dadSTom Zanussi 	 */
52a4b16dadSTom Zanussi 	ret = adf_cfg_add_key_value_param(accel_dev, ADF_GENERAL_SEC,
53a4b16dadSTom Zanussi 					  ADF_SERVICES_ENABLED, config,
54a4b16dadSTom Zanussi 					  ADF_STR);
55a4b16dadSTom Zanussi 	if (ret)
56a4b16dadSTom Zanussi 		return ret;
57a4b16dadSTom Zanussi 
58359b84f8SDamian Muszynski 	adf_heartbeat_save_cfg_param(accel_dev, ADF_CFG_HB_TIMER_MIN_MS);
59359b84f8SDamian Muszynski 
60a4b16dadSTom Zanussi 	return 0;
61a4b16dadSTom Zanussi }
62a4b16dadSTom Zanussi 
adf_crypto_dev_config(struct adf_accel_dev * accel_dev)63a4b16dadSTom Zanussi static int adf_crypto_dev_config(struct adf_accel_dev *accel_dev)
64a4b16dadSTom Zanussi {
65a4b16dadSTom Zanussi 	char key[ADF_CFG_MAX_KEY_LEN_IN_BYTES];
66a4b16dadSTom Zanussi 	int banks = GET_MAX_BANKS(accel_dev);
67a4b16dadSTom Zanussi 	int cpus = num_online_cpus();
68a4b16dadSTom Zanussi 	unsigned long bank, val;
69a4b16dadSTom Zanussi 	int instances;
70a4b16dadSTom Zanussi 	int ret;
71a4b16dadSTom Zanussi 	int i;
72a4b16dadSTom Zanussi 
73a4b16dadSTom Zanussi 	if (adf_hw_dev_has_crypto(accel_dev))
74a4b16dadSTom Zanussi 		instances = min(cpus, banks / 2);
75a4b16dadSTom Zanussi 	else
76a4b16dadSTom Zanussi 		instances = 0;
77a4b16dadSTom Zanussi 
78a4b16dadSTom Zanussi 	for (i = 0; i < instances; i++) {
79a4b16dadSTom Zanussi 		val = i;
80a4b16dadSTom Zanussi 		bank = i * 2;
81a4b16dadSTom Zanussi 		snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_ASYM_BANK_NUM, i);
82a4b16dadSTom Zanussi 		ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
83a4b16dadSTom Zanussi 						  key, &bank, ADF_DEC);
84a4b16dadSTom Zanussi 		if (ret)
85a4b16dadSTom Zanussi 			goto err;
86a4b16dadSTom Zanussi 
87a4b16dadSTom Zanussi 		bank += 1;
88a4b16dadSTom Zanussi 		snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_SYM_BANK_NUM, i);
89a4b16dadSTom Zanussi 		ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
90a4b16dadSTom Zanussi 						  key, &bank, ADF_DEC);
91a4b16dadSTom Zanussi 		if (ret)
92a4b16dadSTom Zanussi 			goto err;
93a4b16dadSTom Zanussi 
94a4b16dadSTom Zanussi 		snprintf(key, sizeof(key), ADF_CY "%d" ADF_ETRMGR_CORE_AFFINITY,
95a4b16dadSTom Zanussi 			 i);
96a4b16dadSTom Zanussi 		ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
97a4b16dadSTom Zanussi 						  key, &val, ADF_DEC);
98a4b16dadSTom Zanussi 		if (ret)
99a4b16dadSTom Zanussi 			goto err;
100a4b16dadSTom Zanussi 
101a4b16dadSTom Zanussi 		snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_ASYM_SIZE, i);
102a4b16dadSTom Zanussi 		val = 128;
103a4b16dadSTom Zanussi 		ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
104a4b16dadSTom Zanussi 						  key, &val, ADF_DEC);
105a4b16dadSTom Zanussi 		if (ret)
106a4b16dadSTom Zanussi 			goto err;
107a4b16dadSTom Zanussi 
108a4b16dadSTom Zanussi 		val = 512;
109a4b16dadSTom Zanussi 		snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_SYM_SIZE, i);
110a4b16dadSTom Zanussi 		ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
111a4b16dadSTom Zanussi 						  key, &val, ADF_DEC);
112a4b16dadSTom Zanussi 		if (ret)
113a4b16dadSTom Zanussi 			goto err;
114a4b16dadSTom Zanussi 
115a4b16dadSTom Zanussi 		val = 0;
116a4b16dadSTom Zanussi 		snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_ASYM_TX, i);
117a4b16dadSTom Zanussi 		ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
118a4b16dadSTom Zanussi 						  key, &val, ADF_DEC);
119a4b16dadSTom Zanussi 		if (ret)
120a4b16dadSTom Zanussi 			goto err;
121a4b16dadSTom Zanussi 
122a4b16dadSTom Zanussi 		val = 0;
123a4b16dadSTom Zanussi 		snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_SYM_TX, i);
124a4b16dadSTom Zanussi 		ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
125a4b16dadSTom Zanussi 						  key, &val, ADF_DEC);
126a4b16dadSTom Zanussi 		if (ret)
127a4b16dadSTom Zanussi 			goto err;
128a4b16dadSTom Zanussi 
129a4b16dadSTom Zanussi 		val = 1;
130a4b16dadSTom Zanussi 		snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_ASYM_RX, i);
131a4b16dadSTom Zanussi 		ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
132a4b16dadSTom Zanussi 						  key, &val, ADF_DEC);
133a4b16dadSTom Zanussi 		if (ret)
134a4b16dadSTom Zanussi 			goto err;
135a4b16dadSTom Zanussi 
136a4b16dadSTom Zanussi 		val = 1;
137a4b16dadSTom Zanussi 		snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_SYM_RX, i);
138a4b16dadSTom Zanussi 		ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
139a4b16dadSTom Zanussi 						  key, &val, ADF_DEC);
140a4b16dadSTom Zanussi 		if (ret)
141a4b16dadSTom Zanussi 			goto err;
142a4b16dadSTom Zanussi 
143a4b16dadSTom Zanussi 		val = ADF_COALESCING_DEF_TIME;
144a4b16dadSTom Zanussi 		snprintf(key, sizeof(key), ADF_ETRMGR_COALESCE_TIMER_FORMAT, i);
145a4b16dadSTom Zanussi 		ret = adf_cfg_add_key_value_param(accel_dev, "Accelerator0",
146a4b16dadSTom Zanussi 						  key, &val, ADF_DEC);
147a4b16dadSTom Zanussi 		if (ret)
148a4b16dadSTom Zanussi 			goto err;
149a4b16dadSTom Zanussi 	}
150a4b16dadSTom Zanussi 
151a4b16dadSTom Zanussi 	val = i;
152a4b16dadSTom Zanussi 	ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, ADF_NUM_CY,
153a4b16dadSTom Zanussi 					  &val, ADF_DEC);
154a4b16dadSTom Zanussi 	if (ret)
155a4b16dadSTom Zanussi 		goto err;
156a4b16dadSTom Zanussi 
157a4b16dadSTom Zanussi 	val = 0;
158a4b16dadSTom Zanussi 	ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, ADF_NUM_DC,
159a4b16dadSTom Zanussi 					  &val, ADF_DEC);
160a4b16dadSTom Zanussi 	if (ret)
161a4b16dadSTom Zanussi 		goto err;
162a4b16dadSTom Zanussi 
163a4b16dadSTom Zanussi 	return 0;
164a4b16dadSTom Zanussi err:
165a4b16dadSTom Zanussi 	dev_err(&GET_DEV(accel_dev), "Failed to add configuration for crypto\n");
166a4b16dadSTom Zanussi 	return ret;
167a4b16dadSTom Zanussi }
168a4b16dadSTom Zanussi 
adf_comp_dev_config(struct adf_accel_dev * accel_dev)169a4b16dadSTom Zanussi static int adf_comp_dev_config(struct adf_accel_dev *accel_dev)
170a4b16dadSTom Zanussi {
171a4b16dadSTom Zanussi 	char key[ADF_CFG_MAX_KEY_LEN_IN_BYTES];
172a4b16dadSTom Zanussi 	int banks = GET_MAX_BANKS(accel_dev);
173a4b16dadSTom Zanussi 	int cpus = num_online_cpus();
174a4b16dadSTom Zanussi 	unsigned long val;
175a4b16dadSTom Zanussi 	int instances;
176a4b16dadSTom Zanussi 	int ret;
177a4b16dadSTom Zanussi 	int i;
178a4b16dadSTom Zanussi 
179a4b16dadSTom Zanussi 	if (adf_hw_dev_has_compression(accel_dev))
180a4b16dadSTom Zanussi 		instances = min(cpus, banks);
181a4b16dadSTom Zanussi 	else
182a4b16dadSTom Zanussi 		instances = 0;
183a4b16dadSTom Zanussi 
184a4b16dadSTom Zanussi 	for (i = 0; i < instances; i++) {
185a4b16dadSTom Zanussi 		val = i;
186a4b16dadSTom Zanussi 		snprintf(key, sizeof(key), ADF_DC "%d" ADF_RING_DC_BANK_NUM, i);
187a4b16dadSTom Zanussi 		ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
188a4b16dadSTom Zanussi 						  key, &val, ADF_DEC);
189a4b16dadSTom Zanussi 		if (ret)
190a4b16dadSTom Zanussi 			goto err;
191a4b16dadSTom Zanussi 
192a4b16dadSTom Zanussi 		val = 512;
193a4b16dadSTom Zanussi 		snprintf(key, sizeof(key), ADF_DC "%d" ADF_RING_DC_SIZE, i);
194a4b16dadSTom Zanussi 		ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
195a4b16dadSTom Zanussi 						  key, &val, ADF_DEC);
196a4b16dadSTom Zanussi 		if (ret)
197a4b16dadSTom Zanussi 			goto err;
198a4b16dadSTom Zanussi 
199a4b16dadSTom Zanussi 		val = 0;
200a4b16dadSTom Zanussi 		snprintf(key, sizeof(key), ADF_DC "%d" ADF_RING_DC_TX, i);
201a4b16dadSTom Zanussi 		ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
202a4b16dadSTom Zanussi 						  key, &val, ADF_DEC);
203a4b16dadSTom Zanussi 		if (ret)
204a4b16dadSTom Zanussi 			goto err;
205a4b16dadSTom Zanussi 
206a4b16dadSTom Zanussi 		val = 1;
207a4b16dadSTom Zanussi 		snprintf(key, sizeof(key), ADF_DC "%d" ADF_RING_DC_RX, i);
208a4b16dadSTom Zanussi 		ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC,
209a4b16dadSTom Zanussi 						  key, &val, ADF_DEC);
210a4b16dadSTom Zanussi 		if (ret)
211a4b16dadSTom Zanussi 			goto err;
212a4b16dadSTom Zanussi 
213a4b16dadSTom Zanussi 		val = ADF_COALESCING_DEF_TIME;
214a4b16dadSTom Zanussi 		snprintf(key, sizeof(key), ADF_ETRMGR_COALESCE_TIMER_FORMAT, i);
215a4b16dadSTom Zanussi 		ret = adf_cfg_add_key_value_param(accel_dev, "Accelerator0",
216a4b16dadSTom Zanussi 						  key, &val, ADF_DEC);
217a4b16dadSTom Zanussi 		if (ret)
218a4b16dadSTom Zanussi 			goto err;
219a4b16dadSTom Zanussi 	}
220a4b16dadSTom Zanussi 
221a4b16dadSTom Zanussi 	val = i;
222a4b16dadSTom Zanussi 	ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, ADF_NUM_DC,
223a4b16dadSTom Zanussi 					  &val, ADF_DEC);
224a4b16dadSTom Zanussi 	if (ret)
225a4b16dadSTom Zanussi 		goto err;
226a4b16dadSTom Zanussi 
227a4b16dadSTom Zanussi 	val = 0;
228a4b16dadSTom Zanussi 	ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, ADF_NUM_CY,
229a4b16dadSTom Zanussi 					  &val, ADF_DEC);
230a4b16dadSTom Zanussi 	if (ret)
231a4b16dadSTom Zanussi 		goto err;
232a4b16dadSTom Zanussi 
233a4b16dadSTom Zanussi 	return 0;
234a4b16dadSTom Zanussi err:
235a4b16dadSTom Zanussi 	dev_err(&GET_DEV(accel_dev), "Failed to add configuration for compression\n");
236a4b16dadSTom Zanussi 	return ret;
237a4b16dadSTom Zanussi }
238a4b16dadSTom Zanussi 
adf_no_dev_config(struct adf_accel_dev * accel_dev)23950053275SAdam Guerin static int adf_no_dev_config(struct adf_accel_dev *accel_dev)
24050053275SAdam Guerin {
24150053275SAdam Guerin 	unsigned long val;
24250053275SAdam Guerin 	int ret;
24350053275SAdam Guerin 
24450053275SAdam Guerin 	val = 0;
24550053275SAdam Guerin 	ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, ADF_NUM_DC,
24650053275SAdam Guerin 					  &val, ADF_DEC);
24750053275SAdam Guerin 	if (ret)
24850053275SAdam Guerin 		return ret;
24950053275SAdam Guerin 
25050053275SAdam Guerin 	return adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, ADF_NUM_CY,
25150053275SAdam Guerin 					  &val, ADF_DEC);
25250053275SAdam Guerin }
25350053275SAdam Guerin 
adf_gen4_dev_config(struct adf_accel_dev * accel_dev)254a4b16dadSTom Zanussi int adf_gen4_dev_config(struct adf_accel_dev *accel_dev)
255a4b16dadSTom Zanussi {
256a4b16dadSTom Zanussi 	char services[ADF_CFG_MAX_VAL_LEN_IN_BYTES] = {0};
257a4b16dadSTom Zanussi 	int ret;
258a4b16dadSTom Zanussi 
259a4b16dadSTom Zanussi 	ret = adf_cfg_section_add(accel_dev, ADF_KERNEL_SEC);
260a4b16dadSTom Zanussi 	if (ret)
261a4b16dadSTom Zanussi 		goto err;
262a4b16dadSTom Zanussi 
263a4b16dadSTom Zanussi 	ret = adf_cfg_section_add(accel_dev, "Accelerator0");
264a4b16dadSTom Zanussi 	if (ret)
265a4b16dadSTom Zanussi 		goto err;
266a4b16dadSTom Zanussi 
267a4b16dadSTom Zanussi 	ret = adf_cfg_get_param_value(accel_dev, ADF_GENERAL_SEC,
268a4b16dadSTom Zanussi 				      ADF_SERVICES_ENABLED, services);
269a4b16dadSTom Zanussi 	if (ret)
270a4b16dadSTom Zanussi 		goto err;
271a4b16dadSTom Zanussi 
272b7284784SGiovanni Cabiddu 	ret = sysfs_match_string(adf_cfg_services, services);
273a4b16dadSTom Zanussi 	if (ret < 0)
274a4b16dadSTom Zanussi 		goto err;
275a4b16dadSTom Zanussi 
276a4b16dadSTom Zanussi 	switch (ret) {
277b7284784SGiovanni Cabiddu 	case SVC_CY:
278b7284784SGiovanni Cabiddu 	case SVC_CY2:
279a4b16dadSTom Zanussi 		ret = adf_crypto_dev_config(accel_dev);
280a4b16dadSTom Zanussi 		break;
281b7284784SGiovanni Cabiddu 	case SVC_DC:
2822e513f6bSAdam Guerin 	case SVC_DCC:
283a4b16dadSTom Zanussi 		ret = adf_comp_dev_config(accel_dev);
284a4b16dadSTom Zanussi 		break;
28550053275SAdam Guerin 	default:
28650053275SAdam Guerin 		ret = adf_no_dev_config(accel_dev);
28750053275SAdam Guerin 		break;
288a4b16dadSTom Zanussi 	}
289a4b16dadSTom Zanussi 
290a4b16dadSTom Zanussi 	if (ret)
291a4b16dadSTom Zanussi 		goto err;
292a4b16dadSTom Zanussi 
293a4b16dadSTom Zanussi 	set_bit(ADF_STATUS_CONFIGURED, &accel_dev->status);
294a4b16dadSTom Zanussi 
295a4b16dadSTom Zanussi 	return ret;
296a4b16dadSTom Zanussi 
297a4b16dadSTom Zanussi err:
298a4b16dadSTom Zanussi 	dev_err(&GET_DEV(accel_dev), "Failed to configure QAT driver\n");
299a4b16dadSTom Zanussi 	return ret;
300a4b16dadSTom Zanussi }
301a4b16dadSTom Zanussi 
adf_probe(struct pci_dev * pdev,const struct pci_device_id * ent)302a4b16dadSTom Zanussi static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
303a4b16dadSTom Zanussi {
304a4b16dadSTom Zanussi 	struct adf_accel_dev *accel_dev;
305a4b16dadSTom Zanussi 	struct adf_accel_pci *accel_pci_dev;
306a4b16dadSTom Zanussi 	struct adf_hw_device_data *hw_data;
307a4b16dadSTom Zanussi 	unsigned int i, bar_nr;
308a4b16dadSTom Zanussi 	unsigned long bar_mask;
309a4b16dadSTom Zanussi 	struct adf_bar *bar;
310a4b16dadSTom Zanussi 	int ret;
311a4b16dadSTom Zanussi 
312a4b16dadSTom Zanussi 	if (num_possible_nodes() > 1 && dev_to_node(&pdev->dev) < 0) {
313a4b16dadSTom Zanussi 		/*
314a4b16dadSTom Zanussi 		 * If the accelerator is connected to a node with no memory
315a4b16dadSTom Zanussi 		 * there is no point in using the accelerator since the remote
316a4b16dadSTom Zanussi 		 * memory transaction will be very slow.
317a4b16dadSTom Zanussi 		 */
318a4b16dadSTom Zanussi 		dev_err(&pdev->dev, "Invalid NUMA configuration.\n");
319a4b16dadSTom Zanussi 		return -EINVAL;
320a4b16dadSTom Zanussi 	}
321a4b16dadSTom Zanussi 
322a4b16dadSTom Zanussi 	accel_dev = devm_kzalloc(&pdev->dev, sizeof(*accel_dev), GFP_KERNEL);
323a4b16dadSTom Zanussi 	if (!accel_dev)
324a4b16dadSTom Zanussi 		return -ENOMEM;
325a4b16dadSTom Zanussi 
326a4b16dadSTom Zanussi 	INIT_LIST_HEAD(&accel_dev->crypto_list);
327a4b16dadSTom Zanussi 	accel_pci_dev = &accel_dev->accel_pci_dev;
328a4b16dadSTom Zanussi 	accel_pci_dev->pci_dev = pdev;
329a4b16dadSTom Zanussi 
330a4b16dadSTom Zanussi 	/*
331a4b16dadSTom Zanussi 	 * Add accel device to accel table
332a4b16dadSTom Zanussi 	 * This should be called before adf_cleanup_accel is called
333a4b16dadSTom Zanussi 	 */
334a4b16dadSTom Zanussi 	if (adf_devmgr_add_dev(accel_dev, NULL)) {
335a4b16dadSTom Zanussi 		dev_err(&pdev->dev, "Failed to add new accelerator device.\n");
336a4b16dadSTom Zanussi 		return -EFAULT;
337a4b16dadSTom Zanussi 	}
338a4b16dadSTom Zanussi 
339a4b16dadSTom Zanussi 	accel_dev->owner = THIS_MODULE;
340a4b16dadSTom Zanussi 	/* Allocate and initialise device hardware meta-data structure */
341a4b16dadSTom Zanussi 	hw_data = devm_kzalloc(&pdev->dev, sizeof(*hw_data), GFP_KERNEL);
342a4b16dadSTom Zanussi 	if (!hw_data) {
343a4b16dadSTom Zanussi 		ret = -ENOMEM;
344a4b16dadSTom Zanussi 		goto out_err;
345a4b16dadSTom Zanussi 	}
346a4b16dadSTom Zanussi 
347a4b16dadSTom Zanussi 	accel_dev->hw_device = hw_data;
348a4b16dadSTom Zanussi 	adf_init_hw_data_4xxx(accel_dev->hw_device, ent->device);
349a4b16dadSTom Zanussi 
350a4b16dadSTom Zanussi 	pci_read_config_byte(pdev, PCI_REVISION_ID, &accel_pci_dev->revid);
351a4b16dadSTom Zanussi 	pci_read_config_dword(pdev, ADF_4XXX_FUSECTL4_OFFSET, &hw_data->fuses);
352a4b16dadSTom Zanussi 
353a4b16dadSTom Zanussi 	/* Get Accelerators and Accelerators Engines masks */
354a4b16dadSTom Zanussi 	hw_data->accel_mask = hw_data->get_accel_mask(hw_data);
355a4b16dadSTom Zanussi 	hw_data->ae_mask = hw_data->get_ae_mask(hw_data);
356a4b16dadSTom Zanussi 	accel_pci_dev->sku = hw_data->get_sku(hw_data);
357a4b16dadSTom Zanussi 	/* If the device has no acceleration engines then ignore it */
358a4b16dadSTom Zanussi 	if (!hw_data->accel_mask || !hw_data->ae_mask ||
359a4b16dadSTom Zanussi 	    (~hw_data->ae_mask & 0x01)) {
360a4b16dadSTom Zanussi 		dev_err(&pdev->dev, "No acceleration units found.\n");
361a4b16dadSTom Zanussi 		ret = -EFAULT;
362a4b16dadSTom Zanussi 		goto out_err;
363a4b16dadSTom Zanussi 	}
364a4b16dadSTom Zanussi 
365a4b16dadSTom Zanussi 	/* Create device configuration table */
366a4b16dadSTom Zanussi 	ret = adf_cfg_dev_add(accel_dev);
367a4b16dadSTom Zanussi 	if (ret)
368a4b16dadSTom Zanussi 		goto out_err;
369a4b16dadSTom Zanussi 
370a4b16dadSTom Zanussi 	/* Enable PCI device */
371a4b16dadSTom Zanussi 	ret = pcim_enable_device(pdev);
372a4b16dadSTom Zanussi 	if (ret) {
373a4b16dadSTom Zanussi 		dev_err(&pdev->dev, "Can't enable PCI device.\n");
374a4b16dadSTom Zanussi 		goto out_err;
375a4b16dadSTom Zanussi 	}
376a4b16dadSTom Zanussi 
377a4b16dadSTom Zanussi 	/* Set DMA identifier */
378a4b16dadSTom Zanussi 	ret = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
379a4b16dadSTom Zanussi 	if (ret) {
380a4b16dadSTom Zanussi 		dev_err(&pdev->dev, "No usable DMA configuration.\n");
381a4b16dadSTom Zanussi 		goto out_err;
382a4b16dadSTom Zanussi 	}
383a4b16dadSTom Zanussi 
384a4b16dadSTom Zanussi 	ret = adf_cfg_dev_init(accel_dev);
385a4b16dadSTom Zanussi 	if (ret) {
386a4b16dadSTom Zanussi 		dev_err(&pdev->dev, "Failed to initialize configuration.\n");
387a4b16dadSTom Zanussi 		goto out_err;
388a4b16dadSTom Zanussi 	}
389a4b16dadSTom Zanussi 
390a4b16dadSTom Zanussi 	/* Get accelerator capabilities mask */
391a4b16dadSTom Zanussi 	hw_data->accel_capabilities_mask = hw_data->get_accel_cap(accel_dev);
392a4b16dadSTom Zanussi 	if (!hw_data->accel_capabilities_mask) {
393a4b16dadSTom Zanussi 		dev_err(&pdev->dev, "Failed to get capabilities mask.\n");
394a4b16dadSTom Zanussi 		ret = -EINVAL;
395a4b16dadSTom Zanussi 		goto out_err;
396a4b16dadSTom Zanussi 	}
397a4b16dadSTom Zanussi 
398a4b16dadSTom Zanussi 	/* Find and map all the device's BARS */
399a4b16dadSTom Zanussi 	bar_mask = pci_select_bars(pdev, IORESOURCE_MEM) & ADF_4XXX_BAR_MASK;
400a4b16dadSTom Zanussi 
401a4b16dadSTom Zanussi 	ret = pcim_iomap_regions_request_all(pdev, bar_mask, pci_name(pdev));
402a4b16dadSTom Zanussi 	if (ret) {
403a4b16dadSTom Zanussi 		dev_err(&pdev->dev, "Failed to map pci regions.\n");
404a4b16dadSTom Zanussi 		goto out_err;
405a4b16dadSTom Zanussi 	}
406a4b16dadSTom Zanussi 
407a4b16dadSTom Zanussi 	i = 0;
408a4b16dadSTom Zanussi 	for_each_set_bit(bar_nr, &bar_mask, PCI_STD_NUM_BARS) {
409a4b16dadSTom Zanussi 		bar = &accel_pci_dev->pci_bars[i++];
410a4b16dadSTom Zanussi 		bar->virt_addr = pcim_iomap_table(pdev)[bar_nr];
411a4b16dadSTom Zanussi 	}
412a4b16dadSTom Zanussi 
413a4b16dadSTom Zanussi 	pci_set_master(pdev);
414a4b16dadSTom Zanussi 
415a4b16dadSTom Zanussi 	if (pci_save_state(pdev)) {
416a4b16dadSTom Zanussi 		dev_err(&pdev->dev, "Failed to save pci state.\n");
417a4b16dadSTom Zanussi 		ret = -ENOMEM;
418a4b16dadSTom Zanussi 		goto out_err;
419a4b16dadSTom Zanussi 	}
420a4b16dadSTom Zanussi 
4219260db66SDamian Muszynski 	adf_dbgfs_init(accel_dev);
4229260db66SDamian Muszynski 
423a4b16dadSTom Zanussi 	ret = adf_dev_up(accel_dev, true);
424a4b16dadSTom Zanussi 	if (ret)
425a4b16dadSTom Zanussi 		goto out_err_dev_stop;
426a4b16dadSTom Zanussi 
427a4b16dadSTom Zanussi 	ret = adf_sysfs_init(accel_dev);
428a4b16dadSTom Zanussi 	if (ret)
429a4b16dadSTom Zanussi 		goto out_err_dev_stop;
430a4b16dadSTom Zanussi 
431a4b16dadSTom Zanussi 	return ret;
432a4b16dadSTom Zanussi 
433a4b16dadSTom Zanussi out_err_dev_stop:
434a4b16dadSTom Zanussi 	adf_dev_down(accel_dev, false);
435a4b16dadSTom Zanussi out_err:
436a4b16dadSTom Zanussi 	adf_cleanup_accel(accel_dev);
437a4b16dadSTom Zanussi 	return ret;
438a4b16dadSTom Zanussi }
439a4b16dadSTom Zanussi 
adf_remove(struct pci_dev * pdev)440a4b16dadSTom Zanussi static void adf_remove(struct pci_dev *pdev)
441a4b16dadSTom Zanussi {
442a4b16dadSTom Zanussi 	struct adf_accel_dev *accel_dev = adf_devmgr_pci_to_accel_dev(pdev);
443a4b16dadSTom Zanussi 
444a4b16dadSTom Zanussi 	if (!accel_dev) {
445a4b16dadSTom Zanussi 		pr_err("QAT: Driver removal failed\n");
446a4b16dadSTom Zanussi 		return;
447a4b16dadSTom Zanussi 	}
448a4b16dadSTom Zanussi 	adf_dev_down(accel_dev, false);
449a4b16dadSTom Zanussi 	adf_cleanup_accel(accel_dev);
450a4b16dadSTom Zanussi }
451a4b16dadSTom Zanussi 
452a4b16dadSTom Zanussi static struct pci_driver adf_driver = {
453a4b16dadSTom Zanussi 	.id_table = adf_pci_tbl,
454a4b16dadSTom Zanussi 	.name = ADF_4XXX_DEVICE_NAME,
455a4b16dadSTom Zanussi 	.probe = adf_probe,
456a4b16dadSTom Zanussi 	.remove = adf_remove,
457a4b16dadSTom Zanussi 	.sriov_configure = adf_sriov_configure,
458a4b16dadSTom Zanussi 	.err_handler = &adf_err_handler,
459a4b16dadSTom Zanussi };
460a4b16dadSTom Zanussi 
461a4b16dadSTom Zanussi module_pci_driver(adf_driver);
462a4b16dadSTom Zanussi 
463a4b16dadSTom Zanussi MODULE_LICENSE("Dual BSD/GPL");
464a4b16dadSTom Zanussi MODULE_AUTHOR("Intel");
465a4b16dadSTom Zanussi MODULE_FIRMWARE(ADF_4XXX_FW);
466e8d340f8SGiovanni Cabiddu MODULE_FIRMWARE(ADF_402XX_FW);
467a4b16dadSTom Zanussi MODULE_FIRMWARE(ADF_4XXX_MMP);
468e8d340f8SGiovanni Cabiddu MODULE_FIRMWARE(ADF_402XX_MMP);
469a4b16dadSTom Zanussi MODULE_DESCRIPTION("Intel(R) QuickAssist Technology");
470a4b16dadSTom Zanussi MODULE_VERSION(ADF_DRV_VERSION);
471a4b16dadSTom Zanussi MODULE_SOFTDEP("pre: crypto-intel_qat");
472