peripheral-reset-8960: Run-time detect secure boot support.
Signed-off-by: Saravana Kannan <skannan@codeaurora.org>
diff --git a/arch/arm/mach-msm/peripheral-reset-8960.c b/arch/arm/mach-msm/peripheral-reset-8960.c
index 3c14dc1..d251cc2 100644
--- a/arch/arm/mach-msm/peripheral-reset-8960.c
+++ b/arch/arm/mach-msm/peripheral-reset-8960.c
@@ -129,6 +129,7 @@
#define PAS_MEM_CMD 2
#define PAS_AUTH_AND_RESET_CMD 5
#define PAS_SHUTDOWN_CMD 6
+#define PAS_IS_SUPPORTED_CMD 7
struct pas_init_image_req {
u32 proc;
@@ -803,11 +804,58 @@
return err;
}
-#ifdef CONFIG_MSM_SECURE_PIL
+static int __init can_secure_boot(int id)
+{
+ int ret;
+ u32 periph = id;
+ u32 ret_val = 0;
+
+ ret = scm_call(SCM_SVC_PIL, PAS_IS_SUPPORTED_CMD, &periph,
+ sizeof(periph), &ret_val, sizeof(ret_val));
+ if (ret)
+ return ret;
+
+ return ret_val;
+}
+
static bool secure_pil = true;
-#else
-static bool secure_pil;
-#endif
+
+static void __init use_secure_pil(void)
+{
+
+ if (scm_is_call_available(SCM_SVC_PIL, PAS_IS_SUPPORTED_CMD) <= 0)
+ return;
+
+ if (can_secure_boot(PAS_Q6) > 0) {
+ pil_lpass_q6_ops.init_image = init_image_lpass_q6_trusted;
+ pil_lpass_q6_ops.auth_and_reset = reset_lpass_q6_trusted;
+ pil_lpass_q6_ops.shutdown = shutdown_lpass_q6_trusted;
+ }
+
+ if (can_secure_boot(PAS_MODEM_FW) > 0) {
+ pil_modem_fw_q6_ops.init_image = init_image_modem_fw_q6_trusted;
+ pil_modem_fw_q6_ops.auth_and_reset = reset_modem_fw_q6_trusted;
+ pil_modem_fw_q6_ops.shutdown = shutdown_modem_fw_q6_trusted;
+ }
+
+ if (can_secure_boot(PAS_MODEM_SW) > 0) {
+ pil_modem_sw_q6_ops.init_image = init_image_modem_sw_q6_trusted;
+ pil_modem_sw_q6_ops.auth_and_reset = reset_modem_sw_q6_trusted;
+ pil_modem_sw_q6_ops.shutdown = shutdown_modem_sw_q6_trusted;
+ }
+
+ if (can_secure_boot(PAS_DSPS) > 0) {
+ pil_dsps_ops.init_image = init_image_dsps_trusted;
+ pil_dsps_ops.auth_and_reset = reset_dsps_trusted;
+ pil_dsps_ops.shutdown = shutdown_dsps_trusted;
+ }
+
+ if (can_secure_boot(PAS_RIVA) > 0) {
+ pil_riva_ops.init_image = init_image_riva_trusted;
+ pil_riva_ops.auth_and_reset = reset_riva_trusted;
+ pil_riva_ops.shutdown = shutdown_riva_trusted;
+ }
+}
static int __init msm_peripheral_reset_init(void)
{
@@ -820,27 +868,8 @@
if (machine_is_msm8960_sim() || machine_is_msm8960_rumi3())
return 0;
- if (secure_pil) {
- pil_lpass_q6_ops.init_image = init_image_lpass_q6_trusted;
- pil_lpass_q6_ops.auth_and_reset = reset_lpass_q6_trusted;
- pil_lpass_q6_ops.shutdown = shutdown_lpass_q6_trusted;
-
- pil_modem_fw_q6_ops.init_image = init_image_modem_fw_q6_trusted;
- pil_modem_fw_q6_ops.auth_and_reset = reset_modem_fw_q6_trusted;
- pil_modem_fw_q6_ops.shutdown = shutdown_modem_fw_q6_trusted;
-
- pil_modem_sw_q6_ops.init_image = init_image_modem_sw_q6_trusted;
- pil_modem_sw_q6_ops.auth_and_reset = reset_modem_sw_q6_trusted;
- pil_modem_sw_q6_ops.shutdown = shutdown_modem_sw_q6_trusted;
-
- pil_dsps_ops.init_image = init_image_dsps_trusted;
- pil_dsps_ops.auth_and_reset = reset_dsps_trusted;
- pil_dsps_ops.shutdown = shutdown_dsps_trusted;
-
- pil_riva_ops.init_image = init_image_riva_trusted;
- pil_riva_ops.auth_and_reset = reset_riva_trusted;
- pil_riva_ops.shutdown = shutdown_riva_trusted;
- }
+ if (secure_pil)
+ use_secure_pil();
err = q6_reset_init(&q6_lpass);
if (err)