@@ -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 ) ]
393392pub 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