1*45711e4eSEdward-JW Yang/* 2*45711e4eSEdward-JW Yang * Copyright (c) 2022, Mediatek Inc. All rights reserved. 3*45711e4eSEdward-JW Yang * 4*45711e4eSEdward-JW Yang * SPDX-License-Identifier: BSD-3-Clause 5*45711e4eSEdward-JW Yang */ 6*45711e4eSEdward-JW Yang 7*45711e4eSEdward-JW Yang#include <arch.h> 8*45711e4eSEdward-JW Yang#include <asm_macros.S> 9*45711e4eSEdward-JW Yang#include <assert_macros.S> 10*45711e4eSEdward-JW Yang#include <cpu_macros.S> 11*45711e4eSEdward-JW Yang#if CONFIG_MTK_MCUSYS 12*45711e4eSEdward-JW Yang#include <mcucfg.h> 13*45711e4eSEdward-JW Yang#endif 14*45711e4eSEdward-JW Yang#include <platform_def.h> 15*45711e4eSEdward-JW Yang /* 16*45711e4eSEdward-JW Yang * Declare as weak function so that can be 17*45711e4eSEdward-JW Yang * overwritten by platform helpers 18*45711e4eSEdward-JW Yang */ 19*45711e4eSEdward-JW Yang .weak platform_mem_init 20*45711e4eSEdward-JW Yang .weak plat_core_pos_by_mpidr 21*45711e4eSEdward-JW Yang .weak plat_my_core_pos 22*45711e4eSEdward-JW Yang .weak plat_mediatek_calc_core_pos 23*45711e4eSEdward-JW Yang .global plat_mpidr_by_core_pos 24*45711e4eSEdward-JW Yang .global plat_reset_handler 25*45711e4eSEdward-JW Yang 26*45711e4eSEdward-JW Yang /* ----------------------------------------------------- 27*45711e4eSEdward-JW Yang * unsigned long plat_mpidr_by_core_pos(uint32_t cpuid) 28*45711e4eSEdward-JW Yang * This function calcuate mpidr by cpu pos if cpu 29*45711e4eSEdward-JW Yang * topology is linear. 30*45711e4eSEdward-JW Yang * 31*45711e4eSEdward-JW Yang * Clobbers: x0-x1 32*45711e4eSEdward-JW Yang * ----------------------------------------------------- 33*45711e4eSEdward-JW Yang */ 34*45711e4eSEdward-JW Yangfunc plat_mpidr_by_core_pos 35*45711e4eSEdward-JW Yang lsl x0, x0, #MPIDR_AFF1_SHIFT 36*45711e4eSEdward-JW Yang mrs x1, mpidr_el1 37*45711e4eSEdward-JW Yang and x1, x1, #MPIDR_MT_MASK 38*45711e4eSEdward-JW Yang orr x0, x0, x1 39*45711e4eSEdward-JW Yang ret 40*45711e4eSEdward-JW Yangendfunc plat_mpidr_by_core_pos 41*45711e4eSEdward-JW Yang 42*45711e4eSEdward-JW Yang /* ----------------------------------------------------- 43*45711e4eSEdward-JW Yang * unsigned int plat_my_core_pos(void) 44*45711e4eSEdward-JW Yang * This function uses the plat_arm_calc_core_pos() 45*45711e4eSEdward-JW Yang * definition to get the index of the calling CPU. 46*45711e4eSEdward-JW Yang * ----------------------------------------------------- 47*45711e4eSEdward-JW Yang */ 48*45711e4eSEdward-JW Yangfunc plat_my_core_pos 49*45711e4eSEdward-JW Yang mrs x0, mpidr_el1 50*45711e4eSEdward-JW Yang b plat_mediatek_calc_core_pos 51*45711e4eSEdward-JW Yangendfunc plat_my_core_pos 52*45711e4eSEdward-JW Yang 53*45711e4eSEdward-JW Yang /* ----------------------------------------------------- 54*45711e4eSEdward-JW Yang * int plat_mediatek_calc_core_pos(u_register_t mpidr); 55*45711e4eSEdward-JW Yang * 56*45711e4eSEdward-JW Yang * In ARMv8.2, AFF2 is cluster id, AFF1 is core id and 57*45711e4eSEdward-JW Yang * AFF0 is thread id. There is only one cluster in ARMv8.2 58*45711e4eSEdward-JW Yang * and one thread in current implementation. 59*45711e4eSEdward-JW Yang * 60*45711e4eSEdward-JW Yang * With this function: CorePos = CoreID (AFF1) 61*45711e4eSEdward-JW Yang * we do it with x0 = (x0 >> 8) & 0xff 62*45711e4eSEdward-JW Yang * ----------------------------------------------------- 63*45711e4eSEdward-JW Yang */ 64*45711e4eSEdward-JW Yangfunc plat_mediatek_calc_core_pos 65*45711e4eSEdward-JW Yang b plat_core_pos_by_mpidr 66*45711e4eSEdward-JW Yangendfunc plat_mediatek_calc_core_pos 67*45711e4eSEdward-JW Yang 68*45711e4eSEdward-JW Yang /* ------------------------------------------------------ 69*45711e4eSEdward-JW Yang * int32_t plat_core_pos_by_mpidr(u_register_t mpidr) 70*45711e4eSEdward-JW Yang * 71*45711e4eSEdward-JW Yang * This function implements a part of the critical 72*45711e4eSEdward-JW Yang * interface between the psci generic layer and the 73*45711e4eSEdward-JW Yang * platform that allows the former to query the platform 74*45711e4eSEdward-JW Yang * to convert an MPIDR to a unique linear index. 75*45711e4eSEdward-JW Yang * 76*45711e4eSEdward-JW Yang * Clobbers: x0-x1 77*45711e4eSEdward-JW Yang * ------------------------------------------------------ 78*45711e4eSEdward-JW Yang */ 79*45711e4eSEdward-JW Yangfunc plat_core_pos_by_mpidr 80*45711e4eSEdward-JW Yang mov x1, #MPIDR_AFFLVL_MASK 81*45711e4eSEdward-JW Yang and x0, x1, x0, lsr #MPIDR_AFF1_SHIFT 82*45711e4eSEdward-JW Yang ret 83*45711e4eSEdward-JW Yangendfunc plat_core_pos_by_mpidr 84*45711e4eSEdward-JW Yang 85*45711e4eSEdward-JW Yang /* -------------------------------------------------------- 86*45711e4eSEdward-JW Yang * void platform_mem_init (void); 87*45711e4eSEdward-JW Yang * 88*45711e4eSEdward-JW Yang * Any memory init, relocation to be done before the 89*45711e4eSEdward-JW Yang * platform boots. Called very early in the boot process. 90*45711e4eSEdward-JW Yang * -------------------------------------------------------- 91*45711e4eSEdward-JW Yang */ 92*45711e4eSEdward-JW Yangfunc platform_mem_init 93*45711e4eSEdward-JW Yang ret 94*45711e4eSEdward-JW Yangendfunc platform_mem_init 95*45711e4eSEdward-JW Yang 96*45711e4eSEdward-JW Yangfunc plat_reset_handler 97*45711e4eSEdward-JW Yang#if CONFIG_MTK_MCUSYS 98*45711e4eSEdward-JW Yang mov x10, x30 99*45711e4eSEdward-JW Yang bl plat_my_core_pos 100*45711e4eSEdward-JW Yang mov x30, x10 101*45711e4eSEdward-JW Yang mov w1, #0x1 102*45711e4eSEdward-JW Yang lsl w1, w1, w0 103*45711e4eSEdward-JW Yang ldr x0, =CPC_MCUSYS_CPU_ON_SW_HINT_SET 104*45711e4eSEdward-JW Yang str w1, [x0] 105*45711e4eSEdward-JW Yang dsb sy 106*45711e4eSEdward-JW Yang#endif 107*45711e4eSEdward-JW Yang 108*45711e4eSEdward-JW Yang#if CONFIG_MTK_ECC 109*45711e4eSEdward-JW Yang mov x10, x30 110*45711e4eSEdward-JW Yang /* enable sequence of ecc for cpus */ 111*45711e4eSEdward-JW Yang bl disable_core_ecc 112*45711e4eSEdward-JW Yang bl ft_ecc_clear_per_core 113*45711e4eSEdward-JW Yang bl enable_core_ecc 114*45711e4eSEdward-JW Yang mov x30, x10 115*45711e4eSEdward-JW Yang#endif 116*45711e4eSEdward-JW Yang 117*45711e4eSEdward-JW Yang ret 118*45711e4eSEdward-JW Yangendfunc plat_reset_handler 119