summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Baluta <daniel.baluta@nxp.com>2019-01-30 08:30:22 -0500
committerShawn Guo <shawnguo@kernel.org>2019-02-10 21:00:47 -0500
commitd90bf296ae18f26a18e572965fc0047fa1bd37a8 (patch)
tree8beda78e72fcca8056bf20d9c0f08e484bd01da0
parent9b0bb07328f2375b2b6d3f8343edb1ee1ed39307 (diff)
firmware: imx: Add support to start/stop a CPU
This is done via RPC call to SCU. Signed-off-by: Daniel Baluta <daniel.baluta@nxp.com> Reviewed-by: Dong Aisheng <aisheng.dong@nxp.com> Signed-off-by: Shawn Guo <shawnguo@kernel.org>
-rw-r--r--drivers/firmware/imx/misc.c38
-rw-r--r--include/linux/firmware/imx/svc/misc.h3
2 files changed, 41 insertions, 0 deletions
diff --git a/drivers/firmware/imx/misc.c b/drivers/firmware/imx/misc.c
index 97f5424dbac9..4b56a587dacd 100644
--- a/drivers/firmware/imx/misc.c
+++ b/drivers/firmware/imx/misc.c
@@ -18,6 +18,14 @@ struct imx_sc_msg_req_misc_set_ctrl {
18 u16 resource; 18 u16 resource;
19} __packed; 19} __packed;
20 20
21struct imx_sc_msg_req_cpu_start {
22 struct imx_sc_rpc_msg hdr;
23 u32 address_hi;
24 u32 address_lo;
25 u16 resource;
26 u8 enable;
27} __packed;
28
21struct imx_sc_msg_req_misc_get_ctrl { 29struct imx_sc_msg_req_misc_get_ctrl {
22 struct imx_sc_rpc_msg hdr; 30 struct imx_sc_rpc_msg hdr;
23 u32 ctrl; 31 u32 ctrl;
@@ -97,3 +105,33 @@ int imx_sc_misc_get_control(struct imx_sc_ipc *ipc, u32 resource,
97 return 0; 105 return 0;
98} 106}
99EXPORT_SYMBOL(imx_sc_misc_get_control); 107EXPORT_SYMBOL(imx_sc_misc_get_control);
108
109/*
110 * This function starts/stops a CPU identified by @resource
111 *
112 * @param[in] ipc IPC handle
113 * @param[in] resource resource the control is associated with
114 * @param[in] enable true for start, false for stop
115 * @param[in] phys_addr initial instruction address to be executed
116 *
117 * @return Returns 0 for success and < 0 for errors.
118 */
119int imx_sc_pm_cpu_start(struct imx_sc_ipc *ipc, u32 resource,
120 bool enable, u64 phys_addr)
121{
122 struct imx_sc_msg_req_cpu_start msg;
123 struct imx_sc_rpc_msg *hdr = &msg.hdr;
124
125 hdr->ver = IMX_SC_RPC_VERSION;
126 hdr->svc = IMX_SC_RPC_SVC_PM;
127 hdr->func = IMX_SC_PM_FUNC_CPU_START;
128 hdr->size = 4;
129
130 msg.address_hi = phys_addr >> 32;
131 msg.address_lo = phys_addr;
132 msg.resource = resource;
133 msg.enable = enable;
134
135 return imx_scu_call_rpc(ipc, &msg, true);
136}
137EXPORT_SYMBOL(imx_sc_pm_cpu_start);
diff --git a/include/linux/firmware/imx/svc/misc.h b/include/linux/firmware/imx/svc/misc.h
index e21c49aba92f..031dd4d3c766 100644
--- a/include/linux/firmware/imx/svc/misc.h
+++ b/include/linux/firmware/imx/svc/misc.h
@@ -52,4 +52,7 @@ int imx_sc_misc_set_control(struct imx_sc_ipc *ipc, u32 resource,
52int imx_sc_misc_get_control(struct imx_sc_ipc *ipc, u32 resource, 52int imx_sc_misc_get_control(struct imx_sc_ipc *ipc, u32 resource,
53 u8 ctrl, u32 *val); 53 u8 ctrl, u32 *val);
54 54
55int imx_sc_pm_cpu_start(struct imx_sc_ipc *ipc, u32 resource,
56 bool enable, u64 phys_addr);
57
55#endif /* _SC_MISC_API_H */ 58#endif /* _SC_MISC_API_H */