coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
qup_se_handlers_common.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #ifndef __SOC_COMMON_QCOM_QUP_SE_H__
4 #define __SOC_COMMON_QCOM_QUP_SE_H__
5 
6 #include <console/console.h>
7 #include <device/mmio.h>
8 #include <gpio.h>
9 #include <soc/addressmap.h>
10 #include <timer.h>
11 #include <types.h>
12 
13 #define QC_GENMASK(h, l) (BIT(h + 1) - BIT(l))
14 
15 /* GENI_OUTPUT_CTRL fields */
16 #define DEFAULT_IO_OUTPUT_CTRL_MSK QC_GENMASK(6, 0)
17 
18 /* GENI_FORCE_DEFAULT_REG fields */
19 #define FORCE_DEFAULT BIT(0)
20 
21 #define GENI_FW_REVISION_RO_PROTOCOL_MASK 0x0000FF00
22 #define GENI_FW_REVISION_RO_PROTOCOL_SHIFT 0x00000008
23 
24 /* GENI_CGC_CTRL fields */
25 #define CFG_AHB_CLK_CGC_ON BIT(0)
26 #define CFG_AHB_WR_ACLK_CGC_ON BIT(1)
27 #define DATA_AHB_CLK_CGC_ON BIT(2)
28 #define SCLK_CGC_ON BIT(3)
29 #define TX_CLK_CGC_ON BIT(4)
30 #define RX_CLK_CGC_ON BIT(5)
31 #define EXT_CLK_CGC_ON BIT(6)
32 #define PROG_RAM_HCLK_OFF BIT(8)
33 #define PROG_RAM_SCLK_OFF BIT(9)
34 #define DEFAULT_CGC_EN (CFG_AHB_CLK_CGC_ON | CFG_AHB_WR_ACLK_CGC_ON \
35  | DATA_AHB_CLK_CGC_ON | SCLK_CGC_ON \
36  | TX_CLK_CGC_ON | RX_CLK_CGC_ON | EXT_CLK_CGC_ON)
37 
38 /* GENI_SER_M_CLK_CFG/GENI_SER_S_CLK_CFG */
39 #define SER_CLK_EN BIT(0)
40 #define CLK_DIV_SHFT 4
41 #define CLK_DIV_MSK (0xFFF << CLK_DIV_SHFT)
42 
43 /* FIFO_IF_DISABLE_RO fields */
44 #define FIFO_IF_DISABLE BIT(0)
45 
46 /* FW_REVISION_RO fields */
47 #define FW_REV_PROTOCOL_MSK QC_GENMASK(15, 8)
48 #define FW_REV_PROTOCOL_SHFT 8
49 #define FW_REV_VERSION_SHFT 0
50 
51 /* GENI_CLK_SEL fields */
52 #define CLK_SEL_MSK QC_GENMASK(2, 0)
53 
54 /* SE_GENI_DMA_MODE_EN */
55 #define GENI_DMA_MODE_EN BIT(0)
56 
57 /* GENI_M_CMD0 fields */
58 #define M_OPCODE_MSK QC_GENMASK(31, 27)
59 #define M_OPCODE_SHFT 27
60 #define M_PARAMS_MSK QC_GENMASK(26, 0)
61 
62 /* GENI_M_CMD_CTRL_REG */
63 #define M_GENI_CMD_CANCEL BIT(2)
64 #define M_GENI_CMD_ABORT BIT(1)
65 #define M_GENI_DISABLE BIT(0)
66 
67 /* GENI_S_CMD0 fields */
68 #define S_OPCODE_MSK QC_GENMASK(31, 27)
69 #define S_OPCODE_SHFT 27
70 #define S_PARAMS_MSK QC_GENMASK(26, 0)
71 
72 /* GENI_S_CMD_CTRL_REG */
73 #define S_GENI_CMD_CANCEL BIT(2)
74 #define S_GENI_CMD_ABORT BIT(1)
75 #define S_GENI_DISABLE BIT(0)
76 
77 /* GENI_M_IRQ_EN fields */
78 #define M_CMD_DONE_EN BIT(0)
79 #define M_CMD_OVERRUN_EN BIT(1)
80 #define M_ILLEGAL_CMD_EN BIT(2)
81 #define M_CMD_FAILURE_EN BIT(3)
82 #define M_CMD_CANCEL_EN BIT(4)
83 #define M_CMD_ABORT_EN BIT(5)
84 #define M_TIMESTAMP_EN BIT(6)
85 #define M_RX_IRQ_EN BIT(7)
86 #define M_GP_SYNC_IRQ_0_EN BIT(8)
87 #define M_GP_IRQ_0_EN BIT(9)
88 #define M_GP_IRQ_1_EN BIT(10)
89 #define M_GP_IRQ_2_EN BIT(11)
90 #define M_GP_IRQ_3_EN BIT(12)
91 #define M_GP_IRQ_4_EN BIT(13)
92 #define M_GP_IRQ_5_EN BIT(14)
93 #define M_IO_DATA_DEASSERT_EN BIT(22)
94 #define M_IO_DATA_ASSERT_EN BIT(23)
95 #define M_RX_FIFO_RD_ERR_EN BIT(24)
96 #define M_RX_FIFO_WR_ERR_EN BIT(25)
97 #define M_RX_FIFO_WATERMARK_EN BIT(26)
98 #define M_RX_FIFO_LAST_EN BIT(27)
99 #define M_TX_FIFO_RD_ERR_EN BIT(28)
100 #define M_TX_FIFO_WR_ERR_EN BIT(29)
101 #define M_TX_FIFO_WATERMARK_EN BIT(30)
102 #define M_SEC_IRQ_EN BIT(31)
103 #define M_COMMON_GENI_M_IRQ_EN (QC_GENMASK(6, 1) | \
104  M_IO_DATA_DEASSERT_EN | \
105  M_IO_DATA_ASSERT_EN | M_RX_FIFO_RD_ERR_EN | \
106  M_RX_FIFO_WR_ERR_EN | M_TX_FIFO_RD_ERR_EN | \
107  M_TX_FIFO_WR_ERR_EN)
108 
109 /* GENI_S_IRQ_EN fields */
110 #define S_CMD_DONE_EN BIT(0)
111 #define S_CMD_OVERRUN_EN BIT(1)
112 #define S_ILLEGAL_CMD_EN BIT(2)
113 #define S_CMD_FAILURE_EN BIT(3)
114 #define S_CMD_CANCEL_EN BIT(4)
115 #define S_CMD_ABORT_EN BIT(5)
116 #define S_GP_SYNC_IRQ_0_EN BIT(8)
117 #define S_GP_IRQ_0_EN BIT(9)
118 #define S_GP_IRQ_1_EN BIT(10)
119 #define S_GP_IRQ_2_EN BIT(11)
120 #define S_GP_IRQ_3_EN BIT(12)
121 #define S_GP_IRQ_4_EN BIT(13)
122 #define S_GP_IRQ_5_EN BIT(14)
123 #define S_IO_DATA_DEASSERT_EN BIT(22)
124 #define S_IO_DATA_ASSERT_EN BIT(23)
125 #define S_RX_FIFO_RD_ERR_EN BIT(24)
126 #define S_RX_FIFO_WR_ERR_EN BIT(25)
127 #define S_RX_FIFO_WATERMARK_EN BIT(26)
128 #define S_RX_FIFO_LAST_EN BIT(27)
129 #define S_COMMON_GENI_S_IRQ_EN (QC_GENMASK(5, 1) | QC_GENMASK(13, 9) | \
130  S_RX_FIFO_RD_ERR_EN | S_RX_FIFO_WR_ERR_EN)
131 
132 /* GENI_/TX/RX/RX_RFR/_WATERMARK_REG fields */
133 #define WATERMARK_MSK QC_GENMASK(5, 0)
134 
135 /* GENI_TX_FIFO_STATUS fields */
136 #define TX_FIFO_WC QC_GENMASK(27, 0)
137 
138 /* GENI_RX_FIFO_STATUS fields */
139 #define RX_LAST BIT(31)
140 #define RX_LAST_BYTE_VALID_MSK QC_GENMASK(30, 28)
141 #define RX_LAST_BYTE_VALID_SHFT 28
142 #define RX_FIFO_WC_MSK QC_GENMASK(24, 0)
143 
144 /* SE_IRQ_EN fields */
145 #define DMA_RX_IRQ_EN BIT(0)
146 #define DMA_TX_IRQ_EN BIT(1)
147 #define GENI_M_IRQ_EN BIT(2)
148 #define GENI_S_IRQ_EN BIT(3)
149 
150 /* SE_DMA_GENERAL_CFG */
151 #define DMA_RX_CLK_CGC_ON BIT(0)
152 #define DMA_TX_CLK_CGC_ON BIT(1)
153 #define DMA_AHB_SLV_CFG_ON BIT(2)
154 #define AHB_SEC_SLV_CLK_CGC_ON BIT(3)
155 #define DUMMY_RX_NON_BUFFERABLE BIT(4)
156 #define RX_DMA_ZERO_PADDING_EN BIT(5)
157 #define RX_DMA_IRQ_DELAY_MSK QC_GENMASK(8, 6)
158 #define RX_DMA_IRQ_DELAY_SHFT 6
159 
160 #define DEFAULT_SE_CLK (19200 * KHz)
161 #define GENI_DFS_IF_CFG_DFS_IF_EN_BMSK BIT(0)
162 
163 /* FIFO BUFFER PARAMETERS */
164 #define BYTES_PER_FIFO_WORD 4
165 #define FIFO_WIDTH 32
166 #define FIFO_DEPTH 16
167 #define BITS_PER_WORD 8
168 #define TX_WATERMARK 1
169 
170 /* PACKING CONFIGURATION VECTOR */
171 
172 /* start_idx:x: Bit position to move
173  * direction:1: MSB to LSB
174  * len:7: Represents bits-per-word = 8
175  * stop:0: Till it's 1, FIFO bit shift continues
176  */
177 
178 /* Start_idx:7, direction:1, len:7, stop:0 */
179 #define PACK_VECTOR0 0x0FE
180 /* Start_idx:15, direction:1, len:7, stop:0 */
181 #define PACK_VECTOR1 0x1FE
182 /* Start_idx:23, direction:1, len:7, stop:0 */
183 #define PACK_VECTOR2 0x2FE
184 /* Start_idx:31, direction:1, len:7, stop:1 */
185 #define PACK_VECTOR3 0x3FF
186 
192  SE_PROTOCOL_MAX = 5
193 };
194 
195 enum se_mode {
200  MIXED
201 };
202 
203 struct qup_regs {
206  u8 _reserved1[0x10 - 0x08];
209  u8 _reserved2[0x20 - 0x18];
215  u8 _reserved3[0x40 - 0x34];
221  u8 _reserved4[0x60 - 0x54];
231  u8 _reserved5[0x100 - 0x084];
251  u8 _reserved6[0x200 - 0x14C];
278  union {
281  };
282  union {
286  };
287  union {
291  };
310  u8 _reserved7[0x600 - 0x2BC];
313  u8 _reserved8[0x10 - 0x08];
321  u8 _reserved9[0x30 - 0x2C];
324  u8 _reserved10[0x40 - 0x38];
330  u8 _reserved11[0x700 - 0x654];
332  u8 _reserved12[0x780 - 0x704];
334  u8 _reserved13[0x800 - 0x784];
341  u8 _reserved14[0x900 - 0x818];
343  u8 _reserved15[0x908 - 0x904];
348  u8 _reserved16[0x920 - 0x918];
351  u8 _reserved17[0x930 - 0x928];
353  u8 _reserved18[0xA00 - 0x934];
355  u8 _reserved19[0xA80 - 0xA04];
362  u8 _reserved20[0xC30 - 0xA98];
375  u8 _reserved21[0xD30 - 0xC60];
389  u8 _reserved22[0xE14 - 0xD64];
398  u8 _reserved23[0x40 - 0x34];
402  u8 _reserved24[0x1000 - 0x0E4C];
405  u8 _reserved25[0x10-0x08];
407  u8 _reserved26[0x2000 - 0x1014];
414 };
415 
416 
417 check_member(qup_regs, geni_clk_sel, 0x7C);
418 check_member(qup_regs, geni_cfg_reg108, 0x2B0);
419 check_member(qup_regs, geni_dma_mode_en, 0x258);
420 check_member(qup_regs, geni_i3c_ibi_rd_data, 0xA84);
421 check_member(qup_regs, dma_test_bus_ctrl, 0xE44);
422 check_member(qup_regs, se_geni_cfg_ramn, 0x1010);
423 check_member(qup_regs, se_geni_fw_multilock_sp, 0x2014);
424 
425 
426 struct gsi_regs {
428  u8 _reserved1[0x8 - 0x4];
430  u8 _reserved2[0x14 - 0x10];
432  u8 _reserved3[0x18 - 0x14];
435  u8 _reserved4[0x60 - 0x20];
437  u8 _reserved5[0x80 - 0x64];
439  u8 _reserved6[0xB000 - 0x84];
441  u8 _reserved7[0xF018 - 0xB004];
443  u8 _reserved8[0xF400 - 0xF01C];
446  u8 _reserved9[0x4C000 - 0xF408];
448  u8 _reserved10[0x4000];
449 };
450 
451 check_member(gsi_regs, gsi_manager_mcs_code_ver, 0x8);
452 check_member(gsi_regs, gsi_zeros, 0x10);
453 check_member(gsi_regs, gsi_periph_base_lsb, 0x18);
454 check_member(gsi_regs, gsi_cgc_ctrl, 0x60);
455 check_member(gsi_regs, ee_n_gsi_ee_generic_cmd, 0xF018);
456 check_member(gsi_regs, gsi_ee_n_scratch_0_addr, 0xF400);
457 check_member(gsi_regs, gsi_ee_n_scratch_1_addr, 0xF404);
458 check_member(gsi_regs, gsi_inst_ramn, 0x4C000);
459 
460 
461 u32 qup_wait_for_m_irq(unsigned int bus);
462 u32 qup_wait_for_s_irq(unsigned int bus);
463 void qup_m_cancel_and_abort(unsigned int bus);
464 void qup_s_cancel_and_abort(unsigned int bus);
465 int qup_handle_transfer(unsigned int bus, const void *dout, void *din,
466  int size, struct stopwatch *timeout);
467 
468 #endif /* __SOC_COMMON_QCOM_QUP_SE_H__ */
u32 qup_wait_for_s_irq(unsigned int bus)
void qup_m_cancel_and_abort(unsigned int bus)
check_member(qup_regs, geni_clk_sel, 0x7C)
u32 qup_wait_for_m_irq(unsigned int bus)
Definition: qup_se_handler.c:7
int qup_handle_transfer(unsigned int bus, const void *dout, void *din, int size, struct stopwatch *timeout)
@ SE_PROTOCOL_MAX
@ SE_PROTOCOL_I2C
@ SE_PROTOCOL_UART
@ SE_PROTOCOL_SPI
@ SE_PROTOCOL_I3C
void qup_s_cancel_and_abort(unsigned int bus)
uint32_t u32
Definition: stdint.h:51
uint8_t u8
Definition: stdint.h:45
Definition: device.h:76
u8 _reserved1[0x8 - 0x4]
u8 _reserved9[0x4C000 - 0xF408]
u8 _reserved2[0x14 - 0x10]
u8 _reserved10[0x4000]
u8 _reserved3[0x18 - 0x14]
u8 _reserved4[0x60 - 0x20]
u8 _reserved8[0xF400 - 0xF01C]
u8 _reserved5[0x80 - 0x64]
u8 _reserved6[0xB000 - 0x84]
u8 _reserved7[0xF018 - 0xB004]
u8 _reserved2[0x20 - 0x18]
u8 _reserved19[0xA80 - 0xA04]
u8 _reserved12[0x780 - 0x704]
u8 _reserved4[0x60 - 0x54]
u8 _reserved25[0x10-0x08]
u8 _reserved26[0x2000 - 0x1014]
u8 _reserved6[0x200 - 0x14C]
u8 _reserved11[0x700 - 0x654]
u8 _reserved22[0xE14 - 0xD64]
u8 _reserved3[0x40 - 0x34]
u8 _reserved5[0x100 - 0x084]
u8 _reserved20[0xC30 - 0xA98]
u8 _reserved18[0xA00 - 0x934]
u8 _reserved14[0x900 - 0x818]
u8 _reserved21[0xD30 - 0xC60]
u8 _reserved16[0x920 - 0x918]
u8 _reserved8[0x10 - 0x08]
u8 _reserved13[0x800 - 0x784]
u8 _reserved10[0x40 - 0x38]
u8 _reserved1[0x10 - 0x08]
u8 _reserved7[0x600 - 0x2BC]
u8 _reserved17[0x930 - 0x928]
u8 _reserved24[0x1000 - 0x0E4C]
u32 geni_hw_irq_ignore_on_active
u8 _reserved23[0x40 - 0x34]
u8 _reserved9[0x30 - 0x2C]
u8 _reserved15[0x908 - 0x904]