Commit fb0a6a26 authored by Eli Cohen's avatar Eli Cohen Committed by Saeed Mahameed
Browse files

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: default avatarEli Cohen <elic@nvidia.com>
Reviewed-by: default avatarShay Drory <shayd@nvidia.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@nvidia.com>
Reviewed-by: default avatarJacob Keller <jacob.e.keller@intel.com>
parent b637ac5d
Loading
Loading
Loading
Loading
+52 −0
Original line number Diff line number Diff line
@@ -483,6 +483,58 @@ struct mlx5_irq *mlx5_irq_request(struct mlx5_core_dev *dev, u16 vecidx,
	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.
 * @irqs: IRQs to be released.
+6 −0
Original line number Diff line number Diff line
@@ -1308,4 +1308,10 @@ enum {
	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 */