hw_fence_drv_priv.h 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  4. */
  5. #ifndef __HW_FENCE_DRV_INTERNAL_H
  6. #define __HW_FENCE_DRV_INTERNAL_H
  7. #include <linux/kernel.h>
  8. #include <linux/device.h>
  9. #include <linux/types.h>
  10. #include <linux/dma-mapping.h>
  11. #include <linux/soc/qcom/msm_hw_fence.h>
  12. #include <linux/dma-fence-array.h>
  13. #include <linux/slab.h>
  14. /* max u64 to indicate invalid fence */
  15. #define HW_FENCE_INVALID_PARENT_FENCE (~0ULL)
  16. /* hash algorithm constants */
  17. #define HW_FENCE_HASH_A_MULT 4969 /* a multiplier for Hash algorithm */
  18. #define HW_FENCE_HASH_C_MULT 907 /* c multiplier for Hash algorithm */
  19. /* number of queues per type (i.e. ctrl or client queues) */
  20. #define HW_FENCE_CTRL_QUEUES 2 /* Rx and Tx Queues */
  21. #define HW_FENCE_CLIENT_QUEUES 2 /* Rx and Tx Queues */
  22. /* hfi headers calculation */
  23. #define HW_FENCE_HFI_TABLE_HEADER_SIZE (sizeof(struct msm_hw_fence_hfi_queue_table_header))
  24. #define HW_FENCE_HFI_QUEUE_HEADER_SIZE (sizeof(struct msm_hw_fence_hfi_queue_header))
  25. #define HW_FENCE_HFI_CTRL_HEADERS_SIZE (HW_FENCE_HFI_TABLE_HEADER_SIZE + \
  26. (HW_FENCE_HFI_QUEUE_HEADER_SIZE * HW_FENCE_CTRL_QUEUES))
  27. #define HW_FENCE_HFI_CLIENT_HEADERS_SIZE(queues_num) (HW_FENCE_HFI_TABLE_HEADER_SIZE + \
  28. (HW_FENCE_HFI_QUEUE_HEADER_SIZE * queues_num))
  29. /*
  30. * Max Payload size is the bigest size of the message that we can have in the CTRL queue
  31. * in this case the max message is calculated like following, using 32-bits elements:
  32. * 1 header + 1 msg-type + 1 client_id + 2 hash + 1 error
  33. */
  34. #define HW_FENCE_CTRL_QUEUE_MAX_PAYLOAD_SIZE ((1 + 1 + 1 + 2 + 1) * sizeof(u32))
  35. #define HW_FENCE_CTRL_QUEUE_PAYLOAD HW_FENCE_CTRL_QUEUE_MAX_PAYLOAD_SIZE
  36. #define HW_FENCE_CLIENT_QUEUE_PAYLOAD (sizeof(struct msm_hw_fence_queue_payload))
  37. /* Locks area for all clients with RxQ */
  38. #define HW_FENCE_MEM_LOCKS_SIZE(rxq_clients_num) (sizeof(u64) * rxq_clients_num)
  39. #define HW_FENCE_TX_QUEUE 1
  40. #define HW_FENCE_RX_QUEUE 2
  41. /* ClientID for the internal join fence, this is used by the framework when creating a join-fence */
  42. #define HW_FENCE_JOIN_FENCE_CLIENT_ID (~(u32)0)
  43. /**
  44. * msm hw fence flags:
  45. * MSM_HW_FENCE_FLAG_SIGNAL - Flag set when the hw-fence is signaled
  46. */
  47. #define MSM_HW_FENCE_FLAG_SIGNAL BIT(0)
  48. /**
  49. * MSM_HW_FENCE_MAX_JOIN_PARENTS:
  50. * Maximum number of parents that a fence can have for a join-fence
  51. */
  52. #define MSM_HW_FENCE_MAX_JOIN_PARENTS 3
  53. /**
  54. * HW_FENCE_PAYLOAD_REV:
  55. * Payload version with major and minor version information
  56. */
  57. #define HW_FENCE_PAYLOAD_REV(major, minor) (major << 8 | (minor & 0xFF))
  58. /**
  59. * HW_FENCE_EVENT_MAX_DATA:
  60. * Maximum data that can be added to the debug event
  61. */
  62. #define HW_FENCE_EVENT_MAX_DATA 12
  63. enum hw_fence_lookup_ops {
  64. HW_FENCE_LOOKUP_OP_CREATE = 0x1,
  65. HW_FENCE_LOOKUP_OP_DESTROY,
  66. HW_FENCE_LOOKUP_OP_CREATE_JOIN,
  67. HW_FENCE_LOOKUP_OP_FIND_FENCE
  68. };
  69. /**
  70. * enum hw_fence_client_data_id - Enum with the clients having client_data, an optional
  71. * parameter passed from the waiting client and returned
  72. * to it upon fence signaling. Only the first HW Fence
  73. * Client for non-VAL clients (e.g. GFX, IPE, VPU) have
  74. * client_data.
  75. * @HW_FENCE_CLIENT_DATA_ID_CTX0: GFX Client 0.
  76. * @HW_FENCE_CLIENT_DATA_ID_IPE: IPE Client 0.
  77. * @HW_FENCE_CLIENT_DATA_ID_VPU: VPU Client 0.
  78. * @HW_FENCE_CLIENT_DATA_ID_VAL0: Debug validation client 0.
  79. * @HW_FENCE_CLIENT_DATA_ID_VAL1: Debug validation client 1.
  80. * @HW_FENCE_MAX_CLIENTS_WITH_DATA: Max number of clients with data, also indicates an
  81. * invalid hw_fence_client_data_id
  82. */
  83. enum hw_fence_client_data_id {
  84. HW_FENCE_CLIENT_DATA_ID_CTX0,
  85. HW_FENCE_CLIENT_DATA_ID_IPE,
  86. HW_FENCE_CLIENT_DATA_ID_VPU,
  87. HW_FENCE_CLIENT_DATA_ID_VAL0,
  88. HW_FENCE_CLIENT_DATA_ID_VAL1,
  89. HW_FENCE_MAX_CLIENTS_WITH_DATA,
  90. };
  91. /**
  92. * struct msm_hw_fence_queue - Structure holding the data of the hw fence queues.
  93. * @va_queue: pointer to the virtual address of the queue elements
  94. * @q_size_bytes: size of the queue
  95. * @va_header: pointer to the hfi header virtual address
  96. * @pa_queue: physical address of the queue
  97. * @rd_wr_idx_start: start read and write indexes for client queue (zero by default)
  98. * @rd_wr_idx_factor: factor to multiply custom index to get index in dwords (one by default)
  99. * @skip_wr_idx: bool to indicate if update to write_index is skipped within hw fence driver and
  100. * hfi_header->tx_wm is updated instead
  101. */
  102. struct msm_hw_fence_queue {
  103. void *va_queue;
  104. u32 q_size_bytes;
  105. void *va_header;
  106. phys_addr_t pa_queue;
  107. u32 rd_wr_idx_start;
  108. u32 rd_wr_idx_factor;
  109. bool skip_wr_idx;
  110. };
  111. /**
  112. * enum payload_type - Enum with the queue payload types.
  113. * HW_FENCE_PAYLOAD_TYPE_1: client queue payload
  114. * HW_FENCE_PAYLOAD_TYPE_2: ctrl queue payload for fence error; client_data stores client_id
  115. */
  116. enum payload_type {
  117. HW_FENCE_PAYLOAD_TYPE_1 = 1,
  118. HW_FENCE_PAYLOAD_TYPE_2
  119. };
  120. /**
  121. * struct msm_hw_fence_client - Structure holding the per-Client allocated resources.
  122. * @client_id: internal client_id used within HW fence driver; index into the clients struct
  123. * @client_id_ext: external client_id, equal to client_id except for clients with configurable
  124. * number of sub-clients (e.g. ife clients)
  125. * @mem_descriptor: hfi header memory descriptor
  126. * @queues: queues descriptor
  127. * @queues_num: number of client queues
  128. * @fence_error_cb: function called for waiting clients that need HLOS notification of fence error
  129. * @fence_error_cb_userdata: opaque pointer registered with fence error callback and passed to
  130. * client during invocation of callback function
  131. * @error_cb_lock: lock to synchronize access to fence error cb and fence error cb data
  132. * @ipc_signal_id: id of the signal to be triggered for this client
  133. * @ipc_client_vid: virtual id of the ipc client for this hw fence driver client
  134. * @ipc_client_pid: physical id of the ipc client for this hw fence driver client
  135. * @update_rxq: bool to indicate if client uses rx-queue
  136. * @send_ipc: bool to indicate if client requires ipc interrupt for already signaled fences
  137. * @wait_queue: wait queue for the validation clients
  138. * @val_signal: doorbell flag to signal the validation clients in the wait queue
  139. */
  140. struct msm_hw_fence_client {
  141. enum hw_fence_client_id client_id;
  142. enum hw_fence_client_id client_id_ext;
  143. struct msm_hw_fence_mem_addr mem_descriptor;
  144. struct msm_hw_fence_queue queues[HW_FENCE_CLIENT_QUEUES];
  145. int queues_num;
  146. msm_hw_fence_error_cb_t fence_error_cb;
  147. void *fence_error_cb_userdata;
  148. struct mutex error_cb_lock;
  149. int ipc_signal_id;
  150. int ipc_client_vid;
  151. int ipc_client_pid;
  152. bool update_rxq;
  153. bool send_ipc;
  154. #if IS_ENABLED(CONFIG_DEBUG_FS)
  155. wait_queue_head_t wait_queue;
  156. atomic_t val_signal;
  157. #endif /* CONFIG_DEBUG_FS */
  158. };
  159. /**
  160. * struct msm_hw_fence_mem_data - Structure holding internal memory attributes
  161. *
  162. * @attrs: attributes for the memory allocation
  163. */
  164. struct msm_hw_fence_mem_data {
  165. unsigned long attrs;
  166. };
  167. /**
  168. * struct msm_hw_fence_dbg_data - Structure holding debugfs data
  169. *
  170. * @root: debugfs root
  171. * @entry_rd: flag to indicate if debugfs dumps a single line or table
  172. * @context_rd: debugfs setting to indicate which context id to dump
  173. * @seqno_rd: debugfs setting to indicate which seqno to dump
  174. * @hw_fence_sim_release_delay: delay in micro seconds for the debugfs node that simulates the
  175. * hw-fences behavior, to release the hw-fences
  176. * @create_hw_fences: boolean to continuosly create hw-fences within debugfs
  177. * @clients_list: list of debug clients registered
  178. * @clients_list_lock: lock to synchronize access to the clients list
  179. * @lock_wake_cnt: number of times that driver triggers wake-up ipcc to unlock inter-vm try-lock
  180. */
  181. struct msm_hw_fence_dbg_data {
  182. struct dentry *root;
  183. bool entry_rd;
  184. u64 context_rd;
  185. u64 seqno_rd;
  186. u32 hw_fence_sim_release_delay;
  187. bool create_hw_fences;
  188. struct list_head clients_list;
  189. struct mutex clients_list_lock;
  190. u64 lock_wake_cnt;
  191. };
  192. /**
  193. * struct hw_fence_client_type_desc - Structure holding client type properties, including static
  194. * properties and client queue properties read from device-tree.
  195. *
  196. * @name: name of client type, used to parse properties from device-tree
  197. * @init_id: initial client_id for given client type within the 'hw_fence_client_id' enum, e.g.
  198. * HW_FENCE_CLIENT_ID_CTL0 for DPU clients
  199. * @max_clients_num: maximum number of clients of given client type
  200. * @clients_num: number of clients of given client type
  201. * @queues_num: number of queues per client of given client type; either one (for only Tx Queue) or
  202. * two (for both Tx and Rx Queues)
  203. * @queue_entries: number of entries per client queue of given client type
  204. * @start_padding: size of padding between queue table header and first queue header in bytes
  205. * @end_padding: size of padding between queue header(s) and first queue payload in bytes
  206. * @mem_size: size of memory allocated for client queue(s) per client in bytes
  207. * @txq_idx_start: start read and write indexes for client tx queue (zero by default)
  208. * @txq_idx_factor: factor to multiply custom TxQ idx to get index in dwords (one by default)
  209. * @skip_txq_wr_idx: bool to indicate if update to tx queue write_index is skipped within hw fence
  210. * driver and hfi_header->tx_wm is updated instead
  211. */
  212. struct hw_fence_client_type_desc {
  213. char *name;
  214. enum hw_fence_client_id init_id;
  215. u32 max_clients_num;
  216. u32 clients_num;
  217. u32 queues_num;
  218. u32 queue_entries;
  219. u32 start_padding;
  220. u32 end_padding;
  221. u32 mem_size;
  222. u32 txq_idx_start;
  223. u32 txq_idx_factor;
  224. bool skip_txq_wr_idx;
  225. };
  226. /**
  227. * struct hw_fence_client_queue_desc - Structure holding client queue properties for a client.
  228. *
  229. * @type: pointer to client queue properties of client type
  230. * @start_offset: start offset of client queue memory region, from beginning of carved-out memory
  231. * allocation for hw fence driver
  232. */
  233. struct hw_fence_client_queue_desc {
  234. struct hw_fence_client_type_desc *type;
  235. u32 start_offset;
  236. };
  237. /**
  238. * struct hw_fence_driver_data - Structure holding internal hw-fence driver data
  239. *
  240. * @dev: device driver pointer
  241. * @resources_ready: value set by driver at end of probe, once all resources are ready
  242. * @hw_fence_table_entries: total number of hw-fences in the global table
  243. * @hw_fence_mem_fences_table_size: hw-fences global table total size
  244. * @hw_fence_queue_entries: total number of entries that can be available in the queue
  245. * @hw_fence_ctrl_queue_size: size of the ctrl queue for the payload
  246. * @hw_fence_mem_ctrl_queues_size: total size of ctrl queues, including: header + rxq + txq
  247. * @hw_fence_client_queue_size: descriptors of client queue properties for each hw fence client
  248. * @hw_fence_client_types: descriptors of properties for each hw fence client type
  249. * @rxq_clients_num: number of supported hw fence clients with rxq (configured based on device-tree)
  250. * @clients_num: number of supported hw fence clients (configured based on device-tree)
  251. * @hw_fences_tbl: pointer to the hw-fences table
  252. * @hw_fences_tbl_cnt: number of elements in the hw-fence table
  253. * @events: start address of hw fence debug events
  254. * @total_events: total number of hw fence debug events supported
  255. * @client_lock_tbl: pointer to the per-client locks table
  256. * @client_lock_tbl_cnt: number of elements in the locks table
  257. * @hw_fences_mem_desc: memory descriptor for the hw-fence table
  258. * @clients_locks_mem_desc: memory descriptor for the locks table
  259. * @ctrl_queue_mem_desc: memory descriptor for the ctrl queues
  260. * @ctrl_queues: pointer to the ctrl queues
  261. * @io_mem_base: pointer to the carved-out io memory
  262. * @res: resources for the carved out memory
  263. * @size: size of the carved-out memory
  264. * @label: label for the carved-out memory (this is used by SVM to find the memory)
  265. * @peer_name: peer name for this carved-out memory
  266. * @rm_nb: hyp resource manager notifier
  267. * @memparcel: memparcel for the allocated memory
  268. * @used_mem_size: total memory size of global table, lock region, and ctrl and client queues
  269. * @db_label: doorbell label
  270. * @rx_dbl: handle to the Rx doorbell
  271. * @debugfs_data: debugfs info
  272. * @ipcc_reg_base: base for ipcc regs mapping
  273. * @ipcc_io_mem: base for the ipcc io mem map
  274. * @ipcc_size: size of the ipcc io mem mapping
  275. * @protocol_id: ipcc protocol id used by this driver
  276. * @ipcc_client_vid: ipcc client virtual-id for this driver
  277. * @ipcc_client_pid: ipcc client physical-id for this driver
  278. * @ipc_clients_table: table with the ipcc mapping for each client of this driver
  279. * @qtime_reg_base: qtimer register base address
  280. * @qtime_io_mem: qtimer io mem map
  281. * @qtime_size: qtimer io mem map size
  282. * @client_id_mask: bitmask for tracking registered client_ids
  283. * @clients_register_lock: lock to synchronize clients registration and deregistration
  284. * @clients: table with the handles of the registered clients; size is equal to clients_num
  285. * @vm_ready: flag to indicate if vm has been initialized
  286. * @ipcc_dpu_initialized: flag to indicate if dpu hw is initialized
  287. */
  288. struct hw_fence_driver_data {
  289. struct device *dev;
  290. bool resources_ready;
  291. /* Table & Queues info */
  292. u32 hw_fence_table_entries;
  293. u32 hw_fence_mem_fences_table_size;
  294. u32 hw_fence_queue_entries;
  295. /* ctrl queues */
  296. u32 hw_fence_ctrl_queue_size;
  297. u32 hw_fence_mem_ctrl_queues_size;
  298. /* client queues */
  299. struct hw_fence_client_queue_desc *hw_fence_client_queue_size;
  300. struct hw_fence_client_type_desc *hw_fence_client_types;
  301. u32 rxq_clients_num;
  302. u32 clients_num;
  303. /* HW Fences Table VA */
  304. struct msm_hw_fence *hw_fences_tbl;
  305. u32 hw_fences_tbl_cnt;
  306. /* events */
  307. struct msm_hw_fence_event *events;
  308. u32 total_events;
  309. /* Table with a Per-Client Lock */
  310. u64 *client_lock_tbl;
  311. u32 client_lock_tbl_cnt;
  312. /* Memory Descriptors */
  313. struct msm_hw_fence_mem_addr hw_fences_mem_desc;
  314. struct msm_hw_fence_mem_addr clients_locks_mem_desc;
  315. struct msm_hw_fence_mem_addr ctrl_queue_mem_desc;
  316. struct msm_hw_fence_queue ctrl_queues[HW_FENCE_CTRL_QUEUES];
  317. /* carved out memory */
  318. void __iomem *io_mem_base;
  319. struct resource res;
  320. size_t size;
  321. u32 label;
  322. u32 peer_name;
  323. struct notifier_block rm_nb;
  324. u32 memparcel;
  325. u32 used_mem_size;
  326. /* doorbell */
  327. u32 db_label;
  328. /* VM virq */
  329. void *rx_dbl;
  330. /* debugfs */
  331. struct msm_hw_fence_dbg_data debugfs_data;
  332. /* ipcc regs */
  333. phys_addr_t ipcc_reg_base;
  334. void __iomem *ipcc_io_mem;
  335. uint32_t ipcc_size;
  336. u32 protocol_id;
  337. u32 ipcc_client_vid;
  338. u32 ipcc_client_pid;
  339. /* table with mapping of ipc client for each hw-fence client */
  340. struct hw_fence_client_ipc_map *ipc_clients_table;
  341. /* qtime reg */
  342. phys_addr_t qtime_reg_base;
  343. void __iomem *qtime_io_mem;
  344. uint32_t qtime_size;
  345. /* synchronize client_ids registration and deregistration */
  346. struct mutex clients_register_lock;
  347. /* table with registered client handles */
  348. struct msm_hw_fence_client **clients;
  349. bool vm_ready;
  350. /* state variables */
  351. bool ipcc_dpu_initialized;
  352. };
  353. /**
  354. * struct msm_hw_fence_queue_payload - hardware fence clients queues payload.
  355. * @size: size of queue payload
  356. * @type: type of queue payload
  357. * @version: version of queue payload. High eight bits are for major and lower eight
  358. * bits are for minor version
  359. * @ctxt_id: context id of the dma fence
  360. * @seqno: sequence number of the dma fence
  361. * @hash: fence hash
  362. * @flags: see MSM_HW_FENCE_FLAG_* flags descriptions
  363. * @client_data: data passed from and returned to waiting client upon fence signaling
  364. * @error: error code for this fence, fence controller receives this
  365. * error from the signaling client through the tx queue and
  366. * propagates the error to the waiting client through rx queue
  367. * @timestamp_lo: low 32-bits of qtime of when the payload is written into the queue
  368. * @timestamp_hi: high 32-bits of qtime of when the payload is written into the queue
  369. */
  370. struct msm_hw_fence_queue_payload {
  371. u32 size;
  372. u16 type;
  373. u16 version;
  374. u64 ctxt_id;
  375. u64 seqno;
  376. u64 hash;
  377. u64 flags;
  378. u64 client_data;
  379. u32 error;
  380. u32 timestamp_lo;
  381. u32 timestamp_hi;
  382. u32 reserve;
  383. };
  384. /**
  385. * struct msm_hw_fence_event - hardware fence ctl debug event
  386. * time: qtime when the event is logged
  387. * cpu: cpu id where the event is logged
  388. * data_cnt: count of valid data available in the data field
  389. * data: debug data logged by the event
  390. */
  391. struct msm_hw_fence_event {
  392. u64 time;
  393. u32 cpu;
  394. u32 data_cnt;
  395. u32 data[HW_FENCE_EVENT_MAX_DATA];
  396. };
  397. /**
  398. * struct msm_hw_fence - structure holding each hw fence data.
  399. * @valid: field updated when a hw-fence is reserved. True if hw-fence is in use
  400. * @error: field to hold a hw-fence error
  401. * @ctx_id: context id
  402. * @seq_id: sequence id
  403. * @wait_client_mask: bitmask holding the waiting-clients of the fence
  404. * @fence_allocator: field to indicate the client_id that reserved the fence
  405. * @fence_signal-client:
  406. * @lock: this field is required to share information between the Driver & Driver ||
  407. * Driver & FenceCTL. Needs to be 64-bit atomic inter-processor lock.
  408. * @flags: field to indicate the state of the fence
  409. * @parent_list: list of indexes with the parents for a child-fence in a join-fence
  410. * @parent_cnt: total number of parents for a child-fence in a join-fence
  411. * @pending_child_cnt: children refcount for a parent-fence in a join-fence. Access must be atomic
  412. * or locked
  413. * @fence_create_time: debug info with the create time timestamp
  414. * @fence_trigger_time: debug info with the trigger time timestamp
  415. * @fence_wait_time: debug info with the register-for-wait timestamp
  416. * @debug_refcount: refcount used for debugging
  417. * @client_data: array of data optionally passed from and returned to clients waiting on the fence
  418. * during fence signaling
  419. */
  420. struct msm_hw_fence {
  421. u32 valid;
  422. u32 error;
  423. u64 ctx_id;
  424. u64 seq_id;
  425. u64 wait_client_mask;
  426. u32 fence_allocator;
  427. u32 fence_signal_client;
  428. u64 lock; /* Datatype must be 64-bit. */
  429. u64 flags;
  430. u64 parent_list[MSM_HW_FENCE_MAX_JOIN_PARENTS];
  431. u32 parents_cnt;
  432. u32 pending_child_cnt;
  433. u64 fence_create_time;
  434. u64 fence_trigger_time;
  435. u64 fence_wait_time;
  436. u64 debug_refcount;
  437. u64 client_data[HW_FENCE_MAX_CLIENTS_WITH_DATA];
  438. };
  439. int hw_fence_init(struct hw_fence_driver_data *drv_data);
  440. int hw_fence_alloc_client_resources(struct hw_fence_driver_data *drv_data,
  441. struct msm_hw_fence_client *hw_fence_client,
  442. struct msm_hw_fence_mem_addr *mem_descriptor);
  443. int hw_fence_init_controller_signal(struct hw_fence_driver_data *drv_data,
  444. struct msm_hw_fence_client *hw_fence_client);
  445. int hw_fence_init_controller_resources(struct msm_hw_fence_client *hw_fence_client);
  446. void hw_fence_cleanup_client(struct hw_fence_driver_data *drv_data,
  447. struct msm_hw_fence_client *hw_fence_client);
  448. void hw_fence_utils_reset_queues(struct hw_fence_driver_data *drv_data,
  449. struct msm_hw_fence_client *hw_fence_client);
  450. int hw_fence_create(struct hw_fence_driver_data *drv_data,
  451. struct msm_hw_fence_client *hw_fence_client,
  452. u64 context, u64 seqno, u64 *hash);
  453. int hw_fence_destroy(struct hw_fence_driver_data *drv_data,
  454. struct msm_hw_fence_client *hw_fence_client,
  455. u64 context, u64 seqno);
  456. int hw_fence_destroy_with_hash(struct hw_fence_driver_data *drv_data,
  457. struct msm_hw_fence_client *hw_fence_client, u64 hash);
  458. int hw_fence_process_fence_array(struct hw_fence_driver_data *drv_data,
  459. struct msm_hw_fence_client *hw_fence_client,
  460. struct dma_fence_array *array, u64 *hash_join_fence, u64 client_data);
  461. int hw_fence_process_fence(struct hw_fence_driver_data *drv_data,
  462. struct msm_hw_fence_client *hw_fence_client, struct dma_fence *fence, u64 *hash,
  463. u64 client_data);
  464. int hw_fence_update_queue(struct hw_fence_driver_data *drv_data,
  465. struct msm_hw_fence_client *hw_fence_client, u64 ctxt_id, u64 seqno, u64 hash,
  466. u64 flags, u64 client_data, u32 error, int queue_type);
  467. int hw_fence_update_existing_txq_payload(struct hw_fence_driver_data *drv_data,
  468. struct msm_hw_fence_client *hw_fence_client, u64 hash, u32 error);
  469. inline u64 hw_fence_get_qtime(struct hw_fence_driver_data *drv_data);
  470. int hw_fence_read_queue(struct msm_hw_fence_client *hw_fence_client,
  471. struct msm_hw_fence_queue_payload *payload, int queue_type);
  472. int hw_fence_read_queue_helper(struct msm_hw_fence_queue *queue,
  473. struct msm_hw_fence_queue_payload *payload);
  474. int hw_fence_register_wait_client(struct hw_fence_driver_data *drv_data,
  475. struct dma_fence *fence, struct msm_hw_fence_client *hw_fence_client, u64 context,
  476. u64 seqno, u64 *hash, u64 client_data);
  477. struct msm_hw_fence *msm_hw_fence_find(struct hw_fence_driver_data *drv_data,
  478. struct msm_hw_fence_client *hw_fence_client,
  479. u64 context, u64 seqno, u64 *hash);
  480. enum hw_fence_client_data_id hw_fence_get_client_data_id(enum hw_fence_client_id client_id);
  481. #endif /* __HW_FENCE_DRV_INTERNAL_H */