aboutsummaryrefslogtreecommitdiff
path: root/drivers/arm/gic/arm_gic_v2.c
blob: 025d48d3449c4cecd269c135644fdb15fc74a52a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/*
 * Copyright (c) 2018, Arm Limited. All rights reserved.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#include <arch.h>
#include <arch_helpers.h>
#include <assert.h>
#include <debug.h>
#include <gic_v2.h>

void arm_gic_enable_interrupts_local(void)
{
	gicv2_enable_cpuif();
}

void arm_gic_setup_local(void)
{
	gicv2_probe_gic_cpu_id();
	gicv2_setup_cpuif();
}

void arm_gic_disable_interrupts_local(void)
{
	gicv2_disable_cpuif();
}

void arm_gic_save_context_local(void)
{
	gicv2_save_cpuif_context();
}

void arm_gic_restore_context_local(void)
{
	gicv2_restore_cpuif_context();
}

void arm_gic_save_context_global(void)
{
	gicv2_save_sgi_ppi_context();
}

void arm_gic_restore_context_global(void)
{
	gicv2_setup_distif();
	gicv2_restore_sgi_ppi_context();
}

void arm_gic_setup_global(void)
{
	gicv2_setup_distif();
}

unsigned int arm_gic_get_intr_priority(unsigned int num)
{
	return gicv2_gicd_get_ipriorityr(num);
}

void arm_gic_set_intr_priority(unsigned int num,
				unsigned int priority)
{
	gicv2_gicd_set_ipriorityr(num, priority);
}

void arm_gic_send_sgi(unsigned int sgi_id, unsigned int core_pos)
{
	gicv2_send_sgi(sgi_id, core_pos);
}

void arm_gic_set_intr_target(unsigned int num, unsigned int core_pos)
{
	gicv2_set_itargetsr(num, core_pos);
}

unsigned int arm_gic_intr_enabled(unsigned int num)
{
	return gicv2_gicd_get_isenabler(num) != 0;
}

void arm_gic_intr_enable(unsigned int num)
{
	gicv2_gicd_set_isenabler(num);
}

void arm_gic_intr_disable(unsigned int num)
{
	gicv2_gicd_set_icenabler(num);
}

unsigned int arm_gic_intr_ack(unsigned int *raw_iar)
{
	assert(raw_iar);

	*raw_iar = gicv2_gicc_read_iar();
	return get_gicc_iar_intid(*raw_iar);
}

unsigned int arm_gic_is_intr_pending(unsigned int num)
{
	return gicv2_gicd_get_ispendr(num);
}

void arm_gic_intr_clear(unsigned int num)
{
	gicv2_gicd_set_icpendr(num);
}

void arm_gic_end_of_intr(unsigned int raw_iar)
{
	gicv2_gicc_write_eoir(raw_iar);
}

void arm_gic_init(uintptr_t gicc_base,
		uintptr_t gicd_base,
		uintptr_t gicr_base)
{
	gicv2_init(gicc_base, gicd_base);
	INFO("ARM GIC v2 driver initialized\n");
}