Skip to content

Commit b781033

Browse files
committed
Update arm-gic to 0.7
1 parent dac87f1 commit b781033

File tree

4 files changed

+87
-50
lines changed

4 files changed

+87
-50
lines changed

examples/mps3-an536/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ version = "0.0.0"
1919
cortex-ar = { path = "../../cortex-ar", features = ["critical-section-multi-core"] }
2020
cortex-r-rt = { path = "../../cortex-r-rt" }
2121
semihosting = { version = "0.1.18", features = ["stdio"] }
22-
arm-gic = { version = "0.6.1", optional = true }
22+
arm-gic = { version = "0.7.1", optional = true }
2323
critical-section = "1.2.0"
2424
heapless = "0.9.1"
2525

examples/mps3-an536/src/bin/gic-map.rs

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@ use cortex_r_rt::{entry, irq};
1212
use mps3_an536::InterruptHandler;
1313

1414
use arm_gic::{
15-
gicv3::{GicV3, Group, InterruptGroup, SgiTarget, SgiTargetGroup},
16-
IntId,
15+
gicv3::{GicCpuInterface, GicV3, Group, InterruptGroup, SgiTarget, SgiTargetGroup},
16+
IntId, UniqueMmioPointer,
1717
};
18-
use core::cell::RefCell;
18+
use core::{cell::RefCell, ptr::NonNull};
1919
use heapless::linear_map::LinearMap;
2020
use semihosting::println;
2121

@@ -47,23 +47,31 @@ fn main() -> ! {
4747
"Creating GIC driver @ {:010p} / {:010p}",
4848
gicd_base, gicr_base
4949
);
50-
let mut gic: GicV3 = unsafe { GicV3::new(gicd_base.cast(), gicr_base.cast(), 1, false) };
50+
51+
let gicd = unsafe { UniqueMmioPointer::new(NonNull::new(gicd_base.cast()).unwrap()) };
52+
let gicr = NonNull::new(gicr_base.cast()).unwrap();
53+
let mut gic = unsafe { GicV3::new(gicd, gicr, 1, false) };
54+
5155
println!("Calling git.setup(0)");
5256
gic.setup(0);
53-
GicV3::set_priority_mask(0x80);
57+
GicCpuInterface::set_priority_mask(0x80);
5458

5559
// Configure a Software Generated Interrupt for Core 0
5660
println!("Configure low-prio SGI...");
57-
gic.set_interrupt_priority(SGI_INTID_LO, Some(0), 0x31);
58-
gic.set_group(SGI_INTID_LO, Some(0), Group::Group1NS);
61+
gic.set_interrupt_priority(SGI_INTID_LO, Some(0), 0x31)
62+
.unwrap();
63+
gic.set_group(SGI_INTID_LO, Some(0), Group::Group1NS)
64+
.unwrap();
5965

6066
println!("Configure high-prio SGI...");
61-
gic.set_interrupt_priority(SGI_INTID_HI, Some(0), 0x10);
62-
gic.set_group(SGI_INTID_HI, Some(0), Group::Group1NS);
67+
gic.set_interrupt_priority(SGI_INTID_HI, Some(0), 0x10)
68+
.unwrap();
69+
gic.set_group(SGI_INTID_HI, Some(0), Group::Group1NS)
70+
.unwrap();
6371

6472
println!("gic.enable_interrupt()");
65-
gic.enable_interrupt(SGI_INTID_LO, Some(0), true);
66-
gic.enable_interrupt(SGI_INTID_HI, Some(0), true);
73+
gic.enable_interrupt(SGI_INTID_LO, Some(0), true).unwrap();
74+
gic.enable_interrupt(SGI_INTID_HI, Some(0), true).unwrap();
6775

