xref: /linux/drivers/net/wireless/realtek/rtw89/pci.h (revision 073350da0aa2aead9df7927a1c1046ebf5cdd816)
1e3ec7017SPing-Ke Shih /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
2e3ec7017SPing-Ke Shih /* Copyright(c) 2020  Realtek Corporation
3e3ec7017SPing-Ke Shih  */
4e3ec7017SPing-Ke Shih 
5e3ec7017SPing-Ke Shih #ifndef __RTW89_PCI_H__
6e3ec7017SPing-Ke Shih #define __RTW89_PCI_H__
7e3ec7017SPing-Ke Shih 
8e3ec7017SPing-Ke Shih #include "txrx.h"
9e3ec7017SPing-Ke Shih 
10e3ec7017SPing-Ke Shih #define MDIO_PG0_G1 0
11e3ec7017SPing-Ke Shih #define MDIO_PG1_G1 1
12e3ec7017SPing-Ke Shih #define MDIO_PG0_G2 2
13e3ec7017SPing-Ke Shih #define MDIO_PG1_G2 3
14e3ec7017SPing-Ke Shih #define RAC_ANA10			0x10
15740c431cSPing-Ke Shih #define RAC_REG_REV2			0x1B
16740c431cSPing-Ke Shih #define BAC_CMU_EN_DLY_MASK		GENMASK(15, 12)
17740c431cSPing-Ke Shih #define PCIE_DPHY_DLY_25US		0x1
18e3ec7017SPing-Ke Shih #define RAC_ANA19			0x19
19e3ec7017SPing-Ke Shih #define RAC_ANA1F			0x1F
20e3ec7017SPing-Ke Shih #define RAC_ANA24			0x24
21e3ec7017SPing-Ke Shih #define B_AX_DEGLITCH			GENMASK(11, 8)
22e3ec7017SPing-Ke Shih #define RAC_ANA26			0x26
23e3ec7017SPing-Ke Shih #define B_AX_RXEN			GENMASK(15, 14)
24e3ec7017SPing-Ke Shih #define RAC_CTRL_PPR_V1			0x30
25e3ec7017SPing-Ke Shih #define B_AX_CLK_CALIB_EN		BIT(12)
26e3ec7017SPing-Ke Shih #define B_AX_CALIB_EN			BIT(13)
27e3ec7017SPing-Ke Shih #define B_AX_DIV			GENMASK(15, 14)
28e3ec7017SPing-Ke Shih #define RAC_SET_PPR_V1			0x31
29e3ec7017SPing-Ke Shih 
30e3ec7017SPing-Ke Shih #define R_AX_DBI_FLAG			0x1090
31e3ec7017SPing-Ke Shih #define B_AX_DBI_RFLAG			BIT(17)
32e3ec7017SPing-Ke Shih #define B_AX_DBI_WFLAG			BIT(16)
33e3ec7017SPing-Ke Shih #define B_AX_DBI_WREN_MSK		GENMASK(15, 12)
34e3ec7017SPing-Ke Shih #define B_AX_DBI_ADDR_MSK		GENMASK(11, 2)
35e3ec7017SPing-Ke Shih #define R_AX_DBI_WDATA			0x1094
36e3ec7017SPing-Ke Shih #define R_AX_DBI_RDATA			0x1098
37e3ec7017SPing-Ke Shih 
38e3ec7017SPing-Ke Shih #define R_AX_MDIO_WDATA			0x10A4
39e3ec7017SPing-Ke Shih #define R_AX_MDIO_RDATA			0x10A6
40e3ec7017SPing-Ke Shih 
41e1e7a574SPing-Ke Shih #define R_AX_PCIE_PS_CTRL_V1		0x3008
42e1e7a574SPing-Ke Shih #define B_AX_CMAC_EXIT_L1_EN		BIT(7)
43e1e7a574SPing-Ke Shih #define B_AX_DMAC0_EXIT_L1_EN		BIT(6)
44e1e7a574SPing-Ke Shih #define B_AX_SEL_XFER_PENDING		BIT(3)
45e1e7a574SPing-Ke Shih #define B_AX_SEL_REQ_ENTR_L1		BIT(2)
46e1e7a574SPing-Ke Shih #define B_AX_SEL_REQ_EXIT_L1		BIT(0)
47e1e7a574SPing-Ke Shih 
48740c431cSPing-Ke Shih #define R_AX_PCIE_BG_CLR		0x303C
49740c431cSPing-Ke Shih #define B_AX_BG_CLR_ASYNC_M3		BIT(4)
50740c431cSPing-Ke Shih 
51740c431cSPing-Ke Shih #define R_AX_PCIE_IO_RCY_M1 0x3100
52740c431cSPing-Ke Shih #define B_AX_PCIE_IO_RCY_P_M1 BIT(5)
53740c431cSPing-Ke Shih #define B_AX_PCIE_IO_RCY_WDT_P_M1 BIT(4)
54740c431cSPing-Ke Shih #define B_AX_PCIE_IO_RCY_WDT_MODE_M1 BIT(3)
55740c431cSPing-Ke Shih #define B_AX_PCIE_IO_RCY_TRIG_M1 BIT(0)
56740c431cSPing-Ke Shih 
57740c431cSPing-Ke Shih #define R_AX_PCIE_WDT_TIMER_M1 0x3104
58740c431cSPing-Ke Shih #define B_AX_PCIE_WDT_TIMER_M1_MASK GENMASK(31, 0)
59740c431cSPing-Ke Shih 
60740c431cSPing-Ke Shih #define R_AX_PCIE_IO_RCY_M2 0x310C
61740c431cSPing-Ke Shih #define B_AX_PCIE_IO_RCY_P_M2 BIT(5)
62740c431cSPing-Ke Shih #define B_AX_PCIE_IO_RCY_WDT_P_M2 BIT(4)
63740c431cSPing-Ke Shih #define B_AX_PCIE_IO_RCY_WDT_MODE_M2 BIT(3)
64740c431cSPing-Ke Shih #define B_AX_PCIE_IO_RCY_TRIG_M2 BIT(0)
65740c431cSPing-Ke Shih 
66740c431cSPing-Ke Shih #define R_AX_PCIE_WDT_TIMER_M2 0x3110
67740c431cSPing-Ke Shih #define B_AX_PCIE_WDT_TIMER_M2_MASK GENMASK(31, 0)
68740c431cSPing-Ke Shih 
69740c431cSPing-Ke Shih #define R_AX_PCIE_IO_RCY_E0 0x3118
70740c431cSPing-Ke Shih #define B_AX_PCIE_IO_RCY_P_E0 BIT(5)
71740c431cSPing-Ke Shih #define B_AX_PCIE_IO_RCY_WDT_P_E0 BIT(4)
72740c431cSPing-Ke Shih #define B_AX_PCIE_IO_RCY_WDT_MODE_E0 BIT(3)
73740c431cSPing-Ke Shih #define B_AX_PCIE_IO_RCY_TRIG_E0 BIT(0)
74740c431cSPing-Ke Shih 
75740c431cSPing-Ke Shih #define R_AX_PCIE_WDT_TIMER_E0 0x311C
76740c431cSPing-Ke Shih #define B_AX_PCIE_WDT_TIMER_E0_MASK GENMASK(31, 0)
77740c431cSPing-Ke Shih 
78740c431cSPing-Ke Shih #define R_AX_PCIE_IO_RCY_S1 0x3124
79740c431cSPing-Ke Shih #define B_AX_PCIE_IO_RCY_RP_S1 BIT(7)
80740c431cSPing-Ke Shih #define B_AX_PCIE_IO_RCY_WP_S1 BIT(6)
81740c431cSPing-Ke Shih #define B_AX_PCIE_IO_RCY_WDT_RP_S1 BIT(5)
82740c431cSPing-Ke Shih #define B_AX_PCIE_IO_RCY_WDT_WP_S1 BIT(4)
83740c431cSPing-Ke Shih #define B_AX_PCIE_IO_RCY_WDT_MODE_S1 BIT(3)
84740c431cSPing-Ke Shih #define B_AX_PCIE_IO_RCY_RTRIG_S1 BIT(1)
85740c431cSPing-Ke Shih #define B_AX_PCIE_IO_RCY_WTRIG_S1 BIT(0)
86740c431cSPing-Ke Shih 
87740c431cSPing-Ke Shih #define R_AX_PCIE_WDT_TIMER_S1 0x3128
88740c431cSPing-Ke Shih #define B_AX_PCIE_WDT_TIMER_S1_MASK GENMASK(31, 0)
89740c431cSPing-Ke Shih 
9022a66e7cSPing-Ke Shih #define R_RAC_DIRECT_OFFSET_G1 0x3800
9122a66e7cSPing-Ke Shih #define R_RAC_DIRECT_OFFSET_G2 0x3880
9222a66e7cSPing-Ke Shih 
93e3ec7017SPing-Ke Shih #define RTW89_PCI_WR_RETRY_CNT		20
94e3ec7017SPing-Ke Shih 
95e3ec7017SPing-Ke Shih /* Interrupts */
96e3ec7017SPing-Ke Shih #define R_AX_HIMR0 0x01A0
97e3ec7017SPing-Ke Shih #define B_AX_HALT_C2H_INT_EN BIT(21)
98e3ec7017SPing-Ke Shih #define R_AX_HISR0 0x01A4
99e3ec7017SPing-Ke Shih 
100948e521cSPing-Ke Shih #define R_AX_HIMR1 0x01A8
101948e521cSPing-Ke Shih #define B_AX_GPIO18_INT_EN BIT(2)
102948e521cSPing-Ke Shih #define B_AX_GPIO17_INT_EN BIT(1)
103948e521cSPing-Ke Shih #define B_AX_GPIO16_INT_EN BIT(0)
104948e521cSPing-Ke Shih 
105948e521cSPing-Ke Shih #define R_AX_HISR1 0x01AC
106948e521cSPing-Ke Shih #define B_AX_GPIO18_INT BIT(2)
107948e521cSPing-Ke Shih #define B_AX_GPIO17_INT BIT(1)
108948e521cSPing-Ke Shih #define B_AX_GPIO16_INT BIT(0)
109948e521cSPing-Ke Shih 
110e3ec7017SPing-Ke Shih #define R_AX_MDIO_CFG			0x10A0
111e3ec7017SPing-Ke Shih #define B_AX_MDIO_PHY_ADDR_MASK		GENMASK(13, 12)
112e3ec7017SPing-Ke Shih #define B_AX_MDIO_RFLAG			BIT(9)
113e3ec7017SPing-Ke Shih #define B_AX_MDIO_WFLAG			BIT(8)
114e3ec7017SPing-Ke Shih #define B_AX_MDIO_ADDR_MASK		GENMASK(4, 0)
115e3ec7017SPing-Ke Shih 
116e3ec7017SPing-Ke Shih #define R_AX_PCIE_HIMR00	0x10B0
117948e521cSPing-Ke Shih #define R_AX_HAXI_HIMR00 0x10B0
118e3ec7017SPing-Ke Shih #define B_AX_HC00ISR_IND_INT_EN		BIT(27)
119e3ec7017SPing-Ke Shih #define B_AX_HD1ISR_IND_INT_EN		BIT(26)
120e3ec7017SPing-Ke Shih #define B_AX_HD0ISR_IND_INT_EN		BIT(25)
121e3ec7017SPing-Ke Shih #define B_AX_HS0ISR_IND_INT_EN		BIT(24)
122e3ec7017SPing-Ke Shih #define B_AX_RETRAIN_INT_EN		BIT(21)
123e3ec7017SPing-Ke Shih #define B_AX_RPQBD_FULL_INT_EN		BIT(20)
124e3ec7017SPing-Ke Shih #define B_AX_RDU_INT_EN			BIT(19)
125e3ec7017SPing-Ke Shih #define B_AX_RXDMA_STUCK_INT_EN		BIT(18)
126e3ec7017SPing-Ke Shih #define B_AX_TXDMA_STUCK_INT_EN		BIT(17)
127e3ec7017SPing-Ke Shih #define B_AX_PCIE_HOTRST_INT_EN		BIT(16)
128e3ec7017SPing-Ke Shih #define B_AX_PCIE_FLR_INT_EN		BIT(15)
129e3ec7017SPing-Ke Shih #define B_AX_PCIE_PERST_INT_EN		BIT(14)
130e3ec7017SPing-Ke Shih #define B_AX_TXDMA_CH12_INT_EN		BIT(13)
131e3ec7017SPing-Ke Shih #define B_AX_TXDMA_CH9_INT_EN		BIT(12)
132e3ec7017SPing-Ke Shih #define B_AX_TXDMA_CH8_INT_EN		BIT(11)
133e3ec7017SPing-Ke Shih #define B_AX_TXDMA_ACH7_INT_EN		BIT(10)
134e3ec7017SPing-Ke Shih #define B_AX_TXDMA_ACH6_INT_EN		BIT(9)
135e3ec7017SPing-Ke Shih #define B_AX_TXDMA_ACH5_INT_EN		BIT(8)
136e3ec7017SPing-Ke Shih #define B_AX_TXDMA_ACH4_INT_EN		BIT(7)
137e3ec7017SPing-Ke Shih #define B_AX_TXDMA_ACH3_INT_EN		BIT(6)
138e3ec7017SPing-Ke Shih #define B_AX_TXDMA_ACH2_INT_EN		BIT(5)
139e3ec7017SPing-Ke Shih #define B_AX_TXDMA_ACH1_INT_EN		BIT(4)
140e3ec7017SPing-Ke Shih #define B_AX_TXDMA_ACH0_INT_EN		BIT(3)
141e3ec7017SPing-Ke Shih #define B_AX_RPQDMA_INT_EN		BIT(2)
142e3ec7017SPing-Ke Shih #define B_AX_RXP1DMA_INT_EN		BIT(1)
143e3ec7017SPing-Ke Shih #define B_AX_RXDMA_INT_EN		BIT(0)
144e3ec7017SPing-Ke Shih 
145e3ec7017SPing-Ke Shih #define R_AX_PCIE_HISR00	0x10B4
146948e521cSPing-Ke Shih #define R_AX_HAXI_HISR00 0x10B4
147e3ec7017SPing-Ke Shih #define B_AX_HC00ISR_IND_INT		BIT(27)
148e3ec7017SPing-Ke Shih #define B_AX_HD1ISR_IND_INT		BIT(26)
149e3ec7017SPing-Ke Shih #define B_AX_HD0ISR_IND_INT		BIT(25)
150e3ec7017SPing-Ke Shih #define B_AX_HS0ISR_IND_INT		BIT(24)
151e3ec7017SPing-Ke Shih #define B_AX_RETRAIN_INT		BIT(21)
152e3ec7017SPing-Ke Shih #define B_AX_RPQBD_FULL_INT		BIT(20)
153e3ec7017SPing-Ke Shih #define B_AX_RDU_INT			BIT(19)
154e3ec7017SPing-Ke Shih #define B_AX_RXDMA_STUCK_INT		BIT(18)
155e3ec7017SPing-Ke Shih #define B_AX_TXDMA_STUCK_INT		BIT(17)
156e3ec7017SPing-Ke Shih #define B_AX_PCIE_HOTRST_INT		BIT(16)
157e3ec7017SPing-Ke Shih #define B_AX_PCIE_FLR_INT		BIT(15)
158e3ec7017SPing-Ke Shih #define B_AX_PCIE_PERST_INT		BIT(14)
159e3ec7017SPing-Ke Shih #define B_AX_TXDMA_CH12_INT		BIT(13)
160e3ec7017SPing-Ke Shih #define B_AX_TXDMA_CH9_INT		BIT(12)
161e3ec7017SPing-Ke Shih #define B_AX_TXDMA_CH8_INT		BIT(11)
162e3ec7017SPing-Ke Shih #define B_AX_TXDMA_ACH7_INT		BIT(10)
163e3ec7017SPing-Ke Shih #define B_AX_TXDMA_ACH6_INT		BIT(9)
164e3ec7017SPing-Ke Shih #define B_AX_TXDMA_ACH5_INT		BIT(8)
165e3ec7017SPing-Ke Shih #define B_AX_TXDMA_ACH4_INT		BIT(7)
166e3ec7017SPing-Ke Shih #define B_AX_TXDMA_ACH3_INT		BIT(6)
167e3ec7017SPing-Ke Shih #define B_AX_TXDMA_ACH2_INT		BIT(5)
168e3ec7017SPing-Ke Shih #define B_AX_TXDMA_ACH1_INT		BIT(4)
169e3ec7017SPing-Ke Shih #define B_AX_TXDMA_ACH0_INT		BIT(3)
170e3ec7017SPing-Ke Shih #define B_AX_RPQDMA_INT			BIT(2)
171e3ec7017SPing-Ke Shih #define B_AX_RXP1DMA_INT		BIT(1)
172e3ec7017SPing-Ke Shih #define B_AX_RXDMA_INT			BIT(0)
173e3ec7017SPing-Ke Shih 
174948e521cSPing-Ke Shih #define R_AX_HAXI_HIMR10 0x11E0
175948e521cSPing-Ke Shih #define B_AX_TXDMA_CH11_INT_EN_V1 BIT(1)
176948e521cSPing-Ke Shih #define B_AX_TXDMA_CH10_INT_EN_V1 BIT(0)
177948e521cSPing-Ke Shih 
178e3ec7017SPing-Ke Shih #define R_AX_PCIE_HIMR10	0x13B0
179e3ec7017SPing-Ke Shih #define B_AX_HC10ISR_IND_INT_EN		BIT(28)
180e3ec7017SPing-Ke Shih #define B_AX_TXDMA_CH11_INT_EN		BIT(12)
181e3ec7017SPing-Ke Shih #define B_AX_TXDMA_CH10_INT_EN		BIT(11)
182e3ec7017SPing-Ke Shih 
183e3ec7017SPing-Ke Shih #define R_AX_PCIE_HISR10	0x13B4
184e3ec7017SPing-Ke Shih #define B_AX_HC10ISR_IND_INT		BIT(28)
185e3ec7017SPing-Ke Shih #define B_AX_TXDMA_CH11_INT		BIT(12)
186e3ec7017SPing-Ke Shih #define B_AX_TXDMA_CH10_INT		BIT(11)
187e3ec7017SPing-Ke Shih 
188948e521cSPing-Ke Shih #define R_AX_PCIE_HIMR00_V1 0x30B0
189948e521cSPing-Ke Shih #define B_AX_HCI_AXIDMA_INT_EN BIT(29)
190948e521cSPing-Ke Shih #define B_AX_HC00ISR_IND_INT_EN_V1 BIT(28)
191948e521cSPing-Ke Shih #define B_AX_HD1ISR_IND_INT_EN_V1 BIT(27)
192948e521cSPing-Ke Shih #define B_AX_HD0ISR_IND_INT_EN_V1 BIT(26)
193948e521cSPing-Ke Shih #define B_AX_HS1ISR_IND_INT_EN BIT(25)
194948e521cSPing-Ke Shih #define B_AX_PCIE_DBG_STE_INT_EN BIT(13)
195948e521cSPing-Ke Shih 
196948e521cSPing-Ke Shih #define R_AX_PCIE_HISR00_V1 0x30B4
197948e521cSPing-Ke Shih #define B_AX_HCI_AXIDMA_INT BIT(29)
198948e521cSPing-Ke Shih #define B_AX_HC00ISR_IND_INT_V1 BIT(28)
199948e521cSPing-Ke Shih #define B_AX_HD1ISR_IND_INT_V1 BIT(27)
200948e521cSPing-Ke Shih #define B_AX_HD0ISR_IND_INT_V1 BIT(26)
201948e521cSPing-Ke Shih #define B_AX_HS1ISR_IND_INT BIT(25)
202948e521cSPing-Ke Shih #define B_AX_PCIE_DBG_STE_INT BIT(13)
203948e521cSPing-Ke Shih 
204e3ec7017SPing-Ke Shih /* TX/RX */
205*52edbb9fSPing-Ke Shih #define R_AX_DRV_FW_HSK_0	0x01B0
206*52edbb9fSPing-Ke Shih #define R_AX_DRV_FW_HSK_1	0x01B4
207*52edbb9fSPing-Ke Shih #define R_AX_DRV_FW_HSK_2	0x01B8
208*52edbb9fSPing-Ke Shih #define R_AX_DRV_FW_HSK_3	0x01BC
209*52edbb9fSPing-Ke Shih #define R_AX_DRV_FW_HSK_4	0x01C0
210*52edbb9fSPing-Ke Shih #define R_AX_DRV_FW_HSK_5	0x01C4
211*52edbb9fSPing-Ke Shih #define R_AX_DRV_FW_HSK_6	0x01C8
212*52edbb9fSPing-Ke Shih #define R_AX_DRV_FW_HSK_7	0x01CC
213*52edbb9fSPing-Ke Shih 
214e3ec7017SPing-Ke Shih #define R_AX_RXQ_RXBD_IDX	0x1050
215e3ec7017SPing-Ke Shih #define R_AX_RPQ_RXBD_IDX	0x1054
216e3ec7017SPing-Ke Shih #define R_AX_ACH0_TXBD_IDX	0x1058
217e3ec7017SPing-Ke Shih #define R_AX_ACH1_TXBD_IDX	0x105C
218e3ec7017SPing-Ke Shih #define R_AX_ACH2_TXBD_IDX	0x1060
219e3ec7017SPing-Ke Shih #define R_AX_ACH3_TXBD_IDX	0x1064
220e3ec7017SPing-Ke Shih #define R_AX_ACH4_TXBD_IDX	0x1068
221e3ec7017SPing-Ke Shih #define R_AX_ACH5_TXBD_IDX	0x106C
222e3ec7017SPing-Ke Shih #define R_AX_ACH6_TXBD_IDX	0x1070
223e3ec7017SPing-Ke Shih #define R_AX_ACH7_TXBD_IDX	0x1074
224e3ec7017SPing-Ke Shih #define R_AX_CH8_TXBD_IDX	0x1078 /* Management Queue band 0 */
225e3ec7017SPing-Ke Shih #define R_AX_CH9_TXBD_IDX	0x107C /* HI Queue band 0 */
226e3ec7017SPing-Ke Shih #define R_AX_CH10_TXBD_IDX	0x137C /* Management Queue band 1 */
227e3ec7017SPing-Ke Shih #define R_AX_CH11_TXBD_IDX	0x1380 /* HI Queue band 1 */
228e3ec7017SPing-Ke Shih #define R_AX_CH12_TXBD_IDX	0x1080 /* FWCMD Queue */
22997d61bf9SPing-Ke Shih #define R_AX_CH10_TXBD_IDX_V1	0x11D0
23097d61bf9SPing-Ke Shih #define R_AX_CH11_TXBD_IDX_V1	0x11D4
23197d61bf9SPing-Ke Shih #define R_AX_RXQ_RXBD_IDX_V1	0x1218
23297d61bf9SPing-Ke Shih #define R_AX_RPQ_RXBD_IDX_V1	0x121C
233e3ec7017SPing-Ke Shih #define TXBD_HW_IDX_MASK	GENMASK(27, 16)
234e3ec7017SPing-Ke Shih #define TXBD_HOST_IDX_MASK	GENMASK(11, 0)
235e3ec7017SPing-Ke Shih 
236e3ec7017SPing-Ke Shih #define R_AX_ACH0_TXBD_DESA_L	0x1110
237e3ec7017SPing-Ke Shih #define R_AX_ACH0_TXBD_DESA_H	0x1114
238e3ec7017SPing-Ke Shih #define R_AX_ACH1_TXBD_DESA_L	0x1118
239e3ec7017SPing-Ke Shih #define R_AX_ACH1_TXBD_DESA_H	0x111C
240e3ec7017SPing-Ke Shih #define R_AX_ACH2_TXBD_DESA_L	0x1120
241e3ec7017SPing-Ke Shih #define R_AX_ACH2_TXBD_DESA_H	0x1124
242e3ec7017SPing-Ke Shih #define R_AX_ACH3_TXBD_DESA_L	0x1128
243e3ec7017SPing-Ke Shih #define R_AX_ACH3_TXBD_DESA_H	0x112C
244e3ec7017SPing-Ke Shih #define R_AX_ACH4_TXBD_DESA_L	0x1130
245e3ec7017SPing-Ke Shih #define R_AX_ACH4_TXBD_DESA_H	0x1134
246e3ec7017SPing-Ke Shih #define R_AX_ACH5_TXBD_DESA_L	0x1138
247e3ec7017SPing-Ke Shih #define R_AX_ACH5_TXBD_DESA_H	0x113C
248e3ec7017SPing-Ke Shih #define R_AX_ACH6_TXBD_DESA_L	0x1140
249e3ec7017SPing-Ke Shih #define R_AX_ACH6_TXBD_DESA_H	0x1144
250e3ec7017SPing-Ke Shih #define R_AX_ACH7_TXBD_DESA_L	0x1148
251e3ec7017SPing-Ke Shih #define R_AX_ACH7_TXBD_DESA_H	0x114C
252e3ec7017SPing-Ke Shih #define R_AX_CH8_TXBD_DESA_L	0x1150
253e3ec7017SPing-Ke Shih #define R_AX_CH8_TXBD_DESA_H	0x1154
254e3ec7017SPing-Ke Shih #define R_AX_CH9_TXBD_DESA_L	0x1158
255e3ec7017SPing-Ke Shih #define R_AX_CH9_TXBD_DESA_H	0x115C
256e3ec7017SPing-Ke Shih #define R_AX_CH10_TXBD_DESA_L	0x1358
257e3ec7017SPing-Ke Shih #define R_AX_CH10_TXBD_DESA_H	0x135C
258e3ec7017SPing-Ke Shih #define R_AX_CH11_TXBD_DESA_L	0x1360
259e3ec7017SPing-Ke Shih #define R_AX_CH11_TXBD_DESA_H	0x1364
260e3ec7017SPing-Ke Shih #define R_AX_CH12_TXBD_DESA_L	0x1160
261e3ec7017SPing-Ke Shih #define R_AX_CH12_TXBD_DESA_H	0x1164
262e3ec7017SPing-Ke Shih #define R_AX_RXQ_RXBD_DESA_L	0x1100
263e3ec7017SPing-Ke Shih #define R_AX_RXQ_RXBD_DESA_H	0x1104
264e3ec7017SPing-Ke Shih #define R_AX_RPQ_RXBD_DESA_L	0x1108
265e3ec7017SPing-Ke Shih #define R_AX_RPQ_RXBD_DESA_H	0x110C
26697d61bf9SPing-Ke Shih #define R_AX_RXQ_RXBD_DESA_L_V1 0x1220
26797d61bf9SPing-Ke Shih #define R_AX_RXQ_RXBD_DESA_H_V1 0x1224
26897d61bf9SPing-Ke Shih #define R_AX_RPQ_RXBD_DESA_L_V1 0x1228
26997d61bf9SPing-Ke Shih #define R_AX_RPQ_RXBD_DESA_H_V1 0x122C
27097d61bf9SPing-Ke Shih #define R_AX_ACH0_TXBD_DESA_L_V1 0x1230
27197d61bf9SPing-Ke Shih #define R_AX_ACH0_TXBD_DESA_H_V1 0x1234
27297d61bf9SPing-Ke Shih #define R_AX_ACH1_TXBD_DESA_L_V1 0x1238
27397d61bf9SPing-Ke Shih #define R_AX_ACH1_TXBD_DESA_H_V1 0x123C
27497d61bf9SPing-Ke Shih #define R_AX_ACH2_TXBD_DESA_L_V1 0x1240
27597d61bf9SPing-Ke Shih #define R_AX_ACH2_TXBD_DESA_H_V1 0x1244
27697d61bf9SPing-Ke Shih #define R_AX_ACH3_TXBD_DESA_L_V1 0x1248
27797d61bf9SPing-Ke Shih #define R_AX_ACH3_TXBD_DESA_H_V1 0x124C
27897d61bf9SPing-Ke Shih #define R_AX_ACH4_TXBD_DESA_L_V1 0x1250
27997d61bf9SPing-Ke Shih #define R_AX_ACH4_TXBD_DESA_H_V1 0x1254
28097d61bf9SPing-Ke Shih #define R_AX_ACH5_TXBD_DESA_L_V1 0x1258
28197d61bf9SPing-Ke Shih #define R_AX_ACH5_TXBD_DESA_H_V1 0x125C
28297d61bf9SPing-Ke Shih #define R_AX_ACH6_TXBD_DESA_L_V1 0x1260
28397d61bf9SPing-Ke Shih #define R_AX_ACH6_TXBD_DESA_H_V1 0x1264
28497d61bf9SPing-Ke Shih #define R_AX_ACH7_TXBD_DESA_L_V1 0x1268
28597d61bf9SPing-Ke Shih #define R_AX_ACH7_TXBD_DESA_H_V1 0x126C
28697d61bf9SPing-Ke Shih #define R_AX_CH8_TXBD_DESA_L_V1 0x1270
28797d61bf9SPing-Ke Shih #define R_AX_CH8_TXBD_DESA_H_V1 0x1274
28897d61bf9SPing-Ke Shih #define R_AX_CH9_TXBD_DESA_L_V1 0x1278
28997d61bf9SPing-Ke Shih #define R_AX_CH9_TXBD_DESA_H_V1 0x127C
29097d61bf9SPing-Ke Shih #define R_AX_CH12_TXBD_DESA_L_V1 0x1280
29197d61bf9SPing-Ke Shih #define R_AX_CH12_TXBD_DESA_H_V1 0x1284
29297d61bf9SPing-Ke Shih #define R_AX_CH10_TXBD_DESA_L_V1 0x1458
29397d61bf9SPing-Ke Shih #define R_AX_CH10_TXBD_DESA_H_V1 0x145C
29497d61bf9SPing-Ke Shih #define R_AX_CH11_TXBD_DESA_L_V1 0x1460
29597d61bf9SPing-Ke Shih #define R_AX_CH11_TXBD_DESA_H_V1 0x1464
296e3ec7017SPing-Ke Shih #define B_AX_DESC_NUM_MSK		GENMASK(11, 0)
297e3ec7017SPing-Ke Shih 
298e3ec7017SPing-Ke Shih #define R_AX_RXQ_RXBD_NUM	0x1020
299e3ec7017SPing-Ke Shih #define R_AX_RPQ_RXBD_NUM	0x1022
300e3ec7017SPing-Ke Shih #define R_AX_ACH0_TXBD_NUM	0x1024
301e3ec7017SPing-Ke Shih #define R_AX_ACH1_TXBD_NUM	0x1026
302e3ec7017SPing-Ke Shih #define R_AX_ACH2_TXBD_NUM	0x1028
303e3ec7017SPing-Ke Shih #define R_AX_ACH3_TXBD_NUM	0x102A
304e3ec7017SPing-Ke Shih #define R_AX_ACH4_TXBD_NUM	0x102C
305e3ec7017SPing-Ke Shih #define R_AX_ACH5_TXBD_NUM	0x102E
306e3ec7017SPing-Ke Shih #define R_AX_ACH6_TXBD_NUM	0x1030
307e3ec7017SPing-Ke Shih #define R_AX_ACH7_TXBD_NUM	0x1032
308e3ec7017SPing-Ke Shih #define R_AX_CH8_TXBD_NUM	0x1034
309e3ec7017SPing-Ke Shih #define R_AX_CH9_TXBD_NUM	0x1036
310e3ec7017SPing-Ke Shih #define R_AX_CH10_TXBD_NUM	0x1338
311e3ec7017SPing-Ke Shih #define R_AX_CH11_TXBD_NUM	0x133A
312e3ec7017SPing-Ke Shih #define R_AX_CH12_TXBD_NUM	0x1038
31397d61bf9SPing-Ke Shih #define R_AX_RXQ_RXBD_NUM_V1	0x1210
31497d61bf9SPing-Ke Shih #define R_AX_RPQ_RXBD_NUM_V1	0x1212
31597d61bf9SPing-Ke Shih #define R_AX_CH10_TXBD_NUM_V1	0x1438
31697d61bf9SPing-Ke Shih #define R_AX_CH11_TXBD_NUM_V1	0x143A
317e3ec7017SPing-Ke Shih 
318e3ec7017SPing-Ke Shih #define R_AX_ACH0_BDRAM_CTRL	0x1200
319e3ec7017SPing-Ke Shih #define R_AX_ACH1_BDRAM_CTRL	0x1204
320e3ec7017SPing-Ke Shih #define R_AX_ACH2_BDRAM_CTRL	0x1208
321e3ec7017SPing-Ke Shih #define R_AX_ACH3_BDRAM_CTRL	0x120C
322e3ec7017SPing-Ke Shih #define R_AX_ACH4_BDRAM_CTRL	0x1210
323e3ec7017SPing-Ke Shih #define R_AX_ACH5_BDRAM_CTRL	0x1214
324e3ec7017SPing-Ke Shih #define R_AX_ACH6_BDRAM_CTRL	0x1218
325e3ec7017SPing-Ke Shih #define R_AX_ACH7_BDRAM_CTRL	0x121C
326e3ec7017SPing-Ke Shih #define R_AX_CH8_BDRAM_CTRL	0x1220
327e3ec7017SPing-Ke Shih #define R_AX_CH9_BDRAM_CTRL	0x1224
328e3ec7017SPing-Ke Shih #define R_AX_CH10_BDRAM_CTRL	0x1320
329e3ec7017SPing-Ke Shih #define R_AX_CH11_BDRAM_CTRL	0x1324
330e3ec7017SPing-Ke Shih #define R_AX_CH12_BDRAM_CTRL	0x1228
33197d61bf9SPing-Ke Shih #define R_AX_ACH0_BDRAM_CTRL_V1 0x1300
33297d61bf9SPing-Ke Shih #define R_AX_ACH1_BDRAM_CTRL_V1 0x1304
33397d61bf9SPing-Ke Shih #define R_AX_ACH2_BDRAM_CTRL_V1 0x1308
33497d61bf9SPing-Ke Shih #define R_AX_ACH3_BDRAM_CTRL_V1 0x130C
33597d61bf9SPing-Ke Shih #define R_AX_ACH4_BDRAM_CTRL_V1 0x1310
33697d61bf9SPing-Ke Shih #define R_AX_ACH5_BDRAM_CTRL_V1 0x1314
33797d61bf9SPing-Ke Shih #define R_AX_ACH6_BDRAM_CTRL_V1 0x1318
33897d61bf9SPing-Ke Shih #define R_AX_ACH7_BDRAM_CTRL_V1 0x131C
33997d61bf9SPing-Ke Shih #define R_AX_CH8_BDRAM_CTRL_V1 0x1320
34097d61bf9SPing-Ke Shih #define R_AX_CH9_BDRAM_CTRL_V1 0x1324
34197d61bf9SPing-Ke Shih #define R_AX_CH12_BDRAM_CTRL_V1 0x1328
34297d61bf9SPing-Ke Shih #define R_AX_CH10_BDRAM_CTRL_V1 0x1420
34397d61bf9SPing-Ke Shih #define R_AX_CH11_BDRAM_CTRL_V1 0x1424
344e3ec7017SPing-Ke Shih #define BDRAM_SIDX_MASK		GENMASK(7, 0)
345e3ec7017SPing-Ke Shih #define BDRAM_MAX_MASK		GENMASK(15, 8)
346e3ec7017SPing-Ke Shih #define BDRAM_MIN_MASK		GENMASK(23, 16)
347e3ec7017SPing-Ke Shih 
348e3ec7017SPing-Ke Shih #define R_AX_PCIE_INIT_CFG1	0x1000
349e3ec7017SPing-Ke Shih #define B_AX_PCIE_RXRST_KEEP_REG	BIT(23)
350e3ec7017SPing-Ke Shih #define B_AX_PCIE_TXRST_KEEP_REG	BIT(22)
351e3ec7017SPing-Ke Shih #define B_AX_PCIE_PERST_KEEP_REG	BIT(21)
352e3ec7017SPing-Ke Shih #define B_AX_PCIE_FLR_KEEP_REG		BIT(20)
353e3ec7017SPing-Ke Shih #define B_AX_PCIE_TRAIN_KEEP_REG	BIT(19)
354e3ec7017SPing-Ke Shih #define B_AX_RXBD_MODE			BIT(18)
355e3ec7017SPing-Ke Shih #define B_AX_PCIE_MAX_RXDMA_MASK	GENMASK(16, 14)
356e3ec7017SPing-Ke Shih #define B_AX_RXHCI_EN			BIT(13)
357e3ec7017SPing-Ke Shih #define B_AX_LATENCY_CONTROL		BIT(12)
358e3ec7017SPing-Ke Shih #define B_AX_TXHCI_EN			BIT(11)
359e3ec7017SPing-Ke Shih #define B_AX_PCIE_MAX_TXDMA_MASK	GENMASK(10, 8)
360e3ec7017SPing-Ke Shih #define B_AX_TX_TRUNC_MODE		BIT(5)
361e3ec7017SPing-Ke Shih #define B_AX_RX_TRUNC_MODE		BIT(4)
362e3ec7017SPing-Ke Shih #define B_AX_RST_BDRAM			BIT(3)
363e3ec7017SPing-Ke Shih #define B_AX_DIS_RXDMA_PRE		BIT(2)
364e3ec7017SPing-Ke Shih 
365e3ec7017SPing-Ke Shih #define R_AX_TXDMA_ADDR_H	0x10F0
366e3ec7017SPing-Ke Shih #define R_AX_RXDMA_ADDR_H	0x10F4
367e3ec7017SPing-Ke Shih 
368e3ec7017SPing-Ke Shih #define R_AX_PCIE_DMA_STOP1	0x1010
369e3ec7017SPing-Ke Shih #define B_AX_STOP_PCIEIO		BIT(20)
370e3ec7017SPing-Ke Shih #define B_AX_STOP_WPDMA			BIT(19)
371e3ec7017SPing-Ke Shih #define B_AX_STOP_CH12			BIT(18)
372e3ec7017SPing-Ke Shih #define B_AX_STOP_CH9			BIT(17)
373e3ec7017SPing-Ke Shih #define B_AX_STOP_CH8			BIT(16)
374e3ec7017SPing-Ke Shih #define B_AX_STOP_ACH7			BIT(15)
375e3ec7017SPing-Ke Shih #define B_AX_STOP_ACH6			BIT(14)
376e3ec7017SPing-Ke Shih #define B_AX_STOP_ACH5			BIT(13)
377e3ec7017SPing-Ke Shih #define B_AX_STOP_ACH4			BIT(12)
378e3ec7017SPing-Ke Shih #define B_AX_STOP_ACH3			BIT(11)
379e3ec7017SPing-Ke Shih #define B_AX_STOP_ACH2			BIT(10)
380e3ec7017SPing-Ke Shih #define B_AX_STOP_ACH1			BIT(9)
381e3ec7017SPing-Ke Shih #define B_AX_STOP_ACH0			BIT(8)
382e3ec7017SPing-Ke Shih #define B_AX_STOP_RPQ			BIT(1)
383e3ec7017SPing-Ke Shih #define B_AX_STOP_RXQ			BIT(0)
384e3ec7017SPing-Ke Shih #define B_AX_TX_STOP1_ALL		GENMASK(18, 8)
385e3ec7017SPing-Ke Shih 
386e3ec7017SPing-Ke Shih #define R_AX_PCIE_DMA_STOP2	0x1310
387e3ec7017SPing-Ke Shih #define B_AX_STOP_CH11			BIT(1)
388e3ec7017SPing-Ke Shih #define B_AX_STOP_CH10			BIT(0)
389e3ec7017SPing-Ke Shih #define B_AX_TX_STOP2_ALL		GENMASK(1, 0)
390e3ec7017SPing-Ke Shih 
391e3ec7017SPing-Ke Shih #define R_AX_TXBD_RWPTR_CLR1	0x1014
392e3ec7017SPing-Ke Shih #define B_AX_CLR_CH12_IDX		BIT(10)
393e3ec7017SPing-Ke Shih #define B_AX_CLR_CH9_IDX		BIT(9)
394e3ec7017SPing-Ke Shih #define B_AX_CLR_CH8_IDX		BIT(8)
395e3ec7017SPing-Ke Shih #define B_AX_CLR_ACH7_IDX		BIT(7)
396e3ec7017SPing-Ke Shih #define B_AX_CLR_ACH6_IDX		BIT(6)
397e3ec7017SPing-Ke Shih #define B_AX_CLR_ACH5_IDX		BIT(5)
398e3ec7017SPing-Ke Shih #define B_AX_CLR_ACH4_IDX		BIT(4)
399e3ec7017SPing-Ke Shih #define B_AX_CLR_ACH3_IDX		BIT(3)
400e3ec7017SPing-Ke Shih #define B_AX_CLR_ACH2_IDX		BIT(2)
401e3ec7017SPing-Ke Shih #define B_AX_CLR_ACH1_IDX		BIT(1)
402e3ec7017SPing-Ke Shih #define B_AX_CLR_ACH0_IDX		BIT(0)
403e3ec7017SPing-Ke Shih #define B_AX_TXBD_CLR1_ALL		GENMASK(10, 0)
404e3ec7017SPing-Ke Shih 
405e3ec7017SPing-Ke Shih #define R_AX_RXBD_RWPTR_CLR	0x1018
406e3ec7017SPing-Ke Shih #define B_AX_CLR_RPQ_IDX		BIT(1)
407e3ec7017SPing-Ke Shih #define B_AX_CLR_RXQ_IDX		BIT(0)
408e3ec7017SPing-Ke Shih #define B_AX_RXBD_CLR_ALL		GENMASK(1, 0)
409e3ec7017SPing-Ke Shih 
410e3ec7017SPing-Ke Shih #define R_AX_TXBD_RWPTR_CLR2	0x1314
411e3ec7017SPing-Ke Shih #define B_AX_CLR_CH11_IDX		BIT(1)
412e3ec7017SPing-Ke Shih #define B_AX_CLR_CH10_IDX		BIT(0)
413e3ec7017SPing-Ke Shih #define B_AX_TXBD_CLR2_ALL		GENMASK(1, 0)
414e3ec7017SPing-Ke Shih 
415e3ec7017SPing-Ke Shih #define R_AX_PCIE_DMA_BUSY1	0x101C
416e3ec7017SPing-Ke Shih #define B_AX_PCIEIO_RX_BUSY		BIT(22)
417e3ec7017SPing-Ke Shih #define B_AX_PCIEIO_TX_BUSY		BIT(21)
418e3ec7017SPing-Ke Shih #define B_AX_PCIEIO_BUSY		BIT(20)
419e3ec7017SPing-Ke Shih #define B_AX_WPDMA_BUSY			BIT(19)
4201e3f2055SChia-Yuan Li #define B_AX_CH12_BUSY			BIT(18)
4211e3f2055SChia-Yuan Li #define B_AX_CH9_BUSY			BIT(17)
4221e3f2055SChia-Yuan Li #define B_AX_CH8_BUSY			BIT(16)
4231e3f2055SChia-Yuan Li #define B_AX_ACH7_BUSY			BIT(15)
4241e3f2055SChia-Yuan Li #define B_AX_ACH6_BUSY			BIT(14)
4251e3f2055SChia-Yuan Li #define B_AX_ACH5_BUSY			BIT(13)
4261e3f2055SChia-Yuan Li #define B_AX_ACH4_BUSY			BIT(12)
4271e3f2055SChia-Yuan Li #define B_AX_ACH3_BUSY			BIT(11)
4281e3f2055SChia-Yuan Li #define B_AX_ACH2_BUSY			BIT(10)
4291e3f2055SChia-Yuan Li #define B_AX_ACH1_BUSY			BIT(9)
4301e3f2055SChia-Yuan Li #define B_AX_ACH0_BUSY			BIT(8)
4311e3f2055SChia-Yuan Li #define B_AX_RPQ_BUSY			BIT(1)
4321e3f2055SChia-Yuan Li #define B_AX_RXQ_BUSY			BIT(0)
433e3ec7017SPing-Ke Shih 
434e3ec7017SPing-Ke Shih #define R_AX_PCIE_DMA_BUSY2	0x131C
435e3ec7017SPing-Ke Shih #define B_AX_CH11_BUSY			BIT(1)
436e3ec7017SPing-Ke Shih #define B_AX_CH10_BUSY			BIT(0)
437e3ec7017SPing-Ke Shih 
438e3ec7017SPing-Ke Shih /* Configure */
439e3ec7017SPing-Ke Shih #define R_AX_PCIE_INIT_CFG2		0x1004
440e3ec7017SPing-Ke Shih #define B_AX_WD_ITVL_IDLE		GENMASK(27, 24)
441e3ec7017SPing-Ke Shih #define B_AX_WD_ITVL_ACT		GENMASK(19, 16)
442740c431cSPing-Ke Shih #define B_AX_PCIE_RX_APPLEN_MASK	GENMASK(13, 0)
443e3ec7017SPing-Ke Shih 
444e3ec7017SPing-Ke Shih #define R_AX_PCIE_PS_CTRL		0x1008
445e3ec7017SPing-Ke Shih #define B_AX_L1OFF_PWR_OFF_EN		BIT(5)
446e3ec7017SPing-Ke Shih 
447e3ec7017SPing-Ke Shih #define R_AX_INT_MIT_RX			0x10D4
448e3ec7017SPing-Ke Shih #define B_AX_RXMIT_RXP2_SEL		BIT(19)
449e3ec7017SPing-Ke Shih #define B_AX_RXMIT_RXP1_SEL		BIT(18)
450e3ec7017SPing-Ke Shih #define B_AX_RXTIMER_UNIT_MASK		GENMASK(17, 16)
451e3ec7017SPing-Ke Shih #define AX_RXTIMER_UNIT_64US		0
452e3ec7017SPing-Ke Shih #define AX_RXTIMER_UNIT_128US		1
453e3ec7017SPing-Ke Shih #define AX_RXTIMER_UNIT_256US		2
454e3ec7017SPing-Ke Shih #define AX_RXTIMER_UNIT_512US		3
455e3ec7017SPing-Ke Shih #define B_AX_RXCOUNTER_MATCH_MASK	GENMASK(15, 8)
456e3ec7017SPing-Ke Shih #define B_AX_RXTIMER_MATCH_MASK		GENMASK(7, 0)
457e3ec7017SPing-Ke Shih 
458e3ec7017SPing-Ke Shih #define R_AX_DBG_ERR_FLAG		0x11C4
459e3ec7017SPing-Ke Shih #define B_AX_PCIE_RPQ_FULL		BIT(29)
460e3ec7017SPing-Ke Shih #define B_AX_PCIE_RXQ_FULL		BIT(28)
461e3ec7017SPing-Ke Shih #define B_AX_CPL_STATUS_MASK		GENMASK(27, 25)
462e3ec7017SPing-Ke Shih #define B_AX_RX_STUCK			BIT(22)
463e3ec7017SPing-Ke Shih #define B_AX_TX_STUCK			BIT(21)
464e3ec7017SPing-Ke Shih #define B_AX_PCIEDBG_TXERR0		BIT(16)
465e3ec7017SPing-Ke Shih #define B_AX_PCIE_RXP1_ERR0		BIT(4)
466e3ec7017SPing-Ke Shih #define B_AX_PCIE_TXBD_LEN0		BIT(1)
467e3ec7017SPing-Ke Shih #define B_AX_PCIE_TXBD_4KBOUD_LENERR	BIT(0)
468e3ec7017SPing-Ke Shih 
469740c431cSPing-Ke Shih #define R_AX_TXBD_RWPTR_CLR2_V1		0x11C4
470740c431cSPing-Ke Shih #define B_AX_CLR_CH11_IDX		BIT(1)
471740c431cSPing-Ke Shih #define B_AX_CLR_CH10_IDX		BIT(0)
472740c431cSPing-Ke Shih 
473e3ec7017SPing-Ke Shih #define R_AX_LBC_WATCHDOG		0x11D8
474e3ec7017SPing-Ke Shih #define B_AX_LBC_TIMER			GENMASK(7, 4)
475e3ec7017SPing-Ke Shih #define B_AX_LBC_FLAG			BIT(1)
476e3ec7017SPing-Ke Shih #define B_AX_LBC_EN			BIT(0)
477e3ec7017SPing-Ke Shih 
478740c431cSPing-Ke Shih #define R_AX_RXBD_RWPTR_CLR_V1		0x1200
479740c431cSPing-Ke Shih #define B_AX_CLR_RPQ_IDX		BIT(1)
480740c431cSPing-Ke Shih #define B_AX_CLR_RXQ_IDX		BIT(0)
481740c431cSPing-Ke Shih 
482740c431cSPing-Ke Shih #define R_AX_HAXI_EXP_CTRL		0x1204
483740c431cSPing-Ke Shih #define B_AX_MAX_TAG_NUM_V1_MASK	GENMASK(2, 0)
484740c431cSPing-Ke Shih 
485e3ec7017SPing-Ke Shih #define R_AX_PCIE_EXP_CTRL		0x13F0
486e3ec7017SPing-Ke Shih #define B_AX_EN_CHKDSC_NO_RX_STUCK	BIT(20)
487e3ec7017SPing-Ke Shih #define B_AX_MAX_TAG_NUM		GENMASK(18, 16)
488e3ec7017SPing-Ke Shih #define B_AX_SIC_EN_FORCE_CLKREQ	BIT(4)
489e3ec7017SPing-Ke Shih 
490e3ec7017SPing-Ke Shih #define R_AX_PCIE_RX_PREF_ADV		0x13F4
491e3ec7017SPing-Ke Shih #define B_AX_RXDMA_PREF_ADV_EN		BIT(0)
492e3ec7017SPing-Ke Shih 
493e1757e80SPing-Ke Shih #define R_AX_PCIE_HRPWM_V1		0x30C0
494e1757e80SPing-Ke Shih #define R_AX_PCIE_CRPWM			0x30C4
495e1757e80SPing-Ke Shih 
496e3ec7017SPing-Ke Shih #define RTW89_PCI_TXBD_NUM_MAX		256
497e3ec7017SPing-Ke Shih #define RTW89_PCI_RXBD_NUM_MAX		256
498e3ec7017SPing-Ke Shih #define RTW89_PCI_TXWD_NUM_MAX		512
499e3ec7017SPing-Ke Shih #define RTW89_PCI_TXWD_PAGE_SIZE	128
500e3ec7017SPing-Ke Shih #define RTW89_PCI_ADDRINFO_MAX		4
501e3ec7017SPing-Ke Shih #define RTW89_PCI_RX_BUF_SIZE		11460
502e3ec7017SPing-Ke Shih 
503e3ec7017SPing-Ke Shih #define RTW89_PCI_POLL_BDRAM_RST_CNT	100
504e3ec7017SPing-Ke Shih #define RTW89_PCI_MULTITAG		8
505e3ec7017SPing-Ke Shih 
506e3ec7017SPing-Ke Shih /* PCIE CFG register */
507e3ec7017SPing-Ke Shih #define RTW89_PCIE_ASPM_CTRL		0x070F
508e3ec7017SPing-Ke Shih #define RTW89_L1DLY_MASK		GENMASK(5, 3)
509e3ec7017SPing-Ke Shih #define RTW89_L0DLY_MASK		GENMASK(2, 0)
510e3ec7017SPing-Ke Shih #define RTW89_PCIE_TIMER_CTRL		0x0718
511e3ec7017SPing-Ke Shih #define RTW89_PCIE_BIT_L1SUB		BIT(5)
512e3ec7017SPing-Ke Shih #define RTW89_PCIE_L1_CTRL		0x0719
513e3ec7017SPing-Ke Shih #define RTW89_PCIE_BIT_CLK		BIT(4)
514e3ec7017SPing-Ke Shih #define RTW89_PCIE_BIT_L1		BIT(3)
515e3ec7017SPing-Ke Shih #define RTW89_PCIE_CLK_CTRL		0x0725
516e3ec7017SPing-Ke Shih #define RTW89_PCIE_RST_MSTATE		0x0B48
517e3ec7017SPing-Ke Shih #define RTW89_PCIE_BIT_CFG_RST_MSTATE	BIT(0)
518e3ec7017SPing-Ke Shih #define RTW89_PCIE_PHY_RATE		0x82
519e3ec7017SPing-Ke Shih #define RTW89_PCIE_PHY_RATE_MASK	GENMASK(1, 0)
520e3ec7017SPing-Ke Shih #define INTF_INTGRA_MINREF_V1	90
521e3ec7017SPing-Ke Shih #define INTF_INTGRA_HOSTREF_V1	100
522e3ec7017SPing-Ke Shih 
523e3ec7017SPing-Ke Shih enum rtw89_pcie_phy {
524e3ec7017SPing-Ke Shih 	PCIE_PHY_GEN1,
525e3ec7017SPing-Ke Shih 	PCIE_PHY_GEN2,
526e3ec7017SPing-Ke Shih 	PCIE_PHY_GEN1_UNDEFINE = 0x7F,
527e3ec7017SPing-Ke Shih };
528e3ec7017SPing-Ke Shih 
529e3ec7017SPing-Ke Shih enum mac_ax_func_sw {
530e3ec7017SPing-Ke Shih 	MAC_AX_FUNC_DIS,
531e3ec7017SPing-Ke Shih 	MAC_AX_FUNC_EN,
532e3ec7017SPing-Ke Shih };
533e3ec7017SPing-Ke Shih 
534e3ec7017SPing-Ke Shih enum rtw89_pcie_l0sdly {
535e3ec7017SPing-Ke Shih 	PCIE_L0SDLY_1US = 0,
536e3ec7017SPing-Ke Shih 	PCIE_L0SDLY_2US = 1,
537e3ec7017SPing-Ke Shih 	PCIE_L0SDLY_3US = 2,
538e3ec7017SPing-Ke Shih 	PCIE_L0SDLY_4US = 3,
539e3ec7017SPing-Ke Shih 	PCIE_L0SDLY_5US = 4,
540e3ec7017SPing-Ke Shih 	PCIE_L0SDLY_6US = 5,
541e3ec7017SPing-Ke Shih 	PCIE_L0SDLY_7US = 6,
542e3ec7017SPing-Ke Shih };
543e3ec7017SPing-Ke Shih 
544e3ec7017SPing-Ke Shih enum rtw89_pcie_l1dly {
545e3ec7017SPing-Ke Shih 	PCIE_L1DLY_16US = 4,
546e3ec7017SPing-Ke Shih 	PCIE_L1DLY_32US = 5,
547e3ec7017SPing-Ke Shih 	PCIE_L1DLY_64US = 6,
548e3ec7017SPing-Ke Shih 	PCIE_L1DLY_HW_INFI = 7,
549e3ec7017SPing-Ke Shih };
550e3ec7017SPing-Ke Shih 
551e3ec7017SPing-Ke Shih enum rtw89_pcie_clkdly_hw {
552e3ec7017SPing-Ke Shih 	PCIE_CLKDLY_HW_0 = 0,
553e3ec7017SPing-Ke Shih 	PCIE_CLKDLY_HW_30US = 0x1,
554e3ec7017SPing-Ke Shih 	PCIE_CLKDLY_HW_50US = 0x2,
555e3ec7017SPing-Ke Shih 	PCIE_CLKDLY_HW_100US = 0x3,
556e3ec7017SPing-Ke Shih 	PCIE_CLKDLY_HW_150US = 0x4,
557e3ec7017SPing-Ke Shih 	PCIE_CLKDLY_HW_200US = 0x5,
558e3ec7017SPing-Ke Shih };
559e3ec7017SPing-Ke Shih 
560b9467e94SPing-Ke Shih enum mac_ax_bd_trunc_mode {
561b9467e94SPing-Ke Shih 	MAC_AX_BD_NORM,
562b9467e94SPing-Ke Shih 	MAC_AX_BD_TRUNC,
563b9467e94SPing-Ke Shih 	MAC_AX_BD_DEF = 0xFE
564b9467e94SPing-Ke Shih };
565b9467e94SPing-Ke Shih 
566b9467e94SPing-Ke Shih enum mac_ax_rxbd_mode {
567b9467e94SPing-Ke Shih 	MAC_AX_RXBD_PKT,
568b9467e94SPing-Ke Shih 	MAC_AX_RXBD_SEP,
569b9467e94SPing-Ke Shih 	MAC_AX_RXBD_DEF = 0xFE
570b9467e94SPing-Ke Shih };
571b9467e94SPing-Ke Shih 
572b9467e94SPing-Ke Shih enum mac_ax_tag_mode {
573b9467e94SPing-Ke Shih 	MAC_AX_TAG_SGL,
574b9467e94SPing-Ke Shih 	MAC_AX_TAG_MULTI,
575b9467e94SPing-Ke Shih 	MAC_AX_TAG_DEF = 0xFE
576b9467e94SPing-Ke Shih };
577b9467e94SPing-Ke Shih 
578b9467e94SPing-Ke Shih enum mac_ax_tx_burst {
579b9467e94SPing-Ke Shih 	MAC_AX_TX_BURST_16B = 0,
580b9467e94SPing-Ke Shih 	MAC_AX_TX_BURST_32B = 1,
581b9467e94SPing-Ke Shih 	MAC_AX_TX_BURST_64B = 2,
582b9467e94SPing-Ke Shih 	MAC_AX_TX_BURST_V1_64B = 0,
583b9467e94SPing-Ke Shih 	MAC_AX_TX_BURST_128B = 3,
584b9467e94SPing-Ke Shih 	MAC_AX_TX_BURST_V1_128B = 1,
585b9467e94SPing-Ke Shih 	MAC_AX_TX_BURST_256B = 4,
586b9467e94SPing-Ke Shih 	MAC_AX_TX_BURST_V1_256B = 2,
587b9467e94SPing-Ke Shih 	MAC_AX_TX_BURST_512B = 5,
588b9467e94SPing-Ke Shih 	MAC_AX_TX_BURST_1024B = 6,
589b9467e94SPing-Ke Shih 	MAC_AX_TX_BURST_2048B = 7,
590b9467e94SPing-Ke Shih 	MAC_AX_TX_BURST_DEF = 0xFE
591b9467e94SPing-Ke Shih };
592b9467e94SPing-Ke Shih 
593b9467e94SPing-Ke Shih enum mac_ax_rx_burst {
594b9467e94SPing-Ke Shih 	MAC_AX_RX_BURST_16B = 0,
595b9467e94SPing-Ke Shih 	MAC_AX_RX_BURST_32B = 1,
596b9467e94SPing-Ke Shih 	MAC_AX_RX_BURST_64B = 2,
597b9467e94SPing-Ke Shih 	MAC_AX_RX_BURST_V1_64B = 0,
598b9467e94SPing-Ke Shih 	MAC_AX_RX_BURST_128B = 3,
599b9467e94SPing-Ke Shih 	MAC_AX_RX_BURST_V1_128B = 1,
600b9467e94SPing-Ke Shih 	MAC_AX_RX_BURST_V1_256B = 0,
601b9467e94SPing-Ke Shih 	MAC_AX_RX_BURST_DEF = 0xFE
602b9467e94SPing-Ke Shih };
603b9467e94SPing-Ke Shih 
604b9467e94SPing-Ke Shih enum mac_ax_wd_dma_intvl {
605b9467e94SPing-Ke Shih 	MAC_AX_WD_DMA_INTVL_0S,
606b9467e94SPing-Ke Shih 	MAC_AX_WD_DMA_INTVL_256NS,
607b9467e94SPing-Ke Shih 	MAC_AX_WD_DMA_INTVL_512NS,
608b9467e94SPing-Ke Shih 	MAC_AX_WD_DMA_INTVL_768NS,
609b9467e94SPing-Ke Shih 	MAC_AX_WD_DMA_INTVL_1US,
610b9467e94SPing-Ke Shih 	MAC_AX_WD_DMA_INTVL_1_5US,
611b9467e94SPing-Ke Shih 	MAC_AX_WD_DMA_INTVL_2US,
612b9467e94SPing-Ke Shih 	MAC_AX_WD_DMA_INTVL_4US,
613b9467e94SPing-Ke Shih 	MAC_AX_WD_DMA_INTVL_8US,
614b9467e94SPing-Ke Shih 	MAC_AX_WD_DMA_INTVL_16US,
615b9467e94SPing-Ke Shih 	MAC_AX_WD_DMA_INTVL_DEF = 0xFE
616b9467e94SPing-Ke Shih };
617b9467e94SPing-Ke Shih 
618b9467e94SPing-Ke Shih enum mac_ax_multi_tag_num {
619b9467e94SPing-Ke Shih 	MAC_AX_TAG_NUM_1,
620b9467e94SPing-Ke Shih 	MAC_AX_TAG_NUM_2,
621b9467e94SPing-Ke Shih 	MAC_AX_TAG_NUM_3,
622b9467e94SPing-Ke Shih 	MAC_AX_TAG_NUM_4,
623b9467e94SPing-Ke Shih 	MAC_AX_TAG_NUM_5,
624b9467e94SPing-Ke Shih 	MAC_AX_TAG_NUM_6,
625b9467e94SPing-Ke Shih 	MAC_AX_TAG_NUM_7,
626b9467e94SPing-Ke Shih 	MAC_AX_TAG_NUM_8,
627b9467e94SPing-Ke Shih 	MAC_AX_TAG_NUM_DEF = 0xFE
628b9467e94SPing-Ke Shih };
629b9467e94SPing-Ke Shih 
630b9467e94SPing-Ke Shih enum mac_ax_lbc_tmr {
631b9467e94SPing-Ke Shih 	MAC_AX_LBC_TMR_8US = 0,
632b9467e94SPing-Ke Shih 	MAC_AX_LBC_TMR_16US,
633b9467e94SPing-Ke Shih 	MAC_AX_LBC_TMR_32US,
634b9467e94SPing-Ke Shih 	MAC_AX_LBC_TMR_64US,
635b9467e94SPing-Ke Shih 	MAC_AX_LBC_TMR_128US,
636b9467e94SPing-Ke Shih 	MAC_AX_LBC_TMR_256US,
637b9467e94SPing-Ke Shih 	MAC_AX_LBC_TMR_512US,
638b9467e94SPing-Ke Shih 	MAC_AX_LBC_TMR_1MS,
639b9467e94SPing-Ke Shih 	MAC_AX_LBC_TMR_2MS,
640b9467e94SPing-Ke Shih 	MAC_AX_LBC_TMR_4MS,
641b9467e94SPing-Ke Shih 	MAC_AX_LBC_TMR_8MS,
642b9467e94SPing-Ke Shih 	MAC_AX_LBC_TMR_DEF = 0xFE
643b9467e94SPing-Ke Shih };
644b9467e94SPing-Ke Shih 
645b9467e94SPing-Ke Shih enum mac_ax_pcie_func_ctrl {
646b9467e94SPing-Ke Shih 	MAC_AX_PCIE_DISABLE = 0,
647b9467e94SPing-Ke Shih 	MAC_AX_PCIE_ENABLE = 1,
648b9467e94SPing-Ke Shih 	MAC_AX_PCIE_DEFAULT = 0xFE,
649b9467e94SPing-Ke Shih 	MAC_AX_PCIE_IGNORE = 0xFF
650b9467e94SPing-Ke Shih };
651b9467e94SPing-Ke Shih 
652b9467e94SPing-Ke Shih enum mac_ax_io_rcy_tmr {
653b9467e94SPing-Ke Shih 	MAC_AX_IO_RCY_ANA_TMR_2MS = 24000,
654b9467e94SPing-Ke Shih 	MAC_AX_IO_RCY_ANA_TMR_4MS = 48000,
655b9467e94SPing-Ke Shih 	MAC_AX_IO_RCY_ANA_TMR_6MS = 72000,
656b9467e94SPing-Ke Shih 	MAC_AX_IO_RCY_ANA_TMR_DEF = 0xFE
657b9467e94SPing-Ke Shih };
658b9467e94SPing-Ke Shih 
659948e521cSPing-Ke Shih enum rtw89_pci_intr_mask_cfg {
660948e521cSPing-Ke Shih 	RTW89_PCI_INTR_MASK_RESET,
661948e521cSPing-Ke Shih 	RTW89_PCI_INTR_MASK_NORMAL,
662948e521cSPing-Ke Shih 	RTW89_PCI_INTR_MASK_LOW_POWER,
663948e521cSPing-Ke Shih 	RTW89_PCI_INTR_MASK_RECOVERY_START,
664948e521cSPing-Ke Shih 	RTW89_PCI_INTR_MASK_RECOVERY_COMPLETE,
665948e521cSPing-Ke Shih };
666948e521cSPing-Ke Shih 
667948e521cSPing-Ke Shih struct rtw89_pci_isrs;
668948e521cSPing-Ke Shih struct rtw89_pci;
669948e521cSPing-Ke Shih 
670*52edbb9fSPing-Ke Shih struct rtw89_pci_bd_idx_addr {
671*52edbb9fSPing-Ke Shih 	u32 tx_bd_addrs[RTW89_TXCH_NUM];
672*52edbb9fSPing-Ke Shih 	u32 rx_bd_addrs[RTW89_RXCH_NUM];
673*52edbb9fSPing-Ke Shih };
674*52edbb9fSPing-Ke Shih 
67597d61bf9SPing-Ke Shih struct rtw89_pci_ch_dma_addr {
67697d61bf9SPing-Ke Shih 	u32 num;
67797d61bf9SPing-Ke Shih 	u32 idx;
67897d61bf9SPing-Ke Shih 	u32 bdram;
67997d61bf9SPing-Ke Shih 	u32 desa_l;
68097d61bf9SPing-Ke Shih 	u32 desa_h;
68197d61bf9SPing-Ke Shih };
68297d61bf9SPing-Ke Shih 
68397d61bf9SPing-Ke Shih struct rtw89_pci_ch_dma_addr_set {
68497d61bf9SPing-Ke Shih 	struct rtw89_pci_ch_dma_addr tx[RTW89_TXCH_NUM];
68597d61bf9SPing-Ke Shih 	struct rtw89_pci_ch_dma_addr rx[RTW89_RXCH_NUM];
68697d61bf9SPing-Ke Shih };
68797d61bf9SPing-Ke Shih 
6884a9e48acSPing-Ke Shih struct rtw89_pci_info {
689b9467e94SPing-Ke Shih 	enum mac_ax_bd_trunc_mode txbd_trunc_mode;
690b9467e94SPing-Ke Shih 	enum mac_ax_bd_trunc_mode rxbd_trunc_mode;
691b9467e94SPing-Ke Shih 	enum mac_ax_rxbd_mode rxbd_mode;
692b9467e94SPing-Ke Shih 	enum mac_ax_tag_mode tag_mode;
693b9467e94SPing-Ke Shih 	enum mac_ax_tx_burst tx_burst;
694b9467e94SPing-Ke Shih 	enum mac_ax_rx_burst rx_burst;
695b9467e94SPing-Ke Shih 	enum mac_ax_wd_dma_intvl wd_dma_idle_intvl;
696b9467e94SPing-Ke Shih 	enum mac_ax_wd_dma_intvl wd_dma_act_intvl;
697b9467e94SPing-Ke Shih 	enum mac_ax_multi_tag_num multi_tag_num;
698b9467e94SPing-Ke Shih 	enum mac_ax_pcie_func_ctrl lbc_en;
699b9467e94SPing-Ke Shih 	enum mac_ax_lbc_tmr lbc_tmr;
700b9467e94SPing-Ke Shih 	enum mac_ax_pcie_func_ctrl autok_en;
701b9467e94SPing-Ke Shih 	enum mac_ax_pcie_func_ctrl io_rcy_en;
702b9467e94SPing-Ke Shih 	enum mac_ax_io_rcy_tmr io_rcy_tmr;
703b9467e94SPing-Ke Shih 
704740c431cSPing-Ke Shih 	u32 init_cfg_reg;
705740c431cSPing-Ke Shih 	u32 txhci_en_bit;
706740c431cSPing-Ke Shih 	u32 rxhci_en_bit;
707740c431cSPing-Ke Shih 	u32 rxbd_mode_bit;
708740c431cSPing-Ke Shih 	u32 exp_ctrl_reg;
709740c431cSPing-Ke Shih 	u32 max_tag_num_mask;
710740c431cSPing-Ke Shih 	u32 rxbd_rwptr_clr_reg;
711740c431cSPing-Ke Shih 	u32 txbd_rwptr_clr2_reg;
712740c431cSPing-Ke Shih 	u32 dma_stop1_reg;
713740c431cSPing-Ke Shih 	u32 dma_stop2_reg;
7141e3f2055SChia-Yuan Li 	u32 dma_busy1_reg;
7151e3f2055SChia-Yuan Li 	u32 dma_busy2_reg;
7161e3f2055SChia-Yuan Li 	u32 dma_busy3_reg;
717740c431cSPing-Ke Shih 
718e1757e80SPing-Ke Shih 	u32 rpwm_addr;
719e1757e80SPing-Ke Shih 	u32 cpwm_addr;
720*52edbb9fSPing-Ke Shih 	const struct rtw89_pci_bd_idx_addr *bd_idx_addr_low_power;
72197d61bf9SPing-Ke Shih 	const struct rtw89_pci_ch_dma_addr_set *dma_addr_set;
7226d5b5d62SPing-Ke Shih 
7230db862fbSPing-Ke Shih 	int (*ltr_set)(struct rtw89_dev *rtwdev, bool en);
7246d5b5d62SPing-Ke Shih 	u32 (*fill_txaddr_info)(struct rtw89_dev *rtwdev,
7256d5b5d62SPing-Ke Shih 				void *txaddr_info_addr, u32 total_len,
7266d5b5d62SPing-Ke Shih 				dma_addr_t dma, u8 *add_info_nr);
727948e521cSPing-Ke Shih 	void (*config_intr_mask)(struct rtw89_dev *rtwdev);
728948e521cSPing-Ke Shih 	void (*enable_intr)(struct rtw89_dev *rtwdev, struct rtw89_pci *rtwpci);
729948e521cSPing-Ke Shih 	void (*disable_intr)(struct rtw89_dev *rtwdev, struct rtw89_pci *rtwpci);
730948e521cSPing-Ke Shih 	void (*recognize_intrs)(struct rtw89_dev *rtwdev,
731948e521cSPing-Ke Shih 				struct rtw89_pci *rtwpci,
732948e521cSPing-Ke Shih 				struct rtw89_pci_isrs *isrs);
7334a9e48acSPing-Ke Shih };
7344a9e48acSPing-Ke Shih 
735e3ec7017SPing-Ke Shih struct rtw89_pci_bd_ram {
736e3ec7017SPing-Ke Shih 	u8 start_idx;
737e3ec7017SPing-Ke Shih 	u8 max_num;
738e3ec7017SPing-Ke Shih 	u8 min_num;
739e3ec7017SPing-Ke Shih };
740e3ec7017SPing-Ke Shih 
741e3ec7017SPing-Ke Shih struct rtw89_pci_tx_data {
742e3ec7017SPing-Ke Shih 	dma_addr_t dma;
743e3ec7017SPing-Ke Shih };
744e3ec7017SPing-Ke Shih 
745e3ec7017SPing-Ke Shih struct rtw89_pci_rx_info {
746e3ec7017SPing-Ke Shih 	dma_addr_t dma;
747e3ec7017SPing-Ke Shih 	u32 fs:1, ls:1, tag:11, len:14;
748e3ec7017SPing-Ke Shih };
749e3ec7017SPing-Ke Shih 
750e3ec7017SPing-Ke Shih #define RTW89_PCI_TXBD_OPTION_LS	BIT(14)
751e3ec7017SPing-Ke Shih 
752e3ec7017SPing-Ke Shih struct rtw89_pci_tx_bd_32 {
753e3ec7017SPing-Ke Shih 	__le16 length;
754e3ec7017SPing-Ke Shih 	__le16 option;
755e3ec7017SPing-Ke Shih 	__le32 dma;
756e3ec7017SPing-Ke Shih } __packed;
757e3ec7017SPing-Ke Shih 
758e3ec7017SPing-Ke Shih #define RTW89_PCI_TXWP_VALID		BIT(15)
759e3ec7017SPing-Ke Shih 
760e3ec7017SPing-Ke Shih struct rtw89_pci_tx_wp_info {
761e3ec7017SPing-Ke Shih 	__le16 seq0;
762e3ec7017SPing-Ke Shih 	__le16 seq1;
763e3ec7017SPing-Ke Shih 	__le16 seq2;
764e3ec7017SPing-Ke Shih 	__le16 seq3;
765e3ec7017SPing-Ke Shih } __packed;
766e3ec7017SPing-Ke Shih 
767e3ec7017SPing-Ke Shih #define RTW89_PCI_ADDR_MSDU_LS		BIT(15)
768e3ec7017SPing-Ke Shih #define RTW89_PCI_ADDR_LS		BIT(14)
769e3ec7017SPing-Ke Shih #define RTW89_PCI_ADDR_HIGH(a)		(((a) << 6) & GENMASK(13, 6))
770e3ec7017SPing-Ke Shih #define RTW89_PCI_ADDR_NUM(x)		((x) & GENMASK(5, 0))
771e3ec7017SPing-Ke Shih 
772e3ec7017SPing-Ke Shih struct rtw89_pci_tx_addr_info_32 {
773e3ec7017SPing-Ke Shih 	__le16 length;
774e3ec7017SPing-Ke Shih 	__le16 option;
775e3ec7017SPing-Ke Shih 	__le32 dma;
776e3ec7017SPing-Ke Shih } __packed;
777e3ec7017SPing-Ke Shih 
7786d5b5d62SPing-Ke Shih #define RTW89_TXADDR_INFO_NR_V1		10
7796d5b5d62SPing-Ke Shih 
7806d5b5d62SPing-Ke Shih struct rtw89_pci_tx_addr_info_32_v1 {
7816d5b5d62SPing-Ke Shih 	__le16 length_opt;
7826d5b5d62SPing-Ke Shih #define B_PCIADDR_LEN_V1_MASK		GENMASK(10, 0)
7836d5b5d62SPing-Ke Shih #define B_PCIADDR_HIGH_SEL_V1_MASK	GENMASK(14, 11)
7846d5b5d62SPing-Ke Shih #define B_PCIADDR_LS_V1_MASK		BIT(15)
7856d5b5d62SPing-Ke Shih #define TXADDR_INFO_LENTHG_V1_MAX	ALIGN_DOWN(BIT(11) - 1, 4)
7866d5b5d62SPing-Ke Shih 	__le16 dma_low_lsb;
7876d5b5d62SPing-Ke Shih 	__le16 dma_low_msb;
7886d5b5d62SPing-Ke Shih } __packed;
7896d5b5d62SPing-Ke Shih 
790e3ec7017SPing-Ke Shih #define RTW89_PCI_RPP_POLLUTED		BIT(31)
791e3ec7017SPing-Ke Shih #define RTW89_PCI_RPP_SEQ		GENMASK(30, 16)
792e3ec7017SPing-Ke Shih #define RTW89_PCI_RPP_TX_STATUS		GENMASK(15, 13)
793e3ec7017SPing-Ke Shih #define RTW89_TX_DONE			0x0
794e3ec7017SPing-Ke Shih #define RTW89_TX_RETRY_LIMIT		0x1
795e3ec7017SPing-Ke Shih #define RTW89_TX_LIFE_TIME		0x2
796e3ec7017SPing-Ke Shih #define RTW89_TX_MACID_DROP		0x3
797e3ec7017SPing-Ke Shih #define RTW89_PCI_RPP_QSEL		GENMASK(12, 8)
798e3ec7017SPing-Ke Shih #define RTW89_PCI_RPP_MACID		GENMASK(7, 0)
799e3ec7017SPing-Ke Shih 
800e3ec7017SPing-Ke Shih struct rtw89_pci_rpp_fmt {
801e3ec7017SPing-Ke Shih 	__le32 dword;
802e3ec7017SPing-Ke Shih } __packed;
803e3ec7017SPing-Ke Shih 
804e3ec7017SPing-Ke Shih struct rtw89_pci_rx_bd_32 {
805e3ec7017SPing-Ke Shih 	__le16 buf_size;
806e3ec7017SPing-Ke Shih 	__le16 rsvd;
807e3ec7017SPing-Ke Shih 	__le32 dma;
808e3ec7017SPing-Ke Shih } __packed;
809e3ec7017SPing-Ke Shih 
810e3ec7017SPing-Ke Shih #define RTW89_PCI_RXBD_FS		BIT(15)
811e3ec7017SPing-Ke Shih #define RTW89_PCI_RXBD_LS		BIT(14)
812e3ec7017SPing-Ke Shih #define RTW89_PCI_RXBD_WRITE_SIZE	GENMASK(13, 0)
813e3ec7017SPing-Ke Shih #define RTW89_PCI_RXBD_TAG		GENMASK(28, 16)
814e3ec7017SPing-Ke Shih 
815e3ec7017SPing-Ke Shih struct rtw89_pci_rxbd_info {
816e3ec7017SPing-Ke Shih 	__le32 dword;
817e3ec7017SPing-Ke Shih };
818e3ec7017SPing-Ke Shih 
819e3ec7017SPing-Ke Shih struct rtw89_pci_tx_wd {
820e3ec7017SPing-Ke Shih 	struct list_head list;
821e3ec7017SPing-Ke Shih 	struct sk_buff_head queue;
822e3ec7017SPing-Ke Shih 
823e3ec7017SPing-Ke Shih 	void *vaddr;
824e3ec7017SPing-Ke Shih 	dma_addr_t paddr;
825e3ec7017SPing-Ke Shih 	u32 len;
826e3ec7017SPing-Ke Shih 	u32 seq;
827e3ec7017SPing-Ke Shih };
828e3ec7017SPing-Ke Shih 
829e3ec7017SPing-Ke Shih struct rtw89_pci_dma_ring {
830e3ec7017SPing-Ke Shih 	void *head;
831e3ec7017SPing-Ke Shih 	u8 desc_size;
832e3ec7017SPing-Ke Shih 	dma_addr_t dma;
833e3ec7017SPing-Ke Shih 
834e4133f26SPing-Ke Shih 	struct rtw89_pci_ch_dma_addr addr;
835e3ec7017SPing-Ke Shih 
836e3ec7017SPing-Ke Shih 	u32 len;
837e3ec7017SPing-Ke Shih 	u32 wp; /* host idx */
838e3ec7017SPing-Ke Shih 	u32 rp; /* hw idx */
839e3ec7017SPing-Ke Shih };
840e3ec7017SPing-Ke Shih 
841e3ec7017SPing-Ke Shih struct rtw89_pci_tx_wd_ring {
842e3ec7017SPing-Ke Shih 	void *head;
843e3ec7017SPing-Ke Shih 	dma_addr_t dma;
844e3ec7017SPing-Ke Shih 
845e3ec7017SPing-Ke Shih 	struct rtw89_pci_tx_wd pages[RTW89_PCI_TXWD_NUM_MAX];
846e3ec7017SPing-Ke Shih 	struct list_head free_pages;
847e3ec7017SPing-Ke Shih 
848e3ec7017SPing-Ke Shih 	u32 page_size;
849e3ec7017SPing-Ke Shih 	u32 page_num;
850e3ec7017SPing-Ke Shih 	u32 curr_num;
851e3ec7017SPing-Ke Shih };
852e3ec7017SPing-Ke Shih 
853e3ec7017SPing-Ke Shih #define RTW89_RX_TAG_MAX		0x1fff
854e3ec7017SPing-Ke Shih 
855e3ec7017SPing-Ke Shih struct rtw89_pci_tx_ring {
856e3ec7017SPing-Ke Shih 	struct rtw89_pci_tx_wd_ring wd_ring;
857e3ec7017SPing-Ke Shih 	struct rtw89_pci_dma_ring bd_ring;
858e3ec7017SPing-Ke Shih 	struct list_head busy_pages;
859e3ec7017SPing-Ke Shih 	u8 txch;
860e3ec7017SPing-Ke Shih 	bool dma_enabled;
861e3ec7017SPing-Ke Shih 	u16 tag; /* range from 0x0001 ~ 0x1fff */
862e3ec7017SPing-Ke Shih 
863e3ec7017SPing-Ke Shih 	u64 tx_cnt;
864e3ec7017SPing-Ke Shih 	u64 tx_acked;
865e3ec7017SPing-Ke Shih 	u64 tx_retry_lmt;
866e3ec7017SPing-Ke Shih 	u64 tx_life_time;
867e3ec7017SPing-Ke Shih 	u64 tx_mac_id_drop;
868e3ec7017SPing-Ke Shih };
869e3ec7017SPing-Ke Shih 
870e3ec7017SPing-Ke Shih struct rtw89_pci_rx_ring {
871e3ec7017SPing-Ke Shih 	struct rtw89_pci_dma_ring bd_ring;
872e3ec7017SPing-Ke Shih 	struct sk_buff *buf[RTW89_PCI_RXBD_NUM_MAX];
873e3ec7017SPing-Ke Shih 	u32 buf_sz;
874e3ec7017SPing-Ke Shih 	struct sk_buff *diliver_skb;
875e3ec7017SPing-Ke Shih 	struct rtw89_rx_desc_info diliver_desc;
876e3ec7017SPing-Ke Shih };
877e3ec7017SPing-Ke Shih 
878e3ec7017SPing-Ke Shih struct rtw89_pci_isrs {
879948e521cSPing-Ke Shih 	u32 ind_isrs;
880e3ec7017SPing-Ke Shih 	u32 halt_c2h_isrs;
881e3ec7017SPing-Ke Shih 	u32 isrs[2];
882e3ec7017SPing-Ke Shih };
883e3ec7017SPing-Ke Shih 
884e3ec7017SPing-Ke Shih struct rtw89_pci {
885e3ec7017SPing-Ke Shih 	struct pci_dev *pdev;
886e3ec7017SPing-Ke Shih 
887e3ec7017SPing-Ke Shih 	/* protect HW irq related registers */
888e3ec7017SPing-Ke Shih 	spinlock_t irq_lock;
889e3ec7017SPing-Ke Shih 	/* protect TRX resources (exclude RXQ) */
890e3ec7017SPing-Ke Shih 	spinlock_t trx_lock;
891e3ec7017SPing-Ke Shih 	bool running;
892948e521cSPing-Ke Shih 	bool low_power;
89314f9f479SZong-Zhe Yang 	bool under_recovery;
894e3ec7017SPing-Ke Shih 	struct rtw89_pci_tx_ring tx_rings[RTW89_TXCH_NUM];
895e3ec7017SPing-Ke Shih 	struct rtw89_pci_rx_ring rx_rings[RTW89_RXCH_NUM];
896e3ec7017SPing-Ke Shih 	struct sk_buff_head h2c_queue;
897e3ec7017SPing-Ke Shih 	struct sk_buff_head h2c_release_queue;
898*52edbb9fSPing-Ke Shih 	DECLARE_BITMAP(kick_map, RTW89_TXCH_NUM);
899e3ec7017SPing-Ke Shih 
900948e521cSPing-Ke Shih 	u32 ind_intrs;
901e3ec7017SPing-Ke Shih 	u32 halt_c2h_intrs;
902e3ec7017SPing-Ke Shih 	u32 intrs[2];
903e3ec7017SPing-Ke Shih 	void __iomem *mmap;
904e3ec7017SPing-Ke Shih };
905e3ec7017SPing-Ke Shih 
906e3ec7017SPing-Ke Shih static inline struct rtw89_pci_rx_info *RTW89_PCI_RX_SKB_CB(struct sk_buff *skb)
907e3ec7017SPing-Ke Shih {
908e3ec7017SPing-Ke Shih 	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
909e3ec7017SPing-Ke Shih 
910e3ec7017SPing-Ke Shih 	BUILD_BUG_ON(sizeof(struct rtw89_pci_tx_data) >
911e3ec7017SPing-Ke Shih 		     sizeof(info->status.status_driver_data));
912e3ec7017SPing-Ke Shih 
913e3ec7017SPing-Ke Shih 	return (struct rtw89_pci_rx_info *)skb->cb;
914e3ec7017SPing-Ke Shih }
915e3ec7017SPing-Ke Shih 
916e3ec7017SPing-Ke Shih static inline struct rtw89_pci_rx_bd_32 *
917e3ec7017SPing-Ke Shih RTW89_PCI_RX_BD(struct rtw89_pci_rx_ring *rx_ring, u32 idx)
918e3ec7017SPing-Ke Shih {
919e3ec7017SPing-Ke Shih 	struct rtw89_pci_dma_ring *bd_ring = &rx_ring->bd_ring;
920e3ec7017SPing-Ke Shih 	u8 *head = bd_ring->head;
921e3ec7017SPing-Ke Shih 	u32 desc_size = bd_ring->desc_size;
922e3ec7017SPing-Ke Shih 	u32 offset = idx * desc_size;
923e3ec7017SPing-Ke Shih 
924e3ec7017SPing-Ke Shih 	return (struct rtw89_pci_rx_bd_32 *)(head + offset);
925e3ec7017SPing-Ke Shih }
926e3ec7017SPing-Ke Shih 
927e3ec7017SPing-Ke Shih static inline void
928e3ec7017SPing-Ke Shih rtw89_pci_rxbd_increase(struct rtw89_pci_rx_ring *rx_ring, u32 cnt)
929e3ec7017SPing-Ke Shih {
930e3ec7017SPing-Ke Shih 	struct rtw89_pci_dma_ring *bd_ring = &rx_ring->bd_ring;
931e3ec7017SPing-Ke Shih 
932e3ec7017SPing-Ke Shih 	bd_ring->wp += cnt;
933e3ec7017SPing-Ke Shih 
934e3ec7017SPing-Ke Shih 	if (bd_ring->wp >= bd_ring->len)
935e3ec7017SPing-Ke Shih 		bd_ring->wp -= bd_ring->len;
936e3ec7017SPing-Ke Shih }
937e3ec7017SPing-Ke Shih 
938e3ec7017SPing-Ke Shih static inline struct rtw89_pci_tx_data *RTW89_PCI_TX_SKB_CB(struct sk_buff *skb)
939e3ec7017SPing-Ke Shih {
940e3ec7017SPing-Ke Shih 	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
941e3ec7017SPing-Ke Shih 
942e3ec7017SPing-Ke Shih 	return (struct rtw89_pci_tx_data *)info->status.status_driver_data;
943e3ec7017SPing-Ke Shih }
944e3ec7017SPing-Ke Shih 
945e3ec7017SPing-Ke Shih static inline struct rtw89_pci_tx_bd_32 *
946e3ec7017SPing-Ke Shih rtw89_pci_get_next_txbd(struct rtw89_pci_tx_ring *tx_ring)
947e3ec7017SPing-Ke Shih {
948e3ec7017SPing-Ke Shih 	struct rtw89_pci_dma_ring *bd_ring = &tx_ring->bd_ring;
949e3ec7017SPing-Ke Shih 	struct rtw89_pci_tx_bd_32 *tx_bd, *head;
950e3ec7017SPing-Ke Shih 
951e3ec7017SPing-Ke Shih 	head = bd_ring->head;
952e3ec7017SPing-Ke Shih 	tx_bd = head + bd_ring->wp;
953e3ec7017SPing-Ke Shih 
954e3ec7017SPing-Ke Shih 	return tx_bd;
955e3ec7017SPing-Ke Shih }
956e3ec7017SPing-Ke Shih 
957e3ec7017SPing-Ke Shih static inline struct rtw89_pci_tx_wd *
958e3ec7017SPing-Ke Shih rtw89_pci_dequeue_txwd(struct rtw89_pci_tx_ring *tx_ring)
959e3ec7017SPing-Ke Shih {
960e3ec7017SPing-Ke Shih 	struct rtw89_pci_tx_wd_ring *wd_ring = &tx_ring->wd_ring;
961e3ec7017SPing-Ke Shih 	struct rtw89_pci_tx_wd *txwd;
962e3ec7017SPing-Ke Shih 
963e3ec7017SPing-Ke Shih 	txwd = list_first_entry_or_null(&wd_ring->free_pages,
964e3ec7017SPing-Ke Shih 					struct rtw89_pci_tx_wd, list);
965e3ec7017SPing-Ke Shih 	if (!txwd)
966e3ec7017SPing-Ke Shih 		return NULL;
967e3ec7017SPing-Ke Shih 
968e3ec7017SPing-Ke Shih 	list_del_init(&txwd->list);
969e3ec7017SPing-Ke Shih 	txwd->len = 0;
970e3ec7017SPing-Ke Shih 	wd_ring->curr_num--;
971e3ec7017SPing-Ke Shih 
972e3ec7017SPing-Ke Shih 	return txwd;
973e3ec7017SPing-Ke Shih }
974e3ec7017SPing-Ke Shih 
975e3ec7017SPing-Ke Shih static inline void
976e3ec7017SPing-Ke Shih rtw89_pci_enqueue_txwd(struct rtw89_pci_tx_ring *tx_ring,
977e3ec7017SPing-Ke Shih 		       struct rtw89_pci_tx_wd *txwd)
978e3ec7017SPing-Ke Shih {
979e3ec7017SPing-Ke Shih 	struct rtw89_pci_tx_wd_ring *wd_ring = &tx_ring->wd_ring;
980e3ec7017SPing-Ke Shih 
981e3ec7017SPing-Ke Shih 	memset(txwd->vaddr, 0, wd_ring->page_size);
982e3ec7017SPing-Ke Shih 	list_add_tail(&txwd->list, &wd_ring->free_pages);
983e3ec7017SPing-Ke Shih 	wd_ring->curr_num++;
984e3ec7017SPing-Ke Shih }
985e3ec7017SPing-Ke Shih 
986e3ec7017SPing-Ke Shih static inline bool rtw89_pci_ltr_is_err_reg_val(u32 val)
987e3ec7017SPing-Ke Shih {
988e3ec7017SPing-Ke Shih 	return val == 0xffffffff || val == 0xeaeaeaea;
989e3ec7017SPing-Ke Shih }
990e3ec7017SPing-Ke Shih 
991e3ec7017SPing-Ke Shih extern const struct dev_pm_ops rtw89_pm_ops;
99297d61bf9SPing-Ke Shih extern const struct rtw89_pci_ch_dma_addr_set rtw89_pci_ch_dma_addr_set;
99397d61bf9SPing-Ke Shih extern const struct rtw89_pci_ch_dma_addr_set rtw89_pci_ch_dma_addr_set_v1;
994e3ec7017SPing-Ke Shih 
995861e58c8SZong-Zhe Yang struct pci_device_id;
996861e58c8SZong-Zhe Yang 
997861e58c8SZong-Zhe Yang int rtw89_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id);
998861e58c8SZong-Zhe Yang void rtw89_pci_remove(struct pci_dev *pdev);
9990db862fbSPing-Ke Shih int rtw89_pci_ltr_set(struct rtw89_dev *rtwdev, bool en);
10000db862fbSPing-Ke Shih int rtw89_pci_ltr_set_v1(struct rtw89_dev *rtwdev, bool en);
10016d5b5d62SPing-Ke Shih u32 rtw89_pci_fill_txaddr_info(struct rtw89_dev *rtwdev,
10026d5b5d62SPing-Ke Shih 			       void *txaddr_info_addr, u32 total_len,
10036d5b5d62SPing-Ke Shih 			       dma_addr_t dma, u8 *add_info_nr);
10046d5b5d62SPing-Ke Shih u32 rtw89_pci_fill_txaddr_info_v1(struct rtw89_dev *rtwdev,
10056d5b5d62SPing-Ke Shih 				  void *txaddr_info_addr, u32 total_len,
10066d5b5d62SPing-Ke Shih 				  dma_addr_t dma, u8 *add_info_nr);
1007948e521cSPing-Ke Shih void rtw89_pci_config_intr_mask(struct rtw89_dev *rtwdev);
1008948e521cSPing-Ke Shih void rtw89_pci_config_intr_mask_v1(struct rtw89_dev *rtwdev);
1009948e521cSPing-Ke Shih void rtw89_pci_enable_intr(struct rtw89_dev *rtwdev, struct rtw89_pci *rtwpci);
1010948e521cSPing-Ke Shih void rtw89_pci_disable_intr(struct rtw89_dev *rtwdev, struct rtw89_pci *rtwpci);
1011948e521cSPing-Ke Shih void rtw89_pci_enable_intr_v1(struct rtw89_dev *rtwdev, struct rtw89_pci *rtwpci);
1012948e521cSPing-Ke Shih void rtw89_pci_disable_intr_v1(struct rtw89_dev *rtwdev, struct rtw89_pci *rtwpci);
1013948e521cSPing-Ke Shih void rtw89_pci_recognize_intrs(struct rtw89_dev *rtwdev,
1014948e521cSPing-Ke Shih 			       struct rtw89_pci *rtwpci,
1015948e521cSPing-Ke Shih 			       struct rtw89_pci_isrs *isrs);
1016948e521cSPing-Ke Shih void rtw89_pci_recognize_intrs_v1(struct rtw89_dev *rtwdev,
1017948e521cSPing-Ke Shih 				  struct rtw89_pci *rtwpci,
1018948e521cSPing-Ke Shih 				  struct rtw89_pci_isrs *isrs);
10196d5b5d62SPing-Ke Shih 
10206d5b5d62SPing-Ke Shih static inline
10216d5b5d62SPing-Ke Shih u32 rtw89_chip_fill_txaddr_info(struct rtw89_dev *rtwdev,
10226d5b5d62SPing-Ke Shih 				void *txaddr_info_addr, u32 total_len,
10236d5b5d62SPing-Ke Shih 				dma_addr_t dma, u8 *add_info_nr)
10246d5b5d62SPing-Ke Shih {
10256d5b5d62SPing-Ke Shih 	const struct rtw89_pci_info *info = rtwdev->pci_info;
10266d5b5d62SPing-Ke Shih 
10276d5b5d62SPing-Ke Shih 	return info->fill_txaddr_info(rtwdev, txaddr_info_addr, total_len,
10286d5b5d62SPing-Ke Shih 				      dma, add_info_nr);
10296d5b5d62SPing-Ke Shih }
1030861e58c8SZong-Zhe Yang 
1031948e521cSPing-Ke Shih static inline void rtw89_chip_config_intr_mask(struct rtw89_dev *rtwdev,
1032948e521cSPing-Ke Shih 					       enum rtw89_pci_intr_mask_cfg cfg)
1033948e521cSPing-Ke Shih {
1034948e521cSPing-Ke Shih 	struct rtw89_pci *rtwpci = (struct rtw89_pci *)rtwdev->priv;
1035948e521cSPing-Ke Shih 	const struct rtw89_pci_info *info = rtwdev->pci_info;
1036948e521cSPing-Ke Shih 
1037948e521cSPing-Ke Shih 	switch (cfg) {
1038948e521cSPing-Ke Shih 	default:
1039948e521cSPing-Ke Shih 	case RTW89_PCI_INTR_MASK_RESET:
1040948e521cSPing-Ke Shih 		rtwpci->low_power = false;
1041948e521cSPing-Ke Shih 		rtwpci->under_recovery = false;
1042948e521cSPing-Ke Shih 		break;
1043948e521cSPing-Ke Shih 	case RTW89_PCI_INTR_MASK_NORMAL:
1044948e521cSPing-Ke Shih 		rtwpci->low_power = false;
1045948e521cSPing-Ke Shih 		break;
1046948e521cSPing-Ke Shih 	case RTW89_PCI_INTR_MASK_LOW_POWER:
1047948e521cSPing-Ke Shih 		rtwpci->low_power = true;
1048948e521cSPing-Ke Shih 		break;
1049948e521cSPing-Ke Shih 	case RTW89_PCI_INTR_MASK_RECOVERY_START:
1050948e521cSPing-Ke Shih 		rtwpci->under_recovery = true;
1051948e521cSPing-Ke Shih 		break;
1052948e521cSPing-Ke Shih 	case RTW89_PCI_INTR_MASK_RECOVERY_COMPLETE:
1053948e521cSPing-Ke Shih 		rtwpci->under_recovery = false;
1054948e521cSPing-Ke Shih 		break;
1055948e521cSPing-Ke Shih 	}
1056948e521cSPing-Ke Shih 
1057948e521cSPing-Ke Shih 	rtw89_debug(rtwdev, RTW89_DBG_HCI,
1058948e521cSPing-Ke Shih 		    "Configure PCI interrupt mask mode low_power=%d under_recovery=%d\n",
1059948e521cSPing-Ke Shih 		    rtwpci->low_power, rtwpci->under_recovery);
1060948e521cSPing-Ke Shih 
1061948e521cSPing-Ke Shih 	info->config_intr_mask(rtwdev);
1062948e521cSPing-Ke Shih }
1063948e521cSPing-Ke Shih 
1064948e521cSPing-Ke Shih static inline
1065948e521cSPing-Ke Shih void rtw89_chip_enable_intr(struct rtw89_dev *rtwdev, struct rtw89_pci *rtwpci)
1066948e521cSPing-Ke Shih {
1067948e521cSPing-Ke Shih 	const struct rtw89_pci_info *info = rtwdev->pci_info;
1068948e521cSPing-Ke Shih 
1069948e521cSPing-Ke Shih 	info->enable_intr(rtwdev, rtwpci);
1070948e521cSPing-Ke Shih }
1071948e521cSPing-Ke Shih 
1072948e521cSPing-Ke Shih static inline
1073948e521cSPing-Ke Shih void rtw89_chip_disable_intr(struct rtw89_dev *rtwdev, struct rtw89_pci *rtwpci)
1074948e521cSPing-Ke Shih {
1075948e521cSPing-Ke Shih 	const struct rtw89_pci_info *info = rtwdev->pci_info;
1076948e521cSPing-Ke Shih 
1077948e521cSPing-Ke Shih 	info->disable_intr(rtwdev, rtwpci);
1078948e521cSPing-Ke Shih }
1079948e521cSPing-Ke Shih 
1080948e521cSPing-Ke Shih static inline
1081948e521cSPing-Ke Shih void rtw89_chip_recognize_intrs(struct rtw89_dev *rtwdev,
1082948e521cSPing-Ke Shih 				struct rtw89_pci *rtwpci,
1083948e521cSPing-Ke Shih 				struct rtw89_pci_isrs *isrs)
1084948e521cSPing-Ke Shih {
1085948e521cSPing-Ke Shih 	const struct rtw89_pci_info *info = rtwdev->pci_info;
1086948e521cSPing-Ke Shih 
1087948e521cSPing-Ke Shih 	info->recognize_intrs(rtwdev, rtwpci, isrs);
1088948e521cSPing-Ke Shih }
1089948e521cSPing-Ke Shih 
1090e3ec7017SPing-Ke Shih #endif
1091