From 94ca0613267a512f9a9bac5a6dca34fdf8573ffb Mon Sep 17 00:00:00 2001 From: Samuel Jiang Date: Thu, 21 Mar 2019 13:47:13 +0800 Subject: meta-quanta: meta-gsj: Add quanta-nvme-powerctrl service Add quanta-nvme-powerctrl which included three features: 1. When BMC bootup, initial nvme ssd powoer output. 2. monitor ssd present update ssd power output. 3. Add bucstl commands to set Present property to d-bus nvme manager and set fault led if needed. (From meta-quanta rev: abda561c2bc846d42808c4c752a42c936e871b2f) Change-Id: Ib52b7505e4c6292bb08e1e2ef43c6a9459ef46b5 Signed-off-by: Samuel Jiang Signed-off-by: tony lee Signed-off-by: Brad Bishop --- .../quanta-nvme-powerctrl/README.md | 50 +++++++++++++++ .../quanta-nvme-powerctrl/files/init_once.sh | 60 ++++++++++++++++++ .../quanta-nvme-powerctrl/files/nvme_gpio.service | 10 +++ .../files/nvme_powermanager.service | 12 ++++ .../files/nvme_powermanager.sh | 73 ++++++++++++++++++++++ .../quanta-nvme-powerctrl/quanta-nvme-powerctrl.bb | 32 ++++++++++ 6 files changed, 237 insertions(+) create mode 100644 meta-quanta/meta-gsj/recipes-phosphor/quanta-nvme-powerctrl/README.md create mode 100644 meta-quanta/meta-gsj/recipes-phosphor/quanta-nvme-powerctrl/files/init_once.sh create mode 100644 meta-quanta/meta-gsj/recipes-phosphor/quanta-nvme-powerctrl/files/nvme_gpio.service create mode 100644 meta-quanta/meta-gsj/recipes-phosphor/quanta-nvme-powerctrl/files/nvme_powermanager.service create mode 100644 meta-quanta/meta-gsj/recipes-phosphor/quanta-nvme-powerctrl/files/nvme_powermanager.sh create mode 100644 meta-quanta/meta-gsj/recipes-phosphor/quanta-nvme-powerctrl/quanta-nvme-powerctrl.bb (limited to 'meta-quanta/meta-gsj') diff --git a/meta-quanta/meta-gsj/recipes-phosphor/quanta-nvme-powerctrl/README.md b/meta-quanta/meta-gsj/recipes-phosphor/quanta-nvme-powerctrl/README.md new file mode 100644 index 000000000..51a9e8fe5 --- /dev/null +++ b/meta-quanta/meta-gsj/recipes-phosphor/quanta-nvme-powerctrl/README.md @@ -0,0 +1,50 @@ +### NVME SSD Power Control Manager + +#### Description + The Package is Mantain for SSD power control and related noification handle Deamon + +#### Design + nvme_gpio.service for initinal related GPIOs ( PRESENT, PWR, PWRGD, RST_U2 ) and according PRESENT signal fix HW PWR default output signal. + + nvme_powermanager.service loop for monitor PRESENT signal and update PWR output. + +#### Process + + * Plugging + 1. U2_[SSD_index]PRSNT_N will be input low + 2. Set PWR_U2_[SSD_index]_EN to high + 3. Check PWRGD_U2_[SSD_index] is high + 4-1. If PWRGD_U2_[SSD_index] is high (PWR Good) + - Wait 5ms + - Enable PCI Clock by SMBus 9FGL0851 + - Wait 100ms + - Reset RST_BMC_U2 [low->high] + - Send Assert to tell package could read SSD status. + + 4-2. If PWRGD_U2_[SSD_index] is low (PWR Fail) + - Disable Clock by SMBus + - Wait 100ms + - Set RST_BMC_U2_[SSD_index]_R_N to low + - Set LED_U2_FAULT to high + + * Removing + 1. U2_[SSD_index]PRSNT_N will be input high + 2. Disable Clock by SMBus 9FGL0851 + 3. PWR_U2_[SSD_index]_EN to low + 4. Check PWRGD_U2_[SSD_index] is low + 5. Send Assert to tell package update SSD status. + + +#### TODO + + 1. After power on ssd, bmc send command to 9FGL0851 (on SMBus8 0x68) for enable PCI clock, and send RST_BMC_U2 pin rsing event (set low, wait 500ms, set high). The Host could rescan PCI and detect SSD device. + +#### Test + + 1. PRESENT detect SSD: The Default Hardware is implement. + 2. Initial SSD slot Power output: nvme_gpio service has test on Module. It could sucess initial gpios and setting correct power output. + 3. Detect PRESENT and change power setting: nvme_powermanager service has tested on Module. It could success detect SSD plugged or removal change PWR output. + 4. NVME-MI connect: Ensure SSD power is ready then it will notify quanta NVME-MI package could read SSD information. + 5. FAULT LED handle: When detect power output irregular by PWRGD pin, the service will trigger related FAULT LED. + + diff --git a/meta-quanta/meta-gsj/recipes-phosphor/quanta-nvme-powerctrl/files/init_once.sh b/meta-quanta/meta-gsj/recipes-phosphor/quanta-nvme-powerctrl/files/init_once.sh new file mode 100644 index 000000000..2ea02ef8d --- /dev/null +++ b/meta-quanta/meta-gsj/recipes-phosphor/quanta-nvme-powerctrl/files/init_once.sh @@ -0,0 +1,60 @@ +#!/bin/bash + +function set_gpio() { + #$1 gpio pin + echo $1 > /sys/class/gpio/export +} + +function set_gpio_direction(){ + #$1 gpio pin, $2 'in','high','low' + echo $2 > /sys/class/gpio/gpio$1/direction +} + +function read_gpio_input(){ + #$1 read input gpio pin + cat /sys/class/gpio/gpio$1/value +} + +function read_present_set_related_power(){ + #$1 read present gpio, $2 output power gpio,$3 output direction + var=$(cat /sys/class/gpio/gpio$1/value) + # present 0 is plugged,present 1 is removal + if [ "$var" == "0" ];then + set_gpio_direction $2 "high" + else + set_gpio_direction $2 "low" + fi +} + + +## Initial U2_PRESNET_N +U2_PRESENT=( 148 149 150 151 152 153 154 155 ) +for i in "${U2_PRESENT[@]}"; +do + set_gpio $i; + set_gpio_direction $i 'in'; +done + +## Initial POWER_U2_EN +POWER_U2=( 195 196 202 199 198 197 127 126 ) +for i in "${POWER_U2[@]}"; +do + set_gpio $i; +done + +## Initial PWRGD_U2 +PWRGD_U2=( 161 162 163 164 165 166 167 168 ) +for i in "${PWRGD_U2[@]}"; +do + set_gpio $i; + set_gpio_direction $i 'in'; +done + +### Initial SSD Power reference U2_PRESNET_N +for i in {0..7}; +do + read_present_set_related_power "${U2_PRESENT[$i]}" "${POWER_U2[$i]}"; +done + + +exit 0; \ No newline at end of file diff --git a/meta-quanta/meta-gsj/recipes-phosphor/quanta-nvme-powerctrl/files/nvme_gpio.service b/meta-quanta/meta-gsj/recipes-phosphor/quanta-nvme-powerctrl/files/nvme_gpio.service new file mode 100644 index 000000000..a5073d3a5 --- /dev/null +++ b/meta-quanta/meta-gsj/recipes-phosphor/quanta-nvme-powerctrl/files/nvme_gpio.service @@ -0,0 +1,10 @@ +[Unit] +Description = configure GPIO for SSD Power Control +Wants=org.openbmc.records.events.service +After=org.openbmc.records.events.service xyz.openbmc_project.nvme.manager.service + +[Service] +ExecStart=/usr/bin/init_once.sh + +[Install] +WantedBy=obmc-standby.target \ No newline at end of file diff --git a/meta-quanta/meta-gsj/recipes-phosphor/quanta-nvme-powerctrl/files/nvme_powermanager.service b/meta-quanta/meta-gsj/recipes-phosphor/quanta-nvme-powerctrl/files/nvme_powermanager.service new file mode 100644 index 000000000..4a4cd6288 --- /dev/null +++ b/meta-quanta/meta-gsj/recipes-phosphor/quanta-nvme-powerctrl/files/nvme_powermanager.service @@ -0,0 +1,12 @@ +[Unit] +Description=SSD NVME Power Manager +Wants=org.openbmc.records.events.service +After=org.openbmc.records.events.service nvme_gpio.service xyz.openbmc_project.nvme.manager.service + +[Service] +ExecStart=/usr/bin/nvme_powermanager.sh +Restart=always + + +[Install] +WantedBy=obmc-standby.target \ No newline at end of file diff --git a/meta-quanta/meta-gsj/recipes-phosphor/quanta-nvme-powerctrl/files/nvme_powermanager.sh b/meta-quanta/meta-gsj/recipes-phosphor/quanta-nvme-powerctrl/files/nvme_powermanager.sh new file mode 100644 index 000000000..91beec566 --- /dev/null +++ b/meta-quanta/meta-gsj/recipes-phosphor/quanta-nvme-powerctrl/files/nvme_powermanager.sh @@ -0,0 +1,73 @@ +#!/bin/bash + +U2_PRESENT_STATUS=( 1 1 1 1 1 1 1 1 ) +U2_PRESENT=( 148 149 150 151 152 153 154 155 ) +POWER_U2=( 195 196 202 199 198 197 127 126 ) +PWRGD_U2=( 161 162 163 164 165 166 167 168 ) + + +function set_gpio_direction(){ + #$1 gpio pin, $2 'in','high','low' + echo $2 > /sys/class/gpio/gpio$1/direction +} + +function read_present_set_related_power(){ + #$1 read present number, $2 output power gpio + var="${U2_PRESENT_STATUS[$1]}" + # present 0 is plugged,present 1 is removal + if [ "$var" == "0" ];then + set_gpio_direction $2 "high" + else + set_gpio_direction $2 "low" + fi +} + +function update_u2_status(){ + #$1 read present gpio + var=$(cat /sys/class/gpio/gpio$2/value) + U2_PRESENT_STATUS[$1]="$var" +} + +function check_present_and_powergood(){ + #$2 present gpio, $3 powergood gpio + present=$(cat /sys/class/gpio/gpio$2/value) + pwrgd=$(cat /sys/class/gpio/gpio$3/value) + path=`expr $1` + if [ "$present" -eq 0 ] && [ "$pwrgd" -eq 1 ];then + busctl set-property xyz.openbmc_project.nvme.manager /xyz/openbmc_project/nvme/$path xyz.openbmc_project.Inventory.Item Present b true + else + busctl set-property xyz.openbmc_project.nvme.manager /xyz/openbmc_project/nvme/$path xyz.openbmc_project.Inventory.Item Present b false + if [ "$present" -eq "$pwrgd" ];then + #set fault led + busctl set-property xyz.openbmc_project.LED.GroupManager /xyz/openbmc_project/led/groups/led\_u2\_$1\_fault xyz.openbmc_project.Led.Group Asserted b true + else + busctl set-property xyz.openbmc_project.LED.GroupManager /xyz/openbmc_project/led/groups/led\_u2\_$1\_fault xyz.openbmc_project.Led.Group Asserted b false + fi + + fi + + +} + +##Initial U2 present status +for i in {0..7}; +do + update_u2_status $i "${U2_PRESENT[$i]}" +done + + +## Loop while +while : +do + for i in {0..7}; + do + ## 1 scend scan all loop + sleep 0.125 + read=$(cat /sys/class/gpio/gpio${U2_PRESENT[$i]}/value) + if [ "${U2_PRESENT_STATUS[$1]}" != read ];then + update_u2_status $i "${U2_PRESENT[$i]}" + read_present_set_related_power $i "${POWER_U2[$i]}" + check_present_and_powergood $i "${U2_PRESENT[$i]}" "${POWER_U2[$i]}" + fi + done +done diff --git a/meta-quanta/meta-gsj/recipes-phosphor/quanta-nvme-powerctrl/quanta-nvme-powerctrl.bb b/meta-quanta/meta-gsj/recipes-phosphor/quanta-nvme-powerctrl/quanta-nvme-powerctrl.bb new file mode 100644 index 000000000..8d0aa8c72 --- /dev/null +++ b/meta-quanta/meta-gsj/recipes-phosphor/quanta-nvme-powerctrl/quanta-nvme-powerctrl.bb @@ -0,0 +1,32 @@ +SUMMARY = "Phosphor OpenBMC Quanta NVME Power Control Service" +DESCRIPTION = "Phosphor OpenBMC Quanta NVME Power Control Daemon." +PR = "r1" +LICENSE = "Apache-2.0" +LIC_FILES_CHKSUM = "file://${QUANTABASE}/COPYING.apache-2.0;md5=34400b68072d710fecd0a2940a0d1658" + +FILESEXTRAPATHS_append := "${THISDIR}/files:" + +inherit systemd + +DEPENDS += "systemd" +RDEPENDS_${PN} += "libsystemd" +RDEPENDS_${PN} += "bash" + +SRC_URI += "file://init_once.sh \ + file://nvme_powermanager.sh \ + file://nvme_gpio.service \ + file://nvme_powermanager.service \ + " + +do_install () { + install -d ${D}${bindir} + install -m 0755 ${WORKDIR}/init_once.sh ${D}${bindir}/ + install -m 0755 ${WORKDIR}/nvme_powermanager.sh ${D}${bindir}/ + + install -d ${D}${systemd_unitdir}/system/ + install -m 0644 ${WORKDIR}/nvme_gpio.service ${D}${systemd_unitdir}/system + install -m 0644 ${WORKDIR}/nvme_powermanager.service ${D}${systemd_unitdir}/system +} + +SYSTEMD_PACKAGES = "${PN}" +SYSTEMD_SERVICE_${PN} = "nvme_gpio.service nvme_powermanager.service" -- cgit v1.2.1