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