95 lines
2.3 KiB
C
95 lines
2.3 KiB
C
|
/*
|
||
|
* mods_adsp.c - This file is part of NVIDIA MODS kernel driver.
|
||
|
*
|
||
|
* Copyright (c) 2014-2018, NVIDIA CORPORATION. All rights reserved.
|
||
|
*
|
||
|
* NVIDIA MODS kernel driver is free software: you can redistribute it and/or
|
||
|
* modify it under the terms of the GNU General Public License,
|
||
|
* version 2, as published by the Free Software Foundation.
|
||
|
*
|
||
|
* NVIDIA MODS kernel driver is distributed in the hope that it will be useful,
|
||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
* GNU General Public License for more details.
|
||
|
*
|
||
|
* You should have received a copy of the GNU General Public License
|
||
|
* along with NVIDIA MODS kernel driver.
|
||
|
* If not, see <http://www.gnu.org/licenses/>.
|
||
|
*/
|
||
|
|
||
|
#include <linux/uaccess.h>
|
||
|
#include "mods_internal.h"
|
||
|
#include <linux/tegra_nvadsp.h>
|
||
|
|
||
|
int esc_mods_adsp_load(struct file *pfile)
|
||
|
{
|
||
|
return nvadsp_os_load();
|
||
|
}
|
||
|
|
||
|
int esc_mods_adsp_start(struct file *pfile)
|
||
|
{
|
||
|
return nvadsp_os_start();
|
||
|
}
|
||
|
|
||
|
int esc_mods_adsp_stop(struct file *pfile)
|
||
|
{
|
||
|
return nvadsp_os_suspend();
|
||
|
}
|
||
|
|
||
|
int esc_mods_adsp_run_app(struct file *pfile, struct MODS_ADSP_RUN_APP_INFO *p)
|
||
|
{
|
||
|
int rc = -1;
|
||
|
int max_retry = 3;
|
||
|
int rcount = 0;
|
||
|
nvadsp_app_handle_t handle;
|
||
|
nvadsp_app_info_t *p_app_info;
|
||
|
nvadsp_app_args_t app_args;
|
||
|
|
||
|
handle = nvadsp_app_load(p->app_name, p->app_file_name);
|
||
|
if (!handle) {
|
||
|
mods_error_printk("load adsp app fail");
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
if (p->argc > 0 && p->argc <= MODS_ADSP_APP_MAX_PARAM) {
|
||
|
app_args.argc = p->argc;
|
||
|
memcpy(app_args.argv, p->argv, p->argc * sizeof(__u32));
|
||
|
p_app_info = nvadsp_app_init(handle, &app_args);
|
||
|
} else
|
||
|
p_app_info = nvadsp_app_init(handle, NULL);
|
||
|
|
||
|
if (!p_app_info) {
|
||
|
mods_error_printk("init adsp app fail");
|
||
|
nvadsp_app_unload(handle);
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
rc = nvadsp_app_start(p_app_info);
|
||
|
if (rc) {
|
||
|
mods_error_printk("start adsp app fail");
|
||
|
goto failed;
|
||
|
}
|
||
|
|
||
|
while (rcount++ < max_retry) {
|
||
|
rc = wait_for_nvadsp_app_complete_timeout(p_app_info,
|
||
|
msecs_to_jiffies(p->timeout));
|
||
|
if (rc == -ERESTARTSYS)
|
||
|
continue;
|
||
|
else if (rc == 0) {
|
||
|
mods_error_printk("app timeout(%d)", p->timeout);
|
||
|
rc = -1;
|
||
|
} else if (rc < 0) {
|
||
|
mods_error_printk("run app failed, err=%d\n", rc);
|
||
|
rc = -1;
|
||
|
} else
|
||
|
rc = 0;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
failed:
|
||
|
nvadsp_app_deinit(p_app_info);
|
||
|
nvadsp_app_unload(handle);
|
||
|
|
||
|
return rc;
|
||
|
}
|