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