drivers/gic: Remove unnecessary code

On AArch64 platforms, GIC initialization is generally the job of Trusted
Firmware and shouldn't be necessary in coreboot. Only the ancient T210
platform (which was started before we had decided on using Trusted
Firmware) calls this code, and even there they have a comment wondering
"do we still need this?". I'm just gonna assume (without testing because
that board is ancient and I'm lazy) that they don't, and that the TF GIC
initialization[1] is sufficient here. Remove this obsolete driver.

[1] https://review.trustedfirmware.org/plugins/gitiles/TF-A/trusted-firmware-a/+/3ff448/plat/nvidia/tegra/soc/t210/plat_setup.c#259

Signed-off-by: Julius Werner <jwerner@chromium.org>
Change-Id: I3e9d90039dd27cb3a13f830ba21fc5cc7a70abe2
Reviewed-on: https://review.coreboot.org/c/coreboot/+/57818
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Furquan Shaikh <furquan@google.com>
This commit is contained in:
Julius Werner 2021-09-21 17:53:09 -07:00
parent ee760b4be8
commit b5e7bd2a58
9 changed files with 0 additions and 260 deletions

View File

@ -1,4 +0,0 @@
config GIC
def_bool n
help
This option enables GIC support, the ARM generic interrupt controller.

View File

@ -1 +0,0 @@
ramstage-$(CONFIG_GIC) += gic.c

View File

@ -1,148 +0,0 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#include <arch/cpu.h>
#include <device/mmio.h>
#include <console/console.h>
#include <gic.h>
#include <stddef.h>
#include "gic.h"
enum {
ENABLE_GRP0 = 0x1 << 0,
ENABLE_GRP1 = 0x1 << 1,
FIQ_BYP_DIS_GRP0 = 0x1 << 5,
IRQ_BYP_DIS_GRP0 = 0x1 << 6,
FIQ_BYP_DIS_GRP1 = 0x1 << 7,
IRQ_BYP_DIS_GRP1 = 0x1 << 8,
};
struct gic {
struct gicd_mmio *gicd;
struct gicc_mmio *gicc;
size_t num_interrupts;
unsigned int version;
unsigned int security_extensions;
};
static struct gic *gic_get(void)
{
static struct gic gic;
if (gic.gicd == NULL) {
uint32_t typer;
gic.gicd = gicd_base();
gic.gicc = gicc_base();
typer = read32(&gic.gicd->typer);
gic.num_interrupts = 32 * ((typer & 0x1f) + 1);
gic.security_extensions = !!(typer & (1 << 10));
gic.version = (read32(&gic.gicd->icpidr2) & 0xf0) >> 4;
printk(BIOS_DEBUG, "GICv%d - %zu ints %s GICD=%p GICC=%p\n",
gic.version, gic.num_interrupts,
gic.security_extensions ? "SecExtn" : "",
gic.gicd, gic.gicc);
}
return &gic;
}
static inline uint32_t gic_read(uint32_t *base)
{
return read32(base);
}
static inline void gic_write(uint32_t *base, uint32_t val)
{
write32(base, val);
}
static void gic_write_regs(uint32_t *base, size_t num_regs, uint32_t val)
{
size_t i;
for (i = 0; i < num_regs; i++)
gic_write(base++, val);
}
static void gic_write_banked_regs(uint32_t *base, size_t interrupts_per_reg,
uint32_t val)
{
/* 1st 32 interrupts are banked per CPU. */
gic_write_regs(base, 32 / interrupts_per_reg, val);
}
void gic_init(void)
{
struct gic *gic;
struct gicd_mmio *gicd;
struct gicc_mmio *gicc;
uint32_t cpu_mask;
gic = gic_get();
gicd = gic->gicd;
gicc = gic->gicc;
/* Enable Group 0 and Group 1 in GICD -- banked regs. */
gic_write(&gicd->ctlr, ENABLE_GRP0 | ENABLE_GRP1);
/* Enable Group 0 and Group 1 in GICC and enable all priroity levels. */
gic_write(&gicc->ctlr, ENABLE_GRP0 | ENABLE_GRP1);
gic_write(&gicc->pmr, 1 << 7);
cpu_mask = 1 << smp_processor_id();
cpu_mask |= cpu_mask << 8;
cpu_mask |= cpu_mask << 16;
/* Only write banked registers for secondary CPUs. */
if (smp_processor_id()) {
gic_write_banked_regs(&gicd->itargetsr[0], 4, cpu_mask);
/* Put interrupts into Group 1. */
gic_write_banked_regs(&gicd->igroupr[0], 32, ~0x0);
/* Allow Non-secure access to everything. */
gic_write_banked_regs(&gicd->nsacr[0], 16, ~0x0);
return;
}
/* All interrupts routed to processors that execute this function. */
gic_write_regs(&gicd->itargetsr[0], gic->num_interrupts / 4, cpu_mask);
/* Put all interrupts into Gropup 1. */
gic_write_regs(&gicd->igroupr[0], gic->num_interrupts / 32, ~0x0);
/* Allow Non-secure access to everything. */
gic_write_regs(&gicd->nsacr[0], gic->num_interrupts / 16, ~0x0);
}
void gic_disable(void)
{
struct gic *gic;
struct gicc_mmio *gicc;
gic = gic_get();
gicc = gic->gicc;
/* Disable secure, non-secure interrupts. */
uint32_t val = gic_read(&gicc->ctlr);
val &= ~(ENABLE_GRP0 | ENABLE_GRP1);
/*
* Enable the IRQ/FIQ BypassDisable bits to bypass the IRQs.
* So the CPU can wake up from power gating state when the GIC
* was disabled.
*/
val |= FIQ_BYP_DIS_GRP0 | IRQ_BYP_DIS_GRP0 |
FIQ_BYP_DIS_GRP1 | IRQ_BYP_DIS_GRP1;
gic_write(&gicc->ctlr, val);
}
void gic_enable(void)
{
struct gic *gic;
struct gicc_mmio *gicc;
gic = gic_get();
gicc = gic->gicc;
/* Enable secure, non-secure interrupts. */
uint32_t val = gic_read(&gicc->ctlr);
val |= (ENABLE_GRP0 | ENABLE_GRP1);
gic_write(&gicc->ctlr, val);
}

