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