xref: /rk3399_ARM-atf/plat/hisilicon/hikey/hisi_pwrc.c (revision 127793daba1831044fd0269931c4ea23bc378ab0)
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