diff --git a/drivers/platform/tegra/nvadsp/adsp_shared_struct.h b/drivers/platform/tegra/nvadsp/adsp_shared_struct.h index fcc7b643..95e43494 100644 --- a/drivers/platform/tegra/nvadsp/adsp_shared_struct.h +++ b/drivers/platform/tegra/nvadsp/adsp_shared_struct.h @@ -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 */ diff --git a/drivers/platform/tegra/nvadsp/os.c b/drivers/platform/tegra/nvadsp/os.c index f87703a6..1df4d194 100644 --- a/drivers/platform/tegra/nvadsp/os.c +++ b/drivers/platform/tegra/nvadsp/os.c @@ -42,6 +42,8 @@ #include +#include + #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;