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