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

Commit b0210257 authored by Mao Jinlong's avatar Mao Jinlong
Browse files

soc: qcom: add support for per cluster scan dumps



Add support to allocate memory for per cluster scan dumps.
This memory can be used to save CPU scan dumps at the time
of a dump.

CRs-Fixed: 2209256
Change-Id: I29dffb2ffe6ae6ae59f4bc91deb996e5bf512b10
Signed-off-by: default avatarMao Jinlong <jinlmao@codeaurora.org>
parent c0690fe0
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ Optional properties:
- qcom,ipi-ping : (boolean) send keep alive ping to other cpus if present
- qcom,wakeup-enable : (boolean) enable non secure watchdog to freeze / unfreeze
                        automatically across suspend / resume path.
- qcom,scandump-size : size of scan dump memory region.

Example:

+43 −0
Original line number Diff line number Diff line
@@ -93,6 +93,7 @@ struct msm_watchdog_data {

	bool timer_expired;
	bool user_pet_complete;
	unsigned int scandump_size;
};

/*
@@ -581,6 +582,41 @@ static void configure_bark_dump(struct msm_watchdog_data *wdog_dd)
	return;
}

static void register_scan_dump(struct msm_watchdog_data *wdog_dd)
{
	static void *dump_addr;
	int ret;
	struct msm_dump_entry dump_entry;
	struct msm_dump_data *dump_data;

	if (!wdog_dd->scandump_size)
		return;

	dump_data = kzalloc(sizeof(struct msm_dump_data), GFP_KERNEL);
	if (!dump_data)
		return;
	dump_addr = kzalloc(wdog_dd->scandump_size, GFP_KERNEL);
	if (!dump_addr)
		goto err0;

	dump_data->addr = virt_to_phys(dump_addr);
	dump_data->len = wdog_dd->scandump_size;
	strlcpy(dump_data->name, "KSCANDUMP", sizeof(dump_data->name));

	dump_entry.id = MSM_DUMP_DATA_SCANDUMP;
	dump_entry.addr = virt_to_phys(dump_data);
	ret = msm_dump_data_register(MSM_DUMP_TABLE_APPS, &dump_entry);
	if (ret) {
		pr_err("Registering scandump region failed\n");
		goto err1;
	}
	return;
err1:
	kfree(dump_addr);
err0:
	kfree(dump_data);
}

static void configure_scandump(struct msm_watchdog_data *wdog_dd)
{
	int ret;
@@ -624,6 +660,8 @@ static void configure_scandump(struct msm_watchdog_data *wdog_dd)
			devm_kfree(wdog_dd->dev, cpu_data);
		}
	}

	register_scan_dump(wdog_dd);
}

static int init_watchdog_sysfs(struct msm_watchdog_data *wdog_dd)
@@ -805,6 +843,11 @@ static int msm_wdog_dt_to_pdata(struct platform_device *pdev,
	pdata->wakeup_irq_enable = of_property_read_bool(node,
							 "qcom,wakeup-enable");

	if (of_property_read_u32(node, "qcom,scandump-size",
				 &pdata->scandump_size))
		dev_info(&pdev->dev,
			 "No need to allocate memory for scandumps\n");

	pdata->irq_ppi = irq_is_percpu(pdata->bark_irq);
	dump_pdata(pdata);
	return 0;