From dc251664c3383c438c712daef53206d093fb0f4c Mon Sep 17 00:00:00 2001 From: Potin Lai Date: Fri, 1 Apr 2022 11:16:50 +0800 Subject: meta-bletchley: motor-ctrl: add host status checking Use mdio-util command to communicate with switch phy, and get port link status represent for host status. This feature is not support with EVT system due to MDIO0 is not connected. Tested on reworked EVT HW: root@bletchley:~# power-ctrl sled6 off Power off sled6 Motor go forward to press Power key Power key switch triggered Press power key for Sled6 5 seconds... Motor reverse to initial position successful root@bletchley:~# power-ctrl sled6 status Off root@bletchley:~# power-ctrl sled6 on Power on sled6 Motor go forward to press Power key Power key switch triggered Press power key for Sled6 0.5 seconds... Motor reverse to initial position successful root@bletchley:~# power-ctrl sled6 status On Signed-off-by: Potin Lai Change-Id: I523013447da9ed210499f5dca960f708292a4b33 --- .../recipes-bletchley/motor-ctrl/files/power-ctrl | 106 +++++++++++++++++++-- .../recipes-bletchley/motor-ctrl/motor-ctrl_0.1.bb | 1 + 2 files changed, 101 insertions(+), 6 deletions(-) diff --git a/meta-facebook/meta-bletchley/recipes-bletchley/motor-ctrl/files/power-ctrl b/meta-facebook/meta-bletchley/recipes-bletchley/motor-ctrl/files/power-ctrl index 9395b9d304..523eb26d4d 100755 --- a/meta-facebook/meta-bletchley/recipes-bletchley/motor-ctrl/files/power-ctrl +++ b/meta-facebook/meta-bletchley/recipes-bletchley/motor-ctrl/files/power-ctrl @@ -159,6 +159,78 @@ function get_ac_status(){ fi } +function get_host_status() +{ + SLED_NUM=$1 + MDIO_BUS=0 + HOST_ST_UNKNOW="Unknow" + HOST_ST_ON="On" + HOST_ST_OFF="Off" + declare -a PORT_MAP=(0 3 2 1 7 6 5) + + # check /dev/mem + if ! create_dev_mem; then + return 1 + fi + + CHECK_CNT=0 + MDIO_ERR_CNT=0 + CUR_HOST_ST=$HOST_ST_UNKNOW + + while true + do + if POST_ST_VAL=$(mdio-util c22 r $MDIO_BUS "${PORT_MAP[SLED_NUM]}" 0); then + if [ $((POST_ST_VAL&16#0800)) -eq $((16#0800)) ]; then + TMP_HOST_ST="$HOST_ST_ON" + else + TMP_HOST_ST="$HOST_ST_OFF" + fi + + if [ "$CUR_HOST_ST" == "$TMP_HOST_ST" ]; then + CHECK_CNT=$((CHECK_CNT+1)) + else + CUR_HOST_ST=$TMP_HOST_ST + CHECK_CNT=0 + fi + + if [ "$CHECK_CNT" -ge 5 ]; then + echo "$CUR_HOST_ST" + break + fi + else + MDIO_ERR_CNT=$((MDIO_ERR_CNT+1)) + if [ "$MDIO_ERR_CNT" -ge 5 ]; then + echo "$HOST_ST_UNKNOW" + return 1 + fi + fi + done + + return 0 +} + +function create_dev_mem() +{ + CHECK_CNT=0 + while true + do + CHECK_CNT=$((CHECK_CNT+1)) + if [ -c /dev/mem ]; then + # /dev/mem already exist + return 0 + elif mknod /dev/mem c 1 1; then + # mknod success + return 0 + elif [ "$CHECK_CNT" -ge 5 ]; then + break + fi + sleep 1 + done + + echo "create /dev/mem failed" + return 1 +} + function show_usage(){ echo "Usage: power-ctrl [sled1 | sled2 | sled3 | sled4 | sled5 | sled6] [on off ac-on ac-off status]" echo " power-ctrl chassis-cycle" @@ -201,23 +273,45 @@ fi if [[ "$ACTION" == "on" ]]; then if [ "$(get_ac_status "$SLED_NUM")" == "AC on" ];then - echo "Power on ${SLED}" - trigger_power_button "$SLED_NUM" "$DELAY_POWER_ON" + host_power_st=$(get_host_status "$SLED_NUM") + if [ "$host_power_st" == "On" ]; then + echo "${SLED} is already On" + elif [ "$host_power_st" == "Off" ]; then + echo "Power on ${SLED}" + trigger_power_button "$SLED_NUM" "$DELAY_POWER_ON" + else + echo "${SLED} power state is $host_power_st" + exit 1 + fi else echo "${SLED} is ac-off, please turn on ac before power on" exit 1 fi elif [[ "$ACTION" == "off" ]];then if [ "$(get_ac_status "$SLED_NUM")" == "AC on" ];then - echo "Power off ${SLED}" - trigger_power_button "$SLED_NUM" "$DELAY_POWER_OFF" + host_power_st=$(get_host_status "$SLED_NUM") + if [ "$host_power_st" == "On" ]; then + echo "Power off ${SLED}" + trigger_power_button "$SLED_NUM" "$DELAY_POWER_OFF" + elif [ "$host_power_st" == "Off" ]; then + echo "${SLED} is already Off" + else + echo "${SLED} power state is $host_power_st" + exit 1 + fi else echo "${SLED} is already ac-off" exit 1 fi elif [[ "$ACTION" == "status" ]];then - get_ac_status "$SLED_NUM" - #TODO : check or record Host(DC) power status + AC_ST=$(get_ac_status "$SLED_NUM") + if [ "$AC_ST" == "AC on" ]; then + # check host power status if AC is on + get_host_status "$SLED_NUM" || exit 1 + else + # AC off + echo "$AC_ST" + fi elif [[ "$ACTION" == "ac-on" ]];then set_gpio "power-host${SLED_NUM}" 1 elif [[ "$ACTION" == "ac-off" ]];then diff --git a/meta-facebook/meta-bletchley/recipes-bletchley/motor-ctrl/motor-ctrl_0.1.bb b/meta-facebook/meta-bletchley/recipes-bletchley/motor-ctrl/motor-ctrl_0.1.bb index 41e0ce9f15..3cab5e2781 100644 --- a/meta-facebook/meta-bletchley/recipes-bletchley/motor-ctrl/motor-ctrl_0.1.bb +++ b/meta-facebook/meta-bletchley/recipes-bletchley/motor-ctrl/motor-ctrl_0.1.bb @@ -8,6 +8,7 @@ inherit obmc-phosphor-systemd RDEPENDS:${PN} += "bash" RDEPENDS:${PN} += "i2c-tools" RDEPENDS:${PN} += "libgpiod-tools" +RDEPENDS:${PN} += "mdio-util" S = "${WORKDIR}" SRC_URI += " \ -- cgit v1.2.3