From 2ed3d738b2668b64d3ea6a76a8a8b1eff0a091de Mon Sep 17 00:00:00 2001 From: Rajas Paranjpe <52586855+ChocolateLoverRaj@users.noreply.github.com> Date: Sat, 2 Aug 2025 12:02:59 -0700 Subject: [PATCH] Add structs for TCPA and TPM2 tables Not complete --- acpi/src/lib.rs | 2 ++ acpi/src/tcpa.rs | 21 +++++++++++++++ acpi/src/tpm2.rs | 69 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 92 insertions(+) create mode 100644 acpi/src/tcpa.rs create mode 100644 acpi/src/tpm2.rs diff --git a/acpi/src/lib.rs b/acpi/src/lib.rs index 0b254df1..f6673678 100644 --- a/acpi/src/lib.rs +++ b/acpi/src/lib.rs @@ -73,6 +73,8 @@ pub mod mcfg; pub mod rsdp; pub mod sdt; pub mod spcr; +pub mod tcpa; +pub mod tpm2; #[cfg(feature = "allocator_api")] mod managed_slice; diff --git a/acpi/src/tcpa.rs b/acpi/src/tcpa.rs new file mode 100644 index 00000000..41266046 --- /dev/null +++ b/acpi/src/tcpa.rs @@ -0,0 +1,21 @@ +use crate::{ + sdt::{SdtHeader, Signature}, + AcpiTable, +}; + +#[repr(C, packed)] +#[derive(Debug)] +pub struct Tcpa { + pub header: SdtHeader, + platform_class: u16, + pub log_area_minimum_len: u32, + pub log_area_start_addr: u64, +} + +unsafe impl AcpiTable for Tcpa { + const SIGNATURE: Signature = Signature::TCPA; + + fn header(&self) -> &crate::sdt::SdtHeader { + &self.header + } +} diff --git a/acpi/src/tpm2.rs b/acpi/src/tpm2.rs new file mode 100644 index 00000000..bda9ea74 --- /dev/null +++ b/acpi/src/tpm2.rs @@ -0,0 +1,69 @@ +use crate::{ + sdt::{SdtHeader, Signature}, + AcpiTable, +}; + +#[repr(C, packed)] +#[derive(Debug)] +pub struct Tpm2 { + pub header: SdtHeader, + platform_class: u16, + _reserved: [u8; 2], + addr_of_crb_control_area_or_fifo_base_addr: u64, + start_method: u32, + start_method_parameters: [u8; 16], + log_area_minimum_len: u32, + log_area_start_addr: u64, +} + +unsafe impl AcpiTable for Tpm2 { + const SIGNATURE: Signature = Signature::TPM2; + + fn header(&self) -> &crate::sdt::SdtHeader { + &self.header + } +} + +impl Tpm2 { + pub fn platform_class(&self) -> Option { + match self.platform_class { + 0 => Some(PlatformClass::Client), + 1 => Some(PlatformClass::Server), + _ => None, + } + } + + pub fn start_method(&self) -> Option { + match self.start_method { + 2 => Some(StartMethod::AcpiStartMethod), + 6 => Some(StartMethod::Mmio), + 7 => Some(StartMethod::CommandResponseBufferInterface), + 8 => Some(StartMethod::CommandResponseBufferInterfaceWithAcpiStartMethod), + 11 => Some(StartMethod::CommandResponseBufferWithArmSecureMonitorOrHypervisorCall), + 12 => Some(StartMethod::FifoOverI2c), + 13 => Some(StartMethod::CommandResponseBufferInterfaceWithAmdMailboxSpecificNotification), + 15 => Some(StartMethod::CommandResponseBufferInterfaceWithAmdFirmwareFrameworkA), + _ => None, + } + } +} + +#[derive(Debug)] +#[repr(u16)] +pub enum PlatformClass { + Client, + Server, +} + +#[derive(Debug)] +#[repr(u32)] +pub enum StartMethod { + AcpiStartMethod = 2, + Mmio = 6, + CommandResponseBufferInterface = 7, + CommandResponseBufferInterfaceWithAcpiStartMethod = 8, + CommandResponseBufferWithArmSecureMonitorOrHypervisorCall = 11, + FifoOverI2c = 12, + CommandResponseBufferInterfaceWithAmdMailboxSpecificNotification = 13, + CommandResponseBufferInterfaceWithAmdFirmwareFrameworkA = 15, +}