Skip to content

Commit dcd04e9

Browse files
authored
Merge pull request #1938 from Gelbpunkt/32-bit-pci-bars
32-bit PCI bar support
2 parents 37cc42f + 282a76a commit dcd04e9

File tree

2 files changed

+21
-12
lines changed

2 files changed

+21
-12
lines changed

src/arch/aarch64/kernel/pci.rs

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ pub fn init() {
240240
flags,
241241
);
242242

243-
let (mut io_start, mem32_start, mut mem64_start) = detect_pci_regions(pci_node);
243+
let (mut io_start, mut mem32_start, mut mem64_start) = detect_pci_regions(pci_node);
244244

245245
debug!("IO address space starts at{io_start:#X}");
246246
debug!("Memory32 address space starts at {mem32_start:#X}");
@@ -267,7 +267,8 @@ pub fn init() {
267267

268268
// Initializes BARs
269269
let mut cmd = CommandRegister::empty();
270-
for i in 0..MAX_BARS {
270+
let mut range_iter = 0..MAX_BARS;
271+
while let Some(i) = range_iter.next() {
271272
if let Some(bar) = dev.get_bar(i.try_into().unwrap()) {
272273
match bar {
273274
Bar::Io { .. } => {
@@ -281,11 +282,22 @@ pub fn init() {
281282
cmd |= CommandRegister::IO_ENABLE
282283
| CommandRegister::BUS_MASTER_ENABLE;
283284
}
284-
Bar::Memory32 { .. } => {
285-
// Currently, we ignore 32 bit memory bars
286-
// dev.set_bar(i.try_into().unwrap(), Bar::Memory32 { address: mem32_start.try_into().unwrap(), size, prefetchable });
287-
// mem32_start += u64::from(size);
288-
// cmd |= CommandRegister::MEMORY_ENABLE | CommandRegister::BUS_MASTER_ENABLE;
285+
Bar::Memory32 {
286+
address: _,
287+
size,
288+
prefetchable,
289+
} => {
290+
dev.set_bar(
291+
i.try_into().unwrap(),
292+
Bar::Memory32 {
293+
address: mem32_start.try_into().unwrap(),
294+
size,
295+
prefetchable,
296+
},
297+
);
298+
mem32_start += u64::from(size);
299+
cmd |= CommandRegister::MEMORY_ENABLE
300+
| CommandRegister::BUS_MASTER_ENABLE;
289301
}
290302
Bar::Memory64 {
291303
address: _,
@@ -303,6 +315,7 @@ pub fn init() {
303315
mem64_start += size;
304316
cmd |= CommandRegister::MEMORY_ENABLE
305317
| CommandRegister::BUS_MASTER_ENABLE;
318+
range_iter.next(); // Skip 32-bit bar that is part of the 64-bit bar
306319
}
307320
}
308321
}

src/drivers/pci.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ impl<T: ConfigRegionAccess> PciDevice<T> {
137137
/// no_cache determines if we set the `Cache Disable` flag in the page-table-entry.
138138
/// Returns (virtual-pointer, size) if successful, else None (if bar non-existent or IOSpace)
139139
pub fn memory_map_bar(&self, index: u8, no_cache: bool) -> Option<(VirtAddr, usize)> {
140-
let (address, size, prefetchable, width) = match self.get_bar(index) {
140+
let (address, size, prefetchable, _width) = match self.get_bar(index) {
141141
Some(Bar::Io { .. }) => {
142142
warn!("Cannot map IOBar!");
143143
return None;
@@ -168,10 +168,6 @@ impl<T: ConfigRegionAccess> PciDevice<T> {
168168

169169
debug!("Mapping bar {index} at {address:#x} with length {size:#x}");
170170

171-
if width != 64 {
172-
warn!("Currently only mapping of 64 bit bars is supported!");
173-
return None;
174-
}
175171
if !prefetchable {
176172
warn!("Currently only mapping of prefetchable bars is supported!");
177173
}

0 commit comments

Comments
 (0)