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:
Niranjan Yadla
2017-08-11 16:52:20 -07:00
committed by Dmitry Shmidt
parent 6d1ee5eb03
commit 79318ad740
21 changed files with 5269 additions and 0 deletions
+2
View File
@@ -1 +1,3 @@
source "drivers/hisi/hifi_mailbox/mailbox/Kconfig"
source "drivers/hisi/hifi_mailbox/ipcm/Kconfig"
+1
View File
@@ -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, &param);
/*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
+561
View File
@@ -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