git: 88a8c68298db - main - ofw/disk: Add parsedev support
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 30 Nov 2022 22:31:31 UTC
The branch main has been updated by imp: URL: https://cgit.FreeBSD.org/src/commit/?id=88a8c68298dbc86370d9a7eff06314da398829cb commit 88a8c68298dbc86370d9a7eff06314da398829cb Author: Warner Losh <imp@FreeBSD.org> AuthorDate: 2022-11-30 22:10:11 +0000 Commit: Warner Losh <imp@FreeBSD.org> CommitDate: 2022-11-30 22:30:33 +0000 ofw/disk: Add parsedev support Add a parsedev support for OpenFirmware disks. We must look at characteristics of the OFW node to know if we match this device (so supply a match routine) or not. Add a parsing routine to allocate devdesc for OpenFirmware disks as well. Sponsored by: Netflix Differential Revision: https://reviews.freebsd.org/D37558 --- stand/libofw/ofw_disk.c | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/stand/libofw/ofw_disk.c b/stand/libofw/ofw_disk.c index 67da8cbeb310..ae2776ee4689 100644 --- a/stand/libofw/ofw_disk.c +++ b/stand/libofw/ofw_disk.c @@ -50,7 +50,8 @@ static int ofwd_close(struct open_file *f); static int ofwd_ioctl(struct open_file *f, u_long cmd, void *data); static int ofwd_print(int verbose); static char * ofwd_fmtdev(struct devdesc *); - +static int ofwd_parsedev(struct devdesc **, const char *, const char **); +static bool ofwd_match(struct devsw *, const char *); struct devsw ofwdisk = { .dv_name = "block", @@ -62,7 +63,9 @@ struct devsw ofwdisk = { .dv_ioctl = ofwd_ioctl, .dv_print = ofwd_print, .dv_cleanup = nullsys, + .dv_match = ofwd_match, .dv_fmtdev = ofwd_fmtdev, + .dv_parsedev = ofwd_parsedev, }; /* @@ -210,6 +213,16 @@ ofwd_print(int verbose __unused) return (0); } + + +static bool +ofwd_match(struct devsw *devsw, const char *devspec) +{ + const char *path; + + return (ofw_path_to_handle(devspec, devsw->dv_name, &path) != -1); +} + static char * ofwd_fmtdev(struct devdesc *idev) { @@ -217,3 +230,25 @@ ofwd_fmtdev(struct devdesc *idev) return (dev->d_path); } + +static int +ofwd_parsedev(struct devdesc **dev, const char *devspec, const char **path) +{ + const char *rem_path; + struct ofw_devdesc *idev; + + if (ofw_path_to_handle(devspec, ofwdisk.dv_name, &rem_path) == -1) + return (ENOENT); + idev = malloc(sizeof(struct ofw_devdesc)); + if (idev == NULL) { + printf("ofw_parsedev: malloc failed\n"); + return ENOMEM; + }; + strlcpy(idev->d_path, devspec, min(rem_path - devspec + 1, + sizeof(idev->d_path))); + if (dev != NULL) + *dev = &idev->dd; + if (path != NULL) + *path = rem_path; + return 0; +}