150 lines
3.1 KiB
C
150 lines
3.1 KiB
C
|
// SPDX-License-Identifier: GPL-2.0
|
||
|
/*
|
||
|
* Samsung Exynos SoC series dsp driver
|
||
|
*
|
||
|
* Copyright (c) 2020 Samsung Electronics Co., Ltd.
|
||
|
* http://www.samsung.com/
|
||
|
*/
|
||
|
|
||
|
#include "dsp-log.h"
|
||
|
#include "dsp-hw-common-system.h"
|
||
|
#include "dsp-hw-common-imgloader.h"
|
||
|
|
||
|
int dsp_hw_common_imgloader_boot(struct dsp_imgloader *imgloader)
|
||
|
{
|
||
|
int ret;
|
||
|
|
||
|
dsp_enter();
|
||
|
imgloader->desc.skip_request_firmware = true;
|
||
|
ret = imgloader_boot(&imgloader->desc);
|
||
|
if (ret) {
|
||
|
dsp_err("Failed to boot imgloader(%d)\n", ret);
|
||
|
goto p_err;
|
||
|
}
|
||
|
dsp_leave();
|
||
|
return 0;
|
||
|
p_err:
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
int dsp_hw_common_imgloader_shutdown(struct dsp_imgloader *imgloader)
|
||
|
{
|
||
|
imgloader_shutdown(&imgloader->desc);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static int dsp_hw_common_imgloader_ops_mem_setup(struct imgloader_desc *desc,
|
||
|
const unsigned char *metadata, size_t size,
|
||
|
phys_addr_t *fw_phys_base, size_t *fw_bin_size,
|
||
|
size_t *fw_mem_size)
|
||
|
{
|
||
|
struct dsp_imgloader *imgloader;
|
||
|
struct dsp_memory *mem;
|
||
|
struct dsp_reserved_mem *rmem;
|
||
|
|
||
|
dsp_enter();
|
||
|
imgloader = desc->data;
|
||
|
mem = &imgloader->sys->memory;
|
||
|
|
||
|
if (mem->shared_id.fw_master < 0)
|
||
|
goto p_end;
|
||
|
|
||
|
rmem = &mem->reserved_mem[mem->shared_id.fw_master];
|
||
|
|
||
|
*fw_phys_base = rmem->paddr;
|
||
|
*fw_bin_size = rmem->used_size;
|
||
|
*fw_mem_size = rmem->size;
|
||
|
|
||
|
dsp_leave();
|
||
|
p_end:
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static int dsp_hw_common_imgloader_ops_verify_fw(struct imgloader_desc *desc,
|
||
|
phys_addr_t fw_phys_base, size_t fw_bin_size,
|
||
|
size_t fw_mem_size)
|
||
|
{
|
||
|
dsp_check();
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static int dsp_hw_common_imgloader_ops_blk_pwron(struct imgloader_desc *desc)
|
||
|
{
|
||
|
dsp_check();
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static int dsp_hw_common_imgloader_ops_init_image(struct imgloader_desc *desc)
|
||
|
{
|
||
|
dsp_check();
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static int dsp_hw_common_imgloader_ops_deinit_image(struct imgloader_desc *desc)
|
||
|
{
|
||
|
dsp_check();
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static int dsp_hw_common_imgloader_ops_shutdown(struct imgloader_desc *desc)
|
||
|
{
|
||
|
dsp_check();
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static const struct imgloader_ops common_imgloader_ops = {
|
||
|
.mem_setup = dsp_hw_common_imgloader_ops_mem_setup,
|
||
|
.verify_fw = dsp_hw_common_imgloader_ops_verify_fw,
|
||
|
.blk_pwron = dsp_hw_common_imgloader_ops_blk_pwron,
|
||
|
.init_image = dsp_hw_common_imgloader_ops_init_image,
|
||
|
.deinit_image = dsp_hw_common_imgloader_ops_deinit_image,
|
||
|
.shutdown = dsp_hw_common_imgloader_ops_shutdown,
|
||
|
};
|
||
|
|
||
|
int dsp_hw_common_imgloader_probe(struct dsp_imgloader *imgloader, void *sys)
|
||
|
{
|
||
|
int ret;
|
||
|
struct imgloader_desc *desc;
|
||
|
|
||
|
dsp_enter();
|
||
|
imgloader->sys = sys;
|
||
|
desc = &imgloader->desc;
|
||
|
|
||
|
desc->dev = imgloader->sys->dev;
|
||
|
desc->owner = THIS_MODULE;
|
||
|
desc->ops = &common_imgloader_ops;
|
||
|
desc->data = (void *)imgloader;
|
||
|
#ifdef CONFIG_EXYNOS_DSP_HW_P0
|
||
|
desc->name = "DNC";
|
||
|
#else
|
||
|
desc->name = "VPC";
|
||
|
#endif
|
||
|
desc->fw_id = 0;
|
||
|
|
||
|
ret = imgloader_desc_init(desc);
|
||
|
if (ret) {
|
||
|
dsp_err("Failed to init imgloader_desc(%d)\n", ret);
|
||
|
goto p_err;
|
||
|
}
|
||
|
|
||
|
dsp_leave();
|
||
|
return 0;
|
||
|
p_err:
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
void dsp_hw_common_imgloader_remove(struct dsp_imgloader *imgloader)
|
||
|
{
|
||
|
dsp_check();
|
||
|
imgloader_desc_release(&imgloader->desc);
|
||
|
}
|
||
|
|
||
|
int dsp_hw_common_imgloader_set_ops(struct dsp_imgloader *imgloader,
|
||
|
const void *ops)
|
||
|
{
|
||
|
dsp_enter();
|
||
|
imgloader->ops = ops;
|
||
|
dsp_leave();
|
||
|
return 0;
|
||
|
}
|