msm: pil-gss: Implement Secure PIL support
Use scm-pas to detect if Secure PIL is required and, if it is, call
scm-pas APIs to boot and shutdown the GSS processor instead of
handling these procedures in the Linux kernel.
Change-Id: Ia49c2e0ce8b31ba420d2951014c8a558a3b53164
Signed-off-by: Matt Wagantall <mattw@codeaurora.org>
diff --git a/arch/arm/mach-msm/pil-gss.c b/arch/arm/mach-msm/pil-gss.c
index f3e83d9..6ec9b5d 100644
--- a/arch/arm/mach-msm/pil-gss.c
+++ b/arch/arm/mach-msm/pil-gss.c
@@ -257,6 +257,49 @@
.shutdown = pil_gss_shutdown,
};
+static int pil_gss_init_image_trusted(struct pil_desc *pil,
+ const u8 *metadata, size_t size)
+{
+ return pas_init_image(PAS_GSS, metadata, size);
+}
+
+static int pil_gss_reset_trusted(struct pil_desc *pil)
+{
+ struct gss_data *drv = dev_get_drvdata(pil->dev);
+ int err;
+
+ err = make_gss_proxy_votes(pil->dev);
+ if (err)
+ return err;
+
+ err = pas_auth_and_reset(PAS_GSS);
+ if (err)
+ remove_gss_proxy_votes_now(drv);
+
+ return err;
+}
+
+static int pil_gss_shutdown_trusted(struct pil_desc *pil)
+{
+ struct gss_data *drv = dev_get_drvdata(pil->dev);
+ int ret;
+
+ ret = pas_shutdown(PAS_GSS);
+ if (ret)
+ return ret;
+
+ remove_gss_proxy_votes_now(drv);
+
+ return ret;
+}
+
+static struct pil_reset_ops pil_gss_ops_trusted = {
+ .init_image = pil_gss_init_image_trusted,
+ .verify_blob = nop_verify_blob,
+ .auth_and_reset = pil_gss_reset_trusted,
+ .shutdown = pil_gss_shutdown_trusted,
+};
+
static void configure_gss_pll(struct gss_data *drv)
{
u32 regval, is_pll_enabled;
@@ -354,8 +397,13 @@
desc->name = "gss";
desc->dev = &pdev->dev;
- desc->ops = &pil_gss_ops;
- dev_info(&pdev->dev, "using non-secure boot\n");
+ if (pas_supported(PAS_GSS) > 0) {
+ desc->ops = &pil_gss_ops_trusted;
+ dev_info(&pdev->dev, "using secure boot\n");
+ } else {
+ desc->ops = &pil_gss_ops;
+ dev_info(&pdev->dev, "using non-secure boot\n");
+ }
INIT_DELAYED_WORK(&drv->work, remove_gss_proxy_votes);