From 6ba31451421b735da7e8f67e10b8ef5188b8b873 Mon Sep 17 00:00:00 2001 From: Prasad Sodagudi Date: Sun, 14 Jun 2020 21:52:35 -0700 Subject: [PATCH] soc: qcom: Check rmb status register for spss bootup status uefi bootloader may not bring out the spss for all the scenarios such as fastboot continue when device is flashed first time. uefi sets rmb general purpose status register when it failed to bring spss out of reset. So secure pil driver checks the rmb general purpose register to find out whether spss firmware is already loaded or not and updates the .powerup function. Change-Id: Iade37d6e0a8354b4178e2a4c1b36e90f024aeb84 Signed-off-by: Prasad Sodagudi --- drivers/soc/qcom/subsys-pil-tz.c | 38 +++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/drivers/soc/qcom/subsys-pil-tz.c b/drivers/soc/qcom/subsys-pil-tz.c index da7067319856..71cbf3a26de7 100644 --- a/drivers/soc/qcom/subsys-pil-tz.c +++ b/drivers/soc/qcom/subsys-pil-tz.c @@ -113,6 +113,7 @@ struct pil_tz_data { void __iomem *irq_mask; void __iomem *err_status; void __iomem *err_status_spare; + void __iomem *rmb_gp_reg; u32 bits_arr[2]; int err_fatal_irq; int err_ready_irq; @@ -1304,7 +1305,7 @@ static int pil_tz_generic_probe(struct platform_device *pdev) { struct pil_tz_data *d; struct resource *res; - u32 proxy_timeout; + u32 proxy_timeout, rmb_gp_reg_val; int len, rc; char md_node[20]; @@ -1326,9 +1327,6 @@ static int pil_tz_generic_probe(struct platform_device *pdev) if (of_property_read_bool(pdev->dev.of_node, "qcom,pil-no-auth")) d->subsys_desc.no_auth = true; - if (of_property_read_bool(pdev->dev.of_node, "qcom,boot-enabled")) - d->boot_enabled = true; - d->keep_proxy_regs_on = of_property_read_bool(pdev->dev.of_node, "qcom,keep-proxy-regs-on"); @@ -1398,21 +1396,35 @@ static int pil_tz_generic_probe(struct platform_device *pdev) d->subsys_desc.dev = &pdev->dev; d->subsys_desc.shutdown = subsys_shutdown; d->subsys_desc.powerup = subsys_powerup; - - /* - * If subsystem is already bought out reset during the bootloader stage, - * instead of doing regular power need to check subsystem status. - * So override power up function to check subsystem crash status. - */ - if (d->boot_enabled) - d->subsys_desc.powerup = subsys_powerup_boot_enabled; - d->subsys_desc.ramdump = subsys_ramdump; d->subsys_desc.free_memory = subsys_free_memory; d->subsys_desc.crash_shutdown = subsys_crash_shutdown; + if (of_property_read_bool(pdev->dev.of_node, "qcom,pil-generic-irq-handler")) { + res = platform_get_resource_byname(pdev, IORESOURCE_MEM, + "rmb_general_purpose"); + d->rmb_gp_reg = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(d->rmb_gp_reg)) { + dev_err(&pdev->dev, "Invalid resource for rmb_gp_reg\n"); + rc = PTR_ERR(d->rmb_gp_reg); + goto err_ramdump; + } + + rmb_gp_reg_val = __raw_readl(d->rmb_gp_reg); + /* + * If subsystem is already bought out reset during the + * bootloader stage, need to check subsystem status instead + * of doing regular power. So override power up function + * to check subsystem crash status. + */ + if (!(rmb_gp_reg_val & BIT(0))) { + d->boot_enabled = true; + pr_info("spss is brought out of reset by UEFI\n"); + d->subsys_desc.powerup = subsys_powerup_boot_enabled; + } + res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "sp2soc_irq_status"); d->irq_status = devm_ioremap_resource(&pdev->dev, res);