Loading drivers/soc/qcom/peripheral-loader.c +17 −10 Original line number Diff line number Diff line Loading @@ -511,11 +511,12 @@ static int pil_init_entry_addr(struct pil_priv *priv, const struct pil_mdt *mdt) } static int pil_alloc_region(struct pil_priv *priv, phys_addr_t min_addr, phys_addr_t max_addr, size_t align) phys_addr_t max_addr, size_t align, size_t mdt_size) { void *region; size_t size = max_addr - min_addr; size_t aligned_size; size_t aligned_size = max(size, mdt_size); /* Don't reallocate due to fragmentation concerns, just sanity check */ if (priv->region) { Loading @@ -526,9 +527,11 @@ static int pil_alloc_region(struct pil_priv *priv, phys_addr_t min_addr, } if (align > SZ_4M) aligned_size = ALIGN(size, SZ_4M); aligned_size = ALIGN(aligned_size, SZ_4M); else if (align > SZ_1M) aligned_size = ALIGN(aligned_size, SZ_1M); else aligned_size = ALIGN(size, SZ_1M); aligned_size = ALIGN(aligned_size, SZ_4K); priv->desc->attrs = 0; priv->desc->attrs |= DMA_ATTR_SKIP_ZEROING | DMA_ATTR_NO_KERNEL_MAPPING; Loading @@ -553,7 +556,8 @@ static int pil_alloc_region(struct pil_priv *priv, phys_addr_t min_addr, return 0; } static int pil_setup_region(struct pil_priv *priv, const struct pil_mdt *mdt) static int pil_setup_region(struct pil_priv *priv, const struct pil_mdt *mdt, size_t mdt_size) { const struct elf32_phdr *phdr; phys_addr_t min_addr_r, min_addr_n, max_addr_r, max_addr_n, start, end; Loading Loading @@ -598,7 +602,8 @@ static int pil_setup_region(struct pil_priv *priv, const struct pil_mdt *mdt) max_addr_r = ALIGN(max_addr_r, SZ_4K); if (relocatable) { ret = pil_alloc_region(priv, min_addr_r, max_addr_r, align); ret = pil_alloc_region(priv, min_addr_r, max_addr_r, align, mdt_size); } else { priv->region_start = min_addr_n; priv->region_end = max_addr_n; Loading Loading @@ -629,14 +634,15 @@ static int pil_cmp_seg(void *priv, struct list_head *a, struct list_head *b) return ret; } static int pil_init_mmap(struct pil_desc *desc, const struct pil_mdt *mdt) static int pil_init_mmap(struct pil_desc *desc, const struct pil_mdt *mdt, size_t mdt_size) { struct pil_priv *priv = desc->priv; const struct elf32_phdr *phdr; struct pil_seg *seg; int i, ret; ret = pil_setup_region(priv, mdt); ret = pil_setup_region(priv, mdt, mdt_size); if (ret) return ret; Loading Loading @@ -922,7 +928,7 @@ int pil_boot(struct pil_desc *desc) goto release_fw; } ret = pil_init_mmap(desc, mdt); ret = pil_init_mmap(desc, mdt, fw->size); if (ret) goto release_fw; Loading @@ -935,7 +941,8 @@ int pil_boot(struct pil_desc *desc) trace_pil_event("before_init_image", desc); if (desc->ops->init_image) ret = desc->ops->init_image(desc, fw->data, fw->size); ret = desc->ops->init_image(desc, fw->data, fw->size, priv->region_start, priv->region); if (ret) { pil_err(desc, "Initializing image failed(rc:%d)\n", ret); goto err_boot; Loading drivers/soc/qcom/peripheral-loader.h +1 −1 Original line number Diff line number Diff line Loading @@ -119,7 +119,7 @@ struct md_ssr_toc /* Shared IMEM ToC struct */ */ struct pil_reset_ops { int (*init_image)(struct pil_desc *pil, const u8 *metadata, size_t size); size_t size, phys_addr_t mdata_phys, void *region); int (*mem_setup)(struct pil_desc *pil, phys_addr_t addr, size_t size); int (*verify_blob)(struct pil_desc *pil, phys_addr_t phy_addr, size_t size); Loading drivers/soc/qcom/pil-msa.c +6 −3 Original line number Diff line number Diff line Loading @@ -769,7 +769,8 @@ int pil_mss_reset_load_mba(struct pil_desc *pil) } static int pil_msa_auth_modem_mdt(struct pil_desc *pil, const u8 *metadata, size_t size) size_t size, phys_addr_t region_start, void *region) { struct modem_data *drv = dev_get_drvdata(pil->dev); void *mdata_virt; Loading Loading @@ -851,7 +852,8 @@ static int pil_msa_auth_modem_mdt(struct pil_desc *pil, const u8 *metadata, } static int pil_msa_mss_reset_mba_load_auth_mdt(struct pil_desc *pil, const u8 *metadata, size_t size) const u8 *metadata, size_t size, phys_addr_t region_start, void *region) { int ret; Loading @@ -859,7 +861,8 @@ static int pil_msa_mss_reset_mba_load_auth_mdt(struct pil_desc *pil, if (ret) return ret; return pil_msa_auth_modem_mdt(pil, metadata, size); return pil_msa_auth_modem_mdt(pil, metadata, size, region_start, region); } static int pil_msa_mba_verify_blob(struct pil_desc *pil, phys_addr_t phy_addr, Loading drivers/soc/qcom/subsys-pil-tz.c +19 −12 Original line number Diff line number Diff line Loading @@ -47,6 +47,13 @@ #define desc_to_data(d) container_of(d, struct pil_tz_data, desc) #define subsys_to_data(d) container_of(d, struct pil_tz_data, subsys_desc) struct pil_map_fw_info { void *region; unsigned long attrs; phys_addr_t base_addr; struct device *dev; }; /** * struct reg_info - regulator info * @reg: regulator handle Loading Loading @@ -586,7 +593,8 @@ static void pil_remove_proxy_vote(struct pil_desc *pil) } static int pil_init_image_trusted(struct pil_desc *pil, const u8 *metadata, size_t size) const u8 *metadata, size_t size, phys_addr_t mdata_phys, void *region) { struct pil_tz_data *d = desc_to_data(pil); struct pas_init_image_req { Loading @@ -595,11 +603,15 @@ static int pil_init_image_trusted(struct pil_desc *pil, } request; u32 scm_ret = 0; void *mdata_buf; dma_addr_t mdata_phys; int ret; unsigned long attrs = 0; struct device dev = {0}; struct scm_desc desc = {0}; struct pil_map_fw_info map_fw_info = { .attrs = pil->attrs, .region = region, .base_addr = mdata_phys, .dev = pil->dev, }; void *map_data = pil->map_data ? pil->map_data : &map_fw_info; if (d->subsys_desc.no_auth) return 0; Loading @@ -607,15 +619,10 @@ static int pil_init_image_trusted(struct pil_desc *pil, ret = scm_pas_enable_bw(); if (ret) return ret; arch_setup_dma_ops(&dev, 0, 0, NULL, 0); dev.coherent_dma_mask = DMA_BIT_MASK(sizeof(dma_addr_t) * 8); attrs |= DMA_ATTR_STRONGLY_ORDERED; mdata_buf = dma_alloc_attrs(&dev, size, &mdata_phys, GFP_KERNEL, attrs); mdata_buf = pil->map_fw_mem(mdata_phys, size, map_data); if (!mdata_buf) { pr_err("scm-pas: Allocation for metadata failed.\n"); dev_err(pil->dev, "Failed to map memory for metadata.\n"); scm_pas_disable_bw(); return -ENOMEM; } Loading @@ -637,7 +644,7 @@ static int pil_init_image_trusted(struct pil_desc *pil, scm_ret = desc.ret[0]; } dma_free_attrs(&dev, size, mdata_buf, mdata_phys, attrs); pil->unmap_fw_mem(mdata_buf, size, map_data); scm_pas_disable_bw(); if (ret) return ret; Loading Loading
drivers/soc/qcom/peripheral-loader.c +17 −10 Original line number Diff line number Diff line Loading @@ -511,11 +511,12 @@ static int pil_init_entry_addr(struct pil_priv *priv, const struct pil_mdt *mdt) } static int pil_alloc_region(struct pil_priv *priv, phys_addr_t min_addr, phys_addr_t max_addr, size_t align) phys_addr_t max_addr, size_t align, size_t mdt_size) { void *region; size_t size = max_addr - min_addr; size_t aligned_size; size_t aligned_size = max(size, mdt_size); /* Don't reallocate due to fragmentation concerns, just sanity check */ if (priv->region) { Loading @@ -526,9 +527,11 @@ static int pil_alloc_region(struct pil_priv *priv, phys_addr_t min_addr, } if (align > SZ_4M) aligned_size = ALIGN(size, SZ_4M); aligned_size = ALIGN(aligned_size, SZ_4M); else if (align > SZ_1M) aligned_size = ALIGN(aligned_size, SZ_1M); else aligned_size = ALIGN(size, SZ_1M); aligned_size = ALIGN(aligned_size, SZ_4K); priv->desc->attrs = 0; priv->desc->attrs |= DMA_ATTR_SKIP_ZEROING | DMA_ATTR_NO_KERNEL_MAPPING; Loading @@ -553,7 +556,8 @@ static int pil_alloc_region(struct pil_priv *priv, phys_addr_t min_addr, return 0; } static int pil_setup_region(struct pil_priv *priv, const struct pil_mdt *mdt) static int pil_setup_region(struct pil_priv *priv, const struct pil_mdt *mdt, size_t mdt_size) { const struct elf32_phdr *phdr; phys_addr_t min_addr_r, min_addr_n, max_addr_r, max_addr_n, start, end; Loading Loading @@ -598,7 +602,8 @@ static int pil_setup_region(struct pil_priv *priv, const struct pil_mdt *mdt) max_addr_r = ALIGN(max_addr_r, SZ_4K); if (relocatable) { ret = pil_alloc_region(priv, min_addr_r, max_addr_r, align); ret = pil_alloc_region(priv, min_addr_r, max_addr_r, align, mdt_size); } else { priv->region_start = min_addr_n; priv->region_end = max_addr_n; Loading Loading @@ -629,14 +634,15 @@ static int pil_cmp_seg(void *priv, struct list_head *a, struct list_head *b) return ret; } static int pil_init_mmap(struct pil_desc *desc, const struct pil_mdt *mdt) static int pil_init_mmap(struct pil_desc *desc, const struct pil_mdt *mdt, size_t mdt_size) { struct pil_priv *priv = desc->priv; const struct elf32_phdr *phdr; struct pil_seg *seg; int i, ret; ret = pil_setup_region(priv, mdt); ret = pil_setup_region(priv, mdt, mdt_size); if (ret) return ret; Loading Loading @@ -922,7 +928,7 @@ int pil_boot(struct pil_desc *desc) goto release_fw; } ret = pil_init_mmap(desc, mdt); ret = pil_init_mmap(desc, mdt, fw->size); if (ret) goto release_fw; Loading @@ -935,7 +941,8 @@ int pil_boot(struct pil_desc *desc) trace_pil_event("before_init_image", desc); if (desc->ops->init_image) ret = desc->ops->init_image(desc, fw->data, fw->size); ret = desc->ops->init_image(desc, fw->data, fw->size, priv->region_start, priv->region); if (ret) { pil_err(desc, "Initializing image failed(rc:%d)\n", ret); goto err_boot; Loading
drivers/soc/qcom/peripheral-loader.h +1 −1 Original line number Diff line number Diff line Loading @@ -119,7 +119,7 @@ struct md_ssr_toc /* Shared IMEM ToC struct */ */ struct pil_reset_ops { int (*init_image)(struct pil_desc *pil, const u8 *metadata, size_t size); size_t size, phys_addr_t mdata_phys, void *region); int (*mem_setup)(struct pil_desc *pil, phys_addr_t addr, size_t size); int (*verify_blob)(struct pil_desc *pil, phys_addr_t phy_addr, size_t size); Loading
drivers/soc/qcom/pil-msa.c +6 −3 Original line number Diff line number Diff line Loading @@ -769,7 +769,8 @@ int pil_mss_reset_load_mba(struct pil_desc *pil) } static int pil_msa_auth_modem_mdt(struct pil_desc *pil, const u8 *metadata, size_t size) size_t size, phys_addr_t region_start, void *region) { struct modem_data *drv = dev_get_drvdata(pil->dev); void *mdata_virt; Loading Loading @@ -851,7 +852,8 @@ static int pil_msa_auth_modem_mdt(struct pil_desc *pil, const u8 *metadata, } static int pil_msa_mss_reset_mba_load_auth_mdt(struct pil_desc *pil, const u8 *metadata, size_t size) const u8 *metadata, size_t size, phys_addr_t region_start, void *region) { int ret; Loading @@ -859,7 +861,8 @@ static int pil_msa_mss_reset_mba_load_auth_mdt(struct pil_desc *pil, if (ret) return ret; return pil_msa_auth_modem_mdt(pil, metadata, size); return pil_msa_auth_modem_mdt(pil, metadata, size, region_start, region); } static int pil_msa_mba_verify_blob(struct pil_desc *pil, phys_addr_t phy_addr, Loading
drivers/soc/qcom/subsys-pil-tz.c +19 −12 Original line number Diff line number Diff line Loading @@ -47,6 +47,13 @@ #define desc_to_data(d) container_of(d, struct pil_tz_data, desc) #define subsys_to_data(d) container_of(d, struct pil_tz_data, subsys_desc) struct pil_map_fw_info { void *region; unsigned long attrs; phys_addr_t base_addr; struct device *dev; }; /** * struct reg_info - regulator info * @reg: regulator handle Loading Loading @@ -586,7 +593,8 @@ static void pil_remove_proxy_vote(struct pil_desc *pil) } static int pil_init_image_trusted(struct pil_desc *pil, const u8 *metadata, size_t size) const u8 *metadata, size_t size, phys_addr_t mdata_phys, void *region) { struct pil_tz_data *d = desc_to_data(pil); struct pas_init_image_req { Loading @@ -595,11 +603,15 @@ static int pil_init_image_trusted(struct pil_desc *pil, } request; u32 scm_ret = 0; void *mdata_buf; dma_addr_t mdata_phys; int ret; unsigned long attrs = 0; struct device dev = {0}; struct scm_desc desc = {0}; struct pil_map_fw_info map_fw_info = { .attrs = pil->attrs, .region = region, .base_addr = mdata_phys, .dev = pil->dev, }; void *map_data = pil->map_data ? pil->map_data : &map_fw_info; if (d->subsys_desc.no_auth) return 0; Loading @@ -607,15 +619,10 @@ static int pil_init_image_trusted(struct pil_desc *pil, ret = scm_pas_enable_bw(); if (ret) return ret; arch_setup_dma_ops(&dev, 0, 0, NULL, 0); dev.coherent_dma_mask = DMA_BIT_MASK(sizeof(dma_addr_t) * 8); attrs |= DMA_ATTR_STRONGLY_ORDERED; mdata_buf = dma_alloc_attrs(&dev, size, &mdata_phys, GFP_KERNEL, attrs); mdata_buf = pil->map_fw_mem(mdata_phys, size, map_data); if (!mdata_buf) { pr_err("scm-pas: Allocation for metadata failed.\n"); dev_err(pil->dev, "Failed to map memory for metadata.\n"); scm_pas_disable_bw(); return -ENOMEM; } Loading @@ -637,7 +644,7 @@ static int pil_init_image_trusted(struct pil_desc *pil, scm_ret = desc.ret[0]; } dma_free_attrs(&dev, size, mdata_buf, mdata_phys, attrs); pil->unmap_fw_mem(mdata_buf, size, map_data); scm_pas_disable_bw(); if (ret) return ret; Loading