xref: /rk3399_ARM-atf/plat/renesas/common/rcar_common.c (revision be92e5a22f83fe5e580b4c60148ec9b150b82c23)
1*be92e5a2SBiju Das /*
2*be92e5a2SBiju Das  * Copyright (c) 2019, Renesas Electronics Corporation. All rights reserved.
3*be92e5a2SBiju Das  *
4*be92e5a2SBiju Das  * SPDX-License-Identifier: BSD-3-Clause
5*be92e5a2SBiju Das  */
6*be92e5a2SBiju Das 
7*be92e5a2SBiju Das #include <assert.h>
8*be92e5a2SBiju Das 
9*be92e5a2SBiju Das #include <arch_helpers.h>
10*be92e5a2SBiju Das #include <drivers/console.h>
11*be92e5a2SBiju Das #include <lib/xlat_tables/xlat_mmu_helpers.h>
12*be92e5a2SBiju Das #include <plat/common/platform.h>
13*be92e5a2SBiju Das 
14*be92e5a2SBiju Das #include <lib/mmio.h>
15*be92e5a2SBiju Das 
16*be92e5a2SBiju Das #define CPG_BASE		0xE6150000
17*be92e5a2SBiju Das #define CPG_MSTPSR3		0x0048
18*be92e5a2SBiju Das #define MSTP318			(1 << 18)
19*be92e5a2SBiju Das #define MSTP319			(1 << 19)
20*be92e5a2SBiju Das #define PMSR			0x5c
21*be92e5a2SBiju Das #define PMSR_L1FAEG		(1U << 31)
22*be92e5a2SBiju Das #define PMSR_PMEL1RX		(1 << 23)
23*be92e5a2SBiju Das #define PMCTLR			0x60
24*be92e5a2SBiju Das #define PMSR_L1IATN		(1U << 31)
25*be92e5a2SBiju Das 
26*be92e5a2SBiju Das static int rcar_pcie_fixup(unsigned int controller)
27*be92e5a2SBiju Das {
28*be92e5a2SBiju Das 	uint32_t rcar_pcie_base[] = { 0xfe011000, 0xee811000 };
29*be92e5a2SBiju Das 	uint32_t addr = rcar_pcie_base[controller];
30*be92e5a2SBiju Das 	uint32_t cpg, pmsr;
31*be92e5a2SBiju Das 	int ret = 0;
32*be92e5a2SBiju Das 
33*be92e5a2SBiju Das 	/* Test if PCIECx is enabled */
34*be92e5a2SBiju Das 	cpg = mmio_read_32(CPG_BASE + CPG_MSTPSR3);
35*be92e5a2SBiju Das 	if (cpg & (MSTP318 << !controller))
36*be92e5a2SBiju Das 		return ret;
37*be92e5a2SBiju Das 
38*be92e5a2SBiju Das 	pmsr = mmio_read_32(addr + PMSR);
39*be92e5a2SBiju Das 
40*be92e5a2SBiju Das 	if ((pmsr & PMSR_PMEL1RX) && ((pmsr & 0x70000) != 0x30000)) {
41*be92e5a2SBiju Das 		/* Fix applicable */
42*be92e5a2SBiju Das 		mmio_write_32(addr + PMCTLR, PMSR_L1IATN);
43*be92e5a2SBiju Das 		while (!(mmio_read_32(addr + PMSR) & PMSR_L1FAEG))
44*be92e5a2SBiju Das 			;
45*be92e5a2SBiju Das 		mmio_write_32(addr + PMSR, PMSR_L1FAEG | PMSR_PMEL1RX);
46*be92e5a2SBiju Das 		ret = 1;
47*be92e5a2SBiju Das 	}
48*be92e5a2SBiju Das 
49*be92e5a2SBiju Das 	return ret;
50*be92e5a2SBiju Das }
51*be92e5a2SBiju Das 
52*be92e5a2SBiju Das /* RAS functions common to AArch64 ARM platforms */
53*be92e5a2SBiju Das void plat_ea_handler(unsigned int ea_reason, uint64_t syndrome, void *cookie,
54*be92e5a2SBiju Das 		void *handle, uint64_t flags)
55*be92e5a2SBiju Das {
56*be92e5a2SBiju Das 	unsigned int fixed = 0;
57*be92e5a2SBiju Das 
58*be92e5a2SBiju Das 	fixed |= rcar_pcie_fixup(0);
59*be92e5a2SBiju Das 	fixed |= rcar_pcie_fixup(1);
60*be92e5a2SBiju Das 
61*be92e5a2SBiju Das 	if (fixed)
62*be92e5a2SBiju Das 		return;
63*be92e5a2SBiju Das 
64*be92e5a2SBiju Das 	ERROR("Unhandled External Abort received on 0x%lx at EL3!\n",
65*be92e5a2SBiju Das 			read_mpidr_el1());
66*be92e5a2SBiju Das 	ERROR(" exception reason=%u syndrome=0x%llx\n", ea_reason, syndrome);
67*be92e5a2SBiju Das 
68*be92e5a2SBiju Das 	panic();
69*be92e5a2SBiju Das }
70*be92e5a2SBiju Das 
71*be92e5a2SBiju Das #include <drivers/renesas/rcar/console/console.h>
72*be92e5a2SBiju Das 
73*be92e5a2SBiju Das static console_t rcar_boot_console;
74*be92e5a2SBiju Das static console_t rcar_runtime_console;
75*be92e5a2SBiju Das 
76*be92e5a2SBiju Das void rcar_console_boot_init(void)
77*be92e5a2SBiju Das {
78*be92e5a2SBiju Das 	int ret;
79*be92e5a2SBiju Das 
80*be92e5a2SBiju Das 	ret = console_rcar_register(0, 0, 0, &rcar_boot_console);
81*be92e5a2SBiju Das 	if (!ret)
82*be92e5a2SBiju Das 		panic();
83*be92e5a2SBiju Das 
84*be92e5a2SBiju Das 	console_set_scope(&rcar_boot_console, CONSOLE_FLAG_BOOT);
85*be92e5a2SBiju Das }
86*be92e5a2SBiju Das 
87*be92e5a2SBiju Das void rcar_console_boot_end(void)
88*be92e5a2SBiju Das {
89*be92e5a2SBiju Das }
90*be92e5a2SBiju Das 
91*be92e5a2SBiju Das void rcar_console_runtime_init(void)
92*be92e5a2SBiju Das {
93*be92e5a2SBiju Das 	int ret;
94*be92e5a2SBiju Das 
95*be92e5a2SBiju Das 	ret = console_rcar_register(1, 0, 0, &rcar_runtime_console);
96*be92e5a2SBiju Das 	if (!ret)
97*be92e5a2SBiju Das 		panic();
98*be92e5a2SBiju Das 
99*be92e5a2SBiju Das 	console_set_scope(&rcar_boot_console, CONSOLE_FLAG_RUNTIME);
100*be92e5a2SBiju Das }
101*be92e5a2SBiju Das 
102*be92e5a2SBiju Das void rcar_console_runtime_end(void)
103*be92e5a2SBiju Das {
104*be92e5a2SBiju Das }
105