aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKornel Duleba <mindal@semihalf.com>2022-01-25 10:10:55 +0000
committerMarcin Wojtas <mw@FreeBSD.org>2022-03-10 11:11:32 +0000
commit206dc82bc3fc5e1d90200e189ce5f2240dfec874 (patch)
treef6ee4590c00390675c8ee1c6fcdd8e8f05699a18
parenta19acfd56c2f9e4259d924b26c38ce26dfe109ed (diff)
downloadsrc-206dc82bc3fc5e1d90200e189ce5f2240dfec874.tar.gz
src-206dc82bc3fc5e1d90200e189ce5f2240dfec874.zip
bus_if: Add a default implementation of get_property
There are multiple buses that pretend to be ofw compatible, e.g ofw_pci, mii_fdt. We now need to provide an implementation of BUS_GET_PROPERTY for every one of them. Instead of modifying them one by one it's better to just provide a default implementation that simply traverses up the device tree. Remove the now unneeded BUS_GET_PROPERTY implementation in mii_fdt. Reviewed by: andrew, bz Obtained from: Semihalf MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D34031
-rw-r--r--sys/dev/mii/mii_fdt.c15
-rw-r--r--sys/kern/bus_if.m8
-rw-r--r--sys/kern/subr_bus.c17
-rw-r--r--sys/sys/bus.h3
4 files changed, 21 insertions, 22 deletions
diff --git a/sys/dev/mii/mii_fdt.c b/sys/dev/mii/mii_fdt.c
index 387b02f69504..9cf3fd2fab37 100644
--- a/sys/dev/mii/mii_fdt.c
+++ b/sys/dev/mii/mii_fdt.c
@@ -326,20 +326,6 @@ miibus_fdt_get_devinfo(device_t bus, device_t child)
return (&ma->obd);
}
-static ssize_t
-miibus_fdt_get_property(device_t bus, device_t child, const char *propname,
- void *buf, size_t size)
-{
- struct mii_attach_args *ma;
-
- ma = device_get_ivars(child);
-
- if (ma->obd.obd_node == 0)
- return (-1);
-
- return (OF_getencprop(ma->obd.obd_node, propname, buf, size));
-}
-
static device_method_t miibus_fdt_methods[] = {
DEVMETHOD(device_probe, miibus_fdt_probe),
DEVMETHOD(device_attach, miibus_fdt_attach),
@@ -362,7 +348,6 @@ static device_method_t miibus_fdt_methods[] = {
DEVMETHOD(bus_get_resource, bus_generic_rl_get_resource),
DEVMETHOD(bus_set_resource, bus_generic_rl_set_resource),
DEVMETHOD(bus_get_resource_list, miibus_fdt_get_resource_list),
- DEVMETHOD(bus_get_property, miibus_fdt_get_property),
DEVMETHOD_END
};
diff --git a/sys/kern/bus_if.m b/sys/kern/bus_if.m
index ef0f5e9eb65a..cf6470c220ef 100644
--- a/sys/kern/bus_if.m
+++ b/sys/kern/bus_if.m
@@ -77,12 +77,6 @@ CODE {
return (0);
}
- static ssize_t
- null_get_property(device_t dev, device_t child, const char *propname,
- void *propvalue, size_t size)
- {
- return (-1);
- }
};
/**
@@ -944,7 +938,7 @@ METHOD ssize_t get_property {
const char *_propname;
void *_propvalue;
size_t _size;
-} DEFAULT null_get_property;
+} DEFAULT bus_generic_get_property;
/**
* @brief Gets a child's full path to the device
diff --git a/sys/kern/subr_bus.c b/sys/kern/subr_bus.c
index 5e6cfa162f4c..8a05c28c96b1 100644
--- a/sys/kern/subr_bus.c
+++ b/sys/kern/subr_bus.c
@@ -4126,6 +4126,23 @@ bus_generic_write_ivar(device_t dev, device_t child, int index,
}
/**
+ * @brief Helper function for implementing BUS_GET_PROPERTY().
+ *
+ * This simply calls the BUS_GET_PROPERTY of the parent of dev,
+ * until a non-default implementation is found.
+ */
+ssize_t
+bus_generic_get_property(device_t dev, device_t child, const char *propname,
+ void *propvalue, size_t size)
+{
+ if (device_get_parent(dev) != NULL)
+ return (BUS_GET_PROPERTY(device_get_parent(dev), child,
+ propname, propvalue, size));
+
+ return (-1);
+}
+
+/**
* @brief Stub function for implementing BUS_GET_RESOURCE_LIST().
*
* @returns NULL
diff --git a/sys/sys/bus.h b/sys/sys/bus.h
index d31eb31a362a..0b4f85a7fd0d 100644
--- a/sys/sys/bus.h
+++ b/sys/sys/bus.h
@@ -444,6 +444,9 @@ bus_dma_tag_t
bus_space_tag_t
bus_generic_get_bus_tag(device_t dev, device_t child);
int bus_generic_get_domain(device_t dev, device_t child, int *domain);
+ssize_t bus_generic_get_property(device_t dev, device_t child,
+ const char *propname, void *propvalue,
+ size_t size);
struct resource_list *
bus_generic_get_resource_list(device_t, device_t);
int bus_generic_map_resource(device_t dev, device_t child, int type,