hdcp_main.c 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  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_GPL(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_GPL(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_GPL(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_GPL(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_GPL(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_GPL(hdcp2_init);
  173. void hdcp2_set_hdcp_key_verify_retries(void *ctx, u32 max_hdcp_key_verify_retries)
  174. {
  175. struct hdcp2_qsee_handle *handle = ctx;
  176. handle->max_hdcp_key_verify_retries = max_hdcp_key_verify_retries;
  177. pr_debug("hdcp2 max_hdcp_key_verify_retries %d\n", handle->max_hdcp_key_verify_retries);
  178. }
  179. EXPORT_SYMBOL_GPL(hdcp2_set_hdcp_key_verify_retries);
  180. void hdcp2_deinit(void *ctx)
  181. {
  182. ta_interface.trusted_app_hdcp2_deinit(ctx);
  183. }
  184. EXPORT_SYMBOL_GPL(hdcp2_deinit);
  185. void *hdcp1_init(void)
  186. {
  187. void *data = NULL;
  188. mutex_lock(&hdcp1_mutex_g);
  189. data = ta_interface.trusted_app_hdcp1_init();
  190. mutex_unlock(&hdcp1_mutex_g);
  191. return data;
  192. }
  193. EXPORT_SYMBOL_GPL(hdcp1_init);
  194. void hdcp1_set_hdcp_key_verify_retries(void *ctx, u32 max_hdcp_key_verify_retries)
  195. {
  196. struct hdcp1_qsee_handle *handle = ctx;
  197. handle->max_hdcp_key_verify_retries = max_hdcp_key_verify_retries;
  198. pr_debug("hdcp1 max_hdcp_key_verify_retries %d\n", handle->max_hdcp_key_verify_retries);
  199. }
  200. EXPORT_SYMBOL_GPL(hdcp1_set_hdcp_key_verify_retries);
  201. void hdcp1_deinit(void *data)
  202. {
  203. kfree(data);
  204. }
  205. EXPORT_SYMBOL_GPL(hdcp1_deinit);
  206. bool hdcp1_feature_supported(void *data)
  207. {
  208. bool supported = false;
  209. mutex_lock(&hdcp1_mutex_g);
  210. supported = ta_interface.trusted_app_hdcp1_feature_supported(data);
  211. mutex_unlock(&hdcp1_mutex_g);
  212. return supported;
  213. }
  214. EXPORT_SYMBOL_GPL(hdcp1_feature_supported);
  215. int hdcp1_set_enc(void *data, bool enable)
  216. {
  217. int ret = 0;
  218. mutex_lock(&hdcp1_mutex_g);
  219. ret = ta_interface.trusted_app_hdcp1_set_enc(data, enable);
  220. mutex_unlock(&hdcp1_mutex_g);
  221. return ret;
  222. }
  223. EXPORT_SYMBOL_GPL(hdcp1_set_enc);
  224. int hdcp1_ops_notify(void *data, void *topo, bool is_authenticated)
  225. {
  226. int ret = 0;
  227. ret = ta_interface.trusted_app_hdcp1_ops_notify(data, topo, is_authenticated);
  228. return ret;
  229. }
  230. EXPORT_SYMBOL_GPL(hdcp1_ops_notify);
  231. int hdcp1_start(void *data, u32 *aksv_msb, u32 *aksv_lsb)
  232. {
  233. int ret = 0;
  234. mutex_lock(&hdcp1_mutex_g);
  235. ret = ta_interface.trusted_app_hdcp1_start(data, aksv_msb, aksv_lsb);
  236. mutex_unlock(&hdcp1_mutex_g);
  237. return ret;
  238. }
  239. EXPORT_SYMBOL_GPL(hdcp1_start);
  240. void hdcp1_stop(void *data)
  241. {
  242. mutex_lock(&hdcp1_mutex_g);
  243. ta_interface.trusted_app_hdcp1_stop(data);
  244. mutex_unlock(&hdcp1_mutex_g);
  245. }
  246. EXPORT_SYMBOL_GPL(hdcp1_stop);
  247. static int __init hdcp_module_init(void)
  248. {
  249. struct device_node *np = NULL;
  250. bool use_smcinvoke = false;
  251. np = of_find_compatible_node(NULL, NULL, "qcom,hdcp");
  252. if (!np) {
  253. /*select qseecom interface as default if hdcp node
  254. *is not present in dtsi
  255. */
  256. select_interface(use_smcinvoke);
  257. return 0;
  258. }
  259. use_smcinvoke = of_property_read_bool(np, "qcom,use-smcinvoke");
  260. select_interface(use_smcinvoke);
  261. return 0;
  262. }
  263. static void __exit hdcp_module_exit(void)
  264. {
  265. }
  266. MODULE_LICENSE("GPL v2");
  267. MODULE_DESCRIPTION("HDCP driver");
  268. module_init(hdcp_module_init);
  269. module_exit(hdcp_module_exit);