diff options
author | Daniel Baluta <daniel.baluta@nxp.com> | 2019-01-30 08:30:22 -0500 |
---|---|---|
committer | Shawn Guo <shawnguo@kernel.org> | 2019-02-10 21:00:47 -0500 |
commit | d90bf296ae18f26a18e572965fc0047fa1bd37a8 (patch) | |
tree | 8beda78e72fcca8056bf20d9c0f08e484bd01da0 | |
parent | 9b0bb07328f2375b2b6d3f8343edb1ee1ed39307 (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.c | 38 | ||||
-rw-r--r-- | include/linux/firmware/imx/svc/misc.h | 3 |
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 | ||
21 | struct 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 | |||
21 | struct imx_sc_msg_req_misc_get_ctrl { | 29 | struct 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 | } |
99 | EXPORT_SYMBOL(imx_sc_misc_get_control); | 107 | EXPORT_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 | */ | ||
119 | int 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 | } | ||
137 | EXPORT_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, | |||
52 | int imx_sc_misc_get_control(struct imx_sc_ipc *ipc, u32 resource, | 52 | int imx_sc_misc_get_control(struct imx_sc_ipc *ipc, u32 resource, |
53 | u8 ctrl, u32 *val); | 53 | u8 ctrl, u32 *val); |
54 | 54 | ||
55 | int 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 */ |