xref: /kvm-unit-tests/lib/arm/gic-v2.c (revision 91a6c3cead72494724d563c19c6aebd2efd14d4e)
1*91a6c3ceSAndrew Jones /*
2*91a6c3ceSAndrew Jones  * Copyright (C) 2016, Red Hat Inc, Andrew Jones <drjones@redhat.com>
3*91a6c3ceSAndrew Jones  *
4*91a6c3ceSAndrew Jones  * This work is licensed under the terms of the GNU LGPL, version 2.
5*91a6c3ceSAndrew Jones  */
6*91a6c3ceSAndrew Jones #include <asm/gic.h>
7*91a6c3ceSAndrew Jones #include <asm/io.h>
8*91a6c3ceSAndrew Jones 
9*91a6c3ceSAndrew Jones void gicv2_enable_defaults(void)
10*91a6c3ceSAndrew Jones {
11*91a6c3ceSAndrew Jones 	void *dist = gicv2_dist_base();
12*91a6c3ceSAndrew Jones 	void *cpu_base = gicv2_cpu_base();
13*91a6c3ceSAndrew Jones 	unsigned int i;
14*91a6c3ceSAndrew Jones 
15*91a6c3ceSAndrew Jones 	gicv2_data.irq_nr = GICD_TYPER_IRQS(readl(dist + GICD_TYPER));
16*91a6c3ceSAndrew Jones 	if (gicv2_data.irq_nr > 1020)
17*91a6c3ceSAndrew Jones 		gicv2_data.irq_nr = 1020;
18*91a6c3ceSAndrew Jones 
19*91a6c3ceSAndrew Jones 	for (i = 0; i < gicv2_data.irq_nr; i += 4)
20*91a6c3ceSAndrew Jones 		writel(GICD_INT_DEF_PRI_X4, dist + GICD_IPRIORITYR + i);
21*91a6c3ceSAndrew Jones 
22*91a6c3ceSAndrew Jones 	writel(GICD_INT_EN_SET_SGI, dist + GICD_ISENABLER + 0);
23*91a6c3ceSAndrew Jones 	writel(GICD_ENABLE, dist + GICD_CTLR);
24*91a6c3ceSAndrew Jones 
25*91a6c3ceSAndrew Jones 	writel(GICC_INT_PRI_THRESHOLD, cpu_base + GICC_PMR);
26*91a6c3ceSAndrew Jones 	writel(GICC_ENABLE, cpu_base + GICC_CTLR);
27*91a6c3ceSAndrew Jones }
28