of/flattree: merge of_scan_flat_dt
Merge common code between PowerPC and Microblaze Signed-off-by: Grant Likely <grant.likely@secretlab.ca> Reviewed-by: Wolfram Sang <w.sang@pengutronix.de> Tested-by: Michal Simek <monstr@monstr.eu>
This commit is contained in:
parent
e169cfbef4
commit
c8cb7a5984
|
@ -50,67 +50,6 @@ typedef u32 cell_t;
|
||||||
/* export that to outside world */
|
/* export that to outside world */
|
||||||
struct device_node *of_chosen;
|
struct device_node *of_chosen;
|
||||||
|
|
||||||
/**
|
|
||||||
* This function is used to scan the flattened device-tree, it is
|
|
||||||
* used to extract the memory informations at boot before we can
|
|
||||||
* unflatten the tree
|
|
||||||
*/
|
|
||||||
int __init of_scan_flat_dt(int (*it)(unsigned long node,
|
|
||||||
const char *uname, int depth,
|
|
||||||
void *data),
|
|
||||||
void *data)
|
|
||||||
{
|
|
||||||
unsigned long p = ((unsigned long)initial_boot_params) +
|
|
||||||
initial_boot_params->off_dt_struct;
|
|
||||||
int rc = 0;
|
|
||||||
int depth = -1;
|
|
||||||
|
|
||||||
do {
|
|
||||||
u32 tag = *((u32 *)p);
|
|
||||||
char *pathp;
|
|
||||||
|
|
||||||
p += 4;
|
|
||||||
if (tag == OF_DT_END_NODE) {
|
|
||||||
depth--;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (tag == OF_DT_NOP)
|
|
||||||
continue;
|
|
||||||
if (tag == OF_DT_END)
|
|
||||||
break;
|
|
||||||
if (tag == OF_DT_PROP) {
|
|
||||||
u32 sz = *((u32 *)p);
|
|
||||||
p += 8;
|
|
||||||
if (initial_boot_params->version < 0x10)
|
|
||||||
p = _ALIGN(p, sz >= 8 ? 8 : 4);
|
|
||||||
p += sz;
|
|
||||||
p = _ALIGN(p, 4);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (tag != OF_DT_BEGIN_NODE) {
|
|
||||||
printk(KERN_WARNING "Invalid tag %x scanning flattened"
|
|
||||||
" device tree !\n", tag);
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
depth++;
|
|
||||||
pathp = (char *)p;
|
|
||||||
p = _ALIGN(p + strlen(pathp) + 1, 4);
|
|
||||||
if ((*pathp) == '/') {
|
|
||||||
char *lp, *np;
|
|
||||||
for (lp = NULL, np = pathp; *np; np++)
|
|
||||||
if ((*np) == '/')
|
|
||||||
lp = np+1;
|
|
||||||
if (lp != NULL)
|
|
||||||
pathp = lp;
|
|
||||||
}
|
|
||||||
rc = it(p, pathp, depth, data);
|
|
||||||
if (rc != 0)
|
|
||||||
break;
|
|
||||||
} while (1);
|
|
||||||
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned long __init of_get_flat_dt_root(void)
|
unsigned long __init of_get_flat_dt_root(void)
|
||||||
{
|
{
|
||||||
unsigned long p = ((unsigned long)initial_boot_params) +
|
unsigned long p = ((unsigned long)initial_boot_params) +
|
||||||
|
|
|
@ -80,67 +80,6 @@ extern rwlock_t devtree_lock; /* temporary while merging */
|
||||||
/* export that to outside world */
|
/* export that to outside world */
|
||||||
struct device_node *of_chosen;
|
struct device_node *of_chosen;
|
||||||
|
|
||||||
/**
|
|
||||||
* This function is used to scan the flattened device-tree, it is
|
|
||||||
* used to extract the memory informations at boot before we can
|
|
||||||
* unflatten the tree
|
|
||||||
*/
|
|
||||||
int __init of_scan_flat_dt(int (*it)(unsigned long node,
|
|
||||||
const char *uname, int depth,
|
|
||||||
void *data),
|
|
||||||
void *data)
|
|
||||||
{
|
|
||||||
unsigned long p = ((unsigned long)initial_boot_params) +
|
|
||||||
initial_boot_params->off_dt_struct;
|
|
||||||
int rc = 0;
|
|
||||||
int depth = -1;
|
|
||||||
|
|
||||||
do {
|
|
||||||
u32 tag = *((u32 *)p);
|
|
||||||
char *pathp;
|
|
||||||
|
|
||||||
p += 4;
|
|
||||||
if (tag == OF_DT_END_NODE) {
|
|
||||||
depth --;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (tag == OF_DT_NOP)
|
|
||||||
continue;
|
|
||||||
if (tag == OF_DT_END)
|
|
||||||
break;
|
|
||||||
if (tag == OF_DT_PROP) {
|
|
||||||
u32 sz = *((u32 *)p);
|
|
||||||
p += 8;
|
|
||||||
if (initial_boot_params->version < 0x10)
|
|
||||||
p = _ALIGN(p, sz >= 8 ? 8 : 4);
|
|
||||||
p += sz;
|
|
||||||
p = _ALIGN(p, 4);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (tag != OF_DT_BEGIN_NODE) {
|
|
||||||
printk(KERN_WARNING "Invalid tag %x scanning flattened"
|
|
||||||
" device tree !\n", tag);
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
depth++;
|
|
||||||
pathp = (char *)p;
|
|
||||||
p = _ALIGN(p + strlen(pathp) + 1, 4);
|
|
||||||
if ((*pathp) == '/') {
|
|
||||||
char *lp, *np;
|
|
||||||
for (lp = NULL, np = pathp; *np; np++)
|
|
||||||
if ((*np) == '/')
|
|
||||||
lp = np+1;
|
|
||||||
if (lp != NULL)
|
|
||||||
pathp = lp;
|
|
||||||
}
|
|
||||||
rc = it(p, pathp, depth, data);
|
|
||||||
if (rc != 0)
|
|
||||||
break;
|
|
||||||
} while(1);
|
|
||||||
|
|
||||||
return rc;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned long __init of_get_flat_dt_root(void)
|
unsigned long __init of_get_flat_dt_root(void)
|
||||||
{
|
{
|
||||||
unsigned long p = ((unsigned long)initial_boot_params) +
|
unsigned long p = ((unsigned long)initial_boot_params) +
|
||||||
|
|
|
@ -19,3 +19,67 @@ char *find_flat_dt_string(u32 offset)
|
||||||
return ((char *)initial_boot_params) +
|
return ((char *)initial_boot_params) +
|
||||||
initial_boot_params->off_dt_strings + offset;
|
initial_boot_params->off_dt_strings + offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* of_scan_flat_dt - scan flattened tree blob and call callback on each.
|
||||||
|
* @it: callback function
|
||||||
|
* @data: context data pointer
|
||||||
|
*
|
||||||
|
* This function is used to scan the flattened device-tree, it is
|
||||||
|
* used to extract the memory information at boot before we can
|
||||||
|
* unflatten the tree
|
||||||
|
*/
|
||||||
|
int __init of_scan_flat_dt(int (*it)(unsigned long node,
|
||||||
|
const char *uname, int depth,
|
||||||
|
void *data),
|
||||||
|
void *data)
|
||||||
|
{
|
||||||
|
unsigned long p = ((unsigned long)initial_boot_params) +
|
||||||
|
initial_boot_params->off_dt_struct;
|
||||||
|
int rc = 0;
|
||||||
|
int depth = -1;
|
||||||
|
|
||||||
|
do {
|
||||||
|
u32 tag = *((u32 *)p);
|
||||||
|
char *pathp;
|
||||||
|
|
||||||
|
p += 4;
|
||||||
|
if (tag == OF_DT_END_NODE) {
|
||||||
|
depth--;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (tag == OF_DT_NOP)
|
||||||
|
continue;
|
||||||
|
if (tag == OF_DT_END)
|
||||||
|
break;
|
||||||
|
if (tag == OF_DT_PROP) {
|
||||||
|
u32 sz = *((u32 *)p);
|
||||||
|
p += 8;
|
||||||
|
if (initial_boot_params->version < 0x10)
|
||||||
|
p = _ALIGN(p, sz >= 8 ? 8 : 4);
|
||||||
|
p += sz;
|
||||||
|
p = _ALIGN(p, 4);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (tag != OF_DT_BEGIN_NODE) {
|
||||||
|
pr_err("Invalid tag %x in flat device tree!\n", tag);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
depth++;
|
||||||
|
pathp = (char *)p;
|
||||||
|
p = _ALIGN(p + strlen(pathp) + 1, 4);
|
||||||
|
if ((*pathp) == '/') {
|
||||||
|
char *lp, *np;
|
||||||
|
for (lp = NULL, np = pathp; *np; np++)
|
||||||
|
if ((*np) == '/')
|
||||||
|
lp = np+1;
|
||||||
|
if (lp != NULL)
|
||||||
|
pathp = lp;
|
||||||
|
}
|
||||||
|
rc = it(p, pathp, depth, data);
|
||||||
|
if (rc != 0)
|
||||||
|
break;
|
||||||
|
} while (1);
|
||||||
|
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue