xref: /freebsd/sys/contrib/dev/rtw88/pci.h (revision 2774f206809b8fd3a4904fe945f029a414fbc642)
1*2774f206SBjoern A. Zeeb /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
2*2774f206SBjoern A. Zeeb /* Copyright(c) 2018-2019  Realtek Corporation
3*2774f206SBjoern A. Zeeb  */
4*2774f206SBjoern A. Zeeb 
5*2774f206SBjoern A. Zeeb #ifndef __RTK_PCI_H_
6*2774f206SBjoern A. Zeeb #define __RTK_PCI_H_
7*2774f206SBjoern A. Zeeb 
8*2774f206SBjoern A. Zeeb #include "main.h"
9*2774f206SBjoern A. Zeeb 
10*2774f206SBjoern A. Zeeb #define RTK_DEFAULT_TX_DESC_NUM 128
11*2774f206SBjoern A. Zeeb #define RTK_BEQ_TX_DESC_NUM	256
12*2774f206SBjoern A. Zeeb 
13*2774f206SBjoern A. Zeeb #define RTK_MAX_RX_DESC_NUM	512
14*2774f206SBjoern A. Zeeb /* 11K + rx desc size */
15*2774f206SBjoern A. Zeeb #define RTK_PCI_RX_BUF_SIZE	(11454 + 24)
16*2774f206SBjoern A. Zeeb 
17*2774f206SBjoern A. Zeeb #define RTK_PCI_CTRL		0x300
18*2774f206SBjoern A. Zeeb #define BIT_RST_TRXDMA_INTF	BIT(20)
19*2774f206SBjoern A. Zeeb #define BIT_RX_TAG_EN		BIT(15)
20*2774f206SBjoern A. Zeeb #define REG_DBI_WDATA_V1	0x03E8
21*2774f206SBjoern A. Zeeb #define REG_DBI_RDATA_V1	0x03EC
22*2774f206SBjoern A. Zeeb #define REG_DBI_FLAG_V1		0x03F0
23*2774f206SBjoern A. Zeeb #define BIT_DBI_RFLAG		BIT(17)
24*2774f206SBjoern A. Zeeb #define BIT_DBI_WFLAG		BIT(16)
25*2774f206SBjoern A. Zeeb #define BITS_DBI_WREN		GENMASK(15, 12)
26*2774f206SBjoern A. Zeeb #define BITS_DBI_ADDR_MASK	GENMASK(11, 2)
27*2774f206SBjoern A. Zeeb 
28*2774f206SBjoern A. Zeeb #define REG_MDIO_V1		0x03F4
29*2774f206SBjoern A. Zeeb #define REG_PCIE_MIX_CFG	0x03F8
30*2774f206SBjoern A. Zeeb #define BITS_MDIO_ADDR_MASK	GENMASK(4, 0)
31*2774f206SBjoern A. Zeeb #define BIT_MDIO_WFLAG_V1	BIT(5)
32*2774f206SBjoern A. Zeeb #define RTW_PCI_MDIO_PG_SZ	BIT(5)
33*2774f206SBjoern A. Zeeb #define RTW_PCI_MDIO_PG_OFFS_G1	0
34*2774f206SBjoern A. Zeeb #define RTW_PCI_MDIO_PG_OFFS_G2	2
35*2774f206SBjoern A. Zeeb #define RTW_PCI_WR_RETRY_CNT	20
36*2774f206SBjoern A. Zeeb 
37*2774f206SBjoern A. Zeeb #define RTK_PCIE_LINK_CFG	0x0719
38*2774f206SBjoern A. Zeeb #define BIT_CLKREQ_SW_EN	BIT(4)
39*2774f206SBjoern A. Zeeb #define BIT_L1_SW_EN		BIT(3)
40*2774f206SBjoern A. Zeeb #define BIT_CLKREQ_N_PAD	BIT(0)
41*2774f206SBjoern A. Zeeb #define RTK_PCIE_CLKDLY_CTRL	0x0725
42*2774f206SBjoern A. Zeeb 
43*2774f206SBjoern A. Zeeb #define BIT_PCI_BCNQ_FLAG	BIT(4)
44*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_DESA_BCNQ	0x308
45*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_DESA_H2CQ	0x1320
46*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_DESA_MGMTQ	0x310
47*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_DESA_BKQ	0x330
48*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_DESA_BEQ	0x328
49*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_DESA_VIQ	0x320
50*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_DESA_VOQ	0x318
51*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_DESA_HI0Q	0x340
52*2774f206SBjoern A. Zeeb #define RTK_PCI_RXBD_DESA_MPDUQ	0x338
53*2774f206SBjoern A. Zeeb 
54*2774f206SBjoern A. Zeeb #define TRX_BD_IDX_MASK		GENMASK(11, 0)
55*2774f206SBjoern A. Zeeb #define TRX_BD_HW_IDX_MASK	GENMASK(27, 16)
56*2774f206SBjoern A. Zeeb 
57*2774f206SBjoern A. Zeeb /* BCNQ is specialized for rsvd page, does not need to specify a number */
58*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_NUM_H2CQ	0x1328
59*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_NUM_MGMTQ	0x380
60*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_NUM_BKQ	0x38A
61*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_NUM_BEQ	0x388
62*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_NUM_VIQ	0x386
63*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_NUM_VOQ	0x384
64*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_NUM_HI0Q	0x38C
65*2774f206SBjoern A. Zeeb #define RTK_PCI_RXBD_NUM_MPDUQ	0x382
66*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_IDX_H2CQ	0x132C
67*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_IDX_MGMTQ	0x3B0
68*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_IDX_BKQ	0x3AC
69*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_IDX_BEQ	0x3A8
70*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_IDX_VIQ	0x3A4
71*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_IDX_VOQ	0x3A0
72*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_IDX_HI0Q	0x3B8
73*2774f206SBjoern A. Zeeb #define RTK_PCI_RXBD_IDX_MPDUQ	0x3B4
74*2774f206SBjoern A. Zeeb 
75*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_RWPTR_CLR	0x39C
76*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_H2CQ_CSR	0x1330
77*2774f206SBjoern A. Zeeb 
78*2774f206SBjoern A. Zeeb #define BIT_CLR_H2CQ_HOST_IDX	BIT(16)
79*2774f206SBjoern A. Zeeb #define BIT_CLR_H2CQ_HW_IDX	BIT(8)
80*2774f206SBjoern A. Zeeb 
81*2774f206SBjoern A. Zeeb #define RTK_PCI_HIMR0		0x0B0
82*2774f206SBjoern A. Zeeb #define RTK_PCI_HISR0		0x0B4
83*2774f206SBjoern A. Zeeb #define RTK_PCI_HIMR1		0x0B8
84*2774f206SBjoern A. Zeeb #define RTK_PCI_HISR1		0x0BC
85*2774f206SBjoern A. Zeeb #define RTK_PCI_HIMR2		0x10B0
86*2774f206SBjoern A. Zeeb #define RTK_PCI_HISR2		0x10B4
87*2774f206SBjoern A. Zeeb #define RTK_PCI_HIMR3		0x10B8
88*2774f206SBjoern A. Zeeb #define RTK_PCI_HISR3		0x10BC
89*2774f206SBjoern A. Zeeb /* IMR 0 */
90*2774f206SBjoern A. Zeeb #define IMR_TIMER2		BIT(31)
91*2774f206SBjoern A. Zeeb #define IMR_TIMER1		BIT(30)
92*2774f206SBjoern A. Zeeb #define IMR_PSTIMEOUT		BIT(29)
93*2774f206SBjoern A. Zeeb #define IMR_GTINT4		BIT(28)
94*2774f206SBjoern A. Zeeb #define IMR_GTINT3		BIT(27)
95*2774f206SBjoern A. Zeeb #define IMR_TBDER		BIT(26)
96*2774f206SBjoern A. Zeeb #define IMR_TBDOK		BIT(25)
97*2774f206SBjoern A. Zeeb #define IMR_TSF_BIT32_TOGGLE	BIT(24)
98*2774f206SBjoern A. Zeeb #define IMR_BCNDMAINT0		BIT(20)
99*2774f206SBjoern A. Zeeb #define IMR_BCNDOK0		BIT(16)
100*2774f206SBjoern A. Zeeb #define IMR_HSISR_IND_ON_INT	BIT(15)
101*2774f206SBjoern A. Zeeb #define IMR_BCNDMAINT_E		BIT(14)
102*2774f206SBjoern A. Zeeb #define IMR_ATIMEND		BIT(12)
103*2774f206SBjoern A. Zeeb #define IMR_HISR1_IND_INT	BIT(11)
104*2774f206SBjoern A. Zeeb #define IMR_C2HCMD		BIT(10)
105*2774f206SBjoern A. Zeeb #define IMR_CPWM2		BIT(9)
106*2774f206SBjoern A. Zeeb #define IMR_CPWM		BIT(8)
107*2774f206SBjoern A. Zeeb #define IMR_HIGHDOK		BIT(7)
108*2774f206SBjoern A. Zeeb #define IMR_MGNTDOK		BIT(6)
109*2774f206SBjoern A. Zeeb #define IMR_BKDOK		BIT(5)
110*2774f206SBjoern A. Zeeb #define IMR_BEDOK		BIT(4)
111*2774f206SBjoern A. Zeeb #define IMR_VIDOK		BIT(3)
112*2774f206SBjoern A. Zeeb #define IMR_VODOK		BIT(2)
113*2774f206SBjoern A. Zeeb #define IMR_RDU			BIT(1)
114*2774f206SBjoern A. Zeeb #define IMR_ROK			BIT(0)
115*2774f206SBjoern A. Zeeb /* IMR 1 */
116*2774f206SBjoern A. Zeeb #define IMR_TXFIFO_TH_INT	BIT(30)
117*2774f206SBjoern A. Zeeb #define IMR_BTON_STS_UPDATE	BIT(29)
118*2774f206SBjoern A. Zeeb #define IMR_MCUERR		BIT(28)
119*2774f206SBjoern A. Zeeb #define IMR_BCNDMAINT7		BIT(27)
120*2774f206SBjoern A. Zeeb #define IMR_BCNDMAINT6		BIT(26)
121*2774f206SBjoern A. Zeeb #define IMR_BCNDMAINT5		BIT(25)
122*2774f206SBjoern A. Zeeb #define IMR_BCNDMAINT4		BIT(24)
123*2774f206SBjoern A. Zeeb #define IMR_BCNDMAINT3		BIT(23)
124*2774f206SBjoern A. Zeeb #define IMR_BCNDMAINT2		BIT(22)
125*2774f206SBjoern A. Zeeb #define IMR_BCNDMAINT1		BIT(21)
126*2774f206SBjoern A. Zeeb #define IMR_BCNDOK7		BIT(20)
127*2774f206SBjoern A. Zeeb #define IMR_BCNDOK6		BIT(19)
128*2774f206SBjoern A. Zeeb #define IMR_BCNDOK5		BIT(18)
129*2774f206SBjoern A. Zeeb #define IMR_BCNDOK4		BIT(17)
130*2774f206SBjoern A. Zeeb #define IMR_BCNDOK3		BIT(16)
131*2774f206SBjoern A. Zeeb #define IMR_BCNDOK2		BIT(15)
132*2774f206SBjoern A. Zeeb #define IMR_BCNDOK1		BIT(14)
133*2774f206SBjoern A. Zeeb #define IMR_ATIMEND_E		BIT(13)
134*2774f206SBjoern A. Zeeb #define IMR_ATIMEND		BIT(12)
135*2774f206SBjoern A. Zeeb #define IMR_TXERR		BIT(11)
136*2774f206SBjoern A. Zeeb #define IMR_RXERR		BIT(10)
137*2774f206SBjoern A. Zeeb #define IMR_TXFOVW		BIT(9)
138*2774f206SBjoern A. Zeeb #define IMR_RXFOVW		BIT(8)
139*2774f206SBjoern A. Zeeb #define IMR_CPU_MGQ_TXDONE	BIT(5)
140*2774f206SBjoern A. Zeeb #define IMR_PS_TIMER_C		BIT(4)
141*2774f206SBjoern A. Zeeb #define IMR_PS_TIMER_B		BIT(3)
142*2774f206SBjoern A. Zeeb #define IMR_PS_TIMER_A		BIT(2)
143*2774f206SBjoern A. Zeeb #define IMR_CPUMGQ_TX_TIMER	BIT(1)
144*2774f206SBjoern A. Zeeb /* IMR 3 */
145*2774f206SBjoern A. Zeeb #define IMR_H2CDOK		BIT(16)
146*2774f206SBjoern A. Zeeb 
147*2774f206SBjoern A. Zeeb enum rtw_pci_flags {
148*2774f206SBjoern A. Zeeb 	RTW_PCI_FLAG_NAPI_RUNNING,
149*2774f206SBjoern A. Zeeb 
150*2774f206SBjoern A. Zeeb 	NUM_OF_RTW_PCI_FLAGS,
151*2774f206SBjoern A. Zeeb };
152*2774f206SBjoern A. Zeeb 
153*2774f206SBjoern A. Zeeb /* one element is reserved to know if the ring is closed */
154*2774f206SBjoern A. Zeeb static inline int avail_desc(u32 wp, u32 rp, u32 len)
155*2774f206SBjoern A. Zeeb {
156*2774f206SBjoern A. Zeeb 	if (rp > wp)
157*2774f206SBjoern A. Zeeb 		return rp - wp - 1;
158*2774f206SBjoern A. Zeeb 	else
159*2774f206SBjoern A. Zeeb 		return len - wp + rp - 1;
160*2774f206SBjoern A. Zeeb }
161*2774f206SBjoern A. Zeeb 
162*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_OWN_OFFSET 15
163*2774f206SBjoern A. Zeeb #define RTK_PCI_TXBD_BCN_WORK	0x383
164*2774f206SBjoern A. Zeeb 
165*2774f206SBjoern A. Zeeb struct rtw_pci_tx_buffer_desc {
166*2774f206SBjoern A. Zeeb 	__le16 buf_size;
167*2774f206SBjoern A. Zeeb 	__le16 psb_len;
168*2774f206SBjoern A. Zeeb 	__le32 dma;
169*2774f206SBjoern A. Zeeb };
170*2774f206SBjoern A. Zeeb 
171*2774f206SBjoern A. Zeeb struct rtw_pci_tx_data {
172*2774f206SBjoern A. Zeeb 	dma_addr_t dma;
173*2774f206SBjoern A. Zeeb 	u8 sn;
174*2774f206SBjoern A. Zeeb };
175*2774f206SBjoern A. Zeeb 
176*2774f206SBjoern A. Zeeb struct rtw_pci_ring {
177*2774f206SBjoern A. Zeeb 	u8 *head;
178*2774f206SBjoern A. Zeeb 	dma_addr_t dma;
179*2774f206SBjoern A. Zeeb 
180*2774f206SBjoern A. Zeeb 	u8 desc_size;
181*2774f206SBjoern A. Zeeb 
182*2774f206SBjoern A. Zeeb 	u32 len;
183*2774f206SBjoern A. Zeeb 	u32 wp;
184*2774f206SBjoern A. Zeeb 	u32 rp;
185*2774f206SBjoern A. Zeeb };
186*2774f206SBjoern A. Zeeb 
187*2774f206SBjoern A. Zeeb struct rtw_pci_tx_ring {
188*2774f206SBjoern A. Zeeb 	struct rtw_pci_ring r;
189*2774f206SBjoern A. Zeeb 	struct sk_buff_head queue;
190*2774f206SBjoern A. Zeeb 	bool queue_stopped;
191*2774f206SBjoern A. Zeeb };
192*2774f206SBjoern A. Zeeb 
193*2774f206SBjoern A. Zeeb struct rtw_pci_rx_buffer_desc {
194*2774f206SBjoern A. Zeeb 	__le16 buf_size;
195*2774f206SBjoern A. Zeeb 	__le16 total_pkt_size;
196*2774f206SBjoern A. Zeeb 	__le32 dma;
197*2774f206SBjoern A. Zeeb };
198*2774f206SBjoern A. Zeeb 
199*2774f206SBjoern A. Zeeb struct rtw_pci_rx_ring {
200*2774f206SBjoern A. Zeeb 	struct rtw_pci_ring r;
201*2774f206SBjoern A. Zeeb 	struct sk_buff *buf[RTK_MAX_RX_DESC_NUM];
202*2774f206SBjoern A. Zeeb };
203*2774f206SBjoern A. Zeeb 
204*2774f206SBjoern A. Zeeb #define RX_TAG_MAX	8192
205*2774f206SBjoern A. Zeeb 
206*2774f206SBjoern A. Zeeb struct rtw_pci {
207*2774f206SBjoern A. Zeeb 	struct pci_dev *pdev;
208*2774f206SBjoern A. Zeeb 
209*2774f206SBjoern A. Zeeb 	/* Used for PCI interrupt. */
210*2774f206SBjoern A. Zeeb 	spinlock_t hwirq_lock;
211*2774f206SBjoern A. Zeeb 	/* Used for PCI TX ring/queueing, and enable INT. */
212*2774f206SBjoern A. Zeeb 	spinlock_t irq_lock;
213*2774f206SBjoern A. Zeeb 	u32 irq_mask[4];
214*2774f206SBjoern A. Zeeb 	bool irq_enabled;
215*2774f206SBjoern A. Zeeb 	bool running;
216*2774f206SBjoern A. Zeeb 
217*2774f206SBjoern A. Zeeb 	/* napi structure */
218*2774f206SBjoern A. Zeeb 	struct net_device netdev;
219*2774f206SBjoern A. Zeeb 	struct napi_struct napi;
220*2774f206SBjoern A. Zeeb 
221*2774f206SBjoern A. Zeeb 	u16 rx_tag;
222*2774f206SBjoern A. Zeeb 	DECLARE_BITMAP(tx_queued, RTK_MAX_TX_QUEUE_NUM);
223*2774f206SBjoern A. Zeeb 	struct rtw_pci_tx_ring tx_rings[RTK_MAX_TX_QUEUE_NUM];
224*2774f206SBjoern A. Zeeb 	struct rtw_pci_rx_ring rx_rings[RTK_MAX_RX_QUEUE_NUM];
225*2774f206SBjoern A. Zeeb 	u16 link_ctrl;
226*2774f206SBjoern A. Zeeb 	atomic_t link_usage;
227*2774f206SBjoern A. Zeeb 	bool rx_no_aspm;
228*2774f206SBjoern A. Zeeb 	DECLARE_BITMAP(flags, NUM_OF_RTW_PCI_FLAGS);
229*2774f206SBjoern A. Zeeb 
230*2774f206SBjoern A. Zeeb 	void __iomem *mmap;
231*2774f206SBjoern A. Zeeb };
232*2774f206SBjoern A. Zeeb 
233*2774f206SBjoern A. Zeeb extern const struct dev_pm_ops rtw_pm_ops;
234*2774f206SBjoern A. Zeeb 
235*2774f206SBjoern A. Zeeb int rtw_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id);
236*2774f206SBjoern A. Zeeb void rtw_pci_remove(struct pci_dev *pdev);
237*2774f206SBjoern A. Zeeb void rtw_pci_shutdown(struct pci_dev *pdev);
238*2774f206SBjoern A. Zeeb 
239*2774f206SBjoern A. Zeeb static inline u32 max_num_of_tx_queue(u8 queue)
240*2774f206SBjoern A. Zeeb {
241*2774f206SBjoern A. Zeeb 	u32 max_num;
242*2774f206SBjoern A. Zeeb 
243*2774f206SBjoern A. Zeeb 	switch (queue) {
244*2774f206SBjoern A. Zeeb 	case RTW_TX_QUEUE_BE:
245*2774f206SBjoern A. Zeeb 		max_num = RTK_BEQ_TX_DESC_NUM;
246*2774f206SBjoern A. Zeeb 		break;
247*2774f206SBjoern A. Zeeb 	case RTW_TX_QUEUE_BCN:
248*2774f206SBjoern A. Zeeb 		max_num = 1;
249*2774f206SBjoern A. Zeeb 		break;
250*2774f206SBjoern A. Zeeb 	default:
251*2774f206SBjoern A. Zeeb 		max_num = RTK_DEFAULT_TX_DESC_NUM;
252*2774f206SBjoern A. Zeeb 		break;
253*2774f206SBjoern A. Zeeb 	}
254*2774f206SBjoern A. Zeeb 
255*2774f206SBjoern A. Zeeb 	return max_num;
256*2774f206SBjoern A. Zeeb }
257*2774f206SBjoern A. Zeeb 
258*2774f206SBjoern A. Zeeb static inline struct
259*2774f206SBjoern A. Zeeb rtw_pci_tx_data *rtw_pci_get_tx_data(struct sk_buff *skb)
260*2774f206SBjoern A. Zeeb {
261*2774f206SBjoern A. Zeeb 	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
262*2774f206SBjoern A. Zeeb 
263*2774f206SBjoern A. Zeeb 	BUILD_BUG_ON(sizeof(struct rtw_pci_tx_data) >
264*2774f206SBjoern A. Zeeb 		     sizeof(info->status.status_driver_data));
265*2774f206SBjoern A. Zeeb 
266*2774f206SBjoern A. Zeeb 	return (struct rtw_pci_tx_data *)info->status.status_driver_data;
267*2774f206SBjoern A. Zeeb }
268*2774f206SBjoern A. Zeeb 
269*2774f206SBjoern A. Zeeb static inline
270*2774f206SBjoern A. Zeeb struct rtw_pci_tx_buffer_desc *get_tx_buffer_desc(struct rtw_pci_tx_ring *ring,
271*2774f206SBjoern A. Zeeb 						  u32 size)
272*2774f206SBjoern A. Zeeb {
273*2774f206SBjoern A. Zeeb 	u8 *buf_desc;
274*2774f206SBjoern A. Zeeb 
275*2774f206SBjoern A. Zeeb 	buf_desc = ring->r.head + ring->r.wp * size;
276*2774f206SBjoern A. Zeeb 	return (struct rtw_pci_tx_buffer_desc *)buf_desc;
277*2774f206SBjoern A. Zeeb }
278*2774f206SBjoern A. Zeeb 
279*2774f206SBjoern A. Zeeb #endif
280