/* * gic.S - Secure gic initialisation for stand-alone Linux booting * * Copyright (C) 2013 ARM Limited. All rights reserved. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE.txt file. */ #include "common.S" .text .global gic_secure_init gic_secure_init: /* * Check for the primary CPU to avoid a race on the distributor * registers. */ mrs x0, mpidr_el1 ldr x1, =MPIDR_ID_BITS tst x0, x1 b.ne 1f // secondary CPU ldr x1, =GIC_DIST_BASE // GICD_CTLR mov w0, #3 // EnableGrp0 | EnableGrp1 str w0, [x1] 1: ldr x1, =GIC_DIST_BASE + 0x80 // GICD_IGROUPR mov w0, #~0 // Grp1 interrupts str w0, [x1] b.ne 2f // Only local interrupts for secondary CPUs ldr x2, =GIC_DIST_BASE + 0x04 // GICD_TYPER ldr w3, [x2] ands w3, w3, #0x1f // ITLinesNumber b.eq 2f 1: str w0, [x1, #4]! subs w3, w3, #1 b.ne 1b 2: ldr x1, =GIC_CPU_BASE // GICC_CTLR mov w0, #3 // EnableGrp0 | EnableGrp1 str w0, [x1] mov w0, #1 << 7 // allow NS access to GICC_PMR str w0, [x1, #4] // GICC_PMR ret