summaryrefslogtreecommitdiff
path: root/meta-ampere/meta-mitchell/recipes-ampere/host/ampere-hostctrl/ampere_power_on_failure_check.sh
blob: 4748706d9c06c72e159e5a7182aa54fa235f28ca (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#!/bin/bash

# shellcheck disable=SC2046

function check_cpu_presence()
{
	# Check CPU presence, identify whether it is 1P or 2P system
	s0_presence=$(gpioget $(gpiofind presence-cpu0))
	s1_presence=$(gpioget $(gpiofind presence-cpu1))
	if [ "$s0_presence" == "0" ] && [ "$s1_presence" == "0" ]; then
		ampere_add_redfishevent.sh OpenBMC.0.1.AmpereEvent.OK "Host firmware boots with 2 Processor"
	elif [ "$s0_presence" == "0" ]; then
		ampere_add_redfishevent.sh OpenBMC.0.1.AmpereEvent.OK "Host firmware boots with 1 Processor"
	else
		ampere_add_redfishevent.sh OpenBMC.0.1.AmpereEvent.OK "No Processor is present"
	fi
}

function get_dbus_property()
{
	service=$1
	object_path=$2
	interface=$3
	property=$4

	value=$(busctl get-property "$service" "$object_path" "$interface" "$property" | cut -d" " -f2)

	echo "$value"
}

function is_ATX_power_good()
{
	pgood_value=$(get_dbus_property org.openbmc.control.Power \
		/org/openbmc/control/power0 org.openbmc.control.Power pgood)

	if [ "$pgood_value" == "0" ]
	then
		echo 0
	else
		echo 1
	fi
}

function is_PCP_power_good()
{
	pcp_value=$(get_dbus_property xyz.openbmc_project.State.HostCondition.Gpio \
		/xyz/openbmc_project/Gpios/host0 xyz.openbmc_project.Condition.HostFirmware \
		CurrentFirmwareCondition)

	if [[ "$pcp_value" == *".Running"* ]]
	then
		echo 1
	else
		echo 0
	fi
}

function check_power_state()
{
	echo "ATX power good checking"
	state=$(is_ATX_power_good)
	if [ "$state" == "0" ]
	then
		echo "Error: Failed to turn on ATX Power"
		ampere_add_redfishevent.sh OpenBMC.0.1.PowerSupplyPowerGoodFailed.Critical "60000"
		exit 0
	else
		ampere_add_redfishevent.sh OpenBMC.0.1.AmpereEvent.OK "ATX Power is ON"
	fi

	echo "Soc power good checking"
	state=$(gpioget $(gpiofind s0-soc-pgood))
	if [ "$state" == "0" ]
	then
		echo "Error: Soc domain power failure"
		ampere_add_redfishevent.sh OpenBMC.0.1.AmpereCritical.Critical "Soc domain, power failure"
		exit 0
	else
		ampere_add_redfishevent.sh OpenBMC.0.1.AmpereEvent.OK "SoC power domain is ON"
	fi

	echo "PCP power good checking"
	state=$(is_PCP_power_good)
	if [ "$state" == "0" ]
	then
		echo "Error: PCP domain power failure. Power off Host"
		ampere_add_redfishevent.sh OpenBMC.0.1.AmpereCritical.Critical "PCP domain, power failure"
		busctl set-property xyz.openbmc_project.State.Chassis \
			/xyz/openbmc_project/state/chassis0 \
			xyz.openbmc_project.State.Chassis RequestedPowerTransition s \
			xyz.openbmc_project.State.Chassis.Transition.Off
		exit 0
	else
		ampere_add_redfishevent.sh OpenBMC.0.1.AmpereEvent.OK "PCP power is ON"
	fi
}

action=$1

if [ "$action" == "check_cpu" ]
then
	echo "Check CPU presence"
	check_cpu_presence
elif [ "$action" == "check_power" ]
then
	echo "Check Power state"
	check_power_state
fi

exit 0