xref: /dpdk/examples/vm_power_manager/channel_monitor.h (revision b462f2737eb08b07b84da4204fbd1c9b9ba00b2d)
13998e2a0SBruce Richardson /* SPDX-License-Identifier: BSD-3-Clause
23998e2a0SBruce Richardson  * Copyright(c) 2010-2014 Intel Corporation
3e8ae9b66SAlan Carew  */
4e8ae9b66SAlan Carew 
5e8ae9b66SAlan Carew #ifndef CHANNEL_MONITOR_H_
6e8ae9b66SAlan Carew #define CHANNEL_MONITOR_H_
7e8ae9b66SAlan Carew 
8f30a1bbdSSivaprasad Tummala #include <rte_power_cpufreq.h>
9*b462f273SDavid Marchand #include <rte_power_guest_channel.h>
10825fddf6SBruce Richardson 
11e8ae9b66SAlan Carew #include "channel_manager.h"
12f14791a8SRory Sexton 
13f14791a8SRory Sexton struct core_share {
14f14791a8SRory Sexton 	unsigned int pcpu;
15f14791a8SRory Sexton 	/*
16f14791a8SRory Sexton 	 * 1 CORE SHARE
17f14791a8SRory Sexton 	 * 0 NOT SHARED
18f14791a8SRory Sexton 	 */
19f14791a8SRory Sexton 	int status;
20f14791a8SRory Sexton };
21f14791a8SRory Sexton 
22f14791a8SRory Sexton struct policy {
23bd5b6720SBruce Richardson 	struct rte_power_channel_packet pkt;
2438d232b9SBruce Richardson 	uint32_t pfid[RTE_POWER_MAX_VFS];
2538d232b9SBruce Richardson 	uint32_t port[RTE_POWER_MAX_VFS];
26f14791a8SRory Sexton 	unsigned int enabled;
2738d232b9SBruce Richardson 	struct core_share core_share[RTE_POWER_MAX_VCPU_PER_VM];
28f14791a8SRory Sexton };
29e8ae9b66SAlan Carew 
30e8ae9b66SAlan Carew #ifdef __cplusplus
31e8ae9b66SAlan Carew extern "C" {
32e8ae9b66SAlan Carew #endif
33e8ae9b66SAlan Carew 
34e8ae9b66SAlan Carew /**
35e8ae9b66SAlan Carew  * Setup the Channel Monitor resources required to initialize epoll.
36e8ae9b66SAlan Carew  * Must be called first before calling other functions.
37e8ae9b66SAlan Carew  *
38e8ae9b66SAlan Carew  * @return
39e8ae9b66SAlan Carew  *  - 0 on success.
40e8ae9b66SAlan Carew  *  - Negative on error.
41e8ae9b66SAlan Carew  */
42e8ae9b66SAlan Carew int channel_monitor_init(void);
43e8ae9b66SAlan Carew 
44e8ae9b66SAlan Carew /**
4523f3dac4SStephen Hemminger  * Run the channel monitor, loops forever on epoll_wait.
46e8ae9b66SAlan Carew  *
47e8ae9b66SAlan Carew  *
48e8ae9b66SAlan Carew  * @return
49e8ae9b66SAlan Carew  *  None
50e8ae9b66SAlan Carew  */
51e8ae9b66SAlan Carew void run_channel_monitor(void);
52e8ae9b66SAlan Carew 
53e8ae9b66SAlan Carew /**
54e8ae9b66SAlan Carew  * Exit the Channel Monitor, exiting the epoll_wait loop and events processing.
55e8ae9b66SAlan Carew  *
56e8ae9b66SAlan Carew  * @return
57e8ae9b66SAlan Carew  *  - 0 on success.
58e8ae9b66SAlan Carew  *  - Negative on error.
59e8ae9b66SAlan Carew  */
60e8ae9b66SAlan Carew void channel_monitor_exit(void);
61e8ae9b66SAlan Carew 
62e8ae9b66SAlan Carew /**
63e8ae9b66SAlan Carew  * Add an open channel to monitor via epoll. A pointer to struct channel_info
64e8ae9b66SAlan Carew  * will be registered with epoll for event processing.
65e8ae9b66SAlan Carew  * It is thread-safe.
66e8ae9b66SAlan Carew  *
67e8ae9b66SAlan Carew  * @param chan_info
68e8ae9b66SAlan Carew  *  Pointer to struct channel_info pointer.
69e8ae9b66SAlan Carew  *
70e8ae9b66SAlan Carew  * @return
71e8ae9b66SAlan Carew  *  - 0 on success.
72e8ae9b66SAlan Carew  *  - Negative on error.
73e8ae9b66SAlan Carew  */
74e8ae9b66SAlan Carew int add_channel_to_monitor(struct channel_info **chan_info);
75e8ae9b66SAlan Carew 
76e8ae9b66SAlan Carew /**
77e8ae9b66SAlan Carew  * Remove a previously added channel from epoll control.
78e8ae9b66SAlan Carew  *
79e8ae9b66SAlan Carew  * @param chan_info
80e8ae9b66SAlan Carew  *  Pointer to struct channel_info.
81e8ae9b66SAlan Carew  *
82e8ae9b66SAlan Carew  * @return
83e8ae9b66SAlan Carew  *  - 0 on success.
84e8ae9b66SAlan Carew  *  - Negative on error.
85e8ae9b66SAlan Carew  */
86e8ae9b66SAlan Carew int remove_channel_from_monitor(struct channel_info *chan_info);
87e8ae9b66SAlan Carew 
88e8ae9b66SAlan Carew #ifdef __cplusplus
89e8ae9b66SAlan Carew }
90e8ae9b66SAlan Carew #endif
91e8ae9b66SAlan Carew 
92e8ae9b66SAlan Carew 
93e8ae9b66SAlan Carew #endif /* CHANNEL_MONITOR_H_ */
94