Changeset 28ecadb in mainline for kernel/genarch/src/ofw/ofw_tree.c


Ignore:
Timestamp:
2006-09-22T21:44:54Z (18 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
5d684e4
Parents:
16529d5
Message:

Convert sparc64 to detect keyboard and determine
its physical address by walking the memory representation
of the OpenFirmware device tree.

Add bus-specific functions that know how to apply the
"ranges" property to one component of the "reg" property.
Buses supported so far include FHC, EBUS and PCI.

File:
1 edited

Legend:

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

    r16529d5 r28ecadb  
    5252}
    5353
     54/** Get OpenFirmware node property.
     55 *
     56 * @param node Node in which to lookup the property.
     57 * @param name Name of the property.
     58 *
     59 * @return Pointer to the property structure or NULL if no such property.
     60 */
     61ofw_tree_property_t *ofw_tree_getprop(const ofw_tree_node_t *node, const char *name)
     62{
     63        int i;
     64       
     65        for (i = 0; i < node->properties; i++) {
     66                if (strcmp(node->property[i].name, name) == 0)
     67                        return &node->property[i];
     68        }
     69
     70        return NULL;
     71}
     72
    5473/** Return value of the 'name' property.
    5574 *
     
    6079const char *ofw_tree_node_name(const ofw_tree_node_t *node)
    6180{
    62         int i;
     81        ofw_tree_property_t *prop;
    6382       
    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         }
     83        prop = ofw_tree_getprop(node, "name");
     84        if (!prop)
     85                panic("Node without name property.\n");
     86               
     87        if (prop->size < 2)
     88                panic("Invalid name property.\n");
    7189       
    72         panic("Node without name property.\n");
     90        return prop->value;
    7391}
    7492
     
    7694 *
    7795 * @param node Node whose child is being looked up.
    78  * @param da_name Disambigued name of the child being looked up.
     96 * @param name Name of the child being looked up.
    7997 *
    8098 * @return NULL if there is no such child or pointer to the matching child node.
    8199 */
    82 static ofw_tree_node_t *ofw_tree_find_child(ofw_tree_node_t *node, const char *da_name)
     100static ofw_tree_node_t *ofw_tree_find_child(ofw_tree_node_t *node, const char *name)
    83101{
    84102        ofw_tree_node_t *cur;
    85103       
     104        /*
     105         * Try to find the disambigued name.
     106         */
    86107        for (cur = node->child; cur; cur = cur->peer) {
    87                 if (strncmp(cur->da_name, da_name, strlen(da_name)) == 0)
     108                if (strcmp(cur->da_name, name) == 0)
    88109                        return cur;
    89110        }
    90111       
     112        /*
     113         * Disambigued name not found.
     114         * Lets try our luck with possibly ambiguous "name" property.
     115         *
     116         * We need to do this because paths stored in "/aliases"
     117         * are not always fully-qualified.
     118         */
     119        for (cur = node->child; cur; cur = cur->peer) {
     120                if (strcmp(ofw_tree_node_name(cur), name) == 0)
     121                        return cur;
     122        }
     123               
    91124        return NULL;
    92125}
Note: See TracChangeset for help on using the changeset viewer.