[SLOF] [PATCH slof] fdt: Fix creating new nodes at H_CAS

Alexey Kardashevskiy aik at ozlabs.ru
Thu Jan 30 10:09:56 AEDT 2020



On 29/01/2020 22:33, Greg Kurz wrote:
> On Wed, 29 Jan 2020 13:23:16 +1100
> Alexey Kardashevskiy <aik at ozlabs.ru> wrote:
> 
>> So far we only allowed new ibm,dynamic-reconfiguration-memory and memory
>> nodes in the FDT update blob at ibm,client-architecture-support (CAS).
>> DRC do not have unit addresses and are easy, for memory nodee we use
>> an address from the node name.
>>
>> For early hot plugged PCI devices (plugged after reset but before CAS)
>> we have to have a similar hack as for memory@ but parse the address
>> differently because of different binding.
>>
>> Instead, this changes new nodes creation. At pass#0 when we copy phandles
>> from the FDT update blob to SLOF, we create new nodes with all
>> new properties and call "finish-device" only after all properties are
>> copied to the new nodes. At this point we particularly care about "reg"
>> as this is the unit address which SLOF parses for us and sets the unit
>> address in "finish-device"; we could skip other properties for later
> 
> "finish-device" only sets the first entry of the "reg" property as a
> fallback. This will be an issue when we start seeing new nodes with
> bigger unit values (eg, a new PHB).
> 
> The setting of the unit from "reg" is actually handled by
> "fdt-unflatten-node" which calls "fdt-reg-unit":
> 
>       2dup s" reg" str= IF
>           2swap 2dup fdt-reg-unit 2swap
>       THEN
> 
> Something similar could be done...

Huh. Should not we then fix "finish-device"?


> 
>> passes.
>>
>> Note this creates naked nodes with no methods normally added to the nodes
>> as this bypasses normal discovery which SLOF performs at start. So
>> if pass#1 does not find the node created in pass#0, this points to
>> missing "decode-unit" at the new node parent (happens when adding bridge-
>> under-bridge) and this prints a message and resets.
>>
>> While at this, fix few trailing spaces and comments.
>>
>> Signed-off-by: Alexey Kardashevskiy <aik at ozlabs.ru>
>> ---
>>  board-qemu/slof/fdt.fs | 100 ++++++++++++++++++++++-------------------
>>  1 file changed, 54 insertions(+), 46 deletions(-)
>>
>> diff --git a/board-qemu/slof/fdt.fs b/board-qemu/slof/fdt.fs
>> index fc39a82a10b5..eb726cc990ae 100644
>> --- a/board-qemu/slof/fdt.fs
>> +++ b/board-qemu/slof/fdt.fs
>> @@ -112,7 +112,7 @@ fdt-check-header
>>  ;
>>  
>>  \ Lookup a string by index
>> -: fdt-fetch-string ( index -- str-addr str-len )  
>> +: fdt-fetch-string ( index -- str-addr str-len )
>>    fdt-strings + dup from-cstring
>>  ;
>>  
>> @@ -128,7 +128,7 @@ fdt-check-header
>>  ;
>>  
>>  \ Encode fdt property to OF property
>> -: fdt-encode-prop  ( addr len -- )
>> +: fdt-encode-prop  ( addr len -- pa ps )
>>     2dup fdt-prop-is-string? IF
>>        1- encode-string
>>     ELSE
>> @@ -443,33 +443,6 @@ r> drop
>>     device-end
>>  ;
>>  
>> -: fdt-create-cas-node ( name  -- )
>> -    2dup
>> -    2dup " memory@" find-substr 0 = IF
>> -	fdt-debug IF ." Creating memory@ " cr THEN
>> -	new-device
>> -	2dup " @" find-substr nip device-name       \ Parse the node name
>> -	2dup
>> -	2dup " @" find-substr rot over + 1 + -rot - 1 - \ Jump to addr afte "@"
>> -	parse-2int nip xlsplit set-unit                 \ Parse and set unit
>> -	finish-device
>> -    ELSE
>> -	2dup " ibm,dynamic-reconfiguration-memory" find-substr 0 = IF
>> -	    fdt-debug IF  ." Creating ibm,dynamic-reconfiguration-memory " cr THEN
>> -	    new-device
>> -	    device-name
>> -	    finish-device
>> -	ELSE
>> -	    2drop 2drop
>> -	    false to fdt-cas-fix?
>> -	    ." Node not supported " cr
>> -	    EXIT
>> -	THEN
>> -    THEN
>> -
>> -    find-node ?dup 0 <> IF set-node THEN
>> -;
>> -
>>  : str=phandle? ( s len -- true|false )
>>      2dup s" phandle" str= >r
>>      s" linux,phandle" str=
>> @@ -483,7 +456,7 @@ r> drop
>>  	false to fdt-cas-fix?
>>  	EXIT
>>      THEN drop
>> -    fdt-fetch-unit
>> +    fdt-fetch-unit		    ( a1 $name )
>>      dup 0 = IF drop drop " /" THEN
>>      40 left-parse-string
>>      2swap ?dup 0 <> IF
>> @@ -492,29 +465,52 @@ r> drop
>>      ELSE
>>  	drop
>>      THEN
>> -    fdt-debug IF ." Setting node: " 2dup type cr THEN
>>      2dup find-node ?dup 0 <> IF
>> -	set-node 2drop
>> +	set-node
>> +	fdt-debug IF ." Setting node: " 2dup type cr THEN
>> +	2drop
>> +	\ newnode?=0: updating the existing node, i.e. pass1 adds only phandles
>> +	0
>>      ELSE
>> +	fdt-cas-pass 0 <> IF
>> +	    \ We could not find the node added in the previous pass,
>> +	    \ most likely because it is hotplug-under-hotplug case
>> +	    \ (such as PCI brigde under bridge) when missing new node methods
>> +	    \ such as "decode-unit" are critical.
>> +	    \ Reboot when detect such case which is expected as it is a part of
>> +	    \ ibm,client-architecture-support.
>> +	    ." Cannot handle FDT update for the " 2dup type
>> +	    ."  node, rebooting" cr
>> +	    reset-all
>> +	THEN
>>  	fdt-debug IF ." Creating node: " 2dup type cr THEN
>> -	fdt-create-cas-node
>> +	new-device
>> +	2dup " @" find-substr nip
>> +	device-name
>> +	\ newnode?=1: adding new node, i.e. pass1 adds all properties,
>> +	\ most importantly "reg". After reading properties, we call
>> +	\ "finish-device" which sets the unit address from "reg".
>> +	1
>>      THEN
>> -    fdt-debug IF ." Current  now: " pwd cr THEN
>> +    swap			( newnode? a1 )
>> +
>> +    fdt-debug IF ." Current  now: " pwd  get-node ."  = " . cr THEN
>>      BEGIN
>>  	fdt-next-tag dup OF_DT_END_NODE <>
>>      WHILE
>> +				( newnode? a1 tag )
>>  	dup OF_DT_PROP = IF
>> -	    drop dup		( drop tag, dup addr     : a1 a1 )
>> -	    dup l@ dup rot 4 +	( fetch size, stack is   : a1 s s a2)
>> -	    dup l@ swap 4 +	( fetch nameid, stack is : a1 s s i a3 )
>> -	    rot			( we now have: a1 s i a3 s )
>> -	    fdt-encode-prop rot	( a1 s pa ps i)
>> -	    fdt-fetch-string		( a1 s pa ps na ns )
>> +	    drop dup		( newnode? a1 a1 )
>> +	    dup l@ dup rot 4 +	( newnode? a1 s s a2)
>> +	    dup l@ swap 4 +	( newnode? a1 s s i a3 )
>> +	    rot			( newnode? a1 s i a3 s )
>> +	    fdt-encode-prop rot	( newnode? a1 s pa ps i)
>> +	    fdt-fetch-string	( newnode? a1 s pa ps na ns )
>>  
>>  	    fdt-cas-pass CASE
>>  	    0 OF
>> -		2dup str=phandle? IF
>> -		    fdt-debug IF 4dup ."   Phandle: " type ." =" swap ." @" . ."  " .d ."  bytes" cr THEN
>> +		2dup str=phandle? 7 pick or IF
>> +		    fdt-debug IF 4dup ."   Property: " type ." =" swap ." @" . ."  " .d ."  bytes" cr THEN
>>  		    property
>>  		ELSE
>>  		    4drop
>> @@ -541,8 +537,14 @@ r> drop
>>  	    ENDCASE
>>  
>>  	    + 8 + 3 + fffffffc and
>> -	ELSE dup OF_DT_BEGIN_NODE = IF
>> -		drop			( drop tag )
>> +	ELSE		( newnode? a1 tag )
>> +	    dup OF_DT_BEGIN_NODE = IF
>> +		2 pick IF
>> +		    rot drop 0 -rot


