summaryrefslogtreecommitdiff
path: root/sys/dev/ofw
diff options
context:
space:
mode:
authorOleksandr Tymoshenko <gonzo@FreeBSD.org>2018-04-08 22:59:34 +0000
committerOleksandr Tymoshenko <gonzo@FreeBSD.org>2018-04-08 22:59:34 +0000
commit217d17bcd3f525fbdf124cfbc926f8033da69805 (patch)
tree146d3c2e0fb57898ccf50e647f680a89962f5c1b /sys/dev/ofw
parent9d9889b5eb221519c15655e86892440972fc2886 (diff)
Notes
Diffstat (limited to 'sys/dev/ofw')
-rw-r--r--sys/dev/ofw/ofw_bus_subr.c18
-rw-r--r--sys/dev/ofw/openfirm.c41
-rw-r--r--sys/dev/ofw/openfirm.h2
3 files changed, 45 insertions, 16 deletions
diff --git a/sys/dev/ofw/ofw_bus_subr.c b/sys/dev/ofw/ofw_bus_subr.c
index 3e2da5a2e8ce..80b59f43708a 100644
--- a/sys/dev/ofw/ofw_bus_subr.c
+++ b/sys/dev/ofw/ofw_bus_subr.c
@@ -57,12 +57,12 @@ ofw_bus_gen_setup_devinfo(struct ofw_bus_devinfo *obd, phandle_t node)
if (obd == NULL)
return (ENOMEM);
/* The 'name' property is considered mandatory. */
- if ((OF_getprop_alloc(node, "name", 1, (void **)&obd->obd_name)) == -1)
+ if ((OF_getprop_alloc(node, "name", (void **)&obd->obd_name)) == -1)
return (EINVAL);
- OF_getprop_alloc(node, "compatible", 1, (void **)&obd->obd_compat);
- OF_getprop_alloc(node, "device_type", 1, (void **)&obd->obd_type);
- OF_getprop_alloc(node, "model", 1, (void **)&obd->obd_model);
- OF_getprop_alloc(node, "status", 1, (void **)&obd->obd_status);
+ OF_getprop_alloc(node, "compatible", (void **)&obd->obd_compat);
+ OF_getprop_alloc(node, "device_type", (void **)&obd->obd_type);
+ OF_getprop_alloc(node, "model", (void **)&obd->obd_model);
+ OF_getprop_alloc(node, "status", (void **)&obd->obd_status);
obd->obd_node = node;
return (0);
}
@@ -502,7 +502,7 @@ ofw_bus_reg_to_rl_helper(device_t dev, phandle_t node, pcell_t acells, pcell_t s
* This may be just redundant when having ofw_bus_devinfo
* but makes this routine independent of it.
*/
- ret = OF_getprop_alloc(node, "name", sizeof(*name), (void **)&name);
+ ret = OF_getprop_alloc(node, "name", (void **)&name);
if (ret == -1)
name = NULL;
@@ -720,7 +720,7 @@ ofw_bus_find_child(phandle_t start, const char *child_name)
phandle_t child;
for (child = OF_child(start); child != 0; child = OF_peer(child)) {
- ret = OF_getprop_alloc(child, "name", sizeof(*name), (void **)&name);
+ ret = OF_getprop_alloc(child, "name", (void **)&name);
if (ret == -1)
continue;
if (strcmp(name, child_name) == 0) {
@@ -916,7 +916,7 @@ ofw_bus_find_string_index(phandle_t node, const char *list_name,
int rv, i, cnt, nelems;
elems = NULL;
- nelems = OF_getprop_alloc(node, list_name, 1, (void **)&elems);
+ nelems = OF_getprop_alloc(node, list_name, (void **)&elems);
if (nelems <= 0)
return (ENOENT);
@@ -947,7 +947,7 @@ ofw_bus_string_list_to_array(phandle_t node, const char *list_name,
int i, cnt, nelems, len;
elems = NULL;
- nelems = OF_getprop_alloc(node, list_name, 1, (void **)&elems);
+ nelems = OF_getprop_alloc(node, list_name, (void **)&elems);
if (nelems <= 0)
return (nelems);
diff --git a/sys/dev/ofw/openfirm.c b/sys/dev/ofw/openfirm.c
index dc781d42ad8c..4f1066e1cb14 100644
--- a/sys/dev/ofw/openfirm.c
+++ b/sys/dev/ofw/openfirm.c
@@ -440,11 +440,35 @@ OF_searchencprop(phandle_t node, const char *propname, void *buf, size_t len)
/*
* Store the value of a property of a package into newly allocated memory
+ * (using the M_OFWPROP malloc pool and M_WAITOK).
+ */
+ssize_t
+OF_getprop_alloc(phandle_t package, const char *propname, void **buf)
+{
+ int len;
+
+ *buf = NULL;
+ if ((len = OF_getproplen(package, propname)) == -1)
+ return (-1);
+
+ if (len > 0) {
+ *buf = malloc(len, M_OFWPROP, M_WAITOK);
+ if (OF_getprop(package, propname, *buf, len) == -1) {
+ free(*buf, M_OFWPROP);
+ *buf = NULL;
+ return (-1);
+ }
+ }
+ return (len);
+}
+
+/*
+ * Store the value of a property of a package into newly allocated memory
* (using the M_OFWPROP malloc pool and M_WAITOK). elsz is the size of a
* single element, the number of elements is return in number.
*/
ssize_t
-OF_getprop_alloc(phandle_t package, const char *propname, int elsz, void **buf)
+OF_getprop_alloc_multi(phandle_t package, const char *propname, int elsz, void **buf)
{
int len;
@@ -453,15 +477,18 @@ OF_getprop_alloc(phandle_t package, const char *propname, int elsz, void **buf)
len % elsz != 0)
return (-1);
- *buf = malloc(len, M_OFWPROP, M_WAITOK);
- if (OF_getprop(package, propname, *buf, len) == -1) {
- free(*buf, M_OFWPROP);
- *buf = NULL;
- return (-1);
+ if (len > 0) {
+ *buf = malloc(len, M_OFWPROP, M_WAITOK);
+ if (OF_getprop(package, propname, *buf, len) == -1) {
+ free(*buf, M_OFWPROP);
+ *buf = NULL;
+ return (-1);
+ }
}
return (len / elsz);
}
+
ssize_t
OF_getencprop_alloc(phandle_t package, const char *name, int elsz, void **buf)
{
@@ -469,7 +496,7 @@ OF_getencprop_alloc(phandle_t package, const char *name, int elsz, void **buf)
pcell_t *cell;
int i;
- retval = OF_getprop_alloc(package, name, elsz, buf);
+ retval = OF_getprop_alloc_multi(package, name, elsz, buf);
if (retval == -1)
return (-1);
if (retval * elsz % 4 != 0) {
diff --git a/sys/dev/ofw/openfirm.h b/sys/dev/ofw/openfirm.h
index e17011640b55..4983a00b015c 100644
--- a/sys/dev/ofw/openfirm.h
+++ b/sys/dev/ofw/openfirm.h
@@ -116,6 +116,8 @@ ssize_t OF_searchprop(phandle_t node, const char *propname, void *buf,
ssize_t OF_searchencprop(phandle_t node, const char *propname,
void *buf, size_t len);
ssize_t OF_getprop_alloc(phandle_t node, const char *propname,
+ void **buf);
+ssize_t OF_getprop_alloc_multi(phandle_t node, const char *propname,
int elsz, void **buf);
ssize_t OF_getencprop_alloc(phandle_t node, const char *propname,
int elsz, void **buf);