1127793daSHaojian Zhuang /* 2127793daSHaojian Zhuang * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved. 3127793daSHaojian Zhuang * 4127793daSHaojian Zhuang * SPDX-License-Identifier: BSD-3-Clause 5127793daSHaojian Zhuang */ 6127793daSHaojian Zhuang 7127793daSHaojian Zhuang #include <debug.h> 8127793daSHaojian Zhuang #include <mmio.h> 9ee1ebbd1SIsla Mitchell 10ee1ebbd1SIsla Mitchell #include <hi6220_regs_acpu.h> 11ee1ebbd1SIsla Mitchell #include <hi6220_regs_ao.h> 12127793daSHaojian Zhuang #include <hisi_ipc.h> 13127793daSHaojian Zhuang #include <hisi_pwrc.h> 14127793daSHaojian Zhuang #include <hisi_sram_map.h> 15ee1ebbd1SIsla Mitchell 16127793daSHaojian Zhuang #include <stdarg.h> 17127793daSHaojian Zhuang #include <stdio.h> 18127793daSHaojian Zhuang #include <string.h> 19127793daSHaojian Zhuang #include <platform_def.h> 20127793daSHaojian Zhuang 21127793daSHaojian Zhuang #define CLUSTER_CORE_COUNT (4) 22127793daSHaojian Zhuang #define CLUSTER_CORE_MASK ((1 << CLUSTER_CORE_COUNT) - 1) 23127793daSHaojian Zhuang 24127793daSHaojian Zhuang void hisi_pwrc_set_core_bx_addr(unsigned int core, unsigned int cluster, 25127793daSHaojian Zhuang uintptr_t entry_point) 26127793daSHaojian Zhuang { 27127793daSHaojian Zhuang uintptr_t *core_entry = (uintptr_t *)PWRCTRL_ACPU_ASM_D_ARM_PARA_AD; 28127793daSHaojian Zhuang unsigned int i; 29127793daSHaojian Zhuang 30127793daSHaojian Zhuang if (!core_entry) { 31127793daSHaojian Zhuang INFO("%s: core entry point is null!\n", __func__); 32127793daSHaojian Zhuang return; 33127793daSHaojian Zhuang } 34127793daSHaojian Zhuang 35127793daSHaojian Zhuang i = cluster * CLUSTER_CORE_COUNT + core; 36127793daSHaojian Zhuang mmio_write_64((uintptr_t)(core_entry + i), entry_point); 37127793daSHaojian Zhuang } 38127793daSHaojian Zhuang 39127793daSHaojian Zhuang void hisi_pwrc_set_cluster_wfi(unsigned int cluster) 40127793daSHaojian Zhuang { 41127793daSHaojian Zhuang unsigned int reg = 0; 42127793daSHaojian Zhuang 43127793daSHaojian Zhuang if (cluster == 0) { 44127793daSHaojian Zhuang reg = mmio_read_32(ACPU_SC_SNOOP_PWD); 45127793daSHaojian Zhuang reg |= PD_DETECT_START0; 46127793daSHaojian Zhuang mmio_write_32(ACPU_SC_SNOOP_PWD, reg); 47127793daSHaojian Zhuang } else if (cluster == 1) { 48127793daSHaojian Zhuang reg = mmio_read_32(ACPU_SC_SNOOP_PWD); 49127793daSHaojian Zhuang reg |= PD_DETECT_START1; 50127793daSHaojian Zhuang mmio_write_32(ACPU_SC_SNOOP_PWD, reg); 51127793daSHaojian Zhuang } 52127793daSHaojian Zhuang } 53127793daSHaojian Zhuang 54127793daSHaojian Zhuang int hisi_pwrc_setup(void) 55127793daSHaojian Zhuang { 56127793daSHaojian Zhuang unsigned int reg, sec_entrypoint; 57127793daSHaojian Zhuang extern char pm_asm_code[], pm_asm_code_end[]; 58127793daSHaojian Zhuang extern char v7_asm[], v7_asm_end[]; 59127793daSHaojian Zhuang 60127793daSHaojian Zhuang sec_entrypoint = PWRCTRL_ACPU_ASM_CODE_BASE; 61127793daSHaojian Zhuang mmio_write_32(ACPU_SC_CPUx_RVBARADDR(0), sec_entrypoint >> 2); 62127793daSHaojian Zhuang mmio_write_32(ACPU_SC_CPUx_RVBARADDR(1), sec_entrypoint >> 2); 63127793daSHaojian Zhuang mmio_write_32(ACPU_SC_CPUx_RVBARADDR(2), sec_entrypoint >> 2); 64127793daSHaojian Zhuang mmio_write_32(ACPU_SC_CPUx_RVBARADDR(3), sec_entrypoint >> 2); 65127793daSHaojian Zhuang mmio_write_32(ACPU_SC_CPUx_RVBARADDR(4), sec_entrypoint >> 2); 66127793daSHaojian Zhuang mmio_write_32(ACPU_SC_CPUx_RVBARADDR(5), sec_entrypoint >> 2); 67127793daSHaojian Zhuang mmio_write_32(ACPU_SC_CPUx_RVBARADDR(6), sec_entrypoint >> 2); 68127793daSHaojian Zhuang mmio_write_32(ACPU_SC_CPUx_RVBARADDR(7), sec_entrypoint >> 2); 69127793daSHaojian Zhuang 70127793daSHaojian Zhuang memset((void *)PWRCTRL_ACPU_ASM_SPACE_ADDR, 0, 0x400); 71127793daSHaojian Zhuang memcpy((void *)PWRCTRL_ACPU_ASM_SPACE_ADDR, (void *)v7_asm, 72127793daSHaojian Zhuang v7_asm_end - v7_asm); 73127793daSHaojian Zhuang 74127793daSHaojian Zhuang memcpy((void *)PWRCTRL_ACPU_ASM_CODE_BASE, (void *)pm_asm_code, 75127793daSHaojian Zhuang pm_asm_code_end - pm_asm_code); 76127793daSHaojian Zhuang 77127793daSHaojian Zhuang reg = mmio_read_32(AO_SC_SYS_CTRL1); 78*3506ff11SLeo Yan /* Remap SRAM address for ACPU */ 79127793daSHaojian Zhuang reg |= AO_SC_SYS_CTRL1_REMAP_SRAM_AARM | 80127793daSHaojian Zhuang AO_SC_SYS_CTRL1_REMAP_SRAM_AARM_MSK; 81*3506ff11SLeo Yan 82*3506ff11SLeo Yan /* Enable reset signal for watchdog */ 83*3506ff11SLeo Yan reg |= AO_SC_SYS_CTRL1_AARM_WD_RST_CFG | 84*3506ff11SLeo Yan AO_SC_SYS_CTRL1_AARM_WD_RST_CFG_MSK; 85127793daSHaojian Zhuang mmio_write_32(AO_SC_SYS_CTRL1, reg); 86127793daSHaojian Zhuang 87127793daSHaojian Zhuang return 0; 88127793daSHaojian Zhuang } 89