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