177 lines
4.1 KiB
Forth
177 lines
4.1 KiB
Forth
\ *****************************************************************************
|
|
\ * Copyright (c) 2011 IBM Corporation
|
|
\ * All rights reserved.
|
|
\ * This program and the accompanying materials
|
|
\ * are made available under the terms of the BSD License
|
|
\ * which accompanies this distribution, and is available at
|
|
\ * http://www.opensource.org/licenses/bsd-license.php
|
|
\ *
|
|
\ * Contributors:
|
|
\ * IBM Corporation - initial implementation
|
|
\ ****************************************************************************/
|
|
|
|
\ KVM/qemu RTAS
|
|
|
|
\ rtas control block
|
|
|
|
371 cp
|
|
|
|
STRUCT
|
|
/l field rtas>token
|
|
/l field rtas>nargs
|
|
/l field rtas>nret
|
|
/l field rtas>args0
|
|
/l field rtas>args1
|
|
/l field rtas>args2
|
|
/l field rtas>args3
|
|
/l field rtas>args4
|
|
/l field rtas>args5
|
|
/l field rtas>args6
|
|
/l field rtas>args7
|
|
/l C * field rtas>args
|
|
/l field rtas>bla
|
|
CONSTANT /rtas-control-block
|
|
|
|
CREATE rtas-cb /rtas-control-block allot
|
|
rtas-cb /rtas-control-block erase
|
|
|
|
0 VALUE rtas-base
|
|
0 VALUE rtas-size
|
|
0 VALUE rtas-entry
|
|
0 VALUE rtas-node
|
|
|
|
\ Locate qemu RTAS, remove the linux,... properties we really don't
|
|
\ want them to stick around
|
|
|
|
372 cp
|
|
|
|
: find-qemu-rtas ( -- )
|
|
" /rtas" find-device get-node to rtas-node
|
|
|
|
" linux,rtas-base" rtas-node get-package-property IF
|
|
device-end EXIT THEN
|
|
drop l@ to rtas-base
|
|
" linux,rtas-base" delete-property
|
|
|
|
" rtas-size" rtas-node get-package-property IF
|
|
device-end EXIT THEN
|
|
drop l@ to rtas-size
|
|
|
|
" linux,rtas-entry" rtas-node get-package-property IF
|
|
rtas-base to rtas-entry
|
|
ELSE
|
|
drop l@ to rtas-entry
|
|
" linux,rtas-entry" delete-property
|
|
THEN
|
|
|
|
\ ." RTAS found, base=" rtas-base . ." size=" rtas-size . cr
|
|
|
|
device-end
|
|
;
|
|
find-qemu-rtas
|
|
373 cp
|
|
|
|
: enter-rtas ( -- )
|
|
rtas-cb rtas-base 0 rtas-entry call-c drop
|
|
;
|
|
|
|
: rtas-get-token ( str len -- token | 0 )
|
|
rtas-node get-package-property IF 0 ELSE drop l@ THEN
|
|
;
|
|
|
|
#include <rtas/rtas-reboot.fs>
|
|
#include <rtas/rtas-cpu.fs>
|
|
|
|
: rtas-set-tce-bypass ( unit enable -- )
|
|
" ibm,set-tce-bypass" rtas-get-token rtas-cb rtas>token l!
|
|
2 rtas-cb rtas>nargs l!
|
|
0 rtas-cb rtas>nret l!
|
|
rtas-cb rtas>args1 l!
|
|
rtas-cb rtas>args0 l!
|
|
enter-rtas
|
|
;
|
|
|
|
: rtas-quiesce ( -- )
|
|
" quiesce" rtas-get-token rtas-cb rtas>token l!
|
|
0 rtas-cb rtas>nargs l!
|
|
0 rtas-cb rtas>nret l!
|
|
enter-rtas
|
|
;
|
|
|
|
|
|
0 value puid
|
|
|
|
: rtas-do-config-@ ( config-addr size -- value)
|
|
\ We really want to cache this !
|
|
" ibm,read-pci-config" rtas-get-token rtas-cb rtas>token l!
|
|
4 rtas-cb rtas>nargs l!
|
|
2 rtas-cb rtas>nret l!
|
|
( addr size ) rtas-cb rtas>args3 l!
|
|
puid ffffffff and rtas-cb rtas>args2 l!
|
|
puid 20 rshift rtas-cb rtas>args1 l!
|
|
( addr ) rtas-cb rtas>args0 l!
|
|
enter-rtas
|
|
rtas-cb rtas>args4 l@ dup IF
|
|
\ Do not warn on error as this is part of the
|
|
\ normal PCI probing pass
|
|
drop ffffffff
|
|
ELSE
|
|
drop rtas-cb rtas>args5 l@
|
|
THEN
|
|
;
|
|
|
|
: rtas-do-config-! ( value config-addr size )
|
|
\ We really want to cache this !
|
|
" ibm,write-pci-config" rtas-get-token rtas-cb rtas>token l!
|
|
5 rtas-cb rtas>nargs l!
|
|
1 rtas-cb rtas>nret l!
|
|
( value addr size ) rtas-cb rtas>args3 l!
|
|
puid ffffffff and rtas-cb rtas>args2 l!
|
|
puid 20 rshift rtas-cb rtas>args1 l!
|
|
( value addr ) rtas-cb rtas>args0 l!
|
|
( value ) rtas-cb rtas>args4 l!
|
|
enter-rtas
|
|
rtas-cb rtas>args5 l@ dup IF
|
|
." RTAS write config err " . cr
|
|
ELSE drop THEN
|
|
;
|
|
|
|
: rtas-config-b@ ( config-addr -- value )
|
|
1 rtas-do-config-@ ff and
|
|
;
|
|
: rtas-config-b! ( value config-addr -- )
|
|
1 rtas-do-config-!
|
|
;
|
|
: rtas-config-w@ ( config-addr -- value )
|
|
2 rtas-do-config-@ ffff and
|
|
;
|
|
: rtas-config-w! ( value config-addr -- )
|
|
2 rtas-do-config-!
|
|
;
|
|
: rtas-config-l@ ( config-addr -- value )
|
|
4 rtas-do-config-@ ffffffff and
|
|
;
|
|
: rtas-config-l! ( value config-addr -- )
|
|
4 rtas-do-config-!
|
|
;
|
|
|
|
: of-start-cpu rtas-start-cpu ;
|
|
|
|
' power-off to halt
|
|
' rtas-system-reboot to reboot
|
|
|
|
\ Methods of the rtas node proper
|
|
rtas-node set-node
|
|
|
|
: open true ;
|
|
: close ;
|
|
|
|
: instantiate-rtas ( adr -- entry )
|
|
dup rtas-base swap rtas-size move
|
|
rtas-entry rtas-base - +
|
|
;
|
|
|
|
device-end
|
|
|
|
374 cp
|