mirror of
git://nv-tegra.nvidia.com/linux-nv-oot.git
synced 2025-12-23 09:42:19 +03:00
Replacing mbox2 usage with the help of existing mbox used for os related communication with host cpu so that the mbox2 can be used in 128 bit mbox usage Bug 3581290 Change-Id: Iba750b6cedcc2e7b0c5ab1548e3614d77aaeb729 Signed-off-by: Asha Talambedu <atalambedu@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvidia/+/2686392 Reviewed-by: svcacv <svcacv@nvidia.com> Reviewed-by: svc_kernel_abi <svc_kernel_abi@nvidia.com> Reviewed-by: Viswanath L <viswanathl@nvidia.com> Reviewed-by: Dara Ramesh <dramesh@nvidia.com> GVS: Gerrit_Virtual_Submit
199 lines
5.3 KiB
C
199 lines
5.3 KiB
C
/*
|
|
* os.h
|
|
*
|
|
* A header file containing data structures shared with ADSP OS
|
|
*
|
|
* Copyright (C) 2014-2022 NVIDIA Corporation. All rights reserved.
|
|
*
|
|
* This software is licensed under the terms of the GNU General Public
|
|
* License version 2, as published by the Free Software Foundation, and
|
|
* may be copied, distributed, and modified under those terms.
|
|
*
|
|
* This program 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.
|
|
*
|
|
*/
|
|
#ifndef __TEGRA_NVADSP_OS_H
|
|
#define __TEGRA_NVADSP_OS_H
|
|
|
|
#include <linux/firmware.h>
|
|
#include "adsp_shared_struct.h"
|
|
|
|
#include "dev.h"
|
|
|
|
#define CONFIG_ADSP_DRAM_LOG_WITH_TAG 1
|
|
/* enable profiling of load init start */
|
|
#define RECORD_STATS 0
|
|
|
|
#define SYM_NAME_SZ 128
|
|
|
|
#define AMC_EVP_RESET_VEC_0 0x700
|
|
#define AMC_EVP_UNDEF_VEC_0 0x704
|
|
#define AMC_EVP_SWI_VEC_0 0x708
|
|
#define AMC_EVP_PREFETCH_ABORT_VEC_0 0x70c
|
|
#define AMC_EVP_DATA_ABORT_VEC_0 0x710
|
|
#define AMC_EVP_RSVD_VEC_0 0x714
|
|
#define AMC_EVP_IRQ_VEC_0 0x718
|
|
#define AMC_EVP_FIQ_VEC_0 0x71c
|
|
#define AMC_EVP_RESET_ADDR_0 0x720
|
|
#define AMC_EVP_UNDEF_ADDR_0 0x724
|
|
#define AMC_EVP_SWI_ADDR_0 0x728
|
|
#define AMC_EVP_PREFETCH_ABORT_ADDR_0 0x72c
|
|
#define AMC_EVP_DATA_ABORT_ADDR_0 0x730
|
|
#define AMC_EVP_RSVD_ADDR_0 0x734
|
|
#define AMC_EVP_IRQ_ADDR_0 0x738
|
|
#define AMC_EVP_FIQ_ADDR_0 0x73c
|
|
|
|
#define AMC_EVP_SIZE (AMC_EVP_FIQ_ADDR_0 - AMC_EVP_RESET_VEC_0 + 4)
|
|
#define AMC_EVP_WSIZE (AMC_EVP_SIZE >> 2)
|
|
|
|
#define OS_LOAD_TIMEOUT 5000 /* ms */
|
|
#define ADSP_COM_MBOX_ID 2
|
|
|
|
#define MIN_ADSP_FREQ 38400000lu /* in Hz */
|
|
|
|
/* macros used to find the current mode of ADSP */
|
|
#define MODE_MASK 0x1f
|
|
#define MODE_USR 0x10
|
|
#define MODE_FIQ 0x11
|
|
#define MODE_IRQ 0x12
|
|
#define MODE_SVC 0x13
|
|
#define MODE_MON 0x16
|
|
#define MODE_ABT 0x17
|
|
#define MODE_UND 0x1b
|
|
#define MODE_SYS 0x1f
|
|
|
|
/*
|
|
* ADSP OS Config
|
|
*
|
|
* DECOMPRESS (Bit 0) : Set if ADSP FW needs to be decompressed
|
|
* VIRT CONFIG (Bit 1) : Set if virtualized configuration
|
|
* DMA PAGE (Bits 7:4) : Contains DMA page information
|
|
*/
|
|
|
|
#define ADSP_CONFIG_DECOMPRESS_SHIFT 0
|
|
#define ADSP_CONFIG_DECOMPRESS_EN 1
|
|
#define ADSP_CONFIG_DECOMPRESS_MASK (1 << ADSP_CONFIG_DECOMPRESS_SHIFT)
|
|
|
|
#define ADSP_CONFIG_VIRT_SHIFT 1
|
|
#define ADSP_CONFIG_VIRT_EN 1
|
|
#define ADSP_CONFIG_VIRT_MASK (1 << ADSP_CONFIG_VIRT_SHIFT)
|
|
|
|
#define ADSP_CONFIG_DMA_PAGE_SHIFT 4
|
|
#define ADSP_CONFIG_DMA_PAGE_MASK (0xF << ADSP_CONFIG_DMA_PAGE_SHIFT)
|
|
|
|
enum adsp_os_cmd {
|
|
ADSP_OS_BOOT_COMPLETE,
|
|
ADSP_OS_SUSPEND,
|
|
ADSP_OS_RESUME,
|
|
ADSP_OS_STOP,
|
|
};
|
|
|
|
#if RECORD_STATS
|
|
#define RECORD_STAT(x) \
|
|
(x = ktime_to_ns(ktime_get()) - x)
|
|
#define EQUATE_STAT(x, y) \
|
|
(x = y)
|
|
#define RECORD_TIMESTAMP(x) \
|
|
(x = nvadsp_get_timestamp_counter())
|
|
#else
|
|
#define RECORD_STAT(x)
|
|
#define EQUATE_STAT(x, y)
|
|
#define RECORD_TIMESTAMP(x)
|
|
#endif
|
|
|
|
/**
|
|
* struct global_sym_info - Global Symbol information required by app loader.
|
|
* @name: Name of the symbol
|
|
* @addr: Address of the symbol
|
|
* @info: Type and binding attributes
|
|
*/
|
|
struct global_sym_info {
|
|
char name[SYM_NAME_SZ];
|
|
uint32_t addr;
|
|
unsigned char info;
|
|
};
|
|
|
|
struct adsp_module {
|
|
const char *name;
|
|
void *handle;
|
|
void *module_ptr;
|
|
uint32_t adsp_module_ptr;
|
|
size_t size;
|
|
const struct app_mem_size mem_size;
|
|
bool dynamic;
|
|
char version[16];
|
|
};
|
|
|
|
struct app_load_stats {
|
|
s64 ns_time_load;
|
|
s64 ns_time_service_parse;
|
|
s64 ns_time_module_load;
|
|
s64 ns_time_req_firmware;
|
|
s64 ns_time_layout;
|
|
s64 ns_time_native_load;
|
|
s64 ns_time_load_mbox_send_time;
|
|
s64 ns_time_load_wait_time;
|
|
s64 ns_time_native_load_complete;
|
|
u64 ns_time_adsp_map;
|
|
u64 ns_time_adsp_app_load;
|
|
u64 ns_time_adsp_send_status;
|
|
u64 adsp_receive_timestamp;
|
|
u64 host_send_timestamp;
|
|
u64 host_receive_timestamp;
|
|
};
|
|
|
|
struct app_init_stats {
|
|
s64 ns_time_app_init;
|
|
s64 ns_time_app_alloc;
|
|
s64 ns_time_instance_memory;
|
|
s64 ns_time_native_call;
|
|
u64 ns_time_adsp_app_init;
|
|
u64 ns_time_adsp_mem_instance_map;
|
|
u64 ns_time_adsp_init_call;
|
|
u64 ns_time_adsp_send_status;
|
|
u64 adsp_receive_timestamp;
|
|
};
|
|
|
|
struct app_start_stats {
|
|
s64 ns_time_app_start;
|
|
s64 ns_time_native_call;
|
|
s64 ns_time_adsp_app_start;
|
|
u64 ns_time_app_thread_creation;
|
|
u64 ns_time_app_thread_detach;
|
|
u64 ns_time_app_thread_resume;
|
|
u64 ns_time_adsp_send_status;
|
|
u64 adsp_receive_timestamp;
|
|
};
|
|
|
|
static inline int nvadsp_os_init(struct platform_device *pdev)
|
|
{
|
|
struct nvadsp_drv_data *drv_data = platform_get_drvdata(pdev);
|
|
|
|
if (drv_data->chip_data->os_init)
|
|
return drv_data->chip_data->os_init(pdev);
|
|
|
|
return -EINVAL;
|
|
}
|
|
|
|
int nvadsp_os_probe(struct platform_device *);
|
|
int nvadsp_app_module_probe(struct platform_device *);
|
|
void *nvadsp_da_to_va_mappings(u64 da, int len);
|
|
int nvadsp_add_load_mappings(phys_addr_t pa, void *mapping, int len);
|
|
struct elf32_shdr *nvadsp_get_section(const struct firmware *, char *);
|
|
struct global_sym_info *find_global_symbol(const char *);
|
|
void update_nvadsp_app_shared_ptr(void *);
|
|
|
|
struct adsp_module *load_adsp_dynamic_module(const char *, const char *,
|
|
struct device *);
|
|
struct adsp_module *load_adsp_static_module(const char *,
|
|
struct adsp_shared_app *, struct device *);
|
|
void unload_adsp_module(struct adsp_module *);
|
|
|
|
int allocate_memory_from_adsp(void **, unsigned int);
|
|
bool is_adsp_dram_addr(u64);
|
|
int load_adsp_static_apps(void);
|
|
#endif /* __TEGRA_NVADSP_OS_H */
|