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

Commit 63128801 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: Create additional ramdump device node for SSR minidump"

parents 8bc4a576 793d5227
Loading
Loading
Loading
Loading
+23 −4
Original line number Diff line number Diff line
@@ -164,12 +164,17 @@ static int pil_do_minidump(struct pil_desc *desc, void *ramdump_dev)
	int ss_mdump_seg_cnt;
	int ret, i;

	if (!ramdump_dev)
		return -ENODEV;

	memcpy(&offset, &priv->minidump, sizeof(priv->minidump));
	offset = offset + sizeof(priv->minidump->md_ss_smem_regions_baseptr);
	/* There are 3 encryption keys which also need to be dumped */
	ss_mdump_seg_cnt = readb_relaxed(offset) +
				NUM_OF_ENCRYPTED_KEY;

	pr_debug("SMEM base to read minidump segments is 0x%x\n",
			__raw_readl(priv->minidump));
	subsys_smem_base = ioremap(__raw_readl(priv->minidump),
				   ss_mdump_seg_cnt * sizeof(*region_info));
	region_info =
@@ -191,6 +196,9 @@ static int pil_do_minidump(struct pil_desc *desc, void *ramdump_dev)
		s->address = __raw_readl(offset);
		offset = offset + sizeof(region_info->region_base_address);
		s->size = __raw_readl(offset);
		pr_debug("Dumping segment %s with address %pK and size 0x%x\n",
				s->name, (void *)s->address,
				(unsigned int)s->size);
		s++;
		region_info++;
	}
@@ -199,7 +207,6 @@ static int pil_do_minidump(struct pil_desc *desc, void *ramdump_dev)
	if (ret)
		pil_err(desc, "%s: Ramdump collection failed for subsys %s rc:%d\n",
			__func__, desc->name, ret);
	writel_relaxed(0, &priv->minidump->md_ss_smem_regions_baseptr);
	writeb_relaxed(1, &priv->minidump->md_ss_ssr_cause);

	if (desc->subsys_vmid > 0)
@@ -216,16 +223,28 @@ static int pil_do_minidump(struct pil_desc *desc, void *ramdump_dev)
 * Calls the ramdump API with a list of segments generated from the addresses
 * that the descriptor corresponds to.
 */
int pil_do_ramdump(struct pil_desc *desc, void *ramdump_dev)
int pil_do_ramdump(struct pil_desc *desc,
		   void *ramdump_dev, void *minidump_dev)
{
	struct pil_priv *priv = desc->priv;
	struct pil_seg *seg;
	int count = 0, ret;
	struct ramdump_segment *ramdump_segs, *s;
	void __iomem *offset;

	if (priv->minidump && (__raw_readl(priv->minidump) > 0))
		return pil_do_minidump(desc, ramdump_dev);
	memcpy(&offset, &priv->minidump, sizeof(priv->minidump));
	/*
	 * Collect minidump if smem base is initialized,
	 * ssr cause is 0. No need to check encryption status
	 */
	if (priv->minidump
	&& (__raw_readl(priv->minidump) != 0)
	&& (readb_relaxed(offset + sizeof(u32) + 2 * sizeof(u8)) == 0)) {
		pr_debug("Dumping Minidump for %s\n", desc->name);
		return pil_do_minidump(desc, minidump_dev);

	}
	pr_debug("Continuing with full SSR dump for %s\n", desc->name);
	list_for_each_entry(seg, &priv->segs, list)
		count++;

+4 −2
Original line number Diff line number Diff line
@@ -134,7 +134,8 @@ extern void pil_shutdown(struct pil_desc *desc);
extern void pil_free_memory(struct pil_desc *desc);
extern void pil_desc_release(struct pil_desc *desc);
extern phys_addr_t pil_get_entry_addr(struct pil_desc *desc);
extern int pil_do_ramdump(struct pil_desc *desc, void *ramdump_dev);
extern int pil_do_ramdump(struct pil_desc *desc, void *ramdump_dev,
			  void *minidump_dev);
extern int pil_assign_mem_to_subsys(struct pil_desc *desc, phys_addr_t addr,
						size_t size);
extern int pil_assign_mem_to_linux(struct pil_desc *desc, phys_addr_t addr,
@@ -154,7 +155,8 @@ static inline phys_addr_t pil_get_entry_addr(struct pil_desc *desc)
{
	return 0;
}
static inline int pil_do_ramdump(struct pil_desc *desc, void *ramdump_dev)
static inline int pil_do_ramdump(struct pil_desc *desc,
		void *ramdump_dev, void *minidump_dev)
{
	return 0;
}
+1 −0
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ struct modem_data {
	struct subsys_device *subsys;
	struct subsys_desc subsys_desc;
	void *ramdump_dev;
	void *minidump_dev;
	bool crash_shutdown;
	u32 pas_id;
	bool ignore_errors;
+12 −1
Original line number Diff line number Diff line
@@ -171,7 +171,8 @@ static int modem_ramdump(int enable, const struct subsys_desc *subsys)
	if (ret)
		return ret;

	ret = pil_do_ramdump(&drv->q6->desc, drv->ramdump_dev);
	ret = pil_do_ramdump(&drv->q6->desc,
			drv->ramdump_dev, drv->minidump_dev);
	if (ret < 0)
		pr_err("Unable to dump modem fw memory (rc = %d).\n", ret);

@@ -230,9 +231,18 @@ static int pil_subsys_init(struct modem_data *drv,
		ret = -ENOMEM;
		goto err_ramdump;
	}
	drv->minidump_dev = create_ramdump_device("md_modem", &pdev->dev);
	if (!drv->minidump_dev) {
		pr_err("%s: Unable to create a modem minidump device.\n",
			__func__);
		ret = -ENOMEM;
		goto err_minidump;
	}

	return 0;

err_minidump:
	destroy_ramdump_device(drv->ramdump_dev);
err_ramdump:
	subsys_unregister(drv->subsys);
err_subsys:
@@ -414,6 +424,7 @@ static int pil_mss_driver_exit(struct platform_device *pdev)

	subsys_unregister(drv->subsys);
	destroy_ramdump_device(drv->ramdump_dev);
	destroy_ramdump_device(drv->minidump_dev);
	pil_desc_release(&drv->q6->desc);
	return 0;
}
+1 −1
Original line number Diff line number Diff line
@@ -850,7 +850,7 @@ static int subsys_ramdump(int enable, const struct subsys_desc *subsys)
	if (!enable)
		return 0;

	return pil_do_ramdump(&d->desc, d->ramdump_dev);
	return pil_do_ramdump(&d->desc, d->ramdump_dev, NULL);
}

static void subsys_free_memory(const struct subsys_desc *subsys)