tee-dev.c 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  1. // SPDX-License-Identifier: MIT
  2. /*
  3. * AMD Trusted Execution Environment (TEE) interface
  4. *
  5. * Author: Rijo Thomas <Rijo-john.Thomas@amd.com>
  6. * Author: Devaraj Rangasamy <Devaraj.Rangasamy@amd.com>
  7. *
  8. * Copyright (C) 2019,2021 Advanced Micro Devices, Inc.
  9. */
  10. #include <linux/bitfield.h>
  11. #include <linux/types.h>
  12. #include <linux/mutex.h>
  13. #include <linux/delay.h>
  14. #include <linux/slab.h>
  15. #include <linux/gfp.h>
  16. #include <linux/psp.h>
  17. #include <linux/psp-tee.h>
  18. #include "psp-dev.h"
  19. #include "tee-dev.h"
  20. static bool psp_dead;
  21. static int tee_alloc_ring(struct psp_tee_device *tee, int ring_size)
  22. {
  23. struct ring_buf_manager *rb_mgr = &tee->rb_mgr;
  24. void *start_addr;
  25. if (!ring_size)
  26. return -EINVAL;
  27. /* We need actual physical address instead of DMA address, since
  28. * Trusted OS running on AMD Secure Processor will map this region
  29. */
  30. start_addr = (void *)__get_free_pages(GFP_KERNEL, get_order(ring_size));
  31. if (!start_addr)
  32. return -ENOMEM;
  33. memset(start_addr, 0x0, ring_size);
  34. rb_mgr->ring_start = start_addr;
  35. rb_mgr->ring_size = ring_size;
  36. rb_mgr->ring_pa = __psp_pa(start_addr);
  37. mutex_init(&rb_mgr->mutex);
  38. return 0;
  39. }
  40. static void tee_free_ring(struct psp_tee_device *tee)
  41. {
  42. struct ring_buf_manager *rb_mgr = &tee->rb_mgr;
  43. if (!rb_mgr->ring_start)
  44. return;
  45. free_pages((unsigned long)rb_mgr->ring_start,
  46. get_order(rb_mgr->ring_size));
  47. rb_mgr->ring_start = NULL;
  48. rb_mgr->ring_size = 0;
  49. rb_mgr->ring_pa = 0;
  50. mutex_destroy(&rb_mgr->mutex);
  51. }
  52. static
  53. struct tee_init_ring_cmd *tee_alloc_cmd_buffer(struct psp_tee_device *tee)
  54. {
  55. struct tee_init_ring_cmd *cmd;
  56. cmd = kzalloc_obj(*cmd);
  57. if (!cmd)
  58. return NULL;
  59. cmd->hi_addr = upper_32_bits(tee->rb_mgr.ring_pa);
  60. cmd->low_addr = lower_32_bits(tee->rb_mgr.ring_pa);
  61. cmd->size = tee->rb_mgr.ring_size;
  62. dev_dbg(tee->dev, "tee: ring address: high = 0x%x low = 0x%x size = %u\n",
  63. cmd->hi_addr, cmd->low_addr, cmd->size);
  64. return cmd;
  65. }
  66. static inline void tee_free_cmd_buffer(struct tee_init_ring_cmd *cmd)
  67. {
  68. kfree(cmd);
  69. }
  70. static bool tee_send_destroy_cmd(struct psp_tee_device *tee)
  71. {
  72. unsigned int reg;
  73. int ret;
  74. ret = psp_mailbox_command(tee->psp, PSP_CMD_TEE_RING_DESTROY, NULL,
  75. TEE_DEFAULT_CMD_TIMEOUT, &reg);
  76. if (ret) {
  77. dev_err(tee->dev, "tee: ring destroy command timed out, disabling TEE support\n");
  78. psp_dead = true;
  79. return false;
  80. }
  81. if (FIELD_GET(PSP_CMDRESP_STS, reg)) {
  82. dev_err(tee->dev, "tee: ring destroy command failed (%#010lx)\n",
  83. FIELD_GET(PSP_CMDRESP_STS, reg));
  84. psp_dead = true;
  85. return false;
  86. }
  87. return true;
  88. }
  89. static int tee_init_ring(struct psp_tee_device *tee)
  90. {
  91. int ring_size = MAX_RING_BUFFER_ENTRIES * sizeof(struct tee_ring_cmd);
  92. struct tee_init_ring_cmd *cmd;
  93. bool retry = false;
  94. unsigned int reg;
  95. int ret;
  96. BUILD_BUG_ON(sizeof(struct tee_ring_cmd) != 1024);
  97. ret = tee_alloc_ring(tee, ring_size);
  98. if (ret) {
  99. dev_err(tee->dev, "tee: ring allocation failed %d\n", ret);
  100. return ret;
  101. }
  102. tee->rb_mgr.wptr = 0;
  103. cmd = tee_alloc_cmd_buffer(tee);
  104. if (!cmd) {
  105. tee_free_ring(tee);
  106. return -ENOMEM;
  107. }
  108. /* Send command buffer details to Trusted OS by writing to
  109. * CPU-PSP message registers
  110. */
  111. retry_init:
  112. ret = psp_mailbox_command(tee->psp, PSP_CMD_TEE_RING_INIT, cmd,
  113. TEE_DEFAULT_CMD_TIMEOUT, &reg);
  114. if (ret) {
  115. dev_err(tee->dev, "tee: ring init command timed out, disabling TEE support\n");
  116. tee_free_ring(tee);
  117. psp_dead = true;
  118. goto free_buf;
  119. }
  120. if (FIELD_GET(PSP_CMDRESP_STS, reg)) {
  121. /*
  122. * During the hibernate resume sequence driver may have gotten loaded
  123. * but the ring not properly destroyed. If the ring doesn't work, try
  124. * to destroy and re-init once.
  125. */
  126. if (!retry && FIELD_GET(PSP_CMDRESP_STS, reg) == PSP_TEE_STS_RING_BUSY) {
  127. dev_info(tee->dev, "tee: ring init command failed with busy status, retrying\n");
  128. if (tee_send_destroy_cmd(tee)) {
  129. retry = true;
  130. goto retry_init;
  131. }
  132. }
  133. dev_err(tee->dev, "tee: ring init command failed (%#010lx)\n",
  134. FIELD_GET(PSP_CMDRESP_STS, reg));
  135. tee_free_ring(tee);
  136. psp_dead = true;
  137. ret = -EIO;
  138. }
  139. free_buf:
  140. tee_free_cmd_buffer(cmd);
  141. return ret;
  142. }
  143. static void tee_destroy_ring(struct psp_tee_device *tee)
  144. {
  145. if (!tee->rb_mgr.ring_start)
  146. return;
  147. if (psp_dead)
  148. goto free_ring;
  149. tee_send_destroy_cmd(tee);
  150. free_ring:
  151. tee_free_ring(tee);
  152. }
  153. int tee_dev_init(struct psp_device *psp)
  154. {
  155. struct device *dev = psp->dev;
  156. struct psp_tee_device *tee;
  157. int ret;
  158. ret = -ENOMEM;
  159. tee = devm_kzalloc(dev, sizeof(*tee), GFP_KERNEL);
  160. if (!tee)
  161. goto e_err;
  162. psp->tee_data = tee;
  163. tee->dev = dev;
  164. tee->psp = psp;
  165. tee->io_regs = psp->io_regs;
  166. tee->vdata = (struct tee_vdata *)psp->vdata->tee;
  167. if (!tee->vdata) {
  168. ret = -ENODEV;
  169. dev_err(dev, "tee: missing driver data\n");
  170. goto e_err;
  171. }
  172. ret = tee_init_ring(tee);
  173. if (ret) {
  174. dev_err(dev, "tee: failed to init ring buffer\n");
  175. goto e_err;
  176. }
  177. dev_notice(dev, "tee enabled\n");
  178. return 0;
  179. e_err:
  180. psp->tee_data = NULL;
  181. dev_notice(dev, "tee initialization failed\n");
  182. return ret;
  183. }
  184. void tee_dev_destroy(struct psp_device *psp)
  185. {
  186. struct psp_tee_device *tee = psp->tee_data;
  187. if (!tee)
  188. return;
  189. tee_destroy_ring(tee);
  190. }
  191. static int tee_submit_cmd(struct psp_tee_device *tee, enum tee_cmd_id cmd_id,
  192. void *buf, size_t len, struct tee_ring_cmd **resp)
  193. {
  194. struct tee_ring_cmd *cmd;
  195. int nloop = 1000, ret = 0;
  196. u32 rptr;
  197. *resp = NULL;
  198. mutex_lock(&tee->rb_mgr.mutex);
  199. /* Loop until empty entry found in ring buffer */
  200. do {
  201. /* Get pointer to ring buffer command entry */
  202. cmd = (struct tee_ring_cmd *)
  203. (tee->rb_mgr.ring_start + tee->rb_mgr.wptr);
  204. rptr = ioread32(tee->io_regs + tee->vdata->ring_rptr_reg);
  205. /* Check if ring buffer is full or command entry is waiting
  206. * for response from TEE
  207. */
  208. if (!(tee->rb_mgr.wptr + sizeof(struct tee_ring_cmd) == rptr ||
  209. cmd->flag == CMD_WAITING_FOR_RESPONSE))
  210. break;
  211. dev_dbg(tee->dev, "tee: ring buffer full. rptr = %u wptr = %u\n",
  212. rptr, tee->rb_mgr.wptr);
  213. /* Wait if ring buffer is full or TEE is processing data */
  214. mutex_unlock(&tee->rb_mgr.mutex);
  215. schedule_timeout_interruptible(msecs_to_jiffies(10));
  216. mutex_lock(&tee->rb_mgr.mutex);
  217. } while (--nloop);
  218. if (!nloop &&
  219. (tee->rb_mgr.wptr + sizeof(struct tee_ring_cmd) == rptr ||
  220. cmd->flag == CMD_WAITING_FOR_RESPONSE)) {
  221. dev_err(tee->dev, "tee: ring buffer full. rptr = %u wptr = %u response flag %u\n",
  222. rptr, tee->rb_mgr.wptr, cmd->flag);
  223. ret = -EBUSY;
  224. goto unlock;
  225. }
  226. /* Do not submit command if PSP got disabled while processing any
  227. * command in another thread
  228. */
  229. if (psp_dead) {
  230. ret = -EBUSY;
  231. goto unlock;
  232. }
  233. /* Write command data into ring buffer */
  234. cmd->cmd_id = cmd_id;
  235. cmd->cmd_state = TEE_CMD_STATE_INIT;
  236. memset(&cmd->buf[0], 0, sizeof(cmd->buf));
  237. memcpy(&cmd->buf[0], buf, len);
  238. /* Indicate driver is waiting for response */
  239. cmd->flag = CMD_WAITING_FOR_RESPONSE;
  240. /* Update local copy of write pointer */
  241. tee->rb_mgr.wptr += sizeof(struct tee_ring_cmd);
  242. if (tee->rb_mgr.wptr >= tee->rb_mgr.ring_size)
  243. tee->rb_mgr.wptr = 0;
  244. /* Trigger interrupt to Trusted OS */
  245. iowrite32(tee->rb_mgr.wptr, tee->io_regs + tee->vdata->ring_wptr_reg);
  246. /* The response is provided by Trusted OS in same
  247. * location as submitted data entry within ring buffer.
  248. */
  249. *resp = cmd;
  250. unlock:
  251. mutex_unlock(&tee->rb_mgr.mutex);
  252. return ret;
  253. }
  254. static int tee_wait_cmd_completion(struct psp_tee_device *tee,
  255. struct tee_ring_cmd *resp,
  256. unsigned int timeout)
  257. {
  258. /* ~1ms sleep per loop => nloop = timeout * 1000 */
  259. int nloop = timeout * 1000;
  260. while (--nloop) {
  261. if (resp->cmd_state == TEE_CMD_STATE_COMPLETED)
  262. return 0;
  263. usleep_range(1000, 1100);
  264. }
  265. dev_err(tee->dev, "tee: command 0x%x timed out, disabling PSP\n",
  266. resp->cmd_id);
  267. psp_dead = true;
  268. return -ETIMEDOUT;
  269. }
  270. int psp_tee_process_cmd(enum tee_cmd_id cmd_id, void *buf, size_t len,
  271. u32 *status)
  272. {
  273. struct psp_device *psp = psp_get_master_device();
  274. struct psp_tee_device *tee;
  275. struct tee_ring_cmd *resp;
  276. int ret;
  277. if (!buf || !status || !len || len > sizeof(resp->buf))
  278. return -EINVAL;
  279. *status = 0;
  280. if (!psp || !psp->tee_data)
  281. return -ENODEV;
  282. if (psp_dead)
  283. return -EBUSY;
  284. tee = psp->tee_data;
  285. ret = tee_submit_cmd(tee, cmd_id, buf, len, &resp);
  286. if (ret)
  287. return ret;
  288. ret = tee_wait_cmd_completion(tee, resp, TEE_DEFAULT_RING_TIMEOUT);
  289. if (ret) {
  290. resp->flag = CMD_RESPONSE_TIMEDOUT;
  291. return ret;
  292. }
  293. memcpy(buf, &resp->buf[0], len);
  294. *status = resp->status;
  295. resp->flag = CMD_RESPONSE_COPIED;
  296. return 0;
  297. }
  298. EXPORT_SYMBOL(psp_tee_process_cmd);
  299. int psp_check_tee_status(void)
  300. {
  301. struct psp_device *psp = psp_get_master_device();
  302. if (!psp || !psp->tee_data)
  303. return -ENODEV;
  304. return 0;
  305. }
  306. EXPORT_SYMBOL(psp_check_tee_status);
  307. int tee_restore(struct psp_device *psp)
  308. {
  309. return tee_init_ring(psp->tee_data);
  310. }