Loading drivers/soc/qcom/peripheral-loader.c +33 −8 Original line number Diff line number Diff line /* Copyright (c) 2010-2016, The Linux Foundation. All rights reserved. /* Copyright (c) 2010-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -579,6 +579,13 @@ static int pil_init_mmap(struct pil_desc *desc, const struct pil_mdt *mdt) return pil_init_entry_addr(priv, mdt); } struct pil_map_fw_info { void *region; struct dma_attrs attrs; phys_addr_t base_addr; struct device *dev; }; static void pil_release_mmap(struct pil_desc *desc) { struct pil_priv *priv = desc->priv; Loading @@ -597,15 +604,31 @@ static void pil_release_mmap(struct pil_desc *desc) } } #define IOMAP_SIZE SZ_1M static void pil_clear_segment(struct pil_desc *desc) { struct pil_priv *priv = desc->priv; u8 __iomem *buf; struct pil_map_fw_info { void *region; struct dma_attrs attrs; phys_addr_t base_addr; struct device *dev; struct pil_map_fw_info map_fw_info = { .attrs = desc->attrs, .region = priv->region, .base_addr = priv->region_start, .dev = desc->dev, }; void *map_data = desc->map_data ? desc->map_data : &map_fw_info; /* Clear memory so that unauthorized ELF code is not left behind */ buf = desc->map_fw_mem(priv->region_start, (priv->region_end - priv->region_start), map_data); pil_memset_io(buf, 0, (priv->region_end - priv->region_start)); desc->unmap_fw_mem(buf, (priv->region_end - priv->region_start), map_data); } #define IOMAP_SIZE SZ_1M static void *map_fw_mem(phys_addr_t paddr, size_t size, void *data) { struct pil_map_fw_info *info = data; Loading Loading @@ -890,6 +913,8 @@ out: &desc->attrs); priv->region = NULL; } if (desc->clear_fw_region) pil_clear_segment(desc); pil_release_mmap(desc); } return ret; Loading drivers/soc/qcom/peripheral-loader.h +3 −1 Original line number Diff line number Diff line /* Copyright (c) 2010-2016, The Linux Foundation. All rights reserved. /* Copyright (c) 2010-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -38,6 +38,7 @@ struct pil_priv; * @shutdown_fail: Set if PIL op for shutting down subsystem fails. * @modem_ssr: true if modem is restarting, false if booting for first time. * @subsys_vmid: memprot id for the subsystem. * @clear_fw_region: Clear fw region on failure in loading. */ struct pil_desc { const char *name; Loading @@ -57,6 +58,7 @@ struct pil_desc { bool shutdown_fail; bool modem_ssr; u32 subsys_vmid; bool clear_fw_region; }; /** Loading drivers/soc/qcom/pil-q6v5.c +2 −1 Original line number Diff line number Diff line /* * Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. * Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -591,6 +591,7 @@ struct q6v5_data *pil_q6v5_init(struct platform_device *pdev) if (ret) return ERR_PTR(ret); desc->clear_fw_region = false; desc->dev = &pdev->dev; drv->qdsp6v5_2_0 = of_device_is_compatible(pdev->dev.of_node, Loading drivers/soc/qcom/subsys-pil-tz.c +2 −1 Original line number Diff line number Diff line /* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. /* Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -1000,6 +1000,7 @@ static int pil_tz_driver_probe(struct platform_device *pdev) d->desc.ops = &pil_ops_trusted; d->desc.proxy_timeout = PROXY_TIMEOUT_MS; d->desc.clear_fw_region = true; rc = of_property_read_u32(pdev->dev.of_node, "qcom,proxy-timeout-ms", &proxy_timeout); Loading Loading
drivers/soc/qcom/peripheral-loader.c +33 −8 Original line number Diff line number Diff line /* Copyright (c) 2010-2016, The Linux Foundation. All rights reserved. /* Copyright (c) 2010-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -579,6 +579,13 @@ static int pil_init_mmap(struct pil_desc *desc, const struct pil_mdt *mdt) return pil_init_entry_addr(priv, mdt); } struct pil_map_fw_info { void *region; struct dma_attrs attrs; phys_addr_t base_addr; struct device *dev; }; static void pil_release_mmap(struct pil_desc *desc) { struct pil_priv *priv = desc->priv; Loading @@ -597,15 +604,31 @@ static void pil_release_mmap(struct pil_desc *desc) } } #define IOMAP_SIZE SZ_1M static void pil_clear_segment(struct pil_desc *desc) { struct pil_priv *priv = desc->priv; u8 __iomem *buf; struct pil_map_fw_info { void *region; struct dma_attrs attrs; phys_addr_t base_addr; struct device *dev; struct pil_map_fw_info map_fw_info = { .attrs = desc->attrs, .region = priv->region, .base_addr = priv->region_start, .dev = desc->dev, }; void *map_data = desc->map_data ? desc->map_data : &map_fw_info; /* Clear memory so that unauthorized ELF code is not left behind */ buf = desc->map_fw_mem(priv->region_start, (priv->region_end - priv->region_start), map_data); pil_memset_io(buf, 0, (priv->region_end - priv->region_start)); desc->unmap_fw_mem(buf, (priv->region_end - priv->region_start), map_data); } #define IOMAP_SIZE SZ_1M static void *map_fw_mem(phys_addr_t paddr, size_t size, void *data) { struct pil_map_fw_info *info = data; Loading Loading @@ -890,6 +913,8 @@ out: &desc->attrs); priv->region = NULL; } if (desc->clear_fw_region) pil_clear_segment(desc); pil_release_mmap(desc); } return ret; Loading
drivers/soc/qcom/peripheral-loader.h +3 −1 Original line number Diff line number Diff line /* Copyright (c) 2010-2016, The Linux Foundation. All rights reserved. /* Copyright (c) 2010-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -38,6 +38,7 @@ struct pil_priv; * @shutdown_fail: Set if PIL op for shutting down subsystem fails. * @modem_ssr: true if modem is restarting, false if booting for first time. * @subsys_vmid: memprot id for the subsystem. * @clear_fw_region: Clear fw region on failure in loading. */ struct pil_desc { const char *name; Loading @@ -57,6 +58,7 @@ struct pil_desc { bool shutdown_fail; bool modem_ssr; u32 subsys_vmid; bool clear_fw_region; }; /** Loading
drivers/soc/qcom/pil-q6v5.c +2 −1 Original line number Diff line number Diff line /* * Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. * Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -591,6 +591,7 @@ struct q6v5_data *pil_q6v5_init(struct platform_device *pdev) if (ret) return ERR_PTR(ret); desc->clear_fw_region = false; desc->dev = &pdev->dev; drv->qdsp6v5_2_0 = of_device_is_compatible(pdev->dev.of_node, Loading
drivers/soc/qcom/subsys-pil-tz.c +2 −1 Original line number Diff line number Diff line /* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. /* Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -1000,6 +1000,7 @@ static int pil_tz_driver_probe(struct platform_device *pdev) d->desc.ops = &pil_ops_trusted; d->desc.proxy_timeout = PROXY_TIMEOUT_MS; d->desc.clear_fw_region = true; rc = of_property_read_u32(pdev->dev.of_node, "qcom,proxy-timeout-ms", &proxy_timeout); Loading