1 /*
2  * Renesas SCP/MCP Software
3  * Copyright (c) 2020-2022, Renesas Electronics Corporation. All rights
4  * reserved.
5  *
6  * SPDX-License-Identifier: BSD-3-Clause
7  */
8 
9 #include <fwk_arch.h>
10 #include <fwk_attributes.h>
11 #include <fwk_noreturn.h>
12 #include <fwk_status.h>
13 
14 #include <arch_gic.h>
15 #include <arch_helpers.h>
16 
17 #include <stdbool.h>
18 
19 /*
20  * This variable is used to ensure spurious nested calls won't
21  * enable interrupts. This is been accessed from inline function defined in
22  * arch_helpers.h
23  */
24 unsigned int critical_section_nest_level;
25 
_platform_init(void * params)26 FWK_WEAK int _platform_init(void *params)
27 {
28     return FWK_SUCCESS;
29 }
30 
31 /*
32  * Error handler for failures that occur during early initialization.
33  */
panic(void)34 void panic(void)
35 {
36     while (true)
37         wfi();
38 }
39 
40 static struct fwk_arch_init_driver arch_init_driver = {
41     .interrupt = arm_gic_init,
42 };
43 
arm_main(void)44 void arm_main(void)
45 {
46     int status;
47 
48     _platform_init(NULL);
49 
50 #ifdef BUILD_MODE_DEBUG
51     uint32_t cntv_ctl = 0;
52     __asm__ volatile("msr cntv_ctl_el0, %0" ::"r"(cntv_ctl));
53 #endif /* BUILD_MODE_DEBUG */
54 
55     status = fwk_arch_init(&arch_init_driver);
56     if (status != FWK_SUCCESS)
57         panic();
58 }
59