// SPDX-License-Identifier: GPL-2.0 /* Copyright (C) 2023, Intel Corporation. */ #include "ice.h" #include "ice_lib.h" #include "ice_irq.h" /** * ice_init_irq_tracker - initialize interrupt tracker * @pf: board private structure * @max_vectors: maximum number of vectors that tracker can hold * @num_static: number of preallocated interrupts */ static void ice_init_irq_tracker(struct ice_pf *pf, unsigned int max_vectors, unsigned int num_static) { … } /** * ice_deinit_irq_tracker - free xarray tracker * @pf: board private structure */ static void ice_deinit_irq_tracker(struct ice_pf *pf) { … } /** * ice_free_irq_res - free a block of resources * @pf: board private structure * @index: starting index previously returned by ice_get_res */ static void ice_free_irq_res(struct ice_pf *pf, u16 index) { … } /** * ice_get_irq_res - get an interrupt resource * @pf: board private structure * @dyn_only: force entry to be dynamically allocated * * Allocate new irq entry in the free slot of the tracker. Since xarray * is used, always allocate new entry at the lowest possible index. Set * proper allocation limit for maximum tracker entries. * * Returns allocated irq entry or NULL on failure. */ static struct ice_irq_entry *ice_get_irq_res(struct ice_pf *pf, bool dyn_only) { … } /** * ice_reduce_msix_usage - Reduce usage of MSI-X vectors * @pf: board private structure * @v_remain: number of remaining MSI-X vectors to be distributed * * Reduce the usage of MSI-X vectors when entire request cannot be fulfilled. * pf->num_lan_msix and pf->num_rdma_msix values are set based on number of * remaining vectors. */ static void ice_reduce_msix_usage(struct ice_pf *pf, int v_remain) { … } /** * ice_ena_msix_range - Request a range of MSIX vectors from the OS * @pf: board private structure * * Compute the number of MSIX vectors wanted and request from the OS. Adjust * device usage if there are not enough vectors. Return the number of vectors * reserved or negative on failure. */ static int ice_ena_msix_range(struct ice_pf *pf) { … } /** * ice_clear_interrupt_scheme - Undo things done by ice_init_interrupt_scheme * @pf: board private structure */ void ice_clear_interrupt_scheme(struct ice_pf *pf) { … } /** * ice_init_interrupt_scheme - Determine proper interrupt scheme * @pf: board private structure to initialize */ int ice_init_interrupt_scheme(struct ice_pf *pf) { … } /** * ice_alloc_irq - Allocate new interrupt vector * @pf: board private structure * @dyn_only: force dynamic allocation of the interrupt * * Allocate new interrupt vector for a given owner id. * return struct msi_map with interrupt details and track * allocated interrupt appropriately. * * This function reserves new irq entry from the irq_tracker. * if according to the tracker information all interrupts that * were allocated with ice_pci_alloc_irq_vectors are already used * and dynamically allocated interrupts are supported then new * interrupt will be allocated with pci_msix_alloc_irq_at. * * Some callers may only support dynamically allocated interrupts. * This is indicated with dyn_only flag. * * On failure, return map with negative .index. The caller * is expected to check returned map index. * */ struct msi_map ice_alloc_irq(struct ice_pf *pf, bool dyn_only) { … } /** * ice_free_irq - Free interrupt vector * @pf: board private structure * @map: map with interrupt details * * Remove allocated interrupt from the interrupt tracker. If interrupt was * allocated dynamically, free respective interrupt vector. */ void ice_free_irq(struct ice_pf *pf, struct msi_map map) { … } /** * ice_get_max_used_msix_vector - Get the max used interrupt vector * @pf: board private structure * * Return index of maximum used interrupt vectors with respect to the * beginning of the MSIX table. Take into account that some interrupts * may have been dynamically allocated after MSIX was initially enabled. */ int ice_get_max_used_msix_vector(struct ice_pf *pf) { … }