- Timestamp:
- 2006-09-20T20:31:44Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 28ecadb
- Parents:
- 61e90dd
- Location:
- kernel
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/sparc64/Makefile.inc
r61e90dd r16529d5 61 61 CONFIG_FB = y 62 62 63 ## Compile with support for OpenFirmware device tree. 64 # 65 66 CONFIG_OFW_TREE = y 63 67 64 68 ifeq ($(MACHINE),enterprise) -
kernel/arch/sparc64/src/sparc64.c
r61e90dd r16529d5 46 46 #include <arch/mm/page.h> 47 47 #include <arch/stack.h> 48 #include <genarch/ofw/ofw_tree.h> 48 49 #include <userspace.h> 49 50 … … 65 66 ballocs.base = bootinfo.ballocs.base; 66 67 ballocs.size = bootinfo.ballocs.size; 68 69 ofw_tree_init(bootinfo.ofw_root); 67 70 } 68 71 -
kernel/genarch/Makefile.inc
r61e90dd r16529d5 93 93 ifeq ($(CONFIG_OFW_TREE), y) 94 94 GENARCH_SOURCES += \ 95 genarch/src/ofw/ofw_tree ,c95 genarch/src/ofw/ofw_tree.c 96 96 endif -
kernel/genarch/include/ofw/ofw_tree.h
r61e90dd r16529d5 31 31 32 32 #include <arch/types.h> 33 #include <typedefs.h> 33 34 34 35 #define OFW_TREE_PROPERTY_MAX_NAMELEN 32 … … 43 44 ofw_tree_node_t *child; 44 45 45 unsigned properties; /**< Number of properties. */ 46 char *da_name; /**< Disambigued name. */ 47 48 unsigned properties; /**< Number of properties. */ 46 49 ofw_tree_property_t *property; 47 50 }; … … 54 57 }; 55 58 59 extern void ofw_tree_init(ofw_tree_node_t *root); 60 extern void ofw_tree_print(void); 61 extern const char *ofw_tree_node_name(const ofw_tree_node_t *node); 62 extern ofw_tree_node_t *ofw_tree_lookup(const char *path); 63 56 64 #endif -
kernel/genarch/src/ofw/ofw_tree.c
r61e90dd r16529d5 36 36 */ 37 37 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 47 static ofw_tree_node_t *ofw_root; 48 49 void 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 */ 60 const 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 */ 82 static 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 */ 100 ofw_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 */ 128 static 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. */ 148 void ofw_tree_print(void) 149 { 150 ofw_tree_node_print(ofw_root, NULL); 151 } 152 38 153 /** @} 39 154 */
Note:
See TracChangeset
for help on using the changeset viewer.