summaryrefslogtreecommitdiff
path: root/sys/arch/loongson
diff options
context:
space:
mode:
authorMiod Vallat <miod@cvs.openbsd.org>2010-01-31 15:30:00 +0000
committerMiod Vallat <miod@cvs.openbsd.org>2010-01-31 15:30:00 +0000
commit7e65c5efb9bb05baffb2412e0a33dab5ed8ef72e (patch)
tree9444307e11940ab1fb298d5e618933f968493894 /sys/arch/loongson
parent33823be2b7ff5abcf6bb63ad9c238b3455d71c21 (diff)
If there is only 256MB of physical memory or less, access it from physical
address zero onwards, instead of using the 2GB window. No functional change (except maybe unbreaking never tried 2E support).
Diffstat (limited to 'sys/arch/loongson')
-rw-r--r--sys/arch/loongson/loongson/loongson2_machdep.c39
-rw-r--r--sys/arch/loongson/loongson/machdep.c12
2 files changed, 30 insertions, 21 deletions
diff --git a/sys/arch/loongson/loongson/loongson2_machdep.c b/sys/arch/loongson/loongson/loongson2_machdep.c
index 541ef74c63e..0136d8ad919 100644
--- a/sys/arch/loongson/loongson/loongson2_machdep.c
+++ b/sys/arch/loongson/loongson/loongson2_machdep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: loongson2_machdep.c,v 1.2 2010/01/22 21:45:24 miod Exp $ */
+/* $OpenBSD: loongson2_machdep.c,v 1.3 2010/01/31 15:29:59 miod Exp $ */
/*
* Copyright (c) 2009 Miodrag Vallat.
@@ -81,10 +81,11 @@ loongson2e_setup(u_long memlo, u_long memhi)
* on Loongson 2E-based hardware...
*/
- mem_layout[0].mem_first_page = 1; /* do NOT stomp on exception area */
- mem_layout[0].mem_last_page = memlo;
+ /* do NOT stomp on exception area */
+ mem_layout[0].mem_first_page = atop(DDR_PHYSICAL_BASE) + 1;
+ mem_layout[0].mem_last_page = atop(DDR_PHYSICAL_BASE) + memlo;
- loongson_dma_base = PCI_DDR_BASE;
+ loongson_dma_base = PCI_DDR_BASE ^ DDR_PHYSICAL_BASE;
}
/*
@@ -133,13 +134,25 @@ loongson2f_setup(u_long memlo, u_long memhi)
* kernel is loaded, really).
*/
- /* do NOT stomp on exception area */
- mem_layout[0].mem_first_page = atop(DDR_WINDOW_BASE) + 1;
- mem_layout[0].mem_last_page = atop(DDR_WINDOW_BASE) + memlo + memhi;
+ if (memhi != 0) {
+ /* do NOT stomp on exception area */
+ mem_layout[0].mem_first_page = atop(DDR_WINDOW_BASE) + 1;
+ mem_layout[0].mem_last_page = atop(DDR_WINDOW_BASE) +
+ memlo + memhi;
+ loongson_dma_base = PCI_DDR_BASE ^ DDR_WINDOW_BASE;
+ } else {
+ /* do NOT stomp on exception area */
+ mem_layout[0].mem_first_page = atop(DDR_PHYSICAL_BASE) + 1;
+ mem_layout[0].mem_last_page = atop(DDR_PHYSICAL_BASE) +
+ memlo + memhi;
+ loongson_dma_base = PCI_DDR_BASE ^ DDR_PHYSICAL_BASE;
+ }
/*
* Allow access to memory beyond 256MB, by programming the
* Loongson 2F address window registers.
+ * This also makes sure PCI->DDR accesses can use a contiguous
+ * area regardless of the actual memory size.
*/
/*
@@ -178,14 +191,12 @@ is_memory_range(paddr_t pa, psize_t len, psize_t limit)
return FALSE;
/*
- * Allow access to the low 256MB aliased region on 2F systems.
+ * Allow access to the low 256MB aliased region on 2F systems,
+ * if we are accessing memory at 2GB onwards.
*/
- if (/* curcpu()->ci_hw.type == MIPS_LOONGSON2 && */
- (curcpu()->ci_hw.c0prid & 0xff) == 0x2f - 0x2c) {
- if (pa < 0x10000000) {
- fp += atop(DDR_WINDOW_BASE);
- lp += atop(DDR_WINDOW_BASE);
- }
+ if (pa < 0x10000000) {
+ fp += mem_layout[0].mem_first_page - 1;
+ lp += mem_layout[0].mem_first_page - 1;
}
for (i = 0, seg = mem_layout; i < MAXMEMSEGS; i++, seg++)
diff --git a/sys/arch/loongson/loongson/machdep.c b/sys/arch/loongson/loongson/machdep.c
index b8e4e3e81bd..8d9c407fef2 100644
--- a/sys/arch/loongson/loongson/machdep.c
+++ b/sys/arch/loongson/loongson/machdep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: machdep.c,v 1.3 2010/01/09 23:34:29 miod Exp $ */
+/* $OpenBSD: machdep.c,v 1.4 2010/01/31 15:29:59 miod Exp $ */
/*
* Copyright (c) 2009 Miodrag Vallat.
@@ -349,12 +349,10 @@ mips_init(int32_t argc, int32_t argv, int32_t envp, int32_t cv)
paddr_t firstkernpa, lastkernpa;
/* kernel is linked in CKSEG0 */
- firstkernpa = CKSEG0_TO_PHYS((vaddr_t)start);
- lastkernpa = CKSEG0_TO_PHYS((vaddr_t)ekern);
- if (loongson_ver == 0x2f) {
- firstkernpa |= 0x80000000;
- lastkernpa |= 0x80000000;
- }
+ firstkernpa = CKSEG0_TO_PHYS((vaddr_t)start) +
+ mem_layout[0].mem_first_page - 1;
+ lastkernpa = CKSEG0_TO_PHYS((vaddr_t)ekern) +
+ mem_layout[0].mem_first_page - 1;
firstkernpage = atop(trunc_page(firstkernpa));
lastkernpage = atop(round_page(lastkernpa));