Hi, Lei YU<br><br>Thanks a lot for your advices! The steps are very clear and helps me very much!<br><br>Best Regards!<br>Liu Hongwei<div><div><br></div><div style="font-size: 12px;font-family: Arial Narrow;padding:2px 0 2px 0;">------------------ 原始邮件 ------------------</div><div style="font-size: 12px;background:#efefef;padding:8px;"><div><b>发件人:</b> "mine260309"<mine260309@gmail.com>;</div><div><b>发送时间:</b> 2020年2月14日(星期五) 上午10:40</div><div><b>收件人:</b> "南野ムルシエラゴ"<1181052146@qq.com>;<wbr></div><div><b>抄送:</b> "openbmc"<openbmc@lists.ozlabs.org>;<wbr></div><div><b>主题:</b> Re: how softpoweroff works for openbmc</div></div><div><br></div>I had a summary of how the soft-off works, please see below.<br><br>---<br><br>On OpenPOWER systems, the soft-off is implemented by<br>phosphor-softpoweroff in phosphor-host-ipmid/softoff.<br>The whole steps are described as below:<br><br>1. To power off the host gracefully, BMC sets  RequestedHostTransition<br>to Off implemented by phosphor-host-state-manager.<br>   https://github.com/openbmc/phosphor-state-manager/blob/c101157e5b138f36044a2a3aaf15ad8ac16501fc/host_state_manager.cpp#L316<br>2. phosphor-host-state-manager starts obmc-host-shutdown@0.target<br>3. The target depends on<br>xyz.openbmc_project.Ipmi.Internal.SoftPowerOff.service, and it comes<br>to phosphor-softpoweroff.<br>4. phosphor-softpoweroff invokes sendHostShutDownCmd(), that calls the<br>"Execute" method of "xyz.openbmc_project.Control.Host".<br>   https://github.com/openbmc/phosphor-host-ipmid/blob/51f781418013b993f4b3d5c1572ce19a5b93edf0/softoff/softoff.cpp#L32<br>5. The host control service (implemented in host-cmd-manager.cpp) puts<br>the command in a queue and invokes checkQueueAndAlertHost(), which<br>invokes "setAttention" method of "org.openbmc.HostIpmi".<br>   https://github.com/openbmc/phosphor-host-ipmid/blob/51f781418013b993f4b3d5c1572ce19a5b93edf0/host-cmd-manager.cpp#L112<br>6. btbridged implements setAttention(), and it sends SMS ATN message<br>to host via IPMI BT.<br>   https://github.com/openbmc/btbridge/blob/aa5511d28ff9acee4a404c6397d09f5187812ed8/btbridged.c#L261<br>7. Then the Host received the attention, so it reads messages from BMC.<br>8. BMC's ipmid's ipmi_app_read_event() is invoked, and the queued SOFT<br>OFF command is sent to the Host, and sends a CommandComplete signal on<br>DBus.<br>   https://github.com/openbmc/phosphor-host-ipmid/blob/51f781418013b993f4b3d5c1572ce19a5b93edf0/systemintfcmds.cpp#L23<br>9. phosphor-softpoweroff registers the signal, so the callback<br>hostControlEvent() is invoked, which starts a timer (configurable by<br>IPMI_HOST_SHUTDOWN_COMPLETE_TIMEOUT_SECS).<br>   When it times out, the BMC will shutdown the chassis power.<br>   https://github.com/openbmc/phosphor-host-ipmid/blob/51f781418013b993f4b3d5c1572ce19a5b93edf0/softoff/softoff.cpp#L75<br>10. When the Host OS is shutdown, it sends the chassis control's<br>CMD_POWER_OFF message via IPMI.<br>11. The ipmid invokes stop_soft_off_timer(),and sets the property<br>"ResponseReceived" to "SoftPowerOff.HostResponse.HostShutdown".<br>   https://github.com/openbmc/phosphor-host-ipmid/blob/51f781418013b993f4b3d5c1572ce19a5b93edf0/chassishandler.cpp#L1159<br>12. In phosphor-softpoweroff, responseReceived() is invoked, stops the<br>timer, and the process exits normally.<br>    https://github.com/openbmc/phosphor-host-ipmid/blob/51f781418013b993f4b3d5c1572ce19a5b93edf0/softoff/softoff.cpp#L118<br>13. Then systemd will execute the other dependent<br>obmc-chassis-poweroff@.target, which shutdowns the chassis power.<br><br><br>On Thu, Feb 13, 2020 at 11:20 PM 南野ムルシエラゴ <1181052146@qq.com> wrote:<br>><br>> Greetings:<br>> I am learning how power control works in openbmc system. It comes to poweroff sequence. I found that for poweroff there are "poweroff" and "softpoweroff".<br>> 1. for "poweroff", I found the call path:<br>> ipmiChassisControl()             //phosphor-host-ipmid<br>> initiate_state_transition()<br>> ...<br>> d-bus<br>> ...<br>> requestedHostTransition()   //phosphor-state-manager<br>> ...<br>> dbus<br>> ...<br>> on_set_power_state()            //skeleton<br>> and finally write some gpio pin to power down.<br>> 2. for "softpoweroff", I found the call path:<br>> ipmiChassisControl()             //phosphor-host-ipmid<br>> stop_soft_off_timer()<br>> sendHostShutDownCmd()<br>> ipmid_send_cmd_to_host()<br>> checkQueueAndAlertHost()<br>> ...<br>> d-bus(setAttention)<br>> ...<br>> method_send_sms_atn()      //btbridge<br>> and finally send some message to host via BT, or in case of KCS via KCS.<br>> My question is:<br>> 1. In case of softpoweroff I found in code that the openbmc system just send setAttention to host and return? Does that mean letting the host system to powerdown and openbmc system does not write any power related gpio anymore?<br>> 2. If host system can handle the softpoweroff request sent by openbmc, How can host system handle it? I know there is a module called ipmi_si.ko which may communicate with openbmc. But I do not find and code in ipmi_si related with softpoweroff, or any other module in host system to control softpoweroff?<br>> 3. I am a learner of openbmc, I know there must be errors in my mail.<br>> Can anyone help tell me?<br>><br>> Best Regards!<br>> Liu Hongwei<br></div>