forked from mirrors/linux
		
	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
					
				
					 2 changed files with 58 additions and 0 deletions
				
			
		| 
						 | 
					@ -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 a new issue