xref: /openbsd-src/sys/dev/ic/dwqevar.h (revision 5e1c6ec49de0cd946f26488798a31f7104259aae)
1*5e1c6ec4Skettenis /*	$OpenBSD: dwqevar.h,v 1.11 2024/02/26 18:57:50 kettenis Exp $	*/
2305ac5f9Spatrick /*
3305ac5f9Spatrick  * Copyright (c) 2008, 2019 Mark Kettenis <kettenis@openbsd.org>
4305ac5f9Spatrick  * Copyright (c) 2017, 2022 Patrick Wildt <patrick@blueri.se>
5305ac5f9Spatrick  *
6305ac5f9Spatrick  * Permission to use, copy, modify, and distribute this software for any
7305ac5f9Spatrick  * purpose with or without fee is hereby granted, provided that the above
8305ac5f9Spatrick  * copyright notice and this permission notice appear in all copies.
9305ac5f9Spatrick  *
10305ac5f9Spatrick  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11305ac5f9Spatrick  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12305ac5f9Spatrick  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13305ac5f9Spatrick  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14305ac5f9Spatrick  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15305ac5f9Spatrick  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16305ac5f9Spatrick  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17305ac5f9Spatrick  */
18305ac5f9Spatrick 
19e9f49f11Skettenis enum dwqe_phy_mode {
20e9f49f11Skettenis 	DWQE_PHY_MODE_UNKNOWN,
21*5e1c6ec4Skettenis 	DWQE_PHY_MODE_RMII,
22e9f49f11Skettenis 	DWQE_PHY_MODE_RGMII,
23e9f49f11Skettenis 	DWQE_PHY_MODE_RGMII_ID,
24e9f49f11Skettenis 	DWQE_PHY_MODE_RGMII_TXID,
25e9f49f11Skettenis 	DWQE_PHY_MODE_RGMII_RXID,
26b7fc3726Sstsp 	DWQE_PHY_MODE_SGMII,
27e9f49f11Skettenis };
28e9f49f11Skettenis 
29305ac5f9Spatrick struct dwqe_buf {
30305ac5f9Spatrick 	bus_dmamap_t	tb_map;
31305ac5f9Spatrick 	struct mbuf	*tb_m;
32305ac5f9Spatrick };
33305ac5f9Spatrick 
34305ac5f9Spatrick #define DWQE_NTXDESC	256
35305ac5f9Spatrick #define DWQE_NTXSEGS	16
36305ac5f9Spatrick 
37305ac5f9Spatrick #define DWQE_NRXDESC	256
38305ac5f9Spatrick 
39305ac5f9Spatrick struct dwqe_dmamem {
40305ac5f9Spatrick 	bus_dmamap_t		tdm_map;
41305ac5f9Spatrick 	bus_dma_segment_t	tdm_seg;
42305ac5f9Spatrick 	size_t			tdm_size;
43305ac5f9Spatrick 	caddr_t			tdm_kva;
44305ac5f9Spatrick };
45305ac5f9Spatrick #define DWQE_DMA_MAP(_tdm)	((_tdm)->tdm_map)
46305ac5f9Spatrick #define DWQE_DMA_LEN(_tdm)	((_tdm)->tdm_size)
47305ac5f9Spatrick #define DWQE_DMA_DVA(_tdm)	((_tdm)->tdm_map->dm_segs[0].ds_addr)
48305ac5f9Spatrick #define DWQE_DMA_KVA(_tdm)	((void *)(_tdm)->tdm_kva)
49305ac5f9Spatrick 
50305ac5f9Spatrick struct dwqe_softc {
51305ac5f9Spatrick 	struct device		sc_dev;
52305ac5f9Spatrick 	int			sc_node;
53305ac5f9Spatrick 	bus_space_tag_t		sc_iot;
54305ac5f9Spatrick 	bus_space_handle_t	sc_ioh;
55305ac5f9Spatrick 	bus_dma_tag_t		sc_dmat;
56305ac5f9Spatrick 	void			*sc_ih;
57305ac5f9Spatrick 
58305ac5f9Spatrick 	struct arpcom		sc_ac;
59305ac5f9Spatrick #define sc_lladdr	sc_ac.ac_enaddr
60305ac5f9Spatrick 	struct mii_data		sc_mii;
61305ac5f9Spatrick #define sc_media	sc_mii.mii_media
62305ac5f9Spatrick 	int			sc_link;
63305ac5f9Spatrick 	int			sc_phyloc;
64e9f49f11Skettenis 	enum dwqe_phy_mode	sc_phy_mode;
6547707f8eSdlg 	struct timeout		sc_phy_tick;
6645f5f3c8Sdlg 	int			sc_fixed_link;
67305ac5f9Spatrick 
68305ac5f9Spatrick 	struct dwqe_dmamem	*sc_txring;
69305ac5f9Spatrick 	struct dwqe_buf		*sc_txbuf;
70305ac5f9Spatrick 	struct dwqe_desc	*sc_txdesc;
71305ac5f9Spatrick 	int			sc_tx_prod;
72305ac5f9Spatrick 	int			sc_tx_cons;
73305ac5f9Spatrick 
74305ac5f9Spatrick 	struct dwqe_dmamem	*sc_rxring;
75305ac5f9Spatrick 	struct dwqe_buf		*sc_rxbuf;
76305ac5f9Spatrick 	struct dwqe_desc	*sc_rxdesc;
77305ac5f9Spatrick 	int			sc_rx_prod;
78305ac5f9Spatrick 	struct if_rxring	sc_rx_ring;
79305ac5f9Spatrick 	int			sc_rx_cons;
80305ac5f9Spatrick 
81305ac5f9Spatrick 	struct timeout		sc_rxto;
827bc2c437Skettenis 	struct task		sc_statchg_task;
83305ac5f9Spatrick 
84305ac5f9Spatrick 	uint32_t		sc_clk;
85b97405d6Sstsp 	uint32_t		sc_clkrate;
86305ac5f9Spatrick 
87305ac5f9Spatrick 	bus_size_t		sc_clk_sel;
88305ac5f9Spatrick 	uint32_t		sc_clk_sel_125;
89305ac5f9Spatrick 	uint32_t		sc_clk_sel_25;
90305ac5f9Spatrick 	uint32_t		sc_clk_sel_2_5;
91305ac5f9Spatrick 
92305ac5f9Spatrick 	int			sc_hw_feature[4];
93305ac5f9Spatrick 
94305ac5f9Spatrick 	int			sc_force_thresh_dma_mode;
95305ac5f9Spatrick 	int			sc_fixed_burst;
96305ac5f9Spatrick 	int			sc_mixed_burst;
97305ac5f9Spatrick 	int			sc_aal;
98305ac5f9Spatrick 	int			sc_8xpbl;
99305ac5f9Spatrick 	int			sc_pbl;
100305ac5f9Spatrick 	int			sc_txpbl;
101305ac5f9Spatrick 	int			sc_rxpbl;
1026e9149a4Sstsp 	int			sc_txfifo_size;
1036e9149a4Sstsp 	int			sc_rxfifo_size;
104305ac5f9Spatrick 	int			sc_axi_config;
105305ac5f9Spatrick 	int			sc_lpi_en;
106305ac5f9Spatrick 	int			sc_xit_frm;
107305ac5f9Spatrick 	int			sc_wr_osr_lmt;
108305ac5f9Spatrick 	int			sc_rd_osr_lmt;
109305ac5f9Spatrick 
110305ac5f9Spatrick 	uint32_t		sc_blen[7];
111305ac5f9Spatrick };
112305ac5f9Spatrick 
113305ac5f9Spatrick #define DEVNAME(_s)	((_s)->sc_dev.dv_xname)
114305ac5f9Spatrick 
115305ac5f9Spatrick int	dwqe_attach(struct dwqe_softc *);
116305ac5f9Spatrick void	dwqe_reset(struct dwqe_softc *);
117305ac5f9Spatrick int	dwqe_intr(void *);
118305ac5f9Spatrick uint32_t dwqe_read(struct dwqe_softc *, bus_addr_t);
119305ac5f9Spatrick void	dwqe_write(struct dwqe_softc *, bus_addr_t, uint32_t);
120305ac5f9Spatrick void	dwqe_lladdr_read(struct dwqe_softc *, uint8_t *);
121305ac5f9Spatrick void	dwqe_lladdr_write(struct dwqe_softc *);
122305ac5f9Spatrick void	dwqe_mii_statchg(struct device *);
123