fdt: Factor out code to replace a phandle in place

We generate a fake XICS phandle in QEMU and SLOF replaces that phandle
with the real one (i.e. SLOF's node address) in interrupt-parent and
interrupt-map properties. These properties are handled differently -
the interrupt-map is fixed in place while interrupt-parent is
decoded+encoded+set as a property.

This changes interrupt-parent fixing code to do what the interrupt-map
code does because soon we are going to have more phandles to fix and some
contain an array of phandles (such as "ibm,npu").

Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru>
---
Changes:
v2:
* removed fdt-replace-l,
This commit is contained in:
Alexey Kardashevskiy 2018-04-06 12:28:23 +10:00
parent 6e4b4adb89
commit b752674383
1 changed files with 17 additions and 8 deletions

View File

@ -279,6 +279,21 @@ fdt-claim-reserve
2drop 2drop
; ;
: (fdt-replace-phandles) ( old new propname propnamelen node -- )
get-property IF 2drop EXIT THEN
BEGIN
dup
WHILE ( old new prop-addr prop-len )
over l@
4 pick = IF
2 pick 2 pick l! \ replace old with new in place
TRUE TO (fdt-phandle-replaced)
THEN
4 - swap 4 + swap
REPEAT
2drop 2drop
;
\ Replace one phandle "old" with a phandle "new" in "node" and recursively \ Replace one phandle "old" with a phandle "new" in "node" and recursively
\ in its child nodes: \ in its child nodes:
: fdt-replace-all-phandles ( old new node -- ) : fdt-replace-all-phandles ( old new node -- )
@ -288,14 +303,8 @@ fdt-claim-reserve
( old new prop-addr prop-len R: node ) ( old new prop-addr prop-len R: node )
fdt-replace-interrupt-map fdt-replace-interrupt-map
THEN THEN
s" interrupt-parent" r@ get-property 0= IF
( old new prop-addr prop-len R: node ) 2dup s" interrupt-parent" r@ (fdt-replace-phandles)
decode-int -rot 2drop ( old new val R: node )
2 pick = IF ( old new R: node )
dup encode-int s" interrupt-parent" r@ set-property
TRUE TO (fdt-phandle-replaced)
THEN
THEN
\ ... add more properties that have to be fixed here ... \ ... add more properties that have to be fixed here ...
r> r>
\ Now recurse over all child nodes: ( old new node ) \ Now recurse over all child nodes: ( old new node )