New upstream version 17.11-rc3
[deb_dpdk.git] / examples / vm_power_manager / guest_cli / vm_power_cli_guest.c
index 7931135..63f711e 100644 (file)
 #include <cmdline.h>
 #include <rte_log.h>
 #include <rte_lcore.h>
+#include <rte_ethdev.h>
 
 #include <rte_power.h>
+#include <guest_channel.h>
 
 #include "vm_power_cli_guest.h"
 
@@ -108,6 +110,10 @@ cmd_set_cpu_freq_parsed(void *parsed_result, struct cmdline *cl,
                ret = rte_power_freq_min(res->lcore_id);
        else if (!strcmp(res->cmd , "max"))
                ret = rte_power_freq_max(res->lcore_id);
+       else if (!strcmp(res->cmd, "enable_turbo"))
+               ret = rte_power_freq_enable_turbo(res->lcore_id);
+       else if (!strcmp(res->cmd, "disable_turbo"))
+               ret = rte_power_freq_disable_turbo(res->lcore_id);
        if (ret != 1)
                cmdline_printf(cl, "Error sending message: %s\n", strerror(ret));
 }
@@ -120,13 +126,14 @@ cmdline_parse_token_string_t cmd_set_cpu_freq_core_num =
                        lcore_id, UINT8);
 cmdline_parse_token_string_t cmd_set_cpu_freq_cmd_cmd =
        TOKEN_STRING_INITIALIZER(struct cmd_set_cpu_freq_result,
-                       cmd, "up#down#min#max");
+                       cmd, "up#down#min#max#enable_turbo#disable_turbo");
 
 cmdline_parse_inst_t cmd_set_cpu_freq_set = {
        .f = cmd_set_cpu_freq_parsed,
        .data = NULL,
-       .help_str = "set_cpu_freq <core_num> <up|down|min|max>, Set the current "
-                       "frequency for the specified core by scaling up/down/min/max",
+       .help_str = "set_cpu_freq <core_num> "
+                       "<up|down|min|max|enable_turbo|disable_turbo>, "
+                       "adjust the frequency for the specified core.",
        .tokens = {
                (void *)&cmd_set_cpu_freq,
                (void *)&cmd_set_cpu_freq_core_num,
@@ -135,8 +142,103 @@ cmdline_parse_inst_t cmd_set_cpu_freq_set = {
        },
 };
 
+struct cmd_send_policy_result {
+       cmdline_fixed_string_t send_policy;
+       cmdline_fixed_string_t cmd;
+};
+
+union PFID {
+       struct ether_addr addr;
+       uint64_t pfid;
+};
+
+static inline int
+send_policy(void)
+{
+       struct channel_packet pkt;
+       int ret;
+
+       union PFID pfid;
+       /* Use port MAC address as the vfid */
+       rte_eth_macaddr_get(0, &pfid.addr);
+       printf("Port %u MAC: %02" PRIx8 ":%02" PRIx8 ":%02" PRIx8 ":"
+                       "%02" PRIx8 ":%02" PRIx8 ":%02" PRIx8 "\n",
+                       1,
+                       pfid.addr.addr_bytes[0], pfid.addr.addr_bytes[1],
+                       pfid.addr.addr_bytes[2], pfid.addr.addr_bytes[3],
+                       pfid.addr.addr_bytes[4], pfid.addr.addr_bytes[5]);
+       pkt.vfid[0] = pfid.pfid;
+
+       pkt.nb_mac_to_monitor = 1;
+       pkt.t_boost_status.tbEnabled = false;
+
+       pkt.vcpu_to_control[0] = 0;
+       pkt.vcpu_to_control[1] = 1;
+       pkt.num_vcpu = 2;
+       /* Dummy Population. */
+       pkt.traffic_policy.min_packet_thresh = 96000;
+       pkt.traffic_policy.avg_max_packet_thresh = 1800000;
+       pkt.traffic_policy.max_max_packet_thresh = 2000000;
+
+       pkt.timer_policy.busy_hours[0] = 3;
+       pkt.timer_policy.busy_hours[1] = 4;
+       pkt.timer_policy.busy_hours[2] = 5;
+       pkt.timer_policy.quiet_hours[0] = 11;
+       pkt.timer_policy.quiet_hours[1] = 12;
+       pkt.timer_policy.quiet_hours[2] = 13;
+
+       pkt.timer_policy.hours_to_use_traffic_profile[0] = 8;
+       pkt.timer_policy.hours_to_use_traffic_profile[1] = 10;
+
+       pkt.workload = LOW;
+       pkt.policy_to_use = TIME;
+       pkt.command = PKT_POLICY;
+       strcpy(pkt.vm_name, "ubuntu2");
+       ret = rte_power_guest_channel_send_msg(&pkt, 1);
+       if (ret == 0)
+               return 1;
+       RTE_LOG(DEBUG, POWER, "Error sending message: %s\n",
+                       ret > 0 ? strerror(ret) : "channel not connected");
+       return -1;
+}
+
+static void
+cmd_send_policy_parsed(void *parsed_result, struct cmdline *cl,
+                      __attribute__((unused)) void *data)
+{
+       int ret = -1;
+       struct cmd_send_policy_result *res = parsed_result;
+
+       if (!strcmp(res->cmd, "now")) {
+               printf("Sending Policy down now!\n");
+               ret = send_policy();
+       }
+       if (ret != 1)
+               cmdline_printf(cl, "Error sending message: %s\n",
+                               strerror(ret));
+}
+
+cmdline_parse_token_string_t cmd_send_policy =
+       TOKEN_STRING_INITIALIZER(struct cmd_send_policy_result,
+                       send_policy, "send_policy");
+cmdline_parse_token_string_t cmd_send_policy_cmd_cmd =
+       TOKEN_STRING_INITIALIZER(struct cmd_send_policy_result,
+                       cmd, "now");
+
+cmdline_parse_inst_t cmd_send_policy_set = {
+       .f = cmd_send_policy_parsed,
+       .data = NULL,
+       .help_str = "send_policy now",
+       .tokens = {
+               (void *)&cmd_send_policy,
+               (void *)&cmd_send_policy_cmd_cmd,
+               NULL,
+       },
+};
+
 cmdline_parse_ctx_t main_ctx[] = {
                (cmdline_parse_inst_t *)&cmd_quit,
+               (cmdline_parse_inst_t *)&cmd_send_policy_set,
                (cmdline_parse_inst_t *)&cmd_set_cpu_freq_set,
                NULL,
 };