Module Name: src
Committed By: matt
Date: Fri Apr 11 04:19:48 UTC 2014
Modified Files:
src/sys/arch/arm/arm32: arm32_kvminit.c arm32_machdep.c pmap.c
src/sys/arch/arm/include/arm32: pmap.h
src/sys/arch/evbarm/cubie: cubie_machdep.c cubie_start.S
Added Files:
src/sys/arch/evbarm/conf: CUBIETRUCK CUBIETRUCK_INSTALL
Log Message:
Add a kernel for the CUBIETRUCK (CUBIEBOARD3). Allow direct mapping of all
memory (but for now allow the memory mapped above KERNEL_BASE to used for
poolpages).
To generate a diff of this commit:
cvs rdiff -u -r1.27 -r1.28 src/sys/arch/arm/arm32/arm32_kvminit.c
cvs rdiff -u -r1.103 -r1.104 src/sys/arch/arm/arm32/arm32_machdep.c
cvs rdiff -u -r1.283 -r1.284 src/sys/arch/arm/arm32/pmap.c
cvs rdiff -u -r1.130 -r1.131 src/sys/arch/arm/include/arm32/pmap.h
cvs rdiff -u -r0 -r1.1 src/sys/arch/evbarm/conf/CUBIETRUCK \
src/sys/arch/evbarm/conf/CUBIETRUCK_INSTALL
cvs rdiff -u -r1.15 -r1.16 src/sys/arch/evbarm/cubie/cubie_machdep.c
cvs rdiff -u -r1.7 -r1.8 src/sys/arch/evbarm/cubie/cubie_start.S
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/arm/arm32/arm32_kvminit.c
diff -u src/sys/arch/arm/arm32/arm32_kvminit.c:1.27 src/sys/arch/arm/arm32/arm32_kvminit.c:1.28
--- src/sys/arch/arm/arm32/arm32_kvminit.c:1.27 Sat Apr 5 22:36:18 2014
+++ src/sys/arch/arm/arm32/arm32_kvminit.c Fri Apr 11 04:19:47 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: arm32_kvminit.c,v 1.27 2014/04/05 22:36:18 matt Exp $ */
+/* $NetBSD: arm32_kvminit.c,v 1.28 2014/04/11 04:19:47 matt Exp $ */
/*
* Copyright (c) 2002, 2003, 2005 Genetec Corporation. All rights reserved.
@@ -122,7 +122,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: arm32_kvminit.c,v 1.27 2014/04/05 22:36:18 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: arm32_kvminit.c,v 1.28 2014/04/11 04:19:47 matt Exp $");
#include <sys/param.h>
#include <sys/device.h>
@@ -161,10 +161,22 @@ extern char _end[];
* Macros to translate between physical and virtual for a subset of the
* kernel address space. *Not* for general use.
*/
+#if defined(KERNEL_BASE_VOFFSET)
+#define KERN_VTOPHYS(bmi, va) \
+ ((paddr_t)((vaddr_t)(va) - KERNEL_BASE_VOFFSET))
+#define KERN_PHYSTOV(bmi, pa) \
+ ((vaddr_t)((paddr_t)(pa) + KERNEL_BASE_VOFFSET))
+#elif defined(ARM_MMU_EXTENDED) && defined(__HAVE_MM_MD_DIRECT_MAPPED_PHYS)
+#define KERN_VTOPHYS(bmi, va) \
+ ((paddr_t)((vaddr_t)(va) - pmap_directbase + (bmi)->bmi_start))
+#define KERN_PHYSTOV(bmi, pa) \
+ ((vaddr_t)((paddr_t)(pa) - (bmi)->bmi_start + pmap_directbase))
+#else
#define KERN_VTOPHYS(bmi, va) \
((paddr_t)((vaddr_t)(va) - KERNEL_BASE + (bmi)->bmi_start))
#define KERN_PHYSTOV(bmi, pa) \
((vaddr_t)((paddr_t)(pa) - (bmi)->bmi_start + KERNEL_BASE))
+#endif
void
arm32_bootmem_init(paddr_t memstart, psize_t memsize, vsize_t kernelstart)
@@ -210,7 +222,11 @@ arm32_bootmem_init(paddr_t memstart, psi
*/
if (bmi->bmi_start < bmi->bmi_kernelstart) {
pv->pv_pa = bmi->bmi_start;
+#if defined(ARM_MMU_EXTENDED) && defined(__HAVE_MM_MD_DIRECT_MAPPED_PHYS)
+ pv->pv_va = pmap_directbase;
+#else
pv->pv_va = KERNEL_BASE;
+#endif
pv->pv_size = bmi->bmi_kernelstart - bmi->bmi_start;
bmi->bmi_freepages += pv->pv_size / PAGE_SIZE;
#ifdef VERBOSE_INIT_ARM
@@ -387,7 +403,27 @@ arm32_kernel_vm_init(vaddr_t kernel_vm_b
#ifdef __HAVE_MM_MD_DIRECT_MAPPED_PHYS
KASSERT(mapallmem_p);
-#endif
+#ifdef ARM_MMU_EXTENDED
+ /*
+ * We can only use address beneath kernel_vm_base to map physical
+ * memory.
+ */
+ KASSERT(kernel_vm_base >= physical_end - physical_start);
+ /*
+ * If we don't have enough memory via TTBR1, we have use addresses
+ * from TTBR0 to map some of the physical memory. But try to use as
+ * much high memory space as possible.
+ */
+ if (kernel_vm_base - KERNEL_BASE < physical_end - physical_start) {
+ pmap_directbase = kernel_vm_base
+ - (physical_end - physical_start);
+ printf("%s: changing pmap_directbase to %#lx\n", __func__,
+ pmap_directbase);
+ }
+#else
+ KASSERT(kernel_vm_base - KERNEL_BASE >= physical_end - physical_start);
+#endif /* ARM_MMU_EXTENDED */
+#endif /* __HAVE_MM_MD_DIRECT_MAPPED_PHYS */
/*
* Calculate the number of L2 pages needed for mapping the
@@ -700,7 +736,11 @@ arm32_kernel_vm_init(vaddr_t kernel_vm_b
cur_pv = *pv;
pv = SLIST_NEXT(pv, pv_list);
} else {
+#if defined(ARM_MMU_EXTENDED) && defined(__HAVE_MM_MD_DIRECT_MAPPED_PHYS)
+ cur_pv.pv_va = pmap_directbase;
+#else
cur_pv.pv_va = KERNEL_BASE;
+#endif
cur_pv.pv_pa = bmi->bmi_start;
cur_pv.pv_size = pv->pv_pa - bmi->bmi_start;
cur_pv.pv_prot = VM_PROT_READ | VM_PROT_WRITE;
Index: src/sys/arch/arm/arm32/arm32_machdep.c
diff -u src/sys/arch/arm/arm32/arm32_machdep.c:1.103 src/sys/arch/arm/arm32/arm32_machdep.c:1.104
--- src/sys/arch/arm/arm32/arm32_machdep.c:1.103 Sat Apr 5 22:36:18 2014
+++ src/sys/arch/arm/arm32/arm32_machdep.c Fri Apr 11 04:19:47 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: arm32_machdep.c,v 1.103 2014/04/05 22:36:18 matt Exp $ */
+/* $NetBSD: arm32_machdep.c,v 1.104 2014/04/11 04:19:47 matt Exp $ */
/*
* Copyright (c) 1994-1998 Mark Brinicombe.
@@ -42,7 +42,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: arm32_machdep.c,v 1.103 2014/04/05 22:36:18 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: arm32_machdep.c,v 1.104 2014/04/11 04:19:47 matt Exp $");
#include "opt_modular.h"
#include "opt_md.h"
@@ -712,11 +712,11 @@ xc_send_ipi(struct cpu_info *ci)
bool
mm_md_direct_mapped_phys(paddr_t pa, vaddr_t *vap)
{
- if (physical_start <= pa && pa < physical_end) {
- *vap = KERNEL_BASE + (pa - physical_start);
- return true;
+ bool rv;
+ vaddr_t va = pmap_direct_mapped_phys(pa, &rv, 0);
+ if (rv) {
+ *vap = va;
}
-
- return false;
+ return rv;
}
#endif
Index: src/sys/arch/arm/arm32/pmap.c
diff -u src/sys/arch/arm/arm32/pmap.c:1.283 src/sys/arch/arm/arm32/pmap.c:1.284
--- src/sys/arch/arm/arm32/pmap.c:1.283 Thu Apr 10 02:45:55 2014
+++ src/sys/arch/arm/arm32/pmap.c Fri Apr 11 04:19:47 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.c,v 1.283 2014/04/10 02:45:55 matt Exp $ */
+/* $NetBSD: pmap.c,v 1.284 2014/04/11 04:19:47 matt Exp $ */
/*
* Copyright 2003 Wasabi Systems, Inc.
@@ -216,7 +216,7 @@
#include <arm/locore.h>
//#include <arm/arm32/katelib.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.283 2014/04/10 02:45:55 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.284 2014/04/11 04:19:47 matt Exp $");
//#define PMAP_DEBUG
#ifdef PMAP_DEBUG
@@ -512,6 +512,13 @@ int pmap_kmpages;
*/
bool pmap_initialized;
+#if defined(ARM_MMU_EXTENDED) && defined(__HAVE_MM_MD_DIRECT_MAPPED_PHYS)
+/*
+ * Start of direct-mapped memory
+ */
+vaddr_t pmap_directbase = KERNEL_BASE;
+#endif
+
/*
* Misc. locking data structures
*/
@@ -1294,9 +1301,12 @@ pmap_alloc_l1(pmap_t pm)
#else
struct vm_page *pg = uvm_pagealloc(NULL, 0, NULL, UVM_PGA_ZERO);
#endif
+ bool ok __diagused;
KASSERT(pg != NULL);
pm->pm_l1_pa = VM_PAGE_TO_PHYS(pg);
- vaddr_t va = KERNEL_BASE + (pm->pm_l1_pa - physical_start);
+ vaddr_t va = pmap_direct_mapped_phys(pm->pm_l1_pa, &ok, 0xdeadbeef);
+ KASSERT(ok);
+ KASSERT(va >= KERNEL_BASE);
#else
KASSERTMSG(kernel_map != NULL, "pm %p", pm);
@@ -2632,11 +2642,16 @@ pmap_syncicache_page(struct vm_page_md *
KASSERT(arm_cache_prefer_mask == 0 || md->pvh_attrs & PVF_COLORED);
#endif
+ pt_entry_t * const ptep = cpu_cdst_pte(0);
+ const vaddr_t dstp = cpu_cdstp(0);
#ifdef __HAVE_MM_MD_DIRECT_MAPPED_PHYS
- if (way_size == PAGE_SIZE) {
- vaddr_t vdstp = KERNEL_BASE + (pa - physical_start);
- cpu_icache_sync_range(vdstp, way_size);
- return;
+ if (way_size <= PAGE_SIZE) {
+ bool ok = false;
+ vaddr_t vdstp = pmap_direct_mapped_phys(pa, &ok, dstp);
+ if (ok) {
+ cpu_icache_sync_range(vdstp, way_size);
+ return;
+ }
}
#endif
@@ -2645,8 +2660,6 @@ pmap_syncicache_page(struct vm_page_md *
* same page to pages in the way and then do the icache_sync on
* the entire way making sure we are cleaned.
*/
- pt_entry_t * const ptep = cpu_cdst_pte(0);
- const vaddr_t dstp = cpu_cdstp(0);
const pt_entry_t npte = L2_S_PROTO | pa | pte_l2_s_cache_mode
| L2_S_PROT(PTE_KERNEL, VM_PROT_READ|VM_PROT_WRITE);
@@ -5112,10 +5125,10 @@ pmap_zero_page_generic(paddr_t pa)
* Is this page mapped at its natural color?
* If we have all of memory mapped, then just convert PA to VA.
*/
- const bool okcolor = arm_pcache.dcache_type == CACHE_TYPE_PIPT
+ bool okcolor = arm_pcache.dcache_type == CACHE_TYPE_PIPT
|| va_offset == (pa & arm_cache_prefer_mask);
const vaddr_t vdstp = okcolor
- ? KERNEL_BASE + (pa - physical_start)
+ ? pmap_direct_mapped_phys(pa, &okcolor, cpu_cdstp(va_offset))
: cpu_cdstp(va_offset);
#else
const bool okcolor = false;
@@ -5142,7 +5155,8 @@ pmap_zero_page_generic(paddr_t pa)
PTE_SYNC(ptep);
cpu_tlb_flushD_SE(vdstp);
cpu_cpwait();
-#if defined(__HAVE_MM_MD_DIRECT_MAPPED_PHYS) && defined(PMAP_CACHE_VIPT)
+#if defined(__HAVE_MM_MD_DIRECT_MAPPED_PHYS) && defined(PMAP_CACHE_VIPT) \
+ && !defined(ARM_MMU_EXTENDED)
/*
* If we are direct-mapped and our color isn't ok, then before
* we bzero the page invalidate its contents from the cache and
@@ -5239,10 +5253,10 @@ pmap_pageidlezero(paddr_t pa)
const vsize_t va_offset = 0;
#endif
#ifdef __HAVE_MM_MD_DIRECT_MAPPED_PHYS
- const bool okcolor = arm_pcache.dcache_type == CACHE_TYPE_PIPT
+ bool okcolor = arm_pcache.dcache_type == CACHE_TYPE_PIPT
|| va_offset == (pa & arm_cache_prefer_mask);
const vaddr_t vdstp = okcolor
- ? KERNEL_BASE + (pa - physical_start)
+ ? pmap_direct_mapped_phys(pa, &okcolor, cpu_cdstp(va_offset))
: cpu_cdstp(va_offset);
#else
const bool okcolor = false;
@@ -5350,14 +5364,16 @@ pmap_copy_page_generic(paddr_t src, padd
* Is this page mapped at its natural color?
* If we have all of memory mapped, then just convert PA to VA.
*/
- const bool src_okcolor = arm_pcache.dcache_type == CACHE_TYPE_PIPT
+ bool src_okcolor = arm_pcache.dcache_type == CACHE_TYPE_PIPT
|| src_va_offset == (src & arm_cache_prefer_mask);
- const bool dst_okcolor = arm_pcache.dcache_type == CACHE_TYPE_PIPT
+ bool dst_okcolor = arm_pcache.dcache_type == CACHE_TYPE_PIPT
|| dst_va_offset == (dst & arm_cache_prefer_mask);
const vaddr_t vsrcp = src_okcolor
- ? KERNEL_BASE + (src - physical_start)
+ ? pmap_direct_mapped_phys(src, &src_okcolor,
+ cpu_csrcp(src_va_offset))
: cpu_csrcp(src_va_offset);
- const vaddr_t vdstp = KERNEL_BASE + (dst - physical_start);
+ const vaddr_t vdstp = pmap_direct_mapped_phys(dst, &dst_okcolor,
+ cpu_cdstp(dst_va_offset));
#else
const bool src_okcolor = false;
const bool dst_okcolor = false;
@@ -6602,6 +6618,9 @@ pmap_map_chunk(vaddr_t l1pt, vaddr_t va,
#ifdef ARM_MMU_EXTENDED_XXX
| ((prot & VM_PROT_EXECUTE) ? 0 : L1_S_V6_XN)
#endif
+#ifdef ARM_MMU_EXTENDED
+ | (va & 0x80000000 ? 0 : L1_S_V6_nG)
+#endif
| L1_S_PROT(PTE_KERNEL, prot) | f1;
#ifdef VERBOSE_INIT_ARM
printf("sS");
@@ -6620,6 +6639,9 @@ pmap_map_chunk(vaddr_t l1pt, vaddr_t va,
#ifdef ARM_MMU_EXTENDED_XXX
| ((prot & VM_PROT_EXECUTE) ? 0 : L1_S_V6_XN)
#endif
+#ifdef ARM_MMU_EXTENDED
+ | (va & 0x80000000 ? 0 : L1_S_V6_nG)
+#endif
| L1_S_PROT(PTE_KERNEL, prot) | f1
| L1_S_DOM(PMAP_DOMAIN_KERNEL);
#ifdef VERBOSE_INIT_ARM
@@ -6654,6 +6676,9 @@ pmap_map_chunk(vaddr_t l1pt, vaddr_t va,
#ifdef ARM_MMU_EXTENDED_XXX
| ((prot & VM_PROT_EXECUTE) ? 0 : L2_XS_L_XN)
#endif
+#ifdef ARM_MMU_EXTENDED
+ | (va & 0x80000000 ? 0 : L2_XS_nG)
+#endif
| L2_L_PROT(PTE_KERNEL, prot) | f2l;
#ifdef VERBOSE_INIT_ARM
printf("L");
@@ -6674,6 +6699,9 @@ pmap_map_chunk(vaddr_t l1pt, vaddr_t va,
#ifdef ARM_MMU_EXTENDED_XXX
| ((prot & VM_PROT_EXECUTE) ? 0 : L2_XS_XN)
#endif
+#ifdef ARM_MMU_EXTENDED
+ | (va & 0x80000000 ? 0 : L2_XS_nG)
+#endif
| L2_S_PROT(PTE_KERNEL, prot) | f2s;
l2pte_set(ptep, npte, 0);
PTE_SYNC(ptep);
@@ -7331,16 +7359,17 @@ pmap_pte_init_armv7(void)
pte_l1_s_cache_mode |= L1_S_V6_S;
pte_l2_l_cache_mode |= L2_XS_S;
pte_l2_s_cache_mode |= L2_XS_S;
-
- /*
- * write-back, no write-allocate, shareable for page tables.
- */
- pte_l1_s_cache_mode_pt = pte_l1_s_cache_mode;
- pte_l2_l_cache_mode_pt = pte_l2_l_cache_mode;
- pte_l2_s_cache_mode_pt = pte_l2_s_cache_mode;
}
/*
+ * Page tables are just all other memory. We can use write-back since
+ * pmap_needs_pte_sync is 1 (or the MMU can read out of cache).
+ */
+ pte_l1_s_cache_mode_pt = pte_l1_s_cache_mode;
+ pte_l2_l_cache_mode_pt = pte_l2_l_cache_mode;
+ pte_l2_s_cache_mode_pt = pte_l2_s_cache_mode;
+
+ /*
* Check the Memory Model Features to see if this CPU supports
* the TLBIASID coproc op.
*/
@@ -7714,11 +7743,21 @@ arm_pmap_alloc_poolpage(int flags)
/*
* On some systems, only some pages may be "coherent" for dma and we
* want to prefer those for pool pages (think mbufs) but fallback to
- * any page if none is available.
+ * any page if none is available. But we can only fallback if we
+ * aren't direct mapping memory or all of memory can be direct-mapped.
+ * If that isn't true, pool changes can only come from direct-mapped
+ * memory.
*/
if (arm_poolpage_vmfreelist != VM_FREELIST_DEFAULT) {
return uvm_pagealloc_strat(NULL, 0, NULL, flags,
- UVM_PGA_STRAT_FALLBACK, arm_poolpage_vmfreelist);
+#if defined(__HAVE_MM_MD_DIRECT_MAPPED_PHYS) && defined(ARM_MMU_EXTENDED)
+ (pmap_directbase < KERNEL_BASE
+ ? UVM_PGA_STRAT_ONLY
+ : UVM_PGA_STRAT_FALLBACK),
+#else
+ UVM_PGA_STRAT_FALLBACK,
+#endif
+ arm_poolpage_vmfreelist);
}
return uvm_pagealloc(NULL, 0, NULL, flags);
@@ -7741,3 +7780,59 @@ pic_ipi_shootdown(void *arg)
return 1;
}
#endif /* ARM_MMU_EXTENDED && MULTIPROCESSOR */
+
+
+#ifdef __HAVE_MM_MD_DIRECT_MAPPED_PHYS
+vaddr_t
+pmap_direct_mapped_phys(paddr_t pa, bool *ok_p, vaddr_t va)
+{
+ bool ok = false;
+ if (physical_start <= pa && pa < physical_end) {
+#ifdef ARM_MMU_EXTENDED
+ const vaddr_t newva = pmap_directbase + pa - physical_start;
+ if (newva >= KERNEL_BASE) {
+ va = newva;
+ ok = true;
+ }
+#else
+ va = KERNEL_BASE + pa - physical_start;
+ ok = true;
+#endif
+ }
+ KASSERT(ok_p);
+ *ok_p = ok;
+ return va;
+}
+
+vaddr_t
+pmap_map_poolpage(paddr_t pa)
+{
+ bool ok __diagused;
+ vaddr_t va = pmap_direct_mapped_phys(pa, &ok, 0);
+ KASSERT(ok);
+#if defined(PMAP_CACHE_VIPT) && !defined(ARM_MMU_EXTENDED)
+ if (arm_cache_prefer_mask != 0) {
+ struct vm_page * const pg = PHYS_TO_VM_PAGE(pa);
+ struct vn_page_md * const md = VM_PAGE_TO_MD(pg);
+ pmap_acquire_page_lock(md);
+ pmap_vac_me_harder(md, pa, pmap_kernel(), va);
+ pmap_release_page_lock(md);
+ }
+#endif
+ return va;
+}
+
+paddr_t
+pmap_unmap_poolpage(vaddr_t va)
+{
+ KASSERT(va >= KERNEL_BASE);
+#if defined(ARM_MMU_EXTENDED)
+ return va - pmap_directbase + physical_start;
+#else
+#ifdef PMAP_CACHE_VIVT
+ cpu_idcache_wbinv_range(va, PAGE_SIZE);
+#endif
+ return va - KERNEL_BASE + physical_start;
+#endif
+}
+#endif /* __HAVE_MM_MD_DIRECT_MAPPED_PHYS */
Index: src/sys/arch/arm/include/arm32/pmap.h
diff -u src/sys/arch/arm/include/arm32/pmap.h:1.130 src/sys/arch/arm/include/arm32/pmap.h:1.131
--- src/sys/arch/arm/include/arm32/pmap.h:1.130 Fri Apr 4 16:12:28 2014
+++ src/sys/arch/arm/include/arm32/pmap.h Fri Apr 11 04:19:47 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.h,v 1.130 2014/04/04 16:12:28 matt Exp $ */
+/* $NetBSD: pmap.h,v 1.131 2014/04/11 04:19:47 matt Exp $ */
/*
* Copyright (c) 2002, 2003 Wasabi Systems, Inc.
@@ -406,6 +406,15 @@ void pmap_devmap_register(const struct p
bool pmap_pageidlezero(paddr_t);
#define PMAP_PAGEIDLEZERO(pa) pmap_pageidlezero((pa))
+#ifdef __HAVE_MM_MD_DIRECT_MAPPED_PHYS
+/*
+ * For the pmap, this is a more useful way to map a direct mapped page.
+ * It returns either the direct-mapped VA or the VA supplied if it can't
+ * be direct mapped.
+ */
+vaddr_t pmap_direct_mapped_phys(paddr_t, bool *, vaddr_t);
+#endif
+
/*
* used by dumpsys to record the PA of the L1 table
*/
@@ -415,6 +424,13 @@ uint32_t pmap_kernel_L1_addr(void);
*/
extern vaddr_t pmap_curmaxkvaddr;
+#if defined(ARM_MMU_EXTENDED) && defined(__HAVE_MM_MD_DIRECT_MAPPED_PHYS)
+/*
+ * Starting VA of direct mapped memory (usually KERNEL_BASE).
+ */
+extern vaddr_t pmap_directbase;
+#endif
+
/*
* Useful macros and constants
*/
@@ -1030,10 +1046,10 @@ struct vm_page *arm_pmap_alloc_poolpage(
#define PMAP_ALLOC_POOLPAGE arm_pmap_alloc_poolpage
#endif
#if defined(PMAP_NEED_ALLOC_POOLPAGE) || defined(__HAVE_MM_MD_DIRECT_MAPPED_PHYS)
-#define PMAP_MAP_POOLPAGE(pa) \
- ((vaddr_t)((paddr_t)(pa) - physical_start + KERNEL_BASE))
-#define PMAP_UNMAP_POOLPAGE(va) \
- ((paddr_t)((vaddr_t)(va) - KERNEL_BASE + physical_start))
+vaddr_t pmap_map_poolpage(paddr_t);
+paddr_t pmap_unmap_poolpage(vaddr_t);
+#define PMAP_MAP_POOLPAGE(pa) pmap_map_poolpage(pa)
+#define PMAP_UNMAP_POOLPAGE(va) pmap_unmap_poolpage(va)
#endif
/*
Index: src/sys/arch/evbarm/cubie/cubie_machdep.c
diff -u src/sys/arch/evbarm/cubie/cubie_machdep.c:1.15 src/sys/arch/evbarm/cubie/cubie_machdep.c:1.16
--- src/sys/arch/evbarm/cubie/cubie_machdep.c:1.15 Sat Mar 29 14:00:30 2014
+++ src/sys/arch/evbarm/cubie/cubie_machdep.c Fri Apr 11 04:19:48 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: cubie_machdep.c,v 1.15 2014/03/29 14:00:30 matt Exp $ */
+/* $NetBSD: cubie_machdep.c,v 1.16 2014/04/11 04:19:48 matt Exp $ */
/*
* Machine dependent functions for kernel setup for TI OSK5912 board.
@@ -125,7 +125,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cubie_machdep.c,v 1.15 2014/03/29 14:00:30 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cubie_machdep.c,v 1.16 2014/04/11 04:19:48 matt Exp $");
#include "opt_machdep.h"
#include "opt_ddb.h"
@@ -216,7 +216,11 @@ int use_fb_console = true;
* kernel address space. *Not* for general use.
*/
#define KERNEL_BASE_PHYS ((paddr_t)KERNEL_BASE_phys)
+#ifdef KERNEL_BASES_EQUAL
+#define KERNEL_PHYS_VOFFSET 0
+#else
#define KERNEL_PHYS_VOFFSET (KERNEL_BASE - AWIN_SDRAM_PBASE)
+#endif
#define AWIN_CORE_VOFFSET (AWIN_CORE_VBASE - AWIN_CORE_PBASE)
/* Prototypes */
@@ -279,6 +283,15 @@ static const struct pmap_devmap devmap[]
#undef _A
#undef _S
+#ifdef PMAP_NEED_ALLOC_POOLPAGE
+static struct boot_physmem bp_highgig = {
+ .bp_start = AWIN_SDRAM_PBASE / NBPG,
+ .bp_pages = (KERNEL_VM_BASE - KERNEL_BASE) / NBPG,
+ .bp_freelist = VM_FREELIST_ISADMA,
+ .bp_flags = 0,
+};
+#endif
+
/*
* u_int initarm(...)
*
@@ -366,12 +379,14 @@ initarm(void *arg)
#ifdef __HAVE_MM_MD_DIRECT_MAPPED_PHYS
const bool mapallmem_p = true;
+#ifndef PMAP_NEED_ALLOC_POOLPAGE
if (ram_size > KERNEL_VM_BASE - KERNEL_BASE) {
printf("%s: dropping RAM size from %luMB to %uMB\n",
__func__, (unsigned long) (ram_size >> 20),
(KERNEL_VM_BASE - KERNEL_BASE) >> 20);
ram_size = KERNEL_VM_BASE - KERNEL_BASE;
}
+#endif
#else
const bool mapallmem_p = false;
#endif
@@ -408,7 +423,19 @@ initarm(void *arg)
use_fb_console = true;
}
#endif
-
+ /*
+ * If we couldn't map all of memory via TTBR1, limit the memory the
+ * kernel can allocate from to be from the highest available 1GB.
+ */
+#ifdef PMAP_NEED_ALLOC_POOLPAGE
+ if (atop(ram_size) > bp_highgig.bp_pages) {
+ bp_highgig.bp_start += atop(ram_size) - bp_highgig.bp_pages;
+ arm_poolpage_vmfreelist = bp_highgig.bp_freelist;
+ return initarm_common(KERNEL_VM_BASE, KERNEL_VM_SIZE,
+ &bp_highgig, 1);
+ }
+#endif
+
return initarm_common(KERNEL_VM_BASE, KERNEL_VM_SIZE, NULL, 0);
}
Index: src/sys/arch/evbarm/cubie/cubie_start.S
diff -u src/sys/arch/evbarm/cubie/cubie_start.S:1.7 src/sys/arch/evbarm/cubie/cubie_start.S:1.8
--- src/sys/arch/evbarm/cubie/cubie_start.S:1.7 Sat Mar 29 14:00:30 2014
+++ src/sys/arch/evbarm/cubie/cubie_start.S Fri Apr 11 04:19:48 2014
@@ -40,10 +40,15 @@
#include <arm/allwinner/awin_reg.h>
#include <evbarm/cubie/platform.h>
-RCSID("$NetBSD: cubie_start.S,v 1.7 2014/03/29 14:00:30 matt Exp $")
+RCSID("$NetBSD: cubie_start.S,v 1.8 2014/04/11 04:19:48 matt Exp $")
#if defined(VERBOSE_INIT_ARM)
#define XPUTC(n) mov r0, n; bl xputc
+#ifdef KERNEL_BASES_EQUAL
+#define XPUTC2(n) mov r0, n; bl xputc
+#else
+#define XPUTC2(n) mov r0, n; blx r11
+#endif
#ifdef __ARMEB__
#define COM_BSWAP
#endif
@@ -51,6 +56,7 @@ RCSID("$NetBSD: cubie_start.S,v 1.7 2014
#define XPUTC_COM 1
#else
#define XPUTC(n)
+#define XPUTC2(n)
#endif
#define INIT_MEMSIZE 128
@@ -59,11 +65,15 @@ RCSID("$NetBSD: cubie_start.S,v 1.7 2014
#define MD_CPU_HATCH _C_LABEL(awin_cpu_hatch)
/*
- * Kernel start routine for BEAGLEBOARD boards.
+ * Kernel start routine for CUBIE (Allwinner) boards.
* At this point, this code has been loaded into SDRAM
- * and the MMU is off
+ * and the MMU maybe on or maybe off.
*/
+#ifdef KERNEL_BASES_EQUAL
+ .text
+#else
.section .start,"ax",%progbits
+#endif
.global _C_LABEL(cubie_start)
_C_LABEL(cubie_start):
@@ -76,17 +86,19 @@ _C_LABEL(cubie_start):
cpsid if, #PSR_SVC32_MODE
/*
- * Save any arguments passed to us. But since .start is at 0x40000000
- * and .text is at 0x8000000, we can't directly use the address that
- * the linker gave us directly. We have to replace the upper 4 bits
- * of the address the linker gave us and replace it with the upper 4
- * bits of our pc. Or replace the lower 28 bits of our PC with the
- * lower 28 bits of what the linker gave us.
- */
- adr r4, _C_LABEL(cubie_start)
- movw r5, #:lower16:uboot_args
- movt r5, #:upper16:uboot_args
- bfi r4, r5, #0, #28
+ * Save any arguments passed to us.
+ */
+ movw r4, #:lower16:uboot_args
+ movt r4, #:upper16:uboot_args
+#ifndef KERNEL_BASES_EQUAL
+ /*
+ * But since .start is at 0x40000000 and .text is at 0x8000000, we
+ * can't directly use the address that the linker gave us directly.
+ * We have to adjust the address the linker gave us to get the to
+ * the physical address.
+ */
+ sub r4, r4, #KERNEL_BASE_VOFFSET
+#endif
stmia r4, {r0-r3} // Save the arguments
@@ -107,39 +119,59 @@ _C_LABEL(cubie_start):
XPUTC(#68)
/*
- * Turn on the MMU, Caches, etc.
+ * Turn on the MMU, Caches, etc. Return to new enabled address space.
*/
movw r0, #:lower16:TEMP_L1_TABLE
movt r0, #:upper16:TEMP_L1_TABLE
+#ifdef KERNEL_BASES_EQUAL
bl arm_cpuinit
-
- XPUTC(#90)
+#else
+ /*
+ * After the MMU is on, we can execute in the normal .text segment
+ * so setup the lr to be in .text. Cache the address for xputc
+ * before we go.
+ */
+#ifdef VERBOSE_INIT_ARM
+ adr r11, xputc @ for XPUTC2
+#endif
+ movw lr, #:lower16:1f
+ movt lr, #:upper16:1f
+ b arm_cpuinit
+ .pushsection .text,"ax",%progbits
+1:
+#endif
+ XPUTC2(#90)
#if defined(MULTIPROCESSOR)
// Now spin up the second processors into the same state we are now.
- XPUTC(#77)
- XPUTC(#80)
- XPUTC(#60)
+ XPUTC2(#77)
+ XPUTC2(#80)
+ XPUTC2(#60)
// Make sure the cache is flushed out to RAM for the other CPUs
bl _C_LABEL(armv7_dcache_wbinv_all)
bl a20_mpinit
- XPUTC(#62)
+ XPUTC2(#62)
#endif /* MULTIPROCESSOR */
- XPUTC(#13)
- XPUTC(#10)
+ XPUTC2(#13)
+ XPUTC2(#10)
/*
* Jump to start in locore.S, which in turn will call initarm and main.
*/
- movw ip, #:lower16:start
- movt ip, #:upper16:start
- bx ip /* Jump to start (flushes pipeline). */
+ b start
/* NOTREACHED */
+#ifndef KERNEL_BASES_EQUAL
+ .popsection
+#endif
+
#include <arm/cortex/a9_mpsubr.S>
#if defined(MULTIPROCESSOR)
+#ifndef KERNEL_BASES_EQUAL
+ .pushsection .text,"ax",%progbits
+#endif
a20_mpinit:
mov r4, lr // because we call gtmr_bootdelay
movw r5, #:lower16:(AWIN_CORE_PBASE+AWIN_CPUCFG_OFFSET)
@@ -214,16 +246,30 @@ a20_mpinit:
bl _C_LABEL(gtmr_bootdelay)
b 1b
ASEND(a20_mpinit)
+#ifndef KERNEL_BASES_EQUAL
+ .popsection
+#endif
#endif /* MULTIPROCESSOR */
.Lmmu_init_table:
+#ifdef KERNEL_BASES_EQUAL
+ /* Map memory 1:1 VA to PA, write-back cacheable, shareable */
+ MMU_INIT(KERNEL_BASE, KERNEL_BASE, INIT_MEMSIZE,
+ L1_S_PROTO_armv7 | L1_S_APv7_KRW | L1_S_CACHEABLE)
+
+ /* Map temp L1 table 1:1 VA to PA, write-back cacheable, shareable */
+ MMU_INIT(TEMP_L1_TABLE, TEMP_L1_TABLE, INIT_MEMSIZE,
+ L1_S_PROTO_armv7 | L1_S_APv7_KRW | L1_S_CACHEABLE)
+#else
/* Map KERNEL_BASE VA to SDRAM PA, write-back cacheable, shareable */
- MMU_INIT(KERNEL_BASE, AWIN_SDRAM_PBASE, INIT_MEMSIZE,
+ MMU_INIT(KERNEL_BASE, KERNEL_BASE - KERNEL_BASE_VOFFSET, INIT_MEMSIZE,
L1_S_PROTO_armv7 | L1_S_APv7_KRW | L1_S_CACHEABLE)
/* Map memory 1:1 VA to PA, write-back cacheable, shareable */
- MMU_INIT(AWIN_SDRAM_PBASE, AWIN_SDRAM_PBASE, INIT_MEMSIZE,
+ MMU_INIT(KERNEL_BASE - KERNEL_BASE_VOFFSET,
+ KERNEL_BASE - KERNEL_BASE_VOFFSET, INIT_MEMSIZE,
L1_S_PROTO_armv7 | L1_S_APv7_KRW | L1_S_CACHEABLE)
+#endif
/* Map AWIN CORE (so console will work) */
MMU_INIT(AWIN_CORE_VBASE, AWIN_CORE_PBASE,
Added files:
Index: src/sys/arch/evbarm/conf/CUBIETRUCK
diff -u /dev/null src/sys/arch/evbarm/conf/CUBIETRUCK:1.1
--- /dev/null Fri Apr 11 04:19:48 2014
+++ src/sys/arch/evbarm/conf/CUBIETRUCK Fri Apr 11 04:19:47 2014
@@ -0,0 +1,19 @@
+# $NetBSD: CUBIETRUCK,v 1.1 2014/04/11 04:19:47 matt Exp $
+#
+# CUBIETRUCK - Cubieboard3 (mostly cubieboard2 with 2GB)
+#
+
+include "arch/evbarm/conf/CUBIEBOARD"
+
+#
+# Relocate loaded kernel to second GB of memory.
+#
+no makeoptions KERNEL_BASE_PHYS
+no makeoptions KERNEL_BASE_VIRT
+makeoptions KERNEL_BASE_PHYS="0x80000000"
+makeoptions KERNEL_BASE_VIRT="0x80000000"
+
+#
+# We need this too.
+#
+options PMAP_NEED_ALLOC_POOLPAGE
Index: src/sys/arch/evbarm/conf/CUBIETRUCK_INSTALL
diff -u /dev/null src/sys/arch/evbarm/conf/CUBIETRUCK_INSTALL:1.1
--- /dev/null Fri Apr 11 04:19:48 2014
+++ src/sys/arch/evbarm/conf/CUBIETRUCK_INSTALL Fri Apr 11 04:19:47 2014
@@ -0,0 +1,10 @@
+# $NetBSD: CUBIETRUCK_INSTALL,v 1.1 2014/04/11 04:19:47 matt Exp $
+#
+# CUBIETRUCK_INSTALL -- CUBIETRUCK kernel with installation-sized
+# ramdisk
+#
+
+include "arch/evbarm/conf/CUBIETRUCK"
+include "arch/evbarm/conf/INSTALL"
+
+options BOOTHOWTO=RB_SINGLE