msm: pil: Extract secure PIL operations
Move secure pil code into one file so we stop duplicating it in
each peripheral-reset-$(ARCH) file.
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
diff --git a/arch/arm/mach-msm/peripheral-reset-8960.c b/arch/arm/mach-msm/peripheral-reset-8960.c
index ef73244..51cd204 100644
--- a/arch/arm/mach-msm/peripheral-reset-8960.c
+++ b/arch/arm/mach-msm/peripheral-reset-8960.c
@@ -25,6 +25,7 @@
#include <mach/scm.h>
#include "peripheral-loader.h"
+#include "scm-pas.h"
#define MSM_FW_QDSP6SS_PHYS 0x08800000
#define MSM_SW_QDSP6SS_PHYS 0x08900000
@@ -119,43 +120,6 @@
#define PPSS_PROC_CLK_CTL (MSM_CLK_CTL_BASE + 0x2588)
#define PPSS_HCLK_CTL (MSM_CLK_CTL_BASE + 0x2580)
-#define PAS_Q6 1
-#define PAS_DSPS 2
-#define PAS_MODEM_SW 4
-#define PAS_MODEM_FW 5
-#define PAS_RIVA 6
-
-#define PAS_INIT_IMAGE_CMD 1
-#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;
- u32 image_addr;
-};
-
-struct pas_init_image_resp {
- u32 image_valid;
-};
-
-struct pas_auth_image_req {
- u32 proc;
-};
-
-struct pas_auth_image_resp {
- u32 reset_initiated;
-};
-
-struct pas_shutdown_req {
- u32 proc;
-};
-
-struct pas_shutdown_resp {
- u32 success;
-};
-
struct q6_data {
const unsigned strap_tcm_base;
const unsigned strap_ahb_upper;
@@ -203,46 +167,22 @@
static void __iomem *msm_riva_base;
static unsigned long riva_start;
-static int init_image_trusted(int id, const u8 *metadata, size_t size)
-{
- int ret;
- struct pas_init_image_req request;
- struct pas_init_image_resp resp = {0};
- void *mdata_buf;
-
- /* Make memory physically contiguous */
- mdata_buf = kmemdup(metadata, size, GFP_KERNEL);
- if (!mdata_buf)
- return -ENOMEM;
-
- request.proc = id;
- request.image_addr = virt_to_phys(mdata_buf);
-
- ret = scm_call(SCM_SVC_PIL, PAS_INIT_IMAGE_CMD, &request,
- sizeof(request), &resp, sizeof(resp));
- kfree(mdata_buf);
-
- if (ret)
- return ret;
- return resp.image_valid;
-}
-
static int init_image_lpass_q6_trusted(struct pil_device *pil,
const u8 *metadata, size_t size)
{
- return init_image_trusted(PAS_Q6, metadata, size);
+ return pas_init_image(PAS_Q6, metadata, size);
}
static int init_image_modem_fw_q6_trusted(struct pil_device *pil,
const u8 *metadata, size_t size)
{
- return init_image_trusted(PAS_MODEM_FW, metadata, size);
+ return pas_init_image(PAS_MODEM_FW, metadata, size);
}
static int init_image_modem_sw_q6_trusted(struct pil_device *pil,
const u8 *metadata, size_t size)
{
- return init_image_trusted(PAS_MODEM_SW, metadata, size);
+ return pas_init_image(PAS_MODEM_SW, metadata, size);
}
static int init_image_lpass_q6_untrusted(struct pil_device *pil,
@@ -274,21 +214,6 @@
return 0;
}
-static int auth_and_reset_trusted(int id)
-{
- int ret;
- struct pas_auth_image_req request;
- struct pas_auth_image_resp resp = {0};
-
- request.proc = id;
- ret = scm_call(SCM_SVC_PIL, PAS_AUTH_AND_RESET_CMD, &request,
- sizeof(request), &resp, sizeof(resp));
- if (ret)
- return ret;
-
- return resp.reset_initiated;
-}
-
static int power_up_q6(struct q6_data *q6)
{
int err;
@@ -317,7 +242,7 @@
int err = power_up_q6(q6);
if (err)
return err;
- return auth_and_reset_trusted(id);
+ return pas_auth_and_reset(id);
}
static int reset_lpass_q6_trusted(struct pil_device *pil)
@@ -454,26 +379,11 @@
return reset_q6_untrusted(&q6_modem_sw);
}
-static int shutdown_trusted(int id)
-{
- int ret;
- struct pas_shutdown_req request;
- struct pas_shutdown_resp resp = {0};
-
- request.proc = id;
- ret = scm_call(SCM_SVC_PIL, PAS_SHUTDOWN_CMD, &request, sizeof(request),
- &resp, sizeof(resp));
- if (ret)
- return ret;
-
- return resp.success;
-}
-
static int shutdown_q6_trusted(int id, struct q6_data *q6)
{
int ret;
- ret = shutdown_trusted(id);
+ ret = pas_shutdown(id);
if (ret)
return ret;
@@ -655,17 +565,17 @@
static int init_image_riva_trusted(struct pil_device *pil, const u8 *metadata,
size_t size)
{
- return init_image_trusted(PAS_RIVA, metadata, size);
+ return pas_init_image(PAS_RIVA, metadata, size);
}
static int reset_riva_trusted(struct pil_device *pil)
{
- return auth_and_reset_trusted(PAS_RIVA);
+ return pas_auth_and_reset(PAS_RIVA);
}
static int shutdown_riva_trusted(struct pil_device *pil)
{
- return shutdown_trusted(PAS_RIVA);
+ return pas_shutdown(PAS_RIVA);
}
static int init_image_dsps_untrusted(struct pil_device *pil, const u8 *metadata,
@@ -695,17 +605,17 @@
static int init_image_dsps_trusted(struct pil_device *pil, const u8 *metadata,
size_t size)
{
- return init_image_trusted(PAS_DSPS, metadata, size);
+ return pas_init_image(PAS_DSPS, metadata, size);
}
static int reset_dsps_trusted(struct pil_device *pil)
{
- return auth_and_reset_trusted(PAS_DSPS);
+ return pas_auth_and_reset(PAS_DSPS);
}
static int shutdown_dsps_trusted(struct pil_device *pil)
{
- return shutdown_trusted(PAS_DSPS);
+ return pas_shutdown(PAS_DSPS);
}
static struct pil_reset_ops pil_modem_fw_q6_ops = {
@@ -814,59 +724,41 @@
return err;
}
-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;
-
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) {
+ if (pas_supported(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) {
+ if (pas_supported(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) {
+ if (pas_supported(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) {
+ if (pas_supported(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) {
+ if (pas_supported(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)
{
int err;
@@ -878,8 +770,7 @@
if (machine_is_msm8960_sim() || machine_is_msm8960_rumi3())
return 0;
- if (secure_pil)
- use_secure_pil();
+ use_secure_pil();
err = q6_reset_init(&q6_lpass);
if (err)
@@ -912,5 +803,3 @@
return 0;
}
arch_initcall(msm_peripheral_reset_init);
-module_param(secure_pil, bool, S_IRUGO);
-MODULE_PARM_DESC(secure_pil, "Use Secure PIL");