crypto/octeontx2: support CN98xx
[dpdk.git] / examples / vm_power_manager / channel_monitor.c
index e8d12d1..228f068 100644 (file)
 #include <rte_atomic.h>
 #include <rte_cycles.h>
 #include <rte_ethdev.h>
-#ifdef RTE_LIBRTE_I40E_PMD
+#ifdef RTE_NET_I40E
 #include <rte_pmd_i40e.h>
 #endif
+#include <rte_power.h>
 
 #include <libvirt/libvirt.h>
 #include "channel_monitor.h"
@@ -438,7 +439,7 @@ get_pfid(struct policy *pol)
        for (i = 0; i < pol->pkt.nb_mac_to_monitor; i++) {
 
                RTE_ETH_FOREACH_DEV(x) {
-#ifdef RTE_LIBRTE_I40E_PMD
+#ifdef RTE_NET_I40E
                        ret = rte_pmd_i40e_query_vfid_by_mac(x,
                                (struct rte_ether_addr *)&(pol->pkt.vfid[i]));
 #else
@@ -537,13 +538,13 @@ get_pkt_diff(struct policy *pol)
                vsi_pkt_count_prev_total = 0;
        double rdtsc_curr, rdtsc_diff, diff;
        int x;
-#ifdef RTE_LIBRTE_I40E_PMD
+#ifdef RTE_NET_I40E
        struct rte_eth_stats vf_stats;
 #endif
 
        for (x = 0; x < pol->pkt.nb_mac_to_monitor; x++) {
 
-#ifdef RTE_LIBRTE_I40E_PMD
+#ifdef RTE_NET_I40E
                /*Read vsi stats*/
                if (rte_pmd_i40e_get_vf_stats(x, pol->pfid[x], &vf_stats) == 0)
                        vsi_pkt_count = vf_stats.ipackets;
@@ -749,6 +750,60 @@ send_freq(struct channel_packet *pkt,
                        chan_info);
 }
 
+static int
+send_capabilities(struct channel_packet *pkt,
+               struct channel_info *chan_info,
+               bool list_requested)
+{
+       unsigned int vcore_id = pkt->resource_id;
+       struct channel_packet_caps_list channel_pkt_caps_list;
+       struct vm_info info;
+       struct rte_power_core_capabilities caps;
+       int ret;
+
+       if (get_info_vm(pkt->vm_name, &info) != 0)
+               return -1;
+
+       if (!list_requested && vcore_id >= MAX_VCPU_PER_VM)
+               return -1;
+
+       if (!info.allow_query)
+               return -1;
+
+       channel_pkt_caps_list.command = CPU_POWER_CAPS_LIST;
+       channel_pkt_caps_list.num_vcpu = info.num_vcpus;
+
+       if (list_requested) {
+               unsigned int i;
+               for (i = 0; i < info.num_vcpus; i++) {
+                       ret = rte_power_get_capabilities(info.pcpu_map[i],
+                                       &caps);
+                       if (ret == 0) {
+                               channel_pkt_caps_list.turbo[i] =
+                                               caps.turbo;
+                               channel_pkt_caps_list.priority[i] =
+                                               caps.priority;
+                       } else
+                               return -1;
+
+               }
+       } else {
+               ret = rte_power_get_capabilities(info.pcpu_map[vcore_id],
+                               &caps);
+               if (ret == 0) {
+                       channel_pkt_caps_list.turbo[vcore_id] =
+                                       caps.turbo;
+                       channel_pkt_caps_list.priority[vcore_id] =
+                                       caps.priority;
+               } else
+                       return -1;
+       }
+
+       return write_binary_packet(&channel_pkt_caps_list,
+                       sizeof(channel_pkt_caps_list),
+                       chan_info);
+}
+
 static int
 send_ack_for_received_cmd(struct channel_packet *pkt,
                struct channel_info *chan_info,
@@ -813,7 +868,7 @@ process_request(struct channel_packet *pkt, struct channel_info *chan_info)
                if (valid_unit) {
                        ret = send_ack_for_received_cmd(pkt,
                                        chan_info,
-                                       scale_res > 0 ?
+                                       scale_res >= 0 ?
                                                CPU_POWER_CMD_ACK :
                                                CPU_POWER_CMD_NACK);
                        if (ret < 0)
@@ -857,6 +912,18 @@ process_request(struct channel_packet *pkt, struct channel_info *chan_info)
                        RTE_LOG(ERR, CHANNEL_MONITOR, "Error during frequency sending.\n");
        }
 
+       if (pkt->command == CPU_POWER_QUERY_CAPS_LIST ||
+               pkt->command == CPU_POWER_QUERY_CAPS) {
+
+               RTE_LOG(INFO, CHANNEL_MONITOR,
+                       "Capabilities for %s requested.\n", pkt->vm_name);
+               int ret = send_capabilities(pkt,
+                               chan_info,
+                               pkt->command == CPU_POWER_QUERY_CAPS_LIST);
+               if (ret < 0)
+                       RTE_LOG(ERR, CHANNEL_MONITOR, "Error during sending capabilities.\n");
+       }
+
        /*
         * Return is not checked as channel status may have been set to DISABLED
         * from management thread