diff options
author | Linux Build Service Account <lnxbuild@localhost> | 2019-10-14 23:53:02 -0700 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2019-10-14 23:53:02 -0700 |
commit | 62e5887009f01afc5931ac141cd5d0631f4d7ad3 (patch) | |
tree | 1a2adf1a000c5fd806c6a49e7f06a434e767b395 | |
parent | cabd62e47c336646e0a31704d831e47fd72094e7 (diff) | |
parent | 3400ddb8c3fcc1b4a8dce87f0cfd38354e999762 (diff) |
Merge changes I5c6c7ec7,I0aa31d85 into LE.UM.3.2.2.r1.1LE.UM.3.2.2.r1-02300-sdm845.0
* changes:
Revert "ARM: dts: Enable sequential load for pil firmware image on sdm845 target"
Revert "soc: qcom: pil: Add support to load PIL blobs in parallel"
-rw-r--r-- | Documentation/devicetree/bindings/pil/subsys-pil-tz.txt | 6 | ||||
-rw-r--r-- | arch/arm64/boot/dts/qcom/sdm845.dtsi | 1 | ||||
-rw-r--r-- | drivers/soc/qcom/peripheral-loader.c | 115 | ||||
-rw-r--r-- | drivers/soc/qcom/peripheral-loader.h | 5 |
4 files changed, 5 insertions, 122 deletions
diff --git a/Documentation/devicetree/bindings/pil/subsys-pil-tz.txt b/Documentation/devicetree/bindings/pil/subsys-pil-tz.txt index 31c5660ab590..f8329a95b3e8 100644 --- a/Documentation/devicetree/bindings/pil/subsys-pil-tz.txt +++ b/Documentation/devicetree/bindings/pil/subsys-pil-tz.txt @@ -70,12 +70,6 @@ Optional properties: - qcom,ignore-ssr-failure: Boolean. If set, SSR failures are not considered fatal. - qcom,mas-crypto: Reference to the bus master of crypto core. -- qcom,sequential-fw-load: Boolean. If set, PIL loads the firmware image blobs in a - serial fashion. Else, they are loaded in - parallel. The property is specially useful for - low-end (single core) systems to prevent it from - degrading the performance. - Example: qcom,venus@fdce0000 { compatible = "qcom,pil-tz-generic"; diff --git a/arch/arm64/boot/dts/qcom/sdm845.dtsi b/arch/arm64/boot/dts/qcom/sdm845.dtsi index 327feb5775fc..327604b07700 100644 --- a/arch/arm64/boot/dts/qcom/sdm845.dtsi +++ b/arch/arm64/boot/dts/qcom/sdm845.dtsi @@ -1549,7 +1549,6 @@ vdd_mss-supply = <&pm8005_s2_level>; vdd_mss-uV = <RPMH_REGULATOR_LEVEL_TURBO>; qcom,firmware-name = "modem"; - qcom,sequential-fw-load; qcom,pil-self-auth; qcom,sysmon-id = <0>; qcom,minidump-id = <3>; diff --git a/drivers/soc/qcom/peripheral-loader.c b/drivers/soc/qcom/peripheral-loader.c index 1d5284e82b5b..384ac58ae96a 100644 --- a/drivers/soc/qcom/peripheral-loader.c +++ b/drivers/soc/qcom/peripheral-loader.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2019, The Linux Foundation. All rights reserved. +/* Copyright (c) 2010-2018, 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 @@ -36,7 +36,6 @@ #include <soc/qcom/subsystem_restart.h> #include <soc/qcom/secure_buffer.h> #include <soc/qcom/smem.h> -#include <linux/kthread.h> #include <linux/uaccess.h> #include <asm/setup.h> @@ -71,9 +70,6 @@ static int proxy_timeout_ms = -1; module_param(proxy_timeout_ms, int, 0644); static bool disable_timeouts; - -static struct workqueue_struct *pil_wq; - /** * struct pil_mdt - Representation of <name>.mdt file in memory * @hdr: ELF32 header @@ -131,7 +127,6 @@ struct pil_priv { struct wakeup_source ws; char wname[32]; struct pil_desc *desc; - int num_segs; struct list_head segs; phys_addr_t entry_addr; phys_addr_t base_addr; @@ -728,7 +723,6 @@ static int pil_init_mmap(struct pil_desc *desc, const struct pil_mdt *mdt, pil_info(desc, "loading from %pa to %pa\n", &priv->region_start, &priv->region_end); - priv->num_segs = 0; for (i = 0; i < mdt->hdr.e_phnum; i++) { phdr = &mdt->phdr[i]; if (!segment_is_loadable(phdr)) @@ -739,7 +733,6 @@ static int pil_init_mmap(struct pil_desc *desc, const struct pil_mdt *mdt, return PTR_ERR(seg); list_add_tail(&seg->list, &priv->segs); - priv->num_segs++; } list_sort(NULL, &priv->segs, pil_cmp_seg); @@ -929,9 +922,6 @@ static int pil_parse_devicetree(struct pil_desc *desc) } } desc->proxy_unvote_irq = clk_ready; - - desc->sequential_load = of_property_read_bool(ofnode, - "qcom,sequential-fw-load"); return 0; } @@ -955,89 +945,6 @@ static int pil_notify_aop(struct pil_desc *desc, char *status) /* Synchronize request_firmware() with suspend */ static DECLARE_RWSEM(pil_pm_rwsem); -struct pil_seg_data { - struct pil_desc *desc; - struct pil_seg *seg; - struct work_struct load_seg_work; - int retval; -}; - -static void pil_load_seg_work_fn(struct work_struct *work) -{ - struct pil_seg_data *pil_seg_data = container_of(work, - struct pil_seg_data, - load_seg_work); - struct pil_desc *desc = pil_seg_data->desc; - struct pil_seg *seg = pil_seg_data->seg; - - pil_seg_data->retval = pil_load_seg(desc, seg); -} - -static int pil_load_segs(struct pil_desc *desc) -{ - int ret = 0; - int seg_id = 0; - struct pil_priv *priv = desc->priv; - struct pil_seg_data *pil_seg_data; - struct pil_seg *seg; - unsigned long *err_map; - - err_map = kcalloc(BITS_TO_LONGS(priv->num_segs), sizeof(unsigned long), - GFP_KERNEL); - if (!err_map) - return -ENOMEM; - - pil_seg_data = kcalloc(priv->num_segs, sizeof(*pil_seg_data), - GFP_KERNEL); - if (!pil_seg_data) { - ret = -ENOMEM; - goto out; - } - - /* Initialize and spawn a thread for each segment */ - list_for_each_entry(seg, &desc->priv->segs, list) { - pil_seg_data[seg_id].desc = desc; - pil_seg_data[seg_id].seg = seg; - - INIT_WORK(&pil_seg_data[seg_id].load_seg_work, - pil_load_seg_work_fn); - queue_work(pil_wq, &pil_seg_data[seg_id].load_seg_work); - - seg_id++; - } - - bitmap_zero(err_map, priv->num_segs); - - /* Wait for the parallel loads to finish */ - seg_id = 0; - list_for_each_entry(seg, &desc->priv->segs, list) { - flush_work(&pil_seg_data[seg_id].load_seg_work); - - /* - * Don't exit if one of the thread fails. Wait for others to - * complete. Bitmap the return codes we get from the threads. - */ - if (pil_seg_data[seg_id].retval) { - pil_err(desc, - "Failed to load the segment[%d]. ret = %d\n", - seg_id, pil_seg_data[seg_id].retval); - __set_bit(seg_id, err_map); - } - - seg_id++; - } - - kfree(pil_seg_data); - - /* Each segment can fail due to different reason. Send a generic err */ - if (!bitmap_empty(err_map, priv->num_segs)) - ret = -EFAULT; - -out: - kfree(err_map); - return ret; -} - /** * pil_boot() - Load a peripheral image into memory and boot it * @desc: descriptor from pil_desc_init() @@ -1048,9 +955,9 @@ int pil_boot(struct pil_desc *desc) { int ret; char fw_name[30]; - struct pil_seg *seg; const struct pil_mdt *mdt; const struct elf32_hdr *ehdr; + struct pil_seg *seg; const struct firmware *fw; struct pil_priv *priv = desc->priv; bool mem_protect = false; @@ -1159,15 +1066,8 @@ int pil_boot(struct pil_desc *desc) } trace_pil_event("before_load_seg", desc); - - if (desc->sequential_load) { - list_for_each_entry(seg, &desc->priv->segs, list) { - ret = pil_load_seg(desc, seg); - if (ret) - goto err_deinit_image; - } - } else { - ret = pil_load_segs(desc); + list_for_each_entry(seg, &desc->priv->segs, list) { + ret = pil_load_seg(desc, seg); if (ret) goto err_deinit_image; } @@ -1464,11 +1364,6 @@ static int __init msm_pil_init(void) pr_err("SMEM is not initialized.\n"); return -EPROBE_DEFER; } - - pil_wq = alloc_workqueue("pil_workqueue", WQ_HIGHPRI | WQ_UNBOUND, 0); - if (!pil_wq) - pr_warn("pil: Defaulting to sequential firmware loading.\n"); - out: return register_pm_notifier(&pil_pm_notifier); } @@ -1476,8 +1371,6 @@ device_initcall(msm_pil_init); static void __exit msm_pil_exit(void) { - if (pil_wq) - destroy_workqueue(pil_wq); unregister_pm_notifier(&pil_pm_notifier); if (pil_info_base) iounmap(pil_info_base); diff --git a/drivers/soc/qcom/peripheral-loader.h b/drivers/soc/qcom/peripheral-loader.h index 9f3e006e1262..6ea6b2a7648d 100644 --- a/drivers/soc/qcom/peripheral-loader.h +++ b/drivers/soc/qcom/peripheral-loader.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2019, The Linux Foundation. All rights reserved. +/* Copyright (c) 2010-2018, 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 @@ -41,8 +41,6 @@ struct pil_priv; * @modem_ssr: true if modem is restarting, false if booting for first time. * @clear_fw_region: Clear fw region on failure in loading. * @subsys_vmid: memprot id for the subsystem. - * @sequential_load: Load the firmware blobs sequentially if set. Else, load - * them in parallel. */ struct pil_desc { const char *name; @@ -69,7 +67,6 @@ struct pil_desc { struct md_ss_toc *minidump_ss; struct md_ss_toc *minidump_pdr; int minidump_id; - bool sequential_load; }; /** |