Skip to content

Commit fb7e47b

Browse files
committed
Allow non-standard access sizes in Generic Address Structures
This is required for various special address space types (e.g. the PCC)
1 parent 44c0a12 commit fb7e47b

File tree

2 files changed

+24
-18
lines changed

2 files changed

+24
-18
lines changed

src/address.rs

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -49,25 +49,27 @@ pub enum AddressSpace {
4949
OemDefined(u8),
5050
}
5151

52+
/// Specifies a standard access size. The access size of a GAS can be non-standard, and is defined
53+
/// by the Address Space ID in such cases.
5254
#[derive(PartialEq, Eq, Clone, Copy, Debug)]
53-
pub enum AccessSize {
55+
pub enum StandardAccessSize {
5456
Undefined,
5557
ByteAccess,
5658
WordAccess,
5759
DWordAccess,
5860
QWordAccess,
5961
}
6062

61-
impl TryFrom<u8> for AccessSize {
63+
impl TryFrom<u8> for StandardAccessSize {
6264
type Error = AcpiError;
6365

6466
fn try_from(size: u8) -> Result<Self, Self::Error> {
6567
match size {
66-
0 => Ok(AccessSize::Undefined),
67-
1 => Ok(AccessSize::ByteAccess),
68-
2 => Ok(AccessSize::WordAccess),
69-
3 => Ok(AccessSize::DWordAccess),
70-
4 => Ok(AccessSize::QWordAccess),
68+
0 => Ok(StandardAccessSize::Undefined),
69+
1 => Ok(StandardAccessSize::ByteAccess),
70+
2 => Ok(StandardAccessSize::WordAccess),
71+
3 => Ok(StandardAccessSize::DWordAccess),
72+
4 => Ok(StandardAccessSize::QWordAccess),
7173
_ => Err(AcpiError::InvalidGenericAddress),
7274
}
7375
}
@@ -78,7 +80,7 @@ pub struct GenericAddress {
7880
pub address_space: AddressSpace,
7981
pub bit_width: u8,
8082
pub bit_offset: u8,
81-
pub access_size: AccessSize,
83+
pub access_size: u8,
8284
pub address: u64,
8385
}
8486

@@ -106,8 +108,12 @@ impl GenericAddress {
106108
address_space,
107109
bit_width: raw.bit_width,
108110
bit_offset: raw.bit_offset,
109-
access_size: AccessSize::try_from(raw.access_size)?,
111+
access_size: raw.access_size,
110112
address: raw.address,
111113
})
112114
}
115+
116+
pub fn standard_access_size(&self) -> Result<StandardAccessSize, AcpiError> {
117+
StandardAccessSize::try_from(self.access_size)
118+
}
113119
}

src/sdt/fadt.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::{
22
AcpiError,
33
AcpiTable,
4-
address::{AccessSize, AddressSpace, GenericAddress, RawGenericAddress},
4+
address::{AddressSpace, GenericAddress, RawGenericAddress, StandardAccessSize},
55
sdt::{ExtendedField, SdtHeader, Signature},
66
};
77
use bit_field::BitField;
@@ -179,7 +179,7 @@ impl Fadt {
179179
address_space: AddressSpace::SystemIo,
180180
bit_width: self.pm1_event_length * 8,
181181
bit_offset: 0,
182-
access_size: AccessSize::Undefined,
182+
access_size: 0,
183183
address: self.pm1a_event_block.into(),
184184
})
185185
}
@@ -196,7 +196,7 @@ impl Fadt {
196196
address_space: AddressSpace::SystemIo,
197197
bit_width: self.pm1_event_length * 8,
198198
bit_offset: 0,
199-
access_size: AccessSize::Undefined,
199+
access_size: 0,
200200
address: self.pm1b_event_block.into(),
201201
}))
202202
} else {
@@ -215,7 +215,7 @@ impl Fadt {
215215
address_space: AddressSpace::SystemIo,
216216
bit_width: self.pm1_control_length * 8,
217217
bit_offset: 0,
218-
access_size: AccessSize::Undefined,
218+
access_size: 0,
219219
address: self.pm1a_control_block.into(),
220220
})
221221
}
@@ -232,7 +232,7 @@ impl Fadt {
232232
address_space: AddressSpace::SystemIo,
233233
bit_width: self.pm1_control_length * 8,
234234
bit_offset: 0,
235-
access_size: AccessSize::Undefined,
235+
access_size: 0,
236236
address: self.pm1b_control_block.into(),
237237
}))
238238
} else {
@@ -252,7 +252,7 @@ impl Fadt {
252252
address_space: AddressSpace::SystemIo,
253253
bit_width: self.pm2_control_length * 8,
254254
bit_offset: 0,
255-
access_size: AccessSize::Undefined,
255+
access_size: 0,
256256
address: self.pm2_control_block.into(),
257257
}))
258258
} else {
@@ -279,7 +279,7 @@ impl Fadt {
279279
address_space: AddressSpace::SystemIo,
280280
bit_width: 32,
281281
bit_offset: 0,
282-
access_size: AccessSize::Undefined,
282+
access_size: 0,
283283
address: self.pm_timer_block.into(),
284284
}))
285285
} else {
@@ -299,7 +299,7 @@ impl Fadt {
299299
address_space: AddressSpace::SystemIo,
300300
bit_width: self.gpe0_block_length * 8,
301301
bit_offset: 0,
302-
access_size: AccessSize::Undefined,
302+
access_size: 0,
303303
address: self.gpe0_block.into(),
304304
}))
305305
} else {
@@ -319,7 +319,7 @@ impl Fadt {
319319
address_space: AddressSpace::SystemIo,
320320
bit_width: self.gpe1_block_length * 8,
321321
bit_offset: 0,
322-
access_size: AccessSize::Undefined,
322+
access_size: 0,
323323
address: self.gpe1_block.into(),
324324
}))
325325
} else {

0 commit comments

Comments
 (0)