455 lines
11 KiB
C
455 lines
11 KiB
C
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||
|
/*
|
||
|
* Copyright (C) 2016 MediaTek Inc.
|
||
|
*/
|
||
|
|
||
|
#ifndef __CCCI_MODEM_H__
|
||
|
#define __CCCI_MODEM_H__
|
||
|
|
||
|
#include "mt-plat/mtk_ccci_common.h"
|
||
|
|
||
|
enum MD_FORCE_ASSERT_TYPE {
|
||
|
MD_FORCE_ASSERT_RESERVE = 0x000,
|
||
|
MD_FORCE_ASSERT_BY_MD_NO_RESPONSE = 0x100,
|
||
|
MD_FORCE_ASSERT_BY_MD_SEQ_ERROR = 0x200,
|
||
|
MD_FORCE_ASSERT_BY_AP_Q0_BLOCKED = 0x300,
|
||
|
MD_FORCE_ASSERT_BY_USER_TRIGGER = 0x400,
|
||
|
MD_FORCE_ASSERT_BY_MD_WDT = 0x500,
|
||
|
MD_FORCE_ASSERT_BY_AP_MPU = 0x600,
|
||
|
};
|
||
|
|
||
|
enum MODEM_DUMP_FLAG {
|
||
|
DUMP_FLAG_CCIF = (1 << 0), /* dump ccif sw data. */
|
||
|
/* tricky part, use argument length as queue index */
|
||
|
DUMP_FLAG_CLDMA = (1 << 1),
|
||
|
DUMP_FLAG_REG = (1 << 2), /* dump modem reg. */
|
||
|
DUMP_FLAG_SMEM_EXP = (1 << 3),
|
||
|
DUMP_FLAG_IMAGE = (1 << 4),
|
||
|
DUMP_FLAG_LAYOUT = (1 << 5),
|
||
|
DUMP_FLAG_QUEUE_0 = (1 << 6),
|
||
|
DUMP_FLAG_QUEUE_0_1 = (1 << 7),
|
||
|
DUMP_FLAG_CCIF_REG = (1 << 8), /* dump ccif reg. */
|
||
|
DUMP_FLAG_SMEM_MDSLP = (1 << 9),
|
||
|
DUMP_FLAG_MD_WDT = (1 << 10),
|
||
|
DUMP_FLAG_SMEM_CCISM = (1<<11),
|
||
|
DUMP_MD_BOOTUP_STATUS = (1<<12),
|
||
|
DUMP_FLAG_IRQ_STATUS = (1<<13),
|
||
|
DUMP_FLAG_SMEM_CCB_CTRL = (1<<14),
|
||
|
DUMP_FLAG_SMEM_CCB_DATA = (1<<15),
|
||
|
DUMP_FLAG_PCCIF_REG = (1 << 16),
|
||
|
DUMP_FLAG_GET_TRAFFIC = (1 << 18),
|
||
|
};
|
||
|
|
||
|
enum {
|
||
|
MD_DBG_DUMP_INVALID = -1,
|
||
|
/*AP side reg 0~15*/
|
||
|
MD_DBG_DUMP_PCMON = 0,
|
||
|
MD_DBG_DUMP_BUSREC,
|
||
|
MD_DBG_DUMP_BUS,
|
||
|
MD_DBG_DUMP_PLL,
|
||
|
MD_DBG_DUMP_ECT,
|
||
|
|
||
|
MD_DBG_DUMP_SMEM,
|
||
|
/*md side reg 16~23*/
|
||
|
MD_DBG_DUMP_TOPSM = 16,
|
||
|
MD_DBG_DUMP_MDRGU,
|
||
|
MD_DBG_DUMP_OST,
|
||
|
/*misc*/
|
||
|
MD_DBG_DUMP_PORT = 24,
|
||
|
/*bit map*/
|
||
|
MD_DBG_DUMP_AP_REG = 0xFFFF,
|
||
|
MD_DBG_DUMP_ALL = 0x7FFFFFFF,
|
||
|
};
|
||
|
|
||
|
enum MD_BOOT_MODE {
|
||
|
MD_BOOT_MODE_INVALID = 0,
|
||
|
MD_BOOT_MODE_NORMAL,
|
||
|
MD_BOOT_MODE_META,
|
||
|
MD_BOOT_MODE_MAX,
|
||
|
};
|
||
|
|
||
|
enum {
|
||
|
MD_CFG_MDLOG_MODE,
|
||
|
MD_CFG_SBP_CODE,
|
||
|
MD_CFG_DUMP_FLAG,
|
||
|
MD_CFG_SBP_SUB_ID,
|
||
|
MD_CFG_RAT_CHK_FLAG,
|
||
|
MD_CFG_RAT_STR0,
|
||
|
MD_CFG_RAT_STR1,
|
||
|
MD_CFG_RAT_STR2,
|
||
|
MD_CFG_RAT_STR3,
|
||
|
MD_CFG_RAT_STR4,
|
||
|
MD_CFG_RAT_STR5,
|
||
|
MD_CFG_WM_IDX,
|
||
|
MD_CFG_LOG_LEVEL,
|
||
|
};
|
||
|
|
||
|
enum {
|
||
|
ALL_CCIF = 0,
|
||
|
AP_MD1_CCIF,
|
||
|
AP_MD3_CCIF,
|
||
|
MD1_MD3_CCIF,
|
||
|
};
|
||
|
|
||
|
enum {
|
||
|
AP_MD_HS_V2 = 2,
|
||
|
};
|
||
|
|
||
|
enum {
|
||
|
SMF_CLR_RESET = (1 << 0), /* clear when reset modem */
|
||
|
SMF_NCLR_FIRST = (1 << 1), /* do not clear even in MD first boot up */
|
||
|
SMF_MD3_RELATED = (1 << 2), /* MD3 related share memory */
|
||
|
};
|
||
|
|
||
|
struct ccci_mem_region {
|
||
|
phys_addr_t base_md_view_phy;
|
||
|
phys_addr_t base_ap_view_phy;
|
||
|
void __iomem *base_ap_view_vir;
|
||
|
unsigned int size;
|
||
|
};
|
||
|
|
||
|
struct ccci_smem_region {
|
||
|
/* pre-defined */
|
||
|
unsigned int id;
|
||
|
unsigned int offset; /* in bank4 */
|
||
|
unsigned int size;
|
||
|
unsigned int flag;
|
||
|
/* runtime calculated */
|
||
|
phys_addr_t base_md_view_phy;
|
||
|
phys_addr_t base_ap_view_phy;
|
||
|
void __iomem *base_ap_view_vir;
|
||
|
};
|
||
|
|
||
|
struct ccci_mem_layout {
|
||
|
/* MD RO and RW (bank0) */
|
||
|
struct ccci_mem_region md_bank0;
|
||
|
|
||
|
/* share memory (bank4) */
|
||
|
struct ccci_mem_region md_bank4_noncacheable_total;
|
||
|
struct ccci_mem_region md_bank4_cacheable_total;
|
||
|
|
||
|
/* share memory detail */
|
||
|
struct ccci_smem_region *md_bank4_noncacheable;
|
||
|
struct ccci_smem_region *md_bank4_cacheable;
|
||
|
};
|
||
|
|
||
|
enum{
|
||
|
CCCI_FEATURE_NOT_EXIST = 0,
|
||
|
CCCI_FEATURE_NOT_SUPPORT = 1,
|
||
|
CCCI_FEATURE_MUST_SUPPORT = 2,
|
||
|
CCCI_FEATURE_OPTIONAL_SUPPORT = 3,
|
||
|
CCCI_FEATURE_SUPPORT_BACKWARD_COMPAT = 4,
|
||
|
}; /* CCCI_RUNTIME_FEATURE_SUPPORT_TYPE */
|
||
|
|
||
|
enum{
|
||
|
BOOT_INFO = 0,
|
||
|
EXCEPTION_SHARE_MEMORY,
|
||
|
CCIF_SHARE_MEMORY,
|
||
|
SMART_LOGGING_SHARE_MEMORY,
|
||
|
MD1MD3_SHARE_MEMORY,
|
||
|
/*ccci misc info*/
|
||
|
MISC_INFO_HIF_DMA_REMAP,
|
||
|
MISC_INFO_RTC_32K_LESS,
|
||
|
MISC_INFO_RANDOM_SEED_NUM,
|
||
|
MISC_INFO_GPS_COCLOCK,
|
||
|
MISC_INFO_SBP_ID,
|
||
|
MISC_INFO_CCCI, /*=10*/
|
||
|
MISC_INFO_CLIB_TIME,
|
||
|
MISC_INFO_C2K,
|
||
|
MD_IMAGE_START_MEMORY,
|
||
|
CCISM_SHARE_MEMORY,
|
||
|
CCB_SHARE_MEMORY, /* total size of all CCB regions */
|
||
|
DHL_RAW_SHARE_MEMORY,
|
||
|
DT_NETD_SHARE_MEMORY,
|
||
|
DT_USB_SHARE_MEMORY,
|
||
|
EE_AFTER_EPOF,
|
||
|
AP_CCMNI_MTU, /* max Rx packet buffer size on AP side */
|
||
|
MISC_INFO_CUSTOMER_VAL = 21,
|
||
|
CCCI_FAST_HEADER = 22,
|
||
|
MISC_INFO_C2K_MEID = 24,
|
||
|
LWA_SHARE_MEMORY = 25,
|
||
|
AUDIO_RAW_SHARE_MEMORY = 26,
|
||
|
MULTI_MD_MPU = 27,
|
||
|
CCISM_SHARE_MEMORY_EXP = 28,
|
||
|
MD_PHY_CAPTURE = 29,
|
||
|
MD_CONSYS_SHARE_MEMORY = 30,
|
||
|
MD_USIP_SHARE_MEMORY = 31,
|
||
|
MD_MTEE_SHARE_MEMORY_ENABLE = 32,
|
||
|
MD_POS_SHARE_MEMORY = 33,
|
||
|
UDC_RAW_SHARE_MEMORY = 34,
|
||
|
MD_WIFI_PROXY_SHARE_MEMORY = 35,
|
||
|
NVRAM_CACHE_SHARE_MEMORY = 36,
|
||
|
SECURITY_SHARE_MEMORY = 37,
|
||
|
MD_MEM_AP_VIEW_INF = 38,
|
||
|
CCCI_MD_BIGDATA_SHARE_MEMORY = 46,
|
||
|
CCCI_MD_IPCA_BIGDATA_SHARE_MEMORY = 47,
|
||
|
AP_DEBUG_LEVEL = 48,
|
||
|
MD_RUNTIME_FEATURE_ID_MAX,
|
||
|
}; /* MD_CCCI_RUNTIME_FEATURE_ID; */
|
||
|
|
||
|
enum AP_CCCI_RUNTIME_FEATURE_ID {
|
||
|
AT_CHANNEL_NUM = 0,
|
||
|
AP_RUNTIME_FEATURE_ID_MAX,
|
||
|
};
|
||
|
|
||
|
/* Rutime data common part */
|
||
|
enum MISC_FEATURE_STATE {
|
||
|
FEATURE_NOT_EXIST = 0,
|
||
|
FEATURE_NOT_SUPPORT,
|
||
|
FEATURE_SUPPORT,
|
||
|
FEATURE_PARTIALLY_SUPPORT,
|
||
|
};
|
||
|
|
||
|
enum MISC_FEATURE_ID {
|
||
|
MISC_DMA_ADDR = 0,
|
||
|
MISC_32K_LESS,
|
||
|
MISC_RAND_SEED,
|
||
|
MISC_MD_COCLK_SETTING,
|
||
|
MISC_MD_SBP_SETTING,
|
||
|
MISC_MD_SEQ_CHECK,
|
||
|
MISC_MD_CLIB_TIME,
|
||
|
MISC_MD_C2K_ON,
|
||
|
};
|
||
|
|
||
|
struct ccci_feature_support {
|
||
|
u8 support_mask:4;
|
||
|
u8 version:4;
|
||
|
};
|
||
|
|
||
|
#define FEATURE_COUNT 64
|
||
|
#define MD_FEATURE_QUERY_PATTERN 0x49434343
|
||
|
#define AP_FEATURE_QUERY_PATTERN 0x43434349
|
||
|
#define CCCI_AP_RUNTIME_RESERVED_SIZE 120
|
||
|
#define CCCI_MD_RUNTIME_RESERVED_SIZE 152
|
||
|
|
||
|
struct md_query_ap_feature {
|
||
|
u32 head_pattern;
|
||
|
struct ccci_feature_support feature_set[FEATURE_COUNT];
|
||
|
u32 tail_pattern;
|
||
|
#if (MD_GENERATION >= 6293)
|
||
|
u8 reserved[CCCI_MD_RUNTIME_RESERVED_SIZE];
|
||
|
#endif
|
||
|
};
|
||
|
|
||
|
struct ap_query_md_feature {
|
||
|
u32 head_pattern;
|
||
|
struct ccci_feature_support feature_set[FEATURE_COUNT];
|
||
|
u32 share_memory_support;
|
||
|
u32 ap_runtime_data_addr;
|
||
|
u32 ap_runtime_data_size;
|
||
|
u32 md_runtime_data_addr;
|
||
|
u32 md_runtime_data_size;
|
||
|
u32 set_md_mpu_start_addr;
|
||
|
u32 set_md_mpu_total_size;
|
||
|
u32 tail_pattern;
|
||
|
#if (MD_GENERATION >= 6293)
|
||
|
u8 reserved[CCCI_AP_RUNTIME_RESERVED_SIZE];
|
||
|
#endif
|
||
|
};
|
||
|
|
||
|
struct ap_query_md_feature_v2_1 {
|
||
|
u32 head_pattern;
|
||
|
struct ccci_feature_support feature_set[FEATURE_COUNT];
|
||
|
u32 share_memory_support;
|
||
|
u32 ap_runtime_data_addr;
|
||
|
u32 ap_runtime_data_size;
|
||
|
u32 md_runtime_data_addr;
|
||
|
u32 md_runtime_data_size;
|
||
|
u32 noncached_mpu_start_addr;
|
||
|
u32 noncached_mpu_total_size;
|
||
|
u32 cached_mpu_start_addr;
|
||
|
u32 cached_mpu_total_size;
|
||
|
u32 reserve_addr[12];
|
||
|
u32 tail_pattern;
|
||
|
};
|
||
|
|
||
|
enum HIF_EX_STAGE {
|
||
|
HIF_EX_INIT = 0, /* interrupt */
|
||
|
HIF_EX_ACK, /* AP->MD */
|
||
|
HIF_EX_INIT_DONE, /* polling */
|
||
|
HIF_EX_CLEARQ_DONE, /* interrupt */
|
||
|
HIF_EX_CLEARQ_ACK, /* AP->MD */
|
||
|
HIF_EX_ALLQ_RESET, /* polling */
|
||
|
};
|
||
|
|
||
|
enum {
|
||
|
P_CORE = 0,
|
||
|
VOLTE_CORE,
|
||
|
};
|
||
|
|
||
|
enum {
|
||
|
EXTERNAL_MODEM = 0,
|
||
|
INTERNAL_MODEM = 1,
|
||
|
MULTI_MD_MPU_SUPPORT = 2,
|
||
|
}; /* SHARE_MEMORY_SUPPORT */
|
||
|
|
||
|
/* runtime data format uses EEMCS's version, NOT the same with legacy CCCI */
|
||
|
struct modem_runtime {
|
||
|
u32 Prefix; /* "CCIF" */
|
||
|
u32 Platform_L; /* Hardware Platform String ex: "TK6516E0" */
|
||
|
u32 Platform_H;
|
||
|
u32 DriverVersion; /* 0x00000923 since W09.23 */
|
||
|
u32 BootChannel; /* Channel to ACK AP with boot ready */
|
||
|
/* MD is booting. NORMAL_BOOT_ID or META_BOOT_ID */
|
||
|
u32 BootingStartID;
|
||
|
/* not using in EEMCS */
|
||
|
u32 BootAttributes; /* Attributes passing from AP to MD Booting */
|
||
|
/* MD response ID if boot successful and ready */
|
||
|
u32 BootReadyID;
|
||
|
u32 FileShareMemBase;
|
||
|
u32 FileShareMemSize;
|
||
|
u32 ExceShareMemBase;
|
||
|
u32 ExceShareMemSize;
|
||
|
u32 CCIFShareMemBase;
|
||
|
u32 CCIFShareMemSize;
|
||
|
u32 DHLShareMemBase; /* For DHL */
|
||
|
u32 DHLShareMemSize;
|
||
|
u32 MD1MD3ShareMemBase; /* For MD1 MD3 share memory */
|
||
|
u32 MD1MD3ShareMemSize;
|
||
|
u32 TotalShareMemBase;
|
||
|
u32 TotalShareMemSize;
|
||
|
u32 CheckSum;
|
||
|
|
||
|
u32 Postfix; /* "CCIF" */
|
||
|
/* misc region */
|
||
|
u32 misc_prefix; /* "MISC" */
|
||
|
u32 support_mask;
|
||
|
u32 index;
|
||
|
u32 next;
|
||
|
u32 feature_0_val[4];
|
||
|
u32 feature_1_val[4];
|
||
|
u32 feature_2_val[4];
|
||
|
u32 feature_3_val[4];
|
||
|
u32 feature_4_val[4];
|
||
|
u32 feature_5_val[4];
|
||
|
u32 feature_6_val[4];
|
||
|
u32 feature_7_val[4];
|
||
|
u32 feature_8_val[4];
|
||
|
u32 feature_9_val[4];
|
||
|
u32 feature_10_val[4];
|
||
|
u32 feature_11_val[4];
|
||
|
u32 feature_12_val[4];
|
||
|
u32 feature_13_val[4];
|
||
|
u32 feature_14_val[4];
|
||
|
u32 feature_15_val[4];
|
||
|
u32 reserved_2[3];
|
||
|
u32 misc_postfix; /* "MISC" */
|
||
|
|
||
|
} __packed;
|
||
|
|
||
|
struct ccci_runtime_feature {
|
||
|
u8 feature_id; /*for debug only*/
|
||
|
struct ccci_feature_support support_info;
|
||
|
u8 reserved[2];
|
||
|
u32 data_len;
|
||
|
u8 data[0];
|
||
|
};
|
||
|
|
||
|
struct ccci_runtime_boot_info {
|
||
|
u32 boot_channel;
|
||
|
u32 booting_start_id;
|
||
|
u32 boot_attributes;
|
||
|
u32 boot_ready_id;
|
||
|
};
|
||
|
|
||
|
struct ccci_runtime_share_memory {
|
||
|
u32 addr;
|
||
|
u32 size;
|
||
|
};
|
||
|
|
||
|
struct ccci_misc_info_element {
|
||
|
u32 feature[4];
|
||
|
};
|
||
|
|
||
|
struct ccci_runtime_md_mem_ap_addr {
|
||
|
u32 md_view_phy;
|
||
|
u32 size;
|
||
|
u32 ap_view_phy_lo32;
|
||
|
u32 ap_view_phy_hi32;
|
||
|
};
|
||
|
|
||
|
enum {
|
||
|
MD_FLIGHT_MODE_NONE = 0,
|
||
|
MD_FLIGHT_MODE_ENTER = 1,
|
||
|
MD_FLIGHT_MODE_LEAVE = 2
|
||
|
};/* FLIGHT_STAGE */
|
||
|
|
||
|
extern unsigned int is_cdma2000_enable(int md_id);
|
||
|
extern int ccci_get_md_sec_smem_size_and_update(void);
|
||
|
|
||
|
struct ccci_mem_layout *ccci_md_get_mem(int md_id);
|
||
|
struct ccci_smem_region *ccci_md_get_smem_by_user_id(int md_id,
|
||
|
enum SMEM_USER_ID user_id);
|
||
|
void ccci_md_clear_smem(int md_id, int first_boot);
|
||
|
int ccci_md_start(unsigned char md_id);
|
||
|
int ccci_md_soft_start(unsigned char md_id, unsigned int sim_mode);
|
||
|
int ccci_md_send_runtime_data(unsigned char md_id);
|
||
|
int ccci_md_reset_pccif(unsigned char md_id);
|
||
|
void ccci_md_dump_info(unsigned char md_id, enum MODEM_DUMP_FLAG flag,
|
||
|
void *buff, int length);
|
||
|
int ccci_md_pre_stop(unsigned char md_id, unsigned int stop_type);
|
||
|
int ccci_md_stop(unsigned char md_id, unsigned int stop_type);
|
||
|
int ccci_md_soft_stop(unsigned char md_id, unsigned int sim_mode);
|
||
|
int ccci_md_force_assert(unsigned char md_id, enum MD_FORCE_ASSERT_TYPE type,
|
||
|
char *param, int len);
|
||
|
int ccci_md_prepare_runtime_data(unsigned char md_id, unsigned char *data,
|
||
|
int length);
|
||
|
void ccci_md_exception_handshake(unsigned char md_id, int timeout);
|
||
|
int ccci_md_send_ccb_tx_notify(unsigned char md_id, int core_id);
|
||
|
int ccci_md_set_boot_data(unsigned char md_id, unsigned int data[], int len);
|
||
|
int ccci_md_pre_start(unsigned char md_id);
|
||
|
int ccci_md_post_start(unsigned char md_id);
|
||
|
|
||
|
struct ccci_modem_cfg {
|
||
|
unsigned int load_type;
|
||
|
unsigned int load_type_saving;
|
||
|
unsigned int setting;
|
||
|
};
|
||
|
|
||
|
struct ccci_sim_setting {
|
||
|
int sim_mode;
|
||
|
int slot1_mode; /* 0:CDMA 1:GSM 2:WCDMA 3:TDCDMA */
|
||
|
int slot2_mode; /* 0:CDMA 1:GSM 2:WCDMA 3:TDCDMA */
|
||
|
};
|
||
|
|
||
|
/*per modem data*/
|
||
|
struct ccci_per_md {
|
||
|
unsigned int md_capability;
|
||
|
unsigned int md_dbg_dump_flag;
|
||
|
enum MD_BOOT_MODE md_boot_mode;
|
||
|
char img_post_fix[IMG_POSTFIX_LEN];
|
||
|
struct ccci_image_info img_info[IMG_NUM];
|
||
|
unsigned int md_boot_data[16];
|
||
|
unsigned int sim_type;
|
||
|
struct ccci_modem_cfg config;
|
||
|
unsigned int md_img_exist[MAX_IMG_NUM];
|
||
|
unsigned int md_img_type_is_set;
|
||
|
struct ccci_sim_setting sim_setting;
|
||
|
int data_usb_bypass;
|
||
|
int dtr_state; /* only for usb bypass */
|
||
|
unsigned int is_in_ee_dump;
|
||
|
|
||
|
#ifdef CCCI_SKB_TRACE
|
||
|
unsigned long long netif_rx_profile[8];
|
||
|
#endif
|
||
|
};
|
||
|
struct ccci_per_md *ccci_get_per_md_data(unsigned char md_id);
|
||
|
|
||
|
static inline int ccci_md_get_cap_by_id(int md_id)
|
||
|
{
|
||
|
struct ccci_per_md *per_md_data = ccci_get_per_md_data(md_id);
|
||
|
|
||
|
if (per_md_data == NULL)
|
||
|
return -CCCI_ERR_MD_INDEX_NOT_FOUND;
|
||
|
return per_md_data->md_capability;
|
||
|
}
|
||
|
|
||
|
struct ccci_runtime_feature *ccci_md_get_rt_feature_by_id(unsigned char md_id,
|
||
|
u8 feature_id, u8 ap_query_md);
|
||
|
|
||
|
int ccci_md_parse_rt_feature(unsigned char md_id,
|
||
|
struct ccci_runtime_feature *rt_feature, void *data, u32 data_len);
|
||
|
extern int ccci_register_dev_node(const char *name, int major_id, int minor);
|
||
|
|
||
|
#endif
|