xref: /rk3399_ARM-atf/plat/renesas/rcar_gen4/include/rcar_private.h (revision b45b5bacb95d0e2d4539a7869c1ccf90da041498)
1*b45b5bacSMarek Vasut /*
2*b45b5bacSMarek Vasut  * Copyright (c) 2015-2025, Renesas Electronics Corporation. All rights reserved.
3*b45b5bacSMarek Vasut  *
4*b45b5bacSMarek Vasut  * SPDX-License-Identifier: BSD-3-Clause
5*b45b5bacSMarek Vasut  */
6*b45b5bacSMarek Vasut 
7*b45b5bacSMarek Vasut #ifndef RCAR_PRIVATE_H
8*b45b5bacSMarek Vasut #define RCAR_PRIVATE_H
9*b45b5bacSMarek Vasut 
10*b45b5bacSMarek Vasut #include <common/bl_common.h>
11*b45b5bacSMarek Vasut #include <lib/bakery_lock.h>
12*b45b5bacSMarek Vasut #include <lib/el3_runtime/cpu_data.h>
13*b45b5bacSMarek Vasut #include <lib/mmio.h>
14*b45b5bacSMarek Vasut 
15*b45b5bacSMarek Vasut #include <platform_def.h>
16*b45b5bacSMarek Vasut 
17*b45b5bacSMarek Vasut /*
18*b45b5bacSMarek Vasut  * This structure represents the superset of information that is passed to
19*b45b5bacSMarek Vasut  * BL31 e.g. while passing control to it from BL2 which is bl31_params
20*b45b5bacSMarek Vasut  * and bl31_plat_params and its elements
21*b45b5bacSMarek Vasut  */
22*b45b5bacSMarek Vasut typedef struct bl2_to_bl31_params_mem {
23*b45b5bacSMarek Vasut 	image_info_t bl32_image_info;
24*b45b5bacSMarek Vasut 	image_info_t bl33_image_info;
25*b45b5bacSMarek Vasut 	entry_point_info_t bl33_ep_info;
26*b45b5bacSMarek Vasut 	entry_point_info_t bl32_ep_info;
27*b45b5bacSMarek Vasut } bl2_to_bl31_params_mem_t;
28*b45b5bacSMarek Vasut 
29*b45b5bacSMarek Vasut #define RCAR_INSTANTIATE_LOCK	DEFINE_BAKERY_LOCK(rcar_lock)
30*b45b5bacSMarek Vasut /*
31*b45b5bacSMarek Vasut  * Constants to specify how many bakery locks this platform implements. These
32*b45b5bacSMarek Vasut  * are used if the platform chooses not to use coherent memory for bakery lock
33*b45b5bacSMarek Vasut  * data structures.
34*b45b5bacSMarek Vasut  */
35*b45b5bacSMarek Vasut #define RCAR_MAX_BAKERIES	2
36*b45b5bacSMarek Vasut 
37*b45b5bacSMarek Vasut /*
38*b45b5bacSMarek Vasut  * Definition of structure which holds platform specific per-cpu data. Currently
39*b45b5bacSMarek Vasut  * it holds only the bakery lock information for each cpu. Constants to
40*b45b5bacSMarek Vasut  * specify how many bakeries this platform implements and bakery ids are
41*b45b5bacSMarek Vasut  * specified in rcar_def.h
42*b45b5bacSMarek Vasut  */
43*b45b5bacSMarek Vasut typedef struct rcar_cpu_data {
44*b45b5bacSMarek Vasut 	bakery_info_t pcpu_bakery_info[RCAR_MAX_BAKERIES];
45*b45b5bacSMarek Vasut } rcar_cpu_data_t;
46*b45b5bacSMarek Vasut 
47*b45b5bacSMarek Vasut /*
48*b45b5bacSMarek Vasut  * Helper macros for bakery lock api when using the above rcar_cpu_data_t for
49*b45b5bacSMarek Vasut  * bakery lock data structures. It assumes that the bakery_info is at the
50*b45b5bacSMarek Vasut  * beginning of the platform specific per-cpu data.
51*b45b5bacSMarek Vasut  */
52*b45b5bacSMarek Vasut #define rcar_lock_init()	bakery_lock_init(&rcar_lock)
53*b45b5bacSMarek Vasut #define rcar_lock_get()		bakery_lock_get(&rcar_lock)
54*b45b5bacSMarek Vasut #define rcar_lock_release()	bakery_lock_release(&rcar_lock)
55*b45b5bacSMarek Vasut 
56*b45b5bacSMarek Vasut /*
57*b45b5bacSMarek Vasut  * Ensure that the size of the RCAR specific per-cpu data structure and the size
58*b45b5bacSMarek Vasut  * of the memory allocated in generic per-cpu data for the platform are the same
59*b45b5bacSMarek Vasut  */
60*b45b5bacSMarek Vasut CASSERT(sizeof(rcar_cpu_data_t) == PLAT_PCPU_DATA_SIZE,
61*b45b5bacSMarek Vasut 	rcar_pcpu_data_size_mismatch);
62*b45b5bacSMarek Vasut 
63*b45b5bacSMarek Vasut /* lock for SCMI */
64*b45b5bacSMarek Vasut #define RCAR_SCMI_INSTANTIATE_LOCK	spinlock_t rcar_scmi_lock
65*b45b5bacSMarek Vasut #define RCAR_SCMI_LOCK_GET_INSTANCE	(&rcar_scmi_lock)
66*b45b5bacSMarek Vasut 
67*b45b5bacSMarek Vasut /*
68*b45b5bacSMarek Vasut  * Function and variable prototypes
69*b45b5bacSMarek Vasut  */
70*b45b5bacSMarek Vasut void rcar_configure_mmu_el3(uintptr_t total_base,
71*b45b5bacSMarek Vasut 			    size_t total_size,
72*b45b5bacSMarek Vasut 			    uintptr_t ro_start,
73*b45b5bacSMarek Vasut 			    uintptr_t ro_limit
74*b45b5bacSMarek Vasut 			    );
75*b45b5bacSMarek Vasut 
76*b45b5bacSMarek Vasut 
77*b45b5bacSMarek Vasut void plat_invalidate_icache(void);
78*b45b5bacSMarek Vasut 
79*b45b5bacSMarek Vasut void rcar_console_boot_init(void);
80*b45b5bacSMarek Vasut void rcar_console_runtime_init(void);
81*b45b5bacSMarek Vasut 
82*b45b5bacSMarek Vasut #if (SET_SCMI_PARAM == 1)
83*b45b5bacSMarek Vasut void __init plat_rcar_scmi_setup(void);
84*b45b5bacSMarek Vasut void rcar_scmi_sys_shutdown(void);
85*b45b5bacSMarek Vasut void rcar_scmi_sys_reboot(void);
86*b45b5bacSMarek Vasut void rcar_scmi_sys_suspend(void);
87*b45b5bacSMarek Vasut const plat_psci_ops_t *plat_rcar_psci_override_pm_ops(plat_psci_ops_t *ops);
88*b45b5bacSMarek Vasut #else
89*b45b5bacSMarek Vasut static inline void plat_rcar_scmi_setup(void) { }
90*b45b5bacSMarek Vasut 
91*b45b5bacSMarek Vasut static inline void rcar_scmi_sys_shutdown(void) { }
92*b45b5bacSMarek Vasut 
93*b45b5bacSMarek Vasut static inline void rcar_scmi_sys_reboot(void)
94*b45b5bacSMarek Vasut {
95*b45b5bacSMarek Vasut 	mmio_write_32(RCAR_SRESCR, 0x5AA50000U | BIT(15));
96*b45b5bacSMarek Vasut }
97*b45b5bacSMarek Vasut 
98*b45b5bacSMarek Vasut static inline void rcar_scmi_sys_suspend(void)
99*b45b5bacSMarek Vasut {
100*b45b5bacSMarek Vasut 	while true;
101*b45b5bacSMarek Vasut }
102*b45b5bacSMarek Vasut 
103*b45b5bacSMarek Vasut static inline const plat_psci_ops_t *plat_rcar_psci_override_pm_ops(plat_psci_ops_t *ops)
104*b45b5bacSMarek Vasut {
105*b45b5bacSMarek Vasut 	return ops;
106*b45b5bacSMarek Vasut }
107*b45b5bacSMarek Vasut #endif /* SET_SCMI_PARAM == 1 */
108*b45b5bacSMarek Vasut 
109*b45b5bacSMarek Vasut int32_t rcar_cluster_pos_by_mpidr(u_register_t mpidr);
110*b45b5bacSMarek Vasut 
111*b45b5bacSMarek Vasut #endif /* RCAR_PRIVATE_H */
112