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