From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <dev-bounces@dpdk.org>
Received: from dpdk.org (dpdk.org [92.243.14.124])
	by dpdk.space (Postfix) with ESMTP id 206C2A045E
	for <public@inbox.dpdk.org>; Thu, 30 May 2019 18:16:30 +0200 (CEST)
Received: from [92.243.14.124] (localhost [127.0.0.1])
	by dpdk.org (Postfix) with ESMTP id 3D6CC1B94C;
	Thu, 30 May 2019 18:16:18 +0200 (CEST)
Received: from mga06.intel.com (mga06.intel.com [134.134.136.31])
 by dpdk.org (Postfix) with ESMTP id 0EE60493D
 for <dev@dpdk.org>; Thu, 30 May 2019 18:16:13 +0200 (CEST)
X-Amp-Result: SKIPPED(no attachment in message)
X-Amp-File-Uploaded: False
Received: from orsmga001.jf.intel.com ([10.7.209.18])
 by orsmga104.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384;
 30 May 2019 09:16:12 -0700
X-ExtLoop1: 1
Received: from mhajkowx-mobl.ger.corp.intel.com ([10.104.14.177])
 by orsmga001.jf.intel.com with ESMTP; 30 May 2019 09:16:11 -0700
From: Hajkowski <marcinx.hajkowski@intel.com>
To: david.hunt@intel.com
Cc: dev@dpdk.org,
	Marcin Hajkowski <marcinx.hajkowski@intel.com>
Date: Thu, 30 May 2019 18:15:16 +0200
Message-Id: <20190530161517.11916-3-marcinx.hajkowski@intel.com>
X-Mailer: git-send-email 2.20.1.windows.1
In-Reply-To: <20190530161517.11916-1-marcinx.hajkowski@intel.com>
References: <20190530161517.11916-1-marcinx.hajkowski@intel.com>
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit
Subject: [dpdk-dev] [PATCH 2/3] examples/power_manager: send cpu
	capabilities on vm request
X-BeenThere: dev@dpdk.org
X-Mailman-Version: 2.1.15
Precedence: list
List-Id: DPDK patches and discussions <dev.dpdk.org>
List-Unsubscribe: <https://mails.dpdk.org/options/dev>,
 <mailto:dev-request@dpdk.org?subject=unsubscribe>
List-Archive: <http://mails.dpdk.org/archives/dev/>
List-Post: <mailto:dev@dpdk.org>
List-Help: <mailto:dev-request@dpdk.org?subject=help>
List-Subscribe: <https://mails.dpdk.org/listinfo/dev>,
 <mailto:dev-request@dpdk.org?subject=subscribe>
Errors-To: dev-bounces@dpdk.org
Sender: "dev" <dev-bounces@dpdk.org>

From: Marcin Hajkowski <marcinx.hajkowski@intel.com>

Send capabilities for requested cores.

Signed-off-by: Marcin Hajkowski <marcinx.hajkowski@intel.com>
---
 examples/vm_power_manager/channel_monitor.c | 67 +++++++++++++++++++++
 1 file changed, 67 insertions(+)

diff --git a/examples/vm_power_manager/channel_monitor.c b/examples/vm_power_manager/channel_monitor.c
index bfd9cc38d..731b3b480 100644
--- a/examples/vm_power_manager/channel_monitor.c
+++ b/examples/vm_power_manager/channel_monitor.c
@@ -29,6 +29,7 @@
 #include <rte_cycles.h>
 #include <rte_ethdev.h>
 #include <rte_pmd_i40e.h>
+#include <rte_power.h>
 
 #include <libvirt/libvirt.h>
 #include "channel_monitor.h"
@@ -704,6 +705,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,
@@ -812,6 +867,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
-- 
2.17.2