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