Skip site navigation (1)Skip section navigation (2)
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>