tee-dev.c 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  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(sizeof(*cmd), GFP_KERNEL);
  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 int tee_init_ring(struct psp_tee_device *tee)
  71. {
  72. int ring_size = MAX_RING_BUFFER_ENTRIES * sizeof(struct tee_ring_cmd);
  73. struct tee_init_ring_cmd *cmd;
  74. unsigned int reg;
  75. int ret;
  76. BUILD_BUG_ON(sizeof(struct tee_ring_cmd) != 1024);
  77. ret = tee_alloc_ring(tee, ring_size);
  78. if (ret) {
  79. dev_err(tee->dev, "tee: ring allocation failed %d\n", ret);
  80. return ret;
  81. }
  82. tee->rb_mgr.wptr = 0;
  83. cmd = tee_alloc_cmd_buffer(tee);
  84. if (!cmd) {
  85. tee_free_ring(tee);
  86. return -ENOMEM;
  87. }
  88. /* Send command buffer details to Trusted OS by writing to
  89. * CPU-PSP message registers
  90. */
  91. ret = psp_mailbox_command(tee->psp, PSP_CMD_TEE_RING_INIT, cmd,
  92. TEE_DEFAULT_CMD_TIMEOUT, &reg);
  93. if (ret) {
  94. dev_err(tee->dev, "tee: ring init command timed out, disabling TEE support\n");
  95. tee_free_ring(tee);
  96. psp_dead = true;
  97. goto free_buf;
  98. }
  99. if (FIELD_GET(PSP_CMDRESP_STS, reg)) {
  100. dev_err(tee->dev, "tee: ring init command failed (%#010lx)\n",
  101. FIELD_GET(PSP_CMDRESP_STS, reg));
  102. tee_free_ring(tee);
  103. ret = -EIO;
  104. }
  105. free_buf:
  106. tee_free_cmd_buffer(cmd);
  107. return ret;
  108. }
  109. static void tee_destroy_ring(struct psp_tee_device *tee)
  110. {
  111. unsigned int reg;
  112. int ret;
  113. if (!tee->rb_mgr.ring_start)
  114. return;
  115. if (psp_dead)
  116. goto free_ring;
  117. ret = psp_mailbox_command(tee->psp, PSP_CMD_TEE_RING_DESTROY, NULL,
  118. TEE_DEFAULT_CMD_TIMEOUT, &reg);
  119. if (ret) {
  120. dev_err(tee->dev, "tee: ring destroy command timed out, disabling TEE support\n");
  121. psp_dead = true;
  122. } else if (FIELD_GET(PSP_CMDRESP_STS, reg)) {
  123. dev_err(tee->dev, "tee: ring destroy command failed (%#010lx)\n",
  124. FIELD_GET(PSP_CMDRESP_STS, reg));
  125. }
  126. free_ring:
  127. tee_free_ring(tee);
  128. }
  129. int tee_dev_init(struct psp_device *psp)
  130. {
  131. struct device *dev = psp->dev;
  132. struct psp_tee_device *tee;
  133. int ret;
  134. ret = -ENOMEM;
  135. tee = devm_kzalloc(dev, sizeof(*tee), GFP_KERNEL);
  136. if (!tee)
  137. goto e_err;
  138. psp->tee_data = tee;
  139. tee->dev = dev;
  140. tee->psp = psp;
  141. tee->io_regs = psp->io_regs;
  142. tee->vdata = (struct tee_vdata *)psp->vdata->tee;
  143. if (!tee->vdata) {
  144. ret = -ENODEV;
  145. dev_err(dev, "tee: missing driver data\n");
  146. goto e_err;
  147. }
  148. ret = tee_init_ring(tee);
  149. if (ret) {
  150. dev_err(dev, "tee: failed to init ring buffer\n");
  151. goto e_err;
  152. }
  153. dev_notice(dev, "tee enabled\n");
  154. return 0;
  155. e_err:
  156. psp->tee_data = NULL;
  157. dev_notice(dev, "tee initialization failed\n");
  158. return ret;
  159. }
  160. void tee_dev_destroy(struct psp_device *psp)
  161. {
  162. struct psp_tee_device *tee = psp->tee_data;
  163. if (!tee)
  164. return;
  165. tee_destroy_ring(tee);
  166. }
  167. static int tee_submit_cmd(struct psp_tee_device *tee, enum tee_cmd_id cmd_id,
  168. void *buf, size_t len, struct tee_ring_cmd **resp)
  169. {
  170. struct tee_ring_cmd *cmd;
  171. int nloop = 1000, ret = 0;
  172. u32 rptr;
  173. *resp = NULL;
  174. mutex_lock(&tee->rb_mgr.mutex);
  175. /* Loop until empty entry found in ring buffer */
  176. do {
  177. /* Get pointer to ring buffer command entry */
  178. cmd = (struct tee_ring_cmd *)
  179. (tee->rb_mgr.ring_start + tee->rb_mgr.wptr);
  180. rptr = ioread32(tee->io_regs + tee->vdata->ring_rptr_reg);
  181. /* Check if ring buffer is full or command entry is waiting
  182. * for response from TEE
  183. */
  184. if (!(tee->rb_mgr.wptr + sizeof(struct tee_ring_cmd) == rptr ||
  185. cmd->flag == CMD_WAITING_FOR_RESPONSE))
  186. break;
  187. dev_dbg(tee->dev, "tee: ring buffer full. rptr = %u wptr = %u\n",
  188. rptr, tee->rb_mgr.wptr);
  189. /* Wait if ring buffer is full or TEE is processing data */
  190. mutex_unlock(&tee->rb_mgr.mutex);
  191. schedule_timeout_interruptible(msecs_to_jiffies(10));
  192. mutex_lock(&tee->rb_mgr.mutex);
  193. } while (--nloop);
  194. if (!nloop &&
  195. (tee->rb_mgr.wptr + sizeof(struct tee_ring_cmd) == rptr ||
  196. cmd->flag == CMD_WAITING_FOR_RESPONSE)) {
  197. dev_err(tee->dev, "tee: ring buffer full. rptr = %u wptr = %u response flag %u\n",
  198. rptr, tee->rb_mgr.wptr, cmd->flag);
  199. ret = -EBUSY;
  200. goto unlock;
  201. }
  202. /* Do not submit command if PSP got disabled while processing any
  203. * command in another thread
  204. */
  205. if (psp_dead) {
  206. ret = -EBUSY;
  207. goto unlock;
  208. }
  209. /* Write command data into ring buffer */
  210. cmd->cmd_id = cmd_id;
  211. cmd->cmd_state = TEE_CMD_STATE_INIT;
  212. memset(&cmd->buf[0], 0, sizeof(cmd->buf));
  213. memcpy(&cmd->buf[0], buf, len);
  214. /* Indicate driver is waiting for response */
  215. cmd->flag = CMD_WAITING_FOR_RESPONSE;
  216. /* Update local copy of write pointer */
  217. tee->rb_mgr.wptr += sizeof(struct tee_ring_cmd);
  218. if (tee->rb_mgr.wptr >= tee->rb_mgr.ring_size)
  219. tee->rb_mgr.wptr = 0;
  220. /* Trigger interrupt to Trusted OS */
  221. iowrite32(tee->rb_mgr.wptr, tee->io_regs + tee->vdata->ring_wptr_reg);
  222. /* The response is provided by Trusted OS in same
  223. * location as submitted data entry within ring buffer.
  224. */
  225. *resp = cmd;
  226. unlock:
  227. mutex_unlock(&tee->rb_mgr.mutex);
  228. return ret;
  229. }
  230. static int tee_wait_cmd_completion(struct psp_tee_device *tee,
  231. struct tee_ring_cmd *resp,
  232. unsigned int timeout)
  233. {
  234. /* ~1ms sleep per loop => nloop = timeout * 1000 */
  235. int nloop = timeout * 1000;
  236. while (--nloop) {
  237. if (resp->cmd_state == TEE_CMD_STATE_COMPLETED)
  238. return 0;
  239. usleep_range(1000, 1100);
  240. }
  241. dev_err(tee->dev, "tee: command 0x%x timed out, disabling PSP\n",
  242. resp->cmd_id);
  243. psp_dead = true;
  244. return -ETIMEDOUT;
  245. }
  246. int psp_tee_process_cmd(enum tee_cmd_id cmd_id, void *buf, size_t len,
  247. u32 *status)
  248. {
  249. struct psp_device *psp = psp_get_master_device();
  250. struct psp_tee_device *tee;
  251. struct tee_ring_cmd *resp;
  252. int ret;
  253. if (!buf || !status || !len || len > sizeof(resp->buf))
  254. return -EINVAL;
  255. *status = 0;
  256. if (!psp || !psp->tee_data)
  257. return -ENODEV;
  258. if (psp_dead)
  259. return -EBUSY;
  260. tee = psp->tee_data;
  261. ret = tee_submit_cmd(tee, cmd_id, buf, len, &resp);
  262. if (ret)
  263. return ret;
  264. ret = tee_wait_cmd_completion(tee, resp, TEE_DEFAULT_RING_TIMEOUT);
  265. if (ret) {
  266. resp->flag = CMD_RESPONSE_TIMEDOUT;
  267. return ret;
  268. }
  269. memcpy(buf, &resp->buf[0], len);
  270. *status = resp->status;
  271. resp->flag = CMD_RESPONSE_COPIED;
  272. return 0;
  273. }
  274. EXPORT_SYMBOL(psp_tee_process_cmd);
  275. int psp_check_tee_status(void)
  276. {
  277. struct psp_device *psp = psp_get_master_device();
  278. if (!psp || !psp->tee_data)
  279. return -ENODEV;
  280. return 0;
  281. }
  282. EXPORT_SYMBOL(psp_check_tee_status);