nt9856x/code/driver/source/msdcnvt/msdcnvt/msdcnvt_int.h
2023-03-28 15:07:53 +08:00

270 lines
12 KiB
C

#ifndef _MSDCNVT_NVT_H
#define _MSDCNVT_NVT_H
#if defined (__UITRON)
#include "SysKer.h"
#include "uart.h"
#include "DxStorage.h"
#include "DxCommon.h"
#include "StrgDef.h"
#include <string.h>
#include "dma_protected.h"
#include "NvtIpcAPI.h"
#include "Utility.h"
#include "SysKer.h"
#include <string.h>
#include "NvtVerInfo.h"
#include "msdcnvt_api.h"
#include "msdcnvt_callback.h"
#if defined(_NETWORK_ON_CPU1_)
#include <cyg/msdcnvt/msdcnvt.h>
#endif
#else
#include <kwrap/semaphore.h>
#include <kwrap/task.h>
#include <kwrap/flag.h>
#include <linux/slab.h>
#include <linux/string.h>
#include <linux/module.h>
#include <linux/dma-direction.h>
#include <asm/cacheflush.h>
#include <asm/io.h> /* for ioremap and iounmap */
#include <msdcnvt/msdcnvt_api.h>
#include <msdcnvt/msdcnvt_callback.h>
#endif
#include "msdcnvt_ipc.h"
//Configure
#define THIS_DBGLVL 2 // 0=FATAL, 1=ERR, 2=WRN, 3=UNIT, 4=FUNC, 5=IND, 6=MSG, 7=VALUE, 8=USER
#define CFG_MSDCNVT_INIT_KEY MAKEFOURCC('M', 'S', 'D', 'C') ///< a key value 'M','S','D','C' for indicating system initial.
#define CFG_DBGSYS_MSG_PAYLOAD_NUM (1<<7) ///< Must be 2^n
#if 1 //defined(_BSP_NA51000_) || defined(_BSP_NA51055_)
#define CFG_REGISTER_BEGIN_ADDR 0xF0000000 ///< Mem Read/Write over this indicate to Register Access
#define CFG_VIRTUAL_MEM_MAP_MASK 0xF0000000 ///< for MSDCNVT_HANDLER_TYPE_VIRTUAL_MEM_MAP
#define CFG_VIRTUAL_MEM_MAP_ADDR 0xE0000000 ///< for MSDCNVT_HANDLER_TYPE_VIRTUAL_MEM_MAP
#elif defined(_BSP_NA51023_)
#define CFG_REGISTER_BEGIN_ADDR 0xC0000000 ///< Mem Read/Write over this indicate to Register Access
#define CFG_VIRTUAL_MEM_MAP_MASK 0xF0000000 ///< for MSDCNVT_HANDLER_TYPE_VIRTUAL_MEM_MAP
#define CFG_VIRTUAL_MEM_MAP_ADDR 0xF0000000 ///< for MSDCNVT_HANDLER_TYPE_VIRTUAL_MEM_MAP
#else
#error "unknown bsp"
#endif
#if !defined (__UITRON)
#define dma_flushreadcache(virt_addr, size)
#define dma_flushwritecache(virt_addr, size)
#endif
#if defined(__UITRON)
#if defined(_NETWORK_ON_CPU1_)
#define MSDCNVT_PHY_ADDR(addr) (addr)
#define MSDCNVT_NONCACHE_ADDR(addr) (addr)
#define MSDCNVT_CACHE_ADDR(addr) (addr)
#else
/* #define MSDCNVT_PHY_ADDR(addr) Nvipc_GetPhyAddr(addr) */
/* #define MSDCNVT_NONCACHE_ADDR(addr) Nvipc_GetNonCacheAddr(addr) */
/* #define MSDCNVT_CACHE_ADDR(addr) Nvipc_GetCacheAddr(addr) */
#endif
#else // pure linux
#define MSDCNVT_PHY_ADDR(addr) msdcnvt_get_phy(addr)
#define MSDCNVT_NONCACHE_ADDR(addr) msdcnvt_get_noncache(addr)
#define MSDCNVT_CACHE_ADDR(addr) msdcnvt_get_cache(addr)
#endif
//Configure Working Memory Pool
#define CFG_NVTMSDC_SIZE_CBW_DATA (sizeof(UINT32)*16) ///< //Msdc System will use front memory to be CBW data
#define CFG_NVTMSDC_SIZE_IPC_DATA (sizeof(MSDCNVT_IPC_CFG))
#define CFG_MIN_HOST_MEM_SIZE 0x10000 ///< Front-End:0x10000
#define CFG_MIN_BACKGROUND_MEM_SIZE 0x10000 ///< Back-End:0x10000
#define CFG_MIN_DBGSYS_MSG_MEM 0x04000 ///< Msg queue
#define CFG_MIN_WORKING_BUF_SIZE (CFG_MIN_HOST_MEM_SIZE+CFG_MIN_BACKGROUND_MEM_SIZE+CFG_MIN_DBGSYS_MSG_MEM+CFG_NVTMSDC_SIZE_CBW_DATA+CFG_NVTMSDC_SIZE_IPC_DATA)
#define __MODULE__ msdcnvt
#define __DBGLVL__ THIS_DBGLVL
#define __DBGFLT__ "*" //*=All, [mark]=CustomClass
#if defined (__UITRON)
#include "DebugModule.h"
#else
#include "kwrap/debug.h"
#endif
//------------------------------------------------------------------------------
// Novatek Tag
//------------------------------------------------------------------------------
#define CDB_01_NVT_TAG 0x07 ///< Novatek Tag in CDB_01
//------------------------------------------------------------------------------
// Host SCSI Extern Command
//------------------------------------------------------------------------------
#define SBC_CMD_MSDCNVT_READ 0xC3 ///< Read Memory / Registers
#define SBC_CMD_MSDCNVT_WRITE 0xC4 ///< Write Memory / Registers
#define SBC_CMD_MSDCNVT_FUNCTION 0xC5 ///< Call Function in Firmware Side
//------------------------------------------------------------------------------
// SBC_CMD_MSDCNVT_FUNCTION Message
//------------------------------------------------------------------------------
#define CDB_10_FUNCTION_UNKNOWN 0x00 ///< Invalid Type
#define CDB_10_FUNCTION_BI_CALL 0x01 ///< Bi-Direction Function Type
#define CDB_10_FUNCTION_SI_CALL 0x02 ///< Single-Direction Function Type
#define CDB_10_FUNCTION_DBGSYS 0x03 ///< Debug System by Msdc
#define CDB_10_FUNCTION_MISC 0xFF ///< Misc (Must be Last)
//Bit Mask with T_MSDCNVT_CSW.tag
#define SBC_CMD_DIR_MASK 0x80
#define SBC_CMD_DIR_IN 0x80
#define SBC_CMD_DIR_OUT 0x00
/**
Flag Pattern
*/
//@{
//Task Operation
#define FLGDBGSYS_CMD_ARRIVAL FLGPTN_BIT(0)
#define FLGDBGSYS_CMD_ABORT FLGPTN_BIT(1)
#define FLGDBGSYS_CMD_FINISH FLGPTN_BIT(2)
//Task Finish State
#define FLGMSDCNVT_IPC_STOPPED FLGPTN_BIT(29)
#define FLGMSDCNVT_UNKNOWN FLGPTN_BIT(30)
//@}
typedef struct _MSDCNVT_HOST_INFO {
//SCSI Command Info
MSDCNVT_CBW *p_cbw; ///< SCSI Command Block Wrapper
MSDCNVT_CSW *p_csw; ///< SCSI Command Status Wrapper
//Calculated Private Data by MSDCVendor_Verify_CB parsed
UINT32 cmd_id; ///< SBC Command ID, SBC_CMD_MSDCNVT_XXXX
UINT32 lb_address; ///< Logical Block Address of SCSI Command
UINT32 lb_length; ///< Transfer Length of SCSI Command
//Universal Common Data Swap Pool (Host <-> Device)
UINT8 *p_pool; ///< Host<->Device Swap Common Memory Pool
UINT32 pool_size; ///< Host<->Device Common Memory Pool Size (Unit: Bytes)
} MSDCNVT_HOST_INFO;
typedef struct _MSDCNVT_FUNCTION_CMD_HANDLE {
UINT32 call_id; ///< Calling Type (CDB_11 value)
void (*fp_call)(void *p_info); ///< Callback for Handler
} MSDCNVT_FUNCTION_CMD_HANDLE;
//------------------------------------------------------------------------------
// Bi-Direction Call for CDB_10_FUNCTION_BI_CALL
//------------------------------------------------------------------------------
//Bi-Direction Function Control
typedef struct _MSDCNVT_BI_CALL_CTRL {
void (*fp_call)(void *p_data); ///< Current Function Call (BiDirection)
MSDCNVT_BI_CALL_UNIT *p_head; ///< Callbacks Description - Link List Head
MSDCNVT_BI_CALL_UNIT *p_last; ///< Callbacks Description - Link List Last
} MSDCNVT_BI_CALL_CTRL;
//------------------------------------------------------------------------------
// Single-Direction Call for CDB_10_FUNCTION_SI_CALL
//------------------------------------------------------------------------------
//Single-Direction Function Control
typedef struct _MSDCNVT_SI_CALL_CTRL {
FP *fp_tbl_get; ///< PC Get Functions Mapping Talbe(Single Direction)
UINT8 num_gets; ///< Number of PC Get Functions Mapping Talbe(Single Direction)
FP *fp_tbl_set; ///< PC Set Functions Mapping Talbe(Single Direction)
UINT8 num_sets; ///< Number of PC Set Functions Mapping Talbe(Single Direction)
UINT32 call_id; ///< Current Call ID
} MSDCNVT_SI_CALL_CTRL;
//------------------------------------------------------------------------------
// Debug System for CDB_10_FUNCTION_DBGSYS
//------------------------------------------------------------------------------
typedef struct _MSDCNVT_DBGSYS_UNIT {
UINT32 skip_cnt; ///< Count this payload Msg has been skiped how many times
UINT32 byte_cnt; ///< Used Msg Length
UINT8 *p_msg; ///< Msg Buffer
} MSDCNVT_DBGSYS_UNIT;
//Background Ctrl
typedef struct _MSDCNVT_BACKGROUND_CTRL {
THREAD_HANDLE task_id; ///< Working Task ID for Command Send
UINT8 *p_pool; ///< Device<->Background Common Memory Pool
UINT32 pool_size; ///< Device<->Background Common Memory Pool Size (Unit: Bytes)
UINT32 trans_size; ///< Effect Data Size of this Call
void (*fp_call)(void); ///< Device<->Background Thread Action Callback Function
BOOL b_service_lock; ///< Indicate Service is Lock / Unlock by Host
BOOL b_cmd_running; ///< Indicate Background Thread is Running
} MSDCNVT_BACKGROUND_CTRL;
//DbgSys Ctrl
typedef struct MSDCNVT_DBGSYS_CTRL {
BOOL b_init; ///< Indicate DbgSys Init
SEM_HANDLE sem_id; ///< Semaphore ID for lock / unlock Msg Receiver
UINT32 msg_in_idx; ///< Msg Index for rtos putting
UINT32 msg_out_idx; ///< Msg Index for pc getting
UINT32 msg_cnt_mask; ///< Mask for Msg Count Add 1
UINT32 payload_num; ///< Total Payload
UINT32 payload_size; ///< Each tMSDCNVT_MSG_UNIT.p_msg Size
BOOL b_no_uart_output; ///< Disable Output to UART
unsigned int (*fp_uart_put_string)(CHAR *); ///< default real uart output (uart_putString or uart2_putString)
MSDCNVT_DBGSYS_UNIT queue[CFG_DBGSYS_MSG_PAYLOAD_NUM]; ///< Message queue
} MSDCNVT_DBGSYS_CTRL;
//IPC Ctrl
typedef struct _MSDCNVT_IPC_CTRL {
BOOL b_net_running;
int ipc_msgid;
MSDCNVT_IPC_CFG *p_cfg; ///< IPC Buffer
char cmd_line[40]; ///< linux shell command such as 'msdcnvt 0x%08X 0x%08X'
} MSDCNVT_IPC_CTRL;
//User Handler Ctrl
typedef struct _MSDCNVT_HANLDER_CTRL {
MSDCNVT_CB_VIRTUAL_MEM_READ fp_virt_mem_map;
} MSDCNVT_HANLDER_CTRL;
//------------------------------------------------------------------------------
// Global Control Manager
//------------------------------------------------------------------------------
typedef struct _MSDCNVT_CTRL {
INT32 init_key; ///< indicate module is initail
ID flag_id; ///< flag_id (used by DbgSys currently)
MSDC_OBJ *p_msdc; ///< via Msdc Obj
MSDCNVT_HOST_INFO host_info; ///< Host Information
MSDCNVT_SI_CALL_CTRL sicall; ///< Single-Direction Call Ctrl
MSDCNVT_BI_CALL_CTRL bicall; ///< BiDirection Call Ctrl
MSDCNVT_DBGSYS_CTRL dbgsys; ///< Debug System Ctrl
MSDCNVT_BACKGROUND_CTRL bk; ///< Background Thread Ctrl
MSDCNVT_CB_EVENT fp_event; ///< Event Report
MSDCNVT_IPC_CTRL ipc; ///< IPC Ctrl
MSDCNVT_HANLDER_CTRL handler; ///< User Handler Ctrl
} MSDCNVT_CTRL;
//------------------------------------------------------------------------------
// Internal APIs
//------------------------------------------------------------------------------
MSDCNVT_CTRL *msdcnvt_get_ctrl(void); ///< Get Global Control
MSDCNVT_ICALL_TBL *msdcnvt_get_ipc_call_tbl(UINT32 *p_cnt); ///< Get IPC Call Table
void msdcnvt_mem_push_host_to_bk(void); ///< Copy MSDCNVT_HOST_INFO::p_pool -> MSDCNVT_BACKGROUND_CTRL::p_pool
void msdcnvt_mem_pop_bk_to_host(void); ///< Copy MSDCNVT_BACKGROUND_CTRL::p_pool -> MSDCNVT_HOST_INFO::p_pool
BOOL msdcnvt_bk_run_cmd(void (*p_call)(void)); ///< Run Callback in Background Thread
BOOL msdcnvt_bk_is_finish(void); ///< Query Background Thread is Finish
BOOL msdcnvt_bk_host_lock(void); ///< Lock Bakcgorund Service by Host
BOOL msdcnvt_bk_host_unlock(void); ///< UnLock Bakcgorund Service by Host
BOOL msdcnvt_bk_host_is_lock(void); ///< Query Bakcgorund Service is Lock
//------------------------------------------------------------------------------
// This task is used for do background command, currently.
//------------------------------------------------------------------------------
extern THREAD_DECLARE(msdcnvt_tsk, arglist);
//Vendor Command (CDB[10]) Handler
void msdcnvt_function_bicall(void); ///< Bi Direction Call
void msdcnvt_function_sicall(void); ///< Single Direction Call
void msdcnvt_function_dbgsys(void); ///< Debug System Vendor Command
void msdcnvt_function_misc(void); ///< Debug System Vendor Command
//IPC
void msdcnvt_icmd(MSDCNVT_ICMD *p_cmd); ///< IPC Command
//void xmsdcnvt_tsk_ipc(void);
THREAD_DECLARE(xmsdcnvt_tsk_ipc, arglist);
//Pure Linux
extern UINT32 msdcnvt_get_phy(UINT32 addr);
extern UINT32 msdcnvt_get_noncache(UINT32 addr);
extern UINT32 msdcnvt_get_cache(UINT32 addr);
#endif