xref: /rk3399_ARM-atf/plat/qti/msm8916/msm8916_config.c (revision 840831b2e0ad48517b8e9dd2ab216b3411e5d3e0)
1*840831b2SStephan Gerhold /*
2*840831b2SStephan Gerhold  * Copyright (c) 2021-2023, Stephan Gerhold <stephan@gerhold.net>
3*840831b2SStephan Gerhold  *
4*840831b2SStephan Gerhold  * SPDX-License-Identifier: BSD-3-Clause
5*840831b2SStephan Gerhold  */
6*840831b2SStephan Gerhold 
7*840831b2SStephan Gerhold #include <assert.h>
8*840831b2SStephan Gerhold 
9*840831b2SStephan Gerhold #include <arch.h>
10*840831b2SStephan Gerhold #include <lib/mmio.h>
11*840831b2SStephan Gerhold 
12*840831b2SStephan Gerhold #include "msm8916_config.h"
13*840831b2SStephan Gerhold #include "msm8916_gicv2.h"
14*840831b2SStephan Gerhold #include <msm8916_mmap.h>
15*840831b2SStephan Gerhold #include <platform_def.h>
16*840831b2SStephan Gerhold 
17*840831b2SStephan Gerhold static void msm8916_configure_timer(void)
18*840831b2SStephan Gerhold {
19*840831b2SStephan Gerhold 	/* Set timer frequency */
20*840831b2SStephan Gerhold 	mmio_write_32(APCS_QTMR + CNTCTLBASE_CNTFRQ, PLAT_SYSCNT_FREQ);
21*840831b2SStephan Gerhold 
22*840831b2SStephan Gerhold 	/* Make all timer frames available to non-secure world */
23*840831b2SStephan Gerhold 	mmio_write_32(APCS_QTMR + CNTNSAR, GENMASK_32(7, 0));
24*840831b2SStephan Gerhold }
25*840831b2SStephan Gerhold 
26*840831b2SStephan Gerhold /*
27*840831b2SStephan Gerhold  * The APCS register regions always start with a SECURE register that should
28*840831b2SStephan Gerhold  * be cleared to 0 to only allow secure access. Since BL31 handles most of
29*840831b2SStephan Gerhold  * the CPU power management, most of them can be cleared to secure access only.
30*840831b2SStephan Gerhold  */
31*840831b2SStephan Gerhold #define APCS_GLB_SECURE_STS_NS		BIT_32(0)
32*840831b2SStephan Gerhold #define APCS_GLB_SECURE_PWR_NS		BIT_32(1)
33*840831b2SStephan Gerhold #define APCS_BOOT_START_ADDR_SEC	(APCS_CFG + 0x04)
34*840831b2SStephan Gerhold #define REMAP_EN			BIT_32(0)
35*840831b2SStephan Gerhold #define APCS_AA64NAA32_REG		(APCS_CFG + 0x0c)
36*840831b2SStephan Gerhold 
37*840831b2SStephan Gerhold static void msm8916_configure_cpu_pm(void)
38*840831b2SStephan Gerhold {
39*840831b2SStephan Gerhold 	unsigned int cpu;
40*840831b2SStephan Gerhold 
41*840831b2SStephan Gerhold 	/* Disallow non-secure access to boot remapper / TCM registers */
42*840831b2SStephan Gerhold 	mmio_write_32(APCS_CFG, 0);
43*840831b2SStephan Gerhold 
44*840831b2SStephan Gerhold 	/*
45*840831b2SStephan Gerhold 	 * Disallow non-secure access to power management registers.
46*840831b2SStephan Gerhold 	 * However, allow STS and PWR since those also seem to control access
47*840831b2SStephan Gerhold 	 * to CPU frequency related registers (e.g. APCS_CMD_RCGR). If these
48*840831b2SStephan Gerhold 	 * bits are not set, CPU frequency control fails in the non-secure world.
49*840831b2SStephan Gerhold 	 */
50*840831b2SStephan Gerhold 	mmio_write_32(APCS_GLB, APCS_GLB_SECURE_STS_NS | APCS_GLB_SECURE_PWR_NS);
51*840831b2SStephan Gerhold 
52*840831b2SStephan Gerhold 	/* Disallow non-secure access to L2 SAW2 */
53*840831b2SStephan Gerhold 	mmio_write_32(APCS_L2_SAW2, 0);
54*840831b2SStephan Gerhold 
55*840831b2SStephan Gerhold 	/* Disallow non-secure access to CPU ACS and SAW2 */
56*840831b2SStephan Gerhold 	for (cpu = 0; cpu < PLATFORM_CORE_COUNT; cpu++) {
57*840831b2SStephan Gerhold 		mmio_write_32(APCS_ALIAS_ACS(cpu), 0);
58*840831b2SStephan Gerhold 		mmio_write_32(APCS_ALIAS_SAW2(cpu), 0);
59*840831b2SStephan Gerhold 	}
60*840831b2SStephan Gerhold 
61*840831b2SStephan Gerhold 	/* Make sure all further warm boots end up in BL31 and aarch64 state */
62*840831b2SStephan Gerhold 	CASSERT((BL31_BASE & 0xffff) == 0, assert_bl31_base_64k_aligned);
63*840831b2SStephan Gerhold 	mmio_write_32(APCS_BOOT_START_ADDR_SEC, BL31_BASE | REMAP_EN);
64*840831b2SStephan Gerhold 	mmio_write_32(APCS_AA64NAA32_REG, 1);
65*840831b2SStephan Gerhold }
66*840831b2SStephan Gerhold 
67*840831b2SStephan Gerhold /*
68*840831b2SStephan Gerhold  * MSM8916 has a special "interrupt aggregation logic" in the APPS SMMU,
69*840831b2SStephan Gerhold  * which allows routing context bank interrupts to one of 3 interrupt numbers
70*840831b2SStephan Gerhold  * ("TZ/HYP/NS"). Route all interrupts to the non-secure interrupt number
71*840831b2SStephan Gerhold  * by default to avoid special setup on the non-secure side.
72*840831b2SStephan Gerhold  */
73*840831b2SStephan Gerhold #define CLK_OFF					BIT_32(31)
74*840831b2SStephan Gerhold #define GCC_SMMU_CFG_CBCR			(GCC_BASE + 0x12038)
75*840831b2SStephan Gerhold #define GCC_APCS_SMMU_CLOCK_BRANCH_ENA_VOTE	(GCC_BASE + 0x4500c)
76*840831b2SStephan Gerhold #define SMMU_CFG_CLK_ENA			BIT_32(12)
77*840831b2SStephan Gerhold #define APPS_SMMU_INTR_SEL_NS			(APPS_SMMU_QCOM + 0x2000)
78*840831b2SStephan Gerhold #define APPS_SMMU_INTR_SEL_NS_EN_ALL		U(0xffffffff)
79*840831b2SStephan Gerhold 
80*840831b2SStephan Gerhold static void msm8916_configure_smmu(void)
81*840831b2SStephan Gerhold {
82*840831b2SStephan Gerhold 	/* Enable SMMU configuration clock to enable register access */
83*840831b2SStephan Gerhold 	mmio_setbits_32(GCC_APCS_SMMU_CLOCK_BRANCH_ENA_VOTE, SMMU_CFG_CLK_ENA);
84*840831b2SStephan Gerhold 	while (mmio_read_32(GCC_SMMU_CFG_CBCR) & CLK_OFF)
85*840831b2SStephan Gerhold 		;
86*840831b2SStephan Gerhold 
87*840831b2SStephan Gerhold 	/* Route all context bank interrupts to non-secure interrupt */
88*840831b2SStephan Gerhold 	mmio_write_32(APPS_SMMU_INTR_SEL_NS, APPS_SMMU_INTR_SEL_NS_EN_ALL);
89*840831b2SStephan Gerhold 
90*840831b2SStephan Gerhold 	/* Disable configuration clock again */
91*840831b2SStephan Gerhold 	mmio_clrbits_32(GCC_APCS_SMMU_CLOCK_BRANCH_ENA_VOTE, SMMU_CFG_CLK_ENA);
92*840831b2SStephan Gerhold }
93*840831b2SStephan Gerhold 
94*840831b2SStephan Gerhold void msm8916_configure(void)
95*840831b2SStephan Gerhold {
96*840831b2SStephan Gerhold 	msm8916_gicv2_configure();
97*840831b2SStephan Gerhold 	msm8916_configure_timer();
98*840831b2SStephan Gerhold 	msm8916_configure_cpu_pm();
99*840831b2SStephan Gerhold 	msm8916_configure_smmu();
100*840831b2SStephan Gerhold }
101