qti-smmu-proxy-common.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved.
  4. */
  5. #include <linux/cdev.h>
  6. #include <linux/version.h>
  7. #include "qti-smmu-proxy-common.h"
  8. #include "smcinvoke_object.h"
  9. #include "../include/linux/ITrustedCameraDriver.h"
  10. #include "../include/linux/CTrustedCameraDriver.h"
  11. #include "../include/linux/IClientEnv.h"
  12. #define SMMU_PROXY_MAX_DEVS 1
  13. static dev_t smmu_proxy_dev_no;
  14. static struct class *smmu_proxy_class;
  15. static struct cdev smmu_proxy_char_dev;
  16. static struct csf_version cached_csf_version;
  17. int smmu_proxy_get_csf_version(struct csf_version *csf_version)
  18. {
  19. int ret;
  20. struct Object client_env = {0};
  21. struct Object sc_object;
  22. /* Assumption is that cached_csf_version.arch_ver !=0 ==> other vals are set */
  23. if (cached_csf_version.arch_ver != 0) {
  24. csf_version->arch_ver = cached_csf_version.arch_ver;
  25. csf_version->max_ver = cached_csf_version.max_ver;
  26. csf_version->min_ver = cached_csf_version.min_ver;
  27. return 0;
  28. }
  29. ret = get_client_env_object(&client_env);
  30. if (ret) {
  31. pr_err("%s: Failed to get env object rc: %d\n", __func__,
  32. ret);
  33. return ret;
  34. }
  35. ret = IClientEnv_open(client_env, CTrustedCameraDriver_UID, &sc_object);
  36. if (ret) {
  37. pr_err("%s: Failed to get seccam object rc: %d\n", __func__,
  38. ret);
  39. return ret;
  40. }
  41. ret = ITrustedCameraDriver_getVersion(sc_object, &csf_version->arch_ver,
  42. &csf_version->max_ver,
  43. &csf_version->min_ver);
  44. Object_release(sc_object);
  45. Object_release(client_env);
  46. /*
  47. * Once we set cached_csf_version.arch_ver, concurrent callers will get
  48. * the cached value.
  49. */
  50. cached_csf_version.min_ver = csf_version->min_ver;
  51. cached_csf_version.max_ver = csf_version->max_ver;
  52. cached_csf_version.arch_ver = csf_version->arch_ver;
  53. return ret;
  54. }
  55. EXPORT_SYMBOL(smmu_proxy_get_csf_version);
  56. int smmu_proxy_create_dev(const struct file_operations *fops)
  57. {
  58. int ret;
  59. struct device *class_dev;
  60. ret = alloc_chrdev_region(&smmu_proxy_dev_no, 0, SMMU_PROXY_MAX_DEVS,
  61. "qti-smmu-proxy");
  62. if (ret < 0)
  63. return ret;
  64. #if (KERNEL_VERSION(6, 3, 0) <= LINUX_VERSION_CODE)
  65. smmu_proxy_class = class_create("qti-smmu-proxy");
  66. #else
  67. smmu_proxy_class = class_create(THIS_MODULE, "qti-smmu-proxy");
  68. #endif
  69. if (IS_ERR(smmu_proxy_class)) {
  70. ret = PTR_ERR(smmu_proxy_class);
  71. goto err_class_create;
  72. }
  73. cdev_init(&smmu_proxy_char_dev, fops);
  74. ret = cdev_add(&smmu_proxy_char_dev, smmu_proxy_dev_no,
  75. SMMU_PROXY_MAX_DEVS);
  76. if (ret < 0)
  77. goto err_cdev_add;
  78. class_dev = device_create(smmu_proxy_class, NULL, smmu_proxy_dev_no, NULL,
  79. "qti-smmu-proxy");
  80. if (IS_ERR(class_dev)) {
  81. ret = PTR_ERR(class_dev);
  82. goto err_dev_create;
  83. }
  84. return 0;
  85. err_dev_create:
  86. cdev_del(&smmu_proxy_char_dev);
  87. err_cdev_add:
  88. class_destroy(smmu_proxy_class);
  89. err_class_create:
  90. unregister_chrdev_region(smmu_proxy_dev_no, SMMU_PROXY_MAX_DEVS);
  91. return ret;
  92. }