ti_k3_common.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * TI K3 Remote Processor(s) driver common code
  4. *
  5. * Refactored out of ti_k3_r5_remoteproc.c, ti_k3_dsp_remoteproc.c and
  6. * ti_k3_m4_remoteproc.c.
  7. *
  8. * ti_k3_r5_remoteproc.c:
  9. * Copyright (C) 2017-2022 Texas Instruments Incorporated - https://www.ti.com/
  10. * Suman Anna <s-anna@ti.com>
  11. *
  12. * ti_k3_dsp_remoteproc.c:
  13. * Copyright (C) 2018-2022 Texas Instruments Incorporated - https://www.ti.com/
  14. * Suman Anna <s-anna@ti.com>
  15. *
  16. * ti_k3_m4_remoteproc.c:
  17. * Copyright (C) 2021-2024 Texas Instruments Incorporated - https://www.ti.com/
  18. * Hari Nagalla <hnagalla@ti.com>
  19. */
  20. #include <linux/io.h>
  21. #include <linux/mailbox_client.h>
  22. #include <linux/module.h>
  23. #include <linux/of_address.h>
  24. #include <linux/of_device.h>
  25. #include <linux/of_reserved_mem.h>
  26. #include <linux/omap-mailbox.h>
  27. #include <linux/platform_device.h>
  28. #include <linux/remoteproc.h>
  29. #include <linux/reset.h>
  30. #include <linux/slab.h>
  31. #include "omap_remoteproc.h"
  32. #include "remoteproc_internal.h"
  33. #include "ti_sci_proc.h"
  34. #include "ti_k3_common.h"
  35. /**
  36. * k3_rproc_mbox_callback() - inbound mailbox message handler
  37. * @client: mailbox client pointer used for requesting the mailbox channel
  38. * @data: mailbox payload
  39. *
  40. * This handler is invoked by the K3 mailbox driver whenever a mailbox
  41. * message is received. Usually, the mailbox payload simply contains
  42. * the index of the virtqueue that is kicked by the remote processor,
  43. * and we let remoteproc core handle it.
  44. *
  45. * In addition to virtqueue indices, we also have some out-of-band values
  46. * that indicate different events. Those values are deliberately very
  47. * large so they don't coincide with virtqueue indices.
  48. */
  49. void k3_rproc_mbox_callback(struct mbox_client *client, void *data)
  50. {
  51. struct k3_rproc *kproc = container_of(client, struct k3_rproc, client);
  52. struct device *dev = kproc->rproc->dev.parent;
  53. struct rproc *rproc = kproc->rproc;
  54. u32 msg = (u32)(uintptr_t)(data);
  55. dev_dbg(dev, "mbox msg: 0x%x\n", msg);
  56. switch (msg) {
  57. case RP_MBOX_CRASH:
  58. /*
  59. * remoteproc detected an exception, but error recovery is not
  60. * supported. So, just log this for now
  61. */
  62. dev_err(dev, "K3 rproc %s crashed\n", rproc->name);
  63. break;
  64. case RP_MBOX_ECHO_REPLY:
  65. dev_info(dev, "received echo reply from %s\n", rproc->name);
  66. break;
  67. default:
  68. /* silently handle all other valid messages */
  69. if (msg >= RP_MBOX_READY && msg < RP_MBOX_END_MSG)
  70. return;
  71. if (msg > rproc->max_notifyid) {
  72. dev_dbg(dev, "dropping unknown message 0x%x", msg);
  73. return;
  74. }
  75. /* msg contains the index of the triggered vring */
  76. if (rproc_vq_interrupt(rproc, msg) == IRQ_NONE)
  77. dev_dbg(dev, "no message was found in vqid %d\n", msg);
  78. }
  79. }
  80. EXPORT_SYMBOL_GPL(k3_rproc_mbox_callback);
  81. /*
  82. * Kick the remote processor to notify about pending unprocessed messages.
  83. * The vqid usage is not used and is inconsequential, as the kick is performed
  84. * through a simulated GPIO (a bit in an IPC interrupt-triggering register),
  85. * the remote processor is expected to process both its Tx and Rx virtqueues.
  86. */
  87. void k3_rproc_kick(struct rproc *rproc, int vqid)
  88. {
  89. struct k3_rproc *kproc = rproc->priv;
  90. struct device *dev = kproc->dev;
  91. u32 msg = (u32)vqid;
  92. int ret;
  93. /*
  94. * Send the index of the triggered virtqueue in the mailbox payload.
  95. * NOTE: msg is cast to uintptr_t to prevent compiler warnings when
  96. * void* is 64bit. It is safely cast back to u32 in the mailbox driver.
  97. */
  98. ret = mbox_send_message(kproc->mbox, (void *)(uintptr_t)msg);
  99. if (ret < 0)
  100. dev_err(dev, "failed to send mailbox message, status = %d\n",
  101. ret);
  102. }
  103. EXPORT_SYMBOL_GPL(k3_rproc_kick);
  104. /* Put the remote processor into reset */
  105. int k3_rproc_reset(struct k3_rproc *kproc)
  106. {
  107. struct device *dev = kproc->dev;
  108. int ret;
  109. if (kproc->data->uses_lreset) {
  110. ret = reset_control_assert(kproc->reset);
  111. if (ret)
  112. dev_err(dev, "local-reset assert failed (%pe)\n", ERR_PTR(ret));
  113. } else {
  114. ret = kproc->ti_sci->ops.dev_ops.put_device(kproc->ti_sci,
  115. kproc->ti_sci_id);
  116. if (ret)
  117. dev_err(dev, "module-reset assert failed (%pe)\n", ERR_PTR(ret));
  118. }
  119. return ret;
  120. }
  121. EXPORT_SYMBOL_GPL(k3_rproc_reset);
  122. /* Release the remote processor from reset */
  123. int k3_rproc_release(struct k3_rproc *kproc)
  124. {
  125. struct device *dev = kproc->dev;
  126. int ret;
  127. if (kproc->data->uses_lreset) {
  128. ret = reset_control_deassert(kproc->reset);
  129. if (ret) {
  130. dev_err(dev, "local-reset deassert failed, (%pe)\n", ERR_PTR(ret));
  131. if (kproc->ti_sci->ops.dev_ops.put_device(kproc->ti_sci,
  132. kproc->ti_sci_id))
  133. dev_warn(dev, "module-reset assert back failed\n");
  134. }
  135. } else {
  136. ret = kproc->ti_sci->ops.dev_ops.get_device(kproc->ti_sci,
  137. kproc->ti_sci_id);
  138. if (ret)
  139. dev_err(dev, "module-reset deassert failed (%pe)\n", ERR_PTR(ret));
  140. }
  141. return ret;
  142. }
  143. EXPORT_SYMBOL_GPL(k3_rproc_release);
  144. static void k3_rproc_free_channel(void *data)
  145. {
  146. struct k3_rproc *kproc = data;
  147. mbox_free_channel(kproc->mbox);
  148. }
  149. int k3_rproc_request_mbox(struct rproc *rproc)
  150. {
  151. struct k3_rproc *kproc = rproc->priv;
  152. struct mbox_client *client = &kproc->client;
  153. struct device *dev = kproc->dev;
  154. int ret;
  155. client->dev = dev;
  156. client->tx_done = NULL;
  157. client->rx_callback = k3_rproc_mbox_callback;
  158. client->tx_block = false;
  159. client->knows_txdone = false;
  160. kproc->mbox = mbox_request_channel(client, 0);
  161. if (IS_ERR(kproc->mbox))
  162. return dev_err_probe(dev, PTR_ERR(kproc->mbox),
  163. "mbox_request_channel failed\n");
  164. ret = devm_add_action_or_reset(dev, k3_rproc_free_channel, kproc);
  165. if (ret)
  166. return ret;
  167. return 0;
  168. }
  169. EXPORT_SYMBOL_GPL(k3_rproc_request_mbox);
  170. /*
  171. * The K3 DSP and M4 cores have a local reset that affects only the CPU, and a
  172. * generic module reset that powers on the device and allows the internal
  173. * memories to be accessed while the local reset is asserted. This function is
  174. * used to release the global reset on remote cores to allow loading into the
  175. * internal RAMs. The .prepare() ops is invoked by remoteproc core before any
  176. * firmware loading, and is followed by the .start() ops after loading to
  177. * actually let the remote cores to run.
  178. */
  179. int k3_rproc_prepare(struct rproc *rproc)
  180. {
  181. struct k3_rproc *kproc = rproc->priv;
  182. struct device *dev = kproc->dev;
  183. int ret;
  184. /* If the core is running already no need to deassert the module reset */
  185. if (rproc->state == RPROC_DETACHED)
  186. return 0;
  187. /*
  188. * Ensure the local reset is asserted so the core doesn't
  189. * execute bogus code when the module reset is released.
  190. */
  191. if (kproc->data->uses_lreset) {
  192. ret = k3_rproc_reset(kproc);
  193. if (ret)
  194. return ret;
  195. ret = reset_control_status(kproc->reset);
  196. if (ret <= 0) {
  197. dev_err(dev, "local reset still not asserted\n");
  198. return ret;
  199. }
  200. }
  201. ret = kproc->ti_sci->ops.dev_ops.get_device(kproc->ti_sci,
  202. kproc->ti_sci_id);
  203. if (ret) {
  204. dev_err(dev, "could not deassert module-reset for internal RAM loading\n");
  205. return ret;
  206. }
  207. return 0;
  208. }
  209. EXPORT_SYMBOL_GPL(k3_rproc_prepare);
  210. /*
  211. * This function implements the .unprepare() ops and performs the complimentary
  212. * operations to that of the .prepare() ops. The function is used to assert the
  213. * global reset on applicable K3 DSP and M4 cores. This completes the second
  214. * portion of powering down the remote core. The cores themselves are only
  215. * halted in the .stop() callback through the local reset, and the .unprepare()
  216. * ops is invoked by the remoteproc core after the remoteproc is stopped to
  217. * balance the global reset.
  218. */
  219. int k3_rproc_unprepare(struct rproc *rproc)
  220. {
  221. struct k3_rproc *kproc = rproc->priv;
  222. struct device *dev = kproc->dev;
  223. int ret;
  224. /* If the core is going to be detached do not assert the module reset */
  225. if (rproc->state == RPROC_DETACHED)
  226. return 0;
  227. ret = kproc->ti_sci->ops.dev_ops.put_device(kproc->ti_sci,
  228. kproc->ti_sci_id);
  229. if (ret) {
  230. dev_err(dev, "module-reset assert failed\n");
  231. return ret;
  232. }
  233. return 0;
  234. }
  235. EXPORT_SYMBOL_GPL(k3_rproc_unprepare);
  236. /*
  237. * Power up the remote processor.
  238. *
  239. * This function will be invoked only after the firmware for this rproc
  240. * was loaded, parsed successfully, and all of its resource requirements
  241. * were met. This callback is invoked only in remoteproc mode.
  242. */
  243. int k3_rproc_start(struct rproc *rproc)
  244. {
  245. struct k3_rproc *kproc = rproc->priv;
  246. return k3_rproc_release(kproc);
  247. }
  248. EXPORT_SYMBOL_GPL(k3_rproc_start);
  249. /*
  250. * Stop the remote processor.
  251. *
  252. * This function puts the remote processor into reset, and finishes processing
  253. * of any pending messages. This callback is invoked only in remoteproc mode.
  254. */
  255. int k3_rproc_stop(struct rproc *rproc)
  256. {
  257. struct k3_rproc *kproc = rproc->priv;
  258. return k3_rproc_reset(kproc);
  259. }
  260. EXPORT_SYMBOL_GPL(k3_rproc_stop);
  261. /*
  262. * Attach to a running remote processor (IPC-only mode)
  263. *
  264. * The rproc attach callback is a NOP. The remote processor is already booted,
  265. * and all required resources have been acquired during probe routine, so there
  266. * is no need to issue any TI-SCI commands to boot the remote cores in IPC-only
  267. * mode. This callback is invoked only in IPC-only mode and exists because
  268. * rproc_validate() checks for its existence.
  269. */
  270. int k3_rproc_attach(struct rproc *rproc) { return 0; }
  271. EXPORT_SYMBOL_GPL(k3_rproc_attach);
  272. /*
  273. * Detach from a running remote processor (IPC-only mode)
  274. *
  275. * The rproc detach callback is a NOP. The remote processor is not stopped and
  276. * will be left in booted state in IPC-only mode. This callback is invoked only
  277. * in IPC-only mode and exists for sanity sake
  278. */
  279. int k3_rproc_detach(struct rproc *rproc) { return 0; }
  280. EXPORT_SYMBOL_GPL(k3_rproc_detach);
  281. /*
  282. * This function implements the .get_loaded_rsc_table() callback and is used
  283. * to provide the resource table for a booted remote processor in IPC-only
  284. * mode. The remote processor firmwares follow a design-by-contract approach
  285. * and are expected to have the resource table at the base of the DDR region
  286. * reserved for firmware usage. This provides flexibility for the remote
  287. * processor to be booted by different bootloaders that may or may not have the
  288. * ability to publish the resource table address and size through a DT
  289. * property.
  290. */
  291. struct resource_table *k3_get_loaded_rsc_table(struct rproc *rproc,
  292. size_t *rsc_table_sz)
  293. {
  294. struct k3_rproc *kproc = rproc->priv;
  295. struct device *dev = kproc->dev;
  296. if (!kproc->rmem[0].cpu_addr) {
  297. dev_err(dev, "memory-region #1 does not exist, loaded rsc table can't be found");
  298. return ERR_PTR(-ENOMEM);
  299. }
  300. /*
  301. * NOTE: The resource table size is currently hard-coded to a maximum
  302. * of 256 bytes. The most common resource table usage for K3 firmwares
  303. * is to only have the vdev resource entry and an optional trace entry.
  304. * The exact size could be computed based on resource table address, but
  305. * the hard-coded value suffices to support the IPC-only mode.
  306. */
  307. *rsc_table_sz = 256;
  308. return (__force struct resource_table *)kproc->rmem[0].cpu_addr;
  309. }
  310. EXPORT_SYMBOL_GPL(k3_get_loaded_rsc_table);
  311. /*
  312. * Custom function to translate a remote processor device address (internal
  313. * RAMs only) to a kernel virtual address. The remote processors can access
  314. * their RAMs at either an internal address visible only from a remote
  315. * processor, or at the SoC-level bus address. Both these addresses need to be
  316. * looked through for translation. The translated addresses can be used either
  317. * by the remoteproc core for loading (when using kernel remoteproc loader), or
  318. * by any rpmsg bus drivers.
  319. */
  320. void *k3_rproc_da_to_va(struct rproc *rproc, u64 da, size_t len, bool *is_iomem)
  321. {
  322. struct k3_rproc *kproc = rproc->priv;
  323. void __iomem *va = NULL;
  324. phys_addr_t bus_addr;
  325. u32 dev_addr, offset;
  326. size_t size;
  327. int i;
  328. if (len == 0)
  329. return NULL;
  330. for (i = 0; i < kproc->num_mems; i++) {
  331. bus_addr = kproc->mem[i].bus_addr;
  332. dev_addr = kproc->mem[i].dev_addr;
  333. size = kproc->mem[i].size;
  334. /* handle rproc-view addresses */
  335. if (da >= dev_addr && ((da + len) <= (dev_addr + size))) {
  336. offset = da - dev_addr;
  337. va = kproc->mem[i].cpu_addr + offset;
  338. return (__force void *)va;
  339. }
  340. /* handle SoC-view addresses */
  341. if (da >= bus_addr && (da + len) <= (bus_addr + size)) {
  342. offset = da - bus_addr;
  343. va = kproc->mem[i].cpu_addr + offset;
  344. return (__force void *)va;
  345. }
  346. }
  347. /* handle static DDR reserved memory regions */
  348. for (i = 0; i < kproc->num_rmems; i++) {
  349. dev_addr = kproc->rmem[i].dev_addr;
  350. size = kproc->rmem[i].size;
  351. if (da >= dev_addr && ((da + len) <= (dev_addr + size))) {
  352. offset = da - dev_addr;
  353. va = kproc->rmem[i].cpu_addr + offset;
  354. return (__force void *)va;
  355. }
  356. }
  357. return NULL;
  358. }
  359. EXPORT_SYMBOL_GPL(k3_rproc_da_to_va);
  360. int k3_rproc_of_get_memories(struct platform_device *pdev,
  361. struct k3_rproc *kproc)
  362. {
  363. const struct k3_rproc_dev_data *data = kproc->data;
  364. struct device *dev = &pdev->dev;
  365. struct resource *res;
  366. int num_mems = 0;
  367. int i;
  368. num_mems = data->num_mems;
  369. kproc->mem = devm_kcalloc(kproc->dev, num_mems,
  370. sizeof(*kproc->mem), GFP_KERNEL);
  371. if (!kproc->mem)
  372. return -ENOMEM;
  373. for (i = 0; i < num_mems; i++) {
  374. res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
  375. data->mems[i].name);
  376. if (!res) {
  377. dev_err(dev, "found no memory resource for %s\n",
  378. data->mems[i].name);
  379. return -EINVAL;
  380. }
  381. if (!devm_request_mem_region(dev, res->start,
  382. resource_size(res),
  383. dev_name(dev))) {
  384. dev_err(dev, "could not request %s region for resource\n",
  385. data->mems[i].name);
  386. return -EBUSY;
  387. }
  388. kproc->mem[i].cpu_addr = devm_ioremap_wc(dev, res->start,
  389. resource_size(res));
  390. if (!kproc->mem[i].cpu_addr) {
  391. dev_err(dev, "failed to map %s memory\n",
  392. data->mems[i].name);
  393. return -ENOMEM;
  394. }
  395. kproc->mem[i].bus_addr = res->start;
  396. kproc->mem[i].dev_addr = data->mems[i].dev_addr;
  397. kproc->mem[i].size = resource_size(res);
  398. dev_dbg(dev, "memory %8s: bus addr %pa size 0x%zx va %p da 0x%x\n",
  399. data->mems[i].name, &kproc->mem[i].bus_addr,
  400. kproc->mem[i].size, kproc->mem[i].cpu_addr,
  401. kproc->mem[i].dev_addr);
  402. }
  403. kproc->num_mems = num_mems;
  404. return 0;
  405. }
  406. EXPORT_SYMBOL_GPL(k3_rproc_of_get_memories);
  407. void k3_mem_release(void *data)
  408. {
  409. struct device *dev = data;
  410. of_reserved_mem_device_release(dev);
  411. }
  412. EXPORT_SYMBOL_GPL(k3_mem_release);
  413. int k3_reserved_mem_init(struct k3_rproc *kproc)
  414. {
  415. struct device *dev = kproc->dev;
  416. struct device_node *np = dev->of_node;
  417. int num_rmems;
  418. int ret, i;
  419. num_rmems = of_reserved_mem_region_count(np);
  420. if (num_rmems < 0) {
  421. dev_err(dev, "device does not reserved memory regions (%d)\n",
  422. num_rmems);
  423. return -EINVAL;
  424. }
  425. if (num_rmems < 2) {
  426. dev_err(dev, "device needs at least two memory regions to be defined, num = %d\n",
  427. num_rmems);
  428. return -EINVAL;
  429. }
  430. /* use reserved memory region 0 for vring DMA allocations */
  431. ret = of_reserved_mem_device_init_by_idx(dev, np, 0);
  432. if (ret) {
  433. dev_err(dev, "device cannot initialize DMA pool (%d)\n", ret);
  434. return ret;
  435. }
  436. ret = devm_add_action_or_reset(dev, k3_mem_release, dev);
  437. if (ret)
  438. return ret;
  439. num_rmems--;
  440. kproc->rmem = devm_kcalloc(dev, num_rmems, sizeof(*kproc->rmem), GFP_KERNEL);
  441. if (!kproc->rmem)
  442. return -ENOMEM;
  443. /* use remaining reserved memory regions for static carveouts */
  444. for (i = 0; i < num_rmems; i++) {
  445. struct resource res;
  446. ret = of_reserved_mem_region_to_resource(np, i + 1, &res);
  447. if (ret)
  448. return ret;
  449. kproc->rmem[i].bus_addr = res.start;
  450. /* 64-bit address regions currently not supported */
  451. kproc->rmem[i].dev_addr = (u32)res.start;
  452. kproc->rmem[i].size = resource_size(&res);
  453. kproc->rmem[i].cpu_addr = devm_ioremap_resource_wc(dev, &res);
  454. if (!kproc->rmem[i].cpu_addr) {
  455. dev_err(dev, "failed to map reserved memory#%d at %pR\n",
  456. i + 1, &res);
  457. return -ENOMEM;
  458. }
  459. dev_dbg(dev, "reserved memory%d: bus addr %pa size 0x%zx va %p da 0x%x\n",
  460. i + 1, &kproc->rmem[i].bus_addr,
  461. kproc->rmem[i].size, kproc->rmem[i].cpu_addr,
  462. kproc->rmem[i].dev_addr);
  463. }
  464. kproc->num_rmems = num_rmems;
  465. return 0;
  466. }
  467. EXPORT_SYMBOL_GPL(k3_reserved_mem_init);
  468. void k3_release_tsp(void *data)
  469. {
  470. struct ti_sci_proc *tsp = data;
  471. ti_sci_proc_release(tsp);
  472. }
  473. EXPORT_SYMBOL_GPL(k3_release_tsp);
  474. MODULE_LICENSE("GPL");
  475. MODULE_DESCRIPTION("TI K3 common Remoteproc code");