xref: /freebsd/sys/dev/qat/qat_common/adf_isr.c (revision 71625ec9ad2a9bc8c09784fbd23b759830e0ee5f)
178ee8d1cSJulian Grajkowski /* SPDX-License-Identifier: BSD-3-Clause */
278ee8d1cSJulian Grajkowski /* Copyright(c) 2007-2022 Intel Corporation */
378ee8d1cSJulian Grajkowski #include "qat_freebsd.h"
478ee8d1cSJulian Grajkowski #include "adf_cfg.h"
578ee8d1cSJulian Grajkowski #include "adf_common_drv.h"
678ee8d1cSJulian Grajkowski #include "adf_accel_devices.h"
778ee8d1cSJulian Grajkowski #include "icp_qat_uclo.h"
878ee8d1cSJulian Grajkowski #include "icp_qat_fw.h"
978ee8d1cSJulian Grajkowski #include "icp_qat_fw_init_admin.h"
1078ee8d1cSJulian Grajkowski #include "adf_cfg_strings.h"
1178ee8d1cSJulian Grajkowski #include "adf_transport_access_macros.h"
1278ee8d1cSJulian Grajkowski #include "adf_transport_internal.h"
1378ee8d1cSJulian Grajkowski #include <sys/types.h>
1478ee8d1cSJulian Grajkowski #include <sys/bus.h>
1578ee8d1cSJulian Grajkowski #include <sys/smp.h>
1678ee8d1cSJulian Grajkowski #include <dev/pci/pcivar.h>
1778ee8d1cSJulian Grajkowski #include <sys/malloc.h>
1878ee8d1cSJulian Grajkowski #include "adf_accel_devices.h"
1978ee8d1cSJulian Grajkowski #include "adf_common_drv.h"
2078ee8d1cSJulian Grajkowski #include "adf_cfg.h"
2178ee8d1cSJulian Grajkowski #include "adf_cfg_strings.h"
2278ee8d1cSJulian Grajkowski #include "adf_cfg_common.h"
2378ee8d1cSJulian Grajkowski #include "adf_transport_access_macros.h"
2478ee8d1cSJulian Grajkowski #include "adf_transport_internal.h"
2578ee8d1cSJulian Grajkowski #include "adf_dev_err.h"
2678ee8d1cSJulian Grajkowski 
2778ee8d1cSJulian Grajkowski TASKQUEUE_DEFINE_THREAD(qat_pf);
2878ee8d1cSJulian Grajkowski 
2978ee8d1cSJulian Grajkowski static int
adf_enable_msix(struct adf_accel_dev * accel_dev)3078ee8d1cSJulian Grajkowski adf_enable_msix(struct adf_accel_dev *accel_dev)
3178ee8d1cSJulian Grajkowski {
3278ee8d1cSJulian Grajkowski 	struct adf_accel_pci *info_pci_dev = &accel_dev->accel_pci_dev;
3378ee8d1cSJulian Grajkowski 	struct adf_hw_device_data *hw_data = accel_dev->hw_device;
3478ee8d1cSJulian Grajkowski 	int msix_num_entries = 1;
3578ee8d1cSJulian Grajkowski 	int count = 0;
3678ee8d1cSJulian Grajkowski 	int error = 0;
3778ee8d1cSJulian Grajkowski 	int num_vectors = 0;
3878ee8d1cSJulian Grajkowski 	u_int *vectors;
3978ee8d1cSJulian Grajkowski 
40*a977168cSMichal Gulbicki 	if (hw_data->set_msix_rttable)
41*a977168cSMichal Gulbicki 		hw_data->set_msix_rttable(accel_dev);
42*a977168cSMichal Gulbicki 
4378ee8d1cSJulian Grajkowski 	/* If SR-IOV is disabled, add entries for each bank */
4478ee8d1cSJulian Grajkowski 	if (!accel_dev->u1.pf.vf_info) {
4578ee8d1cSJulian Grajkowski 		msix_num_entries += hw_data->num_banks;
4678ee8d1cSJulian Grajkowski 		num_vectors = 0;
4778ee8d1cSJulian Grajkowski 		vectors = NULL;
4878ee8d1cSJulian Grajkowski 	} else {
4978ee8d1cSJulian Grajkowski 		num_vectors = hw_data->num_banks + 1;
5078ee8d1cSJulian Grajkowski 		vectors = malloc(num_vectors * sizeof(u_int),
5178ee8d1cSJulian Grajkowski 				 M_QAT,
5278ee8d1cSJulian Grajkowski 				 M_WAITOK | M_ZERO);
5378ee8d1cSJulian Grajkowski 		vectors[hw_data->num_banks] = 1;
5478ee8d1cSJulian Grajkowski 	}
5578ee8d1cSJulian Grajkowski 
5678ee8d1cSJulian Grajkowski 	count = msix_num_entries;
5778ee8d1cSJulian Grajkowski 	error = pci_alloc_msix(info_pci_dev->pci_dev, &count);
5878ee8d1cSJulian Grajkowski 	if (error == 0 && count != msix_num_entries) {
5978ee8d1cSJulian Grajkowski 		pci_release_msi(info_pci_dev->pci_dev);
6078ee8d1cSJulian Grajkowski 		error = EFBIG;
6178ee8d1cSJulian Grajkowski 	}
6278ee8d1cSJulian Grajkowski 	if (error) {
6378ee8d1cSJulian Grajkowski 		device_printf(GET_DEV(accel_dev),
6478ee8d1cSJulian Grajkowski 			      "Failed to enable MSI-X IRQ(s)\n");
6578ee8d1cSJulian Grajkowski 		free(vectors, M_QAT);
6678ee8d1cSJulian Grajkowski 		return error;
6778ee8d1cSJulian Grajkowski 	}
6878ee8d1cSJulian Grajkowski 
6978ee8d1cSJulian Grajkowski 	if (vectors != NULL) {
7078ee8d1cSJulian Grajkowski 		error =
7178ee8d1cSJulian Grajkowski 		    pci_remap_msix(info_pci_dev->pci_dev, num_vectors, vectors);
7278ee8d1cSJulian Grajkowski 		free(vectors, M_QAT);
7378ee8d1cSJulian Grajkowski 		if (error) {
7478ee8d1cSJulian Grajkowski 			device_printf(GET_DEV(accel_dev),
7578ee8d1cSJulian Grajkowski 				      "Failed to remap MSI-X IRQ(s)\n");
7678ee8d1cSJulian Grajkowski 			pci_release_msi(info_pci_dev->pci_dev);
7778ee8d1cSJulian Grajkowski 			return error;
7878ee8d1cSJulian Grajkowski 		}
7978ee8d1cSJulian Grajkowski 	}
8078ee8d1cSJulian Grajkowski 
8178ee8d1cSJulian Grajkowski 	return 0;
8278ee8d1cSJulian Grajkowski }
8378ee8d1cSJulian Grajkowski 
8478ee8d1cSJulian Grajkowski static void
adf_disable_msix(struct adf_accel_pci * info_pci_dev)8578ee8d1cSJulian Grajkowski adf_disable_msix(struct adf_accel_pci *info_pci_dev)
8678ee8d1cSJulian Grajkowski {
8778ee8d1cSJulian Grajkowski 	pci_release_msi(info_pci_dev->pci_dev);
8878ee8d1cSJulian Grajkowski }
8978ee8d1cSJulian Grajkowski 
9078ee8d1cSJulian Grajkowski static void
adf_msix_isr_bundle(void * bank_ptr)9178ee8d1cSJulian Grajkowski adf_msix_isr_bundle(void *bank_ptr)
9278ee8d1cSJulian Grajkowski {
9378ee8d1cSJulian Grajkowski 	struct adf_etr_bank_data *bank = bank_ptr;
9478ee8d1cSJulian Grajkowski 	struct adf_etr_data *priv_data = bank->accel_dev->transport;
95*a977168cSMichal Gulbicki 	struct adf_hw_csr_ops *csr_ops = GET_CSR_OPS(bank->accel_dev);
9678ee8d1cSJulian Grajkowski 
97*a977168cSMichal Gulbicki 	csr_ops->write_csr_int_flag_and_col(bank->csr_addr,
98*a977168cSMichal Gulbicki 					    bank->bank_number,
99*a977168cSMichal Gulbicki 					    0);
10078ee8d1cSJulian Grajkowski 	adf_response_handler((uintptr_t)&priv_data->banks[bank->bank_number]);
10178ee8d1cSJulian Grajkowski 	return;
10278ee8d1cSJulian Grajkowski }
10378ee8d1cSJulian Grajkowski 
10478ee8d1cSJulian Grajkowski static void
adf_msix_isr_ae(void * dev_ptr)10578ee8d1cSJulian Grajkowski adf_msix_isr_ae(void *dev_ptr)
10678ee8d1cSJulian Grajkowski {
10778ee8d1cSJulian Grajkowski 	struct adf_accel_dev *accel_dev = dev_ptr;
10878ee8d1cSJulian Grajkowski 	struct adf_hw_device_data *hw_data = accel_dev->hw_device;
10978ee8d1cSJulian Grajkowski 	struct adf_bar *pmisc =
11078ee8d1cSJulian Grajkowski 	    &GET_BARS(accel_dev)[hw_data->get_misc_bar_id(hw_data)];
11178ee8d1cSJulian Grajkowski 	struct resource *pmisc_bar_addr = pmisc->virt_addr;
11278ee8d1cSJulian Grajkowski 	u32 errsou3;
11378ee8d1cSJulian Grajkowski 	u32 errsou5;
11478ee8d1cSJulian Grajkowski 	bool reset_required = false;
11578ee8d1cSJulian Grajkowski 
11678ee8d1cSJulian Grajkowski 	if (hw_data->ras_interrupts &&
11778ee8d1cSJulian Grajkowski 	    hw_data->ras_interrupts(accel_dev, &reset_required))
11878ee8d1cSJulian Grajkowski 		if (reset_required) {
11978ee8d1cSJulian Grajkowski 			adf_notify_fatal_error(accel_dev);
12078ee8d1cSJulian Grajkowski 			goto exit;
12178ee8d1cSJulian Grajkowski 		}
12278ee8d1cSJulian Grajkowski 
12378ee8d1cSJulian Grajkowski 	if (hw_data->check_slice_hang && hw_data->check_slice_hang(accel_dev)) {
12478ee8d1cSJulian Grajkowski 	}
12578ee8d1cSJulian Grajkowski 
12678ee8d1cSJulian Grajkowski exit:
12778ee8d1cSJulian Grajkowski 	errsou3 = ADF_CSR_RD(pmisc_bar_addr, ADF_ERRSOU3);
12878ee8d1cSJulian Grajkowski 	errsou5 = ADF_CSR_RD(pmisc_bar_addr, ADF_ERRSOU5);
12978ee8d1cSJulian Grajkowski 	if (errsou3 | errsou5)
13078ee8d1cSJulian Grajkowski 		adf_print_err_registers(accel_dev);
13178ee8d1cSJulian Grajkowski 	else
13278ee8d1cSJulian Grajkowski 		device_printf(GET_DEV(accel_dev), "spurious AE interrupt\n");
13378ee8d1cSJulian Grajkowski 
13478ee8d1cSJulian Grajkowski 	return;
13578ee8d1cSJulian Grajkowski }
13678ee8d1cSJulian Grajkowski 
13778ee8d1cSJulian Grajkowski static int
adf_get_irq_affinity(struct adf_accel_dev * accel_dev,int bank)13878ee8d1cSJulian Grajkowski adf_get_irq_affinity(struct adf_accel_dev *accel_dev, int bank)
13978ee8d1cSJulian Grajkowski {
14078ee8d1cSJulian Grajkowski 	int core = CPU_FIRST();
14178ee8d1cSJulian Grajkowski 	char val[ADF_CFG_MAX_VAL_LEN_IN_BYTES];
14278ee8d1cSJulian Grajkowski 	char bankName[ADF_CFG_MAX_KEY_LEN_IN_BYTES];
14378ee8d1cSJulian Grajkowski 
14478ee8d1cSJulian Grajkowski 	snprintf(bankName,
14578ee8d1cSJulian Grajkowski 		 ADF_CFG_MAX_KEY_LEN_IN_BYTES - 1,
14678ee8d1cSJulian Grajkowski 		 ADF_ETRMGR_CORE_AFFINITY_FORMAT,
14778ee8d1cSJulian Grajkowski 		 bank);
14878ee8d1cSJulian Grajkowski 	bankName[ADF_CFG_MAX_KEY_LEN_IN_BYTES - 1] = '\0';
14978ee8d1cSJulian Grajkowski 
15078ee8d1cSJulian Grajkowski 	if (adf_cfg_get_param_value(accel_dev, "Accelerator0", bankName, val)) {
15178ee8d1cSJulian Grajkowski 		device_printf(GET_DEV(accel_dev),
15278ee8d1cSJulian Grajkowski 			      "No CoreAffinity Set - using default core: %d\n",
15378ee8d1cSJulian Grajkowski 			      core);
15478ee8d1cSJulian Grajkowski 	} else {
15578ee8d1cSJulian Grajkowski 		if (compat_strtouint(val, 10, &core)) {
15678ee8d1cSJulian Grajkowski 			device_printf(GET_DEV(accel_dev),
15778ee8d1cSJulian Grajkowski 				      "Can't get cpu core ID\n");
15878ee8d1cSJulian Grajkowski 		}
15978ee8d1cSJulian Grajkowski 	}
16078ee8d1cSJulian Grajkowski 	return (core);
16178ee8d1cSJulian Grajkowski }
16278ee8d1cSJulian Grajkowski 
16378ee8d1cSJulian Grajkowski static int
adf_request_irqs(struct adf_accel_dev * accel_dev)16478ee8d1cSJulian Grajkowski adf_request_irqs(struct adf_accel_dev *accel_dev)
16578ee8d1cSJulian Grajkowski {
16678ee8d1cSJulian Grajkowski 	struct adf_accel_pci *info_pci_dev = &accel_dev->accel_pci_dev;
16778ee8d1cSJulian Grajkowski 	struct adf_hw_device_data *hw_data = accel_dev->hw_device;
16878ee8d1cSJulian Grajkowski 	struct msix_entry *msixe = info_pci_dev->msix_entries.entries;
16978ee8d1cSJulian Grajkowski 	int ret = 0, rid = 0, i = 0;
17078ee8d1cSJulian Grajkowski 	struct adf_etr_data *etr_data = accel_dev->transport;
17178ee8d1cSJulian Grajkowski 	int computed_core = 0;
17278ee8d1cSJulian Grajkowski 
17378ee8d1cSJulian Grajkowski 	/* Request msix irq for all banks unless SR-IOV enabled */
17478ee8d1cSJulian Grajkowski 	if (!accel_dev->u1.pf.vf_info) {
17578ee8d1cSJulian Grajkowski 		for (i = 0; i < hw_data->num_banks; i++) {
17678ee8d1cSJulian Grajkowski 			struct adf_etr_bank_data *bank = &etr_data->banks[i];
17778ee8d1cSJulian Grajkowski 
17878ee8d1cSJulian Grajkowski 			rid = i + 1;
17978ee8d1cSJulian Grajkowski 			msixe[i].irq =
18078ee8d1cSJulian Grajkowski 			    bus_alloc_resource_any(info_pci_dev->pci_dev,
18178ee8d1cSJulian Grajkowski 						   SYS_RES_IRQ,
18278ee8d1cSJulian Grajkowski 						   &rid,
18378ee8d1cSJulian Grajkowski 						   RF_ACTIVE);
18478ee8d1cSJulian Grajkowski 			if (msixe[i].irq == NULL) {
18578ee8d1cSJulian Grajkowski 				device_printf(
18678ee8d1cSJulian Grajkowski 				    GET_DEV(accel_dev),
18778ee8d1cSJulian Grajkowski 				    "failed to allocate IRQ for bundle %d\n",
18878ee8d1cSJulian Grajkowski 				    i);
18978ee8d1cSJulian Grajkowski 				return ENXIO;
19078ee8d1cSJulian Grajkowski 			}
19178ee8d1cSJulian Grajkowski 
19278ee8d1cSJulian Grajkowski 			ret = bus_setup_intr(info_pci_dev->pci_dev,
19378ee8d1cSJulian Grajkowski 					     msixe[i].irq,
19478ee8d1cSJulian Grajkowski 					     INTR_TYPE_MISC | INTR_MPSAFE,
19578ee8d1cSJulian Grajkowski 					     NULL,
19678ee8d1cSJulian Grajkowski 					     adf_msix_isr_bundle,
19778ee8d1cSJulian Grajkowski 					     bank,
19878ee8d1cSJulian Grajkowski 					     &msixe[i].cookie);
19978ee8d1cSJulian Grajkowski 			if (ret) {
20078ee8d1cSJulian Grajkowski 				device_printf(
20178ee8d1cSJulian Grajkowski 				    GET_DEV(accel_dev),
20278ee8d1cSJulian Grajkowski 				    "failed to enable IRQ for bundle %d\n",
20378ee8d1cSJulian Grajkowski 				    i);
20478ee8d1cSJulian Grajkowski 				bus_release_resource(info_pci_dev->pci_dev,
20578ee8d1cSJulian Grajkowski 						     SYS_RES_IRQ,
20678ee8d1cSJulian Grajkowski 						     rid,
20778ee8d1cSJulian Grajkowski 						     msixe[i].irq);
20878ee8d1cSJulian Grajkowski 				msixe[i].irq = NULL;
20978ee8d1cSJulian Grajkowski 				return ret;
21078ee8d1cSJulian Grajkowski 			}
21178ee8d1cSJulian Grajkowski 
21278ee8d1cSJulian Grajkowski 			computed_core = adf_get_irq_affinity(accel_dev, i);
21378ee8d1cSJulian Grajkowski 			bus_describe_intr(info_pci_dev->pci_dev,
21478ee8d1cSJulian Grajkowski 					  msixe[i].irq,
21578ee8d1cSJulian Grajkowski 					  msixe[i].cookie,
21678ee8d1cSJulian Grajkowski 					  "b%d",
21778ee8d1cSJulian Grajkowski 					  i);
21878ee8d1cSJulian Grajkowski 			bus_bind_intr(info_pci_dev->pci_dev,
21978ee8d1cSJulian Grajkowski 				      msixe[i].irq,
22078ee8d1cSJulian Grajkowski 				      computed_core);
22178ee8d1cSJulian Grajkowski 		}
22278ee8d1cSJulian Grajkowski 	}
22378ee8d1cSJulian Grajkowski 
22478ee8d1cSJulian Grajkowski 	/* Request msix irq for AE */
22578ee8d1cSJulian Grajkowski 	rid = hw_data->num_banks + 1;
22678ee8d1cSJulian Grajkowski 	msixe[i].irq = bus_alloc_resource_any(info_pci_dev->pci_dev,
22778ee8d1cSJulian Grajkowski 					      SYS_RES_IRQ,
22878ee8d1cSJulian Grajkowski 					      &rid,
22978ee8d1cSJulian Grajkowski 					      RF_ACTIVE);
23078ee8d1cSJulian Grajkowski 	if (msixe[i].irq == NULL) {
23178ee8d1cSJulian Grajkowski 		device_printf(GET_DEV(accel_dev),
23278ee8d1cSJulian Grajkowski 			      "failed to allocate IRQ for ae-cluster\n");
23378ee8d1cSJulian Grajkowski 		return ENXIO;
23478ee8d1cSJulian Grajkowski 	}
23578ee8d1cSJulian Grajkowski 
23678ee8d1cSJulian Grajkowski 	ret = bus_setup_intr(info_pci_dev->pci_dev,
23778ee8d1cSJulian Grajkowski 			     msixe[i].irq,
23878ee8d1cSJulian Grajkowski 			     INTR_TYPE_MISC | INTR_MPSAFE,
23978ee8d1cSJulian Grajkowski 			     NULL,
24078ee8d1cSJulian Grajkowski 			     adf_msix_isr_ae,
24178ee8d1cSJulian Grajkowski 			     accel_dev,
24278ee8d1cSJulian Grajkowski 			     &msixe[i].cookie);
24378ee8d1cSJulian Grajkowski 	if (ret) {
24478ee8d1cSJulian Grajkowski 		device_printf(GET_DEV(accel_dev),
24578ee8d1cSJulian Grajkowski 			      "failed to enable IRQ for ae-cluster\n");
24678ee8d1cSJulian Grajkowski 		bus_release_resource(info_pci_dev->pci_dev,
24778ee8d1cSJulian Grajkowski 				     SYS_RES_IRQ,
24878ee8d1cSJulian Grajkowski 				     rid,
24978ee8d1cSJulian Grajkowski 				     msixe[i].irq);
25078ee8d1cSJulian Grajkowski 		msixe[i].irq = NULL;
25178ee8d1cSJulian Grajkowski 		return ret;
25278ee8d1cSJulian Grajkowski 	}
25378ee8d1cSJulian Grajkowski 
25478ee8d1cSJulian Grajkowski 	bus_describe_intr(info_pci_dev->pci_dev,
25578ee8d1cSJulian Grajkowski 			  msixe[i].irq,
25678ee8d1cSJulian Grajkowski 			  msixe[i].cookie,
25778ee8d1cSJulian Grajkowski 			  "ae");
25878ee8d1cSJulian Grajkowski 	return ret;
25978ee8d1cSJulian Grajkowski }
26078ee8d1cSJulian Grajkowski 
26178ee8d1cSJulian Grajkowski static void
adf_free_irqs(struct adf_accel_dev * accel_dev)26278ee8d1cSJulian Grajkowski adf_free_irqs(struct adf_accel_dev *accel_dev)
26378ee8d1cSJulian Grajkowski {
26478ee8d1cSJulian Grajkowski 	struct adf_accel_pci *info_pci_dev = &accel_dev->accel_pci_dev;
26578ee8d1cSJulian Grajkowski 	struct msix_entry *msixe = info_pci_dev->msix_entries.entries;
26678ee8d1cSJulian Grajkowski 	int i = 0;
26778ee8d1cSJulian Grajkowski 
26878ee8d1cSJulian Grajkowski 	if (info_pci_dev->msix_entries.num_entries > 0) {
26978ee8d1cSJulian Grajkowski 		for (i = 0; i < info_pci_dev->msix_entries.num_entries; i++) {
27078ee8d1cSJulian Grajkowski 			if (msixe[i].irq != NULL && msixe[i].cookie != NULL) {
27178ee8d1cSJulian Grajkowski 				bus_teardown_intr(info_pci_dev->pci_dev,
27278ee8d1cSJulian Grajkowski 						  msixe[i].irq,
27378ee8d1cSJulian Grajkowski 						  msixe[i].cookie);
27478ee8d1cSJulian Grajkowski 				bus_free_resource(info_pci_dev->pci_dev,
27578ee8d1cSJulian Grajkowski 						  SYS_RES_IRQ,
27678ee8d1cSJulian Grajkowski 						  msixe[i].irq);
27778ee8d1cSJulian Grajkowski 			}
27878ee8d1cSJulian Grajkowski 		}
27978ee8d1cSJulian Grajkowski 	}
28078ee8d1cSJulian Grajkowski }
28178ee8d1cSJulian Grajkowski 
28278ee8d1cSJulian Grajkowski static int
adf_isr_alloc_msix_entry_table(struct adf_accel_dev * accel_dev)28378ee8d1cSJulian Grajkowski adf_isr_alloc_msix_entry_table(struct adf_accel_dev *accel_dev)
28478ee8d1cSJulian Grajkowski {
28578ee8d1cSJulian Grajkowski 	struct msix_entry *entries;
28678ee8d1cSJulian Grajkowski 	u32 msix_num_entries = 1;
28778ee8d1cSJulian Grajkowski 
28878ee8d1cSJulian Grajkowski 	struct adf_hw_device_data *hw_data = accel_dev->hw_device;
28978ee8d1cSJulian Grajkowski 	/* If SR-IOV is disabled (vf_info is NULL), add entries for each bank */
29078ee8d1cSJulian Grajkowski 	if (!accel_dev->u1.pf.vf_info)
29178ee8d1cSJulian Grajkowski 		msix_num_entries += hw_data->num_banks;
29278ee8d1cSJulian Grajkowski 
29378ee8d1cSJulian Grajkowski 	entries = malloc(msix_num_entries * sizeof(struct msix_entry),
29478ee8d1cSJulian Grajkowski 			 M_QAT,
29578ee8d1cSJulian Grajkowski 			 M_WAITOK | M_ZERO);
29678ee8d1cSJulian Grajkowski 
29778ee8d1cSJulian Grajkowski 	accel_dev->accel_pci_dev.msix_entries.num_entries = msix_num_entries;
29878ee8d1cSJulian Grajkowski 	accel_dev->accel_pci_dev.msix_entries.entries = entries;
29978ee8d1cSJulian Grajkowski 	return 0;
30078ee8d1cSJulian Grajkowski }
30178ee8d1cSJulian Grajkowski 
30278ee8d1cSJulian Grajkowski static void
adf_isr_free_msix_entry_table(struct adf_accel_dev * accel_dev)30378ee8d1cSJulian Grajkowski adf_isr_free_msix_entry_table(struct adf_accel_dev *accel_dev)
30478ee8d1cSJulian Grajkowski {
30578ee8d1cSJulian Grajkowski 
30678ee8d1cSJulian Grajkowski 	free(accel_dev->accel_pci_dev.msix_entries.entries, M_QAT);
30778ee8d1cSJulian Grajkowski 	accel_dev->accel_pci_dev.msix_entries.entries = NULL;
30878ee8d1cSJulian Grajkowski }
30978ee8d1cSJulian Grajkowski 
31078ee8d1cSJulian Grajkowski /**
31178ee8d1cSJulian Grajkowski  * adf_vf_isr_resource_free() - Free IRQ for acceleration device
31278ee8d1cSJulian Grajkowski  * @accel_dev:  Pointer to acceleration device.
31378ee8d1cSJulian Grajkowski  *
31478ee8d1cSJulian Grajkowski  * Function frees interrupts for acceleration device.
31578ee8d1cSJulian Grajkowski  */
31678ee8d1cSJulian Grajkowski void
adf_isr_resource_free(struct adf_accel_dev * accel_dev)31778ee8d1cSJulian Grajkowski adf_isr_resource_free(struct adf_accel_dev *accel_dev)
31878ee8d1cSJulian Grajkowski {
31978ee8d1cSJulian Grajkowski 	adf_free_irqs(accel_dev);
32078ee8d1cSJulian Grajkowski 	adf_disable_msix(&accel_dev->accel_pci_dev);
32178ee8d1cSJulian Grajkowski 	adf_isr_free_msix_entry_table(accel_dev);
32278ee8d1cSJulian Grajkowski }
32378ee8d1cSJulian Grajkowski 
32478ee8d1cSJulian Grajkowski /**
32578ee8d1cSJulian Grajkowski  * adf_vf_isr_resource_alloc() - Allocate IRQ for acceleration device
32678ee8d1cSJulian Grajkowski  * @accel_dev:  Pointer to acceleration device.
32778ee8d1cSJulian Grajkowski  *
32878ee8d1cSJulian Grajkowski  * Function allocates interrupts for acceleration device.
32978ee8d1cSJulian Grajkowski  *
33078ee8d1cSJulian Grajkowski  * Return: 0 on success, error code otherwise.
33178ee8d1cSJulian Grajkowski  */
33278ee8d1cSJulian Grajkowski int
adf_isr_resource_alloc(struct adf_accel_dev * accel_dev)33378ee8d1cSJulian Grajkowski adf_isr_resource_alloc(struct adf_accel_dev *accel_dev)
33478ee8d1cSJulian Grajkowski {
33578ee8d1cSJulian Grajkowski 	int ret;
33678ee8d1cSJulian Grajkowski 
33778ee8d1cSJulian Grajkowski 	ret = adf_isr_alloc_msix_entry_table(accel_dev);
33878ee8d1cSJulian Grajkowski 	if (ret)
33978ee8d1cSJulian Grajkowski 		return ret;
34078ee8d1cSJulian Grajkowski 	if (adf_enable_msix(accel_dev))
34178ee8d1cSJulian Grajkowski 		goto err_out;
34278ee8d1cSJulian Grajkowski 
34378ee8d1cSJulian Grajkowski 	if (adf_request_irqs(accel_dev))
34478ee8d1cSJulian Grajkowski 		goto err_out;
34578ee8d1cSJulian Grajkowski 
34678ee8d1cSJulian Grajkowski 	return 0;
34778ee8d1cSJulian Grajkowski err_out:
34878ee8d1cSJulian Grajkowski 	adf_isr_resource_free(accel_dev);
34978ee8d1cSJulian Grajkowski 	return EFAULT;
35078ee8d1cSJulian Grajkowski }
351