2 * This file is subject to the terms and conditions of the GNU General Public
3 * License. See the file "COPYING" in the main directory of this archive
6 * Copyright (C) 2004-2017 Cavium, Inc.
11 We install this program at the bootvector:
12 ------------------------------------
17 dmtc0 $k0, $31, 0 # Save $k0 to DESAVE
18 dmtc0 $k1, $31, 3 # Save $k1 to KScratch2
20 mfc0 $k0, $12, 0 # Status
21 mfc0 $k1, $15, 1 # Ebase
23 ori $k0, 0x84 # Enable 64-bit addressing, set
24 # ERL (should already be set)
25 andi $k1, 0x3ff # mask out core ID
27 mtc0 $k0, $12, 0 # Status
31 cache 17, 0($0) # Core-14345, clear L1 Dcache virtual
32 # tags if the core hit an NMI
34 ld $k0, 0x78($k0) # k0 <- (bfc00078) pointer to the reset vector
35 synci 0($0) # Invalidate ICache to get coherent
36 # view of target code.
41 ld $k0, 0($k0) # k0 <- core specific target address
42 dmfc0 $k1, $31, 3 # Restore $k1 from KScratch2
44 beqz $k0, wait_loop # Spin in wait loop
50 nop # NOPs needed here to fill delay slots
51 nop # on endian reversal of previous instructions
62 ------------------------------------
64 0000000000000000 <reset_vector>:
65 0: 40baf800 dmtc0 k0,c0_desave
66 4: 40bbf803 dmtc0 k1,c0_kscratch2
68 8: 401a6000 mfc0 k0,c0_status
69 c: 401b7801 mfc0 k1,c0_ebase
71 10: 375a0084 ori k0,k0,0x84
72 14: 337b03ff andi k1,k1,0x3ff
74 18: 409a6000 mtc0 k0,c0_status
75 1c: 001bd940 sll k1,k1,0x5
77 20: 3c1abfc0 lui k0,0xbfc0
78 24: bc110000 cache 0x11,0(zero)
80 28: df5a0078 ld k0,120(k0)
81 2c: 041f0000 synci 0(zero)
83 30: 035bd02d daddu k0,k0,k1
86 38: df5a0000 ld k0,0(k0)
87 3c: 403bf803 dmfc0 k1,c0_kscratch2
89 40: 13400005 beqz k0,58 <wait_loop>
98 0000000000000058 <wait_loop>:
102 60: 1000fffd b 58 <wait_loop>
110 #include <asm/octeon/cvmx-boot-vector.h>
112 static unsigned long long _cvmx_bootvector_data
[16] = {
113 0x40baf80040bbf803ull
, /* patch low order 8-bits if no KScratch*/
114 0x401a6000401b7801ull
,
115 0x375a0084337b03ffull
,
116 0x409a6000001bd940ull
,
117 0x3c1abfc0bc110000ull
,
118 0xdf5a0078041f0000ull
,
119 0x035bd02d00000000ull
,
120 0xdf5a0000403bf803ull
, /* patch low order 8-bits if no KScratch*/
121 0x1340000500000000ull
,
122 0x0340000800000000ull
,
123 0x0000000000000000ull
,
124 0x4200002000000000ull
,
125 0x1000fffd00000000ull
,
126 0x0000000000000000ull
,
127 OCTEON_BOOT_MOVEABLE_MAGIC1
,
128 0 /* To be filled in with address of vector block*/
132 #define VECTOR_TABLE_SIZE (1024 * sizeof(struct cvmx_boot_vector_element))
134 static void cvmx_boot_vector_init(void *mem
)
139 memset(mem
, 0, VECTOR_TABLE_SIZE
);
140 kseg0_mem
= cvmx_ptr_to_phys(mem
) | 0x8000000000000000ull
;
142 for (i
= 0; i
< 15; i
++) {
143 uint64_t v
= _cvmx_bootvector_data
[i
];
145 if (OCTEON_IS_OCTEON1PLUS() && (i
== 0 || i
== 7))
146 v
&= 0xffffffff00000000ull
; /* KScratch not availble. */
147 cvmx_write_csr(CVMX_MIO_BOOT_LOC_ADR
, i
* 8);
148 cvmx_write_csr(CVMX_MIO_BOOT_LOC_DAT
, v
);
150 cvmx_write_csr(CVMX_MIO_BOOT_LOC_ADR
, 15 * 8);
151 cvmx_write_csr(CVMX_MIO_BOOT_LOC_DAT
, kseg0_mem
);
152 cvmx_write_csr(CVMX_MIO_BOOT_LOC_CFGX(0), 0x81fc0000);
156 * Get a pointer to the per-core table of reset vector pointers
159 struct cvmx_boot_vector_element
*cvmx_boot_vector_get(void)
161 struct cvmx_boot_vector_element
*ret
;
163 ret
= cvmx_bootmem_alloc_named_range_once(VECTOR_TABLE_SIZE
, 0,
164 (1ull << 32) - 1, 8, "__boot_vector1__", cvmx_boot_vector_init
);
167 EXPORT_SYMBOL(cvmx_boot_vector_get
);