Revert "Revert "platform: nvadsp: Ability to get chip id on ADSP""

This reverts commit 45f17000bcd1a32f4b6d35a11af476c4dc152060 and
restores change https://git-master.nvidia.com/r/1645257.

Bug 200372198

Change-Id: I3798ac0ba7432cc50df18dde65705145f62c0616
Signed-off-by: Ajay Nandakumar <anandakumarm@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/1652521
GVS: Gerrit_Virtual_Submit
Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com>
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
This commit is contained in:
Ajay Nandakumar M
2018-02-05 22:38:15 -08:00
committed by Laxman Dewangan
parent 3079cc865b
commit 07d0f698f2
2 changed files with 70 additions and 49 deletions

View File

@@ -127,7 +127,8 @@ struct nvadsp_os_args {
char logger[DRAM_DEBUG_LOG_SIZE];
uint64_t adsp_freq_hz;
uint32_t dynamic_app_support;
char reserved[124];
uint32_t chip_id;
char reserved[120];
} __packed;
/* ARM MODE REGS */

View File

@@ -42,6 +42,8 @@
#include <asm/uaccess.h>
#include <soc/tegra/chip-id.h>
#include "ape_actmon.h"
#include "os.h"
#include "dev.h"
@@ -635,12 +637,34 @@ static void deallocate_memory_for_adsp_os(struct device *dev)
#endif
}
static void nvadsp_set_shared_mem(struct platform_device *pdev,
struct nvadsp_shared_mem *shared_mem,
uint32_t dynamic_app_support)
{
struct nvadsp_drv_data *drv_data = platform_get_drvdata(pdev);
struct device *dev = &pdev->dev;
struct nvadsp_os_args *os_args;
enum tegra_chipid chip_id;
shared_mem->os_args.dynamic_app_support = dynamic_app_support;
/* set logger strcuture with required properties */
priv.logger.debug_ram_rdr = shared_mem->os_args.logger;
priv.logger.debug_ram_sz = sizeof(shared_mem->os_args.logger);
priv.logger.dev = dev;
priv.adsp_os_fw_loaded = true;
chip_id = tegra_get_chipid();
os_args = &shared_mem->os_args;
os_args->chip_id = chip_id;
drv_data->shared_adsp_os_data = shared_mem;
}
static int __nvadsp_os_secload(struct platform_device *pdev)
{
struct nvadsp_drv_data *drv_data = platform_get_drvdata(pdev);
dma_addr_t addr = drv_data->adsp_mem[ACSR_ADDR];
size_t size = drv_data->adsp_mem[ACSR_SIZE];
struct nvadsp_shared_mem *shared_mem;
struct device *dev = &pdev->dev;
void *dram_va;
@@ -650,49 +674,18 @@ static int __nvadsp_os_secload(struct platform_device *pdev)
return -ENOMEM;
}
shared_mem = dram_va;
shared_mem->os_args.dynamic_app_support = 0;
drv_data->shared_adsp_os_data = shared_mem;
/* set logger strcuture with required properties */
priv.logger.debug_ram_rdr = shared_mem->os_args.logger;
priv.logger.debug_ram_sz = sizeof(shared_mem->os_args.logger);
priv.logger.dev = dev;
priv.adsp_os_fw_loaded = true;
nvadsp_set_shared_mem(pdev, dram_va, 0);
#ifdef CONFIG_DEBUG_FS
wake_up(&priv.logger.wait_queue);
#endif
return 0;
}
int nvadsp_os_load(void)
static int nvadsp_firmware_load(struct platform_device *pdev)
{
struct nvadsp_shared_mem *shared_mem;
struct nvadsp_drv_data *drv_data;
struct device *dev = &pdev->dev;
const struct firmware *fw;
struct device *dev;
int ret = 0;
if (!priv.pdev) {
pr_err("ADSP Driver is not initialized\n");
ret = -EINVAL;
goto end;
}
mutex_lock(&priv.fw_load_lock);
if (priv.adsp_os_fw_loaded)
goto end;
dev = &priv.pdev->dev;
drv_data = platform_get_drvdata(priv.pdev);
if (drv_data->adsp_os_secload) {
dev_info(dev, "ADSP OS firmware already loaded\n");
ret = __nvadsp_os_secload(priv.pdev);
goto end;
}
ret = request_firmware(&fw, NVADSP_FIRMWARE, dev);
if (ret < 0) {
dev_err(dev, "reqest firmware for %s failed with %d\n",
@@ -712,13 +705,6 @@ int nvadsp_os_load(void)
goto release_firmware;
}
shared_mem = get_mailbox_shared_region(fw);
drv_data->shared_adsp_os_data = shared_mem;
/* set logger strcuture with required properties */
priv.logger.debug_ram_rdr = shared_mem->os_args.logger;
priv.logger.debug_ram_sz = sizeof(shared_mem->os_args.logger);
priv.logger.dev = dev;
dev_info(dev, "Loading ADSP OS firmware %s\n", NVADSP_FIRMWARE);
ret = nvadsp_os_elf_load(fw);
@@ -727,7 +713,8 @@ int nvadsp_os_load(void)
goto deallocate_os_memory;
}
shared_mem->os_args.dynamic_app_support = 1;
shared_mem = get_mailbox_shared_region(fw);
nvadsp_set_shared_mem(pdev, shared_mem, 1);
ret = dram_app_mem_init(priv.app_alloc_addr, priv.app_size);
if (ret) {
@@ -735,17 +722,50 @@ int nvadsp_os_load(void)
goto deallocate_os_memory;
}
priv.os_firmware = fw;
priv.adsp_os_fw_loaded = true;
#ifdef CONFIG_DEBUG_FS
wake_up(&priv.logger.wait_queue);
#endif
mutex_unlock(&priv.fw_load_lock);
return 0;
deallocate_os_memory:
deallocate_memory_for_adsp_os(dev);
release_firmware:
release_firmware(fw);
end:
return ret;
}
int nvadsp_os_load(void)
{
struct nvadsp_drv_data *drv_data;
struct device *dev;
int ret = 0;
if (!priv.pdev) {
pr_err("ADSP Driver is not initialized\n");
ret = -EINVAL;
goto end;
}
mutex_lock(&priv.fw_load_lock);
if (priv.adsp_os_fw_loaded)
goto end;
drv_data = platform_get_drvdata(priv.pdev);
dev = &priv.pdev->dev;
if (drv_data->adsp_os_secload) {
dev_info(dev, "ADSP OS firmware already loaded\n");
ret = __nvadsp_os_secload(priv.pdev);
} else {
ret = nvadsp_firmware_load(priv.pdev);
}
if (ret == 0) {
priv.adsp_os_fw_loaded = true;
#ifdef CONFIG_DEBUG_FS
wake_up(&priv.logger.wait_queue);
#endif
}
end:
mutex_unlock(&priv.fw_load_lock);
return ret;