1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright 2020 Mellanox Technologies, Ltd
3  */
4 
5 #ifndef _MLX5_COMMON_PCI_H_
6 #define _MLX5_COMMON_PCI_H_
7 
8 /**
9  * @file
10  *
11  * RTE Mellanox PCI Driver Interface
12  * Mellanox ConnectX PCI device supports multiple class (net/vdpa/regex)
13  * devices. This layer enables creating such multiple class of devices on a
14  * single PCI device by allowing to bind multiple class specific device
15  * driver to attach to mlx5_pci driver.
16  *
17  * -----------    ------------    -------------
18  * |   mlx5  |    |   mlx5   |    |   mlx5    |
19  * | net pmd |    | vdpa pmd |    | regex pmd |
20  * -----------    ------------    -------------
21  *      \              |                 /
22  *       \             |                /
23  *        \       --------------       /
24  *         \______|   mlx5     |_____ /
25  *                | pci common |
26  *                --------------
27  *                     |
28  *                 -----------
29  *                 |   mlx5  |
30  *                 | pci dev |
31  *                 -----------
32  *
33  * - mlx5 pci driver binds to mlx5 PCI devices defined by PCI
34  *   ID table of all related mlx5 PCI devices.
35  * - mlx5 class driver such as net, vdpa, regex PMD defines its
36  *   specific PCI ID table and mlx5 bus driver probes matching
37  *   class drivers.
38  * - mlx5 pci bus driver is cental place that validates supported
39  *   class combinations.
40  */
41 
42 #ifdef __cplusplus
43 extern "C" {
44 #endif /* __cplusplus */
45 
46 #include <rte_pci.h>
47 #include <rte_bus_pci.h>
48 
49 #include <mlx5_common.h>
50 
51 void mlx5_common_pci_init(void);
52 
53 /**
54  * A structure describing a mlx5 pci driver.
55  */
56 struct mlx5_pci_driver {
57 	struct rte_pci_driver pci_driver;	/**< Inherit core pci driver. */
58 	uint32_t driver_class;	/**< Class of this driver, enum mlx5_class */
59 	TAILQ_ENTRY(mlx5_pci_driver) next;
60 };
61 
62 /**
63  * Register a mlx5_pci device driver.
64  *
65  * @param driver
66  *   A pointer to a mlx5_pci_driver structure describing the driver
67  *   to be registered.
68  */
69 __rte_internal
70 void
71 mlx5_pci_driver_register(struct mlx5_pci_driver *driver);
72 
73 #ifdef __cplusplus
74 }
75 #endif /* __cplusplus */
76 
77 #endif /* _MLX5_COMMON_PCI_H_ */
78