1#!/bin/bash 2# shellcheck source=meta-facebook/recipes-fb/obmc_functions/files/fb-common-functions 3source /usr/libexec/fb-common-functions 4 5GPIO_HIGH=1 6GPIO_LOW=0 7 8wait_gpio_value() 9{ 10 local net_name=$1 11 local max_retries=$3 12 local delay_secs=$4 13 local expd_val=$2 14 15 local gpio_val=0 16 local trycnt=1 17 18 until [[ $gpio_val -gt 0 || $trycnt -gt $max_retries ]] 19 do 20 gpio_val=$(get_gpio "$net_name") 21 rc=$? 22 if [[ $rc -ne 0 ]]; then 23 err_msg="Unable to read $net_name" 24 echo "$err_msg" 25 return 1 26 fi 27 if [[ $gpio_val -eq $expd_val ]]; then 28 return 0 29 fi 30 sleep "$delay_secs" 31 ((trycnt++)) 32 done 33 34 err_msg="wait_gpio_value failed, gpio_val=$gpio_val, exp_val=$expd_val" 35 echo "$err_msg" 36 return 1 37} 38 39bind_i2c_muxes() 40{ 41 # Module 0 I2C Mux 42 # i2c24 - i2c27 43 echo "0-0071" > /sys/bus/i2c/drivers/pca954x/bind 44 # i2c28 - i2c31 45 echo "0-0072" > /sys/bus/i2c/drivers/pca954x/bind 46 # i2c32 - i2c35 47 echo "0-0073" > /sys/bus/i2c/drivers/pca954x/bind 48 49 # Module 1 I2C Mux 50 # i2c36 - i2c39 51 echo "0-0075" > /sys/bus/i2c/drivers/pca954x/bind 52 # i2c40 - i2c43 53 echo "0-0076" > /sys/bus/i2c/drivers/pca954x/bind 54 # i2c44 - i2c47 55 echo "0-0077" > /sys/bus/i2c/drivers/pca954x/bind 56 57 # HDD Board I2C Mux, i2c48 - i2c55 58 echo "30-0070" > /sys/bus/i2c/drivers/pca954x/bind 59} 60 61bind_gpio_expanders() 62{ 63 # Module 0 IOEXP 64 echo "2-0020" > /sys/bus/i2c/drivers/pca953x/bind 65 # Module 1 IOEXP 66 echo "2-0021" > /sys/bus/i2c/drivers/pca953x/bind 67 # HMC IOEXP 68 echo "2-0027" > /sys/bus/i2c/drivers/pca953x/bind 69 # BMC IOEXP 70 echo "6-0021" > /sys/bus/i2c/drivers/pca953x/bind 71 # IO Mezz 0 IOEXP 72 echo "29-0020" > /sys/bus/i2c/drivers/pca953x/bind 73 # IO Mezz 1 IOEXP 74 echo "41-0021" > /sys/bus/i2c/drivers/pca953x/bind 75} 76 77bind_fru_eeproms() 78{ 79 # Module 0 FRU 80 echo "13-0050" /sys/bus/i2c/drivers/at24/bind 81 # Module 1 FRU 82 echo "12-0050" /sys/bus/i2c/drivers/at24/bind 83 # HMC FRU 84 echo "13-0057" /sys/bus/i2c/drivers/at24/bind 85 # Left CBC FRU 86 echo "13-0054" /sys/bus/i2c/drivers/at24/bind 87 # Right CBC FRU 88 echo "13-0055" /sys/bus/i2c/drivers/at24/bind 89 # IO Mezz 0 FRU 90 echo "29-0050" /sys/bus/i2c/drivers/at24/bind 91 # IO Mezz 1 FRU 92 echo "41-0050" /sys/bus/i2c/drivers/at24/bind 93 # HDD Board FRU 94 echo "54-0052" /sys/bus/i2c/drivers/at24/bind 95} 96 97reset_host_usb() 98{ 99 set_gpio "USB_HUB_RESET_L" "$GPIO_LOW" 100 sleep 1 101 set_gpio "USB_HUB_RESET_L" "$GPIO_HIGH" 102} 103 104rebind_hmc_usb_network() 105{ 106 echo 1e6a1000.usb > /sys/bus/platform/drivers/ehci-platform/unbind 107 echo 1e6a1000.usb > /sys/bus/platform/drivers/ehci-platform/bind 108} 109 110is_stby_good() 111{ 112 local gpio_val 113 114 if ! gpio_val=$(get_gpio "STBY_POWER_PG_3V3"); then 115 return 1 116 fi 117 118 if [[ $gpio_val -eq 0 ]]; then 119 return 1 120 fi 121 122 return 0 123} 124 125set_bmc_ready() 126{ 127 local bmc_ready="/sys/class/leds/bmc_ready_noled/brightness" 128 local bmc_ready_cpld="/sys/class/leds/bmc_ready_cpld_noled/brightness" 129 130 echo 1 > ${bmc_ready} 131 echo 1 > ${bmc_ready_cpld} 132 return 0 133} 134 135if ! is_stby_good; then 136 set_gpio "SCM_HPM_STBY_RST_N" "$GPIO_LOW" 137fi 138 139set_gpio "SCM_HPM_STBY_EN" "$GPIO_HIGH" 140set_gpio "stby_power_en_cpld" "$GPIO_HIGH" 141if ! wait_gpio_value "STBY_POWER_PG_3V3" "$GPIO_HIGH" 20 1; then 142 echo "Error: failed to get STBY_POWER_PG_3V3 as high (1) in 20 sec" 143 exit 1 144fi 145set_gpio "stby_power_gd_cpld" "$GPIO_HIGH" 146 147bind_i2c_muxes 148bind_gpio_expanders 149 150set_gpio "BMC_12V_CTRL" "$GPIO_HIGH" 151reset_host_usb 152 153set_gpio "HMC_PGOOD" "$GPIO_HIGH" 154set_gpio "EROT_FPGA_RST_L" "$GPIO_HIGH" 155set_gpio "SEC_EROT_FPGA_RST_L" "$GPIO_HIGH" 156set_gpio "HMC_EROT_RST_L" "$GPIO_HIGH" 157set_gpio "SCM_HPM_STBY_RST_N" "$GPIO_HIGH" 158 159if ! wait_gpio_value "HMC_READY" "$GPIO_HIGH" 180 1; then 160 echo "Error: failed to get HMC_READY as high (1) in 180 sec" 161 exit 1 162fi 163 164rebind_hmc_usb_network 165 166if ! wait_gpio_value "FPGA_READY_BMC" "$GPIO_HIGH" 180 1; then 167 echo "Error: failed to get FPGA_READY_BMC as high (1) in 180 sec" 168 exit 1 169fi 170 171bind_fru_eeproms 172set_bmc_ready 173 174exit 0 175