hdcp_main.c 8.5 KB

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