xref: /rk3399_ARM-atf/plat/rockchip/rk3399/drivers/m0/src/startup.c (revision 8382e17c4c6bffd15119dfce1ee4372e3c1a7890)
1*8382e17cSCaesar Wang /*
2*8382e17cSCaesar Wang  * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved.
3*8382e17cSCaesar Wang  *
4*8382e17cSCaesar Wang  * Redistribution and use in source and binary forms, with or without
5*8382e17cSCaesar Wang  * modification, are permitted provided that the following conditions are met:
6*8382e17cSCaesar Wang  *
7*8382e17cSCaesar Wang  * Redistributions of source code must retain the above copyright notice, this
8*8382e17cSCaesar Wang  * list of conditions and the following disclaimer.
9*8382e17cSCaesar Wang  *
10*8382e17cSCaesar Wang  * Redistributions in binary form must reproduce the above copyright notice,
11*8382e17cSCaesar Wang  * this list of conditions and the following disclaimer in the documentation
12*8382e17cSCaesar Wang  * and/or other materials provided with the distribution.
13*8382e17cSCaesar Wang  *
14*8382e17cSCaesar Wang  * Neither the name of ARM nor the names of its contributors may be used
15*8382e17cSCaesar Wang  * to endorse or promote products derived from this software without specific
16*8382e17cSCaesar Wang  * prior written permission.
17*8382e17cSCaesar Wang  *
18*8382e17cSCaesar Wang  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19*8382e17cSCaesar Wang  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20*8382e17cSCaesar Wang  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21*8382e17cSCaesar Wang  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22*8382e17cSCaesar Wang  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23*8382e17cSCaesar Wang  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24*8382e17cSCaesar Wang  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25*8382e17cSCaesar Wang  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26*8382e17cSCaesar Wang  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27*8382e17cSCaesar Wang  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28*8382e17cSCaesar Wang  * POSSIBILITY OF SUCH DAMAGE.
29*8382e17cSCaesar Wang  */
30*8382e17cSCaesar Wang 
31*8382e17cSCaesar Wang #include "rk3399_mcu.h"
32*8382e17cSCaesar Wang 
33*8382e17cSCaesar Wang /* Stack configuration */
34*8382e17cSCaesar Wang #define STACK_SIZE	0x00000100
35*8382e17cSCaesar Wang __attribute__ ((section(".co_stack")))
36*8382e17cSCaesar Wang unsigned long pstack[STACK_SIZE];
37*8382e17cSCaesar Wang 
38*8382e17cSCaesar Wang /* Macro definition */
39*8382e17cSCaesar Wang #define WEAK __attribute__ ((weak))
40*8382e17cSCaesar Wang 
41*8382e17cSCaesar Wang /* System exception vector handler */
42*8382e17cSCaesar Wang __attribute__ ((used))
43*8382e17cSCaesar Wang void WEAK reset_handler(void);
44*8382e17cSCaesar Wang void WEAK nmi_handler(void);
45*8382e17cSCaesar Wang void WEAK hardware_fault_handler(void);
46*8382e17cSCaesar Wang void WEAK svc_handler(void);
47*8382e17cSCaesar Wang void WEAK pend_sv_handler(void);
48*8382e17cSCaesar Wang void WEAK systick_handler(void);
49*8382e17cSCaesar Wang 
50*8382e17cSCaesar Wang extern int main(void);
51*8382e17cSCaesar Wang 
52*8382e17cSCaesar Wang /* Function prototypes */
53*8382e17cSCaesar Wang static void default_reset_handler(void);
54*8382e17cSCaesar Wang static void default_handler(void);
55*8382e17cSCaesar Wang 
56*8382e17cSCaesar Wang /*
57*8382e17cSCaesar Wang  * The minimal vector table for a Cortex M3.  Note that the proper constructs
58*8382e17cSCaesar Wang  * must be placed on this to ensure that it ends up at physical address
59*8382e17cSCaesar Wang  * 0x00000000.
60*8382e17cSCaesar Wang  */
61*8382e17cSCaesar Wang __attribute__ ((used, section(".isr_vector")))
62*8382e17cSCaesar Wang void (* const g_pfnVectors[])(void) = {
63*8382e17cSCaesar Wang 	/* core Exceptions */
64*8382e17cSCaesar Wang 	(void *)&pstack[STACK_SIZE], /* the initial stack pointer */
65*8382e17cSCaesar Wang 	reset_handler,
66*8382e17cSCaesar Wang 	nmi_handler,
67*8382e17cSCaesar Wang 	hardware_fault_handler,
68*8382e17cSCaesar Wang 	0, 0, 0, 0, 0, 0, 0,
69*8382e17cSCaesar Wang 	svc_handler,
70*8382e17cSCaesar Wang 	0, 0,
71*8382e17cSCaesar Wang 	pend_sv_handler,
72*8382e17cSCaesar Wang 	systick_handler,
73*8382e17cSCaesar Wang 
74*8382e17cSCaesar Wang 	/* external exceptions */
75*8382e17cSCaesar Wang 	0, 0, 0, 0, 0, 0, 0,
76*8382e17cSCaesar Wang 	0, 0, 0, 0, 0, 0, 0,
77*8382e17cSCaesar Wang 	0, 0, 0, 0, 0, 0, 0,
78*8382e17cSCaesar Wang 	0, 0, 0, 0, 0, 0, 0,
79*8382e17cSCaesar Wang 	0, 0, 0, 0
80*8382e17cSCaesar Wang };
81*8382e17cSCaesar Wang 
82*8382e17cSCaesar Wang /**
83*8382e17cSCaesar Wang  * This is the code that gets called when the processor first
84*8382e17cSCaesar Wang  * starts execution following a reset event. Only the absolutely
85*8382e17cSCaesar Wang  * necessary set is performed, after which the application
86*8382e17cSCaesar Wang  * supplied main() routine is called.
87*8382e17cSCaesar Wang  */
88*8382e17cSCaesar Wang static void default_reset_handler(void)
89*8382e17cSCaesar Wang {
90*8382e17cSCaesar Wang 	/* call the application's entry point */
91*8382e17cSCaesar Wang 	main();
92*8382e17cSCaesar Wang }
93*8382e17cSCaesar Wang 
94*8382e17cSCaesar Wang /**
95*8382e17cSCaesar Wang  * Provide weak aliases for each Exception handler to the Default_Handler.
96*8382e17cSCaesar Wang  * As they are weak aliases, any function with the same name will override
97*8382e17cSCaesar Wang  * this definition.
98*8382e17cSCaesar Wang  */
99*8382e17cSCaesar Wang #pragma weak reset_handler = default_reset_handler
100*8382e17cSCaesar Wang #pragma weak nmi_handler = default_handler
101*8382e17cSCaesar Wang #pragma weak hardware_fault_handler = default_handler
102*8382e17cSCaesar Wang #pragma weak svc_handler = default_handler
103*8382e17cSCaesar Wang #pragma weak pend_sv_handler = default_handler
104*8382e17cSCaesar Wang #pragma weak systick_handler = default_handler
105*8382e17cSCaesar Wang 
106*8382e17cSCaesar Wang /**
107*8382e17cSCaesar Wang  * This is the code that gets called when the processor receives
108*8382e17cSCaesar Wang  * an unexpected interrupt.  This simply enters an infinite loop,
109*8382e17cSCaesar Wang  * preserving the system state for examination by a debugger.
110*8382e17cSCaesar Wang  */
111*8382e17cSCaesar Wang static void default_handler(void)
112*8382e17cSCaesar Wang {
113*8382e17cSCaesar Wang     /* go into an infinite loop. */
114*8382e17cSCaesar Wang 	while (1)
115*8382e17cSCaesar Wang 		;
116*8382e17cSCaesar Wang }
117