Parse the CONFIG_ADDRESS register to a (bus, device, function, register) tuple.
(config_address: u32)
| 534 | |
| 535 | // Parse the CONFIG_ADDRESS register to a (bus, device, function, register) tuple. |
| 536 | fn parse_io_config_address(config_address: u32) -> (usize, usize, usize, usize) { |
| 537 | const BUS_NUMBER_OFFSET: usize = 16; |
| 538 | const BUS_NUMBER_MASK: u32 = 0x00ff; |
| 539 | const DEVICE_NUMBER_OFFSET: usize = 11; |
| 540 | const DEVICE_NUMBER_MASK: u32 = 0x1f; |
| 541 | const FUNCTION_NUMBER_OFFSET: usize = 8; |
| 542 | const FUNCTION_NUMBER_MASK: u32 = 0x07; |
| 543 | const REGISTER_NUMBER_OFFSET: usize = 2; |
| 544 | const REGISTER_NUMBER_MASK: u32 = 0x3f; |
| 545 | |
| 546 | ( |
| 547 | shift_and_mask(config_address, BUS_NUMBER_OFFSET, BUS_NUMBER_MASK), |
| 548 | shift_and_mask(config_address, DEVICE_NUMBER_OFFSET, DEVICE_NUMBER_MASK), |
| 549 | shift_and_mask(config_address, FUNCTION_NUMBER_OFFSET, FUNCTION_NUMBER_MASK), |
| 550 | shift_and_mask(config_address, REGISTER_NUMBER_OFFSET, REGISTER_NUMBER_MASK), |
| 551 | ) |
| 552 | } |
| 553 | |
| 554 | #[cfg(test)] |
| 555 | mod unit_tests { |
no test coverage detected