@@ -30,15 +30,19 @@ pub enum PciConfigAccess {
30
30
impl ConfigRegionAccess for PciConfigAccess {
31
31
unsafe fn read ( & self , address : PciAddress , offset : u16 ) -> u32 {
32
32
match self {
33
- PciConfigAccess :: PciConfigRegion ( entry) => entry. read ( address, offset) ,
34
- PciConfigAccess :: PcieConfigRegion ( entry) => entry. read ( address, offset) ,
33
+ PciConfigAccess :: PciConfigRegion ( entry) => unsafe { entry. read ( address, offset) } ,
34
+ PciConfigAccess :: PcieConfigRegion ( entry) => unsafe { entry. read ( address, offset) } ,
35
35
}
36
36
}
37
37
38
38
unsafe fn write ( & self , address : PciAddress , offset : u16 , value : u32 ) {
39
39
match self {
40
- PciConfigAccess :: PciConfigRegion ( entry) => entry. write ( address, offset, value) ,
41
- PciConfigAccess :: PcieConfigRegion ( entry) => entry. write ( address, offset, value) ,
40
+ PciConfigAccess :: PciConfigRegion ( entry) => unsafe {
41
+ entry. write ( address, offset, value) ;
42
+ } ,
43
+ PciConfigAccess :: PcieConfigRegion ( entry) => unsafe {
44
+ entry. write ( address, offset, value) ;
45
+ } ,
42
46
}
43
47
}
44
48
}
@@ -83,9 +87,15 @@ pub(crate) fn init() {
83
87
debug ! ( "Scanning PCI Busses 0 to {}" , PCI_MAX_BUS_NUMBER - 1 ) ;
84
88
85
89
#[ cfg( feature = "acpi" ) ]
86
- if pcie:: init_pcie ( ) { return ; }
90
+ if pcie:: init_pcie ( ) {
91
+ return ;
92
+ }
87
93
88
- enumerate_devices ( 0 , PCI_MAX_BUS_NUMBER , PciConfigAccess :: PciConfigRegion ( PciConfigRegion :: new ( ) ) )
94
+ enumerate_devices (
95
+ 0 ,
96
+ PCI_MAX_BUS_NUMBER ,
97
+ PciConfigAccess :: PciConfigRegion ( PciConfigRegion :: new ( ) ) ,
98
+ ) ;
89
99
}
90
100
91
101
fn enumerate_devices ( bus_start : u8 , bus_end : u8 , access : PciConfigAccess ) {
@@ -108,26 +118,29 @@ fn enumerate_devices(bus_start: u8, bus_end: u8, access: PciConfigAccess) {
108
118
109
119
#[ cfg( feature = "acpi" ) ]
110
120
mod pcie {
111
- use core :: ptr ;
121
+ use memory_addresses :: PhysAddr ;
112
122
use pci_types:: { ConfigRegionAccess , PciAddress } ;
113
- use memory_addresses:: { PhysAddr , VirtAddr } ;
114
- use super :: { PciConfigAccess , PCI_MAX_BUS_NUMBER } ;
115
- use crate :: env;
123
+
124
+ use super :: { PCI_MAX_BUS_NUMBER , PciConfigAccess } ;
116
125
use crate :: env:: kernel:: acpi;
117
126
118
127
pub fn init_pcie ( ) -> bool {
119
- let Some ( table) = acpi:: get_mcfg_table ( ) else { return false ; } ;
128
+ let Some ( table) = acpi:: get_mcfg_table ( ) else {
129
+ return false ;
130
+ } ;
120
131
121
- let mut start_addr: * const McfgTableEntry = core:: ptr:: with_exposed_provenance ( table. table_start_address ( ) + 8 ) ;
122
- let end_addr: * const McfgTableEntry = core:: ptr:: with_exposed_provenance ( table. table_end_address ( ) + 8 ) ;
132
+ let mut start_addr: * const McfgTableEntry =
133
+ core:: ptr:: with_exposed_provenance ( table. table_start_address ( ) + 8 ) ;
134
+ let end_addr: * const McfgTableEntry =
135
+ core:: ptr:: with_exposed_provenance ( table. table_end_address ( ) + 8 ) ;
123
136
124
137
if start_addr == end_addr {
125
138
return false ;
126
139
}
127
140
128
141
while start_addr < end_addr {
129
142
unsafe {
130
- let read = ptr:: read_unaligned ( start_addr) ;
143
+ let read = core :: ptr:: read_unaligned ( start_addr) ;
131
144
init_pcie_bus ( read) ;
132
145
start_addr = start_addr. add ( 1 ) ;
133
146
}
@@ -136,58 +149,41 @@ mod pcie {
136
149
true
137
150
}
138
151
139
- #[ derive( Debug ) ]
140
- #[ repr( C ) ]
141
- struct PcieDeviceConfig {
142
- vendor_id : u16 ,
143
- device_id : u16 ,
144
- _reserved : [ u8 ; 4096 - 8 ]
145
- }
146
-
147
152
#[ derive( Debug , Copy , Clone ) ]
148
153
#[ repr( C ) ]
149
154
pub ( crate ) struct McfgTableEntry {
150
155
pub base_address : u64 ,
151
156
pub pci_segment_number : u16 ,
152
157
pub start_pci_bus : u8 ,
153
158
pub end_pci_bus : u8 ,
154
- _reserved : u32
159
+ _reserved : u32 ,
155
160
}
156
161
157
162
impl McfgTableEntry {
158
- pub fn pci_config_space_address ( & self , bus_number : u8 , device : u8 , function : u8 ) -> PhysAddr {
163
+ pub fn pci_config_space_address (
164
+ & self ,
165
+ bus_number : u8 ,
166
+ device : u8 ,
167
+ function : u8 ,
168
+ ) -> PhysAddr {
159
169
PhysAddr :: new (
160
- self . base_address +
161
- ( ( bus_number as u64 ) << 20 ) |
162
- ( ( ( device as u64 ) & 0x1f ) << 15 ) |
163
- ( ( ( function as u64 ) & 0x7 ) << 12 )
170
+ self . base_address
171
+ + ( ( u64:: from ( bus_number ) << 20 )
172
+ | ( ( u64 :: from ( device) & 0x1f ) << 15 )
173
+ | ( ( u64 :: from ( function) & 0x7 ) << 12 ) ) ,
164
174
)
165
175
}
166
176
}
167
177
168
- #[ derive( Debug ) ]
169
- #[ cfg( feature = "pci" ) ]
170
- struct McfgTable ( alloc:: vec:: Vec < McfgTableEntry > ) ;
171
-
172
- impl PcieDeviceConfig {
173
- fn get < ' a > ( physical_address : PhysAddr ) -> & ' a Self {
174
- assert ! ( env:: is_uefi( ) ) ;
175
-
176
- // For UEFI Systems, the tables are already mapped so we only need to return a proper reference to the table
177
- let allocated_virtual_address = VirtAddr :: new ( physical_address. as_u64 ( ) ) ;
178
- let ptr: * const PcieDeviceConfig = allocated_virtual_address. as_ptr ( ) ;
179
-
180
- unsafe { ptr. as_ref ( ) . unwrap ( ) }
181
- }
182
- }
183
-
184
178
impl ConfigRegionAccess for McfgTableEntry {
185
179
unsafe fn read ( & self , address : PciAddress , offset : u16 ) -> u32 {
186
180
assert_eq ! ( address. segment( ) , self . pci_segment_number) ;
187
181
assert ! ( address. bus( ) >= self . start_pci_bus) ;
188
182
assert ! ( address. bus( ) <= self . end_pci_bus) ;
189
183
190
- let ptr = self . pci_config_space_address ( address. bus ( ) , address. device ( ) , address. function ( ) ) + offset as u64 ;
184
+ let ptr =
185
+ self . pci_config_space_address ( address. bus ( ) , address. device ( ) , address. function ( ) )
186
+ + u64:: from ( offset) ;
191
187
let ptr = ptr. as_usize ( ) as * const u32 ;
192
188
193
189
unsafe { * ptr }
@@ -198,10 +194,14 @@ mod pcie {
198
194
assert ! ( address. bus( ) >= self . start_pci_bus) ;
199
195
assert ! ( address. bus( ) <= self . end_pci_bus) ;
200
196
201
- let ptr = self . pci_config_space_address ( address. bus ( ) , address. device ( ) , address. function ( ) ) + offset as u64 ;
197
+ let ptr =
198
+ self . pci_config_space_address ( address. bus ( ) , address. device ( ) , address. function ( ) )
199
+ + u64:: from ( offset) ;
202
200
let ptr = ptr. as_usize ( ) as * mut u32 ;
203
201
204
- unsafe { * ptr = value; }
202
+ unsafe {
203
+ * ptr = value;
204
+ }
205
205
}
206
206
}
207
207
@@ -210,7 +210,15 @@ mod pcie {
210
210
return ;
211
211
}
212
212
213
- let end = if bus_entry. end_pci_bus > PCI_MAX_BUS_NUMBER { PCI_MAX_BUS_NUMBER } else { bus_entry. end_pci_bus } ;
214
- super :: enumerate_devices ( bus_entry. start_pci_bus , end, PciConfigAccess :: PcieConfigRegion ( bus_entry) ) ;
213
+ let end = if bus_entry. end_pci_bus > PCI_MAX_BUS_NUMBER {
214
+ PCI_MAX_BUS_NUMBER
215
+ } else {
216
+ bus_entry. end_pci_bus
217
+ } ;
218
+ super :: enumerate_devices (
219
+ bus_entry. start_pci_bus ,
220
+ end,
221
+ PciConfigAccess :: PcieConfigRegion ( bus_entry) ,
222
+ ) ;
215
223
}
216
- }
224
+ }
0 commit comments