mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson
synced 2025-08-29 19:49:10 +00:00
net/mlx5: Provide external API for allocating vectors
Provide external API to be used by other drivers relying on mlx5_core, for allocating MSIX vectors. An example for such a driver would be mlx5_vdpa. Signed-off-by: Eli Cohen <elic@nvidia.com> Reviewed-by: Shay Drory <shayd@nvidia.com> Signed-off-by: Saeed Mahameed <saeedm@nvidia.com> Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
This commit is contained in:
parent
b637ac5db0
commit
fb0a6a268d
@ -483,6 +483,58 @@ struct mlx5_irq *mlx5_irq_request(struct mlx5_core_dev *dev, u16 vecidx,
|
|||||||
return irq;
|
return irq;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* mlx5_msix_alloc - allocate msix interrupt
|
||||||
|
* @dev: mlx5 device from which to request
|
||||||
|
* @handler: interrupt handler
|
||||||
|
* @affdesc: affinity descriptor
|
||||||
|
* @name: interrupt name
|
||||||
|
*
|
||||||
|
* Returns: struct msi_map with result encoded.
|
||||||
|
* Note: the caller must make sure to release the irq by calling
|
||||||
|
* mlx5_msix_free() if shutdown was initiated.
|
||||||
|
*/
|
||||||
|
struct msi_map mlx5_msix_alloc(struct mlx5_core_dev *dev,
|
||||||
|
irqreturn_t (*handler)(int, void *),
|
||||||
|
const struct irq_affinity_desc *affdesc,
|
||||||
|
const char *name)
|
||||||
|
{
|
||||||
|
struct msi_map map;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
if (!dev->pdev) {
|
||||||
|
map.virq = 0;
|
||||||
|
map.index = -EINVAL;
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
|
||||||
|
map = pci_msix_alloc_irq_at(dev->pdev, MSI_ANY_INDEX, affdesc);
|
||||||
|
if (!map.virq)
|
||||||
|
return map;
|
||||||
|
|
||||||
|
err = request_irq(map.virq, handler, 0, name, NULL);
|
||||||
|
if (err) {
|
||||||
|
mlx5_core_warn(dev, "err %d\n", err);
|
||||||
|
pci_msix_free_irq(dev->pdev, map);
|
||||||
|
map.virq = 0;
|
||||||
|
map.index = -ENOMEM;
|
||||||
|
}
|
||||||
|
return map;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(mlx5_msix_alloc);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* mlx5_msix_free - free a previously allocated msix interrupt
|
||||||
|
* @dev: mlx5 device associated with interrupt
|
||||||
|
* @map: map previously returned by mlx5_msix_alloc()
|
||||||
|
*/
|
||||||
|
void mlx5_msix_free(struct mlx5_core_dev *dev, struct msi_map map)
|
||||||
|
{
|
||||||
|
free_irq(map.virq, NULL);
|
||||||
|
pci_msix_free_irq(dev->pdev, map);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(mlx5_msix_free);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* mlx5_irqs_release_vectors - release one or more IRQs back to the system.
|
* mlx5_irqs_release_vectors - release one or more IRQs back to the system.
|
||||||
* @irqs: IRQs to be released.
|
* @irqs: IRQs to be released.
|
||||||
|
@ -1308,4 +1308,10 @@ enum {
|
|||||||
MLX5_OCTWORD = 16,
|
MLX5_OCTWORD = 16,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct msi_map mlx5_msix_alloc(struct mlx5_core_dev *dev,
|
||||||
|
irqreturn_t (*handler)(int, void *),
|
||||||
|
const struct irq_affinity_desc *affdesc,
|
||||||
|
const char *name);
|
||||||
|
void mlx5_msix_free(struct mlx5_core_dev *dev, struct msi_map map);
|
||||||
|
|
||||||
#endif /* MLX5_DRIVER_H */
|
#endif /* MLX5_DRIVER_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user