6876
critical_section::with(|cs| {
6977
let mut handlers = INTERRUPT_HANDLERS.borrow_ref_mut(cs);
@@ -90,7 +98,7 @@ fn main() -> ! {
9098

9199
// Send it
92100
println!("Send lo-prio SGI");
93-
GicV3::send_sgi(
101+
GicCpuInterface::send_sgi(
94102
SGI_INTID_LO,
95103
SgiTarget::List {
96104
affinity3: 0,
@@ -99,7 +107,8 @@ fn main() -> ! {
99107
target_list: 0b1,
100108
},
101109
SgiTargetGroup::CurrentGroup1,
102-
);
110+
)
111+
.unwrap();
103112

104113
for _ in 0..1_000_000 {
105114
cortex_ar::asm::nop();
@@ -118,7 +127,7 @@ fn dump_cpsr() {
118127
/// Handles the low-prio SGI
119128
fn handle_sgi_lo(int_id: IntId) {
120129
println!("- got {:?}, sending hi-prio {:?}", int_id, SGI_INTID_HI);
121-
GicV3::send_sgi(
130+
GicCpuInterface::send_sgi(
122131
SGI_INTID_HI,
123132
SgiTarget::List {
124133
affinity3: 0,
@@ -127,7 +136,8 @@ fn handle_sgi_lo(int_id: IntId) {
127136
target_list: 0b1,
128137
},
129138
SgiTargetGroup::CurrentGroup1,
130-
);
139+
)
140+
.unwrap();
131141
println!("- finished sending hi-prio!");
132142
}
133143

@@ -144,7 +154,9 @@ fn handle_sgi_hi(int_id: IntId) {
144154
#[irq]
145155
fn irq_handler() {
146156
println!("> IRQ");
147-
while let Some(next_int_id) = GicV3::get_and_acknowledge_interrupt(InterruptGroup::Group1) {
157+
while let Some(next_int_id) =
158+
GicCpuInterface::get_and_acknowledge_interrupt(InterruptGroup::Group1)
159+
{
148160
// handle the interrupt
149161
println!("- handle_interrupt_with_id({:?})", next_int_id);
150162
let handler = critical_section::with(|cs| {
@@ -160,7 +172,7 @@ fn irq_handler() {
160172
// turn interrupts off again
161173
cortex_ar::interrupt::disable();
162174
}
163-
GicV3::end_interrupt(next_int_id, InterruptGroup::Group1);
175+
GicCpuInterface::end_interrupt(next_int_id, InterruptGroup::Group1);
164176
}
165177
println!("< IRQ");
166178
}

examples/mps3-an536/src/bin/gic-static-section-irq.rs

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,17 @@
55
#![no_std]
66
#![no_main]
77

8+
use core::ptr::NonNull;
9+
810
// pull in our start-up code
911
use cortex_r_rt::{entry, irq};
1012

1113
// pull in our library
1214
use mps3_an536::InterruptHandler;
1315

1416
use arm_gic::{
15-
gicv3::{GicV3, Group, InterruptGroup, SgiTarget, SgiTargetGroup},
16-
IntId,
17+
gicv3::{GicCpuInterface, GicV3, Group, InterruptGroup, SgiTarget, SgiTargetGroup},
18+
IntId, UniqueMmioPointer,
1719
};
1820
use semihosting::println;
1921

@@ -42,23 +44,30 @@ fn main() -> ! {
4244
"Creating GIC driver @ {:010p} / {:010p}",
4345
gicd_base, gicr_base
4446
);
45-
let mut gic: GicV3 = unsafe { GicV3::new(gicd_base.cast(), gicr_base.cast(), 1, false) };
47+
let gicd = unsafe { UniqueMmioPointer::new(NonNull::new(gicd_base.cast()).unwrap()) };
48+
let gicr = NonNull::new(gicr_base.cast()).unwrap();
49+
let mut gic = unsafe { GicV3::new(gicd, gicr, 1, false) };
50+
4651
println!("Calling git.setup(0)");
4752
gic.setup(0);
48-
GicV3::set_priority_mask(0x80);
53+
GicCpuInterface::set_priority_mask(0x80);
4954

5055
// Configure a Software Generated Interrupt for Core 0
5156
println!("Configure low-prio SGI...");
52-
gic.set_interrupt_priority(SGI_INTID_LO, Some(0), 0x31);
53-
gic.set_group(SGI_INTID_LO, Some(0), Group::Group1NS);
57+
gic.set_interrupt_priority(SGI_INTID_LO, Some(0), 0x31)
58+
.unwrap();
59+
gic.set_group(SGI_INTID_LO, Some(0), Group::Group1NS)
60+
.unwrap();
5461

5562
println!("Configure high-prio SGI...");
56-
gic.set_interrupt_priority(SGI_INTID_HI, Some(0), 0x10);
57-
gic.set_group(SGI_INTID_HI, Some(0), Group::Group1NS);
63+
gic.set_interrupt_priority(SGI_INTID_HI, Some(0), 0x10)
64+
.unwrap();
65+
gic.set_group(SGI_INTID_HI, Some(0), Group::Group1NS)
66+
.unwrap();
5867

5968
println!("gic.enable_interrupt()");
60-
gic.enable_interrupt(SGI_INTID_LO, Some(0), true);
61-
gic.enable_interrupt(SGI_INTID_HI, Some(0), true);
69+
gic.enable_interrupt(SGI_INTID_LO, Some(0), true).unwrap();
70+
gic.enable_interrupt(SGI_INTID_HI, Some(0), true).unwrap();
6271

6372
println!("Enabling interrupts...");
6473
dump_cpsr();
@@ -69,7 +78,7 @@ fn main() -> ! {
6978

7079
// Send it
7180
println!("Send lo-prio SGI");
72-
GicV3::send_sgi(
81+
GicCpuInterface::send_sgi(
7382
SGI_INTID_LO,
7483
SgiTarget::List {
7584
affinity3: 0,
@@ -78,7 +87,8 @@ fn main() -> ! {
7887
target_list: 0b1,
7988
},
8089
SgiTargetGroup::CurrentGroup1,
81-
);
90+
)
91+
.unwrap();
8292

8393
for _ in 0..1_000_000 {
8494
cortex_ar::asm::nop();
@@ -101,7 +111,7 @@ pub static HANDLE_SGI_LO: InterruptHandler = InterruptHandler::new(SGI_INTID_LO,
101111
/// Handles the low-prio SGI
102112
fn handle_sgi_lo(int_id: IntId) {
103113
println!("- got {:?}, sending hi-prio {:?}", int_id, SGI_INTID_HI);
104-
GicV3::send_sgi(
114+
GicCpuInterface::send_sgi(
105115
SGI_INTID_HI,
106116
SgiTarget::List {
107117
affinity3: 0,
@@ -110,7 +120,8 @@ fn handle_sgi_lo(int_id: IntId) {
110120
target_list: 0b1,
111121
},
112122
SgiTargetGroup::CurrentGroup1,
113-
);
123+
)
124+
.unwrap();
114125
println!("- finished sending hi-prio!");
115126
}
116127

@@ -131,7 +142,9 @@ fn handle_sgi_hi(int_id: IntId) {
131142
#[irq]
132143
fn irq_handler() {
133144
println!("> IRQ");
134-
while let Some(next_int_id) = GicV3::get_and_acknowledge_interrupt(InterruptGroup::Group1) {
145+
while let Some(next_int_id) =
146+
GicCpuInterface::get_and_acknowledge_interrupt(InterruptGroup::Group1)
147+
{
135148
// let's go re-entrant
136149
unsafe {
137150
cortex_ar::interrupt::enable();
@@ -155,7 +168,7 @@ fn irq_handler() {
155168
}
156169
// turn interrupts off again
157170
cortex_ar::interrupt::disable();
158-
GicV3::end_interrupt(next_int_id, InterruptGroup::Group1);
171+
GicCpuInterface::end_interrupt(next_int_id, InterruptGroup::Group1);
159172
}
160173
println!("< IRQ");
161174
}

examples/mps3-an536/src/bin/gic-unified-irq.rs

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,17 @@
55
#![no_std]
66
#![no_main]
77

8+
use core::ptr::NonNull;
9+
810
// pull in our start-up code
911
use cortex_r_rt::{entry, irq};
1012

1113
// pull in our library
1214
use mps3_an536 as _;
1315

1416
use arm_gic::{
15-
gicv3::{GicV3, Group, InterruptGroup, SgiTarget, SgiTargetGroup},
16-
IntId,
17+
gicv3::{GicCpuInterface, GicV3, Group, InterruptGroup, SgiTarget, SgiTargetGroup},
18+
IntId, UniqueMmioPointer,
1719
};
1820
use semihosting::println;
1921

@@ -42,23 +44,30 @@ fn main() -> ! {
4244
"Creating GIC driver @ {:010p} / {:010p}",
4345
gicd_base, gicr_base
4446
);
45-
let mut gic: GicV3 = unsafe { GicV3::new(gicd_base.cast(), gicr_base.cast(), 1, false) };
47+
let gicd = unsafe { UniqueMmioPointer::new(NonNull::new(gicd_base.cast()).unwrap()) };
48+
let gicr = NonNull::new(gicr_base.cast()).unwrap();
49+
let mut gic = unsafe { GicV3::new(gicd, gicr, 1, false) };
50+
4651
println!("Calling git.setup(0)");
4752
gic.setup(0);
48-
GicV3::set_priority_mask(0x80);
53+
GicCpuInterface::set_priority_mask(0x80);
4954

5055
// Configure a Software Generated Interrupt for Core 0
5156
println!("Configure low-prio SGI...");
52-
gic.set_interrupt_priority(SGI_INTID_LO, Some(0), 0x31);
53-
gic.set_group(SGI_INTID_LO, Some(0), Group::Group1NS);
57+
gic.set_interrupt_priority(SGI_INTID_LO, Some(0), 0x31)
58+
.unwrap();
59+
gic.set_group(SGI_INTID_LO, Some(0), Group::Group1NS)
60+
.unwrap();
5461

5562
println!("Configure high-prio SGI...");
56-
gic.set_interrupt_priority(SGI_INTID_HI, Some(0), 0x10);
57-
gic.set_group(SGI_INTID_HI, Some(0), Group::Group1NS);
63+
gic.set_interrupt_priority(SGI_INTID_HI, Some(0), 0x10)
64+
.unwrap();
65+
gic.set_group(SGI_INTID_HI, Some(0), Group::Group1NS)
66+
.unwrap();
5867

5968
println!("gic.enable_interrupt()");
60-
gic.enable_interrupt(SGI_INTID_LO, Some(0), true);
61-
gic.enable_interrupt(SGI_INTID_HI, Some(0), true);
69+
gic.enable_interrupt(SGI_INTID_LO, Some(0), true).unwrap();
70+
gic.enable_interrupt(SGI_INTID_HI, Some(0), true).unwrap();
6271

6372
println!("Enabling interrupts...");
6473
dump_cpsr();
@@ -69,7 +78,7 @@ fn main() -> ! {
6978

7079
// Send it
7180
println!("Send lo-prio SGI");
72-
GicV3::send_sgi(
81+
GicCpuInterface::send_sgi(
7382
SGI_INTID_LO,
7483
SgiTarget::List {
7584
affinity3: 0,
@@ -78,7 +87,8 @@ fn main() -> ! {
7887
target_list: 0b1,
7988
},
8089
SgiTargetGroup::CurrentGroup1,
81-
);
90+
)
91+
.unwrap();
8292

8393
for _ in 0..1_000_000 {
8494
cortex_ar::asm::nop();
@@ -97,7 +107,8 @@ fn dump_cpsr() {
97107
#[irq]
98108
fn irq_handler() {
99109
println!("> IRQ");
100-
while let Some(int_id) = GicV3::get_and_acknowledge_interrupt(InterruptGroup::Group1) {
110+
while let Some(int_id) = GicCpuInterface::get_and_acknowledge_interrupt(InterruptGroup::Group1)
111+
{
101112
// let's go re-entrant
102113
unsafe {
103114
cortex_ar::interrupt::enable();
@@ -108,7 +119,7 @@ fn irq_handler() {
108119
"- IRQ got {:?}, sending hi-prio {:?}",
109120
SGI_INTID_LO, SGI_INTID_HI
110121
);
111-
GicV3::send_sgi(
122+
GicCpuInterface::send_sgi(
112123
SGI_INTID_HI,
113124
SgiTarget::List {
114125
affinity3: 0,
@@ -117,12 +128,13 @@ fn irq_handler() {
117128
target_list: 0b1,
118129
},
119130
SgiTargetGroup::CurrentGroup1,
120-
);
131+
)
132+
.unwrap();
121133
println!("- IRQ finished sending hi-prio!");
122134
}
123135
// turn interrupts off again
124136
cortex_ar::interrupt::disable();
125-
GicV3::end_interrupt(int_id, InterruptGroup::Group1);
137+
GicCpuInterface::end_interrupt(int_id, InterruptGroup::Group1);
126138
}
127139
println!("< IRQ");
128140
}

0 commit comments

Comments
 (0)