smci_object.h 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. /* SPDX-License-Identifier: GPL-2.0-only WITH Linux-syscall-note */
  2. /*
  3. * Copyright (c) 2024 Qualcomm Innovation Center, Inc. All rights reserved.
  4. */
  5. #ifndef __SMCI_OBJECT_H
  6. #define __SMCI_OBJECT_H
  7. #include <linux/types.h>
  8. #include <linux/firmware.h>
  9. #include <linux/qtee_shmbridge.h>
  10. #include "smcinvoke.h"
  11. #include "smcinvoke_object.h"
  12. /*
  13. * Method bits are not modified by transport layers. These describe the
  14. * method (member function) being requested by the client.
  15. */
  16. #define SMCI_OBJECT_OP_METHOD_MASK (0x0000FFFFu)
  17. #define SMCI_OBJECT_OP_METHODID(op) ((op) & SMCI_OBJECT_OP_METHOD_MASK)
  18. #define SMCI_OBJECT_OP_RELEASE (SMCI_OBJECT_OP_METHOD_MASK - 0)
  19. #define SMCI_OBJECT_OP_RETAIN (SMCI_OBJECT_OP_METHOD_MASK - 1)
  20. #define SMCI_OBJECT_OP_MAP_REGION 0
  21. #define SMCI_OBJECT_OP_YIELD 1
  22. #define SMCI_OBJECT_OP_SLEEP 2
  23. #define SMCI_OBJECT_COUNTS_MAX_BI 0xF
  24. #define SMCI_OBJECT_COUNTS_MAX_BO 0xF
  25. #define SMCI_OBJECT_COUNTS_MAX_OI 0xF
  26. #define SMCI_OBJECT_COUNTS_MAX_OO 0xF
  27. /* unpack counts */
  28. #define SMCI_OBJECT_COUNTS_NUM_BI(k) ((size_t) (((k) >> 0) & SMCI_OBJECT_COUNTS_MAX_BI))
  29. #define SMCI_OBJECT_COUNTS_NUM_BO(k) ((size_t) (((k) >> 4) & SMCI_OBJECT_COUNTS_MAX_BO))
  30. #define SMCI_OBJECT_COUNTS_NUM_OI(k) ((size_t) (((k) >> 8) & SMCI_OBJECT_COUNTS_MAX_OI))
  31. #define SMCI_OBJECT_COUNTS_NUM_OO(k) ((size_t) (((k) >> 12) & SMCI_OBJECT_COUNTS_MAX_OO))
  32. #define SMCI_OBJECT_COUNTS_NUM_BUFFERS(k) \
  33. (SMCI_OBJECT_COUNTS_NUM_BI(k) + SMCI_OBJECT_COUNTS_NUM_BO(k))
  34. #define SMCI_OBJECT_COUNTS_NUM_OBJECTS(k) \
  35. (SMCI_OBJECT_COUNTS_NUM_OI(k) + SMCI_OBJECT_COUNTS_NUM_OO(k))
  36. /* Indices into args[] */
  37. #define SMCI_OBJECT_COUNTS_INDEX_BI(k) 0
  38. #define SMCI_OBJECT_COUNTS_INDEX_BO(k) \
  39. (SMCI_OBJECT_COUNTS_INDEX_BI(k) + SMCI_OBJECT_COUNTS_NUM_BI(k))
  40. #define SMCI_OBJECT_COUNTS_INDEX_OI(k) \
  41. (SMCI_OBJECT_COUNTS_INDEX_BO(k) + SMCI_OBJECT_COUNTS_NUM_BO(k))
  42. #define SMCI_OBJECT_COUNTS_INDEX_OO(k) \
  43. (SMCI_OBJECT_COUNTS_INDEX_OI(k) + SMCI_OBJECT_COUNTS_NUM_OI(k))
  44. #define SMCI_OBJECT_COUNTS_TOTAL(k) \
  45. (SMCI_OBJECT_COUNTS_INDEX_OO(k) + SMCI_OBJECT_COUNTS_NUM_OO(k))
  46. #define SMCI_OBJECT_COUNTS_PACK(in_bufs, out_bufs, in_objs, out_objs) \
  47. ((uint32_t) ((in_bufs) | ((out_bufs) << 4) | \
  48. ((in_objs) << 8) | ((out_objs) << 12)))
  49. #define SMCI_OBJECT_COUNTS_INDEX_BUFFERS(k) SMCI_OBJECT_COUNTS_INDEX_BI(k)
  50. /* Object_invoke return codes */
  51. #define SMCI_OBJECT_IS_OK(err) ((err) == 0)
  52. #define SMCI_OBJECT_IS_ERROR(err) ((err) != 0)
  53. /* Generic error codes */
  54. #define SMCI_OBJECT_OK 0 /* non-specific success code */
  55. #define SMCI_OBJECT_ERROR 1 /* non-specific error */
  56. #define SMCI_OBJECT_ERROR_INVALID 2 /* unsupported/unrecognized request */
  57. #define SMCI_OBJECT_ERROR_SIZE_IN 3 /* supplied buffer/string too large */
  58. #define SMCI_OBJECT_ERROR_SIZE_OUT 4 /* supplied output buffer too small */
  59. #define SMCI_OBJECT_ERROR_USERBASE 10 /* start of user-defined error range */
  60. /* Transport layer error codes */
  61. #define SMCI_OBJECT_ERROR_DEFUNCT -90 /* smci_object no longer exists */
  62. #define SMCI_OBJECT_ERROR_ABORT -91 /* calling thread must exit */
  63. #define SMCI_OBJECT_ERROR_BADOBJ -92 /* invalid smci_object context */
  64. #define SMCI_OBJECT_ERROR_NOSLOTS -93 /* caller's smci_object table full */
  65. #define SMCI_OBJECT_ERROR_MAXARGS -94 /* too many args */
  66. #define SMCI_OBJECT_ERROR_MAXDATA -95 /* buffers too large */
  67. #define SMCI_OBJECT_ERROR_UNAVAIL -96 /* the request could not be processed */
  68. #define SMCI_OBJECT_ERROR_KMEM -97 /* kernel out of memory */
  69. #define SMCI_OBJECT_ERROR_REMOTE -98 /* local method sent to remote smci_object */
  70. #define SMCI_OBJECT_ERROR_BUSY -99 /* smci_object is busy */
  71. #define SMCI_OBJECT_ERROR_TIMEOUT -103 /* Call Back smci_object invocation timed out. */
  72. /* smci_objectop */
  73. #define SMCI_OBJECT_OP_LOCAL ((uint32_t) 0x00008000U)
  74. #define SMCI_OBJECT_OP_IS_LOCAL(op) (((op) & SMCI_OBJECT_OP_LOCAL) != 0)
  75. /* smci_object */
  76. #define SMCI_OBJECTCOUNTS_PACK(nbuffersin, nbuffersout, nobjectsin, nobjectsout) \
  77. ((uint32_t) ((nbuffersin) | \
  78. ((nbuffersout) << 4) | \
  79. ((nobjectsin) << 8) | \
  80. ((nobjectsout) << 12)))
  81. #define smci_object_arg ObjectArg
  82. #define smci_objectinvoke ObjectInvoke
  83. #define smci_object Object
  84. #define smci_object_buf ObjectBuf
  85. #define smci_object_buf_in ObjectBufIn
  86. static inline int32_t smci_object_invoke(struct smci_object o, uint32_t op,
  87. union smci_object_arg *args, uint32_t k)
  88. {
  89. return Object_invoke(o, op, args, k);
  90. }
  91. #define SMCI_OBJECT_NULL ((struct smci_object){NULL, NULL})
  92. #define SMCI_OBJECT_NOT_RETAINED
  93. #define SMCI_OBJECT_CONSUMED
  94. static inline int32_t smci_object_release(SMCI_OBJECT_CONSUMED struct smci_object o)
  95. {
  96. return Object_release(o);
  97. }
  98. static inline int32_t smci_object_retain(struct smci_object o)
  99. {
  100. return Object_retain(o);
  101. }
  102. #define SMCI_OBJECT_IS_NULL(o) ((o).invoke == NULL)
  103. #define SMCI_OBJECT_RELEASE_IF(o) \
  104. do { \
  105. struct smci_object o_ = (o); \
  106. if (!SMCI_OBJECT_IS_NULL(o_)) \
  107. (void) smci_object_release(o_); \
  108. } while (0)
  109. static inline void smci_object_replace(struct smci_object *loc, struct smci_object obj_new)
  110. {
  111. Object_replace(loc, obj_new);
  112. }
  113. #define SMCI_OBJECT_ASSIGN_NULL(loc) smci_object_replace(&(loc), SMCI_OBJECT_NULL)
  114. #endif /* __SMCI_OBJECT_H */