1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * This file is subject to the terms and conditions of the GNU General Public
3*4882a593Smuzhiyun * License. See the file "COPYING" in the main directory of this archive
4*4882a593Smuzhiyun * for more details.
5*4882a593Smuzhiyun *
6*4882a593Smuzhiyun * Copyright (C) 2004-2008 Cavium Networks
7*4882a593Smuzhiyun */
8*4882a593Smuzhiyun #ifndef __ASM_OCTEON_OCTEON_H
9*4882a593Smuzhiyun #define __ASM_OCTEON_OCTEON_H
10*4882a593Smuzhiyun
11*4882a593Smuzhiyun #include <asm/octeon/cvmx.h>
12*4882a593Smuzhiyun #include <asm/bitfield.h>
13*4882a593Smuzhiyun
14*4882a593Smuzhiyun extern uint64_t octeon_bootmem_alloc_range_phys(uint64_t size,
15*4882a593Smuzhiyun uint64_t alignment,
16*4882a593Smuzhiyun uint64_t min_addr,
17*4882a593Smuzhiyun uint64_t max_addr,
18*4882a593Smuzhiyun int do_locking);
19*4882a593Smuzhiyun extern void *octeon_bootmem_alloc(uint64_t size, uint64_t alignment,
20*4882a593Smuzhiyun int do_locking);
21*4882a593Smuzhiyun extern void *octeon_bootmem_alloc_range(uint64_t size, uint64_t alignment,
22*4882a593Smuzhiyun uint64_t min_addr, uint64_t max_addr,
23*4882a593Smuzhiyun int do_locking);
24*4882a593Smuzhiyun extern void *octeon_bootmem_alloc_named(uint64_t size, uint64_t alignment,
25*4882a593Smuzhiyun char *name);
26*4882a593Smuzhiyun extern void *octeon_bootmem_alloc_named_range(uint64_t size, uint64_t min_addr,
27*4882a593Smuzhiyun uint64_t max_addr, uint64_t align,
28*4882a593Smuzhiyun char *name);
29*4882a593Smuzhiyun extern void *octeon_bootmem_alloc_named_address(uint64_t size, uint64_t address,
30*4882a593Smuzhiyun char *name);
31*4882a593Smuzhiyun extern int octeon_bootmem_free_named(char *name);
32*4882a593Smuzhiyun extern void octeon_bootmem_lock(void);
33*4882a593Smuzhiyun extern void octeon_bootmem_unlock(void);
34*4882a593Smuzhiyun
35*4882a593Smuzhiyun extern int octeon_is_simulation(void);
36*4882a593Smuzhiyun extern int octeon_is_pci_host(void);
37*4882a593Smuzhiyun extern int octeon_usb_is_ref_clk(void);
38*4882a593Smuzhiyun extern uint64_t octeon_get_clock_rate(void);
39*4882a593Smuzhiyun extern u64 octeon_get_io_clock_rate(void);
40*4882a593Smuzhiyun extern const char *octeon_board_type_string(void);
41*4882a593Smuzhiyun extern const char *octeon_get_pci_interrupts(void);
42*4882a593Smuzhiyun extern int octeon_get_southbridge_interrupt(void);
43*4882a593Smuzhiyun extern int octeon_get_boot_coremask(void);
44*4882a593Smuzhiyun extern int octeon_get_boot_num_arguments(void);
45*4882a593Smuzhiyun extern const char *octeon_get_boot_argument(int arg);
46*4882a593Smuzhiyun extern void octeon_hal_setup_reserved32(void);
47*4882a593Smuzhiyun extern void octeon_user_io_init(void);
48*4882a593Smuzhiyun
49*4882a593Smuzhiyun extern void octeon_init_cvmcount(void);
50*4882a593Smuzhiyun extern void octeon_setup_delays(void);
51*4882a593Smuzhiyun extern void octeon_io_clk_delay(unsigned long);
52*4882a593Smuzhiyun
53*4882a593Smuzhiyun #define OCTEON_ARGV_MAX_ARGS 64
54*4882a593Smuzhiyun #define OCTEON_SERIAL_LEN 20
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun struct octeon_boot_descriptor {
57*4882a593Smuzhiyun #ifdef __BIG_ENDIAN_BITFIELD
58*4882a593Smuzhiyun /* Start of block referenced by assembly code - do not change! */
59*4882a593Smuzhiyun uint32_t desc_version;
60*4882a593Smuzhiyun uint32_t desc_size;
61*4882a593Smuzhiyun uint64_t stack_top;
62*4882a593Smuzhiyun uint64_t heap_base;
63*4882a593Smuzhiyun uint64_t heap_end;
64*4882a593Smuzhiyun /* Only used by bootloader */
65*4882a593Smuzhiyun uint64_t entry_point;
66*4882a593Smuzhiyun uint64_t desc_vaddr;
67*4882a593Smuzhiyun /* End of This block referenced by assembly code - do not change! */
68*4882a593Smuzhiyun uint32_t exception_base_addr;
69*4882a593Smuzhiyun uint32_t stack_size;
70*4882a593Smuzhiyun uint32_t heap_size;
71*4882a593Smuzhiyun /* Argc count for application. */
72*4882a593Smuzhiyun uint32_t argc;
73*4882a593Smuzhiyun uint32_t argv[OCTEON_ARGV_MAX_ARGS];
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun #define BOOT_FLAG_INIT_CORE (1 << 0)
76*4882a593Smuzhiyun #define OCTEON_BL_FLAG_DEBUG (1 << 1)
77*4882a593Smuzhiyun #define OCTEON_BL_FLAG_NO_MAGIC (1 << 2)
78*4882a593Smuzhiyun /* If set, use uart1 for console */
79*4882a593Smuzhiyun #define OCTEON_BL_FLAG_CONSOLE_UART1 (1 << 3)
80*4882a593Smuzhiyun /* If set, use PCI console */
81*4882a593Smuzhiyun #define OCTEON_BL_FLAG_CONSOLE_PCI (1 << 4)
82*4882a593Smuzhiyun /* Call exit on break on serial port */
83*4882a593Smuzhiyun #define OCTEON_BL_FLAG_BREAK (1 << 5)
84*4882a593Smuzhiyun
85*4882a593Smuzhiyun uint32_t flags;
86*4882a593Smuzhiyun uint32_t core_mask;
87*4882a593Smuzhiyun /* DRAM size in megabyes. */
88*4882a593Smuzhiyun uint32_t dram_size;
89*4882a593Smuzhiyun /* physical address of free memory descriptor block. */
90*4882a593Smuzhiyun uint32_t phy_mem_desc_addr;
91*4882a593Smuzhiyun /* used to pass flags from app to debugger. */
92*4882a593Smuzhiyun uint32_t debugger_flags_base_addr;
93*4882a593Smuzhiyun /* CPU clock speed, in hz. */
94*4882a593Smuzhiyun uint32_t eclock_hz;
95*4882a593Smuzhiyun /* DRAM clock speed, in hz. */
96*4882a593Smuzhiyun uint32_t dclock_hz;
97*4882a593Smuzhiyun /* SPI4 clock in hz. */
98*4882a593Smuzhiyun uint32_t spi_clock_hz;
99*4882a593Smuzhiyun uint16_t board_type;
100*4882a593Smuzhiyun uint8_t board_rev_major;
101*4882a593Smuzhiyun uint8_t board_rev_minor;
102*4882a593Smuzhiyun uint16_t chip_type;
103*4882a593Smuzhiyun uint8_t chip_rev_major;
104*4882a593Smuzhiyun uint8_t chip_rev_minor;
105*4882a593Smuzhiyun char board_serial_number[OCTEON_SERIAL_LEN];
106*4882a593Smuzhiyun uint8_t mac_addr_base[6];
107*4882a593Smuzhiyun uint8_t mac_addr_count;
108*4882a593Smuzhiyun uint64_t cvmx_desc_vaddr;
109*4882a593Smuzhiyun #else
110*4882a593Smuzhiyun uint32_t desc_size;
111*4882a593Smuzhiyun uint32_t desc_version;
112*4882a593Smuzhiyun uint64_t stack_top;
113*4882a593Smuzhiyun uint64_t heap_base;
114*4882a593Smuzhiyun uint64_t heap_end;
115*4882a593Smuzhiyun /* Only used by bootloader */
116*4882a593Smuzhiyun uint64_t entry_point;
117*4882a593Smuzhiyun uint64_t desc_vaddr;
118*4882a593Smuzhiyun /* End of This block referenced by assembly code - do not change! */
119*4882a593Smuzhiyun uint32_t stack_size;
120*4882a593Smuzhiyun uint32_t exception_base_addr;
121*4882a593Smuzhiyun uint32_t argc;
122*4882a593Smuzhiyun uint32_t heap_size;
123*4882a593Smuzhiyun /*
124*4882a593Smuzhiyun * Argc count for application.
125*4882a593Smuzhiyun * Warning low bit scrambled in little-endian.
126*4882a593Smuzhiyun */
127*4882a593Smuzhiyun uint32_t argv[OCTEON_ARGV_MAX_ARGS];
128*4882a593Smuzhiyun
129*4882a593Smuzhiyun #define BOOT_FLAG_INIT_CORE (1 << 0)
130*4882a593Smuzhiyun #define OCTEON_BL_FLAG_DEBUG (1 << 1)
131*4882a593Smuzhiyun #define OCTEON_BL_FLAG_NO_MAGIC (1 << 2)
132*4882a593Smuzhiyun /* If set, use uart1 for console */
133*4882a593Smuzhiyun #define OCTEON_BL_FLAG_CONSOLE_UART1 (1 << 3)
134*4882a593Smuzhiyun /* If set, use PCI console */
135*4882a593Smuzhiyun #define OCTEON_BL_FLAG_CONSOLE_PCI (1 << 4)
136*4882a593Smuzhiyun /* Call exit on break on serial port */
137*4882a593Smuzhiyun #define OCTEON_BL_FLAG_BREAK (1 << 5)
138*4882a593Smuzhiyun
139*4882a593Smuzhiyun uint32_t core_mask;
140*4882a593Smuzhiyun uint32_t flags;
141*4882a593Smuzhiyun /* physical address of free memory descriptor block. */
142*4882a593Smuzhiyun uint32_t phy_mem_desc_addr;
143*4882a593Smuzhiyun /* DRAM size in megabyes. */
144*4882a593Smuzhiyun uint32_t dram_size;
145*4882a593Smuzhiyun /* CPU clock speed, in hz. */
146*4882a593Smuzhiyun uint32_t eclock_hz;
147*4882a593Smuzhiyun /* used to pass flags from app to debugger. */
148*4882a593Smuzhiyun uint32_t debugger_flags_base_addr;
149*4882a593Smuzhiyun /* SPI4 clock in hz. */
150*4882a593Smuzhiyun uint32_t spi_clock_hz;
151*4882a593Smuzhiyun /* DRAM clock speed, in hz. */
152*4882a593Smuzhiyun uint32_t dclock_hz;
153*4882a593Smuzhiyun uint8_t chip_rev_minor;
154*4882a593Smuzhiyun uint8_t chip_rev_major;
155*4882a593Smuzhiyun uint16_t chip_type;
156*4882a593Smuzhiyun uint8_t board_rev_minor;
157*4882a593Smuzhiyun uint8_t board_rev_major;
158*4882a593Smuzhiyun uint16_t board_type;
159*4882a593Smuzhiyun
160*4882a593Smuzhiyun uint64_t unused1[4]; /* Not even filled in by bootloader. */
161*4882a593Smuzhiyun
162*4882a593Smuzhiyun uint64_t cvmx_desc_vaddr;
163*4882a593Smuzhiyun #endif
164*4882a593Smuzhiyun };
165*4882a593Smuzhiyun
166*4882a593Smuzhiyun union octeon_cvmemctl {
167*4882a593Smuzhiyun uint64_t u64;
168*4882a593Smuzhiyun struct {
169*4882a593Smuzhiyun /* RO 1 = BIST fail, 0 = BIST pass */
170*4882a593Smuzhiyun __BITFIELD_FIELD(uint64_t tlbbist:1,
171*4882a593Smuzhiyun /* RO 1 = BIST fail, 0 = BIST pass */
172*4882a593Smuzhiyun __BITFIELD_FIELD(uint64_t l1cbist:1,
173*4882a593Smuzhiyun /* RO 1 = BIST fail, 0 = BIST pass */
174*4882a593Smuzhiyun __BITFIELD_FIELD(uint64_t l1dbist:1,
175*4882a593Smuzhiyun /* RO 1 = BIST fail, 0 = BIST pass */
176*4882a593Smuzhiyun __BITFIELD_FIELD(uint64_t dcmbist:1,
177*4882a593Smuzhiyun /* RO 1 = BIST fail, 0 = BIST pass */
178*4882a593Smuzhiyun __BITFIELD_FIELD(uint64_t ptgbist:1,
179*4882a593Smuzhiyun /* RO 1 = BIST fail, 0 = BIST pass */
180*4882a593Smuzhiyun __BITFIELD_FIELD(uint64_t wbfbist:1,
181*4882a593Smuzhiyun /* Reserved */
182*4882a593Smuzhiyun __BITFIELD_FIELD(uint64_t reserved:17,
183*4882a593Smuzhiyun /* OCTEON II - TLB replacement policy: 0 = bitmask LRU; 1 = NLU.
184*4882a593Smuzhiyun * This field selects between the TLB replacement policies:
185*4882a593Smuzhiyun * bitmask LRU or NLU. Bitmask LRU maintains a mask of
186*4882a593Smuzhiyun * recently used TLB entries and avoids them as new entries
187*4882a593Smuzhiyun * are allocated. NLU simply guarantees that the next
188*4882a593Smuzhiyun * allocation is not the last used TLB entry. */
189*4882a593Smuzhiyun __BITFIELD_FIELD(uint64_t tlbnlu:1,
190*4882a593Smuzhiyun /* OCTEON II - Selects the bit in the counter used for
191*4882a593Smuzhiyun * releasing a PAUSE. This counter trips every 2(8+PAUSETIME)
192*4882a593Smuzhiyun * cycles. If not already released, the cnMIPS II core will
193*4882a593Smuzhiyun * always release a given PAUSE instruction within
194*4882a593Smuzhiyun * 2(8+PAUSETIME). If the counter trip happens to line up,
195*4882a593Smuzhiyun * the cnMIPS II core may release the PAUSE instantly. */
196*4882a593Smuzhiyun __BITFIELD_FIELD(uint64_t pausetime:3,
197*4882a593Smuzhiyun /* OCTEON II - This field is an extension of
198*4882a593Smuzhiyun * CvmMemCtl[DIDTTO] */
199*4882a593Smuzhiyun __BITFIELD_FIELD(uint64_t didtto2:1,
200*4882a593Smuzhiyun /* R/W If set, marked write-buffer entries time out
201*4882a593Smuzhiyun * the same as other entries; if clear, marked
202*4882a593Smuzhiyun * write-buffer entries use the maximum timeout. */
203*4882a593Smuzhiyun __BITFIELD_FIELD(uint64_t dismarkwblongto:1,
204*4882a593Smuzhiyun /* R/W If set, a merged store does not clear the
205*4882a593Smuzhiyun * write-buffer entry timeout state. */
206*4882a593Smuzhiyun __BITFIELD_FIELD(uint64_t dismrgclrwbto:1,
207*4882a593Smuzhiyun /* R/W Two bits that are the MSBs of the resultant
208*4882a593Smuzhiyun * CVMSEG LM word location for an IOBDMA. The other 8
209*4882a593Smuzhiyun * bits come from the SCRADDR field of the IOBDMA. */
210*4882a593Smuzhiyun __BITFIELD_FIELD(uint64_t iobdmascrmsb:2,
211*4882a593Smuzhiyun /* R/W If set, SYNCWS and SYNCS only order marked
212*4882a593Smuzhiyun * stores; if clear, SYNCWS and SYNCS only order
213*4882a593Smuzhiyun * unmarked stores. SYNCWSMARKED has no effect when
214*4882a593Smuzhiyun * DISSYNCWS is set. */
215*4882a593Smuzhiyun __BITFIELD_FIELD(uint64_t syncwsmarked:1,
216*4882a593Smuzhiyun /* R/W If set, SYNCWS acts as SYNCW and SYNCS acts as
217*4882a593Smuzhiyun * SYNC. */
218*4882a593Smuzhiyun __BITFIELD_FIELD(uint64_t dissyncws:1,
219*4882a593Smuzhiyun /* R/W If set, no stall happens on write buffer
220*4882a593Smuzhiyun * full. */
221*4882a593Smuzhiyun __BITFIELD_FIELD(uint64_t diswbfst:1,
222*4882a593Smuzhiyun /* R/W If set (and SX set), supervisor-level
223*4882a593Smuzhiyun * loads/stores can use XKPHYS addresses with
224*4882a593Smuzhiyun * VA<48>==0 */
225*4882a593Smuzhiyun __BITFIELD_FIELD(uint64_t xkmemenas:1,
226*4882a593Smuzhiyun /* R/W If set (and UX set), user-level loads/stores
227*4882a593Smuzhiyun * can use XKPHYS addresses with VA<48>==0 */
228*4882a593Smuzhiyun __BITFIELD_FIELD(uint64_t xkmemenau:1,
229*4882a593Smuzhiyun /* R/W If set (and SX set), supervisor-level
230*4882a593Smuzhiyun * loads/stores can use XKPHYS addresses with
231*4882a593Smuzhiyun * VA<48>==1 */
232*4882a593Smuzhiyun __BITFIELD_FIELD(uint64_t xkioenas:1,
233*4882a593Smuzhiyun /* R/W If set (and UX set), user-level loads/stores
234*4882a593Smuzhiyun * can use XKPHYS addresses with VA<48>==1 */
235*4882a593Smuzhiyun __BITFIELD_FIELD(uint64_t xkioenau:1,
236*4882a593Smuzhiyun /* R/W If set, all stores act as SYNCW (NOMERGE must
237*4882a593Smuzhiyun * be set when this is set) RW, reset to 0. */
238*4882a593Smuzhiyun __BITFIELD_FIELD(uint64_t allsyncw:1,
239*4882a593Smuzhiyun /* R/W If set, no stores merge, and all stores reach
240*4882a593Smuzhiyun * the coherent bus in order. */
241*4882a593Smuzhiyun __BITFIELD_FIELD(uint64_t nomerge:1,
242*4882a593Smuzhiyun /* R/W Selects the bit in the counter used for DID
243*4882a593Smuzhiyun * time-outs 0 = 231, 1 = 230, 2 = 229, 3 =
244*4882a593Smuzhiyun * 214. Actual time-out is between 1x and 2x this
245*4882a593Smuzhiyun * interval. For example, with DIDTTO=3, expiration
246*4882a593Smuzhiyun * interval is between 16K and 32K. */
247*4882a593Smuzhiyun __BITFIELD_FIELD(uint64_t didtto:2,
248*4882a593Smuzhiyun /* R/W If set, the (mem) CSR clock never turns off. */
249*4882a593Smuzhiyun __BITFIELD_FIELD(uint64_t csrckalwys:1,
250*4882a593Smuzhiyun /* R/W If set, mclk never turns off. */
251*4882a593Smuzhiyun __BITFIELD_FIELD(uint64_t mclkalwys:1,
252*4882a593Smuzhiyun /* R/W Selects the bit in the counter used for write
253*4882a593Smuzhiyun * buffer flush time-outs (WBFLT+11) is the bit
254*4882a593Smuzhiyun * position in an internal counter used to determine
255*4882a593Smuzhiyun * expiration. The write buffer expires between 1x and
256*4882a593Smuzhiyun * 2x this interval. For example, with WBFLT = 0, a
257*4882a593Smuzhiyun * write buffer expires between 2K and 4K cycles after
258*4882a593Smuzhiyun * the write buffer entry is allocated. */
259*4882a593Smuzhiyun __BITFIELD_FIELD(uint64_t wbfltime:3,
260*4882a593Smuzhiyun /* R/W If set, do not put Istream in the L2 cache. */
261*4882a593Smuzhiyun __BITFIELD_FIELD(uint64_t istrnol2:1,
262*4882a593Smuzhiyun /* R/W The write buffer threshold. */
263*4882a593Smuzhiyun __BITFIELD_FIELD(uint64_t wbthresh:4,
264*4882a593Smuzhiyun /* Reserved */
265*4882a593Smuzhiyun __BITFIELD_FIELD(uint64_t reserved2:2,
266*4882a593Smuzhiyun /* R/W If set, CVMSEG is available for loads/stores in
267*4882a593Smuzhiyun * kernel/debug mode. */
268*4882a593Smuzhiyun __BITFIELD_FIELD(uint64_t cvmsegenak:1,
269*4882a593Smuzhiyun /* R/W If set, CVMSEG is available for loads/stores in
270*4882a593Smuzhiyun * supervisor mode. */
271*4882a593Smuzhiyun __BITFIELD_FIELD(uint64_t cvmsegenas:1,
272*4882a593Smuzhiyun /* R/W If set, CVMSEG is available for loads/stores in
273*4882a593Smuzhiyun * user mode. */
274*4882a593Smuzhiyun __BITFIELD_FIELD(uint64_t cvmsegenau:1,
275*4882a593Smuzhiyun /* R/W Size of local memory in cache blocks, 54 (6912
276*4882a593Smuzhiyun * bytes) is max legal value. */
277*4882a593Smuzhiyun __BITFIELD_FIELD(uint64_t lmemsz:6,
278*4882a593Smuzhiyun ;)))))))))))))))))))))))))))))))))
279*4882a593Smuzhiyun } s;
280*4882a593Smuzhiyun };
281*4882a593Smuzhiyun
282*4882a593Smuzhiyun extern void octeon_check_cpu_bist(void);
283*4882a593Smuzhiyun
284*4882a593Smuzhiyun int octeon_prune_device_tree(void);
285*4882a593Smuzhiyun extern const char __appended_dtb;
286*4882a593Smuzhiyun extern const char __dtb_octeon_3xxx_begin;
287*4882a593Smuzhiyun extern const char __dtb_octeon_68xx_begin;
288*4882a593Smuzhiyun
289*4882a593Smuzhiyun /**
290*4882a593Smuzhiyun * Write a 32bit value to the Octeon NPI register space
291*4882a593Smuzhiyun *
292*4882a593Smuzhiyun * @address: Address to write to
293*4882a593Smuzhiyun * @val: Value to write
294*4882a593Smuzhiyun */
octeon_npi_write32(uint64_t address,uint32_t val)295*4882a593Smuzhiyun static inline void octeon_npi_write32(uint64_t address, uint32_t val)
296*4882a593Smuzhiyun {
297*4882a593Smuzhiyun cvmx_write64_uint32(address ^ 4, val);
298*4882a593Smuzhiyun cvmx_read64_uint32(address ^ 4);
299*4882a593Smuzhiyun }
300*4882a593Smuzhiyun
301*4882a593Smuzhiyun #ifdef CONFIG_SMP
302*4882a593Smuzhiyun void octeon_setup_smp(void);
303*4882a593Smuzhiyun #else
octeon_setup_smp(void)304*4882a593Smuzhiyun static inline void octeon_setup_smp(void) {}
305*4882a593Smuzhiyun #endif
306*4882a593Smuzhiyun
307*4882a593Smuzhiyun struct irq_domain;
308*4882a593Smuzhiyun struct device_node;
309*4882a593Smuzhiyun struct irq_data;
310*4882a593Smuzhiyun struct irq_chip;
311*4882a593Smuzhiyun void octeon_ciu3_mbox_send(int cpu, unsigned int mbox);
312*4882a593Smuzhiyun int octeon_irq_ciu3_xlat(struct irq_domain *d,
313*4882a593Smuzhiyun struct device_node *node,
314*4882a593Smuzhiyun const u32 *intspec,
315*4882a593Smuzhiyun unsigned int intsize,
316*4882a593Smuzhiyun unsigned long *out_hwirq,
317*4882a593Smuzhiyun unsigned int *out_type);
318*4882a593Smuzhiyun void octeon_irq_ciu3_enable(struct irq_data *data);
319*4882a593Smuzhiyun void octeon_irq_ciu3_disable(struct irq_data *data);
320*4882a593Smuzhiyun void octeon_irq_ciu3_ack(struct irq_data *data);
321*4882a593Smuzhiyun void octeon_irq_ciu3_mask(struct irq_data *data);
322*4882a593Smuzhiyun void octeon_irq_ciu3_mask_ack(struct irq_data *data);
323*4882a593Smuzhiyun int octeon_irq_ciu3_mapx(struct irq_domain *d, unsigned int virq,
324*4882a593Smuzhiyun irq_hw_number_t hw, struct irq_chip *chip);
325*4882a593Smuzhiyun
326*4882a593Smuzhiyun /* Octeon multiplier save/restore routines from octeon_switch.S */
327*4882a593Smuzhiyun void octeon_mult_save(void);
328*4882a593Smuzhiyun void octeon_mult_restore(void);
329*4882a593Smuzhiyun void octeon_mult_save_end(void);
330*4882a593Smuzhiyun void octeon_mult_restore_end(void);
331*4882a593Smuzhiyun void octeon_mult_save3(void);
332*4882a593Smuzhiyun void octeon_mult_save3_end(void);
333*4882a593Smuzhiyun void octeon_mult_save2(void);
334*4882a593Smuzhiyun void octeon_mult_save2_end(void);
335*4882a593Smuzhiyun void octeon_mult_restore3(void);
336*4882a593Smuzhiyun void octeon_mult_restore3_end(void);
337*4882a593Smuzhiyun void octeon_mult_restore2(void);
338*4882a593Smuzhiyun void octeon_mult_restore2_end(void);
339*4882a593Smuzhiyun
340*4882a593Smuzhiyun /**
341*4882a593Smuzhiyun * Read a 32bit value from the Octeon NPI register space
342*4882a593Smuzhiyun *
343*4882a593Smuzhiyun * @address: Address to read
344*4882a593Smuzhiyun * Returns The result
345*4882a593Smuzhiyun */
octeon_npi_read32(uint64_t address)346*4882a593Smuzhiyun static inline uint32_t octeon_npi_read32(uint64_t address)
347*4882a593Smuzhiyun {
348*4882a593Smuzhiyun return cvmx_read64_uint32(address ^ 4);
349*4882a593Smuzhiyun }
350*4882a593Smuzhiyun
351*4882a593Smuzhiyun extern struct cvmx_bootinfo *octeon_bootinfo;
352*4882a593Smuzhiyun
353*4882a593Smuzhiyun extern uint64_t octeon_bootloader_entry_addr;
354*4882a593Smuzhiyun
355*4882a593Smuzhiyun extern void (*octeon_irq_setup_secondary)(void);
356*4882a593Smuzhiyun
357*4882a593Smuzhiyun typedef void (*octeon_irq_ip4_handler_t)(void);
358*4882a593Smuzhiyun void octeon_irq_set_ip4_handler(octeon_irq_ip4_handler_t);
359*4882a593Smuzhiyun
360*4882a593Smuzhiyun extern void octeon_fixup_irqs(void);
361*4882a593Smuzhiyun
362*4882a593Smuzhiyun extern struct semaphore octeon_bootbus_sem;
363*4882a593Smuzhiyun
364*4882a593Smuzhiyun struct irq_domain *octeon_irq_get_block_domain(int node, uint8_t block);
365*4882a593Smuzhiyun
366*4882a593Smuzhiyun #endif /* __ASM_OCTEON_OCTEON_H */
367