diff options
author | Kirill Pakhomov <k.pakhomov@yadro.com> | 2018-11-06 16:06:10 +0300 |
---|---|---|
committer | Vernon Mauery <vernon.mauery@linux.intel.com> | 2019-02-12 21:07:41 +0000 |
commit | 2c2af2ca713f56b117ad2c8c1a1f0e370b7c2d9c (patch) | |
tree | 5ec0d267d553129d09b79681eccaa8f5c127865d /dcmihandler.cpp | |
parent | a257362278c2a92676f7ef8b774d2dc3fb382fb2 (diff) | |
download | phosphor-host-ipmid-2c2af2ca713f56b117ad2c8c1a1f0e370b7c2d9c.tar.gz phosphor-host-ipmid-2c2af2ca713f56b117ad2c8c1a1f0e370b7c2d9c.zip |
dcmihandler: Add DCMI Power management support check
According to section 6.6 Power management of DCMI specification,
if power management feature is disabled,
the related commands (Get/Set/Activate/Deactive Power Limit)
should be unsupported.
Change-Id: I887f33babb2fe7a1ab97bb2d0720a693171e48a1
Signed-off-by: Kirill Pakhomov <k.pakhomov@yadro.com>
Diffstat (limited to 'dcmihandler.cpp')
-rw-r--r-- | dcmihandler.cpp | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/dcmihandler.cpp b/dcmihandler.cpp index 7a4db9f..e9cc39a 100644 --- a/dcmihandler.cpp +++ b/dcmihandler.cpp @@ -65,6 +65,13 @@ static const std::map<uint8_t, std::string> entityIdToName{ {0x40, "inlet"}, {0x37, "inlet"}, {0x41, "cpu"}, {0x03, "cpu"}, {0x42, "baseboard"}, {0x07, "baseboard"}}; +bool isDCMIPowerMgmtSupported() +{ + auto data = parseJSONConfig(gDCMICapabilitiesConfig); + + return (gDCMIPowerMgmtSupported == data.value(gDCMIPowerMgmtCapability, 0)); +} + uint32_t getPcap(sdbusplus::bus::bus& bus) { auto settingService = ipmi::getService(bus, PCAP_INTERFACE, PCAP_PATH); @@ -298,6 +305,13 @@ ipmi_ret_t getPowerLimit(ipmi_netfn_t netfn, ipmi_cmd_t cmd, ipmi_request_t request, ipmi_response_t response, ipmi_data_len_t data_len, ipmi_context_t context) { + if (!dcmi::isDCMIPowerMgmtSupported()) + { + *data_len = 0; + log<level::ERR>("DCMI Power management is unsupported!"); + return IPMI_CC_INVALID; + } + auto requestData = reinterpret_cast<const dcmi::GetPowerLimitRequest*>(request); std::vector<uint8_t> outPayload(sizeof(dcmi::GetPowerLimitResponse)); @@ -359,6 +373,13 @@ ipmi_ret_t setPowerLimit(ipmi_netfn_t netfn, ipmi_cmd_t cmd, ipmi_request_t request, ipmi_response_t response, ipmi_data_len_t data_len, ipmi_context_t context) { + if (!dcmi::isDCMIPowerMgmtSupported()) + { + *data_len = 0; + log<level::ERR>("DCMI Power management is unsupported!"); + return IPMI_CC_INVALID; + } + auto requestData = reinterpret_cast<const dcmi::SetPowerLimitRequest*>(request); std::vector<uint8_t> outPayload(sizeof(dcmi::SetPowerLimitResponse)); @@ -398,6 +419,13 @@ ipmi_ret_t applyPowerLimit(ipmi_netfn_t netfn, ipmi_cmd_t cmd, ipmi_request_t request, ipmi_response_t response, ipmi_data_len_t data_len, ipmi_context_t context) { + if (!dcmi::isDCMIPowerMgmtSupported()) + { + *data_len = 0; + log<level::ERR>("DCMI Power management is unsupported!"); + return IPMI_CC_INVALID; + } + auto requestData = reinterpret_cast<const dcmi::ApplyPowerLimitRequest*>(request); std::vector<uint8_t> outPayload(sizeof(dcmi::ApplyPowerLimitResponse)); @@ -1220,6 +1248,13 @@ ipmi_ret_t getPowerReading(ipmi_netfn_t netfn, ipmi_cmd_t cmd, ipmi_request_t request, ipmi_response_t response, ipmi_data_len_t data_len, ipmi_context_t context) { + if (!dcmi::isDCMIPowerMgmtSupported()) + { + *data_len = 0; + log<level::ERR>("DCMI Power management is unsupported!"); + return IPMI_CC_INVALID; + } + ipmi_ret_t rc = IPMI_CC_OK; auto requestData = reinterpret_cast<const dcmi::GetPowerReadingRequest*>(request); |