qti-smmu-proxy-common.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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 "qti-smmu-proxy-common.h"
  7. #include "../include/linux/smcinvoke.h"
  8. #include "../include/linux/ITrustedCameraDriver.h"
  9. #include "../include/linux/CTrustedCameraDriver.h"
  10. #include "../include/linux/IClientEnv.h"
  11. #define SMMU_PROXY_MAX_DEVS 1
  12. static dev_t smmu_proxy_dev_no;
  13. static struct class *smmu_proxy_class;
  14. static struct cdev smmu_proxy_char_dev;
  15. static struct csf_version cached_csf_version;
  16. int smmu_proxy_get_csf_version(struct csf_version *csf_version)
  17. {
  18. int ret;
  19. struct Object client_env = {0};
  20. struct Object sc_object;
  21. if (cached_csf_version.arch_ver != 0) {
  22. csf_version->arch_ver = cached_csf_version.arch_ver;
  23. csf_version->max_ver = cached_csf_version.max_ver;
  24. csf_version->min_ver = cached_csf_version.min_ver;
  25. return 0;
  26. }
  27. ret = get_client_env_object(&client_env);
  28. if (ret) {
  29. pr_err("%s: Failed to get env object rc: %d\n", __func__,
  30. ret);
  31. return ret;
  32. }
  33. ret = IClientEnv_open(client_env, CTrustedCameraDriver_UID, &sc_object);
  34. if (ret) {
  35. pr_err("%s: Failed to get seccam object rc: %d\n", __func__,
  36. ret);
  37. return ret;
  38. }
  39. ret = ITrustedCameraDriver_getVersion(sc_object, &csf_version->arch_ver,
  40. &csf_version->max_ver,
  41. &csf_version->min_ver);
  42. Object_release(sc_object);
  43. Object_release(client_env);
  44. return ret;
  45. }
  46. EXPORT_SYMBOL(smmu_proxy_get_csf_version);
  47. int smmu_proxy_create_dev(const struct file_operations *fops)
  48. {
  49. int ret;
  50. struct device *class_dev;
  51. ret = alloc_chrdev_region(&smmu_proxy_dev_no, 0, SMMU_PROXY_MAX_DEVS,
  52. "qti-smmu-proxy");
  53. if (ret < 0)
  54. return ret;
  55. smmu_proxy_class = class_create(THIS_MODULE, "qti-smmu-proxy");
  56. if (IS_ERR(smmu_proxy_class)) {
  57. ret = PTR_ERR(smmu_proxy_class);
  58. goto err_class_create;
  59. }
  60. cdev_init(&smmu_proxy_char_dev, fops);
  61. ret = cdev_add(&smmu_proxy_char_dev, smmu_proxy_dev_no,
  62. SMMU_PROXY_MAX_DEVS);
  63. if (ret < 0)
  64. goto err_cdev_add;
  65. class_dev = device_create(smmu_proxy_class, NULL, smmu_proxy_dev_no, NULL,
  66. "qti-smmu-proxy");
  67. if (IS_ERR(class_dev)) {
  68. ret = PTR_ERR(class_dev);
  69. goto err_dev_create;
  70. }
  71. return 0;
  72. err_dev_create:
  73. cdev_del(&smmu_proxy_char_dev);
  74. err_cdev_add:
  75. class_destroy(smmu_proxy_class);
  76. err_class_create:
  77. unregister_chrdev_region(smmu_proxy_dev_no, SMMU_PROXY_MAX_DEVS);
  78. return ret;
  79. }