git: ed3cc2f24829 - main - stand/ofw: Add ofw_path_to_handle
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 30 Nov 2022 22:31:29 UTC
The branch main has been updated by imp: URL: https://cgit.FreeBSD.org/src/commit/?id=ed3cc2f24829e6c5827f142cfcd9729331a1106c commit ed3cc2f24829e6c5827f142cfcd9729331a1106c Author: Warner Losh <imp@FreeBSD.org> AuthorDate: 2022-11-30 22:10:00 +0000 Commit: Warner Losh <imp@FreeBSD.org> CommitDate: 2022-11-30 22:30:33 +0000 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 --- stand/libofw/devicename.c | 33 +++++++++++++++++++++++++++++++++ stand/libofw/libofw.h | 2 ++ 2 files changed, 35 insertions(+) diff --git a/stand/libofw/devicename.c b/stand/libofw/devicename.c index ecf966506194..6ed2343ee7bd 100644 --- a/stand/libofw/devicename.c +++ b/stand/libofw/devicename.c @@ -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'); diff --git a/stand/libofw/libofw.h b/stand/libofw/libofw.h index 59c7ec1fa6b7..0494a78135e7 100644 --- a/stand/libofw/libofw.h +++ b/stand/libofw/libofw.h @@ -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;