Changeset 16529d5 in mainline for kernel/genarch/src


Ignore:
Timestamp:
2006-09-20T20:31:44Z (19 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
28ecadb
Parents:
61e90dd
Message:

More ofw_tree work and fixes.
Add ofw_tree_lookup().
Every ofw_tree_node now also contains a disambigued name which is essential for tree lookups.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/genarch/src/ofw/ofw_tree.c

    r61e90dd r16529d5  
    3636 */
    3737
     38#include <genarch/ofw/ofw_tree.h>
     39#include <arch/memstr.h>
     40#include <func.h>
     41#include <print.h>
     42#include <panic.h>
     43
     44#define PATH_MAX_LEN    80
     45#define NAME_BUF_LEN    50
     46
     47static ofw_tree_node_t *ofw_root;
     48
     49void ofw_tree_init(ofw_tree_node_t *root)
     50{
     51        ofw_root = root;
     52}
     53
     54/** Return value of the 'name' property.
     55 *
     56 * @param node Node of interest.
     57 *
     58 * @return Value of the 'name' property belonging to the node.
     59 */
     60const char *ofw_tree_node_name(const ofw_tree_node_t *node)
     61{
     62        int i;
     63       
     64        for (i = 0; i < node->properties; i++) {
     65                if (strncmp(node->property[i].name, "name", strlen("name")) == 0) {
     66                        if (node->property[i].size < 2)
     67                                panic("Invalid name property.\n");
     68                        return node->property[i].value;
     69                }
     70        }
     71       
     72        panic("Node without name property.\n");
     73}
     74
     75/** Lookup child of given name.
     76 *
     77 * @param node Node whose child is being looked up.
     78 * @param da_name Disambigued name of the child being looked up.
     79 *
     80 * @return NULL if there is no such child or pointer to the matching child node.
     81 */
     82static ofw_tree_node_t *ofw_tree_find_child(ofw_tree_node_t *node, const char *da_name)
     83{
     84        ofw_tree_node_t *cur;
     85       
     86        for (cur = node->child; cur; cur = cur->peer) {
     87                if (strncmp(cur->da_name, da_name, strlen(da_name)) == 0)
     88                        return cur;
     89        }
     90       
     91        return NULL;
     92}
     93
     94/** Lookup OpenFirmware node by its path.
     95 *
     96 * @param path Path to the node.
     97 *
     98 * @return NULL if there is no such node or pointer to the leaf node.
     99 */
     100ofw_tree_node_t *ofw_tree_lookup(const char *path)
     101{
     102        char buf[NAME_BUF_LEN+1];
     103        ofw_tree_node_t *node = ofw_root;
     104        index_t i, j;
     105       
     106        if (path[0] != '/')
     107                return NULL;
     108       
     109        for (i = 1; i < strlen(path) && node; i = j + 1) {
     110                for (j = i; j < strlen(path) && path[j] != '/'; j++)
     111                        ;
     112                if (i == j)     /* skip extra slashes */
     113                        continue;
     114                       
     115                memcpy(buf, &path[i], j - i);
     116                buf[j - i] = '\0';
     117                node = ofw_tree_find_child(node, buf);
     118        }
     119       
     120        return node;
     121}
     122
     123/** Recursively print subtree rooted in a node.
     124 *
     125 * @param node Root of the subtree.
     126 * @param path Current path, NULL for the very root of the entire tree.
     127 */
     128static void ofw_tree_node_print(const ofw_tree_node_t *node, const char *path)
     129{
     130        char p[PATH_MAX_LEN];
     131       
     132        if (node->parent) {
     133                snprintf(p, PATH_MAX_LEN, "%s/%s", path, node->da_name);
     134                printf("%s\n", p);
     135        } else {
     136                snprintf(p, PATH_MAX_LEN, "%s", node->da_name);
     137                printf("/\n");
     138        }
     139
     140        if (node->child)
     141                ofw_tree_node_print(node->child, p);
     142       
     143        if (node->peer)
     144                ofw_tree_node_print(node->peer, path);
     145}
     146
     147/** Print the structure of the OpenFirmware device tree. */
     148void ofw_tree_print(void)
     149{
     150        ofw_tree_node_print(ofw_root, NULL);
     151}
     152
    38153/** @}
    39154 */
Note: See TracChangeset for help on using the changeset viewer.