xref: /illumos-gate/usr/src/uts/common/sys/ib/clients/rdsv3/rdsv3_af_thr_impl.h (revision 5d5562f583b2b6affe19bdce0b3c8b1840d667a4)
1*5d5562f5SEiji Ota /*
2*5d5562f5SEiji Ota  * CDDL HEADER START
3*5d5562f5SEiji Ota  *
4*5d5562f5SEiji Ota  * The contents of this file are subject to the terms of the
5*5d5562f5SEiji Ota  * Common Development and Distribution License (the "License").
6*5d5562f5SEiji Ota  * You may not use this file except in compliance with the License.
7*5d5562f5SEiji Ota  *
8*5d5562f5SEiji Ota  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*5d5562f5SEiji Ota  * or http://www.opensolaris.org/os/licensing.
10*5d5562f5SEiji Ota  * See the License for the specific language governing permissions
11*5d5562f5SEiji Ota  * and limitations under the License.
12*5d5562f5SEiji Ota  *
13*5d5562f5SEiji Ota  * When distributing Covered Code, include this CDDL HEADER in each
14*5d5562f5SEiji Ota  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*5d5562f5SEiji Ota  * If applicable, add the following below this CDDL HEADER, with the
16*5d5562f5SEiji Ota  * fields enclosed by brackets "[]" replaced with your own identifying
17*5d5562f5SEiji Ota  * information: Portions Copyright [yyyy] [name of copyright owner]
18*5d5562f5SEiji Ota  *
19*5d5562f5SEiji Ota  * CDDL HEADER END
20*5d5562f5SEiji Ota  */
21*5d5562f5SEiji Ota /*
22*5d5562f5SEiji Ota  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
23*5d5562f5SEiji Ota  */
24*5d5562f5SEiji Ota 
25*5d5562f5SEiji Ota #ifndef _RDSV3_AF_THR_IMPL_H
26*5d5562f5SEiji Ota #define	_RDSV3_AF_THR_IMPL_H
27*5d5562f5SEiji Ota 
28*5d5562f5SEiji Ota /*
29*5d5562f5SEiji Ota  * This file is only present in Solaris
30*5d5562f5SEiji Ota  */
31*5d5562f5SEiji Ota 
32*5d5562f5SEiji Ota #ifdef __cplusplus
33*5d5562f5SEiji Ota extern "C" {
34*5d5562f5SEiji Ota #endif
35*5d5562f5SEiji Ota 
36*5d5562f5SEiji Ota #define	ddi_intr_set_affinity set_intr_affinity
37*5d5562f5SEiji Ota #include <sys/ib/clients/rdsv3/rdsv3_af_thr.h>
38*5d5562f5SEiji Ota #define	SCQ_BIND_CPU (SCQ_HCA_BIND_CPU | SCQ_WRK_BIND_CPU)
39*5d5562f5SEiji Ota 
40*5d5562f5SEiji Ota #define	RDSV3_AFT_MAX_CONN 4
41*5d5562f5SEiji Ota #define	RDSV3_AFT_PER_CONN_CPU 1
42*5d5562f5SEiji Ota #define	RDSV3_AFT_CONN_CPU_POOL (RDSV3_AFT_MAX_CONN * RDSV3_AFT_PER_CONN_CPU)
43*5d5562f5SEiji Ota 
44*5d5562f5SEiji Ota #define	RDSV3_CPUID_POOL_MAX 128
45*5d5562f5SEiji Ota static uint32_t rdsv3_cpuid_pool[RDSV3_CPUID_POOL_MAX];
46*5d5562f5SEiji Ota static int rdsv3_cpuid_pool_cnt;
47*5d5562f5SEiji Ota #define	RDSV3_MSIX_POOL_MAX 128
48*5d5562f5SEiji Ota static uint32_t rdsv3_msix_pool[RDSV3_MSIX_POOL_MAX];
49*5d5562f5SEiji Ota static int rdsv3_msix_pool_cnt;
50*5d5562f5SEiji Ota 
51*5d5562f5SEiji Ota #define	RDSV3_CPUFLAGS_ON 		0x0001
52*5d5562f5SEiji Ota #define	RDSV3_CPUFLAGS_OFF 		0x0002
53*5d5562f5SEiji Ota #define	RDSV3_CPUFLAGS_ASSIGNED		0x0004
54*5d5562f5SEiji Ota #define	RDSV3_CPUFLAGS_INTR		0x0008
55*5d5562f5SEiji Ota #define	RDSV3_CPUFLAGS_HCA		0x0010
56*5d5562f5SEiji Ota 
57*5d5562f5SEiji Ota #define	RDSV3_CPUFLAGS_UNAVAIL (RDSV3_CPUFLAGS_OFF | RDSV3_CPUFLAGS_INTR)
58*5d5562f5SEiji Ota 
59*5d5562f5SEiji Ota struct rdsv3_af_grp_s {
60*5d5562f5SEiji Ota 	ibt_hca_hdl_t		g_hca_hdl;
61*5d5562f5SEiji Ota 	ibt_sched_hdl_t		g_sched_hdl;
62*5d5562f5SEiji Ota 	processorid_t		g_hca_cpuid;
63*5d5562f5SEiji Ota 	processorid_t		g_conn_cpuid_pool[RDSV3_AFT_CONN_CPU_POOL];
64*5d5562f5SEiji Ota 	int			g_conn_cpuid_idx;
65*5d5562f5SEiji Ota };
66*5d5562f5SEiji Ota 
67*5d5562f5SEiji Ota struct rdsv3_af_thr_s {
68*5d5562f5SEiji Ota 	/* Keep the most used members 64bytes cache aligned */
69*5d5562f5SEiji Ota 	kmutex_t	aft_lock;	/* lock before using any member */
70*5d5562f5SEiji Ota 	kcondvar_t	aft_async;	/* async thread blocks on */
71*5d5562f5SEiji Ota 	kthread_t	*aft_worker;	/* kernel thread id */
72*5d5562f5SEiji Ota 	void		*aft_data;	/* argument of cq_drain_func */
73*5d5562f5SEiji Ota 	processorid_t	aft_cpuid;	/* processor to bind to */
74*5d5562f5SEiji Ota 	uint16_t	aft_state;	/* state flags */
75*5d5562f5SEiji Ota 	uint16_t	aft_cflag;	/* creation flags */
76*5d5562f5SEiji Ota 	rdsv3_af_thr_drain_func_t aft_drain_func;
77*5d5562f5SEiji Ota 	rdsv3_af_grp_t	*aft_grp;
78*5d5562f5SEiji Ota 	ddi_intr_handle_t aft_intr;	/* intr cookie */
79*5d5562f5SEiji Ota };
80*5d5562f5SEiji Ota 
81*5d5562f5SEiji Ota /*
82*5d5562f5SEiji Ota  * State flags.
83*5d5562f5SEiji Ota  */
84*5d5562f5SEiji Ota #define	AFT_PROC		0x0001	/* being processed */
85*5d5562f5SEiji Ota #define	AFT_BOUND		0x0002	/* Worker thread is bound to a cpu */
86*5d5562f5SEiji Ota #define	AFT_ARMED		0x0004	/* armed worker thread */
87*5d5562f5SEiji Ota #define	AFT_CONDEMNED		0x0100	/* Being torn down */
88*5d5562f5SEiji Ota 
89*5d5562f5SEiji Ota static void rdsv3_af_thr_worker(rdsv3_af_thr_t *ringp);
90*5d5562f5SEiji Ota static cpu_t *rdsv3_af_thr_bind(rdsv3_af_thr_t *ringp, processorid_t cpuid);
91*5d5562f5SEiji Ota static void rdsv3_af_thr_unbind(rdsv3_af_thr_t *ringp);
92*5d5562f5SEiji Ota 
93*5d5562f5SEiji Ota #ifdef	__cplusplus
94*5d5562f5SEiji Ota }
95*5d5562f5SEiji Ota #endif
96*5d5562f5SEiji Ota 
97*5d5562f5SEiji Ota #endif /* _RDSV3_AF_THR_IMPL_H */
98