@@ -386,17 +386,13 @@ struct PciBar {
386
386
addr : u32 ,
387
387
size : u32 ,
388
388
used : bool ,
389
- r#type : Option < PciBarRegionType > ,
390
389
}
391
390
392
391
#[ derive( Debug , Clone , Serialize , Deserialize ) ]
393
392
pub struct PciConfigurationState {
394
393
registers : Vec < u32 > ,
395
394
writable_bits : Vec < u32 > ,
396
395
bars : Vec < PciBar > ,
397
- rom_bar_addr : u32 ,
398
- rom_bar_size : u32 ,
399
- rom_bar_used : bool ,
400
396
last_capability : Option < ( usize , usize ) > ,
401
397
msix_cap_reg_idx : Option < usize > ,
402
398
}
@@ -409,9 +405,6 @@ pub struct PciConfiguration {
409
405
registers : [ u32 ; NUM_CONFIGURATION_REGISTERS ] ,
410
406
writable_bits : [ u32 ; NUM_CONFIGURATION_REGISTERS ] , // writable bits for each register.
411
407
bars : [ PciBar ; NUM_BAR_REGS ] ,
412
- rom_bar_addr : u32 ,
413
- rom_bar_size : u32 ,
414
- rom_bar_used : bool ,
415
408
// Contains the byte offset and size of the last capability.
416
409
last_capability : Option < ( usize , usize ) > ,
417
410
msix_cap_reg_idx : Option < usize > ,
@@ -465,74 +458,57 @@ impl PciConfiguration {
465
458
msix_config : Option < Arc < Mutex < MsixConfig > > > ,
466
459
state : Option < PciConfigurationState > ,
467
460
) -> 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
+ )
496
470
} 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
+ )
514
506
} ;
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
- } ;
528
507
529
508
PciConfiguration {
530
509
registers,
531
510
writable_bits,
532
511
bars,
533
- rom_bar_addr,
534
- rom_bar_size,
535
- rom_bar_used,
536
512
last_capability,
537
513
msix_cap_reg_idx,
538
514
msix_config,
@@ -544,9 +520,6 @@ impl PciConfiguration {
544
520
registers : self . registers . to_vec ( ) ,
545
521
writable_bits : self . writable_bits . to_vec ( ) ,
546
522
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 ,
550
523
last_capability : self . last_capability ,
551
524
msix_cap_reg_idx : self . msix_cap_reg_idx ,
552
525
}
@@ -572,7 +545,7 @@ impl PciConfiguration {
572
545
// all 1's on bits 31-11 to retrieve the BAR size during next BAR
573
546
// reading.
574
547
if value & ROM_BAR_ADDR_MASK == ROM_BAR_ADDR_MASK {
575
- mask &= self . rom_bar_size ;
548
+ mask = 0 ;
576
549
}
577
550
}
578
551
@@ -1327,4 +1300,18 @@ mod tests {
1327
1300
. detect_bar_reprogramming( BAR0_REG + 1 , & u32 :: to_le_bytes( 0x1312 ) )
1328
1301
. is_none( ) ) ;
1329
1302
}
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
+ }
1330
1317
}
0 commit comments