1*12683SJimmy.Vetayases@oracle.com /*
2*12683SJimmy.Vetayases@oracle.com * CDDL HEADER START
3*12683SJimmy.Vetayases@oracle.com *
4*12683SJimmy.Vetayases@oracle.com * The contents of this file are subject to the terms of the
5*12683SJimmy.Vetayases@oracle.com * Common Development and Distribution License (the "License").
6*12683SJimmy.Vetayases@oracle.com * You may not use this file except in compliance with the License.
7*12683SJimmy.Vetayases@oracle.com *
8*12683SJimmy.Vetayases@oracle.com * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*12683SJimmy.Vetayases@oracle.com * or http://www.opensolaris.org/os/licensing.
10*12683SJimmy.Vetayases@oracle.com * See the License for the specific language governing permissions
11*12683SJimmy.Vetayases@oracle.com * and limitations under the License.
12*12683SJimmy.Vetayases@oracle.com *
13*12683SJimmy.Vetayases@oracle.com * When distributing Covered Code, include this CDDL HEADER in each
14*12683SJimmy.Vetayases@oracle.com * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*12683SJimmy.Vetayases@oracle.com * If applicable, add the following below this CDDL HEADER, with the
16*12683SJimmy.Vetayases@oracle.com * fields enclosed by brackets "[]" replaced with your own identifying
17*12683SJimmy.Vetayases@oracle.com * information: Portions Copyright [yyyy] [name of copyright owner]
18*12683SJimmy.Vetayases@oracle.com *
19*12683SJimmy.Vetayases@oracle.com * CDDL HEADER END
20*12683SJimmy.Vetayases@oracle.com */
21*12683SJimmy.Vetayases@oracle.com
22*12683SJimmy.Vetayases@oracle.com /*
23*12683SJimmy.Vetayases@oracle.com * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
24*12683SJimmy.Vetayases@oracle.com */
25*12683SJimmy.Vetayases@oracle.com
26*12683SJimmy.Vetayases@oracle.com #include <sys/types.h>
27*12683SJimmy.Vetayases@oracle.com #include <sys/sysmacros.h>
28*12683SJimmy.Vetayases@oracle.com #include <sys/ddi.h>
29*12683SJimmy.Vetayases@oracle.com #include <sys/sunndi.h>
30*12683SJimmy.Vetayases@oracle.com #include <sys/ddi_impldefs.h>
31*12683SJimmy.Vetayases@oracle.com #include <sys/psm_types.h>
32*12683SJimmy.Vetayases@oracle.com #include <sys/smp_impldefs.h>
33*12683SJimmy.Vetayases@oracle.com #include <sys/apic.h>
34*12683SJimmy.Vetayases@oracle.com #include <sys/processor.h>
35*12683SJimmy.Vetayases@oracle.com #include <sys/apix_irm_impl.h>
36*12683SJimmy.Vetayases@oracle.com
37*12683SJimmy.Vetayases@oracle.com /* global variable for static default limit for non-IRM drivers */
38*12683SJimmy.Vetayases@oracle.com extern int ddi_msix_alloc_limit;
39*12683SJimmy.Vetayases@oracle.com
40*12683SJimmy.Vetayases@oracle.com /* Extern declarations */
41*12683SJimmy.Vetayases@oracle.com extern int (*psm_intr_ops)(dev_info_t *, ddi_intr_handle_impl_t *,
42*12683SJimmy.Vetayases@oracle.com psm_intr_op_t, int *);
43*12683SJimmy.Vetayases@oracle.com
44*12683SJimmy.Vetayases@oracle.com /*
45*12683SJimmy.Vetayases@oracle.com * Global variables for IRM pool configuration:
46*12683SJimmy.Vetayases@oracle.com *
47*12683SJimmy.Vetayases@oracle.com * (1) apix_system_max_vectors -- this would limit the maximum
48*12683SJimmy.Vetayases@oracle.com * number of interrupt vectors that will be made avilable
49*12683SJimmy.Vetayases@oracle.com * to the device drivers. The default value (-1) indicates
50*12683SJimmy.Vetayases@oracle.com * that all the available vectors could be used.
51*12683SJimmy.Vetayases@oracle.com *
52*12683SJimmy.Vetayases@oracle.com * (2) apix_irm_cpu_factor -- This would specify the number of CPUs that
53*12683SJimmy.Vetayases@oracle.com * should be excluded from the global IRM pool of interrupt vectors.
54*12683SJimmy.Vetayases@oracle.com * By default this would be zero, so vectors from all the CPUs
55*12683SJimmy.Vetayases@oracle.com * present will be factored into the IRM pool.
56*12683SJimmy.Vetayases@oracle.com *
57*12683SJimmy.Vetayases@oracle.com * (3) apix_irm_reserve_fixed_vectors -- This would specify the number
58*12683SJimmy.Vetayases@oracle.com * of vectors that should be reserved for FIXED type interrupts and
59*12683SJimmy.Vetayases@oracle.com * exclude them from the IRM pool. The value can be one of the
60*12683SJimmy.Vetayases@oracle.com * following:
61*12683SJimmy.Vetayases@oracle.com * 0 - no reservation (default)
62*12683SJimmy.Vetayases@oracle.com * <n> - a positive number for the reserved cache
63*12683SJimmy.Vetayases@oracle.com * -1 - reserve the maximum needed
64*12683SJimmy.Vetayases@oracle.com *
65*12683SJimmy.Vetayases@oracle.com * (4) apix_irm_free_fixed_vectors -- This flag specifies if the
66*12683SJimmy.Vetayases@oracle.com * vectors for FIXED type should be freed and added back
67*12683SJimmy.Vetayases@oracle.com * to the IRM pool when ddi_intr_free() is called. The default
68*12683SJimmy.Vetayases@oracle.com * is to add it back to the pool.
69*12683SJimmy.Vetayases@oracle.com */
70*12683SJimmy.Vetayases@oracle.com int apix_system_max_vectors = -1;
71*12683SJimmy.Vetayases@oracle.com int apix_irm_cpu_factor = 0;
72*12683SJimmy.Vetayases@oracle.com int apix_irm_reserve_fixed_vectors = 0;
73*12683SJimmy.Vetayases@oracle.com int apix_irm_free_fixed_vector = 1;
74*12683SJimmy.Vetayases@oracle.com
75*12683SJimmy.Vetayases@oracle.com /* info from APIX module for IRM configuration */
76*12683SJimmy.Vetayases@oracle.com apix_irm_info_t apix_irminfo;
77*12683SJimmy.Vetayases@oracle.com
78*12683SJimmy.Vetayases@oracle.com kmutex_t apix_irm_lock; /* global mutex for apix_irm_* data */
79*12683SJimmy.Vetayases@oracle.com ddi_irm_params_t apix_irm_params; /* IRM pool info */
80*12683SJimmy.Vetayases@oracle.com int apix_irm_cache_size = 0; /* local cache for FIXED type requests */
81*12683SJimmy.Vetayases@oracle.com int apix_irm_cpu_factor_available = 0;
82*12683SJimmy.Vetayases@oracle.com int apix_irm_max_cpus = 0;
83*12683SJimmy.Vetayases@oracle.com int apix_irm_cpus_used = 0;
84*12683SJimmy.Vetayases@oracle.com int apix_irm_fixed_intr_vectors_used;
85*12683SJimmy.Vetayases@oracle.com
86*12683SJimmy.Vetayases@oracle.com extern int ncpus;
87*12683SJimmy.Vetayases@oracle.com
88*12683SJimmy.Vetayases@oracle.com /* local data/functions */
89*12683SJimmy.Vetayases@oracle.com static int apix_irm_chk_apix();
90*12683SJimmy.Vetayases@oracle.com int apix_irm_intr_ops(dev_info_t *dip, ddi_intr_handle_impl_t *handle,
91*12683SJimmy.Vetayases@oracle.com psm_intr_op_t op, int *result);
92*12683SJimmy.Vetayases@oracle.com int apix_irm_disable_intr(processorid_t);
93*12683SJimmy.Vetayases@oracle.com void apix_irm_enable_intr(processorid_t);
94*12683SJimmy.Vetayases@oracle.com int (*psm_intr_ops_saved)(dev_info_t *dip, ddi_intr_handle_impl_t *handle,
95*12683SJimmy.Vetayases@oracle.com psm_intr_op_t op, int *result) = NULL;
96*12683SJimmy.Vetayases@oracle.com int (*psm_disable_intr_saved)(processorid_t) = NULL;
97*12683SJimmy.Vetayases@oracle.com void (*psm_enable_intr_saved)(processorid_t) = NULL;
98*12683SJimmy.Vetayases@oracle.com int apix_irm_alloc_fixed(dev_info_t *, ddi_intr_handle_impl_t *, int *);
99*12683SJimmy.Vetayases@oracle.com int apix_irm_free_fixed(dev_info_t *, ddi_intr_handle_impl_t *, int *);
100*12683SJimmy.Vetayases@oracle.com
101*12683SJimmy.Vetayases@oracle.com /*
102*12683SJimmy.Vetayases@oracle.com * Initilaize IRM pool for APIC interrupts if the PSM module
103*12683SJimmy.Vetayases@oracle.com * is of APIX type. This should be called only after PSM module
104*12683SJimmy.Vetayases@oracle.com * is loaded and APIC interrupt system is initialized.
105*12683SJimmy.Vetayases@oracle.com */
106*12683SJimmy.Vetayases@oracle.com void
apix_irm_init(void)107*12683SJimmy.Vetayases@oracle.com apix_irm_init(void)
108*12683SJimmy.Vetayases@oracle.com {
109*12683SJimmy.Vetayases@oracle.com dev_info_t *dip;
110*12683SJimmy.Vetayases@oracle.com int total_avail_vectors;
111*12683SJimmy.Vetayases@oracle.com int cpus_used;
112*12683SJimmy.Vetayases@oracle.com int cache_size;
113*12683SJimmy.Vetayases@oracle.com
114*12683SJimmy.Vetayases@oracle.com /* nothing to do if IRM is disabled */
115*12683SJimmy.Vetayases@oracle.com if (!irm_enable)
116*12683SJimmy.Vetayases@oracle.com return;
117*12683SJimmy.Vetayases@oracle.com
118*12683SJimmy.Vetayases@oracle.com /*
119*12683SJimmy.Vetayases@oracle.com * Use root devinfo node to associate the IRM pool with it
120*12683SJimmy.Vetayases@oracle.com * as the pool is global to the system.
121*12683SJimmy.Vetayases@oracle.com */
122*12683SJimmy.Vetayases@oracle.com dip = ddi_root_node();
123*12683SJimmy.Vetayases@oracle.com
124*12683SJimmy.Vetayases@oracle.com /*
125*12683SJimmy.Vetayases@oracle.com * Check if PSM module is initialized and it is APIX
126*12683SJimmy.Vetayases@oracle.com * module (which supports IRM functionality).
127*12683SJimmy.Vetayases@oracle.com */
128*12683SJimmy.Vetayases@oracle.com if ((psm_intr_ops == NULL) || !apix_irm_chk_apix()) {
129*12683SJimmy.Vetayases@oracle.com /* not an APIX module */
130*12683SJimmy.Vetayases@oracle.com APIX_IRM_DEBUG((CE_CONT,
131*12683SJimmy.Vetayases@oracle.com "apix_irm_init: APIX module not present"));
132*12683SJimmy.Vetayases@oracle.com return;
133*12683SJimmy.Vetayases@oracle.com }
134*12683SJimmy.Vetayases@oracle.com
135*12683SJimmy.Vetayases@oracle.com /*
136*12683SJimmy.Vetayases@oracle.com * Now, determine the IRM pool parameters based on the
137*12683SJimmy.Vetayases@oracle.com * info from APIX module and global config variables.
138*12683SJimmy.Vetayases@oracle.com */
139*12683SJimmy.Vetayases@oracle.com
140*12683SJimmy.Vetayases@oracle.com /*
141*12683SJimmy.Vetayases@oracle.com * apix_ncpus shows all the CPUs present in the
142*12683SJimmy.Vetayases@oracle.com * system but not all of them may have been enabled
143*12683SJimmy.Vetayases@oracle.com * (i.e. mp_startup() may not have been called yet).
144*12683SJimmy.Vetayases@oracle.com * So, use ncpus for IRM pool creation.
145*12683SJimmy.Vetayases@oracle.com */
146*12683SJimmy.Vetayases@oracle.com if (apix_irminfo.apix_ncpus > ncpus)
147*12683SJimmy.Vetayases@oracle.com apix_irminfo.apix_ncpus = ncpus;
148*12683SJimmy.Vetayases@oracle.com
149*12683SJimmy.Vetayases@oracle.com /* apply the CPU factor if possible */
150*12683SJimmy.Vetayases@oracle.com if ((apix_irm_cpu_factor > 0) &&
151*12683SJimmy.Vetayases@oracle.com (apix_irminfo.apix_ncpus > apix_irm_cpu_factor)) {
152*12683SJimmy.Vetayases@oracle.com cpus_used = apix_irminfo.apix_ncpus - apix_irm_cpu_factor;
153*12683SJimmy.Vetayases@oracle.com apix_irm_cpu_factor_available = apix_irm_cpu_factor;
154*12683SJimmy.Vetayases@oracle.com } else {
155*12683SJimmy.Vetayases@oracle.com cpus_used = apix_irminfo.apix_ncpus;
156*12683SJimmy.Vetayases@oracle.com }
157*12683SJimmy.Vetayases@oracle.com apix_irm_cpus_used = apix_irm_max_cpus = cpus_used;
158*12683SJimmy.Vetayases@oracle.com
159*12683SJimmy.Vetayases@oracle.com APIX_IRM_DEBUG((CE_CONT,
160*12683SJimmy.Vetayases@oracle.com "apix_irm_init: %d CPUs used for IRM pool size", cpus_used));
161*12683SJimmy.Vetayases@oracle.com
162*12683SJimmy.Vetayases@oracle.com total_avail_vectors = cpus_used * apix_irminfo.apix_per_cpu_vectors -
163*12683SJimmy.Vetayases@oracle.com apix_irminfo.apix_vectors_allocated;
164*12683SJimmy.Vetayases@oracle.com
165*12683SJimmy.Vetayases@oracle.com apix_irm_fixed_intr_vectors_used = apix_irminfo.apix_vectors_allocated;
166*12683SJimmy.Vetayases@oracle.com
167*12683SJimmy.Vetayases@oracle.com if (total_avail_vectors <= 0) {
168*12683SJimmy.Vetayases@oracle.com /* can not determine pool size */
169*12683SJimmy.Vetayases@oracle.com APIX_IRM_DEBUG((CE_NOTE,
170*12683SJimmy.Vetayases@oracle.com "apix_irm_init: can not determine pool size"));
171*12683SJimmy.Vetayases@oracle.com return;
172*12683SJimmy.Vetayases@oracle.com }
173*12683SJimmy.Vetayases@oracle.com
174*12683SJimmy.Vetayases@oracle.com /* adjust the pool size as per the global config variable */
175*12683SJimmy.Vetayases@oracle.com if ((apix_system_max_vectors > 0) &&
176*12683SJimmy.Vetayases@oracle.com (apix_system_max_vectors < total_avail_vectors))
177*12683SJimmy.Vetayases@oracle.com total_avail_vectors = apix_system_max_vectors;
178*12683SJimmy.Vetayases@oracle.com
179*12683SJimmy.Vetayases@oracle.com /* pre-reserve vectors (i.e. local cache) for FIXED type if needed */
180*12683SJimmy.Vetayases@oracle.com if (apix_irm_reserve_fixed_vectors != 0) {
181*12683SJimmy.Vetayases@oracle.com cache_size = apix_irm_reserve_fixed_vectors;
182*12683SJimmy.Vetayases@oracle.com if ((cache_size == -1) ||
183*12683SJimmy.Vetayases@oracle.com (cache_size > apix_irminfo.apix_ioapic_max_vectors))
184*12683SJimmy.Vetayases@oracle.com cache_size = apix_irminfo.apix_ioapic_max_vectors;
185*12683SJimmy.Vetayases@oracle.com total_avail_vectors -= cache_size;
186*12683SJimmy.Vetayases@oracle.com apix_irm_cache_size = cache_size;
187*12683SJimmy.Vetayases@oracle.com }
188*12683SJimmy.Vetayases@oracle.com
189*12683SJimmy.Vetayases@oracle.com if (total_avail_vectors <= 0) {
190*12683SJimmy.Vetayases@oracle.com APIX_IRM_DEBUG((CE_NOTE,
191*12683SJimmy.Vetayases@oracle.com "apix_irm_init: invalid config parameters!"));
192*12683SJimmy.Vetayases@oracle.com return;
193*12683SJimmy.Vetayases@oracle.com }
194*12683SJimmy.Vetayases@oracle.com
195*12683SJimmy.Vetayases@oracle.com /* IRM pool is used only for MSI/X interrupts */
196*12683SJimmy.Vetayases@oracle.com apix_irm_params.iparams_types = DDI_INTR_TYPE_MSI | DDI_INTR_TYPE_MSIX;
197*12683SJimmy.Vetayases@oracle.com apix_irm_params.iparams_total = total_avail_vectors;
198*12683SJimmy.Vetayases@oracle.com
199*12683SJimmy.Vetayases@oracle.com if (ndi_irm_create(dip, &apix_irm_params,
200*12683SJimmy.Vetayases@oracle.com &apix_irm_pool_p) == NDI_SUCCESS) {
201*12683SJimmy.Vetayases@oracle.com /*
202*12683SJimmy.Vetayases@oracle.com * re-direct psm_intr_ops to intercept FIXED
203*12683SJimmy.Vetayases@oracle.com * interrupt allocation requests.
204*12683SJimmy.Vetayases@oracle.com */
205*12683SJimmy.Vetayases@oracle.com psm_intr_ops_saved = psm_intr_ops;
206*12683SJimmy.Vetayases@oracle.com psm_intr_ops = apix_irm_intr_ops;
207*12683SJimmy.Vetayases@oracle.com /*
208*12683SJimmy.Vetayases@oracle.com * re-direct psm_enable_intr()/psm_disable_intr() to
209*12683SJimmy.Vetayases@oracle.com * intercept CPU offline/online requests.
210*12683SJimmy.Vetayases@oracle.com */
211*12683SJimmy.Vetayases@oracle.com psm_disable_intr_saved = psm_disable_intr;
212*12683SJimmy.Vetayases@oracle.com psm_enable_intr_saved = psm_enable_intr;
213*12683SJimmy.Vetayases@oracle.com psm_enable_intr = apix_irm_enable_intr;
214*12683SJimmy.Vetayases@oracle.com psm_disable_intr = apix_irm_disable_intr;
215*12683SJimmy.Vetayases@oracle.com
216*12683SJimmy.Vetayases@oracle.com mutex_init(&apix_irm_lock, NULL, MUTEX_DRIVER, NULL);
217*12683SJimmy.Vetayases@oracle.com
218*12683SJimmy.Vetayases@oracle.com /*
219*12683SJimmy.Vetayases@oracle.com * Set default alloc limit for non-IRM drivers
220*12683SJimmy.Vetayases@oracle.com * to DDI_MIN_MSIX_ALLOC (currently defined as 8).
221*12683SJimmy.Vetayases@oracle.com *
222*12683SJimmy.Vetayases@oracle.com * NOTE: This is done here so that the limit of 8 vectors
223*12683SJimmy.Vetayases@oracle.com * is applicable only with APIX module. For the old pcplusmp
224*12683SJimmy.Vetayases@oracle.com * implementation, the current default of 2 (i.e
225*12683SJimmy.Vetayases@oracle.com * DDI_DEFAULT_MSIX_ALLOC) is retained.
226*12683SJimmy.Vetayases@oracle.com */
227*12683SJimmy.Vetayases@oracle.com if (ddi_msix_alloc_limit < DDI_MIN_MSIX_ALLOC)
228*12683SJimmy.Vetayases@oracle.com ddi_msix_alloc_limit = DDI_MIN_MSIX_ALLOC;
229*12683SJimmy.Vetayases@oracle.com } else {
230*12683SJimmy.Vetayases@oracle.com APIX_IRM_DEBUG((CE_NOTE,
231*12683SJimmy.Vetayases@oracle.com "apix_irm_init: ndi_irm_create() failed"));
232*12683SJimmy.Vetayases@oracle.com apix_irm_pool_p = NULL;
233*12683SJimmy.Vetayases@oracle.com }
234*12683SJimmy.Vetayases@oracle.com }
235*12683SJimmy.Vetayases@oracle.com
236*12683SJimmy.Vetayases@oracle.com /*
237*12683SJimmy.Vetayases@oracle.com * Check if the PSM module is "APIX" type which supports IRM feature.
238*12683SJimmy.Vetayases@oracle.com * Returns 0 if it is not an APIX module.
239*12683SJimmy.Vetayases@oracle.com */
240*12683SJimmy.Vetayases@oracle.com static int
apix_irm_chk_apix(void)241*12683SJimmy.Vetayases@oracle.com apix_irm_chk_apix(void)
242*12683SJimmy.Vetayases@oracle.com {
243*12683SJimmy.Vetayases@oracle.com ddi_intr_handle_impl_t info_hdl;
244*12683SJimmy.Vetayases@oracle.com apic_get_type_t type_info;
245*12683SJimmy.Vetayases@oracle.com
246*12683SJimmy.Vetayases@oracle.com if (!psm_intr_ops)
247*12683SJimmy.Vetayases@oracle.com return (0);
248*12683SJimmy.Vetayases@oracle.com
249*12683SJimmy.Vetayases@oracle.com bzero(&info_hdl, sizeof (ddi_intr_handle_impl_t));
250*12683SJimmy.Vetayases@oracle.com info_hdl.ih_private = &type_info;
251*12683SJimmy.Vetayases@oracle.com if (((*psm_intr_ops)(NULL, &info_hdl, PSM_INTR_OP_APIC_TYPE,
252*12683SJimmy.Vetayases@oracle.com NULL)) != PSM_SUCCESS) {
253*12683SJimmy.Vetayases@oracle.com /* unknown type; assume not an APIX module */
254*12683SJimmy.Vetayases@oracle.com return (0);
255*12683SJimmy.Vetayases@oracle.com }
256*12683SJimmy.Vetayases@oracle.com if (strcmp(type_info.avgi_type, APIC_APIX_NAME) == 0)
257*12683SJimmy.Vetayases@oracle.com return (1);
258*12683SJimmy.Vetayases@oracle.com else
259*12683SJimmy.Vetayases@oracle.com return (0);
260*12683SJimmy.Vetayases@oracle.com }
261*12683SJimmy.Vetayases@oracle.com
262*12683SJimmy.Vetayases@oracle.com /*
263*12683SJimmy.Vetayases@oracle.com * This function intercepts PSM_INTR_OP_* requests to deal with
264*12683SJimmy.Vetayases@oracle.com * IRM pool maintainance for FIXED type interrupts. The following
265*12683SJimmy.Vetayases@oracle.com * commands are intercepted and the rest are simply passed back to
266*12683SJimmy.Vetayases@oracle.com * the original psm_intr_ops function:
267*12683SJimmy.Vetayases@oracle.com * PSM_INTR_OP_ALLOC_VECTORS
268*12683SJimmy.Vetayases@oracle.com * PSM_INTR_OP_FREE_VECTORS
269*12683SJimmy.Vetayases@oracle.com * Return value is either PSM_SUCCESS or PSM_FAILURE.
270*12683SJimmy.Vetayases@oracle.com */
271*12683SJimmy.Vetayases@oracle.com int
apix_irm_intr_ops(dev_info_t * dip,ddi_intr_handle_impl_t * handle,psm_intr_op_t op,int * result)272*12683SJimmy.Vetayases@oracle.com apix_irm_intr_ops(dev_info_t *dip, ddi_intr_handle_impl_t *handle,
273*12683SJimmy.Vetayases@oracle.com psm_intr_op_t op, int *result)
274*12683SJimmy.Vetayases@oracle.com {
275*12683SJimmy.Vetayases@oracle.com switch (op) {
276*12683SJimmy.Vetayases@oracle.com case PSM_INTR_OP_ALLOC_VECTORS:
277*12683SJimmy.Vetayases@oracle.com if (handle->ih_type == DDI_INTR_TYPE_FIXED)
278*12683SJimmy.Vetayases@oracle.com return (apix_irm_alloc_fixed(dip, handle, result));
279*12683SJimmy.Vetayases@oracle.com else
280*12683SJimmy.Vetayases@oracle.com break;
281*12683SJimmy.Vetayases@oracle.com case PSM_INTR_OP_FREE_VECTORS:
282*12683SJimmy.Vetayases@oracle.com if (handle->ih_type == DDI_INTR_TYPE_FIXED)
283*12683SJimmy.Vetayases@oracle.com return (apix_irm_free_fixed(dip, handle, result));
284*12683SJimmy.Vetayases@oracle.com else
285*12683SJimmy.Vetayases@oracle.com break;
286*12683SJimmy.Vetayases@oracle.com default:
287*12683SJimmy.Vetayases@oracle.com break;
288*12683SJimmy.Vetayases@oracle.com }
289*12683SJimmy.Vetayases@oracle.com
290*12683SJimmy.Vetayases@oracle.com /* pass the request to APIX */
291*12683SJimmy.Vetayases@oracle.com return ((*psm_intr_ops_saved)(dip, handle, op, result));
292*12683SJimmy.Vetayases@oracle.com }
293*12683SJimmy.Vetayases@oracle.com
294*12683SJimmy.Vetayases@oracle.com /*
295*12683SJimmy.Vetayases@oracle.com * Allocate a FIXED type interrupt. The procedure for this
296*12683SJimmy.Vetayases@oracle.com * operation is as follows:
297*12683SJimmy.Vetayases@oracle.com *
298*12683SJimmy.Vetayases@oracle.com * 1) Check if this IRQ is shared (i.e. IRQ is already mapped
299*12683SJimmy.Vetayases@oracle.com * and a vector has been already allocated). If so, then no
300*12683SJimmy.Vetayases@oracle.com * new vector is needed and simply pass the request to APIX
301*12683SJimmy.Vetayases@oracle.com * and return.
302*12683SJimmy.Vetayases@oracle.com * 2) Check the local cache pool for an available vector. If
303*12683SJimmy.Vetayases@oracle.com * the cache is not empty then take it from there and simply
304*12683SJimmy.Vetayases@oracle.com * pass the request to APIX and return.
305*12683SJimmy.Vetayases@oracle.com * 3) Otherwise, get a vector from the IRM pool by reducing the
306*12683SJimmy.Vetayases@oracle.com * pool size by 1. If it is successful then pass the
307*12683SJimmy.Vetayases@oracle.com * request to APIX module. Otherwise return PSM_FAILURE.
308*12683SJimmy.Vetayases@oracle.com */
309*12683SJimmy.Vetayases@oracle.com int
apix_irm_alloc_fixed(dev_info_t * dip,ddi_intr_handle_impl_t * handle,int * result)310*12683SJimmy.Vetayases@oracle.com apix_irm_alloc_fixed(dev_info_t *dip, ddi_intr_handle_impl_t *handle,
311*12683SJimmy.Vetayases@oracle.com int *result)
312*12683SJimmy.Vetayases@oracle.com {
313*12683SJimmy.Vetayases@oracle.com int vector;
314*12683SJimmy.Vetayases@oracle.com uint_t new_pool_size;
315*12683SJimmy.Vetayases@oracle.com int ret;
316*12683SJimmy.Vetayases@oracle.com
317*12683SJimmy.Vetayases@oracle.com /*
318*12683SJimmy.Vetayases@oracle.com * Check if this IRQ has been mapped (i.e. shared IRQ case)
319*12683SJimmy.Vetayases@oracle.com * by doing PSM_INTR_OP_XLATE_VECTOR.
320*12683SJimmy.Vetayases@oracle.com */
321*12683SJimmy.Vetayases@oracle.com ret = (*psm_intr_ops_saved)(dip, handle, PSM_INTR_OP_XLATE_VECTOR,
322*12683SJimmy.Vetayases@oracle.com &vector);
323*12683SJimmy.Vetayases@oracle.com if (ret == PSM_SUCCESS) {
324*12683SJimmy.Vetayases@oracle.com APIX_IRM_DEBUG((CE_CONT,
325*12683SJimmy.Vetayases@oracle.com "apix_irm_alloc_fixed: dip %p (%s) xlated vector 0x%x",
326*12683SJimmy.Vetayases@oracle.com (void *)dip, ddi_driver_name(dip), vector));
327*12683SJimmy.Vetayases@oracle.com /* (1) mapping already exists; pass the request to PSM */
328*12683SJimmy.Vetayases@oracle.com return ((*psm_intr_ops_saved)(dip, handle,
329*12683SJimmy.Vetayases@oracle.com PSM_INTR_OP_ALLOC_VECTORS, result));
330*12683SJimmy.Vetayases@oracle.com }
331*12683SJimmy.Vetayases@oracle.com
332*12683SJimmy.Vetayases@oracle.com /* check the local cache for an available vector */
333*12683SJimmy.Vetayases@oracle.com mutex_enter(&apix_irm_lock);
334*12683SJimmy.Vetayases@oracle.com if (apix_irm_cache_size) { /* cache is not empty */
335*12683SJimmy.Vetayases@oracle.com --apix_irm_cache_size;
336*12683SJimmy.Vetayases@oracle.com apix_irm_fixed_intr_vectors_used++;
337*12683SJimmy.Vetayases@oracle.com mutex_exit(&apix_irm_lock);
338*12683SJimmy.Vetayases@oracle.com /* (2) use the vector from the local cache */
339*12683SJimmy.Vetayases@oracle.com return ((*psm_intr_ops_saved)(dip, handle,
340*12683SJimmy.Vetayases@oracle.com PSM_INTR_OP_ALLOC_VECTORS, result));
341*12683SJimmy.Vetayases@oracle.com }
342*12683SJimmy.Vetayases@oracle.com
343*12683SJimmy.Vetayases@oracle.com /* (3) get a vector from the IRM pool */
344*12683SJimmy.Vetayases@oracle.com
345*12683SJimmy.Vetayases@oracle.com new_pool_size = apix_irm_params.iparams_total - 1;
346*12683SJimmy.Vetayases@oracle.com
347*12683SJimmy.Vetayases@oracle.com APIX_IRM_DEBUG((CE_CONT, "apix_irm_alloc_fixed: dip %p (%s) resize pool"
348*12683SJimmy.Vetayases@oracle.com " from %x to %x\n", (void *)dip, ddi_driver_name(dip),
349*12683SJimmy.Vetayases@oracle.com apix_irm_pool_p->ipool_totsz, new_pool_size));
350*12683SJimmy.Vetayases@oracle.com
351*12683SJimmy.Vetayases@oracle.com if (ndi_irm_resize_pool(apix_irm_pool_p, new_pool_size) ==
352*12683SJimmy.Vetayases@oracle.com NDI_SUCCESS) {
353*12683SJimmy.Vetayases@oracle.com /* update the pool size info */
354*12683SJimmy.Vetayases@oracle.com apix_irm_params.iparams_total = new_pool_size;
355*12683SJimmy.Vetayases@oracle.com apix_irm_fixed_intr_vectors_used++;
356*12683SJimmy.Vetayases@oracle.com mutex_exit(&apix_irm_lock);
357*12683SJimmy.Vetayases@oracle.com return ((*psm_intr_ops_saved)(dip, handle,
358*12683SJimmy.Vetayases@oracle.com PSM_INTR_OP_ALLOC_VECTORS, result));
359*12683SJimmy.Vetayases@oracle.com }
360*12683SJimmy.Vetayases@oracle.com
361*12683SJimmy.Vetayases@oracle.com mutex_exit(&apix_irm_lock);
362*12683SJimmy.Vetayases@oracle.com
363*12683SJimmy.Vetayases@oracle.com return (PSM_FAILURE);
364*12683SJimmy.Vetayases@oracle.com }
365*12683SJimmy.Vetayases@oracle.com
366*12683SJimmy.Vetayases@oracle.com /*
367*12683SJimmy.Vetayases@oracle.com * Free up the FIXED type interrupt.
368*12683SJimmy.Vetayases@oracle.com *
369*12683SJimmy.Vetayases@oracle.com * 1) If it is a shared vector then simply pass the request to
370*12683SJimmy.Vetayases@oracle.com * APIX and return.
371*12683SJimmy.Vetayases@oracle.com * 2) Otherwise, if apix_irm_free_fixed_vector is not set then add the
372*12683SJimmy.Vetayases@oracle.com * vector back to the IRM pool. Otherwise, keep it in the local cache.
373*12683SJimmy.Vetayases@oracle.com */
374*12683SJimmy.Vetayases@oracle.com int
apix_irm_free_fixed(dev_info_t * dip,ddi_intr_handle_impl_t * handle,int * result)375*12683SJimmy.Vetayases@oracle.com apix_irm_free_fixed(dev_info_t *dip, ddi_intr_handle_impl_t *handle,
376*12683SJimmy.Vetayases@oracle.com int *result)
377*12683SJimmy.Vetayases@oracle.com {
378*12683SJimmy.Vetayases@oracle.com int shared;
379*12683SJimmy.Vetayases@oracle.com int ret;
380*12683SJimmy.Vetayases@oracle.com uint_t new_pool_size;
381*12683SJimmy.Vetayases@oracle.com
382*12683SJimmy.Vetayases@oracle.com /* check if it is a shared vector */
383*12683SJimmy.Vetayases@oracle.com ret = (*psm_intr_ops_saved)(dip, handle,
384*12683SJimmy.Vetayases@oracle.com PSM_INTR_OP_GET_SHARED, &shared);
385*12683SJimmy.Vetayases@oracle.com
386*12683SJimmy.Vetayases@oracle.com if ((ret == PSM_SUCCESS) && (shared > 0)) {
387*12683SJimmy.Vetayases@oracle.com /* (1) it is a shared vector; simply pass the request */
388*12683SJimmy.Vetayases@oracle.com APIX_IRM_DEBUG((CE_CONT, "apix_irm_free_fixed: dip %p (%s) "
389*12683SJimmy.Vetayases@oracle.com "shared %d\n", (void *)dip, ddi_driver_name(dip), shared));
390*12683SJimmy.Vetayases@oracle.com return ((*psm_intr_ops_saved)(dip, handle,
391*12683SJimmy.Vetayases@oracle.com PSM_INTR_OP_FREE_VECTORS, result));
392*12683SJimmy.Vetayases@oracle.com }
393*12683SJimmy.Vetayases@oracle.com
394*12683SJimmy.Vetayases@oracle.com ret = (*psm_intr_ops_saved)(dip, handle,
395*12683SJimmy.Vetayases@oracle.com PSM_INTR_OP_FREE_VECTORS, result);
396*12683SJimmy.Vetayases@oracle.com
397*12683SJimmy.Vetayases@oracle.com if (ret == PSM_SUCCESS) {
398*12683SJimmy.Vetayases@oracle.com mutex_enter(&apix_irm_lock);
399*12683SJimmy.Vetayases@oracle.com if (apix_irm_free_fixed_vector) {
400*12683SJimmy.Vetayases@oracle.com /* (2) add the vector back to IRM pool */
401*12683SJimmy.Vetayases@oracle.com new_pool_size = apix_irm_params.iparams_total + 1;
402*12683SJimmy.Vetayases@oracle.com APIX_IRM_DEBUG((CE_CONT, "apix_irm_free_fixed: "
403*12683SJimmy.Vetayases@oracle.com "dip %p (%s) resize pool from %x to %x\n",
404*12683SJimmy.Vetayases@oracle.com (void *)dip, ddi_driver_name(dip),
405*12683SJimmy.Vetayases@oracle.com apix_irm_pool_p->ipool_totsz, new_pool_size));
406*12683SJimmy.Vetayases@oracle.com if (ndi_irm_resize_pool(apix_irm_pool_p,
407*12683SJimmy.Vetayases@oracle.com new_pool_size) == NDI_SUCCESS) {
408*12683SJimmy.Vetayases@oracle.com /* update the pool size info */
409*12683SJimmy.Vetayases@oracle.com apix_irm_params.iparams_total = new_pool_size;
410*12683SJimmy.Vetayases@oracle.com } else {
411*12683SJimmy.Vetayases@oracle.com cmn_err(CE_NOTE,
412*12683SJimmy.Vetayases@oracle.com "apix_irm_free_fixed: failed to add"
413*12683SJimmy.Vetayases@oracle.com " a vector to IRM pool");
414*12683SJimmy.Vetayases@oracle.com }
415*12683SJimmy.Vetayases@oracle.com } else {
416*12683SJimmy.Vetayases@oracle.com /* keep the vector in the local cache */
417*12683SJimmy.Vetayases@oracle.com apix_irm_cache_size += 1;
418*12683SJimmy.Vetayases@oracle.com }
419*12683SJimmy.Vetayases@oracle.com apix_irm_fixed_intr_vectors_used--;
420*12683SJimmy.Vetayases@oracle.com mutex_exit(&apix_irm_lock);
421*12683SJimmy.Vetayases@oracle.com }
422*12683SJimmy.Vetayases@oracle.com
423*12683SJimmy.Vetayases@oracle.com return (ret);
424*12683SJimmy.Vetayases@oracle.com }
425*12683SJimmy.Vetayases@oracle.com
426*12683SJimmy.Vetayases@oracle.com /*
427*12683SJimmy.Vetayases@oracle.com * Disable the CPU for interrupts. It is assumed that this is called to
428*12683SJimmy.Vetayases@oracle.com * offline/disable the CPU so that no interrupts are allocated on
429*12683SJimmy.Vetayases@oracle.com * that CPU. For IRM perspective, the interrupt vectors on this
430*12683SJimmy.Vetayases@oracle.com * CPU are to be excluded for any allocations.
431*12683SJimmy.Vetayases@oracle.com *
432*12683SJimmy.Vetayases@oracle.com * If APIX module is successful in migrating all the vectors
433*12683SJimmy.Vetayases@oracle.com * from this CPU then reduce the IRM pool size to exclude the
434*12683SJimmy.Vetayases@oracle.com * interrupt vectors for that CPU.
435*12683SJimmy.Vetayases@oracle.com */
436*12683SJimmy.Vetayases@oracle.com int
apix_irm_disable_intr(processorid_t id)437*12683SJimmy.Vetayases@oracle.com apix_irm_disable_intr(processorid_t id)
438*12683SJimmy.Vetayases@oracle.com {
439*12683SJimmy.Vetayases@oracle.com uint_t new_pool_size;
440*12683SJimmy.Vetayases@oracle.com
441*12683SJimmy.Vetayases@oracle.com /* Interrupt disabling for Suspend/Resume */
442*12683SJimmy.Vetayases@oracle.com if (apic_cpus[id].aci_status & APIC_CPU_SUSPEND)
443*12683SJimmy.Vetayases@oracle.com return ((*psm_disable_intr_saved)(id));
444*12683SJimmy.Vetayases@oracle.com
445*12683SJimmy.Vetayases@oracle.com mutex_enter(&apix_irm_lock);
446*12683SJimmy.Vetayases@oracle.com /*
447*12683SJimmy.Vetayases@oracle.com * Don't remove the CPU from the IRM pool if we have CPU factor
448*12683SJimmy.Vetayases@oracle.com * available.
449*12683SJimmy.Vetayases@oracle.com */
450*12683SJimmy.Vetayases@oracle.com if ((apix_irm_cpu_factor > 0) && (apix_irm_cpu_factor_available > 0)) {
451*12683SJimmy.Vetayases@oracle.com apix_irm_cpu_factor_available--;
452*12683SJimmy.Vetayases@oracle.com } else {
453*12683SJimmy.Vetayases@oracle.com /* can't disable if there is only one CPU used */
454*12683SJimmy.Vetayases@oracle.com if (apix_irm_cpus_used == 1) {
455*12683SJimmy.Vetayases@oracle.com mutex_exit(&apix_irm_lock);
456*12683SJimmy.Vetayases@oracle.com return (PSM_FAILURE);
457*12683SJimmy.Vetayases@oracle.com }
458*12683SJimmy.Vetayases@oracle.com /* Calculate the new size for the IRM pool */
459*12683SJimmy.Vetayases@oracle.com new_pool_size = apix_irm_params.iparams_total -
460*12683SJimmy.Vetayases@oracle.com apix_irminfo.apix_per_cpu_vectors;
461*12683SJimmy.Vetayases@oracle.com
462*12683SJimmy.Vetayases@oracle.com /* Apply the max. limit */
463*12683SJimmy.Vetayases@oracle.com if (apix_system_max_vectors > 0) {
464*12683SJimmy.Vetayases@oracle.com uint_t max;
465*12683SJimmy.Vetayases@oracle.com
466*12683SJimmy.Vetayases@oracle.com max = apix_system_max_vectors -
467*12683SJimmy.Vetayases@oracle.com apix_irm_fixed_intr_vectors_used -
468*12683SJimmy.Vetayases@oracle.com apix_irm_cache_size;
469*12683SJimmy.Vetayases@oracle.com
470*12683SJimmy.Vetayases@oracle.com new_pool_size = MIN(new_pool_size, max);
471*12683SJimmy.Vetayases@oracle.com }
472*12683SJimmy.Vetayases@oracle.com
473*12683SJimmy.Vetayases@oracle.com if (new_pool_size == 0) {
474*12683SJimmy.Vetayases@oracle.com cmn_err(CE_WARN, "Invalid pool size 0 with "
475*12683SJimmy.Vetayases@oracle.com "apix_system_max_vectors = %d",
476*12683SJimmy.Vetayases@oracle.com apix_system_max_vectors);
477*12683SJimmy.Vetayases@oracle.com mutex_exit(&apix_irm_lock);
478*12683SJimmy.Vetayases@oracle.com return (PSM_FAILURE);
479*12683SJimmy.Vetayases@oracle.com }
480*12683SJimmy.Vetayases@oracle.com
481*12683SJimmy.Vetayases@oracle.com if (new_pool_size != apix_irm_params.iparams_total) {
482*12683SJimmy.Vetayases@oracle.com /* remove the CPU from the IRM pool */
483*12683SJimmy.Vetayases@oracle.com if (ndi_irm_resize_pool(apix_irm_pool_p,
484*12683SJimmy.Vetayases@oracle.com new_pool_size) != NDI_SUCCESS) {
485*12683SJimmy.Vetayases@oracle.com mutex_exit(&apix_irm_lock);
486*12683SJimmy.Vetayases@oracle.com APIX_IRM_DEBUG((CE_NOTE,
487*12683SJimmy.Vetayases@oracle.com "apix_irm_disable_intr: failed to resize"
488*12683SJimmy.Vetayases@oracle.com " the IRM pool"));
489*12683SJimmy.Vetayases@oracle.com return (PSM_FAILURE);
490*12683SJimmy.Vetayases@oracle.com }
491*12683SJimmy.Vetayases@oracle.com /* update the pool size info */
492*12683SJimmy.Vetayases@oracle.com apix_irm_params.iparams_total = new_pool_size;
493*12683SJimmy.Vetayases@oracle.com }
494*12683SJimmy.Vetayases@oracle.com
495*12683SJimmy.Vetayases@oracle.com /* decrement the CPU count used by IRM pool */
496*12683SJimmy.Vetayases@oracle.com apix_irm_cpus_used--;
497*12683SJimmy.Vetayases@oracle.com }
498*12683SJimmy.Vetayases@oracle.com
499*12683SJimmy.Vetayases@oracle.com /*
500*12683SJimmy.Vetayases@oracle.com * Now, disable the CPU for interrupts.
501*12683SJimmy.Vetayases@oracle.com */
502*12683SJimmy.Vetayases@oracle.com if ((*psm_disable_intr_saved)(id) != PSM_SUCCESS) {
503*12683SJimmy.Vetayases@oracle.com APIX_IRM_DEBUG((CE_NOTE,
504*12683SJimmy.Vetayases@oracle.com "apix_irm_disable_intr: failed to disable CPU interrupts"
505*12683SJimmy.Vetayases@oracle.com " for CPU#%d", id));
506*12683SJimmy.Vetayases@oracle.com mutex_exit(&apix_irm_lock);
507*12683SJimmy.Vetayases@oracle.com return (PSM_FAILURE);
508*12683SJimmy.Vetayases@oracle.com }
509*12683SJimmy.Vetayases@oracle.com /* decrement the CPU count enabled for interrupts */
510*12683SJimmy.Vetayases@oracle.com apix_irm_max_cpus--;
511*12683SJimmy.Vetayases@oracle.com mutex_exit(&apix_irm_lock);
512*12683SJimmy.Vetayases@oracle.com return (PSM_SUCCESS);
513*12683SJimmy.Vetayases@oracle.com }
514*12683SJimmy.Vetayases@oracle.com
515*12683SJimmy.Vetayases@oracle.com /*
516*12683SJimmy.Vetayases@oracle.com * Enable the CPU for interrupts. It is assumed that this function is
517*12683SJimmy.Vetayases@oracle.com * called to enable/online the CPU so that interrupts could be assigned
518*12683SJimmy.Vetayases@oracle.com * to it. If successful, add available vectors for that CPU to the IRM
519*12683SJimmy.Vetayases@oracle.com * pool if apix_irm_cpu_factor is already satisfied.
520*12683SJimmy.Vetayases@oracle.com */
521*12683SJimmy.Vetayases@oracle.com void
apix_irm_enable_intr(processorid_t id)522*12683SJimmy.Vetayases@oracle.com apix_irm_enable_intr(processorid_t id)
523*12683SJimmy.Vetayases@oracle.com {
524*12683SJimmy.Vetayases@oracle.com uint_t new_pool_size;
525*12683SJimmy.Vetayases@oracle.com
526*12683SJimmy.Vetayases@oracle.com /* Interrupt enabling for Suspend/Resume */
527*12683SJimmy.Vetayases@oracle.com if (apic_cpus[id].aci_status & APIC_CPU_SUSPEND) {
528*12683SJimmy.Vetayases@oracle.com (*psm_enable_intr_saved)(id);
529*12683SJimmy.Vetayases@oracle.com return;
530*12683SJimmy.Vetayases@oracle.com }
531*12683SJimmy.Vetayases@oracle.com
532*12683SJimmy.Vetayases@oracle.com mutex_enter(&apix_irm_lock);
533*12683SJimmy.Vetayases@oracle.com
534*12683SJimmy.Vetayases@oracle.com /* enable the CPU for interrupts */
535*12683SJimmy.Vetayases@oracle.com (*psm_enable_intr_saved)(id);
536*12683SJimmy.Vetayases@oracle.com
537*12683SJimmy.Vetayases@oracle.com /* increment the number of CPUs enabled for interrupts */
538*12683SJimmy.Vetayases@oracle.com apix_irm_max_cpus++;
539*12683SJimmy.Vetayases@oracle.com
540*12683SJimmy.Vetayases@oracle.com ASSERT(apix_irminfo.apix_per_cpu_vectors > 0);
541*12683SJimmy.Vetayases@oracle.com
542*12683SJimmy.Vetayases@oracle.com /*
543*12683SJimmy.Vetayases@oracle.com * Check if the apix_irm_cpu_factor is satisfied before.
544*12683SJimmy.Vetayases@oracle.com * If satisfied, add the CPU to IRM pool.
545*12683SJimmy.Vetayases@oracle.com */
546*12683SJimmy.Vetayases@oracle.com if ((apix_irm_cpu_factor > 0) &&
547*12683SJimmy.Vetayases@oracle.com (apix_irm_cpu_factor_available < apix_irm_cpu_factor)) {
548*12683SJimmy.Vetayases@oracle.com /*
549*12683SJimmy.Vetayases@oracle.com * Don't add the CPU to the IRM pool. Just update
550*12683SJimmy.Vetayases@oracle.com * the available CPU factor.
551*12683SJimmy.Vetayases@oracle.com */
552*12683SJimmy.Vetayases@oracle.com apix_irm_cpu_factor_available++;
553*12683SJimmy.Vetayases@oracle.com mutex_exit(&apix_irm_lock);
554*12683SJimmy.Vetayases@oracle.com return;
555*12683SJimmy.Vetayases@oracle.com }
556*12683SJimmy.Vetayases@oracle.com
557*12683SJimmy.Vetayases@oracle.com /*
558*12683SJimmy.Vetayases@oracle.com * Add the CPU to the IRM pool.
559*12683SJimmy.Vetayases@oracle.com */
560*12683SJimmy.Vetayases@oracle.com
561*12683SJimmy.Vetayases@oracle.com /* increment the CPU count used by IRM */
562*12683SJimmy.Vetayases@oracle.com apix_irm_cpus_used++;
563*12683SJimmy.Vetayases@oracle.com
564*12683SJimmy.Vetayases@oracle.com /* Calculate the new pool size */
565*12683SJimmy.Vetayases@oracle.com new_pool_size = apix_irm_params.iparams_total +
566*12683SJimmy.Vetayases@oracle.com apix_irminfo.apix_per_cpu_vectors;
567*12683SJimmy.Vetayases@oracle.com
568*12683SJimmy.Vetayases@oracle.com /* Apply the max. limit */
569*12683SJimmy.Vetayases@oracle.com if (apix_system_max_vectors > 0) {
570*12683SJimmy.Vetayases@oracle.com uint_t max;
571*12683SJimmy.Vetayases@oracle.com
572*12683SJimmy.Vetayases@oracle.com max = apix_system_max_vectors -
573*12683SJimmy.Vetayases@oracle.com apix_irm_fixed_intr_vectors_used -
574*12683SJimmy.Vetayases@oracle.com apix_irm_cache_size;
575*12683SJimmy.Vetayases@oracle.com
576*12683SJimmy.Vetayases@oracle.com new_pool_size = MIN(new_pool_size, max);
577*12683SJimmy.Vetayases@oracle.com }
578*12683SJimmy.Vetayases@oracle.com if (new_pool_size == apix_irm_params.iparams_total) {
579*12683SJimmy.Vetayases@oracle.com /* no change to pool size */
580*12683SJimmy.Vetayases@oracle.com mutex_exit(&apix_irm_lock);
581*12683SJimmy.Vetayases@oracle.com return;
582*12683SJimmy.Vetayases@oracle.com }
583*12683SJimmy.Vetayases@oracle.com if (new_pool_size < apix_irm_params.iparams_total) {
584*12683SJimmy.Vetayases@oracle.com cmn_err(CE_WARN, "new_pool_size %d is inconsistent "
585*12683SJimmy.Vetayases@oracle.com "with irm_params.iparams_total %d",
586*12683SJimmy.Vetayases@oracle.com new_pool_size, apix_irm_params.iparams_total);
587*12683SJimmy.Vetayases@oracle.com mutex_exit(&apix_irm_lock);
588*12683SJimmy.Vetayases@oracle.com return;
589*12683SJimmy.Vetayases@oracle.com }
590*12683SJimmy.Vetayases@oracle.com
591*12683SJimmy.Vetayases@oracle.com (void) ndi_irm_resize_pool(apix_irm_pool_p, new_pool_size);
592*12683SJimmy.Vetayases@oracle.com
593*12683SJimmy.Vetayases@oracle.com /* update the pool size info */
594*12683SJimmy.Vetayases@oracle.com apix_irm_params.iparams_total = new_pool_size;
595*12683SJimmy.Vetayases@oracle.com
596*12683SJimmy.Vetayases@oracle.com mutex_exit(&apix_irm_lock);
597*12683SJimmy.Vetayases@oracle.com }
598