ccci_md.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398
  1. /*****************************************************************************
  2. *
  3. * Filename:
  4. * ---------
  5. * ccci_md.h
  6. *
  7. * Project:
  8. * --------
  9. * Andes
  10. *
  11. * Description:
  12. * ------------
  13. * MT65XX Modem initialization and handshake header file
  14. *
  15. ****************************************************************************/
  16. #ifndef __CCCI_MD_H__
  17. #define __CCCI_MD_H__
  18. #include <linux/interrupt.h>
  19. #include <linux/spinlock.h>
  20. #define CCCI_SYSFS_MD_INIT "modem"
  21. #define CCCI_SYSFS_MD_BOOT_ATTR "boot"
  22. #define MD_BOOT_CMD_CHAR '0'
  23. #define NORMAL_BOOT_ID 0
  24. #define META_BOOT_ID 1
  25. /* #define MD_RUNTIME_ADDR (CCIF_BASE + 0x0140) */
  26. /* #define SLEEP_CON 0xF0001204 */
  27. /* #define CCCI_CURRENT_VERSION 0x00000923 */
  28. #define NR_CCCI_RESET_USER 10
  29. #define NR_CCCI_RESET_USER_NAME 16
  30. #define CCCI_UART_PORT_NUM 8
  31. #define CCCI_MD_EXCEPTION 0x1
  32. #define CCCI_MD_RESET 0x2
  33. #define CCCI_MD_BOOTUP 0x3
  34. #define CCCI_MD_STOP 0x4
  35. #define LOCK_MD_SLP 0x1
  36. #define UNLOCK_MD_SLP 0x0
  37. #define MD_IMG_MAX_CNT 0x4
  38. /*-----------------------------------------------------------*/
  39. /* Device ID assignment */
  40. #define CCCI_TTY_DEV_MAJOR (169) /* (0: Modem; 1: Meta; 2:IPC) */
  41. enum {
  42. MD_BOOT_STAGE_0 = 0,
  43. MD_BOOT_STAGE_1 = 1,
  44. MD_BOOT_STAGE_2 = 2,
  45. MD_BOOT_STAGE_EXCEPTION = 3
  46. };
  47. enum {
  48. MD_INIT_START_BOOT = 0x00000000,
  49. MD_INIT_CHK_ID = 0x5555FFFF,
  50. MD_EX = 0x00000004,
  51. MD_EX_CHK_ID = 0x45584350,
  52. MD_EX_REC_OK = 0x00000006,
  53. MD_EX_REC_OK_CHK_ID = 0x45524543,
  54. MD_EX_RESUME_CHK_ID = 0x7,
  55. CCCI_DRV_VER_ERROR = 0x5,
  56. /* System channel, AP->MD || AP<-->MD message start from 0x100 */
  57. /* MD_DORMANT_NOTIFY = 0x100,
  58. MD_SLP_REQUEST = 0x101,
  59. MD_TX_POWER = 0x102,
  60. MD_RF_TEMPERATURE = 0x103,
  61. MD_RF_TEMPERATURE_3G = 0x104,
  62. MD_GET_BATTERY_INFO = 0x105,
  63. */
  64. /* System channel, MD --> AP message start from 0x1000 */
  65. MD_WDT_MONITOR = 0x1000,
  66. MD_WAKEN_UP = 0x10000,
  67. };
  68. enum {
  69. ER_MB_START_CMD = -1,
  70. ER_MB_CHK_ID = -2,
  71. ER_MB_BOOT_READY = -3,
  72. ER_MB_UNKNOWN_STAGE = -4
  73. };
  74. enum {
  75. MD_EX_TYPE_INVALID = 0,
  76. MD_EX_TYPE_UNDEF = 1,
  77. MD_EX_TYPE_SWI = 2,
  78. MD_EX_TYPE_PREF_ABT = 3,
  79. MD_EX_TYPE_DATA_ABT = 4,
  80. MD_EX_TYPE_ASSERT = 5,
  81. MD_EX_TYPE_FATALERR_TASK = 6,
  82. MD_EX_TYPE_FATALERR_BUF = 7,
  83. MD_EX_TYPE_LOCKUP = 8,
  84. MD_EX_TYPE_ASSERT_DUMP = 9,
  85. MD_EX_TYPE_ASSERT_FAIL = 10,
  86. DSP_EX_TYPE_ASSERT = 11,
  87. DSP_EX_TYPE_EXCEPTION = 12,
  88. DSP_EX_FATAL_ERROR = 13,
  89. NUM_EXCEPTION
  90. };
  91. #define MD_EX_TYPE_EMI_CHECK 99
  92. enum {
  93. MD_EE_FLOW_START = 0,
  94. MD_EE_DUMP_ON_GOING,
  95. MD_STATE_UPDATE,
  96. MD_EE_MSG_GET,
  97. MD_EE_TIME_OUT_SET,
  98. MD_EE_OK_MSG_GET,
  99. MD_EE_FOUND_BY_ISR,
  100. MD_EE_FOUND_BY_TX,
  101. MD_EE_PENDING_TOO_LONG,
  102. MD_EE_INFO_OFFSET = 20,
  103. MD_EE_EXCP_OCCUR = 20,
  104. MD_EE_AP_MASK_I_BIT_TOO_LONG = 21,
  105. };
  106. enum {
  107. MD_EE_CASE_NORMAL = 0,
  108. MD_EE_CASE_ONLY_EX,
  109. MD_EE_CASE_ONLY_EX_OK,
  110. MD_EE_CASE_TX_TRG,
  111. MD_EE_CASE_ISR_TRG,
  112. MD_EE_CASE_NO_RESPONSE,
  113. MD_EE_CASE_AP_MASK_I_BIT_TOO_LONG,
  114. };
  115. #ifdef AP_MD_EINT_SHARE_DATA
  116. enum {
  117. CCCI_EXCH_CORE_AWAKEN = 0,
  118. CCCI_EXCH_CORE_SLEEP = 1,
  119. CCCI_EXCH_CORE_SLUMBER = 2
  120. };
  121. #endif
  122. /* CCCI system message */
  123. enum {
  124. CCCI_SYS_MSG_RESET_MD = 0x20100406
  125. };
  126. /* MD Message, this is for user space daemon use */
  127. enum {
  128. CCCI_MD_MSG_BOOT_READY = 0xFAF50001,
  129. CCCI_MD_MSG_BOOT_UP = 0xFAF50002,
  130. CCCI_MD_MSG_EXCEPTION = 0xFAF50003,
  131. CCCI_MD_MSG_RESET = 0xFAF50004,
  132. CCCI_MD_MSG_RESET_RETRY = 0xFAF50005,
  133. CCCI_MD_MSG_READY_TO_RESET = 0xFAF50006,
  134. CCCI_MD_MSG_BOOT_TIMEOUT = 0xFAF50007,
  135. CCCI_MD_MSG_STOP_MD_REQUEST = 0xFAF50008,
  136. CCCI_MD_MSG_START_MD_REQUEST = 0xFAF50009,
  137. CCCI_MD_MSG_ENTER_FLIGHT_MODE = 0xFAF5000A,
  138. CCCI_MD_MSG_LEAVE_FLIGHT_MODE = 0xFAF5000B,
  139. CCCI_MD_MSG_POWER_ON_REQUEST = 0xFAF5000C,
  140. CCCI_MD_MSG_POWER_DOWN_REQUEST = 0xFAF5000D,
  141. CCCI_MD_MSG_SEND_BATTERY_INFO = 0xFAF5000E,
  142. CCCI_MD_MSG_NOTIFY = 0xFAF5000F,
  143. CCCI_MD_MSG_STORE_NVRAM_MD_TYPE = 0xFAF50010,
  144. CCCI_MD_MSG_CFG_UPDATE = 0xFAF50011,
  145. };
  146. /* MD Status, this is for user space daemon use */
  147. enum {
  148. CCCI_MD_STA_BOOT_READY = 0,
  149. CCCI_MD_STA_BOOT_UP = 1,
  150. CCCI_MD_STA_RESET = 2,
  151. };
  152. #if 0
  153. /* MODEM MAUI SW ASSERT LOG */
  154. struct modem_assert_log {
  155. char ex_type;
  156. char ex_nvram;
  157. short ex_serial;
  158. char data1[212];
  159. char filename[24];
  160. int linenumber;
  161. char data2[268];
  162. };
  163. /* MODEM MAUI SW FATAL ERROR LOG */
  164. struct modem_fatalerr_log {
  165. char ex_type;
  166. char ex_nvram;
  167. short ex_serial;
  168. char data1[212];
  169. int err_code1;
  170. int err_code2;
  171. char data2[288];
  172. };
  173. #endif
  174. struct cores_sleep_info {
  175. unsigned char AP_Sleep;
  176. unsigned char padding1[3];
  177. unsigned int RTC_AP_WakeUp;
  178. unsigned int AP_SettleTime; /* clock settle duration */
  179. unsigned char MD_Sleep;
  180. unsigned char padding2[3];
  181. unsigned int RTC_MD_WakeUp;
  182. unsigned int RTC_MD_Settle_OK; /* clock settle done time */
  183. };
  184. /* MODEM MAUI Exception header (4 bytes)*/
  185. struct EX_HEADER_T {
  186. unsigned char ex_type;
  187. unsigned char ex_nvram;
  188. unsigned short ex_serial_num;
  189. };
  190. /* MODEM MAUI Environment information (164 bytes) */
  191. struct EX_ENVINFO_T {
  192. unsigned char boot_mode;
  193. unsigned char reserved1[8];
  194. unsigned char execution_unit[8];
  195. unsigned char reserved2[147];
  196. };
  197. /* MODEM MAUI Special for fatal error (8 bytes)*/
  198. struct EX_FATALERR_CODE_T {
  199. unsigned int code1;
  200. unsigned int code2;
  201. };
  202. /* MODEM MAUI fatal error (296 bytes)*/
  203. struct EX_FATALERR_T {
  204. struct EX_FATALERR_CODE_T error_code;
  205. unsigned char reserved1[288];
  206. };
  207. /* MODEM MAUI Assert fail (296 bytes)*/
  208. struct EX_ASSERTFAIL_T {
  209. unsigned char filename[24];
  210. unsigned int linenumber;
  211. unsigned int parameters[3];
  212. unsigned char reserved1[256];
  213. };
  214. /* MODEM MAUI Globally exported data structure (300 bytes) */
  215. union EX_CONTENT_T {
  216. struct EX_FATALERR_T fatalerr;
  217. struct EX_ASSERTFAIL_T assert;
  218. };
  219. /* MODEM MAUI Standard structure of an exception log ( */
  220. struct EX_LOG_T {
  221. struct EX_HEADER_T header;
  222. unsigned char reserved1[12];
  223. struct EX_ENVINFO_T envinfo;
  224. unsigned char reserved2[36];
  225. union EX_CONTENT_T content;
  226. };
  227. struct core_eint_config {
  228. unsigned char eint_no;
  229. unsigned char Sensitivity;
  230. unsigned char ACT_Polarity;
  231. unsigned char Dbounce_En;
  232. unsigned int Dbounce_ms;
  233. };
  234. struct ccci_cores_exch_data {
  235. struct cores_sleep_info sleep_info;
  236. unsigned int report_os_tick; /* report OS Tick Periodic in second unit */
  237. /* ( 0 = disable ) */
  238. unsigned int nr_eint_config;
  239. unsigned int eint_config_offset; /* offset from SysShareMemBase for struct coreeint_config */
  240. };
  241. #define CCCI_SYS_SMEM_SIZE sizeof(struct ccci_cores_exch_data)
  242. struct ccci_reset_sta {
  243. int is_allocate;
  244. int is_reset;
  245. char name[NR_CCCI_RESET_USER_NAME];
  246. };
  247. struct modem_runtime_t {
  248. int Prefix; /* "CCIF" */
  249. int Platform_L; /* Hardware Platform String ex: "MT6589E1" */
  250. int Platform_H;
  251. int DriverVersion; /* 0x20121001 since W12.39 */
  252. int BootChannel; /* Channel to ACK AP with boot ready */
  253. int BootingStartID; /* MD is booting. NORMAL_BOOT_ID or META_BOOT_ID */
  254. int BootAttributes; /* Attributes passing from AP to MD Booting */
  255. int BootReadyID; /* MD response ID if boot successful and ready */
  256. int MdlogShareMemBase;
  257. int MdlogShareMemSize;
  258. int PcmShareMemBase;
  259. int PcmShareMemSize;
  260. int UartPortNum;
  261. int UartShareMemBase[CCCI_UART_PORT_NUM];
  262. int UartShareMemSize[CCCI_UART_PORT_NUM];
  263. int FileShareMemBase;
  264. int FileShareMemSize;
  265. int RpcShareMemBase;
  266. int RpcShareMemSize;
  267. int PmicShareMemBase;
  268. int PmicShareMemSize;
  269. int ExceShareMemBase;
  270. int ExceShareMemSize; /* 512 Bytes Required */
  271. int SysShareMemBase;
  272. int SysShareMemSize;
  273. int IPCShareMemBase;
  274. int IPCShareMemSize;
  275. int MDULNetShareMemBase;
  276. int MDULNetShareMemSize;
  277. int MDDLNetShareMemBase;
  278. int MDDLNetShareMemSize;
  279. int NetPortNum;
  280. int NetULCtrlShareMemBase[NET_PORT_NUM]; /* <<< Current NET_PORT_NUM is 4 */
  281. int NetULCtrlShareMemSize[NET_PORT_NUM];
  282. int NetDLCtrlShareMemBase[NET_PORT_NUM];
  283. int NetDLCtrlShareMemSize[NET_PORT_NUM];
  284. int MDExExpInfoBase; /* md exception expand info memory */
  285. int MDExExpInfoSize;
  286. int IPCMDIlmShareMemBase;
  287. int IPCMDIlmShareMemSize;
  288. int MiscInfoBase;
  289. int MiscInfoSize;
  290. int CheckSum;
  291. int Postfix; /* "CCIF" */
  292. };
  293. #define CCCI_MD_RUNTIME_DATA_SMEM_SIZE (sizeof(struct modem_runtime_t))
  294. struct modem_runtime_info_tag_t {
  295. int prefix; /* "CCIF" */
  296. int platform_L; /* Hardware platform string. ex: 'TK6516E0' */
  297. int platform_H;
  298. int driver_version; /* 0x00000923 since W09.23 */
  299. int runtime_data_base;
  300. int runtime_data_size;
  301. int postfix; /* "CCIF" */
  302. };
  303. struct modem_exception_exp_t {
  304. int exception_occur;
  305. int send_time;
  306. int wait_time;
  307. };
  308. struct MD_CALL_BACK_QUEUE {
  309. void (*call)(struct MD_CALL_BACK_QUEUE *, unsigned long data);
  310. struct MD_CALL_BACK_QUEUE *next;
  311. };
  312. struct MD_CALL_BACK_HEAD_T {
  313. spinlock_t lock;
  314. struct MD_CALL_BACK_QUEUE *next;
  315. int is_busy;
  316. struct tasklet_struct tasklet;
  317. };
  318. typedef int (*ccci_cores_sleep_info_base_req) (void *);
  319. typedef int (*ccci_core_eint_config_setup) (int, void *);
  320. int __init ccci_md_init_mod_init(void);
  321. void __exit ccci_md_init_mod_exit(void);
  322. int ccci_mdlog_base_req(int md_id, void *addr_vir, void *addr_phy,
  323. unsigned int *len);
  324. int ccci_pcm_base_req(int md_id, void *addr_vir, void *addr_phy,
  325. unsigned int *len);
  326. int ccci_uart_base_req(int md_id, int port, void *addr_vir, void *addr_phy,
  327. unsigned int *len);
  328. int ccci_fs_base_req(int md_id, void *addr_vir, void *addr_phy,
  329. unsigned int *len);
  330. int ccci_rpc_base_req(int md_id, int *addr_vir, int *addr_phy, int *len);
  331. int ccci_pmic_base_req(int md_id, void *addr_vir, void *addr_phy, int *len);
  332. int ccci_ipc_base_req(int md_id, void *addr_vir, void *addr_phy, int *len);
  333. int ccmni_v2_ul_base_req(int md_id, void *addr_vir, void *addr_phy);
  334. int ccmni_v2_dl_base_req(int md_id, void *addr_vir, void *addr_phy);
  335. int ccci_ccmni_v2_ctl_mem_base_req(int md_id, int port, int *addr_virt,
  336. int *addr_phy, int *len);
  337. int md_register_call_chain(int md_id, struct MD_CALL_BACK_QUEUE *queue);
  338. int md_unregister_call_chain(int md_id, struct MD_CALL_BACK_QUEUE *queue);
  339. void md_call_chain(struct MD_CALL_BACK_HEAD_T *head, unsigned long data);
  340. int ccci_reset_register(int md_id, char *name);
  341. int ccci_user_ready_to_reset(int md_id, int handle);
  342. int get_curr_md_state(int md_id);
  343. void check_data_connected(int md_id, int channel);
  344. /* extern int ccci_sys_smem_base_phy; */
  345. extern int ccci_smem_size;
  346. extern int *ccci_smem_virt;
  347. extern dma_addr_t ccci_smem_phy;
  348. extern int is_first_boot;
  349. extern struct MD_CALL_BACK_HEAD_T md_notifier;
  350. #endif /* __CCCI_MD_H__ */