imx: scu_api: add sc_pm_is_partition_started
authorPeng Fan <peng.fan@nxp.com>
Mon, 26 Aug 2019 08:12:16 +0000 (08:12 +0000)
committerStefano Babic <sbabic@denx.de>
Tue, 8 Oct 2019 14:35:59 +0000 (16:35 +0200)
Add sc_pm_is_partition_started to check whether a partition
has been started. This will be used to detect M4 partition booted up or
not, then we could choose which dtb to use. If M4 is up, we need
use dtb, such as imx8qm-mek-rpmsg.dtb.

Signed-off-by: Peng Fan <peng.fan@nxp.com>
arch/arm/include/asm/arch-imx8/sci/rpc.h
arch/arm/include/asm/arch-imx8/sci/sci.h
drivers/misc/imx8/scu_api.c

index 746c2fa24d58bce71f20a58396c5aa99b9b46c53..0dfd89ad11ae5d613a2961f09df9ae0af7826c54 100644 (file)
@@ -32,7 +32,9 @@
 #define SC_RPC_SVC_PAD          6U
 #define SC_RPC_SVC_MISC         7U
 #define SC_RPC_SVC_IRQ          8U
-#define SC_RPC_SVC_ABORT        9U
+#define SC_RPC_SVC_SECO         9U
+#define SC_RPC_SVC_ABORT        10U
+
 
 /* Types */
 
@@ -74,6 +76,7 @@ struct sc_rpc_msg_s {
 #define PM_FUNC_REBOOT                         9U
 #define PM_FUNC_REBOOT_PARTITION               12U
 #define PM_FUNC_CPU_START                      11U
+#define PM_FUNC_IS_PARTITION_STARTED 24U
 
 /* MISC RPC */
 #define MISC_FUNC_UNKNOWN                      0
index 48810e251c498eea1329907805775450b8160b2a..55b392fde158c6b493c65d3537f7b17f95deff83 100644 (file)
@@ -81,6 +81,7 @@ int sc_rm_get_memreg_info(sc_ipc_t ipc, sc_rm_mr_t mr, sc_faddr_t *addr_start,
                          sc_faddr_t *addr_end);
 sc_bool_t sc_rm_is_resource_owned(sc_ipc_t ipc, sc_rsrc_t resource);
 int sc_rm_set_master_sid(sc_ipc_t ipc, sc_rsrc_t resource, sc_rm_sid_t sid);
+sc_bool_t sc_pm_is_partition_started(sc_ipc_t ipc, sc_rm_pt_t pt);
 
 /* PAD API */
 int sc_pad_set(sc_ipc_t ipc, sc_pad_t pad, u32 val);
index 1856f3a44af9febb49f6c66105a3e1c74d0582ee..000a31f1b7b1df118582611e093f3d6a944c4322 100644 (file)
@@ -119,6 +119,33 @@ int sc_pm_set_resource_power_mode(sc_ipc_t ipc, sc_rsrc_t resource,
        return ret;
 }
 
+sc_bool_t sc_pm_is_partition_started(sc_ipc_t ipc, sc_rm_pt_t pt)
+{
+       struct udevice *dev = gd->arch.scu_dev;
+       int size = sizeof(struct sc_rpc_msg_s);
+       struct sc_rpc_msg_s msg;
+       int ret;
+       u8 result;
+
+       RPC_VER(&msg) = SC_RPC_VERSION;
+       RPC_SVC(&msg) = (u8)(SC_RPC_SVC_PM);
+       RPC_FUNC(&msg) = (u8)(PM_FUNC_IS_PARTITION_STARTED);
+       RPC_U8(&msg, 0U) = (u8)(pt);
+       RPC_SIZE(&msg) = 2U;
+
+       ret = misc_call(dev, SC_FALSE, &msg, size, &msg, size);
+
+       result = RPC_R8(&msg);
+       if (result != 0 && result != 1) {
+               printf("%s: partition:%d res:%d\n",
+                      __func__, pt, RPC_R8(&msg));
+               if (ret)
+                       printf("%s: partition:%d res:%d\n", __func__, pt,
+                              RPC_R8(&msg));
+       }
+       return !!result;
+}
+
 /* PAD */
 int sc_pad_set(sc_ipc_t ipc, sc_pad_t pad, u32 val)
 {