mirror of
git://nv-tegra.nvidia.com/linux-nv-oot.git
synced 2025-12-23 01:31:30 +03:00
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:
committed by
Laxman Dewangan
parent
3079cc865b
commit
07d0f698f2
@@ -127,7 +127,8 @@ struct nvadsp_os_args {
|
|||||||
char logger[DRAM_DEBUG_LOG_SIZE];
|
char logger[DRAM_DEBUG_LOG_SIZE];
|
||||||
uint64_t adsp_freq_hz;
|
uint64_t adsp_freq_hz;
|
||||||
uint32_t dynamic_app_support;
|
uint32_t dynamic_app_support;
|
||||||
char reserved[124];
|
uint32_t chip_id;
|
||||||
|
char reserved[120];
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
/* ARM MODE REGS */
|
/* ARM MODE REGS */
|
||||||
|
|||||||
@@ -42,6 +42,8 @@
|
|||||||
|
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
|
|
||||||
|
#include <soc/tegra/chip-id.h>
|
||||||
|
|
||||||
#include "ape_actmon.h"
|
#include "ape_actmon.h"
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "dev.h"
|
#include "dev.h"
|
||||||
@@ -635,12 +637,34 @@ static void deallocate_memory_for_adsp_os(struct device *dev)
|
|||||||
#endif
|
#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)
|
static int __nvadsp_os_secload(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct nvadsp_drv_data *drv_data = platform_get_drvdata(pdev);
|
struct nvadsp_drv_data *drv_data = platform_get_drvdata(pdev);
|
||||||
dma_addr_t addr = drv_data->adsp_mem[ACSR_ADDR];
|
dma_addr_t addr = drv_data->adsp_mem[ACSR_ADDR];
|
||||||
size_t size = drv_data->adsp_mem[ACSR_SIZE];
|
size_t size = drv_data->adsp_mem[ACSR_SIZE];
|
||||||
struct nvadsp_shared_mem *shared_mem;
|
|
||||||
struct device *dev = &pdev->dev;
|
struct device *dev = &pdev->dev;
|
||||||
void *dram_va;
|
void *dram_va;
|
||||||
|
|
||||||
@@ -650,49 +674,18 @@ static int __nvadsp_os_secload(struct platform_device *pdev)
|
|||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
shared_mem = dram_va;
|
nvadsp_set_shared_mem(pdev, dram_va, 0);
|
||||||
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;
|
|
||||||
|
|
||||||
#ifdef CONFIG_DEBUG_FS
|
|
||||||
wake_up(&priv.logger.wait_queue);
|
|
||||||
#endif
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int nvadsp_os_load(void)
|
static int nvadsp_firmware_load(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct nvadsp_shared_mem *shared_mem;
|
struct nvadsp_shared_mem *shared_mem;
|
||||||
struct nvadsp_drv_data *drv_data;
|
struct device *dev = &pdev->dev;
|
||||||
const struct firmware *fw;
|
const struct firmware *fw;
|
||||||
struct device *dev;
|
|
||||||
int ret = 0;
|
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);
|
ret = request_firmware(&fw, NVADSP_FIRMWARE, dev);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
dev_err(dev, "reqest firmware for %s failed with %d\n",
|
dev_err(dev, "reqest firmware for %s failed with %d\n",
|
||||||
@@ -712,13 +705,6 @@ int nvadsp_os_load(void)
|
|||||||
goto release_firmware;
|
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);
|
dev_info(dev, "Loading ADSP OS firmware %s\n", NVADSP_FIRMWARE);
|
||||||
|
|
||||||
ret = nvadsp_os_elf_load(fw);
|
ret = nvadsp_os_elf_load(fw);
|
||||||
@@ -727,7 +713,8 @@ int nvadsp_os_load(void)
|
|||||||
goto deallocate_os_memory;
|
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);
|
ret = dram_app_mem_init(priv.app_alloc_addr, priv.app_size);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
@@ -735,17 +722,50 @@ int nvadsp_os_load(void)
|
|||||||
goto deallocate_os_memory;
|
goto deallocate_os_memory;
|
||||||
}
|
}
|
||||||
priv.os_firmware = fw;
|
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;
|
return 0;
|
||||||
|
|
||||||
deallocate_os_memory:
|
deallocate_os_memory:
|
||||||
deallocate_memory_for_adsp_os(dev);
|
deallocate_memory_for_adsp_os(dev);
|
||||||
release_firmware:
|
release_firmware:
|
||||||
release_firmware(fw);
|
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:
|
end:
|
||||||
mutex_unlock(&priv.fw_load_lock);
|
mutex_unlock(&priv.fw_load_lock);
|
||||||
return ret;
|
return ret;
|
||||||
|
|||||||
Reference in New Issue
Block a user