chimp_optee.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. // SPDX-License-Identifier: BSD-2-Clause
  2. /*
  3. * Copyright 2020 Broadcom.
  4. */
  5. #include <common.h>
  6. #include <tee.h>
  7. #include <broadcom/chimp.h>
  8. #ifdef CONFIG_CHIMP_OPTEE
  9. #define CHMIP_BOOT_UUID { 0x6272636D, 0x2019, 0x0716, \
  10. { 0x42, 0x43, 0x4D, 0x5F, 0x53, 0x43, 0x48, 0x49 } }
  11. enum {
  12. TEE_CHIMP_FASTBOOT = 0,
  13. TEE_CHIMP_HEALTH_STATUS,
  14. TEE_CHIMP_HANDSHAKE_STATUS,
  15. } tee_chmip_cmd;
  16. struct bcm_chimp_data {
  17. struct udevice *tee;
  18. u32 session;
  19. } chimp_data;
  20. static int get_open_session(struct bcm_chimp_data *b_data)
  21. {
  22. const struct tee_optee_ta_uuid uuid = CHMIP_BOOT_UUID;
  23. struct tee_open_session_arg arg;
  24. struct udevice *tee = NULL;
  25. int rc;
  26. tee = tee_find_device(NULL, NULL, NULL, NULL);
  27. if (!tee)
  28. return -ENODEV;
  29. memset(&arg, 0, sizeof(arg));
  30. tee_optee_ta_uuid_to_octets(arg.uuid, &uuid);
  31. rc = tee_open_session(tee, &arg, 0, NULL);
  32. if (rc < 0)
  33. return -ENODEV;
  34. b_data->tee = tee;
  35. b_data->session = arg.session;
  36. return 0;
  37. }
  38. static int init_arg(struct tee_invoke_arg *arg, u32 func)
  39. {
  40. if (get_open_session(&chimp_data))
  41. return -EINVAL;
  42. memset(arg, 0, sizeof(struct tee_invoke_arg));
  43. arg->func = func;
  44. arg->session = chimp_data.session;
  45. return 0;
  46. }
  47. int chimp_handshake_status_optee(u32 timeout, u32 *hs)
  48. {
  49. struct tee_invoke_arg arg;
  50. struct tee_param param[1];
  51. int ret;
  52. ret = init_arg(&arg, TEE_CHIMP_HANDSHAKE_STATUS);
  53. if (ret < 0)
  54. return ret;
  55. param[0].attr = TEE_PARAM_ATTR_TYPE_VALUE_INOUT;
  56. param[0].u.value.a = timeout;
  57. ret = tee_invoke_func(chimp_data.tee, &arg, ARRAY_SIZE(param), param);
  58. if (ret < 0) {
  59. printf("Handshake status command failed\n");
  60. goto out;
  61. }
  62. switch (arg.ret) {
  63. case TEE_SUCCESS:
  64. *hs = param[0].u.value.a;
  65. ret = 0;
  66. break;
  67. default:
  68. ret = -EINVAL;
  69. break;
  70. }
  71. out:
  72. tee_close_session(chimp_data.tee, chimp_data.session);
  73. chimp_data.tee = NULL;
  74. return ret;
  75. }
  76. int chimp_health_status_optee(u32 *health)
  77. {
  78. struct tee_invoke_arg arg;
  79. struct tee_param param[1];
  80. int ret;
  81. ret = init_arg(&arg, TEE_CHIMP_HEALTH_STATUS);
  82. if (ret < 0)
  83. return ret;
  84. param[0].attr = TEE_PARAM_ATTR_TYPE_VALUE_OUTPUT;
  85. ret = tee_invoke_func(chimp_data.tee, &arg, ARRAY_SIZE(param), param);
  86. if (ret < 0) {
  87. printf("Helath status command failed\n");
  88. goto out;
  89. }
  90. switch (arg.ret) {
  91. case TEE_SUCCESS:
  92. *health = param[0].u.value.a;
  93. ret = 0;
  94. break;
  95. default:
  96. ret = -EINVAL;
  97. break;
  98. }
  99. out:
  100. tee_close_session(chimp_data.tee, chimp_data.session);
  101. chimp_data.tee = NULL;
  102. return ret;
  103. }
  104. int chimp_fastboot_optee(void)
  105. {
  106. struct tee_invoke_arg arg;
  107. int ret;
  108. ret = init_arg(&arg, TEE_CHIMP_FASTBOOT);
  109. if (ret < 0)
  110. return ret;
  111. ret = tee_invoke_func(chimp_data.tee, &arg, 0, NULL);
  112. if (ret < 0) {
  113. printf("Chimp boot_fail\n");
  114. goto out;
  115. }
  116. switch (arg.ret) {
  117. case TEE_SUCCESS:
  118. ret = 0;
  119. break;
  120. default:
  121. ret = -EINVAL;
  122. break;
  123. }
  124. out:
  125. tee_close_session(chimp_data.tee, chimp_data.session);
  126. chimp_data.tee = NULL;
  127. return ret;
  128. }
  129. #else
  130. int chimp_handshake_status_optee(u32 timeout, u32 *status)
  131. {
  132. printf("ChiMP handshake status fail (OPTEE not enabled)\n");
  133. return -EINVAL;
  134. }
  135. int chimp_health_status_optee(u32 *status)
  136. {
  137. printf("ChiMP health status fail (OPTEE not enabled)\n");
  138. return -EINVAL;
  139. }
  140. int chimp_fastboot_optee(void)
  141. {
  142. printf("ChiMP secure boot fail (OPTEE not enabled)\n");
  143. return -EINVAL;
  144. }
  145. #endif /* CONFIG_CHIMP_OPTEE */