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

Commit 699b16c5 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: add support for per cluster scan dumps"

parents 5235d853 b0210257
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;