1be92e5a2SBiju Das /* 2*0dae56bbSToshiyuki 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> 15*0dae56bbSToshiyuki 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 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 */ 33*0dae56bbSToshiyuki 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 */ 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 63be92e5a2SBiju Das ERROR("Unhandled External Abort received on 0x%lx at EL3!\n", 64be92e5a2SBiju Das read_mpidr_el1()); 65be92e5a2SBiju Das ERROR(" exception reason=%u syndrome=0x%llx\n", ea_reason, syndrome); 66be92e5a2SBiju Das 67be92e5a2SBiju Das panic(); 68be92e5a2SBiju Das } 69be92e5a2SBiju Das 70be92e5a2SBiju Das #include <drivers/renesas/rcar/console/console.h> 71be92e5a2SBiju Das 72be92e5a2SBiju Das static console_t rcar_boot_console; 73be92e5a2SBiju Das static console_t rcar_runtime_console; 74be92e5a2SBiju Das 75be92e5a2SBiju Das void rcar_console_boot_init(void) 76be92e5a2SBiju Das { 77be92e5a2SBiju Das int ret; 78be92e5a2SBiju Das 79be92e5a2SBiju Das ret = console_rcar_register(0, 0, 0, &rcar_boot_console); 80be92e5a2SBiju Das if (!ret) 81be92e5a2SBiju Das panic(); 82be92e5a2SBiju Das 83be92e5a2SBiju Das console_set_scope(&rcar_boot_console, CONSOLE_FLAG_BOOT); 84be92e5a2SBiju Das } 85be92e5a2SBiju Das 86be92e5a2SBiju Das void rcar_console_boot_end(void) 87be92e5a2SBiju Das { 88be92e5a2SBiju Das } 89be92e5a2SBiju Das 90be92e5a2SBiju Das void rcar_console_runtime_init(void) 91be92e5a2SBiju Das { 92be92e5a2SBiju Das int ret; 93be92e5a2SBiju Das 94be92e5a2SBiju Das ret = console_rcar_register(1, 0, 0, &rcar_runtime_console); 95be92e5a2SBiju Das if (!ret) 96be92e5a2SBiju Das panic(); 97be92e5a2SBiju Das 98be92e5a2SBiju Das console_set_scope(&rcar_boot_console, CONSOLE_FLAG_RUNTIME); 99be92e5a2SBiju Das } 100be92e5a2SBiju Das 101be92e5a2SBiju Das void rcar_console_runtime_end(void) 102be92e5a2SBiju Das { 103be92e5a2SBiju Das } 104