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