pm.c 38 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.
  4. *
  5. */
  6. #include <linux/delay.h>
  7. #include <linux/device.h>
  8. #include <linux/dma-direction.h>
  9. #include <linux/dma-mapping.h>
  10. #include <linux/interrupt.h>
  11. #include <linux/list.h>
  12. #include <linux/mhi.h>
  13. #include <linux/module.h>
  14. #include <linux/slab.h>
  15. #include <linux/wait.h>
  16. #include "internal.h"
  17. #include "trace.h"
  18. /*
  19. * Not all MHI state transitions are synchronous. Transitions like Linkdown,
  20. * SYS_ERR, and shutdown can happen anytime asynchronously. This function will
  21. * transition to a new state only if we're allowed to.
  22. *
  23. * Priority increases as we go down. For instance, from any state in L0, the
  24. * transition can be made to states in L1, L2 and L3. A notable exception to
  25. * this rule is state DISABLE. From DISABLE state we can only transition to
  26. * POR state. Also, while in L2 state, user cannot jump back to previous
  27. * L1 or L0 states.
  28. *
  29. * Valid transitions:
  30. * L0: DISABLE <--> POR
  31. * POR <--> POR
  32. * POR -> M0 -> M2 --> M0
  33. * POR -> FW_DL_ERR
  34. * FW_DL_ERR <--> FW_DL_ERR
  35. * M0 <--> M0
  36. * M0 -> FW_DL_ERR
  37. * M0 -> M3_ENTER -> M3 -> M3_EXIT --> M0
  38. * L1: SYS_ERR_DETECT -> SYS_ERR_PROCESS
  39. * SYS_ERR_PROCESS -> SYS_ERR_FAIL
  40. * SYS_ERR_FAIL -> SYS_ERR_DETECT
  41. * SYS_ERR_PROCESS --> POR
  42. * L2: SHUTDOWN_PROCESS -> LD_ERR_FATAL_DETECT
  43. * SHUTDOWN_PROCESS -> DISABLE
  44. * L3: LD_ERR_FATAL_DETECT <--> LD_ERR_FATAL_DETECT
  45. * LD_ERR_FATAL_DETECT -> DISABLE
  46. */
  47. static const struct mhi_pm_transitions dev_state_transitions[] = {
  48. /* L0 States */
  49. {
  50. MHI_PM_DISABLE,
  51. MHI_PM_POR
  52. },
  53. {
  54. MHI_PM_POR,
  55. MHI_PM_POR | MHI_PM_DISABLE | MHI_PM_M0 |
  56. MHI_PM_SYS_ERR_DETECT | MHI_PM_SHUTDOWN_PROCESS |
  57. MHI_PM_LD_ERR_FATAL_DETECT | MHI_PM_FW_DL_ERR
  58. },
  59. {
  60. MHI_PM_M0,
  61. MHI_PM_M0 | MHI_PM_M2 | MHI_PM_M3_ENTER |
  62. MHI_PM_SYS_ERR_DETECT | MHI_PM_SHUTDOWN_PROCESS |
  63. MHI_PM_LD_ERR_FATAL_DETECT | MHI_PM_FW_DL_ERR
  64. },
  65. {
  66. MHI_PM_M2,
  67. MHI_PM_M0 | MHI_PM_SYS_ERR_DETECT | MHI_PM_SHUTDOWN_PROCESS |
  68. MHI_PM_LD_ERR_FATAL_DETECT
  69. },
  70. {
  71. MHI_PM_M3_ENTER,
  72. MHI_PM_M3 | MHI_PM_SYS_ERR_DETECT | MHI_PM_SHUTDOWN_PROCESS |
  73. MHI_PM_LD_ERR_FATAL_DETECT
  74. },
  75. {
  76. MHI_PM_M3,
  77. MHI_PM_M3_EXIT | MHI_PM_SYS_ERR_DETECT |
  78. MHI_PM_LD_ERR_FATAL_DETECT
  79. },
  80. {
  81. MHI_PM_M3_EXIT,
  82. MHI_PM_M0 | MHI_PM_SYS_ERR_DETECT | MHI_PM_SHUTDOWN_PROCESS |
  83. MHI_PM_LD_ERR_FATAL_DETECT
  84. },
  85. {
  86. MHI_PM_FW_DL_ERR,
  87. MHI_PM_FW_DL_ERR | MHI_PM_SYS_ERR_DETECT |
  88. MHI_PM_SHUTDOWN_PROCESS | MHI_PM_LD_ERR_FATAL_DETECT
  89. },
  90. /* L1 States */
  91. {
  92. MHI_PM_SYS_ERR_DETECT,
  93. MHI_PM_SYS_ERR_PROCESS | MHI_PM_SHUTDOWN_PROCESS |
  94. MHI_PM_LD_ERR_FATAL_DETECT
  95. },
  96. {
  97. MHI_PM_SYS_ERR_PROCESS,
  98. MHI_PM_POR | MHI_PM_SYS_ERR_FAIL | MHI_PM_SHUTDOWN_PROCESS |
  99. MHI_PM_LD_ERR_FATAL_DETECT
  100. },
  101. {
  102. MHI_PM_SYS_ERR_FAIL,
  103. MHI_PM_SYS_ERR_DETECT | MHI_PM_SHUTDOWN_PROCESS |
  104. MHI_PM_LD_ERR_FATAL_DETECT
  105. },
  106. /* L2 States */
  107. {
  108. MHI_PM_SHUTDOWN_PROCESS,
  109. MHI_PM_DISABLE | MHI_PM_LD_ERR_FATAL_DETECT
  110. },
  111. /* L3 States */
  112. {
  113. MHI_PM_LD_ERR_FATAL_DETECT,
  114. MHI_PM_LD_ERR_FATAL_DETECT | MHI_PM_DISABLE
  115. },
  116. };
  117. enum mhi_pm_state __must_check mhi_tryset_pm_state(struct mhi_controller *mhi_cntrl,
  118. enum mhi_pm_state state)
  119. {
  120. unsigned long cur_state = mhi_cntrl->pm_state;
  121. int index = find_last_bit(&cur_state, 32);
  122. if (unlikely(index >= ARRAY_SIZE(dev_state_transitions)))
  123. return cur_state;
  124. if (unlikely(dev_state_transitions[index].from_state != cur_state))
  125. return cur_state;
  126. if (unlikely(!(dev_state_transitions[index].to_states & state)))
  127. return cur_state;
  128. trace_mhi_tryset_pm_state(mhi_cntrl, state);
  129. mhi_cntrl->pm_state = state;
  130. return mhi_cntrl->pm_state;
  131. }
  132. void mhi_set_mhi_state(struct mhi_controller *mhi_cntrl, enum mhi_state state)
  133. {
  134. struct device *dev = &mhi_cntrl->mhi_dev->dev;
  135. int ret;
  136. if (state == MHI_STATE_RESET) {
  137. ret = mhi_write_reg_field(mhi_cntrl, mhi_cntrl->regs, MHICTRL,
  138. MHICTRL_RESET_MASK, 1);
  139. } else {
  140. ret = mhi_write_reg_field(mhi_cntrl, mhi_cntrl->regs, MHICTRL,
  141. MHICTRL_MHISTATE_MASK, state);
  142. }
  143. if (ret)
  144. dev_err(dev, "Failed to set MHI state to: %s\n",
  145. mhi_state_str(state));
  146. }
  147. /* NOP for backward compatibility, host allowed to ring DB in M2 state */
  148. static void mhi_toggle_dev_wake_nop(struct mhi_controller *mhi_cntrl)
  149. {
  150. }
  151. static void mhi_toggle_dev_wake(struct mhi_controller *mhi_cntrl)
  152. {
  153. mhi_cntrl->wake_get(mhi_cntrl, false);
  154. mhi_cntrl->wake_put(mhi_cntrl, true);
  155. }
  156. /* Handle device ready state transition */
  157. int mhi_ready_state_transition(struct mhi_controller *mhi_cntrl)
  158. {
  159. struct mhi_event *mhi_event;
  160. enum mhi_pm_state cur_state;
  161. struct device *dev = &mhi_cntrl->mhi_dev->dev;
  162. u32 interval_us = 25000; /* poll register field every 25 milliseconds */
  163. u32 timeout_ms;
  164. int ret, i;
  165. /* Check if device entered error state */
  166. if (MHI_PM_IN_FATAL_STATE(mhi_cntrl->pm_state)) {
  167. dev_err(dev, "Device link is not accessible\n");
  168. return -EIO;
  169. }
  170. /* Wait for RESET to be cleared and READY bit to be set by the device */
  171. ret = mhi_poll_reg_field(mhi_cntrl, mhi_cntrl->regs, MHICTRL,
  172. MHICTRL_RESET_MASK, 0, interval_us,
  173. mhi_cntrl->timeout_ms);
  174. if (ret) {
  175. dev_err(dev, "Device failed to clear MHI Reset\n");
  176. return ret;
  177. }
  178. timeout_ms = mhi_cntrl->ready_timeout_ms ?
  179. mhi_cntrl->ready_timeout_ms : mhi_cntrl->timeout_ms;
  180. ret = mhi_poll_reg_field(mhi_cntrl, mhi_cntrl->regs, MHISTATUS,
  181. MHISTATUS_READY_MASK, 1, interval_us,
  182. timeout_ms);
  183. if (ret) {
  184. dev_err(dev, "Device failed to enter MHI Ready\n");
  185. return ret;
  186. }
  187. dev_dbg(dev, "Device in READY State\n");
  188. write_lock_irq(&mhi_cntrl->pm_lock);
  189. cur_state = mhi_tryset_pm_state(mhi_cntrl, MHI_PM_POR);
  190. mhi_cntrl->dev_state = MHI_STATE_READY;
  191. write_unlock_irq(&mhi_cntrl->pm_lock);
  192. if (cur_state != MHI_PM_POR) {
  193. dev_err(dev, "Error moving to state %s from %s\n",
  194. to_mhi_pm_state_str(MHI_PM_POR),
  195. to_mhi_pm_state_str(cur_state));
  196. return -EIO;
  197. }
  198. read_lock_bh(&mhi_cntrl->pm_lock);
  199. if (!MHI_REG_ACCESS_VALID(mhi_cntrl->pm_state)) {
  200. dev_err(dev, "Device registers not accessible\n");
  201. goto error_mmio;
  202. }
  203. /* Configure MMIO registers */
  204. ret = mhi_init_mmio(mhi_cntrl);
  205. if (ret) {
  206. dev_err(dev, "Error configuring MMIO registers\n");
  207. goto error_mmio;
  208. }
  209. /* Add elements to all SW event rings */
  210. mhi_event = mhi_cntrl->mhi_event;
  211. for (i = 0; i < mhi_cntrl->total_ev_rings; i++, mhi_event++) {
  212. struct mhi_ring *ring = &mhi_event->ring;
  213. /* Skip if this is an offload or HW event */
  214. if (mhi_event->offload_ev || mhi_event->hw_ring)
  215. continue;
  216. ring->wp = ring->base + ring->len - ring->el_size;
  217. *ring->ctxt_wp = cpu_to_le64(ring->iommu_base + ring->len - ring->el_size);
  218. /* Update all cores */
  219. smp_wmb();
  220. /* Ring the event ring db */
  221. spin_lock_irq(&mhi_event->lock);
  222. mhi_ring_er_db(mhi_event);
  223. spin_unlock_irq(&mhi_event->lock);
  224. }
  225. /* Set MHI to M0 state */
  226. mhi_set_mhi_state(mhi_cntrl, MHI_STATE_M0);
  227. read_unlock_bh(&mhi_cntrl->pm_lock);
  228. return 0;
  229. error_mmio:
  230. read_unlock_bh(&mhi_cntrl->pm_lock);
  231. return -EIO;
  232. }
  233. int mhi_pm_m0_transition(struct mhi_controller *mhi_cntrl)
  234. {
  235. enum mhi_pm_state cur_state;
  236. struct mhi_chan *mhi_chan;
  237. struct device *dev = &mhi_cntrl->mhi_dev->dev;
  238. int i;
  239. write_lock_irq(&mhi_cntrl->pm_lock);
  240. mhi_cntrl->dev_state = MHI_STATE_M0;
  241. cur_state = mhi_tryset_pm_state(mhi_cntrl, MHI_PM_M0);
  242. write_unlock_irq(&mhi_cntrl->pm_lock);
  243. if (unlikely(cur_state != MHI_PM_M0)) {
  244. dev_err(dev, "Unable to transition to M0 state\n");
  245. return -EIO;
  246. }
  247. mhi_cntrl->M0++;
  248. /* Wake up the device */
  249. read_lock_bh(&mhi_cntrl->pm_lock);
  250. mhi_cntrl->wake_get(mhi_cntrl, true);
  251. /* Ring all event rings and CMD ring only if we're in mission mode */
  252. if (MHI_IN_MISSION_MODE(mhi_cntrl->ee)) {
  253. struct mhi_event *mhi_event = mhi_cntrl->mhi_event;
  254. struct mhi_cmd *mhi_cmd =
  255. &mhi_cntrl->mhi_cmd[PRIMARY_CMD_RING];
  256. for (i = 0; i < mhi_cntrl->total_ev_rings; i++, mhi_event++) {
  257. if (mhi_event->offload_ev)
  258. continue;
  259. spin_lock_irq(&mhi_event->lock);
  260. mhi_ring_er_db(mhi_event);
  261. spin_unlock_irq(&mhi_event->lock);
  262. }
  263. /* Only ring primary cmd ring if ring is not empty */
  264. spin_lock_irq(&mhi_cmd->lock);
  265. if (mhi_cmd->ring.rp != mhi_cmd->ring.wp)
  266. mhi_ring_cmd_db(mhi_cntrl, mhi_cmd);
  267. spin_unlock_irq(&mhi_cmd->lock);
  268. }
  269. /* Ring channel DB registers */
  270. mhi_chan = mhi_cntrl->mhi_chan;
  271. for (i = 0; i < mhi_cntrl->max_chan; i++, mhi_chan++) {
  272. struct mhi_ring *tre_ring = &mhi_chan->tre_ring;
  273. if (mhi_chan->db_cfg.reset_req) {
  274. write_lock_irq(&mhi_chan->lock);
  275. mhi_chan->db_cfg.db_mode = true;
  276. write_unlock_irq(&mhi_chan->lock);
  277. }
  278. read_lock_irq(&mhi_chan->lock);
  279. /* Only ring DB if ring is not empty */
  280. if (tre_ring->base && tre_ring->wp != tre_ring->rp &&
  281. mhi_chan->ch_state == MHI_CH_STATE_ENABLED)
  282. mhi_ring_chan_db(mhi_cntrl, mhi_chan);
  283. read_unlock_irq(&mhi_chan->lock);
  284. }
  285. mhi_cntrl->wake_put(mhi_cntrl, false);
  286. read_unlock_bh(&mhi_cntrl->pm_lock);
  287. wake_up_all(&mhi_cntrl->state_event);
  288. return 0;
  289. }
  290. /*
  291. * After receiving the MHI state change event from the device indicating the
  292. * transition to M1 state, the host can transition the device to M2 state
  293. * for keeping it in low power state.
  294. */
  295. void mhi_pm_m1_transition(struct mhi_controller *mhi_cntrl)
  296. {
  297. enum mhi_pm_state state;
  298. struct device *dev = &mhi_cntrl->mhi_dev->dev;
  299. write_lock_irq(&mhi_cntrl->pm_lock);
  300. state = mhi_tryset_pm_state(mhi_cntrl, MHI_PM_M2);
  301. if (state == MHI_PM_M2) {
  302. mhi_set_mhi_state(mhi_cntrl, MHI_STATE_M2);
  303. mhi_cntrl->dev_state = MHI_STATE_M2;
  304. write_unlock_irq(&mhi_cntrl->pm_lock);
  305. mhi_cntrl->M2++;
  306. wake_up_all(&mhi_cntrl->state_event);
  307. /* If there are any pending resources, exit M2 immediately */
  308. if (unlikely(atomic_read(&mhi_cntrl->pending_pkts) ||
  309. atomic_read(&mhi_cntrl->dev_wake))) {
  310. dev_dbg(dev,
  311. "Exiting M2, pending_pkts: %d dev_wake: %d\n",
  312. atomic_read(&mhi_cntrl->pending_pkts),
  313. atomic_read(&mhi_cntrl->dev_wake));
  314. read_lock_bh(&mhi_cntrl->pm_lock);
  315. mhi_cntrl->wake_get(mhi_cntrl, true);
  316. mhi_cntrl->wake_put(mhi_cntrl, true);
  317. read_unlock_bh(&mhi_cntrl->pm_lock);
  318. } else {
  319. mhi_cntrl->status_cb(mhi_cntrl, MHI_CB_IDLE);
  320. }
  321. } else {
  322. write_unlock_irq(&mhi_cntrl->pm_lock);
  323. }
  324. }
  325. /* MHI M3 completion handler */
  326. int mhi_pm_m3_transition(struct mhi_controller *mhi_cntrl)
  327. {
  328. enum mhi_pm_state state;
  329. struct device *dev = &mhi_cntrl->mhi_dev->dev;
  330. write_lock_irq(&mhi_cntrl->pm_lock);
  331. mhi_cntrl->dev_state = MHI_STATE_M3;
  332. state = mhi_tryset_pm_state(mhi_cntrl, MHI_PM_M3);
  333. write_unlock_irq(&mhi_cntrl->pm_lock);
  334. if (state != MHI_PM_M3) {
  335. dev_err(dev, "Unable to transition to M3 state\n");
  336. return -EIO;
  337. }
  338. mhi_cntrl->M3++;
  339. wake_up_all(&mhi_cntrl->state_event);
  340. return 0;
  341. }
  342. /* Handle device Mission Mode transition */
  343. static int mhi_pm_mission_mode_transition(struct mhi_controller *mhi_cntrl)
  344. {
  345. struct mhi_event *mhi_event;
  346. struct device *dev = &mhi_cntrl->mhi_dev->dev;
  347. enum mhi_ee_type ee = MHI_EE_MAX, current_ee = mhi_cntrl->ee;
  348. int i, ret;
  349. dev_dbg(dev, "Processing Mission Mode transition\n");
  350. write_lock_irq(&mhi_cntrl->pm_lock);
  351. if (MHI_REG_ACCESS_VALID(mhi_cntrl->pm_state))
  352. ee = mhi_get_exec_env(mhi_cntrl);
  353. if (!MHI_IN_MISSION_MODE(ee)) {
  354. mhi_cntrl->pm_state = MHI_PM_LD_ERR_FATAL_DETECT;
  355. write_unlock_irq(&mhi_cntrl->pm_lock);
  356. wake_up_all(&mhi_cntrl->state_event);
  357. return -EIO;
  358. }
  359. mhi_cntrl->ee = ee;
  360. write_unlock_irq(&mhi_cntrl->pm_lock);
  361. wake_up_all(&mhi_cntrl->state_event);
  362. device_for_each_child(&mhi_cntrl->mhi_dev->dev, &current_ee,
  363. mhi_destroy_device);
  364. mhi_cntrl->status_cb(mhi_cntrl, MHI_CB_EE_MISSION_MODE);
  365. mhi_uevent_notify(mhi_cntrl, mhi_cntrl->ee);
  366. /* Force MHI to be in M0 state before continuing */
  367. ret = __mhi_device_get_sync(mhi_cntrl);
  368. if (ret)
  369. return ret;
  370. read_lock_bh(&mhi_cntrl->pm_lock);
  371. if (MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state)) {
  372. ret = -EIO;
  373. goto error_mission_mode;
  374. }
  375. /* Add elements to all HW event rings */
  376. mhi_event = mhi_cntrl->mhi_event;
  377. for (i = 0; i < mhi_cntrl->total_ev_rings; i++, mhi_event++) {
  378. struct mhi_ring *ring = &mhi_event->ring;
  379. if (mhi_event->offload_ev || !mhi_event->hw_ring)
  380. continue;
  381. ring->wp = ring->base + ring->len - ring->el_size;
  382. *ring->ctxt_wp = cpu_to_le64(ring->iommu_base + ring->len - ring->el_size);
  383. /* Update to all cores */
  384. smp_wmb();
  385. spin_lock_irq(&mhi_event->lock);
  386. if (MHI_DB_ACCESS_VALID(mhi_cntrl))
  387. mhi_ring_er_db(mhi_event);
  388. spin_unlock_irq(&mhi_event->lock);
  389. }
  390. read_unlock_bh(&mhi_cntrl->pm_lock);
  391. /*
  392. * The MHI devices are only created when the client device switches its
  393. * Execution Environment (EE) to either SBL or AMSS states
  394. */
  395. mhi_create_devices(mhi_cntrl);
  396. read_lock_bh(&mhi_cntrl->pm_lock);
  397. error_mission_mode:
  398. mhi_cntrl->wake_put(mhi_cntrl, false);
  399. read_unlock_bh(&mhi_cntrl->pm_lock);
  400. return ret;
  401. }
  402. /* Handle shutdown transitions */
  403. static void mhi_pm_disable_transition(struct mhi_controller *mhi_cntrl,
  404. bool destroy_device)
  405. {
  406. enum mhi_pm_state cur_state;
  407. struct mhi_event *mhi_event;
  408. struct mhi_cmd_ctxt *cmd_ctxt;
  409. struct mhi_cmd *mhi_cmd;
  410. struct mhi_event_ctxt *er_ctxt;
  411. struct device *dev = &mhi_cntrl->mhi_dev->dev;
  412. int ret, i;
  413. dev_dbg(dev, "Processing disable transition with PM state: %s\n",
  414. to_mhi_pm_state_str(mhi_cntrl->pm_state));
  415. mutex_lock(&mhi_cntrl->pm_mutex);
  416. /* Trigger MHI RESET so that the device will not access host memory */
  417. if (!MHI_PM_IN_FATAL_STATE(mhi_cntrl->pm_state)) {
  418. /* Skip MHI RESET if in RDDM state */
  419. if (mhi_cntrl->rddm_image && mhi_get_exec_env(mhi_cntrl) == MHI_EE_RDDM)
  420. goto skip_mhi_reset;
  421. dev_dbg(dev, "Triggering MHI Reset in device\n");
  422. mhi_set_mhi_state(mhi_cntrl, MHI_STATE_RESET);
  423. /* Wait for the reset bit to be cleared by the device */
  424. ret = mhi_poll_reg_field(mhi_cntrl, mhi_cntrl->regs, MHICTRL,
  425. MHICTRL_RESET_MASK, 0, 25000, mhi_cntrl->timeout_ms);
  426. if (ret)
  427. dev_err(dev, "Device failed to clear MHI Reset\n");
  428. /*
  429. * Device will clear BHI_INTVEC as a part of RESET processing,
  430. * hence re-program it
  431. */
  432. mhi_write_reg(mhi_cntrl, mhi_cntrl->bhi, BHI_INTVEC, 0);
  433. if (!MHI_IN_PBL(mhi_get_exec_env(mhi_cntrl))) {
  434. /* wait for ready to be set */
  435. ret = mhi_poll_reg_field(mhi_cntrl, mhi_cntrl->regs,
  436. MHISTATUS, MHISTATUS_READY_MASK,
  437. 1, 25000, mhi_cntrl->timeout_ms);
  438. if (ret)
  439. dev_err(dev, "Device failed to enter READY state\n");
  440. }
  441. }
  442. skip_mhi_reset:
  443. dev_dbg(dev,
  444. "Waiting for all pending event ring processing to complete\n");
  445. mhi_event = mhi_cntrl->mhi_event;
  446. for (i = 0; i < mhi_cntrl->total_ev_rings; i++, mhi_event++) {
  447. if (mhi_event->offload_ev)
  448. continue;
  449. disable_irq(mhi_cntrl->irq[mhi_event->irq]);
  450. tasklet_kill(&mhi_event->task);
  451. }
  452. /* Release lock and wait for all pending threads to complete */
  453. mutex_unlock(&mhi_cntrl->pm_mutex);
  454. dev_dbg(dev, "Waiting for all pending threads to complete\n");
  455. wake_up_all(&mhi_cntrl->state_event);
  456. /*
  457. * Only destroy the 'struct device' for channels if indicated by the
  458. * 'destroy_device' flag. Because, during system suspend or hibernation
  459. * state, there is no need to destroy the 'struct device' as the endpoint
  460. * device would still be physically attached to the machine.
  461. */
  462. if (destroy_device) {
  463. dev_dbg(dev, "Reset all active channels and remove MHI devices\n");
  464. device_for_each_child(&mhi_cntrl->mhi_dev->dev, NULL, mhi_destroy_device);
  465. }
  466. mutex_lock(&mhi_cntrl->pm_mutex);
  467. WARN_ON(atomic_read(&mhi_cntrl->dev_wake));
  468. WARN_ON(atomic_read(&mhi_cntrl->pending_pkts));
  469. /* Reset the ev rings and cmd rings */
  470. dev_dbg(dev, "Resetting EV CTXT and CMD CTXT\n");
  471. mhi_cmd = mhi_cntrl->mhi_cmd;
  472. cmd_ctxt = mhi_cntrl->mhi_ctxt->cmd_ctxt;
  473. for (i = 0; i < NR_OF_CMD_RINGS; i++, mhi_cmd++, cmd_ctxt++) {
  474. struct mhi_ring *ring = &mhi_cmd->ring;
  475. ring->rp = ring->base;
  476. ring->wp = ring->base;
  477. cmd_ctxt->rp = cmd_ctxt->rbase;
  478. cmd_ctxt->wp = cmd_ctxt->rbase;
  479. }
  480. mhi_event = mhi_cntrl->mhi_event;
  481. er_ctxt = mhi_cntrl->mhi_ctxt->er_ctxt;
  482. for (i = 0; i < mhi_cntrl->total_ev_rings; i++, er_ctxt++,
  483. mhi_event++) {
  484. struct mhi_ring *ring = &mhi_event->ring;
  485. /* Skip offload events */
  486. if (mhi_event->offload_ev)
  487. continue;
  488. ring->rp = ring->base;
  489. ring->wp = ring->base;
  490. er_ctxt->rp = er_ctxt->rbase;
  491. er_ctxt->wp = er_ctxt->rbase;
  492. }
  493. /* Move to disable state */
  494. write_lock_irq(&mhi_cntrl->pm_lock);
  495. cur_state = mhi_tryset_pm_state(mhi_cntrl, MHI_PM_DISABLE);
  496. write_unlock_irq(&mhi_cntrl->pm_lock);
  497. if (unlikely(cur_state != MHI_PM_DISABLE))
  498. dev_err(dev, "Error moving from PM state: %s to: %s\n",
  499. to_mhi_pm_state_str(cur_state),
  500. to_mhi_pm_state_str(MHI_PM_DISABLE));
  501. dev_dbg(dev, "Exiting with PM state: %s, MHI state: %s\n",
  502. to_mhi_pm_state_str(mhi_cntrl->pm_state),
  503. mhi_state_str(mhi_cntrl->dev_state));
  504. mutex_unlock(&mhi_cntrl->pm_mutex);
  505. }
  506. /* Handle system error transitions */
  507. static void mhi_pm_sys_error_transition(struct mhi_controller *mhi_cntrl)
  508. {
  509. enum mhi_pm_state cur_state, prev_state;
  510. enum dev_st_transition next_state;
  511. struct mhi_event *mhi_event;
  512. struct mhi_cmd_ctxt *cmd_ctxt;
  513. struct mhi_cmd *mhi_cmd;
  514. struct mhi_event_ctxt *er_ctxt;
  515. struct device *dev = &mhi_cntrl->mhi_dev->dev;
  516. bool reset_device = false;
  517. int ret, i;
  518. dev_dbg(dev, "Transitioning from PM state: %s to: %s\n",
  519. to_mhi_pm_state_str(mhi_cntrl->pm_state),
  520. to_mhi_pm_state_str(MHI_PM_SYS_ERR_PROCESS));
  521. /* We must notify MHI control driver so it can clean up first */
  522. mhi_cntrl->status_cb(mhi_cntrl, MHI_CB_SYS_ERROR);
  523. mutex_lock(&mhi_cntrl->pm_mutex);
  524. write_lock_irq(&mhi_cntrl->pm_lock);
  525. prev_state = mhi_cntrl->pm_state;
  526. cur_state = mhi_tryset_pm_state(mhi_cntrl, MHI_PM_SYS_ERR_PROCESS);
  527. write_unlock_irq(&mhi_cntrl->pm_lock);
  528. if (cur_state != MHI_PM_SYS_ERR_PROCESS) {
  529. dev_err(dev, "Failed to transition from PM state: %s to: %s\n",
  530. to_mhi_pm_state_str(cur_state),
  531. to_mhi_pm_state_str(MHI_PM_SYS_ERR_PROCESS));
  532. goto exit_sys_error_transition;
  533. }
  534. mhi_cntrl->ee = MHI_EE_DISABLE_TRANSITION;
  535. mhi_cntrl->dev_state = MHI_STATE_RESET;
  536. /* Wake up threads waiting for state transition */
  537. wake_up_all(&mhi_cntrl->state_event);
  538. mhi_uevent_notify(mhi_cntrl, mhi_cntrl->ee);
  539. if (MHI_REG_ACCESS_VALID(prev_state)) {
  540. /*
  541. * If the device is in PBL or SBL, it will only respond to
  542. * RESET if the device is in SYSERR state. SYSERR might
  543. * already be cleared at this point.
  544. */
  545. enum mhi_state cur_state = mhi_get_mhi_state(mhi_cntrl);
  546. enum mhi_ee_type cur_ee = mhi_get_exec_env(mhi_cntrl);
  547. if (cur_state == MHI_STATE_SYS_ERR)
  548. reset_device = true;
  549. else if (cur_ee != MHI_EE_PBL && cur_ee != MHI_EE_SBL)
  550. reset_device = true;
  551. }
  552. /* Trigger MHI RESET so that the device will not access host memory */
  553. if (reset_device) {
  554. u32 in_reset = -1;
  555. unsigned long timeout = msecs_to_jiffies(mhi_cntrl->timeout_ms);
  556. dev_dbg(dev, "Triggering MHI Reset in device\n");
  557. mhi_set_mhi_state(mhi_cntrl, MHI_STATE_RESET);
  558. /* Wait for the reset bit to be cleared by the device */
  559. ret = wait_event_timeout(mhi_cntrl->state_event,
  560. mhi_read_reg_field(mhi_cntrl,
  561. mhi_cntrl->regs,
  562. MHICTRL,
  563. MHICTRL_RESET_MASK,
  564. &in_reset) ||
  565. !in_reset, timeout);
  566. if (!ret || in_reset) {
  567. dev_err(dev, "Device failed to exit MHI Reset state\n");
  568. write_lock_irq(&mhi_cntrl->pm_lock);
  569. cur_state = mhi_tryset_pm_state(mhi_cntrl,
  570. MHI_PM_SYS_ERR_FAIL);
  571. write_unlock_irq(&mhi_cntrl->pm_lock);
  572. /* Shutdown may have occurred, otherwise cleanup now */
  573. if (cur_state != MHI_PM_SYS_ERR_FAIL)
  574. goto exit_sys_error_transition;
  575. }
  576. /*
  577. * Device will clear BHI_INTVEC as a part of RESET processing,
  578. * hence re-program it
  579. */
  580. mhi_write_reg(mhi_cntrl, mhi_cntrl->bhi, BHI_INTVEC, 0);
  581. }
  582. dev_dbg(dev,
  583. "Waiting for all pending event ring processing to complete\n");
  584. mhi_event = mhi_cntrl->mhi_event;
  585. for (i = 0; i < mhi_cntrl->total_ev_rings; i++, mhi_event++) {
  586. if (mhi_event->offload_ev)
  587. continue;
  588. tasklet_kill(&mhi_event->task);
  589. }
  590. /* Release lock and wait for all pending threads to complete */
  591. mutex_unlock(&mhi_cntrl->pm_mutex);
  592. dev_dbg(dev, "Waiting for all pending threads to complete\n");
  593. wake_up_all(&mhi_cntrl->state_event);
  594. dev_dbg(dev, "Reset all active channels and remove MHI devices\n");
  595. device_for_each_child(&mhi_cntrl->mhi_dev->dev, NULL, mhi_destroy_device);
  596. mutex_lock(&mhi_cntrl->pm_mutex);
  597. WARN_ON(atomic_read(&mhi_cntrl->dev_wake));
  598. WARN_ON(atomic_read(&mhi_cntrl->pending_pkts));
  599. /* Reset the ev rings and cmd rings */
  600. dev_dbg(dev, "Resetting EV CTXT and CMD CTXT\n");
  601. mhi_cmd = mhi_cntrl->mhi_cmd;
  602. cmd_ctxt = mhi_cntrl->mhi_ctxt->cmd_ctxt;
  603. for (i = 0; i < NR_OF_CMD_RINGS; i++, mhi_cmd++, cmd_ctxt++) {
  604. struct mhi_ring *ring = &mhi_cmd->ring;
  605. ring->rp = ring->base;
  606. ring->wp = ring->base;
  607. cmd_ctxt->rp = cmd_ctxt->rbase;
  608. cmd_ctxt->wp = cmd_ctxt->rbase;
  609. }
  610. mhi_event = mhi_cntrl->mhi_event;
  611. er_ctxt = mhi_cntrl->mhi_ctxt->er_ctxt;
  612. for (i = 0; i < mhi_cntrl->total_ev_rings; i++, er_ctxt++,
  613. mhi_event++) {
  614. struct mhi_ring *ring = &mhi_event->ring;
  615. /* Skip offload events */
  616. if (mhi_event->offload_ev)
  617. continue;
  618. ring->rp = ring->base;
  619. ring->wp = ring->base;
  620. er_ctxt->rp = er_ctxt->rbase;
  621. er_ctxt->wp = er_ctxt->rbase;
  622. }
  623. /* Transition to next state */
  624. if (MHI_IN_PBL(mhi_get_exec_env(mhi_cntrl))) {
  625. write_lock_irq(&mhi_cntrl->pm_lock);
  626. cur_state = mhi_tryset_pm_state(mhi_cntrl, MHI_PM_POR);
  627. write_unlock_irq(&mhi_cntrl->pm_lock);
  628. if (cur_state != MHI_PM_POR) {
  629. dev_err(dev, "Error moving to state %s from %s\n",
  630. to_mhi_pm_state_str(MHI_PM_POR),
  631. to_mhi_pm_state_str(cur_state));
  632. goto exit_sys_error_transition;
  633. }
  634. next_state = DEV_ST_TRANSITION_PBL;
  635. } else {
  636. next_state = DEV_ST_TRANSITION_READY;
  637. }
  638. mhi_queue_state_transition(mhi_cntrl, next_state);
  639. exit_sys_error_transition:
  640. dev_dbg(dev, "Exiting with PM state: %s, MHI state: %s\n",
  641. to_mhi_pm_state_str(mhi_cntrl->pm_state),
  642. mhi_state_str(mhi_cntrl->dev_state));
  643. mutex_unlock(&mhi_cntrl->pm_mutex);
  644. }
  645. /* Queue a new work item and schedule work */
  646. int mhi_queue_state_transition(struct mhi_controller *mhi_cntrl,
  647. enum dev_st_transition state)
  648. {
  649. struct state_transition *item = kmalloc_obj(*item, GFP_ATOMIC);
  650. unsigned long flags;
  651. if (!item)
  652. return -ENOMEM;
  653. item->state = state;
  654. spin_lock_irqsave(&mhi_cntrl->transition_lock, flags);
  655. list_add_tail(&item->node, &mhi_cntrl->transition_list);
  656. spin_unlock_irqrestore(&mhi_cntrl->transition_lock, flags);
  657. queue_work(mhi_cntrl->hiprio_wq, &mhi_cntrl->st_worker);
  658. return 0;
  659. }
  660. /* SYS_ERR worker */
  661. void mhi_pm_sys_err_handler(struct mhi_controller *mhi_cntrl)
  662. {
  663. struct device *dev = &mhi_cntrl->mhi_dev->dev;
  664. /* skip if controller supports RDDM */
  665. if (mhi_cntrl->rddm_image) {
  666. dev_dbg(dev, "Controller supports RDDM, skip SYS_ERROR\n");
  667. return;
  668. }
  669. mhi_queue_state_transition(mhi_cntrl, DEV_ST_TRANSITION_SYS_ERR);
  670. }
  671. /* Device State Transition worker */
  672. void mhi_pm_st_worker(struct work_struct *work)
  673. {
  674. struct state_transition *itr, *tmp;
  675. LIST_HEAD(head);
  676. struct mhi_controller *mhi_cntrl = container_of(work,
  677. struct mhi_controller,
  678. st_worker);
  679. spin_lock_irq(&mhi_cntrl->transition_lock);
  680. list_splice_tail_init(&mhi_cntrl->transition_list, &head);
  681. spin_unlock_irq(&mhi_cntrl->transition_lock);
  682. list_for_each_entry_safe(itr, tmp, &head, node) {
  683. list_del(&itr->node);
  684. trace_mhi_pm_st_transition(mhi_cntrl, itr->state);
  685. switch (itr->state) {
  686. case DEV_ST_TRANSITION_PBL:
  687. write_lock_irq(&mhi_cntrl->pm_lock);
  688. if (MHI_REG_ACCESS_VALID(mhi_cntrl->pm_state))
  689. mhi_cntrl->ee = mhi_get_exec_env(mhi_cntrl);
  690. write_unlock_irq(&mhi_cntrl->pm_lock);
  691. mhi_fw_load_handler(mhi_cntrl);
  692. break;
  693. case DEV_ST_TRANSITION_SBL:
  694. write_lock_irq(&mhi_cntrl->pm_lock);
  695. mhi_cntrl->ee = MHI_EE_SBL;
  696. write_unlock_irq(&mhi_cntrl->pm_lock);
  697. /*
  698. * The MHI devices are only created when the client
  699. * device switches its Execution Environment (EE) to
  700. * either SBL or AMSS states
  701. */
  702. mhi_create_devices(mhi_cntrl);
  703. if (mhi_cntrl->fbc_download)
  704. mhi_download_amss_image(mhi_cntrl);
  705. mhi_uevent_notify(mhi_cntrl, mhi_cntrl->ee);
  706. break;
  707. case DEV_ST_TRANSITION_MISSION_MODE:
  708. mhi_pm_mission_mode_transition(mhi_cntrl);
  709. break;
  710. case DEV_ST_TRANSITION_FP:
  711. write_lock_irq(&mhi_cntrl->pm_lock);
  712. mhi_cntrl->ee = MHI_EE_FP;
  713. write_unlock_irq(&mhi_cntrl->pm_lock);
  714. mhi_create_devices(mhi_cntrl);
  715. mhi_uevent_notify(mhi_cntrl, mhi_cntrl->ee);
  716. break;
  717. case DEV_ST_TRANSITION_READY:
  718. mhi_ready_state_transition(mhi_cntrl);
  719. break;
  720. case DEV_ST_TRANSITION_SYS_ERR:
  721. mhi_pm_sys_error_transition(mhi_cntrl);
  722. break;
  723. case DEV_ST_TRANSITION_DISABLE:
  724. mhi_pm_disable_transition(mhi_cntrl, false);
  725. break;
  726. case DEV_ST_TRANSITION_DISABLE_DESTROY_DEVICE:
  727. mhi_pm_disable_transition(mhi_cntrl, true);
  728. break;
  729. default:
  730. break;
  731. }
  732. kfree(itr);
  733. }
  734. }
  735. int mhi_pm_suspend(struct mhi_controller *mhi_cntrl)
  736. {
  737. struct mhi_chan *itr, *tmp;
  738. struct device *dev = &mhi_cntrl->mhi_dev->dev;
  739. enum mhi_pm_state new_state;
  740. int ret;
  741. if (mhi_cntrl->pm_state == MHI_PM_DISABLE)
  742. return -EINVAL;
  743. if (MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state))
  744. return -EIO;
  745. /* Return busy if there are any pending resources */
  746. if (atomic_read(&mhi_cntrl->dev_wake) ||
  747. atomic_read(&mhi_cntrl->pending_pkts))
  748. return -EBUSY;
  749. /* Take MHI out of M2 state */
  750. read_lock_bh(&mhi_cntrl->pm_lock);
  751. mhi_cntrl->wake_get(mhi_cntrl, false);
  752. read_unlock_bh(&mhi_cntrl->pm_lock);
  753. ret = wait_event_timeout(mhi_cntrl->state_event,
  754. mhi_cntrl->dev_state == MHI_STATE_M0 ||
  755. mhi_cntrl->dev_state == MHI_STATE_M1 ||
  756. MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state),
  757. msecs_to_jiffies(mhi_cntrl->timeout_ms));
  758. read_lock_bh(&mhi_cntrl->pm_lock);
  759. mhi_cntrl->wake_put(mhi_cntrl, false);
  760. read_unlock_bh(&mhi_cntrl->pm_lock);
  761. if (!ret || MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state)) {
  762. dev_err(dev,
  763. "Could not enter M0/M1 state");
  764. return -EIO;
  765. }
  766. write_lock_irq(&mhi_cntrl->pm_lock);
  767. if (atomic_read(&mhi_cntrl->dev_wake) ||
  768. atomic_read(&mhi_cntrl->pending_pkts)) {
  769. write_unlock_irq(&mhi_cntrl->pm_lock);
  770. return -EBUSY;
  771. }
  772. dev_dbg(dev, "Allowing M3 transition\n");
  773. new_state = mhi_tryset_pm_state(mhi_cntrl, MHI_PM_M3_ENTER);
  774. if (new_state != MHI_PM_M3_ENTER) {
  775. write_unlock_irq(&mhi_cntrl->pm_lock);
  776. dev_err(dev,
  777. "Error setting to PM state: %s from: %s\n",
  778. to_mhi_pm_state_str(MHI_PM_M3_ENTER),
  779. to_mhi_pm_state_str(mhi_cntrl->pm_state));
  780. return -EIO;
  781. }
  782. /* Set MHI to M3 and wait for completion */
  783. mhi_set_mhi_state(mhi_cntrl, MHI_STATE_M3);
  784. write_unlock_irq(&mhi_cntrl->pm_lock);
  785. dev_dbg(dev, "Waiting for M3 completion\n");
  786. ret = wait_event_timeout(mhi_cntrl->state_event,
  787. mhi_cntrl->dev_state == MHI_STATE_M3 ||
  788. MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state),
  789. msecs_to_jiffies(mhi_cntrl->timeout_ms));
  790. if (!ret || MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state)) {
  791. dev_err(dev,
  792. "Did not enter M3 state, MHI state: %s, PM state: %s\n",
  793. mhi_state_str(mhi_cntrl->dev_state),
  794. to_mhi_pm_state_str(mhi_cntrl->pm_state));
  795. return -EIO;
  796. }
  797. /* Notify clients about entering LPM */
  798. list_for_each_entry_safe(itr, tmp, &mhi_cntrl->lpm_chans, node) {
  799. mutex_lock(&itr->mutex);
  800. if (itr->mhi_dev)
  801. mhi_notify(itr->mhi_dev, MHI_CB_LPM_ENTER);
  802. mutex_unlock(&itr->mutex);
  803. }
  804. return 0;
  805. }
  806. EXPORT_SYMBOL_GPL(mhi_pm_suspend);
  807. static int __mhi_pm_resume(struct mhi_controller *mhi_cntrl, bool force)
  808. {
  809. struct mhi_chan *itr, *tmp;
  810. struct device *dev = &mhi_cntrl->mhi_dev->dev;
  811. enum mhi_pm_state cur_state;
  812. int ret;
  813. dev_dbg(dev, "Entered with PM state: %s, MHI state: %s\n",
  814. to_mhi_pm_state_str(mhi_cntrl->pm_state),
  815. mhi_state_str(mhi_cntrl->dev_state));
  816. if (mhi_cntrl->pm_state == MHI_PM_DISABLE)
  817. return 0;
  818. if (MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state))
  819. return -EIO;
  820. if (mhi_get_mhi_state(mhi_cntrl) != MHI_STATE_M3) {
  821. dev_warn(dev, "Resuming from non M3 state (%s)\n",
  822. mhi_state_str(mhi_get_mhi_state(mhi_cntrl)));
  823. if (!force)
  824. return -EINVAL;
  825. }
  826. /* Notify clients about exiting LPM */
  827. list_for_each_entry_safe(itr, tmp, &mhi_cntrl->lpm_chans, node) {
  828. mutex_lock(&itr->mutex);
  829. if (itr->mhi_dev)
  830. mhi_notify(itr->mhi_dev, MHI_CB_LPM_EXIT);
  831. mutex_unlock(&itr->mutex);
  832. }
  833. write_lock_irq(&mhi_cntrl->pm_lock);
  834. cur_state = mhi_tryset_pm_state(mhi_cntrl, MHI_PM_M3_EXIT);
  835. if (cur_state != MHI_PM_M3_EXIT) {
  836. write_unlock_irq(&mhi_cntrl->pm_lock);
  837. dev_info(dev,
  838. "Error setting to PM state: %s from: %s\n",
  839. to_mhi_pm_state_str(MHI_PM_M3_EXIT),
  840. to_mhi_pm_state_str(mhi_cntrl->pm_state));
  841. return -EIO;
  842. }
  843. /* Set MHI to M0 and wait for completion */
  844. mhi_set_mhi_state(mhi_cntrl, MHI_STATE_M0);
  845. write_unlock_irq(&mhi_cntrl->pm_lock);
  846. ret = wait_event_timeout(mhi_cntrl->state_event,
  847. mhi_cntrl->dev_state == MHI_STATE_M0 ||
  848. mhi_cntrl->dev_state == MHI_STATE_M2 ||
  849. MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state),
  850. msecs_to_jiffies(mhi_cntrl->timeout_ms));
  851. if (!ret || MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state)) {
  852. dev_err(dev,
  853. "Did not enter M0 state, MHI state: %s, PM state: %s\n",
  854. mhi_state_str(mhi_cntrl->dev_state),
  855. to_mhi_pm_state_str(mhi_cntrl->pm_state));
  856. return -EIO;
  857. }
  858. return 0;
  859. }
  860. int mhi_pm_resume(struct mhi_controller *mhi_cntrl)
  861. {
  862. return __mhi_pm_resume(mhi_cntrl, false);
  863. }
  864. EXPORT_SYMBOL_GPL(mhi_pm_resume);
  865. int mhi_pm_resume_force(struct mhi_controller *mhi_cntrl)
  866. {
  867. return __mhi_pm_resume(mhi_cntrl, true);
  868. }
  869. EXPORT_SYMBOL_GPL(mhi_pm_resume_force);
  870. int __mhi_device_get_sync(struct mhi_controller *mhi_cntrl)
  871. {
  872. int ret;
  873. /* Wake up the device */
  874. read_lock_bh(&mhi_cntrl->pm_lock);
  875. if (MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state)) {
  876. read_unlock_bh(&mhi_cntrl->pm_lock);
  877. return -EIO;
  878. }
  879. mhi_cntrl->wake_get(mhi_cntrl, true);
  880. if (MHI_PM_IN_SUSPEND_STATE(mhi_cntrl->pm_state))
  881. mhi_trigger_resume(mhi_cntrl);
  882. read_unlock_bh(&mhi_cntrl->pm_lock);
  883. ret = wait_event_timeout(mhi_cntrl->state_event,
  884. mhi_cntrl->pm_state == MHI_PM_M0 ||
  885. MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state),
  886. msecs_to_jiffies(mhi_cntrl->timeout_ms));
  887. if (!ret || MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state)) {
  888. read_lock_bh(&mhi_cntrl->pm_lock);
  889. mhi_cntrl->wake_put(mhi_cntrl, false);
  890. read_unlock_bh(&mhi_cntrl->pm_lock);
  891. return -EIO;
  892. }
  893. return 0;
  894. }
  895. /* Assert device wake db */
  896. static void mhi_assert_dev_wake(struct mhi_controller *mhi_cntrl, bool force)
  897. {
  898. unsigned long flags;
  899. /*
  900. * If force flag is set, then increment the wake count value and
  901. * ring wake db
  902. */
  903. if (unlikely(force)) {
  904. spin_lock_irqsave(&mhi_cntrl->wlock, flags);
  905. atomic_inc(&mhi_cntrl->dev_wake);
  906. if (MHI_WAKE_DB_FORCE_SET_VALID(mhi_cntrl->pm_state) &&
  907. !mhi_cntrl->wake_set) {
  908. mhi_write_db(mhi_cntrl, mhi_cntrl->wake_db, 1);
  909. mhi_cntrl->wake_set = true;
  910. }
  911. spin_unlock_irqrestore(&mhi_cntrl->wlock, flags);
  912. } else {
  913. /*
  914. * If resources are already requested, then just increment
  915. * the wake count value and return
  916. */
  917. if (likely(atomic_add_unless(&mhi_cntrl->dev_wake, 1, 0)))
  918. return;
  919. spin_lock_irqsave(&mhi_cntrl->wlock, flags);
  920. if ((atomic_inc_return(&mhi_cntrl->dev_wake) == 1) &&
  921. MHI_WAKE_DB_SET_VALID(mhi_cntrl->pm_state) &&
  922. !mhi_cntrl->wake_set) {
  923. mhi_write_db(mhi_cntrl, mhi_cntrl->wake_db, 1);
  924. mhi_cntrl->wake_set = true;
  925. }
  926. spin_unlock_irqrestore(&mhi_cntrl->wlock, flags);
  927. }
  928. }
  929. /* De-assert device wake db */
  930. static void mhi_deassert_dev_wake(struct mhi_controller *mhi_cntrl,
  931. bool override)
  932. {
  933. unsigned long flags;
  934. /*
  935. * Only continue if there is a single resource, else just decrement
  936. * and return
  937. */
  938. if (likely(atomic_add_unless(&mhi_cntrl->dev_wake, -1, 1)))
  939. return;
  940. spin_lock_irqsave(&mhi_cntrl->wlock, flags);
  941. if ((atomic_dec_return(&mhi_cntrl->dev_wake) == 0) &&
  942. MHI_WAKE_DB_CLEAR_VALID(mhi_cntrl->pm_state) && !override &&
  943. mhi_cntrl->wake_set) {
  944. mhi_write_db(mhi_cntrl, mhi_cntrl->wake_db, 0);
  945. mhi_cntrl->wake_set = false;
  946. }
  947. spin_unlock_irqrestore(&mhi_cntrl->wlock, flags);
  948. }
  949. int mhi_async_power_up(struct mhi_controller *mhi_cntrl)
  950. {
  951. struct mhi_event *mhi_event = mhi_cntrl->mhi_event;
  952. enum mhi_state state;
  953. enum mhi_ee_type current_ee;
  954. enum dev_st_transition next_state;
  955. struct device *dev = &mhi_cntrl->mhi_dev->dev;
  956. u32 interval_us = 25000; /* poll register field every 25 milliseconds */
  957. int ret, i;
  958. dev_info(dev, "Requested to power ON\n");
  959. /* Supply default wake routines if not provided by controller driver */
  960. if (!mhi_cntrl->wake_get || !mhi_cntrl->wake_put ||
  961. !mhi_cntrl->wake_toggle) {
  962. mhi_cntrl->wake_get = mhi_assert_dev_wake;
  963. mhi_cntrl->wake_put = mhi_deassert_dev_wake;
  964. mhi_cntrl->wake_toggle = (mhi_cntrl->db_access & MHI_PM_M2) ?
  965. mhi_toggle_dev_wake_nop : mhi_toggle_dev_wake;
  966. }
  967. mutex_lock(&mhi_cntrl->pm_mutex);
  968. mhi_cntrl->pm_state = MHI_PM_DISABLE;
  969. /* Setup BHI INTVEC */
  970. write_lock_irq(&mhi_cntrl->pm_lock);
  971. mhi_write_reg(mhi_cntrl, mhi_cntrl->bhi, BHI_INTVEC, 0);
  972. mhi_cntrl->pm_state = MHI_PM_POR;
  973. mhi_cntrl->ee = MHI_EE_MAX;
  974. current_ee = mhi_get_exec_env(mhi_cntrl);
  975. write_unlock_irq(&mhi_cntrl->pm_lock);
  976. /* Confirm that the device is in valid exec env */
  977. if (!MHI_POWER_UP_CAPABLE(current_ee)) {
  978. dev_err(dev, "%s is not a valid EE for power on\n",
  979. TO_MHI_EXEC_STR(current_ee));
  980. ret = -EIO;
  981. goto error_exit;
  982. }
  983. state = mhi_get_mhi_state(mhi_cntrl);
  984. dev_dbg(dev, "Attempting power on with EE: %s, state: %s\n",
  985. TO_MHI_EXEC_STR(current_ee), mhi_state_str(state));
  986. if (state == MHI_STATE_SYS_ERR) {
  987. mhi_set_mhi_state(mhi_cntrl, MHI_STATE_RESET);
  988. ret = mhi_poll_reg_field(mhi_cntrl, mhi_cntrl->regs, MHICTRL,
  989. MHICTRL_RESET_MASK, 0, interval_us,
  990. mhi_cntrl->timeout_ms);
  991. if (ret) {
  992. dev_info(dev, "Failed to reset MHI due to syserr state\n");
  993. goto error_exit;
  994. }
  995. /*
  996. * device cleares INTVEC as part of RESET processing,
  997. * re-program it
  998. */
  999. mhi_write_reg(mhi_cntrl, mhi_cntrl->bhi, BHI_INTVEC, 0);
  1000. }
  1001. /* IRQs have been requested during probe, so we just need to enable them. */
  1002. enable_irq(mhi_cntrl->irq[0]);
  1003. for (i = 0; i < mhi_cntrl->total_ev_rings; i++, mhi_event++) {
  1004. if (mhi_event->offload_ev)
  1005. continue;
  1006. enable_irq(mhi_cntrl->irq[mhi_event->irq]);
  1007. }
  1008. /* Transition to next state */
  1009. next_state = MHI_IN_PBL(current_ee) ?
  1010. DEV_ST_TRANSITION_PBL : DEV_ST_TRANSITION_READY;
  1011. mhi_queue_state_transition(mhi_cntrl, next_state);
  1012. mutex_unlock(&mhi_cntrl->pm_mutex);
  1013. dev_info(dev, "Power on setup success\n");
  1014. return 0;
  1015. error_exit:
  1016. mhi_cntrl->pm_state = MHI_PM_DISABLE;
  1017. mutex_unlock(&mhi_cntrl->pm_mutex);
  1018. return ret;
  1019. }
  1020. EXPORT_SYMBOL_GPL(mhi_async_power_up);
  1021. static void __mhi_power_down(struct mhi_controller *mhi_cntrl, bool graceful,
  1022. bool destroy_device)
  1023. {
  1024. enum mhi_pm_state cur_state, transition_state;
  1025. struct device *dev = &mhi_cntrl->mhi_dev->dev;
  1026. mutex_lock(&mhi_cntrl->pm_mutex);
  1027. write_lock_irq(&mhi_cntrl->pm_lock);
  1028. cur_state = mhi_cntrl->pm_state;
  1029. if (cur_state == MHI_PM_DISABLE) {
  1030. write_unlock_irq(&mhi_cntrl->pm_lock);
  1031. mutex_unlock(&mhi_cntrl->pm_mutex);
  1032. return; /* Already powered down */
  1033. }
  1034. /* If it's not a graceful shutdown, force MHI to linkdown state */
  1035. transition_state = (graceful) ? MHI_PM_SHUTDOWN_PROCESS :
  1036. MHI_PM_LD_ERR_FATAL_DETECT;
  1037. cur_state = mhi_tryset_pm_state(mhi_cntrl, transition_state);
  1038. if (cur_state != transition_state) {
  1039. dev_err(dev, "Failed to move to state: %s from: %s\n",
  1040. to_mhi_pm_state_str(transition_state),
  1041. to_mhi_pm_state_str(mhi_cntrl->pm_state));
  1042. /* Force link down or error fatal detected state */
  1043. mhi_cntrl->pm_state = MHI_PM_LD_ERR_FATAL_DETECT;
  1044. }
  1045. /* mark device inactive to avoid any further host processing */
  1046. mhi_cntrl->ee = MHI_EE_DISABLE_TRANSITION;
  1047. mhi_cntrl->dev_state = MHI_STATE_RESET;
  1048. wake_up_all(&mhi_cntrl->state_event);
  1049. write_unlock_irq(&mhi_cntrl->pm_lock);
  1050. mutex_unlock(&mhi_cntrl->pm_mutex);
  1051. mhi_uevent_notify(mhi_cntrl, mhi_cntrl->ee);
  1052. if (destroy_device)
  1053. mhi_queue_state_transition(mhi_cntrl,
  1054. DEV_ST_TRANSITION_DISABLE_DESTROY_DEVICE);
  1055. else
  1056. mhi_queue_state_transition(mhi_cntrl,
  1057. DEV_ST_TRANSITION_DISABLE);
  1058. /* Wait for shutdown to complete */
  1059. flush_work(&mhi_cntrl->st_worker);
  1060. disable_irq(mhi_cntrl->irq[0]);
  1061. }
  1062. void mhi_power_down(struct mhi_controller *mhi_cntrl, bool graceful)
  1063. {
  1064. __mhi_power_down(mhi_cntrl, graceful, true);
  1065. }
  1066. EXPORT_SYMBOL_GPL(mhi_power_down);
  1067. void mhi_power_down_keep_dev(struct mhi_controller *mhi_cntrl,
  1068. bool graceful)
  1069. {
  1070. __mhi_power_down(mhi_cntrl, graceful, false);
  1071. }
  1072. EXPORT_SYMBOL_GPL(mhi_power_down_keep_dev);
  1073. int mhi_sync_power_up(struct mhi_controller *mhi_cntrl)
  1074. {
  1075. int ret = mhi_async_power_up(mhi_cntrl);
  1076. u32 timeout_ms;
  1077. if (ret)
  1078. return ret;
  1079. /* Some devices need more time to set ready during power up */
  1080. timeout_ms = mhi_cntrl->ready_timeout_ms ?
  1081. mhi_cntrl->ready_timeout_ms : mhi_cntrl->timeout_ms;
  1082. wait_event_timeout(mhi_cntrl->state_event,
  1083. MHI_IN_MISSION_MODE(mhi_cntrl->ee) ||
  1084. MHI_PM_FATAL_ERROR(mhi_cntrl->pm_state),
  1085. msecs_to_jiffies(timeout_ms));
  1086. ret = (MHI_IN_MISSION_MODE(mhi_cntrl->ee)) ? 0 : -ETIMEDOUT;
  1087. if (ret)
  1088. mhi_power_down(mhi_cntrl, false);
  1089. return ret;
  1090. }
  1091. EXPORT_SYMBOL(mhi_sync_power_up);
  1092. int mhi_force_rddm_mode(struct mhi_controller *mhi_cntrl)
  1093. {
  1094. struct device *dev = &mhi_cntrl->mhi_dev->dev;
  1095. int ret;
  1096. /* Check if device is already in RDDM */
  1097. if (mhi_cntrl->ee == MHI_EE_RDDM)
  1098. return 0;
  1099. dev_dbg(dev, "Triggering SYS_ERR to force RDDM state\n");
  1100. mhi_set_mhi_state(mhi_cntrl, MHI_STATE_SYS_ERR);
  1101. /* Wait for RDDM event */
  1102. ret = wait_event_timeout(mhi_cntrl->state_event,
  1103. mhi_cntrl->ee == MHI_EE_RDDM,
  1104. msecs_to_jiffies(mhi_cntrl->timeout_ms));
  1105. ret = ret ? 0 : -EIO;
  1106. return ret;
  1107. }
  1108. EXPORT_SYMBOL_GPL(mhi_force_rddm_mode);
  1109. int mhi_device_get_sync(struct mhi_device *mhi_dev)
  1110. {
  1111. struct mhi_controller *mhi_cntrl = mhi_dev->mhi_cntrl;
  1112. int ret;
  1113. ret = __mhi_device_get_sync(mhi_cntrl);
  1114. if (!ret)
  1115. mhi_dev->dev_wake++;
  1116. return ret;
  1117. }
  1118. EXPORT_SYMBOL_GPL(mhi_device_get_sync);
  1119. void mhi_device_put(struct mhi_device *mhi_dev)
  1120. {
  1121. struct mhi_controller *mhi_cntrl = mhi_dev->mhi_cntrl;
  1122. mhi_dev->dev_wake--;
  1123. read_lock_bh(&mhi_cntrl->pm_lock);
  1124. if (MHI_PM_IN_SUSPEND_STATE(mhi_cntrl->pm_state))
  1125. mhi_trigger_resume(mhi_cntrl);
  1126. mhi_cntrl->wake_put(mhi_cntrl, false);
  1127. read_unlock_bh(&mhi_cntrl->pm_lock);
  1128. }
  1129. EXPORT_SYMBOL_GPL(mhi_device_put);
  1130. void mhi_uevent_notify(struct mhi_controller *mhi_cntrl, enum mhi_ee_type ee)
  1131. {
  1132. struct device *dev = &mhi_cntrl->mhi_dev->dev;
  1133. char *buf[2];
  1134. int ret;
  1135. buf[0] = kasprintf(GFP_KERNEL, "EXEC_ENV=%s", TO_MHI_EXEC_STR(ee));
  1136. buf[1] = NULL;
  1137. if (!buf[0])
  1138. return;
  1139. ret = kobject_uevent_env(&dev->kobj, KOBJ_CHANGE, buf);
  1140. if (ret)
  1141. dev_err(dev, "Failed to send %s uevent\n", TO_MHI_EXEC_STR(ee));
  1142. kfree(buf[0]);
  1143. }