rtkit.c 25 KB

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