q2spi-msm.h 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726
  1. /* SPDX-License-Identifier: GPL-2.0-only
  2. *
  3. * Copyright (c) 2023-2024 Qualcomm Innovation Center, Inc. All rights reserved.
  4. */
  5. #ifndef _SPI_Q2SPI_MSM_H_
  6. #define _SPI_Q2SPI_MSM_H_
  7. #include <linux/cdev.h>
  8. #include <linux/idr.h>
  9. #include <linux/ipc_logging.h>
  10. #include <linux/kthread.h>
  11. #include <linux/msm_gpi.h>
  12. #include <linux/poll.h>
  13. #include <linux/soc/qcom/geni-se.h>
  14. #include <linux/qcom-geni-se-common.h>
  15. #include <linux/types.h>
  16. #include <uapi/linux/q2spi/q2spi.h>
  17. #include "q2spi-gsi.h"
  18. #define DATA_WORD_LEN 4
  19. #define SMA_BUF_SIZE (4096)
  20. #define MAX_CR_SIZE 24 /* Max CR size is 24 bytes per CR */
  21. #define MAX_RX_CRS 4
  22. #define RX_DMA_CR_BUF_SIZE (MAX_CR_SIZE * MAX_RX_CRS)
  23. #define Q2SPI_MAX_BUF 2
  24. #define Q2SPI_MAX_RESP_BUF 40
  25. #define Q2SPI_RESP_BUF_SIZE SMA_BUF_SIZE
  26. #define XFER_TIMEOUT_OFFSET (250)
  27. #define Q2SPI_RESPONSE_WAIT_TIMEOUT (1000)
  28. #define EXT_CR_TIMEOUT_MSECS (50)
  29. #define TIMEOUT_MSECONDS 10 /* 10 milliseconds */
  30. #define RETRIES 1
  31. #define Q2SPI_MAX_DATA_LEN 4096
  32. #define Q2SPI_MAX_TX_RETRIES 5
  33. /* Host commands */
  34. #define HC_DB_REPORT_LEN_READ 1
  35. #define HC_DB_REPORT_BODY_READ 2
  36. #define HC_ABORT 3
  37. #define HC_DATA_READ 5
  38. #define HC_DATA_WRITE 6
  39. #define HC_SMA_READ 5
  40. #define HC_SMA_WRITE 6
  41. #define HC_SOFT_RESET 0xF
  42. #define CM_FLOW 1
  43. #define MC_FLOW 0
  44. #define CLIENT_INTERRUPT 1
  45. #define SEGMENT_LST 1
  46. #define LOCAL_REG_ACCESS 0
  47. #define SYSTEM_MEMORY_ACCESS 1
  48. #define CLIENT_ADDRESS 1
  49. #define NO_CLIENT_ADDRESS 0
  50. #define HC_SOFT_RESET_FLAGS 0xF
  51. #define HC_SOFT_RESET_CODE 0x2
  52. /* Client Requests */
  53. #define ADDR_LESS_WR_ACCESS 0x3
  54. #define ADDR_LESS_RD_ACCESS 0x4
  55. #define BULK_ACCESS_STATUS 0x8
  56. #define CR_EXTENSION 0xF
  57. #define CR_ADDR_LESS_WR 0xE3
  58. #define CR_ADDR_LESS_RD 0xF4
  59. #define CR_BULK_ACCESS_STATUS 0x98
  60. #define Q2SPI_HEADER_LEN 7 /* 7 bytes header excluding checksum we use in SW */
  61. #define DMA_Q2SPI_SIZE 2048
  62. #define MAX_DW_LEN_1 4 /* 4DWlen */
  63. #define MAX_DW_LEN_2 1024 /* for 1K DWlen */
  64. #define CS_LESS_MODE 0
  65. #define INTR_HIGH_POLARITY 1
  66. #define MAX_TX_SG (3)
  67. #define NUM_Q2SPI_XFER (10)
  68. #define Q2SPI_START_TID_ID (0)
  69. #define Q2SPI_END_TID_ID (8)
  70. /* Q2SPI specific SE GENI registers */
  71. #define IO_MACRO_IO3_DATA_IN_SEL_MASK GENMASK(15, 14)
  72. #define IO_MACRO_IO3_DATA_IN_SEL_SHIFT 14
  73. #define IO_MACRO_IO3_DATA_IN_SEL 1
  74. #define SE_SPI_TRANS_CFG 0x25c
  75. #define CS_TOGGLE BIT(1)
  76. #define SPI_NOT_USED_CFG1 BIT(2)
  77. #define SE_SPI_PRE_POST_CMD_DLY 0x274
  78. #define SPI_DELAYS_COUNTERS 0x278
  79. #define M_GP_CNT4_TAN 0
  80. #define M_GP_CNT4_TAN_MASK GENMASK(9, 0)
  81. #define M_GP_CNT5_TE2D GENMASK(19, 10)
  82. #define M_GP_CNT5_TE2D_SHIFT 10
  83. #define M_GP_CNT6_CN GENMASK(29, 20)
  84. #define M_GP_CNT6_CN_SHIFT 20
  85. #define SE_GENI_CFG_REG95 0x27C
  86. #define M_GP_CNT7 GENMASK(9, 0)
  87. #define M_GP_CNT7_TSN 0
  88. #define SPI_INTER_WORDS_DLY 0
  89. #define SPI_CS_CLK_DLY 0x80 /* 80 from VI SW, 128 from ganges SW */
  90. #define SPI_PIPE_DLY_TPM 0x320 /* 800 from VI SW */
  91. #define SE_GENI_CFG_REG103 0x29C
  92. #define S_GP_CNT5 GENMASK(19, 10)
  93. #define S_GP_CNT5_SHIFT 10
  94. #define S_GP_CNT5_TDN 0
  95. #define SE_GENI_CFG_REG104 0x2A0
  96. #define S_GP_CNT7 GENMASK(9, 0)
  97. #define S_GP_CNT7_SSN 0x80 /* 80 from VI SW, 128 from ganges SW */
  98. #define M_GP_CNT6_CN_DELAY 0x50 /*63 from VI SW, trying with 80 from SW */
  99. #define SE_SPI_WORD_LEN 0x268
  100. #define WORD_LEN_MSK GENMASK(9, 0)
  101. #define MIN_WORD_LEN 4
  102. #define NUMBER_OF_DATA_LINES GENMASK(1, 0)
  103. #define PARAM_14 BIT(14)
  104. #define SE_GENI_CGC_CTRL 0x28
  105. #define SE_GENI_CFG_SEQ_START 0x84
  106. #define SE_GENI_CFG_STATUS 0x88
  107. #define SE_UART_TX_TRANS_CFG 0x25C
  108. #define CFG_SEQ_DONE BIT(1)
  109. #define SPI_CS_CLK_DL 0
  110. #define SPI_PRE_POST_CMD_DLY 0
  111. #define SE_SPI_CPHA 0x224
  112. #define CPHA BIT(0)
  113. #define SE_SPI_CPOL 0x230
  114. #define CPOL BIT(2)
  115. #define SPI_LSB_TO_MSB 0
  116. #define SPI_MSB_TO_LSB 1
  117. #define SE_SPI_TX_TRANS_LEN 0x26c
  118. #define SE_SPI_RX_TRANS_LEN 0x270
  119. #define TRANS_LEN_MSK GENMASK(23, 0)
  120. /* HRF FLOW Info */
  121. #define HRF_ENTRY_OPCODE 3
  122. #define HRF_ENTRY_TYPE 3
  123. #define HRF_ENTRY_FLOW 0
  124. #define HRF_ENTRY_PARITY 0
  125. #define HRF_ENTRY_DATA_LEN 16 /* HRF entry always has DW=3 */
  126. #define Q2SPI_CLIENT_SLEEP_BYTE 0xFE
  127. #define Q2SPI_SLEEP_OPCODE 0xF
  128. #define LRA_SINGLE_REG_LENGTH 4
  129. /* M_CMD OP codes for Q2SPI */
  130. #define Q2SPI_TX_ONLY (1)
  131. #define Q2SPI_RX_ONLY (2)
  132. #define Q2SPI_TX_RX (7)
  133. /* M_CMD params for Q2SPI */
  134. #define PRE_CMD_DELAY BIT(0)
  135. #define TIMESTAMP_BEFORE BIT(1)
  136. #define TIMESTAMP_AFTER BIT(3)
  137. #define POST_CMD_DELAY BIT(4)
  138. #define Q2SPI_MODE GENMASK(11, 8)
  139. #define Q2SPI_MODE_SHIFT 8
  140. #define SINGLE_SDR_MODE 0
  141. #define Q2SPI_CMD BIT(14)
  142. #define CS_MODE CS_LESS_MODE
  143. #define Q2SPI_INTR_POL INTR_HIGH_POLARITY
  144. #define CR_BULK_DATA_SIZE 1
  145. #define CR_DMA_DATA_SIZE 7
  146. #define CR_EXTENSION_DATA_BYTES 5 /* 1 for EXTID + 4 Bytes for one 1DW */
  147. #define Q2SPI_HRF_SLEEP_CMD 0x100
  148. #define Q2SPI_AUTOSUSPEND_DELAY (XFER_TIMEOUT_OFFSET + 3000)
  149. #define PINCTRL_DEFAULT "default"
  150. #define PINCTRL_ACTIVE "active"
  151. #define PINCTRL_SLEEP "sleep"
  152. #define PINCTRL_SHUTDOWN "shutdown"
  153. /* Max Minor devices */
  154. #define MAX_DEV 2
  155. #define DEVICE_NAME_MAX_LEN 64
  156. #define QSPI_NUM_CS 2
  157. #define QSPI_BYTES_PER_WORD 4
  158. #define Q2SPI_RESP_BUF_RETRIES (100)
  159. #define Q2SPI_INFO(q2spi_ptr, x...) do { \
  160. if (q2spi_ptr) { \
  161. ipc_log_string(q2spi_ptr->ipc, x); \
  162. if (q2spi_ptr->dev) \
  163. q2spi_trace_log(q2spi_ptr->dev, x); \
  164. pr_info(x); \
  165. } \
  166. } while (0)
  167. #define Q2SPI_DEBUG(q2spi_ptr, x...) do { \
  168. if (q2spi_ptr) { \
  169. GENI_SE_DBG(q2spi_ptr->ipc, false, q2spi_ptr->dev, x); \
  170. if (q2spi_ptr->dev) \
  171. q2spi_trace_log(q2spi_ptr->dev, x); \
  172. } \
  173. } while (0)
  174. #define Q2SPI_ERROR(q2spi_ptr, x...) do { \
  175. if (q2spi_ptr) { \
  176. GENI_SE_ERR(q2spi_ptr->ipc, true, q2spi_ptr->dev, x); \
  177. if (q2spi_ptr->dev) \
  178. q2spi_trace_log(q2spi_ptr->dev, x); \
  179. } \
  180. } while (0)
  181. #define DATA_BYTES_PER_LINE (64)
  182. #define Q2SPI_DATA_DUMP_SIZE (16)
  183. static unsigned int q2spi_max_speed;
  184. /* global storage for device Major number */
  185. static int q2spi_cdev_major;
  186. /* global variable for system restart case */
  187. static bool q2spi_sys_restart;
  188. enum abort_code {
  189. TERMINATE_CMD = 0,
  190. ERR_DUPLICATE_ID = 1,
  191. ERR_NOT_VALID = 2,
  192. ERR_ACCESS_BLOCKED = 3,
  193. ERR_DWLEN = 4,
  194. OTHERS = 5,
  195. };
  196. enum q2spi_pkt_state {
  197. NOT_IN_USE = 0,
  198. IN_USE = 1,
  199. DATA_AVAIL = 2,
  200. IN_DELETION = 3,
  201. DELETED = 4,
  202. };
  203. enum q2spi_cr_hdr_type {
  204. CR_HDR_BULK = 1,
  205. CR_HDR_VAR3 = 2,
  206. CR_HDR_EXT = 3,
  207. };
  208. struct q2spi_mc_hrf_entry {
  209. u8 cmd:4;
  210. u8 flow:1;
  211. u8 type:2;
  212. u8 parity:1;
  213. u8 resrv_0:4;
  214. u8 flow_id:4;
  215. u8 resrv_1:4;
  216. u8 dwlen_part1:4;
  217. u8 dwlen_part2:8;
  218. u8 dwlen_part3:8;
  219. u8 arg1:8;
  220. u8 arg2:8;
  221. u8 arg3:8;
  222. u8 reserved[8];
  223. };
  224. /**
  225. * struct q2spi_ch_header structure of cr header
  226. * @flow: flow direction of cr hdr, 1: CM flow, 0: MC flow
  227. */
  228. struct q2spi_cr_header {
  229. u8 cmd:4;
  230. u8 flow:1;
  231. u8 type:2;
  232. u8 parity:1;
  233. };
  234. /**
  235. * q2spi_ext_cr_header - structure of extension CR header
  236. * @cmd: opcode command for CR Extension
  237. * @dw_len: specifies how many bytes are in this CR body
  238. * @parity: odd parity
  239. */
  240. struct q2spi_ext_cr_header {
  241. u8 cmd:4;
  242. u8 dw_len:2;
  243. u8 rsvd:1;
  244. u8 parity:1;
  245. };
  246. struct q2spi_client_bulk_access_pkt {
  247. u8 cmd:4;
  248. u8 flow:1;
  249. u8 rsvd:2;
  250. u8 parity:1;
  251. u8 status:4;
  252. u8 flow_id:4;
  253. u8 reserved[2];
  254. };
  255. struct q2spi_client_dma_pkt {
  256. u8 seg_len:4;
  257. u8 flow_id:4;
  258. u8 interrupt:1;
  259. u8 seg_last:1;
  260. u8 channel:2;
  261. u8 dw_len_part1:4;
  262. u8 dw_len_part2:8;
  263. u8 dw_len_part3:8;
  264. u8 arg1:8;
  265. u8 arg2:8;
  266. u8 arg3:8;
  267. };
  268. struct q2spi_host_variant1_pkt {
  269. u8 cmd:4;
  270. u8 flow:1;
  271. u8 interrupt:1;
  272. u8 seg_last:1;
  273. u8 rsvd:1;
  274. u8 dw_len:2;
  275. u8 access_type:1;
  276. u8 address_mode:1;
  277. u8 flow_id:4;
  278. u8 reg_offset;
  279. u8 reserved[4];
  280. u8 data_buf[16];
  281. u8 status;
  282. };
  283. struct q2spi_host_variant4_5_pkt {
  284. u8 cmd:4;
  285. u8 flow:1;
  286. u8 interrupt:1;
  287. u8 seg_last:1;
  288. u8 rsvd:1;
  289. u8 dw_len_part1:2;
  290. u8 access_type:1;
  291. u8 address_mode:1;
  292. u8 flow_id:4;
  293. u8 dw_len_part2;
  294. u8 rsvd_1[4];
  295. u8 data_buf[4096];
  296. u8 status;
  297. };
  298. struct q2spi_host_abort_pkt {
  299. u8 cmd:4;
  300. u8 rsvd:4;
  301. u8 code:4;
  302. u8 flow_id:4;
  303. u8 reserved[5];
  304. };
  305. struct q2spi_host_soft_reset_pkt {
  306. u8 cmd:4;
  307. u8 flags:4;
  308. u8 code:4;
  309. u8 rsvd:4;
  310. u8 rsvd_1[5];
  311. };
  312. enum cr_var_type {
  313. VARIANT_T_3 = 1, /* T:3 DMA CR type */
  314. VARIANT_T_4 = 2,
  315. VARIANT_T_5 = 3,
  316. };
  317. enum var_type {
  318. VARIANT_1_LRA = 1,
  319. VARIANT_1_HRF = 2,
  320. VARIANT_2 = 3,
  321. VARIANT_3 = 4,
  322. VARIANT_4 = 5,
  323. VARIANT_5 = 6,
  324. VARIANT_5_HRF = 7,
  325. VAR_ABORT = 8,
  326. VAR_SOFT_RESET = 9,
  327. };
  328. /**
  329. * struct q2spi_chrdev - structure for character device
  330. * q2spi_dev: q2spi device
  331. * @cdev: cdev pointer
  332. * @major: major number of q2spi device
  333. * @minor: minor number of q2spi device
  334. * @dev: basic device structure.
  335. * @dev_name: name of the device
  336. * @class_dev: pointer to char dev class
  337. * @q2spi_class: pointer to q2spi class
  338. */
  339. struct q2spi_chrdev {
  340. dev_t q2spi_dev;
  341. struct cdev cdev[MAX_DEV];
  342. int major;
  343. int minor;
  344. struct device *dev;
  345. char dev_name[DEVICE_NAME_MAX_LEN];
  346. struct device *class_dev;
  347. struct class *q2spi_class;
  348. };
  349. /**
  350. * struct q2spi_dma_transfer - q2spi transfer dmadata
  351. * @tx_buf: TX data buffer
  352. * @rx_buf: RX data buffer
  353. * @tx_len: length of the Tx transfer
  354. * @rx_len: length of the rx transfer
  355. * @tx_dma: dma pointer for Tx transfer
  356. * @rx_dma: dma pointer for Rx transfer
  357. * @cmd: q2spi cmd type
  358. * @tid: Unique Transaction ID. Used for q2spi messages.
  359. * @queue: struct list head
  360. * @q2spi_pkt: pointer to q2spi_pkt
  361. */
  362. struct q2spi_dma_transfer {
  363. void *tx_buf;
  364. void *rx_buf;
  365. unsigned int tx_len;
  366. unsigned int rx_len;
  367. unsigned int tx_data_len;
  368. unsigned int rx_data_len;
  369. dma_addr_t tx_dma;
  370. dma_addr_t rx_dma;
  371. enum cmd_type cmd;
  372. int tid;
  373. struct list_head queue;
  374. struct q2spi_packet *q2spi_pkt;
  375. };
  376. /**
  377. * struct q2spi_geni - structure to store Q2SPI GENI information
  378. *
  379. * @wrapper_dev: qupv3 wrapper device pointer
  380. * @dev: q2spi device pointer
  381. * @base: pointer to ioremap()'d registers
  382. * @m_ahb_clk: master ahb clock for the controller
  383. * @s_ahb_clk: slave ahb clock for the controller
  384. * @se_clk: serial engine clock
  385. * @geni_pinctrl: pin-controller's instance
  386. * @geni_gpio_default: default state pin control
  387. * @geni_gpio_active: active state pin control
  388. * @geni_gpio_sleep: sleep state pin control
  389. * @geni_gpio_shutdown: shutdown state pin control
  390. * q2spi_chrdev: cdev structure
  391. * @geni_se: stores info parsed from device tree
  392. * @gsi: stores GSI structure information
  393. * @qup_gsi_err: flahg to set incase of gsi errors
  394. * @db_xfer: reference to q2spi_dma_transfer structure for doorbell
  395. * @req: reference to q2spi request structure
  396. * @c_req: reference to q2spi client request structure
  397. * @setup_config0: used to mark config0 setup completion
  398. * @irq: IRQ of the SE
  399. * @tx_queue_list: list for HC packets
  400. * @kworker: kthread worker to process the q2spi requests
  401. * @send_messages: work function to process the q2spi requests
  402. * @gsi_lock: lock to protect gsi operations
  403. * @txn_lock: lock to protect transfer id allocation and free
  404. * @queue_lock: lock to protect HC operations
  405. * @send_msgs_lock: lock to protect q2spi_send_messages
  406. * @cr_queue_lock: lock to protect CR operations
  407. * @geni_resource_lock: lock to protect geni resource on/off
  408. * @max_speed_hz: stores maxspeed of the SCLK frequency
  409. * @cur_speed_hz: stores maxspeed of the SCLK frequency
  410. * @oversampling: stores sampling value based on major and minor version
  411. * @xfer_mode: stored mode of transfer
  412. * @curr_xfer_mode: stored current mode of transfer
  413. * @gsi_mode: flag for gsi mode
  414. * @tx_cb: completion for tx dma
  415. * @rx_cb: completion for rx dma
  416. * @db_rx_cb: completion for doobell rx dma
  417. * @wait_for_ext_cr: completion for extension cr
  418. * @rx_avail: used to notify the client for avaialble rx data
  419. * @tid_idr: tid id allocator
  420. * @readq: waitqueue for rx data
  421. * @hrf_flow: flag to indicate HRF flow
  422. * @db_q2spi_pkt: pointer to doorbell q2spi packet
  423. * @db_setup_wait: wait for doorbell setup done
  424. * @var1_buf: virtual pointer for variant1
  425. * @var1_dma_buf: physical dma pointer for variant1
  426. * @var1_buf_used: pointer to store variant1 buffer used
  427. * @var5_buf: virtual pointer for variant5
  428. * @var5_dma_buf: physical dma pointer for variant5
  429. * @var5_buf_used: pointer to store variant5 buffer used
  430. * @cr_buf: virtual pointer for CR
  431. * @cr_dma_buf: physical dma pointer for CR
  432. * @cr_buf_used: pointer to store CR buffer used
  433. * @bulk_buf: virtual pointer for bulk buffer
  434. * @bulk_dma_buf: physical dma pointer for bulk buffer
  435. * @bulk_buf_used: pointer to store bulk buffer used
  436. * @resp_buf: virtual pointer for resp buffer
  437. * @resp_dma_buf: physical dma pointer for resp buffer
  438. * @resp_buf_used: pointer to store resp buffer used
  439. * @sma_wait: completion for SMA
  440. * @ipc: pointer for ipc
  441. * @q2spi_doorbell_work: work to queue for doorbell process
  442. * @doorbell_wq: workqueue pointer fir doorbell
  443. * @q2spi_wakeup_work: work to queue for wakeup process
  444. * @wakeup_wq: workqueue pointer for wakeup
  445. * @hw_state_is_bad: used when HW is in un-recoverable state
  446. * @max_dump_data_size: max size of data to be dumped as part of dump_ipc function
  447. * @doorbell_pending: Set when independent doorbell CR received
  448. * @retry: used when independent doorbell processing is pending to retry the request from host
  449. * @alloc_count: reflects count of memory allocations done by q2spi_kzalloc
  450. * @sma_wr_pending: set when previous CR SMA write packet pending
  451. * @sma_rd_pending: set when previous CR SMA read packet pending
  452. * @resources_on: flag which reflects geni resources are turned on/off
  453. * @port_release: reflects if q2spi port is being closed
  454. * @is_suspend: reflects if q2spi driver is in system suspend
  455. * @m_clk_cfg: stires SER_M_CLK_CFG value to be retain after resources on
  456. * @doorbell_irq: doorbell irq
  457. * @wake_clk_gpio: GPIO for clk pin
  458. * @wake_mosi_gpio: GPIO for mosi pin
  459. */
  460. struct q2spi_geni {
  461. struct device *wrapper_dev;
  462. struct device *dev;
  463. void __iomem *base;
  464. struct clk *m_ahb_clk;
  465. struct clk *s_ahb_clk;
  466. struct clk *se_clk;
  467. struct pinctrl *geni_pinctrl;
  468. struct pinctrl_state *geni_gpio_default;
  469. struct pinctrl_state *geni_gpio_active;
  470. struct pinctrl_state *geni_gpio_sleep;
  471. struct pinctrl_state *geni_gpio_shutdown;
  472. struct q2spi_chrdev chrdev;
  473. struct geni_se se;
  474. struct q2spi_gsi *gsi;
  475. bool qup_gsi_err;
  476. struct q2spi_dma_transfer *db_xfer;
  477. struct q2spi_request *req;
  478. struct q2spi_client_request *c_req;
  479. bool setup_config0;
  480. int irq;
  481. struct list_head tx_queue_list;
  482. struct kthread_worker *kworker;
  483. struct kthread_work send_messages;
  484. /* lock to protect gsi operations one at a time */
  485. struct mutex gsi_lock;
  486. /* lock to protect transfer id allocation and free */
  487. spinlock_t txn_lock;
  488. /* lock to protect HC operations one at a time*/
  489. struct mutex queue_lock;
  490. /* lock to protect q2spi_send_messages */
  491. struct mutex send_msgs_lock;
  492. /* lock to protect CR of operations one at a time*/
  493. spinlock_t cr_queue_lock;
  494. /* lock to protect geni resource on/off */
  495. struct mutex geni_resource_lock;
  496. u32 max_speed_hz;
  497. u32 cur_speed_hz;
  498. int oversampling;
  499. int xfer_mode;
  500. int cur_xfer_mode;
  501. bool gsi_mode; /* GSI Mode */
  502. struct completion tx_cb;
  503. struct completion rx_cb;
  504. struct completion db_rx_cb;
  505. struct completion wait_for_ext_cr;
  506. atomic_t rx_avail;
  507. struct idr tid_idr;
  508. wait_queue_head_t readq;
  509. void *rx_buf;
  510. dma_addr_t rx_dma;
  511. bool hrf_flow;
  512. struct q2spi_packet *db_q2spi_pkt;
  513. struct completion db_setup_wait;
  514. void *var1_buf[Q2SPI_MAX_BUF];
  515. dma_addr_t var1_dma_buf[Q2SPI_MAX_BUF];
  516. void *var1_buf_used[Q2SPI_MAX_BUF];
  517. void *var5_buf[Q2SPI_MAX_BUF];
  518. dma_addr_t var5_dma_buf[Q2SPI_MAX_BUF];
  519. void *var5_buf_used[Q2SPI_MAX_BUF];
  520. void *cr_buf[Q2SPI_MAX_BUF];
  521. dma_addr_t cr_dma_buf[Q2SPI_MAX_BUF];
  522. void *cr_buf_used[Q2SPI_MAX_BUF];
  523. void *bulk_buf[Q2SPI_MAX_BUF];
  524. dma_addr_t bulk_dma_buf[Q2SPI_MAX_BUF];
  525. void *bulk_buf_used[Q2SPI_MAX_BUF];
  526. void *resp_buf[Q2SPI_MAX_RESP_BUF];
  527. dma_addr_t resp_dma_buf[Q2SPI_MAX_RESP_BUF];
  528. void *resp_buf_used[Q2SPI_MAX_RESP_BUF];
  529. dma_addr_t dma_buf;
  530. struct completion sma_wait;
  531. void *ipc;
  532. struct work_struct q2spi_doorbell_work;
  533. struct workqueue_struct *doorbell_wq;
  534. struct work_struct q2spi_wakeup_work;
  535. struct workqueue_struct *wakeup_wq;
  536. bool doorbell_setup;
  537. struct qup_q2spi_cr_header_event q2spi_cr_hdr_event;
  538. wait_queue_head_t read_wq;
  539. bool hw_state_is_bad;
  540. int max_data_dump_size;
  541. atomic_t doorbell_pending;
  542. atomic_t retry;
  543. atomic_t alloc_count;
  544. atomic_t sma_wr_pending;
  545. atomic_t sma_rd_pending;
  546. struct completion sma_wr_comp;
  547. struct completion sma_rd_comp;
  548. bool resources_on;
  549. bool port_release;
  550. atomic_t is_suspend;
  551. u32 m_clk_cfg;
  552. int doorbell_irq;
  553. int wake_clk_gpio;
  554. int wake_mosi_gpio;
  555. };
  556. /**
  557. * struct q2spi_cr_packet - structure for extension CR packet
  558. *
  559. * @cmd: opcode command for extension CR
  560. * @dw_len: specifies how many bytes are in this CR body
  561. * @parity: Odd parity
  562. * @extid: Extension ID for this CR
  563. * @byte: CR body bytes
  564. */
  565. struct q2spi_client_extension_pkt {
  566. u8 cmd:4;
  567. u8 dw_len:1;
  568. u8 reserved:1;
  569. u8 parity:1;
  570. u8 extid:8;
  571. u8 byte[16];
  572. };
  573. /**
  574. * struct q2spi_cr_packet - structure for Q2SPI CR packet
  575. *
  576. * @cr_hdr: array of q2spi_cr_header structures
  577. * @cr_hdr: array of q2spi_ext_cr_header structures
  578. * @var3_pkt: pointer for q2spi_client_dma_pkt structure
  579. * @bulk_pkt: pointer for q2spi_client_bulk_access_pkt structure
  580. * @extension_pkt: pointer for q2spi_client_extension_pkt structure
  581. * @cr_hdr_type: type of CR header corresponding to, defines in enum 'q2spi_cr_hdr_type'
  582. * @num_valid_crs: number of valid CRs in CR packet
  583. */
  584. struct q2spi_cr_packet {
  585. struct q2spi_cr_header cr_hdr[4];
  586. struct q2spi_ext_cr_header ext_cr_hdr;
  587. struct q2spi_client_dma_pkt var3_pkt[4]; /* 4.2.2.3 Variant 4 T=3 */
  588. struct q2spi_client_bulk_access_pkt bulk_pkt[4]; /* 4.2.2.5 Bulk Access Status */
  589. struct q2spi_client_extension_pkt extension_pkt; /* 4.2.2.6 Extension CR */
  590. u8 cr_hdr_type[4];
  591. int num_valid_crs;
  592. };
  593. /**
  594. * struct q2spi_packet - structure for Q2SPI packet
  595. *
  596. * @m_cmd_param: cmd corresponding to q2spi_packet
  597. * @var1_pkt: pointer for HC variant1_pkt structure
  598. * @var4_pkt: pointer for HC_variant4_5_pkt structure
  599. * @var5_pkt: pointer for HC variant4_5_pkt structure
  600. * @abort_pkt: pointer for abort_pkt structure
  601. * @soft_reset_pkt: pointer for q2spi_soft_reset_pkt structure
  602. * @xfer: pointer to dma_transfer structure
  603. * @vtype: variant type.
  604. * @valid: packet valid or not.
  605. * @flow_id: flow id used for transaction.
  606. * @status: success of failure xfer status
  607. * @var1_tx_dma: variant_1 tx_dma buffer pointer
  608. * @var5_tx_dma: variant_5 tx_dma buffer pointer
  609. * @soft_reset_tx_dma: soft_reset tx_dma buffer pointer
  610. * @sync: sync or async mode of transfer
  611. * @q2spi: pointer for q2spi_geni structure
  612. * @list: list for hc packets.
  613. * @state: state of q2spi packet, defined in enum q2spi_pkt_state
  614. * @data_length: Represents data length of the packet transfer
  615. * @bulk_done: used to check if bulk status is done for q2spi_pkt
  616. * @wait_for_db: used to check if doorbell came for q2spi_pkt
  617. * @cr_hdr: cr_hdr corresponding to q2spi_packet
  618. * @cr_var3: cr data corresponding to q2spi_packet
  619. * @cr_bulk: cr bulk data corresponding to q2spi_packet
  620. * @cr_hdr_type: cr header type corresponding to q2spi_packet
  621. * @var3_data_len: var3 type q2spi_packet length
  622. * @is_client_sleep_pkt: Indicate for sleep packet
  623. */
  624. struct q2spi_packet {
  625. unsigned int m_cmd_param;
  626. struct q2spi_host_variant1_pkt *var1_pkt; /* 4.4.3.1 Variant 1 */
  627. struct q2spi_host_variant4_5_pkt *var4_pkt; /*4.4.3.3 Variant 4 */
  628. struct q2spi_host_variant4_5_pkt *var5_pkt; /*4.4.3.3 Variant 5 */
  629. struct q2spi_host_abort_pkt *abort_pkt; /* 4.4.4 Abort Command */
  630. struct q2spi_host_soft_reset_pkt *soft_reset_pkt; /*4.4.6.2 Soft Reset Command */
  631. struct q2spi_dma_transfer *xfer;
  632. enum var_type vtype;
  633. bool valid;
  634. u8 flow_id;
  635. enum xfer_status status;
  636. dma_addr_t var1_tx_dma;
  637. dma_addr_t var5_tx_dma;
  638. dma_addr_t var1_rx_dma;
  639. dma_addr_t var5_rx_dma;
  640. dma_addr_t soft_reset_tx_dma;
  641. bool sync;
  642. struct q2spi_geni *q2spi;
  643. struct list_head list;
  644. u8 state;
  645. unsigned int data_length;
  646. struct completion bulk_wait;
  647. struct completion wait_for_db;
  648. /* CR data corresponding to q2spi_packet */
  649. struct q2spi_cr_header cr_hdr;
  650. struct q2spi_client_dma_pkt cr_var3;
  651. struct q2spi_client_bulk_access_pkt cr_bulk;
  652. int cr_hdr_type;
  653. int var3_data_len;
  654. bool is_client_sleep_pkt;
  655. };
  656. void q2spi_doorbell(struct q2spi_geni *q2spi, const struct qup_q2spi_cr_header_event *event);
  657. void q2spi_gsi_ch_ev_cb(struct dma_chan *ch, struct msm_gpi_cb const *cb, void *ptr);
  658. void q2spi_geni_se_dump_regs(struct q2spi_geni *q2spi);
  659. void q2spi_dump_ipc(struct q2spi_geni *q2spi, void *ipc_ctx, char *prefix, char *str, int size);
  660. void q2spi_trace_log(struct device *dev, const char *fmt, ...);
  661. void dump_ipc(struct q2spi_geni *q2spi, void *ctx, char *prefix, char *str, int size);
  662. void *q2spi_kzalloc(struct q2spi_geni *q2spi, int size, int line);
  663. void q2spi_kfree(struct q2spi_geni *q2spi, void *ptr, int line);
  664. int q2spi_setup_gsi_xfer(struct q2spi_packet *q2spi_pkt);
  665. int q2spi_alloc_xfer_tid(struct q2spi_geni *q2spi);
  666. int q2spi_geni_gsi_setup(struct q2spi_geni *q2spi);
  667. void q2spi_geni_gsi_release(struct q2spi_geni *q2spi);
  668. int check_gsi_transfer_completion(struct q2spi_geni *q2spi);
  669. int check_gsi_transfer_completion_db_rx(struct q2spi_geni *q2spi);
  670. int q2spi_read_reg(struct q2spi_geni *q2spi, int reg_offset);
  671. void q2spi_dump_client_error_regs(struct q2spi_geni *q2spi);
  672. int q2spi_geni_resources_on(struct q2spi_geni *q2spi);
  673. void q2spi_geni_resources_off(struct q2spi_geni *q2spi);
  674. int __q2spi_send_messages(struct q2spi_geni *q2spi, void *ptr);
  675. int q2spi_wakeup_hw_through_gpio(struct q2spi_geni *q2spi);
  676. int q2spi_process_hrf_flow_after_lra(struct q2spi_geni *q2spi, struct q2spi_packet *q2spi_pkt);
  677. void q2spi_transfer_soft_reset(struct q2spi_geni *q2spi);
  678. #endif /* _SPI_Q2SPI_MSM_H_ */