View File

@ -1,61 +0,0 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#ifndef DRIVERS_GIC_H
#define DRIVERS_GIC_H
#include <stdint.h>
#define NR(start, end) (((end) - (start)) / sizeof(uint32_t))
struct gicd_mmio {
uint32_t ctlr; /* 0x000 - 0x003 */
uint32_t typer; /* 0x004 - 0x007 */
uint32_t iidr; /* 0x008 - 0x00b */
uint32_t reserved_1[NR(0xc, 0x80)]; /* 0x00c - 0x07f */
uint32_t igroupr[NR(0x80, 0x100)]; /* 0x080 - 0x0ff */
uint32_t isenabler[NR(0x100, 0x180)]; /* 0x100 - 0x17f */
uint32_t icenabler[NR(0x180, 0x200)]; /* 0x180 - 0x1ff */
uint32_t ispendr[NR(0x200, 0x280)]; /* 0x200 - 0x27f */
uint32_t icpendr[NR(0x280, 0x300)]; /* 0x280 - 0x2ff */
uint32_t isactiver[NR(0x300, 0x380)]; /* 0x300 - 0x37f */
uint32_t icactiver[NR(0x380, 0x400)]; /* 0x380 - 0x3ff */
uint32_t ipriorityr[NR(0x400, 0x7fc)]; /* 0x400 - 0x7fb */
uint32_t reserved_2[NR(0x7fc, 0x800)]; /* 0x7fc - 0x7ff */
uint32_t itargetsr[NR(0x800, 0xbfc)]; /* 0x800 - 0xbfb */
uint32_t reserved_3[NR(0xbfc, 0xc00)]; /* 0xbfc - 0x2ff */
uint32_t icfgr[NR(0xc00, 0xd00)]; /* 0xc00 - 0xcff */
uint32_t reserved_4[NR(0xd00, 0xe00)]; /* 0xd00 - 0xdff */
uint32_t nsacr[NR(0xe00, 0xf00)]; /* 0xe00 - 0xeff */
uint32_t sgir; /* 0xf00 - 0xf03 */
uint32_t reserved_5[NR(0xf04, 0xf10)]; /* 0xf04 - 0xf0f */
uint32_t cpendsgir[NR(0xf10, 0xf20)]; /* 0xf10 - 0xf1f */
uint32_t spendsgir[NR(0xf20, 0xf30)]; /* 0xf20 - 0xf2f */
uint32_t reserved_6[NR(0xf30, 0xfe8)]; /* 0xf30 - 0xfe7 */
uint32_t icpidr2; /* 0xfe8 - 0xfeb */
uint32_t reserved_7[NR(0xfec, 0x1000)]; /* 0xfec - 0xfff */
};
struct gicc_mmio {
uint32_t ctlr; /* 0x000 - 0x003 */
uint32_t pmr; /* 0x004 - 0x007 */
uint32_t bpr; /* 0x008 - 0x00b */
uint32_t iar; /* 0x00c - 0x00f */
uint32_t eoir; /* 0x010 - 0x013 */
uint32_t rpr; /* 0x014 - 0x017 */
uint32_t hppir; /* 0x018 - 0x01b */
uint32_t apbr; /* 0x01c - 0x01f */
uint32_t aiar; /* 0x020 - 0x023 */
uint32_t aeoir; /* 0x024 - 0x027 */
uint32_t ahppir; /* 0x028 - 0x02b */
uint32_t resered_1[NR(0x2c, 0xd0)]; /* 0x02c - 0x0cf */
uint32_t apr[NR(0xd0, 0xe0)]; /* 0x0d0 - 0x0df */
uint32_t nsapr[NR(0xe0, 0xf0)]; /* 0x0e0 - 0x0ef */
uint32_t resered_2[NR(0xf0, 0xfc)]; /* 0x0f0 - 0x0fb */
uint32_t iidr; /* 0x0fc - 0x0ff */
uint32_t reserved_3[NR(0x100, 0x1000)]; /* 0x100 - 0xfff */
uint32_t dir; /* 0x1000 - 0x1003 */
};
#undef NR
#endif /* DRIVERS_GIC_H */

