bpmp.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved.
  4. */
  5. #include <linux/clk/tegra.h>
  6. #include <linux/genalloc.h>
  7. #include <linux/mailbox_client.h>
  8. #include <linux/module.h>
  9. #include <linux/of.h>
  10. #include <linux/of_platform.h>
  11. #include <linux/platform_device.h>
  12. #include <linux/pm.h>
  13. #include <linux/semaphore.h>
  14. #include <linux/sched/clock.h>
  15. #include <soc/tegra/bpmp.h>
  16. #include <soc/tegra/bpmp-abi.h>
  17. #include <soc/tegra/ivc.h>
  18. #include "bpmp-private.h"
  19. #define MSG_ACK BIT(0)
  20. #define MSG_RING BIT(1)
  21. #define TAG_SZ 32
  22. static inline const struct tegra_bpmp_ops *
  23. channel_to_ops(struct tegra_bpmp_channel *channel)
  24. {
  25. struct tegra_bpmp *bpmp = channel->bpmp;
  26. return bpmp->soc->ops;
  27. }
  28. struct tegra_bpmp *tegra_bpmp_get(struct device *dev)
  29. {
  30. struct platform_device *pdev;
  31. struct tegra_bpmp *bpmp;
  32. struct device_node *np;
  33. np = of_parse_phandle(dev->of_node, "nvidia,bpmp", 0);
  34. if (!np)
  35. return ERR_PTR(-ENOENT);
  36. pdev = of_find_device_by_node(np);
  37. if (!pdev) {
  38. bpmp = ERR_PTR(-ENODEV);
  39. goto put;
  40. }
  41. bpmp = platform_get_drvdata(pdev);
  42. if (!bpmp) {
  43. bpmp = ERR_PTR(-EPROBE_DEFER);
  44. put_device(&pdev->dev);
  45. goto put;
  46. }
  47. put:
  48. of_node_put(np);
  49. return bpmp;
  50. }
  51. EXPORT_SYMBOL_GPL(tegra_bpmp_get);
  52. void tegra_bpmp_put(struct tegra_bpmp *bpmp)
  53. {
  54. if (bpmp)
  55. put_device(bpmp->dev);
  56. }
  57. EXPORT_SYMBOL_GPL(tegra_bpmp_put);
  58. static int
  59. tegra_bpmp_channel_get_thread_index(struct tegra_bpmp_channel *channel)
  60. {
  61. struct tegra_bpmp *bpmp = channel->bpmp;
  62. unsigned int count;
  63. int index;
  64. count = bpmp->soc->channels.thread.count;
  65. index = channel - channel->bpmp->threaded_channels;
  66. if (index < 0 || index >= count)
  67. return -EINVAL;
  68. return index;
  69. }
  70. static bool tegra_bpmp_message_valid(const struct tegra_bpmp_message *msg)
  71. {
  72. return (msg->tx.size <= MSG_DATA_MIN_SZ) &&
  73. (msg->rx.size <= MSG_DATA_MIN_SZ) &&
  74. (msg->tx.size == 0 || msg->tx.data) &&
  75. (msg->rx.size == 0 || msg->rx.data);
  76. }
  77. static bool tegra_bpmp_is_response_ready(struct tegra_bpmp_channel *channel)
  78. {
  79. const struct tegra_bpmp_ops *ops = channel_to_ops(channel);
  80. return ops->is_response_ready(channel);
  81. }
  82. static bool tegra_bpmp_is_request_ready(struct tegra_bpmp_channel *channel)
  83. {
  84. const struct tegra_bpmp_ops *ops = channel_to_ops(channel);
  85. return ops->is_request_ready(channel);
  86. }
  87. static int tegra_bpmp_wait_response(struct tegra_bpmp_channel *channel)
  88. {
  89. unsigned long timeout = channel->bpmp->soc->channels.cpu_tx.timeout;
  90. ktime_t end;
  91. end = ktime_add_us(ktime_get(), timeout);
  92. do {
  93. if (tegra_bpmp_is_response_ready(channel))
  94. return 0;
  95. } while (ktime_before(ktime_get(), end));
  96. return -ETIMEDOUT;
  97. }
  98. static int tegra_bpmp_ack_response(struct tegra_bpmp_channel *channel)
  99. {
  100. const struct tegra_bpmp_ops *ops = channel_to_ops(channel);
  101. return ops->ack_response(channel);
  102. }
  103. static int tegra_bpmp_ack_request(struct tegra_bpmp_channel *channel)
  104. {
  105. const struct tegra_bpmp_ops *ops = channel_to_ops(channel);
  106. return ops->ack_request(channel);
  107. }
  108. static bool
  109. tegra_bpmp_is_request_channel_free(struct tegra_bpmp_channel *channel)
  110. {
  111. const struct tegra_bpmp_ops *ops = channel_to_ops(channel);
  112. return ops->is_request_channel_free(channel);
  113. }
  114. static bool
  115. tegra_bpmp_is_response_channel_free(struct tegra_bpmp_channel *channel)
  116. {
  117. const struct tegra_bpmp_ops *ops = channel_to_ops(channel);
  118. return ops->is_response_channel_free(channel);
  119. }
  120. static int
  121. tegra_bpmp_wait_request_channel_free(struct tegra_bpmp_channel *channel)
  122. {
  123. unsigned long timeout = channel->bpmp->soc->channels.cpu_tx.timeout;
  124. ktime_t start, now;
  125. start = ns_to_ktime(local_clock());
  126. do {
  127. if (tegra_bpmp_is_request_channel_free(channel))
  128. return 0;
  129. now = ns_to_ktime(local_clock());
  130. } while (ktime_us_delta(now, start) < timeout);
  131. return -ETIMEDOUT;
  132. }
  133. static int tegra_bpmp_post_request(struct tegra_bpmp_channel *channel)
  134. {
  135. const struct tegra_bpmp_ops *ops = channel_to_ops(channel);
  136. return ops->post_request(channel);
  137. }
  138. static int tegra_bpmp_post_response(struct tegra_bpmp_channel *channel)
  139. {
  140. const struct tegra_bpmp_ops *ops = channel_to_ops(channel);
  141. return ops->post_response(channel);
  142. }
  143. static int tegra_bpmp_ring_doorbell(struct tegra_bpmp *bpmp)
  144. {
  145. return bpmp->soc->ops->ring_doorbell(bpmp);
  146. }
  147. static ssize_t __tegra_bpmp_channel_read(struct tegra_bpmp_channel *channel,
  148. void *data, size_t size, int *ret)
  149. {
  150. int err;
  151. if (data && size > 0)
  152. tegra_bpmp_mb_read(data, &channel->ib, size);
  153. err = tegra_bpmp_ack_response(channel);
  154. if (err < 0)
  155. return err;
  156. *ret = tegra_bpmp_mb_read_field(&channel->ib, code);
  157. return 0;
  158. }
  159. static ssize_t tegra_bpmp_channel_read(struct tegra_bpmp_channel *channel,
  160. void *data, size_t size, int *ret)
  161. {
  162. struct tegra_bpmp *bpmp = channel->bpmp;
  163. unsigned long flags;
  164. ssize_t err;
  165. int index;
  166. index = tegra_bpmp_channel_get_thread_index(channel);
  167. if (index < 0) {
  168. err = index;
  169. goto unlock;
  170. }
  171. spin_lock_irqsave(&bpmp->lock, flags);
  172. err = __tegra_bpmp_channel_read(channel, data, size, ret);
  173. clear_bit(index, bpmp->threaded.allocated);
  174. spin_unlock_irqrestore(&bpmp->lock, flags);
  175. unlock:
  176. up(&bpmp->threaded.lock);
  177. return err;
  178. }
  179. static ssize_t __tegra_bpmp_channel_write(struct tegra_bpmp_channel *channel,
  180. unsigned int mrq, unsigned long flags,
  181. const void *data, size_t size)
  182. {
  183. tegra_bpmp_mb_write_field(&channel->ob, code, mrq);
  184. tegra_bpmp_mb_write_field(&channel->ob, flags, flags);
  185. if (data && size > 0)
  186. tegra_bpmp_mb_write(&channel->ob, data, size);
  187. return tegra_bpmp_post_request(channel);
  188. }
  189. static struct tegra_bpmp_channel *
  190. tegra_bpmp_write_threaded(struct tegra_bpmp *bpmp, unsigned int mrq,
  191. const void *data, size_t size)
  192. {
  193. unsigned long timeout = bpmp->soc->channels.thread.timeout;
  194. unsigned int count = bpmp->soc->channels.thread.count;
  195. struct tegra_bpmp_channel *channel;
  196. unsigned long flags;
  197. unsigned int index;
  198. int err;
  199. err = down_timeout(&bpmp->threaded.lock, usecs_to_jiffies(timeout));
  200. if (err < 0)
  201. return ERR_PTR(err);
  202. spin_lock_irqsave(&bpmp->lock, flags);
  203. index = find_first_zero_bit(bpmp->threaded.allocated, count);
  204. if (index == count) {
  205. err = -EBUSY;
  206. goto unlock;
  207. }
  208. channel = &bpmp->threaded_channels[index];
  209. if (!tegra_bpmp_is_request_channel_free(channel)) {
  210. err = -EBUSY;
  211. goto unlock;
  212. }
  213. set_bit(index, bpmp->threaded.allocated);
  214. err = __tegra_bpmp_channel_write(channel, mrq, MSG_ACK | MSG_RING,
  215. data, size);
  216. if (err < 0)
  217. goto clear_allocated;
  218. set_bit(index, bpmp->threaded.busy);
  219. spin_unlock_irqrestore(&bpmp->lock, flags);
  220. return channel;
  221. clear_allocated:
  222. clear_bit(index, bpmp->threaded.allocated);
  223. unlock:
  224. spin_unlock_irqrestore(&bpmp->lock, flags);
  225. up(&bpmp->threaded.lock);
  226. return ERR_PTR(err);
  227. }
  228. static ssize_t tegra_bpmp_channel_write(struct tegra_bpmp_channel *channel,
  229. unsigned int mrq, unsigned long flags,
  230. const void *data, size_t size)
  231. {
  232. int err;
  233. err = tegra_bpmp_wait_request_channel_free(channel);
  234. if (err < 0)
  235. return err;
  236. return __tegra_bpmp_channel_write(channel, mrq, flags, data, size);
  237. }
  238. static int __maybe_unused tegra_bpmp_resume(struct device *dev);
  239. int tegra_bpmp_transfer_atomic(struct tegra_bpmp *bpmp,
  240. struct tegra_bpmp_message *msg)
  241. {
  242. struct tegra_bpmp_channel *channel;
  243. int err;
  244. if (WARN_ON(!irqs_disabled()))
  245. return -EPERM;
  246. if (!tegra_bpmp_message_valid(msg))
  247. return -EINVAL;
  248. if (bpmp->suspended) {
  249. /* Reset BPMP IPC channels during resume based on flags passed */
  250. if (msg->flags & TEGRA_BPMP_MESSAGE_RESET)
  251. tegra_bpmp_resume(bpmp->dev);
  252. else
  253. return -EAGAIN;
  254. }
  255. channel = bpmp->tx_channel;
  256. spin_lock(&bpmp->atomic_tx_lock);
  257. err = tegra_bpmp_channel_write(channel, msg->mrq, MSG_ACK,
  258. msg->tx.data, msg->tx.size);
  259. if (err < 0) {
  260. spin_unlock(&bpmp->atomic_tx_lock);
  261. return err;
  262. }
  263. spin_unlock(&bpmp->atomic_tx_lock);
  264. err = tegra_bpmp_ring_doorbell(bpmp);
  265. if (err < 0)
  266. return err;
  267. err = tegra_bpmp_wait_response(channel);
  268. if (err < 0)
  269. return err;
  270. return __tegra_bpmp_channel_read(channel, msg->rx.data, msg->rx.size,
  271. &msg->rx.ret);
  272. }
  273. EXPORT_SYMBOL_GPL(tegra_bpmp_transfer_atomic);
  274. int tegra_bpmp_transfer(struct tegra_bpmp *bpmp,
  275. struct tegra_bpmp_message *msg)
  276. {
  277. struct tegra_bpmp_channel *channel;
  278. unsigned long timeout;
  279. int err;
  280. if (WARN_ON(irqs_disabled()))
  281. return -EPERM;
  282. if (!tegra_bpmp_message_valid(msg))
  283. return -EINVAL;
  284. if (bpmp->suspended) {
  285. /* Reset BPMP IPC channels during resume based on flags passed */
  286. if (msg->flags & TEGRA_BPMP_MESSAGE_RESET)
  287. tegra_bpmp_resume(bpmp->dev);
  288. else
  289. return -EAGAIN;
  290. }
  291. channel = tegra_bpmp_write_threaded(bpmp, msg->mrq, msg->tx.data,
  292. msg->tx.size);
  293. if (IS_ERR(channel))
  294. return PTR_ERR(channel);
  295. err = tegra_bpmp_ring_doorbell(bpmp);
  296. if (err < 0)
  297. return err;
  298. timeout = usecs_to_jiffies(bpmp->soc->channels.thread.timeout);
  299. err = wait_for_completion_timeout(&channel->completion, timeout);
  300. if (err == 0)
  301. return -ETIMEDOUT;
  302. return tegra_bpmp_channel_read(channel, msg->rx.data, msg->rx.size,
  303. &msg->rx.ret);
  304. }
  305. EXPORT_SYMBOL_GPL(tegra_bpmp_transfer);
  306. static struct tegra_bpmp_mrq *tegra_bpmp_find_mrq(struct tegra_bpmp *bpmp,
  307. unsigned int mrq)
  308. {
  309. struct tegra_bpmp_mrq *entry;
  310. list_for_each_entry(entry, &bpmp->mrqs, list)
  311. if (entry->mrq == mrq)
  312. return entry;
  313. return NULL;
  314. }
  315. void tegra_bpmp_mrq_return(struct tegra_bpmp_channel *channel, int code,
  316. const void *data, size_t size)
  317. {
  318. unsigned long flags = tegra_bpmp_mb_read_field(&channel->ib, flags);
  319. struct tegra_bpmp *bpmp = channel->bpmp;
  320. int err;
  321. if (WARN_ON(size > MSG_DATA_MIN_SZ))
  322. return;
  323. err = tegra_bpmp_ack_request(channel);
  324. if (WARN_ON(err < 0))
  325. return;
  326. if ((flags & MSG_ACK) == 0)
  327. return;
  328. if (WARN_ON(!tegra_bpmp_is_response_channel_free(channel)))
  329. return;
  330. tegra_bpmp_mb_write_field(&channel->ob, code, code);
  331. if (data && size > 0)
  332. tegra_bpmp_mb_write(&channel->ob, data, size);
  333. err = tegra_bpmp_post_response(channel);
  334. if (WARN_ON(err < 0))
  335. return;
  336. if (flags & MSG_RING) {
  337. err = tegra_bpmp_ring_doorbell(bpmp);
  338. if (WARN_ON(err < 0))
  339. return;
  340. }
  341. }
  342. EXPORT_SYMBOL_GPL(tegra_bpmp_mrq_return);
  343. static void tegra_bpmp_handle_mrq(struct tegra_bpmp *bpmp,
  344. unsigned int mrq,
  345. struct tegra_bpmp_channel *channel)
  346. {
  347. struct tegra_bpmp_mrq *entry;
  348. u32 zero = 0;
  349. spin_lock(&bpmp->lock);
  350. entry = tegra_bpmp_find_mrq(bpmp, mrq);
  351. if (!entry) {
  352. spin_unlock(&bpmp->lock);
  353. tegra_bpmp_mrq_return(channel, -EINVAL, &zero, sizeof(zero));
  354. return;
  355. }
  356. entry->handler(mrq, channel, entry->data);
  357. spin_unlock(&bpmp->lock);
  358. }
  359. int tegra_bpmp_request_mrq(struct tegra_bpmp *bpmp, unsigned int mrq,
  360. tegra_bpmp_mrq_handler_t handler, void *data)
  361. {
  362. struct tegra_bpmp_mrq *entry;
  363. unsigned long flags;
  364. if (!handler)
  365. return -EINVAL;
  366. entry = devm_kzalloc(bpmp->dev, sizeof(*entry), GFP_KERNEL);
  367. if (!entry)
  368. return -ENOMEM;
  369. spin_lock_irqsave(&bpmp->lock, flags);
  370. entry->mrq = mrq;
  371. entry->handler = handler;
  372. entry->data = data;
  373. list_add(&entry->list, &bpmp->mrqs);
  374. spin_unlock_irqrestore(&bpmp->lock, flags);
  375. return 0;
  376. }
  377. EXPORT_SYMBOL_GPL(tegra_bpmp_request_mrq);
  378. void tegra_bpmp_free_mrq(struct tegra_bpmp *bpmp, unsigned int mrq, void *data)
  379. {
  380. struct tegra_bpmp_mrq *entry;
  381. unsigned long flags;
  382. spin_lock_irqsave(&bpmp->lock, flags);
  383. entry = tegra_bpmp_find_mrq(bpmp, mrq);
  384. if (!entry)
  385. goto unlock;
  386. list_del(&entry->list);
  387. devm_kfree(bpmp->dev, entry);
  388. unlock:
  389. spin_unlock_irqrestore(&bpmp->lock, flags);
  390. }
  391. EXPORT_SYMBOL_GPL(tegra_bpmp_free_mrq);
  392. bool tegra_bpmp_mrq_is_supported(struct tegra_bpmp *bpmp, unsigned int mrq)
  393. {
  394. struct mrq_query_abi_request req = { .mrq = mrq };
  395. struct mrq_query_abi_response resp;
  396. struct tegra_bpmp_message msg = {
  397. .mrq = MRQ_QUERY_ABI,
  398. .tx = {
  399. .data = &req,
  400. .size = sizeof(req),
  401. },
  402. .rx = {
  403. .data = &resp,
  404. .size = sizeof(resp),
  405. },
  406. };
  407. int err;
  408. err = tegra_bpmp_transfer(bpmp, &msg);
  409. if (err || msg.rx.ret)
  410. return false;
  411. return resp.status == 0;
  412. }
  413. EXPORT_SYMBOL_GPL(tegra_bpmp_mrq_is_supported);
  414. static void tegra_bpmp_mrq_handle_ping(unsigned int mrq,
  415. struct tegra_bpmp_channel *channel,
  416. void *data)
  417. {
  418. struct mrq_ping_request request;
  419. struct mrq_ping_response response;
  420. tegra_bpmp_mb_read(&request, &channel->ib, sizeof(request));
  421. memset(&response, 0, sizeof(response));
  422. response.reply = request.challenge << 1;
  423. tegra_bpmp_mrq_return(channel, 0, &response, sizeof(response));
  424. }
  425. static int tegra_bpmp_ping(struct tegra_bpmp *bpmp)
  426. {
  427. struct mrq_ping_response response;
  428. struct mrq_ping_request request;
  429. struct tegra_bpmp_message msg;
  430. unsigned long flags;
  431. ktime_t start, end;
  432. int err;
  433. memset(&request, 0, sizeof(request));
  434. request.challenge = 1;
  435. memset(&response, 0, sizeof(response));
  436. memset(&msg, 0, sizeof(msg));
  437. msg.mrq = MRQ_PING;
  438. msg.tx.data = &request;
  439. msg.tx.size = sizeof(request);
  440. msg.rx.data = &response;
  441. msg.rx.size = sizeof(response);
  442. local_irq_save(flags);
  443. start = ktime_get();
  444. err = tegra_bpmp_transfer_atomic(bpmp, &msg);
  445. end = ktime_get();
  446. local_irq_restore(flags);
  447. if (!err)
  448. dev_dbg(bpmp->dev,
  449. "ping ok: challenge: %u, response: %u, time: %lld\n",
  450. request.challenge, response.reply,
  451. ktime_to_us(ktime_sub(end, start)));
  452. return err;
  453. }
  454. /* deprecated version of tag query */
  455. static int tegra_bpmp_get_firmware_tag_old(struct tegra_bpmp *bpmp, char *tag,
  456. size_t size)
  457. {
  458. struct mrq_query_tag_request request;
  459. struct tegra_bpmp_message msg;
  460. unsigned long flags;
  461. dma_addr_t phys;
  462. void *virt;
  463. int err;
  464. if (size != TAG_SZ)
  465. return -EINVAL;
  466. virt = dma_alloc_coherent(bpmp->dev, TAG_SZ, &phys,
  467. GFP_KERNEL | GFP_DMA32);
  468. if (!virt)
  469. return -ENOMEM;
  470. memset(&request, 0, sizeof(request));
  471. request.addr = phys;
  472. memset(&msg, 0, sizeof(msg));
  473. msg.mrq = MRQ_QUERY_TAG;
  474. msg.tx.data = &request;
  475. msg.tx.size = sizeof(request);
  476. local_irq_save(flags);
  477. err = tegra_bpmp_transfer_atomic(bpmp, &msg);
  478. local_irq_restore(flags);
  479. if (err == 0)
  480. memcpy(tag, virt, TAG_SZ);
  481. dma_free_coherent(bpmp->dev, TAG_SZ, virt, phys);
  482. return err;
  483. }
  484. static int tegra_bpmp_get_firmware_tag(struct tegra_bpmp *bpmp, char *tag,
  485. size_t size)
  486. {
  487. if (tegra_bpmp_mrq_is_supported(bpmp, MRQ_QUERY_FW_TAG)) {
  488. struct mrq_query_fw_tag_response resp;
  489. struct tegra_bpmp_message msg = {
  490. .mrq = MRQ_QUERY_FW_TAG,
  491. .rx = {
  492. .data = &resp,
  493. .size = sizeof(resp),
  494. },
  495. };
  496. int err;
  497. if (size != sizeof(resp.tag))
  498. return -EINVAL;
  499. err = tegra_bpmp_transfer(bpmp, &msg);
  500. if (err)
  501. return err;
  502. if (msg.rx.ret < 0)
  503. return -EINVAL;
  504. memcpy(tag, resp.tag, sizeof(resp.tag));
  505. return 0;
  506. }
  507. return tegra_bpmp_get_firmware_tag_old(bpmp, tag, size);
  508. }
  509. static void tegra_bpmp_channel_signal(struct tegra_bpmp_channel *channel)
  510. {
  511. unsigned long flags = tegra_bpmp_mb_read_field(&channel->ob, flags);
  512. if ((flags & MSG_RING) == 0)
  513. return;
  514. complete(&channel->completion);
  515. }
  516. void tegra_bpmp_handle_rx(struct tegra_bpmp *bpmp)
  517. {
  518. struct tegra_bpmp_channel *channel;
  519. unsigned int i, count;
  520. unsigned long *busy;
  521. channel = bpmp->rx_channel;
  522. count = bpmp->soc->channels.thread.count;
  523. busy = bpmp->threaded.busy;
  524. if (tegra_bpmp_is_request_ready(channel)) {
  525. unsigned int mrq = tegra_bpmp_mb_read_field(&channel->ib, code);
  526. tegra_bpmp_handle_mrq(bpmp, mrq, channel);
  527. }
  528. spin_lock(&bpmp->lock);
  529. for_each_set_bit(i, busy, count) {
  530. struct tegra_bpmp_channel *channel;
  531. channel = &bpmp->threaded_channels[i];
  532. if (tegra_bpmp_is_response_ready(channel)) {
  533. tegra_bpmp_channel_signal(channel);
  534. clear_bit(i, busy);
  535. }
  536. }
  537. spin_unlock(&bpmp->lock);
  538. }
  539. static int tegra_bpmp_probe(struct platform_device *pdev)
  540. {
  541. struct tegra_bpmp *bpmp;
  542. char tag[TAG_SZ];
  543. size_t size;
  544. int err;
  545. bpmp = devm_kzalloc(&pdev->dev, sizeof(*bpmp), GFP_KERNEL);
  546. if (!bpmp)
  547. return -ENOMEM;
  548. bpmp->soc = of_device_get_match_data(&pdev->dev);
  549. bpmp->dev = &pdev->dev;
  550. INIT_LIST_HEAD(&bpmp->mrqs);
  551. spin_lock_init(&bpmp->lock);
  552. bpmp->threaded.count = bpmp->soc->channels.thread.count;
  553. sema_init(&bpmp->threaded.lock, bpmp->threaded.count);
  554. size = BITS_TO_LONGS(bpmp->threaded.count) * sizeof(long);
  555. bpmp->threaded.allocated = devm_kzalloc(&pdev->dev, size, GFP_KERNEL);
  556. if (!bpmp->threaded.allocated)
  557. return -ENOMEM;
  558. bpmp->threaded.busy = devm_kzalloc(&pdev->dev, size, GFP_KERNEL);
  559. if (!bpmp->threaded.busy)
  560. return -ENOMEM;
  561. spin_lock_init(&bpmp->atomic_tx_lock);
  562. bpmp->tx_channel = devm_kzalloc(&pdev->dev, sizeof(*bpmp->tx_channel),
  563. GFP_KERNEL);
  564. if (!bpmp->tx_channel)
  565. return -ENOMEM;
  566. bpmp->rx_channel = devm_kzalloc(&pdev->dev, sizeof(*bpmp->rx_channel),
  567. GFP_KERNEL);
  568. if (!bpmp->rx_channel)
  569. return -ENOMEM;
  570. bpmp->threaded_channels = devm_kcalloc(&pdev->dev, bpmp->threaded.count,
  571. sizeof(*bpmp->threaded_channels),
  572. GFP_KERNEL);
  573. if (!bpmp->threaded_channels)
  574. return -ENOMEM;
  575. platform_set_drvdata(pdev, bpmp);
  576. err = bpmp->soc->ops->init(bpmp);
  577. if (err < 0)
  578. return err;
  579. err = tegra_bpmp_request_mrq(bpmp, MRQ_PING,
  580. tegra_bpmp_mrq_handle_ping, bpmp);
  581. if (err < 0)
  582. goto deinit;
  583. err = tegra_bpmp_ping(bpmp);
  584. if (err < 0) {
  585. dev_err(&pdev->dev, "failed to ping BPMP: %d\n", err);
  586. goto free_mrq;
  587. }
  588. err = tegra_bpmp_get_firmware_tag(bpmp, tag, sizeof(tag));
  589. if (err < 0) {
  590. dev_err(&pdev->dev, "failed to get firmware tag: %d\n", err);
  591. goto free_mrq;
  592. }
  593. dev_info(&pdev->dev, "firmware: %.*s\n", (int)sizeof(tag), tag);
  594. err = of_platform_default_populate(pdev->dev.of_node, NULL, &pdev->dev);
  595. if (err < 0)
  596. goto free_mrq;
  597. if (of_property_present(pdev->dev.of_node, "#clock-cells")) {
  598. err = tegra_bpmp_init_clocks(bpmp);
  599. if (err < 0)
  600. goto free_mrq;
  601. }
  602. if (of_property_present(pdev->dev.of_node, "#reset-cells")) {
  603. err = tegra_bpmp_init_resets(bpmp);
  604. if (err < 0)
  605. goto free_mrq;
  606. }
  607. if (of_property_present(pdev->dev.of_node, "#power-domain-cells")) {
  608. err = tegra_bpmp_init_powergates(bpmp);
  609. if (err < 0)
  610. goto free_mrq;
  611. }
  612. err = tegra_bpmp_init_debugfs(bpmp);
  613. if (err < 0)
  614. dev_err(&pdev->dev, "debugfs initialization failed: %d\n", err);
  615. return 0;
  616. free_mrq:
  617. tegra_bpmp_free_mrq(bpmp, MRQ_PING, bpmp);
  618. deinit:
  619. if (bpmp->soc->ops->deinit)
  620. bpmp->soc->ops->deinit(bpmp);
  621. return err;
  622. }
  623. static int __maybe_unused tegra_bpmp_suspend(struct device *dev)
  624. {
  625. struct tegra_bpmp *bpmp = dev_get_drvdata(dev);
  626. bpmp->suspended = true;
  627. return 0;
  628. }
  629. static int __maybe_unused tegra_bpmp_resume(struct device *dev)
  630. {
  631. struct tegra_bpmp *bpmp = dev_get_drvdata(dev);
  632. bpmp->suspended = false;
  633. if (bpmp->soc->ops->resume)
  634. return bpmp->soc->ops->resume(bpmp);
  635. else
  636. return 0;
  637. }
  638. static const struct dev_pm_ops tegra_bpmp_pm_ops = {
  639. .suspend_noirq = tegra_bpmp_suspend,
  640. .resume_noirq = tegra_bpmp_resume,
  641. };
  642. #if IS_ENABLED(CONFIG_ARCH_TEGRA_186_SOC) || \
  643. IS_ENABLED(CONFIG_ARCH_TEGRA_194_SOC) || \
  644. IS_ENABLED(CONFIG_ARCH_TEGRA_234_SOC) || \
  645. IS_ENABLED(CONFIG_ARCH_TEGRA_264_SOC)
  646. static const struct tegra_bpmp_soc tegra186_soc = {
  647. .channels = {
  648. .cpu_tx = {
  649. .offset = 3,
  650. .timeout = 60 * USEC_PER_SEC,
  651. },
  652. .thread = {
  653. .offset = 0,
  654. .count = 3,
  655. .timeout = 600 * USEC_PER_SEC,
  656. },
  657. .cpu_rx = {
  658. .offset = 13,
  659. .timeout = 0,
  660. },
  661. },
  662. .ops = &tegra186_bpmp_ops,
  663. .num_resets = 193,
  664. };
  665. #endif
  666. #if IS_ENABLED(CONFIG_ARCH_TEGRA_210_SOC)
  667. static const struct tegra_bpmp_soc tegra210_soc = {
  668. .channels = {
  669. .cpu_tx = {
  670. .offset = 0,
  671. .count = 1,
  672. .timeout = 60 * USEC_PER_SEC,
  673. },
  674. .thread = {
  675. .offset = 4,
  676. .count = 1,
  677. .timeout = 600 * USEC_PER_SEC,
  678. },
  679. .cpu_rx = {
  680. .offset = 8,
  681. .count = 1,
  682. .timeout = 0,
  683. },
  684. },
  685. .ops = &tegra210_bpmp_ops,
  686. };
  687. #endif
  688. static const struct of_device_id tegra_bpmp_match[] = {
  689. #if IS_ENABLED(CONFIG_ARCH_TEGRA_186_SOC) || \
  690. IS_ENABLED(CONFIG_ARCH_TEGRA_194_SOC) || \
  691. IS_ENABLED(CONFIG_ARCH_TEGRA_234_SOC) || \
  692. IS_ENABLED(CONFIG_ARCH_TEGRA_264_SOC)
  693. { .compatible = "nvidia,tegra186-bpmp", .data = &tegra186_soc },
  694. #endif
  695. #if IS_ENABLED(CONFIG_ARCH_TEGRA_210_SOC)
  696. { .compatible = "nvidia,tegra210-bpmp", .data = &tegra210_soc },
  697. #endif
  698. { }
  699. };
  700. static struct platform_driver tegra_bpmp_driver = {
  701. .driver = {
  702. .name = "tegra-bpmp",
  703. .of_match_table = tegra_bpmp_match,
  704. .pm = &tegra_bpmp_pm_ops,
  705. .suppress_bind_attrs = true,
  706. },
  707. .probe = tegra_bpmp_probe,
  708. };
  709. builtin_platform_driver(tegra_bpmp_driver);