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));
|
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
|
* Point (dev) at an allocated device specifier matching the string version
|
||||||
* at the beginning of (devspec). Return a pointer to the remaining
|
* 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 len;
|
||||||
int i;
|
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) {
|
for (p = s = devspec; *s != '\0'; p = s) {
|
||||||
if ((s = strchr(p + 1, '/')) == NULL)
|
if ((s = strchr(p + 1, '/')) == NULL)
|
||||||
s = strchr(p, '\0');
|
s = strchr(p, '\0');
|
||||||
|
@ -61,6 +61,8 @@ extern int ofw_autoload(void);
|
|||||||
|
|
||||||
void ofw_memmap(int);
|
void ofw_memmap(int);
|
||||||
|
|
||||||
|
phandle_t ofw_path_to_handle(const char *ofwpath, const char *want_type, const char **path);
|
||||||
|
|
||||||
struct preloaded_file;
|
struct preloaded_file;
|
||||||
struct file_format;
|
struct file_format;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user