Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 95180afa authored by Kyle Yan's avatar Kyle Yan
Browse files

soc: qcom: pil: Reuse carveout region for mdt header



Currently we allocate a new dma region for our image headers to pass
into TZ for image verification. Instead reuse the previously allocated
region for the main firmware body to store the image header to avoid
having to allocate more memory than needed.

Change-Id: I1e50df2b417d9823c4e75f28134a3f9e078463aa
Signed-off-by: default avatarKyle Yan <kyan@codeaurora.org>
parent b3227c4f
Loading
Loading
Loading
Loading
+15 −10
Original line number Diff line number Diff line
@@ -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) {
@@ -526,9 +527,9 @@ 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
		aligned_size = ALIGN(size, SZ_1M);
		aligned_size = ALIGN(aligned_size, SZ_1M);

	priv->desc->attrs = 0;
	priv->desc->attrs |= DMA_ATTR_SKIP_ZEROING | DMA_ATTR_NO_KERNEL_MAPPING;
@@ -553,7 +554,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;
@@ -598,7 +600,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;
@@ -629,14 +632,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;

@@ -922,7 +926,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;

@@ -935,7 +939,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;
+1 −1
Original line number Diff line number Diff line
@@ -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);
+6 −3
Original line number Diff line number Diff line
@@ -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;
@@ -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;

@@ -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,
+19 −12
Original line number Diff line number Diff line
@@ -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
@@ -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 {
@@ -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;
@@ -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;
	}
@@ -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;