imx_dsp_rproc.c 34 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /* Copyright 2021 NXP */
  3. #include <dt-bindings/firmware/imx/rsrc.h>
  4. #include <linux/arm-smccc.h>
  5. #include <linux/clk.h>
  6. #include <linux/err.h>
  7. #include <linux/firmware.h>
  8. #include <linux/firmware/imx/sci.h>
  9. #include <linux/interrupt.h>
  10. #include <linux/kernel.h>
  11. #include <linux/mailbox_client.h>
  12. #include <linux/mfd/syscon.h>
  13. #include <linux/module.h>
  14. #include <linux/of_address.h>
  15. #include <linux/of_device.h>
  16. #include <linux/of_reserved_mem.h>
  17. #include <linux/platform_device.h>
  18. #include <linux/pm_domain.h>
  19. #include <linux/pm_runtime.h>
  20. #include <linux/regmap.h>
  21. #include <linux/remoteproc.h>
  22. #include <linux/slab.h>
  23. #include "imx_rproc.h"
  24. #include "remoteproc_elf_helpers.h"
  25. #include "remoteproc_internal.h"
  26. #define DSP_RPROC_CLK_MAX 5
  27. #define REMOTE_IS_READY BIT(0)
  28. #define REMOTE_READY_WAIT_MAX_RETRIES 500
  29. /* att flags */
  30. /* DSP own area */
  31. #define ATT_OWN BIT(31)
  32. /* DSP instruction area */
  33. #define ATT_IRAM BIT(30)
  34. /* Definitions for i.MX8MP */
  35. /* DAP registers */
  36. #define IMX8M_DAP_DEBUG 0x28800000
  37. #define IMX8M_DAP_DEBUG_SIZE (64 * 1024)
  38. #define IMX8M_DAP_PWRCTL (0x4000 + 0x3020)
  39. #define IMX8M_PWRCTL_CORERESET BIT(16)
  40. /* DSP audio mix registers */
  41. #define IMX8M_AudioDSP_REG0 0x100
  42. #define IMX8M_AudioDSP_REG1 0x104
  43. #define IMX8M_AudioDSP_REG2 0x108
  44. #define IMX8M_AudioDSP_REG3 0x10c
  45. #define IMX8M_AudioDSP_REG2_RUNSTALL BIT(5)
  46. #define IMX8M_AudioDSP_REG2_PWAITMODE BIT(1)
  47. /* Definitions for i.MX8ULP */
  48. #define IMX8ULP_SIM_LPAV_REG_SYSCTRL0 0x8
  49. #define IMX8ULP_SYSCTRL0_DSP_DBG_RST BIT(25)
  50. #define IMX8ULP_SYSCTRL0_DSP_PLAT_CLK_EN BIT(19)
  51. #define IMX8ULP_SYSCTRL0_DSP_PBCLK_EN BIT(18)
  52. #define IMX8ULP_SYSCTRL0_DSP_CLK_EN BIT(17)
  53. #define IMX8ULP_SYSCTRL0_DSP_RST BIT(16)
  54. #define IMX8ULP_SYSCTRL0_DSP_OCD_HALT BIT(14)
  55. #define IMX8ULP_SYSCTRL0_DSP_STALL BIT(13)
  56. #define IMX8ULP_SIP_HIFI_XRDC 0xc200000e
  57. /*
  58. * enum - Predefined Mailbox Messages
  59. *
  60. * @RP_MBOX_SUSPEND_SYSTEM: system suspend request for the remote processor
  61. *
  62. * @RP_MBOX_SUSPEND_ACK: successful response from remote processor for a
  63. * suspend request
  64. *
  65. * @RP_MBOX_RESUME_SYSTEM: system resume request for the remote processor
  66. *
  67. * @RP_MBOX_RESUME_ACK: successful response from remote processor for a
  68. * resume request
  69. */
  70. enum imx_dsp_rp_mbox_messages {
  71. RP_MBOX_SUSPEND_SYSTEM = 0xFF11,
  72. RP_MBOX_SUSPEND_ACK = 0xFF12,
  73. RP_MBOX_RESUME_SYSTEM = 0xFF13,
  74. RP_MBOX_RESUME_ACK = 0xFF14,
  75. };
  76. /**
  77. * struct imx_dsp_rproc - DSP remote processor state
  78. * @regmap: regmap handler
  79. * @rproc: rproc handler
  80. * @dsp_dcfg: device configuration pointer
  81. * @clks: clocks needed by this device
  82. * @cl: mailbox client to request the mailbox channel
  83. * @cl_rxdb: mailbox client to request the mailbox channel for doorbell
  84. * @tx_ch: mailbox tx channel handle
  85. * @rx_ch: mailbox rx channel handle
  86. * @rxdb_ch: mailbox rx doorbell channel handle
  87. * @pd_dev: power domain device
  88. * @pd_dev_link: power domain device link
  89. * @ipc_handle: System Control Unit ipc handle
  90. * @rproc_work: work for processing virtio interrupts
  91. * @pm_comp: completion primitive to sync for suspend response
  92. * @num_domains: power domain number
  93. * @flags: control flags
  94. */
  95. struct imx_dsp_rproc {
  96. struct regmap *regmap;
  97. struct rproc *rproc;
  98. const struct imx_dsp_rproc_dcfg *dsp_dcfg;
  99. struct clk_bulk_data clks[DSP_RPROC_CLK_MAX];
  100. struct mbox_client cl;
  101. struct mbox_client cl_rxdb;
  102. struct mbox_chan *tx_ch;
  103. struct mbox_chan *rx_ch;
  104. struct mbox_chan *rxdb_ch;
  105. struct device **pd_dev;
  106. struct device_link **pd_dev_link;
  107. struct imx_sc_ipc *ipc_handle;
  108. struct work_struct rproc_work;
  109. struct completion pm_comp;
  110. int num_domains;
  111. u32 flags;
  112. };
  113. /**
  114. * struct imx_dsp_rproc_dcfg - DSP remote processor configuration
  115. * @dcfg: imx_rproc_dcfg handler
  116. * @reset: reset callback function
  117. */
  118. struct imx_dsp_rproc_dcfg {
  119. const struct imx_rproc_dcfg *dcfg;
  120. int (*reset)(struct imx_dsp_rproc *priv);
  121. };
  122. static const struct imx_rproc_att imx_dsp_rproc_att_imx8qm[] = {
  123. /* dev addr , sys addr , size , flags */
  124. { 0x596e8000, 0x556e8000, 0x00008000, ATT_OWN },
  125. { 0x596f0000, 0x556f0000, 0x00008000, ATT_OWN },
  126. { 0x596f8000, 0x556f8000, 0x00000800, ATT_OWN | ATT_IRAM},
  127. { 0x55700000, 0x55700000, 0x00070000, ATT_OWN },
  128. /* DDR (Data) */
  129. { 0x80000000, 0x80000000, 0x60000000, 0},
  130. };
  131. static const struct imx_rproc_att imx_dsp_rproc_att_imx8qxp[] = {
  132. /* dev addr , sys addr , size , flags */
  133. { 0x596e8000, 0x596e8000, 0x00008000, ATT_OWN },
  134. { 0x596f0000, 0x596f0000, 0x00008000, ATT_OWN },
  135. { 0x596f8000, 0x596f8000, 0x00000800, ATT_OWN | ATT_IRAM},
  136. { 0x59700000, 0x59700000, 0x00070000, ATT_OWN },
  137. /* DDR (Data) */
  138. { 0x80000000, 0x80000000, 0x60000000, 0},
  139. };
  140. static const struct imx_rproc_att imx_dsp_rproc_att_imx8mp[] = {
  141. /* dev addr , sys addr , size , flags */
  142. { 0x3b6e8000, 0x3b6e8000, 0x00008000, ATT_OWN },
  143. { 0x3b6f0000, 0x3b6f0000, 0x00008000, ATT_OWN },
  144. { 0x3b6f8000, 0x3b6f8000, 0x00000800, ATT_OWN | ATT_IRAM},
  145. { 0x3b700000, 0x3b700000, 0x00040000, ATT_OWN },
  146. /* DDR (Data) */
  147. { 0x40000000, 0x40000000, 0x80000000, 0},
  148. };
  149. static const struct imx_rproc_att imx_dsp_rproc_att_imx8ulp[] = {
  150. /* dev addr , sys addr , size , flags */
  151. { 0x21170000, 0x21170000, 0x00010000, ATT_OWN | ATT_IRAM},
  152. { 0x21180000, 0x21180000, 0x00010000, ATT_OWN },
  153. /* DDR (Data) */
  154. { 0x0c000000, 0x80000000, 0x10000000, 0},
  155. { 0x30000000, 0x90000000, 0x10000000, 0},
  156. };
  157. /* Reset function for DSP on i.MX8MP */
  158. static int imx8mp_dsp_reset(struct imx_dsp_rproc *priv)
  159. {
  160. void __iomem *dap = ioremap_wc(IMX8M_DAP_DEBUG, IMX8M_DAP_DEBUG_SIZE);
  161. int pwrctl;
  162. /* Put DSP into reset and stall */
  163. pwrctl = readl(dap + IMX8M_DAP_PWRCTL);
  164. pwrctl |= IMX8M_PWRCTL_CORERESET;
  165. writel(pwrctl, dap + IMX8M_DAP_PWRCTL);
  166. /* Keep reset asserted for 10 cycles */
  167. usleep_range(1, 2);
  168. regmap_update_bits(priv->regmap, IMX8M_AudioDSP_REG2,
  169. IMX8M_AudioDSP_REG2_RUNSTALL,
  170. IMX8M_AudioDSP_REG2_RUNSTALL);
  171. /* Take the DSP out of reset and keep stalled for FW loading */
  172. pwrctl = readl(dap + IMX8M_DAP_PWRCTL);
  173. pwrctl &= ~IMX8M_PWRCTL_CORERESET;
  174. writel(pwrctl, dap + IMX8M_DAP_PWRCTL);
  175. iounmap(dap);
  176. return 0;
  177. }
  178. /* Reset function for DSP on i.MX8ULP */
  179. static int imx8ulp_dsp_reset(struct imx_dsp_rproc *priv)
  180. {
  181. struct arm_smccc_res res;
  182. /* Put DSP into reset and stall */
  183. regmap_update_bits(priv->regmap, IMX8ULP_SIM_LPAV_REG_SYSCTRL0,
  184. IMX8ULP_SYSCTRL0_DSP_RST, IMX8ULP_SYSCTRL0_DSP_RST);
  185. regmap_update_bits(priv->regmap, IMX8ULP_SIM_LPAV_REG_SYSCTRL0,
  186. IMX8ULP_SYSCTRL0_DSP_STALL,
  187. IMX8ULP_SYSCTRL0_DSP_STALL);
  188. /* Configure resources of DSP through TFA */
  189. arm_smccc_smc(IMX8ULP_SIP_HIFI_XRDC, 0, 0, 0, 0, 0, 0, 0, &res);
  190. /* Take the DSP out of reset and keep stalled for FW loading */
  191. regmap_update_bits(priv->regmap, IMX8ULP_SIM_LPAV_REG_SYSCTRL0,
  192. IMX8ULP_SYSCTRL0_DSP_RST, 0);
  193. regmap_update_bits(priv->regmap, IMX8ULP_SIM_LPAV_REG_SYSCTRL0,
  194. IMX8ULP_SYSCTRL0_DSP_DBG_RST, 0);
  195. return 0;
  196. }
  197. /* Specific configuration for i.MX8MP */
  198. static const struct imx_rproc_dcfg dsp_rproc_cfg_imx8mp = {
  199. .src_reg = IMX8M_AudioDSP_REG2,
  200. .src_mask = IMX8M_AudioDSP_REG2_RUNSTALL,
  201. .src_start = 0,
  202. .src_stop = IMX8M_AudioDSP_REG2_RUNSTALL,
  203. .att = imx_dsp_rproc_att_imx8mp,
  204. .att_size = ARRAY_SIZE(imx_dsp_rproc_att_imx8mp),
  205. .method = IMX_RPROC_MMIO,
  206. };
  207. static const struct imx_dsp_rproc_dcfg imx_dsp_rproc_cfg_imx8mp = {
  208. .dcfg = &dsp_rproc_cfg_imx8mp,
  209. .reset = imx8mp_dsp_reset,
  210. };
  211. /* Specific configuration for i.MX8ULP */
  212. static const struct imx_rproc_dcfg dsp_rproc_cfg_imx8ulp = {
  213. .src_reg = IMX8ULP_SIM_LPAV_REG_SYSCTRL0,
  214. .src_mask = IMX8ULP_SYSCTRL0_DSP_STALL,
  215. .src_start = 0,
  216. .src_stop = IMX8ULP_SYSCTRL0_DSP_STALL,
  217. .att = imx_dsp_rproc_att_imx8ulp,
  218. .att_size = ARRAY_SIZE(imx_dsp_rproc_att_imx8ulp),
  219. .method = IMX_RPROC_MMIO,
  220. };
  221. static const struct imx_dsp_rproc_dcfg imx_dsp_rproc_cfg_imx8ulp = {
  222. .dcfg = &dsp_rproc_cfg_imx8ulp,
  223. .reset = imx8ulp_dsp_reset,
  224. };
  225. /* Specific configuration for i.MX8QXP */
  226. static const struct imx_rproc_dcfg dsp_rproc_cfg_imx8qxp = {
  227. .att = imx_dsp_rproc_att_imx8qxp,
  228. .att_size = ARRAY_SIZE(imx_dsp_rproc_att_imx8qxp),
  229. .method = IMX_RPROC_SCU_API,
  230. };
  231. static const struct imx_dsp_rproc_dcfg imx_dsp_rproc_cfg_imx8qxp = {
  232. .dcfg = &dsp_rproc_cfg_imx8qxp,
  233. };
  234. /* Specific configuration for i.MX8QM */
  235. static const struct imx_rproc_dcfg dsp_rproc_cfg_imx8qm = {
  236. .att = imx_dsp_rproc_att_imx8qm,
  237. .att_size = ARRAY_SIZE(imx_dsp_rproc_att_imx8qm),
  238. .method = IMX_RPROC_SCU_API,
  239. };
  240. static const struct imx_dsp_rproc_dcfg imx_dsp_rproc_cfg_imx8qm = {
  241. .dcfg = &dsp_rproc_cfg_imx8qm,
  242. };
  243. static int imx_dsp_rproc_ready(struct rproc *rproc)
  244. {
  245. struct imx_dsp_rproc *priv = rproc->priv;
  246. int i;
  247. if (!priv->rxdb_ch)
  248. return 0;
  249. for (i = 0; i < REMOTE_READY_WAIT_MAX_RETRIES; i++) {
  250. if (priv->flags & REMOTE_IS_READY)
  251. return 0;
  252. usleep_range(100, 200);
  253. }
  254. return -ETIMEDOUT;
  255. }
  256. /*
  257. * Start function for rproc_ops
  258. *
  259. * There is a handshake for start procedure: when DSP starts, it
  260. * will send a doorbell message to this driver, then the
  261. * REMOTE_IS_READY flags is set, then driver will kick
  262. * a message to DSP.
  263. */
  264. static int imx_dsp_rproc_start(struct rproc *rproc)
  265. {
  266. struct imx_dsp_rproc *priv = rproc->priv;
  267. const struct imx_dsp_rproc_dcfg *dsp_dcfg = priv->dsp_dcfg;
  268. const struct imx_rproc_dcfg *dcfg = dsp_dcfg->dcfg;
  269. struct device *dev = rproc->dev.parent;
  270. int ret;
  271. switch (dcfg->method) {
  272. case IMX_RPROC_MMIO:
  273. ret = regmap_update_bits(priv->regmap,
  274. dcfg->src_reg,
  275. dcfg->src_mask,
  276. dcfg->src_start);
  277. break;
  278. case IMX_RPROC_SCU_API:
  279. ret = imx_sc_pm_cpu_start(priv->ipc_handle,
  280. IMX_SC_R_DSP,
  281. true,
  282. rproc->bootaddr);
  283. break;
  284. default:
  285. return -EOPNOTSUPP;
  286. }
  287. if (ret)
  288. dev_err(dev, "Failed to enable remote core!\n");
  289. else
  290. ret = imx_dsp_rproc_ready(rproc);
  291. return ret;
  292. }
  293. /*
  294. * Stop function for rproc_ops
  295. * It clears the REMOTE_IS_READY flags
  296. */
  297. static int imx_dsp_rproc_stop(struct rproc *rproc)
  298. {
  299. struct imx_dsp_rproc *priv = rproc->priv;
  300. const struct imx_dsp_rproc_dcfg *dsp_dcfg = priv->dsp_dcfg;
  301. const struct imx_rproc_dcfg *dcfg = dsp_dcfg->dcfg;
  302. struct device *dev = rproc->dev.parent;
  303. int ret = 0;
  304. if (rproc->state == RPROC_CRASHED) {
  305. priv->flags &= ~REMOTE_IS_READY;
  306. return 0;
  307. }
  308. switch (dcfg->method) {
  309. case IMX_RPROC_MMIO:
  310. ret = regmap_update_bits(priv->regmap, dcfg->src_reg, dcfg->src_mask,
  311. dcfg->src_stop);
  312. break;
  313. case IMX_RPROC_SCU_API:
  314. ret = imx_sc_pm_cpu_start(priv->ipc_handle,
  315. IMX_SC_R_DSP,
  316. false,
  317. rproc->bootaddr);
  318. break;
  319. default:
  320. return -EOPNOTSUPP;
  321. }
  322. if (ret)
  323. dev_err(dev, "Failed to stop remote core\n");
  324. else
  325. priv->flags &= ~REMOTE_IS_READY;
  326. return ret;
  327. }
  328. /**
  329. * imx_dsp_rproc_sys_to_da() - internal memory translation helper
  330. * @priv: private data pointer
  331. * @sys: system address (DDR address)
  332. * @len: length of the memory buffer
  333. * @da: device address to translate
  334. *
  335. * Convert system address (DDR address) to device address (DSP)
  336. * for there may be memory remap for device.
  337. */
  338. static int imx_dsp_rproc_sys_to_da(struct imx_dsp_rproc *priv, u64 sys,
  339. size_t len, u64 *da)
  340. {
  341. const struct imx_dsp_rproc_dcfg *dsp_dcfg = priv->dsp_dcfg;
  342. const struct imx_rproc_dcfg *dcfg = dsp_dcfg->dcfg;
  343. int i;
  344. /* Parse address translation table */
  345. for (i = 0; i < dcfg->att_size; i++) {
  346. const struct imx_rproc_att *att = &dcfg->att[i];
  347. if (sys >= att->sa && sys + len <= att->sa + att->size) {
  348. unsigned int offset = sys - att->sa;
  349. *da = att->da + offset;
  350. return 0;
  351. }
  352. }
  353. return -ENOENT;
  354. }
  355. /* Main virtqueue message work function
  356. *
  357. * This function is executed upon scheduling of the i.MX DSP remoteproc
  358. * driver's workqueue. The workqueue is scheduled by the mailbox rx
  359. * handler.
  360. *
  361. * This work function processes both the Tx and Rx virtqueue indices on
  362. * every invocation. The rproc_vq_interrupt function can detect if there
  363. * are new unprocessed messages or not (returns IRQ_NONE vs IRQ_HANDLED),
  364. * but there is no need to check for these return values. The index 0
  365. * triggering will process all pending Rx buffers, and the index 1 triggering
  366. * will process all newly available Tx buffers and will wakeup any potentially
  367. * blocked senders.
  368. *
  369. * NOTE:
  370. * The current logic is based on an inherent design assumption of supporting
  371. * only 2 vrings, but this can be changed if needed.
  372. */
  373. static void imx_dsp_rproc_vq_work(struct work_struct *work)
  374. {
  375. struct imx_dsp_rproc *priv = container_of(work, struct imx_dsp_rproc,
  376. rproc_work);
  377. struct rproc *rproc = priv->rproc;
  378. mutex_lock(&rproc->lock);
  379. if (rproc->state != RPROC_RUNNING)
  380. goto unlock_mutex;
  381. rproc_vq_interrupt(priv->rproc, 0);
  382. rproc_vq_interrupt(priv->rproc, 1);
  383. unlock_mutex:
  384. mutex_unlock(&rproc->lock);
  385. }
  386. /**
  387. * imx_dsp_rproc_rx_tx_callback() - inbound mailbox message handler
  388. * @cl: mailbox client pointer used for requesting the mailbox channel
  389. * @data: mailbox payload
  390. *
  391. * This handler is invoked by mailbox driver whenever a mailbox
  392. * message is received. Usually, the SUSPEND and RESUME related messages
  393. * are handled in this function, other messages are handled by remoteproc core
  394. */
  395. static void imx_dsp_rproc_rx_tx_callback(struct mbox_client *cl, void *data)
  396. {
  397. struct rproc *rproc = dev_get_drvdata(cl->dev);
  398. struct imx_dsp_rproc *priv = rproc->priv;
  399. struct device *dev = rproc->dev.parent;
  400. u32 message = (u32)(*(u32 *)data);
  401. dev_dbg(dev, "mbox msg: 0x%x\n", message);
  402. switch (message) {
  403. case RP_MBOX_SUSPEND_ACK:
  404. complete(&priv->pm_comp);
  405. break;
  406. case RP_MBOX_RESUME_ACK:
  407. complete(&priv->pm_comp);
  408. break;
  409. default:
  410. schedule_work(&priv->rproc_work);
  411. break;
  412. }
  413. }
  414. /**
  415. * imx_dsp_rproc_rxdb_callback() - inbound mailbox message handler
  416. * @cl: mailbox client pointer used for requesting the mailbox channel
  417. * @data: mailbox payload
  418. *
  419. * For doorbell, there is no message specified, just set REMOTE_IS_READY
  420. * flag.
  421. */
  422. static void imx_dsp_rproc_rxdb_callback(struct mbox_client *cl, void *data)
  423. {
  424. struct rproc *rproc = dev_get_drvdata(cl->dev);
  425. struct imx_dsp_rproc *priv = rproc->priv;
  426. /* Remote is ready after firmware is loaded and running */
  427. priv->flags |= REMOTE_IS_READY;
  428. }
  429. /**
  430. * imx_dsp_rproc_mbox_init() - request mailbox channels
  431. * @priv: private data pointer
  432. *
  433. * Request three mailbox channels (tx, rx, rxdb).
  434. */
  435. static int imx_dsp_rproc_mbox_init(struct imx_dsp_rproc *priv)
  436. {
  437. struct device *dev = priv->rproc->dev.parent;
  438. struct mbox_client *cl;
  439. int ret;
  440. if (!of_get_property(dev->of_node, "mbox-names", NULL))
  441. return 0;
  442. cl = &priv->cl;
  443. cl->dev = dev;
  444. cl->tx_block = true;
  445. cl->tx_tout = 100;
  446. cl->knows_txdone = false;
  447. cl->rx_callback = imx_dsp_rproc_rx_tx_callback;
  448. /* Channel for sending message */
  449. priv->tx_ch = mbox_request_channel_byname(cl, "tx");
  450. if (IS_ERR(priv->tx_ch)) {
  451. ret = PTR_ERR(priv->tx_ch);
  452. dev_dbg(cl->dev, "failed to request tx mailbox channel: %d\n",
  453. ret);
  454. goto err_out;
  455. }
  456. /* Channel for receiving message */
  457. priv->rx_ch = mbox_request_channel_byname(cl, "rx");
  458. if (IS_ERR(priv->rx_ch)) {
  459. ret = PTR_ERR(priv->rx_ch);
  460. dev_dbg(cl->dev, "failed to request rx mailbox channel: %d\n",
  461. ret);
  462. goto err_out;
  463. }
  464. cl = &priv->cl_rxdb;
  465. cl->dev = dev;
  466. cl->rx_callback = imx_dsp_rproc_rxdb_callback;
  467. /*
  468. * RX door bell is used to receive the ready signal from remote
  469. * after firmware loaded.
  470. */
  471. priv->rxdb_ch = mbox_request_channel_byname(cl, "rxdb");
  472. if (IS_ERR(priv->rxdb_ch)) {
  473. ret = PTR_ERR(priv->rxdb_ch);
  474. dev_dbg(cl->dev, "failed to request mbox chan rxdb, ret %d\n",
  475. ret);
  476. goto err_out;
  477. }
  478. return 0;
  479. err_out:
  480. if (!IS_ERR(priv->tx_ch))
  481. mbox_free_channel(priv->tx_ch);
  482. if (!IS_ERR(priv->rx_ch))
  483. mbox_free_channel(priv->rx_ch);
  484. if (!IS_ERR(priv->rxdb_ch))
  485. mbox_free_channel(priv->rxdb_ch);
  486. return ret;
  487. }
  488. static void imx_dsp_rproc_free_mbox(struct imx_dsp_rproc *priv)
  489. {
  490. mbox_free_channel(priv->tx_ch);
  491. mbox_free_channel(priv->rx_ch);
  492. mbox_free_channel(priv->rxdb_ch);
  493. }
  494. /**
  495. * imx_dsp_rproc_add_carveout() - request mailbox channels
  496. * @priv: private data pointer
  497. *
  498. * This function registers specified memory entry in @rproc carveouts list
  499. * The carveouts can help to mapping the memory address for DSP.
  500. */
  501. static int imx_dsp_rproc_add_carveout(struct imx_dsp_rproc *priv)
  502. {
  503. const struct imx_dsp_rproc_dcfg *dsp_dcfg = priv->dsp_dcfg;
  504. const struct imx_rproc_dcfg *dcfg = dsp_dcfg->dcfg;
  505. struct rproc *rproc = priv->rproc;
  506. struct device *dev = rproc->dev.parent;
  507. struct device_node *np = dev->of_node;
  508. struct of_phandle_iterator it;
  509. struct rproc_mem_entry *mem;
  510. struct reserved_mem *rmem;
  511. void __iomem *cpu_addr;
  512. int a;
  513. u64 da;
  514. /* Remap required addresses */
  515. for (a = 0; a < dcfg->att_size; a++) {
  516. const struct imx_rproc_att *att = &dcfg->att[a];
  517. if (!(att->flags & ATT_OWN))
  518. continue;
  519. if (imx_dsp_rproc_sys_to_da(priv, att->sa, att->size, &da))
  520. return -EINVAL;
  521. cpu_addr = devm_ioremap_wc(dev, att->sa, att->size);
  522. if (!cpu_addr) {
  523. dev_err(dev, "failed to map memory %p\n", &att->sa);
  524. return -ENOMEM;
  525. }
  526. /* Register memory region */
  527. mem = rproc_mem_entry_init(dev, (void __force *)cpu_addr, (dma_addr_t)att->sa,
  528. att->size, da, NULL, NULL, "dsp_mem");
  529. if (mem)
  530. rproc_coredump_add_segment(rproc, da, att->size);
  531. else
  532. return -ENOMEM;
  533. rproc_add_carveout(rproc, mem);
  534. }
  535. of_phandle_iterator_init(&it, np, "memory-region", NULL, 0);
  536. while (of_phandle_iterator_next(&it) == 0) {
  537. /*
  538. * Ignore the first memory region which will be used vdev buffer.
  539. * No need to do extra handlings, rproc_add_virtio_dev will handle it.
  540. */
  541. if (!strcmp(it.node->name, "vdev0buffer"))
  542. continue;
  543. rmem = of_reserved_mem_lookup(it.node);
  544. if (!rmem) {
  545. of_node_put(it.node);
  546. dev_err(dev, "unable to acquire memory-region\n");
  547. return -EINVAL;
  548. }
  549. if (imx_dsp_rproc_sys_to_da(priv, rmem->base, rmem->size, &da)) {
  550. of_node_put(it.node);
  551. return -EINVAL;
  552. }
  553. cpu_addr = devm_ioremap_wc(dev, rmem->base, rmem->size);
  554. if (!cpu_addr) {
  555. of_node_put(it.node);
  556. dev_err(dev, "failed to map memory %p\n", &rmem->base);
  557. return -ENOMEM;
  558. }
  559. /* Register memory region */
  560. mem = rproc_mem_entry_init(dev, (void __force *)cpu_addr, (dma_addr_t)rmem->base,
  561. rmem->size, da, NULL, NULL, it.node->name);
  562. if (mem) {
  563. rproc_coredump_add_segment(rproc, da, rmem->size);
  564. } else {
  565. of_node_put(it.node);
  566. return -ENOMEM;
  567. }
  568. rproc_add_carveout(rproc, mem);
  569. }
  570. return 0;
  571. }
  572. /* Prepare function for rproc_ops */
  573. static int imx_dsp_rproc_prepare(struct rproc *rproc)
  574. {
  575. struct imx_dsp_rproc *priv = rproc->priv;
  576. struct device *dev = rproc->dev.parent;
  577. struct rproc_mem_entry *carveout;
  578. int ret;
  579. ret = imx_dsp_rproc_add_carveout(priv);
  580. if (ret) {
  581. dev_err(dev, "failed on imx_dsp_rproc_add_carveout\n");
  582. return ret;
  583. }
  584. pm_runtime_get_sync(dev);
  585. /*
  586. * Clear buffers after pm rumtime for internal ocram is not
  587. * accessible if power and clock are not enabled.
  588. */
  589. list_for_each_entry(carveout, &rproc->carveouts, node) {
  590. if (carveout->va)
  591. memset(carveout->va, 0, carveout->len);
  592. }
  593. return 0;
  594. }
  595. /* Unprepare function for rproc_ops */
  596. static int imx_dsp_rproc_unprepare(struct rproc *rproc)
  597. {
  598. pm_runtime_put_sync(rproc->dev.parent);
  599. return 0;
  600. }
  601. /* Kick function for rproc_ops */
  602. static void imx_dsp_rproc_kick(struct rproc *rproc, int vqid)
  603. {
  604. struct imx_dsp_rproc *priv = rproc->priv;
  605. struct device *dev = rproc->dev.parent;
  606. int err;
  607. __u32 mmsg;
  608. if (!priv->tx_ch) {
  609. dev_err(dev, "No initialized mbox tx channel\n");
  610. return;
  611. }
  612. /*
  613. * Send the index of the triggered virtqueue as the mu payload.
  614. * Let remote processor know which virtqueue is used.
  615. */
  616. mmsg = vqid;
  617. err = mbox_send_message(priv->tx_ch, (void *)&mmsg);
  618. if (err < 0)
  619. dev_err(dev, "%s: failed (%d, err:%d)\n", __func__, vqid, err);
  620. }
  621. /*
  622. * Custom memory copy implementation for i.MX DSP Cores
  623. *
  624. * The IRAM is part of the HiFi DSP.
  625. * According to hw specs only 32-bits writes are allowed.
  626. */
  627. static int imx_dsp_rproc_memcpy(void *dst, const void *src, size_t size)
  628. {
  629. void __iomem *dest = (void __iomem *)dst;
  630. const u8 *src_byte = src;
  631. const u32 *source = src;
  632. u32 affected_mask;
  633. int i, q, r;
  634. u32 tmp;
  635. /* destination must be 32bit aligned */
  636. if (!IS_ALIGNED((uintptr_t)dest, 4))
  637. return -EINVAL;
  638. q = size / 4;
  639. r = size % 4;
  640. /* copy data in units of 32 bits at a time */
  641. for (i = 0; i < q; i++)
  642. writel(source[i], dest + i * 4);
  643. if (r) {
  644. affected_mask = GENMASK(8 * r, 0);
  645. /*
  646. * first read the 32bit data of dest, then change affected
  647. * bytes, and write back to dest.
  648. * For unaffected bytes, it should not be changed
  649. */
  650. tmp = readl(dest + q * 4);
  651. tmp &= ~affected_mask;
  652. /* avoid reading after end of source */
  653. for (i = 0; i < r; i++)
  654. tmp |= (src_byte[q * 4 + i] << (8 * i));
  655. writel(tmp, dest + q * 4);
  656. }
  657. return 0;
  658. }
  659. /*
  660. * Custom memset implementation for i.MX DSP Cores
  661. *
  662. * The IRAM is part of the HiFi DSP.
  663. * According to hw specs only 32-bits writes are allowed.
  664. */
  665. static int imx_dsp_rproc_memset(void *addr, u8 value, size_t size)
  666. {
  667. void __iomem *tmp_dst = (void __iomem *)addr;
  668. u32 tmp_val = value;
  669. u32 affected_mask;
  670. int q, r;
  671. u32 tmp;
  672. /* destination must be 32bit aligned */
  673. if (!IS_ALIGNED((uintptr_t)addr, 4))
  674. return -EINVAL;
  675. tmp_val |= tmp_val << 8;
  676. tmp_val |= tmp_val << 16;
  677. q = size / 4;
  678. r = size % 4;
  679. while (q--)
  680. writel(tmp_val, tmp_dst++);
  681. if (r) {
  682. affected_mask = GENMASK(8 * r, 0);
  683. /*
  684. * first read the 32bit data of addr, then change affected
  685. * bytes, and write back to addr.
  686. * For unaffected bytes, it should not be changed
  687. */
  688. tmp = readl(tmp_dst);
  689. tmp &= ~affected_mask;
  690. tmp |= (tmp_val & affected_mask);
  691. writel(tmp, tmp_dst);
  692. }
  693. return 0;
  694. }
  695. /*
  696. * imx_dsp_rproc_elf_load_segments() - load firmware segments to memory
  697. * @rproc: remote processor which will be booted using these fw segments
  698. * @fw: the ELF firmware image
  699. *
  700. * This function loads the firmware segments to memory, where the remote
  701. * processor expects them.
  702. *
  703. * Return: 0 on success and an appropriate error code otherwise
  704. */
  705. static int imx_dsp_rproc_elf_load_segments(struct rproc *rproc, const struct firmware *fw)
  706. {
  707. struct device *dev = &rproc->dev;
  708. const void *ehdr, *phdr;
  709. int i, ret = 0;
  710. u16 phnum;
  711. const u8 *elf_data = fw->data;
  712. u8 class = fw_elf_get_class(fw);
  713. u32 elf_phdr_get_size = elf_size_of_phdr(class);
  714. ehdr = elf_data;
  715. phnum = elf_hdr_get_e_phnum(class, ehdr);
  716. phdr = elf_data + elf_hdr_get_e_phoff(class, ehdr);
  717. /* go through the available ELF segments */
  718. for (i = 0; i < phnum; i++, phdr += elf_phdr_get_size) {
  719. u64 da = elf_phdr_get_p_paddr(class, phdr);
  720. u64 memsz = elf_phdr_get_p_memsz(class, phdr);
  721. u64 filesz = elf_phdr_get_p_filesz(class, phdr);
  722. u64 offset = elf_phdr_get_p_offset(class, phdr);
  723. u32 type = elf_phdr_get_p_type(class, phdr);
  724. void *ptr;
  725. if (type != PT_LOAD || !memsz)
  726. continue;
  727. dev_dbg(dev, "phdr: type %d da 0x%llx memsz 0x%llx filesz 0x%llx\n",
  728. type, da, memsz, filesz);
  729. if (filesz > memsz) {
  730. dev_err(dev, "bad phdr filesz 0x%llx memsz 0x%llx\n",
  731. filesz, memsz);
  732. ret = -EINVAL;
  733. break;
  734. }
  735. if (offset + filesz > fw->size) {
  736. dev_err(dev, "truncated fw: need 0x%llx avail 0x%zx\n",
  737. offset + filesz, fw->size);
  738. ret = -EINVAL;
  739. break;
  740. }
  741. if (!rproc_u64_fit_in_size_t(memsz)) {
  742. dev_err(dev, "size (%llx) does not fit in size_t type\n",
  743. memsz);
  744. ret = -EOVERFLOW;
  745. break;
  746. }
  747. /* grab the kernel address for this device address */
  748. ptr = rproc_da_to_va(rproc, da, memsz, NULL);
  749. if (!ptr) {
  750. dev_err(dev, "bad phdr da 0x%llx mem 0x%llx\n", da,
  751. memsz);
  752. ret = -EINVAL;
  753. break;
  754. }
  755. /* put the segment where the remote processor expects it */
  756. if (filesz) {
  757. ret = imx_dsp_rproc_memcpy(ptr, elf_data + offset, filesz);
  758. if (ret) {
  759. dev_err(dev, "memory copy failed for da 0x%llx memsz 0x%llx\n",
  760. da, memsz);
  761. break;
  762. }
  763. }
  764. /* zero out remaining memory for this segment */
  765. if (memsz > filesz) {
  766. ret = imx_dsp_rproc_memset(ptr + filesz, 0, memsz - filesz);
  767. if (ret) {
  768. dev_err(dev, "memset failed for da 0x%llx memsz 0x%llx\n",
  769. da, memsz);
  770. break;
  771. }
  772. }
  773. }
  774. return ret;
  775. }
  776. static int imx_dsp_rproc_parse_fw(struct rproc *rproc, const struct firmware *fw)
  777. {
  778. if (rproc_elf_load_rsc_table(rproc, fw))
  779. dev_warn(&rproc->dev, "no resource table found for this firmware\n");
  780. return 0;
  781. }
  782. static const struct rproc_ops imx_dsp_rproc_ops = {
  783. .prepare = imx_dsp_rproc_prepare,
  784. .unprepare = imx_dsp_rproc_unprepare,
  785. .start = imx_dsp_rproc_start,
  786. .stop = imx_dsp_rproc_stop,
  787. .kick = imx_dsp_rproc_kick,
  788. .load = imx_dsp_rproc_elf_load_segments,
  789. .parse_fw = imx_dsp_rproc_parse_fw,
  790. .sanity_check = rproc_elf_sanity_check,
  791. .get_boot_addr = rproc_elf_get_boot_addr,
  792. };
  793. /**
  794. * imx_dsp_attach_pm_domains() - attach the power domains
  795. * @priv: private data pointer
  796. *
  797. * On i.MX8QM and i.MX8QXP there is multiple power domains
  798. * required, so need to link them.
  799. */
  800. static int imx_dsp_attach_pm_domains(struct imx_dsp_rproc *priv)
  801. {
  802. struct device *dev = priv->rproc->dev.parent;
  803. int ret, i;
  804. priv->num_domains = of_count_phandle_with_args(dev->of_node,
  805. "power-domains",
  806. "#power-domain-cells");
  807. /* If only one domain, then no need to link the device */
  808. if (priv->num_domains <= 1)
  809. return 0;
  810. priv->pd_dev = devm_kmalloc_array(dev, priv->num_domains,
  811. sizeof(*priv->pd_dev),
  812. GFP_KERNEL);
  813. if (!priv->pd_dev)
  814. return -ENOMEM;
  815. priv->pd_dev_link = devm_kmalloc_array(dev, priv->num_domains,
  816. sizeof(*priv->pd_dev_link),
  817. GFP_KERNEL);
  818. if (!priv->pd_dev_link)
  819. return -ENOMEM;
  820. for (i = 0; i < priv->num_domains; i++) {
  821. priv->pd_dev[i] = dev_pm_domain_attach_by_id(dev, i);
  822. if (IS_ERR(priv->pd_dev[i])) {
  823. ret = PTR_ERR(priv->pd_dev[i]);
  824. goto detach_pm;
  825. }
  826. /*
  827. * device_link_add will check priv->pd_dev[i], if it is
  828. * NULL, then will break.
  829. */
  830. priv->pd_dev_link[i] = device_link_add(dev,
  831. priv->pd_dev[i],
  832. DL_FLAG_STATELESS |
  833. DL_FLAG_PM_RUNTIME);
  834. if (!priv->pd_dev_link[i]) {
  835. dev_pm_domain_detach(priv->pd_dev[i], false);
  836. ret = -EINVAL;
  837. goto detach_pm;
  838. }
  839. }
  840. return 0;
  841. detach_pm:
  842. while (--i >= 0) {
  843. device_link_del(priv->pd_dev_link[i]);
  844. dev_pm_domain_detach(priv->pd_dev[i], false);
  845. }
  846. return ret;
  847. }
  848. static int imx_dsp_detach_pm_domains(struct imx_dsp_rproc *priv)
  849. {
  850. int i;
  851. if (priv->num_domains <= 1)
  852. return 0;
  853. for (i = 0; i < priv->num_domains; i++) {
  854. device_link_del(priv->pd_dev_link[i]);
  855. dev_pm_domain_detach(priv->pd_dev[i], false);
  856. }
  857. return 0;
  858. }
  859. /**
  860. * imx_dsp_rproc_detect_mode() - detect DSP control mode
  861. * @priv: private data pointer
  862. *
  863. * Different platform has different control method for DSP, which depends
  864. * on how the DSP is integrated in platform.
  865. *
  866. * For i.MX8QXP and i.MX8QM, DSP should be started and stopped by System
  867. * Control Unit.
  868. * For i.MX8MP and i.MX8ULP, DSP should be started and stopped by system
  869. * integration module.
  870. */
  871. static int imx_dsp_rproc_detect_mode(struct imx_dsp_rproc *priv)
  872. {
  873. const struct imx_dsp_rproc_dcfg *dsp_dcfg = priv->dsp_dcfg;
  874. struct device *dev = priv->rproc->dev.parent;
  875. struct regmap *regmap;
  876. int ret = 0;
  877. switch (dsp_dcfg->dcfg->method) {
  878. case IMX_RPROC_SCU_API:
  879. ret = imx_scu_get_handle(&priv->ipc_handle);
  880. if (ret)
  881. return ret;
  882. break;
  883. case IMX_RPROC_MMIO:
  884. regmap = syscon_regmap_lookup_by_phandle(dev->of_node, "fsl,dsp-ctrl");
  885. if (IS_ERR(regmap)) {
  886. dev_err(dev, "failed to find syscon\n");
  887. return PTR_ERR(regmap);
  888. }
  889. priv->regmap = regmap;
  890. break;
  891. default:
  892. ret = -EOPNOTSUPP;
  893. break;
  894. }
  895. return ret;
  896. }
  897. static const char *imx_dsp_clks_names[DSP_RPROC_CLK_MAX] = {
  898. /* DSP clocks */
  899. "core", "ocram", "debug", "ipg", "mu",
  900. };
  901. static int imx_dsp_rproc_clk_get(struct imx_dsp_rproc *priv)
  902. {
  903. struct device *dev = priv->rproc->dev.parent;
  904. struct clk_bulk_data *clks = priv->clks;
  905. int i;
  906. for (i = 0; i < DSP_RPROC_CLK_MAX; i++)
  907. clks[i].id = imx_dsp_clks_names[i];
  908. return devm_clk_bulk_get_optional(dev, DSP_RPROC_CLK_MAX, clks);
  909. }
  910. static int imx_dsp_rproc_probe(struct platform_device *pdev)
  911. {
  912. const struct imx_dsp_rproc_dcfg *dsp_dcfg;
  913. struct device *dev = &pdev->dev;
  914. struct imx_dsp_rproc *priv;
  915. struct rproc *rproc;
  916. const char *fw_name;
  917. int ret;
  918. dsp_dcfg = of_device_get_match_data(dev);
  919. if (!dsp_dcfg)
  920. return -ENODEV;
  921. ret = rproc_of_parse_firmware(dev, 0, &fw_name);
  922. if (ret) {
  923. dev_err(dev, "failed to parse firmware-name property, ret = %d\n",
  924. ret);
  925. return ret;
  926. }
  927. rproc = rproc_alloc(dev, "imx-dsp-rproc", &imx_dsp_rproc_ops, fw_name,
  928. sizeof(*priv));
  929. if (!rproc)
  930. return -ENOMEM;
  931. priv = rproc->priv;
  932. priv->rproc = rproc;
  933. priv->dsp_dcfg = dsp_dcfg;
  934. dev_set_drvdata(dev, rproc);
  935. INIT_WORK(&priv->rproc_work, imx_dsp_rproc_vq_work);
  936. ret = imx_dsp_rproc_detect_mode(priv);
  937. if (ret) {
  938. dev_err(dev, "failed on imx_dsp_rproc_detect_mode\n");
  939. goto err_put_rproc;
  940. }
  941. /* There are multiple power domains required by DSP on some platform */
  942. ret = imx_dsp_attach_pm_domains(priv);
  943. if (ret) {
  944. dev_err(dev, "failed on imx_dsp_attach_pm_domains\n");
  945. goto err_put_rproc;
  946. }
  947. /* Get clocks */
  948. ret = imx_dsp_rproc_clk_get(priv);
  949. if (ret) {
  950. dev_err(dev, "failed on imx_dsp_rproc_clk_get\n");
  951. goto err_detach_domains;
  952. }
  953. init_completion(&priv->pm_comp);
  954. rproc->auto_boot = false;
  955. ret = rproc_add(rproc);
  956. if (ret) {
  957. dev_err(dev, "rproc_add failed\n");
  958. goto err_detach_domains;
  959. }
  960. pm_runtime_enable(dev);
  961. return 0;
  962. err_detach_domains:
  963. imx_dsp_detach_pm_domains(priv);
  964. err_put_rproc:
  965. rproc_free(rproc);
  966. return ret;
  967. }
  968. static int imx_dsp_rproc_remove(struct platform_device *pdev)
  969. {
  970. struct rproc *rproc = platform_get_drvdata(pdev);
  971. struct imx_dsp_rproc *priv = rproc->priv;
  972. pm_runtime_disable(&pdev->dev);
  973. rproc_del(rproc);
  974. imx_dsp_detach_pm_domains(priv);
  975. rproc_free(rproc);
  976. return 0;
  977. }
  978. /* pm runtime functions */
  979. static int imx_dsp_runtime_resume(struct device *dev)
  980. {
  981. struct rproc *rproc = dev_get_drvdata(dev);
  982. struct imx_dsp_rproc *priv = rproc->priv;
  983. const struct imx_dsp_rproc_dcfg *dsp_dcfg = priv->dsp_dcfg;
  984. int ret;
  985. /*
  986. * There is power domain attached with mailbox, if setup mailbox
  987. * in probe(), then the power of mailbox is always enabled,
  988. * the power can't be saved.
  989. * So move setup of mailbox to runtime resume.
  990. */
  991. ret = imx_dsp_rproc_mbox_init(priv);
  992. if (ret) {
  993. dev_err(dev, "failed on imx_dsp_rproc_mbox_init\n");
  994. return ret;
  995. }
  996. ret = clk_bulk_prepare_enable(DSP_RPROC_CLK_MAX, priv->clks);
  997. if (ret) {
  998. dev_err(dev, "failed on clk_bulk_prepare_enable\n");
  999. return ret;
  1000. }
  1001. /* Reset DSP if needed */
  1002. if (dsp_dcfg->reset)
  1003. dsp_dcfg->reset(priv);
  1004. return 0;
  1005. }
  1006. static int imx_dsp_runtime_suspend(struct device *dev)
  1007. {
  1008. struct rproc *rproc = dev_get_drvdata(dev);
  1009. struct imx_dsp_rproc *priv = rproc->priv;
  1010. clk_bulk_disable_unprepare(DSP_RPROC_CLK_MAX, priv->clks);
  1011. imx_dsp_rproc_free_mbox(priv);
  1012. return 0;
  1013. }
  1014. static void imx_dsp_load_firmware(const struct firmware *fw, void *context)
  1015. {
  1016. struct rproc *rproc = context;
  1017. int ret;
  1018. /*
  1019. * Same flow as start procedure.
  1020. * Load the ELF segments to memory firstly.
  1021. */
  1022. ret = rproc_load_segments(rproc, fw);
  1023. if (ret)
  1024. goto out;
  1025. /* Start the remote processor */
  1026. ret = rproc->ops->start(rproc);
  1027. if (ret)
  1028. goto out;
  1029. rproc->ops->kick(rproc, 0);
  1030. out:
  1031. release_firmware(fw);
  1032. }
  1033. static __maybe_unused int imx_dsp_suspend(struct device *dev)
  1034. {
  1035. struct rproc *rproc = dev_get_drvdata(dev);
  1036. struct imx_dsp_rproc *priv = rproc->priv;
  1037. __u32 mmsg = RP_MBOX_SUSPEND_SYSTEM;
  1038. int ret;
  1039. if (rproc->state != RPROC_RUNNING)
  1040. goto out;
  1041. reinit_completion(&priv->pm_comp);
  1042. /* Tell DSP that suspend is happening */
  1043. ret = mbox_send_message(priv->tx_ch, (void *)&mmsg);
  1044. if (ret < 0) {
  1045. dev_err(dev, "PM mbox_send_message failed: %d\n", ret);
  1046. return ret;
  1047. }
  1048. /*
  1049. * DSP need to save the context at suspend.
  1050. * Here waiting the response for DSP, then power can be disabled.
  1051. */
  1052. if (!wait_for_completion_timeout(&priv->pm_comp, msecs_to_jiffies(100)))
  1053. return -EBUSY;
  1054. out:
  1055. /*
  1056. * The power of DSP is disabled in suspend, so force pm runtime
  1057. * to be suspend, then we can reenable the power and clocks at
  1058. * resume stage.
  1059. */
  1060. return pm_runtime_force_suspend(dev);
  1061. }
  1062. static __maybe_unused int imx_dsp_resume(struct device *dev)
  1063. {
  1064. struct rproc *rproc = dev_get_drvdata(dev);
  1065. int ret = 0;
  1066. ret = pm_runtime_force_resume(dev);
  1067. if (ret)
  1068. return ret;
  1069. if (rproc->state != RPROC_RUNNING)
  1070. return 0;
  1071. /*
  1072. * The power of DSP is disabled at suspend, the memory of dsp
  1073. * is reset, the image segments are lost. So need to reload
  1074. * firmware and restart the DSP if it is in running state.
  1075. */
  1076. ret = request_firmware_nowait(THIS_MODULE, FW_ACTION_UEVENT,
  1077. rproc->firmware, dev, GFP_KERNEL,
  1078. rproc, imx_dsp_load_firmware);
  1079. if (ret < 0) {
  1080. dev_err(dev, "load firmware failed: %d\n", ret);
  1081. goto err;
  1082. }
  1083. return 0;
  1084. err:
  1085. pm_runtime_force_suspend(dev);
  1086. return ret;
  1087. }
  1088. static const struct dev_pm_ops imx_dsp_rproc_pm_ops = {
  1089. SET_SYSTEM_SLEEP_PM_OPS(imx_dsp_suspend, imx_dsp_resume)
  1090. SET_RUNTIME_PM_OPS(imx_dsp_runtime_suspend,
  1091. imx_dsp_runtime_resume, NULL)
  1092. };
  1093. static const struct of_device_id imx_dsp_rproc_of_match[] = {
  1094. { .compatible = "fsl,imx8qxp-hifi4", .data = &imx_dsp_rproc_cfg_imx8qxp },
  1095. { .compatible = "fsl,imx8qm-hifi4", .data = &imx_dsp_rproc_cfg_imx8qm },
  1096. { .compatible = "fsl,imx8mp-hifi4", .data = &imx_dsp_rproc_cfg_imx8mp },
  1097. { .compatible = "fsl,imx8ulp-hifi4", .data = &imx_dsp_rproc_cfg_imx8ulp },
  1098. {},
  1099. };
  1100. MODULE_DEVICE_TABLE(of, imx_dsp_rproc_of_match);
  1101. static struct platform_driver imx_dsp_rproc_driver = {
  1102. .probe = imx_dsp_rproc_probe,
  1103. .remove = imx_dsp_rproc_remove,
  1104. .driver = {
  1105. .name = "imx-dsp-rproc",
  1106. .of_match_table = imx_dsp_rproc_of_match,
  1107. .pm = &imx_dsp_rproc_pm_ops,
  1108. },
  1109. };
  1110. module_platform_driver(imx_dsp_rproc_driver);
  1111. MODULE_LICENSE("GPL v2");
  1112. MODULE_DESCRIPTION("i.MX HiFi Core Remote Processor Control Driver");
  1113. MODULE_AUTHOR("Shengjiu Wang <[email protected]>");