hdcp_main.c 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  4. */
  5. #include "hdcp_main.h"
  6. #include "hdcp_qseecom.h"
  7. #include "hdcp_smcinvoke.h"
  8. struct hdcp_ta_interface ta_interface;
  9. static DEFINE_MUTEX(hdcp1_mutex_g);
  10. static DEFINE_MUTEX(hdcp2_mutex_g);
  11. void select_interface(bool use_smcinvoke)
  12. {
  13. if (use_smcinvoke) {
  14. ta_interface.trusted_app_hdcp1_init = &hdcp1_init_smcinvoke;
  15. ta_interface.trusted_app_hdcp1_feature_supported = &hdcp1_feature_supported_smcinvoke;
  16. ta_interface.trusted_app_hdcp1_set_enc = &hdcp1_set_enc_smcinvoke;
  17. ta_interface.trusted_app_hdcp1_ops_notify = &hdcp1_ops_notify_smcinvoke;
  18. ta_interface.trusted_app_hdcp1_start = &hdcp1_start_smcinvoke;
  19. ta_interface.trusted_app_hdcp1_stop = &hdcp1_stop_smcinvoke;
  20. ta_interface.trusted_app_hdcp2_init = &hdcp2_init_smcinvoke;
  21. ta_interface.trusted_app_hdcp2_deinit = &hdcp2_deinit_smcinvoke;
  22. ta_interface.trusted_app_hdcp2_app_start = &hdcp2_app_start_smcinvoke;
  23. ta_interface.trusted_app_hdcp2_app_start_auth = &hdcp2_app_start_auth_smcinvoke;
  24. ta_interface.trusted_app_hdcp2_app_process_msg = &hdcp2_app_process_msg_smcinvoke;
  25. ta_interface.trusted_app_hdcp2_app_enable_encryption = &hdcp2_app_enable_encryption_smcinvoke;
  26. ta_interface.trusted_app_hdcp2_app_query_stream = &hdcp2_app_query_stream_smcinvoke;
  27. ta_interface.trusted_app_hdcp2_app_stop = &hdcp2_app_stop_smcinvoke;
  28. ta_interface.trusted_app_hdcp2_feature_supported = &hdcp2_feature_supported_smcinvoke;
  29. ta_interface.trusted_app_hdcp2_force_encryption = &hdcp2_force_encryption_smcinvoke;
  30. ta_interface.trusted_app_hdcp2_open_stream = &hdcp2_open_stream_smcinvoke;
  31. ta_interface.trusted_app_hdcp2_close_stream = &hdcp2_close_stream_smcinvoke;
  32. ta_interface.trusted_app_hdcp2_update_app_data = &hdcp2_update_app_data_smcinvoke;
  33. } else {
  34. ta_interface.trusted_app_hdcp1_init = &hdcp1_init_qseecom;
  35. ta_interface.trusted_app_hdcp1_feature_supported = &hdcp1_feature_supported_qseecom;
  36. ta_interface.trusted_app_hdcp1_set_enc = &hdcp1_set_enc_qseecom;
  37. ta_interface.trusted_app_hdcp1_ops_notify = &hdcp1_ops_notify_qseecom;
  38. ta_interface.trusted_app_hdcp1_start = &hdcp1_start_qseecom;
  39. ta_interface.trusted_app_hdcp1_stop = &hdcp1_stop_qseecom;
  40. ta_interface.trusted_app_hdcp2_init = &hdcp2_init_qseecom;
  41. ta_interface.trusted_app_hdcp2_deinit = &hdcp2_deinit_qseecom;
  42. ta_interface.trusted_app_hdcp2_app_start = &hdcp2_app_start_qseecom;
  43. ta_interface.trusted_app_hdcp2_app_start_auth = &hdcp2_app_start_auth_qseecom;
  44. ta_interface.trusted_app_hdcp2_app_process_msg = &hdcp2_app_process_msg_qseecom;
  45. ta_interface.trusted_app_hdcp2_app_enable_encryption = &hdcp2_app_enable_encryption_qseecom;
  46. ta_interface.trusted_app_hdcp2_app_query_stream = &hdcp2_app_query_stream_qseecom;
  47. ta_interface.trusted_app_hdcp2_app_stop = &hdcp2_app_stop_qseecom;
  48. ta_interface.trusted_app_hdcp2_feature_supported = &hdcp2_feature_supported_qseecom;
  49. ta_interface.trusted_app_hdcp2_force_encryption = &hdcp2_force_encryption_qseecom;
  50. ta_interface.trusted_app_hdcp2_open_stream = &hdcp2_open_stream_qseecom;
  51. ta_interface.trusted_app_hdcp2_close_stream = &hdcp2_close_stream_qseecom;
  52. ta_interface.trusted_app_hdcp2_update_app_data = &hdcp2_update_app_data_qseecom;
  53. }
  54. }
  55. int hdcp1_count_ones(u8 *array, u8 len)
  56. {
  57. int i, j, count = 0;
  58. for (i = 0; i < len; i++)
  59. for (j = 0; j < 8; j++)
  60. count += (((array[i] >> j) & 0x1) ? 1 : 0);
  61. return count;
  62. }
  63. int hdcp1_validate_aksv(u32 aksv_msb, u32 aksv_lsb)
  64. {
  65. int const number_of_ones = 20;
  66. u8 aksv[5] = {0};
  67. pr_debug("AKSV=%02x%08x\n", aksv_msb, aksv_lsb);
  68. aksv[0] = aksv_lsb & 0xFF;
  69. aksv[1] = (aksv_lsb >> 8) & 0xFF;
  70. aksv[2] = (aksv_lsb >> 16) & 0xFF;
  71. aksv[3] = (aksv_lsb >> 24) & 0xFF;
  72. aksv[4] = aksv_msb & 0xFF;
  73. /* check there are 20 ones in AKSV */
  74. if (hdcp1_count_ones(aksv, 5) != number_of_ones) {
  75. pr_err("AKSV bit count failed\n");
  76. return -EINVAL;
  77. }
  78. return 0;
  79. }
  80. bool hdcp2_feature_supported(void *data)
  81. {
  82. int ret = 0;
  83. mutex_lock(&hdcp2_mutex_g);
  84. ret = ta_interface.trusted_app_hdcp2_feature_supported(data);
  85. mutex_unlock(&hdcp2_mutex_g);
  86. return ret;
  87. }
  88. EXPORT_SYMBOL(hdcp2_feature_supported);
  89. int hdcp2_force_encryption(void *ctx, uint32_t enable)
  90. {
  91. int ret = 0;
  92. mutex_lock(&hdcp2_mutex_g);
  93. ret = ta_interface.trusted_app_hdcp2_force_encryption(ctx, enable);
  94. mutex_unlock(&hdcp2_mutex_g);
  95. return ret;
  96. }
  97. EXPORT_SYMBOL(hdcp2_force_encryption);
  98. int hdcp2_app_comm(void *ctx, enum hdcp2_app_cmd cmd,
  99. struct hdcp2_app_data *app_data)
  100. {
  101. int ret = 0;
  102. uint32_t req_len = 0;
  103. if (!ctx || !app_data) {
  104. pr_err("invalid input\n");
  105. return -EINVAL;
  106. }
  107. req_len = app_data->request.length;
  108. mutex_lock(&hdcp2_mutex_g);
  109. switch (cmd) {
  110. case HDCP2_CMD_START:
  111. ret = ta_interface.trusted_app_hdcp2_app_start(ctx, req_len);
  112. break;
  113. case HDCP2_CMD_START_AUTH:
  114. ret = ta_interface.trusted_app_hdcp2_app_start_auth(ctx, req_len);
  115. break;
  116. case HDCP2_CMD_PROCESS_MSG:
  117. ret = ta_interface.trusted_app_hdcp2_app_process_msg(ctx, req_len);
  118. break;
  119. case HDCP2_CMD_TIMEOUT:
  120. ret = ta_interface.trusted_app_hdcp2_app_timeout(ctx, req_len);
  121. break;
  122. case HDCP2_CMD_EN_ENCRYPTION:
  123. ret = ta_interface.trusted_app_hdcp2_app_enable_encryption(ctx, req_len);
  124. break;
  125. case HDCP2_CMD_QUERY_STREAM:
  126. ret = ta_interface.trusted_app_hdcp2_app_query_stream(ctx, req_len);
  127. break;
  128. case HDCP2_CMD_STOP:
  129. ret = ta_interface.trusted_app_hdcp2_app_stop(ctx);
  130. break;
  131. default:
  132. goto error;
  133. }
  134. if (ret)
  135. goto error;
  136. ret = ta_interface.trusted_app_hdcp2_update_app_data(ctx, app_data);
  137. error:
  138. mutex_unlock(&hdcp2_mutex_g);
  139. return ret;
  140. }
  141. EXPORT_SYMBOL(hdcp2_app_comm);
  142. int hdcp2_open_stream(void *ctx, uint8_t vc_payload_id, uint8_t stream_number,
  143. uint32_t *stream_id)
  144. {
  145. int ret = 0;
  146. mutex_lock(&hdcp2_mutex_g);
  147. ret = ta_interface.trusted_app_hdcp2_open_stream(ctx, vc_payload_id, stream_number,
  148. stream_id);
  149. mutex_unlock(&hdcp2_mutex_g);
  150. return ret;
  151. }
  152. EXPORT_SYMBOL(hdcp2_open_stream);
  153. int hdcp2_close_stream(void *ctx, uint32_t stream_id)
  154. {
  155. int ret = 0;
  156. mutex_lock(&hdcp2_mutex_g);
  157. ret = ta_interface.trusted_app_hdcp2_close_stream(ctx, stream_id);
  158. mutex_unlock(&hdcp2_mutex_g);
  159. return ret;
  160. }
  161. EXPORT_SYMBOL(hdcp2_close_stream);
  162. void *hdcp2_init(u32 device_type)
  163. {
  164. void *data = NULL;
  165. mutex_lock(&hdcp2_mutex_g);
  166. data = ta_interface.trusted_app_hdcp2_init(device_type);
  167. mutex_unlock(&hdcp2_mutex_g);
  168. return data;
  169. }
  170. EXPORT_SYMBOL(hdcp2_init);
  171. void hdcp2_deinit(void *ctx)
  172. {
  173. ta_interface.trusted_app_hdcp2_deinit(ctx);
  174. }
  175. EXPORT_SYMBOL(hdcp2_deinit);
  176. void *hdcp1_init(void)
  177. {
  178. void *data = NULL;
  179. mutex_lock(&hdcp1_mutex_g);
  180. data = ta_interface.trusted_app_hdcp1_init();
  181. mutex_unlock(&hdcp1_mutex_g);
  182. return data;
  183. }
  184. EXPORT_SYMBOL(hdcp1_init);
  185. void hdcp1_deinit(void *data)
  186. {
  187. kfree(data);
  188. }
  189. EXPORT_SYMBOL(hdcp1_deinit);
  190. bool hdcp1_feature_supported(void *data)
  191. {
  192. bool supported = false;
  193. mutex_lock(&hdcp1_mutex_g);
  194. supported = ta_interface.trusted_app_hdcp1_feature_supported(data);
  195. mutex_unlock(&hdcp1_mutex_g);
  196. return supported;
  197. }
  198. EXPORT_SYMBOL(hdcp1_feature_supported);
  199. int hdcp1_set_enc(void *data, bool enable)
  200. {
  201. int ret = 0;
  202. mutex_lock(&hdcp1_mutex_g);
  203. ret = ta_interface.trusted_app_hdcp1_set_enc(data, enable);
  204. mutex_unlock(&hdcp1_mutex_g);
  205. return ret;
  206. }
  207. EXPORT_SYMBOL(hdcp1_set_enc);
  208. int hdcp1_ops_notify(void *data, void *topo, bool is_authenticated)
  209. {
  210. int ret = 0;
  211. ret = ta_interface.trusted_app_hdcp1_ops_notify(data, topo, is_authenticated);
  212. return ret;
  213. }
  214. EXPORT_SYMBOL(hdcp1_ops_notify);
  215. int hdcp1_start(void *data, u32 *aksv_msb, u32 *aksv_lsb)
  216. {
  217. int ret = 0;
  218. mutex_lock(&hdcp1_mutex_g);
  219. ret = ta_interface.trusted_app_hdcp1_start(data, aksv_msb, aksv_lsb);
  220. mutex_unlock(&hdcp1_mutex_g);
  221. return ret;
  222. }
  223. EXPORT_SYMBOL(hdcp1_start);
  224. void hdcp1_stop(void *data)
  225. {
  226. mutex_lock(&hdcp1_mutex_g);
  227. ta_interface.trusted_app_hdcp1_stop(data);
  228. mutex_unlock(&hdcp1_mutex_g);
  229. }
  230. EXPORT_SYMBOL(hdcp1_stop);
  231. static int __init hdcp_module_init(void)
  232. {
  233. struct device_node *np = NULL;
  234. bool use_smcinvoke = false;
  235. np = of_find_compatible_node(NULL, NULL, "qcom,hdcp");
  236. if (!np) {
  237. /*select qseecom interface as default if hdcp node
  238. *is not present in dtsi
  239. */
  240. select_interface(use_smcinvoke);
  241. return 0;
  242. }
  243. use_smcinvoke = of_property_read_bool(np, "qcom,use-smcinvoke");
  244. select_interface(use_smcinvoke);
  245. return 0;
  246. }
  247. static void __exit hdcp_module_exit(void)
  248. {
  249. }
  250. MODULE_LICENSE("GPL v2");
  251. MODULE_DESCRIPTION("HDCP driver");
  252. module_init(hdcp_module_init);
  253. module_exit(hdcp_module_exit);