xref: /freebsd/sys/dev/etherswitch/ar40xx/ar40xx_var.h (revision 4d846d260e2b9a3d4d0a701462568268cbfe7a5b)
1e388de98SAdrian Chadd /*-
2*4d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
3e388de98SAdrian Chadd  *
4e388de98SAdrian Chadd  * Copyright (c) 2022 Adrian Chadd <adrian@FreeBSD.org>.
5e388de98SAdrian Chadd  *
6e388de98SAdrian Chadd  * Redistribution and use in source and binary forms, with or without
7e388de98SAdrian Chadd  * modification, are permitted provided that the following conditions
8e388de98SAdrian Chadd  * are met:
9e388de98SAdrian Chadd  * 1. Redistributions of source code must retain the above copyright
10e388de98SAdrian Chadd  *    notice, this list of conditions and the following disclaimer.
11e388de98SAdrian Chadd  * 2. Redistributions in binary form must reproduce the above copyright
12e388de98SAdrian Chadd  *    notice, this list of conditions and the following disclaimer in the
13e388de98SAdrian Chadd  *    documentation and/or other materials provided with the distribution.
14e388de98SAdrian Chadd  *
15e388de98SAdrian Chadd  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16e388de98SAdrian Chadd  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17e388de98SAdrian Chadd  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18e388de98SAdrian Chadd  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19e388de98SAdrian Chadd  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20e388de98SAdrian Chadd  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21e388de98SAdrian Chadd  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22e388de98SAdrian Chadd  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23e388de98SAdrian Chadd  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24e388de98SAdrian Chadd  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25e388de98SAdrian Chadd  * SUCH DAMAGE.
26e388de98SAdrian Chadd  */
27e388de98SAdrian Chadd #ifndef	__AR40XX_VAR_H__
28e388de98SAdrian Chadd #define	__AR40XX_VAR_H__
29e388de98SAdrian Chadd 
30e388de98SAdrian Chadd #define	AR40XX_LOCK(_sc)		mtx_lock(&(_sc)->sc_mtx)
31e388de98SAdrian Chadd #define	AR40XX_UNLOCK(_sc)		mtx_unlock(&(_sc)->sc_mtx)
32e388de98SAdrian Chadd #define	AR40XX_LOCK_ASSERT(_sc)		mtx_assert(&(_sc)->sc_mtx, MA_OWNED)
33e388de98SAdrian Chadd 
34e388de98SAdrian Chadd /*
35e388de98SAdrian Chadd  * register space access macros
36e388de98SAdrian Chadd  */
37e388de98SAdrian Chadd #define	AR40XX_REG_WRITE(sc, reg, val)		do {		\
38e388de98SAdrian Chadd 	    bus_write_4(sc->sc_ess_mem_res, (reg), (val));	\
39e388de98SAdrian Chadd 	    } while (0)
40e388de98SAdrian Chadd 
41e388de98SAdrian Chadd #define	AR40XX_REG_READ(sc, reg)	bus_read_4(sc->sc_ess_mem_res, (reg))
42e388de98SAdrian Chadd 
43e388de98SAdrian Chadd #define	AR40XX_REG_BARRIER_WRITE(sc)	bus_barrier((sc)->sc_ess_mem_res,	\
44e388de98SAdrian Chadd 	    0, (sc)->sc_ess_mem_size, BUS_SPACE_BARRIER_WRITE)
45e388de98SAdrian Chadd #define	AR40XX_REG_BARRIER_READ(sc)	bus_barrier((sc)->sc_ess_mem_res,	\
46e388de98SAdrian Chadd 	    0, (sc)->sc_ess_mem_size, BUS_SPACE_BARRIER_READ)
47e388de98SAdrian Chadd #define	AR40XX_REG_BARRIER_RW(sc)	bus_barrier((sc)->sc_ess_mem_res,	\
48e388de98SAdrian Chadd 	    0, (sc)->sc_ess_mem_size,					\
49e388de98SAdrian Chadd 	    BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE)
50e388de98SAdrian Chadd 
51e388de98SAdrian Chadd /* Size of the VLAN table itself in hardware */
52e388de98SAdrian Chadd #define	AR40XX_NUM_VTU_ENTRIES		64
53e388de98SAdrian Chadd #define	AR40XX_NUM_PORTS		6
54e388de98SAdrian Chadd #define	AR40XX_NUM_PHYS			5
55e388de98SAdrian Chadd /* Size of the ATU table in hardware */
56e388de98SAdrian Chadd #define	AR40XX_NUM_ATU_ENTRIES		2048
57e388de98SAdrian Chadd 
58e388de98SAdrian Chadd struct ar40xx_softc {
59e388de98SAdrian Chadd 	struct mtx	sc_mtx;		/* serialize access to softc */
60e388de98SAdrian Chadd 	device_t	sc_dev;
61e388de98SAdrian Chadd 	uint32_t	sc_debug;
62e388de98SAdrian Chadd 
63e388de98SAdrian Chadd 	/* ess-switch memory resource */
64e388de98SAdrian Chadd 	struct resource	*sc_ess_mem_res;
65e388de98SAdrian Chadd 	int		sc_ess_mem_rid;
66e388de98SAdrian Chadd 	size_t		sc_ess_mem_size;
67e388de98SAdrian Chadd 
68e388de98SAdrian Chadd 	/* ess-switch clock resource */
69e388de98SAdrian Chadd 	clk_t		sc_ess_clk;
70e388de98SAdrian Chadd 
71e388de98SAdrian Chadd 	/* ess-switch reset resource */
72e388de98SAdrian Chadd 	hwreset_t	sc_ess_rst;
73e388de98SAdrian Chadd 
74e388de98SAdrian Chadd 	/* phy update callout timer */
75e388de98SAdrian Chadd 	struct callout	sc_phy_callout;
76e388de98SAdrian Chadd 
77e388de98SAdrian Chadd 	/* memory for the ess-psgmii config interface */
78e388de98SAdrian Chadd 	bus_space_tag_t		sc_psgmii_mem_tag;
79e388de98SAdrian Chadd 	bus_space_handle_t	sc_psgmii_mem_handle;
80e388de98SAdrian Chadd 	bus_size_t		sc_psgmii_mem_size;
81e388de98SAdrian Chadd 
82e388de98SAdrian Chadd 	/* reference to the ipq4019-mdio interface */
83e388de98SAdrian Chadd 	phandle_t		sc_mdio_phandle;
84e388de98SAdrian Chadd 	device_t		sc_mdio_dev;
85e388de98SAdrian Chadd 
86e388de98SAdrian Chadd 	etherswitch_info_t	sc_info;
87e388de98SAdrian Chadd 
88e388de98SAdrian Chadd 	struct {
89e388de98SAdrian Chadd 		uint32_t	phy_t_status;
90e388de98SAdrian Chadd 	} sc_psgmii;
91e388de98SAdrian Chadd 
92e388de98SAdrian Chadd 	struct {
93e388de98SAdrian Chadd 		uint32_t switch_mac_mode;
94e388de98SAdrian Chadd 		uint32_t switch_cpu_bmp;
95e388de98SAdrian Chadd 		uint32_t switch_lan_bmp;
96e388de98SAdrian Chadd 		uint32_t switch_wan_bmp;
97e388de98SAdrian Chadd 	} sc_config;
98e388de98SAdrian Chadd 
99e388de98SAdrian Chadd 	/* VLAN table configuration */
100e388de98SAdrian Chadd 	struct {
101e388de98SAdrian Chadd 		/* Whether 802.1q VLANs are enabled or not */
102e388de98SAdrian Chadd 		bool vlan;
103e388de98SAdrian Chadd 		/* Map etherswitch vgroup to 802.1q vlan */
104e388de98SAdrian Chadd 		uint16_t vlan_id[AR40XX_NUM_VTU_ENTRIES];
105e388de98SAdrian Chadd 		/* VLAN port membership */
106e388de98SAdrian Chadd 		uint8_t vlan_ports[AR40XX_NUM_VTU_ENTRIES];
107e388de98SAdrian Chadd 		/* VLAN port membership - untagged ports */
108e388de98SAdrian Chadd 		uint16_t vlan_untagged[AR40XX_NUM_VTU_ENTRIES];
109e388de98SAdrian Chadd 		/* PVID for each port - index into vlan_id[] */
110e388de98SAdrian Chadd 		uint16_t pvid[AR40XX_NUM_PORTS];
111e388de98SAdrian Chadd 	} sc_vlan;
112e388de98SAdrian Chadd 
113e388de98SAdrian Chadd 	struct {
114e388de98SAdrian Chadd 		bool mirror_rx;
115e388de98SAdrian Chadd 		bool mirror_tx;
116e388de98SAdrian Chadd 		int source_port;
117e388de98SAdrian Chadd 		int monitor_port;
118e388de98SAdrian Chadd 	} sc_monitor;
119e388de98SAdrian Chadd 
120e388de98SAdrian Chadd 	struct {
121e388de98SAdrian Chadd 		char *ifname[AR40XX_NUM_PHYS];
122e388de98SAdrian Chadd 		device_t miibus[AR40XX_NUM_PHYS];
1232e6a8c1aSJustin Hibbits 		if_t ifp[AR40XX_NUM_PHYS];
124e388de98SAdrian Chadd 	} sc_phys;
125e388de98SAdrian Chadd 
126e388de98SAdrian Chadd 	/* ATU (address table unit) support */
127e388de98SAdrian Chadd 	struct {
128e388de98SAdrian Chadd 		int count;
129e388de98SAdrian Chadd 		int size;
130e388de98SAdrian Chadd 		etherswitch_atu_entry_t entries[AR40XX_NUM_ATU_ENTRIES];
131e388de98SAdrian Chadd 	} atu;
132e388de98SAdrian Chadd };
133e388de98SAdrian Chadd 
134e388de98SAdrian Chadd #endif	/* __AR40XX_VAR_H__ */
135e388de98SAdrian Chadd 
136