Improve Framework Message support and fix small errors

Change-Id: I6d63abacf266d22b114e7ff8e3e31c490b8c755a
Signed-off-by: Tomás González <tomasagustin.gonzalezorlando@arm.com>
diff --git a/src/lib.rs b/src/lib.rs
index 48264b6..2695d8d 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -348,15 +348,15 @@
     },
     /// Message for a power management operation initiated by a PSCI function
     PowerPsciReq32 {
-        function_id: u32,
         // params[i]: Input parameter in w[i] in PSCI function invocation at EL3.
-        params: [u32; 3],
+        // params[0]: Function ID.
+        params: [u32; 4],
     },
     /// Message for a power management operation initiated by a PSCI function
     PowerPsciReq64 {
-        function_id: u32,
         // params[i]: Input parameter in x[i] in PSCI function invocation at EL3.
-        params: [u64; 3],
+        // params[0]: Function ID.
+        params: [u64; 4],
     },
     /// Message for a warm boot
     PowerWarmBootReq {
@@ -366,7 +366,6 @@
     /// Return error code SUCCESS or DENIED as defined in PSCI spec. Caller is left to do the
     /// parsing of the return status.
     PowerPsciResp {
-        // TODO: Use arm-psci crate's return status here.
         psci_status: i32,
     },
     /// Message to signal creation of a VM
@@ -835,8 +834,12 @@
                             version: Version::try_from(regs[3] as u32)?,
                         },
                         DirectMsgArgs::POWER_PSCI_REQ => DirectMsgArgs::PowerPsciReq32 {
-                            function_id: regs[3] as u32,
-                            params: [regs[4] as u32, regs[5] as u32, regs[6] as u32],
+                            params: [
+                                regs[3] as u32,
+                                regs[4] as u32,
+                                regs[5] as u32,
+                                regs[6] as u32,
+                            ],
                         },
                         DirectMsgArgs::POWER_WARM_BOOT_REQ => DirectMsgArgs::PowerWarmBootReq {
                             boot_type: WarmBootType::try_from(regs[3] as u32)?,
@@ -873,8 +876,7 @@
                 args: if (regs[2] & DirectMsgArgs::FWK_MSG_BITS as u64) != 0 {
                     match regs[2] as u32 {
                         DirectMsgArgs::POWER_PSCI_REQ => DirectMsgArgs::PowerPsciReq64 {
-                            function_id: regs[3] as u32,
-                            params: [regs[4], regs[5], regs[6]],
+                            params: [regs[3], regs[4], regs[5], regs[6]],
                         },
                         _ => return Err(Error::UnrecognisedFwkMsg(regs[2] as u32)),
                     }
@@ -1273,25 +1275,19 @@
                         a[2] = DirectMsgArgs::VERSION_REQ.into();
                         a[3] = u32::from(version).into();
                     }
-                    DirectMsgArgs::PowerPsciReq32 {
-                        function_id,
-                        params,
-                    } => {
+                    DirectMsgArgs::PowerPsciReq32 { params } => {
                         a[2] = DirectMsgArgs::POWER_PSCI_REQ.into();
-                        a[3] = function_id.into();
-                        a[4] = params[0].into();
-                        a[5] = params[1].into();
-                        a[6] = params[2].into();
+                        a[3] = params[0].into();
+                        a[4] = params[1].into();
+                        a[5] = params[2].into();
+                        a[6] = params[3].into();
                     }
-                    DirectMsgArgs::PowerPsciReq64 {
-                        function_id,
-                        params,
-                    } => {
+                    DirectMsgArgs::PowerPsciReq64 { params } => {
                         a[2] = DirectMsgArgs::POWER_PSCI_REQ.into();
-                        a[3] = function_id.into();
-                        a[4] = params[0];
-                        a[5] = params[1];
-                        a[6] = params[2];
+                        a[3] = params[0];
+                        a[4] = params[1];
+                        a[5] = params[2];
+                        a[6] = params[3];
                     }
                     DirectMsgArgs::PowerWarmBootReq { boot_type } => {
                         a[2] = DirectMsgArgs::POWER_WARM_BOOT_REQ.into();
@@ -1338,7 +1334,7 @@
                     DirectMsgArgs::VersionResp { version } => {
                         a[2] = DirectMsgArgs::VERSION_RESP.into();
                         match version {
-                            None => a[3] = i32::from(FfaError::NotSupported) as u64,
+                            None => a[3] = (i32::from(FfaError::NotSupported) as u32).into(),
                             Some(ver) => a[3] = u32::from(ver).into(),
                         }
                     }
@@ -1348,11 +1344,11 @@
                     }
                     DirectMsgArgs::VmCreatedAck { sp_status } => {
                         a[2] = DirectMsgArgs::VM_CREATED_ACK.into();
-                        a[4] = i32::from(sp_status) as u64;
+                        a[3] = (i32::from(sp_status) as u32).into();
                     }
                     DirectMsgArgs::VmDestructedAck { sp_status } => {
                         a[2] = DirectMsgArgs::VM_DESTRUCTED_ACK.into();
-                        a[3] = i32::from(sp_status) as u64;
+                        a[3] = (i32::from(sp_status) as u32).into();
                     }
                     _ => panic!("Malformed MsgSendDirectResp interface"),
                 }