bam.h 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright (c) 2011-2019, 2021, The Linux Foundation. All rights reserved.
  4. * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
  5. */
  6. /* Bus-Access-Manager (BAM) Hardware manager functions API. */
  7. #ifndef _BAM_H_
  8. #define _BAM_H_
  9. #include <linux/types.h>
  10. #include <linux/io.h>
  11. #include <linux/bitops.h>
  12. #include "spsi.h"
  13. /* Pipe mode */
  14. enum bam_pipe_mode {
  15. BAM_PIPE_MODE_BAM2BAM = 0, /* BAM to BAM */
  16. BAM_PIPE_MODE_SYSTEM = 1, /* BAM to/from System Memory */
  17. };
  18. /* Pipe direction */
  19. enum bam_pipe_dir {
  20. /* The Pipe Reads data from data-fifo or system-memory */
  21. BAM_PIPE_CONSUMER = 0,
  22. /* The Pipe Writes data to data-fifo or system-memory */
  23. BAM_PIPE_PRODUCER = 1,
  24. };
  25. /* Stream mode Type */
  26. enum bam_stream_mode {
  27. BAM_STREAM_MODE_DISABLE = 0,
  28. BAM_STREAM_MODE_ENABLE = 1,
  29. };
  30. /* NWD written Type */
  31. enum bam_write_nwd {
  32. BAM_WRITE_NWD_DISABLE = 0,
  33. BAM_WRITE_NWD_ENABLE = 1,
  34. };
  35. /* Enable Type */
  36. enum bam_enable {
  37. BAM_DISABLE = 0,
  38. BAM_ENABLE = 1,
  39. };
  40. /* Pipe timer mode */
  41. enum bam_pipe_timer_mode {
  42. BAM_PIPE_TIMER_ONESHOT = 0,
  43. BAM_PIPE_TIMER_PERIODIC = 1,
  44. };
  45. struct transfer_descriptor {
  46. u32 addr; /* Buffer physical address */
  47. u32 size:16; /* Buffer size in bytes */
  48. u32 flags:16; /* Flag bitmask (see SPS_IOVEC_FLAG_ #defines) */
  49. } __packed;
  50. /* BAM pipe initialization parameters */
  51. struct bam_pipe_parameters {
  52. u16 event_threshold;
  53. u32 pipe_irq_mask;
  54. enum bam_pipe_dir dir;
  55. enum bam_pipe_mode mode;
  56. enum bam_write_nwd write_nwd;
  57. phys_addr_t desc_base; /* Physical address of descriptor FIFO */
  58. u32 desc_size; /* Size (bytes) of descriptor FIFO */
  59. u32 lock_group; /* The lock group this pipe belongs to */
  60. enum bam_stream_mode stream_mode;
  61. u32 ee; /* BAM execution environment index */
  62. /* The following are only valid if mode is BAM2BAM */
  63. u32 peer_phys_addr;
  64. u32 peer_pipe;
  65. phys_addr_t data_base; /* Physical address of data FIFO */
  66. u32 data_size; /* Size (bytes) of data FIFO */
  67. bool dummy_peer;
  68. };
  69. /**
  70. * Initialize a BAM device
  71. *
  72. * This function initializes a BAM device.
  73. *
  74. * @base - BAM virtual base address.
  75. *
  76. * @ee - BAM execution environment index
  77. *
  78. * @summing_threshold - summing threshold (global for all pipes)
  79. *
  80. * @irq_mask - error interrupts mask
  81. *
  82. * @version - return BAM hardware version
  83. *
  84. * @num_pipes - return number of pipes
  85. *
  86. * @options - BAM configuration options
  87. *
  88. * @return 0 on success, negative value on error
  89. *
  90. */
  91. int bam_init(void *base,
  92. u32 ee,
  93. u16 summing_threshold,
  94. u32 irq_mask, u32 *version,
  95. u32 *num_pipes, u32 options);
  96. /**
  97. * Initialize BAM device security execution environment
  98. *
  99. * @base - BAM virtual base address.
  100. *
  101. * @ee - BAM execution environment index
  102. *
  103. * @vmid - virtual master identifier
  104. *
  105. * @pipe_mask - bit mask of pipes to assign to EE
  106. *
  107. * @return 0 on success, negative value on error
  108. *
  109. */
  110. int bam_security_init(void *base, u32 ee, u32 vmid, u32 pipe_mask);
  111. /**
  112. * Check a BAM device
  113. *
  114. * This function verifies that a BAM device is enabled and gathers
  115. * the hardware configuration.
  116. *
  117. * @base - BAM virtual base address.
  118. *
  119. * @version - return BAM hardware version
  120. *
  121. * @ee - BAM execution environment index
  122. *
  123. * @num_pipes - return number of pipes
  124. *
  125. * @return 0 on success, negative value on error
  126. *
  127. */
  128. int bam_check(void *base, u32 *version, u32 ee, u32 *num_pipes);
  129. /**
  130. * Disable a BAM device
  131. *
  132. * This function disables a BAM device.
  133. *
  134. * @base - BAM virtual base address.
  135. *
  136. * @ee - BAM execution environment index
  137. *
  138. */
  139. void bam_exit(void *base, u32 ee);
  140. /**
  141. * This function prints BAM register content
  142. * including TEST_BUS and PIPE register content.
  143. *
  144. * @base - BAM virtual base address.
  145. *
  146. * @ee - BAM execution environment index
  147. */
  148. void bam_output_register_content(void *base, u32 ee);
  149. /**
  150. * Get BAM IRQ source and clear global IRQ status
  151. *
  152. * This function gets BAM IRQ source.
  153. * Clear global IRQ status if it is non-zero.
  154. *
  155. * @base - BAM virtual base address.
  156. *
  157. * @ee - BAM execution environment index
  158. *
  159. * @mask - active pipes mask.
  160. *
  161. * @case - callback case.
  162. *
  163. * @return IRQ status
  164. *
  165. */
  166. u32 bam_check_irq_source(void *base, u32 ee, u32 mask,
  167. enum sps_callback_case *cb_case);
  168. /**
  169. * Set BAM global interrupts
  170. *
  171. * This function initializes a BAM device.
  172. *
  173. * @base - BAM virtual base address.
  174. *
  175. * @ee - BAM execution environment index
  176. *
  177. * @mask - error interrupts mask
  178. *
  179. * @en - Enable or Disable interrupt
  180. *
  181. */
  182. void bam_set_global_irq(void *base, u32 ee, u32 mask, bool en);
  183. /**
  184. * Initialize a BAM pipe
  185. *
  186. * This function initializes a BAM pipe.
  187. *
  188. * @base - BAM virtual base address.
  189. *
  190. * @pipe - pipe index
  191. *
  192. * @param - bam pipe parameters.
  193. *
  194. * @ee - BAM execution environment index
  195. *
  196. * @return 0 on success, negative value on error
  197. *
  198. */
  199. int bam_pipe_init(void *base, u32 pipe, struct bam_pipe_parameters *param,
  200. u32 ee);
  201. /**
  202. * Reset the BAM pipe
  203. *
  204. * This function resets the BAM pipe.
  205. *
  206. * @base - BAM virtual base address.
  207. *
  208. * @pipe - pipe index
  209. *
  210. * @ee - BAM execution environment index
  211. *
  212. */
  213. void bam_pipe_exit(void *base, u32 pipe, u32 ee);
  214. /**
  215. * Enable a BAM pipe
  216. *
  217. * This function enables a BAM pipe.
  218. *
  219. * @base - BAM virtual base address.
  220. *
  221. * @pipe - pipe index
  222. *
  223. */
  224. void bam_pipe_enable(void *base, u32 pipe);
  225. /**
  226. * Disable a BAM pipe
  227. *
  228. * This function disables a BAM pipe.
  229. *
  230. * @base - BAM virtual base address.
  231. *
  232. * @pipe - pipe index
  233. *
  234. */
  235. void bam_pipe_disable(void *base, u32 pipe);
  236. /**
  237. * Get a BAM pipe enable state
  238. *
  239. * This function determines if a BAM pipe is enabled.
  240. *
  241. * @base - BAM virtual base address.
  242. *
  243. * @pipe - pipe index
  244. *
  245. * @return true if enabled, false if disabled
  246. *
  247. */
  248. int bam_pipe_is_enabled(void *base, u32 pipe);
  249. /**
  250. * Configure interrupt for a BAM pipe
  251. *
  252. * This function configures the interrupt for a BAM pipe.
  253. *
  254. * @base - BAM virtual base address.
  255. *
  256. * @pipe - pipe index
  257. *
  258. * @irq_en - enable or disable interrupt
  259. *
  260. * @src_mask - interrupt source mask, set regardless of whether
  261. * interrupt is disabled
  262. *
  263. * @ee - BAM execution environment index
  264. *
  265. */
  266. void bam_pipe_set_irq(void *base, u32 pipe, enum bam_enable irq_en,
  267. u32 src_mask, u32 ee);
  268. /**
  269. * Configure a BAM pipe for satellite MTI use
  270. *
  271. * This function configures a BAM pipe for satellite MTI use.
  272. *
  273. * @base - BAM virtual base address.
  274. *
  275. * @pipe - pipe index
  276. *
  277. * @irq_gen_addr - physical address written to generate MTI
  278. *
  279. * @ee - BAM execution environment index
  280. *
  281. */
  282. void bam_pipe_satellite_mti(void *base, u32 pipe, u32 irq_gen_addr, u32 ee);
  283. /**
  284. * Configure MTI for a BAM pipe
  285. *
  286. * This function configures the interrupt for a BAM pipe.
  287. *
  288. * @base - BAM virtual base address.
  289. *
  290. * @pipe - pipe index
  291. *
  292. * @irq_en - enable or disable interrupt
  293. *
  294. * @src_mask - interrupt source mask, set regardless of whether
  295. * interrupt is disabled
  296. *
  297. * @irq_gen_addr - physical address written to generate MTI
  298. *
  299. */
  300. void bam_pipe_set_mti(void *base, u32 pipe, enum bam_enable irq_en,
  301. u32 src_mask, u32 irq_gen_addr);
  302. /**
  303. * Get and Clear BAM pipe IRQ status
  304. *
  305. * This function gets and clears BAM pipe IRQ status.
  306. *
  307. * @base - BAM virtual base address.
  308. *
  309. * @pipe - pipe index
  310. *
  311. * @return IRQ status
  312. *
  313. */
  314. u32 bam_pipe_get_and_clear_irq_status(void *base, u32 pipe);
  315. /**
  316. * Set write offset for a BAM pipe
  317. *
  318. * This function sets the write offset for a BAM pipe. This is
  319. * the offset that is maintained by software in system mode.
  320. *
  321. * @base - BAM virtual base address.
  322. *
  323. * @pipe - pipe index
  324. *
  325. * @next_write - descriptor FIFO write offset
  326. *
  327. */
  328. void bam_pipe_set_desc_write_offset(void *base, u32 pipe, u32 next_write);
  329. /**
  330. * Get write offset for a BAM pipe
  331. *
  332. * This function gets the write offset for a BAM pipe. This is
  333. * the offset that is maintained by the pipe's peer pipe or by software.
  334. *
  335. * @base - BAM virtual base address.
  336. *
  337. * @pipe - pipe index
  338. *
  339. * @return descriptor FIFO write offset
  340. *
  341. */
  342. u32 bam_pipe_get_desc_write_offset(void *base, u32 pipe);
  343. /**
  344. * Get read offset for a BAM pipe
  345. *
  346. * This function gets the read offset for a BAM pipe. This is
  347. * the offset that is maintained by the pipe in system mode.
  348. *
  349. * @base - BAM virtual base address.
  350. *
  351. * @pipe - pipe index
  352. *
  353. * @return descriptor FIFO read offset
  354. *
  355. */
  356. u32 bam_pipe_get_desc_read_offset(void *base, u32 pipe);
  357. /**
  358. * Configure inactivity timer count for a BAM pipe
  359. *
  360. * This function configures the inactivity timer count for a BAM pipe.
  361. *
  362. * @base - BAM virtual base address.
  363. *
  364. * @pipe - pipe index
  365. *
  366. * @mode - timer operating mode
  367. *
  368. * @timeout_count - timeout count
  369. *
  370. */
  371. void bam_pipe_timer_config(void *base, u32 pipe,
  372. enum bam_pipe_timer_mode mode,
  373. u32 timeout_count);
  374. /**
  375. * Reset inactivity timer for a BAM pipe
  376. *
  377. * This function resets the inactivity timer count for a BAM pipe.
  378. *
  379. * @base - BAM virtual base address.
  380. *
  381. * @pipe - pipe index
  382. *
  383. */
  384. void bam_pipe_timer_reset(void *base, u32 pipe);
  385. /**
  386. * Get inactivity timer count for a BAM pipe
  387. *
  388. * This function gets the inactivity timer count for a BAM pipe.
  389. *
  390. * @base - BAM virtual base address.
  391. *
  392. * @pipe - pipe index
  393. *
  394. * @return inactivity timer count
  395. *
  396. */
  397. u32 bam_pipe_timer_get_count(void *base, u32 pipe);
  398. /*
  399. * bam_pipe_check_zlt - Check if the last desc is ZLT.
  400. * @base: BAM virtual address
  401. * @pipe: pipe index
  402. *
  403. * This function checks if the last desc in the desc FIFO is a ZLT desc.
  404. *
  405. * @return true if the last desc in the desc FIFO is a ZLT desc. Otherwise
  406. * return false.
  407. */
  408. bool bam_pipe_check_zlt(void *base, u32 pipe);
  409. /*
  410. * bam_pipe_check_pipe_empty - Check if desc FIFO is empty.
  411. * @base: BAM virtual address
  412. * @pipe: pipe index
  413. *
  414. * This function checks if the desc FIFO of this pipe is empty.
  415. *
  416. * @return true if desc FIFO is empty. Otherwise return false.
  417. */
  418. bool bam_pipe_check_pipe_empty(void *base, u32 pipe);
  419. #endif /* _BAM_H_ */