blob: f537e93f701a751a1f5d9bdce96126d93d3b9f5d [file] [log] [blame]
Mike Frysinger66c4cf42008-02-04 19:26:55 -05001/*
2 * Boot ROM Entry Points and such
3 */
4
5/* These Blackfins all have a Boot ROM that is not reusable (at all):
6 * BF531 / BF532 / BF533
7 * BF538 / BF539
8 * BF561
9 * So there is nothing for us to export ;(
10 *
11 * These Blackfins started to roll with the idea that the Boot ROM can
12 * provide useful functions, but still only a few (and not really useful):
13 * BF534 / BF536 / BF537
14 *
15 * Looking forward, Boot ROM's on newer Blackfins have quite a few
16 * nice entry points that are usable at runtime and beyond. We'll
17 * only define known legacy parts (listed above) and otherwise just
18 * assume it's a newer part.
19 *
20 * These entry points are accomplished by placing a small jump table at
21 * the start of the Boot ROM. This way the addresses are fixed forever.
22 */
23
24#ifndef __BFIN_PERIPHERAL_BOOTROM__
25#define __BFIN_PERIPHERAL_BOOTROM__
26
27/* All Blackfin's have the Boot ROM entry point at the same address */
28#define _BOOTROM_RESET 0xEF000000
29
30#if defined(__ADSPBF531__) || defined(__ADSPBF532__) || defined(__ADSPBF533__) || \
31 defined(__ADSPBF538__) || defined(__ADSPBF539__) || \
32 defined(__ADSPBF561__)
33
34 /* Nothing to export */
35
36#elif defined(__ADSPBF534__) || defined(__ADSPBF536__) || defined(__ADSPBF537__)
37
38 /* The BF537 family */
39
40#define _BOOTROM_FINAL_INIT 0xEF000002
41/* reserved 0xEF000004 */
42#define _BOOTROM_DO_MEMORY_DMA 0xEF000006
43#define _BOOTROM_BOOT_DXE_FLASH 0xEF000008
44#define _BOOTROM_BOOT_DXE_SPI 0xEF00000A
45#define _BOOTROM_BOOT_DXE_TWI 0xEF00000C
46/* reserved 0xEF00000E */
47#define _BOOTROM_GET_DXE_ADDRESS_FLASH 0xEF000010
48#define _BOOTROM_GET_DXE_ADDRESS_SPI 0xEF000012
49#define _BOOTROM_GET_DXE_ADDRESS_TWI 0xEF000014
50/* reserved 0xEF000016 */
51/* reserved 0xEF000018 */
52
53 /* Glue to newer Boot ROMs */
54#define _BOOTROM_MDMA _BOOTROM_DO_MEMORY_DMA
55#define _BOOTROM_MEMBOOT _BOOTROM_BOOT_DXE_FLASH
56#define _BOOTROM_SPIBOOT _BOOTROM_BOOT_DXE_FLASH
57#define _BOOTROM_TWIBOOT _BOOTROM_BOOT_DXE_TWI
58
59#else
60
61 /* All the newer Boot ROMs */
62
63#define _BOOTROM_FINAL_INIT 0xEF000002
64#define _BOOTROM_PDMA 0xEF000004
65#define _BOOTROM_MDMA 0xEF000006
66#define _BOOTROM_MEMBOOT 0xEF000008
67#define _BOOTROM_SPIBOOT 0xEF00000A
68#define _BOOTROM_TWIBOOT 0xEF00000C
69/* reserved 0xEF00000E */
70/* reserved 0xEF000010 */
71/* reserved 0xEF000012 */
72/* reserved 0xEF000014 */
73/* reserved 0xEF000016 */
74#define _BOOTROM_OTP_COMMAND 0xEF000018
75#define _BOOTROM_OTP_READ 0xEF00001A
76#define _BOOTROM_OTP_WRITE 0xEF00001C
77#define _BOOTROM_ECC_TABLE 0xEF00001E
78#define _BOOTROM_BOOTKERNEL 0xEF000020
79#define _BOOTROM_GETPORT 0xEF000022
80#define _BOOTROM_NMI 0xEF000024
81#define _BOOTROM_HWERROR 0xEF000026
82#define _BOOTROM_EXCEPTION 0xEF000028
83#define _BOOTROM_CRC32 0xEF000030
84#define _BOOTROM_CRC32POLY 0xEF000032
85#define _BOOTROM_CRC32CALLBACK 0xEF000034
86#define _BOOTROM_CRC32INITCODE 0xEF000036
87#define _BOOTROM_SYSCONTROL 0xEF000038
88#define _BOOTROM_REV 0xEF000040
89#define _BOOTROM_SESR 0xEF001000
90
Mike Frysinger795174d2008-08-07 13:21:11 -040091#define BOOTROM_FOLLOWS_C_ABI 1
92
Mike Frysinger66c4cf42008-02-04 19:26:55 -050093#define BOOTROM_CAPS_ADI_BOOT_STRUCTS 1
94
Mike Frysinger66c4cf42008-02-04 19:26:55 -050095#endif
96
Mike Frysinger795174d2008-08-07 13:21:11 -040097#ifndef BOOTROM_FOLLOWS_C_ABI
98#define BOOTROM_FOLLOWS_C_ABI 0
99#endif
Mike Frysinger66c4cf42008-02-04 19:26:55 -0500100#ifndef BOOTROM_CAPS_ADI_BOOT_STRUCTS
101#define BOOTROM_CAPS_ADI_BOOT_STRUCTS 0
102#endif
Mike Frysinger66c4cf42008-02-04 19:26:55 -0500103
Mike Frysingerf96a9d72008-10-11 22:04:05 -0400104/* Possible syscontrol action flags */
105#define SYSCTRL_READ 0x00000000 /* read registers */
106#define SYSCTRL_WRITE 0x00000001 /* write registers */
107#define SYSCTRL_SYSRESET 0x00000002 /* perform system reset */
108#define SYSCTRL_CORERESET 0x00000004 /* perform core reset */
109#define SYSCTRL_SOFTRESET 0x00000006 /* perform core and system reset */
110#define SYSCTRL_VRCTL 0x00000010 /* read/write VR_CTL register */
111#define SYSCTRL_EXTVOLTAGE 0x00000020 /* VDDINT supplied externally */
112#define SYSCTRL_INTVOLTAGE 0x00000000 /* VDDINT generated by on-chip regulator */
113#define SYSCTRL_OTPVOLTAGE 0x00000040 /* For Factory Purposes Only */
114#define SYSCTRL_PLLCTL 0x00000100 /* read/write PLL_CTL register */
115#define SYSCTRL_PLLDIV 0x00000200 /* read/write PLL_DIV register */
116#define SYSCTRL_LOCKCNT 0x00000400 /* read/write PLL_LOCKCNT register */
117#define SYSCTRL_PLLSTAT 0x00000800 /* read/write PLL_STAT register */
118
Mike Frysinger66c4cf42008-02-04 19:26:55 -0500119#ifndef __ASSEMBLY__
120
Mike Frysinger795174d2008-08-07 13:21:11 -0400121#if BOOTROM_FOLLOWS_C_ABI
122# define BOOTROM_CALLED_FUNC_ATTR
123#else
124# define BOOTROM_CALLED_FUNC_ATTR __attribute__((saveall))
125#endif
126
Mike Frysinger66c4cf42008-02-04 19:26:55 -0500127/* Structures for the syscontrol() function */
128typedef struct ADI_SYSCTRL_VALUES {
129 uint16_t uwVrCtl;
130 uint16_t uwPllCtl;
131 uint16_t uwPllDiv;
132 uint16_t uwPllLockCnt;
133 uint16_t uwPllStat;
134} ADI_SYSCTRL_VALUES;
135
136#ifndef _BOOTROM_SYSCONTROL
137#define _BOOTROM_SYSCONTROL 0
138#endif
Mike Frysingerf96a9d72008-10-11 22:04:05 -0400139static uint32_t (* const bfrom_SysControl)(uint32_t action_flags, ADI_SYSCTRL_VALUES *power_settings, void *reserved) = (void *)_BOOTROM_SYSCONTROL;
Mike Frysinger66c4cf42008-02-04 19:26:55 -0500140
Mike Frysingerf96a9d72008-10-11 22:04:05 -0400141/* We need a dedicated function since we need to screw with the stack pointer
142 * when resetting. The on-chip ROM will save/restore registers on the stack
143 * when doing a system reset, so the stack cannot be outside of the chip.
144 */
145__attribute__((__noreturn__))
146static inline void bfrom_SoftReset(void *new_stack)
147{
148 while (1)
149 __asm__ __volatile__(
150 "sp = %[stack];"
151 "jump (%[bfrom_syscontrol]);"
152 : : [bfrom_syscontrol] "p"(bfrom_SysControl),
153 "q0"(SYSCTRL_SOFTRESET),
154 "q1"(0),
155 "q2"(NULL),
156 [stack] "p"(new_stack)
157 );
158}
Mike Frysinger66c4cf42008-02-04 19:26:55 -0500159
160/* Structures for working with LDRs and boot rom callbacks */
161typedef struct ADI_BOOT_HEADER {
162 int32_t dBlockCode;
163 void *pTargetAddress;
164 int32_t dByteCount;
165 int32_t dArgument;
166} ADI_BOOT_HEADER;
167
168typedef struct ADI_BOOT_BUFFER {
169 void *pSource;
170 int32_t dByteCount;
171} ADI_BOOT_BUFFER;
172
173typedef struct ADI_BOOT_DATA {
174 void *pSource;
175 void *pDestination;
176 int16_t *pControlRegister;
177 int16_t *pDmaControlRegister;
178 int32_t dControlValue;
179 int32_t dByteCount;
180 int32_t dFlags;
181 int16_t uwDataWidth;
182 int16_t uwSrcModifyMult;
183 int16_t uwDstModifyMult;
184 int16_t uwHwait;
185 int16_t uwSsel;
186 int16_t uwUserShort;
187 int32_t dUserLong;
188 int32_t dReserved2;
189 void *pErrorFunction;
190 void *pLoadFunction;
191 void *pCallBackFunction;
192 ADI_BOOT_HEADER *pHeader;
193 void *pTempBuffer;
194 void *pTempCurrent;
195 int32_t dTempByteCount;
196 int32_t dBlockCount;
197 int32_t dClock;
198 void *pLogBuffer;
199 void *pLogCurrent;
200 int32_t dLogByteCount;
201} ADI_BOOT_DATA;
202
Mike Frysinger7c8e97f2008-11-27 16:50:32 -0500203typedef void ADI_BOOT_HOOK_FUNC (ADI_BOOT_DATA *);
204
205#ifndef _BOOTROM_MEMBOOT
206#define _BOOTROM_MEMBOOT 0
207#endif
208static uint32_t (* const bfrom_MemBoot)(void *pBootStream, int32_t dFlags, int32_t dBlockCount, ADI_BOOT_HOOK_FUNC *pCallHook) = (void *)_BOOTROM_MEMBOOT;
209
210#ifndef _BOOTROM_TWIBOOT
211#define _BOOTROM_TWIBOOT 0
212#endif
213static uint32_t (* const bfrom_TwiBoot)(int32_t dTwiAddress, int32_t dFlags, int32_t dBlockCount, ADI_BOOT_HOOK_FUNC *pCallHook) = (void *)_BOOTROM_TWIBOOT;
214
215#ifndef _BOOTROM_SPIBOOT
216#define _BOOTROM_SPIBOOT 0
217#endif
218static uint32_t (* const bfrom_SpiBoot)(int32_t dSpiAddress, int32_t dFlags, int32_t dBlockCount, ADI_BOOT_HOOK_FUNC *pCallHook) = (void *)_BOOTROM_SPIBOOT;
219
220#ifndef _BOOTROM_OTPBOOT
221#define _BOOTROM_OTPBOOT 0
222#endif
223static uint32_t (* const bfrom_OtpBoot)(int32_t dOtpAddress, int32_t dFlags, int32_t dBlockCount, ADI_BOOT_HOOK_FUNC *pCallHook) = (void *)_BOOTROM_OTPBOOT;
224
225#ifndef _BOOTROM_NANDBOOT
226#define _BOOTROM_NANDBOOT 0
227#endif
228static uint32_t (* const bfrom_NandBoot)(int32_t dNandAddress, int32_t dFlags, int32_t dBlockCount, ADI_BOOT_HOOK_FUNC *pCallHook) = (void *)_BOOTROM_NANDBOOT;
229
Mike Frysinger66c4cf42008-02-04 19:26:55 -0500230#endif /* __ASSEMBLY__ */
231
232/* Bit defines for ADI_BOOT_DATA->dFlags */
233#define BFLAG_DMACODE_MASK 0x0000000F
234#define BFLAG_SAFE 0x00000010
235#define BFLAG_AUX 0x00000020
236#define BFLAG_FILL 0x00000100
237#define BFLAG_QUICKBOOT 0x00000200
238#define BFLAG_CALLBACK 0x00000400
239#define BFLAG_INIT 0x00000800
240#define BFLAG_IGNORE 0x00001000
241#define BFLAG_INDIRECT 0x00002000
242#define BFLAG_FIRST 0x00004000
243#define BFLAG_FINAL 0x00008000
244#define BFLAG_HOOK 0x00400000
245#define BFLAG_HDRINDIRECT 0x00800000
246#define BFLAG_TYPE_MASK 0x00300000
247#define BFLAG_TYPE_1 0x00000000
248#define BFLAG_TYPE_2 0x00100000
249#define BFLAG_TYPE_3 0x00200000
250#define BFLAG_TYPE_4 0x00300000
251#define BFLAG_FASTREAD 0x00400000
252#define BFLAG_NOAUTO 0x01000000
253#define BFLAG_PERIPHERAL 0x02000000
254#define BFLAG_SLAVE 0x04000000
255#define BFLAG_WAKEUP 0x08000000
256#define BFLAG_NEXTDXE 0x10000000
257#define BFLAG_RETURN 0x20000000
258#define BFLAG_RESET 0x40000000
259#define BFLAG_NONRESTORE 0x80000000
260
261#endif