power: extend guest channel for frequency query

Extend incoming packet reading API with new packet
type which carries CPU frequencies.

Signed-off-by: Marcin Hajkowski <marcinx.hajkowski@intel.com>
Tested-by: David Hunt <david.hunt@intel.com>
Acked-by: Lee Daly <lee.daly@intel.com>
This commit is contained in:
Marcin Hajkowski 2019-09-27 13:15:58 +01:00 committed by Thomas Monjalon
parent e4d028a0fb
commit 04a8cb8ee9
4 changed files with 55 additions and 17 deletions

View File

@ -151,7 +151,7 @@ check_response_cmd(unsigned int lcore_id, int *result)
struct channel_packet pkt; struct channel_packet pkt;
int ret; int ret;
ret = rte_power_guest_channel_receive_msg(&pkt, lcore_id); ret = rte_power_guest_channel_receive_msg(&pkt, sizeof pkt, lcore_id);
if (ret < 0) if (ret < 0)
return -1; return -1;

View File

@ -12,6 +12,8 @@ extern "C" {
#include <stdint.h> #include <stdint.h>
#include <stdbool.h> #include <stdbool.h>
/* --- Incoming messages --- */
/* Valid Commands */ /* Valid Commands */
#define CPU_POWER 1 #define CPU_POWER 1
#define CPU_POWER_CONNECT 2 #define CPU_POWER_CONNECT 2
@ -26,10 +28,19 @@ extern "C" {
#define CPU_POWER_ENABLE_TURBO 5 #define CPU_POWER_ENABLE_TURBO 5
#define CPU_POWER_DISABLE_TURBO 6 #define CPU_POWER_DISABLE_TURBO 6
/* CPU Power Queries */
#define CPU_POWER_QUERY_FREQ_LIST 7
#define CPU_POWER_QUERY_FREQ 8
/* --- Outgoing messages --- */
/* Generic Power Command Response */ /* Generic Power Command Response */
#define CPU_POWER_CMD_ACK 1 #define CPU_POWER_CMD_ACK 1
#define CPU_POWER_CMD_NACK 2 #define CPU_POWER_CMD_NACK 2
/* CPU Power Query Responses */
#define CPU_POWER_FREQ_LIST 3
#define HOURS 24 #define HOURS 24
#define MAX_VFS 10 #define MAX_VFS 10
@ -82,6 +93,16 @@ struct channel_packet {
struct t_boost_status t_boost_status; struct t_boost_status t_boost_status;
}; };
struct channel_packet_freq_list {
uint64_t resource_id; /**< core_num, device */
uint32_t unit; /**< scale down/up/min/max */
uint32_t command; /**< Power, IO, etc */
char vm_name[VM_MAX_NAME_SZ];
uint32_t freq_list[MAX_VCPU_PER_VM];
uint8_t num_vcpu;
};
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -129,13 +129,15 @@ int rte_power_guest_channel_send_msg(struct channel_packet *pkt,
return guest_channel_send_msg(pkt, lcore_id); return guest_channel_send_msg(pkt, lcore_id);
} }
int power_guest_channel_read_msg(struct channel_packet *pkt, int power_guest_channel_read_msg(void *pkt,
unsigned int lcore_id) size_t pkt_len,
unsigned int lcore_id)
{ {
int ret; int ret;
struct pollfd fds; struct pollfd fds;
void *buffer = pkt;
int buffer_len = sizeof(*pkt); if (pkt_len == 0 || pkt == NULL)
return -1;
fds.fd = global_fds[lcore_id]; fds.fd = global_fds[lcore_id];
fds.events = POLLIN; fds.events = POLLIN;
@ -161,29 +163,32 @@ int power_guest_channel_read_msg(struct channel_packet *pkt,
return -1; return -1;
} }
while (buffer_len > 0) { while (pkt_len > 0) {
ret = read(global_fds[lcore_id], ret = read(global_fds[lcore_id],
buffer, buffer_len); pkt, pkt_len);
if (ret < 0) { if (ret < 0) {
if (errno == EINTR) if (errno == EINTR)
continue; continue;
return -1; return -1;
} }
if (ret == 0) { if (ret == 0) {
RTE_LOG(ERR, GUEST_CHANNEL, "Expected more data, but connection has been closed.\n"); RTE_LOG(ERR, GUEST_CHANNEL, "Expected more data, but connection has been closed.\n");
return -1; return -1;
} }
buffer = (char *)buffer + ret; pkt = (char *)pkt + ret;
buffer_len -= ret; pkt_len -= ret;
} }
return 0; return 0;
} }
int rte_power_guest_channel_receive_msg(struct channel_packet *pkt, int rte_power_guest_channel_receive_msg(void *pkt,
unsigned int lcore_id) size_t pkt_len,
unsigned int lcore_id)
{ {
return power_guest_channel_read_msg(pkt, lcore_id); return power_guest_channel_read_msg(pkt, pkt_len, lcore_id);
} }
void void

View File

@ -17,6 +17,7 @@ extern "C" {
* *
* @param path * @param path
* The path to the serial device on the filesystem * The path to the serial device on the filesystem
*
* @param lcore_id * @param lcore_id
* lcore_id. * lcore_id.
* *
@ -73,7 +74,11 @@ int rte_power_guest_channel_send_msg(struct channel_packet *pkt,
* from the host endpoint. * from the host endpoint.
* *
* @param pkt * @param pkt
* Pointer to a populated struct channel_packet * Pointer to channel_packet or
* channel_packet_freq_list struct.
*
* @param pkt_len
* Size of expected data packet.
* *
* @param lcore_id * @param lcore_id
* lcore_id. * lcore_id.
@ -82,7 +87,8 @@ int rte_power_guest_channel_send_msg(struct channel_packet *pkt,
* - 0 on success. * - 0 on success.
* - Negative on error. * - Negative on error.
*/ */
int power_guest_channel_read_msg(struct channel_packet *pkt, int power_guest_channel_read_msg(void *pkt,
size_t pkt_len,
unsigned int lcore_id); unsigned int lcore_id);
/** /**
@ -90,7 +96,11 @@ int power_guest_channel_read_msg(struct channel_packet *pkt,
* from the host endpoint. * from the host endpoint.
* *
* @param pkt * @param pkt
* Pointer to a populated struct channel_packet * Pointer to channel_packet or
* channel_packet_freq_list struct.
*
* @param pkt_len
* Size of expected data packet.
* *
* @param lcore_id * @param lcore_id
* lcore_id. * lcore_id.
@ -101,8 +111,10 @@ int power_guest_channel_read_msg(struct channel_packet *pkt,
*/ */
__rte_experimental __rte_experimental
int int
rte_power_guest_channel_receive_msg(struct channel_packet *pkt, rte_power_guest_channel_receive_msg(void *pkt,
unsigned int lcore_id); size_t pkt_len,
unsigned int lcore_id);
#ifdef __cplusplus #ifdef __cplusplus
} }