summaryrefslogtreecommitdiff
path: root/sys/arch/i386
diff options
context:
space:
mode:
authorFederico G. Schwindt <fgsch@cvs.openbsd.org>2008-07-02 03:00:01 +0000
committerFederico G. Schwindt <fgsch@cvs.openbsd.org>2008-07-02 03:00:01 +0000
commit2bbeb14e7d0899f31acede7fbb290dbc5480da3f (patch)
treef39071575f28d23f2b03197ef34e218abb2f48d0 /sys/arch/i386
parent51e6641b4d0c8f6d4ba6f5724a6eda1b34251931 (diff)
* Dynamically set the rbus start address. from netbsd.
* For amd64, remove pcibios traces. * make RBUS_IO_START, RBUS_IO_SIZE, RBUS_MIN_START and RBUS_MEM_SIZE (on i386) configurable via kernel options. * Remove unneeded headers. * Some cleanups. originally reported in pr/5829 and tested by viq <viq at viq dot ath dot cx>. fixes ian@ laptop too. kettenis@ and miod@ agrees that although not perfect, this is the right direction.
Diffstat (limited to 'sys/arch/i386')
-rw-r--r--sys/arch/i386/i386/rbus_machdep.c105
-rw-r--r--sys/arch/i386/include/rbus_machdep.h22
2 files changed, 83 insertions, 44 deletions
diff --git a/sys/arch/i386/i386/rbus_machdep.c b/sys/arch/i386/i386/rbus_machdep.c
index 13c27e701ef..4080c9ae586 100644
--- a/sys/arch/i386/i386/rbus_machdep.c
+++ b/sys/arch/i386/i386/rbus_machdep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: rbus_machdep.c,v 1.21 2007/12/09 16:53:36 kettenis Exp $ */
+/* $OpenBSD: rbus_machdep.c,v 1.22 2008/07/02 03:00:00 fgsch Exp $ */
/* $NetBSD: rbus_machdep.c,v 1.2 1999/10/15 06:43:06 haya Exp $ */
/*
@@ -39,38 +39,88 @@
#include <uvm/uvm_extern.h>
-#include <sys/sysctl.h>
-
#include <sys/device.h>
#include <machine/bus.h>
#include <dev/cardbus/rbus.h>
-#include <dev/isa/isareg.h>
-#include <dev/isa/isavar.h>
-
#include <dev/pci/pcivar.h>
#include <arch/i386/pci/pcibiosvar.h>
+#ifndef RBUS_IO_START
+#define RBUS_IO_START 0xa000
+#endif
+#ifndef RBUS_IO_SIZE
+#define RBUS_IO_SIZE 0x1000
+#endif
+
+#ifndef RBUS_MIN_START
+#define RBUS_MIN_START 0x40000000 /* 1 GB */
+#endif
+#ifndef RBUS_MEM_SIZE
+#define RBUS_MEM_SIZE 0x00100000
+#endif
-/**********************************************************************
- * rbus_tag_t rbus_fakeparent_mem(struct pci_attach_args *pa)
+/*
+ * Dynamically set the start address for rbus. This must be called
+ * before rbus is initialized. The start address should be determined
+ * by the amount of installed memory. Generally 1 GB has been found
+ * to be a good value, but it fails on some Thinkpads (e.g. 2645-4AU),
+ * for which 0.5 GB is a good value. It also fails on (at least)
+ * Thinkpads with 2GB of RAM, for which 2 GB is a good value.
*
- * This function makes an rbus tag for memory space. This rbus tag
- * shares the all memory region of ex_iomem.
- **********************************************************************/
-#define RBUS_MEM_START 0x40000000
-#define RBUS_MEM_SIZE 0x00100000
+ * Thus, a general strategy of setting rbus_min_start to the amount of
+ * memory seems in order. However, the actually amount of memory is
+ * generally slightly more than the amount found, e.g. 1014MB vs 1024,
+ * or 2046 vs 2048.
+ */
+bus_addr_t
+rbus_min_start_hint(void)
+{
+ bus_addr_t rbus_min_start = RBUS_MIN_START;
+ size_t ram = ptoa(physmem);
+
+ if (ram <= 192 * 1024 * 1024UL) {
+ /*
+ * <= 192 MB, so try 0.5 GB. This will work on
+ * Thinkpad 600E (2645-4AU), which fails at 1 GB, and
+ * on some other older machines that may have trouble
+ * with addresses needing more than 20 bits.
+ */
+ rbus_min_start = 512 * 1024 * 1024UL;
+ }
+ if (ram >= 1024 * 1024 * 1024UL) {
+ /*
+ * > 1 GB, so try 2 GB.
+ */
+ rbus_min_start = 2 * 1024 * 1024 * 1024UL;
+ }
+
+ /* Not tested in > 2 GB case. */
+ if (ram > 2 * 1024 * 1024 * 1024UL) {
+ /*
+ * > 2 GB, so try 3 GB.
+ */
+ rbus_min_start = 3 * 1024 * 1024 * 1024UL;
+ }
+
+ return (rbus_min_start);
+}
+
+/*
+ * This function makes an rbus tag for memory space. This rbus tag
+ * shares the all memory region of ex_iomem.
+ */
rbus_tag_t
rbus_pccbb_parent_mem(struct device *self, struct pci_attach_args *pa)
{
- bus_addr_t start, min_start;
+ bus_addr_t start, rbus_min_start;
bus_size_t size;
struct extent *ex;
size = RBUS_MEM_SIZE;
- start = min_start = max(RBUS_MEM_START, ptoa(physmem));
+ start = rbus_min_start = rbus_min_start_hint();
#if NPCIBIOS > 0
if ((ex = pciaddr_search(PCIADDR_SEARCH_MEM, &start, size)) == NULL)
#endif
@@ -85,38 +135,27 @@ rbus_pccbb_parent_mem(struct device *self, struct pci_attach_args *pa)
* recognised by the kernel) in the region governed by
* iomem_ex. So I decide to use only very high
* address region.
- *
- * if defined PCIBIOS_ADDR_FIXUP, PCI device using
- * area which is not recognised by the kernel are
- * already reserved.
*/
- if (start < min_start) {
- start = min_start;
- }
+ if (start < rbus_min_start)
+ start = rbus_min_start;
size = ex->ex_end - start;
}
- return rbus_new_root_share(pa->pa_memt, ex, start, size, 0);
+ return (rbus_new_root_share(pa->pa_memt, ex, start, size, 0));
}
-
-/**********************************************************************
- * rbus_tag_t rbus_pccbb_parent_io(struct pci_attach_args *pa)
- **********************************************************************/
-#define RBUS_IO_START 0xa000
-#define RBUS_IO_SIZE 0x1000
-
rbus_tag_t
rbus_pccbb_parent_io(struct device *self, struct pci_attach_args *pa)
{
- struct extent *ex;
bus_addr_t start;
bus_size_t size;
+ struct extent *ex;
- size = RBUS_IO_SIZE;
+ size = RBUS_IO_SIZE;
start = RBUS_IO_START;
+
#if NPCIBIOS > 0
if ((ex = pciaddr_search(PCIADDR_SEARCH_IO, &start, size)) == NULL)
#endif
@@ -125,7 +164,7 @@ rbus_pccbb_parent_io(struct device *self, struct pci_attach_args *pa)
ex = ioport_ex;
}
- return rbus_new_root_share(pa->pa_iot, ex, start, size, 0);
+ return (rbus_new_root_share(pa->pa_iot, ex, start, size, 0));
}
void
diff --git a/sys/arch/i386/include/rbus_machdep.h b/sys/arch/i386/include/rbus_machdep.h
index a8cd02ae912..e1098c2e94c 100644
--- a/sys/arch/i386/include/rbus_machdep.h
+++ b/sys/arch/i386/include/rbus_machdep.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: rbus_machdep.h,v 1.5 2007/12/09 16:53:36 kettenis Exp $ */
+/* $OpenBSD: rbus_machdep.h,v 1.6 2008/07/02 03:00:00 fgsch Exp $ */
/* $NetBSD: rbus_machdep.h,v 1.2 1999/10/15 06:43:05 haya Exp $ */
/*
@@ -31,9 +31,8 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-
-#if !defined _ARCH_I386_I386_RBUS_MACHDEP_H_
-#define _ARCH_I386_I386_RBUS_MACHDEP_H_
+#ifndef _I386_RBUS_MACHDEP_H_
+#define _I386_RBUS_MACHDEP_H_
struct pci_attach_args; /* XXX */
@@ -43,13 +42,14 @@ struct pci_attach_args; /* XXX */
#define md_space_unmap(bt, bsh, size, adrp) \
_bus_space_unmap((bt), (bsh), (size), (adrp))
+rbus_tag_t rbus_pccbb_parent_io(struct device *,
+ struct pci_attach_args *);
+rbus_tag_t rbus_pccbb_parent_mem(struct device *,
+ struct pci_attach_args *);
-rbus_tag_t rbus_pccbb_parent_io(struct device *self,
- struct pci_attach_args *pa);
-rbus_tag_t rbus_pccbb_parent_mem(struct device *self,
- struct pci_attach_args *pa);
+bus_addr_t rbus_min_start_hint(void);
-void pccbb_attach_hook(struct device *, struct device *,
- struct pci_attach_args *);
+void pccbb_attach_hook(struct device *, struct device *,
+ struct pci_attach_args *);
-#endif /* _ARCH_I386_I386_RBUS_MACHDEP_H_ */
+#endif /* _I386_RBUS_MACHDEP_H_ */