1 // SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0-only)
2 /* Copyright(c) 2014 - 2020 Intel Corporation */
3 #include <linux/kernel.h>
4 #include <linux/module.h>
6 #include <linux/init.h>
7 #include <linux/types.h>
9 #include <linux/slab.h>
10 #include <linux/errno.h>
11 #include <linux/device.h>
12 #include <linux/dma-mapping.h>
13 #include <linux/platform_device.h>
14 #include <linux/workqueue.h>
16 #include <adf_accel_devices.h>
17 #include <adf_common_drv.h>
19 #include "adf_c3xxx_hw_data.h"
21 #define ADF_SYSTEM_DEVICE(device_id) \
22 {PCI_DEVICE(PCI_VENDOR_ID_INTEL, device_id)}
24 static const struct pci_device_id adf_pci_tbl
[] = {
25 ADF_SYSTEM_DEVICE(ADF_C3XXX_PCI_DEVICE_ID
),
28 MODULE_DEVICE_TABLE(pci
, adf_pci_tbl
);
30 static int adf_probe(struct pci_dev
*dev
, const struct pci_device_id
*ent
);
31 static void adf_remove(struct pci_dev
*dev
);
33 static struct pci_driver adf_driver
= {
34 .id_table
= adf_pci_tbl
,
35 .name
= ADF_C3XXX_DEVICE_NAME
,
38 .sriov_configure
= adf_sriov_configure
,
41 static void adf_cleanup_pci_dev(struct adf_accel_dev
*accel_dev
)
43 pci_release_regions(accel_dev
->accel_pci_dev
.pci_dev
);
44 pci_disable_device(accel_dev
->accel_pci_dev
.pci_dev
);
47 static void adf_cleanup_accel(struct adf_accel_dev
*accel_dev
)
49 struct adf_accel_pci
*accel_pci_dev
= &accel_dev
->accel_pci_dev
;
52 for (i
= 0; i
< ADF_PCI_MAX_BARS
; i
++) {
53 struct adf_bar
*bar
= &accel_pci_dev
->pci_bars
[i
];
56 pci_iounmap(accel_pci_dev
->pci_dev
, bar
->virt_addr
);
59 if (accel_dev
->hw_device
) {
60 switch (accel_pci_dev
->pci_dev
->device
) {
61 case ADF_C3XXX_PCI_DEVICE_ID
:
62 adf_clean_hw_data_c3xxx(accel_dev
->hw_device
);
67 kfree(accel_dev
->hw_device
);
68 accel_dev
->hw_device
= NULL
;
70 adf_cfg_dev_remove(accel_dev
);
71 debugfs_remove(accel_dev
->debugfs_dir
);
72 adf_devmgr_rm_dev(accel_dev
, NULL
);
75 static int adf_probe(struct pci_dev
*pdev
, const struct pci_device_id
*ent
)
77 struct adf_accel_dev
*accel_dev
;
78 struct adf_accel_pci
*accel_pci_dev
;
79 struct adf_hw_device_data
*hw_data
;
80 char name
[ADF_DEVICE_NAME_LENGTH
];
81 unsigned int i
, bar_nr
;
82 unsigned long bar_mask
;
85 switch (ent
->device
) {
86 case ADF_C3XXX_PCI_DEVICE_ID
:
89 dev_err(&pdev
->dev
, "Invalid device 0x%x.\n", ent
->device
);
93 if (num_possible_nodes() > 1 && dev_to_node(&pdev
->dev
) < 0) {
94 /* If the accelerator is connected to a node with no memory
95 * there is no point in using the accelerator since the remote
96 * memory transaction will be very slow. */
97 dev_err(&pdev
->dev
, "Invalid NUMA configuration.\n");
101 accel_dev
= kzalloc_node(sizeof(*accel_dev
), GFP_KERNEL
,
102 dev_to_node(&pdev
->dev
));
106 INIT_LIST_HEAD(&accel_dev
->crypto_list
);
107 accel_pci_dev
= &accel_dev
->accel_pci_dev
;
108 accel_pci_dev
->pci_dev
= pdev
;
110 /* Add accel device to accel table.
111 * This should be called before adf_cleanup_accel is called */
112 if (adf_devmgr_add_dev(accel_dev
, NULL
)) {
113 dev_err(&pdev
->dev
, "Failed to add new accelerator device.\n");
118 accel_dev
->owner
= THIS_MODULE
;
119 /* Allocate and configure device configuration structure */
120 hw_data
= kzalloc_node(sizeof(*hw_data
), GFP_KERNEL
,
121 dev_to_node(&pdev
->dev
));
127 accel_dev
->hw_device
= hw_data
;
128 adf_init_hw_data_c3xxx(accel_dev
->hw_device
);
129 pci_read_config_byte(pdev
, PCI_REVISION_ID
, &accel_pci_dev
->revid
);
130 pci_read_config_dword(pdev
, ADF_DEVICE_FUSECTL_OFFSET
,
133 /* Get Accelerators and Accelerators Engines masks */
134 hw_data
->accel_mask
= hw_data
->get_accel_mask(hw_data
->fuses
);
135 hw_data
->ae_mask
= hw_data
->get_ae_mask(hw_data
->fuses
);
136 accel_pci_dev
->sku
= hw_data
->get_sku(hw_data
);
137 /* If the device has no acceleration engines then ignore it. */
138 if (!hw_data
->accel_mask
|| !hw_data
->ae_mask
||
139 ((~hw_data
->ae_mask
) & 0x01)) {
140 dev_err(&pdev
->dev
, "No acceleration units found");
145 /* Create dev top level debugfs entry */
146 snprintf(name
, sizeof(name
), "%s%s_%02x:%02d.%d",
147 ADF_DEVICE_NAME_PREFIX
, hw_data
->dev_class
->name
,
148 pdev
->bus
->number
, PCI_SLOT(pdev
->devfn
),
149 PCI_FUNC(pdev
->devfn
));
151 accel_dev
->debugfs_dir
= debugfs_create_dir(name
, NULL
);
153 /* Create device configuration table */
154 ret
= adf_cfg_dev_add(accel_dev
);
158 /* enable PCI device */
159 if (pci_enable_device(pdev
)) {
164 /* set dma identifier */
165 if (pci_set_dma_mask(pdev
, DMA_BIT_MASK(64))) {
166 if ((pci_set_dma_mask(pdev
, DMA_BIT_MASK(32)))) {
167 dev_err(&pdev
->dev
, "No usable DMA configuration\n");
169 goto out_err_disable
;
171 pci_set_consistent_dma_mask(pdev
, DMA_BIT_MASK(32));
175 pci_set_consistent_dma_mask(pdev
, DMA_BIT_MASK(64));
178 if (pci_request_regions(pdev
, ADF_C3XXX_DEVICE_NAME
)) {
180 goto out_err_disable
;
183 /* Read accelerator capabilities mask */
184 pci_read_config_dword(pdev
, ADF_DEVICE_LEGFUSE_OFFSET
,
185 &hw_data
->accel_capabilities_mask
);
187 /* Find and map all the device's BARS */
189 bar_mask
= pci_select_bars(pdev
, IORESOURCE_MEM
);
190 for_each_set_bit(bar_nr
, &bar_mask
, ADF_PCI_MAX_BARS
* 2) {
191 struct adf_bar
*bar
= &accel_pci_dev
->pci_bars
[i
++];
193 bar
->base_addr
= pci_resource_start(pdev
, bar_nr
);
196 bar
->size
= pci_resource_len(pdev
, bar_nr
);
197 bar
->virt_addr
= pci_iomap(accel_pci_dev
->pci_dev
, bar_nr
, 0);
198 if (!bar
->virt_addr
) {
199 dev_err(&pdev
->dev
, "Failed to map BAR %d\n", bar_nr
);
201 goto out_err_free_reg
;
204 pci_set_master(pdev
);
206 if (adf_enable_aer(accel_dev
, &adf_driver
)) {
207 dev_err(&pdev
->dev
, "Failed to enable aer\n");
209 goto out_err_free_reg
;
212 if (pci_save_state(pdev
)) {
213 dev_err(&pdev
->dev
, "Failed to save pci state\n");
215 goto out_err_free_reg
;
218 ret
= qat_crypto_dev_config(accel_dev
);
220 goto out_err_free_reg
;
222 ret
= adf_dev_init(accel_dev
);
224 goto out_err_dev_shutdown
;
226 ret
= adf_dev_start(accel_dev
);
228 goto out_err_dev_stop
;
233 adf_dev_stop(accel_dev
);
234 out_err_dev_shutdown
:
235 adf_dev_shutdown(accel_dev
);
237 pci_release_regions(accel_pci_dev
->pci_dev
);
239 pci_disable_device(accel_pci_dev
->pci_dev
);
241 adf_cleanup_accel(accel_dev
);
246 static void adf_remove(struct pci_dev
*pdev
)
248 struct adf_accel_dev
*accel_dev
= adf_devmgr_pci_to_accel_dev(pdev
);
251 pr_err("QAT: Driver removal failed\n");
254 adf_dev_stop(accel_dev
);
255 adf_dev_shutdown(accel_dev
);
256 adf_disable_aer(accel_dev
);
257 adf_cleanup_accel(accel_dev
);
258 adf_cleanup_pci_dev(accel_dev
);
262 static int __init
adfdrv_init(void)
264 request_module("intel_qat");
266 if (pci_register_driver(&adf_driver
)) {
267 pr_err("QAT: Driver initialization failed\n");
273 static void __exit
adfdrv_release(void)
275 pci_unregister_driver(&adf_driver
);
278 module_init(adfdrv_init
);
279 module_exit(adfdrv_release
);
281 MODULE_LICENSE("Dual BSD/GPL");
282 MODULE_AUTHOR("Intel");
283 MODULE_FIRMWARE(ADF_C3XXX_FW
);
284 MODULE_FIRMWARE(ADF_C3XXX_MMP
);
285 MODULE_DESCRIPTION("Intel(R) QuickAssist Technology");
286 MODULE_VERSION(ADF_DRV_VERSION
);