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

Commit 7042d6bd authored by Rishabh Bhatnagar's avatar Rishabh Bhatnagar Committed by Gerrit - the friendly Code Review server
Browse files

soc: qcom: Add support for per-CPU scandump sizes



Add support for specification of per-CPU scandump sizes.
If the scandump sizes are not specified in the correct
format, then no memory will be allocated for the scandump
region of any CPU.

Change-Id: I7d8a192f38ed665fec4a53f011fff62f453ffcd3
Signed-off-by: default avatarIsaac J. Manjarres <isaacm@codeaurora.org>
Signed-off-by: default avatarRishabh Bhatnagar <rishabhb@codeaurora.org>
parent 5e29c29e
Loading
Loading
Loading
Loading
+20 −7
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only
/*
 * Copyright (c) 2012-2018, The Linux Foundation. All rights reserved.
 * Copyright (c) 2012-2019, The Linux Foundation. All rights reserved.
 */

#include <linux/module.h>
@@ -47,7 +47,6 @@
#define SCM_SET_REGSAVE_CMD	0x2
#define SCM_SVC_SEC_WDOG_DIS	0x7
#define MAX_CPU_CTX_SIZE	2048
#define MAX_CPU_SCANDUMP_SIZE	0x10100

static struct msm_watchdog_data *wdog_data;

@@ -93,6 +92,7 @@ struct msm_watchdog_data {
	unsigned long long thread_start;
	unsigned long long ping_start[NR_CPUS];
	unsigned long long ping_end[NR_CPUS];
	unsigned int cpu_scandump_sizes[NR_CPUS];
};

/*
@@ -591,8 +591,10 @@ static void configure_scandump(struct msm_watchdog_data *wdog_dd)
	int cpu;
	static dma_addr_t dump_addr;
	static void *dump_vaddr;
	unsigned int scandump_size;

	for_each_cpu(cpu, cpu_present_mask) {
		scandump_size = wdog_dd->cpu_scandump_sizes[cpu];
		cpu_data = devm_kzalloc(wdog_dd->dev,
					sizeof(struct msm_dump_data),
					GFP_KERNEL);
@@ -600,17 +602,17 @@ static void configure_scandump(struct msm_watchdog_data *wdog_dd)
			continue;

		dump_vaddr = (void *) dma_alloc_coherent(wdog_dd->dev,
							 MAX_CPU_SCANDUMP_SIZE,
							 scandump_size,
							 &dump_addr,
							 GFP_KERNEL);
		if (!dump_vaddr) {
			dev_err(wdog_dd->dev, "Couldn't get memory for dump\n");
			continue;
		}
		memset(dump_vaddr, 0x0, MAX_CPU_SCANDUMP_SIZE);
		memset(dump_vaddr, 0x0, scandump_size);

		cpu_data->addr = dump_addr;
		cpu_data->len = MAX_CPU_SCANDUMP_SIZE;
		cpu_data->len = scandump_size;
		snprintf(cpu_data->name, sizeof(cpu_data->name),
			"KSCANDUMP%d", cpu);
		dump_entry.id = MSM_DUMP_DATA_SCANDUMP_PER_CPU + cpu;
@@ -620,7 +622,7 @@ static void configure_scandump(struct msm_watchdog_data *wdog_dd)
		if (ret) {
			dev_err(wdog_dd->dev, "Dump setup failed, id = %d\n",
				MSM_DUMP_DATA_SCANDUMP_PER_CPU + cpu);
			dma_free_coherent(wdog_dd->dev, MAX_CPU_SCANDUMP_SIZE,
			dma_free_coherent(wdog_dd->dev, scandump_size,
					  dump_vaddr,
					  dump_addr);
			devm_kfree(wdog_dd->dev, cpu_data);
@@ -743,7 +745,7 @@ static int msm_wdog_dt_to_pdata(struct platform_device *pdev,
{
	struct device_node *node = pdev->dev.of_node;
	struct resource *res;
	int ret;
	int ret, cpu, num_scandump_sizes;

	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "wdt-base");
	if (!res)
@@ -805,6 +807,17 @@ static int msm_wdog_dt_to_pdata(struct platform_device *pdev,
	pdata->wakeup_irq_enable = of_property_read_bool(node,
							 "qcom,wakeup-enable");

	num_scandump_sizes = of_property_count_elems_of_size(node,
							"qcom,scandump-sizes",
							sizeof(u32));
	if (num_scandump_sizes < 0 || num_scandump_sizes != num_possible_cpus())
		dev_info(&pdev->dev, "%s scandump sizes property not correct\n",
			__func__);
	else
		for_each_cpu(cpu, cpu_present_mask)
			of_property_read_u32_index(node, "qcom,scandump-sizes",
						   cpu,
					&pdata->cpu_scandump_sizes[cpu]);
	pdata->irq_ppi = irq_is_percpu(pdata->bark_irq);
	dump_pdata(pdata);
	return 0;