Lines Matching +full:interrupt +full:- +full:map
1 // SPDX-License-Identifier: GPL-2.0
9 * ice_init_irq_tracker - initialize interrupt tracker
18 pf->irq_tracker.num_entries = max_vectors; in ice_init_irq_tracker()
19 pf->irq_tracker.num_static = num_static; in ice_init_irq_tracker()
20 xa_init_flags(&pf->irq_tracker.entries, XA_FLAGS_ALLOC); in ice_init_irq_tracker()
26 pf->virt_irq_tracker.bm = bitmap_zalloc(num_entries, GFP_KERNEL); in ice_init_virt_irq_tracker()
27 if (!pf->virt_irq_tracker.bm) in ice_init_virt_irq_tracker()
28 return -ENOMEM; in ice_init_virt_irq_tracker()
30 pf->virt_irq_tracker.num_entries = num_entries; in ice_init_virt_irq_tracker()
31 pf->virt_irq_tracker.base = base; in ice_init_virt_irq_tracker()
37 * ice_deinit_irq_tracker - free xarray tracker
42 xa_destroy(&pf->irq_tracker.entries); in ice_deinit_irq_tracker()
47 bitmap_free(pf->virt_irq_tracker.bm); in ice_deinit_virt_irq_tracker()
51 * ice_free_irq_res - free a block of resources
59 entry = xa_erase(&pf->irq_tracker.entries, index); in ice_free_irq_res()
64 * ice_get_irq_res - get an interrupt resource
77 struct xa_limit limit = { .max = pf->irq_tracker.num_entries - 1, in ice_get_irq_res()
79 unsigned int num_static = pf->irq_tracker.num_static - 1; in ice_get_irq_res()
92 ret = xa_alloc(&pf->irq_tracker.entries, &index, entry, limit, in ice_get_irq_res()
99 entry->index = index; in ice_get_irq_res()
100 entry->dynamic = index > num_static; in ice_get_irq_res()
110 (test_bit(ICE_FLAG_FD_ENA, pf->flags) ? ICE_FDIR_MSIX : 0) + in ice_get_default_msix_amount()
115 * ice_clear_interrupt_scheme - Undo things done by ice_init_interrupt_scheme
120 pci_free_irq_vectors(pf->pdev); in ice_clear_interrupt_scheme()
126 * ice_init_interrupt_scheme - Determine proper interrupt scheme
131 int total_vectors = pf->hw.func_caps.common_cap.num_msix_vectors; in ice_init_interrupt_scheme()
134 /* load default PF MSI-X range */ in ice_init_interrupt_scheme()
135 if (!pf->msix.min) in ice_init_interrupt_scheme()
136 pf->msix.min = ICE_MIN_MSIX; in ice_init_interrupt_scheme()
138 if (!pf->msix.max) in ice_init_interrupt_scheme()
139 pf->msix.max = min(total_vectors, in ice_init_interrupt_scheme()
142 pf->msix.total = total_vectors; in ice_init_interrupt_scheme()
143 pf->msix.rest = total_vectors - pf->msix.max; in ice_init_interrupt_scheme()
145 if (pci_msix_can_alloc_dyn(pf->pdev)) in ice_init_interrupt_scheme()
146 vectors = pf->msix.min; in ice_init_interrupt_scheme()
148 vectors = pf->msix.max; in ice_init_interrupt_scheme()
150 vectors = pci_alloc_irq_vectors(pf->pdev, pf->msix.min, vectors, in ice_init_interrupt_scheme()
155 ice_init_irq_tracker(pf, pf->msix.max, vectors); in ice_init_interrupt_scheme()
157 return ice_init_virt_irq_tracker(pf, pf->msix.max, pf->msix.rest); in ice_init_interrupt_scheme()
161 * ice_alloc_irq - Allocate new interrupt vector
163 * @dyn_allowed: allow dynamic allocation of the interrupt
165 * Allocate new interrupt vector for a given owner id.
166 * return struct msi_map with interrupt details and track
167 * allocated interrupt appropriately.
173 * interrupt will be allocated with pci_msix_alloc_irq_at.
178 * On failure, return map with negative .index. The caller
179 * is expected to check returned map index.
184 struct msi_map map = { .index = -ENOENT }; in ice_alloc_irq() local
190 return map; in ice_alloc_irq()
192 if (pci_msix_can_alloc_dyn(pf->pdev) && entry->dynamic) { in ice_alloc_irq()
193 map = pci_msix_alloc_irq_at(pf->pdev, entry->index, NULL); in ice_alloc_irq()
194 if (map.index < 0) in ice_alloc_irq()
196 dev_dbg(dev, "allocated new irq at index %d\n", map.index); in ice_alloc_irq()
198 map.index = entry->index; in ice_alloc_irq()
199 map.virq = pci_irq_vector(pf->pdev, map.index); in ice_alloc_irq()
202 return map; in ice_alloc_irq()
205 dev_err(dev, "Could not allocate irq at idx %d\n", entry->index); in ice_alloc_irq()
206 ice_free_irq_res(pf, entry->index); in ice_alloc_irq()
207 return map; in ice_alloc_irq()
211 * ice_free_irq - Free interrupt vector
213 * @map: map with interrupt details
215 * Remove allocated interrupt from the interrupt tracker. If interrupt was
216 * allocated dynamically, free respective interrupt vector.
218 void ice_free_irq(struct ice_pf *pf, struct msi_map map) in ice_free_irq() argument
222 entry = xa_load(&pf->irq_tracker.entries, map.index); in ice_free_irq()
225 dev_err(ice_pf_to_dev(pf), "Failed to get MSIX interrupt entry at index %d", in ice_free_irq()
226 map.index); in ice_free_irq()
230 dev_dbg(ice_pf_to_dev(pf), "Free irq at index %d\n", map.index); in ice_free_irq()
232 if (entry->dynamic) in ice_free_irq()
233 pci_msix_free_irq(pf->pdev, map); in ice_free_irq()
235 ice_free_irq_res(pf, map.index); in ice_free_irq()
239 * ice_virt_get_irqs - get irqs for SR-IOV usacase
243 * This returns the first MSI-X vector index in PF space that is used by this
247 * using vf->first_vector_idx for queue configuration_id: id of VF which will
252 int res = bitmap_find_next_zero_area(pf->virt_irq_tracker.bm, in ice_virt_get_irqs()
253 pf->virt_irq_tracker.num_entries, in ice_virt_get_irqs()
256 if (res >= pf->virt_irq_tracker.num_entries) in ice_virt_get_irqs()
257 return -ENOENT; in ice_virt_get_irqs()
259 bitmap_set(pf->virt_irq_tracker.bm, res, needed); in ice_virt_get_irqs()
262 return res + pf->virt_irq_tracker.base; in ice_virt_get_irqs()
266 * ice_virt_free_irqs - free irqs used by the VF
273 bitmap_clear(pf->virt_irq_tracker.bm, index - pf->virt_irq_tracker.base, in ice_virt_free_irqs()