diff --git a/src/power_control.cpp b/src/power_control.cpp index 586d1e3..b671b23 100644 --- a/src/power_control.cpp +++ b/src/power_control.cpp @@ -558,6 +558,58 @@ static constexpr std::string_view getChassisState(const PowerState state) break; } }; + +static void powerStateLog(const PowerState state) +{ + constexpr const char* selService = "xyz.openbmc_project.Logging.IPMI"; + constexpr const char* selPath = "/xyz/openbmc_project/Logging/IPMI"; + constexpr const char* selInterface = "xyz.openbmc_project.Logging.IPMI"; + constexpr const char* selMethod = "IpmiSelAdd"; + constexpr const char* sensorPath = + "/xyz/openbmc_project/inventory/system/board/Lux_Baseboard/ACPI_State"; + + auto bus = sdbusplus::bus::new_default(); + std::string stateStr = std::string(getChassisState(state)); + + auto method = + bus.new_method_call(selService, selPath, selInterface, selMethod); + + method.append("SEL Entry"); + method.append(sensorPath); + + if (stateStr == "xyz.openbmc_project.State.Chassis.PowerState.On") + { + std::cerr << "Send Power State On SEL Log\n"; + method.append( + std::array({0x00, 0xFF, 0xFF})); // S0/G0: working + } + else if (stateStr == "xyz.openbmc_project.State.Chassis.PowerState.Off") + { + std::cerr << "Send Power State Off SEL Log\n"; + method.append( + std::array({0x06, 0xFF, 0xFF})); // S4/S5: soft-off + } + else + { + std::cerr << "Send Power State SEL Log Error\n"; + return; + } + + method.append(true); // assert is true and deassert is false + method.append(uint16_t(0x0020)); // generator ID + try + { + bus.call_noreply(method); + } + catch (const sdbusplus::exception::SdBusError& ex) + { + lg2::error( + "Failed to call sel log {SELPATH}, {SELINTERFACE}, {SELMRTHOD}", + "SELPATH", selPath, "SELINTERFACE", selInterface, "SELMRTHOD", + selMethod); + } +} + #ifdef CHASSIS_SYSTEM_RESET enum class SlotPowerState { @@ -1890,6 +1942,7 @@ static void powerStateWaitForPSPowerOK(const Event event) else { setPowerState(PowerState::on); + powerStateLog(PowerState::on); } break; } @@ -1941,6 +1994,7 @@ static void powerStateOff(const Event event) else { setPowerState(PowerState::on); + powerStateLog(PowerState::on); } break; } @@ -1975,6 +2029,7 @@ static void powerStateTransitionToOff(const Event event) // Cancel any GPIO assertions held during the transition gpioAssertTimer.cancel(); setPowerState(PowerState::off); + powerStateLog(PowerState::off); break; default: lg2::info("No action taken."); @@ -2064,6 +2119,7 @@ static void powerStateTransitionToCycleOff(const Event event) // Cancel any GPIO assertions held during the transition gpioAssertTimer.cancel(); setPowerState(PowerState::cycleOff); + powerStateLog(PowerState::cycleOff); powerCycleTimerStart(); break; default: