Date: Tue, 3 Oct 2000 01:59:21 -0400 (EDT)
From: "Matthew N. Dodd" <winter@jurai.net>
To: new-bus@FreeBSD.ORG
Subject: bus_generic_{get,set}_resource() functions.
Message-ID: <Pine.BSF.4.21.0010030151220.1566-200000@sasami.jurai.net>
next in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
Find attached for comment and review code implementing
bus_generic_{get,set}_resource() functions for use by bus drivers that
make use of the 'struct resource_list' method of tracking resources.
A new BUS METHOD 'BUS_GET_RESOURCE_LIST' is added which allows a bus to
retreive the resource list of a child without having to know anything
about how/where it is stored.
This allows us to reduce code duplication a fair bit.
Likely we can create bus_generic_{alloc,release}_resource() functions for
the same benefit.
Comments?
--
| Matthew N. Dodd | '78 Datsun 280Z | '75 Volvo 164E | FreeBSD/NetBSD |
| winter@jurai.net | 2 x '84 Volvo 245DL | ix86,sparc,pmax |
| http://www.jurai.net/~winter | This Space For Rent | ISO8802.5 4ever |
[-- Attachment #2 --]
Index: kern/subr_bus.c
===================================================================
RCS file: /cvs/src/sys/kern/subr_bus.c,v
retrieving revision 1.80
diff -u -r1.80 subr_bus.c
--- kern/subr_bus.c 2000/09/17 23:57:52 1.80
+++ kern/subr_bus.c 2000/09/19 05:03:29
@@ -1964,6 +1970,13 @@
return ENOENT;
}
+int
+bus_generic_get_resource_list (device_t dev, device_t child,
+ struct resource_list *rl)
+{
+ return ENOENT;
+}
+
void
bus_generic_driver_added(device_t dev, driver_t *driver)
{
@@ -2046,6 +2059,59 @@
r));
else
return (EINVAL);
+}
+
+int
+bus_generic_get_resource (device_t dev, device_t child, int type, int rid,
+ u_long *startp, u_long *countp)
+{
+ struct resource_list * rl = NULL;
+ struct resource_list_entry * rle = NULL;
+ int retval = 0;
+
+ retval = BUS_GET_RESOURCE_LIST(dev, child, rl);
+ if (retval)
+ return (retval);
+
+ rle = resource_list_find(rl, type, rid);
+ if (!rle)
+ return ENOENT;
+
+ *startp = rle->start;
+ *countp = rle->count;
+
+ return (0);
+}
+
+int
+bus_generic_set_resource (device_t dev, device_t child, int type, int rid,
+ u_long start, u_long count)
+{
+ struct resource_list * rl = NULL;
+ int retval = 0;
+
+ retval = BUS_GET_RESOURCE_LIST(dev, child, rl);
+ if (retval)
+ return (retval);
+
+ resource_list_add(rl, type, rid, start, (start + count - 1), count);
+
+ return (0);
+}
+
+void
+bus_generic_delete_resource (device_t dev, device_t child, int type, int rid)
+{
+ struct resource_list * rl = NULL;
+ int retval = 0;
+
+ retval = BUS_GET_RESOURCE_LIST(dev, child, rl);
+ if (retval)
+ return;
+
+ resource_list_delete(rl, type, rid);
+
+ return;
}
/*
Index: kern/bus_if.m
===================================================================
RCS file: /cvs/src/sys/kern/bus_if.m,v
retrieving revision 1.17
diff -u -r1.17 bus_if.m
--- kern/bus_if.m 2000/04/08 14:17:09 1.17
+++ kern/bus_if.m 2000/08/24 09:24:15
@@ -236,3 +236,12 @@
int type;
int rid;
};
+
+#
+# Return a struct resource_list.
+#
+METHOD int get_resource_list {
+ device_t dev;
+ device_t child;
+ struct resource_list *rl;
+} DEFAULT bus_generic_get_resource_list;
Index: sys/bus.h
===================================================================
RCS file: /cvs/src/sys/sys/bus.h,v
retrieving revision 1.37
diff -u -r1.37 bus.h
--- sys/bus.h 2000/09/07 01:32:59 1.37
+++ sys/bus.h 2000/09/07 22:30:05
@@ -177,8 +177,11 @@
int bus_generic_attach(device_t dev);
int bus_generic_deactivate_resource(device_t dev, device_t child, int type,
int rid, struct resource *r);
+void bus_generic_delete_resource (device_t, device_t, int, int);
int bus_generic_detach(device_t dev);
void bus_generic_driver_added(device_t dev, driver_t *driver);
+int bus_generic_get_resource_list (device_t, device_t, struct resource_list *);
+int bus_generic_get_resource (device_t, device_t, int, int, u_long *, u_long *);
int bus_print_child_header(device_t dev, device_t child);
int bus_print_child_footer(device_t dev, device_t child);
int bus_generic_print_child(device_t dev, device_t child);
@@ -191,6 +194,7 @@
int bus_generic_setup_intr(device_t dev, device_t child,
struct resource *irq, int flags,
driver_intr_t *intr, void *arg, void **cookiep);
+int bus_generic_set_resource (device_t, device_t, int, int, u_long, u_long);
int bus_generic_shutdown(device_t dev);
int bus_generic_suspend(device_t dev);
int bus_generic_teardown_intr(device_t dev, device_t child,
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.4.21.0010030151220.1566-200000>
