stand/ofw: Add ofw_path_to_handle
ofw_path_to_handle converts a path string to a phandle_t. It searches down the path for the first device whose type matches the passed-in string. Sponsored by: Netflix Differential Revision: https://reviews.freebsd.org/D37556
This commit is contained in:
parent
40d340acb9
commit
ed3cc2f248
@ -62,6 +62,38 @@ ofw_getdev(void **vdev, const char *devspec, const char **path)
|
||||
return(ofw_parsedev(dev, devspec, path));
|
||||
}
|
||||
|
||||
/*
|
||||
* Search the OFW (path) for a node that's of (want_type).
|
||||
*/
|
||||
phandle_t
|
||||
ofw_path_to_handle(const char *ofwpath, const char *want_type, const char **path)
|
||||
{
|
||||
const char *p, *s;
|
||||
char name[256];
|
||||
char type[64];
|
||||
phandle_t handle;
|
||||
int len;
|
||||
|
||||
for (p = s = ofwpath; *s != '\0'; p = s) {
|
||||
if ((s = strchr(p + 1, '/')) == NULL)
|
||||
s = strchr(p, '\0');
|
||||
len = s - ofwpath;
|
||||
if (len >= sizeof(name))
|
||||
return ((phandle_t)-1);
|
||||
bcopy(ofwpath, name, len);
|
||||
name[len] = '\0';
|
||||
if ((handle = OF_finddevice(name)) == -1)
|
||||
continue;
|
||||
if (OF_getprop(handle, "device_type", type, sizeof(type)) == -1)
|
||||
continue;
|
||||
if (strcmp(want_type, type) == 0) {
|
||||
*path = s;
|
||||
return (handle);
|
||||
}
|
||||
}
|
||||
return ((phandle_t)-1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Point (dev) at an allocated device specifier matching the string version
|
||||
* at the beginning of (devspec). Return a pointer to the remaining
|
||||
@ -82,6 +114,7 @@ ofw_parsedev(struct ofw_devdesc **dev, const char *devspec, const char **path)
|
||||
int len;
|
||||
int i;
|
||||
|
||||
/* XXX next step: use devparse -- don't forget to hack ofw_disk like you did ofw_net */
|
||||
for (p = s = devspec; *s != '\0'; p = s) {
|
||||
if ((s = strchr(p + 1, '/')) == NULL)
|
||||
s = strchr(p, '\0');
|
||||
|
@ -61,6 +61,8 @@ extern int ofw_autoload(void);
|
||||
|
||||
void ofw_memmap(int);
|
||||
|
||||
phandle_t ofw_path_to_handle(const char *ofwpath, const char *want_type, const char **path);
|
||||
|
||||
struct preloaded_file;
|
||||
struct file_format;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user