devtree: fix addr/size cells should use parent's
authorLunaixsky <lunaixsky@qq.com>
Thu, 10 Oct 2024 22:28:56 +0000 (23:28 +0100)
committerLunaixsky <lunaixsky@qq.com>
Thu, 10 Oct 2024 22:30:18 +0000 (23:30 +0100)
* fix: destory the mapkey after searching
* ref: grouping the devtree header according to their functionality

lunaix-os/hal/devtree/dt.c
lunaix-os/hal/devtree/dt_interrupt.c
lunaix-os/includes/hal/devtree.h

index 7be880b1e5f6855588bf8fe558d16fc846cb871c..72c443c340bc3026691145bdd6147dc6b3572bd4 100644 (file)
@@ -433,7 +433,7 @@ __resolve_inter_map()
 
     llist_for_each(pos, n, &dtctx.nodes, nodes)
     {
-        resolve_interrupt_map(BASE_TO_DTNODE(pos));
+        dt_resolve_interrupt_map(BASE_TO_DTNODE(pos));
     }
 }
 
index d2db72d4911e91f8c5a7a3d4e7f36b33a4d74fb9..e6ad3ca184ba2444a389e690c6fb2c7be28b049e 100644 (file)
@@ -40,7 +40,7 @@ __destory_key(struct dt_intr_mapkey* key)
 static inline unsigned int
 __interrupt_keysize(struct dt_node_base* base)
 {
-    return base->addr_c + base->intr_c;
+    return dt_size_cells(base) + base->intr_c;
 }
 
 static void
@@ -83,7 +83,7 @@ __get_connected_nexus(struct dt_node_base* base)
 }
 
 void
-resolve_interrupt_map(struct dt_node* node)
+dt_resolve_interrupt_map(struct dt_node* node)
 {
     struct dt_intr_node* inode;
     struct dt_intr_map* imap;
@@ -135,7 +135,7 @@ resolve_interrupt_map(struct dt_node* node)
 }
 
 struct dt_prop_val*
-resolve_interrupt(struct dt_node* node)
+dt_resolve_interrupt(struct dt_node* node)
 {
     struct dt_node_base* nexus;
     struct dt_intr_node* i_nexus, *i_node;
@@ -154,16 +154,16 @@ resolve_interrupt(struct dt_node* node)
         return &i_node->intr.arr;
     }
 
-    keylen = nexus->addr_c + nexus->intr_c;
+    keylen = __interrupt_keysize(nexus);
     key = (struct dt_intr_mapkey) {
         .val = valloc(keylen * sizeof(int)),
         .size = keylen
     };
 
     memcpy( key.val, 
-            node->reg.encoded, nexus->addr_c * sizeof(int));
+            node->reg.encoded, dt_addr_cells(nexus) * sizeof(int));
     
-    memcpy(&key.val[nexus->addr_c],
+    memcpy(&key.val[dt_addr_cells(nexus)],
             i_node->intr.arr.encoded, nexus->intr_c * sizeof(int));
 
     __mask_key(&key, &i_nexus->map->key_mask);
@@ -175,7 +175,9 @@ resolve_interrupt(struct dt_node* node)
         {
             return &pos->parent_props;
         }
-    } 
+    }
+
+    __destory_key(&key);
 }
 
 bool
index 5203d1aa7706d143bdb3197660f7595ce3bbc487..088e66f115d930d26b1e6d3853ec39aa19be2916 100644 (file)
@@ -125,7 +125,6 @@ struct dt_node_base
             bool dma_ncoherent : 1;
             bool intr_controll : 1;
             bool intr_neuxs    : 1;
-            unsigned int other : 29;
         };
         unsigned int    flags;
     };
@@ -279,8 +278,11 @@ struct dt_node_iter
     node_predicate_t pred;
 };
 
-#define dtnode_child_foreach(node_base, pos, n)  \
-        llist_for_each(pos, n, &(node_base)->children, siblings)
+
+
+/****
+ * FDT Related
+ ****/
 
 #define fdt_prop(tok) ((tok)->token == FDT_PROP)
 #define fdt_node(tok) ((tok)->token == FDT_NOD_BEGIN)
@@ -309,6 +311,16 @@ fdt_memrsvd_itnext(struct fdt_memrsvd_iter* rsvdi);
 void
 fdt_memrsvd_itend(struct fdt_memrsvd_iter* rsvdi);
 
+static inline char*
+fdtit_prop_key(struct fdt_iter* fdti)
+{
+    return &fdti->str_block[fdti->prop->nameoff];
+}
+
+
+/****
+ * DT Main Functions: General
+ ****/
 
 bool
 dt_load(ptr_t dtb_dropoff);
