xref: /rk3399_ARM-atf/plat/common/aarch64/plat_common.c (revision ff2743e544f0f82381ebb9dff8f14eacb837d2e0)
1 /*
2  * Copyright (c) 2014-2018, ARM Limited and Contributors. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #include <arch_helpers.h>
8 #include <assert.h>
9 #include <console.h>
10 #include <platform.h>
11 #if RAS_EXTENSION
12 #include <ras.h>
13 #endif
14 #include <xlat_mmu_helpers.h>
15 
16 /*
17  * The following platform setup functions are weakly defined. They
18  * provide typical implementations that may be re-used by multiple
19  * platforms but may also be overridden by a platform if required.
20  */
21 #pragma weak bl31_plat_enable_mmu
22 #pragma weak bl32_plat_enable_mmu
23 #pragma weak bl31_plat_runtime_setup
24 #if !ERROR_DEPRECATED
25 #pragma weak plat_get_syscnt_freq2
26 #pragma weak bl31_early_platform_setup2
27 #endif /* ERROR_DEPRECATED */
28 
29 #if SDEI_SUPPORT
30 #pragma weak plat_sdei_handle_masked_trigger
31 #pragma weak plat_sdei_validate_entry_point
32 #endif
33 
34 #pragma weak plat_ea_handler
35 
36 void bl31_plat_enable_mmu(uint32_t flags)
37 {
38 	enable_mmu_el3(flags);
39 }
40 
41 void bl32_plat_enable_mmu(uint32_t flags)
42 {
43 	enable_mmu_el1(flags);
44 }
45 
46 void bl31_plat_runtime_setup(void)
47 {
48 #if MULTI_CONSOLE_API
49 	console_switch_state(CONSOLE_FLAG_RUNTIME);
50 #else
51 	console_uninit();
52 #endif
53 }
54 
55 #if !ENABLE_PLAT_COMPAT
56 /*
57  * Helper function for platform_get_pos() when platform compatibility is
58  * disabled. This is to enable SPDs using the older platform API to continue
59  * to work.
60  */
61 unsigned int platform_core_pos_helper(unsigned long mpidr)
62 {
63 	int idx = plat_core_pos_by_mpidr(mpidr);
64 	assert(idx >= 0);
65 	return idx;
66 }
67 #endif
68 
69 
70 #if !ERROR_DEPRECATED
71 unsigned int plat_get_syscnt_freq2(void)
72 {
73 	WARN("plat_get_syscnt_freq() is deprecated\n");
74 	WARN("Please define plat_get_syscnt_freq2()\n");
75 	/*
76 	 * Suppress deprecated declaration warning in compatibility function
77 	 */
78 #pragma GCC diagnostic push
79 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
80 	unsigned long long freq = plat_get_syscnt_freq();
81 #pragma GCC diagnostic pop
82 
83 	assert(freq >> 32 == 0);
84 
85 	return (unsigned int)freq;
86 }
87 
88 void bl31_early_platform_setup2(u_register_t arg0, u_register_t arg1,
89 			u_register_t arg2, u_register_t arg3)
90 {
91 	bl31_early_platform_setup((void *) arg0, (void *)arg1);
92 }
93 #endif /* ERROR_DEPRECATED */
94 
95 #if SDEI_SUPPORT
96 /*
97  * Function that handles spurious SDEI interrupts while events are masked.
98  */
99 void plat_sdei_handle_masked_trigger(uint64_t mpidr, unsigned int intr)
100 {
101 	WARN("Spurious SDEI interrupt %u on masked PE %llx\n", intr, mpidr);
102 }
103 
104 /*
105  * Default Function to validate SDEI entry point, which returns success.
106  * Platforms may override this with their own validation mechanism.
107  */
108 int plat_sdei_validate_entry_point(uintptr_t ep, unsigned int client_mode)
109 {
110 	return 0;
111 }
112 #endif
113 
114 /* RAS functions common to AArch64 ARM platforms */
115 void plat_ea_handler(unsigned int ea_reason, uint64_t syndrome, void *cookie,
116 		void *handle, uint64_t flags)
117 {
118 #if RAS_EXTENSION
119 	/* Call RAS EA handler */
120 	int handled = ras_ea_handler(ea_reason, syndrome, cookie, handle, flags);
121 	if (handled != 0)
122 		return;
123 #endif
124 
125 	ERROR("Unhandled External Abort received on 0x%lx at EL3!\n",
126 			read_mpidr_el1());
127 	ERROR(" exception reason=%u syndrome=0x%llx\n", ea_reason, syndrome);
128 	panic();
129 }
130