The proposed change from below is also needed here then, or since it has
grown enough, this can make a separate function then.

Can you please take over this and finish the change (merge yours 1/2
into this one and I will comment on 2/2)? Thanks,


>> +		    get-node finish-device set-node
>> +		    fdt-debug IF ." Finished node: " pwd  get-node ."  = " . cr THEN
>> +		THEN
>> +		drop			( a1 )
>>  		4 -
>>  		(fdt-fix-cas-node)
>>  		get-parent set-node
>> @@ -554,13 +556,19 @@ r> drop
>>  	    THEN
>>  	THEN
>>      REPEAT
>> -    drop \ drop tag
>> +			( newnode? a1 tag )
>> +    drop
>> +    swap		( a1 newnode? )
>> +    IF
> 
> ... here.
> 
>     " reg" get-node get-package-property IF ELSE fdt-reg-unit THEN
> 
> This doesn't address the case of a hotplug-over-hotplug since the
> new parent node doesn't have a "decode-unit" method, but at least
> it covers all cases where the parent node was created at boot time.
> 
>> +        get-node finish-device set-node
>> +	fdt-debug IF ." Finished subnode: " pwd  get-node ."  = " . cr THEN
>> +    THEN
>>  ;
>>  
>>  : fdt-fix-cas-node ( start -- )
>>      0 to fdt-cas-pass dup (fdt-fix-cas-node) drop \ Add phandles
>>      1 to fdt-cas-pass dup (fdt-fix-cas-node) drop \ Patch+add other properties
>> -    2 to fdt-cas-pass dup (fdt-fix-cas-node) drop \ Delete phandles from pass 1
>> +    2 to fdt-cas-pass dup (fdt-fix-cas-node) drop \ Delete phandles from pass 0
>>      drop
>>  ;
>>  
> 

-- 
Alexey


More information about the SLOF mailing list