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>
diff --git a/dcmihandler.cpp b/dcmihandler.cpp
index 7a4db9f..e9cc39a 100644
--- a/dcmihandler.cpp
+++ b/dcmihandler.cpp
@@ -65,6 +65,13 @@
     {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_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_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_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_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);