summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKirill Pakhomov <k.pakhomov@yadro.com>2018-11-06 16:06:10 +0300
committerVernon Mauery <vernon.mauery@linux.intel.com>2019-02-12 21:07:41 +0000
commit2c2af2ca713f56b117ad2c8c1a1f0e370b7c2d9c (patch)
tree5ec0d267d553129d09b79681eccaa8f5c127865d
parenta257362278c2a92676f7ef8b774d2dc3fb382fb2 (diff)
downloadphosphor-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>
-rw-r--r--dcmihandler.cpp35
-rw-r--r--dcmihandler.hpp9
2 files changed, 44 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);
diff --git a/dcmihandler.hpp b/dcmihandler.hpp
index e3fa9de..8b16e3d 100644
--- a/dcmihandler.hpp
+++ b/dcmihandler.hpp
@@ -56,6 +56,8 @@ static constexpr auto systemPath = "/org/freedesktop/systemd1";
static constexpr auto systemIntf = "org.freedesktop.systemd1.Manager";
static constexpr auto gDCMICapabilitiesConfig =
"/usr/share/ipmi-providers/dcmi_cap.json";
+static constexpr auto gDCMIPowerMgmtCapability = "PowerManagement";
+static constexpr auto gDCMIPowerMgmtSupported = 0x1;
namespace assettag
{
@@ -161,6 +163,13 @@ struct SetAssetTagResponse
uint8_t tagLength; //!< Total asset tag length.
} __attribute__((packed));
+/** @brief Check whether DCMI power management is supported
+ * in the DCMI Capabilities config file.
+ *
+ * @return True if DCMI power management is supported
+ */
+bool isDCMIPowerMgmtSupported();
+
/** @brief Read the object tree to fetch the object path that implemented the
* Asset tag interface.
*
OpenPOWER on IntegriCloud