mhi_satellite.c 34 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. // Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  3. #include <linux/device.h>
  4. #include <linux/dma-direction.h>
  5. #include <linux/dma-mapping.h>
  6. #include <linux/errno.h>
  7. #include <linux/ipc_logging.h>
  8. #include <linux/kernel.h>
  9. #include <linux/module.h>
  10. #include <linux/of_device.h>
  11. #include <linux/rpmsg.h>
  12. #include <linux/slab.h>
  13. #include <linux/types.h>
  14. #include <linux/uaccess.h>
  15. #include <linux/wait.h>
  16. #include <linux/mhi.h>
  17. #include <linux/mhi_misc.h>
  18. #define MHI_SAT_DRIVER_NAME "mhi_satellite"
  19. /* logging macros */
  20. #define IPC_LOG_PAGES (10)
  21. #ifdef CONFIG_MHI_BUS_DEBUG
  22. #define MHI_SAT_LOG_LVL MHI_MSG_LVL_VERBOSE
  23. #else
  24. #define MHI_SAT_LOG_LVL MHI_MSG_LVL_ERROR
  25. #endif
  26. #define MSG_SUBSYS_LOG(fmt, ...) do { \
  27. if (!subsys) \
  28. break; \
  29. if (mhi_sat_driver.ipc_log_lvl <= MHI_MSG_LVL_INFO) \
  30. ipc_log_string(subsys->ipc_log, "%s[I][%s] " fmt, \
  31. "", __func__, ##__VA_ARGS__); \
  32. } while (0)
  33. #define MSG_LOG(fmt, ...) do { \
  34. if (!subsys || !sat_cntrl) \
  35. break; \
  36. if (mhi_sat_driver.ipc_log_lvl <= MHI_MSG_LVL_INFO) \
  37. ipc_log_string(subsys->ipc_log, "%s[I][%s][%x] " fmt, \
  38. "", __func__, sat_cntrl->dev_id, \
  39. ##__VA_ARGS__); \
  40. } while (0)
  41. #define MSG_ERR(fmt, ...) do { \
  42. if (!subsys || !sat_cntrl) \
  43. break; \
  44. pr_err("[E][%s][%s][%x] " fmt, __func__, subsys->name, \
  45. sat_cntrl->dev_id, ##__VA_ARGS__);\
  46. if (mhi_sat_driver.ipc_log_lvl <= MHI_MSG_LVL_ERROR) \
  47. ipc_log_string(subsys->ipc_log, "%s[E][%s][%x] " fmt, \
  48. "", __func__, sat_cntrl->dev_id, \
  49. ##__VA_ARGS__); \
  50. } while (0)
  51. static const char * const mhi_log_level_str[MHI_MSG_LVL_MAX] = {
  52. [MHI_MSG_LVL_VERBOSE] = "Verbose",
  53. [MHI_MSG_LVL_INFO] = "Info",
  54. [MHI_MSG_LVL_ERROR] = "Error",
  55. [MHI_MSG_LVL_CRITICAL] = "Critical",
  56. [MHI_MSG_LVL_MASK_ALL] = "Mask all",
  57. };
  58. #define MSG_LOG_LEVEL_STR(level) ((level >= MHI_MSG_LVL_MAX || \
  59. !mhi_log_level_str[level]) ? \
  60. "Mask all" : mhi_log_level_str[level])
  61. /* mhi sys error command */
  62. #define MHI_TRE_CMD_SYS_ERR_PTR (0)
  63. #define MHI_TRE_CMD_SYS_ERR_D0 (0)
  64. #define MHI_TRE_CMD_SYS_ERR_D1 (MHI_PKT_TYPE_SYS_ERR_CMD << 16)
  65. /* mhi state change event */
  66. #define MHI_TRE_EVT_MHI_STATE_PTR (0)
  67. #define MHI_TRE_EVT_MHI_STATE_D0(state) (state << 24)
  68. #define MHI_TRE_EVT_MHI_STATE_D1 (MHI_PKT_TYPE_STATE_CHANGE_EVENT << 16)
  69. /* mhi exec env change event */
  70. #define MHI_TRE_EVT_EE_PTR (0)
  71. #define MHI_TRE_EVT_EE_D0(ee) (ee << 24)
  72. #define MHI_TRE_EVT_EE_D1 (MHI_PKT_TYPE_EE_EVENT << 16)
  73. /* mhi config event */
  74. #define MHI_TRE_EVT_CFG_PTR(base_addr) (base_addr)
  75. #define MHI_TRE_EVT_CFG_D0(er_base, num) ((er_base << 16) | (num & 0xFFFF))
  76. #define MHI_TRE_EVT_CFG_D1 (MHI_PKT_TYPE_CFG_EVENT << 16)
  77. /* command completion event */
  78. #define MHI_TRE_EVT_CMD_COMPLETION_PTR(ptr) (ptr)
  79. #define MHI_TRE_EVT_CMD_COMPLETION_D0(code) (code << 24)
  80. #define MHI_TRE_EVT_CMD_COMPLETION_D1 (MHI_PKT_TYPE_CMD_COMPLETION_EVENT << 16)
  81. /* packet parser macros */
  82. #define MHI_TRE_GET_PTR(tre) ((tre)->ptr)
  83. #define MHI_TRE_GET_SIZE(tre) ((tre)->dword[0])
  84. #define MHI_TRE_GET_CCS(tre) (((tre)->dword[0] >> 24) & 0xFF)
  85. #define MHI_TRE_GET_ID(tre) (((tre)->dword[1] >> 24) & 0xFF)
  86. #define MHI_TRE_GET_TYPE(tre) (((tre)->dword[1] >> 16) & 0xFF)
  87. #define MHI_TRE_IS_ER_CTXT_TYPE(tre) (((tre)->dword[1]) & 0x1)
  88. #define MHI_TRE_IS_IO_ADDR_TYPE(tre) (((tre)->dword[1]) & 0x1)
  89. /* mhi core definitions */
  90. #define MHI_CTXT_TYPE_GENERIC (0xA)
  91. struct __packed mhi_generic_ctxt {
  92. u32 reserved0;
  93. u32 type;
  94. u32 reserved1;
  95. u64 ctxt_base;
  96. u64 ctxt_size;
  97. u64 reserved[2];
  98. };
  99. enum mhi_pkt_type {
  100. MHI_PKT_TYPE_INVALID = 0x0,
  101. MHI_PKT_TYPE_RESET_CHAN_CMD = 0x10,
  102. MHI_PKT_TYPE_STOP_CHAN_CMD = 0x11,
  103. MHI_PKT_TYPE_START_CHAN_CMD = 0x12,
  104. MHI_PKT_TYPE_STATE_CHANGE_EVENT = 0x20,
  105. MHI_PKT_TYPE_CMD_COMPLETION_EVENT = 0x21,
  106. MHI_PKT_TYPE_EE_EVENT = 0x40,
  107. MHI_PKT_TYPE_CTXT_UPDATE_CMD = 0x64,
  108. MHI_PKT_TYPE_IOMMU_MAP_CMD = 0x65,
  109. MHI_PKT_TYPE_CFG_EVENT = 0x6E,
  110. MHI_PKT_TYPE_SYS_ERR_CMD = 0xFF,
  111. };
  112. enum mhi_cmd_type {
  113. MHI_CMD_TYPE_RESET = 0x10,
  114. MHI_CMD_TYPE_STOP = 0x11,
  115. MHI_CMD_TYPE_START = 0x12,
  116. };
  117. /* mhi event completion codes */
  118. enum mhi_ev_ccs {
  119. MHI_EV_CC_INVALID = 0x0,
  120. MHI_EV_CC_SUCCESS = 0x1,
  121. MHI_EV_CC_BAD_TRE = 0x11,
  122. };
  123. /* satellite subsystem definitions */
  124. enum subsys_id {
  125. SUBSYS_ADSP,
  126. SUBSYS_CDSP,
  127. SUBSYS_SLPI,
  128. SUBSYS_MAX,
  129. };
  130. static const char * const subsys_names[SUBSYS_MAX] = {
  131. [SUBSYS_ADSP] = "adsp",
  132. [SUBSYS_CDSP] = "cdsp",
  133. [SUBSYS_SLPI] = "slpi",
  134. };
  135. struct mhi_sat_subsys {
  136. const char *name;
  137. struct rpmsg_device *rpdev; /* rpmsg device */
  138. /*
  139. * acquire either mutex or spinlock to walk controller list
  140. * acquire both when modifying list
  141. */
  142. struct list_head cntrl_list; /* controllers list */
  143. struct mutex cntrl_mutex; /* mutex to walk/modify controllers list */
  144. spinlock_t cntrl_lock; /* lock to walk/modify controllers list */
  145. void *ipc_log;
  146. };
  147. /* satellite IPC definitions */
  148. #define SAT_MAJOR_VERSION (1)
  149. #define SAT_MINOR_VERSION (0)
  150. #define SAT_RESERVED_SEQ_NUM (0xFFFF)
  151. #define SAT_MSG_SIZE(n) (sizeof(struct sat_header) + \
  152. (n * sizeof(struct sat_tre)))
  153. #define SAT_TRE_SIZE(msg_size) (msg_size - sizeof(struct sat_header))
  154. #define SAT_TRE_OFFSET(msg) (msg + sizeof(struct sat_header))
  155. #define SAT_TRE_NUM_PKTS(payload_size) ((payload_size) / sizeof(struct sat_tre))
  156. /* satellite IPC msg type */
  157. enum sat_msg_id {
  158. SAT_MSG_ID_ACK = 0xA,
  159. SAT_MSG_ID_CMD = 0xC,
  160. SAT_MSG_ID_EVT = 0xE,
  161. };
  162. /* satellite IPC context type */
  163. enum sat_ctxt_type {
  164. SAT_CTXT_TYPE_CHAN = 0x0,
  165. SAT_CTXT_TYPE_EVENT = 0x1,
  166. SAT_CTXT_TYPE_MAX,
  167. };
  168. /* satellite IPC context string */
  169. #define TO_SAT_CTXT_TYPE_STR(type) (type >= SAT_CTXT_TYPE_MAX ? "INVALID" : \
  170. sat_ctxt_str[type])
  171. const char * const sat_ctxt_str[SAT_CTXT_TYPE_MAX] = {
  172. [SAT_CTXT_TYPE_CHAN] = "CCA",
  173. [SAT_CTXT_TYPE_EVENT] = "ECA",
  174. };
  175. /* satellite IPC transfer ring element */
  176. struct __packed sat_tre {
  177. u64 ptr;
  178. u32 dword[2];
  179. };
  180. /* satellite IPC header */
  181. struct __packed sat_header {
  182. u16 major_ver;
  183. u16 minor_ver;
  184. u16 msg_id;
  185. u16 seq;
  186. u16 reply_seq;
  187. u16 payload_size;
  188. u32 dev_id;
  189. u8 reserved[8];
  190. };
  191. /* satellite driver definitions */
  192. struct mhi_sat_packet {
  193. struct list_head node;
  194. struct mhi_sat_cntrl *cntrl; /* satellite controller reference */
  195. void *msg; /* incoming message */
  196. };
  197. enum mhi_sat_state {
  198. SAT_READY, /* initial state when device is presented to driver */
  199. SAT_RUNNING, /* subsystem can communicate with the device */
  200. SAT_DISCONNECTED, /* rpmsg link is down */
  201. SAT_FATAL_DETECT, /* device is down as fatal error was detected early */
  202. SAT_ERROR, /* device is down after error or graceful shutdown */
  203. SAT_DISABLED, /* no further processing: wait for device removal */
  204. };
  205. #define MHI_SAT_MAX_DEVICES 4
  206. #define MHI_SAT_ACTIVE(cntrl) (cntrl->state == SAT_RUNNING)
  207. #define MHI_SAT_IN_ERROR_STATE(cntrl) (cntrl->state >= SAT_FATAL_DETECT)
  208. #define MHI_SAT_ALLOW_CONNECTION(cntrl) (cntrl->state == SAT_READY || \
  209. cntrl->state == SAT_DISCONNECTED)
  210. #define MHI_SAT_ALLOW_SYS_ERR(cntrl) (cntrl->state == SAT_RUNNING || \
  211. cntrl->state == SAT_FATAL_DETECT)
  212. struct mhi_sat_cntrl {
  213. struct list_head node;
  214. struct mhi_controller *mhi_cntrl; /* device MHI controller reference */
  215. struct mhi_sat_subsys *subsys;
  216. struct list_head dev_list;
  217. struct list_head addr_map_list; /* IOMMU mapped addresses list */
  218. struct mutex list_mutex; /* mutex for devices and address map lists */
  219. struct list_head packet_list;
  220. spinlock_t pkt_lock; /* lock to walk/modify received packets list */
  221. struct work_struct connect_work; /* subsystem connection worker */
  222. struct work_struct process_work; /* incoming packets processor */
  223. struct work_struct error_work; /* error handling processor */
  224. /* mhi core/controller configurations */
  225. u32 dev_id; /* unique device ID with BDF as per connection topology */
  226. int er_base; /* event rings base index */
  227. int er_max; /* event rings max index */
  228. int num_er; /* total number of event rings */
  229. /* satellite controller function counts */
  230. int num_devices; /* mhi devices current count */
  231. int max_devices; /* count of maximum devices for subsys/controller */
  232. u16 seq; /* internal sequence number for all outgoing packets */
  233. enum mhi_sat_state state; /* controller state manager */
  234. spinlock_t state_lock; /* lock to change controller state */
  235. /* command completion variables */
  236. u16 last_cmd_seq; /* sequence number of last sent command packet */
  237. enum mhi_ev_ccs last_cmd_ccs; /* last command completion event code */
  238. struct completion completion; /* command completion event wait */
  239. struct mutex cmd_wait_mutex; /* command completion wait mutex */
  240. };
  241. struct mhi_sat_device {
  242. struct list_head node;
  243. struct mhi_device *mhi_dev; /* mhi device pointer */
  244. struct mhi_sat_cntrl *cntrl; /* parent controller */
  245. bool chan_started;
  246. };
  247. struct mhi_sat_driver {
  248. enum MHI_DEBUG_LEVEL ipc_log_lvl; /* IPC log level */
  249. struct mhi_sat_subsys *subsys; /* pointer to subsystem array */
  250. unsigned int num_subsys;
  251. };
  252. static struct mhi_sat_driver mhi_sat_driver;
  253. static struct mhi_sat_subsys *find_subsys_by_name(const char *name)
  254. {
  255. int i;
  256. struct mhi_sat_subsys *subsys = mhi_sat_driver.subsys;
  257. for (i = 0; i < mhi_sat_driver.num_subsys; i++, subsys++) {
  258. if (!strcmp(name, subsys->name))
  259. return subsys;
  260. }
  261. return NULL;
  262. }
  263. static struct mhi_sat_cntrl *find_sat_cntrl_by_id(struct mhi_sat_subsys *subsys,
  264. u32 dev_id)
  265. {
  266. struct mhi_sat_cntrl *sat_cntrl;
  267. unsigned long flags;
  268. spin_lock_irqsave(&subsys->cntrl_lock, flags);
  269. list_for_each_entry(sat_cntrl, &subsys->cntrl_list, node) {
  270. if (sat_cntrl->dev_id == dev_id) {
  271. spin_unlock_irqrestore(&subsys->cntrl_lock, flags);
  272. return sat_cntrl;
  273. }
  274. }
  275. spin_unlock_irqrestore(&subsys->cntrl_lock, flags);
  276. return NULL;
  277. }
  278. static struct mhi_sat_device *find_sat_dev_by_id(
  279. struct mhi_sat_cntrl *sat_cntrl, int id,
  280. enum sat_ctxt_type evt)
  281. {
  282. struct mhi_sat_device *sat_dev;
  283. int compare_id;
  284. mutex_lock(&sat_cntrl->list_mutex);
  285. list_for_each_entry(sat_dev, &sat_cntrl->dev_list, node) {
  286. compare_id = (evt == SAT_CTXT_TYPE_EVENT) ?
  287. sat_dev->mhi_dev->dl_event_id :
  288. sat_dev->mhi_dev->dl_chan_id;
  289. if (compare_id == id) {
  290. mutex_unlock(&sat_cntrl->list_mutex);
  291. return sat_dev;
  292. }
  293. }
  294. mutex_unlock(&sat_cntrl->list_mutex);
  295. return NULL;
  296. }
  297. static bool mhi_sat_isvalid_header(struct sat_header *hdr, int len)
  298. {
  299. /* validate payload size */
  300. if ((len < sizeof(*hdr)) ||
  301. (len >= sizeof(*hdr) && (len != hdr->payload_size + sizeof(*hdr))))
  302. return false;
  303. /* validate SAT IPC version */
  304. if (hdr->major_ver != SAT_MAJOR_VERSION ||
  305. hdr->minor_ver != SAT_MINOR_VERSION)
  306. return false;
  307. /* validate msg ID */
  308. if (hdr->msg_id != SAT_MSG_ID_CMD && hdr->msg_id != SAT_MSG_ID_EVT)
  309. return false;
  310. return true;
  311. }
  312. static int mhi_sat_wait_cmd_completion(struct mhi_sat_cntrl *sat_cntrl)
  313. {
  314. struct mhi_sat_subsys *subsys = sat_cntrl->subsys;
  315. int ret;
  316. reinit_completion(&sat_cntrl->completion);
  317. MSG_LOG("Wait for command completion\n");
  318. ret = wait_for_completion_timeout(&sat_cntrl->completion,
  319. msecs_to_jiffies(sat_cntrl->mhi_cntrl->timeout_ms));
  320. if (!ret || sat_cntrl->last_cmd_ccs != MHI_EV_CC_SUCCESS) {
  321. MSG_ERR("Command completion failure:seq:%u:ret:%d:ccs:%d\n",
  322. sat_cntrl->last_cmd_seq, ret, sat_cntrl->last_cmd_ccs);
  323. return -EIO;
  324. }
  325. MSG_LOG("Command completion successful for seq:%u\n",
  326. sat_cntrl->last_cmd_seq);
  327. return 0;
  328. }
  329. static int mhi_sat_send_msg(struct mhi_sat_cntrl *sat_cntrl,
  330. enum sat_msg_id type, u16 reply_seq,
  331. void *msg, u16 msg_size)
  332. {
  333. struct mhi_sat_subsys *subsys = sat_cntrl->subsys;
  334. struct sat_header *hdr = msg;
  335. /* create sequence number for controller */
  336. sat_cntrl->seq++;
  337. if (sat_cntrl->seq == SAT_RESERVED_SEQ_NUM)
  338. sat_cntrl->seq = 0;
  339. /* populate header */
  340. hdr->major_ver = SAT_MAJOR_VERSION;
  341. hdr->minor_ver = SAT_MINOR_VERSION;
  342. hdr->msg_id = type;
  343. hdr->seq = sat_cntrl->seq;
  344. hdr->reply_seq = reply_seq;
  345. hdr->payload_size = SAT_TRE_SIZE(msg_size);
  346. hdr->dev_id = sat_cntrl->dev_id;
  347. /* save last sent command sequence number for completion event */
  348. if (type == SAT_MSG_ID_CMD)
  349. sat_cntrl->last_cmd_seq = sat_cntrl->seq;
  350. return rpmsg_send(subsys->rpdev->ept, msg, msg_size);
  351. }
  352. static void mhi_sat_process_cmds(struct mhi_sat_cntrl *sat_cntrl,
  353. struct sat_header *hdr, struct sat_tre *pkt)
  354. {
  355. struct mhi_sat_subsys *subsys = sat_cntrl->subsys;
  356. int num_pkts = SAT_TRE_NUM_PKTS(hdr->payload_size), i;
  357. for (i = 0; i < num_pkts; i++, pkt++) {
  358. enum mhi_ev_ccs code = MHI_EV_CC_INVALID;
  359. switch (MHI_TRE_GET_TYPE(pkt)) {
  360. case MHI_PKT_TYPE_IOMMU_MAP_CMD:
  361. {
  362. struct mhi_buf_extended *buf;
  363. struct mhi_controller *mhi_cntrl = sat_cntrl->mhi_cntrl;
  364. dma_addr_t iova = DMA_MAPPING_ERROR;
  365. struct device *parent_dev =
  366. mhi_cntrl->mhi_dev->dev.parent;
  367. buf = kmalloc(sizeof(*buf), GFP_ATOMIC);
  368. if (!buf)
  369. goto iommu_map_cmd_completion;
  370. buf->phys_addr = MHI_TRE_GET_PTR(pkt);
  371. buf->len = MHI_TRE_GET_SIZE(pkt);
  372. buf->is_io = MHI_TRE_IS_IO_ADDR_TYPE(pkt);
  373. if (buf->is_io) {
  374. iova = dma_map_resource(parent_dev,
  375. buf->phys_addr, buf->len,
  376. DMA_BIDIRECTIONAL, 0);
  377. } else {
  378. /*
  379. * DMA_ATTR_SKIP_CPU_SYNC used due to assumption
  380. * CPU does not read/write this memory, and addr
  381. * & size may not be aligned per CMO requirement
  382. */
  383. iova = dma_map_single_attrs(parent_dev,
  384. phys_to_virt(buf->phys_addr),
  385. buf->len, DMA_BIDIRECTIONAL,
  386. DMA_ATTR_SKIP_CPU_SYNC);
  387. }
  388. if (dma_mapping_error(parent_dev, iova)) {
  389. kfree(buf);
  390. goto iommu_map_cmd_completion;
  391. }
  392. buf->dma_addr = iova;
  393. mutex_lock(&sat_cntrl->list_mutex);
  394. list_add_tail(&buf->node,
  395. &sat_cntrl->addr_map_list);
  396. mutex_unlock(&sat_cntrl->list_mutex);
  397. code = MHI_EV_CC_SUCCESS;
  398. iommu_map_cmd_completion:
  399. MSG_LOG("IOMMU MAP 0x%llx len:%d CMD %s:%llx\n",
  400. MHI_TRE_GET_PTR(pkt), MHI_TRE_GET_SIZE(pkt),
  401. (code == MHI_EV_CC_SUCCESS) ? "successful" :
  402. "failed", iova);
  403. pkt->ptr = MHI_TRE_EVT_CMD_COMPLETION_PTR(iova);
  404. pkt->dword[0] = MHI_TRE_EVT_CMD_COMPLETION_D0(code);
  405. pkt->dword[1] = MHI_TRE_EVT_CMD_COMPLETION_D1;
  406. break;
  407. }
  408. case MHI_PKT_TYPE_CTXT_UPDATE_CMD:
  409. {
  410. u64 ctxt_ptr = MHI_TRE_GET_PTR(pkt);
  411. u64 ctxt_size = MHI_TRE_GET_SIZE(pkt);
  412. int id = MHI_TRE_GET_ID(pkt);
  413. enum sat_ctxt_type evt = MHI_TRE_IS_ER_CTXT_TYPE(pkt);
  414. struct mhi_generic_ctxt gen_ctxt;
  415. struct mhi_buf buf;
  416. struct mhi_sat_device *sat_dev = find_sat_dev_by_id(
  417. sat_cntrl, id, evt);
  418. int ret;
  419. if (!sat_dev) {
  420. MSG_LOG("Failed to find the satellite device with id : %d\n", id);
  421. WARN_ON(!sat_dev);
  422. return;
  423. }
  424. memset(&gen_ctxt, 0, sizeof(gen_ctxt));
  425. memset(&buf, 0, sizeof(buf));
  426. gen_ctxt.type = MHI_CTXT_TYPE_GENERIC;
  427. gen_ctxt.ctxt_base = ctxt_ptr;
  428. gen_ctxt.ctxt_size = ctxt_size;
  429. buf.buf = &gen_ctxt;
  430. buf.len = sizeof(gen_ctxt);
  431. buf.name = TO_SAT_CTXT_TYPE_STR(evt);
  432. ret = mhi_device_configure(sat_dev->mhi_dev,
  433. DMA_BIDIRECTIONAL, &buf, 1);
  434. if (!ret)
  435. code = MHI_EV_CC_SUCCESS;
  436. MSG_LOG("CTXT UPDATE CMD %s:%d %s\n", buf.name, id,
  437. (code == MHI_EV_CC_SUCCESS) ? "successful" :
  438. "failed");
  439. pkt->ptr = MHI_TRE_EVT_CMD_COMPLETION_PTR(0);
  440. pkt->dword[0] = MHI_TRE_EVT_CMD_COMPLETION_D0(code);
  441. pkt->dword[1] = MHI_TRE_EVT_CMD_COMPLETION_D1;
  442. break;
  443. }
  444. case MHI_PKT_TYPE_START_CHAN_CMD:
  445. {
  446. int id = MHI_TRE_GET_ID(pkt);
  447. struct mhi_sat_device *sat_dev = find_sat_dev_by_id(
  448. sat_cntrl, id,
  449. SAT_CTXT_TYPE_CHAN);
  450. int ret;
  451. if (!sat_dev) {
  452. MSG_LOG("Failed to find the satellite device with id : %d\n", id);
  453. WARN_ON(!sat_dev);
  454. return;
  455. }
  456. WARN_ON(sat_dev->chan_started);
  457. ret = mhi_prepare_for_transfer(sat_dev->mhi_dev);
  458. if (!ret) {
  459. sat_dev->chan_started = true;
  460. code = MHI_EV_CC_SUCCESS;
  461. }
  462. MSG_LOG("START CHANNEL %d CMD %s\n", id,
  463. (code == MHI_EV_CC_SUCCESS) ? "successful" :
  464. "failure");
  465. pkt->ptr = MHI_TRE_EVT_CMD_COMPLETION_PTR(0);
  466. pkt->dword[0] = MHI_TRE_EVT_CMD_COMPLETION_D0(code);
  467. pkt->dword[1] = MHI_TRE_EVT_CMD_COMPLETION_D1;
  468. break;
  469. }
  470. case MHI_PKT_TYPE_RESET_CHAN_CMD:
  471. {
  472. int id = MHI_TRE_GET_ID(pkt);
  473. struct mhi_sat_device *sat_dev =
  474. find_sat_dev_by_id(sat_cntrl, id,
  475. SAT_CTXT_TYPE_CHAN);
  476. if (!sat_dev) {
  477. MSG_LOG("Failed to find the satellite device with id : %d\n", id);
  478. WARN_ON(!sat_dev);
  479. return;
  480. }
  481. WARN_ON(!sat_dev->chan_started);
  482. mhi_unprepare_from_transfer(sat_dev->mhi_dev);
  483. sat_dev->chan_started = false;
  484. MSG_LOG("RESET CHANNEL %d CMD successful\n", id);
  485. pkt->ptr = MHI_TRE_EVT_CMD_COMPLETION_PTR(0);
  486. pkt->dword[0] = MHI_TRE_EVT_CMD_COMPLETION_D0(
  487. MHI_EV_CC_SUCCESS);
  488. pkt->dword[1] = MHI_TRE_EVT_CMD_COMPLETION_D1;
  489. break;
  490. }
  491. default:
  492. MSG_ERR("Unhandled MHI satellite command!");
  493. break;
  494. }
  495. }
  496. }
  497. /* send sys_err command to subsystem if device asserts or is powered off */
  498. static void mhi_sat_send_sys_err(struct mhi_sat_cntrl *sat_cntrl)
  499. {
  500. struct mhi_sat_subsys *subsys = sat_cntrl->subsys;
  501. struct sat_tre *pkt;
  502. void *msg;
  503. int ret;
  504. /* flush all pending work */
  505. flush_work(&sat_cntrl->connect_work);
  506. flush_work(&sat_cntrl->process_work);
  507. msg = kmalloc(SAT_MSG_SIZE(1), GFP_KERNEL);
  508. if (!msg) {
  509. MSG_ERR("Unable to malloc for SYS_ERR message!\n");
  510. return;
  511. }
  512. pkt = SAT_TRE_OFFSET(msg);
  513. pkt->ptr = MHI_TRE_CMD_SYS_ERR_PTR;
  514. pkt->dword[0] = MHI_TRE_CMD_SYS_ERR_D0;
  515. pkt->dword[1] = MHI_TRE_CMD_SYS_ERR_D1;
  516. mutex_lock(&sat_cntrl->cmd_wait_mutex);
  517. ret = mhi_sat_send_msg(sat_cntrl, SAT_MSG_ID_CMD,
  518. SAT_RESERVED_SEQ_NUM, msg,
  519. SAT_MSG_SIZE(1));
  520. kfree(msg);
  521. if (ret) {
  522. MSG_ERR("Failed to notify SYS_ERR cmd\n");
  523. mutex_unlock(&sat_cntrl->cmd_wait_mutex);
  524. return;
  525. }
  526. MSG_LOG("SYS_ERR command sent\n");
  527. /* blocking call to wait for command completion event */
  528. mhi_sat_wait_cmd_completion(sat_cntrl);
  529. mutex_unlock(&sat_cntrl->cmd_wait_mutex);
  530. }
  531. static void mhi_sat_error_worker(struct work_struct *work)
  532. {
  533. struct mhi_sat_cntrl *sat_cntrl = container_of(work,
  534. struct mhi_sat_cntrl, error_work);
  535. struct mhi_sat_subsys *subsys = sat_cntrl->subsys;
  536. struct sat_tre *pkt;
  537. void *msg;
  538. int ret;
  539. MSG_LOG("Entered\n");
  540. /* flush all pending work */
  541. flush_work(&sat_cntrl->connect_work);
  542. flush_work(&sat_cntrl->process_work);
  543. msg = kmalloc(SAT_MSG_SIZE(1), GFP_KERNEL);
  544. if (!msg) {
  545. MSG_ERR("Unable to malloc for SYS_ERR message!\n");
  546. return;
  547. }
  548. pkt = SAT_TRE_OFFSET(msg);
  549. pkt->ptr = MHI_TRE_EVT_MHI_STATE_PTR;
  550. pkt->dword[0] = MHI_TRE_EVT_MHI_STATE_D0(MHI_STATE_SYS_ERR);
  551. pkt->dword[1] = MHI_TRE_EVT_MHI_STATE_D1;
  552. ret = mhi_sat_send_msg(sat_cntrl, SAT_MSG_ID_EVT,
  553. SAT_RESERVED_SEQ_NUM, msg,
  554. SAT_MSG_SIZE(1));
  555. kfree(msg);
  556. MSG_LOG("SYS_ERROR state change event send %s!\n", ret ? "failure" :
  557. "success");
  558. }
  559. static void mhi_sat_process_worker(struct work_struct *work)
  560. {
  561. struct mhi_sat_cntrl *sat_cntrl = container_of(work,
  562. struct mhi_sat_cntrl, process_work);
  563. struct mhi_sat_subsys *subsys = sat_cntrl->subsys;
  564. struct mhi_sat_packet *packet, *tmp;
  565. struct sat_header *hdr;
  566. struct sat_tre *pkt;
  567. LIST_HEAD(head);
  568. MSG_LOG("Entered\n");
  569. spin_lock_irq(&sat_cntrl->pkt_lock);
  570. list_splice_tail_init(&sat_cntrl->packet_list, &head);
  571. spin_unlock_irq(&sat_cntrl->pkt_lock);
  572. list_for_each_entry_safe(packet, tmp, &head, node) {
  573. hdr = packet->msg;
  574. pkt = SAT_TRE_OFFSET(packet->msg);
  575. list_del(&packet->node);
  576. if (!MHI_SAT_ACTIVE(sat_cntrl))
  577. goto process_next;
  578. mhi_sat_process_cmds(sat_cntrl, hdr, pkt);
  579. /* send response event(s) */
  580. mhi_sat_send_msg(sat_cntrl, SAT_MSG_ID_EVT, hdr->seq,
  581. packet->msg,
  582. SAT_MSG_SIZE(SAT_TRE_NUM_PKTS(
  583. hdr->payload_size)));
  584. process_next:
  585. kfree(packet);
  586. }
  587. MSG_LOG("Exited\n");
  588. }
  589. static void mhi_sat_connect_worker(struct work_struct *work)
  590. {
  591. struct mhi_sat_cntrl *sat_cntrl = container_of(work,
  592. struct mhi_sat_cntrl, connect_work);
  593. struct mhi_sat_subsys *subsys = sat_cntrl->subsys;
  594. phys_addr_t base_addr;
  595. enum mhi_sat_state prev_state;
  596. struct sat_tre *pkt;
  597. void *msg;
  598. int ret;
  599. spin_lock_irq(&sat_cntrl->state_lock);
  600. if (!subsys->rpdev || sat_cntrl->max_devices != sat_cntrl->num_devices
  601. || !(MHI_SAT_ALLOW_CONNECTION(sat_cntrl))) {
  602. spin_unlock_irq(&sat_cntrl->state_lock);
  603. return;
  604. }
  605. prev_state = sat_cntrl->state;
  606. sat_cntrl->state = SAT_RUNNING;
  607. spin_unlock_irq(&sat_cntrl->state_lock);
  608. MSG_LOG("Entered\n");
  609. ret = mhi_controller_get_base(sat_cntrl->mhi_cntrl, &base_addr);
  610. if (ret) {
  611. MSG_ERR("Could not get controller base address\n");
  612. goto error_connect_work;
  613. }
  614. msg = kmalloc(SAT_MSG_SIZE(3), GFP_ATOMIC);
  615. if (!msg)
  616. goto error_connect_work;
  617. pkt = SAT_TRE_OFFSET(msg);
  618. /* prepare #1 MHI_CFG HELLO event */
  619. pkt->ptr = MHI_TRE_EVT_CFG_PTR(base_addr);
  620. pkt->dword[0] = MHI_TRE_EVT_CFG_D0(sat_cntrl->er_base,
  621. sat_cntrl->num_er);
  622. pkt->dword[1] = MHI_TRE_EVT_CFG_D1;
  623. pkt++;
  624. /* prepare M0 event */
  625. pkt->ptr = MHI_TRE_EVT_MHI_STATE_PTR;
  626. pkt->dword[0] = MHI_TRE_EVT_MHI_STATE_D0(MHI_STATE_M0);
  627. pkt->dword[1] = MHI_TRE_EVT_MHI_STATE_D1;
  628. pkt++;
  629. /* prepare AMSS event */
  630. pkt->ptr = MHI_TRE_EVT_EE_PTR;
  631. pkt->dword[0] = MHI_TRE_EVT_EE_D0(MHI_EE_AMSS);
  632. pkt->dword[1] = MHI_TRE_EVT_EE_D1;
  633. ret = mhi_sat_send_msg(sat_cntrl, SAT_MSG_ID_EVT, SAT_RESERVED_SEQ_NUM,
  634. msg, SAT_MSG_SIZE(3));
  635. kfree(msg);
  636. if (ret) {
  637. MSG_ERR("Failed to send hello packet:%d\n", ret);
  638. goto error_connect_work;
  639. }
  640. MSG_LOG("Device 0x%x sent hello packet\n", sat_cntrl->dev_id);
  641. return;
  642. error_connect_work:
  643. spin_lock_irq(&sat_cntrl->state_lock);
  644. if (MHI_SAT_ACTIVE(sat_cntrl))
  645. sat_cntrl->state = prev_state;
  646. spin_unlock_irq(&sat_cntrl->state_lock);
  647. }
  648. static void mhi_sat_process_events(struct mhi_sat_cntrl *sat_cntrl,
  649. struct sat_header *hdr, struct sat_tre *pkt)
  650. {
  651. int num_pkts = SAT_TRE_NUM_PKTS(hdr->payload_size);
  652. int i;
  653. for (i = 0; i < num_pkts; i++, pkt++) {
  654. if (MHI_TRE_GET_TYPE(pkt) ==
  655. MHI_PKT_TYPE_CMD_COMPLETION_EVENT) {
  656. if (hdr->reply_seq != sat_cntrl->last_cmd_seq)
  657. continue;
  658. sat_cntrl->last_cmd_ccs = MHI_TRE_GET_CCS(pkt);
  659. complete(&sat_cntrl->completion);
  660. }
  661. }
  662. }
  663. static int mhi_sat_rpmsg_cb(struct rpmsg_device *rpdev, void *data, int len,
  664. void *priv, u32 src)
  665. {
  666. struct mhi_sat_subsys *subsys = dev_get_drvdata(&rpdev->dev);
  667. struct sat_header *hdr = data;
  668. struct sat_tre *pkt = SAT_TRE_OFFSET(data);
  669. struct mhi_sat_cntrl *sat_cntrl;
  670. struct mhi_sat_packet *packet;
  671. unsigned long flags;
  672. WARN_ON(!mhi_sat_isvalid_header(hdr, len));
  673. /* find controller packet was sent for */
  674. sat_cntrl = find_sat_cntrl_by_id(subsys, hdr->dev_id);
  675. if (!sat_cntrl) {
  676. MSG_ERR("Message for unknown device!\n");
  677. return 0;
  678. }
  679. /* handle events directly regardless of controller active state */
  680. if (hdr->msg_id == SAT_MSG_ID_EVT) {
  681. mhi_sat_process_events(sat_cntrl, hdr, pkt);
  682. return 0;
  683. }
  684. /* Inactive controller cannot process incoming commands */
  685. if (unlikely(!MHI_SAT_ACTIVE(sat_cntrl))) {
  686. MSG_ERR("Message for inactive controller!\n");
  687. return 0;
  688. }
  689. /* offload commands to process worker */
  690. packet = kmalloc(sizeof(*packet) + len, GFP_ATOMIC);
  691. if (!packet)
  692. return 0;
  693. packet->cntrl = sat_cntrl;
  694. packet->msg = packet + 1;
  695. memcpy(packet->msg, data, len);
  696. spin_lock_irqsave(&sat_cntrl->pkt_lock, flags);
  697. list_add_tail(&packet->node, &sat_cntrl->packet_list);
  698. spin_unlock_irqrestore(&sat_cntrl->pkt_lock, flags);
  699. schedule_work(&sat_cntrl->process_work);
  700. return 0;
  701. }
  702. static void mhi_sat_rpmsg_remove(struct rpmsg_device *rpdev)
  703. {
  704. struct mhi_sat_subsys *subsys = dev_get_drvdata(&rpdev->dev);
  705. struct mhi_sat_cntrl *sat_cntrl;
  706. struct mhi_sat_device *sat_dev;
  707. struct mhi_buf_extended *buf, *tmp;
  708. MSG_SUBSYS_LOG("Enter\n");
  709. /* unprepare each controller/device from transfer */
  710. mutex_lock(&subsys->cntrl_mutex);
  711. list_for_each_entry(sat_cntrl, &subsys->cntrl_list, node) {
  712. flush_work(&sat_cntrl->error_work);
  713. spin_lock_irq(&sat_cntrl->state_lock);
  714. /*
  715. * move to disabled state if early error fatal is detected
  716. * and rpmsg link goes down before device remove call from
  717. * mhi is received
  718. */
  719. if (MHI_SAT_IN_ERROR_STATE(sat_cntrl)) {
  720. sat_cntrl->state = SAT_DISABLED;
  721. spin_unlock_irq(&sat_cntrl->state_lock);
  722. continue;
  723. }
  724. sat_cntrl->state = SAT_DISCONNECTED;
  725. spin_unlock_irq(&sat_cntrl->state_lock);
  726. flush_work(&sat_cntrl->connect_work);
  727. flush_work(&sat_cntrl->process_work);
  728. mutex_lock(&sat_cntrl->list_mutex);
  729. list_for_each_entry(sat_dev, &sat_cntrl->dev_list, node) {
  730. if (sat_dev->chan_started) {
  731. mhi_unprepare_from_transfer(sat_dev->mhi_dev);
  732. sat_dev->chan_started = false;
  733. }
  734. }
  735. list_for_each_entry_safe(buf, tmp, &sat_cntrl->addr_map_list,
  736. node) {
  737. struct device *parent_dev =
  738. sat_cntrl->mhi_cntrl->mhi_dev->dev.parent;
  739. if (buf->is_io) {
  740. dma_unmap_resource(parent_dev, buf->dma_addr,
  741. buf->len,
  742. DMA_BIDIRECTIONAL, 0);
  743. } else {
  744. dma_unmap_single_attrs(parent_dev,
  745. buf->dma_addr, buf->len,
  746. DMA_BIDIRECTIONAL,
  747. DMA_ATTR_SKIP_CPU_SYNC);
  748. }
  749. list_del(&buf->node);
  750. kfree(buf);
  751. }
  752. mutex_unlock(&sat_cntrl->list_mutex);
  753. MSG_LOG("Removed RPMSG link\n");
  754. }
  755. subsys->rpdev = NULL;
  756. mutex_unlock(&subsys->cntrl_mutex);
  757. }
  758. static int mhi_sat_rpmsg_probe(struct rpmsg_device *rpdev)
  759. {
  760. struct mhi_sat_subsys *subsys;
  761. struct mhi_sat_cntrl *sat_cntrl;
  762. const char *subsys_name;
  763. int ret;
  764. ret = of_property_read_string(rpdev->dev.parent->of_node, "label",
  765. &subsys_name);
  766. if (ret)
  767. return ret;
  768. /* find which subsystem has probed */
  769. subsys = find_subsys_by_name(subsys_name);
  770. if (!subsys)
  771. return -EINVAL;
  772. mutex_lock(&subsys->cntrl_mutex);
  773. MSG_SUBSYS_LOG("Received RPMSG probe\n");
  774. dev_set_drvdata(&rpdev->dev, subsys);
  775. subsys->rpdev = rpdev;
  776. /* schedule work for each controller as GLINK has connected */
  777. spin_lock_irq(&subsys->cntrl_lock);
  778. list_for_each_entry(sat_cntrl, &subsys->cntrl_list, node)
  779. schedule_work(&sat_cntrl->connect_work);
  780. spin_unlock_irq(&subsys->cntrl_lock);
  781. mutex_unlock(&subsys->cntrl_mutex);
  782. return 0;
  783. }
  784. static struct rpmsg_device_id mhi_sat_rpmsg_match_table[] = {
  785. { .name = "mhi_sat" },
  786. { },
  787. };
  788. static struct rpmsg_driver mhi_sat_rpmsg_driver = {
  789. .id_table = mhi_sat_rpmsg_match_table,
  790. .probe = mhi_sat_rpmsg_probe,
  791. .remove = mhi_sat_rpmsg_remove,
  792. .callback = mhi_sat_rpmsg_cb,
  793. .drv = {
  794. .name = "mhi,sat_rpmsg",
  795. },
  796. };
  797. static void mhi_sat_dev_status_cb(struct mhi_device *mhi_dev,
  798. enum mhi_callback mhi_cb)
  799. {
  800. struct mhi_sat_device *sat_dev = dev_get_drvdata(&mhi_dev->dev);
  801. struct mhi_sat_cntrl *sat_cntrl = sat_dev->cntrl;
  802. struct mhi_sat_subsys *subsys = sat_cntrl->subsys;
  803. unsigned long flags;
  804. if (mhi_cb != MHI_CB_FATAL_ERROR)
  805. return;
  806. MSG_LOG("Device fatal error detected\n");
  807. spin_lock_irqsave(&sat_cntrl->state_lock, flags);
  808. if (MHI_SAT_ACTIVE(sat_cntrl)) {
  809. schedule_work(&sat_cntrl->error_work);
  810. sat_cntrl->state = SAT_FATAL_DETECT;
  811. }
  812. spin_unlock_irqrestore(&sat_cntrl->state_lock, flags);
  813. }
  814. static void mhi_sat_dev_remove(struct mhi_device *mhi_dev)
  815. {
  816. struct mhi_sat_device *sat_dev = dev_get_drvdata(&mhi_dev->dev);
  817. struct mhi_sat_cntrl *sat_cntrl = sat_dev->cntrl;
  818. struct mhi_sat_subsys *subsys = sat_cntrl->subsys;
  819. struct mhi_buf_extended *buf, *tmp;
  820. bool send_sys_err = false;
  821. /* remove device node from probed list */
  822. mutex_lock(&sat_cntrl->list_mutex);
  823. list_del(&sat_dev->node);
  824. mutex_unlock(&sat_cntrl->list_mutex);
  825. sat_cntrl->num_devices--;
  826. mutex_lock(&subsys->cntrl_mutex);
  827. cancel_work_sync(&sat_cntrl->error_work);
  828. /* send sys_err if first device is removed */
  829. spin_lock_irq(&sat_cntrl->state_lock);
  830. if (MHI_SAT_ALLOW_SYS_ERR(sat_cntrl))
  831. send_sys_err = true;
  832. sat_cntrl->state = SAT_ERROR;
  833. spin_unlock_irq(&sat_cntrl->state_lock);
  834. if (send_sys_err)
  835. mhi_sat_send_sys_err(sat_cntrl);
  836. /* exit if some devices are still present */
  837. if (sat_cntrl->num_devices) {
  838. mutex_unlock(&subsys->cntrl_mutex);
  839. return;
  840. }
  841. /*
  842. * cancel any pending work as it is possible that work gets queued
  843. * when rpmsg probe comes in before controller is removed
  844. */
  845. cancel_work_sync(&sat_cntrl->connect_work);
  846. cancel_work_sync(&sat_cntrl->process_work);
  847. /* remove address mappings */
  848. mutex_lock(&sat_cntrl->list_mutex);
  849. list_for_each_entry_safe(buf, tmp, &sat_cntrl->addr_map_list, node) {
  850. struct device *parent_dev =
  851. sat_cntrl->mhi_cntrl->mhi_dev->dev.parent;
  852. if (buf->is_io) {
  853. dma_unmap_resource(parent_dev, buf->dma_addr, buf->len,
  854. DMA_BIDIRECTIONAL, 0);
  855. } else {
  856. dma_unmap_single_attrs(parent_dev, buf->dma_addr,
  857. buf->len, DMA_BIDIRECTIONAL,
  858. DMA_ATTR_SKIP_CPU_SYNC);
  859. }
  860. dma_unmap_single_attrs(parent_dev, buf->dma_addr,
  861. buf->len, DMA_BIDIRECTIONAL,
  862. DMA_ATTR_SKIP_CPU_SYNC);
  863. list_del(&buf->node);
  864. kfree(buf);
  865. }
  866. mutex_unlock(&sat_cntrl->list_mutex);
  867. /* remove controller */
  868. spin_lock_irq(&subsys->cntrl_lock);
  869. list_del(&sat_cntrl->node);
  870. spin_unlock_irq(&subsys->cntrl_lock);
  871. mutex_destroy(&sat_cntrl->cmd_wait_mutex);
  872. mutex_destroy(&sat_cntrl->list_mutex);
  873. MSG_LOG("Satellite controller node removed\n");
  874. kfree(sat_cntrl);
  875. mutex_unlock(&subsys->cntrl_mutex);
  876. }
  877. static int mhi_sat_dev_probe(struct mhi_device *mhi_dev,
  878. const struct mhi_device_id *id)
  879. {
  880. struct mhi_sat_device *sat_dev;
  881. struct mhi_sat_cntrl *sat_cntrl;
  882. struct mhi_sat_subsys *subsys = &mhi_sat_driver.subsys[id->driver_data];
  883. u32 dev_id = mhi_controller_get_numeric_id(mhi_dev->mhi_cntrl);
  884. if (!dev_id) {
  885. pr_err("Satellite numeric ID not set by controller\n");
  886. return -EINVAL;
  887. }
  888. /* find controller with unique device ID based on topology */
  889. sat_cntrl = find_sat_cntrl_by_id(subsys, dev_id);
  890. if (!sat_cntrl) {
  891. sat_cntrl = kzalloc(sizeof(*sat_cntrl), GFP_KERNEL);
  892. if (!sat_cntrl)
  893. return -ENOMEM;
  894. /*
  895. * max_devices will be set once per device. Set it to
  896. * -1 before it is populated to avoid false positive when
  897. * RPMSG probe schedules connect worker but no device has
  898. * probed in which case num_devices and max_devices are both
  899. * zero.
  900. */
  901. sat_cntrl->max_devices = -1;
  902. sat_cntrl->dev_id = dev_id;
  903. sat_cntrl->er_base = mhi_dev->dl_event_id;
  904. sat_cntrl->mhi_cntrl = mhi_dev->mhi_cntrl;
  905. sat_cntrl->last_cmd_seq = SAT_RESERVED_SEQ_NUM;
  906. sat_cntrl->subsys = subsys;
  907. init_completion(&sat_cntrl->completion);
  908. mutex_init(&sat_cntrl->list_mutex);
  909. mutex_init(&sat_cntrl->cmd_wait_mutex);
  910. spin_lock_init(&sat_cntrl->pkt_lock);
  911. spin_lock_init(&sat_cntrl->state_lock);
  912. INIT_WORK(&sat_cntrl->connect_work, mhi_sat_connect_worker);
  913. INIT_WORK(&sat_cntrl->process_work, mhi_sat_process_worker);
  914. INIT_WORK(&sat_cntrl->error_work, mhi_sat_error_worker);
  915. INIT_LIST_HEAD(&sat_cntrl->dev_list);
  916. INIT_LIST_HEAD(&sat_cntrl->addr_map_list);
  917. INIT_LIST_HEAD(&sat_cntrl->packet_list);
  918. mutex_lock(&subsys->cntrl_mutex);
  919. spin_lock_irq(&subsys->cntrl_lock);
  920. list_add(&sat_cntrl->node, &subsys->cntrl_list);
  921. spin_unlock_irq(&subsys->cntrl_lock);
  922. mutex_unlock(&subsys->cntrl_mutex);
  923. MSG_LOG("Controller allocated for 0x%x\n", dev_id);
  924. }
  925. /* set maximum devices for subsystem from device tree */
  926. sat_cntrl->max_devices = MHI_SAT_MAX_DEVICES;
  927. /* get event ring base and max indexes */
  928. sat_cntrl->er_base = min(sat_cntrl->er_base, mhi_dev->dl_event_id);
  929. sat_cntrl->er_max = max(sat_cntrl->er_base, mhi_dev->dl_event_id);
  930. sat_dev = devm_kzalloc(&mhi_dev->dev, sizeof(*sat_dev), GFP_KERNEL);
  931. if (!sat_dev)
  932. return -ENOMEM;
  933. sat_dev->mhi_dev = mhi_dev;
  934. sat_dev->cntrl = sat_cntrl;
  935. mutex_lock(&sat_cntrl->list_mutex);
  936. list_add(&sat_dev->node, &sat_cntrl->dev_list);
  937. mutex_unlock(&sat_cntrl->list_mutex);
  938. dev_set_drvdata(&mhi_dev->dev, sat_dev);
  939. sat_cntrl->num_devices++;
  940. /* schedule connect worker if all devices for controller have probed */
  941. if (sat_cntrl->num_devices == sat_cntrl->max_devices) {
  942. /* number of event rings is 1 more than difference in IDs */
  943. sat_cntrl->num_er = (sat_cntrl->er_max - sat_cntrl->er_base) +
  944. 1;
  945. MSG_LOG("All satellite channels probed!\n");
  946. schedule_work(&sat_cntrl->connect_work);
  947. }
  948. return 0;
  949. }
  950. /* .driver_data stores subsys id */
  951. static const struct mhi_device_id mhi_sat_dev_match_table[] = {
  952. { .chan = "ADSP_0", .driver_data = SUBSYS_ADSP },
  953. { .chan = "ADSP_1", .driver_data = SUBSYS_ADSP },
  954. { .chan = "ADSP_2", .driver_data = SUBSYS_ADSP },
  955. { .chan = "ADSP_3", .driver_data = SUBSYS_ADSP },
  956. {},
  957. };
  958. static struct mhi_driver mhi_sat_dev_driver = {
  959. .id_table = mhi_sat_dev_match_table,
  960. .probe = mhi_sat_dev_probe,
  961. .remove = mhi_sat_dev_remove,
  962. .status_cb = mhi_sat_dev_status_cb,
  963. .driver = {
  964. .name = MHI_SAT_DRIVER_NAME,
  965. .owner = THIS_MODULE,
  966. },
  967. };
  968. static int mhi_sat_init(void)
  969. {
  970. struct mhi_sat_subsys *subsys;
  971. int i, ret;
  972. subsys = kcalloc(SUBSYS_MAX, sizeof(*subsys), GFP_KERNEL);
  973. if (!subsys)
  974. return -ENOMEM;
  975. mhi_sat_driver.subsys = subsys;
  976. mhi_sat_driver.num_subsys = SUBSYS_MAX;
  977. for (i = 0; i < mhi_sat_driver.num_subsys; i++, subsys++) {
  978. char log[32];
  979. subsys->name = subsys_names[i];
  980. mutex_init(&subsys->cntrl_mutex);
  981. spin_lock_init(&subsys->cntrl_lock);
  982. INIT_LIST_HEAD(&subsys->cntrl_list);
  983. scnprintf(log, sizeof(log), "mhi_sat_%s", subsys->name);
  984. subsys->ipc_log = ipc_log_context_create(IPC_LOG_PAGES, log, 0);
  985. }
  986. ret = register_rpmsg_driver(&mhi_sat_rpmsg_driver);
  987. if (ret)
  988. goto error_sat_init;
  989. ret = mhi_driver_register(&mhi_sat_dev_driver);
  990. if (ret)
  991. goto error_sat_register;
  992. return 0;
  993. error_sat_register:
  994. unregister_rpmsg_driver(&mhi_sat_rpmsg_driver);
  995. error_sat_init:
  996. subsys = mhi_sat_driver.subsys;
  997. for (i = 0; i < mhi_sat_driver.num_subsys; i++, subsys++) {
  998. ipc_log_context_destroy(subsys->ipc_log);
  999. mutex_destroy(&subsys->cntrl_mutex);
  1000. }
  1001. kfree(mhi_sat_driver.subsys);
  1002. mhi_sat_driver.subsys = NULL;
  1003. return ret;
  1004. }
  1005. module_init(mhi_sat_init);
  1006. static void __exit mhi_sat_exit(void)
  1007. {
  1008. struct mhi_sat_subsys *subsys;
  1009. int i;
  1010. unregister_rpmsg_driver(&mhi_sat_rpmsg_driver);
  1011. subsys = mhi_sat_driver.subsys;
  1012. for (i = 0; i < mhi_sat_driver.num_subsys; i++, subsys++) {
  1013. ipc_log_context_destroy(subsys->ipc_log);
  1014. mutex_destroy(&subsys->cntrl_mutex);
  1015. }
  1016. kfree(mhi_sat_driver.subsys);
  1017. mhi_sat_driver.subsys = NULL;
  1018. }
  1019. module_exit(mhi_sat_exit);
  1020. MODULE_LICENSE("GPL");
  1021. MODULE_ALIAS("MHI_SATELLITE");
  1022. MODULE_DESCRIPTION("MHI SATELLITE DRIVER");