1 /* $NetBSD: platform.h,v 1.2 2011/07/10 06:26:02 matt Exp $ */ 2 /* 3 * Copyright (c) 2006 Urbana-Champaign Independent Media Center. 4 * Copyright (c) 2006 Garrett D'Amore. 5 * All rights reserved. 6 * 7 * This code was written by Garrett D'Amore for the Champaign-Urbana 8 * Community Wireless Network Project. 9 * 10 * Redistribution and use in source and binary forms, with or 11 * without modification, are permitted provided that the following 12 * conditions 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 16 * copyright notice, this list of conditions and the following 17 * disclaimer in the documentation and/or other materials provided 18 * with the distribution. 19 * 3. All advertising materials mentioning features or use of this 20 * software must display the following acknowledgements: 21 * This product includes software developed by the Urbana-Champaign 22 * Independent Media Center. 23 * This product includes software developed by Garrett D'Amore. 24 * 4. Urbana-Champaign Independent Media Center's name and Garrett 25 * D'Amore's name may not be used to endorse or promote products 26 * derived from this software without specific prior written permission. 27 * 28 * THIS SOFTWARE IS PROVIDED BY THE URBANA-CHAMPAIGN INDEPENDENT 29 * MEDIA CENTER AND GARRETT D'AMORE ``AS IS'' AND ANY EXPRESS OR 30 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 31 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 32 * ARE DISCLAIMED. IN NO EVENT SHALL THE URBANA-CHAMPAIGN INDEPENDENT 33 * MEDIA CENTER OR GARRETT D'AMORE BE LIABLE FOR ANY DIRECT, INDIRECT, 34 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 35 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 36 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 37 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 38 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 39 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 40 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 41 */ 42 43 #ifndef _MIPS_ATHEROS_PLATFORM_H_ 44 #define _MIPS_ATHEROS_PLATFORM_H_ 45 46 #include <sys/param.h> 47 #include <sys/bus.h> 48 49 struct atheros_device { 50 const char *adv_name; 51 bus_addr_t adv_addr; 52 bus_size_t adv_size; 53 u_int adv_cirq; 54 u_int adv_mirq; 55 uint32_t adv_mask; 56 uint32_t adv_reset; 57 uint32_t adv_enable; 58 }; 59 60 /* 61 * Board specific things. 62 */ 63 struct atheros_boarddata; 64 struct atheros_config; 65 66 struct atheros_intrsw { 67 void (*aisw_init)(void); 68 void *(*aisw_cpu_establish)(int, int (*)(void *), void *); 69 void (*aisw_cpu_disestablish)(void *); 70 void *(*aisw_misc_establish)(int, int (*)(void *), void *); 71 void (*aisw_misc_disestablish)(void *); 72 void (*aisw_cpuintr)(int, vaddr_t, uint32_t); 73 void (*aisw_iointr)(int, vaddr_t, uint32_t); 74 }; 75 76 struct arfreqs { 77 uint32_t freq_bus; 78 uint32_t freq_cpu; 79 uint32_t freq_mem; 80 uint32_t freq_pll; 81 uint32_t freq_ref; 82 uint32_t freq_uart; 83 }; 84 85 struct atheros_platformsw { 86 const struct atheros_intrsw *apsw_intrsw; 87 88 void (*apsw_intr_init)(void); 89 const char * const * apsw_cpu_intrnames; 90 const char * const * apsw_misc_intrnames; 91 size_t apsw_cpu_nintrs; 92 size_t apsw_misc_nintrs; 93 u_int apsw_cpuirq_misc; 94 95 bus_addr_t apsw_misc_intmask; 96 bus_addr_t apsw_misc_intstat; 97 98 const struct ipl_sr_map *apsw_ipl_sr_map; 99 100 /* 101 * CPU specific routines. 102 */ 103 size_t (*apsw_get_memsize)(void); 104 void (*apsw_wdog_reload)(uint32_t); 105 void (*apsw_bus_init)(void); 106 void (*apsw_get_freqs)(struct arfreqs *); 107 void (*apsw_device_register)(device_t, void *); 108 int (*apsw_enable_device)(const struct atheros_device *); 109 void (*apsw_reset)(void); 110 const struct atheros_device *apsw_devices; 111 112 /* 113 * Early console support. 114 */ 115 bus_addr_t apsw_uart0_base; 116 bus_addr_t apsw_revision_id_addr; 117 }; 118 119 /* 120 * Board specific data. 121 */ 122 struct ar531x_config; 123 struct ar531x_boarddata; 124 struct atheros_boardsw { 125 const struct ar531x_boarddata *(*absw_get_board_info)(void); 126 const void *(*absw_get_radio_info)(void); 127 }; 128 129 #ifdef _KERNEL 130 void atheros_consinit(void); 131 void atheros_early_consinit(void); 132 133 void atheros_set_platformsw(void); 134 const char * 135 atheros_get_cpuname(void); 136 u_int atheros_get_chipid(void); 137 138 uint32_t atheros_get_uart_freq(void); 139 uint32_t atheros_get_bus_freq(void); 140 uint32_t atheros_get_cpu_freq(void); 141 uint32_t atheros_get_mem_freq(void); 142 143 const struct ar531x_boarddata * 144 atheros_get_board_info(void); 145 int atheros_get_board_config(struct ar531x_config *); 146 147 extern const struct atheros_boardsw ar5312_boardsw; 148 extern const struct atheros_boardsw ar5315_boardsw; 149 150 extern const struct atheros_platformsw ar5312_platformsw; 151 extern const struct atheros_platformsw ar5315_platformsw; 152 extern const struct atheros_platformsw ar7100_platformsw; 153 extern const struct atheros_platformsw ar9344_platformsw; 154 extern const struct atheros_platformsw *platformsw; 155 156 extern const struct atheros_intrsw atheros_intrsw; 157 158 static inline uint32_t 159 atheros_get_memsize(void) 160 { 161 return (*platformsw->apsw_get_memsize)(); 162 } 163 164 static inline void 165 atheros_wdog_reload(uint32_t period) 166 { 167 (*platformsw->apsw_wdog_reload)(period); 168 } 169 170 static inline void 171 atheros_bus_init(void) 172 { 173 return (*platformsw->apsw_bus_init)(); 174 } 175 176 static inline void 177 atheros_intr_init(void) 178 { 179 (*platformsw->apsw_intrsw->aisw_init)(); 180 } 181 182 static inline void * 183 atheros_cpu_intr_establish(int irq, int (*func)(void *), void *arg) 184 { 185 return (*platformsw->apsw_intrsw->aisw_cpu_establish)(irq, func, arg); 186 } 187 188 static inline void 189 atheros_cpu_intr_disestablish(void *cookie) 190 { 191 (*platformsw->apsw_intrsw->aisw_cpu_disestablish)(cookie); 192 } 193 194 static inline void * 195 atheros_misc_intr_establish(int irq, int (*func)(void *), void *arg) 196 { 197 return (*platformsw->apsw_intrsw->aisw_misc_establish)(irq, func, arg); 198 } 199 200 static inline void 201 atheros_misc_intr_disestablish(void *cookie) 202 { 203 (*platformsw->apsw_intrsw->aisw_misc_disestablish)(cookie); 204 } 205 206 static inline int 207 atheros_enable_device(const struct atheros_device *adv) 208 { 209 return (*platformsw->apsw_enable_device)(adv); 210 } 211 212 static inline void 213 atheros_reset(void) 214 { 215 return (*platformsw->apsw_reset)(); 216 } 217 218 #endif /* _KERNEL */ 219 220 #endif /* _MIPS_ATHEROS_PLATFORM_H_ */ 221