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

Commit 8ba11a78 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "soc: qcom: pil: Align to SZ_4K by default"

parents 11254932 3f19a289
Loading
Loading
Loading
Loading
+17 −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,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;
@@ -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;
@@ -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;
@@ -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;

@@ -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;

@@ -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;
+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;