Lines Matching +full:auto +full:- +full:mode

10 #include <phosphor-logging/elog-errors.hpp>
11 #include <phosphor-logging/lg2.hpp>
13 #include <xyz/openbmc_project/Control/Power/Mode/server.hpp>
30 using Mode = sdbusplus::xyz::openbmc_project::Control::Power::server::Mode; typedef
35 #define VALID_POWER_MODE_SETTING(mode) \ argument
36 ((mode == SysPwrMode::STATIC) || (mode == SysPwrMode::POWER_SAVING) || \
37 (mode == SysPwrMode::BALANCED_PERF) || (mode == SysPwrMode::MAX_PERF) || \
38 (mode == SysPwrMode::EFF_FAVOR_POWER) || \
39 (mode == SysPwrMode::EFF_FAVOR_PERF))
41 #define VALID_OEM_POWER_MODE_SETTING(mode) \ argument
42 ((mode == SysPwrMode::SFP) || (mode == SysPwrMode::FFO) || \
43 (mode == SysPwrMode::MAX_FREQ) || \
44 (mode == SysPwrMode::NON_DETERMINISTIC))
46 #define IS_ECO_MODE(mode) \ argument
47 ((mode == SysPwrMode::EFF_FAVOR_POWER) || \
48 (mode == SysPwrMode::EFF_FAVOR_PERF))
59 [this](auto& msg) { this->ipsChanged(msg); }), in PowerMode()
64 [this](auto& msg) { this->defaultsReady(msg); }), in __anonc4163ab30202()
72 using Mode = typedef
73 sdbusplus::xyz::openbmc_project::Control::Power::server::Mode;
76 {Mode::PowerMode::Static, Mode::PowerMode::MaximumPerformance,
77 Mode::PowerMode::PowerSaving});
82 // Read the persisted power mode
85 // Validate persisted mode is supported
88 // Update power mode on DBus and create IPS object if allowed
93 lg2::error("PowerMode: Persisted power mode ({MODE}/{DATA}) is not "
94 "valid. Reading system default mode",
95 "MODE", currentMode, "DATA", oemModeData);
97 // Read default power mode
158 occInstance = path.back() - '0'; in setMasterOcc()
169 // Set the state of power mode lock. Writing persistent data via dbus method.
172 lg2::info("PowerMode::powerModeLock: locking mode change"); in powerModeLock()
177 // Get the state of power mode. Reading persistent data via dbus method.
191 lg2::info("PowerMode::setMode: mode change blocked"); in setMode()
197 // Unsupported mode in setMode()
201 // Save mode in setMode()
204 // Send mode change to OCC in setMode()
207 // Mode change failed in setMode()
214 // Convert PowerMode value to occ-control internal SysPwrMode
215 // Returns SysPwrMode::NO_CHANGE if mode not valid
216 SysPwrMode getInternalMode(const Mode::PowerMode& mode) in getInternalMode() argument
218 if (mode == Mode::PowerMode::MaximumPerformance) in getInternalMode()
222 else if (mode == Mode::PowerMode::PowerSaving) in getInternalMode()
226 else if (mode == Mode::PowerMode::Static) in getInternalMode()
230 else if (mode == Mode::PowerMode::EfficiencyFavorPower) in getInternalMode()
234 else if (mode == Mode::PowerMode::EfficiencyFavorPerformance) in getInternalMode()
238 else if (mode == Mode::PowerMode::BalancedPerformance) in getInternalMode()
248 // Returns NO_CHANGE if OEM or unsupported mode
254 Mode::PowerMode newPMode = in convertStringToMode()
255 Mode::convertPowerModeFromString(i_modeString); in convertStringToMode()
261 auto prefix = PMODE_INTERFACE + ".PowerMode."s; in convertStringToMode()
287 "convertStringToMode: Invalid Power Mode: {MODE} ({DATA})", in convertStringToMode()
288 "MODE", shortMode, "DATA", e.what()); in convertStringToMode()
300 constexpr auto HYPE_PATH = "/com/ibm/host0/hypervisor"; in isPowerVM()
301 constexpr auto HYPE_INTERFACE = "com.ibm.Host.Target"; in isPowerVM()
302 constexpr auto HYPE_PROP = "Target"; in isPowerVM()
305 auto& bus = utils::getBus(); in isPowerVM()
306 auto service = utils::getService(HYPE_PATH, HYPE_INTERFACE); in isPowerVM()
307 auto method = bus.new_method_call(service.c_str(), HYPE_PATH, in isPowerVM()
310 auto reply = bus.call(method); in isPowerVM()
312 auto hyperEntryValue = reply.unpack<std::variant<std::string>>(); in isPowerVM()
314 auto propVal = std::get<std::string>(hyperEntryValue); in isPowerVM()
332 // Read the default mode in initPersistentData()
339 lg2::info("PowerMode::initPersistentData: Using default mode: {MODE}", in initPersistentData()
340 "MODE", currentMode); in initPersistentData()
342 // Save default mode as current mode in initPersistentData()
345 // Write default mode to DBus and create IPS object if allowed in initPersistentData()
358 // Get the requested power mode and return true if successful
378 // Set the power mode on DBus and create IPS object if allowed/needed
384 "PowerMode::updateDbusMode - Requested power mode not supported: {MODE}", in updateDbusMode()
385 "MODE", newMode); in updateDbusMode()
389 ModeInterface::PowerMode dBusMode = Mode::PowerMode::OEM; in updateDbusMode()
392 // Convert mode for DBus in updateDbusMode()
396 dBusMode = Mode::PowerMode::Static; in updateDbusMode()
399 dBusMode = Mode::PowerMode::PowerSaving; in updateDbusMode()
402 dBusMode = Mode::PowerMode::MaximumPerformance; in updateDbusMode()
405 dBusMode = Mode::PowerMode::EfficiencyFavorPower; in updateDbusMode()
408 dBusMode = Mode::PowerMode::EfficiencyFavorPerformance; in updateDbusMode()
411 dBusMode = Mode::PowerMode::BalancedPerformance; in updateDbusMode()
417 // else return OEM mode in updateDbusMode()
434 // Send mode change request to the master OCC
476 // Mode change is only supported on PowerVM systems in sendModeChange()
478 "PowerMode::sendModeChange: MODE CHANGE does not get sent on non-PowerVM systems"); in sendModeChange()
490 cmd.push_back(oemModeData >> 8); // Mode Data (Freq Point) in sendModeChange()
494 "PowerMode::sendModeChange: SET_MODE({MODE},{DATA}) command to OCC{INST} ({LEN} bytes)", in sendModeChange()
495 "MODE", uint8_t(newMode), "DATA", oemModeData, "INST", occInstance, in sendModeChange()
497 status = occCmd->send(cmd, rsp); in sendModeChange()
506 // Successful mode change and IPS is now allowed, so in sendModeChange()
514 "PowerMode::sendModeChange: SET MODE failed with status {STATUS}", in sendModeChange()
523 "PowerMode::sendModeChange: INVALID SET MODE response"); in sendModeChange()
538 "PowerMode::sendModeChange: Unable to set power mode to {MODE}", in sendModeChange()
539 "MODE", newMode); in sendModeChange()
564 "ipsChanged: Idle Power Saver can not be modified in an ECO power mode"); in ipsChanged()
569 auto ipsEntry = ipsProperties.find(IPS_ENABLED_PROP); in ipsChanged()
572 ipsEnabled = std::get<bool>(ipsEntry->second); in ipsChanged()
580 enterUtil = std::get<uint8_t>(ipsEntry->second); in ipsChanged()
588 std::chrono::milliseconds ms(std::get<uint64_t>(ipsEntry->second)); in ipsChanged()
598 exitUtil = std::get<uint8_t>(ipsEntry->second); in ipsChanged()
606 std::chrono::milliseconds ms(std::get<uint64_t>(ipsEntry->second)); in ipsChanged()
670 …"ERROR: Idle Power Saver Enter Utilization ({ENTER}%) is > Exit Utilization ({EXIT}%) - using Exit… in getIPSParms()
686 ipsObject->setPropertyByName(IPS_ENABLED_PROP, enabled, true); in updateDbusIPS()
687 ipsObject->setPropertyByName(IPS_ENTER_UTIL, enterUtil, true); in updateDbusIPS()
690 ipsObject->setPropertyByName(IPS_ENTER_TIME, msTime, true); in updateDbusIPS()
691 ipsObject->setPropertyByName(IPS_EXIT_UTIL, exitUtil, true); in updateDbusIPS()
693 ipsObject->setPropertyByName(IPS_EXIT_TIME, msTime, true); in updateDbusIPS()
716 "PowerMode::sendIpsData: SET_CFG_DATA[IPS] does not get sent on non-PowerVM systems"); in sendIpsData()
724 "PowerMode::sendIpsData: Skipping IPS data due to being in an ECO Power Mode"); in sendIpsData()
755 CmdStatus status = occCmd->send(cmd, rsp); in sendIpsData()
797 "OccPersistData: Mode: {MODE}, OEM Mode Data: {DATA} ({DATAHEX} Locked{LOCK})", in print()
798 "MODE", lg2::hex, uint8_t(modeData.mode), "DATA", in print()
812 // Saves the OEM mode data in the filesystem using cereal.
824 "OccPersistData::save: Writing Power Mode persisted data to {FILE}", in save()
834 // Loads the OEM mode data in the filesystem using cereal.
848 "OccPersistData::load: Reading Power Mode persisted data from {FILE}", in load()
858 auto error = errno; in load()
877 // Validate persisted mode is supported in defaultsReady()
884 … "defaultsReady: Persisted power mode ({MODE}/{DATA}) is not valid. Reading system default mode", in defaultsReady()
885 "MODE", pMode, "DATA", oemModeData); in defaultsReady()
898 // Read default power mode defaults and update DBus in defaultsReady()
903 // Get the default power mode from DBus and return true if success
908 auto& bus = utils::getBus(); in getDefaultMode()
912 auto method = in getDefaultMode()
916 auto reply = bus.call(method); in getDefaultMode()
918 auto stateEntryValue = reply.unpack<std::variant<std::string>>(); in getDefaultMode()
920 auto propVal = std::get<std::string>(stateEntryValue); in getDefaultMode()
928 "default power mode found: {MODE}", in getDefaultMode()
929 "MODE", defaultMode); in getDefaultMode()
937 lg2::error("Unable to read Default Power Mode: {ERR}", "ERR", e.what()); in getDefaultMode()
962 auto& bus = utils::getBus(); in getDefaultIPSParms()
966 auto method = in getDefaultIPSParms()
970 auto reply = bus.call(method); in getDefaultIPSParms()
981 auto ipsEntry = ipsProperties.find("IdlePowerSaverEnabled"); in getDefaultIPSParms()
984 ipsEnabled = std::get<bool>(ipsEntry->second); in getDefaultIPSParms()
995 enterUtil = std::get<uint64_t>(ipsEntry->second); in getDefaultIPSParms()
1006 enterTime = std::get<uint64_t>(ipsEntry->second); in getDefaultIPSParms()
1017 exitUtil = std::get<uint64_t>(ipsEntry->second); in getDefaultIPSParms()
1028 exitTime = std::get<uint64_t>(ipsEntry->second); in getDefaultIPSParms()
1039 …le Power Saver Enter Utilization ({ENTER}%) is > Exit Utilization ({EXIT}%) - using Exit for both", in getDefaultIPSParms()
1099 ipsObject->active(false); in openIpsFile()
1135 ipsObject->active(false); in removeIpsWatch()
1152 auto r = sd_event_add_io(event.get(), &sourcePtr, fd, EPOLLPRI | EPOLLERR, in registerIpsStatusCallBack()
1157 r, "STR", strerror(-r), "FILE", ipsStatusFile); in registerIpsStatusCallBack()
1181 auto pmode = static_cast<PowerMode*>(userData); in ipsStatusCallBack()
1182 pmode->analyzeIpsEvent(); in ipsStatusCallBack()
1191 auto r = lseek(fd, 0, SEEK_SET); in analyzeIpsEvent()
1195 // NOTE: upon file access error we can not just re-open file, we have to in analyzeIpsEvent()
1201 // if we are 'watching' that is the file seek, or the re-open passed.. we in analyzeIpsEvent()
1209 const auto len = read(fd, &data, sizeof(data)); in analyzeIpsEvent()
1237 // mask off bit 6 --> & 0x02 in analyzeIpsEvent()
1245 ipsObject->active(ipsState); in analyzeIpsEvent()
1266 Mode::PowerMode PowerMode::powerMode(Mode::PowerMode requestedMode) in powerMode()
1270 lg2::info("PowerMode::powerMode: mode property change blocked"); in powerMode()
1272 "mode change not allowed due to lock")); in powerMode()
1276 // Verify requested mode is allowed in powerMode()
1282 // Validate it is an allowed customer mode in powerMode()
1285 // Update persisted data with new mode in powerMode()
1288 lg2::info("DBus PowerMode Changed: {MODE}", "MODE", in powerMode()
1291 // Send mode change to OCC in powerMode()
1298 "PowerMode change not allowed. {MODE} is not in AllowedPowerModes", in powerMode()
1299 "MODE", convertPowerModeToString(requestedMode)); in powerMode()
1312 "PowerMode not valid. {MODE} is not in AllowedPowerModes", in powerMode()
1313 "MODE", convertPowerModeToString(requestedMode)); in powerMode()
1315 Argument::ARGUMENT_VALUE("INVALID MODE")); in powerMode()
1321 return Mode::powerMode(requestedMode); in powerMode()
1324 /* Set dbus property to SAFE mode(true) or clear(false) only if different
1332 Mode::safeMode(safeModeReq); in updateDbusSafeMode()
1343 // Get all power mode properties from DBus in getSupportedModes()
1346 auto& bus = utils::getBus(); in getSupportedModes()
1350 auto method = in getSupportedModes()
1354 auto reply = bus.call(method); in getSupportedModes()
1365 auto ecoSupport = powerModeProperties.find("EcoModeSupport"); in getSupportedModes()
1368 ecoModeSupport = std::get<bool>(ecoSupport->second); in getSupportedModes()
1374 using PMode = sdbusplus::xyz::openbmc_project::Control::Power::server::Mode; in getSupportedModes()
1376 auto custList = powerModeProperties.find("CustomerModes"); in getSupportedModes()
1380 auto modeList = std::get<std::vector<std::string>>(custList->second); in getSupportedModes()
1381 for (auto mode : modeList) in getSupportedModes() local
1383 // Ensure mode is valid in getSupportedModes()
1385 PMODE_INTERFACE + POWERMODE_STRING + mode; in getSupportedModes()
1386 lg2::info("getSupportedModes(): {MODE}", "MODE", mode); in getSupportedModes()
1397 // Add mode to list in getSupportedModes()
1407 "getSupportedModes(): Ignoring unsupported customer mode {MODE}", in getSupportedModes()
1408 "MODE", mode); in getSupportedModes()
1418 auto oemList = powerModeProperties.find("OemModes"); in getSupportedModes()
1422 auto OmodeList = std::get<std::vector<std::string>>(oemList->second); in getSupportedModes()
1423 for (auto mode : OmodeList) in getSupportedModes() local
1425 // Ensure mode is valid in getSupportedModes()
1427 PMODE_INTERFACE + POWERMODE_STRING + mode; in getSupportedModes()
1439 // Add mode to list in getSupportedModes()
1445 "getSupportedModes(): Ignoring unsupported OEM mode {MODE}", in getSupportedModes()
1446 "MODE", mode); in getSupportedModes()
1454 bool PowerMode::isValidMode(const SysPwrMode mode) in isValidMode() argument
1456 if (customerModeList.contains(mode) || oemModeList.contains(mode)) in isValidMode()