diff --git a/common/inc/pwrdata.h b/common/inc/pwrdata.h index 724886272e3411b139e71ad930135b69719c38be..c712140af401172883a339cc67106ca9302f2d21 100644 --- a/common/inc/pwrdata.h +++ b/common/inc/pwrdata.h @@ -77,6 +77,12 @@ typedef struct PWR_COM_BasicDcTaskInfo { int interval; } PWR_COM_BasicDcTaskInfo; +typedef struct PWR_SYS_PowerInfo { + double sysPower; + double cpuPower; + double memPower; +} PWR_SYS_PowerInfo; + typedef struct PWR_CPU_NumaInfo { int nodeNo; char cpuList[MAX_CPU_LIST_LEN]; diff --git a/common/inc/pwrmsg.h b/common/inc/pwrmsg.h index beb0bd3d7db07879e48c4fc8c5d45ff86b931165..83666923e7d95e6ab1955f41a2f5f3d718c94b5e 100644 --- a/common/inc/pwrmsg.h +++ b/common/inc/pwrmsg.h @@ -52,6 +52,7 @@ enum OperationType { COM_REQUEST_CONTROL_AUTH, COM_RELEASE_CONTROL_AUTH, SYS_SET_POWER_STATE = 100, + SYS_GET_RT_POWER, CPU_GET_INFO = 200, CPU_GET_USAGE, CPU_GET_PERF_DATA, diff --git a/pwrapic/inc/powerapi.h b/pwrapic/inc/powerapi.h index aacd05bf5b7b0940e870a8926ecc915fd11e9866..ad916a0f36026dd560f9dc78b8ae3b6bc40154a6 100644 --- a/pwrapic/inc/powerapi.h +++ b/pwrapic/inc/powerapi.h @@ -39,6 +39,7 @@ PWR_API int PWR_ReleaseControlAuth(void); // SYS PWR_API int PWR_SYS_SetPowerState(int powerState); +PWR_API int PWR_SYS_GetRtPowerInfo(PWR_SYS_PowerInfo *powerInfo); // CPU PWR_API int PWR_CPU_GetInfo(PWR_CPU_Info *cpuInfo); diff --git a/pwrapic/inc/pwrsys.h b/pwrapic/inc/pwrsys.h index e371b98a3e24a96a3006e8a328a69a7e3fc0866b..cdef9cadbf31d01fdacf2e60989d2c5a598107ac 100644 --- a/pwrapic/inc/pwrsys.h +++ b/pwrapic/inc/pwrsys.h @@ -19,4 +19,5 @@ #include "pwrdata.h" int SetSysPowerState(int powerState); +int GetSysRtPowerInfo(PWR_SYS_PowerInfo *powerInfo); #endif diff --git a/pwrapic/src/powerapi.c b/pwrapic/src/powerapi.c index 76bea2d4079c18cc6ae22de26c70b62642ad69ab..4ebbe383684ca59b5684763198a2e62e6964ae17 100644 --- a/pwrapic/src/powerapi.c +++ b/pwrapic/src/powerapi.c @@ -152,6 +152,13 @@ int PWR_SYS_SetPowerState(int powerState) return SetSysPowerState(powerState); } +int PWR_SYS_GetRtPowerInfo(PWR_SYS_PowerInfo *powerInfo) +{ + CHECK_STATUS(STATUS_REGISTERTED); + CHECK_NULL_POINTER(powerInfo); + return GetSysRtPowerInfo(powerInfo); +} + int PWR_CPU_GetInfo(PWR_CPU_Info *cpuInfo) { CHECK_STATUS(STATUS_REGISTERTED); diff --git a/pwrapic/src/pwrsys.c b/pwrapic/src/pwrsys.c index 29bda1bb4579707b059e71443e090878c4b10376..bf770d8baace5fb3d8e83e0738c180ed3e452923 100644 --- a/pwrapic/src/pwrsys.c +++ b/pwrapic/src/pwrsys.c @@ -43,4 +43,24 @@ int SetSysPowerState(int powerState) PwrLog(DEBUG, "SetSysPowerState Succeed."); } return ret; +} + + +int GetSysRtPowerInfo(PWR_SYS_PowerInfo *powerInfo) +{ + ReqInputParam input; + input.optType = SYS_GET_RT_POWER; + input.dataLen = 0; + input.data = NULL; + RspOutputParam output; + uint32_t size = sizeof(PWR_SYS_PowerInfo); + output.rspBuffSize = &size; + output.rspData = (void *)powerInfo; + int ret = SendReqAndWaitForRsp(input, output); + if (ret != SUCCESS) { + PwrLog(ERROR, "GetSysRtPower failed. ret:%d", ret); + } else { + PwrLog(DEBUG, "GetSysRtPower Succeed."); + } + return ret; } \ No newline at end of file diff --git a/pwrapic/test/demo_main.c b/pwrapic/test/demo_main.c index 218a85c16f37340c5c4941860a7949bb66347591..96cb398000d89d21717f3780cd436fc0f4ea6915 100644 --- a/pwrapic/test/demo_main.c +++ b/pwrapic/test/demo_main.c @@ -113,6 +113,19 @@ static void TEST_SYS_SetPowerState(void) printf("PWR_SYS_SetPowerState ret: %d\n", ret); } +static void TEST_SYS_GetRtPowerInfo(void) +{ + int ret; + PWR_SYS_PowerInfo *u = (PWR_SYS_PowerInfo *)malloc(sizeof(PWR_SYS_PowerInfo)); + if (!u) { + return; + } + bzero(u, sizeof(PWR_SYS_PowerInfo)); + ret = PWR_SYS_GetRtPowerInfo(u); + printf("PWR_SYS_GetRtPower ret: %d, SYS power:%f\n", ret, u->sysPower); + free(u); +} + // PWR_CPU_GetUsage static void TEST_PWR_CPU_GetInfo(void) { @@ -291,6 +304,7 @@ int main(int argc, const char *args[]) // PWR_CPU_GetFreqGovernor PWR_CPU_SetFreqGovernor TEST_PWR_CPU_SetAndGetFreqGov(); + TEST_SYS_GetRtPowerInfo(); // TEST_SYS_SetPowerState(); // PWR_CPU_GetCurFreq PWR_CPU_SetCurFreq // TEST_PWR_CPU_SetAndGetCurFreq(); diff --git a/pwrapis/inc/config.h b/pwrapis/inc/config.h index d970e701cd477209925faa6a5488acb1396678a0..b6732483c6b563a226fe40f283ce85ddc7e6c11f 100644 --- a/pwrapis/inc/config.h +++ b/pwrapis/inc/config.h @@ -12,8 +12,8 @@ * Create: 2022-06-23 * Description: provide configuration service * **************************************************************************** */ -#ifndef __PAPIS_CONFIG_H__ -#define __PAPIS_CONFIG_H__ +#ifndef PAPIS_CONFIG_H__ +#define PAPIS_CONFIG_H__ #include #include "common.h" #include "list.h" diff --git a/pwrapis/inc/cpuservice.h b/pwrapis/inc/cpuservice.h index 12740aa96f52f9a97940fdba93e0dda58aa97f1b..2a252f09b623a786ab2116c30651142ac3af55c9 100644 --- a/pwrapis/inc/cpuservice.h +++ b/pwrapis/inc/cpuservice.h @@ -12,11 +12,12 @@ * Create: 2022-06-23 * Description: provide cpu service * **************************************************************************** */ -#ifndef __PAPIS_CPU_SERVICE_H__ -#define __PAPIS_CPU_SERVICE_H__ +#ifndef PAPIS_CPU_SERVICE_H__ +#define PAPIS_CPU_SERVICE_H__ #include "pwrmsg.h" #include "pwrdata.h" +int GetArch(void); void GetCpuinfo(PwrMsg *req); void GetCpuUsage(PwrMsg *req); void GetCpuPerfData(PwrMsg *req); diff --git a/pwrapis/inc/diskservice.h b/pwrapis/inc/diskservice.h index 1c2f22559b396e277c969d446a34cfe23ee8ba96..25409ffb321ae0b4e3ad33d03afab9567723a215 100644 --- a/pwrapis/inc/diskservice.h +++ b/pwrapis/inc/diskservice.h @@ -12,8 +12,8 @@ * Create: 2022-08-22 * Description: provide disk service * **************************************************************************** */ -#ifndef __PAPIS_DISK_SERVICE_H__ -#define __PAPIS_DISK_SERVICE_H__ +#ifndef PAPIS_DISK_SERVICE_H__ +#define PAPIS_DISK_SERVICE_H__ #include #include "config.h" #include "pwrmsg.h" diff --git a/pwrapis/inc/gather.h b/pwrapis/inc/gather.h index 314a1902a6cb0b66c085120d91c9a39cadc69e77..64de0b70f6bba98bfbeb41efd3a16001ab21d169 100644 --- a/pwrapis/inc/gather.h +++ b/pwrapis/inc/gather.h @@ -12,8 +12,8 @@ * Create: 2022-08-26 * Description: provide cpu collect methods ******************************************************************************/ -#ifndef __GATHER_H__ -#define __GATHER_H__ +#ifndef GATHER_H__ +#define GATHER_H__ #include #include diff --git a/pwrapis/inc/log.h b/pwrapis/inc/log.h index bcd5da8eb515abb2c29090583557e9065fad5e03..cca316e56aa7674370886a4b49ca46186877f37d 100644 --- a/pwrapis/inc/log.h +++ b/pwrapis/inc/log.h @@ -12,8 +12,8 @@ * Create: 2022-06-23 * Description: provide log interface * **************************************************************************** */ -#ifndef __PAPIS_LOG_H__ -#define __PAPIS_LOG_H__ +#ifndef PAPIS_LOG_H__ +#define PAPIS_LOG_H__ #include "config.h" diff --git a/pwrapis/inc/pwrclient.h b/pwrapis/inc/pwrclient.h index a162e93e20d7c3e5d272029ff65cdbd746d936b2..a1f9320356b5b949fca2b1e8995b0a664aac4e72 100644 --- a/pwrapis/inc/pwrclient.h +++ b/pwrapis/inc/pwrclient.h @@ -12,8 +12,8 @@ * Create: 2022-06-23 * Description: pwrclient manager. pwrclient refers to the socket connection info. * **************************************************************************** */ -#ifndef __PAPIS_CLIENT_H__ -#define __PAPIS_CLIENT_H__ +#ifndef PAPIS_CLIENT_H__ +#define PAPIS_CLIENT_H__ #include typedef struct PwrClient { diff --git a/pwrapis/inc/server.h b/pwrapis/inc/server.h index b7db609649a147a5ebbf162c853c021396623b4e..162b7ae2f2e7d212b46d33ba8cd74b87356d27d6 100644 --- a/pwrapis/inc/server.h +++ b/pwrapis/inc/server.h @@ -12,8 +12,8 @@ * Create: 2022-06-23 * Description: provide server methods * **************************************************************************** */ -#ifndef __PAPIS_SERVER_H__ -#define __PAPIS_SERVER_H__ +#ifndef PAPIS_SERVER_H__ +#define PAPIS_SERVER_H__ #include #include #include "pwrmsg.h" diff --git a/pwrapis/inc/sysservice.h b/pwrapis/inc/sysservice.h index cdfc96b63c79c0111e46b13f0271ed296a8be9c9..aa88d8c0b85910838293408bcbbf33201321c831 100644 --- a/pwrapis/inc/sysservice.h +++ b/pwrapis/inc/sysservice.h @@ -12,11 +12,12 @@ * Create: 2022-11-10 * Description: provide sys service * **************************************************************************** */ -#ifndef __PAPIS_SYS_SERVICE_H__ -#define __PAPIS_SYS_SERVICE_H__ +#ifndef PAPIS_SYS_SERVICE_H__ +#define PAPIS_SYS_SERVICE_H__ #include "pwrmsg.h" #include "pwrdata.h" int PowerSet(char *state); void SetSysPowerState(PwrMsg *req); +void GetSysRtPowerInfo(PwrMsg *req); #endif diff --git a/pwrapis/inc/utils.h b/pwrapis/inc/utils.h index 4818dc190d65729e87d794c86b8edea6c8fd301f..1dfab9a4df03774221a96f45e3d000d0b38d02d1 100644 --- a/pwrapis/inc/utils.h +++ b/pwrapis/inc/utils.h @@ -12,8 +12,8 @@ * Create: 2022-06-23 * Description: provide common methods * **************************************************************************** */ -#ifndef __UTILS_H__ -#define __UTILS_H__ +#ifndef UTILS_H__ +#define UTILS_H__ #include #include #include diff --git a/pwrapis/src/server.c b/pwrapis/src/server.c index 89e68c8cf874ed8fe39dad87bf77a63c14dd4c2a..21c4d8d16289ab0b70144e62ba0d7773cedbea71 100644 --- a/pwrapis/src/server.c +++ b/pwrapis/src/server.c @@ -351,6 +351,9 @@ static void ProcessReqMsg(PwrMsg *req) case SYS_SET_POWER_STATE: SetSysPowerState(req); break; + case SYS_GET_RT_POWER: + GetSysRtPowerInfo(req); + break; case CPU_GET_USAGE: GetCpuUsage(req); break; diff --git a/pwrapis/src/sysservice.c b/pwrapis/src/sysservice.c index 4756e673c9a9a6ce41ce35a4355f29c23ed8658a..81012d8080dfa7b3acfc850640a93ae6c8ca3232 100644 --- a/pwrapis/src/sysservice.c +++ b/pwrapis/src/sysservice.c @@ -20,8 +20,9 @@ #include "log.h" #include "unistd.h" #include "utils.h" +#include "cpuservice.h" -int PowerSet(char *powerState) +static int PowerSet(char *powerState) { FILE *fp = NULL; char *stateStr = malloc(strlen(powerState) + MAX_NAME_LEN); @@ -42,6 +43,48 @@ int PowerSet(char *powerState) return SUCCESS; } +static int IpmiRead(const char *componentInfo, double *result) +{ + FILE *fp = NULL; + fp = popen(componentInfo, "r"); + if (fp == NULL) { + return ERR_COMMON; + } + char buf[MAX_STRING_LEN]; + if (fgets(buf, sizeof(buf) - 1, fp) == NULL) { + return ERR_COMMON; + } + DeleteChar(buf, '\n'); + DeleteChar(buf, ' '); + *result = atof(buf); + pclose(fp); + return SUCCESS; +} + +static int SysRtPowerRead(PWR_SYS_PowerInfo *rstData) +{ + static const char sysPowerInfo[] = + "printf \"%d\" 0x$(ipmitool raw 0x30 0x93 0xdb 0x07 0x00 0x11 0x0 | awk \'{print $7$6$5$4}\')"; + static const char cpuPowerInfo[] = + "printf \"%d\" 0x$(ipmitool raw 0x30 0x93 0xdb 0x07 0x00 0x11 0x4 | awk \'{print $5$4}\')"; + static const char memPowerInfo[] = + "printf \"%d\" 0x$(ipmitool raw 0x30 0x93 0xdb 0x07 0x00 0x11 0x5 | awk \'{print $5$4}\')"; + double sysPower; + if (IpmiRead(sysPowerInfo, &sysPower)) { + return ERR_COMMON; + } + rstData->sysPower = sysPower; + if (GetArch() == 1) { + double cpuPower, memPower; + if (IpmiRead(cpuPowerInfo, &cpuPower) || IpmiRead(memPowerInfo, &memPower)) { + return ERR_COMMON; + } + rstData->cpuPower = cpuPower; + rstData->memPower = memPower; + } + return SUCCESS; +} + void SetSysPowerState(PwrMsg *req) { if (!req) { @@ -60,3 +103,19 @@ void SetSysPowerState(PwrMsg *req) ReleasePwrMsg(&rsp); } } + +void GetSysRtPowerInfo(PwrMsg *req) +{ + if (!req) { + return; + } + Logger(DEBUG, MD_NM_SVR_SYS, "Get Get Sys Rt Power Req. seqId:%u, sysId:%d", req->head.seqId, req->head.sysId); + PWR_SYS_PowerInfo *rstData = malloc(sizeof(PWR_SYS_PowerInfo)); + if (!rstData) { + return; + } + rstData->cpuPower = 0.0; + rstData->memPower = 0.0; + int rspCode = SysRtPowerRead(rstData); + SendRspToClient(req, rspCode, (char *)rstData, sizeof(PWR_SYS_PowerInfo)); +}