q6common.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
  4. */
  5. #include <dsp/q6common.h>
  6. struct q6common_ctl {
  7. bool instance_id_supported;
  8. };
  9. static struct q6common_ctl common;
  10. /**
  11. * q6common_update_instance_id_support
  12. *
  13. * Update instance ID support flag to true/false
  14. *
  15. * @supported: enable/disable for instance ID support
  16. */
  17. void q6common_update_instance_id_support(bool supported)
  18. {
  19. common.instance_id_supported = supported;
  20. }
  21. EXPORT_SYMBOL(q6common_update_instance_id_support);
  22. /**
  23. * q6common_is_instance_id_supported
  24. *
  25. * Returns true/false for instance ID support
  26. */
  27. bool q6common_is_instance_id_supported(void)
  28. {
  29. return common.instance_id_supported;
  30. }
  31. EXPORT_SYMBOL(q6common_is_instance_id_supported);
  32. /**
  33. * q6common_pack_pp_params
  34. *
  35. * Populate params header based on instance ID support and pack
  36. * it with payload.
  37. * Instance ID support -
  38. * yes - param_hdr_v3 + payload
  39. * no - param_hdr_v1 + payload
  40. *
  41. * @dest: destination data pointer to be packed into
  42. * @v3_hdr: param header v3
  43. * @param_data: param payload
  44. * @total_size: total size of packed data (hdr + payload)
  45. *
  46. * Returns 0 on success or error on failure
  47. */
  48. int q6common_pack_pp_params(u8 *dest, struct param_hdr_v3 *v3_hdr,
  49. u8 *param_data, u32 *total_size)
  50. {
  51. struct param_hdr_v1 *v1_hdr = NULL;
  52. u32 packed_size = 0;
  53. u32 param_size = 0;
  54. bool iid_supported = q6common_is_instance_id_supported();
  55. if (dest == NULL) {
  56. pr_err("%s: Received NULL pointer for destination\n", __func__);
  57. return -EINVAL;
  58. } else if (v3_hdr == NULL) {
  59. pr_err("%s: Received NULL pointer for header\n", __func__);
  60. return -EINVAL;
  61. } else if (total_size == NULL) {
  62. pr_err("%s: Received NULL pointer for total size\n", __func__);
  63. return -EINVAL;
  64. }
  65. param_size = v3_hdr->param_size;
  66. packed_size = iid_supported ? sizeof(struct param_hdr_v3) :
  67. sizeof(struct param_hdr_v1);
  68. if (iid_supported) {
  69. memcpy(dest, v3_hdr, packed_size);
  70. } else {
  71. v1_hdr = (struct param_hdr_v1 *) dest;
  72. v1_hdr->module_id = v3_hdr->module_id;
  73. v1_hdr->param_id = v3_hdr->param_id;
  74. if (param_size > U16_MAX) {
  75. pr_err("%s: Invalid param size for V1 %d\n", __func__,
  76. param_size);
  77. return -EINVAL;
  78. }
  79. v1_hdr->param_size = param_size;
  80. v1_hdr->reserved = 0;
  81. }
  82. /*
  83. * Make param_data optional for cases when there is no data
  84. * present as in some set cases and all get cases.
  85. */
  86. if (param_data != NULL) {
  87. memcpy(dest + packed_size, param_data, param_size);
  88. packed_size += param_size;
  89. }
  90. *total_size = packed_size;
  91. return 0;
  92. }
  93. EXPORT_SYMBOL(q6common_pack_pp_params);