From a62a67d37ced1aeefcb93be2b7f35b52543307c3 Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 11 Apr 2006 15:08:10 +0000 Subject: [PATCH] Implement pmap_devmap on hpcarm to map I/O registers that are used in early start-up stage. Change the virtual address for UART #3 to the physical address in the configuration files. While here, implement the sa11x0_bs_unmap function. Reviewed by Toru Nishimura (on port-arm). --- sys/arch/arm/sa11x0/sa11x0_com.c | 6 +++--- sys/arch/arm/sa11x0/sa11x0_io.c | 32 ++++++++++++++++++---------- sys/arch/arm/sa11x0/sa11x0_reg.h | 6 +++--- sys/arch/hpcarm/conf/IPAQ | 4 ++-- sys/arch/hpcarm/conf/JORNADA720 | 6 +++--- sys/arch/hpcarm/conf/JORNADA820 | 7 +++--- sys/arch/hpcarm/hpcarm/hpc_machdep.c | 27 +++++++++++++++++------ 7 files changed, 56 insertions(+), 32 deletions(-) diff --git a/sys/arch/arm/sa11x0/sa11x0_com.c b/sys/arch/arm/sa11x0/sa11x0_com.c index edfd6cf5efd3..6dd3fa0461b7 100644 --- a/sys/arch/arm/sa11x0/sa11x0_com.c +++ b/sys/arch/arm/sa11x0/sa11x0_com.c @@ -1,4 +1,4 @@ -/* $NetBSD: sa11x0_com.c,v 1.30 2006/03/26 04:42:50 thorpej Exp $ */ +/* $NetBSD: sa11x0_com.c,v 1.31 2006/04/11 15:08:10 peter Exp $ */ /*- * Copyright (c) 1998, 1999, 2001 The NetBSD Foundation, Inc. @@ -71,7 +71,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: sa11x0_com.c,v 1.30 2006/03/26 04:42:50 thorpej Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sa11x0_com.c,v 1.31 2006/04/11 15:08:10 peter Exp $"); #include "opt_com.h" #include "opt_ddb.h" @@ -1518,7 +1518,7 @@ sacomcninit(struct consdev *cp) { if (cp == NULL) { /* XXX cp == NULL means that MMU is disabled. */ - sacomconsioh = SACOM3_HW_BASE; + sacomconsioh = SACOM3_BASE; sacomconstag = &sa11x0_bs_tag; cn_tab = &sacomcons; return; diff --git a/sys/arch/arm/sa11x0/sa11x0_io.c b/sys/arch/arm/sa11x0/sa11x0_io.c index 652e0a79654f..c2a386d8a72d 100644 --- a/sys/arch/arm/sa11x0/sa11x0_io.c +++ b/sys/arch/arm/sa11x0/sa11x0_io.c @@ -1,4 +1,4 @@ -/* $NetBSD: sa11x0_io.c,v 1.15 2006/03/04 17:22:06 peter Exp $ */ +/* $NetBSD: sa11x0_io.c,v 1.16 2006/04/11 15:08:10 peter Exp $ */ /* * Copyright (c) 1997 Mark Brinicombe. @@ -41,7 +41,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: sa11x0_io.c,v 1.15 2006/03/04 17:22:06 peter Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sa11x0_io.c,v 1.16 2006/04/11 15:08:10 peter Exp $"); #include #include @@ -145,14 +145,13 @@ sa11x0_bs_map(void *t, bus_addr_t bpa, bus_size_t size, int cacheable, u_long startpa, endpa, pa; vaddr_t va; pt_entry_t *pte; + const struct pmap_devmap *pd; -#ifdef hpcarm - if ((u_long)bpa > (u_long)KERNEL_BASE) { - /* XXX This is a temporary hack to aid transition. */ - *bshp = bpa; - return(0); + if ((pd = pmap_devmap_find_pa(bpa, size)) != NULL) { + /* Device was statically mapped. */ + *bshp = pd->pd_va + (bpa - pd->pd_pa); + return 0; } -#endif startpa = trunc_page(bpa); endpa = round_page(bpa + size); @@ -190,9 +189,20 @@ sa11x0_bs_alloc(void *t, bus_addr_t rstart, bus_addr_t rend, bus_size_t size, void sa11x0_bs_unmap(void *t, bus_space_handle_t bsh, bus_size_t size) { - /* - * Temporary implementation - */ + vaddr_t va, endva; + + if (pmap_devmap_find_va(bsh, size) != NULL) { + /* Device was statically mapped; nothing to do. */ + return; + } + + va = trunc_page(bsh); + endva = round_page(bsh + size); + + pmap_kremove(va, endva - va); + pmap_update(pmap_kernel()); + + uvm_km_free(kernel_map, va, endva - va, UVM_KMF_VAONLY); } void diff --git a/sys/arch/arm/sa11x0/sa11x0_reg.h b/sys/arch/arm/sa11x0/sa11x0_reg.h index 3c94c1725ee6..ba1e1347b714 100644 --- a/sys/arch/arm/sa11x0/sa11x0_reg.h +++ b/sys/arch/arm/sa11x0/sa11x0_reg.h @@ -1,4 +1,4 @@ -/* $NetBSD: sa11x0_reg.h,v 1.4 2002/07/19 18:26:56 ichiro Exp $ */ +/* $NetBSD: sa11x0_reg.h,v 1.5 2006/04/11 15:08:10 peter Exp $ */ /*- * Copyright (c) 2001 The NetBSD Foundation, Inc. All rights reserved. @@ -48,7 +48,7 @@ #define SAPPC_BASE 0x90060000 /* Peripheral Pin Controller */ #define SAUDC_BASE 0x80000000 /* USB Device Controller*/ #define SACOM1_BASE 0x80010000 /* GPCLK/UART 1 */ -#define SACOM3_HW_BASE 0x80050000 /* UART 3 */ +#define SACOM3_BASE 0x80050000 /* UART 3 */ #define SAMCP_BASE 0x80060000 /* MCP Controller */ #define SASSP_BASE 0x80070000 /* Synchronous serial port */ @@ -56,7 +56,7 @@ #define SALCD_BASE 0xB0100000 /* LCD */ /* Register base virtual addresses mapped by initarm() */ -#define SACOM3_BASE 0xd000d000 +#define SACOM3_VBASE 0xd000d000 /* Interrupt controller registers */ #define SAIPIC_NPORTS 9 diff --git a/sys/arch/hpcarm/conf/IPAQ b/sys/arch/hpcarm/conf/IPAQ index 1dd1296a59d7..c06668625aff 100644 --- a/sys/arch/hpcarm/conf/IPAQ +++ b/sys/arch/hpcarm/conf/IPAQ @@ -1,4 +1,4 @@ -# $NetBSD: IPAQ,v 1.46 2006/03/28 20:58:40 pavel Exp $ +# $NetBSD: IPAQ,v 1.47 2006/04/11 15:08:10 peter Exp $ # # iPAQ H3600 -- Windows-CE based PDA # @@ -138,7 +138,7 @@ saip0 at mainbus? # Serial options CONSPEED=19200 -sacom* at saip? addr 0xd000d000 size 0x24 intr 17 +sacom* at saip? addr 0x80050000 size 0x24 intr 17 # OS Timer saost* at saip? addr 0x90000000 size 0x20 diff --git a/sys/arch/hpcarm/conf/JORNADA720 b/sys/arch/hpcarm/conf/JORNADA720 index 041d684b4089..3c4e19d52822 100644 --- a/sys/arch/hpcarm/conf/JORNADA720 +++ b/sys/arch/hpcarm/conf/JORNADA720 @@ -1,4 +1,4 @@ -# $NetBSD: JORNADA720,v 1.57 2006/03/28 20:58:40 pavel Exp $ +# $NetBSD: JORNADA720,v 1.58 2006/04/11 15:08:10 peter Exp $ # # JORNADA -- Windows-CE based jornada 720 # @@ -7,7 +7,7 @@ include "arch/hpcarm/conf/std.hpcarm" #options INCLUDE_CONFIG_FILE # embed config file in kernel binary -#ident "GENERIC-$Revision: 1.57 $" +#ident "GENERIC-$Revision: 1.58 $" # estimated number of users maxusers 32 @@ -144,7 +144,7 @@ saip0 at mainbus? # Serial options CONSPEED=19200 -sacom* at saip? addr 0xd000d000 size 0x24 intr 17 +sacom* at saip? addr 0x80050000 size 0x24 intr 17 # OS Timer saost* at saip? addr 0x90000000 size 0x20 diff --git a/sys/arch/hpcarm/conf/JORNADA820 b/sys/arch/hpcarm/conf/JORNADA820 index d53c574446af..7cff90a56806 100644 --- a/sys/arch/hpcarm/conf/JORNADA820 +++ b/sys/arch/hpcarm/conf/JORNADA820 @@ -1,4 +1,4 @@ -# $NetBSD: JORNADA820,v 1.4 2006/02/05 05:01:50 cube Exp $ +# $NetBSD: JORNADA820,v 1.5 2006/04/11 15:08:10 peter Exp $ # # JORNADA -- Windows-CE based jornada 820 # @@ -7,7 +7,7 @@ include "arch/hpcarm/conf/std.hpcarm" #options INCLUDE_CONFIG_FILE # embed config file in kernel binary -#ident "GENERIC-$Revision: 1.4 $" +#ident "GENERIC-$Revision: 1.5 $" # estimated number of users maxusers 32 @@ -140,9 +140,8 @@ cpu0 at mainbus? saip0 at mainbus? # Serial -# ??? virtual address????? options CONSPEED=19200 -sacom* at saip? addr 0xd000d000 size 0x24 intr 17 +sacom* at saip? addr 0x80050000 size 0x24 intr 17 #OS Timer diff --git a/sys/arch/hpcarm/hpcarm/hpc_machdep.c b/sys/arch/hpcarm/hpcarm/hpc_machdep.c index 2795732e5d2a..967f044af5ea 100644 --- a/sys/arch/hpcarm/hpcarm/hpc_machdep.c +++ b/sys/arch/hpcarm/hpcarm/hpc_machdep.c @@ -1,4 +1,4 @@ -/* $NetBSD: hpc_machdep.c,v 1.78 2006/02/27 11:34:35 peter Exp $ */ +/* $NetBSD: hpc_machdep.c,v 1.79 2006/04/11 15:08:10 peter Exp $ */ /* * Copyright (c) 1994-1998 Mark Brinicombe. @@ -46,7 +46,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: hpc_machdep.c,v 1.78 2006/02/27 11:34:35 peter Exp $"); +__KERNEL_RCSID(0, "$NetBSD: hpc_machdep.c,v 1.79 2006/04/11 15:08:10 peter Exp $"); #include "opt_ddb.h" #include "opt_pmap_debug.h" @@ -282,6 +282,23 @@ cpu_reboot(int howto, char *bootstr) #define DRAM_PAGES 8192 #endif +/* + * Static device mappings. These peripheral registers are mapped at + * fixed virtual addresses very early in initarm() so that we can use + * them while booting the kernel and stay at the same address + * throughout whole kernel's life time. + */ +static const struct pmap_devmap sa11x0_devmap[] = { + /* Physical/virtual address for UART #3. */ + { + SACOM3_VBASE, + SACOM3_BASE, + 0x24, + VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE + }, + { 0, 0, 0, 0, 0 } +}; + /* * Initial entry point on startup. This gets called before main() is * entered. @@ -587,10 +604,8 @@ initarm(int argc, char **argv, struct bootinfo *bi) pmap_map_entry(l1pagetable, vector_page, systempage.pv_pa, VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE); - /* Map any I/O modules here, as we don't have real bus_space_map() */ - printf("mapping IO..."); - pmap_map_entry(l1pagetable, SACOM3_BASE, SACOM3_HW_BASE, - VM_PROT_READ|VM_PROT_WRITE, PTE_NOCACHE); + /* Map the statically mapped devices. */ + pmap_devmap_bootstrap(l1pagetable, sa11x0_devmap); pmap_map_chunk(l1pagetable, sa1_cache_clean_addr, 0xe0000000, CPU_SA110_CACHE_CLEAN_SIZE, VM_PROT_READ|VM_PROT_WRITE, PTE_CACHE);