2
0

value.rs 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. use super::AmlError;
  2. use bit_field::BitField;
  3. #[derive(Debug)]
  4. pub enum RegionSpace {
  5. SystemMemory,
  6. SystemIo,
  7. PciConfig,
  8. EmbeddedControl,
  9. SMBus,
  10. SystemCmos,
  11. PciBarTarget,
  12. IPMI,
  13. GeneralPurposeIo,
  14. GenericSerialBus,
  15. OemDefined(u8),
  16. }
  17. pub enum FieldAccessType {
  18. Any,
  19. Byte,
  20. Word,
  21. DWord,
  22. QWord,
  23. Buffer,
  24. Reserved,
  25. }
  26. pub enum FieldUpdateRule {
  27. Preserve,
  28. WriteAsOnes,
  29. WriteAsZeros,
  30. }
  31. #[derive(Clone, Copy, Debug)] // TODO: custom debug / get rid of completely
  32. pub struct FieldFlags(u8);
  33. impl FieldFlags {
  34. pub fn new(value: u8) -> FieldFlags {
  35. FieldFlags(value)
  36. }
  37. pub fn access_type(&self) -> Result<FieldAccessType, AmlError> {
  38. match self.0.get_bits(0..4) {
  39. 0 => Ok(FieldAccessType::Any),
  40. 1 => Ok(FieldAccessType::Byte),
  41. 2 => Ok(FieldAccessType::Word),
  42. 3 => Ok(FieldAccessType::DWord),
  43. 4 => Ok(FieldAccessType::QWord),
  44. 5 => Ok(FieldAccessType::Buffer),
  45. _ => Err(AmlError::InvalidFieldFlags),
  46. }
  47. }
  48. pub fn lock_rule(&self) -> bool {
  49. self.0.get_bit(4)
  50. }
  51. pub fn field_update_rule(&self) -> Result<FieldUpdateRule, AmlError> {
  52. match self.0.get_bits(5..7) {
  53. 0 => Ok(FieldUpdateRule::Preserve),
  54. 1 => Ok(FieldUpdateRule::WriteAsOnes),
  55. 2 => Ok(FieldUpdateRule::WriteAsZeros),
  56. _ => Err(AmlError::InvalidFieldFlags),
  57. }
  58. }
  59. }
  60. #[derive(Debug)]
  61. pub enum AmlValue {
  62. Integer(u64),
  63. OpRegion {
  64. region: RegionSpace,
  65. offset: u64,
  66. length: u64,
  67. },
  68. Field {
  69. flags: FieldFlags,
  70. offset: u64,
  71. length: u64,
  72. },
  73. }
  74. impl AmlValue {
  75. pub fn as_integer(&self) -> Result<u64, AmlError> {
  76. match self {
  77. AmlValue::Integer(value) => Ok(*value),
  78. _ => Err(AmlError::IncompatibleValueConversion),
  79. }
  80. }
  81. }