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:
Warner Losh 2022-11-30 15:10:00 -07:00
parent 40d340acb9
commit ed3cc2f248
2 changed files with 35 additions and 0 deletions

View File

@ -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');

View File

@ -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;