common.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Copyright (c) 2022, Linaro Ltd.
  4. *
  5. */
  6. #ifndef _MHI_COMMON_H
  7. #define _MHI_COMMON_H
  8. #include <linux/bitfield.h>
  9. #include <linux/mhi.h>
  10. /* MHI registers */
  11. #define MHIREGLEN 0x00
  12. #define MHIVER 0x08
  13. #define MHICFG 0x10
  14. #define CHDBOFF 0x18
  15. #define ERDBOFF 0x20
  16. #define BHIOFF 0x28
  17. #define BHIEOFF 0x2c
  18. #define DEBUGOFF 0x30
  19. #define MHICTRL 0x38
  20. #define MHISTATUS 0x48
  21. #define CCABAP_LOWER 0x58
  22. #define CCABAP_HIGHER 0x5c
  23. #define ECABAP_LOWER 0x60
  24. #define ECABAP_HIGHER 0x64
  25. #define CRCBAP_LOWER 0x68
  26. #define CRCBAP_HIGHER 0x6c
  27. #define CRDB_LOWER 0x70
  28. #define CRDB_HIGHER 0x74
  29. #define MHICTRLBASE_LOWER 0x80
  30. #define MHICTRLBASE_HIGHER 0x84
  31. #define MHICTRLLIMIT_LOWER 0x88
  32. #define MHICTRLLIMIT_HIGHER 0x8c
  33. #define MHIDATABASE_LOWER 0x98
  34. #define MHIDATABASE_HIGHER 0x9c
  35. #define MHIDATALIMIT_LOWER 0xa0
  36. #define MHIDATALIMIT_HIGHER 0xa4
  37. /* MHI BHI registers */
  38. #define BHI_BHIVERSION_MINOR 0x00
  39. #define BHI_BHIVERSION_MAJOR 0x04
  40. #define BHI_IMGADDR_LOW 0x08
  41. #define BHI_IMGADDR_HIGH 0x0c
  42. #define BHI_IMGSIZE 0x10
  43. #define BHI_RSVD1 0x14
  44. #define BHI_IMGTXDB 0x18
  45. #define BHI_RSVD2 0x1c
  46. #define BHI_INTVEC 0x20
  47. #define BHI_RSVD3 0x24
  48. #define BHI_EXECENV 0x28
  49. #define BHI_STATUS 0x2c
  50. #define BHI_ERRCODE 0x30
  51. #define BHI_ERRDBG1 0x34
  52. #define BHI_ERRDBG2 0x38
  53. #define BHI_ERRDBG3 0x3c
  54. #define BHI_SERIALNU 0x40
  55. #define BHI_SBLANTIROLLVER 0x44
  56. #define BHI_NUMSEG 0x48
  57. #define BHI_MSMHWID(n) (0x4c + (0x4 * (n)))
  58. #define BHI_OEMPKHASH(n) (0x64 + (0x4 * (n)))
  59. #define BHI_RSVD5 0xc4
  60. /* BHI register bits */
  61. #define BHI_TXDB_SEQNUM_BMSK GENMASK(29, 0)
  62. #define BHI_TXDB_SEQNUM_SHFT 0
  63. #define BHI_STATUS_MASK GENMASK(31, 30)
  64. #define BHI_STATUS_ERROR 0x03
  65. #define BHI_STATUS_SUCCESS 0x02
  66. #define BHI_STATUS_RESET 0x00
  67. /* MHI BHIE registers */
  68. #define BHIE_MSMSOCID_OFFS 0x00
  69. #define BHIE_TXVECADDR_LOW_OFFS 0x2c
  70. #define BHIE_TXVECADDR_HIGH_OFFS 0x30
  71. #define BHIE_TXVECSIZE_OFFS 0x34
  72. #define BHIE_TXVECDB_OFFS 0x3c
  73. #define BHIE_TXVECSTATUS_OFFS 0x44
  74. #define BHIE_RXVECADDR_LOW_OFFS 0x60
  75. #define BHIE_RXVECADDR_HIGH_OFFS 0x64
  76. #define BHIE_RXVECSIZE_OFFS 0x68
  77. #define BHIE_RXVECDB_OFFS 0x70
  78. #define BHIE_RXVECSTATUS_OFFS 0x78
  79. /* BHIE register bits */
  80. #define BHIE_TXVECDB_SEQNUM_BMSK GENMASK(29, 0)
  81. #define BHIE_TXVECDB_SEQNUM_SHFT 0
  82. #define BHIE_TXVECSTATUS_SEQNUM_BMSK GENMASK(29, 0)
  83. #define BHIE_TXVECSTATUS_SEQNUM_SHFT 0
  84. #define BHIE_TXVECSTATUS_STATUS_BMSK GENMASK(31, 30)
  85. #define BHIE_TXVECSTATUS_STATUS_SHFT 30
  86. #define BHIE_TXVECSTATUS_STATUS_RESET 0x00
  87. #define BHIE_TXVECSTATUS_STATUS_XFER_COMPL 0x02
  88. #define BHIE_TXVECSTATUS_STATUS_ERROR 0x03
  89. #define BHIE_RXVECDB_SEQNUM_BMSK GENMASK(29, 0)
  90. #define BHIE_RXVECDB_SEQNUM_SHFT 0
  91. #define BHIE_RXVECSTATUS_SEQNUM_BMSK GENMASK(29, 0)
  92. #define BHIE_RXVECSTATUS_SEQNUM_SHFT 0
  93. #define BHIE_RXVECSTATUS_STATUS_BMSK GENMASK(31, 30)
  94. #define BHIE_RXVECSTATUS_STATUS_SHFT 30
  95. #define BHIE_RXVECSTATUS_STATUS_RESET 0x00
  96. #define BHIE_RXVECSTATUS_STATUS_XFER_COMPL 0x02
  97. #define BHIE_RXVECSTATUS_STATUS_ERROR 0x03
  98. /* MHI register bits */
  99. #define MHICFG_NHWER_MASK GENMASK(31, 24)
  100. #define MHICFG_NER_MASK GENMASK(23, 16)
  101. #define MHICFG_NHWCH_MASK GENMASK(15, 8)
  102. #define MHICFG_NCH_MASK GENMASK(7, 0)
  103. #define MHICTRL_MHISTATE_MASK GENMASK(15, 8)
  104. #define MHICTRL_RESET_MASK BIT(1)
  105. #define MHISTATUS_MHISTATE_MASK GENMASK(15, 8)
  106. #define MHISTATUS_SYSERR_MASK BIT(2)
  107. #define MHISTATUS_READY_MASK BIT(0)
  108. /* Command Ring Element macros */
  109. /* No operation command */
  110. #define MHI_TRE_CMD_NOOP_PTR 0
  111. #define MHI_TRE_CMD_NOOP_DWORD0 0
  112. #define MHI_TRE_CMD_NOOP_DWORD1 cpu_to_le32(FIELD_PREP(GENMASK(23, 16), MHI_CMD_NOP))
  113. /* Channel reset command */
  114. #define MHI_TRE_CMD_RESET_PTR 0
  115. #define MHI_TRE_CMD_RESET_DWORD0 0
  116. #define MHI_TRE_CMD_RESET_DWORD1(chid) cpu_to_le32(FIELD_PREP(GENMASK(31, 24), chid) | \
  117. FIELD_PREP(GENMASK(23, 16), \
  118. MHI_CMD_RESET_CHAN))
  119. /* Channel stop command */
  120. #define MHI_TRE_CMD_STOP_PTR 0
  121. #define MHI_TRE_CMD_STOP_DWORD0 0
  122. #define MHI_TRE_CMD_STOP_DWORD1(chid) cpu_to_le32(FIELD_PREP(GENMASK(31, 24), chid) | \
  123. FIELD_PREP(GENMASK(23, 16), \
  124. MHI_CMD_STOP_CHAN))
  125. /* Channel start command */
  126. #define MHI_TRE_CMD_START_PTR 0
  127. #define MHI_TRE_CMD_START_DWORD0 0
  128. #define MHI_TRE_CMD_START_DWORD1(chid) cpu_to_le32(FIELD_PREP(GENMASK(31, 24), chid) | \
  129. FIELD_PREP(GENMASK(23, 16), \
  130. MHI_CMD_START_CHAN))
  131. #define MHI_TRE_GET_DWORD(tre, word) le32_to_cpu((tre)->dword[(word)])
  132. #define MHI_TRE_GET_CMD_CHID(tre) FIELD_GET(GENMASK(31, 24), MHI_TRE_GET_DWORD(tre, 1))
  133. #define MHI_TRE_GET_CMD_TYPE(tre) FIELD_GET(GENMASK(23, 16), MHI_TRE_GET_DWORD(tre, 1))
  134. /* Event descriptor macros */
  135. #define MHI_TRE_EV_PTR(ptr) cpu_to_le64(ptr)
  136. #define MHI_TRE_EV_DWORD0(code, len) cpu_to_le32(FIELD_PREP(GENMASK(31, 24), code) | \
  137. FIELD_PREP(GENMASK(15, 0), len))
  138. #define MHI_TRE_EV_DWORD1(chid, type) cpu_to_le32(FIELD_PREP(GENMASK(31, 24), chid) | \
  139. FIELD_PREP(GENMASK(23, 16), type))
  140. #define MHI_TRE_GET_EV_PTR(tre) le64_to_cpu((tre)->ptr)
  141. #define MHI_TRE_GET_EV_CODE(tre) FIELD_GET(GENMASK(31, 24), (MHI_TRE_GET_DWORD(tre, 0)))
  142. #define MHI_TRE_GET_EV_LEN(tre) FIELD_GET(GENMASK(15, 0), (MHI_TRE_GET_DWORD(tre, 0)))
  143. #define MHI_TRE_GET_EV_CHID(tre) FIELD_GET(GENMASK(31, 24), (MHI_TRE_GET_DWORD(tre, 1)))
  144. #define MHI_TRE_GET_EV_TYPE(tre) FIELD_GET(GENMASK(23, 16), (MHI_TRE_GET_DWORD(tre, 1)))
  145. #define MHI_TRE_GET_EV_STATE(tre) FIELD_GET(GENMASK(31, 24), (MHI_TRE_GET_DWORD(tre, 0)))
  146. #define MHI_TRE_GET_EV_EXECENV(tre) FIELD_GET(GENMASK(31, 24), (MHI_TRE_GET_DWORD(tre, 0)))
  147. #define MHI_TRE_GET_EV_SEQ(tre) MHI_TRE_GET_DWORD(tre, 0)
  148. #define MHI_TRE_GET_EV_TIME(tre) MHI_TRE_GET_EV_PTR(tre)
  149. #define MHI_TRE_GET_EV_COOKIE(tre) lower_32_bits(MHI_TRE_GET_EV_PTR(tre))
  150. #define MHI_TRE_GET_EV_VEID(tre) FIELD_GET(GENMASK(23, 16), (MHI_TRE_GET_DWORD(tre, 0)))
  151. #define MHI_TRE_GET_EV_LINKSPEED(tre) FIELD_GET(GENMASK(31, 24), (MHI_TRE_GET_DWORD(tre, 1)))
  152. #define MHI_TRE_GET_EV_LINKWIDTH(tre) FIELD_GET(GENMASK(7, 0), (MHI_TRE_GET_DWORD(tre, 0)))
  153. /* State change event */
  154. #define MHI_SC_EV_PTR 0
  155. #define MHI_SC_EV_DWORD0(state) cpu_to_le32(FIELD_PREP(GENMASK(31, 24), state))
  156. #define MHI_SC_EV_DWORD1(type) cpu_to_le32(FIELD_PREP(GENMASK(23, 16), type))
  157. /* EE event */
  158. #define MHI_EE_EV_PTR 0
  159. #define MHI_EE_EV_DWORD0(ee) cpu_to_le32(FIELD_PREP(GENMASK(31, 24), ee))
  160. #define MHI_EE_EV_DWORD1(type) cpu_to_le32(FIELD_PREP(GENMASK(23, 16), type))
  161. /* Command Completion event */
  162. #define MHI_CC_EV_PTR(ptr) cpu_to_le64(ptr)
  163. #define MHI_CC_EV_DWORD0(code) cpu_to_le32(FIELD_PREP(GENMASK(31, 24), code))
  164. #define MHI_CC_EV_DWORD1(type) cpu_to_le32(FIELD_PREP(GENMASK(23, 16), type))
  165. /* Transfer descriptor macros */
  166. #define MHI_TRE_DATA_PTR(ptr) cpu_to_le64(ptr)
  167. #define MHI_TRE_DATA_DWORD0(len) cpu_to_le32(FIELD_PREP(GENMASK(15, 0), len))
  168. #define MHI_TRE_TYPE_TRANSFER 2
  169. #define MHI_TRE_DATA_DWORD1(bei, ieot, ieob, chain) cpu_to_le32(FIELD_PREP(GENMASK(23, 16), \
  170. MHI_TRE_TYPE_TRANSFER) | \
  171. FIELD_PREP(BIT(10), bei) | \
  172. FIELD_PREP(BIT(9), ieot) | \
  173. FIELD_PREP(BIT(8), ieob) | \
  174. FIELD_PREP(BIT(0), chain))
  175. #define MHI_TRE_DATA_GET_PTR(tre) le64_to_cpu((tre)->ptr)
  176. #define MHI_TRE_DATA_GET_LEN(tre) FIELD_GET(GENMASK(15, 0), MHI_TRE_GET_DWORD(tre, 0))
  177. #define MHI_TRE_DATA_GET_CHAIN(tre) (!!(FIELD_GET(BIT(0), MHI_TRE_GET_DWORD(tre, 1))))
  178. #define MHI_TRE_DATA_GET_IEOB(tre) (!!(FIELD_GET(BIT(8), MHI_TRE_GET_DWORD(tre, 1))))
  179. #define MHI_TRE_DATA_GET_IEOT(tre) (!!(FIELD_GET(BIT(9), MHI_TRE_GET_DWORD(tre, 1))))
  180. #define MHI_TRE_DATA_GET_BEI(tre) (!!(FIELD_GET(BIT(10), MHI_TRE_GET_DWORD(tre, 1))))
  181. /* RSC transfer descriptor macros */
  182. #define MHI_RSCTRE_DATA_PTR(ptr, len) cpu_to_le64(FIELD_PREP(GENMASK(64, 48), len) | ptr)
  183. #define MHI_RSCTRE_DATA_DWORD0(cookie) cpu_to_le32(cookie)
  184. #define MHI_RSCTRE_DATA_DWORD1 cpu_to_le32(FIELD_PREP(GENMASK(23, 16), \
  185. MHI_PKT_TYPE_COALESCING))
  186. enum mhi_pkt_type {
  187. MHI_PKT_TYPE_INVALID = 0x0,
  188. MHI_PKT_TYPE_NOOP_CMD = 0x1,
  189. MHI_PKT_TYPE_TRANSFER = 0x2,
  190. MHI_PKT_TYPE_COALESCING = 0x8,
  191. MHI_PKT_TYPE_RESET_CHAN_CMD = 0x10,
  192. MHI_PKT_TYPE_STOP_CHAN_CMD = 0x11,
  193. MHI_PKT_TYPE_START_CHAN_CMD = 0x12,
  194. MHI_PKT_TYPE_STATE_CHANGE_EVENT = 0x20,
  195. MHI_PKT_TYPE_CMD_COMPLETION_EVENT = 0x21,
  196. MHI_PKT_TYPE_TX_EVENT = 0x22,
  197. MHI_PKT_TYPE_RSC_TX_EVENT = 0x28,
  198. MHI_PKT_TYPE_EE_EVENT = 0x40,
  199. MHI_PKT_TYPE_TSYNC_EVENT = 0x48,
  200. MHI_PKT_TYPE_BW_REQ_EVENT = 0x50,
  201. MHI_PKT_TYPE_STALE_EVENT, /* internal event */
  202. };
  203. /* MHI transfer completion events */
  204. enum mhi_ev_ccs {
  205. MHI_EV_CC_INVALID = 0x0,
  206. MHI_EV_CC_SUCCESS = 0x1,
  207. MHI_EV_CC_EOT = 0x2, /* End of transfer event */
  208. MHI_EV_CC_OVERFLOW = 0x3,
  209. MHI_EV_CC_EOB = 0x4, /* End of block event */
  210. MHI_EV_CC_OOB = 0x5, /* Out of block event */
  211. MHI_EV_CC_DB_MODE = 0x6,
  212. MHI_EV_CC_UNDEFINED_ERR = 0x10,
  213. MHI_EV_CC_BAD_TRE = 0x11,
  214. };
  215. /* Channel state */
  216. enum mhi_ch_state {
  217. MHI_CH_STATE_DISABLED,
  218. MHI_CH_STATE_ENABLED,
  219. MHI_CH_STATE_RUNNING,
  220. MHI_CH_STATE_SUSPENDED,
  221. MHI_CH_STATE_STOP,
  222. MHI_CH_STATE_ERROR,
  223. };
  224. enum mhi_cmd_type {
  225. MHI_CMD_NOP = 1,
  226. MHI_CMD_RESET_CHAN = 16,
  227. MHI_CMD_STOP_CHAN = 17,
  228. MHI_CMD_START_CHAN = 18,
  229. MHI_CMD_SFR_CFG = 73,
  230. };
  231. #define EV_CTX_RESERVED_MASK GENMASK(7, 0)
  232. #define EV_CTX_INTMODC_MASK GENMASK(15, 8)
  233. #define EV_CTX_INTMODT_MASK GENMASK(31, 16)
  234. struct mhi_event_ctxt {
  235. __le32 intmod;
  236. __le32 ertype;
  237. __le32 msivec;
  238. __le64 rbase __packed __aligned(4);
  239. __le64 rlen __packed __aligned(4);
  240. __le64 rp __packed __aligned(4);
  241. __le64 wp __packed __aligned(4);
  242. };
  243. #define CHAN_CTX_CHSTATE_MASK GENMASK(7, 0)
  244. #define CHAN_CTX_BRSTMODE_MASK GENMASK(9, 8)
  245. #define CHAN_CTX_POLLCFG_MASK GENMASK(15, 10)
  246. #define CHAN_CTX_RESERVED_MASK GENMASK(31, 16)
  247. struct mhi_chan_ctxt {
  248. __le32 chcfg;
  249. __le32 chtype;
  250. __le32 erindex;
  251. __le64 rbase __packed __aligned(4);
  252. __le64 rlen __packed __aligned(4);
  253. __le64 rp __packed __aligned(4);
  254. __le64 wp __packed __aligned(4);
  255. };
  256. struct mhi_cmd_ctxt {
  257. __le32 reserved0;
  258. __le32 reserved1;
  259. __le32 reserved2;
  260. __le64 rbase __packed __aligned(4);
  261. __le64 rlen __packed __aligned(4);
  262. __le64 rp __packed __aligned(4);
  263. __le64 wp __packed __aligned(4);
  264. };
  265. struct mhi_ring_element {
  266. __le64 ptr;
  267. __le32 dword[2];
  268. };
  269. static inline const char *mhi_state_str(enum mhi_state state)
  270. {
  271. switch (state) {
  272. case MHI_STATE_RESET:
  273. return "RESET";
  274. case MHI_STATE_READY:
  275. return "READY";
  276. case MHI_STATE_M0:
  277. return "M0";
  278. case MHI_STATE_M1:
  279. return "M1";
  280. case MHI_STATE_M2:
  281. return "M2";
  282. case MHI_STATE_M3:
  283. return "M3";
  284. case MHI_STATE_M3_FAST:
  285. return "M3 FAST";
  286. case MHI_STATE_BHI:
  287. return "BHI";
  288. case MHI_STATE_SYS_ERR:
  289. return "SYS ERROR";
  290. default:
  291. return "Unknown state";
  292. }
  293. };
  294. #endif /* _MHI_COMMON_H */