@@ -319,6 +331,29 @@ dt_resolve_phandle(dt_phnd_t phandle);
 struct dt_prop_val*
 dt_getprop(struct dt_node_base* base, const char* name);
 
+struct dt_prop_val*
+dt_resolve_interrupt(struct dt_node* node);
+
+void
+dt_resolve_interrupt_map(struct dt_node* node);
+
+static inline unsigned int
+dt_addr_cells(struct dt_node_base* base)
+{
+    return base->parent ? base->parent->addr_c : base->addr_c;
+}
+
+static inline unsigned int
+dt_size_cells(struct dt_node_base* base)
+{
+    return base->parent ? base->parent->sz_c : base->sz_c;
+}
+
+
+/****
+ * DT Main Functions: Node-finder
+ ****/
+
 void
 dt_begin_find_byname(struct dt_node_iter* iter, 
                      struct dt_node* node, const char* name);
@@ -327,12 +362,6 @@ void
 dt_begin_find(struct dt_node_iter* iter, struct dt_node* node, 
               node_predicate_t pred, void* closure);
 
-struct dt_prop_val*
-resolve_interrupt(struct dt_node* node);
-
-void
-resolve_interrupt_map(struct dt_node* node);
-
 static inline void
 dt_end_find(struct dt_node_iter* iter)
 {
@@ -350,6 +379,10 @@ dt_found_any(struct dt_node_iter* iter)
 }
 
 
+/****
+ * DT Main Functions: Node-binding
+ ****/
+
 static inline void
 dt_bind_object(struct dt_node_base* base, void* obj)
 {
@@ -365,11 +398,10 @@ dt_has_binding(struct dt_node_base* base)
 #define dt_binding_of(node_base, type)  \
     ((type)(node_base)->obj)
 
-static inline char*
-fdtit_prop_key(struct fdt_iter* fdti)
-{
-    return &fdti->str_block[fdti->prop->nameoff];
-}
+
+/****
+ * DT Main Functions: Prop decoders
+ ****/
 
 static inline void
 dt_decode(struct dt_prop_iter* dtpi, struct dt_node_base* node, 
@@ -386,11 +418,16 @@ dt_decode(struct dt_prop_iter* dtpi, struct dt_node_base* node,
 
 #define dt_decode_reg(dtpi, node, field) \
             dt_decode(dtpi, &(node)->base, &(node)->field, \
-                            (node)->base.sz_c + (node)->base.addr_c);
+                        dt_size_cells(&(node)->base) \
+                            + dt_addr_cells(&(node)->base))
 
 #define dt_decode_range(dtpi, node, field) \
             dt_decode(dtpi, &(node)->base, &(node)->field, \
-                            (node)->base.sz_c * 2 + (node)->base.addr_c);
+                        dt_size_cells(&(node)->base) * 2 \
+                            + dt_addr_cells(&(node)->base))
+
+#define dt_decode_simple(dtpi, prop) \
+            dt_decode(dtpi, NULL, prop, 1);
 
 #define dtprop_off(dtpi) \
             (unsigned int)(\
@@ -479,7 +516,7 @@ dtprop_reg_nextaddr(struct dt_prop_iter* dtpi)
     ptr_t t;
 
     t = (ptr_t)dtprop_to_u64(dtprop_reg_addr(dtpi));
-    dtprop_next(dtpi);
+    dtprop_next_n(dtpi, dt_addr_cells(dtpi->node));
 
     return t;
 }
@@ -496,7 +533,7 @@ dtprop_reg_nextlen(struct dt_prop_iter* dtpi)
     size_t t;
 
     t = (size_t)dtprop_to_u64(dtprop_reg_len(dtpi));
-    dtprop_next(dtpi);
+    dtprop_next_n(dtpi, dt_size_cells(dtpi->node));
 
     return t;
 }
@@ -510,13 +547,13 @@ dtprop_range_childbus(struct dt_prop_iter* dtpi)
 static inline dt_enc_t
 dtprop_range_parentbus(struct dt_prop_iter* dtpi)
 {
-    return dtprop_extract(dtpi, dtpi->node->addr_c);
+    return dtprop_extract(dtpi, dt_addr_cells(dtpi->node));
 }
 
 static inline dt_enc_t
 dtprop_range_len(struct dt_prop_iter* dtpi)
 {
-    return dtprop_extract(dtpi, dtpi->node->addr_c * 2);
+    return dtprop_extract(dtpi, dt_addr_cells(dtpi->node) * 2);
 }
 
 #endif /* __LUNAIX_DEVTREE_H */