blob: 204fd86ff97ae5a4ac567695e352efc6e020e4d0 [file] [log] [blame]
Thang Q. Nguyenfe4a6072023-06-09 08:55:58 +07001#!/bin/bash
2
3# shellcheck disable=SC2046
Thang Q. Nguyenfe4a6072023-06-09 08:55:58 +07004
5spi_address="1e630000.spi"
6spi_bind="/sys/bus/platform/drivers/spi-aspeed-smc/bind"
7spi_unbind="/sys/bus/platform/drivers/spi-aspeed-smc/unbind"
8spi_lock="/run/platform/spi.lock"
9spi_lock_dir="/run/platform"
10
11bind_aspeed_smc_driver() {
12 if [ -f "${spi_lock}" ]; then
13 pid=$1
14 pid_lock=$(cat "${spi_lock}")
15 if [[ "${pid}" != "${pid_lock}" ]]; then
16 echo "SPI-NOR resoure is lock by process $pid_lock"
17 return 1
18 fi
19 fi
20
21 # BMC access SPI-NOR resource
Thang Q. Nguyend9c89652023-10-05 09:02:31 +070022 gpioset $(gpiofind spi0-program-sel)=1
Thang Q. Nguyenfe4a6072023-06-09 08:55:58 +070023 sleep 0.1
24 echo "Bind the ASpeed SMC driver"
25 echo "${spi_address}" > "${spi_bind}" 2>/dev/null
26 # Check the HNOR partition available
27 HOST_MTD=$(< /proc/mtd grep "pnor" | sed -n 's/^\(.*\):.*/\1/p')
28 if [ -z "$HOST_MTD" ]; then
29 echo "${spi_address}" > "${spi_unbind}"
30 sleep 0.1
31 echo "${spi_address}" > "${spi_bind}"
32 fi
33 # BMC release SPI-NOR resource
Thang Q. Nguyend9c89652023-10-05 09:02:31 +070034 gpioset $(gpiofind spi0-program-sel)=0
Thang Q. Nguyenfe4a6072023-06-09 08:55:58 +070035 return 0
36}
37
38unbind_aspeed_smc_driver() {
39 if [ -f "${spi_lock}" ]; then
40 pid=$1
41 pid_lock=$(cat "${spi_lock}")
42 if [[ "${pid}" != "${pid_lock}" ]]; then
43 echo "SPI-NOR resoure is lock by process $pid_lock . Wait 10s"
44 # Wait maximum 10 seconds for unlock SPI-NOR
45 cnt=10
46 while [ $cnt -gt 0 ]
47 do
48 if [ -f "${spi_lock}" ]; then
49 sleep 1
50 cnt=$((cnt - 1))
51 else
52 break
53 fi
54 done
55 if [ "$cnt" -eq "0" ]; then
56 echo "Timeout 10 seconds, SPI-NOR still busy. Force unlock to access SPI"
57 rm -f "${spi_lock}"
58 fi
59 fi
60 fi
61
62 HOST_MTD=$(< /proc/mtd grep "pnor" | sed -n 's/^\(.*\):.*/\1/p')
63 if [ -n "$HOST_MTD" ]; then
64 # If the HNOR partition is available, then unbind driver
65 # BMC access SPI-NOR resource
Thang Q. Nguyend9c89652023-10-05 09:02:31 +070066 gpioset $(gpiofind spi0-program-sel)=1
Thang Q. Nguyenfe4a6072023-06-09 08:55:58 +070067 sleep 0.1
68 echo "Unbind the ASpeed SMC driver"
69 echo "${spi_address}" > "${spi_unbind}"
70 fi
71 # BMC release SPI-NOR resource
Thang Q. Nguyend9c89652023-10-05 09:02:31 +070072 gpioset $(gpiofind spi0-program-sel)=0
Thang Q. Nguyenfe4a6072023-06-09 08:55:58 +070073 # Deassert BMC access SPI-NOR pin
Thang Q. Nguyend9c89652023-10-05 09:02:31 +070074 gpioset $(gpiofind spi-nor-access)=0
Thang Q. Nguyenfe4a6072023-06-09 08:55:58 +070075 sleep 0.5
76 return 0
77}
78
79lock_spi_resource() {
80 # Wait maximum 10 seconds to lock SPI-NOR
81 cnt=10
82 while [ $cnt -gt 0 ]
83 do
84 if [ -f "${spi_lock}" ]; then
85 sleep 1
86 cnt=$((cnt - 1))
87 else
88 echo "$1" > "${spi_lock}"
89 break
90 fi
91 done
92
93 if [ "$cnt" -eq "0" ]; then
94 echo "Timeout 10 seconds, SPI-NOR is still locked by another process"
95 return 1
96 fi
97 return 0
98}
99
100unlock_spi_resource() {
101 if [ ! -f "${spi_lock}" ]; then
102 echo "SPI-NOR is already unlocked"
103 return 0
104 fi
105
106 pid=$1
107 pid_lock=$(cat "${spi_lock}")
108 if [[ "${pid}" == "${pid_lock}" ]]; then
109 rm -f "${spi_lock}"
110 else
111 echo "Cannot unlock, SPI-NOR is locked by another process"
112 return 1
113 fi
114 return 0
115}
116
117start_handshake_spi() {
118 if [ -f "${spi_lock}" ]; then
119 pid=$1
120 pid_lock=$(cat "${spi_lock}")
121 if [[ "${pid}" != "${pid_lock}" ]]; then
122 echo "SPI-NOR resoure is lock by process $pid_lock"
123 return 1
124 fi
125 fi
126
127 # Wait maximum 10 seconds to grant access SPI
128 cnt=10
129 while [ $cnt -gt 0 ]
130 do
Thang Q. Nguyend9c89652023-10-05 09:02:31 +0700131 spinor_access=$(gpioget $(gpiofind soc-spi-nor-access))
Thang Q. Nguyenfe4a6072023-06-09 08:55:58 +0700132 if [ "$spinor_access" == "1" ]; then
133 sleep 1
134 cnt=$((cnt - 1))
135 else
136 break
137 fi
138 done
139
140 if [ "$cnt" -eq "0" ]; then
141 echo "Timeout 10 seconds, host is still hold SPI-NOR."
142 return 1
143 fi
144 echo "Start handshake SPI-NOR"
145 # Grant BMC access SPI-NOR. The process call the scripts should only
146 # claim the bus for only maximum period 500ms.
Thang Q. Nguyend9c89652023-10-05 09:02:31 +0700147 gpioset $(gpiofind spi-nor-access)=1
Thang Q. Nguyenfe4a6072023-06-09 08:55:58 +0700148 # Switch the Host SPI-NOR to BMC
Thang Q. Nguyend9c89652023-10-05 09:02:31 +0700149 gpioset $(gpiofind spi0-program-sel)=1
Thang Q. Nguyenfe4a6072023-06-09 08:55:58 +0700150}
151
152stop_handshake_spi() {
153 if [ -f "${spi_lock}" ]; then
154 pid=$1
155 pid_lock=$(cat "${spi_lock}")
156 if [[ "${pid}" != "${pid_lock}" ]]; then
157 echo "SPI-NOR resoure is lock by process $pid_lock"
158 return 1
159 fi
160 fi
161 echo "Stop handshake SPI-NOR"
162 # Switch the Host SPI-NOR to HOST
Thang Q. Nguyend9c89652023-10-05 09:02:31 +0700163 gpioset $(gpiofind spi0-program-sel)=0
Thang Q. Nguyenfe4a6072023-06-09 08:55:58 +0700164 # Deassert BMC access SPI-NOR pin
Thang Q. Nguyend9c89652023-10-05 09:02:31 +0700165 gpioset $(gpiofind spi-nor-access)=0
Thang Q. Nguyenfe4a6072023-06-09 08:55:58 +0700166}
167
168
169if [ $# -eq 0 ]; then
170 echo "Usage:"
171 echo " - Handshake access SPI-NOR "
172 echo " $(basename "$0") cmd pid"
173 echo " <cmd>:"
174 echo " lock - lock the SPI-NOR resource"
175 echo " unlock - unlock the SPI-NOR resource"
176 echo " bind - bind the SPI-NOR resource"
177 echo " unbind - unbind the SPI-NOR resource"
178 echo " start_handshake - start handshake between BMC and Host"
179 echo " stop_handshake - release handshake between BMC and Host"
180 echo " <pid>: Optional - PID of the process call script"
181 exit 0
182fi
183
184CMD=$1
185
186if [ ! -d "${spi_lock_dir}" ]; then
187 mkdir -p "${spi_lock_dir}"
188fi
189
190if [ -z "$2" ]; then
191 PID=$$
192else
193 PID=$2
194fi
195
196if [[ "${CMD}" == "lock" ]]; then
197 lock_spi_resource "${PID}"
198 ret=$?
199 if [[ "${ret}" == "1" ]]; then
200 echo "Cannot lock SPI-NOR, the resource is busy"
201 exit 1
202 fi
203elif [[ "${CMD}" == "unlock" ]]; then
204 unlock_spi_resource "${PID}"
205 ret=$?
206 if [[ "${ret}" == "1" ]]; then
207 echo "Cannot unlock SPI-NOR, the resource is busy"
208 exit 1
209 fi
210elif [[ "${CMD}" == "bind" ]]; then
211 bind_aspeed_smc_driver "${PID}"
212 ret=$?
213 if [[ "${ret}" == "1" ]]; then
214 echo "Cannot bind SPI-NOR, the resource is busy"
215 exit 1
216 fi
217elif [[ "${CMD}" == "unbind" ]]; then
218 unbind_aspeed_smc_driver "${PID}"
219 ret=$?
220 if [[ "${ret}" == "1" ]]; then
221 echo "Cannot unbind SPI-NOR, the resource is busy"
222 exit 1
223 fi
224elif [[ "${CMD}" == "start_handshake" ]]; then
225 start_handshake_spi "${PID}"
226 ret=$?
227 if [[ "${ret}" == "1" ]]; then
228 echo "Cannot start handshake SPI-NOR"
229 exit 1
230 fi
231elif [[ "${CMD}" == "stop_handshake" ]]; then
232 stop_handshake_spi "${PID}"
233 ret=$?
234 if [[ "${ret}" == "1" ]]; then
235 echo "Cannot stop handshake SPI-NOR"
236 exit 1
237 fi
238fi
239
240exit 0