Add success types for FFA_ID_GET and FFA_SPM_ID_GET

Add specialized success types for converting between FFA_ID_GET and
FFA_SPM_ID_GET return arguments and generic success arguments

Signed-off-by: Imre Kis <imre.kis@arm.com>
Change-Id: I16ef1c47a8538ccc1788d23de8f3e427b5c154ae
diff --git a/src/lib.rs b/src/lib.rs
index e3c9778..174ea9b 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -205,6 +205,8 @@
 ///
 /// The current specialized success arguments types are:
 /// * `FFA_FEATURES` - [`SuccessArgsFeatures`]
+/// * `FFA_ID_GET` - [`SuccessArgsIdGet`]
+/// * `FFA_SPM_ID_GET` - [`SuccessArgsSpmIdGet`]
 #[derive(Debug, Eq, PartialEq, Clone, Copy)]
 pub enum SuccessArgs {
     Args32([u32; 6]),
@@ -368,6 +370,48 @@
     Addr64 { rx: u64, tx: u64 },
 }
 
+/// `FFA_ID_GET` specific success argument structure.
+#[derive(Debug, Eq, PartialEq, Clone, Copy)]
+pub struct SuccessArgsIdGet {
+    pub id: u16,
+}
+
+impl From<SuccessArgsIdGet> for SuccessArgs {
+    fn from(value: SuccessArgsIdGet) -> Self {
+        SuccessArgs::Args32([value.id as u32, 0, 0, 0, 0, 0])
+    }
+}
+
+impl TryFrom<SuccessArgs> for SuccessArgsIdGet {
+    type Error = Error;
+
+    fn try_from(value: SuccessArgs) -> Result<Self, Self::Error> {
+        let args = value.try_get_args32()?;
+        Ok(Self { id: args[0] as u16 })
+    }
+}
+
+/// `FFA_SPM_ID_GET` specific success argument structure.
+#[derive(Debug, Eq, PartialEq, Clone, Copy)]
+pub struct SuccessArgsSpmIdGet {
+    pub id: u16,
+}
+
+impl From<SuccessArgsSpmIdGet> for SuccessArgs {
+    fn from(value: SuccessArgsSpmIdGet) -> Self {
+        SuccessArgs::Args32([value.id as u32, 0, 0, 0, 0, 0])
+    }
+}
+
+impl TryFrom<SuccessArgs> for SuccessArgsSpmIdGet {
+    type Error = Error;
+
+    fn try_from(value: SuccessArgs) -> Result<Self, Self::Error> {
+        let args = value.try_get_args32()?;
+        Ok(Self { id: args[0] as u16 })
+    }
+}
+
 /// Flags of the `FFA_PARTITION_INFO_GET` interface.
 #[derive(Debug, Eq, PartialEq, Clone, Copy)]
 pub struct PartitionInfoGetFlags {