octeonvar.h revision 1.16 1 1.16 jmcneill /* $NetBSD: octeonvar.h,v 1.16 2020/07/17 21:59:30 jmcneill 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.10 simonb #define OCTEON_PLUS 10 /* arbitary, 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.2 matt #ifdef MULTIPROCESSOR
205 1.10 simonb extern kcpuset_t *cpus_booted;
206 1.2 matt #endif
207 1.1 hikaru
208 1.10 simonb const char *octeon_cpu_model(mips_prid_t);
209 1.2 matt
210 1.10 simonb void octeon_bus_io_init(bus_space_tag_t, void *);
211 1.10 simonb void octeon_bus_mem_init(bus_space_tag_t, void *);
212 1.10 simonb void octeon_cal_timer(int);
213 1.10 simonb void octeon_dma_init(struct octeon_config *);
214 1.10 simonb void octeon_intr_init(struct cpu_info *);
215 1.10 simonb void octeon_iointr(int, vaddr_t, uint32_t);
216 1.10 simonb void octpci_init(pci_chipset_tag_t, struct octeon_config *);
217 1.10 simonb void *octeon_intr_establish(int, int, int (*)(void *), void *);
218 1.10 simonb void octeon_intr_disestablish(void *cookie);
219 1.10 simonb
220 1.10 simonb int octeon_ioclock_speed(void);
221 1.10 simonb void octeon_soft_reset(void);
222 1.10 simonb
223 1.10 simonb void octeon_reset_vector(void);
224 1.10 simonb uint64_t mips_cp0_cvmctl_read(void);
225 1.10 simonb void mips_cp0_cvmctl_write(uint64_t);
226 1.1 hikaru #endif /* _KERNEL */
227 1.1 hikaru
228 1.1 hikaru #if defined(__mips_n32)
229 1.1 hikaru #define ffs64 __builtin_ffsll
230 1.1 hikaru #elif defined(_LP64)
231 1.1 hikaru #define ffs64 __builtin_ffsl
232 1.1 hikaru #else
233 1.1 hikaru #error unknown ABI
234 1.1 hikaru #endif
235 1.1 hikaru
236 1.1 hikaru /*
237 1.1 hikaru * Prefetch
238 1.1 hikaru *
239 1.1 hikaru * OCTEON_PREF normal (L1 and L2)
240 1.1 hikaru * OCTEON_PREF_L1 L1 only
241 1.1 hikaru * OCTEON_PREF_L2 L2 only
242 1.1 hikaru * OCTEON_PREF_DWB don't write back
243 1.1 hikaru * OCTEON_PREF_PFS prepare for store
244 1.1 hikaru */
245 1.1 hikaru #define __OCTEON_PREF_N(n, base, offset) \
246 1.1 hikaru __asm __volatile ( \
247 1.1 hikaru " .set push \
248 1.1 hikaru " .set arch=octeon \n" \
249 1.1 hikaru " pref "#n", "#offset"(%[base]) \n" \
250 1.1 hikaru " .set pop \
251 1.1 hikaru : : [base] "d" (base) \
252 1.1 hikaru )
253 1.1 hikaru #define __OCTEON_PREF_0(base, offset) __OCTEON_PREF_N(0, base, offset)
254 1.1 hikaru #define __OCTEON_PREF_4(base, offset) __OCTEON_PREF_N(4, base, offset)
255 1.1 hikaru #define __OCTEON_PREF_28(base, offset) __OCTEON_PREF_N(28, base, offset)
256 1.1 hikaru #define __OCTEON_PREF_29(base, offset) __OCTEON_PREF_N(29, base, offset)
257 1.1 hikaru #define __OCTEON_PREF_30(base, offset) __OCTEON_PREF_N(30, base, offset)
258 1.1 hikaru #define OCTEON_PREF(base, offset) __OCTEON_PREF_0(base, offset)
259 1.1 hikaru #define OCTEON_PREF_L1(base, offset) __OCTEON_PREF_4(base, offset)
260 1.1 hikaru #define OCTEON_PREF_L2(base, offset) __OCTEON_PREF_28(base, offset)
261 1.1 hikaru #define OCTEON_PREF_DWB(base, offset) __OCTEON_PREF_29(base, offset)
262 1.1 hikaru #define OCTEON_PREF_PFS(base, offset) __OCTEON_PREF_30(base, offset)
263 1.1 hikaru
264 1.1 hikaru /*
265 1.1 hikaru * Sync
266 1.1 hikaru */
267 1.1 hikaru #define OCTEON_SYNCCOMMON(name) \
268 1.1 hikaru __asm __volatile ( \
269 1.1 hikaru _ASM_PROLOGUE_OCTEON \
270 1.1 hikaru " "#name" \n" \
271 1.1 hikaru _ASM_EPILOGUE \
272 1.1 hikaru ::: "memory")
273 1.1 hikaru #define OCTEON_SYNCIOBDMA OCTEON_SYNCCOMMON(synciobdma)
274 1.1 hikaru #define OCTEON_SYNCW OCTEON_SYNCCOMMON(syncw)
275 1.1 hikaru #define OCTEON_SYNC OCTEON_SYNCCOMMON(sync)
276 1.1 hikaru #define OCTEON_SYNCWS OCTEON_SYNCCOMMON(syncws)
277 1.1 hikaru #define OCTEON_SYNCS OCTEON_SYNCCOMMON(syncs)
278 1.1 hikaru
279 1.1 hikaru /* octeon core does not use cca to determine cacheability */
280 1.1 hikaru #define OCTEON_CCA_NONE UINT64_C(0)
281 1.1 hikaru
282 1.6 christos static __inline uint64_t
283 1.1 hikaru octeon_xkphys_read_8(paddr_t address)
284 1.1 hikaru {
285 1.5 matt return mips3_ld(MIPS_PHYS_TO_XKPHYS(OCTEON_CCA_NONE, address));
286 1.1 hikaru }
287 1.1 hikaru
288 1.6 christos static __inline void
289 1.1 hikaru octeon_xkphys_write_8(paddr_t address, uint64_t value)
290 1.1 hikaru {
291 1.5 matt mips3_sd(MIPS_PHYS_TO_XKPHYS(OCTEON_CCA_NONE, address), value);
292 1.1 hikaru }
293 1.1 hikaru
294 1.6 christos static __inline void
295 1.1 hikaru octeon_iobdma_write_8(uint64_t value)
296 1.1 hikaru {
297 1.1 hikaru
298 1.11 simonb octeon_xkphys_write_8(OCTEON_IOBDMA_ADDR, value);
299 1.1 hikaru }
300 1.1 hikaru
301 1.6 christos static __inline uint64_t
302 1.1 hikaru octeon_cvmseg_read_8(size_t offset)
303 1.1 hikaru {
304 1.13 simonb
305 1.11 simonb return octeon_xkphys_read_8(OCTEON_CVMSEG_LM + offset);
306 1.1 hikaru }
307 1.1 hikaru
308 1.6 christos static __inline void
309 1.1 hikaru octeon_cvmseg_write_8(size_t offset, uint64_t value)
310 1.1 hikaru {
311 1.13 simonb
312 1.11 simonb octeon_xkphys_write_8(OCTEON_CVMSEG_LM + offset, value);
313 1.1 hikaru }
314 1.1 hikaru
315 1.1 hikaru #endif /* _MIPS_OCTEON_OCTEONVAR_H_ */
316