1 1.18 andvar /* $NetBSD: octeonvar.h,v 1.18 2022/01/26 11:48:54 andvar Exp $ */ 2 1.1 hikaru 3 1.1 hikaru /*- 4 1.1 hikaru * Copyright (c) 2001 The NetBSD Foundation, Inc. 5 1.1 hikaru * All rights reserved. 6 1.1 hikaru * 7 1.1 hikaru * This code is derived from software contributed to The NetBSD Foundation 8 1.1 hikaru * by Jason R. Thorpe. 9 1.1 hikaru * 10 1.1 hikaru * Redistribution and use in source and binary forms, with or without 11 1.1 hikaru * modification, are permitted provided that the following conditions 12 1.1 hikaru * are met: 13 1.1 hikaru * 1. Redistributions of source code must retain the above copyright 14 1.1 hikaru * notice, this list of conditions and the following disclaimer. 15 1.1 hikaru * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 hikaru * notice, this list of conditions and the following disclaimer in the 17 1.1 hikaru * documentation and/or other materials provided with the distribution. 18 1.1 hikaru * 19 1.1 hikaru * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.1 hikaru * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.1 hikaru * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.1 hikaru * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.1 hikaru * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.1 hikaru * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.1 hikaru * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.1 hikaru * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.1 hikaru * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.1 hikaru * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.1 hikaru * POSSIBILITY OF SUCH DAMAGE. 30 1.1 hikaru */ 31 1.1 hikaru 32 1.1 hikaru #ifndef _MIPS_OCTEON_OCTEONVAR_H_ 33 1.1 hikaru #define _MIPS_OCTEON_OCTEONVAR_H_ 34 1.1 hikaru 35 1.1 hikaru #include <sys/bus.h> 36 1.2 matt #include <sys/evcnt.h> 37 1.4 matt #include <sys/kcpuset.h> 38 1.1 hikaru #include <mips/locore.h> 39 1.1 hikaru #include <dev/pci/pcivar.h> 40 1.1 hikaru 41 1.11 simonb #include <mips/cavium/octeonreg.h> 42 1.16 jmcneill #include <mips/cache_octeon.h> 43 1.11 simonb 44 1.1 hikaru /* XXX elsewhere */ 45 1.1 hikaru #define _ASM_PROLOGUE \ 46 1.1 hikaru " .set push \n" \ 47 1.1 hikaru " .set noreorder \n" 48 1.1 hikaru #define _ASM_PROLOGUE_MIPS64 \ 49 1.1 hikaru _ASM_PROLOGUE \ 50 1.1 hikaru " .set mips64 \n" 51 1.1 hikaru #define _ASM_PROLOGUE_OCTEON \ 52 1.1 hikaru _ASM_PROLOGUE \ 53 1.1 hikaru " .set arch=octeon \n" 54 1.1 hikaru #define _ASM_EPILOGUE \ 55 1.1 hikaru " .set pop \n" 56 1.1 hikaru 57 1.10 simonb #ifdef _KERNEL 58 1.10 simonb extern int octeon_core_ver; 59 1.10 simonb #endif /* _KERNEL */ 60 1.10 simonb #define OCTEON_1 1 61 1.18 andvar #define OCTEON_PLUS 10 /* arbitrary, keep sequence for others */ 62 1.10 simonb #define OCTEON_2 2 63 1.10 simonb #define OCTEON_3 3 64 1.10 simonb 65 1.1 hikaru struct octeon_config { 66 1.1 hikaru struct mips_bus_space mc_iobus_bust; 67 1.1 hikaru struct mips_bus_space mc_bootbus_bust; 68 1.1 hikaru struct mips_pci_chipset mc_pc; 69 1.1 hikaru 70 1.1 hikaru struct mips_bus_dma_tag mc_iobus_dmat; 71 1.1 hikaru struct mips_bus_dma_tag mc_bootbus_dmat; 72 1.1 hikaru struct mips_bus_dma_tag mc_core1_dmat; 73 1.5 matt struct mips_bus_dma_tag mc_fpa_dmat; 74 1.1 hikaru 75 1.1 hikaru struct extent *mc_io_ex; 76 1.1 hikaru struct extent *mc_mem_ex; 77 1.1 hikaru 78 1.1 hikaru int mc_mallocsafe; 79 1.1 hikaru }; 80 1.1 hikaru 81 1.14 jmcneill #define NIRQS 128 82 1.15 jmcneill #define NBANKS 2 83 1.2 matt 84 1.2 matt struct cpu_softc { 85 1.2 matt struct cpu_info *cpu_ci; 86 1.3 matt 87 1.16 jmcneill uint64_t cpu_ip2_sum0; 88 1.16 jmcneill uint64_t cpu_ip3_sum0; 89 1.16 jmcneill uint64_t cpu_ip4_sum0; 90 1.2 matt 91 1.14 jmcneill uint64_t cpu_int_sum1; 92 1.14 jmcneill 93 1.16 jmcneill uint64_t cpu_ip2_en[NBANKS]; 94 1.16 jmcneill uint64_t cpu_ip3_en[NBANKS]; 95 1.16 jmcneill uint64_t cpu_ip4_en[NBANKS]; 96 1.16 jmcneill 97 1.16 jmcneill uint64_t cpu_ip2_enable[NBANKS]; 98 1.16 jmcneill uint64_t cpu_ip3_enable[NBANKS]; 99 1.16 jmcneill uint64_t cpu_ip4_enable[NBANKS]; 100 1.2 matt 101 1.2 matt struct evcnt cpu_intr_evs[NIRQS]; 102 1.2 matt 103 1.3 matt void *cpu_wdog_sih; // wdog softint handler 104 1.3 matt uint64_t cpu_wdog; 105 1.3 matt uint64_t cpu_pp_poke; 106 1.3 matt 107 1.2 matt #ifdef MULTIPROCESSOR 108 1.2 matt uint64_t cpu_mbox_set; 109 1.2 matt uint64_t cpu_mbox_clr; 110 1.2 matt #endif 111 1.16 jmcneill } __aligned(OCTEON_CACHELINE_SIZE); 112 1.2 matt 113 1.1 hikaru /* 114 1.1 hikaru * FPA map 115 1.1 hikaru */ 116 1.1 hikaru 117 1.1 hikaru #define OCTEON_POOL_NO_PKT 0 118 1.1 hikaru #define OCTEON_POOL_NO_WQE 1 119 1.1 hikaru #define OCTEON_POOL_NO_CMD 2 120 1.1 hikaru #define OCTEON_POOL_NO_SG 3 121 1.1 hikaru #define OCTEON_POOL_NO_XXX_4 4 122 1.1 hikaru #define OCTEON_POOL_NO_XXX_5 5 123 1.1 hikaru #define OCTEON_POOL_NO_XXX_6 6 124 1.1 hikaru #define OCTEON_POOL_NO_DUMP 7 /* FPA debug dump */ 125 1.1 hikaru 126 1.1 hikaru #define OCTEON_POOL_SIZE_PKT 2048 /* 128 x 16 */ 127 1.1 hikaru #define OCTEON_POOL_SIZE_WQE 128 /* 128 x 1 */ 128 1.1 hikaru #define OCTEON_POOL_SIZE_CMD 1024 /* 128 x 8 */ 129 1.1 hikaru #define OCTEON_POOL_SIZE_SG 512 /* 128 x 4 */ 130 1.1 hikaru #define OCTEON_POOL_SIZE_XXX_4 0 131 1.1 hikaru #define OCTEON_POOL_SIZE_XXX_5 0 132 1.1 hikaru #define OCTEON_POOL_SIZE_XXX_6 0 133 1.1 hikaru #define OCTEON_POOL_SIZE_XXX_7 0 134 1.1 hikaru 135 1.1 hikaru #define OCTEON_POOL_NELEMS_PKT 4096 136 1.1 hikaru #define OCTEON_POOL_NELEMS_WQE 4096 137 1.1 hikaru #define OCTEON_POOL_NELEMS_CMD 32 138 1.1 hikaru #define OCTEON_POOL_NELEMS_SG 1024 139 1.1 hikaru #define OCTEON_POOL_NELEMS_XXX_4 0 140 1.1 hikaru #define OCTEON_POOL_NELEMS_XXX_5 0 141 1.1 hikaru #define OCTEON_POOL_NELEMS_XXX_6 0 142 1.1 hikaru #define OCTEON_POOL_NELEMS_XXX_7 0 143 1.1 hikaru 144 1.1 hikaru /* 145 1.1 hikaru * CVMSEG (``scratch'') memory map 146 1.1 hikaru */ 147 1.9 simonb 148 1.9 simonb #define CVMSEG_LM_RNM_SIZE 16 /* limited by CN70XX hardware (why?) */ 149 1.9 simonb #define CVMSEG_LM_ETHER_COUNT 4 /* limits number of cnmac devices */ 150 1.9 simonb 151 1.1 hikaru struct octeon_cvmseg_map { 152 1.1 hikaru uint64_t csm_pow_intr; 153 1.1 hikaru 154 1.1 hikaru struct octeon_cvmseg_ether_map { 155 1.1 hikaru uint64_t csm_ether_fau_done; 156 1.9 simonb } csm_ether[CVMSEG_LM_ETHER_COUNT]; 157 1.7 riastrad 158 1.9 simonb uint64_t csm_rnm[CVMSEG_LM_RNM_SIZE]; 159 1.1 hikaru } __packed; 160 1.1 hikaru #define OCTEON_CVMSEG_OFFSET(entry) \ 161 1.1 hikaru offsetof(struct octeon_cvmseg_map, entry) 162 1.1 hikaru #define OCTEON_CVMSEG_ETHER_OFFSET(n, entry) \ 163 1.1 hikaru (offsetof(struct octeon_cvmseg_map, csm_ether) + \ 164 1.1 hikaru sizeof(struct octeon_cvmseg_ether_map) * (n) + \ 165 1.1 hikaru offsetof(struct octeon_cvmseg_ether_map, entry)) 166 1.1 hikaru 167 1.1 hikaru /* 168 1.1 hikaru * FAU register map 169 1.1 hikaru * 170 1.1 hikaru * => FAU registers exist in FAU unit 171 1.1 hikaru * => devices (PKO) can access these registers 172 1.1 hikaru * => CPU can read those values after loading them into CVMSEG 173 1.1 hikaru */ 174 1.8 simonb struct octfau_map { 175 1.1 hikaru struct { 176 1.1 hikaru /* PKO command index */ 177 1.1 hikaru uint64_t _fau_map_port_pkocmdidx; 178 1.1 hikaru /* send requested */ 179 1.1 hikaru uint64_t _fau_map_port_txreq; 180 1.1 hikaru /* send completed */ 181 1.1 hikaru uint64_t _fau_map_port_txdone; 182 1.1 hikaru /* XXX */ 183 1.1 hikaru uint64_t _fau_map_port_pad; 184 1.1 hikaru } __packed _fau_map_port[3]; 185 1.1 hikaru }; 186 1.1 hikaru 187 1.1 hikaru /* 188 1.1 hikaru * POW qos/group map 189 1.1 hikaru */ 190 1.1 hikaru 191 1.1 hikaru #define OCTEON_POW_QOS_PIP 0 192 1.1 hikaru #define OCTEON_POW_QOS_CORE1 1 193 1.1 hikaru #define OCTEON_POW_QOS_XXX_2 2 194 1.1 hikaru #define OCTEON_POW_QOS_XXX_3 3 195 1.1 hikaru #define OCTEON_POW_QOS_XXX_4 4 196 1.1 hikaru #define OCTEON_POW_QOS_XXX_5 5 197 1.1 hikaru #define OCTEON_POW_QOS_XXX_6 6 198 1.1 hikaru #define OCTEON_POW_QOS_XXX_7 7 199 1.1 hikaru 200 1.13 simonb #define OCTEON_POW_GROUP_MAX 16 201 1.1 hikaru 202 1.1 hikaru #ifdef _KERNEL 203 1.1 hikaru extern struct octeon_config octeon_configuration; 204 1.1 hikaru 205 1.10 simonb const char *octeon_cpu_model(mips_prid_t); 206 1.2 matt 207 1.10 simonb void octeon_bus_io_init(bus_space_tag_t, void *); 208 1.10 simonb void octeon_bus_mem_init(bus_space_tag_t, void *); 209 1.10 simonb void octeon_cal_timer(int); 210 1.10 simonb void octeon_dma_init(struct octeon_config *); 211 1.10 simonb void octeon_intr_init(struct cpu_info *); 212 1.10 simonb void octeon_iointr(int, vaddr_t, uint32_t); 213 1.10 simonb void octpci_init(pci_chipset_tag_t, struct octeon_config *); 214 1.10 simonb void *octeon_intr_establish(int, int, int (*)(void *), void *); 215 1.10 simonb void octeon_intr_disestablish(void *cookie); 216 1.10 simonb 217 1.10 simonb int octeon_ioclock_speed(void); 218 1.10 simonb void octeon_soft_reset(void); 219 1.10 simonb 220 1.10 simonb void octeon_reset_vector(void); 221 1.10 simonb uint64_t mips_cp0_cvmctl_read(void); 222 1.10 simonb void mips_cp0_cvmctl_write(uint64_t); 223 1.1 hikaru #endif /* _KERNEL */ 224 1.1 hikaru 225 1.1 hikaru #if defined(__mips_n32) 226 1.1 hikaru #define ffs64 __builtin_ffsll 227 1.1 hikaru #elif defined(_LP64) 228 1.1 hikaru #define ffs64 __builtin_ffsl 229 1.1 hikaru #else 230 1.1 hikaru #error unknown ABI 231 1.1 hikaru #endif 232 1.1 hikaru 233 1.1 hikaru /* 234 1.1 hikaru * Prefetch 235 1.1 hikaru * 236 1.1 hikaru * OCTEON_PREF normal (L1 and L2) 237 1.1 hikaru * OCTEON_PREF_L1 L1 only 238 1.1 hikaru * OCTEON_PREF_L2 L2 only 239 1.1 hikaru * OCTEON_PREF_DWB don't write back 240 1.1 hikaru * OCTEON_PREF_PFS prepare for store 241 1.1 hikaru */ 242 1.1 hikaru #define __OCTEON_PREF_N(n, base, offset) \ 243 1.1 hikaru __asm __volatile ( \ 244 1.1 hikaru " .set push \ 245 1.1 hikaru " .set arch=octeon \n" \ 246 1.1 hikaru " pref "#n", "#offset"(%[base]) \n" \ 247 1.1 hikaru " .set pop \ 248 1.1 hikaru : : [base] "d" (base) \ 249 1.1 hikaru ) 250 1.1 hikaru #define __OCTEON_PREF_0(base, offset) __OCTEON_PREF_N(0, base, offset) 251 1.1 hikaru #define __OCTEON_PREF_4(base, offset) __OCTEON_PREF_N(4, base, offset) 252 1.1 hikaru #define __OCTEON_PREF_28(base, offset) __OCTEON_PREF_N(28, base, offset) 253 1.1 hikaru #define __OCTEON_PREF_29(base, offset) __OCTEON_PREF_N(29, base, offset) 254 1.1 hikaru #define __OCTEON_PREF_30(base, offset) __OCTEON_PREF_N(30, base, offset) 255 1.1 hikaru #define OCTEON_PREF(base, offset) __OCTEON_PREF_0(base, offset) 256 1.1 hikaru #define OCTEON_PREF_L1(base, offset) __OCTEON_PREF_4(base, offset) 257 1.1 hikaru #define OCTEON_PREF_L2(base, offset) __OCTEON_PREF_28(base, offset) 258 1.1 hikaru #define OCTEON_PREF_DWB(base, offset) __OCTEON_PREF_29(base, offset) 259 1.1 hikaru #define OCTEON_PREF_PFS(base, offset) __OCTEON_PREF_30(base, offset) 260 1.1 hikaru 261 1.1 hikaru /* 262 1.1 hikaru * Sync 263 1.1 hikaru */ 264 1.1 hikaru #define OCTEON_SYNCCOMMON(name) \ 265 1.1 hikaru __asm __volatile ( \ 266 1.1 hikaru _ASM_PROLOGUE_OCTEON \ 267 1.1 hikaru " "#name" \n" \ 268 1.1 hikaru _ASM_EPILOGUE \ 269 1.1 hikaru ::: "memory") 270 1.1 hikaru #define OCTEON_SYNCIOBDMA OCTEON_SYNCCOMMON(synciobdma) 271 1.1 hikaru #define OCTEON_SYNCW OCTEON_SYNCCOMMON(syncw) 272 1.1 hikaru #define OCTEON_SYNC OCTEON_SYNCCOMMON(sync) 273 1.1 hikaru #define OCTEON_SYNCWS OCTEON_SYNCCOMMON(syncws) 274 1.1 hikaru #define OCTEON_SYNCS OCTEON_SYNCCOMMON(syncs) 275 1.1 hikaru 276 1.1 hikaru /* octeon core does not use cca to determine cacheability */ 277 1.1 hikaru #define OCTEON_CCA_NONE UINT64_C(0) 278 1.1 hikaru 279 1.6 christos static __inline uint64_t 280 1.1 hikaru octeon_xkphys_read_8(paddr_t address) 281 1.1 hikaru { 282 1.5 matt return mips3_ld(MIPS_PHYS_TO_XKPHYS(OCTEON_CCA_NONE, address)); 283 1.1 hikaru } 284 1.1 hikaru 285 1.6 christos static __inline void 286 1.1 hikaru octeon_xkphys_write_8(paddr_t address, uint64_t value) 287 1.1 hikaru { 288 1.5 matt mips3_sd(MIPS_PHYS_TO_XKPHYS(OCTEON_CCA_NONE, address), value); 289 1.1 hikaru } 290 1.1 hikaru 291 1.6 christos static __inline void 292 1.1 hikaru octeon_iobdma_write_8(uint64_t value) 293 1.1 hikaru { 294 1.1 hikaru 295 1.11 simonb octeon_xkphys_write_8(OCTEON_IOBDMA_ADDR, value); 296 1.1 hikaru } 297 1.1 hikaru 298 1.6 christos static __inline uint64_t 299 1.1 hikaru octeon_cvmseg_read_8(size_t offset) 300 1.1 hikaru { 301 1.13 simonb 302 1.11 simonb return octeon_xkphys_read_8(OCTEON_CVMSEG_LM + offset); 303 1.1 hikaru } 304 1.1 hikaru 305 1.6 christos static __inline void 306 1.1 hikaru octeon_cvmseg_write_8(size_t offset, uint64_t value) 307 1.1 hikaru { 308 1.13 simonb 309 1.11 simonb octeon_xkphys_write_8(OCTEON_CVMSEG_LM + offset, value); 310 1.1 hikaru } 311 1.1 hikaru 312 1.1 hikaru #endif /* _MIPS_OCTEON_OCTEONVAR_H_ */ 313