1 \ *****************************************************************************
2 \ * Copyright (c) 2004, 2008 IBM Corporation
3 \ * All rights reserved.
4 \ * This program and the accompanying materials
5 \ * are made available under the terms of the BSD License
6 \ * which accompanies this distribution, and is available at
7 \ * http://www.opensource.org/licenses/bsd-license.php
10 \ * IBM Corporation - initial implementation
11 \ ****************************************************************************/
13 #include <rtas/rtas-init.fs>
14 #include <rtas/rtas-cpu.fs>
15 #include <rtas/rtas-reboot.fs>
16 #include <rtas/rtas-flash.fs>
17 #include <rtas/rtas-vpd.fs>
20 : (get-flashside) ( -- flashside ) rtas-get-flashside ;
22 ' (get-flashside) to get-flashside
24 \ remember the current flashside
25 get-flashside to flashside?
28 : (set-flashside) ( flashside -- status )
29 dup rtas-set-flashside = IF 0 ELSE -1 THEN
32 ' (set-flashside) to set-flashside
34 : rtas-ibm-read-pci-config ( size puid bus devfn off -- x )
35 [ s" ibm,read-pci-config" rtas-get-token ] LITERAL rtas-cb rtas>token l!
36 4 rtas-cb rtas>nargs l!
37 2 rtas-cb rtas>nret l!
38 swap 8 lshift or swap 10 lshift or rtas-cb rtas>args0 l!
39 dup 20 rshift rtas-cb rtas>args1 l!
40 ffffffff and rtas-cb rtas>args2 l!
46 : rtas-fetch-cpus ( mask -- status )
47 [ s" rtas-fetch-slaves" rtas-get-token ] LITERAL rtas-cb rtas>token l!
48 1 rtas-cb rtas>nargs l!
49 1 rtas-cb rtas>nret l!
51 0 rtas-cb rtas>args1 l!
56 : rtas-stop-bootwatchdog ( -- status )
57 [ s" rtas-stop-bootwatchdog" rtas-get-token ] LITERAL rtas-cb rtas>token l!
58 0 rtas-cb rtas>nargs l!
59 1 rtas-cb rtas>nret l!
64 : rtas-set-bootwatchdog ( seconds -- )
65 [ s" rtas-set-bootwatchdog" rtas-get-token ] LITERAL rtas-cb rtas>token l!
66 1 rtas-cb rtas>nargs l!
67 0 rtas-cb rtas>nret l!
72 ' rtas-set-bootwatchdog to set-watchdog
74 : rtas-dump-flash ( offset cnt -- )
75 [ s" rtas-dump-flash" rtas-get-token ] LITERAL rtas-cb rtas>token l!
76 2 rtas-cb rtas>nargs l!
77 0 rtas-cb rtas>nret l!
89 \ set length of block list
92 0000000000000000 blist 8 + !
94 get-load-base 0 + blist 10 + !
96 get-load-base 80000 + blist 20 + !
98 get-load-base 100000 + blist 30 + !
100 get-load-base 180000 + blist 40 + !
104 80000 constant _block_size
107 \ set length of block list
108 \ length of flashfs at load-base is at offset 30... get it...
110 \ calculate the number of blocks we need
112 \ total number of blocks is 2 (for header and block_list extension + (number of blocks for flashfs * 2 (1 for address 1 for length))
114 \ set version ( in first byte only )
117 0000000000000000 blist 8 + !
118 \ length of flashfs at load-base is at offset 30... get it...
120 \ i define one block to be 64K, so calculate the number of blocks we need and loop over them
121 _block_size / 1 + 0 do
122 get-load-base _block_size i * + \ which position of load-base to store
123 blist 10 + \ at what offset of blist ( 0x8 + for header 0x8 + for extension )
124 i 10 * + \ for each loop we have done 0x10 +
127 _block_size i * - \ remaining length
129 IF \ is the remaining length > block size
130 drop _block_size \ then store the block size as length
132 \ do nothing (store remaining length)
134 blist 10 + \ store the length at
135 i 10 * + \ correct blist offset
136 8 + \ + 8 (we have stored address, now the length)
143 : build-blocklist-v0_old
148 get-load-base 0 + blist 8 + !
150 get-load-base 80000 + blist 18 + !
152 get-load-base 100000 + blist 28 + !
154 get-load-base 180000 + blist 38 + !
159 \ set length of block list
160 \ length of flashfs at load-base is at offset 30... get it...
162 \ calculate the number of blocks we need
164 \ total number of blocks is 1 (for header + (number of blocks for flashfs * 2 (1 for address 1 for length))
166 \ length of flashfs at load-base is at offset 30... get it...
168 \ i define one block to be 64K, so calculate the number of blocks we need and loop over them
169 _block_size / 1 + 0 do
170 get-load-base _block_size i * + \ which position of load-base to store
171 blist 8 + \ at what offset of blist ( 0x8 + for header)
172 i 10 * + \ for each loop we have done 0x10 +
175 _block_size i * - \ remaining length
177 IF \ is the remaining length > block size
178 drop _block_size \ then store the block size as length
180 \ do nothing (store remaining length)
182 blist 8 + \ store the length at
183 i 10 * + \ correct blist offset
184 8 + \ + 8 (we have stored address, now the length)
192 blist rtas-ibm-update-flash-64-and-reboot
197 blist rtas-ibm-update-flash-64-and-reboot
200 : rtas-ibm-update-flash-64 ( block-list -- status )
201 [ s" ibm,update-flash-64" rtas-get-token ] LITERAL rtas-cb rtas>token l!
202 2 rtas-cb rtas>nargs l!
203 1 rtas-cb rtas>nret l!
204 rtas-cb rtas>args0 l!
205 \ special unofficial parameter: if this is set to 1, the rtas function will not check, wether
206 \ we are on the perm side... this is needed for "update-flash -c" to work...
207 1 rtas-cb rtas>args1 l!
209 rtas-cb rtas>args2 l@
213 : flash-write ( image-address -- status)
214 load-base-override >r to load-base-override build-blocklist-v0
215 blist rtas-ibm-update-flash-64
216 r> to load-base-override 0= IF true ELSE false THEN
219 : commit 1 rtas-ibm-manage-flash-image ;
220 : reject 0 rtas-ibm-manage-flash-image ;
222 : rtas-ibm-validate-flash-image ( image-to-commit -- status )
223 [ s" ibm,validate-flash-image" rtas-get-token ] LITERAL rtas-cb rtas>token l!
224 2 rtas-cb rtas>nargs l!
225 2 rtas-cb rtas>nret l!
226 rtas-cb rtas>args0 l!
228 rtas-cb rtas>args1 l@
231 : rtas-get-blade-descr ( address size -- len status )
232 [ s" rtas-get-blade-descr" rtas-get-token ] LITERAL rtas-cb rtas>token l!
233 2 rtas-cb rtas>nargs l!
234 2 rtas-cb rtas>nret l!
235 rtas-cb rtas>args1 l!
236 rtas-cb rtas>args0 l!
238 rtas-cb rtas>args2 l@
239 rtas-cb rtas>args3 l@