Allow restoring default Idle Power Saver parameters
When the IdlePowerSaver ExitUtilizationPercent is set to 0, the factory
default Idle Power Saver parameters will be restored and used.
curl -k -X PATCH -d '{"IdlePowerSaver":{"ExitUtilizationPercent":0}}' https://$bmc/redfish/v1/Systems/system
Tested on Everest HW.
Signed-off-by: Chris Cain <cjcain@us.ibm.com>
Change-Id: Iddc650140c684aaf8f4986919ffc7ce9f18b5a52
diff --git a/powermode.cpp b/powermode.cpp
index fd8679d..7db3565 100644
--- a/powermode.cpp
+++ b/powermode.cpp
@@ -195,28 +195,9 @@
if (!persistedData.ipsAvailable())
{
- // Read the default IPS parameters
- bool ipsEnabled;
- uint8_t enterUtil, exitUtil;
- uint16_t enterTime, exitTime;
- if (!getDefaultIPSParms(ipsEnabled, enterUtil, enterTime, exitUtil,
- exitTime))
- {
- // Unable to read defaults
- return false;
- }
- log<level::INFO>(
- fmt::format(
- "PowerMode::initPersistentData: Using default IPS parms: Enabled: {}, EnterUtil: {}%, EnterTime: {}s, ExitUtil: {}%, ExitTime: {}s",
- ipsEnabled, enterUtil, enterTime, exitUtil, exitTime)
- .c_str());
-
- // Save IPS
- persistedData.updateIPS(ipsEnabled, enterUtil, enterTime, exitUtil,
- exitTime);
-
- // Write default IPS data to DBus
- updateDbusIPS(ipsEnabled, enterUtil, enterTime, exitUtil, exitTime);
+ // Read the default IPS parameters, write persistent file and update
+ // DBus
+ return useDefaultIPSParms();
}
return true;
}
@@ -373,12 +354,6 @@
void PowerMode::ipsChanged(sdbusplus::message::message& msg)
{
- if (!masterActive || !masterOccSet)
- {
- // Nothing to do
- return;
- }
-
bool parmsChanged = false;
std::string interface;
std::map<std::string, std::variant<bool, uint8_t, uint64_t>>
@@ -443,9 +418,22 @@
if (parmsChanged)
{
- // Update persistant data with new DBus values
- persistedData.updateIPS(ipsEnabled, enterUtil, enterTime, exitUtil,
- exitTime);
+ if (exitUtil == 0)
+ {
+ // Setting the exitUtil to 0 will force restoring the default IPS
+ // parmeters (0 is not valid exit utilization)
+ log<level::INFO>(
+ "Idle Power Saver Exit Utilization is 0%. Restoring default parameters");
+ // Read the default IPS parameters, write persistent file and update
+ // DBus
+ useDefaultIPSParms();
+ }
+ else
+ {
+ // Update persistant data with new DBus values
+ persistedData.updateIPS(ipsEnabled, enterUtil, enterTime, exitUtil,
+ exitTime);
+ }
// Trigger IPS data to get sent to the OCC
sendIpsData();
@@ -600,6 +588,7 @@
return status;
}
+// Print the current values
void OccPersistData::print()
{
if (modeData.modeInitialized)
@@ -638,7 +627,7 @@
"OccPersistData::save: Writing Power Mode persisted data to {}",
opath.c_str())
.c_str());
- print();
+ // print();
std::ofstream stream{opath.c_str()};
cereal::JSONOutputArchive oarchive{stream};
@@ -682,7 +671,7 @@
modeData.ipsInitialized = false;
}
- print();
+ // print();
}
// Called when PowerModeProperties defaults are available on DBus
@@ -859,6 +848,34 @@
return true;
}
+/* Read default IPS parameters, save them to the persistent file and update
+ DBus. Return true if successful */
+bool PowerMode::useDefaultIPSParms()
+{
+ // Read the default IPS parameters
+ bool ipsEnabled;
+ uint8_t enterUtil, exitUtil;
+ uint16_t enterTime, exitTime;
+ if (!getDefaultIPSParms(ipsEnabled, enterUtil, enterTime, exitUtil,
+ exitTime))
+ {
+ // Unable to read defaults
+ return false;
+ }
+ log<level::INFO>(
+ fmt::format(
+ "PowerMode::useDefaultIPSParms: Using default IPS parms: Enabled: {}, EnterUtil: {}%, EnterTime: {}s, ExitUtil: {}%, ExitTime: {}s",
+ ipsEnabled, enterUtil, enterTime, exitUtil, exitTime)
+ .c_str());
+
+ // Save IPS parms to the persistent file
+ persistedData.updateIPS(ipsEnabled, enterUtil, enterTime, exitUtil,
+ exitTime);
+
+ // Write IPS parms to DBus
+ return updateDbusIPS(ipsEnabled, enterUtil, enterTime, exitUtil, exitTime);
+}
+
} // namespace powermode
} // namespace occ
diff --git a/powermode.hpp b/powermode.hpp
index b212184..d15eea7 100644
--- a/powermode.hpp
+++ b/powermode.hpp
@@ -188,7 +188,7 @@
return (modeData.modeInitialized);
}
- /** @brief Return true if the power mode is available */
+ /** @brief Return true if the IPS data is available */
bool ipsAvailable()
{
return (modeData.ipsInitialized);
@@ -428,6 +428,13 @@
bool getDefaultIPSParms(bool& enabled, uint8_t& enterUtil,
uint16_t& enterTime, uint8_t& exitUtil,
uint16_t& exitTime);
+
+ /** @brief Read the default Idle Power Saver parameters and save them to the
+ * DBUS so they will get used
+ *
+ * @return true if restore was successful
+ */
+ bool useDefaultIPSParms();
};
} // namespace powermode