aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--board-qemu/slof/fdt.fs72
1 files changed, 72 insertions, 0 deletions
diff --git a/board-qemu/slof/fdt.fs b/board-qemu/slof/fdt.fs
index ca4cd7d..7da4ff0 100644
--- a/board-qemu/slof/fdt.fs
+++ b/board-qemu/slof/fdt.fs
@@ -13,6 +13,11 @@
0 VALUE fdt-debug
TRUE VALUE fdt-cas-fix?
0 VALUE fdt-cas-pass
+0 VALUE fdt-generation#
+
+: fdt-update-from-fdt ( -- )
+ fdt-generation# encode-int s" slof,from-fdt" property
+;
\ Bail out if no fdt
fdt-start 0 = IF -1 throw THEN
@@ -198,6 +203,8 @@ fdt-check-header
decode-int dup fdt-create-dec fdt-create-enc 2drop
THEN
+ fdt-update-from-fdt
+
finish-device
;
@@ -514,6 +521,9 @@ r> drop
swap ( newnode? a1 )
fdt-debug IF ." Current now: " pwd get-node ." = " . cr THEN
+ fdt-cas-pass 0= IF
+ fdt-update-from-fdt
+ THEN
BEGIN
fdt-next-tag dup OF_DT_END_NODE <>
WHILE
@@ -584,8 +594,70 @@ r> drop
THEN
;
+: alias-dev-path ( xt -- dev-path len )
+ link> execute decode-string 2swap 2drop
+;
+
+: alias-name ( xt -- alias-name len )
+ link> >name name>string
+;
+
+: fdt-cas-alias-obsolete? ( xt -- true|false )
+ alias-dev-path find-node 0=
+;
+
+: (fdt-cas-delete-obsolete-aliases) ( xt -- )
+ dup IF
+ dup @
+ recurse
+ dup alias-name s" name" str= IF ELSE
+ dup fdt-cas-alias-obsolete? IF
+ fdt-debug IF ." Deleting obsolete alias: " dup alias-name type ." -> " dup alias-dev-path type cr THEN
+ dup alias-name
+ delete-property
+ THEN
+ THEN
+ THEN
+ drop
+;
+
+: fdt-cas-delete-obsolete-aliases ( -- )
+ s" /aliases" find-device
+ get-node node>properties @ cell+ @ (fdt-cas-delete-obsolete-aliases)
+ device-end
+;
+
+: fdt-cas-node-obsolete? ( node -- true|false)
+ s" slof,from-fdt" rot get-package-property IF
+ \ Not a QEMU originated node
+ false
+ ELSE
+ decode-int nip nip fdt-generation# <
+ THEN
+;
+
+: (fdt-cas-search-obsolete-nodes) ( start node -- )
+ dup IF
+ dup child 2 pick swap recurse
+ dup peer 2 pick swap recurse
+
+ dup fdt-cas-node-obsolete? IF
+ fdt-debug IF dup ." Deleting obsolete node: " dup .node ." = " . cr THEN
+ dup delete-node
+ THEN
+ THEN
+ 2drop
+;
+
+: fdt-cas-delete-obsolete-nodes ( start -- )
+ s" /" find-device get-node (fdt-cas-search-obsolete-nodes)
+ fdt-cas-delete-obsolete-aliases
+;
+
: fdt-fix-cas-node ( start -- )
+ fdt-generation# 1+ to fdt-generation#
0 to fdt-cas-pass dup (fdt-fix-cas-node) drop \ Add phandles
+ dup fdt-cas-delete-obsolete-nodes \ Delete removed devices
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 0
drop