Commit 0ca0ca98 authored by Dikshita Agarwal's avatar Dikshita Agarwal Committed by Mauro Carvalho Chehab
Browse files

media: venus: core: add support to dump FW region



Add support to dump video FW region during FW crash
using devcoredump helpers.

Signed-off-by: default avatarDikshita Agarwal <dikshita@codeaurora.org>
Reviewed-by: default avatarStephen Boyd <swboyd@chromium.org>
Signed-off-by: default avatarStanimir Varbanov <stanimir.varbanov@linaro.org>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+huawei@kernel.org>
parent 0f9774dd
Loading
Loading
Loading
Loading
+30 −0
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@
#include <linux/interconnect.h>
#include <linux/ioctl.h>
#include <linux/delay.h>
#include <linux/devcoredump.h>
#include <linux/list.h>
#include <linux/module.h>
#include <linux/of_device.h>
@@ -22,6 +23,33 @@
#include "firmware.h"
#include "pm_helpers.h"

static void venus_coredump(struct venus_core *core)
{
	struct device *dev;
	phys_addr_t mem_phys;
	size_t mem_size;
	void *mem_va;
	void *data;

	dev = core->dev;
	mem_phys = core->fw.mem_phys;
	mem_size = core->fw.mem_size;

	mem_va = memremap(mem_phys, mem_size, MEMREMAP_WC);
	if (!mem_va)
		return;

	data = vmalloc(mem_size);
	if (!data) {
		memunmap(mem_va);
		return;
	}

	memcpy(data, mem_va, mem_size);
	memunmap(mem_va);
	dev_coredumpv(dev, data, mem_size, GFP_KERNEL);
}

static void venus_event_notify(struct venus_core *core, u32 event)
{
	struct venus_inst *inst;
@@ -67,6 +95,8 @@ static void venus_sys_error_handler(struct work_struct *work)

	venus_shutdown(core);

	venus_coredump(core);

	pm_runtime_put_sync(core->dev);

	while (core->pmdomains[0] && pm_runtime_active(core->pmdomains[0]))
+2 −0
Original line number Diff line number Diff line
@@ -144,6 +144,8 @@ struct venus_core {
		struct device *dev;
		struct iommu_domain *iommu_domain;
		size_t mapped_mem_size;
		phys_addr_t mem_phys;
		size_t mem_size;
	} fw;
	struct mutex lock;
	struct list_head instances;
+3 −0
Original line number Diff line number Diff line
@@ -201,6 +201,9 @@ int venus_boot(struct venus_core *core)
		return -EINVAL;
	}

	core->fw.mem_size = mem_size;
	core->fw.mem_phys = mem_phys;

	if (core->use_tz)
		ret = qcom_scm_pas_auth_and_reset(VENUS_PAS_ID);
	else