octeon_pcmap_regs.h (226025) | octeon_pcmap_regs.h (242273) |
---|---|
1/***********************license start*************** 2 * Copyright (c) 2003-2008 Cavium Networks (support@cavium.com). All rights 3 * reserved. 4 * 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are 8 * met: --- 27 unchanged lines hidden (view full) --- 36 * 37 ***********************license end**************************************/ 38 39/* 40 * This product includes software developed by the University of 41 * California, Berkeley and its contributors." 42 */ 43 | 1/***********************license start*************** 2 * Copyright (c) 2003-2008 Cavium Networks (support@cavium.com). All rights 3 * reserved. 4 * 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are 8 * met: --- 27 unchanged lines hidden (view full) --- 36 * 37 ***********************license end**************************************/ 38 39/* 40 * This product includes software developed by the University of 41 * California, Berkeley and its contributors." 42 */ 43 |
44/* $FreeBSD: head/sys/mips/cavium/octeon_pcmap_regs.h 226025 2011-10-04 20:30:15Z marcel $ */ | 44/* $FreeBSD: head/sys/mips/cavium/octeon_pcmap_regs.h 242273 2012-10-29 00:51:53Z jmallett $ */ |
45 46#ifndef __OCTEON_PCMAP_REGS_H__ 47#define __OCTEON_PCMAP_REGS_H__ 48 49#ifndef LOCORE 50 51/* 52 * Utility inlines & macros 53 */ 54 55#if defined(__mips_n64) 56#define oct_write64(a, v) (*(volatile uint64_t *)(a) = (uint64_t)(v)) | 45 46#ifndef __OCTEON_PCMAP_REGS_H__ 47#define __OCTEON_PCMAP_REGS_H__ 48 49#ifndef LOCORE 50 51/* 52 * Utility inlines & macros 53 */ 54 55#if defined(__mips_n64) 56#define oct_write64(a, v) (*(volatile uint64_t *)(a) = (uint64_t)(v)) |
57#define oct_write8_x8(a, v) (*(volatile uint8_t *)(a) = (uint8_t)(v)) | |
58 59#define OCT_READ(n, t) \ 60static inline t oct_read ## n(uintptr_t a) \ 61{ \ 62 volatile t *p = (volatile t *)a; \ 63 return (*p); \ 64} 65 | 57 58#define OCT_READ(n, t) \ 59static inline t oct_read ## n(uintptr_t a) \ 60{ \ 61 volatile t *p = (volatile t *)a; \ 62 return (*p); \ 63} 64 |
66OCT_READ(8, uint8_t); 67OCT_READ(16, uint16_t); 68OCT_READ(32, uint32_t); | |
69OCT_READ(64, uint64_t); 70 71#elif defined(__mips_n32) || defined(__mips_o32) 72#if defined(__mips_n32) 73static inline void oct_write64 (uint64_t csr_addr, uint64_t val64) 74{ 75 __asm __volatile ( 76 ".set push\n" 77 ".set mips64\n" 78 "sd %0, 0(%1)\n" 79 ".set pop\n" 80 : 81 : "r"(val64), "r"(csr_addr)); 82} 83 | 65OCT_READ(64, uint64_t); 66 67#elif defined(__mips_n32) || defined(__mips_o32) 68#if defined(__mips_n32) 69static inline void oct_write64 (uint64_t csr_addr, uint64_t val64) 70{ 71 __asm __volatile ( 72 ".set push\n" 73 ".set mips64\n" 74 "sd %0, 0(%1)\n" 75 ".set pop\n" 76 : 77 : "r"(val64), "r"(csr_addr)); 78} 79 |
84static inline void oct_write8_x8 (uint64_t csr_addr, uint8_t val8) 85{ 86 __asm __volatile ( 87 ".set push\n" 88 ".set mips64\n" 89 "sb %0, 0(%1)\n" 90 ".set pop\n" 91 : 92 : "r"(val8), "r"(csr_addr)); 93} 94 | |
95#define OCT_READ(n, t, insn) \ 96static inline t oct_read ## n(uint64_t a) \ 97{ \ 98 uint64_t tmp; \ 99 \ 100 __asm __volatile ( \ 101 ".set push\n" \ 102 ".set mips64\n" \ 103 insn "\t%0, 0(%1)\n" \ 104 ".set pop\n" \ 105 : "=r"(tmp) \ 106 : "r"(a)); \ 107 return ((t)tmp); \ 108} 109 | 80#define OCT_READ(n, t, insn) \ 81static inline t oct_read ## n(uint64_t a) \ 82{ \ 83 uint64_t tmp; \ 84 \ 85 __asm __volatile ( \ 86 ".set push\n" \ 87 ".set mips64\n" \ 88 insn "\t%0, 0(%1)\n" \ 89 ".set pop\n" \ 90 : "=r"(tmp) \ 91 : "r"(a)); \ 92 return ((t)tmp); \ 93} 94 |
110OCT_READ(8, uint8_t, "lb"); 111OCT_READ(16, uint16_t, "lh"); 112OCT_READ(32, uint32_t, "lw"); | |
113OCT_READ(64, uint64_t, "ld"); 114#else 115 116/* 117 * XXX 118 * Add o32 variants that load the address into a register and the result out 119 * of a register properly, and simply disable interrupts before and after and 120 * hope that we don't need to refill or modify the TLB to access the address. --- 32 unchanged lines hidden (view full) --- 153 "sd %0, 0(%1)\n" 154 ".set pop\n" 155 : "=&r" (tmp1), "=&r" (tmp2), "=&r" (tmp3) 156 : "r" (valh), "r" (vall), "r" (csr_addrh), "r" (csr_addrl)); 157 158 intr_restore(sr); 159} 160 | 95OCT_READ(64, uint64_t, "ld"); 96#else 97 98/* 99 * XXX 100 * Add o32 variants that load the address into a register and the result out 101 * of a register properly, and simply disable interrupts before and after and 102 * hope that we don't need to refill or modify the TLB to access the address. --- 32 unchanged lines hidden (view full) --- 135 "sd %0, 0(%1)\n" 136 ".set pop\n" 137 : "=&r" (tmp1), "=&r" (tmp2), "=&r" (tmp3) 138 : "r" (valh), "r" (vall), "r" (csr_addrh), "r" (csr_addrl)); 139 140 intr_restore(sr); 141} 142 |
161static inline void oct_write8_x8 (uint64_t csr_addr, uint8_t val8) 162{ 163 uint32_t csr_addrh = csr_addr >> 32; 164 uint32_t csr_addrl = csr_addr; 165 uint32_t tmp1; 166 uint32_t tmp2; 167 register_t sr; 168 169 sr = intr_disable(); 170 171 __asm __volatile ( 172 ".set push\n" 173 ".set mips64\n" 174 ".set noreorder\n" 175 ".set noat\n" 176 "dsll %0, %3, 32\n" 177 "dsll %1, %4, 32\n" 178 "dsrl %1, %1, 32\n" 179 "or %0, %0, %1\n" 180 "sb %2, 0(%0)\n" 181 ".set pop\n" 182 : "=&r" (tmp1), "=&r" (tmp2) 183 : "r" (val8), "r" (csr_addrh), "r" (csr_addrl)); 184 185 intr_restore(sr); 186} 187 188#define OCT_READ(n, t, insn) \ 189static inline t oct_read ## n(uint64_t csr_addr) \ 190{ \ 191 uint32_t csr_addrh = csr_addr >> 32; \ 192 uint32_t csr_addrl = csr_addr; \ 193 uint32_t tmp1, tmp2; \ 194 register_t sr; \ 195 \ 196 sr = intr_disable(); \ 197 \ 198 __asm __volatile ( \ 199 ".set push\n" \ 200 ".set mips64\n" \ 201 ".set noreorder\n" \ 202 ".set noat\n" \ 203 "dsll %1, %2, 32\n" \ 204 "dsll %0, %3, 32\n" \ 205 "dsrl %0, %0, 32\n" \ 206 "or %1, %1, %0\n" \ 207 "lb %1, 0(%1)\n" \ 208 ".set pop\n" \ 209 : "=&r" (tmp1), "=&r" (tmp2) \ 210 : "r" (csr_addrh), "r" (csr_addrl)); \ 211 \ 212 intr_restore(sr); \ 213 \ 214 return ((t)tmp2); \ 215} 216 217OCT_READ(8, uint8_t, "lb"); 218OCT_READ(16, uint16_t, "lh"); 219OCT_READ(32, uint32_t, "lw"); 220 | |
221static inline uint64_t oct_read64 (uint64_t csr_addr) 222{ 223 uint32_t csr_addrh = csr_addr >> 32; 224 uint32_t csr_addrl = csr_addr; 225 uint32_t valh; 226 uint32_t vall; 227 register_t sr; 228 --- 19 unchanged lines hidden (view full) --- 248 intr_restore(sr); 249 250 return ((uint64_t)valh << 32) | vall; 251} 252#endif 253 254#endif 255 | 143static inline uint64_t oct_read64 (uint64_t csr_addr) 144{ 145 uint32_t csr_addrh = csr_addr >> 32; 146 uint32_t csr_addrl = csr_addr; 147 uint32_t valh; 148 uint32_t vall; 149 register_t sr; 150 --- 19 unchanged lines hidden (view full) --- 170 intr_restore(sr); 171 172 return ((uint64_t)valh << 32) | vall; 173} 174#endif 175 176#endif 177 |
256#define oct_write64_int64(a, v) (oct_write64(a, (int64_t)(v))) 257 | |
258/* | 178/* |
259 * Most write bus transactions are actually 64-bit on Octeon. 260 */ 261static inline void oct_write8 (uint64_t csr_addr, uint8_t val8) 262{ 263 oct_write64(csr_addr, (uint64_t) val8); 264} 265 266static inline void oct_write16 (uint64_t csr_addr, uint16_t val16) 267{ 268 oct_write64(csr_addr, (uint64_t) val16); 269} 270 271static inline void oct_write32 (uint64_t csr_addr, uint32_t val32) 272{ 273 oct_write64(csr_addr, (uint64_t) val32); 274} 275 276#define oct_readint32(a) ((int32_t)oct_read32((a))) 277 278/* | |
279 * octeon_machdep.c 280 * 281 * Direct to Board Support level. 282 */ | 179 * octeon_machdep.c 180 * 181 * Direct to Board Support level. 182 */ |
283extern void octeon_led_write_char(int char_position, char val); 284extern void octeon_led_write_hexchar(int char_position, char hexval); 285extern void octeon_led_write_hex(uint32_t wl); 286extern void octeon_led_write_string(const char *str); | |
287extern void octeon_reset(void); | 183extern void octeon_reset(void); |
288extern void octeon_led_write_char0(char val); 289extern void octeon_led_run_wheel(int *pos, int led_position); | |
290extern void octeon_debug_symbol(void); 291extern void octeon_ciu_reset(void); 292extern int octeon_is_simulation(void); 293#endif /* LOCORE */ 294 295/* | 184extern void octeon_debug_symbol(void); 185extern void octeon_ciu_reset(void); 186extern int octeon_is_simulation(void); 187#endif /* LOCORE */ 188 189/* |
296 * EBT3000 LED Unit 297 */ 298#define OCTEON_CHAR_LED_BASE_ADDR (0x1d020000 | (0x1ffffffffull << 31)) 299 300/* | |
301 * Default FLASH device (physical) base address 302 */ 303#define OCTEON_FLASH_BASE_ADDR (0x1d040000ull) 304 305#endif /* !OCTEON_PCMAP_REGS_H__ */ | 190 * Default FLASH device (physical) base address 191 */ 192#define OCTEON_FLASH_BASE_ADDR (0x1d040000ull) 193 194#endif /* !OCTEON_PCMAP_REGS_H__ */ |