1 /*
2  * Copyright (c) 2023 Intel Corporation
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #ifndef ZEPHYR_INCLUDE_DRIVERS_PCIE_VC_H_
8 #define ZEPHYR_INCLUDE_DRIVERS_PCIE_VC_H_
9 
10 /**
11  * @brief PCIe Virtual Channel Host Interface
12  * @defgroup pcie_vc_host_interface PCIe Virtual Channel Host Interface
13  * @ingroup pcie_host_interface
14  * @{
15  */
16 
17 #ifdef __cplusplus
18 extern "C" {
19 #endif
20 
21 #include <zephyr/kernel.h>
22 #include <zephyr/types.h>
23 #include <stdbool.h>
24 
25 #include <zephyr/drivers/pcie/pcie.h>
26 
27 /*
28  * 1 default VC + 7 extended VCs
29  */
30 #define PCIE_VC_MAX_COUNT 8U
31 
32 #define PCIE_VC_SET_TC0 BIT(0)
33 #define PCIE_VC_SET_TC1 BIT(1)
34 #define PCIE_VC_SET_TC2 BIT(2)
35 #define PCIE_VC_SET_TC3 BIT(3)
36 #define PCIE_VC_SET_TC4 BIT(4)
37 #define PCIE_VC_SET_TC5 BIT(5)
38 #define PCIE_VC_SET_TC6 BIT(6)
39 #define PCIE_VC_SET_TC7 BIT(7)
40 
41 struct pcie_vctc_map {
42 	/*
43 	 * Map the TCs for each VC by setting bits relevantly
44 	 * Note: one bit cannot be set more than once among the VCs
45 	 */
46 	uint8_t vc_tc[PCIE_VC_MAX_COUNT];
47 	/*
48 	 * Number of VCs being addressed
49 	 */
50 	int vc_count;
51 };
52 
53 /**
54  * @brief Enable PCIe Virtual Channel handling
55  * @param bdf the target PCI endpoint
56  * @return 0 on success, a negative error code otherwise
57  *
58  * Note: Not being able to enable such feature is a non-fatal error
59  * and any code using it should behave accordingly (displaying some info,
60  * and ignoring it for instance).
61  */
62 int pcie_vc_enable(pcie_bdf_t bdf);
63 
64 /**
65  * @brief Disable PCIe Virtual Channel handling
66  * @param bdf the target PCI endpoint
67  * @return 0 on success, a negative error code otherwise
68  */
69 int pcie_vc_disable(pcie_bdf_t bdf);
70 
71 /**
72  * @brief Map PCIe TC/VC
73  * @param bdf the target PCI endpoint
74  * @param map the tc/vc map to apply
75  * @return 0 on success, a negative error code otherwise
76  *
77  * Note: VC must be disabled prior to call this function and
78  * enabled afterward in order for the endpoint to take advandage of the map.
79  *
80  * Note: Not being able to enable such feature is a non-fatal error
81  * and any code using it should behave accordingly (displaying some info,
82  * and ignoring it for instance).
83  */
84 int pcie_vc_map_tc(pcie_bdf_t bdf, struct pcie_vctc_map *map);
85 
86 
87 #ifdef __cplusplus
88 }
89 #endif
90 
91 /**
92  * @}
93  */
94 
95 #endif /* ZEPHYR_INCLUDE_DRIVERS_PCIE_VC_H_ */
96