nt9856x/code/hdal/drivers/k_flow/include/kflow_common/nvtmpp.h
2023-03-28 15:07:53 +08:00

739 lines
19 KiB
C
Executable File
Raw Blame History

#ifndef _NVTMPP_H
#define _NVTMPP_H
/*
Copyright (c) 2017~ Novatek Microelectronics Corporation
@file nvtmpp.h
@version
@date
*/
#include "kwrap/type.h"
#ifdef __cplusplus
extern "C" {
#endif
//------------------------------------------------------------------------------
// Typedefs
//------------------------------------------------------------------------------
typedef signed long NVTMPP_VB_POOL; ///< Signed 32 bits data type
typedef signed long NVTMPP_VB_BLK; ///< Signed 32 bits data type
typedef unsigned long long NVTMPP_MODULE; ///< Unsigned 64 bits data type
#define MAKE_NVTMPP_MODULE(ch0, ch1, ch2, ch3, ch4, ch5, ch6, ch7) \
((UINT64)(UINT8)(ch0) | ((UINT64)(UINT8)(ch1) << 8) | \
((UINT64)(UINT8)(ch2) << 16) | ((UINT64)(UINT8)(ch3) << 24 ) |\
((UINT64)(UINT8)(ch4) << 32) | ((UINT64)(UINT8)(ch5) << 40 ) |\
((UINT64)(UINT8)(ch6) << 48) | ((UINT64)(UINT8)(ch7) << 56 ) \
)
#define NVTMPP_DDR_MAX_NUM 3
#define NVTMPP_VB_MAX_POOLS 4096
#define NVTMPP_VB_DEF_POOLS_CNT 96
#define NVTMPP_VB_MAX_FIXED_POOLS 32
#define NVTMPP_VB_MAX_COMM_POOLS 32
#define NVTMPP_VB_MAX_BLK_EACH_POOL 255
#define NVTMPP_VB_MAX_POOL_NAME 23
#define NVTMPP_VB_INVALID_POOL -1
#define NVTMPP_VB_INVALID_BLK -1
#define NVTMPP_VB_BLK_SIZE_MAX -1
#define NVTMPP_TEMP_POOL_NAME "NVTMPP_TEMP"
/**
Error Code.
Any error code occurred will display on uart or return.
*/
typedef enum _NVTMPP_ER {
NVTMPP_ER_OK = 0, ///< no error
NVTMPP_ER_PARM = -1, ///< has some error of input parameter
NVTMPP_ER_POOL_UNEXIST = -2, ///< pool not exist
NVTMPP_ER_NOBUF = -3, ///< not enough buffer to allocate
NVTMPP_ER_2MPOOLS = -4, ///< create too many pools
NVTMPP_ER_UNCONFIG = -5, ///< vb not config
NVTMPP_ER_UNINIT = -6, ///< vb not init
NVTMPP_ER_INIT_ALREADY = -7, ///< vb already inited
NVTMPP_ER_BLK_UNEXIST = -8, ///< blk not exist, the blk ID is invalid
NVTMPP_ER_BLK_UNLOCK_REF = -9, ///< the block total refere count is 0 and want to unlock
NVTMPP_ER_BLK_UNLOCK_MODULE_REF = -10, ///< the block module's refere count is 0 and want to unlock
NVTMPP_ER_BLK_ALREADY_FREE = -11, ///< the block is already freed and want to reference
NVTMPP_ER_UNKNOWW_MODULE = -12, ///< the module is not in module list
NVTMPP_ER_2MODULES = -13, ///< Add too manys modules
NVTMPP_ER_RESID_NOT_INSTALL = -14, ///< Resource ID is not install
NVTMPP_ER_SYS = -15, ///< some system error happened
NVTMPP_ER_STATE = -16, ///< state error
ENUM_DUMMY4WORD(NVTMPP_ER)
} NVTMPP_ER;
/**
DDR ID.
*/
typedef enum {
NVTMPP_DDR_1 = 0, ///< DDR1
NVTMPP_DDR_2 = 1, ///< DDR2
NVTMPP_DDR_3 = 2, ///< DDR3
NVTMPP_DDR_MAX = NVTMPP_DDR_3,
ENUM_DUMMY4WORD(NVTMPP_DDR)
} NVTMPP_DDR;
#define POOL_TYPE_COMMON 1
#define POOL_TYPE_PRIVATE (1 << 16)
#define POOL_TYPE_FIXED (1 << 17)
typedef struct {
UINT32 type; ///< pool type, bitwise
NVTMPP_DDR ddr; ///< ddr ID
UINT32 blk_size; ///< vb block size
UINT32 blk_cnt; ///< vb block count
UINT32 start_addr; ///< the starting address of this pool
} NVT_VB_CPOOL_S;
typedef struct {
UINT32 virt_addr; ///< Memory buffer virtual starting address
UINT32 phys_addr; ///< Memory buffer physical starting address
UINT32 size; ///< Memory buffer size
} NVTMPP_MEMINFO_S;
typedef struct {
NVTMPP_MEMINFO_S ddr_mem[NVTMPP_DDR_MAX_NUM]; ///< ddr memory range
BOOL is_support_fixed_pool;
UINT32 max_pools_cnt;
} NVTMPP_SYS_CONF_S;
/**
Video buffer pools configure structure.
*/
typedef struct {
UINT32 max_pool_cnt; ///< max count of pools, (0,NVTMPP_VB_MAX_POOLS]
NVT_VB_CPOOL_S common_pool[NVTMPP_VB_MAX_COMM_POOLS]; ///< common pools
} NVTMPP_VB_CONF_S;
#if defined __LINUX
extern void nvtmpp_install_id(void);
#else
extern void nvtmpp_install_id(void) _SECTION(".kercfg_text");
#endif
extern void nvtmpp_uninstall_id(void);
/**
Initialize the memory zone.
@param p_sys_conf: the configure parameters.
@return NVTMPP_ER_OK for success, < 0 when some error happened, the error code can reference NVTMPP_ER.
Example:
@code
{
NVTMPP_SYS_CONF_S nvtmpp_sys_conf = {0};
nvtmpp_sys_conf.ddr_mem[0].virt_addr = OS_GetMempoolAddr(POOL_ID_APP);
nvtmpp_sys_conf.ddr_mem[0].phys_addr = pdrv_info->presource->start;
nvtmpp_sys_conf.ddr_mem[0].size = OS_GetMempoolSize(POOL_ID_APP);
ret = nvtmpp_sys_init(&nvtmpp_sys_conf);
if (NVTMPP_ER_OK != ret) {
DBG_ERR("nvtmpp sys init err: %d\r\n", ret);
return -1;
}
}
*/
NVTMPP_ER nvtmpp_sys_init(NVTMPP_SYS_CONF_S *p_sys_conf);
/**
Un-Initialize the memory zone.
*/
void nvtmpp_sys_exit(void);
/**
Translate buffer physical address to virtual address.
@param phys_addr: the physical address.
@return return 0 for fail, else success will return virtual address.
Example:
@code
{
UINT32 va;
va = nvtmpp_sys_pa2va(pa);
if (va == 0) {
DBG_ERR("Invalid pa: 0x%x\r\n", pa);
}
}
*/
UINT32 nvtmpp_sys_pa2va(UINT32 phys_addr);
/**
Translate buffer virtual address to physical address.
@param virt_addr: the virtual address.
@return return 0 for fail, else success will return virtual address.
Example:
@code
{
UINT32 pa;
pa = nvtmpp_sys_va2pa(va);
if (pa == 0) {
DBG_ERR("Invalid va: 0x%x\r\n", va);
}
}
*/
UINT32 nvtmpp_sys_va2pa(UINT32 virt_addr);
NVTMPP_VB_POOL nvtmpp_sys_create_fixed_pool(CHAR *pool_name, UINT32 blk_size, UINT32 blk_cnt, NVTMPP_DDR ddr);
/**
Set the video buffer pools configuration.
@param p_vb_conf: the configure parameters.
@return NVTMPP_ER_OK for success, < 0 when some error happened, the error code can reference NVTMPP_ER.
Example:
@code
{
NVTMPP_ER ret;
NVTMPP_VB_CONF_S st_conf;
memset(&st_conf,0,sizeof(NVTMPP_VB_CONF_S));
st_conf.max_pool_cnt = 64;
st_conf.common_pool[0].blk_size = 1920*1080*3/2 + 1024;
st_conf.common_pool[0].blk_cnt = 16;
st_conf.common_pool[0].ddr = NVTMPP_DDR_1;
st_conf.common_pool[1].blk_size = 640*480*3/2 + 1024;
st_conf.common_pool[1].blk_cnt = 4;
st_conf.common_pool[1].ddr = NVTMPP_DDR_1;
ret = nvtmpp_vb_set_conf(&st_conf);
if (NVTMPP_ER_OK != ret) {
DBG_ERR("nvtmpp set vb config err: %d\r\n", ret);
return -1;
}
}
@endcode
*/
NVTMPP_ER nvtmpp_vb_set_conf(const NVTMPP_VB_CONF_S *p_vb_conf);
/**
Get the video buffer pools configuration.
@param p_vb_conf: the configure parameters.
@return NVTMPP_ER_OK for success, < 0 when some error happened, the error code can reference NVTMPP_ER.
Example:
@code
{
NVTMPP_ER ret;
NVTMPP_VB_CONF_S st_conf;
memset(&st_conf,0,sizeof(NVTMPP_VB_CONF_S));
ret = nvtmpp_vb_get_conf(&st_conf);
if (NVTMPP_ER_OK != ret) {
DBG_ERR("nvtmpp get vb config err: %d\r\n", ret);
return -1;
}
}
@endcode
*/
NVTMPP_ER nvtmpp_vb_get_conf(NVTMPP_VB_CONF_S *p_vb_conf);
/**
Initialize video buffer common pools.
Initialize video buffer common pools that set by nvtmpp_vb_set_conf().
@note before call nvtmpp_vb_init(), need to call nvtmpp_vb_set_conf()
to set the configurations firstly.
@param void
@return NVTMPP_ER_OK for success, < 0 when some error happened,
the error code can reference NVTMPP_ER.
Example:
@code
{
ret = nvtmpp_vb_init();
if (NVTMPP_ER_OK != ret) {
DBG_ERR("nvtmpp init vb err: %d\r\n", ret);
return FALSE;
}
}
@endcode
*/
NVTMPP_ER nvtmpp_vb_init(void);
/**
Un-initialize video buffer pools.
@param void
@return NVTMPP_ER_OK for success, < 0 when some error happened,
the error code can reference NVTMPP_ER.
Example:
@code
{
NVTMPP_ER ret;
ret = nvtmpp_vb_exit();
if (NVTMPP_ER_OK != ret) {
DBG_ERR("nvtmpp exit vb err: %d\r\n", ret);
return -1;
}
}
@endcode
*/
NVTMPP_ER nvtmpp_vb_exit(void);
/**
Re-layout video buffer common pools.
Re-layout video buffer common pools that set by nvtmpp_vb_set_conf().
@note before call nvtmpp_vb_relayout(), need to call nvtmpp_vb_set_conf()
to set the configurations firstly.
@param void
@return NVTMPP_ER_OK for success, < 0 when some error happened,
the error code can reference NVTMPP_ER.
Example:
@code
{
ret = nvtmpp_vb_relayout();
if (NVTMPP_ER_OK != ret) {
DBG_ERR("nvtmpp relayout vb err: %d\r\n", ret);
return FALSE;
}
}
@endcode
*/
NVTMPP_ER nvtmpp_vb_relayout(void);
/**
Create a private pool.
@param pool_name: the pool name that want to create.
@param blk_size: each block size of this pool.
@param blk_cnt: the block count of this pool.
@param ddr: create pool in which DDR.
@return NVTMPP_ER_OK for success, < 0 when some error happened, the error code can reference NVTMPP_ER.
Example:
@code
{
NVTMPP_VB_POOL pool;
NVTMPP_VB_BLK blk;
UINT32 blk_size = 320*240*2;
UINT32 blk_cnt = 5;
NVTMPP_ER ret;
pool = nvtmpp_vb_create_pool("module1",blk_size,blk_cnt,NVTMPP_DDR_1);
if ( NVTMPP_VB_INVALID_POOL == pool ) {
DBG_ERR("create private pool err\r\n");
return FALSE;
}
}
@endcode
*/
NVTMPP_VB_POOL nvtmpp_vb_create_pool(CHAR *pool_name, UINT32 blk_size, UINT32 blk_cnt, NVTMPP_DDR ddr);
/**
Destroy a private pool.
@param pool: the pool handle.
@return NVTMPP_ER_OK for success, < 0 when some error happened, the error code can reference NVTMPP_ER.
Example:
@code
{
NVTMPP_VB_POOL pool = g_pool;
NVTMPP_ER ret;
ret = nvtmpp_vb_destroy_pool(pool);
if (NVTMPP_ER_OK != ret) {
DBG_ERR("destory pool 0x%x\r\n",pool);
}
}
@endcode
*/
NVTMPP_ER nvtmpp_vb_destroy_pool(NVTMPP_VB_POOL pool);
/**
Get one new block from video buffer pools.
Get one new block from video buffer common pools or private pools.
When the parameter pool input value is NVTMPP_VB_INVALID_POOL means want to
get block from common pools, else want to get block from one specific private pool.
@param module: the module id.
@param pool: the pool handle.
@param blk_size: the pool handle.
@param ddr: DDR1 or DDR2.
@return NVTMPP_ER_OK for success, < 0 when some error happened, the error code can reference NVTMPP_ER.
Example:
@code
{
NVTMPP_MODULE module = g_module;
NVTMPP_VB_POOL pool = NVTMPP_VB_INVALID_POOL;
UINT32 blk_size = 1920 * 1080 * 2;
NVTMPP_DDR ddr = NVTMPP_DDR_1;
NVTMPP_VB_BLK blk;
blk = nvtmpp_vb_get_block(module, pool, blk_size, ddr);
if (NVTMPP_VB_INVALID_BLK == blk) {
DBG_ERR("ge blk fail\r\n");
return FALSE;
}
}
@endcode
*/
NVTMPP_VB_BLK nvtmpp_vb_get_block(NVTMPP_MODULE module, NVTMPP_VB_POOL pool, UINT32 blk_size, NVTMPP_DDR ddr); // default reference count <20><> 1<>A<EFBFBD>s<EFBFBD>W<EFBFBD>@<40><> reference blk <20><><EFBFBD><EFBFBD>
/**
Translate video buffer block handle to buffer virtual address.
@param blk: the block handle.
@return the block buffer address, return 0 when some error happened,
Example:
@code
{
UINT32 addr;
NVTMPP_VB_BLK blk = g_blk;
addr = nvtmpp_vb_blk2va(blk);
if (addr == 0) {
DBG_ERR("block2vaddr fail, blk = 0x%x\r\n", blk);
return FALSE;
}
}
@endcode
*/
UINT32 nvtmpp_vb_blk2va(NVTMPP_VB_BLK blk);
/**
Translate video buffer block handle to buffer physical address.
@param blk: the block handle.
@return the block buffer address, return 0 when some error happened,
Example:
@code
{
UINT32 addr;
NVTMPP_VB_BLK blk = g_blk;
addr = nvtmpp_vb_blk2pa(blk);
if (addr == 0) {
DBG_ERR("block2paddr fail, blk = 0x%x\r\n", blk);
return FALSE;
}
}
@endcode
*/
UINT32 nvtmpp_vb_blk2pa(NVTMPP_VB_BLK blk);
/**
Translate video buffer virtual address to block handle.
@param blk: the block virtual address.
@return the block handle, return NVTMPP_VB_INVALID_BLK when some error happened,
Example:
@code
{
UINT32 addr = g_addr;
NVTMPP_VB_BLK blk;
blk = nvtmpp_vb_va2blk(addr);
if (NVTMPP_VB_INVALID_BLK == blk) {
DBG_ERR("addr2block fail, addr = 0x%x\r\n", addr);
return FALSE;
}
}
@endcode
*/
NVTMPP_VB_BLK nvtmpp_vb_va2blk(UINT32 blk_vaddr);
/**
Translate video buffer address to pool handle.
@param blk: the block address.
@return the pool handle, return NVTMPP_VB_INVALID_POOL when some error happened,
Example:
@code
{
UINT32 addr = g_addr;
NVTMPP_VB_POOL pool;
pool = nvtmpp_vb_addr2pool(addr);
if (NVTMPP_VB_INVALID_POOL == pool) {
DBG_ERR("addr2pool fail, addr = 0x%x\r\n", addr);
return FALSE;
}
}
@endcode
*/
NVTMPP_VB_POOL nvtmpp_vb_addr2pool(UINT32 blk_addr);
/**
Lock the video buffer block.
This API will cause video buffer block reference count+1.
@param module: the module that want to lock this block.
@param blk: the block handle.
@return NVTMPP_ER_OK for success, < 0 when some error happened, the error code can reference NVTMPP_ER.
Example:
@code
{
NVTMPP_ER ret;
NVTMPP_MODULE module = g_module;
ret = nvtmpp_vb_lock_block(module, g_blk);
if (NVTMPP_ER_OK != ret) {
DBG_ERR("lock blk fail %d\r\n", ret);
return FALSE;
}
}
@endcode
*/
NVTMPP_ER nvtmpp_vb_lock_block(NVTMPP_MODULE module, NVTMPP_VB_BLK blk);
/**
Unlock the video buffer block.
This API will cause video buffer block reference count-1.
If reference count reaches zero, then the block will be released and return back to pools.
@param module: the module that want to unlock this block.
@param blk: the block handle.
@return NVTMPP_ER_OK for success, < 0 when some error happened, the error code can reference NVTMPP_ER.
Example:
@code
{
NVTMPP_ER ret;
NVTMPP_MODULE module = g_module;
ret = nvtmpp_vb_unlock_block(module, g_blk);
if (NVTMPP_ER_OK != ret) {
DBG_ERR("unlock blk fail %d\r\n", ret);
return FALSE;
}
}
@endcode
*/
NVTMPP_ER nvtmpp_vb_unlock_block(NVTMPP_MODULE module, NVTMPP_VB_BLK blk);
/**
Add a new module to module list.
@param module: the module that want to add.
@return NVTMPP_ER_OK for success, < 0 when some error happened, the error code can reference NVTMPP_ER.
Example:
@code
{
NVTMPP_ER ret;
NVTMPP_MODULE module = MAKE_NVTMPP_MODULE('V', 'd', 'o', 'E', 'n', 'c', 0, 0);
ret = nvtmpp_vb_add_module(module);
if (NVTMPP_ER_OK != ret) {
DBG_ERR("add module err %d\r\n", ret);
}
}
@endcode
*/
NVTMPP_ER nvtmpp_vb_add_module(NVTMPP_MODULE module);
/**
Translate module to a string.
@param module: the module handle.
@param buf: the buffer to store the module string.
@param buflen: the buffer length.
@return NVTMPP_ER_OK for success, < 0 when some error happened, the error code can reference NVTMPP_ER.
Example:
@code
{
CHAR module_str[sizeof(NVTMPP_MODULE) + 1];
NVTMPP_ER ret;
ret = nvtmpp_vb_module_to_string(g_module, module_str, sizeof(module_str));
if (NVTMPP_ER_OK != ret) {
DBG_ERR("get module string err\r\n");
return FALSE;
}
DBG_DUMP("module_str = %s\r\n",module_str);
}
@endcode
*/
NVTMPP_ER nvtmpp_vb_module_to_string(NVTMPP_MODULE module, char *buf, UINT32 buflen);
/**
Get block last reference module.
This API is for debug using, it will return the block last reference module.
It can help debug when nvtmpp_vb_unlock_block() return some error code.
@param blk: the block handle.
@return the module handle, return 0 when some error happened.
Example:
@code
{
NVTMPP_MODULE module;
NVTMPP_VB_BLK blk = g_blk;
CHAR module_str[sizeof(NVTMPP_MODULE) + 1];
sscanf_s(strCmd, "%x", &blk);
module = nvtmpp_vb_get_block_lastref_module(blk);
if (0 == module) {
DBG_ERR("get lastref_module err, blk=0x%x\r\n", blk);
}
nvtmpp_vb_module_to_string(module, module_str, sizeof(module_str));
DBG_DUMP("module_str = %s\r\n",module_str);
return TRUE;
}
@endcode
*/
NVTMPP_MODULE nvtmpp_vb_get_block_lastref_module(NVTMPP_VB_BLK blk);
/**
Get remain maximum free block size.
@param ddr: DDR1 or DDR2.
@return the remain maximum free block size.
Example:
@code
{
static NVTMPP_VB_POOL g_vb_pool;
NVTMPP_VB_BLK blk;
UINT32 blk_size = nvtmpp_vb_get_max_free_size(NVTMPP_DDR_1);
g_vb_pool = nvtmpp_vb_create_pool("Cap", blk_size, 1, NVTMPP_DDR_1);
if (NVTMPP_VB_INVALID_POOL == g_vb_pool) {
DBG_ERR("create private pool err\r\n");
return;
}
blk = nvtmpp_vb_get_block(0, g_vb_pool, blk_size, NVTMPP_DDR_1);
if (NVTMPP_VB_INVALID_BLK == blk) {
DBG_ERR("get vb block err\r\n");
return;
}
}
@endcode
*/
UINT32 nvtmpp_vb_get_max_free_size(NVTMPP_DDR ddr);
/**
Check if video buffer memory corruption.
*/
INT32 nvtmpp_vb_check_mem_corrupt(void);
/**
Dump pools and blocks status to uart output.
@param dump: the dump function name.
@return void
Example:
@code
{
nvtmpp_dump_status(debug_msg);
}
@endcode
*/
void nvtmpp_dump_status(int (*dump)(const char *fmt, ...));
/**
Dump all the memory blocks by sequence.
@param dump: the dump function name.
@return void
Example:
@code
{
nvtmpp_dump_mem_range(debug_msg);
}
@endcode
*/
void nvtmpp_dump_mem_range(int (*dump)(const char *fmt, ...));
/**
get bridge memory range on fdt
@param p_range: the returned memory range
@return void
Example:
@code
{
nvtmpp_vb_get_bridge_mem(p_range);
}
@endcode
*/
BOOL nvtmpp_vb_get_bridge_mem(MEM_RANGE *p_range);
#ifdef __cplusplus
}
#endif
/* ----------------------------------------------------------------- */
#endif