1*2ed98337SAymeric Wibo /*-
2*2ed98337SAymeric Wibo * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3*2ed98337SAymeric Wibo *
4*2ed98337SAymeric Wibo * Copyright (c) 2022 Scott Long
5*2ed98337SAymeric Wibo * All rights reserved.
6*2ed98337SAymeric Wibo *
7*2ed98337SAymeric Wibo * Redistribution and use in source and binary forms, with or without
8*2ed98337SAymeric Wibo * modification, are permitted provided that the following conditions
9*2ed98337SAymeric Wibo * are met:
10*2ed98337SAymeric Wibo * 1. Redistributions of source code must retain the above copyright
11*2ed98337SAymeric Wibo * notice, this list of conditions and the following disclaimer.
12*2ed98337SAymeric Wibo * 2. Redistributions in binary form must reproduce the above copyright
13*2ed98337SAymeric Wibo * notice, this list of conditions and the following disclaimer in the
14*2ed98337SAymeric Wibo * documentation and/or other materials provided with the distribution.
15*2ed98337SAymeric Wibo *
16*2ed98337SAymeric Wibo * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17*2ed98337SAymeric Wibo * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18*2ed98337SAymeric Wibo * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19*2ed98337SAymeric Wibo * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20*2ed98337SAymeric Wibo * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21*2ed98337SAymeric Wibo * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22*2ed98337SAymeric Wibo * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23*2ed98337SAymeric Wibo * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24*2ed98337SAymeric Wibo * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25*2ed98337SAymeric Wibo * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26*2ed98337SAymeric Wibo * SUCH DAMAGE.
27*2ed98337SAymeric Wibo *
28*2ed98337SAymeric Wibo * $FreeBSD$
29*2ed98337SAymeric Wibo */
30*2ed98337SAymeric Wibo
31*2ed98337SAymeric Wibo #ifndef _ROUTER_VAR_H
32*2ed98337SAymeric Wibo #define _ROUTER_VAR_H
33*2ed98337SAymeric Wibo
34*2ed98337SAymeric Wibo struct router_softc;
35*2ed98337SAymeric Wibo struct router_command;
36*2ed98337SAymeric Wibo struct router_topo;
37*2ed98337SAymeric Wibo
38*2ed98337SAymeric Wibo typedef void (*router_callback_t)(struct router_softc *,
39*2ed98337SAymeric Wibo struct router_command *, void *);
40*2ed98337SAymeric Wibo
41*2ed98337SAymeric Wibo struct router_command {
42*2ed98337SAymeric Wibo TAILQ_ENTRY(router_command) link;
43*2ed98337SAymeric Wibo struct router_softc *sc;
44*2ed98337SAymeric Wibo struct nhi_cmd_frame *nhicmd;
45*2ed98337SAymeric Wibo u_int flags;
46*2ed98337SAymeric Wibo #define RCMD_POLLED (1 << 0)
47*2ed98337SAymeric Wibo #define RCMD_POLL_COMPLETE (1 << 1)
48*2ed98337SAymeric Wibo int resp_len;
49*2ed98337SAymeric Wibo router_callback_t callback;
50*2ed98337SAymeric Wibo void *callback_arg;
51*2ed98337SAymeric Wibo u_int dwlen;
52*2ed98337SAymeric Wibo u_int timeout;
53*2ed98337SAymeric Wibo int retries;
54*2ed98337SAymeric Wibo u_int ev;
55*2ed98337SAymeric Wibo uint8_t resp_buffer[NHI_RING0_FRAME_SIZE];
56*2ed98337SAymeric Wibo };
57*2ed98337SAymeric Wibo
58*2ed98337SAymeric Wibo struct router_softc {
59*2ed98337SAymeric Wibo TAILQ_ENTRY(router_softc) link;
60*2ed98337SAymeric Wibo u_int debug;
61*2ed98337SAymeric Wibo tb_route_t route;
62*2ed98337SAymeric Wibo device_t dev;
63*2ed98337SAymeric Wibo struct nhi_softc *nsc;
64*2ed98337SAymeric Wibo
65*2ed98337SAymeric Wibo struct mtx mtx;
66*2ed98337SAymeric Wibo struct nhi_ring_pair *ring0;
67*2ed98337SAymeric Wibo TAILQ_HEAD(,router_command) cmd_queue;
68*2ed98337SAymeric Wibo
69*2ed98337SAymeric Wibo struct router_command *inflight_cmd;
70*2ed98337SAymeric Wibo
71*2ed98337SAymeric Wibo uint8_t depth;
72*2ed98337SAymeric Wibo uint8_t max_adap;
73*2ed98337SAymeric Wibo
74*2ed98337SAymeric Wibo struct router_softc **adapters;
75*2ed98337SAymeric Wibo
76*2ed98337SAymeric Wibo uint32_t uuid[4];
77*2ed98337SAymeric Wibo };
78*2ed98337SAymeric Wibo
79*2ed98337SAymeric Wibo struct router_cfg_cap {
80*2ed98337SAymeric Wibo uint16_t current_cap;
81*2ed98337SAymeric Wibo uint16_t next_cap;
82*2ed98337SAymeric Wibo uint32_t space;
83*2ed98337SAymeric Wibo uint8_t adap;
84*2ed98337SAymeric Wibo uint8_t cap_id;
85*2ed98337SAymeric Wibo uint8_t vsc_id;
86*2ed98337SAymeric Wibo uint8_t vsc_len;
87*2ed98337SAymeric Wibo uint16_t vsec_len;
88*2ed98337SAymeric Wibo };
89*2ed98337SAymeric Wibo
90*2ed98337SAymeric Wibo int tb_router_attach(struct router_softc *, tb_route_t);
91*2ed98337SAymeric Wibo int tb_router_attach_root(struct nhi_softc *, tb_route_t);
92*2ed98337SAymeric Wibo int tb_router_detach(struct router_softc *);
93*2ed98337SAymeric Wibo int tb_config_read(struct router_softc *, u_int, u_int, u_int, u_int,
94*2ed98337SAymeric Wibo uint32_t *);
95*2ed98337SAymeric Wibo int tb_config_read_polled(struct router_softc *, u_int, u_int, u_int, u_int,
96*2ed98337SAymeric Wibo uint32_t *);
97*2ed98337SAymeric Wibo int tb_config_read_async(struct router_softc *, u_int, u_int, u_int, u_int,
98*2ed98337SAymeric Wibo uint32_t *, void *);
99*2ed98337SAymeric Wibo int tb_config_write(struct router_softc *, u_int, u_int, u_int, u_int,
100*2ed98337SAymeric Wibo uint32_t *);
101*2ed98337SAymeric Wibo int tb_config_next_cap(struct router_softc *, struct router_cfg_cap *);
102*2ed98337SAymeric Wibo int tb_config_find_cap(struct router_softc *, struct router_cfg_cap *);
103*2ed98337SAymeric Wibo int tb_config_find_router_cap(struct router_softc *, u_int, u_int, u_int *);
104*2ed98337SAymeric Wibo int tb_config_find_router_vsc(struct router_softc *, u_int, u_int *);
105*2ed98337SAymeric Wibo int tb_config_find_router_vsec(struct router_softc *, u_int, u_int *);
106*2ed98337SAymeric Wibo int tb_config_find_adapter_cap(struct router_softc *, u_int, u_int, u_int *);
107*2ed98337SAymeric Wibo int tb_config_get_lc_uuid(struct router_softc *, uint8_t *);
108*2ed98337SAymeric Wibo
109*2ed98337SAymeric Wibo #define TB_CONFIG_ADDR(seq, space, adapter, dwlen, offset) \
110*2ed98337SAymeric Wibo ((seq << TB_CFG_SEQ_SHIFT) | space | \
111*2ed98337SAymeric Wibo (adapter << TB_CFG_ADAPTER_SHIFT) | (dwlen << TB_CFG_SIZE_SHIFT) | \
112*2ed98337SAymeric Wibo (offset & TB_CFG_ADDR_MASK))
113*2ed98337SAymeric Wibo
114*2ed98337SAymeric Wibo #define TB_ROUTE(router) \
115*2ed98337SAymeric Wibo ((uint64_t)(router)->route.hi << 32) | (router)->route.lo
116*2ed98337SAymeric Wibo
117*2ed98337SAymeric Wibo static __inline void *
router_get_frame_data(struct router_command * cmd)118*2ed98337SAymeric Wibo router_get_frame_data(struct router_command *cmd)
119*2ed98337SAymeric Wibo {
120*2ed98337SAymeric Wibo return ((void *)cmd->nhicmd->data);
121*2ed98337SAymeric Wibo }
122*2ed98337SAymeric Wibo
123*2ed98337SAymeric Wibo /*
124*2ed98337SAymeric Wibo * Read the Router config space for the router referred to in the softc.
125*2ed98337SAymeric Wibo * addr - The dword offset in the config space
126*2ed98337SAymeric Wibo * dwlen - The number of dwords
127*2ed98337SAymeric Wibo * buf - must be large enough to hold the number of dwords requested.
128*2ed98337SAymeric Wibo */
129*2ed98337SAymeric Wibo static __inline int
tb_config_router_read(struct router_softc * sc,u_int addr,u_int dwlen,uint32_t * buf)130*2ed98337SAymeric Wibo tb_config_router_read(struct router_softc *sc, u_int addr, u_int dwlen,
131*2ed98337SAymeric Wibo uint32_t *buf)
132*2ed98337SAymeric Wibo {
133*2ed98337SAymeric Wibo return (tb_config_read(sc, TB_CFG_CS_ROUTER, 0, addr, dwlen, buf));
134*2ed98337SAymeric Wibo }
135*2ed98337SAymeric Wibo
136*2ed98337SAymeric Wibo static __inline int
tb_config_router_read_polled(struct router_softc * sc,u_int addr,u_int dwlen,uint32_t * buf)137*2ed98337SAymeric Wibo tb_config_router_read_polled(struct router_softc *sc, u_int addr, u_int dwlen,
138*2ed98337SAymeric Wibo uint32_t *buf)
139*2ed98337SAymeric Wibo {
140*2ed98337SAymeric Wibo return (tb_config_read_polled(sc, TB_CFG_CS_ROUTER, 0, addr, dwlen, buf));
141*2ed98337SAymeric Wibo }
142*2ed98337SAymeric Wibo
143*2ed98337SAymeric Wibo /*
144*2ed98337SAymeric Wibo * Write the Router config space for the router referred to in the softc.
145*2ed98337SAymeric Wibo * addr - The dword offset in the config space
146*2ed98337SAymeric Wibo * dwlen - The number of dwords
147*2ed98337SAymeric Wibo * buf - must be large enough to hold the number of dwords requested.
148*2ed98337SAymeric Wibo */
149*2ed98337SAymeric Wibo static __inline int
tb_config_router_write(struct router_softc * sc,u_int addr,u_int dwlen,uint32_t * buf)150*2ed98337SAymeric Wibo tb_config_router_write(struct router_softc *sc, u_int addr, u_int dwlen,
151*2ed98337SAymeric Wibo uint32_t *buf)
152*2ed98337SAymeric Wibo {
153*2ed98337SAymeric Wibo return (tb_config_write(sc, TB_CFG_CS_ROUTER, 0, addr, dwlen, buf));
154*2ed98337SAymeric Wibo }
155*2ed98337SAymeric Wibo
156*2ed98337SAymeric Wibo /*
157*2ed98337SAymeric Wibo * Read the Adapter config space for the router referred to in the softc.
158*2ed98337SAymeric Wibo * adap - Adapter number
159*2ed98337SAymeric Wibo * addr - The dword offset in the config space
160*2ed98337SAymeric Wibo * dwlen - The number of dwords
161*2ed98337SAymeric Wibo * buf - must be large enough to hold the number of dwords requested.
162*2ed98337SAymeric Wibo */
163*2ed98337SAymeric Wibo static __inline int
tb_config_adapter_read(struct router_softc * sc,u_int adap,u_int addr,u_int dwlen,uint32_t * buf)164*2ed98337SAymeric Wibo tb_config_adapter_read(struct router_softc *sc, u_int adap, u_int addr,
165*2ed98337SAymeric Wibo u_int dwlen, uint32_t *buf)
166*2ed98337SAymeric Wibo {
167*2ed98337SAymeric Wibo return (tb_config_read(sc, TB_CFG_CS_ADAPTER, adap, addr, dwlen, buf));
168*2ed98337SAymeric Wibo }
169*2ed98337SAymeric Wibo
170*2ed98337SAymeric Wibo /*
171*2ed98337SAymeric Wibo * Read the Adapter config space for the router referred to in the softc.
172*2ed98337SAymeric Wibo * adap - Adapter number
173*2ed98337SAymeric Wibo * addr - The dword offset in the config space
174*2ed98337SAymeric Wibo * dwlen - The number of dwords
175*2ed98337SAymeric Wibo * buf - must be large enough to hold the number of dwords requested.
176*2ed98337SAymeric Wibo */
177*2ed98337SAymeric Wibo static __inline int
tb_config_adapter_write(struct router_softc * sc,u_int adap,u_int addr,u_int dwlen,uint32_t * buf)178*2ed98337SAymeric Wibo tb_config_adapter_write(struct router_softc *sc, u_int adap, u_int addr,
179*2ed98337SAymeric Wibo u_int dwlen, uint32_t *buf)
180*2ed98337SAymeric Wibo {
181*2ed98337SAymeric Wibo return (tb_config_write(sc, TB_CFG_CS_ADAPTER, adap, addr, dwlen, buf));
182*2ed98337SAymeric Wibo }
183*2ed98337SAymeric Wibo
184*2ed98337SAymeric Wibo /*
185*2ed98337SAymeric Wibo * Read the Path config space for the router referred to in the softc.
186*2ed98337SAymeric Wibo * adap - Adapter number
187*2ed98337SAymeric Wibo * hopid - HopID of the path
188*2ed98337SAymeric Wibo * len - The number of adjacent paths
189*2ed98337SAymeric Wibo * buf - must be large enough to hold the number of dwords requested.
190*2ed98337SAymeric Wibo */
191*2ed98337SAymeric Wibo static __inline int
tb_config_path_read(struct router_softc * sc,u_int adap,u_int hopid,u_int num,uint32_t * buf)192*2ed98337SAymeric Wibo tb_config_path_read(struct router_softc *sc, u_int adap, u_int hopid,
193*2ed98337SAymeric Wibo u_int num, uint32_t *buf)
194*2ed98337SAymeric Wibo {
195*2ed98337SAymeric Wibo return (tb_config_read(sc, TB_CFG_CS_PATH, adap, hopid * 2,
196*2ed98337SAymeric Wibo num * 2, buf));
197*2ed98337SAymeric Wibo }
198*2ed98337SAymeric Wibo
199*2ed98337SAymeric Wibo /*
200*2ed98337SAymeric Wibo * Write the Path config space for the router referred to in the softc.
201*2ed98337SAymeric Wibo * adap - Adapter number
202*2ed98337SAymeric Wibo * hopid - HopID of the path
203*2ed98337SAymeric Wibo * len - The number of adjacent paths
204*2ed98337SAymeric Wibo * buf - must be large enough to hold the number of dwords requested.
205*2ed98337SAymeric Wibo */
206*2ed98337SAymeric Wibo static __inline int
tb_config_path_write(struct router_softc * sc,u_int adap,u_int hopid,u_int num,uint32_t * buf)207*2ed98337SAymeric Wibo tb_config_path_write(struct router_softc *sc, u_int adap, u_int hopid,
208*2ed98337SAymeric Wibo u_int num, uint32_t *buf)
209*2ed98337SAymeric Wibo {
210*2ed98337SAymeric Wibo return (tb_config_write(sc, TB_CFG_CS_PATH, adap, hopid * 2,
211*2ed98337SAymeric Wibo num * 2, buf));
212*2ed98337SAymeric Wibo }
213*2ed98337SAymeric Wibo
214*2ed98337SAymeric Wibo /*
215*2ed98337SAymeric Wibo * Read the Counters config space for the router referred to in the softc.
216*2ed98337SAymeric Wibo * Counters come in sets of 3 dwords.
217*2ed98337SAymeric Wibo * adap - Adapter number
218*2ed98337SAymeric Wibo * set - The counter set index
219*2ed98337SAymeric Wibo * num - The number of adjacent counter sets to read
220*2ed98337SAymeric Wibo * buf - must be large enough to hold the number of dwords requested.
221*2ed98337SAymeric Wibo */
222*2ed98337SAymeric Wibo static __inline int
tb_config_counters_read(struct router_softc * sc,u_int adap,u_int set,u_int num,uint32_t * buf)223*2ed98337SAymeric Wibo tb_config_counters_read(struct router_softc *sc, u_int adap, u_int set,
224*2ed98337SAymeric Wibo u_int num, uint32_t *buf)
225*2ed98337SAymeric Wibo {
226*2ed98337SAymeric Wibo return (tb_config_read(sc, TB_CFG_CS_COUNTERS, adap, set * 3,
227*2ed98337SAymeric Wibo num * 3, buf));
228*2ed98337SAymeric Wibo }
229*2ed98337SAymeric Wibo
230*2ed98337SAymeric Wibo static __inline void
tb_config_set_root(struct router_softc * sc)231*2ed98337SAymeric Wibo tb_config_set_root(struct router_softc *sc)
232*2ed98337SAymeric Wibo {
233*2ed98337SAymeric Wibo sc->nsc->root_rsc = sc;
234*2ed98337SAymeric Wibo }
235*2ed98337SAymeric Wibo
236*2ed98337SAymeric Wibo static __inline void *
tb_config_get_root(struct router_softc * sc)237*2ed98337SAymeric Wibo tb_config_get_root(struct router_softc *sc)
238*2ed98337SAymeric Wibo {
239*2ed98337SAymeric Wibo return (sc->nsc->root_rsc);
240*2ed98337SAymeric Wibo }
241*2ed98337SAymeric Wibo
242*2ed98337SAymeric Wibo #endif /* _ROUTER_VAR_H */
243