View File

@ -1,26 +0,0 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#ifndef GIC_H
#define GIC_H
#if CONFIG(GIC)
/* Initialize the GIC on the currently processor, including GICD and GICC. */
void gic_init(void);
void gic_disable(void);
void gic_enable(void);
/* Return a pointer to the base of the GIC distributor mmio region. */
void *gicd_base(void);
/* Return a pointer to the base of the GIC CPU mmio region. */
void *gicc_base(void);
#else /* CONFIG_GIC */
static inline void gic_init(void) {}
static inline void gic_disable(void) {}
#endif /* CONFIG_GIC */
#endif /* GIC_H */

View File

@ -6,7 +6,6 @@ config SOC_NVIDIA_TEGRA210
select ARCH_VERSTAGE_ARMV4
select ARCH_ROMSTAGE_ARMV4
select ARCH_RAMSTAGE_ARMV8_64
select GIC
select HAVE_UART_SPECIAL
select ARM64_USE_ARM_TRUSTED_FIRMWARE
select GENERIC_GPIO_LIB

View File

@ -79,7 +79,6 @@ ramstage-y += i2c6.c
ramstage-y += ape.c
ramstage-y += power.c
ramstage-y += dma.c
ramstage-y += gic.c
ramstage-y += monotonic_timer.c
ramstage-y += padconfig.c
ramstage-y += funitcfg.c

View File

@ -1,14 +0,0 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#include <gic.h>
#include <soc/addressmap.h>
void *gicd_base(void)
{
return (void *)(uintptr_t)TEGRA_GICD_BASE;
}
void *gicc_base(void)
{
return (void *)(uintptr_t)TEGRA_GICC_BASE;
}

View File

@ -5,7 +5,6 @@
#include <cbmem.h>
#include <console/console.h>
#include <device/mmio.h>
#include <gic.h>
#include <soc/addressmap.h>
#include <soc/clock.h>
#include <soc/mmu_operations.h>
@ -41,9 +40,6 @@ static void mselect_enable_wrap(void)
void ramstage_entry(void);
void ramstage_entry(void)
{
/* TODO: Is this still needed? */
gic_init();
/* TODO: Move arch timer setup to BL31? */
arm64_arch_timer_init();