xref: /openbmc/linux/drivers/infiniband/hw/hfi1/pio.h (revision f48ad614c100783be1e7e777dc36328001b83999)
1*f48ad614SDennis Dalessandro #ifndef _PIO_H
2*f48ad614SDennis Dalessandro #define _PIO_H
3*f48ad614SDennis Dalessandro /*
4*f48ad614SDennis Dalessandro  * Copyright(c) 2015, 2016 Intel Corporation.
5*f48ad614SDennis Dalessandro  *
6*f48ad614SDennis Dalessandro  * This file is provided under a dual BSD/GPLv2 license.  When using or
7*f48ad614SDennis Dalessandro  * redistributing this file, you may do so under either license.
8*f48ad614SDennis Dalessandro  *
9*f48ad614SDennis Dalessandro  * GPL LICENSE SUMMARY
10*f48ad614SDennis Dalessandro  *
11*f48ad614SDennis Dalessandro  * This program is free software; you can redistribute it and/or modify
12*f48ad614SDennis Dalessandro  * it under the terms of version 2 of the GNU General Public License as
13*f48ad614SDennis Dalessandro  * published by the Free Software Foundation.
14*f48ad614SDennis Dalessandro  *
15*f48ad614SDennis Dalessandro  * This program is distributed in the hope that it will be useful, but
16*f48ad614SDennis Dalessandro  * WITHOUT ANY WARRANTY; without even the implied warranty of
17*f48ad614SDennis Dalessandro  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18*f48ad614SDennis Dalessandro  * General Public License for more details.
19*f48ad614SDennis Dalessandro  *
20*f48ad614SDennis Dalessandro  * BSD LICENSE
21*f48ad614SDennis Dalessandro  *
22*f48ad614SDennis Dalessandro  * Redistribution and use in source and binary forms, with or without
23*f48ad614SDennis Dalessandro  * modification, are permitted provided that the following conditions
24*f48ad614SDennis Dalessandro  * are met:
25*f48ad614SDennis Dalessandro  *
26*f48ad614SDennis Dalessandro  *  - Redistributions of source code must retain the above copyright
27*f48ad614SDennis Dalessandro  *    notice, this list of conditions and the following disclaimer.
28*f48ad614SDennis Dalessandro  *  - Redistributions in binary form must reproduce the above copyright
29*f48ad614SDennis Dalessandro  *    notice, this list of conditions and the following disclaimer in
30*f48ad614SDennis Dalessandro  *    the documentation and/or other materials provided with the
31*f48ad614SDennis Dalessandro  *    distribution.
32*f48ad614SDennis Dalessandro  *  - Neither the name of Intel Corporation nor the names of its
33*f48ad614SDennis Dalessandro  *    contributors may be used to endorse or promote products derived
34*f48ad614SDennis Dalessandro  *    from this software without specific prior written permission.
35*f48ad614SDennis Dalessandro  *
36*f48ad614SDennis Dalessandro  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
37*f48ad614SDennis Dalessandro  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
38*f48ad614SDennis Dalessandro  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
39*f48ad614SDennis Dalessandro  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
40*f48ad614SDennis Dalessandro  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
41*f48ad614SDennis Dalessandro  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
42*f48ad614SDennis Dalessandro  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
43*f48ad614SDennis Dalessandro  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
44*f48ad614SDennis Dalessandro  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
45*f48ad614SDennis Dalessandro  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
46*f48ad614SDennis Dalessandro  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
47*f48ad614SDennis Dalessandro  *
48*f48ad614SDennis Dalessandro  */
49*f48ad614SDennis Dalessandro 
50*f48ad614SDennis Dalessandro /* send context types */
51*f48ad614SDennis Dalessandro #define SC_KERNEL 0
52*f48ad614SDennis Dalessandro #define SC_VL15   1
53*f48ad614SDennis Dalessandro #define SC_ACK    2
54*f48ad614SDennis Dalessandro #define SC_USER   3	/* must be the last one: it may take all left */
55*f48ad614SDennis Dalessandro #define SC_MAX    4	/* count of send context types */
56*f48ad614SDennis Dalessandro 
57*f48ad614SDennis Dalessandro /* invalid send context index */
58*f48ad614SDennis Dalessandro #define INVALID_SCI 0xff
59*f48ad614SDennis Dalessandro 
60*f48ad614SDennis Dalessandro /* PIO buffer release callback function */
61*f48ad614SDennis Dalessandro typedef void (*pio_release_cb)(void *arg, int code);
62*f48ad614SDennis Dalessandro 
63*f48ad614SDennis Dalessandro /* PIO release codes - in bits, as there could more than one that apply */
64*f48ad614SDennis Dalessandro #define PRC_OK		0	/* no known error */
65*f48ad614SDennis Dalessandro #define PRC_STATUS_ERR	0x01	/* credit return due to status error */
66*f48ad614SDennis Dalessandro #define PRC_PBC		0x02	/* credit return due to PBC */
67*f48ad614SDennis Dalessandro #define PRC_THRESHOLD	0x04	/* credit return due to threshold */
68*f48ad614SDennis Dalessandro #define PRC_FILL_ERR	0x08	/* credit return due fill error */
69*f48ad614SDennis Dalessandro #define PRC_FORCE	0x10	/* credit return due credit force */
70*f48ad614SDennis Dalessandro #define PRC_SC_DISABLE	0x20	/* clean-up after a context disable */
71*f48ad614SDennis Dalessandro 
72*f48ad614SDennis Dalessandro /* byte helper */
73*f48ad614SDennis Dalessandro union mix {
74*f48ad614SDennis Dalessandro 	u64 val64;
75*f48ad614SDennis Dalessandro 	u32 val32[2];
76*f48ad614SDennis Dalessandro 	u8  val8[8];
77*f48ad614SDennis Dalessandro };
78*f48ad614SDennis Dalessandro 
79*f48ad614SDennis Dalessandro /* an allocated PIO buffer */
80*f48ad614SDennis Dalessandro struct pio_buf {
81*f48ad614SDennis Dalessandro 	struct send_context *sc;/* back pointer to owning send context */
82*f48ad614SDennis Dalessandro 	pio_release_cb cb;	/* called when the buffer is released */
83*f48ad614SDennis Dalessandro 	void *arg;		/* argument for cb */
84*f48ad614SDennis Dalessandro 	void __iomem *start;	/* buffer start address */
85*f48ad614SDennis Dalessandro 	void __iomem *end;	/* context end address */
86*f48ad614SDennis Dalessandro 	unsigned long size;	/* context size, in bytes */
87*f48ad614SDennis Dalessandro 	unsigned long sent_at;	/* buffer is sent when <= free */
88*f48ad614SDennis Dalessandro 	u32 block_count;	/* size of buffer, in blocks */
89*f48ad614SDennis Dalessandro 	u32 qw_written;		/* QW written so far */
90*f48ad614SDennis Dalessandro 	u32 carry_bytes;	/* number of valid bytes in carry */
91*f48ad614SDennis Dalessandro 	union mix carry;	/* pending unwritten bytes */
92*f48ad614SDennis Dalessandro };
93*f48ad614SDennis Dalessandro 
94*f48ad614SDennis Dalessandro /* cache line aligned pio buffer array */
95*f48ad614SDennis Dalessandro union pio_shadow_ring {
96*f48ad614SDennis Dalessandro 	struct pio_buf pbuf;
97*f48ad614SDennis Dalessandro 	u64 unused[16];		/* cache line spacer */
98*f48ad614SDennis Dalessandro } ____cacheline_aligned;
99*f48ad614SDennis Dalessandro 
100*f48ad614SDennis Dalessandro /* per-NUMA send context */
101*f48ad614SDennis Dalessandro struct send_context {
102*f48ad614SDennis Dalessandro 	/* read-only after init */
103*f48ad614SDennis Dalessandro 	struct hfi1_devdata *dd;		/* device */
104*f48ad614SDennis Dalessandro 	void __iomem *base_addr;	/* start of PIO memory */
105*f48ad614SDennis Dalessandro 	union pio_shadow_ring *sr;	/* shadow ring */
106*f48ad614SDennis Dalessandro 
107*f48ad614SDennis Dalessandro 	volatile __le64 *hw_free;	/* HW free counter */
108*f48ad614SDennis Dalessandro 	struct work_struct halt_work;	/* halted context work queue entry */
109*f48ad614SDennis Dalessandro 	unsigned long flags;		/* flags */
110*f48ad614SDennis Dalessandro 	int node;			/* context home node */
111*f48ad614SDennis Dalessandro 	int type;			/* context type */
112*f48ad614SDennis Dalessandro 	u32 sw_index;			/* software index number */
113*f48ad614SDennis Dalessandro 	u32 hw_context;			/* hardware context number */
114*f48ad614SDennis Dalessandro 	u32 credits;			/* number of blocks in context */
115*f48ad614SDennis Dalessandro 	u32 sr_size;			/* size of the shadow ring */
116*f48ad614SDennis Dalessandro 	u32 group;			/* credit return group */
117*f48ad614SDennis Dalessandro 	/* allocator fields */
118*f48ad614SDennis Dalessandro 	spinlock_t alloc_lock ____cacheline_aligned_in_smp;
119*f48ad614SDennis Dalessandro 	unsigned long fill;		/* official alloc count */
120*f48ad614SDennis Dalessandro 	unsigned long alloc_free;	/* copy of free (less cache thrash) */
121*f48ad614SDennis Dalessandro 	u32 sr_head;			/* shadow ring head */
122*f48ad614SDennis Dalessandro 	/* releaser fields */
123*f48ad614SDennis Dalessandro 	spinlock_t release_lock ____cacheline_aligned_in_smp;
124*f48ad614SDennis Dalessandro 	unsigned long free;		/* official free count */
125*f48ad614SDennis Dalessandro 	u32 sr_tail;			/* shadow ring tail */
126*f48ad614SDennis Dalessandro 	/* list for PIO waiters */
127*f48ad614SDennis Dalessandro 	struct list_head piowait  ____cacheline_aligned_in_smp;
128*f48ad614SDennis Dalessandro 	spinlock_t credit_ctrl_lock ____cacheline_aligned_in_smp;
129*f48ad614SDennis Dalessandro 	u64 credit_ctrl;		/* cache for credit control */
130*f48ad614SDennis Dalessandro 	u32 credit_intr_count;		/* count of credit intr users */
131*f48ad614SDennis Dalessandro 	u32 __percpu *buffers_allocated;/* count of buffers allocated */
132*f48ad614SDennis Dalessandro 	wait_queue_head_t halt_wait;    /* wait until kernel sees interrupt */
133*f48ad614SDennis Dalessandro };
134*f48ad614SDennis Dalessandro 
135*f48ad614SDennis Dalessandro /* send context flags */
136*f48ad614SDennis Dalessandro #define SCF_ENABLED 0x01
137*f48ad614SDennis Dalessandro #define SCF_IN_FREE 0x02
138*f48ad614SDennis Dalessandro #define SCF_HALTED  0x04
139*f48ad614SDennis Dalessandro #define SCF_FROZEN  0x08
140*f48ad614SDennis Dalessandro 
141*f48ad614SDennis Dalessandro struct send_context_info {
142*f48ad614SDennis Dalessandro 	struct send_context *sc;	/* allocated working context */
143*f48ad614SDennis Dalessandro 	u16 allocated;			/* has this been allocated? */
144*f48ad614SDennis Dalessandro 	u16 type;			/* context type */
145*f48ad614SDennis Dalessandro 	u16 base;			/* base in PIO array */
146*f48ad614SDennis Dalessandro 	u16 credits;			/* size in PIO array */
147*f48ad614SDennis Dalessandro };
148*f48ad614SDennis Dalessandro 
149*f48ad614SDennis Dalessandro /* DMA credit return, index is always (context & 0x7) */
150*f48ad614SDennis Dalessandro struct credit_return {
151*f48ad614SDennis Dalessandro 	volatile __le64 cr[8];
152*f48ad614SDennis Dalessandro };
153*f48ad614SDennis Dalessandro 
154*f48ad614SDennis Dalessandro /* NUMA indexed credit return array */
155*f48ad614SDennis Dalessandro struct credit_return_base {
156*f48ad614SDennis Dalessandro 	struct credit_return *va;
157*f48ad614SDennis Dalessandro 	dma_addr_t pa;
158*f48ad614SDennis Dalessandro };
159*f48ad614SDennis Dalessandro 
160*f48ad614SDennis Dalessandro /* send context configuration sizes (one per type) */
161*f48ad614SDennis Dalessandro struct sc_config_sizes {
162*f48ad614SDennis Dalessandro 	short int size;
163*f48ad614SDennis Dalessandro 	short int count;
164*f48ad614SDennis Dalessandro };
165*f48ad614SDennis Dalessandro 
166*f48ad614SDennis Dalessandro /*
167*f48ad614SDennis Dalessandro  * The diagram below details the relationship of the mapping structures
168*f48ad614SDennis Dalessandro  *
169*f48ad614SDennis Dalessandro  * Since the mapping now allows for non-uniform send contexts per vl, the
170*f48ad614SDennis Dalessandro  * number of send contexts for a vl is either the vl_scontexts[vl] or
171*f48ad614SDennis Dalessandro  * a computation based on num_kernel_send_contexts/num_vls:
172*f48ad614SDennis Dalessandro  *
173*f48ad614SDennis Dalessandro  * For example:
174*f48ad614SDennis Dalessandro  * nactual = vl_scontexts ? vl_scontexts[vl] : num_kernel_send_contexts/num_vls
175*f48ad614SDennis Dalessandro  *
176*f48ad614SDennis Dalessandro  * n = roundup to next highest power of 2 using nactual
177*f48ad614SDennis Dalessandro  *
178*f48ad614SDennis Dalessandro  * In the case where there are num_kernel_send_contexts/num_vls doesn't divide
179*f48ad614SDennis Dalessandro  * evenly, the extras are added from the last vl downward.
180*f48ad614SDennis Dalessandro  *
181*f48ad614SDennis Dalessandro  * For the case where n > nactual, the send contexts are assigned
182*f48ad614SDennis Dalessandro  * in a round robin fashion wrapping back to the first send context
183*f48ad614SDennis Dalessandro  * for a particular vl.
184*f48ad614SDennis Dalessandro  *
185*f48ad614SDennis Dalessandro  *               dd->pio_map
186*f48ad614SDennis Dalessandro  *                    |                                   pio_map_elem[0]
187*f48ad614SDennis Dalessandro  *                    |                                +--------------------+
188*f48ad614SDennis Dalessandro  *                    v                                |       mask         |
189*f48ad614SDennis Dalessandro  *               pio_vl_map                            |--------------------|
190*f48ad614SDennis Dalessandro  *      +--------------------------+                   | ksc[0] -> sc 1     |
191*f48ad614SDennis Dalessandro  *      |    list (RCU)            |                   |--------------------|
192*f48ad614SDennis Dalessandro  *      |--------------------------|                 ->| ksc[1] -> sc 2     |
193*f48ad614SDennis Dalessandro  *      |    mask                  |              --/  |--------------------|
194*f48ad614SDennis Dalessandro  *      |--------------------------|            -/     |        *           |
195*f48ad614SDennis Dalessandro  *      |    actual_vls (max 8)    |          -/       |--------------------|
196*f48ad614SDennis Dalessandro  *      |--------------------------|       --/         | ksc[n] -> sc n     |
197*f48ad614SDennis Dalessandro  *      |    vls (max 8)           |     -/            +--------------------+
198*f48ad614SDennis Dalessandro  *      |--------------------------|  --/
199*f48ad614SDennis Dalessandro  *      |    map[0]                |-/
200*f48ad614SDennis Dalessandro  *      |--------------------------|                   +--------------------+
201*f48ad614SDennis Dalessandro  *      |    map[1]                |---                |       mask         |
202*f48ad614SDennis Dalessandro  *      |--------------------------|   \----           |--------------------|
203*f48ad614SDennis Dalessandro  *      |           *              |        \--        | ksc[0] -> sc 1+n   |
204*f48ad614SDennis Dalessandro  *      |           *              |           \----   |--------------------|
205*f48ad614SDennis Dalessandro  *      |           *              |                \->| ksc[1] -> sc 2+n   |
206*f48ad614SDennis Dalessandro  *      |--------------------------|                   |--------------------|
207*f48ad614SDennis Dalessandro  *      |   map[vls - 1]           |-                  |         *          |
208*f48ad614SDennis Dalessandro  *      +--------------------------+ \-                |--------------------|
209*f48ad614SDennis Dalessandro  *                                     \-              | ksc[m] -> sc m+n   |
210*f48ad614SDennis Dalessandro  *                                       \             +--------------------+
211*f48ad614SDennis Dalessandro  *                                        \-
212*f48ad614SDennis Dalessandro  *                                          \
213*f48ad614SDennis Dalessandro  *                                           \-        +--------------------+
214*f48ad614SDennis Dalessandro  *                                             \-      |       mask         |
215*f48ad614SDennis Dalessandro  *                                               \     |--------------------|
216*f48ad614SDennis Dalessandro  *                                                \-   | ksc[0] -> sc 1+m+n |
217*f48ad614SDennis Dalessandro  *                                                  \- |--------------------|
218*f48ad614SDennis Dalessandro  *                                                    >| ksc[1] -> sc 2+m+n |
219*f48ad614SDennis Dalessandro  *                                                     |--------------------|
220*f48ad614SDennis Dalessandro  *                                                     |         *          |
221*f48ad614SDennis Dalessandro  *                                                     |--------------------|
222*f48ad614SDennis Dalessandro  *                                                     | ksc[o] -> sc o+m+n |
223*f48ad614SDennis Dalessandro  *                                                     +--------------------+
224*f48ad614SDennis Dalessandro  *
225*f48ad614SDennis Dalessandro  */
226*f48ad614SDennis Dalessandro 
227*f48ad614SDennis Dalessandro /* Initial number of send contexts per VL */
228*f48ad614SDennis Dalessandro #define INIT_SC_PER_VL 2
229*f48ad614SDennis Dalessandro 
230*f48ad614SDennis Dalessandro /*
231*f48ad614SDennis Dalessandro  * struct pio_map_elem - mapping for a vl
232*f48ad614SDennis Dalessandro  * @mask - selector mask
233*f48ad614SDennis Dalessandro  * @ksc - array of kernel send contexts for this vl
234*f48ad614SDennis Dalessandro  *
235*f48ad614SDennis Dalessandro  * The mask is used to "mod" the selector to
236*f48ad614SDennis Dalessandro  * produce index into the trailing array of
237*f48ad614SDennis Dalessandro  * kscs
238*f48ad614SDennis Dalessandro  */
239*f48ad614SDennis Dalessandro struct pio_map_elem {
240*f48ad614SDennis Dalessandro 	u32 mask;
241*f48ad614SDennis Dalessandro 	struct send_context *ksc[0];
242*f48ad614SDennis Dalessandro };
243*f48ad614SDennis Dalessandro 
244*f48ad614SDennis Dalessandro /*
245*f48ad614SDennis Dalessandro  * struct pio_vl_map - mapping for a vl
246*f48ad614SDennis Dalessandro  * @list - rcu head for free callback
247*f48ad614SDennis Dalessandro  * @mask - vl mask to "mod" the vl to produce an index to map array
248*f48ad614SDennis Dalessandro  * @actual_vls - number of vls
249*f48ad614SDennis Dalessandro  * @vls - numbers of vls rounded to next power of 2
250*f48ad614SDennis Dalessandro  * @map - array of pio_map_elem entries
251*f48ad614SDennis Dalessandro  *
252*f48ad614SDennis Dalessandro  * This is the parent mapping structure. The trailing members of the
253*f48ad614SDennis Dalessandro  * struct point to pio_map_elem entries, which in turn point to an
254*f48ad614SDennis Dalessandro  * array of kscs for that vl.
255*f48ad614SDennis Dalessandro  */
256*f48ad614SDennis Dalessandro struct pio_vl_map {
257*f48ad614SDennis Dalessandro 	struct rcu_head list;
258*f48ad614SDennis Dalessandro 	u32 mask;
259*f48ad614SDennis Dalessandro 	u8 actual_vls;
260*f48ad614SDennis Dalessandro 	u8 vls;
261*f48ad614SDennis Dalessandro 	struct pio_map_elem *map[0];
262*f48ad614SDennis Dalessandro };
263*f48ad614SDennis Dalessandro 
264*f48ad614SDennis Dalessandro int pio_map_init(struct hfi1_devdata *dd, u8 port, u8 num_vls,
265*f48ad614SDennis Dalessandro 		 u8 *vl_scontexts);
266*f48ad614SDennis Dalessandro void free_pio_map(struct hfi1_devdata *dd);
267*f48ad614SDennis Dalessandro struct send_context *pio_select_send_context_vl(struct hfi1_devdata *dd,
268*f48ad614SDennis Dalessandro 						u32 selector, u8 vl);
269*f48ad614SDennis Dalessandro struct send_context *pio_select_send_context_sc(struct hfi1_devdata *dd,
270*f48ad614SDennis Dalessandro 						u32 selector, u8 sc5);
271*f48ad614SDennis Dalessandro 
272*f48ad614SDennis Dalessandro /* send context functions */
273*f48ad614SDennis Dalessandro int init_credit_return(struct hfi1_devdata *dd);
274*f48ad614SDennis Dalessandro void free_credit_return(struct hfi1_devdata *dd);
275*f48ad614SDennis Dalessandro int init_sc_pools_and_sizes(struct hfi1_devdata *dd);
276*f48ad614SDennis Dalessandro int init_send_contexts(struct hfi1_devdata *dd);
277*f48ad614SDennis Dalessandro int init_credit_return(struct hfi1_devdata *dd);
278*f48ad614SDennis Dalessandro int init_pervl_scs(struct hfi1_devdata *dd);
279*f48ad614SDennis Dalessandro struct send_context *sc_alloc(struct hfi1_devdata *dd, int type,
280*f48ad614SDennis Dalessandro 			      uint hdrqentsize, int numa);
281*f48ad614SDennis Dalessandro void sc_free(struct send_context *sc);
282*f48ad614SDennis Dalessandro int sc_enable(struct send_context *sc);
283*f48ad614SDennis Dalessandro void sc_disable(struct send_context *sc);
284*f48ad614SDennis Dalessandro int sc_restart(struct send_context *sc);
285*f48ad614SDennis Dalessandro void sc_return_credits(struct send_context *sc);
286*f48ad614SDennis Dalessandro void sc_flush(struct send_context *sc);
287*f48ad614SDennis Dalessandro void sc_drop(struct send_context *sc);
288*f48ad614SDennis Dalessandro void sc_stop(struct send_context *sc, int bit);
289*f48ad614SDennis Dalessandro struct pio_buf *sc_buffer_alloc(struct send_context *sc, u32 dw_len,
290*f48ad614SDennis Dalessandro 				pio_release_cb cb, void *arg);
291*f48ad614SDennis Dalessandro void sc_release_update(struct send_context *sc);
292*f48ad614SDennis Dalessandro void sc_return_credits(struct send_context *sc);
293*f48ad614SDennis Dalessandro void sc_group_release_update(struct hfi1_devdata *dd, u32 hw_context);
294*f48ad614SDennis Dalessandro void sc_add_credit_return_intr(struct send_context *sc);
295*f48ad614SDennis Dalessandro void sc_del_credit_return_intr(struct send_context *sc);
296*f48ad614SDennis Dalessandro void sc_set_cr_threshold(struct send_context *sc, u32 new_threshold);
297*f48ad614SDennis Dalessandro u32 sc_percent_to_threshold(struct send_context *sc, u32 percent);
298*f48ad614SDennis Dalessandro u32 sc_mtu_to_threshold(struct send_context *sc, u32 mtu, u32 hdrqentsize);
299*f48ad614SDennis Dalessandro void hfi1_sc_wantpiobuf_intr(struct send_context *sc, u32 needint);
300*f48ad614SDennis Dalessandro void sc_wait(struct hfi1_devdata *dd);
301*f48ad614SDennis Dalessandro void set_pio_integrity(struct send_context *sc);
302*f48ad614SDennis Dalessandro 
303*f48ad614SDennis Dalessandro /* support functions */
304*f48ad614SDennis Dalessandro void pio_reset_all(struct hfi1_devdata *dd);
305*f48ad614SDennis Dalessandro void pio_freeze(struct hfi1_devdata *dd);
306*f48ad614SDennis Dalessandro void pio_kernel_unfreeze(struct hfi1_devdata *dd);
307*f48ad614SDennis Dalessandro 
308*f48ad614SDennis Dalessandro /* global PIO send control operations */
309*f48ad614SDennis Dalessandro #define PSC_GLOBAL_ENABLE 0
310*f48ad614SDennis Dalessandro #define PSC_GLOBAL_DISABLE 1
311*f48ad614SDennis Dalessandro #define PSC_GLOBAL_VLARB_ENABLE 2
312*f48ad614SDennis Dalessandro #define PSC_GLOBAL_VLARB_DISABLE 3
313*f48ad614SDennis Dalessandro #define PSC_CM_RESET 4
314*f48ad614SDennis Dalessandro #define PSC_DATA_VL_ENABLE 5
315*f48ad614SDennis Dalessandro #define PSC_DATA_VL_DISABLE 6
316*f48ad614SDennis Dalessandro 
317*f48ad614SDennis Dalessandro void __cm_reset(struct hfi1_devdata *dd, u64 sendctrl);
318*f48ad614SDennis Dalessandro void pio_send_control(struct hfi1_devdata *dd, int op);
319*f48ad614SDennis Dalessandro 
320*f48ad614SDennis Dalessandro /* PIO copy routines */
321*f48ad614SDennis Dalessandro void pio_copy(struct hfi1_devdata *dd, struct pio_buf *pbuf, u64 pbc,
322*f48ad614SDennis Dalessandro 	      const void *from, size_t count);
323*f48ad614SDennis Dalessandro void seg_pio_copy_start(struct pio_buf *pbuf, u64 pbc,
324*f48ad614SDennis Dalessandro 			const void *from, size_t nbytes);
325*f48ad614SDennis Dalessandro void seg_pio_copy_mid(struct pio_buf *pbuf, const void *from, size_t nbytes);
326*f48ad614SDennis Dalessandro void seg_pio_copy_end(struct pio_buf *pbuf);
327*f48ad614SDennis Dalessandro 
328*f48ad614SDennis Dalessandro #endif /* _PIO_H */
329