1*a2847172SGrzegorz Jaszczyk/* 2*a2847172SGrzegorz Jaszczyk * Copyright (C) 2018 Marvell International Ltd. 3*a2847172SGrzegorz Jaszczyk * 4*a2847172SGrzegorz Jaszczyk * SPDX-License-Identifier: BSD-3-Clause 5*a2847172SGrzegorz Jaszczyk * https://spdx.org/licenses 6*a2847172SGrzegorz Jaszczyk */ 7*a2847172SGrzegorz Jaszczyk 8*a2847172SGrzegorz Jaszczyk#ifndef MARVELL_MACROS_S 9*a2847172SGrzegorz Jaszczyk#define MARVELL_MACROS_S 10*a2847172SGrzegorz Jaszczyk 11*a2847172SGrzegorz Jaszczyk#include <drivers/arm/cci.h> 12*a2847172SGrzegorz Jaszczyk#include <drivers/arm/gic_common.h> 13*a2847172SGrzegorz Jaszczyk#include <drivers/arm/gicv2.h> 14*a2847172SGrzegorz Jaszczyk#include <drivers/arm/gicv3.h> 15*a2847172SGrzegorz Jaszczyk#include <platform_def.h> 16*a2847172SGrzegorz Jaszczyk 17*a2847172SGrzegorz Jaszczyk/* 18*a2847172SGrzegorz Jaszczyk * These Macros are required by ATF 19*a2847172SGrzegorz Jaszczyk */ 20*a2847172SGrzegorz Jaszczyk 21*a2847172SGrzegorz Jaszczyk.section .rodata.gic_reg_name, "aS" 22*a2847172SGrzegorz Jaszczyk/* Applicable only to GICv2 and GICv3 with SRE disabled (legacy mode) */ 23*a2847172SGrzegorz Jaszczykgicc_regs: 24*a2847172SGrzegorz Jaszczyk .asciz "gicc_hppir", "gicc_ahppir", "gicc_ctlr", "" 25*a2847172SGrzegorz Jaszczyk 26*a2847172SGrzegorz Jaszczyk#ifdef USE_CCI 27*a2847172SGrzegorz Jaszczyk/* Applicable only to GICv3 with SRE enabled */ 28*a2847172SGrzegorz Jaszczykicc_regs: 29*a2847172SGrzegorz Jaszczyk .asciz "icc_hppir0_el1", "icc_hppir1_el1", "icc_ctlr_el3", "" 30*a2847172SGrzegorz Jaszczyk#endif 31*a2847172SGrzegorz Jaszczyk/* Registers common to both GICv2 and GICv3 */ 32*a2847172SGrzegorz Jaszczykgicd_pend_reg: 33*a2847172SGrzegorz Jaszczyk .asciz "gicd_ispendr regs (Offsets 0x200 - 0x278)\n" \ 34*a2847172SGrzegorz Jaszczyk " Offset:\t\t\tvalue\n" 35*a2847172SGrzegorz Jaszczyknewline: 36*a2847172SGrzegorz Jaszczyk .asciz "\n" 37*a2847172SGrzegorz Jaszczykspacer: 38*a2847172SGrzegorz Jaszczyk .asciz ":\t\t0x" 39*a2847172SGrzegorz Jaszczyk 40*a2847172SGrzegorz Jaszczyk /* --------------------------------------------- 41*a2847172SGrzegorz Jaszczyk * The below utility macro prints out relevant GIC 42*a2847172SGrzegorz Jaszczyk * registers whenever an unhandled exception is 43*a2847172SGrzegorz Jaszczyk * taken in BL31 on ARM standard platforms. 44*a2847172SGrzegorz Jaszczyk * Expects: GICD base in x16, GICC base in x17 45*a2847172SGrzegorz Jaszczyk * Clobbers: x0 - x10, sp 46*a2847172SGrzegorz Jaszczyk * --------------------------------------------- 47*a2847172SGrzegorz Jaszczyk */ 48*a2847172SGrzegorz Jaszczyk .macro marvell_print_gic_regs 49*a2847172SGrzegorz Jaszczyk /* Check for GICv3 system register access */ 50*a2847172SGrzegorz Jaszczyk mrs x7, id_aa64pfr0_el1 51*a2847172SGrzegorz Jaszczyk ubfx x7, x7, #ID_AA64PFR0_GIC_SHIFT, #ID_AA64PFR0_GIC_WIDTH 52*a2847172SGrzegorz Jaszczyk cmp x7, #1 53*a2847172SGrzegorz Jaszczyk b.ne print_gicv2 54*a2847172SGrzegorz Jaszczyk 55*a2847172SGrzegorz Jaszczyk /* Check for SRE enable */ 56*a2847172SGrzegorz Jaszczyk mrs x8, ICC_SRE_EL3 57*a2847172SGrzegorz Jaszczyk tst x8, #ICC_SRE_SRE_BIT 58*a2847172SGrzegorz Jaszczyk b.eq print_gicv2 59*a2847172SGrzegorz Jaszczyk 60*a2847172SGrzegorz Jaszczyk#ifdef USE_CCI 61*a2847172SGrzegorz Jaszczyk /* Load the icc reg list to x6 */ 62*a2847172SGrzegorz Jaszczyk adr x6, icc_regs 63*a2847172SGrzegorz Jaszczyk /* Load the icc regs to gp regs used by str_in_crash_buf_print */ 64*a2847172SGrzegorz Jaszczyk mrs x8, ICC_HPPIR0_EL1 65*a2847172SGrzegorz Jaszczyk mrs x9, ICC_HPPIR1_EL1 66*a2847172SGrzegorz Jaszczyk mrs x10, ICC_CTLR_EL3 67*a2847172SGrzegorz Jaszczyk /* Store to the crash buf and print to console */ 68*a2847172SGrzegorz Jaszczyk bl str_in_crash_buf_print 69*a2847172SGrzegorz Jaszczyk#endif 70*a2847172SGrzegorz Jaszczyk b print_gic_common 71*a2847172SGrzegorz Jaszczyk 72*a2847172SGrzegorz Jaszczykprint_gicv2: 73*a2847172SGrzegorz Jaszczyk /* Load the gicc reg list to x6 */ 74*a2847172SGrzegorz Jaszczyk adr x6, gicc_regs 75*a2847172SGrzegorz Jaszczyk /* Load the gicc regs to gp regs used by str_in_crash_buf_print */ 76*a2847172SGrzegorz Jaszczyk ldr w8, [x17, #GICC_HPPIR] 77*a2847172SGrzegorz Jaszczyk ldr w9, [x17, #GICC_AHPPIR] 78*a2847172SGrzegorz Jaszczyk ldr w10, [x17, #GICC_CTLR] 79*a2847172SGrzegorz Jaszczyk /* Store to the crash buf and print to console */ 80*a2847172SGrzegorz Jaszczyk bl str_in_crash_buf_print 81*a2847172SGrzegorz Jaszczyk 82*a2847172SGrzegorz Jaszczykprint_gic_common: 83*a2847172SGrzegorz Jaszczyk /* Print the GICD_ISPENDR regs */ 84*a2847172SGrzegorz Jaszczyk add x7, x16, #GICD_ISPENDR 85*a2847172SGrzegorz Jaszczyk adr x4, gicd_pend_reg 86*a2847172SGrzegorz Jaszczyk bl asm_print_str 87*a2847172SGrzegorz Jaszczykgicd_ispendr_loop: 88*a2847172SGrzegorz Jaszczyk sub x4, x7, x16 89*a2847172SGrzegorz Jaszczyk cmp x4, #0x280 90*a2847172SGrzegorz Jaszczyk b.eq exit_print_gic_regs 91*a2847172SGrzegorz Jaszczyk bl asm_print_hex 92*a2847172SGrzegorz Jaszczyk 93*a2847172SGrzegorz Jaszczyk adr x4, spacer 94*a2847172SGrzegorz Jaszczyk bl asm_print_str 95*a2847172SGrzegorz Jaszczyk 96*a2847172SGrzegorz Jaszczyk ldr x4, [x7], #8 97*a2847172SGrzegorz Jaszczyk bl asm_print_hex 98*a2847172SGrzegorz Jaszczyk 99*a2847172SGrzegorz Jaszczyk adr x4, newline 100*a2847172SGrzegorz Jaszczyk bl asm_print_str 101*a2847172SGrzegorz Jaszczyk b gicd_ispendr_loop 102*a2847172SGrzegorz Jaszczykexit_print_gic_regs: 103*a2847172SGrzegorz Jaszczyk .endm 104*a2847172SGrzegorz Jaszczyk 105*a2847172SGrzegorz Jaszczyk 106*a2847172SGrzegorz Jaszczyk.section .rodata.cci_reg_name, "aS" 107*a2847172SGrzegorz Jaszczykcci_iface_regs: 108*a2847172SGrzegorz Jaszczyk .asciz "cci_snoop_ctrl_cluster0", "cci_snoop_ctrl_cluster1" , "" 109*a2847172SGrzegorz Jaszczyk 110*a2847172SGrzegorz Jaszczyk /* ------------------------------------------------ 111*a2847172SGrzegorz Jaszczyk * The below required platform porting macro prints 112*a2847172SGrzegorz Jaszczyk * out relevant interconnect registers whenever an 113*a2847172SGrzegorz Jaszczyk * unhandled exception is taken in BL31. 114*a2847172SGrzegorz Jaszczyk * Clobbers: x0 - x9, sp 115*a2847172SGrzegorz Jaszczyk * ------------------------------------------------ 116*a2847172SGrzegorz Jaszczyk */ 117*a2847172SGrzegorz Jaszczyk .macro print_cci_regs 118*a2847172SGrzegorz Jaszczyk#ifdef USE_CCI 119*a2847172SGrzegorz Jaszczyk adr x6, cci_iface_regs 120*a2847172SGrzegorz Jaszczyk /* Store in x7 the base address of the first interface */ 121*a2847172SGrzegorz Jaszczyk mov_imm x7, (PLAT_MARVELL_CCI_BASE + SLAVE_IFACE_OFFSET( \ 122*a2847172SGrzegorz Jaszczyk PLAT_MARVELL_CCI_CLUSTER0_SL_IFACE_IX)) 123*a2847172SGrzegorz Jaszczyk ldr w8, [x7, #SNOOP_CTRL_REG] 124*a2847172SGrzegorz Jaszczyk /* Store in x7 the base address of the second interface */ 125*a2847172SGrzegorz Jaszczyk mov_imm x7, (PLAT_MARVELL_CCI_BASE + SLAVE_IFACE_OFFSET( \ 126*a2847172SGrzegorz Jaszczyk PLAT_MARVELL_CCI_CLUSTER1_SL_IFACE_IX)) 127*a2847172SGrzegorz Jaszczyk ldr w9, [x7, #SNOOP_CTRL_REG] 128*a2847172SGrzegorz Jaszczyk /* Store to the crash buf and print to console */ 129*a2847172SGrzegorz Jaszczyk bl str_in_crash_buf_print 130*a2847172SGrzegorz Jaszczyk#endif 131*a2847172SGrzegorz Jaszczyk .endm 132*a2847172SGrzegorz Jaszczyk 133*a2847172SGrzegorz Jaszczyk 134*a2847172SGrzegorz Jaszczyk#endif /* MARVELL_MACROS_S */ 135