hifi-mailbox: mailbox: Pull code from hisilicon open source
Here is the link to hisilicon kernel open source tree and look for "MHA" Description "Mate 9, MHA, Android 7.0, EMUI 5.0" http://consumer.huawei.com/en/opensource/detail/index.htm?siteCode=worldwide&productCode=Smartphones&fileType=openSourceSoftware&pageSize=10&curPage=1 Added hifi-mailbox:mailbox Signed-off-by: Niranjan Yadla <nyadla@cadence.com>
This commit is contained in:
committed by
Dmitry Shmidt
parent
6d1ee5eb03
commit
79318ad740
@@ -1 +1,3 @@
|
||||
|
||||
source "drivers/hisi/hifi_mailbox/mailbox/Kconfig"
|
||||
source "drivers/hisi/hifi_mailbox/ipcm/Kconfig"
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
|
||||
obj-$(CONFIG_HIFI_MAILBOX) += mailbox/
|
||||
obj-$(CONFIG_HIFI_IPC) += ipcm/
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
menu "Hifi mailbox driver"
|
||||
|
||||
config HIFI_MAILBOX
|
||||
bool "hifi mailbox driver base on ipc"
|
||||
default n
|
||||
help
|
||||
transplant balong mailbox driver.
|
||||
endmenu
|
||||
@@ -0,0 +1,17 @@
|
||||
EXTRA_CFLAGS += -I$(srctree)/drivers/hisi/hifi_mailbox/ipcm
|
||||
|
||||
EXTRA_CFLAGS += -DBSP_CORE_APP
|
||||
ifdef CONFIG_HIFI_RESET
|
||||
EXTRA_CFLAGS += -D_HIFI_WD_DEBUG
|
||||
endif
|
||||
|
||||
EXTRA_CFLAGS += -Idrivers/hisi/hifi_dsp
|
||||
|
||||
obj-$(CONFIG_HIFI_MAILBOX) += drv_mailbox_table.o
|
||||
obj-$(CONFIG_HIFI_MAILBOX) += drv_mailbox_gut.o
|
||||
obj-$(CONFIG_HIFI_MAILBOX) += drv_mailbox_ifc.o
|
||||
obj-$(CONFIG_HIFI_MAILBOX) += drv_mailbox_msg.o
|
||||
obj-$(CONFIG_HIFI_MAILBOX) += drv_mailbox_debug.o
|
||||
obj-$(CONFIG_HIFI_MAILBOX) += drv_mailbox_port_linux.o
|
||||
obj-$(CONFIG_HIFI_MAILBOX) += drv_mailbox_ifc.o
|
||||
obj-$(CONFIG_HIFI_MAILBOX) += drv_mailbox.o
|
||||
@@ -0,0 +1,28 @@
|
||||
#include "drv_mailbox_cfg.h"
|
||||
|
||||
unsigned int mailbox_send_msg(unsigned int mailcode,
|
||||
void *data, unsigned int length);
|
||||
|
||||
unsigned int mailbox_reg_msg_cb(unsigned int mailcode,
|
||||
mb_msg_cb func, void *data);
|
||||
|
||||
unsigned int mailbox_read_msg_data(void *mail_handle,
|
||||
char *buff, unsigned int *size);
|
||||
|
||||
unsigned int DRV_MAILBOX_SENDMAIL(unsigned int MailCode,
|
||||
void *pData, unsigned int Length)
|
||||
{
|
||||
return mailbox_send_msg(MailCode, pData, Length);
|
||||
}
|
||||
|
||||
unsigned int DRV_MAILBOX_REGISTERRECVFUNC(unsigned int MailCode,
|
||||
mb_msg_cb pFun, void *UserHandle)
|
||||
{
|
||||
return mailbox_reg_msg_cb(MailCode, pFun, UserHandle);
|
||||
}
|
||||
|
||||
unsigned int DRV_MAILBOX_READMAILDATA(void *MailHandle,
|
||||
unsigned char *pData, unsigned int *pSize)
|
||||
{
|
||||
return mailbox_read_msg_data(MailHandle, (char *)pData, pSize);
|
||||
}
|
||||
@@ -0,0 +1,646 @@
|
||||
|
||||
#ifndef __DRV_MAILBOX_CFG_H__
|
||||
#define __DRV_MAILBOX_CFG_H__
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "../../drivers/hisi/hifi_dsp/hifi_lpp.h"
|
||||
#include "mdrv_ipc_enum.h"
|
||||
|
||||
#define MAILBOX_CHANNEL_BEGIN(src, dst) \
|
||||
enum MAILBOX_CHANNEL_##src##2##dst##_ENUM \
|
||||
{ \
|
||||
MAILBOX_CHANNEL_##src##2##dst##_RSERVED = -1,
|
||||
|
||||
#define MAILBOX_CHANNEL_ITEM(src, dst, channel) \
|
||||
MAILBOX_CHANNEL_##src##2##dst##_##channel
|
||||
|
||||
#define MAILBOX_CHANNEL_END(src, dst) \
|
||||
MAILBOX_CHANNEL_##src##2##dst##_BUTT \
|
||||
};
|
||||
|
||||
/* CCPU -> HIFI */
|
||||
MAILBOX_CHANNEL_BEGIN(CCPU, HIFI)
|
||||
MAILBOX_CHANNEL_ITEM(CCPU, HIFI, MSG), MAILBOX_CHANNEL_END(CCPU, HIFI)
|
||||
|
||||
/* CCPU -> MCU */
|
||||
MAILBOX_CHANNEL_BEGIN(CCPU, MCU)
|
||||
MAILBOX_CHANNEL_ITEM(CCPU, MCU, MSG),
|
||||
MAILBOX_CHANNEL_ITEM(CCPU, MCU, IFC), MAILBOX_CHANNEL_END(CCPU, MCU)
|
||||
|
||||
/* CCPU -> ACPU */
|
||||
MAILBOX_CHANNEL_BEGIN(CCPU, ACPU)
|
||||
MAILBOX_CHANNEL_ITEM(CCPU, ACPU, MSG),
|
||||
MAILBOX_CHANNEL_ITEM(CCPU, ACPU, IFC),
|
||||
MAILBOX_CHANNEL_END(CCPU, ACPU)
|
||||
|
||||
/* ACPU -> CCPU */
|
||||
MAILBOX_CHANNEL_BEGIN(ACPU, CCPU)
|
||||
MAILBOX_CHANNEL_ITEM(ACPU, CCPU, MSG),
|
||||
MAILBOX_CHANNEL_ITEM(ACPU, CCPU, IFC),
|
||||
MAILBOX_CHANNEL_END(ACPU, CCPU)
|
||||
|
||||
/* ACPU -> MCU */
|
||||
MAILBOX_CHANNEL_BEGIN(ACPU, MCU)
|
||||
MAILBOX_CHANNEL_ITEM(ACPU, MCU, MSG),
|
||||
MAILBOX_CHANNEL_ITEM(ACPU, MCU, IFC), MAILBOX_CHANNEL_END(ACPU, MCU)
|
||||
|
||||
/* ACPU -> HIFI */
|
||||
MAILBOX_CHANNEL_BEGIN(ACPU, HIFI)
|
||||
MAILBOX_CHANNEL_ITEM(ACPU, HIFI, MSG), MAILBOX_CHANNEL_END(ACPU, HIFI)
|
||||
|
||||
/* HIFI -> ACPU */
|
||||
MAILBOX_CHANNEL_BEGIN(HIFI, ACPU)
|
||||
MAILBOX_CHANNEL_ITEM(HIFI, ACPU, MSG), MAILBOX_CHANNEL_END(HIFI, ACPU)
|
||||
|
||||
/* HIFI -> CCPU */
|
||||
MAILBOX_CHANNEL_BEGIN(HIFI, CCPU)
|
||||
MAILBOX_CHANNEL_ITEM(HIFI, CCPU, MSG), MAILBOX_CHANNEL_END(HIFI, CCPU)
|
||||
|
||||
/* HIFI -> BBE16 */
|
||||
MAILBOX_CHANNEL_BEGIN(HIFI, BBE16)
|
||||
MAILBOX_CHANNEL_ITEM(HIFI, BBE16, MSG), MAILBOX_CHANNEL_END(HIFI, BBE16)
|
||||
|
||||
/* MCU -> ACPU */
|
||||
MAILBOX_CHANNEL_BEGIN(MCU, ACPU)
|
||||
MAILBOX_CHANNEL_ITEM(MCU, ACPU, MSG),
|
||||
MAILBOX_CHANNEL_ITEM(MCU, ACPU, IFC), MAILBOX_CHANNEL_END(MCU, ACPU)
|
||||
|
||||
/* MCU -> CCPU */
|
||||
MAILBOX_CHANNEL_BEGIN(MCU, CCPU)
|
||||
MAILBOX_CHANNEL_ITEM(MCU, CCPU, MSG),
|
||||
MAILBOX_CHANNEL_ITEM(MCU, CCPU, IFC), MAILBOX_CHANNEL_END(MCU, CCPU)
|
||||
|
||||
/* BBE16 -> HIFI */
|
||||
MAILBOX_CHANNEL_BEGIN(BBE16, HIFI)
|
||||
MAILBOX_CHANNEL_ITEM(BBE16, HIFI, MSG), MAILBOX_CHANNEL_END(BBE16, HIFI)
|
||||
|
||||
enum MAILBOX_GAP_FOR_SI_PARSE { MAILBOX_GAP_FOR_SI_BUTT };
|
||||
|
||||
#define MAILBOX_ID_SRC_CPU_OFFSET (24)
|
||||
#define MAILBOX_ID_DST_CPU_OFFSET (16)
|
||||
#define MAILBOX_ID_CHANNEL_OFFSET (8)
|
||||
|
||||
#define MAILBOX_MAILCODE_CHANNEL(src, dst, channel) \
|
||||
(((unsigned int)(src) << MAILBOX_ID_SRC_CPU_OFFSET) \
|
||||
| ((unsigned int)(dst) << MAILBOX_ID_DST_CPU_OFFSET) \
|
||||
| ((unsigned int)(channel) << MAILBOX_ID_CHANNEL_OFFSET))
|
||||
|
||||
#define MAILBOX_CPUID(cpu) MAILBOX_CPUID_##cpu
|
||||
|
||||
#define MAILBOX_MAILCODE_RESERVED(src, dst, channel) \
|
||||
MAILBOX_MAILCODE_CHANNEL(MAILBOX_CPUID(src), \
|
||||
MAILBOX_CPUID(dst), \
|
||||
MAILBOX_CHANNEL_ITEM(src, dst, channel))
|
||||
|
||||
#define MAILBOX_MAILCODE_ITEM_RESERVED(src, dst, channel) \
|
||||
MAILBOX_MAILCODE_##src##2##dst##_##channel##_RESERVED
|
||||
|
||||
#define MAILBOX_MAILCODE_ITEM_END(src, dst, channel) \
|
||||
MAILBOX_MAILCODE_##src##2##dst##_##channel##_BUTT
|
||||
|
||||
#define MAILBOX_MAILCODE_ITEM_BEGIN(src, dst, channel) \
|
||||
MAILBOX_MAILCODE_ITEM_RESERVED(src, dst, channel) = MAILBOX_MAILCODE_RESERVED(src, dst, channel)
|
||||
|
||||
enum MAILBOX_CPUID_ENUM {
|
||||
MAILBOX_CPUID_RESERVED = -1,
|
||||
MAILBOX_CPUID_ACPU = IPC_CORE_ACORE,
|
||||
MAILBOX_CPUID_CCPU = IPC_CORE_CCORE,
|
||||
MAILBOX_CPUID_MCU = IPC_CORE_ACORE,
|
||||
MAILBOX_CPUID_BBE16 = IPC_CORE_LDSP,
|
||||
MAILBOX_CPUID_HIFI = IPC_CORE_HiFi,
|
||||
MAILBOX_CPUID_BUTT
|
||||
};
|
||||
|
||||
enum MAILBOX_MAILCODE_ENUM {
|
||||
MAILBOX_MAILCODE_ITEM_BEGIN(CCPU, MCU, MSG),
|
||||
MAILBOX_MAILCODE_CCPU_TO_MCU_VOS_MSG_NORMAL,
|
||||
MAILBOX_MAILCODE_CCPU_TO_MCU_VOS_MSG_URGENT,
|
||||
BSP_MAILBOX_CHANNEL_CCPU_TO_MCU_MCA_CH,
|
||||
|
||||
MAILBOX_MAILCODE_ITEM_END(CCPU, MCU, MSG),
|
||||
|
||||
MAILBOX_MAILCODE_ITEM_BEGIN(CCPU, MCU, IFC),
|
||||
MAILBOX_IFC_CCPU_TO_MCU_TEST_CMP,
|
||||
MAILBOX_IFC_CCPU_TO_MCU_TEST,
|
||||
MAILBOX_IFC_CCPU_TO_MCU_MCA,
|
||||
MAILBOX_MAILCODE_ITEM_END(CCPU, MCU, IFC),
|
||||
|
||||
MAILBOX_MAILCODE_ITEM_BEGIN(CCPU, HIFI, MSG),
|
||||
MAILBOX_MAILCODE_CCPU_TO_HIFI_VOS_MSG_NORMAL,
|
||||
MAILBOX_MAILCODE_CCPU_TO_HIFI_VOS_MSG_URGENT,
|
||||
MAILBOX_MAILCODE_ITEM_END(CCPU, HIFI, MSG),
|
||||
|
||||
MAILBOX_MAILCODE_ITEM_BEGIN(CCPU, ACPU, MSG),
|
||||
MAILBOX_MAILCODE_ITEM_END(CCPU, ACPU, MSG),
|
||||
|
||||
MAILBOX_MAILCODE_ITEM_BEGIN(CCPU, ACPU, IFC),
|
||||
MAILBOX_IFC_CCPU_TO_ACPU_TEST_CMP,
|
||||
MAILBOX_IFC_CCPU_TO_ACPU_TEST,
|
||||
MAILBOX_IFC_CCPU_TO_ACPU_PRINT,
|
||||
MAILBOX_IFC_CCPU_TO_ACPU_FOPEN,
|
||||
MAILBOX_IFC_CCPU_TO_ACPU_FCLOSE,
|
||||
MAILBOX_IFC_CCPU_TO_ACPU_FREAD,
|
||||
MAILBOX_IFC_CCPU_TO_ACPU_FWRITE,
|
||||
MAILBOX_IFC_CCPU_TO_ACPU_FSEEK,
|
||||
MAILBOX_IFC_CCPU_TO_ACPU_REMOVE,
|
||||
MAILBOX_IFC_CCPU_TO_ACPU_FTELL,
|
||||
MAILBOX_IFC_CCPU_TO_ACPU_RENAME,
|
||||
MAILBOX_IFC_CCPU_TO_ACPU_ACCESS,
|
||||
MAILBOX_IFC_CCPU_TO_ACPU_MKDIR,
|
||||
MAILBOX_IFC_CCPU_TO_ACPU_RMDIR,
|
||||
MAILBOX_IFC_ACPU_TO_CCPU_PMIC_IRQEVENT_REPO,
|
||||
MAILBOX_MAILCODE_ITEM_END(CCPU, ACPU, IFC),
|
||||
|
||||
MAILBOX_MAILCODE_ITEM_BEGIN(ACPU, MCU, MSG),
|
||||
MAILBOX_MAILCODE_ACPU_TO_MCU_VOS_MSG_NORMAL,
|
||||
MAILBOX_MAILCODE_ACPU_TO_MCU_VOS_MSG_URGENT,
|
||||
BSP_MAILBOX_CHANNEL_ACPU_TO_MCU_IFC_CH,
|
||||
BSP_MAILBOX_CHANNEL_ACPU_TO_MCU_IFC_RESPONSE_CH,
|
||||
BSP_MAILBOX_CHANNEL_ACPU_TO_MCU_SENSOR_CH,
|
||||
BSP_MAILBOX_CHANNEL_ACPU_TO_MCU_TP_CH,
|
||||
BSP_MAILBOX_CHANNEL_ACPU_TO_MCU_MCA_CH,
|
||||
BSP_MAILBOX_CHANNEL_ACPU_TO_MCU_RST_CH,
|
||||
MAILBOX_MAILCODE_ITEM_END(ACPU, MCU, MSG),
|
||||
|
||||
MAILBOX_MAILCODE_ITEM_BEGIN(ACPU, MCU, IFC),
|
||||
MAILBOX_IFC_ACPU_TO_MCU_TEST_CMP,
|
||||
MAILBOX_IFC_ACPU_TO_MCU_TEST,
|
||||
MAILBOX_IFC_ACPU_TO_MCU_HUTAF_HLT,
|
||||
MAILBOX_IFC_ACPU_TO_MCU_MCA,
|
||||
MAILBOX_IFC_ACPU_TO_MCU_MNTN,
|
||||
MAILBOX_IFC_ACPU_TO_MCU_RUN_CMD,
|
||||
MAILBOX_MAILCODE_ITEM_END(ACPU, MCU, IFC),
|
||||
|
||||
MAILBOX_MAILCODE_ITEM_BEGIN(ACPU, HIFI, MSG),
|
||||
MAILBOX_MAILCODE_ACPU_TO_HIFI_VOS_MSG_NORMAL,
|
||||
MAILBOX_MAILCODE_ACPU_TO_HIFI_VOS_MSG_URGENT,
|
||||
MAILBOX_MAILCODE_ACPU_TO_HIFI_AUDIO,
|
||||
MAILBOX_MAILCODE_ACPU_TO_HIFI_MISC,
|
||||
MAILBOX_MAILCODE_ACPU_TO_HIFI_VOICE,
|
||||
MAILBOX_MAILCODE_ACPU_TO_HIFI_VOICE_RT,
|
||||
MAILBOX_MAILCODE_ACPU_TO_HIFI_CCORE_RESET_ID,
|
||||
MAILBOX_MAILCODE_ITEM_END(ACPU, HIFI, MSG),
|
||||
|
||||
MAILBOX_MAILCODE_ITEM_BEGIN(ACPU, CCPU, MSG),
|
||||
MAILBOX_IFC_ACPU_TO_CCPU_CSHELL_START,
|
||||
MAILBOX_MAILCODE_ITEM_END(ACPU, CCPU, MSG),
|
||||
|
||||
MAILBOX_MAILCODE_ITEM_BEGIN(ACPU, CCPU, IFC),
|
||||
MAILBOX_IFC_ACPU_TO_CCPU_TEST_CMP,
|
||||
MAILBOX_IFC_ACPU_TO_CCPU_TEST,
|
||||
MAILBOX_IFC_ACPU_TO_CCPU_PRINT,
|
||||
MAILBOX_IFC_ACPU_TO_CCPU_FOPEN,
|
||||
MAILBOX_IFC_ACPU_TO_CCPU_FCLOSE,
|
||||
MAILBOX_IFC_ACPU_TO_CCPU_FREAD,
|
||||
MAILBOX_IFC_ACPU_TO_CCPU_FWRITE,
|
||||
MAILBOX_IFC_ACPU_TO_CCPU_FSEEK,
|
||||
MAILBOX_IFC_ACPU_TO_CCPU_REMOVE,
|
||||
MAILBOX_IFC_ACPU_TO_CCPU_FTELL,
|
||||
MAILBOX_IFC_ACPU_TO_CCPU_RENAME,
|
||||
MAILBOX_IFC_ACPU_TO_CCPU_ACCESS,
|
||||
MAILBOX_IFC_ACPU_TO_CCPU_MKDIR,
|
||||
MAILBOX_IFC_ACPU_TO_CCPU_RMDIR,
|
||||
MAILBOX_IFC_ACPU_TO_CCPU_BASE_TEST2,
|
||||
MAILBOX_IFC_ACPU_TO_CCPU_BASE_TEST1,
|
||||
MAILBOX_IFC_ACPU_TO_CCPU_PMIC_IRQEVENT,
|
||||
MAILBOX_IFC_ACPU_TO_CCPU_READ_EFUSE,
|
||||
MAILBOX_IFC_ACPU_TO_CCPU_SYSTEMERROR,
|
||||
MAILBOX_MAILCODE_ITEM_END(ACPU, CCPU, IFC),
|
||||
|
||||
MAILBOX_MAILCODE_ITEM_BEGIN(HIFI, CCPU, MSG),
|
||||
MAILBOX_MAILCODE_HIFI_TO_CCPU_VOS_MSG_NORMAL,
|
||||
MAILBOX_MAILCODE_HIFI_TO_CCPU_VOS_MSG_URGENT,
|
||||
MAILBOX_MAILCODE_ITEM_END(HIFI, CCPU, MSG),
|
||||
|
||||
MAILBOX_MAILCODE_ITEM_BEGIN(HIFI, ACPU, MSG),
|
||||
MAILBOX_MAILCODE_HIFI_TO_ACPU_VOS_MSG_NORMAL,
|
||||
MAILBOX_MAILCODE_HIFI_TO_ACPU_VOS_MSG_URGENT,
|
||||
MAILBOX_MAILCODE_HIFI_TO_ACPU_AUDIO,
|
||||
MAILBOX_MAILCODE_HIFI_TO_ACPU_MISC,
|
||||
MAILBOX_MAILCODE_HIFI_TO_ACPU_VOICE,
|
||||
MAILBOX_MAILCODE_HIFI_TO_ACPU_CCORE_RESET_ID,
|
||||
MAILBOX_MAILCODE_ITEM_END(HIFI, ACPU, MSG),
|
||||
|
||||
MAILBOX_MAILCODE_ITEM_BEGIN(HIFI, BBE16, MSG),
|
||||
MAILBOX_MAILCODE_HIFI_TO_BBE16_VOS_MSG_NORMAL,
|
||||
MAILBOX_MAILCODE_HIFI_TO_BBE16_VOS_MSG_URGENT,
|
||||
MAILBOX_MAILCODE_ITEM_END(HIFI, BBE16, MSG),
|
||||
|
||||
MAILBOX_MAILCODE_ITEM_BEGIN(MCU, CCPU, MSG),
|
||||
MAILBOX_MAILCODE_MCU_TO_CCPU_VOS_MSG_NORMAL,
|
||||
MAILBOX_MAILCODE_MCU_TO_CCPU_VOS_MSG_URGENT,
|
||||
BSP_MAILBOX_CHANNEL_MCU_TO_CCPU_MCA_CH,
|
||||
MAILBOX_MAILCODE_ITEM_END(MCU, CCPU, MSG),
|
||||
|
||||
MAILBOX_MAILCODE_ITEM_BEGIN(MCU, CCPU, IFC),
|
||||
MAILBOX_IFC_MCU_TO_CCPU_TEST_CMP,
|
||||
MAILBOX_IFC_MCU_TO_CCPU_BASE_TEST2,
|
||||
MAILBOX_IFC_MCU_TO_CCPU_BASE_TEST1,
|
||||
MAILBOX_IFC_MCU_TO_CCPU_TEST,
|
||||
MAILBOX_MAILCODE_ITEM_END(MCU, CCPU, IFC),
|
||||
|
||||
MAILBOX_MAILCODE_ITEM_BEGIN(MCU, ACPU, MSG),
|
||||
MAILBOX_MAILCODE_MCU_TO_ACPU_VOS_MSG_NORMAL,
|
||||
MAILBOX_MAILCODE_MCU_TO_ACPU_VOS_MSG_URGENT,
|
||||
BSP_MAILBOX_CHANNEL_MCU_TO_ACPU_IFC_CH,
|
||||
BSP_MAILBOX_CHANNEL_MCU_TO_ACPU_IFC_RESPONSE_CH,
|
||||
BSP_MAILBOX_CHANNEL_MCU_TO_ACPU_SENSOR_CH,
|
||||
BSP_MAILBOX_CHANNEL_MCU_TO_ACPU_TP_CH,
|
||||
BSP_MAILBOX_CHANNEL_MCU_TO_ACPU_MCA_CH,
|
||||
BSP_MAILBOX_CHANNEL_MCU_TO_ACPU_MNTN_CH,
|
||||
MAILBOX_IFC_MCU_TO_ACPU_HUTAF_HLT,
|
||||
MAILBOX_MAILCODE_MCU_TO_ACPU_CCORE_RESET_ID,
|
||||
MAILBOX_MAILCODE_ITEM_END(MCU, ACPU, MSG),
|
||||
|
||||
MAILBOX_MAILCODE_ITEM_BEGIN(MCU, ACPU, IFC),
|
||||
MAILBOX_IFC_MCU_TO_ACPU_TEST_CMP,
|
||||
MAILBOX_IFC_MCU_TO_ACPU_TEST,
|
||||
MAILBOX_IFC_MCU_TO_ACPU_PRINT,
|
||||
MAILBOX_MAILCODE_ITEM_END(MCU, ACPU, IFC),
|
||||
|
||||
MAILBOX_MAILCODE_ITEM_BEGIN(BBE16, HIFI, MSG),
|
||||
MAILBOX_MAILCODE_BBE16_TO_HIFI_VOS_MSG_NORMAL,
|
||||
MAILBOX_MAILCODE_BBE16_TO_HIFI_VOS_MSG_URGENT,
|
||||
MAILBOX_MAILCODE_ITEM_END(BBE16, HIFI, MSG),
|
||||
};
|
||||
|
||||
#define MAILBOX_OK 0
|
||||
#define MAILBOX_ERRO 0xF7654321
|
||||
#define MAILBOX_FULL 0xF7654322
|
||||
#define MAILBOX_NOT_READY 0xF7654323
|
||||
#define MAILBOX_TARGET_NOT_READY MAILBOX_NOT_READY
|
||||
#define MAILBOX_TIME_OUT 0xF7654324
|
||||
|
||||
#define MAILBOX_SEQNUM_START (0)
|
||||
|
||||
#define MAILBOX_MEM_BASEADDR (HIFI_AP_MAILBOX_BASE_ADDR)
|
||||
|
||||
#define MAILBOX_MEM_LENGTH (HIFI_AP_MAILBOX_TOTAL_SIZE)
|
||||
|
||||
typedef struct mb_head {
|
||||
unsigned int ulProtectWord1;
|
||||
unsigned int ulProtectWord2;
|
||||
unsigned int ulFront;
|
||||
unsigned int ulRear;
|
||||
unsigned int ulFrontslice;
|
||||
unsigned int ulRearslice;
|
||||
unsigned short ausReserve[4];
|
||||
unsigned int ulProtectWord3;
|
||||
unsigned int ulProtectWord4;
|
||||
} MAILBOX_HEAD_STRU;
|
||||
|
||||
#define MAILBOX_HEAD_LEN (sizeof(struct mb_head))
|
||||
#define MAILBOX_MAX_CHANNEL (30)
|
||||
#define MAILBOX_MEM_HEAD_LEN (MAILBOX_MAX_CHANNEL * MAILBOX_HEAD_LEN)
|
||||
|
||||
#define MAILBOX_QUEUE_SIZE(src, dst, channel) \
|
||||
MAILBOX_QUEUE_SIZE_##src##2##dst##_##channel
|
||||
enum MAILBOX_QUEUE_SIZE_ENUM {
|
||||
MAILBOX_QUEUE_SIZE(MCU, ACPU, MSG) = 0x00000000,
|
||||
MAILBOX_QUEUE_SIZE(ACPU, MCU, MSG) = 0x00000000,
|
||||
MAILBOX_QUEUE_SIZE(MCU, ACPU, IFC) = 0x00000000,
|
||||
MAILBOX_QUEUE_SIZE(ACPU, MCU, IFC) = 0x00000000,
|
||||
|
||||
MAILBOX_QUEUE_SIZE(MCU, CCPU, MSG) = 0x00000000,
|
||||
MAILBOX_QUEUE_SIZE(CCPU, MCU, MSG) = 0x00000000,
|
||||
MAILBOX_QUEUE_SIZE(MCU, CCPU, IFC) = 0x00000000,
|
||||
MAILBOX_QUEUE_SIZE(CCPU, MCU, IFC) = 0x00000000,
|
||||
|
||||
MAILBOX_QUEUE_SIZE(ACPU, CCPU, MSG) = 0x00000000,
|
||||
MAILBOX_QUEUE_SIZE(CCPU, ACPU, MSG) = 0x00000000,
|
||||
MAILBOX_QUEUE_SIZE(ACPU, CCPU, IFC) = 0x00000000,
|
||||
MAILBOX_QUEUE_SIZE(CCPU, ACPU, IFC) = 0x00000000,
|
||||
|
||||
MAILBOX_QUEUE_SIZE(ACPU, HIFI, MSG) = 0x00001800,
|
||||
MAILBOX_QUEUE_SIZE(HIFI, ACPU, MSG) = 0x00001800,
|
||||
|
||||
MAILBOX_QUEUE_SIZE(CCPU, HIFI, MSG) = 0x00000000,
|
||||
MAILBOX_QUEUE_SIZE(HIFI, CCPU, MSG) = 0x00000000,
|
||||
|
||||
MAILBOX_QUEUE_SIZE(BBE16, HIFI, MSG) = 0x00000000,
|
||||
MAILBOX_QUEUE_SIZE(HIFI, BBE16, MSG) = 0x00000000
|
||||
};
|
||||
|
||||
#define MAILBOX_HEAD_ADDR(src, dst, channel) \
|
||||
MAILBOX_HEAD_ADDR_##src##2##dst##_##channel
|
||||
enum MAILBOX_HEAD_ADDR_ENUM {
|
||||
MAILBOX_HEAD_ADDR(MCU, ACPU, MSG) = MAILBOX_MEM_BASEADDR,
|
||||
MAILBOX_HEAD_ADDR(ACPU, MCU, MSG) =
|
||||
MAILBOX_HEAD_ADDR(MCU, ACPU, MSG) + MAILBOX_HEAD_LEN,
|
||||
MAILBOX_HEAD_ADDR(ACPU, HIFI, MSG) =
|
||||
MAILBOX_HEAD_ADDR(ACPU, MCU, MSG) + MAILBOX_HEAD_LEN,
|
||||
MAILBOX_HEAD_ADDR(HIFI, ACPU, MSG) =
|
||||
MAILBOX_HEAD_ADDR(ACPU, HIFI, MSG) + MAILBOX_HEAD_LEN,
|
||||
MAILBOX_HEAD_ADDR(MCU, CCPU, MSG) =
|
||||
MAILBOX_HEAD_ADDR(HIFI, ACPU, MSG) + MAILBOX_HEAD_LEN,
|
||||
MAILBOX_HEAD_ADDR(CCPU, MCU, MSG) =
|
||||
MAILBOX_HEAD_ADDR(MCU, CCPU, MSG) + MAILBOX_HEAD_LEN,
|
||||
MAILBOX_HEAD_ADDR(CCPU, HIFI, MSG) =
|
||||
MAILBOX_HEAD_ADDR(CCPU, MCU, MSG) + MAILBOX_HEAD_LEN,
|
||||
MAILBOX_HEAD_ADDR(HIFI, CCPU, MSG) =
|
||||
MAILBOX_HEAD_ADDR(CCPU, HIFI, MSG) + MAILBOX_HEAD_LEN,
|
||||
|
||||
MAILBOX_HEAD_ADDR(ACPU, CCPU, MSG) =
|
||||
MAILBOX_HEAD_ADDR(HIFI, CCPU, MSG) + MAILBOX_HEAD_LEN,
|
||||
MAILBOX_HEAD_ADDR(CCPU, ACPU, MSG) =
|
||||
MAILBOX_HEAD_ADDR(ACPU, CCPU, MSG) + MAILBOX_HEAD_LEN,
|
||||
MAILBOX_HEAD_ADDR(CCPU, ACPU, IFC) =
|
||||
MAILBOX_HEAD_ADDR(CCPU, ACPU, MSG) + MAILBOX_HEAD_LEN,
|
||||
MAILBOX_HEAD_ADDR(ACPU, CCPU, IFC) =
|
||||
MAILBOX_HEAD_ADDR(CCPU, ACPU, IFC) + MAILBOX_HEAD_LEN,
|
||||
|
||||
MAILBOX_HEAD_ADDR(CCPU, MCU, IFC) =
|
||||
MAILBOX_HEAD_ADDR(ACPU, CCPU, IFC) + MAILBOX_HEAD_LEN,
|
||||
MAILBOX_HEAD_ADDR(MCU, CCPU, IFC) =
|
||||
MAILBOX_HEAD_ADDR(CCPU, MCU, IFC) + MAILBOX_HEAD_LEN,
|
||||
MAILBOX_HEAD_ADDR(ACPU, MCU, IFC) =
|
||||
MAILBOX_HEAD_ADDR(MCU, CCPU, IFC) + MAILBOX_HEAD_LEN,
|
||||
MAILBOX_HEAD_ADDR(MCU, ACPU, IFC) =
|
||||
MAILBOX_HEAD_ADDR(ACPU, MCU, IFC) + MAILBOX_HEAD_LEN,
|
||||
|
||||
MAILBOX_HEAD_ADDR(BBE16, HIFI, MSG) =
|
||||
MAILBOX_HEAD_ADDR(MCU, ACPU, IFC) + MAILBOX_HEAD_LEN,
|
||||
MAILBOX_HEAD_ADDR(HIFI, BBE16, MSG) =
|
||||
MAILBOX_HEAD_ADDR(BBE16, HIFI, MSG) + MAILBOX_HEAD_LEN,
|
||||
|
||||
MAILBOX_HEAD_BOTTOM_ADDR =
|
||||
MAILBOX_HEAD_ADDR(HIFI, BBE16, MSG) + MAILBOX_HEAD_LEN
|
||||
};
|
||||
|
||||
#define MAILBOX_QUEUE_ADDR(src, dst, channel) \
|
||||
MAILBOX_QUEUE_ADDR_##src##2##dst##_##channel
|
||||
#define MAILBOX_QUEUE_BOTTOM_ADDR(src, dst, channel) \
|
||||
(MAILBOX_QUEUE_ADDR(src, dst, channel) + MAILBOX_QUEUE_SIZE(src, dst, channel))
|
||||
enum MAILBOX_QUEUE_ADDR_ENUM {
|
||||
MAILBOX_QUEUE_ADDR(MCU, ACPU, MSG) =
|
||||
MAILBOX_MEM_BASEADDR + MAILBOX_MEM_HEAD_LEN,
|
||||
MAILBOX_QUEUE_ADDR(ACPU, MCU, MSG) =
|
||||
MAILBOX_QUEUE_BOTTOM_ADDR(MCU, ACPU, MSG),
|
||||
MAILBOX_QUEUE_ADDR(ACPU, HIFI, MSG) =
|
||||
MAILBOX_QUEUE_BOTTOM_ADDR(ACPU, MCU, MSG),
|
||||
MAILBOX_QUEUE_ADDR(HIFI, ACPU, MSG) =
|
||||
MAILBOX_QUEUE_BOTTOM_ADDR(ACPU, HIFI, MSG),
|
||||
|
||||
MAILBOX_QUEUE_ADDR(MCU, CCPU, MSG) =
|
||||
MAILBOX_QUEUE_BOTTOM_ADDR(HIFI, ACPU, MSG),
|
||||
MAILBOX_QUEUE_ADDR(CCPU, MCU, MSG) =
|
||||
MAILBOX_QUEUE_BOTTOM_ADDR(MCU, CCPU, MSG),
|
||||
MAILBOX_QUEUE_ADDR(CCPU, HIFI, MSG) =
|
||||
MAILBOX_QUEUE_BOTTOM_ADDR(CCPU, MCU, MSG),
|
||||
MAILBOX_QUEUE_ADDR(HIFI, CCPU, MSG) =
|
||||
MAILBOX_QUEUE_BOTTOM_ADDR(CCPU, HIFI, MSG),
|
||||
|
||||
MAILBOX_QUEUE_ADDR(ACPU, CCPU, MSG) =
|
||||
MAILBOX_QUEUE_BOTTOM_ADDR(HIFI, CCPU, MSG),
|
||||
MAILBOX_QUEUE_ADDR(CCPU, ACPU, MSG) =
|
||||
MAILBOX_QUEUE_BOTTOM_ADDR(ACPU, CCPU, MSG),
|
||||
MAILBOX_QUEUE_ADDR(CCPU, ACPU, IFC) =
|
||||
MAILBOX_QUEUE_BOTTOM_ADDR(CCPU, ACPU, MSG),
|
||||
MAILBOX_QUEUE_ADDR(ACPU, CCPU, IFC) =
|
||||
MAILBOX_QUEUE_BOTTOM_ADDR(CCPU, ACPU, IFC),
|
||||
|
||||
MAILBOX_QUEUE_ADDR(CCPU, MCU, IFC) =
|
||||
MAILBOX_QUEUE_BOTTOM_ADDR(ACPU, CCPU, IFC),
|
||||
MAILBOX_QUEUE_ADDR(MCU, CCPU, IFC) =
|
||||
MAILBOX_QUEUE_BOTTOM_ADDR(CCPU, MCU, IFC),
|
||||
MAILBOX_QUEUE_ADDR(ACPU, MCU, IFC) =
|
||||
MAILBOX_QUEUE_BOTTOM_ADDR(MCU, CCPU, IFC),
|
||||
MAILBOX_QUEUE_ADDR(MCU, ACPU, IFC) =
|
||||
MAILBOX_QUEUE_BOTTOM_ADDR(ACPU, MCU, IFC),
|
||||
|
||||
MAILBOX_QUEUE_ADDR(BBE16, HIFI, MSG) =
|
||||
MAILBOX_QUEUE_BOTTOM_ADDR(MCU, ACPU, IFC),
|
||||
MAILBOX_QUEUE_ADDR(HIFI, BBE16, MSG) =
|
||||
MAILBOX_QUEUE_BOTTOM_ADDR(BBE16, HIFI, MSG),
|
||||
|
||||
MAILBOX_MEMORY_BOTTOM_ADDR =
|
||||
MAILBOX_QUEUE_BOTTOM_ADDR(HIFI, BBE16, MSG)
|
||||
};
|
||||
|
||||
#define MAILBOX_PROTECT1 (0x55AA55AA)
|
||||
#define MAILBOX_PROTECT2 (0x5A5A5A5A)
|
||||
#define MAILBOX_PROTECT_LEN (sizeof(int))
|
||||
#define MAILBOX_MSGHEAD_NUMBER (0xA5A5A5A5)
|
||||
|
||||
#define MAILBOX_DATA_BASE_PROTECT_NUM (2)
|
||||
#define MAILBOX_DATA_TAIL_PROTECT_NUM (2)
|
||||
|
||||
#define MAILBOX_DATA_LEN_PROTECT_NUM (MAILBOX_DATA_BASE_PROTECT_NUM + MAILBOX_DATA_TAIL_PROTECT_NUM)
|
||||
|
||||
#define HIFI_MB_ADDR_PROTECT (0x5a5a5a5a)
|
||||
|
||||
#define MAILBOX_IPC_INT_NUM(src, dst, channel) \
|
||||
MAILBOX_IPC_INT_##src##2##dst##_##channel
|
||||
enum IPC_MAILBOX_INT_ENUM {
|
||||
#if 0
|
||||
MAILBOX_IPC_INT_NUM(CCPU, MCU, MSG) = IPC_MCU_INT_SRC_CCPU_MSG,
|
||||
MAILBOX_IPC_INT_NUM(MCU, CCPU, MSG) = IPC_CCPU_INT_SRC_MCU_MSG,
|
||||
|
||||
MAILBOX_IPC_INT_NUM(CCPU, HIFI, MSG) =
|
||||
IPC_HIFI_INT_SRC_CCPU_MSG,
|
||||
MAILBOX_IPC_INT_NUM(HIFI, CCPU, MSG) =
|
||||
IPC_CCPU_INT_SRC_HIFI_MSG,
|
||||
|
||||
MAILBOX_IPC_INT_NUM(ACPU, MCU, MSG) = IPC_MCU_INT_SRC_ACPU_MSG,
|
||||
MAILBOX_IPC_INT_NUM(MCU, ACPU, MSG) = IPC_ACPU_INT_SRC_MCU_MSG,
|
||||
|
||||
MAILBOX_IPC_INT_NUM(ACPU, HIFI, MSG) =
|
||||
IPC_HIFI_INT_SRC_ACPU_MSG,
|
||||
MAILBOX_IPC_INT_NUM(HIFI, ACPU, MSG) =
|
||||
IPC_ACPU_INT_SRC_HIFI_MSG,
|
||||
|
||||
MAILBOX_IPC_INT_NUM(HIFI, MCU, MSG) = IPC_MCU_INT_SRC_HIFI_MSG,
|
||||
MAILBOX_IPC_INT_NUM(MCU, HIFI, MSG) = IPC_HIFI_INT_SRC_MCU_MSG,
|
||||
|
||||
MAILBOX_IPC_INT_NUM(CCPU, ACPU, MSG) =
|
||||
IPC_ACPU_INT_SRC_CCPU_MSG,
|
||||
MAILBOX_IPC_INT_NUM(ACPU, CCPU, MSG) =
|
||||
IPC_CCPU_INT_SRC_ACPU_MSG,
|
||||
|
||||
MAILBOX_IPC_INT_NUM(CCPU, ACPU, IFC) =
|
||||
IPC_ACPU_INT_SRC_CCPU_IFC,
|
||||
MAILBOX_IPC_INT_NUM(ACPU, CCPU, IFC) =
|
||||
IPC_CCPU_INT_SRC_ACPU_IFC,
|
||||
|
||||
MAILBOX_IPC_INT_NUM(CCPU, MCU, IFC) = IPC_MCU_INT_SRC_CCPU_IFC,
|
||||
MAILBOX_IPC_INT_NUM(MCU, CCPU, IFC) = IPC_CCPU_INT_SRC_MCU_IFC,
|
||||
|
||||
MAILBOX_IPC_INT_NUM(ACPU, MCU, IFC) = IPC_MCU_INT_SRC_ACPU_IFC,
|
||||
MAILBOX_IPC_INT_NUM(MCU, ACPU, IFC) = IPC_ACPU_INT_SRC_MCU_IFC,
|
||||
|
||||
MAILBOX_IPC_INT_NUM(BBE16, HIFI, MSG) =
|
||||
IPC_HIFI_INT_SRC_BBE_MSG,
|
||||
MAILBOX_IPC_INT_NUM(HIFI, BBE16, MSG) =
|
||||
IPC_BBE16_INT_SRC_HIFI_MSG
|
||||
#else
|
||||
MAILBOX_IPC_INT_NUM(CCPU, HIFI, MSG) =
|
||||
IPC_HIFI_INT_SRC_CCPU_MSG,
|
||||
MAILBOX_IPC_INT_NUM(HIFI, CCPU, MSG) =
|
||||
IPC_CCPU_INT_SRC_HIFI_MSG,
|
||||
|
||||
MAILBOX_IPC_INT_NUM(ACPU, HIFI, MSG) =
|
||||
IPC_HIFI_INT_SRC_ACPU_MSG,
|
||||
MAILBOX_IPC_INT_NUM(HIFI, ACPU, MSG) =
|
||||
IPC_ACPU_INT_SRC_HIFI_MSG,
|
||||
#endif
|
||||
};
|
||||
|
||||
#define MAILBOX_MAILSIZE_MAX(src, dst, channel) \
|
||||
MAILBOX_MAILSIZE_MAX_##src##2##dst##_##channel
|
||||
enum MAILBOX_MAILSIZE_MAX_ENUM {
|
||||
MAILBOX_MAILSIZE_MAX(MCU, ACPU, MSG) =
|
||||
MAILBOX_QUEUE_SIZE(MCU, ACPU, MSG) / 4,
|
||||
MAILBOX_MAILSIZE_MAX(ACPU, MCU, MSG) =
|
||||
MAILBOX_QUEUE_SIZE(ACPU, MCU, MSG) / 4,
|
||||
MAILBOX_MAILSIZE_MAX(ACPU, HIFI, MSG) =
|
||||
MAILBOX_QUEUE_SIZE(ACPU, HIFI, MSG) / 4,
|
||||
MAILBOX_MAILSIZE_MAX(HIFI, ACPU, MSG) =
|
||||
MAILBOX_QUEUE_SIZE(HIFI, ACPU, MSG) / 4,
|
||||
MAILBOX_MAILSIZE_MAX(MCU, CCPU, MSG) =
|
||||
MAILBOX_QUEUE_SIZE(MCU, CCPU, MSG) / 4,
|
||||
MAILBOX_MAILSIZE_MAX(CCPU, MCU, MSG) =
|
||||
MAILBOX_QUEUE_SIZE(CCPU, MCU, MSG) / 4,
|
||||
MAILBOX_MAILSIZE_MAX(CCPU, HIFI, MSG) =
|
||||
MAILBOX_QUEUE_SIZE(CCPU, HIFI, MSG) / 4,
|
||||
MAILBOX_MAILSIZE_MAX(HIFI, CCPU, MSG) =
|
||||
MAILBOX_QUEUE_SIZE(HIFI, CCPU, MSG) / 4,
|
||||
|
||||
MAILBOX_MAILSIZE_MAX(CCPU, ACPU, MSG) =
|
||||
MAILBOX_QUEUE_SIZE(CCPU, ACPU, MSG) / 4,
|
||||
MAILBOX_MAILSIZE_MAX(ACPU, CCPU, MSG) =
|
||||
MAILBOX_QUEUE_SIZE(ACPU, CCPU, MSG) / 4,
|
||||
MAILBOX_MAILSIZE_MAX(CCPU, ACPU, IFC) =
|
||||
MAILBOX_QUEUE_SIZE(CCPU, ACPU, IFC) / 4,
|
||||
MAILBOX_MAILSIZE_MAX(ACPU, CCPU, IFC) =
|
||||
MAILBOX_QUEUE_SIZE(ACPU, CCPU, IFC) / 4,
|
||||
|
||||
MAILBOX_MAILSIZE_MAX(CCPU, MCU, IFC) =
|
||||
MAILBOX_QUEUE_SIZE(CCPU, MCU, IFC) / 4,
|
||||
MAILBOX_MAILSIZE_MAX(MCU, CCPU, IFC) =
|
||||
MAILBOX_QUEUE_SIZE(MCU, CCPU, IFC) / 4,
|
||||
|
||||
MAILBOX_MAILSIZE_MAX(ACPU, MCU, IFC) =
|
||||
MAILBOX_QUEUE_SIZE(ACPU, MCU, IFC) / 4,
|
||||
MAILBOX_MAILSIZE_MAX(MCU, ACPU, IFC) =
|
||||
MAILBOX_QUEUE_SIZE(MCU, ACPU, IFC) / 4,
|
||||
|
||||
MAILBOX_MAILSIZE_MAX(BBE16, HIFI, MSG) =
|
||||
MAILBOX_QUEUE_SIZE(BBE16, HIFI, MSG) / 4,
|
||||
MAILBOX_MAILSIZE_MAX(HIFI, BBE16, MSG) =
|
||||
MAILBOX_QUEUE_SIZE(HIFI, BBE16, MSG) / 4,
|
||||
};
|
||||
|
||||
typedef struct mb_mail {
|
||||
unsigned int ulPartition;
|
||||
unsigned int ulWriteSlice;
|
||||
unsigned int ulReadSlice;
|
||||
unsigned int ulSeqNum;
|
||||
unsigned int ulPriority;
|
||||
unsigned int ulMailCode;
|
||||
unsigned int ausReserve[2];
|
||||
unsigned int ulMsgLength;
|
||||
} MAILBOX_MSG_HEADER;
|
||||
|
||||
enum {
|
||||
HI_SYSCTRL_BASE_ADDR_ID = 0,
|
||||
HI_SOCP_REGBASE_ADDR_ID,
|
||||
SOC_IPC_S_BASE_ADDR_ID,
|
||||
SOC_AP_EDMAC_BASE_ADDR_ID,
|
||||
SOC_UART3_BASE_ADDR_ID,
|
||||
SOC_Watchdog1_BASE_ADDR_ID,
|
||||
SOC_AO_SCTRL_SC_SLICER_COUNT0_ADDR_0_ID,
|
||||
SOC_HIFI_Timer00_BASE_ADDR_ID,
|
||||
SOC_HIFI_Timer08_BASE_ADDR_ID,
|
||||
DDR_HIFI_ADDR_ID,
|
||||
SOC_BBP_TDS_BASE_ADDR_ID,
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
unsigned int enID;
|
||||
unsigned int uwAddress;
|
||||
} SOC_HIFI_ADDR_ITEM_STRU;
|
||||
|
||||
typedef struct {
|
||||
unsigned int uwProtectWord; /*0x5a5a5a5a */
|
||||
SOC_HIFI_ADDR_ITEM_STRU astSocAddr[64];
|
||||
} SOC_HIFI_ADDR_SHARE_STRU;
|
||||
|
||||
typedef struct {
|
||||
unsigned int uwProtectWord;
|
||||
unsigned int uwAddrPhy;
|
||||
unsigned int uwSize;
|
||||
unsigned int uwReserve;
|
||||
|
||||
} MODEM_HIFI_NV_SHARE_STRU;
|
||||
|
||||
typedef struct {
|
||||
unsigned int uwProtectWord; /*0x5a5a5a5a */
|
||||
unsigned int uwHifi2AarmMailBoxLen;
|
||||
unsigned int uwAarm2HifiMailBoxLen;
|
||||
unsigned int uwHifiAarmHeadAddr;
|
||||
unsigned int uwHifiAarmBodyAddr;
|
||||
unsigned int uwAarmHifiHeadAddr;
|
||||
unsigned int uwAarmHifiBodyAddr;
|
||||
unsigned int uwReserved[2];
|
||||
} AARM_HIFI_MAILBOX_STRU;
|
||||
|
||||
typedef struct {
|
||||
unsigned int uwProtectWord; /*0x5a5a5a5a */
|
||||
unsigned int uwHifi2CarmMailBoxLen;
|
||||
unsigned int uwCarm2HifiMailBoxLen;
|
||||
unsigned int uwHifiCarmHeadAddr;
|
||||
unsigned int uwHifiCarmBodyAddr;
|
||||
unsigned int uwCarmHifiHeadAddr;
|
||||
unsigned int uwCarmHifiBodyAddr;
|
||||
unsigned int uwReserved[2];
|
||||
} CARM_HIFI_MAILBOX_STRU;
|
||||
|
||||
typedef struct {
|
||||
unsigned int uwProtectWord;
|
||||
unsigned int uwHifi2CarmIccChannelLen;
|
||||
unsigned int uwHifi2TphyIccChannelLen;
|
||||
unsigned int uwHifi2CarmIccChannelAddr;
|
||||
unsigned int uwCarm2HifiIccChannelAddr;
|
||||
unsigned int uwHifi2TphyIccChannelAddr;
|
||||
unsigned int uwTphy2HifiIccChannelAddr;
|
||||
unsigned int uwReserved[2];
|
||||
} CARM_HIFI_ICC_STRU;
|
||||
|
||||
typedef struct {
|
||||
unsigned int uwProtectWord; /*0x5a5a5a5a */
|
||||
CARM_HIFI_ICC_STRU stCarmHifiMB;
|
||||
AARM_HIFI_MAILBOX_STRU stAarmHifiMB;
|
||||
unsigned int uwNvBaseAddrPhy;
|
||||
unsigned int uwNvBaseAddrVirt;
|
||||
MODEM_HIFI_NV_SHARE_STRU stNVShare;
|
||||
SOC_HIFI_ADDR_SHARE_STRU stSoCShare;
|
||||
unsigned int uwReserved[2];
|
||||
} CARM_HIFI_DYN_ADDR_SHARE_STRU;
|
||||
|
||||
typedef void (*mb_msg_cb) (void *user_handle,
|
||||
void *mail_handle, unsigned int mail_len);
|
||||
|
||||
unsigned int DRV_MAILBOX_SENDMAIL(unsigned int MailCode,
|
||||
void *pData, unsigned int Length);
|
||||
|
||||
unsigned int DRV_MAILBOX_REGISTERRECVFUNC(unsigned int MailCode,
|
||||
mb_msg_cb pFun,
|
||||
void *UserHandle);
|
||||
|
||||
unsigned int DRV_MAILBOX_READMAILDATA(void *MailHandle,
|
||||
unsigned char *pData,
|
||||
unsigned int *pSize);
|
||||
|
||||
void drv_hifi_fill_mb_info(unsigned int addr);
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
#endif /* end of drv_mailbox_cfg.h */
|
||||
@@ -0,0 +1,443 @@
|
||||
#include "drv_mailbox_cfg.h"
|
||||
#include "drv_mailbox_debug.h"
|
||||
#include "drv_mailbox_gut.h"
|
||||
|
||||
extern int logMsg(char *fmt, ...);
|
||||
|
||||
#undef _MAILBOX_FILE_
|
||||
#define _MAILBOX_FILE_ "dbg"
|
||||
#if (MAILBOX_LOG_LEVEL != MAILBOX_LOG_NONE)
|
||||
MAILBOX_EXTERN int mailbox_log_erro(unsigned int err_no,
|
||||
unsigned long param1,
|
||||
unsigned long param2,
|
||||
unsigned int line_no, char *file_name)
|
||||
{
|
||||
struct mb *mb = &g_mailbox_handle;
|
||||
struct mb_log *record = &mb->log_array[0];
|
||||
unsigned int log_out = MAILBOX_FALSE;
|
||||
char *erro_str = MAILBOX_NULL;
|
||||
|
||||
record[mb->log_prob].erro_num = err_no;
|
||||
record[mb->log_prob].line = line_no;
|
||||
record[mb->log_prob].param1 = param1;
|
||||
record[mb->log_prob].param2 = param2;
|
||||
record[mb->log_prob].file = (const char *)file_name;
|
||||
mb->log_prob = ((MAILBOX_ERRO_ARRAY_NUM - 1) == mb->log_prob) ? (0) :
|
||||
(mb->log_prob + 1);
|
||||
|
||||
#if (MAILBOX_LOG_LEVEL >= MAILBOX_LOG_CRITICAL)
|
||||
if ((err_no > MAILBOX_CRIT_RET_START)
|
||||
&& (err_no < MAILBOX_CRIT_RET_END)) {
|
||||
erro_str = "mb Critical!";
|
||||
log_out = MAILBOX_TRUE;
|
||||
mailbox_assert(err_no);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if (MAILBOX_LOG_LEVEL >= MAILBOX_LOG_ERROR)
|
||||
if ((err_no > MAILBOX_ERR_RET_START) && (err_no < MAILBOX_ERR_RET_END)) {
|
||||
erro_str = "mb error!";
|
||||
log_out = MAILBOX_TRUE;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if (MAILBOX_LOG_LEVEL >= MAILBOX_LOG_WARNING)
|
||||
if ((err_no > MAILBOX_WARNING_RET_START)
|
||||
&& (err_no < MAILBOX_WARNING_RET_END)) {
|
||||
erro_str = "mb warning!";
|
||||
log_out = MAILBOX_TRUE;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if (MAILBOX_LOG_LEVEL >= MAILBOX_LOG_INFO)
|
||||
if ((err_no > MAILBOX_INFO_RET_START)
|
||||
&& (err_no < MAILBOX_INFO_RET_END)) {
|
||||
erro_str = "mb info!";
|
||||
log_out = MAILBOX_TRUE;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (MAILBOX_FULL == err_no) {
|
||||
mailbox_out(("mb(%lu) full !" RT, param1));
|
||||
log_out = MAILBOX_TRUE;
|
||||
} else if (MAILBOX_NOT_READY == err_no) {
|
||||
mailbox_out(("remote mb(%lu) not ready!" RT, param1));
|
||||
log_out = MAILBOX_TRUE;
|
||||
}
|
||||
|
||||
if (MAILBOX_TRUE == log_out) {
|
||||
mailbox_out(("%s:0x%08x, param1:%lu, param2:%lu, (line:%d),(file:%s)" RT, erro_str, err_no, param1, param2, (unsigned int)line_no, file_name));
|
||||
}
|
||||
|
||||
return (int)err_no;
|
||||
}
|
||||
#endif
|
||||
|
||||
unsigned int g_mb_trans_time_limit = MAILBOX_MAIL_TRANS_TIME_LIMIT;
|
||||
unsigned int g_mb_deal_time_limit = MAILBOX_MAIL_DEAL_TIME_LIMIT;
|
||||
unsigned int g_mb_sche_limit = MAILBOX_MAIL_SCHE_TIME_LIMIT;
|
||||
|
||||
void mailbox_statistic_slice(struct mb_slice *slice,
|
||||
unsigned int mailcode,
|
||||
unsigned int threslhold, unsigned int erro_code)
|
||||
{
|
||||
unsigned int slice_diff;
|
||||
unsigned int slice_end = (unsigned int)mailbox_get_timestamp();
|
||||
unsigned int slice_start = slice->start;
|
||||
|
||||
slice_diff = mailbox_get_slice_diff(slice_start, slice_end);
|
||||
if (slice_diff < 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
slice_end = slice->total;
|
||||
slice->total += slice_diff;
|
||||
if (slice_end > slice->total) {
|
||||
slice->overflow = MAILBOX_TRUE;
|
||||
}
|
||||
|
||||
if (slice_diff > slice->max) {
|
||||
slice->max = slice_diff;
|
||||
slice->code = mailcode;
|
||||
}
|
||||
|
||||
if (slice_diff >= threslhold) {
|
||||
mailbox_logerro_p2(erro_code, slice_diff, mailcode);
|
||||
}
|
||||
}
|
||||
|
||||
void mailbox_record_sche_send(void *priv)
|
||||
{
|
||||
struct mb_buff *mbuf = (struct mb_buff *)priv;
|
||||
mbuf->mntn.sche.start = (unsigned long)mailbox_get_timestamp();
|
||||
}
|
||||
|
||||
void mailbox_record_sche_recv(void *priv)
|
||||
{
|
||||
struct mb_buff *mbuf = (struct mb_buff *)priv;
|
||||
|
||||
mailbox_statistic_slice(&mbuf->mntn.sche, mbuf->channel_id,
|
||||
g_mb_sche_limit, MAILBOX_WARNING_SCHE_TIME_OUT);
|
||||
}
|
||||
|
||||
void mailbox_record_send(struct mb_mntn *mntn,
|
||||
unsigned int mailcode,
|
||||
unsigned int time_stamp, unsigned long mail_addr)
|
||||
{
|
||||
struct mb_queue *m_queue = &mntn->mbuff->mail_queue;
|
||||
unsigned int size_left =
|
||||
(unsigned int)mailbox_queue_left(m_queue->rear, m_queue->front,
|
||||
m_queue->length);
|
||||
|
||||
if (size_left < mntn->peak_traffic_left) {
|
||||
mntn->peak_traffic_left = size_left;
|
||||
}
|
||||
mntn->track_array[mntn->track_prob].send_slice = time_stamp;
|
||||
mntn->track_array[mntn->track_prob].mail_addr = mail_addr;
|
||||
mntn->track_array[mntn->track_prob].use_id =
|
||||
mailbox_get_use_id(mailcode);
|
||||
mntn->track_prob =
|
||||
((MAILBOX_RECORD_USEID_NUM - 1) ==
|
||||
mntn->track_prob) ? (0) : (mntn->track_prob + 1);
|
||||
}
|
||||
|
||||
void mailbox_record_transport(struct mb_mntn *mntn,
|
||||
unsigned int mailcode,
|
||||
unsigned int write_slice,
|
||||
unsigned int read_slice, unsigned long mail_addr)
|
||||
{
|
||||
struct mb_queue *m_queue = &mntn->mbuff->mail_queue;
|
||||
unsigned int size_left =
|
||||
(unsigned int)mailbox_queue_left(m_queue->rear, m_queue->front,
|
||||
m_queue->length);
|
||||
|
||||
if (size_left < mntn->peak_traffic_left) {
|
||||
mntn->peak_traffic_left = size_left;
|
||||
}
|
||||
|
||||
if (size_left < (m_queue->length >> 3)) {
|
||||
mailbox_logerro_p2(MAILBOX_ERR_GUT_MAILBOX_RECEIVE_FULL,
|
||||
size_left, mailcode);
|
||||
}
|
||||
|
||||
mntn->track_array[mntn->track_prob].use_id =
|
||||
(unsigned short)mailbox_get_use_id(mailcode);
|
||||
mntn->track_array[mntn->track_prob].send_slice = write_slice;
|
||||
mntn->track_array[mntn->track_prob].recv_slice = read_slice;
|
||||
mntn->track_array[mntn->track_prob].mail_addr = mail_addr;
|
||||
mntn->track_prob =
|
||||
((MAILBOX_RECORD_USEID_NUM - 1) ==
|
||||
mntn->track_prob) ? (0) : (mntn->track_prob + 1);
|
||||
|
||||
mntn->trans.start = write_slice;
|
||||
mailbox_statistic_slice(&mntn->trans, mailcode,
|
||||
g_mb_trans_time_limit,
|
||||
MAILBOX_WARNING_TRANSPORT_TIME_OUT);
|
||||
|
||||
}
|
||||
|
||||
void mailbox_record_receive(struct mb_mntn *mntn,
|
||||
unsigned int mailcode, unsigned int slice_start)
|
||||
{
|
||||
mntn->deal.start = slice_start;
|
||||
mailbox_statistic_slice(&mntn->deal, mailcode,
|
||||
g_mb_deal_time_limit,
|
||||
MAILBOX_WARNING_RECEIVE_TIME_OUT);
|
||||
}
|
||||
|
||||
void mailbox_clear_mntn(struct mb_mntn *mntn, int clear)
|
||||
{
|
||||
struct mb_buff *mbuff;
|
||||
if (clear) {
|
||||
mbuff = mntn->mbuff;
|
||||
mailbox_memset(mntn, 0x00, sizeof(struct mb_mntn));
|
||||
mntn->mbuff = mbuff;
|
||||
mntn->peak_traffic_left = MAILBOX_QUEUE_LEFT_INVALID;
|
||||
}
|
||||
}
|
||||
|
||||
MAILBOX_LOCAL void mailbox_show_general(struct mb_cfg *cfg)
|
||||
{
|
||||
struct mb_head *pBoxHead = (struct mb_head *)(cfg->head_addr);
|
||||
|
||||
mailbox_out(("Max Id, HeadAddr, DataAddr, DataSize, IntSrcId" RT));
|
||||
mailbox_out(("0x%08x, 0x%08x, 0x%08x, 0x%08x, %04d" RT,
|
||||
(unsigned int)cfg->butt_id, (unsigned int)cfg->head_addr,
|
||||
(unsigned int)cfg->data_addr, (unsigned int)cfg->data_size,
|
||||
(unsigned int)cfg->int_src));
|
||||
mailbox_out(("Head information:" RT));
|
||||
|
||||
mailbox_out(("Head Front: 0x%x (0x%08x)" RT,
|
||||
(unsigned int)pBoxHead->ulFront,
|
||||
(unsigned int)(cfg->data_addr +
|
||||
(pBoxHead->ulFront *
|
||||
sizeof(unsigned long)))));
|
||||
mailbox_out(("Head Rear: 0x%x (0x%08x)" RT,
|
||||
(unsigned int)pBoxHead->ulRear,
|
||||
(unsigned int)(cfg->data_addr +
|
||||
(pBoxHead->ulRear *
|
||||
sizeof(unsigned long)))));
|
||||
mailbox_out(("Head Frontslice: 0x%x" RT,
|
||||
(unsigned int)pBoxHead->ulFrontslice));
|
||||
mailbox_out(("Head Rearslice: 0x%x" RT,
|
||||
(unsigned int)pBoxHead->ulRearslice));
|
||||
mailbox_out((":-------------------------------------------------------------:" RT));
|
||||
|
||||
}
|
||||
|
||||
MAILBOX_LOCAL void mailbox_show_receive(struct mb_buff *mbuf)
|
||||
{
|
||||
struct mb_mntn *mntn = &(mbuf->mntn);
|
||||
struct mb_cb *callback = mbuf->read_cb;
|
||||
unsigned int max_use = mailbox_get_use_id(mbuf->config->butt_id);
|
||||
unsigned int i = 0;
|
||||
|
||||
mailbox_out((":---------------------------------------------:" RT));
|
||||
mailbox_out(("Receive info:" RT));
|
||||
|
||||
mailbox_out(("Mail Read Call Back show:" RT));
|
||||
mailbox_out(("Use Id, Call Back, User Handle" RT));
|
||||
while (i < max_use) {
|
||||
mailbox_out(("%d, %pK, %pK" RT, (unsigned int)i,
|
||||
callback->func, callback->handle));
|
||||
callback++;
|
||||
i++;
|
||||
}
|
||||
|
||||
if (MAILBOX_TRUE != mntn->sche.overflow) {
|
||||
mailbox_out(("Schedule Avg. slice:%4d, total:%d" RT,
|
||||
(unsigned int)((mbuf->seq_num + 1)
|
||||
? (mntn->sche.total) /
|
||||
(mbuf->seq_num + 1) : 0),
|
||||
(unsigned int)(mbuf->seq_num)));
|
||||
} else {
|
||||
mailbox_out(("Schedule Avg. data overflow " RT));
|
||||
}
|
||||
mailbox_out(("Schedule Max. slice:%4d, Use ID:0x%08x" RT,
|
||||
(unsigned int)(mntn->sche.max),
|
||||
(unsigned int)(mntn->sche.code)));
|
||||
|
||||
if (MAILBOX_TRUE != mntn->trans.overflow) {
|
||||
mailbox_out(("Transfers Avg. slice:%4d, total:%d" RT,
|
||||
(int)((mbuf->seq_num +
|
||||
1) ? ((mntn->trans.total) / (mbuf->seq_num +
|
||||
1)) : 0),
|
||||
(unsigned int)(mbuf->seq_num)));
|
||||
} else {
|
||||
mailbox_out(("Transfers Max. data overflow" RT));
|
||||
}
|
||||
mailbox_out(("Transfers Max. slice:%4d, Use ID:0x%08x" RT,
|
||||
(unsigned int)(mntn->trans.max), (int)(mntn->trans.code)));
|
||||
|
||||
if (MAILBOX_TRUE != mntn->deal.overflow) {
|
||||
mailbox_out(("Call Back Avg. slice:%4d, total:%d" RT,
|
||||
(unsigned int)((mbuf->seq_num + 1)
|
||||
? (mntn->deal.total) /
|
||||
(mbuf->seq_num + 1) : 0),
|
||||
(unsigned int)(mbuf->seq_num)));
|
||||
} else {
|
||||
mailbox_out(("Call Back Avg. data overflow" RT));
|
||||
}
|
||||
mailbox_out(("Call Back Max. slice:%4d, Use ID:0x%08x" RT,
|
||||
(unsigned int)(mntn->deal.max),
|
||||
(unsigned int)(mntn->deal.code)));
|
||||
|
||||
mailbox_out((":---------------------------------------------:" RT));
|
||||
}
|
||||
|
||||
MAILBOX_LOCAL void mailbox_show_detail(struct mb *mb,
|
||||
struct mb_buff *mbuf, int clear)
|
||||
{
|
||||
struct mb_mntn *mntn = MAILBOX_NULL;
|
||||
unsigned int channel = mbuf->channel_id;
|
||||
struct mb_queue *queue = &mbuf->mail_queue;
|
||||
struct mb_mail *mail;
|
||||
unsigned int i;
|
||||
|
||||
mailbox_out(("mail box show channel(0x%08x) information:" RT,
|
||||
(unsigned int)channel));
|
||||
|
||||
mailbox_show_general(mbuf->config);
|
||||
mailbox_out((":---------------------------------------------:" RT));
|
||||
mntn = &(mbuf->mntn);
|
||||
i = mntn->track_prob;
|
||||
mailbox_out(("Latest transmit mails track:(%d total)" RT,
|
||||
(unsigned int)mbuf->seq_num));
|
||||
mailbox_out(("id ,address ,send slice ,recv slice ,diff slice"
|
||||
RT));
|
||||
do {
|
||||
i = ((0 == i) ? (MAILBOX_RECORD_USEID_NUM - 1) : (i - 1));
|
||||
mail = (struct mb_mail *)(mntn->track_array[i].mail_addr);
|
||||
|
||||
if (mail && (0 == mntn->track_array[i].recv_slice)) {
|
||||
mntn->track_array[i].recv_slice = mail->ulReadSlice;
|
||||
}
|
||||
mailbox_out(("%02d ,%pK ,0x%-8x ,0x%-8x ,0x%-8x(%d)" RT,
|
||||
mntn->track_array[i].use_id,
|
||||
mail,
|
||||
(unsigned int)mntn->track_array[i].send_slice,
|
||||
(unsigned int)mntn->track_array[i].recv_slice,
|
||||
(unsigned int)mailbox_get_slice_diff(mntn->
|
||||
track_array
|
||||
[i].
|
||||
send_slice,
|
||||
mntn->
|
||||
track_array
|
||||
[i].
|
||||
recv_slice),
|
||||
(unsigned int)mailbox_get_slice_diff(mntn->
|
||||
track_array
|
||||
[i].
|
||||
send_slice,
|
||||
mntn->
|
||||
track_array
|
||||
[i].
|
||||
recv_slice)));
|
||||
} while (i != (mntn->track_prob));
|
||||
|
||||
if (mb->local_id == mailbox_get_dst_id(channel)) {
|
||||
mailbox_out(("Receive Channel" RT));
|
||||
}
|
||||
|
||||
if (mb->local_id == mailbox_get_src_id(channel)) {
|
||||
mailbox_out(("Send Channel: sem id(%pK)" RT, mbuf->mutex));
|
||||
} else if (mb->local_id == mailbox_get_dst_id(channel)) {
|
||||
mailbox_out(("Receive Channel: sem id(%pK)" RT, mbuf->mutex));
|
||||
mailbox_show_receive(mbuf);
|
||||
}
|
||||
|
||||
if (MAILBOX_QUEUE_LEFT_INVALID == mntn->peak_traffic_left) {
|
||||
mntn->peak_traffic_left = queue->length;
|
||||
}
|
||||
mailbox_out(("Peak Traffic: %d%%, Peak: 0x%x, Total: 0x%x" RT,
|
||||
(int)100 * (queue->length -
|
||||
mntn->peak_traffic_left) / queue->length,
|
||||
(unsigned int)(queue->length - mntn->peak_traffic_left),
|
||||
(unsigned int)queue->length));
|
||||
|
||||
mailbox_out((":------------------------------------------------:" RT));
|
||||
|
||||
mailbox_clear_mntn(mntn, clear);
|
||||
}
|
||||
|
||||
MAILBOX_EXTERN int mailbox_show(unsigned int channel, unsigned int show_flag)
|
||||
{
|
||||
struct mb_cfg *config = &g_mailbox_global_cfg_tbl[0];
|
||||
struct mb_buff *mbuf = MAILBOX_NULL;
|
||||
struct mb_link *send_tbl = MAILBOX_NULL;
|
||||
struct mb_link *recv_tbl = MAILBOX_NULL;
|
||||
struct mb *mb = MAILBOX_NULL;
|
||||
struct mb_log *record = MAILBOX_NULL;
|
||||
unsigned int i;
|
||||
unsigned int j;
|
||||
unsigned int clear = MAILBOX_FALSE;
|
||||
|
||||
mb = mailbox_get_mb();
|
||||
if (MAILBOX_NULL == mb) {
|
||||
return (int)MAILBOX_ERRO;
|
||||
}
|
||||
|
||||
if (MAILBOX_SHOW_CLEAR & show_flag) {
|
||||
clear = MAILBOX_TRUE;
|
||||
}
|
||||
|
||||
if (MAILBOX_SHOW_ALL & show_flag) {
|
||||
/*Show all channel's general information. */
|
||||
send_tbl = mb->send_tbl;
|
||||
for (i = 0; i < MAILBOX_CPUID_BUTT; i++) {
|
||||
if (MAILBOX_NULL != send_tbl[i].channel_buff) {
|
||||
mbuf = send_tbl[i].channel_buff;
|
||||
for (j = 0; j < send_tbl[i].carrier_butt; j++) {
|
||||
mailbox_show_detail(mb, mbuf,
|
||||
(int)clear);
|
||||
mbuf++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
recv_tbl = mb->recv_tbl;
|
||||
for (i = 0; i < MAILBOX_CPUID_BUTT; i++) {
|
||||
if (MAILBOX_NULL != recv_tbl[i].channel_buff) {
|
||||
mbuf = recv_tbl[i].channel_buff;
|
||||
for (j = 0; j < recv_tbl[i].carrier_butt; j++) {
|
||||
mailbox_show_detail(mb, mbuf,
|
||||
(int)clear);
|
||||
mbuf++;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
mbuf = mailbox_get_channel_handle(mb, channel);
|
||||
|
||||
if (MAILBOX_NULL != mbuf) {
|
||||
mailbox_show_detail(mb, mbuf, (int)clear);
|
||||
} else {
|
||||
mailbox_out(("mail box show global channel config:"
|
||||
RT));
|
||||
while (MAILBOX_MAILCODE_INVALID != config->butt_id) {
|
||||
mailbox_show_general(config);
|
||||
config++;
|
||||
}
|
||||
|
||||
i = mb->log_prob;
|
||||
record = &mb->log_array[0];
|
||||
mailbox_out(("Latest error log track:" RT));
|
||||
mailbox_out(("error num, line num, file name" RT));
|
||||
do {
|
||||
|
||||
i = ((0 ==
|
||||
i) ? (MAILBOX_ERRO_ARRAY_NUM - 1) : (i -
|
||||
1));
|
||||
mailbox_out(("0x%-8x, %-8d, %-8s" RT,
|
||||
(unsigned int)record[i].erro_num,
|
||||
(unsigned int)(record[i].line),
|
||||
(record[i].file)));
|
||||
|
||||
} while (i != (mb->log_prob));
|
||||
mailbox_out(("track end." RT));
|
||||
}
|
||||
}
|
||||
|
||||
mailbox_out((":================================================:" RT));
|
||||
return MAILBOX_OK;
|
||||
}
|
||||
@@ -0,0 +1,213 @@
|
||||
#ifndef _DRV_MAILBOX_DEBUG_H_
|
||||
#define _DRV_MAILBOX_DEBUG_H_
|
||||
|
||||
#include "drv_mailbox_platform.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define MAILBOX_MAIL_TRANS_TIME_LIMIT (3000)
|
||||
#define MAILBOX_MAIL_DEAL_TIME_LIMIT (2000)
|
||||
#define MAILBOX_MAIL_SCHE_TIME_LIMIT (2000)
|
||||
|
||||
#define MAILBOX_ERRO_ARRAY_NUM (5)
|
||||
|
||||
#define MAILBOX_LOG_NONE (-1)
|
||||
#define MAILBOX_LOG_CRITICAL (0)
|
||||
#define MAILBOX_LOG_ERROR (1)
|
||||
#define MAILBOX_LOG_WARNING (2)
|
||||
#define MAILBOX_LOG_INFO (3)
|
||||
|
||||
#define MAILBOX_SHOW_ALL (0x001)
|
||||
#define MAILBOX_SHOW_CLEAR (0x010)
|
||||
|
||||
#define MAILBOX_QUEUE_LEFT_INVALID (0xffffffff)
|
||||
|
||||
#define MAILBOX_MAX_SLICE (0xffffffff)
|
||||
#define mailbox_get_slice_diff(s, e) (((e) >= (s))?((e) - (s)) : ((MAILBOX_MAX_SLICE - (s)) + (e)))
|
||||
|
||||
#if (MAILBOX_LOG_LEVEL == MAILBOX_LOG_NONE)
|
||||
#define mailbox_logerro_p0(ErrorId) (unsigned int)(ErrorId)
|
||||
|
||||
#define mailbox_logerro_p1(ErrorId, Param) (unsigned int)(ErrorId)
|
||||
|
||||
#define mailbox_logerro_p2(ErrorId, Param1, Param2) (unsigned int)(ErrorId)
|
||||
|
||||
#else
|
||||
#define mailbox_logerro_p0(ErrorId) mailbox_log_erro((unsigned int)ErrorId, (unsigned int)0, (unsigned int)0, \
|
||||
(unsigned int)_MAILBOX_LINE_, (char *)_MAILBOX_FILE_)
|
||||
|
||||
#define mailbox_logerro_p1(ErrorId, Param) mailbox_log_erro((unsigned int)ErrorId, (unsigned long)Param, (unsigned long)0, \
|
||||
(unsigned int)_MAILBOX_LINE_, (char *)_MAILBOX_FILE_)
|
||||
|
||||
#define mailbox_logerro_p2(ErrorId, Param1, Param2) mailbox_log_erro((unsigned int)ErrorId, (unsigned long)Param1, Param2, \
|
||||
(unsigned int)_MAILBOX_LINE_, (char *)_MAILBOX_FILE_)
|
||||
#endif
|
||||
|
||||
#define MAILBOX_CRIT_RET_START 0x80000001
|
||||
#define MAILBOX_CRIT_GUT_INVALID_USER_MAIL_HANDLE 0x80000002
|
||||
#define MAILBOX_CRIT_GUT_INIT_CHANNEL_POOL_TOO_SMALL 0x80000003
|
||||
#define MAILBOX_CRIT_GUT_INIT_USER_POOL_TOO_SMALL 0x80000004
|
||||
#define MAILBOX_CRIT_GUT_MUTEX_LOCK_FAILED 0x80000005
|
||||
#define MAILBOX_CRIT_GUT_MUTEX_UNLOCK_FAILED 0x80000006
|
||||
#define MAILBOX_CRIT_GUT_MSG_CHECK_FAIL 0x80000007
|
||||
#define MAILBOX_CRIT_GUT_RECEIVE_MAIL 0x80000008
|
||||
#define MAILBOX_CRIT_GUT_READ_MAIL 0x80000009
|
||||
#define MAILBOX_CRIT_GUT_MEMORY_CONFIG 0x8000000a
|
||||
#define MAILBOX_CRIT_PORT_CONFIG 0x80000010
|
||||
#define MAILBOX_CRIT_RET_END 0x800000ff
|
||||
|
||||
#define MAILBOX_ERR_RET_START 0x80000100
|
||||
#define MAILBOX_ERR_GUT_INVALID_CPU_LINK 0x80000101
|
||||
#define MAILBOX_ERR_GUT_INVALID_SRC_CPU 0x80000102
|
||||
#define MAILBOX_ERR_GUT_INVALID_TARGET_CPU 0x80000103
|
||||
#define MAILBOX_ERR_GUT_INVALID_CHANNEL_ID 0x80000104
|
||||
#define MAILBOX_ERR_GUT_INVALID_CARRIER_ID 0x80000105
|
||||
#define MAILBOX_ERR_GUT_REQUEST_CHANNEL 0x80000106
|
||||
#define MAILBOX_ERR_GUT_RELEASE_CHANNEL 0x80000107
|
||||
#define MAILBOX_ERR_GUT_TIMESTAMP_CHECK_FAIL 0x80000108
|
||||
#define MAILBOX_ERR_GUT_WRITE_EXCEED_MAX_SIZE 0x80000109
|
||||
#define MAILBOX_ERR_GUT_ALREADY_INIT 0x8000010a
|
||||
#define MAILBOX_ERR_GUT_SEND_MAIL_IN_INT_CONTEXT 0x8000010b
|
||||
#define MAILBOX_ERR_GUT_USER_BUFFER_SIZE_TOO_SMALL 0x8000010c
|
||||
#define MAILBOX_ERR_GUT_INPUT_PARAMETER 0x8000010d
|
||||
#define MAILBOX_ERR_GUT_NOT_INIT 0x8000010e
|
||||
#define MAILBOX_ERR_GUT_MAILBOX_SEQNUM_CHECK_FAIL 0x8000010f
|
||||
#define MAILBOX_ERR_GUT_MAILBOX_RECEIVE_FULL 0x80000110
|
||||
#define MAILBOX_ERR_GUT_INIT_PLATFORM 0x80000112
|
||||
#define MAILBOX_ERR_GUT_MAILBOX_NULL_PARAM 0x80000113
|
||||
#define MAILBOX_ERR_GUT_CREATE_BOX 0x80000114
|
||||
#define MAILBOX_ERR_GUT_MUTEX_CREATE_FAILED 0x80000115
|
||||
#define MAILBOX_ERR_GUT_READ_CALLBACK_NOT_FIND 0x80000116
|
||||
#define MAILBOX_ERR_GUT_INVALID_USER_ID 0x80000117
|
||||
#define MAILBOX_ERR_GUT_INIT_CHANNEL_POOL_TOO_LARGE 0x80000118
|
||||
#define MAILBOX_ERR_GUT_INIT_USER_POOL_TOO_LARGE 0x80000119
|
||||
#define MAILBOX_ERR_GUT_CALCULATE_SPACE 0x8000011a
|
||||
#define MAILBOX_ERR_GUT_INIT_CORESHARE_MEM 0x8000011b
|
||||
|
||||
#define MAILBOX_ERR_VXWORKS_TASK_CREATE 0x80000140
|
||||
#define MAILBOX_ERR_VXWORKS_CALLBACK_NOT_FIND 0x80000141
|
||||
#define MAILBOX_ERR_VXWORKS_CALLBACK_ERRO 0x80000142
|
||||
#define MAILBOX_ERR_VXWORKS_MAIL_TASK_NOT_FIND 0x80000143
|
||||
#define MAILBOX_ERR_VXWORKS_MAIL_INT_NOT_FIND 0x80000144
|
||||
#define MAILBOX_ERR_VXWORKS_CHANNEL_NOT_FIND 0x80000145
|
||||
#define MAILBOX_ERR_VXWORKS_ALLOC_MEMORY 0x80000146
|
||||
|
||||
#define MAILBOX_ERR_MCU_CHANNEL_NOT_FIND 0x80000160
|
||||
#define MAILBOX_ERR_MCU_ZOS_MSG_ALLOC_FAIL 0x80000161
|
||||
#define MAILBOX_ERR_MCU_ZOS_MSG_SEND_FAIL 0x80000162
|
||||
#define MAILBOX_ERR_MCU_ZOS_PID_NOT_FIND 0x80000163
|
||||
#define MAILBOX_ERR_MCU_ZOS_CBFUNC_NULL 0x80000164
|
||||
|
||||
#define MAILBOX_ERR_LINUX_TASK_CREATE 0x80000180
|
||||
#define MAILBOX_ERR_LINUX_CALLBACK_NOT_FIND 0x80000181
|
||||
#define MAILBOX_ERR_LINUX_CALLBACK_ERRO 0x80000182
|
||||
#define MAILBOX_ERR_LINUX_MAIL_TASK_NOT_FIND 0x80000183
|
||||
#define MAILBOX_ERR_LINUX_MAIL_INT_NOT_FIND 0x80000184
|
||||
#define MAILBOX_ERR_LINUX_CHANNEL_NOT_FIND 0x80000185
|
||||
#define MAILBOX_ERR_LINUX_ALLOC_MEMORY 0x80000186
|
||||
|
||||
#define MAILBOX_ERR_RET_END 0x800001ff
|
||||
|
||||
#define MAILBOX_WARNING_RET_START 0x80000200
|
||||
#define MAILBOX_WARNING_USER_CALLBACK_ALREADY_EXIST 0x80000201
|
||||
#define MAILBOX_WARNING_TRANSPORT_TIME_OUT 0x80000202
|
||||
#define MAILBOX_WARNING_RECEIVE_TIME_OUT 0x80000203
|
||||
#define MAILBOX_WARNING_SCHE_TIME_OUT 0x80000204
|
||||
#define MAILBOX_WARNING_RET_END 0x800002ff
|
||||
|
||||
#define MAILBOX_INFO_RET_START 0x80000300
|
||||
#define MAILBOX_INFO_RECEIVE_FIRST_MAIL 0x80000301
|
||||
#define MAILBOX_INFO_SEND_FIRST_MAIL 0x80000302
|
||||
#define MAILBOX_INFO_RET_END 0x800003ff
|
||||
|
||||
#define MAILBOX_BOARDST_USER_PROTECT1 (0x18273645)
|
||||
|
||||
#define MAILBOX_MCU_TEST_BUFF_SIZE 256
|
||||
|
||||
struct mb_st_msg {
|
||||
unsigned int protect;
|
||||
unsigned int length;
|
||||
unsigned int back_code;
|
||||
unsigned int test_id;
|
||||
};
|
||||
|
||||
enum MAILBOX_BOARDST_TEST_ID_E {
|
||||
MAILBOX_BOARDST_ID_LOOP_SEND,
|
||||
MAILBOX_BOARDST_ID_LOOP_BACK,
|
||||
MAILBOX_BOARDST_ID_LOOP_FINISH
|
||||
};
|
||||
|
||||
struct mb_log {
|
||||
unsigned int erro_num;
|
||||
unsigned long param1;
|
||||
unsigned long param2;
|
||||
unsigned int line;
|
||||
const char *file;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
unsigned int send_slice;
|
||||
unsigned int recv_slice;
|
||||
unsigned long mail_addr;
|
||||
unsigned short use_id;
|
||||
unsigned short reserved;
|
||||
} MAILBOX_TRACK_STRU;
|
||||
|
||||
struct mb_slice {
|
||||
unsigned int total;
|
||||
unsigned int start;
|
||||
unsigned int max;
|
||||
unsigned int code;
|
||||
unsigned int overflow;
|
||||
};
|
||||
|
||||
struct mb_mntn {
|
||||
unsigned int peak_traffic_left;
|
||||
|
||||
struct mb_slice trans;
|
||||
struct mb_slice deal;
|
||||
struct mb_slice sche;
|
||||
|
||||
unsigned int track_prob;
|
||||
MAILBOX_TRACK_STRU track_array[MAILBOX_RECORD_USEID_NUM];
|
||||
struct mb_buff *mbuff;
|
||||
};
|
||||
|
||||
extern MAILBOX_EXTERN int mailbox_log_erro(unsigned int err_no,
|
||||
unsigned long param1,
|
||||
unsigned long param2,
|
||||
unsigned int line_no,
|
||||
char *file_name);
|
||||
|
||||
MAILBOX_EXTERN void mailbox_record_send(struct mb_mntn *mntn,
|
||||
unsigned int mailcode,
|
||||
unsigned int time_stamp,
|
||||
unsigned long mail_addr);
|
||||
|
||||
MAILBOX_EXTERN void mailbox_record_transport(struct mb_mntn *mntn,
|
||||
unsigned int mailcode,
|
||||
unsigned int write_slice,
|
||||
unsigned int read_slice,
|
||||
unsigned long mail_addr);
|
||||
|
||||
MAILBOX_EXTERN void mailbox_record_receive(struct mb_mntn *mntn,
|
||||
unsigned int mailcode,
|
||||
unsigned int slice_start);
|
||||
|
||||
MAILBOX_EXTERN int mailbox_show(unsigned int channel,
|
||||
unsigned int show_all);
|
||||
|
||||
MAILBOX_EXTERN void mailbox_record_sche_send(void *priv);
|
||||
|
||||
MAILBOX_EXTERN void mailbox_record_sche_recv(void *priv);
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
#endif /*_DRV_MAILBOX_DEBUG_H_*/
|
||||
@@ -0,0 +1,981 @@
|
||||
#include "drv_mailbox_cfg.h"
|
||||
#include "drv_mailbox_platform.h"
|
||||
#include "drv_mailbox_debug.h"
|
||||
#include "drv_mailbox_gut.h"
|
||||
#include <asm/io.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/moduleparam.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/fb.h>
|
||||
#include <linux/console.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/kthread.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/string.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include<linux/vmalloc.h>
|
||||
#include <asm/io.h>
|
||||
#include <linux/mm.h>
|
||||
|
||||
extern int logMsg(char *fmt, ...);
|
||||
#undef _MAILBOX_FILE_
|
||||
#define _MAILBOX_FILE_ "gut"
|
||||
|
||||
#define SLICE_REG 0xFFF0A534
|
||||
#define mem_remap_nocache(phys_addr, size) mem_remap_type(phys_addr, size, pgprot_writecombine(PAGE_KERNEL))
|
||||
MAILBOX_EXTERN struct mb g_mailbox_handle = { MAILBOX_MAILCODE_INVALID };
|
||||
|
||||
void __iomem *g_shareMemBase;
|
||||
void *g_slice_reg;
|
||||
|
||||
MAILBOX_LOCAL int mailbox_init_mem(struct mb_cfg *config);
|
||||
|
||||
MAILBOX_EXTERN int mailbox_queue_write(struct mb_queue *queue,
|
||||
char *data, unsigned int size)
|
||||
{
|
||||
unsigned int SizeToBottom;
|
||||
|
||||
SizeToBottom =
|
||||
(unsigned int)((queue->base + queue->length) - queue->front);
|
||||
|
||||
if (SizeToBottom > size) {
|
||||
mailbox_memcpy((void *)queue->front, (const void *)data, size);
|
||||
|
||||
queue->front += size;
|
||||
} else {
|
||||
mailbox_memcpy((void *)(queue->front), (const void *)data,
|
||||
SizeToBottom);
|
||||
|
||||
mailbox_memcpy((void *)(queue->base),
|
||||
(const void *)(data + SizeToBottom),
|
||||
(size - SizeToBottom));
|
||||
|
||||
queue->front = (queue->base + size) - SizeToBottom;
|
||||
}
|
||||
|
||||
return (int)size;
|
||||
}
|
||||
|
||||
MAILBOX_GLOBAL int mailbox_queue_read(struct mb_queue *queue,
|
||||
char *buff, unsigned int size)
|
||||
{
|
||||
unsigned int to_bottom;
|
||||
|
||||
to_bottom = (unsigned int)((queue->base + queue->length) - queue->rear);
|
||||
|
||||
if (to_bottom > size) {
|
||||
mailbox_memcpy((void *)buff, (const void *)(queue->rear), size);
|
||||
|
||||
queue->rear += size;
|
||||
} else {
|
||||
mailbox_memcpy((void *)buff, (const void *)(queue->rear),
|
||||
to_bottom);
|
||||
|
||||
mailbox_memcpy((void *)(buff + to_bottom),
|
||||
(const void *)(queue->base), (size - to_bottom));
|
||||
|
||||
queue->rear = (queue->base + size) - to_bottom;
|
||||
}
|
||||
|
||||
return (int)size;
|
||||
}
|
||||
|
||||
MAILBOX_LOCAL int mailbox_check_mail(struct mb_buff *mbuff,
|
||||
struct mb_mail *msg_head,
|
||||
unsigned long data_addr)
|
||||
{
|
||||
unsigned int time_stamp;
|
||||
unsigned int seq_num;
|
||||
int ret_val = MAILBOX_OK;
|
||||
if (MAILBOX_MSGHEAD_NUMBER != msg_head->ulPartition) {
|
||||
ret_val =
|
||||
mailbox_logerro_p1(MAILBOX_CRIT_GUT_MSG_CHECK_FAIL,
|
||||
msg_head->ulMailCode);
|
||||
}
|
||||
|
||||
seq_num = mbuff->seq_num;
|
||||
|
||||
if (MAILBOX_SEQNUM_START == msg_head->ulSeqNum) {
|
||||
ret_val =
|
||||
mailbox_logerro_p1(MAILBOX_INFO_RECEIVE_FIRST_MAIL,
|
||||
msg_head->ulMailCode);
|
||||
} else if ((seq_num + 1) != msg_head->ulSeqNum) {
|
||||
ret_val =
|
||||
mailbox_logerro_p1
|
||||
(MAILBOX_ERR_GUT_MAILBOX_SEQNUM_CHECK_FAIL,
|
||||
msg_head->ulMailCode);
|
||||
}
|
||||
|
||||
mbuff->seq_num = msg_head->ulSeqNum;
|
||||
|
||||
time_stamp = (unsigned int)mailbox_get_timestamp();
|
||||
|
||||
msg_head->ulReadSlice = time_stamp;
|
||||
|
||||
mailbox_record_transport(&(mbuff->mntn), msg_head->ulMailCode,
|
||||
msg_head->ulWriteSlice, msg_head->ulReadSlice,
|
||||
data_addr);
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
MAILBOX_EXTERN struct mb *mailbox_get_mb(void)
|
||||
{
|
||||
if (MAILBOX_INIT_MAGIC == g_mailbox_handle.init_flag) {
|
||||
return &g_mailbox_handle;
|
||||
}
|
||||
|
||||
mailbox_out(("error: mb not init\n"));
|
||||
return MAILBOX_NULL;
|
||||
}
|
||||
|
||||
MAILBOX_EXTERN struct mb_buff *mailbox_get_channel_handle(struct mb *mailbox,
|
||||
unsigned int mailcode)
|
||||
{
|
||||
struct mb_link *link_array = MAILBOX_NULL;
|
||||
struct mb_buff *mbuff = MAILBOX_NULL;
|
||||
unsigned int src_id = 0;
|
||||
unsigned int dst_id = 0;
|
||||
unsigned int carrier_id = 0;
|
||||
|
||||
src_id = mailbox_get_src_id(mailcode);
|
||||
dst_id = mailbox_get_dst_id(mailcode);
|
||||
carrier_id = mailbox_get_carrier_id(mailcode);
|
||||
|
||||
if (src_id == mailbox->local_id) {
|
||||
if (dst_id < MAILBOX_CPUID_BUTT) {
|
||||
link_array = &mailbox->send_tbl[dst_id];
|
||||
} else {
|
||||
(void)
|
||||
mailbox_logerro_p1
|
||||
(MAILBOX_ERR_GUT_INVALID_CHANNEL_ID, mailcode);
|
||||
return MAILBOX_NULL;
|
||||
}
|
||||
} else if (dst_id == mailbox->local_id) {
|
||||
if (src_id < MAILBOX_CPUID_BUTT) {
|
||||
link_array = &mailbox->recv_tbl[src_id];
|
||||
} else {
|
||||
(void)
|
||||
mailbox_logerro_p1
|
||||
(MAILBOX_ERR_GUT_INVALID_CHANNEL_ID, mailcode);
|
||||
return MAILBOX_NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if ((MAILBOX_NULL == link_array) || (0 == link_array->carrier_butt)) {
|
||||
(void)mailbox_logerro_p1(MAILBOX_ERR_GUT_INVALID_CPU_LINK,
|
||||
mailcode);
|
||||
return MAILBOX_NULL;
|
||||
}
|
||||
|
||||
if (carrier_id < link_array->carrier_butt) {
|
||||
mbuff = &link_array->channel_buff[carrier_id];
|
||||
} else {
|
||||
(void)mailbox_logerro_p1(MAILBOX_ERR_GUT_INVALID_CARRIER_ID,
|
||||
mailcode);
|
||||
return MAILBOX_NULL;
|
||||
}
|
||||
|
||||
if (mailbox_get_use_id(mailcode) >=
|
||||
mailbox_get_use_id(mbuff->config->butt_id)) {
|
||||
(void)mailbox_logerro_p1(MAILBOX_ERR_GUT_INVALID_USER_ID,
|
||||
mailcode);
|
||||
|
||||
return MAILBOX_NULL;
|
||||
}
|
||||
|
||||
return mbuff;
|
||||
}
|
||||
|
||||
MAILBOX_LOCAL int mailbox_request_channel(struct mb *mb,
|
||||
struct mb_buff **mb_buf,
|
||||
unsigned int mailcode)
|
||||
{
|
||||
struct mb_head *head = MAILBOX_NULL;
|
||||
struct mb_queue *queue = MAILBOX_NULL;
|
||||
struct mb_buff *mbuff = MAILBOX_NULL;
|
||||
int ret_val = MAILBOX_OK;
|
||||
|
||||
mailbox_dpm_device_get();
|
||||
|
||||
*mb_buf = MAILBOX_NULL;
|
||||
mbuff = mailbox_get_channel_handle(mb, mailcode);
|
||||
if (MAILBOX_NULL == mbuff) {
|
||||
ret_val = (int)MAILBOX_ERRO;
|
||||
goto request_erro;
|
||||
}
|
||||
|
||||
head = (struct mb_head *)mbuff->config->head_addr;
|
||||
if (((MAILBOX_PROTECT1 != head->ulProtectWord1))
|
||||
|| (MAILBOX_PROTECT2 != head->ulProtectWord2)
|
||||
|| (MAILBOX_PROTECT1 != head->ulProtectWord3)
|
||||
|| (MAILBOX_PROTECT2 != head->ulProtectWord4)) {
|
||||
/* do not check cause hifi maybe not pwr on when the first ipc message send */
|
||||
|
||||
mailbox_init_mem(mbuff->config);
|
||||
|
||||
mailbox_logerro_p1(MAILBOX_NOT_READY, mailcode);
|
||||
}
|
||||
|
||||
if (mailbox_get_src_id(mailcode) == mb->local_id) {
|
||||
if (MAILBOX_TRUE == mailbox_int_context()) {
|
||||
ret_val =
|
||||
mailbox_logerro_p1
|
||||
(MAILBOX_ERR_GUT_SEND_MAIL_IN_INT_CONTEXT,
|
||||
mailcode);
|
||||
goto request_erro;
|
||||
} else {
|
||||
if (MAILBOX_OK != mailbox_mutex_lock(&mbuff->mutex)) {
|
||||
ret_val =
|
||||
mailbox_logerro_p1
|
||||
(MAILBOX_CRIT_GUT_MUTEX_LOCK_FAILED,
|
||||
mailcode);
|
||||
goto request_erro;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
mbuff->mailcode = mailcode;
|
||||
|
||||
queue = &mbuff->mail_queue;
|
||||
queue->front = queue->base + head->ulFront * sizeof(unsigned int);
|
||||
queue->rear = queue->base + head->ulRear * sizeof(unsigned int);
|
||||
|
||||
mbuff->mb = mb;
|
||||
*mb_buf = mbuff;
|
||||
return MAILBOX_OK;
|
||||
request_erro:
|
||||
mailbox_out(("###mailbox_request_channel ERR! \n"));
|
||||
mailbox_dpm_device_put();
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
MAILBOX_LOCAL int mailbox_release_channel(struct mb *mb, struct mb_buff *mbuff)
|
||||
{
|
||||
unsigned int channel_id = mbuff->channel_id;
|
||||
|
||||
if (mb->local_id == mailbox_get_src_id(channel_id)) {
|
||||
if (MAILBOX_TRUE == mailbox_int_context()) {
|
||||
} else {
|
||||
mailbox_mutex_unlock(&mbuff->mutex);
|
||||
}
|
||||
}
|
||||
|
||||
mailbox_dpm_device_put();
|
||||
return MAILBOX_OK;
|
||||
}
|
||||
|
||||
MAILBOX_LOCAL int mailbox_read_mail(struct mb_buff *mbuff)
|
||||
{
|
||||
struct mb_mail mail;
|
||||
struct mb_cb *read_cb = MAILBOX_NULL;
|
||||
struct mb_queue tmp_queue;
|
||||
struct mb_queue *usr_queue = MAILBOX_NULL;
|
||||
struct mb_queue *m_queue = MAILBOX_NULL;
|
||||
unsigned int use_id;
|
||||
unsigned int slice_start;
|
||||
unsigned int to_bottom;
|
||||
void *usr_handle;
|
||||
void *usr_data;
|
||||
void (*usr_func) (void *mbuf, void *handle, void *data);
|
||||
|
||||
m_queue = &(mbuff->mail_queue);
|
||||
usr_queue = &(mbuff->usr_queue);
|
||||
mailbox_memcpy((void *)usr_queue, (const void *)m_queue,
|
||||
sizeof(struct mb_queue));
|
||||
|
||||
tmp_queue.base = usr_queue->base;
|
||||
tmp_queue.length = usr_queue->length;
|
||||
tmp_queue.front = usr_queue->rear;
|
||||
tmp_queue.rear = usr_queue->front;
|
||||
|
||||
mailbox_queue_read(usr_queue, (char *)&mail, sizeof(struct mb_mail));
|
||||
|
||||
mailbox_check_mail(mbuff, &mail, m_queue->rear);
|
||||
|
||||
mailbox_queue_write(&tmp_queue, (char *)&mail, sizeof(struct mb_mail));
|
||||
use_id = mailbox_get_use_id(mail.ulMailCode);
|
||||
|
||||
if (use_id >= mailbox_get_use_id(mbuff->config->butt_id)) {
|
||||
(void)mailbox_logerro_p1(MAILBOX_ERR_GUT_INVALID_USER_ID,
|
||||
mail.ulMailCode);
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
read_cb = &mbuff->read_cb[use_id];
|
||||
mailbox_mutex_lock(&mbuff->mutex);
|
||||
usr_handle = read_cb->handle;
|
||||
usr_data = read_cb->data;
|
||||
usr_func = read_cb->func;
|
||||
mailbox_mutex_unlock(&mbuff->mutex);
|
||||
if (MAILBOX_NULL != usr_func) {
|
||||
usr_queue->size = mail.ulMsgLength;
|
||||
slice_start = (unsigned int)mailbox_get_timestamp();
|
||||
usr_func(mbuff, usr_handle, usr_data);
|
||||
|
||||
mailbox_record_receive(&mbuff->mntn, mail.ulMailCode,
|
||||
slice_start);
|
||||
} else {
|
||||
(void)mailbox_logerro_p1(MAILBOX_ERR_GUT_READ_CALLBACK_NOT_FIND,
|
||||
mail.ulMailCode);
|
||||
}
|
||||
|
||||
EXIT:
|
||||
|
||||
to_bottom =
|
||||
(unsigned int)((m_queue->base + m_queue->length) - m_queue->rear);
|
||||
if (to_bottom > (mail.ulMsgLength + sizeof(struct mb_mail))) {
|
||||
m_queue->rear += (mail.ulMsgLength + sizeof(struct mb_mail));
|
||||
} else {
|
||||
m_queue->rear = m_queue->base + ((mail.ulMsgLength +
|
||||
sizeof(struct mb_mail)) -
|
||||
to_bottom);
|
||||
}
|
||||
|
||||
m_queue->rear = mailbox_align_size(m_queue->rear, MAILBOX_ALIGN);
|
||||
|
||||
return (int)(mailbox_align_size(mail.ulMsgLength, MAILBOX_ALIGN)
|
||||
+ sizeof(struct mb_mail));
|
||||
|
||||
}
|
||||
|
||||
MAILBOX_LOCAL int mailbox_receive_all_mails(struct mb_buff *mbuf)
|
||||
{
|
||||
|
||||
struct mb_queue *queue;
|
||||
signed int size_left;
|
||||
unsigned int mail_len = 0;
|
||||
int ret_val = MAILBOX_OK;
|
||||
|
||||
queue = &(mbuf->mail_queue);
|
||||
|
||||
if (queue->front >= queue->rear) {
|
||||
size_left = (signed int)(queue->front - queue->rear);
|
||||
} else {
|
||||
size_left = (signed int)((queue->length) - ((queue->rear)
|
||||
- (queue->front)));
|
||||
}
|
||||
|
||||
while (size_left > 0) {
|
||||
mail_len = (unsigned int)mailbox_read_mail(mbuf);
|
||||
if (0 == mail_len) {
|
||||
ret_val =
|
||||
mailbox_logerro_p1(MAILBOX_CRIT_GUT_READ_MAIL,
|
||||
mbuf->channel_id);
|
||||
}
|
||||
size_left -= (signed int)(mail_len);
|
||||
}
|
||||
|
||||
if (size_left < 0) {
|
||||
return mailbox_logerro_p1(MAILBOX_CRIT_GUT_RECEIVE_MAIL,
|
||||
mbuf->channel_id);
|
||||
}
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
MAILBOX_LOCAL int mailbox_read_channel(unsigned int channel_id)
|
||||
{
|
||||
struct mb_buff *mbuf = MAILBOX_NULL;
|
||||
struct mb *mb = MAILBOX_NULL;
|
||||
int ret_val = MAILBOX_OK;
|
||||
|
||||
mb = mailbox_get_mb();
|
||||
|
||||
if (MAILBOX_NULL == mb) {
|
||||
return (int)MAILBOX_ERRO;
|
||||
}
|
||||
|
||||
if (mb->local_id != mailbox_get_dst_id(channel_id)) {
|
||||
return mailbox_logerro_p1(MAILBOX_ERR_GUT_INVALID_TARGET_CPU,
|
||||
channel_id);
|
||||
}
|
||||
|
||||
ret_val = mailbox_request_channel(mb, &mbuf, channel_id);
|
||||
if (MAILBOX_OK != ret_val) {
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
ret_val = mailbox_receive_all_mails(mbuf);
|
||||
|
||||
mailbox_flush_buff(mbuf);
|
||||
|
||||
if (MAILBOX_OK != mailbox_release_channel(mb, mbuf)) {
|
||||
return mailbox_logerro_p1(MAILBOX_ERR_GUT_RELEASE_CHANNEL,
|
||||
channel_id);
|
||||
}
|
||||
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
MAILBOX_LOCAL int mailbox_init_mem(struct mb_cfg *config)
|
||||
{
|
||||
struct mb_head *head = (struct mb_head *)config->head_addr;
|
||||
unsigned long data_addr = config->data_addr;
|
||||
unsigned int data_size = config->data_size;
|
||||
|
||||
if ((0 == data_addr) || (MAILBOX_NULL == head) || (0 == data_size)) {
|
||||
return mailbox_logerro_p1(MAILBOX_ERR_GUT_INIT_CORESHARE_MEM,
|
||||
config->butt_id);
|
||||
}
|
||||
|
||||
mailbox_memset((signed char *)data_addr, 0, data_size);
|
||||
|
||||
mailbox_write_reg(data_addr, MAILBOX_PROTECT1);
|
||||
mailbox_write_reg(data_addr + MAILBOX_PROTECT_LEN, MAILBOX_PROTECT2);
|
||||
|
||||
mailbox_write_reg((data_addr + data_size) - (2 * MAILBOX_PROTECT_LEN),
|
||||
MAILBOX_PROTECT1);
|
||||
mailbox_write_reg((data_addr + data_size) - MAILBOX_PROTECT_LEN,
|
||||
MAILBOX_PROTECT2);
|
||||
|
||||
head->ulFront = 0;
|
||||
head->ulFrontslice = 0;
|
||||
head->ulRear = head->ulFront;
|
||||
head->ulRearslice = 0;
|
||||
head->ulProtectWord4 = MAILBOX_PROTECT2;
|
||||
head->ulProtectWord3 = MAILBOX_PROTECT1;
|
||||
head->ulProtectWord2 = MAILBOX_PROTECT2;
|
||||
head->ulProtectWord1 = MAILBOX_PROTECT1;
|
||||
|
||||
return MAILBOX_OK;
|
||||
}
|
||||
|
||||
MAILBOX_LOCAL int mailbox_calculate_space(struct mb *mb,
|
||||
struct mb_cfg *config,
|
||||
unsigned int cpu_id)
|
||||
{
|
||||
struct mb_link *send_link = MAILBOX_NULL;
|
||||
struct mb_link *recev_link = MAILBOX_NULL;
|
||||
int ret_val = MAILBOX_OK;
|
||||
unsigned int src_id = 0;
|
||||
unsigned int dst_id = 0;
|
||||
unsigned int carrier_id = 0;
|
||||
|
||||
send_link = mb->send_tbl;
|
||||
recev_link = mb->recv_tbl;
|
||||
|
||||
while (MAILBOX_MAILCODE_INVALID != config->butt_id) {
|
||||
src_id = mailbox_get_src_id(config->butt_id);
|
||||
dst_id = mailbox_get_dst_id(config->butt_id);
|
||||
carrier_id = mailbox_get_carrier_id(config->butt_id);
|
||||
|
||||
if (cpu_id == src_id) {
|
||||
if (dst_id < MAILBOX_CPUID_BUTT) {
|
||||
if ((carrier_id + 1) >
|
||||
send_link[dst_id].carrier_butt) {
|
||||
send_link[dst_id].carrier_butt =
|
||||
(carrier_id + 1);
|
||||
}
|
||||
} else {
|
||||
ret_val =
|
||||
mailbox_logerro_p1
|
||||
(MAILBOX_ERR_GUT_INVALID_CHANNEL_ID,
|
||||
config->butt_id);
|
||||
}
|
||||
}
|
||||
if (cpu_id == dst_id) {
|
||||
if (src_id < MAILBOX_CPUID_BUTT) {
|
||||
if ((carrier_id + 1) >
|
||||
recev_link[src_id].carrier_butt) {
|
||||
recev_link[src_id].carrier_butt =
|
||||
(carrier_id + 1);
|
||||
}
|
||||
} else {
|
||||
ret_val =
|
||||
mailbox_logerro_p1
|
||||
(MAILBOX_ERR_GUT_INVALID_CHANNEL_ID,
|
||||
config->butt_id);
|
||||
}
|
||||
}
|
||||
|
||||
config++;
|
||||
}
|
||||
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
MAILBOX_LOCAL int mailbox_init_all_handle(struct mb *mb,
|
||||
struct mb_cfg *config,
|
||||
unsigned int cpu_id)
|
||||
{
|
||||
struct mb_queue *queue = MAILBOX_NULL;
|
||||
unsigned int direct = MIALBOX_DIRECTION_INVALID;
|
||||
int ret_val = MAILBOX_OK;
|
||||
struct mb_link *send_link = MAILBOX_NULL;
|
||||
struct mb_link *recv_link = MAILBOX_NULL;
|
||||
struct mb_buff *mbuf_prob = &g_mailbox_channel_handle_pool[0];
|
||||
struct mb_cb *cb_prob = &g_mailbox_user_cb_pool[0];
|
||||
struct mb_buff *mbuf_cur = MAILBOX_NULL;
|
||||
unsigned int channel_sum = 0;
|
||||
unsigned int use_sum = 0;
|
||||
unsigned int src_id = 0;
|
||||
unsigned int dst_id = 0;
|
||||
unsigned int carrier_id = 0;
|
||||
unsigned int use_max = 0;
|
||||
|
||||
send_link = mb->send_tbl;
|
||||
recv_link = mb->recv_tbl;
|
||||
|
||||
while (MAILBOX_MAILCODE_INVALID != config->butt_id) {
|
||||
direct = MIALBOX_DIRECTION_INVALID;
|
||||
src_id = mailbox_get_src_id(config->butt_id);
|
||||
dst_id = mailbox_get_dst_id(config->butt_id);
|
||||
carrier_id = mailbox_get_carrier_id(config->butt_id);
|
||||
use_max = mailbox_get_use_id(config->butt_id);
|
||||
|
||||
printk
|
||||
("******************func = %s line = %d src_id = %d dst_id = %d******************\n",
|
||||
__func__, __LINE__, src_id, dst_id);
|
||||
|
||||
if (cpu_id == src_id) {
|
||||
direct = MIALBOX_DIRECTION_SEND;
|
||||
|
||||
if (MAILBOX_NULL == send_link[dst_id].channel_buff) {
|
||||
send_link[dst_id].channel_buff = mbuf_prob;
|
||||
mbuf_prob += (send_link[dst_id].carrier_butt);
|
||||
channel_sum += (send_link[dst_id].carrier_butt);
|
||||
if (channel_sum > MAILBOX_CHANNEL_NUM) {
|
||||
return
|
||||
mailbox_logerro_p1
|
||||
(MAILBOX_CRIT_GUT_INIT_CHANNEL_POOL_TOO_SMALL,
|
||||
channel_sum);
|
||||
}
|
||||
}
|
||||
mbuf_cur = &send_link[dst_id].channel_buff[carrier_id];
|
||||
}
|
||||
|
||||
if (cpu_id == dst_id) {
|
||||
direct = MIALBOX_DIRECTION_RECEIVE;
|
||||
|
||||
if (MAILBOX_NULL == recv_link[src_id].channel_buff) {
|
||||
recv_link[src_id].channel_buff = mbuf_prob;
|
||||
mbuf_prob += (recv_link[src_id].carrier_butt);
|
||||
channel_sum += (recv_link[src_id].carrier_butt);
|
||||
if (channel_sum > MAILBOX_CHANNEL_NUM) {
|
||||
return
|
||||
mailbox_logerro_p1
|
||||
(MAILBOX_CRIT_GUT_INIT_CHANNEL_POOL_TOO_SMALL,
|
||||
channel_sum);
|
||||
}
|
||||
}
|
||||
|
||||
mbuf_cur = &recv_link[src_id].channel_buff[carrier_id];
|
||||
|
||||
mbuf_cur->read_cb = cb_prob;
|
||||
cb_prob += use_max;
|
||||
use_sum += use_max;
|
||||
if (use_sum > MAILBOX_USER_NUM) {
|
||||
return
|
||||
mailbox_logerro_p1
|
||||
(MAILBOX_CRIT_GUT_INIT_USER_POOL_TOO_SMALL,
|
||||
use_sum);
|
||||
}
|
||||
|
||||
ret_val =
|
||||
mailbox_process_register(mailbox_get_channel_id
|
||||
(config->butt_id),
|
||||
mailbox_read_channel,
|
||||
mbuf_cur);
|
||||
|
||||
ret_val |= mailbox_init_mem(config);
|
||||
|
||||
}
|
||||
|
||||
if ((MIALBOX_DIRECTION_INVALID != direct)
|
||||
&& (MAILBOX_NULL != mbuf_cur)) {
|
||||
mbuf_cur->channel_id =
|
||||
mailbox_get_channel_id(config->butt_id);
|
||||
mbuf_cur->seq_num = MAILBOX_SEQNUM_START;
|
||||
mbuf_cur->mntn.peak_traffic_left =
|
||||
MAILBOX_QUEUE_LEFT_INVALID;
|
||||
mbuf_cur->mntn.mbuff = mbuf_cur;
|
||||
mbuf_cur->config = config;
|
||||
|
||||
queue = &(mbuf_cur->mail_queue);
|
||||
|
||||
queue->length = mbuf_cur->config->data_size -
|
||||
(MAILBOX_DATA_LEN_PROTECT_NUM *
|
||||
MAILBOX_PROTECT_LEN);
|
||||
queue->base =
|
||||
mbuf_cur->config->data_addr +
|
||||
(MAILBOX_DATA_BASE_PROTECT_NUM *
|
||||
MAILBOX_PROTECT_LEN);
|
||||
|
||||
ret_val =
|
||||
mailbox_channel_register(mailbox_get_channel_id
|
||||
(config->butt_id),
|
||||
config->int_src,
|
||||
mailbox_get_dst_id(config->
|
||||
butt_id),
|
||||
direct, &mbuf_cur->mutex);
|
||||
}
|
||||
|
||||
config++;
|
||||
}
|
||||
|
||||
/*g_mailbox_global_cfg_tbl[];
|
||||
g_mailbox_channel_handle_pool[MAILBOX_CHANNEL_NUM];
|
||||
g_mailbox_user_cb_pool[MAILBOX_USER_NUM];
|
||||
*/
|
||||
if ((unsigned int)MAILBOX_CHANNEL_NUM != channel_sum) {
|
||||
ret_val =
|
||||
mailbox_logerro_p1
|
||||
(MAILBOX_ERR_GUT_INIT_CHANNEL_POOL_TOO_LARGE,
|
||||
((MAILBOX_CHANNEL_NUM << 16) | channel_sum));
|
||||
}
|
||||
|
||||
if (MAILBOX_USER_NUM != use_sum) {
|
||||
ret_val =
|
||||
mailbox_logerro_p1(MAILBOX_ERR_GUT_INIT_USER_POOL_TOO_LARGE,
|
||||
use_sum);
|
||||
}
|
||||
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
MAILBOX_LOCAL int mailbox_create_box(struct mb *mb,
|
||||
struct mb_cfg *config, unsigned int cpu_id)
|
||||
{
|
||||
mb->local_id = cpu_id;
|
||||
|
||||
printk("<<<<<<<<<<<<<<mailbox_create_box cpu_id = %d>>>>>>>>>>>>>>\n",
|
||||
cpu_id);
|
||||
|
||||
if (MAILBOX_OK != mailbox_calculate_space(mb, config, cpu_id)) {
|
||||
return mailbox_logerro_p0(MAILBOX_ERR_GUT_CALCULATE_SPACE);
|
||||
}
|
||||
|
||||
return mailbox_init_all_handle(mb, config, cpu_id);
|
||||
}
|
||||
|
||||
void *mem_remap_type(unsigned long phys_addr, size_t size, pgprot_t pgprot)
|
||||
{
|
||||
int i;
|
||||
u8 *vaddr;
|
||||
int npages =
|
||||
PAGE_ALIGN((phys_addr & (PAGE_SIZE - 1)) + size) >> PAGE_SHIFT;
|
||||
unsigned long offset = phys_addr & (PAGE_SIZE - 1);
|
||||
struct page **pages;
|
||||
pages = vmalloc(sizeof(struct page *) * npages);
|
||||
if (!pages) {
|
||||
printk(KERN_ERR "%s: vmalloc return NULL!\n", __FUNCTION__);
|
||||
return NULL;
|
||||
}
|
||||
pages[0] = phys_to_page(phys_addr);
|
||||
for (i = 0; i < npages - 1; i++) {
|
||||
pages[i + 1] = pages[i] + 1;
|
||||
}
|
||||
vaddr = (u8 *) vmap(pages, npages, VM_MAP, pgprot);
|
||||
if (vaddr == 0) {
|
||||
printk(KERN_ERR "%s: vmap return NULL!\n", __FUNCTION__);
|
||||
} else {
|
||||
vaddr += offset;
|
||||
}
|
||||
vfree(pages);
|
||||
printk(KERN_DEBUG
|
||||
"%s: phys_addr:0x%08lx size:0x%08lx npages:%d vaddr:%pK offset:0x%08lx\n",
|
||||
__FUNCTION__, phys_addr, (unsigned long)size, npages, vaddr,
|
||||
offset);
|
||||
return (void *)vaddr;
|
||||
}
|
||||
|
||||
MAILBOX_GLOBAL int mailbox_init(void)
|
||||
{
|
||||
unsigned long offset = 0;
|
||||
int i = 0;
|
||||
struct mb_head *head = NULL;
|
||||
|
||||
if (MAILBOX_INIT_MAGIC == g_mailbox_handle.init_flag) {
|
||||
return mailbox_logerro_p1(MAILBOX_ERR_GUT_ALREADY_INIT,
|
||||
g_mailbox_handle.init_flag);
|
||||
}
|
||||
|
||||
printk("func = %s, line = %d baseaddr = 0x%x\n", __func__, __LINE__,
|
||||
(unsigned int)MAILBOX_MEM_BASEADDR);
|
||||
|
||||
g_shareMemBase =
|
||||
mem_remap_nocache(MAILBOX_MEM_BASEADDR, MAILBOX_MEM_LENGTH);
|
||||
|
||||
if (NULL == g_shareMemBase) {
|
||||
printk("func = %s, mmap mailbox mem error!!\n", __func__);
|
||||
return mailbox_logerro_p0(MAILBOX_CRIT_GUT_MEMORY_CONFIG);
|
||||
}
|
||||
|
||||
offset = (unsigned long)g_shareMemBase - MAILBOX_MEM_BASEADDR;
|
||||
for (i = 0; i < MAILBOX_GLOBAL_CHANNEL_NUM; i++) {
|
||||
g_mailbox_global_cfg_tbl[i].head_addr =
|
||||
g_mailbox_global_cfg_tbl[i].head_addr + offset;
|
||||
g_mailbox_global_cfg_tbl[i].data_addr =
|
||||
g_mailbox_global_cfg_tbl[i].data_addr + offset;
|
||||
|
||||
printk("i = %d, head_addr = 0x%lx, data_addr = 0x%lx\n", i,
|
||||
g_mailbox_global_cfg_tbl[i].head_addr,
|
||||
g_mailbox_global_cfg_tbl[i].data_addr);
|
||||
|
||||
head = (struct mb_head *)g_mailbox_global_cfg_tbl[i].head_addr;
|
||||
head->ulFront = 0x0;
|
||||
head->ulRear = 0x0;
|
||||
head->ulFrontslice = 0x0;
|
||||
head->ulRearslice = 0x0;
|
||||
}
|
||||
|
||||
mailbox_memset(&g_mailbox_handle, 0x00, sizeof(struct mb));
|
||||
|
||||
if ((MAILBOX_HEAD_BOTTOM_ADDR >
|
||||
(MAILBOX_MEM_BASEADDR + MAILBOX_MEM_HEAD_LEN))
|
||||
|| (MAILBOX_MEMORY_BOTTOM_ADDR >
|
||||
(MAILBOX_MEM_BASEADDR + MAILBOX_MEM_LENGTH))) {
|
||||
mailbox_out(("mailbox address overflow: headbuttom valid(0x%lx), config(0x%x)!\n\
|
||||
\r databuttom valid(0x%x), config(0x%x)!" RT,
|
||||
(MAILBOX_MEM_BASEADDR + MAILBOX_MEM_HEAD_LEN), (unsigned int)MAILBOX_HEAD_BOTTOM_ADDR, (unsigned int)(MAILBOX_MEM_BASEADDR + MAILBOX_MEM_LENGTH),
|
||||
(unsigned int)MAILBOX_MEMORY_BOTTOM_ADDR));
|
||||
return mailbox_logerro_p0(MAILBOX_CRIT_GUT_MEMORY_CONFIG);
|
||||
}
|
||||
|
||||
if (MAILBOX_OK != mailbox_create_box(&g_mailbox_handle,
|
||||
&g_mailbox_global_cfg_tbl[0],
|
||||
MAILBOX_LOCAL_CPUID)) {
|
||||
return mailbox_logerro_p0(MAILBOX_ERR_GUT_CREATE_BOX);
|
||||
}
|
||||
|
||||
if (MAILBOX_OK != mailbox_init_platform()) {
|
||||
return mailbox_logerro_p0(MAILBOX_ERR_GUT_INIT_PLATFORM);
|
||||
}
|
||||
|
||||
g_mailbox_handle.init_flag = MAILBOX_INIT_MAGIC;
|
||||
|
||||
/*mailbox_ifc_test_init();*/
|
||||
|
||||
/*fixme: there isn't go to unremap*/
|
||||
g_slice_reg = (void *)ioremap(SLICE_REG, 0x4);
|
||||
if (NULL == g_slice_reg) {
|
||||
printk("ioremap of slice reg fail.\n");
|
||||
}
|
||||
|
||||
mailbox_out(("mb init OK!\n"));
|
||||
|
||||
return MAILBOX_OK;
|
||||
}
|
||||
|
||||
MAILBOX_EXTERN int mailbox_register_cb(unsigned int mailcode,
|
||||
void (*cb) (void *mbuf, void *handle,
|
||||
void *data),
|
||||
void *usr_handle, void *usr_data)
|
||||
{
|
||||
struct mb_cb *read_cb = MAILBOX_NULL;
|
||||
struct mb_buff *mbuf = MAILBOX_NULL;
|
||||
struct mb *mb = MAILBOX_NULL;
|
||||
unsigned int dst_id;
|
||||
|
||||
mb = &g_mailbox_handle;
|
||||
|
||||
dst_id = mailbox_get_dst_id(mailcode);
|
||||
|
||||
printk("mb->local_id = %d dst_id = %d\n", mb->local_id, dst_id);
|
||||
|
||||
if (mb->local_id != dst_id) {
|
||||
return mailbox_logerro_p1(MAILBOX_ERR_GUT_INVALID_TARGET_CPU,
|
||||
mailcode);
|
||||
}
|
||||
|
||||
mbuf = mailbox_get_channel_handle(mb, mailcode);
|
||||
if (MAILBOX_NULL == mbuf) {
|
||||
return mailbox_logerro_p1(MAILBOX_ERR_GUT_INVALID_CHANNEL_ID,
|
||||
mailcode);
|
||||
}
|
||||
|
||||
read_cb = &mbuf->read_cb[mailbox_get_use_id(mailcode)];
|
||||
if (MAILBOX_NULL != read_cb->func) {
|
||||
/*mailbox_logerro_p1(MAILBOX_WARNING_USER_CALLBACK_ALREADY_EXIST, mailcode); */
|
||||
}
|
||||
|
||||
mailbox_mutex_lock(&mbuf->mutex);
|
||||
read_cb->handle = usr_handle;
|
||||
read_cb->data = usr_data;
|
||||
read_cb->func = cb;
|
||||
mailbox_mutex_unlock(&mbuf->mutex);
|
||||
|
||||
return MAILBOX_OK;
|
||||
}
|
||||
|
||||
MAILBOX_EXTERN int mailbox_init_usr_queue(struct mb_buff *mb_buf)
|
||||
{
|
||||
unsigned int hsize = sizeof(struct mb_mail);
|
||||
struct mb_queue *usrqu = &mb_buf->usr_queue;
|
||||
|
||||
mailbox_memcpy((void *)usrqu, (const void *)&mb_buf->mail_queue,
|
||||
sizeof(struct mb_queue));
|
||||
if (hsize >
|
||||
mailbox_queue_left(usrqu->rear, usrqu->front, usrqu->length)) {
|
||||
return mailbox_logerro_p1(MAILBOX_FULL, mb_buf->mailcode);
|
||||
}
|
||||
|
||||
if (hsize + usrqu->front >= usrqu->base + usrqu->length) {
|
||||
usrqu->front = usrqu->front + hsize - usrqu->length;
|
||||
} else {
|
||||
usrqu->front = usrqu->front + hsize;
|
||||
}
|
||||
return MAILBOX_OK;
|
||||
}
|
||||
|
||||
MAILBOX_EXTERN int mailbox_request_buff(unsigned int mailcode, void *mb_buf)
|
||||
{
|
||||
struct mb *mailbox = MAILBOX_NULL;
|
||||
int ret_val = MAILBOX_OK;
|
||||
struct mb_buff **mbuf = (struct mb_buff **)mb_buf;
|
||||
|
||||
mailbox = mailbox_get_mb();
|
||||
*mbuf = MAILBOX_NULL;
|
||||
if (MAILBOX_NULL == mailbox) {
|
||||
return mailbox_logerro_p1(MAILBOX_ERR_GUT_INPUT_PARAMETER,
|
||||
mailcode);
|
||||
}
|
||||
|
||||
if (mailbox->local_id != mailbox_get_src_id(mailcode)) {
|
||||
return mailbox_logerro_p1(MAILBOX_ERR_GUT_INVALID_SRC_CPU,
|
||||
mailcode);
|
||||
}
|
||||
|
||||
ret_val = mailbox_request_channel(mailbox, mbuf, mailcode);
|
||||
if (MAILBOX_OK == ret_val) {
|
||||
(*mbuf)->mb = mailbox;
|
||||
ret_val = mailbox_init_usr_queue(*mbuf);
|
||||
if (MAILBOX_OK == ret_val) {
|
||||
return MAILBOX_OK;
|
||||
} else {
|
||||
mailbox_release_channel(mailbox, *mbuf);
|
||||
*mbuf = MAILBOX_NULL;
|
||||
return ret_val;
|
||||
}
|
||||
} else {
|
||||
return ret_val;
|
||||
}
|
||||
}
|
||||
|
||||
MAILBOX_EXTERN int mailbox_write_buff(struct mb_queue *queue,
|
||||
char *data, unsigned int size)
|
||||
{
|
||||
if ((size <=
|
||||
mailbox_queue_left(queue->rear, queue->front, queue->length))
|
||||
&& (size + sizeof(struct mb_mail) <=
|
||||
mailbox_queue_left(queue->rear, queue->front, queue->length))
|
||||
) {
|
||||
return mailbox_queue_write(queue, (char *)data, size);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
MAILBOX_EXTERN int mailbox_read_buff(struct mb_queue *queue,
|
||||
char *data, unsigned int size)
|
||||
{
|
||||
return mailbox_queue_read(queue, (char *)data, size);
|
||||
}
|
||||
|
||||
MAILBOX_EXTERN int mailbox_sealup_buff(struct mb_buff *mb_buf,
|
||||
unsigned int usr_size)
|
||||
{
|
||||
|
||||
struct mb_mail mail = { 0 };
|
||||
struct mb_queue *m_queue = MAILBOX_NULL;
|
||||
unsigned int time_stamp;
|
||||
unsigned long mail_addr;
|
||||
|
||||
m_queue = &mb_buf->mail_queue;
|
||||
|
||||
if (usr_size > (mb_buf->config->single_max - sizeof(struct mb_mail))) {
|
||||
return (int)
|
||||
mailbox_logerro_p2(MAILBOX_ERR_GUT_WRITE_EXCEED_MAX_SIZE,
|
||||
usr_size, mb_buf->mailcode);
|
||||
} else {
|
||||
}
|
||||
|
||||
time_stamp = (unsigned int)mailbox_get_timestamp();
|
||||
mail.ulPartition = MAILBOX_MSGHEAD_NUMBER;
|
||||
mail.ulWriteSlice = time_stamp;
|
||||
mail.ulReadSlice = 0;
|
||||
mail.ulPriority = 0;
|
||||
mail.ulSeqNum = mb_buf->seq_num;
|
||||
mail.ulMsgLength = usr_size;
|
||||
mail.ulMailCode = mb_buf->mailcode;
|
||||
|
||||
if (MAILBOX_SEQNUM_START == mb_buf->seq_num) {
|
||||
(void)mailbox_logerro_p1(MAILBOX_INFO_SEND_FIRST_MAIL,
|
||||
mb_buf->mailcode);
|
||||
}
|
||||
|
||||
mb_buf->seq_num++;
|
||||
|
||||
mail_addr = m_queue->front;
|
||||
mailbox_queue_write(m_queue, (char *)(&mail), sizeof(struct mb_mail));
|
||||
|
||||
m_queue->front =
|
||||
mailbox_align_size(mb_buf->usr_queue.front, MAILBOX_ALIGN);
|
||||
|
||||
mailbox_flush_buff(mb_buf);
|
||||
|
||||
mailbox_record_send(&(mb_buf->mntn), mb_buf->mailcode, time_stamp,
|
||||
mail_addr);
|
||||
|
||||
return mailbox_init_usr_queue(mb_buf);
|
||||
}
|
||||
|
||||
MAILBOX_EXTERN int mailbox_flush_buff(struct mb_buff *mbuff)
|
||||
{
|
||||
struct mb_head *head = MAILBOX_NULL;
|
||||
struct mb_queue *queue = MAILBOX_NULL;
|
||||
unsigned int channel_id = mbuff->channel_id;
|
||||
struct mb *mb = mbuff->mb;
|
||||
head = (struct mb_head *)mbuff->config->head_addr;
|
||||
queue = &mbuff->mail_queue;
|
||||
|
||||
if (mb->local_id == mailbox_get_src_id(channel_id)) {
|
||||
head->ulFront =
|
||||
(unsigned int)(queue->front -
|
||||
queue->base) / sizeof(unsigned int);
|
||||
head->ulFrontslice = (unsigned int)mailbox_get_timestamp();
|
||||
|
||||
} else if (mb->local_id == mailbox_get_dst_id(channel_id)) {
|
||||
head->ulRear =
|
||||
(unsigned int)(queue->rear -
|
||||
queue->base) / sizeof(unsigned int);
|
||||
head->ulRearslice = (unsigned int)mailbox_get_timestamp();
|
||||
}
|
||||
|
||||
return MAILBOX_OK;
|
||||
}
|
||||
|
||||
MAILBOX_EXTERN int mailbox_send_buff(struct mb_buff *mbuf)
|
||||
{
|
||||
return mailbox_delivery(mbuf->channel_id);
|
||||
}
|
||||
|
||||
MAILBOX_EXTERN int mailbox_release_buff(struct mb_buff *mbuf)
|
||||
{
|
||||
return mailbox_release_channel(mbuf->mb, mbuf);
|
||||
}
|
||||
|
||||
MAILBOX_EXTERN unsigned long mailbox_virt_to_phy(unsigned long virt_addr)
|
||||
{
|
||||
unsigned long offset = 0;
|
||||
if (NULL == g_shareMemBase) {
|
||||
g_shareMemBase =
|
||||
ioremap(MAILBOX_MEM_BASEADDR, MAILBOX_MEM_LENGTH);
|
||||
}
|
||||
offset = (unsigned long)g_shareMemBase - MAILBOX_MEM_BASEADDR;
|
||||
|
||||
return (virt_addr - offset);
|
||||
}
|
||||
|
||||
MAILBOX_EXTERN unsigned long mailbox_phy_to_virt(unsigned long phy_addr)
|
||||
{
|
||||
unsigned long offset = 0;
|
||||
if (NULL == g_shareMemBase) {
|
||||
g_shareMemBase =
|
||||
ioremap(MAILBOX_MEM_BASEADDR, MAILBOX_MEM_LENGTH);
|
||||
}
|
||||
offset = (unsigned long)g_shareMemBase - MAILBOX_MEM_BASEADDR;
|
||||
|
||||
return (phy_addr + offset);
|
||||
}
|
||||
@@ -0,0 +1,170 @@
|
||||
#ifndef __DRV_MAILBOX_GUT_H__
|
||||
#define __DRV_MAILBOX_GUT_H__
|
||||
|
||||
#include "drv_mailbox_platform.h"
|
||||
#include "drv_mailbox_debug.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define MAILBOX_GLOBAL_CHANNEL_NUM (4)
|
||||
|
||||
#define MAILBOX_SINGLE_ID_MASK (0xFF)
|
||||
#define mailbox_get_channel_id(id) ((id) & (~MAILBOX_SINGLE_ID_MASK))
|
||||
|
||||
#define mailbox_get_src_id(id) (unsigned char)(((id) >> MAILBOX_ID_SRC_CPU_OFFSET) & MAILBOX_SINGLE_ID_MASK)
|
||||
|
||||
#define mailbox_get_dst_id(id) (unsigned char)(((id) >> MAILBOX_ID_DST_CPU_OFFSET) & MAILBOX_SINGLE_ID_MASK)
|
||||
|
||||
#define mailbox_get_carrier_id(id) (unsigned char)(((id) >> MAILBOX_ID_CHANNEL_OFFSET) & MAILBOX_SINGLE_ID_MASK)
|
||||
|
||||
#define mailbox_get_use_id(id) (unsigned char)((id) & MAILBOX_SINGLE_ID_MASK)
|
||||
|
||||
#define MAILBOX_INIT_MAGIC (0x87654312)
|
||||
|
||||
#define MAILBOX_ALIGN sizeof(unsigned int)
|
||||
#define mailbox_align_size(a, p) (((a)+((p)-1)) & ~((p)-1))
|
||||
|
||||
#define mailbox_write_reg(Addr, Value) (*((volatile unsigned int *)(Addr)) = Value)
|
||||
|
||||
#define MAILBOX_CPU_NUM (MAILBOX_CPUID_BUTT)
|
||||
|
||||
#define MAILBOX_CHANNEL_BUTT(src, dst) (MAILBOX_CHANNEL_##src##2##dst##_BUTT & 0xff) /*& 0xff Ïûpclint */
|
||||
|
||||
#define MAILBOX_USER_BUTT(src, dst, channel) \
|
||||
((unsigned int)MAILBOX_MAILCODE_ITEM_END(src, dst, channel) & 0xff)
|
||||
|
||||
#define MAILBOX_CHANNEL_COMPOSE(src, dst, ch) \
|
||||
/*channel*/ \
|
||||
{(unsigned int)MAILBOX_MAILCODE_ITEM_END(src, dst, ch), \
|
||||
/*DataSize*/ \
|
||||
(unsigned int)MAILBOX_QUEUE_SIZE(src, dst, ch), \
|
||||
/*SingleMax*/ \
|
||||
(unsigned int)MAILBOX_MAILSIZE_MAX(src, dst, ch), \
|
||||
/*HeadAddr*/ \
|
||||
(unsigned long)MAILBOX_HEAD_ADDR(src, dst, ch), \
|
||||
/*DataAddr*/ \
|
||||
(unsigned long)MAILBOX_QUEUE_ADDR(src, dst, ch),\
|
||||
/*IPC INT NUMBER*/ \
|
||||
(unsigned int)MAILBOX_IPC_INT_NUM(src, dst, ch)}
|
||||
|
||||
#define MAILBOX_USER_QUEUE(mbuf) (&((struct mb_buff *)(mbuf))->usr_queue)
|
||||
|
||||
#define mailbox_queue_left(Rear, Front, Length) \
|
||||
(((Rear) > (Front)) ? (((Rear) - (Front)) - sizeof(unsigned int)) : \
|
||||
(((Length) - ((Front) - (Rear))) - sizeof(unsigned int)))
|
||||
|
||||
typedef struct mb_queue {
|
||||
unsigned long base;
|
||||
unsigned int length;
|
||||
unsigned long front;
|
||||
unsigned long rear;
|
||||
unsigned int size;
|
||||
} mailbox_queue_stru;
|
||||
|
||||
struct mailbox_id_stru {
|
||||
signed char UseId;
|
||||
signed char Channel;
|
||||
signed char DstCpu;
|
||||
signed char SrcCpu;
|
||||
};
|
||||
|
||||
struct mb_cb {
|
||||
void (*func) (void *mbuf, void *handle, void *data);
|
||||
void *handle;
|
||||
void *data;
|
||||
};
|
||||
|
||||
typedef struct mb_cfg {
|
||||
unsigned int butt_id;
|
||||
unsigned int data_size;
|
||||
unsigned int single_max;
|
||||
unsigned long head_addr;
|
||||
unsigned long data_addr;
|
||||
unsigned int int_src;
|
||||
} MAILBOX_CHANNEL_CFG_STRU;
|
||||
|
||||
struct mb_buff {
|
||||
unsigned int channel_id;
|
||||
unsigned int mailcode;
|
||||
unsigned int seq_num;
|
||||
void *mutex;
|
||||
struct mb *mb;
|
||||
struct mb_cb *read_cb;
|
||||
struct mb_cfg *config;
|
||||
#ifdef MAILBOX_OPEN_MNTN
|
||||
struct mb_mntn mntn;
|
||||
#endif
|
||||
struct mb_queue mail_queue;
|
||||
struct mb_queue usr_queue;
|
||||
};
|
||||
|
||||
typedef struct mb_link {
|
||||
unsigned int carrier_butt;
|
||||
struct mb_buff *channel_buff;
|
||||
} MAILBOX_LINK_STRU;
|
||||
|
||||
typedef struct mb {
|
||||
unsigned int local_id;
|
||||
unsigned int init_flag;
|
||||
unsigned int log_prob;
|
||||
struct mb_log log_array[MAILBOX_ERRO_ARRAY_NUM];
|
||||
struct mb_link send_tbl[MAILBOX_CPUID_BUTT];
|
||||
struct mb_link recv_tbl[MAILBOX_CPUID_BUTT];
|
||||
} MAILBOX_STRU;
|
||||
|
||||
extern MAILBOX_EXTERN struct mb_cfg g_mailbox_global_cfg_tbl[];
|
||||
|
||||
extern MAILBOX_EXTERN struct mb_buff
|
||||
g_mailbox_channel_handle_pool[MAILBOX_CHANNEL_NUM];
|
||||
|
||||
extern MAILBOX_EXTERN struct mb_cb
|
||||
g_mailbox_user_cb_pool[MAILBOX_USER_NUM];
|
||||
|
||||
extern MAILBOX_EXTERN struct mb g_mailbox_handle;
|
||||
MAILBOX_EXTERN struct mb *mailbox_get_mb(void);
|
||||
|
||||
MAILBOX_EXTERN struct mb_buff *mailbox_get_channel_handle(struct mb *mb,
|
||||
unsigned int
|
||||
mailcode);
|
||||
|
||||
MAILBOX_EXTERN int mailbox_register_cb(unsigned int mail_code,
|
||||
void (*cb) (void *mbuf,
|
||||
void *handle,
|
||||
void *data),
|
||||
void *usr_handle,
|
||||
void *usr_data);
|
||||
|
||||
MAILBOX_EXTERN int mailbox_request_buff(unsigned int mailcode,
|
||||
void *mbuf);
|
||||
|
||||
MAILBOX_EXTERN int mailbox_sealup_buff(struct mb_buff *mb_buf,
|
||||
unsigned int usr_size);
|
||||
|
||||
MAILBOX_EXTERN int mailbox_flush_buff(struct mb_buff *mbuff);
|
||||
|
||||
MAILBOX_EXTERN int mailbox_send_buff(struct mb_buff *mb_buf);
|
||||
|
||||
MAILBOX_EXTERN int mailbox_release_buff(struct mb_buff *mb_buf);
|
||||
|
||||
MAILBOX_EXTERN int mailbox_write_buff(struct mb_queue *queue,
|
||||
char *data, unsigned int size);
|
||||
|
||||
MAILBOX_EXTERN int mailbox_read_buff(struct mb_queue *queue,
|
||||
char *data, unsigned int size);
|
||||
|
||||
MAILBOX_EXTERN unsigned long mailbox_virt_to_phy(unsigned long
|
||||
virt_addr);
|
||||
|
||||
MAILBOX_EXTERN unsigned long mailbox_phy_to_virt(unsigned long
|
||||
phy_addr);
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
#endif /* end of drv_mailbox.h */
|
||||
@@ -0,0 +1,385 @@
|
||||
#include "drv_mailbox_cfg.h"
|
||||
#include "drv_mailbox_debug.h"
|
||||
#include "drv_mailbox_gut.h"
|
||||
#include "drv_mailbox_ifc.h"
|
||||
#include "drv_mailbox_msg.h"
|
||||
|
||||
#undef _MAILBOX_FILE_
|
||||
#define _MAILBOX_FILE_ "ifc"
|
||||
/*extern int BSP_CPU_StateGet(int CpuID);*/
|
||||
int mailbox_ifc_get_rcode(unsigned int scode)
|
||||
{
|
||||
unsigned int src_id = mailbox_get_src_id(scode);
|
||||
unsigned int dst_id = mailbox_get_dst_id(scode);
|
||||
/*unsigned long carrier_id = mailbox_get_carrier_id(scode); */
|
||||
|
||||
return (int)((dst_id << MAILBOX_ID_SRC_CPU_OFFSET)
|
||||
| (src_id << MAILBOX_ID_DST_CPU_OFFSET)
|
||||
/*|(carrier_id << MAILBOX_ID_CHANNEL_OFFSET) */
|
||||
);
|
||||
}
|
||||
|
||||
int mailbox_ifc_buf_pad(struct ifc_mb *ifc_b, unsigned int datalen)
|
||||
{
|
||||
struct mb_queue *que = (MAILBOX_USER_QUEUE(ifc_b->mbuf));
|
||||
|
||||
unsigned int talsize;
|
||||
|
||||
talsize = sizeof(struct ifc_head) + datalen;
|
||||
/*ifc_b->head.lmsg = talsize; */
|
||||
|
||||
if ((que->front + sizeof(struct ifc_head)) >= que->base + que->length) {
|
||||
/*ifc_b->head.data = que->front + sizeof(struct ifc_head) - que->length; */
|
||||
ifc_b->data_vitrual_addr =
|
||||
que->front + sizeof(struct ifc_head) - que->length;
|
||||
} else {
|
||||
if ((que->front + talsize) >= que->base + que->length) {
|
||||
/*ifc_b->head.data = que->base; */
|
||||
ifc_b->data_vitrual_addr = que->base;
|
||||
talsize += (unsigned int)((que->base + que->length) -
|
||||
(que->front +
|
||||
sizeof(struct ifc_head)));
|
||||
} else {
|
||||
/*ifc_b->head.data = que->front + sizeof(struct ifc_head); */
|
||||
ifc_b->data_vitrual_addr =
|
||||
que->front + sizeof(struct ifc_head);
|
||||
}
|
||||
}
|
||||
|
||||
if (talsize >
|
||||
(unsigned int)mailbox_queue_left(que->rear, que->front,
|
||||
que->length)) {
|
||||
|
||||
return mailbox_logerro_p1(MAILBOX_FULL, datalen);
|
||||
}
|
||||
|
||||
ifc_b->total_size = talsize;
|
||||
ifc_b->data_size = datalen;
|
||||
return MAILBOX_OK;
|
||||
}
|
||||
|
||||
int mailbox_ifc_send_buf(struct ifc_mb *ifc_b)
|
||||
{
|
||||
int ret_val = 0;
|
||||
unsigned long ifc_data = 0;
|
||||
struct mb_queue *que = (MAILBOX_USER_QUEUE(ifc_b->mbuf));
|
||||
|
||||
ifc_data = ifc_b->data_vitrual_addr;
|
||||
|
||||
ifc_b->head.data_phy_addr =
|
||||
(unsigned int)mailbox_virt_to_phy(ifc_b->data_vitrual_addr);
|
||||
|
||||
mailbox_write_buff(que, (char *)&ifc_b->head, sizeof(struct ifc_head));
|
||||
|
||||
que->front = ifc_data + ifc_b->data_size;
|
||||
|
||||
if (MAILBOX_OK == mailbox_sealup_buff(ifc_b->mbuf, ifc_b->total_size)) {
|
||||
ret_val = mailbox_send_buff(ifc_b->mbuf);
|
||||
} else {
|
||||
ret_val = (int)MAILBOX_ERRO;
|
||||
}
|
||||
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
void mailbox_ifc_waiter(void *mbuf, void *usrhandle, void *data)
|
||||
{
|
||||
struct ifc_mb *ifc_b = (struct ifc_mb *)usrhandle;
|
||||
struct mb_queue *queue = MAILBOX_USER_QUEUE(mbuf);
|
||||
struct ifc_head head_r;
|
||||
|
||||
int i;
|
||||
|
||||
mailbox_read_buff(queue, (char *)&head_r, sizeof(struct ifc_head));
|
||||
|
||||
if (head_r.stamp == ifc_b->head.stamp) {
|
||||
for (i = 0; i < IFC_MAX_ARG; i++) {
|
||||
if (ifc_b->argo[i].addr) {
|
||||
mailbox_memcpy((void *)(unsigned long)ifc_b->
|
||||
argo[i].addr,
|
||||
(const void *)
|
||||
mailbox_phy_to_virt((unsigned
|
||||
long)
|
||||
(head_r.
|
||||
argv[i])),
|
||||
(ifc_b->argo[i].size));
|
||||
}
|
||||
}
|
||||
|
||||
ifc_b->head.retval = head_r.retval;
|
||||
mailbox_complete(&ifc_b->waitsem);
|
||||
}
|
||||
}
|
||||
|
||||
int mailbox_ifc_send_wait(struct ifc_mb *ifc_b, unsigned int timeout)
|
||||
{
|
||||
unsigned int rcode = ifc_b->head.rcode;
|
||||
|
||||
if (MAILBOX_OK != mailbox_register_cb(rcode, mailbox_ifc_waiter, ifc_b,
|
||||
MAILBOX_NULL)) {
|
||||
goto wait_exit;
|
||||
}
|
||||
|
||||
ifc_b->waitsem = mailbox_init_completion();
|
||||
if (MAILBOX_NULL == ifc_b->waitsem) {
|
||||
goto wait_exit;
|
||||
}
|
||||
if (MAILBOX_OK != mailbox_ifc_send_buf(ifc_b)) {
|
||||
goto wait_exit;
|
||||
}
|
||||
|
||||
if (MAILBOX_OK != mailbox_wait_completion(&ifc_b->waitsem, timeout)) {
|
||||
ifc_b->head.retval = MAILBOX_TIME_OUT;
|
||||
|
||||
mailbox_register_cb(rcode, MAILBOX_NULL, MAILBOX_NULL,
|
||||
MAILBOX_NULL);
|
||||
}
|
||||
|
||||
wait_exit:
|
||||
mailbox_del_completion(&ifc_b->waitsem);
|
||||
mailbox_release_buff(ifc_b->mbuf);
|
||||
|
||||
return (int)(ifc_b->head.retval);
|
||||
}
|
||||
|
||||
int mailbox_ifc_send_no_wait(struct ifc_mb *ifc_b)
|
||||
{
|
||||
int ret = mailbox_ifc_send_buf(ifc_b);
|
||||
|
||||
ret |= mailbox_release_buff(ifc_b->mbuf);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int mailbox_ifc_discard_buf(struct ifc_mb *ifc_b)
|
||||
{
|
||||
int ret = mailbox_release_buff(ifc_b->mbuf);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void mailbox_ifc_executer(void *mbuf, void *handle, void *data)
|
||||
{
|
||||
int (*ife) (struct ifc_head *ifc_h) = handle;
|
||||
struct ifc_head head;
|
||||
|
||||
struct mb_queue *queue = MAILBOX_USER_QUEUE(mbuf);
|
||||
(void)mailbox_read_buff(queue, (char *)&head, sizeof(struct ifc_head));
|
||||
|
||||
/*head.data = mailbox_phy_to_virt(head.data); */
|
||||
if (ife) {
|
||||
ife(&head);
|
||||
}
|
||||
}
|
||||
|
||||
int mailbox_ifc_register_exec(unsigned int mailcode,
|
||||
int (*ife_cb) (struct ifc_head *ifc_h)
|
||||
)
|
||||
{
|
||||
return mailbox_register_cb(mailcode, mailbox_ifc_executer,
|
||||
(void *)ife_cb,
|
||||
(void *)(unsigned long)mailcode);
|
||||
}
|
||||
|
||||
int mailbox_ifc_init_buf(struct ifc_mb *ifc_b,
|
||||
unsigned int mailcode,
|
||||
unsigned int direct,
|
||||
unsigned int inlen, unsigned int timeout)
|
||||
{
|
||||
int ret_val = MAILBOX_OK;
|
||||
int try_times = 0;
|
||||
unsigned int go_on = MAILBOX_FALSE;
|
||||
|
||||
mailbox_memset(ifc_b, 0x00, sizeof(struct ifc_mb));
|
||||
ifc_b->head.scode = mailcode;
|
||||
ifc_b->head.retval = MAILBOX_ERRO;
|
||||
|
||||
ret_val = (int)BSP_CPU_StateGet(mailbox_get_dst_id(mailcode));
|
||||
if (!ret_val) {
|
||||
return (int)MAILBOX_TARGET_NOT_READY;
|
||||
}
|
||||
|
||||
if (timeout) {
|
||||
ifc_b->head.needret = MAILBOX_TRUE;
|
||||
}
|
||||
|
||||
if (IFC_LAUNCH == direct) {
|
||||
ifc_b->head.rcode =
|
||||
(unsigned int)mailbox_ifc_get_rcode(mailcode);
|
||||
ifc_b->head.stamp = (unsigned int)mailbox_get_timestamp();
|
||||
} else if (IFC_RESPONSE == direct) {
|
||||
ifc_b->head.rcode = 0;
|
||||
}
|
||||
|
||||
do {
|
||||
ret_val = mailbox_request_buff(mailcode, (void *)&ifc_b->mbuf);
|
||||
if (ifc_b->mbuf) {
|
||||
ret_val = mailbox_ifc_buf_pad(ifc_b, inlen);
|
||||
}
|
||||
|
||||
if ((int)MAILBOX_FULL == ret_val) {
|
||||
go_on =
|
||||
(unsigned int)
|
||||
mailbox_scene_delay(MAILBOX_DELAY_SCENE_IFC_FULL,
|
||||
&try_times);
|
||||
if (ifc_b->mbuf) {
|
||||
mailbox_release_buff(ifc_b->mbuf);
|
||||
ifc_b->mbuf = MAILBOX_NULL;
|
||||
}
|
||||
} else {
|
||||
go_on = MAILBOX_FALSE;
|
||||
}
|
||||
|
||||
} while (MAILBOX_TRUE == go_on);
|
||||
|
||||
if (MAILBOX_OK != ret_val) {
|
||||
if (MAILBOX_NULL != ifc_b->mbuf) {
|
||||
mailbox_release_buff(ifc_b->mbuf);
|
||||
}
|
||||
/*mailbox_show(mailcode,0); */
|
||||
/*mailbox_assert(mailcode); */
|
||||
return mailbox_logerro_p1(ret_val, mailcode);
|
||||
}
|
||||
|
||||
return MAILBOX_OK;
|
||||
}
|
||||
|
||||
void __ifc_arg_out(struct ifc_arg **p_ary, unsigned int db, unsigned long ab,
|
||||
unsigned int sb, unsigned int af)
|
||||
{
|
||||
struct ifc_arg *ary = *p_ary;
|
||||
if ((IFC_OUT & db) || (IFC_BI & db)) {
|
||||
ary->addr = ab;
|
||||
if (IFC_FIX & db) {
|
||||
ary->size = sb;
|
||||
} else if (IFC_VAR & db) {
|
||||
ary->size = af;
|
||||
}
|
||||
}
|
||||
*p_ary = *p_ary + 1;
|
||||
}
|
||||
|
||||
void __ifc_push_arg(unsigned long *in, unsigned int **p_av, unsigned int db,
|
||||
unsigned long ab, unsigned int sb, unsigned int af)
|
||||
{
|
||||
|
||||
unsigned int *av = *p_av;
|
||||
*av = ab;
|
||||
if ((IFC_IN & db) || (IFC_BI & db)) {
|
||||
if (IFC_CNT & db) {
|
||||
*(unsigned int *)(*in) = (unsigned int)ab;
|
||||
*in += ifc_align_size(sizeof(unsigned int), IFC_ALIGN);
|
||||
} else if (IFC_FIX & db) {
|
||||
mailbox_memcpy((void *)*in, (const void *)ab, sb);
|
||||
*in += ifc_align_size(sb, IFC_ALIGN);
|
||||
} else if (IFC_VAR & db) {
|
||||
mailbox_memcpy((void *)*in, (const void *)ab, af);
|
||||
*in += ifc_align_size(af, IFC_ALIGN);
|
||||
}
|
||||
}
|
||||
*p_av = *p_av + 1;
|
||||
}
|
||||
|
||||
int __ifc_in_size(unsigned int db, unsigned int sb, unsigned int af)
|
||||
{
|
||||
if ((IFC_IN & db) || (IFC_BI & db)) {
|
||||
if (IFC_CNT & db) {
|
||||
return ifc_align_size(sizeof(unsigned int), IFC_ALIGN);
|
||||
} else if (IFC_FIX & db) {
|
||||
return (int)ifc_align_size(sb, IFC_ALIGN);
|
||||
} else if (IFC_VAR & db) {
|
||||
return (int)ifc_align_size(af, IFC_ALIGN);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int __ifc_out_size(unsigned int db, unsigned int sb, unsigned int **pp_a)
|
||||
{
|
||||
unsigned int size = 0;
|
||||
if ((IFC_OUT & db) || (IFC_BI & db)) {
|
||||
if (IFC_FIX & db) {
|
||||
size = ifc_align_size(sb, IFC_ALIGN);
|
||||
} else if (IFC_VAR & db) {
|
||||
unsigned int v_sz = *(unsigned int *)(*pp_a + 1);
|
||||
size = ifc_align_size(v_sz, IFC_ALIGN);
|
||||
}
|
||||
}
|
||||
*pp_a = *pp_a + 1;
|
||||
return (int)size;
|
||||
}
|
||||
|
||||
long __ifc_gen_arg(unsigned long *in, unsigned long *out, unsigned int db,
|
||||
unsigned int sb, unsigned int **pp_a)
|
||||
{
|
||||
unsigned long ret_val = 0;
|
||||
unsigned int v_sz = 0;
|
||||
if (IFC_VAR & db) {
|
||||
v_sz = *(unsigned int *)(*pp_a + 1);
|
||||
}
|
||||
|
||||
if (IFC_IN & db) {
|
||||
if (IFC_CNT & db) {
|
||||
ret_val = *(unsigned int *)*in;
|
||||
*in = *in + sizeof(unsigned int);
|
||||
} else if (IFC_FIX & db) {
|
||||
ret_val = *in;
|
||||
*in = *in + ifc_align_size(sb, IFC_ALIGN);
|
||||
} else if (IFC_VAR & db) {
|
||||
ret_val = *in;
|
||||
*in = *in + ifc_align_size(v_sz, IFC_ALIGN);
|
||||
}
|
||||
} else if (IFC_BI & db) {
|
||||
if (IFC_FIX & db) {
|
||||
ret_val = *in;
|
||||
*in = *in + ifc_align_size(sb, IFC_ALIGN);
|
||||
*out = *out + ifc_align_size(sb, IFC_ALIGN);
|
||||
} else if (IFC_VAR & db) {
|
||||
ret_val = *in;
|
||||
*in = *in + ifc_align_size(v_sz, IFC_ALIGN);
|
||||
*out = *out + ifc_align_size(v_sz, IFC_ALIGN);
|
||||
}
|
||||
} else if (IFC_OUT & db) {
|
||||
ret_val = *out;
|
||||
if (IFC_FIX & db) {
|
||||
*out = *out + ifc_align_size(sb, IFC_ALIGN);
|
||||
} else if (IFC_VAR & db) {
|
||||
*out = *out + ifc_align_size(v_sz, IFC_ALIGN);
|
||||
}
|
||||
}
|
||||
*pp_a = *pp_a + 1;
|
||||
return (long)ret_val;
|
||||
}
|
||||
|
||||
void __ifc_copy_arg(unsigned long *in, unsigned long *out, unsigned int db,
|
||||
unsigned int sb, unsigned int **p_av, unsigned int **p_ao)
|
||||
{
|
||||
unsigned int cpsize = 0;
|
||||
unsigned int *av = *p_av;
|
||||
unsigned int *ao = *p_ao;
|
||||
|
||||
*ao = 0;
|
||||
if (IFC_FIX & db) {
|
||||
cpsize = ifc_align_size(sb, IFC_ALIGN);
|
||||
} else if (IFC_VAR & db) {
|
||||
unsigned int v_sz = *(av + 1);
|
||||
cpsize = ifc_align_size(v_sz, IFC_ALIGN);
|
||||
} else if (IFC_CNT & db) {
|
||||
cpsize = sizeof(unsigned int);
|
||||
}
|
||||
|
||||
if (IFC_BI & db) {
|
||||
mailbox_memcpy((void *)(*out), (const void *)(*in),
|
||||
(unsigned int)cpsize);
|
||||
*ao = (unsigned int)mailbox_virt_to_phy(*out);
|
||||
*out += cpsize;
|
||||
*in += cpsize;
|
||||
} else if (IFC_IN & db) {
|
||||
*in += cpsize;
|
||||
} else if (IFC_OUT & db) {
|
||||
*ao = (unsigned int)mailbox_virt_to_phy(*out);
|
||||
*out += cpsize;
|
||||
}
|
||||
|
||||
*p_av = *p_av + 1;
|
||||
*p_ao = *p_ao + 1;
|
||||
}
|
||||
@@ -0,0 +1,296 @@
|
||||
#ifndef __DRV_MAILBOX_IFC_H__
|
||||
#define __DRV_MAILBOX_IFC_H__
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define IFC_IN 0x1
|
||||
#define IFC_OUT 0x2
|
||||
#define IFC_BI 0x4
|
||||
|
||||
#define IFC_CNT (0x1 << 8)
|
||||
#define IFC_FIX (0x2 << 8)
|
||||
#define IFC_VAR (0x4 << 8)
|
||||
|
||||
#define IFC_INCNT (IFC_IN | IFC_CNT)
|
||||
#define IFC_INFIX (IFC_IN | IFC_FIX)
|
||||
#define IFC_OUTFIX (IFC_OUT | IFC_FIX)
|
||||
#define IFC_BIFIX (IFC_BI | IFC_FIX)
|
||||
#define IFC_INVAR (IFC_IN | IFC_VAR)
|
||||
#define IFC_OUTVAR (IFC_OUT | IFC_VAR)
|
||||
#define IFC_BIVAR (IFC_BI | IFC_VAR)
|
||||
|
||||
#define IFC_MAX_ARG (6)
|
||||
|
||||
#define IFC_LAUNCH 0
|
||||
#define IFC_RESPONSE 1
|
||||
|
||||
#define IFC_INLINE static __inline
|
||||
|
||||
#define IFC_WAIT_FOREVER (0xffffffff)
|
||||
|
||||
#ifdef _DRV_LLT_
|
||||
#define IFC_DEBUG_PARAM
|
||||
#endif
|
||||
|
||||
#ifdef IFC_DEBUG_PARAM
|
||||
#define _ifc_chk_arg(ph, db, sb) __ifc_chk_arg(ph, db, sb)
|
||||
#define _ifc_dbg_arg(ph, db, sb, df) __ifc_dbg_arg(ph, db, sb, df)
|
||||
#else
|
||||
#define _ifc_chk_arg(ph, db, sb)
|
||||
#define _ifc_dbg_arg(ph, db, sb, df)
|
||||
#endif
|
||||
|
||||
#define IFC_ALIGN sizeof(unsigned int)
|
||||
#define ifc_align_size(a, p) (((a)+((p)-1)) & ~((p)-1))
|
||||
|
||||
#ifdef _DRV_LLT_
|
||||
#define C_CALL_ARG_R2L
|
||||
#endif
|
||||
|
||||
struct ifc_param {
|
||||
unsigned int type;
|
||||
unsigned int size;
|
||||
};
|
||||
|
||||
struct ifc_head {
|
||||
unsigned int scode;
|
||||
unsigned int rcode;
|
||||
unsigned int stamp;
|
||||
unsigned int retval;
|
||||
unsigned int needret;
|
||||
unsigned int argv[IFC_MAX_ARG];
|
||||
unsigned int data;
|
||||
unsigned int data_phy_addr;
|
||||
|
||||
#ifdef IFC_DEBUG_PARAM
|
||||
struct ifc_param param_tbl[IFC_MAX_ARG];
|
||||
signed int param_prob;
|
||||
#endif
|
||||
};
|
||||
|
||||
struct ifc_arg {
|
||||
unsigned int addr;
|
||||
unsigned int size;
|
||||
};
|
||||
|
||||
struct ifc_mb {
|
||||
void *mbuf;
|
||||
struct ifc_arg argo[IFC_MAX_ARG];
|
||||
struct ifc_head head;
|
||||
void *waitsem;
|
||||
unsigned int total_size;
|
||||
unsigned int data_size;
|
||||
unsigned long data_vitrual_addr;
|
||||
};
|
||||
|
||||
#ifdef C_CALL_ARG_R2L
|
||||
#define _IFC_ADD_ARG0(ary, p)
|
||||
#define _IFC_ADD_ARG1(ary, d1, t1, a1, s1) __ifc_arg_out(ary, d1, (unsigned int)a1, s1, 0)
|
||||
#define _IFC_ADD_ARG2(ary, d2, t2, a2, s2, d1, t1, a1, s1, ...) _IFC_ADD_ARG1(ary, d1, t1, a1, s1); __ifc_arg_out(ary, d2, (unsigned int)a2, s2, (unsigned int)a1)
|
||||
#define _IFC_ADD_ARG3(ary, d3, t3, a3, s3, d2, t2, a2, s2, ...) _IFC_ADD_ARG2(ary, d2, t2, a2, s2, __VA_ARGS__); __ifc_arg_out(ary, d3, (unsigned int)a3, s3, (unsigned int)a2)
|
||||
#define _IFC_ADD_ARG4(ary, d4, t4, a4, s4, d3, t3, a3, s3, ...) _IFC_ADD_ARG3(ary, d3, t3, a3, s3, __VA_ARGS__); __ifc_arg_out(ary, d4, (unsigned int)a4, s4, (unsigned int)a3)
|
||||
#define _IFC_ADD_ARG5(ary, d5, t5, a5, s5, d4, t4, a4, s4, ...) _IFC_ADD_ARG4(ary, d4, t4, a4, s4, __VA_ARGS__); __ifc_arg_out(ary, d5, (unsigned int)a5, s5, (unsigned int)a4)
|
||||
#define _IFC_ADD_ARG6(ary, d6, t6, a6, s6, d5, t5, a5, s5, ...) _IFC_ADD_ARG5(ary, d5, t5, a5, s5, __VA_ARGS__); __ifc_arg_out(ary, d6, (unsigned int)a6, s6, (unsigned int)a5)
|
||||
|
||||
#define _IFC_PUSHDATA0(d, av, p)
|
||||
#define _IFC_PUSHDATA1(d, av, d1, t1, a1, s1) __ifc_push_arg(d, av, d1, (unsigned int)a1, s1, 0)
|
||||
#define _IFC_PUSHDATA2(d, av, d2, t2, a2, s2, d1, t1, a1, s1) _IFC_PUSHDATA1(d, av, d1, t1, a1, s1); __ifc_push_arg(d, av, d2, (unsigned int)a2, s2, (unsigned int)a1)
|
||||
#define _IFC_PUSHDATA3(d, av, d3, t3, a3, s3, d2, t2, a2, s2, ...) _IFC_PUSHDATA2(d, av, d2, t2, a2, s2, __VA_ARGS__); __ifc_push_arg(d, av, d3, (unsigned int)a3, s3, (unsigned int)a2)
|
||||
#define _IFC_PUSHDATA4(d, av, d4, t4, a4, s4, d3, t3, a3, s3, ...) _IFC_PUSHDATA3(d, av, d3, t3, a3, s3, __VA_ARGS__); __ifc_push_arg(d, av, d4, (unsigned int)a4, s4, (unsigned int)a3)
|
||||
#define _IFC_PUSHDATA5(d, av, d5, t5, a5, s5, d4, t4, a4, s4, ...) _IFC_PUSHDATA4(d, av, d4, t4, a4, s4, __VA_ARGS__); __ifc_push_arg(d, av, d5, (unsigned int)a5, s5, (unsigned int)a4)
|
||||
#define _IFC_PUSHDATA6(d, av, d6, t6, a6, s6, d5, t5, a5, s5, ...) _IFC_PUSHDATA5(d, av, d5, t5, a5, s5, __VA_ARGS__); __ifc_push_arg(d, av, d6, (unsigned int)a6, s6, (unsigned int)a5)
|
||||
|
||||
#define _IFC_PCOPY0(in, out, av, ao, p)
|
||||
#define _IFC_PCOPY1(in, out, av, ao, d1, t1, a1, s1) __ifc_copy_arg(in, out, d1, s1, av, ao)
|
||||
#define _IFC_PCOPY2(in, out, av, ao, d2, t2, a2, s2, d1, t1, a1, s1) _IFC_PCOPY1(in, out, av, ao, d1, t1, a1, s1); __ifc_copy_arg(in, out, d2, s2, av, ao)
|
||||
#define _IFC_PCOPY3(in, out, av, ao, d3, t3, a3, s3, d2, t2, a2, s2, ...) _IFC_PCOPY2(in, out, av, ao, d2, t2, a2, s2, __VA_ARGS__); __ifc_copy_arg(in, out, d3, s3, av, ao)
|
||||
#define _IFC_PCOPY4(in, out, av, ao, d4, t4, a4, s4, d3, t3, a3, s3, ...) _IFC_PCOPY3(in, out, av, ao, d3, t3, a3, s3, __VA_ARGS__); __ifc_copy_arg(in, out, d4, s4, av, ao)
|
||||
#define _IFC_PCOPY5(in, out, av, ao, d5, t5, a5, s5, d4, t4, a4, s4, ...) _IFC_PCOPY4(in, out, av, ao, d4, t4, a4, s4, __VA_ARGS__); __ifc_copy_arg(in, out, d5, s5, av, ao)
|
||||
#define _IFC_PCOPY6(in, out, av, ao, d6, t6, a6, s6, d5, t5, a5, s5, ...) _IFC_PCOPY5(in, out, av, ao, d5, t5, a5, s5, __VA_ARGS__); __ifc_copy_arg(in, out, d6, s6, av, ao)
|
||||
|
||||
#define _IFC_OUTSIZE0(av, p) 0
|
||||
#define _IFC_OUTSIZE1(av, d1, t1, a1, s1) __ifc_out_size(d1, s1, av)
|
||||
#define _IFC_OUTSIZE2(av, d2, t2, a2, s2, d1, t1, a1, s1) _IFC_OUTSIZE1(av, d1, t1, a1, s1) + __ifc_out_size(d2, s2, av)
|
||||
#define _IFC_OUTSIZE3(av, d3, t3, a3, s3, d2, t2, a2, s2, ...) _IFC_OUTSIZE2(av, d2, t2, a2, s2, __VA_ARGS__) + __ifc_out_size(d3, s3, av)
|
||||
#define _IFC_OUTSIZE4(av, d4, t4, a4, s4, d3, t3, a3, s3, ...) _IFC_OUTSIZE3(av, d3, t3, a3, s3, __VA_ARGS__) + __ifc_out_size(d4, s4, av)
|
||||
#define _IFC_OUTSIZE5(av, d5, t5, a5, s5, d4, t4, a4, s4, ...) _IFC_OUTSIZE4(av, d4, t4, a4, s4, __VA_ARGS__) + __ifc_out_size(d5, s5, av)
|
||||
#define _IFC_OUTSIZE6(av, d6, t6, a6, s6, d5, t5, a5, s5, ...) _IFC_OUTSIZE5(av, d5, t5, a5, s5, __VA_ARGS__) + __ifc_out_size(d6, s6, av)
|
||||
#else
|
||||
#define _IFC_ADD_ARG0(ary, p)
|
||||
#define _IFC_ADD_ARG1(ary, d1, t1, a1, s1) __ifc_arg_out(ary, d1, (unsigned int)a1, s1, 0)
|
||||
#define _IFC_ADD_ARG2(ary, d2, t2, a2, s2, d1, t1, a1, s1, ...) __ifc_arg_out(ary, d2, (unsigned int)a2, s2, (unsigned int)a1); _IFC_ADD_ARG1(ary, d1, t1, a1, s1)
|
||||
#define _IFC_ADD_ARG3(ary, d3, t3, a3, s3, d2, t2, a2, s2, ...) __ifc_arg_out(ary, d3, (unsigned int)a3, s3, (unsigned int)a2); _IFC_ADD_ARG2(ary, d2, t2, a2, s2, __VA_ARGS__)
|
||||
#define _IFC_ADD_ARG4(ary, d4, t4, a4, s4, d3, t3, a3, s3, ...) __ifc_arg_out(ary, d4, (unsigned int)a4, s4, (unsigned int)a3); _IFC_ADD_ARG3(ary, d3, t3, a3, s3, __VA_ARGS__)
|
||||
#define _IFC_ADD_ARG5(ary, d5, t5, a5, s5, d4, t4, a4, s4, ...) __ifc_arg_out(ary, d5, (unsigned int)a5, s5, (unsigned int)a4); _IFC_ADD_ARG4(ary, d4, t4, a4, s4, __VA_ARGS__)
|
||||
#define _IFC_ADD_ARG6(ary, d6, t6, a6, s6, d5, t5, a5, s5, ...) __ifc_arg_out(ary, d6, (unsigned int)a6, s6, (unsigned int)a5); _IFC_ADD_ARG5(ary, d5, t5, a5, s5, __VA_ARGS__)
|
||||
|
||||
#define _IFC_PUSHDATA0(d, av, p)
|
||||
#define _IFC_PUSHDATA1(d, av, d1, t1, a1, s1) __ifc_push_arg(d, av, d1, (unsigned int)a1, s1, 0)
|
||||
#define _IFC_PUSHDATA2(d, av, d2, t2, a2, s2, d1, t1, a1, s1) __ifc_push_arg(d, av, d2, (unsigned int)a2, s2, (unsigned int)a1); _IFC_PUSHDATA1(d, av, d1, t1, a1, s1)
|
||||
#define _IFC_PUSHDATA3(d, av, d3, t3, a3, s3, d2, t2, a2, s2, ...) __ifc_push_arg(d, av, d3, (unsigned int)a3, s3, (unsigned int)a2); _IFC_PUSHDATA2(d, av, d2, t2, a2, s2, __VA_ARGS__)
|
||||
#define _IFC_PUSHDATA4(d, av, d4, t4, a4, s4, d3, t3, a3, s3, ...) __ifc_push_arg(d, av, d4, (unsigned int)a4, s4, (unsigned int)a3); _IFC_PUSHDATA3(d, av, d3, t3, a3, s3, __VA_ARGS__)
|
||||
#define _IFC_PUSHDATA5(d, av, d5, t5, a5, s5, d4, t4, a4, s4, ...) __ifc_push_arg(d, av, d5, (unsigned int)a5, s5, (unsigned int)a4); _IFC_PUSHDATA4(d, av, d4, t4, a4, s4, __VA_ARGS__)
|
||||
#define _IFC_PUSHDATA6(d, av, d6, t6, a6, s6, d5, t5, a5, s5, ...) __ifc_push_arg(d, av, d6, (unsigned int)a6, s6, (unsigned int)a5); _IFC_PUSHDATA5(d, av, d5, t5, a5, s5, __VA_ARGS__)
|
||||
|
||||
#define _IFC_PCOPY0(in, out, av, ao, p)
|
||||
#define _IFC_PCOPY1(in, out, av, ao, d1, t1, a1, s1) __ifc_copy_arg(in, out, d1, s1, av, ao)
|
||||
#define _IFC_PCOPY2(in, out, av, ao, d2, t2, a2, s2, d1, t1, a1, s1) __ifc_copy_arg(in, out, d2, s2, av, ao); _IFC_PCOPY1(in, out, av, ao, d1, t1, a1, s1)
|
||||
#define _IFC_PCOPY3(in, out, av, ao, d3, t3, a3, s3, d2, t2, a2, s2, ...) __ifc_copy_arg(in, out, d3, s3, av, ao); _IFC_PCOPY2(in, out, av, ao, d2, t2, a2, s2, __VA_ARGS__)
|
||||
#define _IFC_PCOPY4(in, out, av, ao, d4, t4, a4, s4, d3, t3, a3, s3, ...) __ifc_copy_arg(in, out, d4, s4, av, ao); _IFC_PCOPY3(in, out, av, ao, d3, t3, a3, s3, __VA_ARGS__)
|
||||
#define _IFC_PCOPY5(in, out, av, ao, d5, t5, a5, s5, d4, t4, a4, s4, ...) __ifc_copy_arg(in, out, d5, s5, av, ao); _IFC_PCOPY4(in, out, av, ao, d4, t4, a4, s4, __VA_ARGS__)
|
||||
#define _IFC_PCOPY6(in, out, av, ao, d6, t6, a6, s6, d5, t5, a5, s5, ...) __ifc_copy_arg(in, out, d6, s6, av, ao); _IFC_PCOPY5(in, out, av, ao, d5, t5, a5, s5, __VA_ARGS__)
|
||||
|
||||
#define _IFC_OUTSIZE0(av, p) 0
|
||||
#define _IFC_OUTSIZE1(av, d1, t1, a1, s1) __ifc_out_size(d1, s1, av)
|
||||
#define _IFC_OUTSIZE2(av, d2, t2, a2, s2, d1, t1, a1, s1) __ifc_out_size(d2, s2, av) + _IFC_OUTSIZE1(av, d1, t1, a1, s1)
|
||||
#define _IFC_OUTSIZE3(av, d3, t3, a3, s3, d2, t2, a2, s2, ...) __ifc_out_size(d3, s3, av) + _IFC_OUTSIZE2(av, d2, t2, a2, s2, __VA_ARGS__)
|
||||
#define _IFC_OUTSIZE4(av, d4, t4, a4, s4, d3, t3, a3, s3, ...) __ifc_out_size(d4, s4, av) + _IFC_OUTSIZE3(av, d3, t3, a3, s3, __VA_ARGS__)
|
||||
#define _IFC_OUTSIZE5(av, d5, t5, a5, s5, d4, t4, a4, s4, ...) __ifc_out_size(d5, s5, av) + _IFC_OUTSIZE4(av, d4, t4, a4, s4, __VA_ARGS__)
|
||||
#define _IFC_OUTSIZE6(av, d6, t6, a6, s6, d5, t5, a5, s5, ...) __ifc_out_size(d6, s6, av) + _IFC_OUTSIZE5(av, d5, t5, a5, s5, __VA_ARGS__)
|
||||
|
||||
#endif
|
||||
|
||||
#define _IFC_PARAM0(in, out, av, p)
|
||||
#define _IFC_PARAM1(in, out, av, d1, t1, a1, s1) (t1)__ifc_gen_arg(in, out, d1, s1, av)
|
||||
#define _IFC_PARAM2(in, out, av, d2, t2, a2, s2, d1, t1, a1, s1) (t2)__ifc_gen_arg(in, out, d2, s2, av), _IFC_PARAM1(in, out, av, d1, t1, a1, s1)
|
||||
#define _IFC_PARAM3(in, out, av, d3, t3, a3, s3, d2, t2, a2, s2, ...) (t3)__ifc_gen_arg(in, out, d3, s3, av), _IFC_PARAM2(in, out, av, d2, t2, a2, s2, __VA_ARGS__)
|
||||
#define _IFC_PARAM4(in, out, av, d4, t4, a4, s4, d3, t3, a3, s3, ...) (t4)__ifc_gen_arg(in, out, d4, s4, av), _IFC_PARAM3(in, out, av, d3, t3, a3, s3, __VA_ARGS__)
|
||||
#define _IFC_PARAM5(in, out, av, d5, t5, a5, s5, d4, t4, a4, s4, ...) (t5)__ifc_gen_arg(in, out, d5, s5, av), _IFC_PARAM4(in, out, av, d4, t4, a4, s4, __VA_ARGS__)
|
||||
#define _IFC_PARAM6(in, out, av, d6, t6, a6, s6, d5, t5, a5, s5, ...) (t6)__ifc_gen_arg(in, out, d6, s6, av), _IFC_PARAM5(in, out, av, d5, t5, a5, s5, __VA_ARGS__)
|
||||
|
||||
#define _IFC_DECL0(p) /*void */
|
||||
#define _IFC_DECL1(d1, t1, a1, s1) t1 a1,
|
||||
#define _IFC_DECL2(d2, t2, a2, s2, ...) t2 a2, _IFC_DECL1(__VA_ARGS__)
|
||||
#define _IFC_DECL3(d3, t3, a3, s3, ...) t3 a3, _IFC_DECL2(__VA_ARGS__)
|
||||
#define _IFC_DECL4(d4, t4, a4, s4, ...) t4 a4, _IFC_DECL3(__VA_ARGS__)
|
||||
#define _IFC_DECL5(d5, t5, a5, s5, ...) t5 a5, _IFC_DECL4(__VA_ARGS__)
|
||||
#define _IFC_DECL6(d6, t6, a6, s6, ...) t6 a6, _IFC_DECL5(__VA_ARGS__)
|
||||
|
||||
#define _IFC_INSIZE0(p) 0
|
||||
#define _IFC_INSIZE1(d1, t1, a1, s1) __ifc_in_size(d1, s1, 0)
|
||||
#define _IFC_INSIZE2(d2, t2, a2, s2, d1, t1, a1, s1) _IFC_INSIZE1(d1, t1, a1, s1) + __ifc_in_size(d2, s2, (unsigned int)a1)
|
||||
#define _IFC_INSIZE3(d3, t3, a3, s3, d2, t2, a2, s2, ...) _IFC_INSIZE2(d2, t2, a2, s2, __VA_ARGS__) + __ifc_in_size(d3, s3, (unsigned int)a2)
|
||||
#define _IFC_INSIZE4(d4, t4, a4, s4, d3, t3, a3, s3, ...) _IFC_INSIZE3(d3, t3, a3, s3, __VA_ARGS__) + __ifc_in_size(d4, s4, (unsigned int)a3)
|
||||
#define _IFC_INSIZE5(d5, t5, a5, s5, d4, t4, a4, s4, ...) _IFC_INSIZE4(d4, t4, a4, s4, __VA_ARGS__) + __ifc_in_size(d5, s5, (unsigned int)a4)
|
||||
#define _IFC_INSIZE6(d6, t6, a6, s6, d5, t5, a5, s5, ...) _IFC_INSIZE5(d5, t5, a5, s5, __VA_ARGS__) + __ifc_in_size(d6, s6, (unsigned int)a5)
|
||||
|
||||
#define _IFC_DBGPARAM0(p, a)
|
||||
#define _IFC_DBGPARAM1(ph, d1, t1, a1, s1) _ifc_dbg_arg(ph, d1, s1, 0)
|
||||
#define _IFC_DBGPARAM2(ph, d2, t2, a2, s2, d1, t1, a1, s1) _IFC_DBGPARAM1(ph, d1, t1, a1, s1) ; _ifc_dbg_arg(ph, d2, s2, d1)
|
||||
#define _IFC_DBGPARAM3(ph, d3, t3, a3, s3, d2, t2, a2, s2, ...) _IFC_DBGPARAM2(ph, d2, t2, a2, s2, __VA_ARGS__); _ifc_dbg_arg(ph, d3, s3, d2)
|
||||
#define _IFC_DBGPARAM4(ph, d4, t4, a4, s4, d3, t3, a3, s3, ...) _IFC_DBGPARAM3(ph, d3, t3, a3, s3, __VA_ARGS__); _ifc_dbg_arg(ph, d4, s4, d3)
|
||||
#define _IFC_DBGPARAM5(ph, d5, t5, a5, s5, d4, t4, a4, s4, ...) _IFC_DBGPARAM4(ph, d4, t4, a4, s4, __VA_ARGS__); _ifc_dbg_arg(ph, d5, s5, d4)
|
||||
#define _IFC_DBGPARAM6(ph, d6, t6, a6, s6, d5, t5, a5, s5, ...) _IFC_DBGPARAM5(ph, d5, t5, a5, s5, __VA_ARGS__); _ifc_dbg_arg(ph, d6, s6, d5)
|
||||
|
||||
#define _IFC_CHKPARAM0(p, a)
|
||||
#define _IFC_CHKPARAM1(ph, d1, t1, a1, s1) _ifc_chk_arg(ph, d1, s1)
|
||||
#define _IFC_CHKPARAM2(ph, d2, t2, a2, s2, d1, t1, a1, s1) _ifc_chk_arg(ph, d2, s2); _IFC_CHKPARAM1(ph, d1, t1, a1, s1)
|
||||
#define _IFC_CHKPARAM3(ph, d3, t3, a3, s3, d2, t2, a2, s2, ...) _ifc_chk_arg(ph, d3, s3); _IFC_CHKPARAM2(ph, d2, t2, a2, s2, __VA_ARGS__)
|
||||
#define _IFC_CHKPARAM4(ph, d4, t4, a4, s4, d3, t3, a3, s3, ...) _ifc_chk_arg(ph, d4, s4); _IFC_CHKPARAM3(ph, d3, t3, a3, s3, __VA_ARGS__)
|
||||
#define _IFC_CHKPARAM5(ph, d5, t5, a5, s5, d4, t4, a4, s4, ...) _ifc_chk_arg(ph, d5, s5); _IFC_CHKPARAM4(ph, d4, t4, a4, s4, __VA_ARGS__)
|
||||
#define _IFC_CHKPARAM6(ph, d6, t6, a6, s6, d5, t5, a5, s5, ...) _ifc_chk_arg(ph, d6, s6); _IFC_CHKPARAM5(ph, d5, t5, a5, s5, __VA_ARGS__)
|
||||
|
||||
#define _IFC_GEN_CALLx(x, id, name, ...) \
|
||||
int name(_IFC_DECL##x(__VA_ARGS__) unsigned int timeout) \
|
||||
{ \
|
||||
struct ifc_mb ifc_b; \
|
||||
struct ifc_arg *argo = ifc_b.argo; \
|
||||
unsigned int in_buf; \
|
||||
unsigned int *argv = ifc_b.head.argv; \
|
||||
unsigned int in_size = (_IFC_INSIZE##x(__VA_ARGS__)); \
|
||||
argo = argo; argv = argv; \
|
||||
if (x > IFC_MAX_ARG) return 0; \
|
||||
if (mailbox_ifc_init_buf(&ifc_b, id, IFC_LAUNCH, in_size, timeout)) return 0; \
|
||||
in_buf = ifc_b.head.data; \
|
||||
_IFC_DBGPARAM##x(&ifc_b.head, __VA_ARGS__); \
|
||||
_IFC_PUSHDATA##x(&in_buf, &argv, __VA_ARGS__); \
|
||||
if (timeout) { \
|
||||
_IFC_ADD_ARG##x(&argo, __VA_ARGS__); \
|
||||
return mailbox_ifc_send_wait(&ifc_b, timeout); \
|
||||
} \
|
||||
else \
|
||||
return mailbox_ifc_send_no_wait(&ifc_b); \
|
||||
}
|
||||
|
||||
#define IFC_GEN_EXEC_NAME(name) ife_##name
|
||||
|
||||
#define __IFC_GEN_EXECx(x, name, ...) \
|
||||
int IFC_GEN_EXEC_NAME(name)(struct ifc_head *ifc_h) \
|
||||
{ \
|
||||
struct ifc_mb ifc_b; \
|
||||
unsigned int in_b, out_b; \
|
||||
unsigned int *argv = ifc_h->argv; \
|
||||
unsigned int *argo; \
|
||||
unsigned int out_size = (_IFC_OUTSIZE##x(&argv, __VA_ARGS__)); \
|
||||
if (mailbox_ifc_init_buf(&ifc_b, ifc_h->rcode, IFC_RESPONSE, out_size, 0)) return MAILBOX_ERRO; \
|
||||
in_b = ifc_h->data; out_b = ifc_b.head.data; argv = ifc_h->argv; \
|
||||
_IFC_CHKPARAM##x(ifc_h, __VA_ARGS__); \
|
||||
ifc_b.head.retval = (unsigned int)name(_IFC_PARAM##x(&in_b, &out_b, &argv, __VA_ARGS__)); \
|
||||
if (ifc_h->needret) { \
|
||||
in_b = ifc_h->data; out_b = ifc_b.head.data; ifc_b.head.stamp = ifc_h->stamp; \
|
||||
argv = ifc_h->argv; argo = ifc_b.head.argv; \
|
||||
_IFC_PCOPY##x(&in_b, &out_b, &argv, &argo, __VA_ARGS__); \
|
||||
return mailbox_ifc_send_no_wait(&ifc_b); \
|
||||
} \
|
||||
else \
|
||||
return mailbox_ifc_discard_buf(&ifc_b); \
|
||||
}
|
||||
|
||||
extern int mailbox_ifc_init_buf(struct ifc_mb *ifc_b,
|
||||
unsigned int mailcode,
|
||||
unsigned int direct,
|
||||
unsigned int inlen,
|
||||
unsigned int timeout);
|
||||
|
||||
extern int mailbox_ifc_send_no_wait(struct ifc_mb *ifc_b);
|
||||
|
||||
extern int mailbox_ifc_wait_resp(struct ifc_mb *ifc_b);
|
||||
|
||||
extern int mailbox_ifc_discard_buf(struct ifc_mb *ifc_b);
|
||||
|
||||
extern int mailbox_ifc_send_wait(struct ifc_mb *ifc_b,
|
||||
unsigned int timeout);
|
||||
|
||||
extern int mailbox_ifc_register_exec(unsigned int mailcode,
|
||||
int (*ife_cb) (struct ifc_head *
|
||||
ifc_h)
|
||||
);
|
||||
|
||||
extern void __ifc_arg_out(struct ifc_arg **ary, unsigned int db,
|
||||
unsigned long ab, unsigned int sb,
|
||||
unsigned int af);
|
||||
|
||||
extern void __ifc_push_arg(unsigned long *in, unsigned int **av,
|
||||
unsigned int db, unsigned long ab,
|
||||
unsigned int sb, unsigned int af);
|
||||
|
||||
extern int __ifc_in_size(unsigned int db, unsigned int sb,
|
||||
unsigned int af);
|
||||
|
||||
extern void __ifc_dbg_arg(struct ifc_head *head, unsigned int db,
|
||||
unsigned int sb, unsigned int df);
|
||||
|
||||
extern int __ifc_out_size(unsigned int db, unsigned int sb,
|
||||
unsigned int **pp_af);
|
||||
|
||||
extern long __ifc_gen_arg(unsigned long *in, unsigned long *out,
|
||||
unsigned int db, unsigned int sb,
|
||||
unsigned int **pp_af);
|
||||
|
||||
extern void __ifc_copy_arg(unsigned long *in, unsigned long *out,
|
||||
unsigned int db, unsigned int sb,
|
||||
unsigned int **av, unsigned int **ao);
|
||||
|
||||
extern void __ifc_chk_arg(struct ifc_head *head, unsigned int db,
|
||||
unsigned int sb);
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
#endif /*end of __DRV_MAILBOX_IFC_H__ */
|
||||
@@ -0,0 +1,147 @@
|
||||
#include "drv_mailbox_cfg.h"
|
||||
#include "drv_mailbox_debug.h"
|
||||
#include "drv_mailbox_gut.h"
|
||||
|
||||
#undef _MAILBOX_FILE_
|
||||
#define _MAILBOX_FILE_ "msg"
|
||||
int BSP_CPU_StateGet(int CpuID)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
void mailbox_msg_receiver(void *mb_buf, void *handle, void *data)
|
||||
{
|
||||
struct mb_queue *queue;
|
||||
struct mb_buff *mbuf = (struct mb_buff *)mb_buf;
|
||||
mb_msg_cb func = (mb_msg_cb) handle;
|
||||
|
||||
queue = &mbuf->usr_queue;
|
||||
if (func) {
|
||||
func(data, (void *)queue, queue->size);
|
||||
} else {
|
||||
(void)mailbox_logerro_p1(MAILBOX_ERR_GUT_READ_CALLBACK_NOT_FIND,
|
||||
mbuf->mailcode);
|
||||
}
|
||||
}
|
||||
|
||||
MAILBOX_EXTERN unsigned int mailbox_reg_msg_cb(unsigned int mailcode,
|
||||
mb_msg_cb func, void *data)
|
||||
{
|
||||
return (unsigned int)mailbox_register_cb(mailcode, mailbox_msg_receiver,
|
||||
func, data);
|
||||
}
|
||||
|
||||
MAILBOX_EXTERN unsigned int mailbox_try_send_msg(unsigned int mailcode,
|
||||
void *pdata,
|
||||
unsigned int length)
|
||||
{
|
||||
struct mb_buff *mb_buf = MAILBOX_NULL;
|
||||
struct mb_queue *queue = MAILBOX_NULL;
|
||||
int ret_val = MAILBOX_OK;
|
||||
|
||||
if ((0 == pdata) || (0 == length)) {
|
||||
ret_val = mailbox_logerro_p1(MAILBOX_ERRO, mailcode);
|
||||
goto exit_out;
|
||||
|
||||
}
|
||||
ret_val = mailbox_request_buff(mailcode, (void *)&mb_buf);
|
||||
if (MAILBOX_OK != ret_val) {
|
||||
goto exit_out;
|
||||
}
|
||||
|
||||
queue = &mb_buf->usr_queue;
|
||||
if (length != (unsigned int)mailbox_write_buff(queue, pdata, length)) {
|
||||
ret_val = mailbox_logerro_p1(MAILBOX_FULL, mailcode);
|
||||
goto exit_out;
|
||||
}
|
||||
|
||||
ret_val = mailbox_sealup_buff(mb_buf, length);
|
||||
if (MAILBOX_OK == ret_val) {
|
||||
ret_val = mailbox_send_buff(mb_buf);
|
||||
}
|
||||
|
||||
exit_out:
|
||||
if (MAILBOX_NULL != mb_buf) {
|
||||
mailbox_release_buff(mb_buf);
|
||||
}
|
||||
|
||||
return (unsigned int)ret_val;
|
||||
}
|
||||
|
||||
MAILBOX_GLOBAL unsigned int mailbox_read_msg_data(void *mail_handle,
|
||||
char *buff,
|
||||
unsigned int *size)
|
||||
{
|
||||
struct mb_queue *pMailQueue = (struct mb_queue *)mail_handle;
|
||||
|
||||
if ((MAILBOX_NULL == pMailQueue) || (MAILBOX_NULL == buff)
|
||||
|| (MAILBOX_NULL == size)) {
|
||||
return (unsigned int)
|
||||
mailbox_logerro_p1(MAILBOX_ERR_GUT_INPUT_PARAMETER, 0);
|
||||
}
|
||||
|
||||
if (pMailQueue->size > *size) {
|
||||
return (unsigned int)
|
||||
mailbox_logerro_p1
|
||||
(MAILBOX_ERR_GUT_USER_BUFFER_SIZE_TOO_SMALL, *size);
|
||||
}
|
||||
|
||||
if ((0 == pMailQueue->length) ||
|
||||
((unsigned int)(pMailQueue->front - pMailQueue->base) >
|
||||
pMailQueue->length)
|
||||
|| ((unsigned int)(pMailQueue->rear - pMailQueue->base) >
|
||||
pMailQueue->length)) {
|
||||
return (unsigned int)
|
||||
mailbox_logerro_p1
|
||||
(MAILBOX_CRIT_GUT_INVALID_USER_MAIL_HANDLE, pMailQueue);
|
||||
}
|
||||
|
||||
*size =
|
||||
(unsigned int)mailbox_read_buff(pMailQueue, buff, pMailQueue->size);
|
||||
|
||||
return MAILBOX_OK;
|
||||
}
|
||||
|
||||
MAILBOX_EXTERN unsigned int mailbox_send_msg(unsigned int mailcode,
|
||||
void *data, unsigned int length)
|
||||
{
|
||||
int ret_val = MAILBOX_OK;
|
||||
unsigned int try_go_on = MAILBOX_TRUE;
|
||||
int try_times = 0;
|
||||
|
||||
ret_val = BSP_CPU_StateGet(mailbox_get_dst_id(mailcode));
|
||||
if (!ret_val) {
|
||||
return MAILBOX_TARGET_NOT_READY;
|
||||
}
|
||||
|
||||
ret_val = (int)mailbox_try_send_msg(mailcode, data, length);
|
||||
|
||||
if (MAILBOX_FALSE == mailbox_int_context()) {
|
||||
while ((int)MAILBOX_FULL == ret_val) {
|
||||
mailbox_delivery(mailbox_get_channel_id(mailcode));
|
||||
try_go_on =
|
||||
(unsigned int)
|
||||
mailbox_scene_delay(MAILBOX_DELAY_SCENE_MSG_FULL,
|
||||
&try_times);
|
||||
|
||||
if (MAILBOX_TRUE == try_go_on) {
|
||||
ret_val =
|
||||
(int)mailbox_try_send_msg(mailcode, data,
|
||||
length);
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (MAILBOX_OK != ret_val) {
|
||||
/*mailbox_show(mailcode,0); */
|
||||
/*mailbox_assert(ret_val); */
|
||||
if ((int)MAILBOX_FULL != ret_val) {
|
||||
ret_val = (int)MAILBOX_ERRO;
|
||||
}
|
||||
return (unsigned int)ret_val;
|
||||
}
|
||||
|
||||
return (unsigned int)ret_val;
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
#ifndef __DRV_MAILBOX_MSG_H__
|
||||
#define __DRV_MAILBOX_MSG_H__
|
||||
|
||||
#include "drv_mailbox_cfg.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define IFC_GEN_CALL0(id, name) _IFC_GEN_CALLx(0, id, name)
|
||||
#define IFC_GEN_CALL1(id, name, ...) _IFC_GEN_CALLx(1, id, name, __VA_ARGS__)
|
||||
#define IFC_GEN_CALL2(id, name, ...) _IFC_GEN_CALLx(2, id, name, __VA_ARGS__)
|
||||
#define IFC_GEN_CALL3(id, name, ...) _IFC_GEN_CALLx(3, id, name, __VA_ARGS__)
|
||||
#define IFC_GEN_CALL4(id, name, ...) _IFC_GEN_CALLx(4, id, name, __VA_ARGS__)
|
||||
#define IFC_GEN_CALL5(id, name, ...) _IFC_GEN_CALLx(5, id, name, __VA_ARGS__)
|
||||
#define IFC_GEN_CALL6(id, name, ...) _IFC_GEN_CALLx(6, id, name, __VA_ARGS__)
|
||||
|
||||
#define IFC_GEN_EXEC0(name) __IFC_GEN_EXECx(0, name)
|
||||
#define IFC_GEN_EXEC1(name, ...) __IFC_GEN_EXECx(1, name, __VA_ARGS__)
|
||||
#define IFC_GEN_EXEC2(name, ...) __IFC_GEN_EXECx(2, name, __VA_ARGS__)
|
||||
#define IFC_GEN_EXEC3(name, ...) __IFC_GEN_EXECx(3, name, __VA_ARGS__)
|
||||
#define IFC_GEN_EXEC4(name, ...) __IFC_GEN_EXECx(4, name, __VA_ARGS__)
|
||||
#define IFC_GEN_EXEC5(name, ...) __IFC_GEN_EXECx(5, name, __VA_ARGS__)
|
||||
#define IFC_GEN_EXEC6(name, ...) __IFC_GEN_EXECx(6, name, __VA_ARGS__)
|
||||
|
||||
#define mailbox_ifc_register(id, name) mailbox_ifc_register_exec(id, IFC_GEN_EXEC_NAME(name))
|
||||
|
||||
int BSP_CPU_StateGet(int CpuID);
|
||||
|
||||
unsigned long mailbox_init(void);
|
||||
|
||||
unsigned long mailbox_send_msg(unsigned long mailcode,
|
||||
void *data, unsigned long length);
|
||||
|
||||
unsigned long mailbox_reg_msg_cb(unsigned long mailcode,
|
||||
mb_msg_cb func, void *data);
|
||||
|
||||
unsigned int mailbox_read_msg_data(void *MailHandle,
|
||||
char *pData, unsigned int *pSize);
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
#endif /* end of drv_mailbox_msg.h */
|
||||
@@ -0,0 +1,118 @@
|
||||
#ifndef _DRV_MAILBOX_PLATFORM_H_
|
||||
#define _DRV_MAILBOX_PLATFORM_H_
|
||||
|
||||
#if defined(BSP_CORE_MODEM)
|
||||
#include "drv_mailbox_port_vxworks.h"
|
||||
|
||||
#elif defined (BSP_CORE_APP)
|
||||
#include "drv_mailbox_port_linux.h"
|
||||
|
||||
#elif defined (BSP_CORE_CM3)
|
||||
#include "drv_mailbox_port_mcu.h"
|
||||
|
||||
#endif
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef MAILBOX_TRUE
|
||||
#define MAILBOX_TRUE (1)
|
||||
#endif
|
||||
|
||||
#ifndef MAILBOX_FALSE
|
||||
#define MAILBOX_FALSE (0)
|
||||
#endif
|
||||
|
||||
#ifndef MAILBOX_NULL
|
||||
#define MAILBOX_NULL (void *)(0)
|
||||
#endif
|
||||
|
||||
#ifdef _DRV_LLT_
|
||||
#define MAILBOX_LOCAL
|
||||
#else
|
||||
#ifndef MAILBOX_LOCAL
|
||||
#define MAILBOX_LOCAL static
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef MAILBOX_EXTERN
|
||||
#define MAILBOX_EXTERN
|
||||
#endif
|
||||
|
||||
#ifndef MAILBOX_GLOBAL
|
||||
#define MAILBOX_GLOBAL
|
||||
#endif
|
||||
|
||||
#define MIALBOX_DIRECTION_INVALID (0)
|
||||
#define MIALBOX_DIRECTION_SEND (1)
|
||||
#define MIALBOX_DIRECTION_RECEIVE (2)
|
||||
|
||||
#define MAILBOX_MAILCODE_INVALID (unsigned long)(0xffffffff)
|
||||
|
||||
enum MAILBOX_DELAY_SCENE_E {
|
||||
MAILBOX_DELAY_SCENE_MSG_FULL,
|
||||
MAILBOX_DELAY_SCENE_IFC_FULL
|
||||
};
|
||||
|
||||
extern MAILBOX_EXTERN void mailbox_assert(unsigned int ErroNo);
|
||||
|
||||
extern MAILBOX_EXTERN int mailbox_mutex_lock(void **mutexId);
|
||||
|
||||
extern MAILBOX_EXTERN void mailbox_mutex_unlock(void **mutexId);
|
||||
|
||||
extern MAILBOX_EXTERN int mailbox_int_context(void);
|
||||
|
||||
extern MAILBOX_EXTERN int mailbox_get_timestamp(void);
|
||||
|
||||
extern MAILBOX_EXTERN int mailbox_process_register(unsigned int
|
||||
channel_id,
|
||||
int (*cb) (unsigned
|
||||
int
|
||||
channel_id),
|
||||
void *priv);
|
||||
|
||||
extern MAILBOX_EXTERN int mailbox_channel_register(unsigned int
|
||||
ChannelID,
|
||||
unsigned int IntNum,
|
||||
unsigned int DstID,
|
||||
unsigned int Direct,
|
||||
void **mutex);
|
||||
|
||||
extern MAILBOX_EXTERN void *mailbox_memcpy(void *dst, const void *src,
|
||||
unsigned int size);
|
||||
|
||||
extern MAILBOX_EXTERN void *mailbox_memset(void *m, int c,
|
||||
unsigned int size);
|
||||
|
||||
extern MAILBOX_EXTERN int mailbox_delivery(unsigned int channel_id);
|
||||
|
||||
extern MAILBOX_EXTERN int mailbox_init_platform(void);
|
||||
|
||||
extern MAILBOX_EXTERN int mailbox_scene_delay(unsigned int scene_id,
|
||||
int *try_times);
|
||||
|
||||
extern MAILBOX_EXTERN void *mailbox_init_completion(void);
|
||||
|
||||
extern MAILBOX_EXTERN int mailbox_wait_completion(void **mutexId,
|
||||
unsigned int timeout);
|
||||
|
||||
extern MAILBOX_EXTERN void mailbox_complete(void **wait_id);
|
||||
|
||||
extern MAILBOX_EXTERN void mailbox_del_completion(void **wait);
|
||||
extern void mailbox_ifc_test_init(void);
|
||||
|
||||
#if defined (BSP_CORE_CM3)
|
||||
extern void mailbox_dpm_device_get(void);
|
||||
extern void mailbox_dpm_device_put(void);
|
||||
#else
|
||||
#define mailbox_dpm_device_get()
|
||||
#define mailbox_dpm_device_put()
|
||||
#endif
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
#endif /*_DRV_MAILBOX_PLATFORM_H_*/
|
||||
@@ -0,0 +1,631 @@
|
||||
|
||||
#include <linux/string.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/semaphore.h>
|
||||
#include <linux/kthread.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/sched/rt.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/freezer.h>
|
||||
#include <linux/completion.h>
|
||||
#include <linux/wakelock.h>
|
||||
#include <linux/wait.h>
|
||||
#include <linux/spinlock.h>
|
||||
|
||||
#include "drv_mailbox_cfg.h"
|
||||
#include "drv_mailbox_debug.h"
|
||||
#include "bsp_drv_ipc.h"
|
||||
|
||||
#undef _MAILBOX_FILE_
|
||||
#define _MAILBOX_FILE_ "linux"
|
||||
#define MAILBOX_MILLISEC_PER_SECOND 1000
|
||||
|
||||
#define MAILBOX_LINUX_SEND_FULL_DELAY_MS 10
|
||||
#define MAILBOX_LINUX_SEND_FULL_DELAY_TIMES 0
|
||||
enum MAILBOX_LOCK_TYPE {
|
||||
MAILBOX_LOCK_SEMAPHORE = 0x00010000,
|
||||
MAILBOX_LOCK_SPINLOCK = 0x00020000
|
||||
};
|
||||
#define MAILBOX_PROC_MASK 0x0000ffff
|
||||
enum MAILBOX_LINUX_PROC_STYLE_E {
|
||||
MAILBOX_SEND = 0,
|
||||
|
||||
MAILBOX_RECEV_START,
|
||||
|
||||
MAILBOX_RECV_TASK_START,
|
||||
MAILBOX_RECV_TASK_NORMAL,
|
||||
MAILBOX_RECV_TASK_HIGH,
|
||||
|
||||
MAILBOX_RECV_TASK_END,
|
||||
|
||||
MAILBOX_RECV_TASKLET,
|
||||
MAILBOX_RECV_TASKLET_HI,
|
||||
|
||||
MAILBOX_RECV_INT_IRQ,
|
||||
MAILBOX_RECV_END,
|
||||
};
|
||||
|
||||
struct mb_local_work {
|
||||
unsigned int channel_id;
|
||||
unsigned int data_flag;
|
||||
int (*cb) (unsigned int channel_id);
|
||||
struct mb_local_work *next;
|
||||
void *mb_priv;
|
||||
};
|
||||
|
||||
struct mb_local_proc {
|
||||
signed char proc_name[16];
|
||||
unsigned int proc_id;
|
||||
signed int priority;
|
||||
struct mb_local_work *work_list;
|
||||
wait_queue_head_t wait;
|
||||
struct tasklet_struct tasklet;
|
||||
int incoming;
|
||||
|
||||
};
|
||||
|
||||
struct mb_local_cfg {
|
||||
unsigned int channel_id;
|
||||
unsigned int property;
|
||||
unsigned int int_src;
|
||||
unsigned int dst_id;
|
||||
};
|
||||
|
||||
struct mb_mutex {
|
||||
void *lock;
|
||||
unsigned long flags;
|
||||
unsigned int type;
|
||||
};
|
||||
|
||||
static struct wake_lock mb_lpwr_lock;
|
||||
|
||||
MAILBOX_LOCAL struct mb_local_proc g_mailbox_local_proc_tbl[] = {
|
||||
{"mailboxNormal", MAILBOX_RECV_TASK_NORMAL, 86, 0,},
|
||||
{"mailboxHigh", MAILBOX_RECV_TASK_HIGH, 99, 0,},
|
||||
|
||||
{"mailboxTasklet", MAILBOX_RECV_TASKLET, 0, 0,},
|
||||
{"mailboxTasklet", MAILBOX_RECV_TASKLET_HI, 0, 0,},
|
||||
|
||||
{"mailboxInt", MAILBOX_RECV_INT_IRQ, 0, 0,},
|
||||
|
||||
};
|
||||
|
||||
MAILBOX_LOCAL struct mb_local_cfg g_mb_local_cfg_tbl[] = {
|
||||
/*ChannelID */
|
||||
{MAILBOX_MAILCODE_RESERVED(MCU, ACPU, MSG), MAILBOX_RECV_TASKLET_HI, 0},
|
||||
{MAILBOX_MAILCODE_RESERVED(HIFI, ACPU, MSG), MAILBOX_RECV_TASKLET_HI,
|
||||
0},
|
||||
{MAILBOX_MAILCODE_RESERVED(CCPU, ACPU, MSG), MAILBOX_RECV_TASKLET_HI,
|
||||
0},
|
||||
{MAILBOX_MAILCODE_RESERVED(CCPU, ACPU, IFC), MAILBOX_RECV_TASK_NORMAL,
|
||||
0},
|
||||
{MAILBOX_MAILCODE_RESERVED(MCU, ACPU, IFC), MAILBOX_RECV_TASK_HIGH, 0},
|
||||
|
||||
/*ChannelID */
|
||||
{MAILBOX_MAILCODE_RESERVED(ACPU, MCU, MSG),
|
||||
MAILBOX_SEND | MAILBOX_LOCK_SPINLOCK, 0},
|
||||
{MAILBOX_MAILCODE_RESERVED(ACPU, HIFI, MSG),
|
||||
MAILBOX_SEND | MAILBOX_LOCK_SPINLOCK, 0},
|
||||
|
||||
{MAILBOX_MAILCODE_RESERVED(ACPU, CCPU, MSG), MAILBOX_SEND |
|
||||
MAILBOX_LOCK_SEMAPHORE, 0},
|
||||
|
||||
{MAILBOX_MAILCODE_RESERVED(ACPU, CCPU, IFC),
|
||||
MAILBOX_SEND | MAILBOX_LOCK_SEMAPHORE, 0},
|
||||
{MAILBOX_MAILCODE_RESERVED(ACPU, MCU, IFC),
|
||||
MAILBOX_SEND | MAILBOX_LOCK_SEMAPHORE, 0},
|
||||
|
||||
{MAILBOX_MAILCODE_INVALID, 0, 0}
|
||||
};
|
||||
|
||||
MAILBOX_LOCAL void *mailbox_mutex_create(struct mb_local_cfg *local_cfg);
|
||||
MAILBOX_LOCAL void mailbox_receive_process(unsigned long data)
|
||||
{
|
||||
struct mb_local_proc *proc = (struct mb_local_proc *)data;
|
||||
struct mb_local_work *work = proc->work_list;
|
||||
|
||||
while (MAILBOX_NULL != work) {
|
||||
if (MAILBOX_TRUE == work->data_flag) {
|
||||
work->data_flag = MAILBOX_FALSE;
|
||||
mailbox_record_sche_recv(work->mb_priv);
|
||||
if (MAILBOX_NULL != work->cb) {
|
||||
if (MAILBOX_OK != work->cb(work->channel_id)) {
|
||||
mailbox_logerro_p1
|
||||
(MAILBOX_ERR_LINUX_CALLBACK_ERRO,
|
||||
work->channel_id);
|
||||
}
|
||||
} else {
|
||||
mailbox_logerro_p1
|
||||
(MAILBOX_ERR_LINUX_CALLBACK_NOT_FIND,
|
||||
work->channel_id);
|
||||
}
|
||||
}
|
||||
work = work->next;
|
||||
}
|
||||
wake_unlock(&mb_lpwr_lock);
|
||||
}
|
||||
|
||||
MAILBOX_LOCAL int mailbox_receive_task(void *data)
|
||||
{
|
||||
struct mb_local_proc *proc = (struct mb_local_proc *)data;
|
||||
struct sched_param param;
|
||||
|
||||
param.sched_priority =
|
||||
(proc->priority < MAX_RT_PRIO) ? proc->priority : (MAX_RT_PRIO - 1);
|
||||
(void)sched_setscheduler(current, SCHED_FIFO, ¶m);
|
||||
|
||||
/*set_freezable(); *//* advised by l56193 */
|
||||
|
||||
do {
|
||||
wait_event(proc->wait, proc->incoming);
|
||||
proc->incoming = MAILBOX_FALSE;
|
||||
|
||||
mailbox_receive_process((unsigned long)data);
|
||||
|
||||
} while (!kthread_should_stop());
|
||||
return MAILBOX_OK;
|
||||
}
|
||||
|
||||
MAILBOX_EXTERN int mailbox_init_platform(void)
|
||||
{
|
||||
struct mb_local_proc *local_proc = &g_mailbox_local_proc_tbl[0];
|
||||
unsigned int count =
|
||||
sizeof(g_mailbox_local_proc_tbl) / sizeof(struct mb_local_proc);
|
||||
unsigned int proc_id;
|
||||
struct task_struct *task = MAILBOX_NULL;
|
||||
|
||||
wake_lock_init(&mb_lpwr_lock, WAKE_LOCK_SUSPEND,
|
||||
"mailbox_low_power_wake_lock");
|
||||
|
||||
while (count) {
|
||||
proc_id = local_proc->proc_id;
|
||||
if ((proc_id > MAILBOX_RECV_TASK_START)
|
||||
&& (proc_id < MAILBOX_RECV_TASK_END)) {
|
||||
|
||||
init_waitqueue_head(&local_proc->wait);
|
||||
|
||||
task =
|
||||
kthread_run(mailbox_receive_task,
|
||||
(void *)local_proc,
|
||||
local_proc->proc_name);
|
||||
if (IS_ERR(task)) {
|
||||
return
|
||||
mailbox_logerro_p1
|
||||
(MAILBOX_ERR_LINUX_TASK_CREATE, proc_id);
|
||||
}
|
||||
}
|
||||
|
||||
if ((MAILBOX_RECV_TASKLET == proc_id) ||
|
||||
(MAILBOX_RECV_TASKLET_HI == proc_id)) {
|
||||
tasklet_init(&local_proc->tasklet,
|
||||
mailbox_receive_process,
|
||||
(unsigned long)local_proc);
|
||||
|
||||
}
|
||||
count--;
|
||||
local_proc++;
|
||||
}
|
||||
|
||||
return MAILBOX_OK;
|
||||
}
|
||||
|
||||
MAILBOX_LOCAL int mailbox_ipc_process(struct mb_local_work *local_work,
|
||||
struct mb_local_proc *local_proc,
|
||||
unsigned int channel_id,
|
||||
unsigned int proc_id)
|
||||
{
|
||||
unsigned int is_find = MAILBOX_TRUE;
|
||||
|
||||
while (local_work) {
|
||||
if (channel_id == local_work->channel_id) {
|
||||
local_work->data_flag = MAILBOX_TRUE;
|
||||
|
||||
mailbox_record_sche_send(local_work->mb_priv);
|
||||
wake_lock(&mb_lpwr_lock);
|
||||
|
||||
if ((proc_id > MAILBOX_RECV_TASK_START)
|
||||
&& (proc_id < MAILBOX_RECV_TASK_END)) {
|
||||
|
||||
local_proc->incoming = MAILBOX_TRUE;
|
||||
wake_up(&local_proc->wait);
|
||||
|
||||
} else if (MAILBOX_RECV_TASKLET_HI == proc_id) {
|
||||
tasklet_hi_schedule(&local_proc->tasklet);
|
||||
|
||||
} else if (MAILBOX_RECV_TASKLET == proc_id) {
|
||||
tasklet_schedule(&local_proc->tasklet);
|
||||
|
||||
} else if (MAILBOX_RECV_INT_IRQ == proc_id) {
|
||||
mailbox_receive_process((unsigned long)
|
||||
local_proc);
|
||||
|
||||
} else {
|
||||
is_find = MAILBOX_FALSE;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
local_work = local_work->next;
|
||||
}
|
||||
|
||||
return is_find;
|
||||
}
|
||||
|
||||
MAILBOX_LOCAL int mailbox_ipc_int_handle(unsigned int int_num)
|
||||
{
|
||||
struct mb_local_cfg *local_cfg = &g_mb_local_cfg_tbl[0];
|
||||
struct mb_local_proc *local_proc = MAILBOX_NULL;
|
||||
struct mb_local_work *local_work = MAILBOX_NULL;
|
||||
unsigned int count =
|
||||
sizeof(g_mailbox_local_proc_tbl) / sizeof(struct mb_local_proc);
|
||||
unsigned int proc_id = 0;
|
||||
unsigned int channel_id = 0;
|
||||
unsigned int is_find = MAILBOX_FALSE;
|
||||
unsigned int ret_val = MAILBOX_OK;
|
||||
|
||||
while (MAILBOX_MAILCODE_INVALID != local_cfg->channel_id) {
|
||||
proc_id = local_cfg->property;
|
||||
if ((int_num == local_cfg->int_src) && (MAILBOX_SEND
|
||||
!=
|
||||
(MAILBOX_PROC_MASK &
|
||||
local_cfg->property))) {
|
||||
channel_id = local_cfg->channel_id;
|
||||
|
||||
local_proc = &g_mailbox_local_proc_tbl[0];
|
||||
count =
|
||||
sizeof(g_mailbox_local_proc_tbl) /
|
||||
sizeof(struct mb_local_proc);
|
||||
while (count) {
|
||||
if (proc_id == local_proc->proc_id) {
|
||||
local_work = local_proc->work_list;
|
||||
is_find =
|
||||
mailbox_ipc_process(local_work,
|
||||
local_proc,
|
||||
channel_id,
|
||||
proc_id);
|
||||
break;
|
||||
}
|
||||
count--;
|
||||
local_proc++;
|
||||
}
|
||||
|
||||
if (0 == count) {
|
||||
ret_val =
|
||||
mailbox_logerro_p1
|
||||
(MAILBOX_ERR_LINUX_MAIL_TASK_NOT_FIND,
|
||||
channel_id);
|
||||
}
|
||||
}
|
||||
local_cfg++;
|
||||
}
|
||||
|
||||
if (MAILBOX_TRUE != is_find) {
|
||||
ret_val =
|
||||
mailbox_logerro_p1(MAILBOX_ERR_LINUX_MAIL_INT_NOT_FIND,
|
||||
channel_id);
|
||||
}
|
||||
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
MAILBOX_EXTERN int mailbox_process_register(unsigned int channel_id,
|
||||
int (*cb) (unsigned int channel_id),
|
||||
void *priv)
|
||||
{
|
||||
struct mb_local_work *local_work = MAILBOX_NULL;
|
||||
struct mb_local_cfg *local_cfg = &g_mb_local_cfg_tbl[0];
|
||||
struct mb_local_proc *local_proc = &g_mailbox_local_proc_tbl[0];
|
||||
struct mb_local_cfg *find_cfg = MAILBOX_NULL;
|
||||
unsigned int count =
|
||||
sizeof(g_mailbox_local_proc_tbl) / sizeof(struct mb_local_proc);
|
||||
|
||||
while (MAILBOX_MAILCODE_INVALID != local_cfg->channel_id) {
|
||||
if (local_cfg->channel_id == channel_id) {
|
||||
find_cfg = local_cfg;
|
||||
break;
|
||||
}
|
||||
local_cfg++;
|
||||
}
|
||||
|
||||
if (find_cfg) {
|
||||
while (count) {
|
||||
if (find_cfg->property == local_proc->proc_id) {
|
||||
if (local_proc->work_list) {
|
||||
local_work = local_proc->work_list;
|
||||
while (MAILBOX_NULL != local_work->next) {
|
||||
local_work = local_work->next;
|
||||
}
|
||||
local_work->next =
|
||||
(struct mb_local_work *)
|
||||
kcalloc(sizeof
|
||||
(struct mb_local_work), 1,
|
||||
GFP_KERNEL);
|
||||
if (NULL == local_work->next) {
|
||||
(void)printk(KERN_ERR
|
||||
"%s: memory alloc error!\n",
|
||||
__func__);
|
||||
return
|
||||
MAILBOX_ERR_LINUX_ALLOC_MEMORY;
|
||||
}
|
||||
local_work->next->channel_id =
|
||||
find_cfg->channel_id;
|
||||
local_work->next->cb = cb;
|
||||
local_work->next->next = MAILBOX_NULL;
|
||||
local_work->next->mb_priv = priv;
|
||||
|
||||
} else {
|
||||
local_proc->work_list =
|
||||
(struct mb_local_work *)
|
||||
kcalloc(sizeof
|
||||
(struct mb_local_work), 1,
|
||||
GFP_KERNEL);
|
||||
if (NULL == local_proc->work_list) {
|
||||
(void)printk(KERN_ERR
|
||||
"%s: memory alloc error!\n",
|
||||
__func__);
|
||||
return
|
||||
MAILBOX_ERR_LINUX_ALLOC_MEMORY;
|
||||
}
|
||||
local_proc->work_list->channel_id =
|
||||
find_cfg->channel_id;
|
||||
local_proc->work_list->cb = cb;
|
||||
local_proc->work_list->next =
|
||||
MAILBOX_NULL;
|
||||
local_proc->work_list->mb_priv = priv;
|
||||
}
|
||||
|
||||
}
|
||||
count--;
|
||||
local_proc++;
|
||||
}
|
||||
|
||||
return MAILBOX_OK;
|
||||
}
|
||||
|
||||
return mailbox_logerro_p1(MAILBOX_ERR_LINUX_CHANNEL_NOT_FIND,
|
||||
channel_id);
|
||||
|
||||
}
|
||||
|
||||
MAILBOX_EXTERN int mailbox_channel_register(unsigned int channel_id,
|
||||
unsigned int int_src,
|
||||
unsigned int dst_id,
|
||||
unsigned int direct, void **mutex)
|
||||
{
|
||||
struct mb_local_cfg *local_cfg = &g_mb_local_cfg_tbl[0];
|
||||
while (MAILBOX_MAILCODE_INVALID != local_cfg->channel_id) {
|
||||
if (channel_id == local_cfg->channel_id) {
|
||||
*mutex = mailbox_mutex_create(local_cfg);
|
||||
if (MAILBOX_NULL == *mutex) {
|
||||
return
|
||||
mailbox_logerro_p1(MAILBOX_CRIT_PORT_CONFIG,
|
||||
channel_id);
|
||||
}
|
||||
|
||||
local_cfg->int_src = int_src;
|
||||
local_cfg->dst_id = dst_id;
|
||||
|
||||
if (MIALBOX_DIRECTION_RECEIVE == direct) {
|
||||
IPC_IntConnect((IPC_INT_LEV_E) int_src,
|
||||
(VOIDFUNCPTR)
|
||||
mailbox_ipc_int_handle, int_src);
|
||||
IPC_IntEnable((IPC_INT_LEV_E) int_src);
|
||||
|
||||
/*test_mailbox_msg_reg(channel_id); */
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
local_cfg++;
|
||||
}
|
||||
|
||||
if (MAILBOX_MAILCODE_INVALID == local_cfg->channel_id) {
|
||||
return mailbox_logerro_p1(MAILBOX_ERR_LINUX_CHANNEL_NOT_FIND,
|
||||
channel_id);
|
||||
}
|
||||
|
||||
return MAILBOX_OK;
|
||||
}
|
||||
|
||||
MAILBOX_EXTERN int mailbox_delivery(unsigned int channel_id)
|
||||
{
|
||||
struct mb_local_cfg *local_cfg = &g_mb_local_cfg_tbl[0];
|
||||
struct mb_local_cfg *find_cfg = MAILBOX_NULL;
|
||||
|
||||
while (MAILBOX_MAILCODE_INVALID != local_cfg->channel_id) {
|
||||
if (local_cfg->channel_id == channel_id) {
|
||||
find_cfg = local_cfg;
|
||||
break;
|
||||
}
|
||||
local_cfg++;
|
||||
}
|
||||
|
||||
if (MAILBOX_NULL != find_cfg) {
|
||||
return (int)IPC_IntSend((IPC_INT_CORE_E) find_cfg->dst_id,
|
||||
(IPC_INT_LEV_E) find_cfg->int_src);
|
||||
}
|
||||
|
||||
return mailbox_logerro_p1(MAILBOX_ERR_LINUX_CHANNEL_NOT_FIND,
|
||||
channel_id);
|
||||
}
|
||||
|
||||
MAILBOX_LOCAL void *mailbox_mutex_create(struct mb_local_cfg *local_cfg)
|
||||
{
|
||||
unsigned int channel_id = local_cfg->channel_id;
|
||||
struct mb_mutex *mtx = MAILBOX_NULL;
|
||||
|
||||
mtx = (struct mb_mutex *)kmalloc(sizeof(struct mb_mutex), GFP_KERNEL);
|
||||
if (!mtx) {
|
||||
mailbox_logerro_p1(MAILBOX_ERR_LINUX_CHANNEL_NOT_FIND,
|
||||
channel_id);
|
||||
goto error_exit;
|
||||
}
|
||||
|
||||
if ((local_cfg->property > MAILBOX_RECEV_START) &&
|
||||
(local_cfg->property < MAILBOX_RECV_END)) {
|
||||
mtx->lock = kmalloc(sizeof(spinlock_t), GFP_KERNEL);
|
||||
if (mtx->lock) {
|
||||
spin_lock_init((spinlock_t *) mtx->lock);
|
||||
mtx->type = MAILBOX_LOCK_SPINLOCK;
|
||||
} else {
|
||||
mailbox_logerro_p1(MAILBOX_CRIT_PORT_CONFIG,
|
||||
channel_id);
|
||||
goto error_exit;
|
||||
}
|
||||
} else {
|
||||
if (MAILBOX_LOCK_SEMAPHORE & local_cfg->property) {
|
||||
mtx->lock =
|
||||
kmalloc(sizeof(struct semaphore), GFP_KERNEL);
|
||||
if (mtx->lock) {
|
||||
sema_init(mtx->lock, 1);
|
||||
mtx->type = MAILBOX_LOCK_SEMAPHORE;
|
||||
} else {
|
||||
mailbox_logerro_p1(MAILBOX_CRIT_PORT_CONFIG,
|
||||
channel_id);
|
||||
goto error_exit;
|
||||
}
|
||||
} else if (MAILBOX_LOCK_SPINLOCK & local_cfg->property) {
|
||||
mtx->lock = kmalloc(sizeof(spinlock_t), GFP_KERNEL);
|
||||
if (mtx->lock) {
|
||||
spin_lock_init((spinlock_t *) mtx->lock);
|
||||
mtx->type = MAILBOX_LOCK_SPINLOCK;
|
||||
} else {
|
||||
mailbox_logerro_p1(MAILBOX_CRIT_PORT_CONFIG,
|
||||
channel_id);
|
||||
goto error_exit;
|
||||
}
|
||||
} else {
|
||||
mailbox_logerro_p1(MAILBOX_CRIT_PORT_CONFIG,
|
||||
channel_id);
|
||||
goto error_exit;
|
||||
}
|
||||
}
|
||||
return mtx;
|
||||
|
||||
error_exit:
|
||||
if (mtx)
|
||||
kfree(mtx);
|
||||
|
||||
return (void *)0;
|
||||
}
|
||||
|
||||
MAILBOX_EXTERN int mailbox_mutex_lock(void **mutexId)
|
||||
{
|
||||
struct mb_mutex *mtx = (struct mb_mutex *)*mutexId;
|
||||
|
||||
if (MAILBOX_LOCK_SEMAPHORE == mtx->type) {
|
||||
down((struct semaphore *)mtx->lock);
|
||||
} else if (MAILBOX_LOCK_SPINLOCK == mtx->type) {
|
||||
spin_lock_irqsave((spinlock_t *) mtx->lock, mtx->flags);
|
||||
}
|
||||
|
||||
return MAILBOX_OK;
|
||||
}
|
||||
|
||||
MAILBOX_EXTERN void mailbox_mutex_unlock(void **mutexId)
|
||||
{
|
||||
struct mb_mutex *mtx = (struct mb_mutex *)*mutexId;
|
||||
|
||||
if (MAILBOX_LOCK_SEMAPHORE == mtx->type) {
|
||||
up((struct semaphore *)mtx->lock);
|
||||
} else if (MAILBOX_LOCK_SPINLOCK == mtx->type) {
|
||||
spin_unlock_irqrestore((spinlock_t *) mtx->lock, mtx->flags);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
MAILBOX_EXTERN void *mailbox_init_completion(void)
|
||||
{
|
||||
struct completion *wait;
|
||||
wait =
|
||||
(struct completion *)kmalloc(sizeof(struct completion), GFP_KERNEL);
|
||||
if (!wait) {
|
||||
return MAILBOX_NULL;
|
||||
}
|
||||
init_completion(wait);
|
||||
|
||||
return (void *)wait;
|
||||
}
|
||||
|
||||
MAILBOX_EXTERN int mailbox_wait_completion(void **wait, unsigned int timeout)
|
||||
{
|
||||
long jiffies = msecs_to_jiffies(timeout);
|
||||
long ret = wait_for_completion_timeout(*wait, jiffies);
|
||||
|
||||
return (ret > 0) ? MAILBOX_OK : MAILBOX_ERRO;
|
||||
}
|
||||
|
||||
MAILBOX_EXTERN void mailbox_complete(void **wait)
|
||||
{
|
||||
complete(*wait);
|
||||
}
|
||||
|
||||
MAILBOX_EXTERN void mailbox_del_completion(void **wait)
|
||||
{
|
||||
kfree(*wait);
|
||||
}
|
||||
|
||||
MAILBOX_EXTERN void *mailbox_memcpy(void *Destination, const void *Source,
|
||||
unsigned int Size)
|
||||
{
|
||||
|
||||
return (void *)memcpy(Destination, Source, Size);
|
||||
}
|
||||
|
||||
MAILBOX_EXTERN void *mailbox_memset(void *m, int c, unsigned int size)
|
||||
{
|
||||
|
||||
return memset(m, c, size);
|
||||
}
|
||||
|
||||
MAILBOX_EXTERN void mailbox_assert(unsigned int ErroNo)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
MAILBOX_EXTERN int mailbox_int_context(void)
|
||||
{
|
||||
return in_interrupt();
|
||||
}
|
||||
|
||||
MAILBOX_EXTERN int mailbox_scene_delay(unsigned int scene_id, int *try_times)
|
||||
{
|
||||
unsigned int go_on = MAILBOX_FALSE;
|
||||
unsigned int delay_ms = 0;
|
||||
|
||||
switch (scene_id) {
|
||||
case MAILBOX_DELAY_SCENE_MSG_FULL:
|
||||
case MAILBOX_DELAY_SCENE_IFC_FULL:
|
||||
|
||||
delay_ms = MAILBOX_LINUX_SEND_FULL_DELAY_MS;
|
||||
|
||||
go_on = (*try_times >= MAILBOX_LINUX_SEND_FULL_DELAY_TIMES) ?
|
||||
MAILBOX_FALSE : MAILBOX_TRUE;
|
||||
|
||||
break;
|
||||
default:
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
if (MAILBOX_TRUE == go_on) {
|
||||
msleep(delay_ms);
|
||||
}
|
||||
|
||||
*try_times = *try_times + 1;
|
||||
return go_on;
|
||||
}
|
||||
|
||||
extern void *g_slice_reg;
|
||||
MAILBOX_EXTERN int mailbox_get_timestamp(void)
|
||||
{
|
||||
if (g_slice_reg) {
|
||||
return (long)readl(g_slice_reg);
|
||||
}
|
||||
return 0;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
#ifndef _DRV_MAILBOX_PORT_LINUX_H_
|
||||
#define _DRV_MAILBOX_PORT_LINUX_H_
|
||||
|
||||
#include <linux/kernel.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
#ifndef _DRV_LLT_
|
||||
#include <mach/hardware.h>
|
||||
|
||||
#define MEM_CORE_SHARE_PHY2VIRT(phy) (((unsigned int)phy) - IPC_SHARE_MEM_ADDR + IPC_SHARE_MEM_VIRT_ADDR)
|
||||
#define MEM_CORE_SHARE_VIRT2PHY(virt) (((unsigned int)virt) - IPC_SHARE_MEM_VIRT_ADDR + IPC_SHARE_MEM_ADDR)
|
||||
|
||||
#else
|
||||
|
||||
#define MEM_CORE_SHARE_PHY2VIRT(phy) (phy)
|
||||
#define MEM_CORE_SHARE_VIRT2PHY(virt) (virt)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define MEM_CORE_SHARE_PHY2VIRT(phy) (phy)
|
||||
#define MEM_CORE_SHARE_VIRT2PHY(virt) (virt)
|
||||
|
||||
#define MAILBOX_LOCAL_CPUID MAILBOX_CPUID_ACPU
|
||||
|
||||
#define MAILBOX_CHANNEL_NUM \
|
||||
(MAILBOX_CHANNEL_BUTT(ACPU, HIFI) \
|
||||
+ MAILBOX_CHANNEL_BUTT(HIFI, ACPU) \
|
||||
)
|
||||
|
||||
#define MAILBOX_USER_NUM \
|
||||
(MAILBOX_USER_BUTT(HIFI, ACPU, MSG) \
|
||||
)
|
||||
|
||||
#ifdef _DRV_LLT_
|
||||
#define mailbox_out(p) (printk p)
|
||||
#else
|
||||
#define mailbox_out(p) (printk p)
|
||||
#endif
|
||||
|
||||
#define _MAILBOX_LINE_ __LINE__
|
||||
|
||||
#define _MAILBOX_FILE_ (void *)(0) /*__FILE__*/
|
||||
|
||||
#define MAILBOX_LOG_LEVEL MAILBOX_LOG_ERROR
|
||||
|
||||
#ifndef MAILBOX_OPEN_MNTN
|
||||
#define MAILBOX_OPEN_MNTN
|
||||
#endif
|
||||
|
||||
#define MAILBOX_RECORD_USEID_NUM (64)
|
||||
|
||||
#define RT "\n"
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
#endif /*_DRV_MAILBOX_LINUX_H_*/
|
||||
@@ -0,0 +1,74 @@
|
||||
#ifndef __DRV_MAILBOX_STUB_H__
|
||||
#define __DRV_MAILBOX_STUB_H__
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#define MAILBOX_MEM_BASEADDR ((int)&g_MAILBOX_BST_HEAD0[0])
|
||||
|
||||
#define MAILBOX_MEM_LENGTH mailbox_memory_length()
|
||||
|
||||
extern int g_MAILBOX_BST_HEAD0[];
|
||||
#define MAILBOX_HEAD_ADDR_MCU2ACPU_MSG MAILBOX_MEM_BASEADDR
|
||||
#define MAILBOX_HEAD_ADDR_ACPU2MCU_MSG (MAILBOX_HEAD_ADDR_MCU2ACPU_MSG + MAILBOX_HEAD_LEN)
|
||||
|
||||
#define MAILBOX_HEAD_ADDR_ACPU2HIFI_MSG (MAILBOX_HEAD_ADDR_ACPU2MCU_MSG + MAILBOX_HEAD_LEN)
|
||||
#define MAILBOX_HEAD_ADDR_HIFI2ACPU_MSG (MAILBOX_HEAD_ADDR_ACPU2HIFI_MSG + MAILBOX_HEAD_LEN)
|
||||
|
||||
#define MAILBOX_HEAD_ADDR_MCU2CCPU_MSG (MAILBOX_HEAD_ADDR_HIFI2ACPU_MSG + MAILBOX_HEAD_LEN)
|
||||
#define MAILBOX_HEAD_ADDR_CCPU2MCU_MSG (MAILBOX_HEAD_ADDR_MCU2CCPU_MSG + MAILBOX_HEAD_LEN)
|
||||
|
||||
#define MAILBOX_HEAD_ADDR_CCPU2HIFI_MSG (MAILBOX_HEAD_ADDR_CCPU2MCU_MSG + MAILBOX_HEAD_LEN)
|
||||
#define MAILBOX_HEAD_ADDR_HIFI2CCPU_MSG (MAILBOX_HEAD_ADDR_CCPU2HIFI_MSG + MAILBOX_HEAD_LEN)
|
||||
|
||||
#define MAILBOX_HEAD_ADDR_CCPU2ACPU_MSG (MAILBOX_HEAD_ADDR_HIFI2CCPU_MSG + MAILBOX_HEAD_LEN)
|
||||
#define MAILBOX_HEAD_ADDR_ACPU2CCPU_MSG (MAILBOX_HEAD_ADDR_CCPU2ACPU_MSG + MAILBOX_HEAD_LEN)
|
||||
|
||||
#define MAILBOX_HEAD_ADDR_CCPU2ACPU_IFC (MAILBOX_HEAD_ADDR_ACPU2CCPU_MSG + MAILBOX_HEAD_LEN)
|
||||
#define MAILBOX_HEAD_ADDR_ACPU2CCPU_IFC (MAILBOX_HEAD_ADDR_CCPU2ACPU_IFC + MAILBOX_HEAD_LEN)
|
||||
|
||||
#define MAILBOX_HEAD_ADDR_CCPU2MCU_IFC (MAILBOX_HEAD_ADDR_ACPU2CCPU_IFC + MAILBOX_HEAD_LEN)
|
||||
#define MAILBOX_HEAD_ADDR_MCU2CCPU_IFC (MAILBOX_HEAD_ADDR_CCPU2MCU_IFC + MAILBOX_HEAD_LEN)
|
||||
|
||||
#define MAILBOX_HEAD_ADDR_ACPU2MCU_IFC (MAILBOX_HEAD_ADDR_MCU2CCPU_IFC + MAILBOX_HEAD_LEN)
|
||||
#define MAILBOX_HEAD_ADDR_MCU2ACPU_IFC (MAILBOX_HEAD_ADDR_ACPU2MCU_IFC + MAILBOX_HEAD_LEN)
|
||||
|
||||
#define MAILBOX_HEAD_BOTTOM_ADDR (MAILBOX_HEAD_ADDR_MCU2ACPU_IFC + MAILBOX_HEAD_LEN)
|
||||
|
||||
#define MAILBOX_QUEUE_ADDR_MCU2ACPU_MSG (MAILBOX_MEM_BASEADDR + MAILBOX_MEM_HEAD_LEN)
|
||||
#define MAILBOX_QUEUE_ADDR_ACPU2MCU_MSG (MAILBOX_QUEUE_ADDR_MCU2ACPU_MSG + MAILBOX_QUEUE_SIZE(MCU, ACPU, MSG))
|
||||
|
||||
#define MAILBOX_QUEUE_ADDR_ACPU2HIFI_MSG (MAILBOX_QUEUE_ADDR_ACPU2MCU_MSG + MAILBOX_QUEUE_SIZE(ACPU, MCU, MSG))
|
||||
#define MAILBOX_QUEUE_ADDR_HIFI2ACPU_MSG (MAILBOX_QUEUE_ADDR_ACPU2HIFI_MSG + MAILBOX_QUEUE_SIZE(ACPU, HIFI, MSG))
|
||||
|
||||
#define MAILBOX_QUEUE_ADDR_MCU2CCPU_MSG (MAILBOX_QUEUE_ADDR_HIFI2ACPU_MSG + MAILBOX_QUEUE_SIZE(HIFI, ACPU, MSG))
|
||||
#define MAILBOX_QUEUE_ADDR_CCPU2MCU_MSG (MAILBOX_QUEUE_ADDR_MCU2CCPU_MSG + MAILBOX_QUEUE_SIZE(MCU, CCPU, MSG))
|
||||
|
||||
#define MAILBOX_QUEUE_ADDR_CCPU2HIFI_MSG (MAILBOX_QUEUE_ADDR_CCPU2MCU_MSG + MAILBOX_QUEUE_SIZE(CCPU, MCU, MSG))
|
||||
#define MAILBOX_QUEUE_ADDR_HIFI2CCPU_MSG (MAILBOX_QUEUE_ADDR_CCPU2HIFI_MSG + MAILBOX_QUEUE_SIZE(CCPU, HIFI, MSG))
|
||||
|
||||
#define MAILBOX_QUEUE_ADDR_CCPU2ACPU_MSG (MAILBOX_QUEUE_ADDR_HIFI2CCPU_MSG + MAILBOX_QUEUE_SIZE(HIFI, CCPU, MSG))
|
||||
#define MAILBOX_QUEUE_ADDR_ACPU2CCPU_MSG (MAILBOX_QUEUE_ADDR_CCPU2ACPU_MSG + MAILBOX_QUEUE_SIZE(CCPU, ACPU, MSG))
|
||||
|
||||
#define MAILBOX_QUEUE_ADDR_CCPU2ACPU_IFC (MAILBOX_QUEUE_ADDR_ACPU2CCPU_MSG + MAILBOX_QUEUE_SIZE(ACPU, CCPU, MSG))
|
||||
#define MAILBOX_QUEUE_ADDR_ACPU2CCPU_IFC (MAILBOX_QUEUE_ADDR_CCPU2ACPU_IFC + MAILBOX_QUEUE_SIZE(CCPU, ACPU, IFC))
|
||||
|
||||
#define MAILBOX_QUEUE_ADDR_CCPU2MCU_IFC (MAILBOX_QUEUE_ADDR_ACPU2CCPU_IFC + MAILBOX_QUEUE_SIZE(ACPU, CCPU, IFC))
|
||||
#define MAILBOX_QUEUE_ADDR_MCU2CCPU_IFC (MAILBOX_QUEUE_ADDR_CCPU2MCU_IFC + MAILBOX_QUEUE_SIZE(CCPU, MCU, IFC))
|
||||
|
||||
#define MAILBOX_QUEUE_ADDR_ACPU2MCU_IFC (MAILBOX_QUEUE_ADDR_MCU2CCPU_IFC + MAILBOX_QUEUE_SIZE(MCU, CCPU, IFC))
|
||||
#define MAILBOX_QUEUE_ADDR_MCU2ACPU_IFC (MAILBOX_QUEUE_ADDR_ACPU2MCU_IFC + MAILBOX_QUEUE_SIZE(ACPU, MCU, IFC))
|
||||
|
||||
#define MAILBOX_MEMORY_BOTTOM_ADDR (MAILBOX_QUEUE_ADDR_MCU2CCPU_IFC + MAILBOX_QUEUE_SIZE(MCU, ACPU, IFC))
|
||||
|
||||
int mailbox_memory_length(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
#endif /* end of __DRV_MAILBOX_STUB_H__.h */
|
||||
@@ -0,0 +1,22 @@
|
||||
#include "drv_mailbox_cfg.h"
|
||||
#include "drv_mailbox_gut.h"
|
||||
|
||||
#undef _MAILBOX_FILE_
|
||||
#define _MAILBOX_FILE_ "table"
|
||||
MAILBOX_EXTERN struct mb_cfg g_mailbox_global_cfg_tbl[MAILBOX_GLOBAL_CHANNEL_NUM
|
||||
+ 1] = {
|
||||
MAILBOX_CHANNEL_COMPOSE(CCPU, HIFI, MSG),
|
||||
|
||||
MAILBOX_CHANNEL_COMPOSE(ACPU, HIFI, MSG),
|
||||
|
||||
MAILBOX_CHANNEL_COMPOSE(HIFI, CCPU, MSG),
|
||||
MAILBOX_CHANNEL_COMPOSE(HIFI, ACPU, MSG),
|
||||
|
||||
{MAILBOX_MAILCODE_INVALID, 0, 0, 0}
|
||||
|
||||
};
|
||||
|
||||
MAILBOX_EXTERN struct mb_buff
|
||||
g_mailbox_channel_handle_pool[MAILBOX_CHANNEL_NUM];
|
||||
|
||||
MAILBOX_EXTERN struct mb_cb g_mailbox_user_cb_pool[MAILBOX_USER_NUM];
|
||||
@@ -0,0 +1,413 @@
|
||||
/*
|
||||
* Copyright (C) Huawei Technologies Co., Ltd. 2012-2015. All rights reserved.
|
||||
* foss@huawei.com
|
||||
*
|
||||
* If distributed as part of the Linux kernel, the following license terms
|
||||
* apply:
|
||||
*
|
||||
* * This program is free software; you can redistribute it and/or modify
|
||||
* * it under the terms of the GNU General Public License version 2 and
|
||||
* * only version 2 as published by the Free Software Foundation.
|
||||
* *
|
||||
* * 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.
|
||||
* *
|
||||
* * You should have received a copy of the GNU General Public License
|
||||
* * along with this program; if not, write to the Free Software
|
||||
* * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
|
||||
*
|
||||
* Otherwise, the following license terms apply:
|
||||
*
|
||||
* * Redistribution and use in source and binary forms, with or without
|
||||
* * modification, are permitted provided that the following conditions
|
||||
* * are met:
|
||||
* * 1) Redistributions of source code must retain the above copyright
|
||||
* * notice, this list of conditions and the following disclaimer.
|
||||
* * 2) Redistributions in binary form must reproduce the above copyright
|
||||
* * notice, this list of conditions and the following disclaimer in the
|
||||
* * documentation and/or other materials provided with the distribution.
|
||||
* * 3) Neither the name of Huawei nor the names of its contributors may
|
||||
* * be used to endorse or promote products derived from this software
|
||||
* * without specific prior written permission.
|
||||
*
|
||||
* * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
#ifndef __MDRV_IPC_ENUM_H__
|
||||
#define __MDRV_IPC_ENUM_H__
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef enum tagIPC_INT_CORE_E {
|
||||
IPC_CORE_ARM11 = 0x0,
|
||||
IPC_CORE_A9,
|
||||
IPC_CORE_CEVA,
|
||||
IPC_CORE_TENS0,
|
||||
IPC_CORE_TENS1,
|
||||
IPC_CORE_DSP,
|
||||
IPC_CORE_APPARM = 0x0,
|
||||
IPC_CORE_COMARM,
|
||||
IPC_CORE_LTEDSP,
|
||||
IPC_CORE_VDSP,
|
||||
IPC_CORE_ZSP,
|
||||
IPC_CORE_DSP_GU,
|
||||
IPC_CORE_ACPU = 0x0,
|
||||
IPC_CORE_CCPU,
|
||||
IPC_CORE_MCU,
|
||||
IPC_CORE_HIFI,
|
||||
IPC_CORE_BBE16,
|
||||
IPC_CORE_ACORE = 0x0,
|
||||
IPC_CORE_CCORE,
|
||||
IPC_CORE_MCORE,
|
||||
IPC_CORE_LDSP,
|
||||
IPC_CORE_HiFi,
|
||||
IPC_CORE_BBE,
|
||||
IPC_CORE0_A15,
|
||||
IPC_CORE1_A15,
|
||||
IPC_CORE_BUTTOM
|
||||
} IPC_INT_CORE_E;
|
||||
|
||||
#if defined(CHIP_BB_HI6210)
|
||||
typedef enum tagIPC_INT_LEV_E {
|
||||
IPC_INT_DSP_MODEM = 0,
|
||||
IPC_CCPU_INT_SRC_HIFI_MSG = 1,
|
||||
IPC_INT_DSP_MSP = 2,
|
||||
IPC_INT_DSP_PS = 3,
|
||||
IPC_CCPU_INT_SRC_MCU_MSG = 5,
|
||||
IPC_CCPU_INT_SRC_ACPU_MSG = 6,
|
||||
IPC_CCPU_INT_SRC_ACPU_IFC = 7,
|
||||
IPC_INT_DSP_HALT = 8,
|
||||
IPC_INT_DSP_RESUME = 9,
|
||||
IPC_CCPU_INT_SRC_MCU_IFC = 10,
|
||||
IPC_INT_WAKE_GU = 11,
|
||||
IPC_INT_SLEEP_GU = 12,
|
||||
IPC_INT_DICC_USRDATA_ACPU = 13,
|
||||
IPC_INT_DICC_RELDATA_ACPU = 14,
|
||||
IPC_INT_ARM_SLEEP = 15,
|
||||
IPC_INT_WAKE_GSM = 16,
|
||||
IPC_INT_WAKE_WCDMA = 17,
|
||||
IPC_INT_DSP_PS_PUB_MBX = 18,
|
||||
IPC_INT_DSP_PS_MAC_MBX = 19,
|
||||
IPC_INT_DSP_MBX_RSD = 20,
|
||||
IPC_CCPU_INT_SRC_DSP_MNTN = 21,
|
||||
IPC_CCPU_INT_SRC_DSP_RCM_PUB_MBX = 22, /* bit22 */
|
||||
IPC_CCPU_INT_SRC_ACPU_ICC = 30,
|
||||
IPC_CCPU_INT_SDR_CCPU_BBP_MASTER_ERROR = 31,
|
||||
IPC_CCPU_INT_SRC_BUTT = 32,
|
||||
|
||||
IPC_MCU_INT_SRC_ACPU_MSG = 4,
|
||||
IPC_MCU_INT_SRC_CCPU_MSG = 5,
|
||||
IPC_MCU_INT_SRC_HIFI_MSG = 6,
|
||||
IPC_MCU_INT_SRC_CCPU_IFC = 7,
|
||||
IPC_MCU_INT_SRC_CCPU_IPF = 8,
|
||||
IPC_MCU_INT_SRC_ACPU_IFC = 9,
|
||||
IPC_MCU_INT_SRC_ACPU0_PD = 10,
|
||||
IPC_MCU_INT_SRC_ACPU1_PD = 11, /* bit11, acpu1 power down */
|
||||
IPC_MCU_INT_SRC_ACPU2_PD = 12, /* bit12, acpu2 power down */
|
||||
IPC_MCU_INT_SRC_ACPU3_PD = 13, /* bit13, acpu3 power down */
|
||||
IPC_MCU_INT_SRC_ACPU_HOTPLUG = 14, /* bit14, acpu hotplug--no use */
|
||||
IPC_MCU_INT_SRC_ACPU_DFS = 15, /* bit15, ACPU DFS */
|
||||
IPC_MCU_INT_SRC_ACPU_PD = 16, /* bit16, acpu power down */
|
||||
IPC_MCU_INT_SRC_CCPU_PD = 17, /* bit17, ccpu power down */
|
||||
IPC_MCU_INT_SRC_HIFI_PD = 18, /* bit18, hifi power down */
|
||||
IPC_MCU_INT_SRC_MCU_AGT = 19, /* bit19, mcu agent */
|
||||
IPC_MCU_INT_SRC_HIFI_DDR_VOTE = 20, /* bit20, HIFI DDR */
|
||||
IPC_MCU_INT_SRC_ACPU_I2S_REMOTE_SLOW = 21, /* bit21, ACPU */
|
||||
IPC_MCU_INT_SRC_ACPU_I2S_REMOTE_SLEEP = 22, /* bit22, ACPU */
|
||||
IPC_MCU_INT_SRC_ACPU_I2S_REMOTE_INVALID = 23, /* bit23, ACPU */
|
||||
IPC_MCU_INT_SRC_HIFI_MEMSHARE_DDR_VOTE = 24, /* bit24, MP3 */
|
||||
IPC_MCU_INT_SRC_HIFI_MEMSHARE_DDR_EXIT_VOTE = 25, /* bit25, MP3 */
|
||||
IPC_MCU_INT_SRC_ACPU4_PD = 26, /* bit26, acpu4:cluster1 core0 power down */
|
||||
IPC_MCU_INT_SRC_ACPU5_PD = 27, /* bit27, acpu5:cluster1 core1 power down */
|
||||
IPC_MCU_INT_SRC_ACPU6_PD = 28, /* bit28, acpu6:cluster1 core2 power down */
|
||||
IPC_MCU_INT_SRC_ACPU7_PD = 29, /* bit29, acpu7:cluster1 core3 power down */
|
||||
IPC_MCU_INT_SRC_HIFI_IFC = 31, /* bit31, HIFI */
|
||||
IPC_MCU_INT_SRC_BUTT = 32,
|
||||
|
||||
IPC_ACPU_INT_SRC_CCPU_MSG = 1, /* bit1, CCPU */
|
||||
IPC_ACPU_INT_SRC_HIFI_MSG = 2, /* bit2, HIFI */
|
||||
IPC_ACPU_INT_SRC_MCU_MSG = 3, /* bit3, ACPU */
|
||||
IPC_ACPU_INT_SRC_CCPU_NVIM = 4, /* bit4, */
|
||||
IPC_ACPU_INT_SRC_CCPU_IFC = 5, /* bit5, CCPU */
|
||||
IPC_ACPU_INT_SRC_MCU_IFC = 6, /* bit6, MCU */
|
||||
IPC_ACPU_INT_SRC_MCU_THERMAL_HIGH = 7, /* bit7, MCU */
|
||||
IPC_ACPU_INT_SRC_MCU_THERMAL_LOW = 8, /* bit8, MCU ACPU */
|
||||
IPC_INT_DSP_APP = 9, /* bit9, LDSP */
|
||||
IPC_ACPU_INT_SRC_HIFI_PC_VOICE_RX_DATA = 10, /* hifi->acore pc voice */
|
||||
IPC_INT_DICC_USRDATA = 13, /* bit13, TTF */
|
||||
IPC_INT_DICC_RELDATA = 14, /* bit14, TTF IPC_INT_DICC_RELDATA_ACPU */
|
||||
IPC_ACPU_INT_SRC_CCPU_LOG = 25, /* bit25, CCPU ACPU LOG */
|
||||
IPC_ACPU_INI_SRC_MCU_TELE_MNTN_NOTIFY = 26, /* bit26, TELE_MNTN */
|
||||
IPC_ACPU_INI_SRC_MCU_EXC_REBOOT = 27, /* bit27, MCU */
|
||||
IPC_ACPU_INT_SRC_CCPU_EXC_REBOOT = 28, /* bit28, CCPU */
|
||||
IPC_ACPU_INT_SRC_CCPU_NORMAL_REBOOT = 29, /* bit29, CCPU */
|
||||
IPC_ACPU_INT_SRC_MCU_DDR_EXC = 30, /* bit30, MCU DDR */
|
||||
IPC_ACPU_INT_SRC_CCPU_ICC = 31, /* bit31, CCPU ICC */
|
||||
IPC_ACPU_INT_SRC_BUTT = 32,
|
||||
|
||||
IPC_HIFI_INT_SRC_ACPU_MSG = 0, /* bit0, ACPU */
|
||||
IPC_HIFI_INT_SRC_CCPU_MSG = 1, /* bit1, CCPU */
|
||||
IPC_HIFI_INT_SRC_BBE_MSG = 4, /* bit4, TDDSP */
|
||||
IPC_HIFI_INT_SRC_MCU_MSG = 6, /* bit6, MCU */
|
||||
IPC_HIFI_INT_SRC_MCU_WAKE_DDR = 7, /* bit7, MCU DDR */
|
||||
IPC_HIFI_INT_SRC_MCU_IFC = 8, /* bit8, MCU */
|
||||
IPC_HIFI_INT_SRC_BUTT = 32,
|
||||
|
||||
IPC_INT_MSP_DSP_OM_MBX = 0, /* bit0, ARM->DSP */
|
||||
IPC_INT_PS_DSP_PUB_MBX = 1, /* bit1, ARM->DSP */
|
||||
IPC_INT_PS_DSP_MAC_MBX = 2, /* bit2, ARM->DSP */
|
||||
IPC_INT_HIFI_DSP_MBX = 3, /* bit3, HIFI->DSP */
|
||||
IPC_BBE16_INT_SRC_HIFI_MSG = 3, /* bit3, */
|
||||
IPC_BBE16_INT_SRC_BUTT = 32,
|
||||
IPC_INT_BUTTOM = 32
|
||||
} IPC_INT_LEV_E;
|
||||
|
||||
typedef enum tagIPC_SEM_ID_E {
|
||||
IPC_SEM_ICC = 0,
|
||||
IPC_SEM_NAND = 1,
|
||||
IPC_SEM_MEM = 2,
|
||||
IPC_SEM_DICC = 3,
|
||||
IPC_SEM_RFILE_LOG = 4,
|
||||
IPC_SEM_EMMC = 5,
|
||||
IPC_SEM_NVIM = 6,
|
||||
IPC_SEM_TELE_MNTN = 7,
|
||||
IPC_SEM_MEDPLL_STATE = 8,
|
||||
IPC_SEM_EFUSE = 9,
|
||||
IPC_SEM_BBPMASTER_0 = 10,
|
||||
IPC_SEM_BBPMASTER_1 = 11,
|
||||
IPC_SEM_BBPMASTER_2 = 12,
|
||||
IPC_SEM_BBPMASTER_3 = 13,
|
||||
IPC_SEM_GU_SLEEP = 14,
|
||||
IPC_SEM_BBPMASTER_5 = 15,
|
||||
IPC_SEM_BBPMASTER_6 = 16,
|
||||
IPC_SEM_BBPMASTER_7 = 17,
|
||||
IPC_SEM_DPDT_CTRL_ANT = 19, /*just for compile in portland */
|
||||
IPC_SEM_SMP_CPU0 = 21,
|
||||
IPC_SEM_SMP_CPU1 = 22,
|
||||
IPC_SEM_SMP_CPU2 = 23,
|
||||
IPC_SEM_SMP_CPU3 = 24,
|
||||
IPC_SEM_SYNC = 25,
|
||||
IPC_SEM_BBP = 26,
|
||||
IPC_SEM_CPUIDLE = 27,
|
||||
IPC_SEM_BBPPS = 28,
|
||||
IPC_SEM_HKADC = 29,
|
||||
IPC_SEM_SYSCTRL = 30,
|
||||
IPC_SEM_ZSP_HALT = 31,
|
||||
IPC_SEM_BUTTOM
|
||||
} IPC_SEM_ID_E;
|
||||
|
||||
#else
|
||||
typedef enum tagIPC_INT_LEV_E {
|
||||
IPC_CCPU_INT_SRC_HIFI_MSG = 0,
|
||||
IPC_CCPU_INT_SRC_MCU_MSG = 1,
|
||||
IPC_INT_DSP_HALT = 2,
|
||||
IPC_INT_DSP_RESUME = 3,
|
||||
IPC_INT_WAKE_GU = 6,
|
||||
IPC_INT_SLEEP_GU,
|
||||
IPC_INT_WAKE_GSM,
|
||||
IPC_INT_WAKE_WCDMA,
|
||||
IPC_INT_DSP_PS_PUB_MBX,
|
||||
IPC_INT_DSP_PS_MAC_MBX,
|
||||
IPC_INT_DSP_MBX_RSD,
|
||||
IPC_CCPU_INT_SRC_DSP_MNTN,
|
||||
IPC_CCPU_INT_SRC_DSP_RCM_PUB_MBX,
|
||||
IPC_CCPU_INT_SDR_CCPU_BBP_MASTER_ERROR,
|
||||
IPC_CCPU_INT_SRC_COMMON_END,
|
||||
|
||||
IPC_CCPU_INT_SRC_ACPU_RESET = IPC_CCPU_INT_SRC_COMMON_END,
|
||||
IPC_CCPU_SRC_ACPU_DUMP,
|
||||
IPC_CCPU_INT_SRC_ICC_PRIVATE,
|
||||
IPC_CCPU_INT_SRC_MCPU,
|
||||
IPC_CCPU_INT_SRC_MCPU_WDT,
|
||||
IPC_CCPU_INT_SRC_XDSP_1X_HALT,
|
||||
IPC_CCPU_INT_SRC_XDSP_HRPD_HALT,
|
||||
IPC_CCPU_INT_SRC_XDSP_1X_RESUME,
|
||||
IPC_CCPU_INT_SRC_XDSP_HRPD_RESUME,
|
||||
IPC_CCPU_INT_SRC_XDSP_MNTN,
|
||||
IPC_CCPU_INT_SRC_XDSP_PS_MBX,
|
||||
IPC_CCPU_INT_SRC_XDSP_RCM_MBX,
|
||||
|
||||
IPC_CCPU_INT_SRC_ACPU_ICC = 31,
|
||||
|
||||
IPC_CCPU_INT_SRC_ACPU_MSG = IPC_CCPU_INT_SRC_COMMON_END,
|
||||
IPC_CCPU_INT_SRC_ACPU_IFC,
|
||||
IPC_CCPU_INT_SRC_MCU_IFC,
|
||||
IPC_INT_ARM_SLEEP,
|
||||
|
||||
IPC_MCU_INT_SRC_ACPU_MSG = 0,
|
||||
IPC_MCU_INT_SRC_CCPU_MSG,
|
||||
IPC_MCU_INT_SRC_HIFI_MSG,
|
||||
IPC_MCU_INT_SRC_CCPU_IPF,
|
||||
IPC_MCU_INT_SRC_ACPU_PD, /* acpu power down */
|
||||
IPC_MCU_INT_SRC_HIFI_PD, /* hifi power down */
|
||||
IPC_MCU_INT_SRC_HIFI_DDR_VOTE,
|
||||
IPC_MCU_INT_SRC_ACPU_I2S_REMOTE_SLOW,
|
||||
IPC_MCU_INT_SRC_ACPU_I2S_REMOTE_SLEEP,
|
||||
IPC_MCU_INT_SRC_ACPU_I2S_REMOTE_INVALID,
|
||||
IPC_MCU_INT_SRC_COMMON_END,
|
||||
IPC_MCU_INT_SRC_ACPU_DRX = IPC_MCU_INT_SRC_COMMON_END,
|
||||
IPC_MCU_INT_SRC_CCPU_DRX,
|
||||
IPC_MCU_INT_SRC_ICC_PRIVATE,
|
||||
IPC_MCU_INT_SRC_DUMP,
|
||||
IPC_MCU_INT_SRC_HIFI_PU,
|
||||
IPC_MCU_INT_SRC_HIFI_DDR_DFS_QOS,
|
||||
IPC_MCU_INT_SRC_TEST,
|
||||
IPC_MCPU_INT_SRC_ACPU_USB_PME_EN,
|
||||
IPC_MCU_INT_SRC_ICC = 29,
|
||||
IPC_MCU_INT_SRC_CCPU_PD = 30,
|
||||
IPC_MCU_INT_SRC_CCPU_START = 31,
|
||||
|
||||
IPC_MCU_INT_SRC_CCPU_IFC = IPC_MCU_INT_SRC_COMMON_END,
|
||||
IPC_MCU_INT_SRC_ACPU_IFC,
|
||||
IPC_MCU_INT_SRC_HIFI_IFC,
|
||||
IPC_MCU_INT_SRC_ACPU0_PD, /* acpu0 power down, */
|
||||
IPC_MCU_INT_SRC_ACPU1_PD, /* acpu1 power down, */
|
||||
IPC_MCU_INT_SRC_ACPU2_PD, /* acpu2 power down, */
|
||||
IPC_MCU_INT_SRC_ACPU3_PD, /* acpu3 power down , */
|
||||
IPC_MCU_INT_SRC_ACPU4_PD, /* acpu4:cluster1 core0 power down */
|
||||
IPC_MCU_INT_SRC_ACPU5_PD, /* acpu5:cluster1 core1 power down */
|
||||
IPC_MCU_INT_SRC_ACPU6_PD, /* acpu6:cluster1 core2 power down */
|
||||
IPC_MCU_INT_SRC_ACPU7_PD, /* acpu7:cluster1 core3 power down */
|
||||
IPC_MCU_INT_SRC_ACPU_HOTPLUG, /* acpu hotplug--no use, */
|
||||
IPC_MCU_INT_SRC_MCU_AGT, /* mcu agent */
|
||||
IPC_MCU_INT_SRC_HIFI_MEMSHARE_DDR_VOTE,
|
||||
IPC_MCU_INT_SRC_HIFI_MEMSHARE_DDR_EXIT_VOTE,
|
||||
IPC_MCU_INT_SRC_ACPU_DFS, /*ACPU DFS */
|
||||
|
||||
IPC_MCU_INT_SRC_END,
|
||||
|
||||
IPC_ACPU_INT_SRC_CCPU_MSG = 0,
|
||||
IPC_ACPU_INT_SRC_HIFI_MSG = 1,
|
||||
IPC_ACPU_INT_SRC_MCU_MSG = 2,
|
||||
IPC_ACPU_INT_SRC_CCPU_NVIM = 3,
|
||||
IPC_INT_DICC_USRDATA = 4,
|
||||
IPC_INT_DICC_RELDATA = 5,
|
||||
IPC_ACPU_INT_SRC_CCPU_ICC,
|
||||
IPC_ACPU_INT_SRC_COMMON_END,
|
||||
IPC_ACPU_INT_SRC_ICC_PRIVATE = IPC_ACPU_INT_SRC_COMMON_END,
|
||||
IPC_ACPU_SRC_CCPU_DUMP,
|
||||
IPC_ACPU_INT_SRC_MCPU,
|
||||
IPC_ACPU_INT_SRC_MCPU_WDT,
|
||||
IPC_ACPU_INT_MCU_SRC_DUMP,
|
||||
IPC_ACPU_INT_SRC_CCPU_RESET_IDLE,
|
||||
IPC_ACPU_INT_SRC_CCPU_RESET_SUCC,
|
||||
|
||||
IPC_ACPU_INT_SRC_CCPU_LOG,
|
||||
IPC_ACPU_INT_SRC_MCU_FOR_TEST, /* test, m core to acore */
|
||||
IPC_ACPU_INT_SRC_CCPU_TEST_ENABLE,
|
||||
IPC_ACPU_INT_SRC_MCPU_USB_PME,
|
||||
IPC_ACPU_INT_SRC_HIFI_PC_VOICE_RX_DATA, /* hifi->acore pc voice */
|
||||
IPC_ACPU_INT_SRC_CCPU_PM_OM,
|
||||
|
||||
IPC_ACPU_INT_SRC_CCPU_IFC = IPC_ACPU_INT_SRC_COMMON_END,
|
||||
IPC_ACPU_INT_SRC_MCU_IFC,
|
||||
IPC_ACPU_INT_SRC_MCU_THERMAL_HIGH,
|
||||
IPC_ACPU_INT_SRC_MCU_THERMAL_LOW,
|
||||
IPC_ACPU_INI_SRC_MCU_TELE_MNTN_NOTIFY,
|
||||
IPC_ACPU_INI_SRC_MCU_EXC_REBOOT,
|
||||
IPC_ACPU_INT_SRC_CCPU_EXC_REBOOT,
|
||||
IPC_ACPU_INT_SRC_CCPU_NORMAL_REBOOT,
|
||||
IPC_ACPU_INT_SRC_MCU_DDR_EXC,
|
||||
|
||||
IPC_ACPU_INT_SRC_END,
|
||||
|
||||
IPC_HIFI_INT_SRC_ACPU_MSG = 0,
|
||||
IPC_HIFI_INT_SRC_CCPU_MSG,
|
||||
IPC_HIFI_INT_SRC_BBE_MSG,
|
||||
IPC_HIFI_INT_SRC_MCU_MSG,
|
||||
IPC_HIFI_INT_SRC_COMMON_END,
|
||||
|
||||
IPC_HIFI_INT_SRC_MCU_WAKE_DDR = IPC_HIFI_INT_SRC_COMMON_END,
|
||||
IPC_HIFI_INT_SRC_MCU_IFC,
|
||||
|
||||
IPC_HIFI_INT_SRC_END,
|
||||
|
||||
IPC_INT_MSP_DSP_OM_MBX = 0,
|
||||
IPC_INT_PS_DSP_PUB_MBX,
|
||||
IPC_INT_PS_DSP_MAC_MBX,
|
||||
IPC_INT_HIFI_DSP_MBX, /* HIFI->DSP */
|
||||
IPC_BBE16_INT_SRC_HIFI_MSG,
|
||||
|
||||
IPC_BBE16_INT_SRC_END,
|
||||
|
||||
IPC_XDSP_INT_SRC_CCPU_1X_WAKE = 0,
|
||||
IPC_XDSP_INT_SRC_CCPU_HRPD_WAKE,
|
||||
IPC_XDSP_INT_SRC_CCPU_OM_MBX,
|
||||
IPC_XDSP_INT_SRC_CCPU_PUB_MBX,
|
||||
|
||||
IPC_XDSP_INT_SRC_END,
|
||||
|
||||
IPC_INT_BUTTOM = 32,
|
||||
} IPC_INT_LEV_E;
|
||||
|
||||
typedef enum tagIPC_SEM_ID_E {
|
||||
IPC_SEM_MEM,
|
||||
IPC_SEM_DICC,
|
||||
IPC_SEM_EMMC,
|
||||
IPC_SEM_SYNC,
|
||||
IPC_SEM_SYSCTRL,
|
||||
IPC_SEM_BBP,
|
||||
IPC_SEM_RFILE_LOG,
|
||||
IPC_SEM_NVIM,
|
||||
IPC_SEM_EFUSE,
|
||||
IPC_SEM_DPDT_CTRL_ANT,
|
||||
IPC_SEM_BBPMASTER_0,
|
||||
IPC_SEM_BBPMASTER_1,
|
||||
IPC_SEM_BBPMASTER_2,
|
||||
IPC_SEM_BBPMASTER_3,
|
||||
IPC_SEM_BBPMASTER_5,
|
||||
IPC_SEM_BBPMASTER_6,
|
||||
IPC_SEM_BBPMASTER_7,
|
||||
IPC_SEM_COMMON_END,
|
||||
|
||||
IPC_SEM_SPI0 = IPC_SEM_COMMON_END,
|
||||
IPC_SEM_NV,
|
||||
IPC_SEM_GPIO,
|
||||
IPC_SEM_CLK,
|
||||
IPC_SEM_PMU,
|
||||
IPC_SEM_MTCMOS,
|
||||
IPC_SEM_IPF_PWCTRL,
|
||||
IPC_SEM_PMU_FPGA,
|
||||
IPC_SEM_NV_CRC,
|
||||
IPC_SEM_PM_OM_LOG,
|
||||
IPC_SEM_MDRV_LOCK,
|
||||
IPC_SEM_CDMA_DRX,
|
||||
IPC_SEM_GU_SLEEP,
|
||||
IPC_SEM2_IPC_TEST,
|
||||
|
||||
IPC_SEM_ICC = IPC_SEM_COMMON_END,
|
||||
IPC_SEM_NAND,
|
||||
IPC_SEM_TELE_MNTN,
|
||||
IPC_SEM_MEDPLL_STATE,
|
||||
IPC_SEM_SMP_CPU0,
|
||||
IPC_SEM_SMP_CPU1,
|
||||
IPC_SEM_SMP_CPU2,
|
||||
IPC_SEM_SMP_CPU3,
|
||||
IPC_SEM_CPUIDLE,
|
||||
IPC_SEM_BBPPS,
|
||||
IPC_SEM_HKADC,
|
||||
|
||||
IPC_SEM_END,
|
||||
|
||||
IPC_SEM_BUTTOM = 32
|
||||
} IPC_SEM_ID_E;
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
@@ -0,0 +1,561 @@
|
||||
|
||||
#ifndef _DSM_PUB_H
|
||||
#define _DSM_PUB_H
|
||||
#include <linux/version.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/wait.h>
|
||||
|
||||
#define CLIENT_NAME_LEN (32) /* max client name length */
|
||||
#define DSM_MAX_DEVICE_NAME_LEN (32) /* max device name length */
|
||||
#define DSM_MAX_MODULE_NAME_LEN (4) /* max module name length */
|
||||
#define DSM_MAX_IC_NAME_LEN (4) /* max ic name length */
|
||||
|
||||
/*dsm error no define*/
|
||||
#define DSM_ERR_NO_ERROR (0)
|
||||
#define DSM_ERR_I2C_TIMEOUT (1)
|
||||
|
||||
/* pmu irq */
|
||||
#define DSM_PMU_IRQ_ERROR_NO (920005000)
|
||||
#define DSM_PMU_VSYS_OV_D200UR_ERROR_NO (DSM_PMU_IRQ_ERROR_NO + 2)
|
||||
#define DSM_PMU_VSYS_UV_D10MR_ERROR_NO (DSM_PMU_IRQ_ERROR_NO + 3)
|
||||
#define DSM_PMU_VSYS_PWROFF_ABS_2D_ERROR_NO (DSM_PMU_IRQ_ERROR_NO + 4)
|
||||
#define DSM_PMU_VSYS_PWROFF_DEB_D80MR_ERROR_NO (DSM_PMU_IRQ_ERROR_NO + 5)
|
||||
#define DSM_PMU_VSYS_THSD_OTMP140_D1MR_ERROR_NO (DSM_PMU_IRQ_ERROR_NO + 6)
|
||||
#define DSM_PMU_VSYS_THSD_OTMP125_D1MR_ERROR_NO (DSM_PMU_IRQ_ERROR_NO + 7)
|
||||
|
||||
/* pmu ocp */
|
||||
#define DSM_PMU_OCP_ERROR_NO_BASE (920007000)
|
||||
#define DSM_PMU_OCPLDO2_ERROR_NO (DSM_PMU_OCP_ERROR_NO_BASE + 0)
|
||||
#define DSM_PMU_OCPLDO1_ERROR_NO (DSM_PMU_OCP_ERROR_NO_BASE + 1)
|
||||
#define DSM_PMU_OCPLDO0_ERROR_NO (DSM_PMU_OCP_ERROR_NO_BASE + 2)
|
||||
#define DSM_PMU_OCPBUCK4_ERROR_NO (DSM_PMU_OCP_ERROR_NO_BASE + 3)
|
||||
#define DSM_PMU_OCPBUCK3_ERROR_NO (DSM_PMU_OCP_ERROR_NO_BASE + 4)
|
||||
#define DSM_PMU_OCPBUCK2_ERROR_NO (DSM_PMU_OCP_ERROR_NO_BASE + 5)
|
||||
#define DSM_PMU_OCPBUCK1_ERROR_NO (DSM_PMU_OCP_ERROR_NO_BASE + 6)
|
||||
#define DSM_PMU_OCPBUCK0_ERROR_NO (DSM_PMU_OCP_ERROR_NO_BASE + 7)
|
||||
#define DSM_PMU_OCPLDO11_ERROR_NO (DSM_PMU_OCP_ERROR_NO_BASE + 8)
|
||||
#define DSM_PMU_OCPLDO10_ERROR_NO (DSM_PMU_OCP_ERROR_NO_BASE + 9)
|
||||
#define DSM_PMU_OCPLDO9_ERROR_NO (DSM_PMU_OCP_ERROR_NO_BASE + 10)
|
||||
#define DSM_PMU_OCPLDO8_ERROR_NO (DSM_PMU_OCP_ERROR_NO_BASE + 11)
|
||||
#define DSM_PMU_OCPLDO7_ERROR_NO (DSM_PMU_OCP_ERROR_NO_BASE + 12)
|
||||
#define DSM_PMU_OCPLDO5_ERROR_NO (DSM_PMU_OCP_ERROR_NO_BASE + 13)
|
||||
#define DSM_PMU_OCPLDO4_ERROR_NO (DSM_PMU_OCP_ERROR_NO_BASE + 14)
|
||||
#define DSM_PMU_OCPLDO3_ERROR_NO (DSM_PMU_OCP_ERROR_NO_BASE + 15)
|
||||
#define DSM_PMU_OCPLDO20_ERROR_NO (DSM_PMU_OCP_ERROR_NO_BASE + 16)
|
||||
#define DSM_PMU_OCPLDO19_ERROR_NO (DSM_PMU_OCP_ERROR_NO_BASE + 17)
|
||||
#define DSM_PMU_OCPLDO17_ERROR_NO (DSM_PMU_OCP_ERROR_NO_BASE + 18)
|
||||
#define DSM_PMU_OCPLDO16_ERROR_NO (DSM_PMU_OCP_ERROR_NO_BASE + 19)
|
||||
#define DSM_PMU_OCPLDO15_ERROR_NO (DSM_PMU_OCP_ERROR_NO_BASE + 20)
|
||||
#define DSM_PMU_OCPLDO14_ERROR_NO (DSM_PMU_OCP_ERROR_NO_BASE + 21)
|
||||
#define DSM_PMU_OCPLDO13_ERROR_NO (DSM_PMU_OCP_ERROR_NO_BASE + 22)
|
||||
#define DSM_PMU_OCPLDO12_ERROR_NO (DSM_PMU_OCP_ERROR_NO_BASE + 23)
|
||||
#define DSM_PMU_OCPLDO28_ERROR_NO (DSM_PMU_OCP_ERROR_NO_BASE + 24)
|
||||
#define DSM_PMU_OCPLDO27_ERROR_NO (DSM_PMU_OCP_ERROR_NO_BASE + 25)
|
||||
#define DSM_PMU_OCPLDO26_ERROR_NO (DSM_PMU_OCP_ERROR_NO_BASE + 26)
|
||||
#define DSM_PMU_OCPLDO25_ERROR_NO (DSM_PMU_OCP_ERROR_NO_BASE + 27)
|
||||
#define DSM_PMU_OCPLDO24_ERROR_NO (DSM_PMU_OCP_ERROR_NO_BASE + 28)
|
||||
#define DSM_PMU_OCPLDO23_ERROR_NO (DSM_PMU_OCP_ERROR_NO_BASE + 29)
|
||||
#define DSM_PMU_OCPLDO22_ERROR_NO (DSM_PMU_OCP_ERROR_NO_BASE + 30)
|
||||
#define DSM_PMU_OCPLDO21_ERROR_NO (DSM_PMU_OCP_ERROR_NO_BASE + 31)
|
||||
#define DSM_PMU_CLASSD_OCP_ERROR_NO (DSM_PMU_OCP_ERROR_NO_BASE + 32)
|
||||
#define DSM_PMU_OCPLDO32_ERROR_NO (DSM_PMU_OCP_ERROR_NO_BASE + 36)
|
||||
#define DSM_PMU_OCPLDO31_ERROR_NO (DSM_PMU_OCP_ERROR_NO_BASE + 37)
|
||||
#define DSM_PMU_OCPLDO30_ERROR_NO (DSM_PMU_OCP_ERROR_NO_BASE + 38)
|
||||
#define DSM_PMU_OCPLDO29_ERROR_NO (DSM_PMU_OCP_ERROR_NO_BASE + 39)
|
||||
#define DSM_PMU_BUCK4_SCP_ERROR_NO (DSM_PMU_OCP_ERROR_NO_BASE + 40)
|
||||
#define DSM_PMU_BUCK3_SCP_ERROR_NO (DSM_PMU_OCP_ERROR_NO_BASE + 41)
|
||||
#define DSM_PMU_BUCK2_SCP_ERROR_NO (DSM_PMU_OCP_ERROR_NO_BASE + 42)
|
||||
#define DSM_PMU_BUCK1_SCP_ERROR_NO (DSM_PMU_OCP_ERROR_NO_BASE + 43)
|
||||
#define DSM_PMU_BUCK0_SCP_ERROR_NO (DSM_PMU_OCP_ERROR_NO_BASE + 44)
|
||||
|
||||
#define DSM_CHARGER_ERROR_NO (920011000)
|
||||
|
||||
/* pmu coul */
|
||||
#define DSM_PMU_COUL_ERROR_NO (920006000)
|
||||
|
||||
/* battery detect */
|
||||
#define DSM_BATTERY_DETECT_ERROR_NO (920002000)
|
||||
|
||||
/* battery */
|
||||
#define DSM_BATTERY_ERROR_NO_BASE (920001000)
|
||||
#define ERROR_BATT_NOT_EXIST (DSM_BATTERY_ERROR_NO_BASE + 3)
|
||||
#define ERROR_BATT_TEMP_LOW (DSM_BATTERY_ERROR_NO_BASE + 4)
|
||||
#define ERROR_BATT_VOLT_HIGH (DSM_BATTERY_ERROR_NO_BASE + 5)
|
||||
#define ERROR_BATT_VOLT_LOW (DSM_BATTERY_ERROR_NO_BASE + 6)
|
||||
#define ERROR_BATT_TERMINATE_TOO_EARLY (DSM_BATTERY_ERROR_NO_BASE + 7)
|
||||
#define ERROR_BATT_NOT_TERMINATE (DSM_BATTERY_ERROR_NO_BASE + 8)
|
||||
#define ERROR_BATT_BAD_CURR_SENSOR (DSM_BATTERY_ERROR_NO_BASE + 9)
|
||||
#define ERROR_VBUS_VOLT_HIGH (DSM_BATTERY_ERROR_NO_BASE + 10)
|
||||
#define ERROR_WATCHDOG_RESET (DSM_BATTERY_ERROR_NO_BASE + 11)
|
||||
#define ERROR_CHARGE_CURR_OVERHIGH (DSM_BATTERY_ERROR_NO_BASE + 12)
|
||||
#define ERROR_DISCHARGE_CURR_OVERHIGH (DSM_BATTERY_ERROR_NO_BASE + 13)
|
||||
#define ERROR_CHARGE_CURR_ZERO (DSM_BATTERY_ERROR_NO_BASE + 14)
|
||||
#define ERROR_CHARGE_TEMP_FAULT (DSM_BATTERY_ERROR_NO_BASE + 15)
|
||||
#define ERROR_CHARGE_BATT_TEMP_SHUTDOWN (DSM_BATTERY_ERROR_NO_BASE + 16)
|
||||
#define ERROR_CHARGE_BATT_CAPACITY (DSM_BATTERY_ERROR_NO_BASE + 17)
|
||||
#define ERROR_CHARGE_CHARGER_TS (DSM_BATTERY_ERROR_NO_BASE + 18)
|
||||
#define ERROR_CHARGE_OTG (DSM_BATTERY_ERROR_NO_BASE + 19)
|
||||
#define ERROR_FCP_VOL_OVER_HIGH (DSM_BATTERY_ERROR_NO_BASE + 21)
|
||||
#define ERROR_FCP_DETECT (DSM_BATTERY_ERROR_NO_BASE + 22)
|
||||
#define ERROR_FCP_OUTPUT (DSM_BATTERY_ERROR_NO_BASE + 23)
|
||||
#define ERROR_SWITCH_ATTACH (DSM_BATTERY_ERROR_NO_BASE + 24)
|
||||
#define ERROR_ADAPTER_OVLT (DSM_BATTERY_ERROR_NO_BASE + 25)
|
||||
#define ERROR_ADAPTER_OCCURRENT (DSM_BATTERY_ERROR_NO_BASE + 26)
|
||||
#define ERROR_ADAPTER_OTEMP (DSM_BATTERY_ERROR_NO_BASE + 27)
|
||||
#define ERROR_SAFE_PLOICY_LEARN (DSM_BATTERY_ERROR_NO_BASE + 28)
|
||||
#define ERROR_SAFE_PLOICY_LEARN1 (DSM_BATTERY_ERROR_NO_BASE + 29)
|
||||
#define ERROR_SAFE_PLOICY_LEARN2 (DSM_BATTERY_ERROR_NO_BASE + 31)
|
||||
#define ERROR_SAFE_PLOICY_LEARN3 (DSM_BATTERY_ERROR_NO_BASE + 32)
|
||||
#define ERROR_BOOST_OCP (DSM_BATTERY_ERROR_NO_BASE + 33)
|
||||
#define ERROR_CHARGE_I2C_RW (DSM_BATTERY_ERROR_NO_BASE + 34)
|
||||
#define ERROR_BATT_SOC_CHANGE_FAST (DSM_BATTERY_ERROR_NO_BASE + 35)
|
||||
#define ERROR_CHARGE_VBAT_OVP (DSM_BATTERY_ERROR_NO_BASE + 36)
|
||||
/*internal short current detect*/
|
||||
#define DSM_BATTERY_ISCD_LEVEL0 (DSM_BATTERY_ERROR_NO_BASE + 48)
|
||||
#define DSM_BATTERY_ISCD_LEVEL1 (DSM_BATTERY_ERROR_NO_BASE + 49)
|
||||
#define DSM_BATTERY_ISCD_LEVEL2 (DSM_BATTERY_ERROR_NO_BASE + 50)
|
||||
#define DSM_BATTERY_ISCD_LEVEL3 (DSM_BATTERY_ERROR_NO_BASE + 51)
|
||||
#define DSM_BATTERY_ISCD_LEVEL4 (DSM_BATTERY_ERROR_NO_BASE + 52)
|
||||
#define DSM_BATTERY_ISCD_LEVEL5 (DSM_BATTERY_ERROR_NO_BASE + 53)
|
||||
#define DSM_BATTERY_ISCD_LEVEL6 (DSM_BATTERY_ERROR_NO_BASE + 54)
|
||||
#define DSM_BATTERY_ISCD_LEVEL7 (DSM_BATTERY_ERROR_NO_BASE + 55)
|
||||
#define DSM_BATTERY_ISCD_LEVEL8 (DSM_BATTERY_ERROR_NO_BASE + 56)
|
||||
|
||||
#define DSM_DIRECT_CHARGE_VOL_ACCURACY (DSM_BATTERY_ERROR_NO_BASE + 60)
|
||||
#define DSM_DIRECT_CHARGE_FULL_PATH_RESISTANCE (DSM_BATTERY_ERROR_NO_BASE + 61)
|
||||
#define DSM_DIRECT_CHARGE_LOADSWITCH_RESISTANCE (DSM_BATTERY_ERROR_NO_BASE + 62)
|
||||
#define DSM_DIRECT_CHARGE_USB_PORT_LEAKAGE_CURRENT (DSM_BATTERY_ERROR_NO_BASE + 63)
|
||||
#define DSM_DIRECT_CHARGE_VBUS_OVP (DSM_BATTERY_ERROR_NO_BASE + 64)
|
||||
#define DSM_DIRECT_CHARGE_REVERSE_OCP (DSM_BATTERY_ERROR_NO_BASE + 65)
|
||||
#define DSM_DIRECT_CHARGE_OTP (DSM_BATTERY_ERROR_NO_BASE + 66)
|
||||
#define DSM_DIRECT_CHARGE_INPUT_OCP (DSM_BATTERY_ERROR_NO_BASE + 67)
|
||||
#define DSM_DIRECT_CHARGE_ADAPTER_OTP (DSM_BATTERY_ERROR_NO_BASE + 68)
|
||||
|
||||
/* SMPL*/
|
||||
#define ERROR_NO_SMPL (920003000)
|
||||
|
||||
/* uscp */
|
||||
#define ERROR_NO_USB_SHORT_PROTECT (920004000)
|
||||
#define ERROR_NO_USB_SHORT_PROTECT_NTC (920004001)
|
||||
|
||||
/* pd_richtek */
|
||||
#define PD_RICHTEK_ERROR_NO_BASE (926010000)
|
||||
#define ERROR_RT_DPSTS_BOTH_CONNECTED (PD_RICHTEK_ERROR_NO_BASE + 0)
|
||||
#define ERROR_RT_UFP_INVALID (PD_RICHTEK_ERROR_NO_BASE + 1)
|
||||
#define ERROR_RT_DFP_INVALID (PD_RICHTEK_ERROR_NO_BASE + 2)
|
||||
#define ERROR_RT_OVER_VDO_MAX_SIZE (PD_RICHTEK_ERROR_NO_BASE + 3)
|
||||
#define ERROR_RT_PD_MSG_NULL (PD_RICHTEK_ERROR_NO_BASE + 4)
|
||||
#define ERROR_RT_DATA_OBJ_NULL (PD_RICHTEK_ERROR_NO_BASE + 5)
|
||||
#define ERROR_RT_OVER_VDO_MAX_SVID_SIZE (PD_RICHTEK_ERROR_NO_BASE + 6)
|
||||
#define ERROR_RT_PD_NR_PE_STATES (PD_RICHTEK_ERROR_NO_BASE + 7)
|
||||
#define ERROR_RT_PD_TIMER_NR (PD_RICHTEK_ERROR_NO_BASE + 8)
|
||||
#define ERROR_RT_PD_ALLOC_MSG (PD_RICHTEK_ERROR_NO_BASE + 9)
|
||||
#define ERROR_RT_PD_FREE_MSG (PD_RICHTEK_ERROR_NO_BASE + 10)
|
||||
#define ERROR_RT_TCPC_DEV_NULL (PD_RICHTEK_ERROR_NO_BASE + 11)
|
||||
#define ERROR_RT_DATA_ROLE_ISNOT_PD_ROLE_DFP (PD_RICHTEK_ERROR_NO_BASE + 12)
|
||||
#define ERROR_RT_SVID_DATA_NULL (PD_RICHTEK_ERROR_NO_BASE + 13)
|
||||
|
||||
/* tp */
|
||||
#define DSM_TP_I2C_RW_ERROR_NO (926004000)
|
||||
#define DSM_TP_FWUPDATE_ERROR_NO (926004001)
|
||||
#define DSM_TP_RAWDATA_ERROR_NO (20002)
|
||||
#define DSM_TP_FW_CRC_ERROR_NO (926004003)
|
||||
#define DSM_TP_DEV_STATUS_ERROR_NO (926004004)
|
||||
#define DSM_TP_CHANGE_REPORT_ERROR_NO (926004006)
|
||||
#define DSM_TP_GLOVE_ON_COUNT_ERROR_NO (926004007)
|
||||
#define DSM_TP_ATMEL_IN_MOISTURE_ERROR_NO (926004008)
|
||||
#define DSM_TP_ATMEL_IN_VNOISE_ERROR_NO (926004009)
|
||||
#define DSM_TP_CALIBRATION_CRC_ERROR_NO (926004010)
|
||||
#define DSM_TP_FW_CRASH_ERROR_NO (926004011)
|
||||
#define DSM_TP_HID_TIMEOUT_ERROR_NO (926004021)
|
||||
#define DSM_TP_STARTUP_FAIDED_ERROR_NO (926004022)
|
||||
#define DSM_TP_GET_LCD_PANEL_NAME_ERROR_NO (926004023)
|
||||
#define DSM_TP_NO_IRQ_ERROR_NO (20002)
|
||||
#define DSM_TP_GHOST_TOUCH_ERROR_NO (926004024)
|
||||
|
||||
/* lcd */
|
||||
#define DSM_LCD_LDI_UNDERFLOW_NO (922001000)
|
||||
#define DSM_LCD_LDI_UNDERFLOW_ERROR_NO (922001000)
|
||||
#define DSM_LCD_TE_TIME_OUT_ERROR_NO (922001001)
|
||||
#define DSM_LCD_STATUS_ERROR_NO (922001002)
|
||||
#define DSM_LCD_POWER_STATUS_ERROR_NO (922001003)
|
||||
#define DSM_LCD_PWM_ERROR_NO (922001004)
|
||||
#define DSM_LCD_BRIGHTNESS_ERROR_NO (922001005)
|
||||
#define DSM_LCD_ESD_RECOVERY_NO (922001006)
|
||||
#define DSM_LCD_ESD_OCP_RECOVERY_NO (922001007)
|
||||
#define DSM_LCD_OVP_ERROR_NO (922001008)
|
||||
#define DSM_LCD_OVP_COMFORT_MODE_NO (922001009)
|
||||
#define DSM_LCD_FB0_CLOSE_ERROR_NO (922001032)
|
||||
|
||||
#define DSM_SOC_HIFI_RESET (921001000)
|
||||
#define DSM_CODEC_HIFI_RESET (921001001)
|
||||
#define DSM_CODEC_HIFI_IF_OPEN_ERR (921001002)
|
||||
#define DSM_SOC_HIFI_HIGH_CPU (921001003)
|
||||
|
||||
#define DSM_HI6402_PLL_PD (921001004)
|
||||
#define DSM_HI6402_PLL_UNLOCK (921001005)
|
||||
#define DSM_HI6402_PLL_CANNOT_LOCK (921001006)
|
||||
#define DSM_HI6402_SLIMBUS_READ_ERR (921001007)
|
||||
#define DSM_HI6402_SLIMBUS_LOST_MS (921001008)
|
||||
#define DSM_HI6402_MBHC_HS_ERR_TYPE (921001009)
|
||||
#define DSM_SOC_HIFI_UPDATE_BUFF_DELAY (921001024)
|
||||
|
||||
/* anc_hs */
|
||||
#define ANC_HS_OPEN_BOOST_ERR (921002000)
|
||||
#define ANC_HS_CANCEL_WORK_BLOCK (921002001)
|
||||
#define ANC_HS_CLOSE_BOOST_ERR (921002002)
|
||||
#define ANC_HS_ADCH_READ_ERR (921002003)
|
||||
#define ANC_HS_ADC_FULL_ERR (921002004)
|
||||
#define ANC_HS_MIC_WITH_GPIO_ERR (921002005)
|
||||
#define ANC_HS_QUEUE_WORK_ERR (921002006)
|
||||
#define ANC_HS_BTN_NOT_IN_RANGE (921002007)
|
||||
|
||||
/*smartpa*/
|
||||
#define DSM_SMARTPA_I2C_ERR (921003000)
|
||||
|
||||
/* sdio */
|
||||
#define DSM_SDIO_RW_ERROR_NO (925002000)
|
||||
#define DSM_SDIO_DCM_INIT_ERROR_NO (925002001)
|
||||
#define DSM_SDIO_HARDWARE_LOCK_NO (925002002)
|
||||
#define DSM_SDIO_RW_TIMEOUT_NO (925002003)
|
||||
#define DSM_SDIO_ATTACH_ERR_NO (925002004)
|
||||
#define DSM_SDIO_CDM52_INVELADE_ARGUMENT_ERR_NO (925002005)
|
||||
#define DSM_SDIO_CDM52_R5_ERR_NO (925002006)
|
||||
#define DSM_SDIO_CDM52_R5_FUNCTION_NUMBER_ERR_NO (925002007)
|
||||
#define DSM_SDIO_CDM52_R5_OUT_OF_RANGE_ERR_NO (925002008)
|
||||
#define DSM_SDIO_CDM52__WAIT_FOR_CMD_ERR_NO (925002009)
|
||||
#define DSM_SDIO_CMD53_INVELADE_ARGUMENT_ERR_NO (925002010)
|
||||
#define DSM_SDIO_CMD53_ALLOC_TABLE_ERR_NO (925002011)
|
||||
#define DSM_SDIO_CMD53_CMD_ERR_NO (925002012)
|
||||
#define DSM_SDIO_CMD53_DATA_ERR_NO (925002013)
|
||||
#define DSM_SDIO_CMD53_R5_ERR_NO (925002014)
|
||||
#define DSM_SDIO_CMD53_R5_FUNCTION_NUMBER_ERR_NO (925002015)
|
||||
#define DSM_SDIO_CMD53_R5_OUT_OF_RANGE_ERR_NO (925002016)
|
||||
#define DSM_SIDO_UNKOWN_ERR_NO (925002017)
|
||||
|
||||
/* sensors */
|
||||
#define DSM_SHB_ERR_IOM7_CFG_DATA (926005000)
|
||||
#define DSM_SHB_ERR_IOM7_CMD (926005001)
|
||||
#define DSM_SHB_ERR_IOM7_DYNLOAD (926005002)
|
||||
#define DSM_SHB_ERR_IOM7_I2C_DBG (926005003)
|
||||
#define DSM_SHB_ERR_IOM7_IPC_TIMEOUT (926005004)
|
||||
#define DSM_SHB_ERR_IOM7_OTHER (926005005)
|
||||
#define DSM_SHB_ERR_IOM7_READ (926005006)
|
||||
#define DSM_SHB_ERR_IOM7_STEP (926005007)
|
||||
#define DSM_SHB_ERR_IOM7_WDG (926005008)
|
||||
#define DSM_SHB_ERR_IOM7_WRITE (926005009)
|
||||
|
||||
#define DSM_SHB_ERR_MCU_ACCEL (926006000)
|
||||
#define DSM_SHB_ERR_MCU_AIRPRESS (926006001)
|
||||
#define DSM_SHB_ERR_MCU_ALS (926006002)
|
||||
#define DSM_SHB_ERR_MCU_FUSION (926006003)
|
||||
#define DSM_SHB_ERR_MCU_GYRO (926006004)
|
||||
#define DSM_SHB_ERR_MCU_I2C_ERR (926006005)
|
||||
#define DSM_SHB_ERR_MCU_LABC (926006006)
|
||||
#define DSM_SHB_ERR_MCU_LIGHT (926006007)
|
||||
#define DSM_SHB_ERR_MCU_MAG (926006008)
|
||||
#define DSM_SHB_ERR_MCU_MOTION (926006009)
|
||||
#define DSM_SHB_ERR_MCU_OTHER (926006010)
|
||||
#define DSM_SHB_ERR_MCU_PDR (926006011)
|
||||
#define DSM_SHB_ERR_MCU_PEDOMETER (926006012)
|
||||
#define DSM_SHB_ERR_MCU_PS (926006013)
|
||||
#define DSM_SHB_ERR_MCU_SYS_MAIN_INIT (926006100)
|
||||
#define DSM_SHB_ERR_MCU_SYS_SERVER_INIT (926006101)
|
||||
#define DSM_SHB_ERR_MCU_TIMER_TIMEOUT (926006102)
|
||||
#define DSM_SHB_ERR_MCU_ACC_PERIOD_ERROR (926006103)
|
||||
#define DSM_SHB_ERR_MCU_CA (926006104)
|
||||
#define DSM_SHB_ERR_SYSCOUNT (926006105)
|
||||
|
||||
#define DSM_SHB_ERR_GSENSOR_I2C_ERR (926007000)
|
||||
#define DSM_SHB_ERR_GSENSOR_DATA_ABNORMAL (926007001)
|
||||
#define DSM_SHB_ERR_GSENSOR_DATA_ALL_ZERO (926007002)
|
||||
#define DSM_SHB_ERR_GSENSOR_DATA_NOT_UPDATE (926007003)
|
||||
#define DSM_SHB_ERR_LIGHT_I2C_ERR (926007004)
|
||||
#define DSM_SHB_ERR_LIGHT_IRQ_ERR (926007005)
|
||||
#define DSM_SHB_ERR_LIGHT_THRESHOLD_ERR (926007006)
|
||||
#define DSM_SHB_ERR_LIGHT_NO_IRQ (926007007)
|
||||
#define DSM_SHB_ERR_LIGHT_ENABLE_ERR (926007008)
|
||||
#define DSM_SHB_ERR_LIGHT_THRESHOLD_OUT (926007009)
|
||||
#define DSM_SHB_ERR_LIGHT_POWER_ERR (926007010)
|
||||
#define DSM_SHB_ERR_MAG_I2C_READ (926007011)
|
||||
#define DSM_SHB_ERR_MAG_DATA_ABNORAML (926007012)
|
||||
#define DSM_SHB_ERR_MAG_DATA_NOT_UPDATE (926007013)
|
||||
#define DSM_SHB_ERR_MAG_SELFTEST_ERR (926007014)
|
||||
#define DSM_SHB_ERR_SENSORSERVICE_EXIT_ERR (926007015)
|
||||
#define DSM_SHB_ERR_SENSORSERVICE_DATA_UPDATE (926007016)
|
||||
|
||||
/* key */
|
||||
#define DSM_KEY_ERROR_NO (926003000)
|
||||
#define DSM_POWER_KEY_ERROR_NO (926003001)
|
||||
|
||||
/* hall */
|
||||
#define DSM_HALL_ERROR_NO (926002000)
|
||||
|
||||
/* camera flash */
|
||||
#define DSM_FLASH_I2C_ERROR_NO (927002000)
|
||||
#define DSM_FLASH_OPEN_SHOTR_ERROR_NO (927002001)
|
||||
#define DSM_FLASH_HOT_DIE_ERROR_NO (927002002)
|
||||
|
||||
/* camera hal flash*/
|
||||
#define DSM_DALLAS_FLASH_SCHARGER_ERROR_NO (927003018)
|
||||
|
||||
/* ext isp */
|
||||
#define DSM_EXTISP_LOAD_FW_ERROR_NO (927007000)
|
||||
#define DSM_EXTISP_PQ_ERROR_NO (927007001)
|
||||
#define DSM_EXTISP_I2C_ERROR_NO (927007002)
|
||||
#define DSM_EXTISP_USPI_ERROR_NO (927007003)
|
||||
#define DSM_EXTISP_VCM_ERROR_NO (927007004)
|
||||
#define DSM_EXTISP_INTERRUPT_ERROR_NO (927007005)
|
||||
#define DSM_EXTISP_COMMONFUNC_ERROR_NO (927007006)
|
||||
#define DSM_EXTISP_A3_ERROR_NO (927007007)
|
||||
#define DSM_EXTISP_PIPE_ERROR_NO (927007008)
|
||||
#define DSM_EXTISP_RDN_ERROR_NO (927007009)
|
||||
#define DSM_EXTISP_TXLM_ERROR_NO (927007010)
|
||||
#define DSM_EXTISP_MTX_ERROR_NO (927007011)
|
||||
#define DSM_EXTISP_MRX_ERROR_NO (927007012)
|
||||
#define DSM_EXTISP_FEC0_ERROR_NO (927007013)
|
||||
#define DSM_EXTISP_SENSOR_ERROR_NO (927007014)
|
||||
#define DSM_EXTISP_FEC1_ERROR_NO (927007015)
|
||||
#define DSM_EXTISP_CAP_ERROR_NO (927007016)
|
||||
#define DSM_EXTISP_OTHER_ERROR_NO (927007017)
|
||||
|
||||
/* camera csi */
|
||||
#define DSM_CSI_MIPI0_ERROR_NO (927001000)
|
||||
#define DSM_CSI_MIPI1_ERROR_NO (927001001)
|
||||
|
||||
/* camera pmic */
|
||||
#define DSM_CAMPMIC_I2C_ERROR_NO (927010000)
|
||||
#define DSM_CAMPMIC_ENABLE_ERROR_NO (927010001)
|
||||
#define DSM_CAMPMIC_OVER_CURRENT_ERROR_NO (927010002)
|
||||
#define DSM_CAMPMIC_TSD_ERROR_NO (927010003)
|
||||
#define DSM_CAMPMIC_UNDER_VOLTAGE_ERROR_NO (927010004)
|
||||
|
||||
/* ov isp */
|
||||
#define DSM_ISP22_MCU_NO_RSP_ERROR_NO (927004000)
|
||||
#define DSM_ISP22_CMD_SET_ERROR_NO (927004001)
|
||||
#define DSM_ISP22_SENSOR_PRIMARY_ERROR_NO (927004002)
|
||||
#define DSM_ISP22_SENSOR_SECONDARY_ERROR_NO (927004003)
|
||||
#define DSM_ISP22_FLASH_ERROR_NO (927004004)
|
||||
|
||||
/* ivp */
|
||||
#define DSM_IVP_SMMU_ERROR_NO (927005000)
|
||||
#define DSM_IVP_WATCH_ERROR_NO (927005001)
|
||||
#define DSM_IVP_DWAXI_ERROR_NO (927005002)
|
||||
#define DSM_IVP_OPEN_ERROR_NO (927005003)
|
||||
#define DSM_IVP_MESSAGE_ERROR_NO (927005004)
|
||||
#define DSM_IVP_PANIC_ERROR_NO (927005005)
|
||||
|
||||
/* wifi */
|
||||
#define DSM_WIFI_MODULE_INIT_ERROR (909030001)
|
||||
#define DSM_WIFI_KSO_ERROR (909030002)
|
||||
#define DSM_WIFI_CMD52_ERROR (909030003)
|
||||
#define DSM_WIFI_CMD53_ERROR (909030004)
|
||||
/*wifi open*/
|
||||
#define DSM_WIFI_SDIO_RESET_COMM_ERROR (909030005)
|
||||
#define DSM_WIFI_SDIO_PROBE_ATTACH_ERROR (909030006)
|
||||
#define DSM_WIFI_SDIO_FIRMWARE_DL_ERROR (909030007)
|
||||
#define DSM_WIFI_DHD_DEV_INIT_IOCTL_ERROR (909030008)
|
||||
/*wifi scan*/
|
||||
#define DSM_WIFI_WLC_SET_PASSIVE_SCAN_ERROR (909030009)
|
||||
#define DSM_WIFI_WLC_SCAN_ERROR (909030010)
|
||||
#define DSM_WIFI_WLC_SET_SCANSUPPRESS_ERROR (909030011)
|
||||
#define DSM_WIFI_WLC_GET_CHANNEL_ERROR (909030012)
|
||||
#define DSM_WIFI_WLC_SCAN_RESULTS_ERROR (909030013)
|
||||
/*wifi connect*/
|
||||
#define DSM_WIFI_WLC_DISASSOC_ERROR (909030014)
|
||||
#define DSM_WIFI_WLC_SET_SSID_ERROR (909030015)
|
||||
#define DSM_WIFI_SET_CIPHER_ERROR (909030016)
|
||||
#define DSM_WIFI_SET_KEY_MGMT_ERROR (909030017)
|
||||
#define DSM_WIFI_SET_SHAREDKEY_ERROR (909030018)
|
||||
#define DSM_WIFI_OPEN_ERROR (909030019)
|
||||
|
||||
#define DSM_WIFI_RESERVED (20701)
|
||||
|
||||
/* recovery */
|
||||
#define DSM_RECOVERY_ERROR_NO (924001000)
|
||||
|
||||
/* selinux */
|
||||
#define DSM_SELINUX_ERROR_NO (924002000)
|
||||
|
||||
/* modem spi */
|
||||
#define DSM_SPI_WRITE_ACK_ERROR_NO (926009000)
|
||||
#define DSM_SPI_READ_ACK_ERROR_NO (DSM_SPI_WRITE_ACK_ERROR_NO+1)
|
||||
#define DSM_SPI_80_ACK_ERROR_NO (DSM_SPI_WRITE_ACK_ERROR_NO+2)
|
||||
#define DSM_SPI_SYNC_ERROR_NO (DSM_SPI_WRITE_ACK_ERROR_NO + 3)
|
||||
#define DSM_SPI_DOWN_ERROR_NO (DSM_SPI_WRITE_ACK_ERROR_NO + 4)
|
||||
#define DSM_SPI_PORT_BUSY_NO (DSM_SPI_WRITE_ACK_ERROR_NO + 5)
|
||||
#define DSM_SPI_DATA_READ_ERROR_NO (DSM_SPI_WRITE_ACK_ERROR_NO + 6)
|
||||
#define DSM_SPI_DATA_DROP_NO (DSM_SPI_WRITE_ACK_ERROR_NO + 7)
|
||||
#define DSM_SPI_AUTO_READY_ERROR_NO (DSM_SPI_WRITE_ACK_ERROR_NO + 8)
|
||||
#define DSM_SPI_KZALLOC_FAILED_NO (DSM_SPI_WRITE_ACK_ERROR_NO + 9)
|
||||
#define DSM_SPI_ALLOC_SKB_FAILED_NO (DSM_SPI_WRITE_ACK_ERROR_NO + 10)
|
||||
#define DSM_SPI_DOWN_RETRY_MAX_NO (DSM_SPI_WRITE_ACK_ERROR_NO + 11)
|
||||
#define DSM_SPI_SYNC_ERR_MAX_NO (DSM_SPI_WRITE_ACK_ERROR_NO + 12)
|
||||
#define DSM_APCP_SDIO_WRITE_ACK_ERROR_NO (DSM_SPI_WRITE_ACK_ERROR_NO + 13)
|
||||
|
||||
/* spi */
|
||||
#define DSM_SPI_ERROR_NO (925001000) /* spi_sync timeout error */
|
||||
#define DSM_SPI_INVALID_ARGUMENT_ERR_NO (925001001)
|
||||
#define DSM_SPI_SHUTDOWN_ERR_NO (925001002)
|
||||
#define DSM_SPI_UNKOWN_ERR_NO (925001003)
|
||||
#define DSM_SPI_SG_ALLOC_RX_PAGE_INVILAD_LEN (925001004)
|
||||
#define DSM_SPI_SG_ALLOC_TX_PAGE_INVILAD_LEN (925001005)
|
||||
#define DSM_SPI_RX_FIFO_NOT_EMPTY (925001006)
|
||||
#define DSM_SPI_SPI_IS_BUSY (925001007)
|
||||
|
||||
/* fs & ext4 */
|
||||
#define DSM_FS_EXT4_ERROR (928003000)
|
||||
#define DSM_FS_EXT4_ERROR_INODE (928003001)
|
||||
#define DSM_FS_EXT4_ERROR_FILE (928003002)
|
||||
#define DSM_FS_EXT4_ERROR_READ_SUPER (928003003)
|
||||
#define DSM_FS_EXT4_ERROR_READ_SUPER_SECOND (928003004)
|
||||
#define DSM_FS_EXT4_ERROR_WRITE_SUPER (928003005)
|
||||
|
||||
/* f2fs */
|
||||
#define DSM_F2FS_ERROR_MSG (928005000)
|
||||
#define DSM_F2FS_SUPER_NEED_FSCK (928005001)
|
||||
#define DSM_F2FS_BUGCHK_NEED_FSCK (928005002)
|
||||
|
||||
#define DSM_UART_OPEN_HWINIT_ERROR (22100)
|
||||
#define DSM_UART_OPEN_IRQ_REQUSET_FAILED (DSM_UART_OPEN_HWINIT_ERROR+1)
|
||||
#define DSM_UART_TX_DMA_MAP_FAILED (DSM_UART_OPEN_HWINIT_ERROR+2)
|
||||
#define DSM_UART_TX_DMA_BUSY_ERROR (DSM_UART_OPEN_HWINIT_ERROR+3)
|
||||
#define DSM_UART_RX_DMA_READ_BUFFER_FULL_ERROR (DSM_UART_OPEN_HWINIT_ERROR+4)
|
||||
#define DSM_UART_CONTROLLER_FIFO_OVERRUN_ERROR (DSM_UART_OPEN_HWINIT_ERROR+5)
|
||||
#define DSM_UART_CONTROLLER_LINE_BREAK_ERROR (DSM_UART_OPEN_HWINIT_ERROR+6)
|
||||
#define DSM_UART_CONTROLLER_PARITY_ERROR (DSM_UART_OPEN_HWINIT_ERROR+7)
|
||||
#define DSM_UART_CONTROLLER_FRAME_ERROR (DSM_UART_OPEN_HWINIT_ERROR+8)
|
||||
|
||||
/* hwtc */
|
||||
#define DSM_HWTC_ERROR_NO (927008000)
|
||||
|
||||
/* stat mm */
|
||||
#define DSM_MM_STAT (924003000)
|
||||
|
||||
/* nfc */
|
||||
#define DSM_NFC_I2C_WRITE_ERROR_NO (923002000)
|
||||
#define DSM_NFC_I2C_READ_ERROR_NO (923002001)
|
||||
#define DSM_NFC_CLK_ENABLE_ERROR_NO (923002002)
|
||||
#define DSM_NFC_I2C_WRITE_EOPNOTSUPP_ERROR_NO (923002003)
|
||||
#define DSM_NFC_I2C_READ_EOPNOTSUPP_ERROR_NO (923002004)
|
||||
#define DSM_NFC_I2C_WRITE_EREMOTEIO_ERROR_NO (923002005)
|
||||
#define DSM_NFC_I2C_READ_EREMOTEIO_ERROR_NO (923002006)
|
||||
#define DSM_NFC_RD_I2C_WRITE_ERROR_NO (923002007)
|
||||
#define DSM_NFC_RD_I2C_READ_ERROR_NO (923002008)
|
||||
#define DSM_NFC_RD_I2C_WRITE_EOPNOTSUPP_ERROR_NO (923002009)
|
||||
#define DSM_NFC_RD_I2C_READ_EOPNOTSUPP_ERROR_NO (923002010)
|
||||
#define DSM_NFC_RD_I2C_WRITE_EREMOTEIO_ERROR_NO (923002011)
|
||||
#define DSM_NFC_RD_I2C_READ_EREMOTEIO_ERROR_NO (923002012)
|
||||
#define DSM_NFC_SIM_CHECK_ERROR_NO (923002013)
|
||||
#define DSM_NFC_HAL_CORE_RESET (923002014)
|
||||
#define DSM_NFC_HISEE_COS_IMAGE_UPGRADE_ERROR_NO (923002015)
|
||||
#define DSM_NFC_HISEE_POWER_ON_OFF_ERROR_NO (923002016)
|
||||
#define DSM_NFC_HISEE_APDU_COMMAND_OPERATION_ERROR_NO (923002017)
|
||||
|
||||
/* fingerprint */
|
||||
#define DSM_FINGERPRINT_WAIT_FOR_FINGER_ERROR_NO (912001000)
|
||||
#define DSM_FINGERPRINT_CAPTURE_IMAGE_ERROR_NO (912001001)
|
||||
#define DSM_FINGERPRINT_IDENTIFY_ERROR_NO (912001002)
|
||||
#define DSM_FINGERPRINT_TEST_DEADPIXELS_ERROR_NO (912001003)
|
||||
#define DSM_FINGERPRINT_ENROLL_ERROR_NO (912001004)
|
||||
#define DSM_FINGERPRINT_REMOVE_TEMPLATE_ERROR_NO (912001005)
|
||||
#define DSM_FINGERPRINT_ENUMERATE_ERROR_NO (912001006)
|
||||
#define DSM_FINGERPRINT_MODULE_OPEN_ERROR_NO (912001007)
|
||||
#define DSM_FINGERPRINT_PROBE_FAIL_ERROR_NO (912001008)
|
||||
#define DSM_FINGERPRINT_DIFF_DEADPIXELS_ERROR_NO (912001009)
|
||||
#define DSM_FINGERPRINT_MANY_DEADPIXELS_ERROR_NO (912001010)
|
||||
#define DSM_FINGERPRINT_DB_FILE_LOST_ERROR_NO (912001011)
|
||||
|
||||
/* DM */
|
||||
#define DSM_DM_VERITY_ERROR_NO (928001000)
|
||||
#define DSM_DM_VERITY_FEC_INFO_NO (928001001)
|
||||
#define DSM_DM_VERITY_CE_ERROR_NO (928001002)
|
||||
/*cpu_buck*/
|
||||
#define ERROR_NO_CPU_BUCK_BASE (920012000)
|
||||
|
||||
struct dsm_client_ops {
|
||||
int (*poll_state) (void);
|
||||
int (*dump_func) (int type, void *buff, int size);
|
||||
};
|
||||
|
||||
struct dsm_dev {
|
||||
const char *name;
|
||||
const char *device_name;
|
||||
const char *ic_name;
|
||||
const char *module_name;
|
||||
struct dsm_client_ops *fops;
|
||||
size_t buff_size;
|
||||
};
|
||||
|
||||
struct dsm_client {
|
||||
char *client_name;
|
||||
char *device_name;
|
||||
char *ic_name;
|
||||
char *module_name;
|
||||
int client_id;
|
||||
int error_no;
|
||||
unsigned long buff_flag;
|
||||
struct dsm_client_ops *cops;
|
||||
wait_queue_head_t waitq;
|
||||
size_t read_size;
|
||||
size_t used_size;
|
||||
size_t buff_size;
|
||||
u8 dump_buff[];
|
||||
};
|
||||
|
||||
/*
|
||||
* for userspace client, such as sensor service, please refer to it.
|
||||
*/
|
||||
struct dsm_extern_client {
|
||||
char client_name[CLIENT_NAME_LEN];
|
||||
int buf_size;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_HUAWEI_DSM
|
||||
struct dsm_client *dsm_register_client(struct dsm_dev *dev);
|
||||
struct dsm_client *dsm_find_client(char *dsm_name);
|
||||
int dsm_client_ocuppy(struct dsm_client *client);
|
||||
int dsm_client_unocuppy(struct dsm_client *client);
|
||||
int dsm_client_record(struct dsm_client *client, const char *fmt, ...);
|
||||
int dsm_client_copy(struct dsm_client *client, void *src, int sz);
|
||||
void dsm_client_notify(struct dsm_client *client, int error_no);
|
||||
#else
|
||||
static inline struct dsm_client *dsm_register_client(struct dsm_dev *dev)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline struct dsm_client *dsm_find_client(char *dsm_name)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline int dsm_client_ocuppy(struct dsm_client *client)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline int dsm_client_unocuppy(struct dsm_client *client)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int dsm_client_record(struct dsm_client *client, const char *fmt,
|
||||
...)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int dsm_client_copy(struct dsm_client *client, void *src, int sz)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void dsm_client_notify(struct dsm_client *client, int error_no)
|
||||
{
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user