rtkit.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965
  1. // SPDX-License-Identifier: GPL-2.0-only OR MIT
  2. /*
  3. * Apple RTKit IPC library
  4. * Copyright (C) The Asahi Linux Contributors
  5. */
  6. #include "rtkit-internal.h"
  7. enum {
  8. APPLE_RTKIT_PWR_STATE_OFF = 0x00, /* power off, cannot be restarted */
  9. APPLE_RTKIT_PWR_STATE_SLEEP = 0x01, /* sleeping, can be restarted */
  10. APPLE_RTKIT_PWR_STATE_QUIESCED = 0x10, /* running but no communication */
  11. APPLE_RTKIT_PWR_STATE_ON = 0x20, /* normal operating state */
  12. };
  13. enum {
  14. APPLE_RTKIT_EP_MGMT = 0,
  15. APPLE_RTKIT_EP_CRASHLOG = 1,
  16. APPLE_RTKIT_EP_SYSLOG = 2,
  17. APPLE_RTKIT_EP_DEBUG = 3,
  18. APPLE_RTKIT_EP_IOREPORT = 4,
  19. APPLE_RTKIT_EP_OSLOG = 8,
  20. };
  21. #define APPLE_RTKIT_MGMT_TYPE GENMASK_ULL(59, 52)
  22. enum {
  23. APPLE_RTKIT_MGMT_HELLO = 1,
  24. APPLE_RTKIT_MGMT_HELLO_REPLY = 2,
  25. APPLE_RTKIT_MGMT_STARTEP = 5,
  26. APPLE_RTKIT_MGMT_SET_IOP_PWR_STATE = 6,
  27. APPLE_RTKIT_MGMT_SET_IOP_PWR_STATE_ACK = 7,
  28. APPLE_RTKIT_MGMT_EPMAP = 8,
  29. APPLE_RTKIT_MGMT_EPMAP_REPLY = 8,
  30. APPLE_RTKIT_MGMT_SET_AP_PWR_STATE = 0xb,
  31. APPLE_RTKIT_MGMT_SET_AP_PWR_STATE_ACK = 0xb,
  32. };
  33. #define APPLE_RTKIT_MGMT_HELLO_MINVER GENMASK_ULL(15, 0)
  34. #define APPLE_RTKIT_MGMT_HELLO_MAXVER GENMASK_ULL(31, 16)
  35. #define APPLE_RTKIT_MGMT_EPMAP_LAST BIT_ULL(51)
  36. #define APPLE_RTKIT_MGMT_EPMAP_BASE GENMASK_ULL(34, 32)
  37. #define APPLE_RTKIT_MGMT_EPMAP_BITMAP GENMASK_ULL(31, 0)
  38. #define APPLE_RTKIT_MGMT_EPMAP_REPLY_MORE BIT_ULL(0)
  39. #define APPLE_RTKIT_MGMT_STARTEP_EP GENMASK_ULL(39, 32)
  40. #define APPLE_RTKIT_MGMT_STARTEP_FLAG BIT_ULL(1)
  41. #define APPLE_RTKIT_MGMT_PWR_STATE GENMASK_ULL(15, 0)
  42. #define APPLE_RTKIT_CRASHLOG_CRASH 1
  43. #define APPLE_RTKIT_BUFFER_REQUEST 1
  44. #define APPLE_RTKIT_BUFFER_REQUEST_SIZE GENMASK_ULL(51, 44)
  45. #define APPLE_RTKIT_BUFFER_REQUEST_IOVA GENMASK_ULL(41, 0)
  46. #define APPLE_RTKIT_SYSLOG_TYPE GENMASK_ULL(59, 52)
  47. #define APPLE_RTKIT_SYSLOG_LOG 5
  48. #define APPLE_RTKIT_SYSLOG_INIT 8
  49. #define APPLE_RTKIT_SYSLOG_N_ENTRIES GENMASK_ULL(7, 0)
  50. #define APPLE_RTKIT_SYSLOG_MSG_SIZE GENMASK_ULL(31, 24)
  51. #define APPLE_RTKIT_OSLOG_TYPE GENMASK_ULL(63, 56)
  52. #define APPLE_RTKIT_OSLOG_INIT 1
  53. #define APPLE_RTKIT_OSLOG_ACK 3
  54. #define APPLE_RTKIT_MIN_SUPPORTED_VERSION 11
  55. #define APPLE_RTKIT_MAX_SUPPORTED_VERSION 12
  56. struct apple_rtkit_msg {
  57. struct completion *completion;
  58. struct apple_mbox_msg mbox_msg;
  59. };
  60. struct apple_rtkit_rx_work {
  61. struct apple_rtkit *rtk;
  62. u8 ep;
  63. u64 msg;
  64. struct work_struct work;
  65. };
  66. bool apple_rtkit_is_running(struct apple_rtkit *rtk)
  67. {
  68. if (rtk->crashed)
  69. return false;
  70. if ((rtk->iop_power_state & 0xff) != APPLE_RTKIT_PWR_STATE_ON)
  71. return false;
  72. if ((rtk->ap_power_state & 0xff) != APPLE_RTKIT_PWR_STATE_ON)
  73. return false;
  74. return true;
  75. }
  76. EXPORT_SYMBOL_GPL(apple_rtkit_is_running);
  77. bool apple_rtkit_is_crashed(struct apple_rtkit *rtk)
  78. {
  79. return rtk->crashed;
  80. }
  81. EXPORT_SYMBOL_GPL(apple_rtkit_is_crashed);
  82. static void apple_rtkit_management_send(struct apple_rtkit *rtk, u8 type,
  83. u64 msg)
  84. {
  85. msg &= ~APPLE_RTKIT_MGMT_TYPE;
  86. msg |= FIELD_PREP(APPLE_RTKIT_MGMT_TYPE, type);
  87. apple_rtkit_send_message(rtk, APPLE_RTKIT_EP_MGMT, msg, NULL, false);
  88. }
  89. static void apple_rtkit_management_rx_hello(struct apple_rtkit *rtk, u64 msg)
  90. {
  91. u64 reply;
  92. int min_ver = FIELD_GET(APPLE_RTKIT_MGMT_HELLO_MINVER, msg);
  93. int max_ver = FIELD_GET(APPLE_RTKIT_MGMT_HELLO_MAXVER, msg);
  94. int want_ver = min(APPLE_RTKIT_MAX_SUPPORTED_VERSION, max_ver);
  95. dev_dbg(rtk->dev, "RTKit: Min ver %d, max ver %d\n", min_ver, max_ver);
  96. if (min_ver > APPLE_RTKIT_MAX_SUPPORTED_VERSION) {
  97. dev_err(rtk->dev, "RTKit: Firmware min version %d is too new\n",
  98. min_ver);
  99. goto abort_boot;
  100. }
  101. if (max_ver < APPLE_RTKIT_MIN_SUPPORTED_VERSION) {
  102. dev_err(rtk->dev, "RTKit: Firmware max version %d is too old\n",
  103. max_ver);
  104. goto abort_boot;
  105. }
  106. dev_info(rtk->dev, "RTKit: Initializing (protocol version %d)\n",
  107. want_ver);
  108. rtk->version = want_ver;
  109. reply = FIELD_PREP(APPLE_RTKIT_MGMT_HELLO_MINVER, want_ver);
  110. reply |= FIELD_PREP(APPLE_RTKIT_MGMT_HELLO_MAXVER, want_ver);
  111. apple_rtkit_management_send(rtk, APPLE_RTKIT_MGMT_HELLO_REPLY, reply);
  112. return;
  113. abort_boot:
  114. rtk->boot_result = -EINVAL;
  115. complete_all(&rtk->epmap_completion);
  116. }
  117. static void apple_rtkit_management_rx_epmap(struct apple_rtkit *rtk, u64 msg)
  118. {
  119. int i, ep;
  120. u64 reply;
  121. unsigned long bitmap = FIELD_GET(APPLE_RTKIT_MGMT_EPMAP_BITMAP, msg);
  122. u32 base = FIELD_GET(APPLE_RTKIT_MGMT_EPMAP_BASE, msg);
  123. dev_dbg(rtk->dev,
  124. "RTKit: received endpoint bitmap 0x%lx with base 0x%x\n",
  125. bitmap, base);
  126. for_each_set_bit(i, &bitmap, 32) {
  127. ep = 32 * base + i;
  128. dev_dbg(rtk->dev, "RTKit: Discovered endpoint 0x%02x\n", ep);
  129. set_bit(ep, rtk->endpoints);
  130. }
  131. reply = FIELD_PREP(APPLE_RTKIT_MGMT_EPMAP_BASE, base);
  132. if (msg & APPLE_RTKIT_MGMT_EPMAP_LAST)
  133. reply |= APPLE_RTKIT_MGMT_EPMAP_LAST;
  134. else
  135. reply |= APPLE_RTKIT_MGMT_EPMAP_REPLY_MORE;
  136. apple_rtkit_management_send(rtk, APPLE_RTKIT_MGMT_EPMAP_REPLY, reply);
  137. if (!(msg & APPLE_RTKIT_MGMT_EPMAP_LAST))
  138. return;
  139. for_each_set_bit(ep, rtk->endpoints, APPLE_RTKIT_APP_ENDPOINT_START) {
  140. switch (ep) {
  141. /* the management endpoint is started by default */
  142. case APPLE_RTKIT_EP_MGMT:
  143. break;
  144. /* without starting these RTKit refuses to boot */
  145. case APPLE_RTKIT_EP_SYSLOG:
  146. case APPLE_RTKIT_EP_CRASHLOG:
  147. case APPLE_RTKIT_EP_DEBUG:
  148. case APPLE_RTKIT_EP_IOREPORT:
  149. case APPLE_RTKIT_EP_OSLOG:
  150. dev_dbg(rtk->dev,
  151. "RTKit: Starting system endpoint 0x%02x\n", ep);
  152. apple_rtkit_start_ep(rtk, ep);
  153. break;
  154. default:
  155. dev_warn(rtk->dev,
  156. "RTKit: Unknown system endpoint: 0x%02x\n",
  157. ep);
  158. }
  159. }
  160. rtk->boot_result = 0;
  161. complete_all(&rtk->epmap_completion);
  162. }
  163. static void apple_rtkit_management_rx_iop_pwr_ack(struct apple_rtkit *rtk,
  164. u64 msg)
  165. {
  166. unsigned int new_state = FIELD_GET(APPLE_RTKIT_MGMT_PWR_STATE, msg);
  167. dev_dbg(rtk->dev, "RTKit: IOP power state transition: 0x%x -> 0x%x\n",
  168. rtk->iop_power_state, new_state);
  169. rtk->iop_power_state = new_state;
  170. complete_all(&rtk->iop_pwr_ack_completion);
  171. }
  172. static void apple_rtkit_management_rx_ap_pwr_ack(struct apple_rtkit *rtk,
  173. u64 msg)
  174. {
  175. unsigned int new_state = FIELD_GET(APPLE_RTKIT_MGMT_PWR_STATE, msg);
  176. dev_dbg(rtk->dev, "RTKit: AP power state transition: 0x%x -> 0x%x\n",
  177. rtk->ap_power_state, new_state);
  178. rtk->ap_power_state = new_state;
  179. complete_all(&rtk->ap_pwr_ack_completion);
  180. }
  181. static void apple_rtkit_management_rx(struct apple_rtkit *rtk, u64 msg)
  182. {
  183. u8 type = FIELD_GET(APPLE_RTKIT_MGMT_TYPE, msg);
  184. switch (type) {
  185. case APPLE_RTKIT_MGMT_HELLO:
  186. apple_rtkit_management_rx_hello(rtk, msg);
  187. break;
  188. case APPLE_RTKIT_MGMT_EPMAP:
  189. apple_rtkit_management_rx_epmap(rtk, msg);
  190. break;
  191. case APPLE_RTKIT_MGMT_SET_IOP_PWR_STATE_ACK:
  192. apple_rtkit_management_rx_iop_pwr_ack(rtk, msg);
  193. break;
  194. case APPLE_RTKIT_MGMT_SET_AP_PWR_STATE_ACK:
  195. apple_rtkit_management_rx_ap_pwr_ack(rtk, msg);
  196. break;
  197. default:
  198. dev_warn(
  199. rtk->dev,
  200. "RTKit: unknown management message: 0x%llx (type: 0x%02x)\n",
  201. msg, type);
  202. }
  203. }
  204. static int apple_rtkit_common_rx_get_buffer(struct apple_rtkit *rtk,
  205. struct apple_rtkit_shmem *buffer,
  206. u8 ep, u64 msg)
  207. {
  208. size_t n_4kpages = FIELD_GET(APPLE_RTKIT_BUFFER_REQUEST_SIZE, msg);
  209. u64 reply;
  210. int err;
  211. buffer->buffer = NULL;
  212. buffer->iomem = NULL;
  213. buffer->is_mapped = false;
  214. buffer->iova = FIELD_GET(APPLE_RTKIT_BUFFER_REQUEST_IOVA, msg);
  215. buffer->size = n_4kpages << 12;
  216. dev_dbg(rtk->dev, "RTKit: buffer request for 0x%zx bytes at %pad\n",
  217. buffer->size, &buffer->iova);
  218. if (buffer->iova &&
  219. (!rtk->ops->shmem_setup || !rtk->ops->shmem_destroy)) {
  220. err = -EINVAL;
  221. goto error;
  222. }
  223. if (rtk->ops->shmem_setup) {
  224. err = rtk->ops->shmem_setup(rtk->cookie, buffer);
  225. if (err)
  226. goto error;
  227. } else {
  228. buffer->buffer = dma_alloc_coherent(rtk->dev, buffer->size,
  229. &buffer->iova, GFP_KERNEL);
  230. if (!buffer->buffer) {
  231. err = -ENOMEM;
  232. goto error;
  233. }
  234. }
  235. if (!buffer->is_mapped) {
  236. reply = FIELD_PREP(APPLE_RTKIT_SYSLOG_TYPE,
  237. APPLE_RTKIT_BUFFER_REQUEST);
  238. reply |= FIELD_PREP(APPLE_RTKIT_BUFFER_REQUEST_SIZE, n_4kpages);
  239. reply |= FIELD_PREP(APPLE_RTKIT_BUFFER_REQUEST_IOVA,
  240. buffer->iova);
  241. apple_rtkit_send_message(rtk, ep, reply, NULL, false);
  242. }
  243. return 0;
  244. error:
  245. buffer->buffer = NULL;
  246. buffer->iomem = NULL;
  247. buffer->iova = 0;
  248. buffer->size = 0;
  249. buffer->is_mapped = false;
  250. return err;
  251. }
  252. static void apple_rtkit_free_buffer(struct apple_rtkit *rtk,
  253. struct apple_rtkit_shmem *bfr)
  254. {
  255. if (bfr->size == 0)
  256. return;
  257. if (rtk->ops->shmem_destroy)
  258. rtk->ops->shmem_destroy(rtk->cookie, bfr);
  259. else if (bfr->buffer)
  260. dma_free_coherent(rtk->dev, bfr->size, bfr->buffer, bfr->iova);
  261. bfr->buffer = NULL;
  262. bfr->iomem = NULL;
  263. bfr->iova = 0;
  264. bfr->size = 0;
  265. bfr->is_mapped = false;
  266. }
  267. static void apple_rtkit_memcpy(struct apple_rtkit *rtk, void *dst,
  268. struct apple_rtkit_shmem *bfr, size_t offset,
  269. size_t len)
  270. {
  271. if (bfr->iomem)
  272. memcpy_fromio(dst, bfr->iomem + offset, len);
  273. else
  274. memcpy(dst, bfr->buffer + offset, len);
  275. }
  276. static void apple_rtkit_crashlog_rx(struct apple_rtkit *rtk, u64 msg)
  277. {
  278. u8 type = FIELD_GET(APPLE_RTKIT_SYSLOG_TYPE, msg);
  279. u8 *bfr;
  280. if (type != APPLE_RTKIT_CRASHLOG_CRASH) {
  281. dev_warn(rtk->dev, "RTKit: Unknown crashlog message: %llx\n",
  282. msg);
  283. return;
  284. }
  285. if (!rtk->crashlog_buffer.size) {
  286. apple_rtkit_common_rx_get_buffer(rtk, &rtk->crashlog_buffer,
  287. APPLE_RTKIT_EP_CRASHLOG, msg);
  288. return;
  289. }
  290. dev_err(rtk->dev, "RTKit: co-processor has crashed\n");
  291. /*
  292. * create a shadow copy here to make sure the co-processor isn't able
  293. * to change the log while we're dumping it. this also ensures
  294. * the buffer is in normal memory and not iomem for e.g. the SMC
  295. */
  296. bfr = kzalloc(rtk->crashlog_buffer.size, GFP_KERNEL);
  297. if (bfr) {
  298. apple_rtkit_memcpy(rtk, bfr, &rtk->crashlog_buffer, 0,
  299. rtk->crashlog_buffer.size);
  300. apple_rtkit_crashlog_dump(rtk, bfr, rtk->crashlog_buffer.size);
  301. kfree(bfr);
  302. } else {
  303. dev_err(rtk->dev,
  304. "RTKit: Couldn't allocate crashlog shadow buffer\n");
  305. }
  306. rtk->crashed = true;
  307. if (rtk->ops->crashed)
  308. rtk->ops->crashed(rtk->cookie);
  309. }
  310. static void apple_rtkit_ioreport_rx(struct apple_rtkit *rtk, u64 msg)
  311. {
  312. u8 type = FIELD_GET(APPLE_RTKIT_SYSLOG_TYPE, msg);
  313. switch (type) {
  314. case APPLE_RTKIT_BUFFER_REQUEST:
  315. apple_rtkit_common_rx_get_buffer(rtk, &rtk->ioreport_buffer,
  316. APPLE_RTKIT_EP_IOREPORT, msg);
  317. break;
  318. /* unknown, must be ACKed or the co-processor will hang */
  319. case 0x8:
  320. case 0xc:
  321. apple_rtkit_send_message(rtk, APPLE_RTKIT_EP_IOREPORT, msg,
  322. NULL, false);
  323. break;
  324. default:
  325. dev_warn(rtk->dev, "RTKit: Unknown ioreport message: %llx\n",
  326. msg);
  327. }
  328. }
  329. static void apple_rtkit_syslog_rx_init(struct apple_rtkit *rtk, u64 msg)
  330. {
  331. rtk->syslog_n_entries = FIELD_GET(APPLE_RTKIT_SYSLOG_N_ENTRIES, msg);
  332. rtk->syslog_msg_size = FIELD_GET(APPLE_RTKIT_SYSLOG_MSG_SIZE, msg);
  333. rtk->syslog_msg_buffer = kzalloc(rtk->syslog_msg_size, GFP_KERNEL);
  334. dev_dbg(rtk->dev,
  335. "RTKit: syslog initialized: entries: %zd, msg_size: %zd\n",
  336. rtk->syslog_n_entries, rtk->syslog_msg_size);
  337. }
  338. static void apple_rtkit_syslog_rx_log(struct apple_rtkit *rtk, u64 msg)
  339. {
  340. u8 idx = msg & 0xff;
  341. char log_context[24];
  342. size_t entry_size = 0x20 + rtk->syslog_msg_size;
  343. if (!rtk->syslog_msg_buffer) {
  344. dev_warn(
  345. rtk->dev,
  346. "RTKit: received syslog message but no syslog_msg_buffer\n");
  347. goto done;
  348. }
  349. if (!rtk->syslog_buffer.size) {
  350. dev_warn(
  351. rtk->dev,
  352. "RTKit: received syslog message but syslog_buffer.size is zero\n");
  353. goto done;
  354. }
  355. if (!rtk->syslog_buffer.buffer && !rtk->syslog_buffer.iomem) {
  356. dev_warn(
  357. rtk->dev,
  358. "RTKit: received syslog message but no syslog_buffer.buffer or syslog_buffer.iomem\n");
  359. goto done;
  360. }
  361. if (idx > rtk->syslog_n_entries) {
  362. dev_warn(rtk->dev, "RTKit: syslog index %d out of range\n",
  363. idx);
  364. goto done;
  365. }
  366. apple_rtkit_memcpy(rtk, log_context, &rtk->syslog_buffer,
  367. idx * entry_size + 8, sizeof(log_context));
  368. apple_rtkit_memcpy(rtk, rtk->syslog_msg_buffer, &rtk->syslog_buffer,
  369. idx * entry_size + 8 + sizeof(log_context),
  370. rtk->syslog_msg_size);
  371. log_context[sizeof(log_context) - 1] = 0;
  372. rtk->syslog_msg_buffer[rtk->syslog_msg_size - 1] = 0;
  373. dev_info(rtk->dev, "RTKit: syslog message: %s: %s\n", log_context,
  374. rtk->syslog_msg_buffer);
  375. done:
  376. apple_rtkit_send_message(rtk, APPLE_RTKIT_EP_SYSLOG, msg, NULL, false);
  377. }
  378. static void apple_rtkit_syslog_rx(struct apple_rtkit *rtk, u64 msg)
  379. {
  380. u8 type = FIELD_GET(APPLE_RTKIT_SYSLOG_TYPE, msg);
  381. switch (type) {
  382. case APPLE_RTKIT_BUFFER_REQUEST:
  383. apple_rtkit_common_rx_get_buffer(rtk, &rtk->syslog_buffer,
  384. APPLE_RTKIT_EP_SYSLOG, msg);
  385. break;
  386. case APPLE_RTKIT_SYSLOG_INIT:
  387. apple_rtkit_syslog_rx_init(rtk, msg);
  388. break;
  389. case APPLE_RTKIT_SYSLOG_LOG:
  390. apple_rtkit_syslog_rx_log(rtk, msg);
  391. break;
  392. default:
  393. dev_warn(rtk->dev, "RTKit: Unknown syslog message: %llx\n",
  394. msg);
  395. }
  396. }
  397. static void apple_rtkit_oslog_rx_init(struct apple_rtkit *rtk, u64 msg)
  398. {
  399. u64 ack;
  400. dev_dbg(rtk->dev, "RTKit: oslog init: msg: 0x%llx\n", msg);
  401. ack = FIELD_PREP(APPLE_RTKIT_OSLOG_TYPE, APPLE_RTKIT_OSLOG_ACK);
  402. apple_rtkit_send_message(rtk, APPLE_RTKIT_EP_OSLOG, ack, NULL, false);
  403. }
  404. static void apple_rtkit_oslog_rx(struct apple_rtkit *rtk, u64 msg)
  405. {
  406. u8 type = FIELD_GET(APPLE_RTKIT_OSLOG_TYPE, msg);
  407. switch (type) {
  408. case APPLE_RTKIT_OSLOG_INIT:
  409. apple_rtkit_oslog_rx_init(rtk, msg);
  410. break;
  411. default:
  412. dev_warn(rtk->dev, "RTKit: Unknown oslog message: %llx\n", msg);
  413. }
  414. }
  415. static void apple_rtkit_rx_work(struct work_struct *work)
  416. {
  417. struct apple_rtkit_rx_work *rtk_work =
  418. container_of(work, struct apple_rtkit_rx_work, work);
  419. struct apple_rtkit *rtk = rtk_work->rtk;
  420. switch (rtk_work->ep) {
  421. case APPLE_RTKIT_EP_MGMT:
  422. apple_rtkit_management_rx(rtk, rtk_work->msg);
  423. break;
  424. case APPLE_RTKIT_EP_CRASHLOG:
  425. apple_rtkit_crashlog_rx(rtk, rtk_work->msg);
  426. break;
  427. case APPLE_RTKIT_EP_SYSLOG:
  428. apple_rtkit_syslog_rx(rtk, rtk_work->msg);
  429. break;
  430. case APPLE_RTKIT_EP_IOREPORT:
  431. apple_rtkit_ioreport_rx(rtk, rtk_work->msg);
  432. break;
  433. case APPLE_RTKIT_EP_OSLOG:
  434. apple_rtkit_oslog_rx(rtk, rtk_work->msg);
  435. break;
  436. case APPLE_RTKIT_APP_ENDPOINT_START ... 0xff:
  437. if (rtk->ops->recv_message)
  438. rtk->ops->recv_message(rtk->cookie, rtk_work->ep,
  439. rtk_work->msg);
  440. else
  441. dev_warn(
  442. rtk->dev,
  443. "Received unexpected message to EP%02d: %llx\n",
  444. rtk_work->ep, rtk_work->msg);
  445. break;
  446. default:
  447. dev_warn(rtk->dev,
  448. "RTKit: message to unknown endpoint %02x: %llx\n",
  449. rtk_work->ep, rtk_work->msg);
  450. }
  451. kfree(rtk_work);
  452. }
  453. static void apple_rtkit_rx(struct mbox_client *cl, void *mssg)
  454. {
  455. struct apple_rtkit *rtk = container_of(cl, struct apple_rtkit, mbox_cl);
  456. struct apple_mbox_msg *msg = mssg;
  457. struct apple_rtkit_rx_work *work;
  458. u8 ep = msg->msg1;
  459. /*
  460. * The message was read from a MMIO FIFO and we have to make
  461. * sure all reads from buffers sent with that message happen
  462. * afterwards.
  463. */
  464. dma_rmb();
  465. if (!test_bit(ep, rtk->endpoints))
  466. dev_warn(rtk->dev,
  467. "RTKit: Message to undiscovered endpoint 0x%02x\n",
  468. ep);
  469. if (ep >= APPLE_RTKIT_APP_ENDPOINT_START &&
  470. rtk->ops->recv_message_early &&
  471. rtk->ops->recv_message_early(rtk->cookie, ep, msg->msg0))
  472. return;
  473. work = kzalloc(sizeof(*work), GFP_ATOMIC);
  474. if (!work)
  475. return;
  476. work->rtk = rtk;
  477. work->ep = ep;
  478. work->msg = msg->msg0;
  479. INIT_WORK(&work->work, apple_rtkit_rx_work);
  480. queue_work(rtk->wq, &work->work);
  481. }
  482. static void apple_rtkit_tx_done(struct mbox_client *cl, void *mssg, int r)
  483. {
  484. struct apple_rtkit_msg *msg =
  485. container_of(mssg, struct apple_rtkit_msg, mbox_msg);
  486. if (r == -ETIME)
  487. return;
  488. if (msg->completion)
  489. complete(msg->completion);
  490. kfree(msg);
  491. }
  492. int apple_rtkit_send_message(struct apple_rtkit *rtk, u8 ep, u64 message,
  493. struct completion *completion, bool atomic)
  494. {
  495. struct apple_rtkit_msg *msg;
  496. int ret;
  497. gfp_t flags;
  498. if (rtk->crashed)
  499. return -EINVAL;
  500. if (ep >= APPLE_RTKIT_APP_ENDPOINT_START &&
  501. !apple_rtkit_is_running(rtk))
  502. return -EINVAL;
  503. if (atomic)
  504. flags = GFP_ATOMIC;
  505. else
  506. flags = GFP_KERNEL;
  507. msg = kzalloc(sizeof(*msg), flags);
  508. if (!msg)
  509. return -ENOMEM;
  510. msg->mbox_msg.msg0 = message;
  511. msg->mbox_msg.msg1 = ep;
  512. msg->completion = completion;
  513. /*
  514. * The message will be sent with a MMIO write. We need the barrier
  515. * here to ensure any previous writes to buffers are visible to the
  516. * device before that MMIO write happens.
  517. */
  518. dma_wmb();
  519. ret = mbox_send_message(rtk->mbox_chan, &msg->mbox_msg);
  520. if (ret < 0) {
  521. kfree(msg);
  522. return ret;
  523. }
  524. return 0;
  525. }
  526. EXPORT_SYMBOL_GPL(apple_rtkit_send_message);
  527. int apple_rtkit_send_message_wait(struct apple_rtkit *rtk, u8 ep, u64 message,
  528. unsigned long timeout, bool atomic)
  529. {
  530. DECLARE_COMPLETION_ONSTACK(completion);
  531. int ret;
  532. long t;
  533. ret = apple_rtkit_send_message(rtk, ep, message, &completion, atomic);
  534. if (ret < 0)
  535. return ret;
  536. if (atomic) {
  537. ret = mbox_flush(rtk->mbox_chan, timeout);
  538. if (ret < 0)
  539. return ret;
  540. if (try_wait_for_completion(&completion))
  541. return 0;
  542. return -ETIME;
  543. } else {
  544. t = wait_for_completion_interruptible_timeout(
  545. &completion, msecs_to_jiffies(timeout));
  546. if (t < 0)
  547. return t;
  548. else if (t == 0)
  549. return -ETIME;
  550. return 0;
  551. }
  552. }
  553. EXPORT_SYMBOL_GPL(apple_rtkit_send_message_wait);
  554. int apple_rtkit_poll(struct apple_rtkit *rtk)
  555. {
  556. return mbox_client_peek_data(rtk->mbox_chan);
  557. }
  558. EXPORT_SYMBOL_GPL(apple_rtkit_poll);
  559. int apple_rtkit_start_ep(struct apple_rtkit *rtk, u8 endpoint)
  560. {
  561. u64 msg;
  562. if (!test_bit(endpoint, rtk->endpoints))
  563. return -EINVAL;
  564. if (endpoint >= APPLE_RTKIT_APP_ENDPOINT_START &&
  565. !apple_rtkit_is_running(rtk))
  566. return -EINVAL;
  567. msg = FIELD_PREP(APPLE_RTKIT_MGMT_STARTEP_EP, endpoint);
  568. msg |= APPLE_RTKIT_MGMT_STARTEP_FLAG;
  569. apple_rtkit_management_send(rtk, APPLE_RTKIT_MGMT_STARTEP, msg);
  570. return 0;
  571. }
  572. EXPORT_SYMBOL_GPL(apple_rtkit_start_ep);
  573. static int apple_rtkit_request_mbox_chan(struct apple_rtkit *rtk)
  574. {
  575. if (rtk->mbox_name)
  576. rtk->mbox_chan = mbox_request_channel_byname(&rtk->mbox_cl,
  577. rtk->mbox_name);
  578. else
  579. rtk->mbox_chan =
  580. mbox_request_channel(&rtk->mbox_cl, rtk->mbox_idx);
  581. if (IS_ERR(rtk->mbox_chan))
  582. return PTR_ERR(rtk->mbox_chan);
  583. return 0;
  584. }
  585. static struct apple_rtkit *apple_rtkit_init(struct device *dev, void *cookie,
  586. const char *mbox_name, int mbox_idx,
  587. const struct apple_rtkit_ops *ops)
  588. {
  589. struct apple_rtkit *rtk;
  590. int ret;
  591. if (!ops)
  592. return ERR_PTR(-EINVAL);
  593. rtk = kzalloc(sizeof(*rtk), GFP_KERNEL);
  594. if (!rtk)
  595. return ERR_PTR(-ENOMEM);
  596. rtk->dev = dev;
  597. rtk->cookie = cookie;
  598. rtk->ops = ops;
  599. init_completion(&rtk->epmap_completion);
  600. init_completion(&rtk->iop_pwr_ack_completion);
  601. init_completion(&rtk->ap_pwr_ack_completion);
  602. bitmap_zero(rtk->endpoints, APPLE_RTKIT_MAX_ENDPOINTS);
  603. set_bit(APPLE_RTKIT_EP_MGMT, rtk->endpoints);
  604. rtk->mbox_name = mbox_name;
  605. rtk->mbox_idx = mbox_idx;
  606. rtk->mbox_cl.dev = dev;
  607. rtk->mbox_cl.tx_block = false;
  608. rtk->mbox_cl.knows_txdone = false;
  609. rtk->mbox_cl.rx_callback = &apple_rtkit_rx;
  610. rtk->mbox_cl.tx_done = &apple_rtkit_tx_done;
  611. rtk->wq = alloc_ordered_workqueue("rtkit-%s", WQ_MEM_RECLAIM,
  612. dev_name(rtk->dev));
  613. if (!rtk->wq) {
  614. ret = -ENOMEM;
  615. goto free_rtk;
  616. }
  617. ret = apple_rtkit_request_mbox_chan(rtk);
  618. if (ret)
  619. goto destroy_wq;
  620. return rtk;
  621. destroy_wq:
  622. destroy_workqueue(rtk->wq);
  623. free_rtk:
  624. kfree(rtk);
  625. return ERR_PTR(ret);
  626. }
  627. static int apple_rtkit_wait_for_completion(struct completion *c)
  628. {
  629. long t;
  630. t = wait_for_completion_interruptible_timeout(c,
  631. msecs_to_jiffies(1000));
  632. if (t < 0)
  633. return t;
  634. else if (t == 0)
  635. return -ETIME;
  636. else
  637. return 0;
  638. }
  639. int apple_rtkit_reinit(struct apple_rtkit *rtk)
  640. {
  641. /* make sure we don't handle any messages while reinitializing */
  642. mbox_free_channel(rtk->mbox_chan);
  643. flush_workqueue(rtk->wq);
  644. apple_rtkit_free_buffer(rtk, &rtk->ioreport_buffer);
  645. apple_rtkit_free_buffer(rtk, &rtk->crashlog_buffer);
  646. apple_rtkit_free_buffer(rtk, &rtk->syslog_buffer);
  647. kfree(rtk->syslog_msg_buffer);
  648. rtk->syslog_msg_buffer = NULL;
  649. rtk->syslog_n_entries = 0;
  650. rtk->syslog_msg_size = 0;
  651. bitmap_zero(rtk->endpoints, APPLE_RTKIT_MAX_ENDPOINTS);
  652. set_bit(APPLE_RTKIT_EP_MGMT, rtk->endpoints);
  653. reinit_completion(&rtk->epmap_completion);
  654. reinit_completion(&rtk->iop_pwr_ack_completion);
  655. reinit_completion(&rtk->ap_pwr_ack_completion);
  656. rtk->crashed = false;
  657. rtk->iop_power_state = APPLE_RTKIT_PWR_STATE_OFF;
  658. rtk->ap_power_state = APPLE_RTKIT_PWR_STATE_OFF;
  659. return apple_rtkit_request_mbox_chan(rtk);
  660. }
  661. EXPORT_SYMBOL_GPL(apple_rtkit_reinit);
  662. static int apple_rtkit_set_ap_power_state(struct apple_rtkit *rtk,
  663. unsigned int state)
  664. {
  665. u64 msg;
  666. int ret;
  667. reinit_completion(&rtk->ap_pwr_ack_completion);
  668. msg = FIELD_PREP(APPLE_RTKIT_MGMT_PWR_STATE, state);
  669. apple_rtkit_management_send(rtk, APPLE_RTKIT_MGMT_SET_AP_PWR_STATE,
  670. msg);
  671. ret = apple_rtkit_wait_for_completion(&rtk->ap_pwr_ack_completion);
  672. if (ret)
  673. return ret;
  674. if (rtk->ap_power_state != state)
  675. return -EINVAL;
  676. return 0;
  677. }
  678. static int apple_rtkit_set_iop_power_state(struct apple_rtkit *rtk,
  679. unsigned int state)
  680. {
  681. u64 msg;
  682. int ret;
  683. reinit_completion(&rtk->iop_pwr_ack_completion);
  684. msg = FIELD_PREP(APPLE_RTKIT_MGMT_PWR_STATE, state);
  685. apple_rtkit_management_send(rtk, APPLE_RTKIT_MGMT_SET_IOP_PWR_STATE,
  686. msg);
  687. ret = apple_rtkit_wait_for_completion(&rtk->iop_pwr_ack_completion);
  688. if (ret)
  689. return ret;
  690. if (rtk->iop_power_state != state)
  691. return -EINVAL;
  692. return 0;
  693. }
  694. int apple_rtkit_boot(struct apple_rtkit *rtk)
  695. {
  696. int ret;
  697. if (apple_rtkit_is_running(rtk))
  698. return 0;
  699. if (rtk->crashed)
  700. return -EINVAL;
  701. dev_dbg(rtk->dev, "RTKit: waiting for boot to finish\n");
  702. ret = apple_rtkit_wait_for_completion(&rtk->epmap_completion);
  703. if (ret)
  704. return ret;
  705. if (rtk->boot_result)
  706. return rtk->boot_result;
  707. dev_dbg(rtk->dev, "RTKit: waiting for IOP power state ACK\n");
  708. ret = apple_rtkit_wait_for_completion(&rtk->iop_pwr_ack_completion);
  709. if (ret)
  710. return ret;
  711. return apple_rtkit_set_ap_power_state(rtk, APPLE_RTKIT_PWR_STATE_ON);
  712. }
  713. EXPORT_SYMBOL_GPL(apple_rtkit_boot);
  714. int apple_rtkit_shutdown(struct apple_rtkit *rtk)
  715. {
  716. int ret;
  717. /* if OFF is used here the co-processor will not wake up again */
  718. ret = apple_rtkit_set_ap_power_state(rtk,
  719. APPLE_RTKIT_PWR_STATE_QUIESCED);
  720. if (ret)
  721. return ret;
  722. ret = apple_rtkit_set_iop_power_state(rtk, APPLE_RTKIT_PWR_STATE_SLEEP);
  723. if (ret)
  724. return ret;
  725. return apple_rtkit_reinit(rtk);
  726. }
  727. EXPORT_SYMBOL_GPL(apple_rtkit_shutdown);
  728. int apple_rtkit_quiesce(struct apple_rtkit *rtk)
  729. {
  730. int ret;
  731. ret = apple_rtkit_set_ap_power_state(rtk,
  732. APPLE_RTKIT_PWR_STATE_QUIESCED);
  733. if (ret)
  734. return ret;
  735. ret = apple_rtkit_set_iop_power_state(rtk,
  736. APPLE_RTKIT_PWR_STATE_QUIESCED);
  737. if (ret)
  738. return ret;
  739. ret = apple_rtkit_reinit(rtk);
  740. if (ret)
  741. return ret;
  742. rtk->iop_power_state = APPLE_RTKIT_PWR_STATE_QUIESCED;
  743. rtk->ap_power_state = APPLE_RTKIT_PWR_STATE_QUIESCED;
  744. return 0;
  745. }
  746. EXPORT_SYMBOL_GPL(apple_rtkit_quiesce);
  747. int apple_rtkit_wake(struct apple_rtkit *rtk)
  748. {
  749. u64 msg;
  750. if (apple_rtkit_is_running(rtk))
  751. return -EINVAL;
  752. reinit_completion(&rtk->iop_pwr_ack_completion);
  753. /*
  754. * Use open-coded apple_rtkit_set_iop_power_state since apple_rtkit_boot
  755. * will wait for the completion anyway.
  756. */
  757. msg = FIELD_PREP(APPLE_RTKIT_MGMT_PWR_STATE, APPLE_RTKIT_PWR_STATE_ON);
  758. apple_rtkit_management_send(rtk, APPLE_RTKIT_MGMT_SET_IOP_PWR_STATE,
  759. msg);
  760. return apple_rtkit_boot(rtk);
  761. }
  762. EXPORT_SYMBOL_GPL(apple_rtkit_wake);
  763. static void apple_rtkit_free(void *data)
  764. {
  765. struct apple_rtkit *rtk = data;
  766. mbox_free_channel(rtk->mbox_chan);
  767. destroy_workqueue(rtk->wq);
  768. apple_rtkit_free_buffer(rtk, &rtk->ioreport_buffer);
  769. apple_rtkit_free_buffer(rtk, &rtk->crashlog_buffer);
  770. apple_rtkit_free_buffer(rtk, &rtk->syslog_buffer);
  771. kfree(rtk->syslog_msg_buffer);
  772. kfree(rtk);
  773. }
  774. struct apple_rtkit *devm_apple_rtkit_init(struct device *dev, void *cookie,
  775. const char *mbox_name, int mbox_idx,
  776. const struct apple_rtkit_ops *ops)
  777. {
  778. struct apple_rtkit *rtk;
  779. int ret;
  780. rtk = apple_rtkit_init(dev, cookie, mbox_name, mbox_idx, ops);
  781. if (IS_ERR(rtk))
  782. return rtk;
  783. ret = devm_add_action_or_reset(dev, apple_rtkit_free, rtk);
  784. if (ret)
  785. return ERR_PTR(ret);
  786. return rtk;
  787. }
  788. EXPORT_SYMBOL_GPL(devm_apple_rtkit_init);
  789. MODULE_LICENSE("Dual MIT/GPL");
  790. MODULE_AUTHOR("Sven Peter <[email protected]>");
  791. MODULE_DESCRIPTION("Apple RTKit driver");