PERFORCE change 54461 for review
Juli Mallett
jmallett at FreeBSD.org
Wed Jun 9 09:20:34 GMT 2004
http://perforce.freebsd.org/chv.cgi?CH=54461
Change 54461 by jmallett at jmallett_oingo on 2004/06/09 09:20:22
Do evil GIO64 things which aren't really evil. Gotta do hints stuff
to be able to look up children rather than this crap done to check
for products ala NetBSD.
Affected files ...
.. //depot/projects/mips/sys/mips/sgimips/gio/gio.c#2 edit
Differences ...
==== //depot/projects/mips/sys/mips/sgimips/gio/gio.c#2 (text+ko) ====
@@ -23,7 +23,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $P4: //depot/projects/mips/sys/mips/sgimips/gio/gio.c#1 $
+ * $P4: //depot/projects/mips/sys/mips/sgimips/gio/gio.c#2 $
*/
#include <sys/cdefs.h>
@@ -34,9 +34,11 @@
#include <sys/kernel.h>
#include <sys/module.h>
#include <sys/bus.h>
+#include <sys/rman.h>
#include <platform/models.h>
#include <platform/gio/gioreg.h>
+#include <platform/gio/giovar.h>
static devclass_t gio_devclass;
@@ -44,12 +46,11 @@
* Device methods
*/
static int gio_probe(device_t);
-static int gio_attach(device_t);
static device_method_t gio_methods[] = {
/* Device interface */
DEVMETHOD(device_probe, gio_probe),
- DEVMETHOD(device_attach, gio_attach),
+ DEVMETHOD(device_attach, bus_generic_attach),
DEVMETHOD(device_detach, bus_generic_detach),
DEVMETHOD(device_shutdown, bus_generic_shutdown),
@@ -64,27 +65,72 @@
"gio", gio_methods, 1
};
+static struct gio_device {
+ const char *gd_name;
+ uint32_t gd_product;
+} gio_devices[] = {
+ { NULL, 0x00000000 }
+};
+
+static struct gio_ivar gio_slots[] = {
+ { NULL, 0x1f000000 },
+ { NULL, 0x1f400000 },
+ { NULL, 0x1f600000 },
+ { NULL, 0x00000000 }
+};
+
+static int
+gio_configure(device_t gio, struct gio_ivar *iv)
+{
+ struct gio_device *gd;
+ uint32_t product;
+ device_t dev;
+
+ product = bus_space_read_4(iv->gi_tag, iv->gi_handle, 0);
+ for (gd = gio_devices; gd->gd_name != NULL; gd++) {
+ if (gd->gd_product == product) {
+ dev = device_add_child(gio, gd->gd_name, -1);
+ if (dev != NULL) {
+ device_set_ivars(dev, iv);
+ return (0);
+ }
+ }
+ }
+ return (ENOENT);
+}
+
static int
gio_probe(device_t dev)
{
+ struct gio_ivar *iv;
+ int count;
+ int error;
+
+ count = 0;
+
switch (mach_type) {
case MACH_SGI_IP22:
+ device_set_desc(dev, "GIO64 Bus");
+ for (iv = gio_slots; iv->gi_handle != 0; iv++) {
+ if (iv->gi_tag != NULL)
+ continue;
+ count++;
+ iv->gi_tag = device_space_tag;
+ error = gio_configure(dev, iv);
+ if (error != 0) {
+ iv->gi_tag = NULL;
+ count--;
+ }
+ }
+ if (count == 0)
+ device_printf(dev, "no children found\n");
+ device_add_child(dev, "hpc", 0);
+ device_add_child(dev, "hpc", 1);
+ device_add_child(dev, "hpc", 2);
return (0);
default:
return (ENOENT);
}
}
-#define GIO_READ_4(port, r) \
- (*(volatile uint32_t *)(MIPS_PHYS_TO_KSEG1(port) | r))
-
-#define GIO_WRITE_4(port, r, v) \
- ((*(volatile uint32_t *)(MIPS_PHYS_TO_KSEG1(port) | r)) = (v))
-
-static int
-gio_attach(device_t dev)
-{
- return (0);
-}
-
DRIVER_MODULE(gio, imc, gio_driver, gio_devclass, 0, 0);
More information about the p4-projects
mailing list