gpr-lite.h 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. /* Copyright (c) 2011-2017, 2019-2021 The Linux Foundation. All rights reserved.
  2. * Copyright (c) 2018, Linaro Limited
  3. *
  4. * This program is free software; you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License version 2 and
  6. * only version 2 as published by the Free Software Foundation.
  7. *
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * GNU General Public License for more details.
  12. *
  13. */
  14. #ifndef __QCOM_GPR_H_
  15. #define __QCOM_GPR_H_
  16. #include <linux/spinlock.h>
  17. #include <linux/device.h>
  18. #include "soc/audio_mod_devicetable.h"
  19. #include <bindings/qcom,gpr.h>
  20. extern struct bus_type gprbus;
  21. enum gpr_subsys_state {
  22. GPR_SUBSYS_DOWN,
  23. GPR_SUBSYS_UP,
  24. GPR_SUBSYS_LOADED,
  25. };
  26. struct gpr_q6 {
  27. //void *pil;
  28. atomic_t q6_state;
  29. atomic_t modem_state;
  30. struct mutex lock;
  31. };
  32. /* Version */
  33. #define GPR_PKT_VER 0x0
  34. /*
  35. * Header format
  36. * Bits 3-0 : version
  37. * Bits 7-4 : header_size
  38. * Bits 31-8 : packet_size
  39. */
  40. #define GPR_PKT_INIT_PORT_V ( ( uint32_t ) 0 )
  41. #define GPR_PKT_INIT_RESERVED_V ( ( uint16_t ) 0 )
  42. #define GPR_PKT_INIT_DOMAIN_ID_V ( ( uint8_t ) 0 )
  43. #define GPR_IDS_DOMAIN_ID_MODEM_V ( 1 ) /**< Modem domain. */
  44. #define GPR_IDS_DOMAIN_ID_ADSP_V ( 2 ) /**< aDSP domain. */
  45. #define GPR_IDS_DOMAIN_ID_APPS_V ( 3 ) /**< Application domain. */
  46. /* V2.0 header size in number of 32-bit words. */
  47. #define GPR_PKT_HEADER_WORD_SIZE_V ( ( sizeof( struct gpr_pkt ) + 3 ) >> 2 )
  48. /* V2.0 header size in number of bytes. */
  49. #define GPR_PKT_HEADER_BYTE_SIZE_V ( GPR_PKT_HEADER_WORD_SIZE_V << 2 )
  50. /* Undefined value for where a valid GUID is expected. */
  51. #define GPR_UNDEFINED_ID_V ( ( uint32_t ) 0xFFFFFFFF )
  52. #define GPR_PKT_INIT_CLIENT_DATA_V ( ( uint8_t ) 0 )
  53. /***********************************************************/
  54. /** GPRv2 Packet Bitfield Macros ***/
  55. /***********************************************************/
  56. /* Bitmask and bit shift of the version field. */
  57. #define GPR_PKT_VERSION_MASK ( 0x0000000F )
  58. #define GPR_PKT_VERSION_SHFT ( 0 )
  59. /* Bitmask and bit shift of the header size field. */
  60. #define GPR_PKT_HEADER_SIZE_MASK ( 0x000000F0 )
  61. #define GPR_PKT_HEADER_SIZE_SHFT ( 4 )
  62. /* Bitmask and bit shift of the reserved field.
  63. * Includes 4 reserved bits from client data field */
  64. #define GPR_PKT_RESERVED_MASK ( 0xFFF00000 )
  65. #define GPR_PKT_RESERVED_SHFT ( 20 )
  66. /* Bitmask and bit shift of the packet size field. */
  67. #define GPR_PKT_PACKET_SIZE_MASK ( 0xFFFFFF00 )
  68. #define GPR_PKT_PACKET_SIZE_SHFT ( 8 )
  69. /**********************************************************************/
  70. /** Packet Helper Macros ***/
  71. /**********************************************************************/
  72. /* Gets the value of a field, including the specified mask and shift. */
  73. #define GPR_GET_BITMASK( mask, shift, value ) \
  74. ( ( ( value ) & ( mask ) ) >> ( shift ) )
  75. /* Sets a value in a field with a specified mask and shift. */
  76. #define GPR_SET_BITMASK( mask, shift, value ) \
  77. ( ( ( value ) << ( shift ) ) & ( mask ) )
  78. /* Gets the value of a field. */
  79. #define GPR_GET_FIELD( field, value ) \
  80. GPR_GET_BITMASK( ( field##_MASK ), ( field##_SHFT ), ( value ) )
  81. /* Sets a value in a field. */
  82. #define GPR_SET_FIELD( field, value ) \
  83. GPR_SET_BITMASK( ( field##_MASK ), ( field##_SHFT ), ( value ) )
  84. /* Returns an 8-bit aligned pointer to a base address pointer plus an
  85. offset, in bytes.*/
  86. #define GPR_PTR_END_OF( base_ptr, offset ) \
  87. ( ( ( uint8_t* ) base_ptr ) + ( offset ) )
  88. /** Given the packet header, returns the packet's current size in bytes.
  89. The current packet byte size is the sum of the base packet structure and
  90. the used portion of the payload.
  91. */
  92. #define GPR_PKT_GET_PACKET_BYTE_SIZE( header ) \
  93. ( GPR_GET_FIELD( GPR_PKT_PACKET_SIZE, header ) )
  94. /* Given the packet header, returns the header's current size in bytes. */
  95. #define GPR_PKT_GET_HEADER_BYTE_SIZE( header ) \
  96. ( GPR_GET_FIELD( GPR_PKT_HEADER_SIZE, header ) << 2 )
  97. /** Given the packet header, returns the payload's current size in bytes.
  98. The current payload byte size is the difference between the packet size and
  99. the header size.
  100. */
  101. #define GPR_PKT_GET_PAYLOAD_BYTE_SIZE( header ) \
  102. ( GPR_PKT_GET_PACKET_BYTE_SIZE( header ) - \
  103. GPR_PKT_GET_HEADER_BYTE_SIZE( header ) )
  104. /** Given the packet, returns a pointer to the beginning of the packet's
  105. payload. */
  106. #define GPR_PKT_GET_PAYLOAD( type, packet_ptr ) \
  107. ( ( type* ) GPR_PTR_END_OF( packet_ptr, \
  108. GPR_PKT_GET_HEADER_BYTE_SIZE( \
  109. ( ( struct gpr_hdr* ) packet_ptr )->header ) ) )
  110. #define GPR_HDR_FIELD(msg_type, hdr_len, ver)\
  111. (((msg_type & 0x3) << 8) | ((hdr_len & 0xF) << 4) | (ver & 0xF))
  112. #define GPR_HDR_SIZE sizeof(struct gpr_hdr)
  113. #define GPR_SEQ_CMD_HDR_FIELD GPR_HDR_FIELD(GPR_MSG_TYPE_SEQ_CMD, \
  114. GPR_HDR_LEN(GPR_HDR_SIZE), \
  115. GPR_PKT_VER)
  116. /**********************************************************************/
  117. /** SPF GUID definitions ***/
  118. /**********************************************************************/
  119. /* An empty macro to mark non-GUIDs so that GUID script doesn't mistake
  120. the ID for a GUID */
  121. #define MM_NON_GUID(x) x
  122. /* GUID owner is QTI. */
  123. #define MM_GUID_OWNER_QTI 0x0
  124. /* GUID owner is not-QTI. */
  125. #define MM_GUID_OWNER_NON_QTI 0x1
  126. /* Mask and Shift for Owner */
  127. #define MM_GUID_OWNER_MASK MM_NON_GUID(0xF0000000)
  128. #define MM_GUID_OWNER_SHIFT 28
  129. /************************************************/
  130. /* GUID types ***/
  131. /************************************************/
  132. /* Reserved */
  133. #define MM_GUID_TYPE_RESERVED 0x0
  134. /* Control commands */
  135. #define MM_GUID_TYPE_CONTROL_CMD 0x1
  136. /* Responses of control commands */
  137. #define MM_GUID_TYPE_CONTROL_CMD_RSP 0x2
  138. /* Control events */
  139. #define MM_GUID_TYPE_CONTROL_EVENT 0x3
  140. /* Data commands */
  141. #define MM_GUID_TYPE_DATA_CMD 0x4
  142. /* Data command responses */
  143. #define MM_GUID_TYPE_DATA_CMD_RSP 0x5
  144. /* Data events */
  145. #define MM_GUID_TYPE_DATA_EVENT 0x6
  146. /* Module-id */
  147. #define MM_GUID_TYPE_MODULE_ID 0x7
  148. /* Module's param & event-id */
  149. #define MM_GUID_TYPE_PARAM_EVENT_ID 0x8
  150. /* Media format-id. */
  151. #define MM_GUID_TYPE_FORMAT_ID 0x9
  152. /* CAPI */
  153. #define MM_GUID_TYPE_CAPI 0xA
  154. /* MAX */
  155. #define MM_GUID_TYPE_MAX 0xB
  156. /** Rest are reserved */
  157. /* Zero is an invalid ID.
  158. * To be used like NULL value for pointers */
  159. #define MM_GUID_INVALID 0
  160. /* Mask and shift for GUID type */
  161. #define MM_GUID_TYPE_MASK MM_NON_GUID(0x0F000000)
  162. #define MM_GUID_TYPE_SHIFT 24
  163. struct gpr_hdr {
  164. uint32_t header;
  165. uint8_t dst_domain_id;
  166. uint8_t src_domain_id;
  167. uint8_t client_data;
  168. uint8_t reserved;
  169. uint32_t src_port;
  170. uint32_t dst_port;
  171. uint32_t token;
  172. uint32_t opcode;
  173. } __packed;
  174. struct gpr_pkt {
  175. struct gpr_hdr hdr;
  176. DECLARE_FLEX_ARRAY(uint8_t, payload);
  177. };
  178. #define GPR_IBASIC_RSP_RESULT 0x02001005
  179. /* Bits 0 to 15 -- Minor version, Bits 16 to 31 -- Major version */
  180. #define GPR_SVC_MAJOR_VERSION(v) ((v >> 16) & 0xFF)
  181. #define GPR_SVC_MINOR_VERSION(v) (v & 0xFF)
  182. struct gpr_device {
  183. struct device dev;
  184. uint16_t svc_id;
  185. uint16_t domain_id;
  186. uint32_t version;
  187. char name[GPR_NAME_SIZE];
  188. spinlock_t lock;
  189. struct list_head node;
  190. };
  191. #define to_gpr_device(d) container_of(d, struct gpr_device, dev)
  192. struct gpr_driver {
  193. int (*probe)(struct gpr_device *sl);
  194. int (*remove)(struct gpr_device *sl);
  195. int (*callback)(struct gpr_device *a,
  196. void *d);
  197. struct device_driver driver;
  198. const struct gpr_device_id *id_table;
  199. };
  200. #define to_gpr_driver(d) container_of(d, struct gpr_driver, driver)
  201. /*
  202. * use a macro to avoid include chaining to get THIS_MODULE
  203. */
  204. #define gpr_driver_register(drv) __gpr_driver_register(drv, THIS_MODULE)
  205. int __gpr_driver_register(struct gpr_driver *drv, struct module *owner);
  206. void gpr_driver_unregister(struct gpr_driver *drv);
  207. /**
  208. * module_gpr_driver() - Helper macro for registering a gprbus driver
  209. * @__gprbus_driver: gprbus_driver struct
  210. *
  211. * Helper macro for gprbus drivers which do not do anything special in
  212. * module init/exit. This eliminates a lot of boilerplate. Each module
  213. * may only use this macro once, and calling it replaces module_init()
  214. * and module_exit()
  215. */
  216. #define module_gpr_driver(__gpr_driver) \
  217. module_driver(__gpr_driver, gpr_driver_register, \
  218. gpr_driver_unregister)
  219. int gpr_send_pkt(struct gpr_device *adev, struct gpr_pkt *pkt);
  220. enum gpr_subsys_state gpr_get_modem_state(void);
  221. enum gpr_subsys_state gpr_get_q6_state(void);
  222. #endif /* __QCOM_GPR_H_ */