Commit a4cf7e3c authored by Vikash Garodia's avatar Vikash Garodia Committed by Mauro Carvalho Chehab
Browse files

media: venus: firmware: move load firmware in a separate function

parent 5df317c8
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -84,7 +84,7 @@ static void venus_sys_error_handler(struct work_struct *work)

	pm_runtime_get_sync(core->dev);

	ret |= venus_boot(core->dev, core->res->fwname);
	ret |= venus_boot(core);

	ret |= hfi_core_resume(core, true);

@@ -284,7 +284,7 @@ static int venus_probe(struct platform_device *pdev)
	if (ret < 0)
		goto err_runtime_disable;

	ret = venus_boot(dev, core->res->fwname);
	ret = venus_boot(core);
	if (ret)
		goto err_runtime_disable;

+35 −20
Original line number Diff line number Diff line
@@ -60,20 +60,18 @@ int venus_set_hw_state(struct venus_core *core, bool resume)
	return 0;
}

int venus_boot(struct device *dev, const char *fwname)
static int venus_load_fw(struct venus_core *core, const char *fwname,
			 phys_addr_t *mem_phys, size_t *mem_size)
{
	const struct firmware *mdt;
	struct device_node *node;
	phys_addr_t mem_phys;
	struct device *dev;
	struct resource r;
	ssize_t fw_size;
	size_t mem_size;
	void *mem_va;
	int ret;

	if (!IS_ENABLED(CONFIG_QCOM_MDT_LOADER) || !qcom_scm_is_available())
		return -EPROBE_DEFER;

	dev = core->dev;
	node = of_parse_phandle(dev->of_node, "memory-region", 0);
	if (!node) {
		dev_err(dev, "no memory-region specified\n");
@@ -84,16 +82,16 @@ int venus_boot(struct device *dev, const char *fwname)
	if (ret)
		return ret;

	mem_phys = r.start;
	mem_size = resource_size(&r);
	*mem_phys = r.start;
	*mem_size = resource_size(&r);

	if (mem_size < VENUS_FW_MEM_SIZE)
	if (*mem_size < VENUS_FW_MEM_SIZE)
		return -EINVAL;

	mem_va = memremap(r.start, mem_size, MEMREMAP_WC);
	mem_va = memremap(r.start, *mem_size, MEMREMAP_WC);
	if (!mem_va) {
		dev_err(dev, "unable to map memory region: %pa+%zx\n",
			&r.start, mem_size);
			&r.start, *mem_size);
		return -ENOMEM;
	}

@@ -108,23 +106,40 @@ int venus_boot(struct device *dev, const char *fwname)
		goto err_unmap;
	}

	ret = qcom_mdt_load(dev, mdt, fwname, VENUS_PAS_ID, mem_va, mem_phys,
			    mem_size, NULL);
	if (core->use_tz)
		ret = qcom_mdt_load(dev, mdt, fwname, VENUS_PAS_ID,
				    mem_va, *mem_phys, *mem_size, NULL);
	else
		ret = qcom_mdt_load_no_init(dev, mdt, fwname, VENUS_PAS_ID,
					    mem_va, *mem_phys, *mem_size, NULL);

	release_firmware(mdt);

	if (ret)
		goto err_unmap;

	ret = qcom_scm_pas_auth_and_reset(VENUS_PAS_ID);
	if (ret)
		goto err_unmap;

err_unmap:
	memunmap(mem_va);
	return ret;
}

int venus_boot(struct venus_core *core)
{
	struct device *dev = core->dev;
	phys_addr_t mem_phys;
	size_t mem_size;
	int ret;

	if (!IS_ENABLED(CONFIG_QCOM_MDT_LOADER) ||
	    (core->use_tz && !qcom_scm_is_available()))
		return -EPROBE_DEFER;

	ret = venus_load_fw(core, core->res->fwname, &mem_phys, &mem_size);
	if (ret) {
		dev_err(dev, "fail to load video firmware\n");
		return -EINVAL;
	}

	return qcom_scm_pas_auth_and_reset(VENUS_PAS_ID);
}

int venus_shutdown(struct device *dev)
{
	return qcom_scm_pas_shutdown(VENUS_PAS_ID);
+1 −1
Original line number Diff line number Diff line
@@ -16,7 +16,7 @@

struct device;

int venus_boot(struct device *dev, const char *fwname);
int venus_boot(struct venus_core *core);
int venus_shutdown(struct device *dev);
int venus_set_hw_state(struct venus_core *core, bool suspend);