Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause 2 : : * Copyright(c) 2010-2014 Intel Corporation 3 : : */ 4 : : #include <errno.h> 5 : : #include <string.h> 6 : : 7 : : #include <rte_log.h> 8 : : 9 : : #include "rte_power_guest_channel.h" 10 : : #include "guest_channel.h" 11 : : #include "power_common.h" 12 : : #include "power_kvm_vm.h" 13 : : 14 : : #define FD_PATH "/dev/virtio-ports/virtio.serial.port.poweragent" 15 : : 16 : : static struct rte_power_channel_packet pkt[RTE_MAX_LCORE]; 17 : : 18 : : int 19 : 0 : power_kvm_vm_check_supported(void) 20 : : { 21 : 0 : return guest_channel_host_check_exists(FD_PATH); 22 : : } 23 : : 24 : : int 25 : 3 : power_kvm_vm_init(unsigned int lcore_id) 26 : : { 27 [ + + ]: 3 : if (lcore_id >= RTE_MAX_LCORE) { 28 : 1 : POWER_LOG(ERR, "Core(%u) is out of range 0...%d", 29 : : lcore_id, RTE_MAX_LCORE-1); 30 : 1 : return -1; 31 : : } 32 : 2 : pkt[lcore_id].command = RTE_POWER_CPU_POWER; 33 : 2 : pkt[lcore_id].resource_id = lcore_id; 34 : 2 : return guest_channel_host_connect(FD_PATH, lcore_id); 35 : : } 36 : : 37 : : int 38 : 0 : power_kvm_vm_exit(unsigned int lcore_id) 39 : : { 40 : 0 : guest_channel_host_disconnect(lcore_id); 41 : 0 : return 0; 42 : : } 43 : : 44 : : uint32_t 45 : 0 : power_kvm_vm_freqs(__rte_unused unsigned int lcore_id, 46 : : __rte_unused uint32_t *freqs, 47 : : __rte_unused uint32_t num) 48 : : { 49 : 0 : POWER_LOG(ERR, "rte_power_freqs is not implemented " 50 : : "for Virtual Machine Power Management"); 51 : 0 : return -ENOTSUP; 52 : : } 53 : : 54 : : uint32_t 55 : 0 : power_kvm_vm_get_freq(__rte_unused unsigned int lcore_id) 56 : : { 57 : 0 : POWER_LOG(ERR, "rte_power_get_freq is not implemented " 58 : : "for Virtual Machine Power Management"); 59 : 0 : return -ENOTSUP; 60 : : } 61 : : 62 : : int 63 : 0 : power_kvm_vm_set_freq(__rte_unused unsigned int lcore_id, 64 : : __rte_unused uint32_t index) 65 : : { 66 : 0 : POWER_LOG(ERR, "rte_power_set_freq is not implemented " 67 : : "for Virtual Machine Power Management"); 68 : 0 : return -ENOTSUP; 69 : : } 70 : : 71 : : static inline int 72 : 0 : send_msg(unsigned int lcore_id, uint32_t scale_direction) 73 : : { 74 : : int ret; 75 : : 76 [ # # ]: 0 : if (lcore_id >= RTE_MAX_LCORE) { 77 : 0 : POWER_LOG(ERR, "Core(%u) is out of range 0...%d", 78 : : lcore_id, RTE_MAX_LCORE-1); 79 : 0 : return -1; 80 : : } 81 : 0 : pkt[lcore_id].unit = scale_direction; 82 : 0 : ret = guest_channel_send_msg(&pkt[lcore_id], lcore_id); 83 [ # # ]: 0 : if (ret == 0) 84 : : return 1; 85 [ # # ]: 0 : POWER_LOG(DEBUG, "Error sending message: %s", 86 : : ret > 0 ? strerror(ret) : "channel not connected"); 87 : 0 : return -1; 88 : : } 89 : : 90 : : int 91 : 0 : power_kvm_vm_freq_up(unsigned int lcore_id) 92 : : { 93 : 0 : return send_msg(lcore_id, RTE_POWER_SCALE_UP); 94 : : } 95 : : 96 : : int 97 : 0 : power_kvm_vm_freq_down(unsigned int lcore_id) 98 : : { 99 : 0 : return send_msg(lcore_id, RTE_POWER_SCALE_DOWN); 100 : : } 101 : : 102 : : int 103 : 0 : power_kvm_vm_freq_max(unsigned int lcore_id) 104 : : { 105 : 0 : return send_msg(lcore_id, RTE_POWER_SCALE_MAX); 106 : : } 107 : : 108 : : int 109 : 0 : power_kvm_vm_freq_min(unsigned int lcore_id) 110 : : { 111 : 0 : return send_msg(lcore_id, RTE_POWER_SCALE_MIN); 112 : : } 113 : : 114 : : int 115 : 0 : power_kvm_vm_turbo_status(__rte_unused unsigned int lcore_id) 116 : : { 117 : 0 : POWER_LOG(ERR, "rte_power_turbo_status is not implemented for Virtual Machine Power Management"); 118 : 0 : return -ENOTSUP; 119 : : } 120 : : 121 : : int 122 : 0 : power_kvm_vm_enable_turbo(unsigned int lcore_id) 123 : : { 124 : 0 : return send_msg(lcore_id, RTE_POWER_ENABLE_TURBO); 125 : : } 126 : : 127 : : int 128 : 0 : power_kvm_vm_disable_turbo(unsigned int lcore_id) 129 : : { 130 : 0 : return send_msg(lcore_id, RTE_POWER_DISABLE_TURBO); 131 : : } 132 : : 133 : : struct rte_power_core_capabilities; 134 : 0 : int power_kvm_vm_get_capabilities(__rte_unused unsigned int lcore_id, 135 : : __rte_unused struct rte_power_core_capabilities *caps) 136 : : { 137 : 0 : POWER_LOG(ERR, "rte_power_get_capabilities is not implemented for Virtual Machine Power Management"); 138 : 0 : return -ENOTSUP; 139 : : }