Module Name:    src
Committed By:   matt
Date:           Sat Aug  8 20:49:58 UTC 2009

Modified Files:
        src/sys/arch/evbmips/gdium: machdep.c

Log Message:
Add pci_attach_hook to configure the ralink device since PMON didn't.  This
avoids the over kill of PCI_NETBSD_CONFIGURE.  And given the bounded nature
of the Gdium, it's not as if someone is going to add more devices.


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/evbmips/gdium/machdep.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/evbmips/gdium/machdep.c
diff -u src/sys/arch/evbmips/gdium/machdep.c:1.3 src/sys/arch/evbmips/gdium/machdep.c:1.4
--- src/sys/arch/evbmips/gdium/machdep.c:1.3	Fri Aug  7 00:11:08 2009
+++ src/sys/arch/evbmips/gdium/machdep.c	Sat Aug  8 20:49:58 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.c,v 1.3 2009/08/07 00:11:08 matt Exp $	*/
+/*	$NetBSD: machdep.c,v 1.4 2009/08/08 20:49:58 matt Exp $	*/
 
 /*
  * Copyright 2001, 2002 Wasabi Systems, Inc.
@@ -112,7 +112,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.3 2009/08/07 00:11:08 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: machdep.c,v 1.4 2009/08/08 20:49:58 matt Exp $");
 
 #include "opt_ddb.h"
 #include "opt_execfmt.h"
@@ -190,6 +190,44 @@
 extern struct user *proc0paddr;
 
 /*
+ * For some reason, PMON doesn't assign a real address to the Ralink's BAR.
+ * So we have to do it.
+ */
+static void
+gdium_pci_attach_hook(device_t parent, device_t self,
+    struct pcibus_attach_args *pba)
+{
+	const pcitag_t high_dev = pci_make_tag(pba->pba_pc, 0, 17, 1);
+	const pcitag_t ralink_dev = pci_make_tag(pba->pba_pc, 0, 13, 0);
+	bus_size_t high_size, ralink_size;
+	pcireg_t v;
+
+	/*
+	 * Get the highest PCI addr used from the last PCI dev.
+	 */
+	v = pci_conf_read(pba->pba_pc, high_dev, PCI_MAPREG_START);
+	v &= PCI_MAPREG_MEM_ADDR_MASK;
+
+	/*
+	 * Get the sizes of the map registers.
+	 */
+	pci_mapreg_info(pba->pba_pc, high_dev, PCI_MAPREG_START,
+	    PCI_MAPREG_MEM_TYPE_32BIT, NULL, &high_size, NULL);
+	pci_mapreg_info(pba->pba_pc, ralink_dev, PCI_MAPREG_START,
+	    PCI_MAPREG_MEM_TYPE_32BIT, NULL, &ralink_size, NULL);
+
+	/*
+	 * Position the ralink register space after the last device.
+	 */
+	v = (v + high_size + ralink_size - 1) & ~(ralink_size - 1);
+
+	/*
+	 * Set the mapreg.
+	 */
+	pci_conf_write(pba->pba_pc, ralink_dev, PCI_MAPREG_START, v);
+}
+
+/*
  * Do all the stuff that locore normally does before calling main().
  */
 void
@@ -226,6 +264,11 @@
 	physmem = btoc(memsize);
 
 	bonito_pci_init(&gc->gc_pc, &gc->gc_bonito);
+	/*
+	 * Override the null bonito_pci_attach_hook with our own to we can
+	 * fix the ralink (device 13).
+	 */
+	gc->gc_pc.pc_attach_hook = gdium_pci_attach_hook;
 	gdium_bus_io_init(&gc->gc_iot, gc);
 	gdium_bus_mem_init(&gc->gc_memt, gc);
 	gdium_dma_init(gc);

Reply via email to