1 /* $NetBSD: gemini.h,v 1.8 2008/12/06 05:22:39 cliff Exp $ */ 2 3 /*- 4 * Copyright (c) 2008 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Matt Thomas <matt@3am-software.com> 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32 #ifndef _EVBARM_GEMINI_GEMINI_H 33 #define _EVBARM_GEMINI_GEMINI_H 34 35 /* 36 * sanity check opt_gemini.h 37 */ 38 #include "opt_gemini.h" 39 #if !defined(GEMINI) 40 # error must define GEMINI to use gemini.h 41 #endif 42 #if !defined(GEMINI_SINGLE) && !defined(GEMINI_MASTER) && !defined(GEMINI_SLAVE) 43 # error must define one of GEMINI_SINGLE, GEMINI_MASTER, or GEMINI_SLAVE 44 #endif 45 #if defined(GEMINI_SINGLE) 46 # if defined(GEMINI_MASTER) || defined(GEMINI_SLAVE) 47 # error GEMINI_SINGLE can not define either GEMINI_MASTER or GEMINI_SLAVE 48 # endif 49 #else 50 # if defined(GEMINI_MASTER) && defined(GEMINI_SLAVE) 51 # error can not define both GEMINI_MASTER and GEMINI_SLAVE 52 # endif 53 #endif 54 55 #include <machine/vmparam.h> 56 #include <arm/gemini/gemini_reg.h> 57 58 59 /* 60 * Kernel VM space: 192MB at KERNEL_VM_BASE 61 */ 62 #define KERNEL_VM_BASE ((KERNEL_BASE + 0x01000000) & ~(0x400000-1)) 63 #define KERNEL_VM_SIZE 0x0C000000 64 65 /* 66 * We devmap IO starting at KERNEL_VM_BASE + KERNEL_VM_SIZE 67 */ 68 #define GEMINI_KERNEL_IO_VBASE (KERNEL_VM_BASE + KERNEL_VM_SIZE) 69 #define GEMINI_GLOBAL_VBASE GEMINI_KERNEL_IO_VBASE 70 #define GEMINI_WATCHDOG_VBASE (GEMINI_GLOBAL_VBASE + L1_S_SIZE) 71 #define GEMINI_UART_VBASE (GEMINI_WATCHDOG_VBASE + L1_S_SIZE) 72 #define GEMINI_LPCHC_VBASE (GEMINI_UART_VBASE + L1_S_SIZE) 73 #define GEMINI_LPCIO_VBASE (GEMINI_LPCHC_VBASE + L1_S_SIZE) 74 #define GEMINI_TIMER_VBASE (GEMINI_LPCIO_VBASE + L1_S_SIZE) 75 #define GEMINI_DRAMC_VBASE (GEMINI_TIMER_VBASE + L1_S_SIZE) 76 77 /* 78 * mapping of physical RAM 79 */ 80 #define GEMINI_RAMDISK_VBASE (GEMINI_DRAMC_VBASE + L1_S_SIZE) 81 #define GEMINI_RAMDISK_PBASE 0x00800000 82 #define GEMINI_RAMDISK_SIZE 0x00300000 83 #define GEMINI_RAMDISK_PEND (GEMINI_RAMDISK_PBASE + GEMINI_RAMDISK_SIZE) 84 85 #define GEMINI_IPMQ_VBASE \ 86 ((GEMINI_RAMDISK_VBASE + GEMINI_RAMDISK_SIZE \ 87 + (L1_S_SIZE * 4) - 1) & ~((L1_S_SIZE * 4) - 1)) 88 /* round up for l2pt alignment */ 89 #ifdef GEMINI_SLAVE 90 # define GEMINI_IPMQ_PBASE (GEMINI_RAMDISK_PEND + (GEMINI_BUSBASE * 1024 * 1024)) 91 #else 92 # define GEMINI_IPMQ_PBASE GEMINI_RAMDISK_PEND 93 #endif 94 #if 0 95 # define GEMINI_IPMQ_SIZE (2 * sizeof(ipm_queue_t)) 96 #else 97 # define GEMINI_IPMQ_SIZE (2 * 4096) 98 #endif 99 #define GEMINI_IPMQ_PEND (GEMINI_IPMQ_PBASE + GEMINI_IPMQ_SIZE) 100 101 /* 102 * reserve physical RAM, as needed 103 * 104 * NOTE: the RAM used for the IPM queues is owned by the MASTER 105 * so MASTER needs to reserve those pages from VM; the slave does not. 106 * Hence, GEMINI_RAM_RESV_PEND is adjusted for the MASTER but not the SLAVE. 107 */ 108 #define GEMINI_RAM_RESV_PBASE 0 109 #define GEMINI_RAM_RESV_PEND 0 110 #if defined(MEMORY_DISK_DYNAMIC) 111 # undef GEMINI_RAM_RESV_PBASE 112 # undef GEMINI_RAM_RESV_PEND 113 # define GEMINI_RAM_RESV_PBASE GEMINI_RAMDISK_PBASE 114 # define GEMINI_RAM_RESV_PEND GEMINI_RAMDISK_PEND 115 #endif 116 #if (NGEMINIIPM > 0) && !defined(GEMINI_SLAVE) 117 # if (NGEMINIIPM > 1) 118 # error unexpected NGEMINIIPM > 1 119 # endif 120 # if (GEMINI_RAM_RESV_PBASE == 0) 121 # undef GEMINI_RAM_RESV_PBASE 122 # define GEMINI_RAM_RESV_PBASE GEMINI_IPMQ_PBASE 123 # endif 124 # undef GEMINI_RAM_RESV_PEND 125 # define GEMINI_RAM_RESV_PEND GEMINI_IPMQ_PEND 126 #endif 127 128 /* 129 * to map all of memory, including RAM owned by both core. 130 * we start at nice round vbase to simplify conversion 131 * from VA to PA and back 132 */ 133 #define GEMINI_ALLMEM_PBASE 0 134 #define GEMINI_ALLMEM_VBASE 0xf0000000 135 #define GEMINI_ALLMEM_SIZE 128 /* units of MB */ 136 137 138 #endif /* _EVBARM_GEMINI_GEMINI_H */ 139