1*127793daSHaojian Zhuang /* 2*127793daSHaojian Zhuang * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved. 3*127793daSHaojian Zhuang * 4*127793daSHaojian Zhuang * SPDX-License-Identifier: BSD-3-Clause 5*127793daSHaojian Zhuang */ 6*127793daSHaojian Zhuang 7*127793daSHaojian Zhuang #include <debug.h> 8*127793daSHaojian Zhuang #include <mmio.h> 9*127793daSHaojian Zhuang #include <hisi_ipc.h> 10*127793daSHaojian Zhuang #include <hisi_pwrc.h> 11*127793daSHaojian Zhuang #include <hisi_sram_map.h> 12*127793daSHaojian Zhuang #include <hi6220_regs_acpu.h> 13*127793daSHaojian Zhuang #include <hi6220_regs_ao.h> 14*127793daSHaojian Zhuang #include <stdarg.h> 15*127793daSHaojian Zhuang #include <stdio.h> 16*127793daSHaojian Zhuang #include <string.h> 17*127793daSHaojian Zhuang #include <platform_def.h> 18*127793daSHaojian Zhuang 19*127793daSHaojian Zhuang #define CLUSTER_CORE_COUNT (4) 20*127793daSHaojian Zhuang #define CLUSTER_CORE_MASK ((1 << CLUSTER_CORE_COUNT) - 1) 21*127793daSHaojian Zhuang 22*127793daSHaojian Zhuang void hisi_pwrc_set_core_bx_addr(unsigned int core, unsigned int cluster, 23*127793daSHaojian Zhuang uintptr_t entry_point) 24*127793daSHaojian Zhuang { 25*127793daSHaojian Zhuang uintptr_t *core_entry = (uintptr_t *)PWRCTRL_ACPU_ASM_D_ARM_PARA_AD; 26*127793daSHaojian Zhuang unsigned int i; 27*127793daSHaojian Zhuang 28*127793daSHaojian Zhuang if (!core_entry) { 29*127793daSHaojian Zhuang INFO("%s: core entry point is null!\n", __func__); 30*127793daSHaojian Zhuang return; 31*127793daSHaojian Zhuang } 32*127793daSHaojian Zhuang 33*127793daSHaojian Zhuang i = cluster * CLUSTER_CORE_COUNT + core; 34*127793daSHaojian Zhuang mmio_write_64((uintptr_t)(core_entry + i), entry_point); 35*127793daSHaojian Zhuang } 36*127793daSHaojian Zhuang 37*127793daSHaojian Zhuang void hisi_pwrc_set_cluster_wfi(unsigned int cluster) 38*127793daSHaojian Zhuang { 39*127793daSHaojian Zhuang unsigned int reg = 0; 40*127793daSHaojian Zhuang 41*127793daSHaojian Zhuang if (cluster == 0) { 42*127793daSHaojian Zhuang reg = mmio_read_32(ACPU_SC_SNOOP_PWD); 43*127793daSHaojian Zhuang reg |= PD_DETECT_START0; 44*127793daSHaojian Zhuang mmio_write_32(ACPU_SC_SNOOP_PWD, reg); 45*127793daSHaojian Zhuang } else if (cluster == 1) { 46*127793daSHaojian Zhuang reg = mmio_read_32(ACPU_SC_SNOOP_PWD); 47*127793daSHaojian Zhuang reg |= PD_DETECT_START1; 48*127793daSHaojian Zhuang mmio_write_32(ACPU_SC_SNOOP_PWD, reg); 49*127793daSHaojian Zhuang } 50*127793daSHaojian Zhuang } 51*127793daSHaojian Zhuang 52*127793daSHaojian Zhuang int hisi_pwrc_setup(void) 53*127793daSHaojian Zhuang { 54*127793daSHaojian Zhuang unsigned int reg, sec_entrypoint; 55*127793daSHaojian Zhuang extern char pm_asm_code[], pm_asm_code_end[]; 56*127793daSHaojian Zhuang extern char v7_asm[], v7_asm_end[]; 57*127793daSHaojian Zhuang 58*127793daSHaojian Zhuang sec_entrypoint = PWRCTRL_ACPU_ASM_CODE_BASE; 59*127793daSHaojian Zhuang mmio_write_32(ACPU_SC_CPUx_RVBARADDR(0), sec_entrypoint >> 2); 60*127793daSHaojian Zhuang mmio_write_32(ACPU_SC_CPUx_RVBARADDR(1), sec_entrypoint >> 2); 61*127793daSHaojian Zhuang mmio_write_32(ACPU_SC_CPUx_RVBARADDR(2), sec_entrypoint >> 2); 62*127793daSHaojian Zhuang mmio_write_32(ACPU_SC_CPUx_RVBARADDR(3), sec_entrypoint >> 2); 63*127793daSHaojian Zhuang mmio_write_32(ACPU_SC_CPUx_RVBARADDR(4), sec_entrypoint >> 2); 64*127793daSHaojian Zhuang mmio_write_32(ACPU_SC_CPUx_RVBARADDR(5), sec_entrypoint >> 2); 65*127793daSHaojian Zhuang mmio_write_32(ACPU_SC_CPUx_RVBARADDR(6), sec_entrypoint >> 2); 66*127793daSHaojian Zhuang mmio_write_32(ACPU_SC_CPUx_RVBARADDR(7), sec_entrypoint >> 2); 67*127793daSHaojian Zhuang 68*127793daSHaojian Zhuang memset((void *)PWRCTRL_ACPU_ASM_SPACE_ADDR, 0, 0x400); 69*127793daSHaojian Zhuang memcpy((void *)PWRCTRL_ACPU_ASM_SPACE_ADDR, (void *)v7_asm, 70*127793daSHaojian Zhuang v7_asm_end - v7_asm); 71*127793daSHaojian Zhuang 72*127793daSHaojian Zhuang memcpy((void *)PWRCTRL_ACPU_ASM_CODE_BASE, (void *)pm_asm_code, 73*127793daSHaojian Zhuang pm_asm_code_end - pm_asm_code); 74*127793daSHaojian Zhuang 75*127793daSHaojian Zhuang reg = mmio_read_32(AO_SC_SYS_CTRL1); 76*127793daSHaojian Zhuang reg |= AO_SC_SYS_CTRL1_REMAP_SRAM_AARM | 77*127793daSHaojian Zhuang AO_SC_SYS_CTRL1_REMAP_SRAM_AARM_MSK; 78*127793daSHaojian Zhuang mmio_write_32(AO_SC_SYS_CTRL1, reg); 79*127793daSHaojian Zhuang 80*127793daSHaojian Zhuang return 0; 81*127793daSHaojian Zhuang } 82