Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / SLOF / board-js2x / slof / rtas.fs
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
8 \ *
9 \ * Contributors:
10 \ *     IBM Corporation - initial implementation
11 \ ****************************************************************************/
12
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>
18
19 \ for update-flash
20 : (get-flashside)  ( -- flashside )  rtas-get-flashside  ;
21
22 ' (get-flashside) to get-flashside
23
24 \ remember the current flashside
25 get-flashside to flashside? 
26
27 \ for update-flash
28 : (set-flashside)  ( flashside -- status )
29    dup rtas-set-flashside =  IF  0  ELSE  -1  THEN
30 ;
31
32 ' (set-flashside) to set-flashside
33
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!
41    rtas-cb rtas>args3 l!
42    enter-rtas
43    rtas-cb rtas>args5 l@
44 ;
45
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!
50    rtas-cb rtas>args0 l!
51    0 rtas-cb rtas>args1 l!
52    enter-rtas
53    rtas-cb rtas>args1 l@
54 ;
55
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!
60    enter-rtas
61    rtas-cb rtas>args0 l@
62 ;
63
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!
68    rtas-cb rtas>args0 l!
69    enter-rtas
70 ;
71
72 ' rtas-set-bootwatchdog to set-watchdog
73
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!
78    rtas-cb rtas>args0 l!
79    rtas-cb rtas>args1 l!
80    enter-rtas
81 ;
82
83 create blist 50 allot
84 blist 50 erase
85
86 : build-blocklist_old
87    \ set version
88    1 blist c!
89    \ set length of block list
90    50 blist 7 + c!
91    \ no more block list
92    0000000000000000 blist 8 + !
93    \ first block
94    get-load-base 0 + blist 10 + !
95    80000 blist 18 + !
96    get-load-base 80000 + blist 20 + !
97    80000 blist 28 + !
98    get-load-base 100000 + blist 30 + !
99    80000 blist 38 + !
100    get-load-base 180000 + blist 40 + !
101    8006C blist 48 + !
102 ;
103
104 80000 constant _block_size
105
106 : build-blocklist
107    \ set length of block list
108    \ length of flashfs at load-base is at offset 30... get it...
109    get-load-base 30 + @
110    \ calculate the number of blocks we need
111    _block_size / 1 +
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))
113    2 * 2 + 8 * blist !
114    \ set version ( in first byte only )
115    1 blist c!
116    \ no more block list
117    0000000000000000 blist 8 + !
118    \ length of flashfs at load-base is at offset 30... get it...
119    get-load-base 30 + @
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 +
125       !                      \ store it
126       get-load-base 30 + @
127       _block_size i * -      \ remaining length
128       dup _block_size > 
129       IF                     \ is the remaining length > block size
130         drop _block_size     \ then store the block size as length
131       ELSE
132                              \ do nothing (store remaining length)
133       THEN
134       blist 10 +          \ store the length at
135       i 10 * +            \ correct blist offset 
136       8 +                 \ + 8 (we have stored address, now the length)
137       !                   \ store it
138    loop
139 ;
140
141
142
143 : build-blocklist-v0_old
144    \ set version
145    0 blist c!
146    48 blist 7 + c!
147    \ first block
148    get-load-base 0 + blist 8 + !
149    80000 blist 10 + !
150    get-load-base 80000 + blist 18 + !
151    80000 blist 20 + !
152    get-load-base 100000 + blist 28 + !
153    80000 blist 30 + !
154    get-load-base 180000 + blist 38 + !
155    8006C blist 40 + !
156 ;
157
158 : build-blocklist-v0
159    \ set length of block list
160    \ length of flashfs at load-base is at offset 30... get it...
161    get-load-base 30 + @
162    \ calculate the number of blocks we need
163    _block_size / 1 +
164    \ total number of blocks is 1 (for header + (number of blocks for flashfs * 2 (1 for address 1 for length))
165    2 * 1 + 8 * blist !
166    \ length of flashfs at load-base is at offset 30... get it...
167    get-load-base 30 + @
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 +
173       !                      \ store it
174       get-load-base 30 + @
175       _block_size i * -      \ remaining length
176       dup _block_size > 
177       IF                     \ is the remaining length > block size
178         drop _block_size     \ then store the block size as length
179       ELSE
180                              \ do nothing (store remaining length)
181       THEN
182       blist 8 +          \ store the length at
183       i 10 * +            \ correct blist offset 
184       8 +                 \ + 8 (we have stored address, now the length)
185       !                   \ store it
186    loop
187 ;
188
189
190 : yy
191    build-blocklist
192    blist rtas-ibm-update-flash-64-and-reboot
193 ;
194
195 : yy0
196    build-blocklist-v0
197    blist rtas-ibm-update-flash-64-and-reboot
198 ;
199
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!
208    enter-rtas
209    rtas-cb rtas>args2 l@
210 ;
211
212 \ for update-flash
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
217 ;
218
219 : commit  1 rtas-ibm-manage-flash-image ;
220 : reject  0 rtas-ibm-manage-flash-image ;
221
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!
227    enter-rtas
228    rtas-cb rtas>args1 l@
229 ;
230
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!
237    enter-rtas
238    rtas-cb rtas>args2 l@
239    rtas-cb rtas>args3 l@
240 ;