Skip to content

Commit 0b970b9

Browse files
committed
refactor(pci): remove ROM-related state from PCI configuration
Drop any ROM-related state we were holding in PciConfiguration and ensure we are always returning a side of zero for the ROM BAR. Signed-off-by: Babis Chalios <bchalios@amazon.es>
1 parent c4d84a1 commit 0b970b9

File tree

1 file changed

+59
-72
lines changed

1 file changed

+59
-72
lines changed

src/pci/src/configuration.rs

Lines changed: 59 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -386,17 +386,13 @@ struct PciBar {
386386
addr: u32,
387387
size: u32,
388388
used: bool,
389-
r#type: Option<PciBarRegionType>,
390389
}
391390

392391
#[derive(Debug, Clone, Serialize, Deserialize)]
393392
pub struct PciConfigurationState {
394393
registers: Vec<u32>,
395394
writable_bits: Vec<u32>,
396395
bars: Vec<PciBar>,
397-
rom_bar_addr: u32,
398-
rom_bar_size: u32,
399-
rom_bar_used: bool,
400396
last_capability: Option<(usize, usize)>,
401397
msix_cap_reg_idx: Option<usize>,
402398
}
@@ -409,9 +405,6 @@ pub struct PciConfiguration {
409405
registers: [u32; NUM_CONFIGURATION_REGISTERS],
410406
writable_bits: [u32; NUM_CONFIGURATION_REGISTERS], // writable bits for each register.
411407
bars: [PciBar; NUM_BAR_REGS],
412-
rom_bar_addr: u32,
413-
rom_bar_size: u32,
414-
rom_bar_used: bool,
415408
// Contains the byte offset and size of the last capability.
416409
last_capability: Option<(usize, usize)>,
417410
msix_cap_reg_idx: Option<usize>,
@@ -465,74 +458,57 @@ impl PciConfiguration {
465458
msix_config: Option<Arc<Mutex<MsixConfig>>>,
466459
state: Option<PciConfigurationState>,
467460
) -> Self {
468-
let (
469-
registers,
470-
writable_bits,
471-
bars,
472-
rom_bar_addr,
473-
rom_bar_size,
474-
rom_bar_used,
475-
last_capability,
476-
msix_cap_reg_idx,
477-
) = if let Some(state) = state {
478-
(
479-
state.registers.try_into().unwrap(),
480-
state.writable_bits.try_into().unwrap(),
481-
state.bars.try_into().unwrap(),
482-
state.rom_bar_addr,
483-
state.rom_bar_size,
484-
state.rom_bar_used,
485-
state.last_capability,
486-
state.msix_cap_reg_idx,
487-
)
488-
} else {
489-
let mut registers = [0u32; NUM_CONFIGURATION_REGISTERS];
490-
let mut writable_bits = [0u32; NUM_CONFIGURATION_REGISTERS];
491-
registers[0] = (u32::from(device_id) << 16) | u32::from(vendor_id);
492-
// TODO(dverkamp): Status should be write-1-to-clear
493-
writable_bits[1] = 0x0000_ffff; // Status (r/o), command (r/w)
494-
let pi = if let Some(pi) = programming_interface {
495-
pi.get_register_value()
461+
let (registers, writable_bits, bars, last_capability, msix_cap_reg_idx) =
462+
if let Some(state) = state {
463+
(
464+
state.registers.try_into().unwrap(),
465+
state.writable_bits.try_into().unwrap(),
466+
state.bars.try_into().unwrap(),
467+
state.last_capability,
468+
state.msix_cap_reg_idx,
469+
)
496470
} else {
497-
0
498-
};
499-
registers[2] = (u32::from(class_code.get_register_value()) << 24)
500-
| (u32::from(subclass.get_register_value()) << 16)
501-
| (u32::from(pi) << 8)
502-
| u32::from(revision_id);
503-
writable_bits[3] = 0x0000_00ff; // Cacheline size (r/w)
504-
match header_type {
505-
PciHeaderType::Device => {
506-
registers[3] = 0x0000_0000; // Header type 0 (device)
507-
writable_bits[15] = 0x0000_00ff; // Interrupt line (r/w)
508-
}
509-
PciHeaderType::Bridge => {
510-
registers[3] = 0x0001_0000; // Header type 1 (bridge)
511-
writable_bits[9] = 0xfff0_fff0; // Memory base and limit
512-
writable_bits[15] = 0xffff_00ff; // Bridge control (r/w), interrupt line (r/w)
513-
}
471+
let mut registers = [0u32; NUM_CONFIGURATION_REGISTERS];
472+
let mut writable_bits = [0u32; NUM_CONFIGURATION_REGISTERS];
473+
registers[0] = (u32::from(device_id) << 16) | u32::from(vendor_id);
474+
// TODO(dverkamp): Status should be write-1-to-clear
475+
writable_bits[1] = 0x0000_ffff; // Status (r/o), command (r/w)
476+
let pi = if let Some(pi) = programming_interface {
477+
pi.get_register_value()
478+
} else {
479+
0
480+
};
481+
registers[2] = (u32::from(class_code.get_register_value()) << 24)
482+
| (u32::from(subclass.get_register_value()) << 16)
483+
| (u32::from(pi) << 8)
484+
| u32::from(revision_id);
485+
writable_bits[3] = 0x0000_00ff; // Cacheline size (r/w)
486+
match header_type {
487+
PciHeaderType::Device => {
488+
registers[3] = 0x0000_0000; // Header type 0 (device)
489+
writable_bits[15] = 0x0000_00ff; // IRQ line (r/w)
490+
}
491+
PciHeaderType::Bridge => {
492+
registers[3] = 0x0001_0000; // Header type 1 (bridge)
493+
writable_bits[9] = 0xfff0_fff0; // Memory base and limit
494+
writable_bits[15] = 0xffff_00ff; // Bridge control (r/w), IRQ line (r/w)
495+
}
496+
};
497+
registers[11] = (u32::from(subsystem_id) << 16) | u32::from(subsystem_vendor_id);
498+
499+
(
500+
registers,
501+
writable_bits,
502+
[PciBar::default(); NUM_BAR_REGS],
503+
None,
504+
None,
505+
)
514506
};
515-
registers[11] = (u32::from(subsystem_id) << 16) | u32::from(subsystem_vendor_id);
516-
517-
(
518-
registers,
519-
writable_bits,
520-
[PciBar::default(); NUM_BAR_REGS],
521-
0,
522-
0,
523-
false,
524-
None,
525-
None,
526-
)
527-
};
528507

529508
PciConfiguration {
530509
registers,
531510
writable_bits,
532511
bars,
533-
rom_bar_addr,
534-
rom_bar_size,
535-
rom_bar_used,
536512
last_capability,
537513
msix_cap_reg_idx,
538514
msix_config,
@@ -544,9 +520,6 @@ impl PciConfiguration {
544520
registers: self.registers.to_vec(),
545521
writable_bits: self.writable_bits.to_vec(),
546522
bars: self.bars.to_vec(),
547-
rom_bar_addr: self.rom_bar_addr,
548-
rom_bar_size: self.rom_bar_size,
549-
rom_bar_used: self.rom_bar_used,
550523
last_capability: self.last_capability,
551524
msix_cap_reg_idx: self.msix_cap_reg_idx,
552525
}
@@ -572,7 +545,7 @@ impl PciConfiguration {
572545
// all 1's on bits 31-11 to retrieve the BAR size during next BAR
573546
// reading.
574547
if value & ROM_BAR_ADDR_MASK == ROM_BAR_ADDR_MASK {
575-
mask &= self.rom_bar_size;
548+
mask = 0;
576549
}
577550
}
578551

@@ -1327,4 +1300,18 @@ mod tests {
13271300
.detect_bar_reprogramming(BAR0_REG + 1, &u32::to_le_bytes(0x1312))
13281301
.is_none());
13291302
}
1303+
1304+
#[test]
1305+
fn test_rom_bar() {
1306+
let mut pci_config = default_config();
1307+
1308+
// ROM BAR address should always be 0 and writes to it shouldn't do anything
1309+
assert_eq!(pci_config.read_reg(ROM_BAR_REG), 0);
1310+
pci_config.write_reg(ROM_BAR_REG, 0x42);
1311+
assert_eq!(pci_config.read_reg(ROM_BAR_REG), 0);
1312+
1313+
// Reading the size of the BAR should always return 0 as well
1314+
pci_config.write_reg(ROM_BAR_REG, 0xffff_ffff);
1315+
assert_eq!(pci_config.read_reg(ROM_BAR_REG), 0);
1316+
}
13301317
}

0 commit comments

Comments
 (0)