px_msiq.c revision b0fc0e77220f1fa4c933fd58a4e1dedcd650b0f1
d9ad96c1d1e6612641c338d86699f5700fca7217rg/*
d9ad96c1d1e6612641c338d86699f5700fca7217rg * CDDL HEADER START
d9ad96c1d1e6612641c338d86699f5700fca7217rg *
d9ad96c1d1e6612641c338d86699f5700fca7217rg * The contents of this file are subject to the terms of the
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta * Common Development and Distribution License (the "License").
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta * You may not use this file except in compliance with the License.
d9ad96c1d1e6612641c338d86699f5700fca7217rg *
d9ad96c1d1e6612641c338d86699f5700fca7217rg * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
d9ad96c1d1e6612641c338d86699f5700fca7217rg * or http://www.opensolaris.org/os/licensing.
d9ad96c1d1e6612641c338d86699f5700fca7217rg * See the License for the specific language governing permissions
d9ad96c1d1e6612641c338d86699f5700fca7217rg * and limitations under the License.
d9ad96c1d1e6612641c338d86699f5700fca7217rg *
d9ad96c1d1e6612641c338d86699f5700fca7217rg * When distributing Covered Code, include this CDDL HEADER in each
d9ad96c1d1e6612641c338d86699f5700fca7217rg * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
d9ad96c1d1e6612641c338d86699f5700fca7217rg * If applicable, add the following below this CDDL HEADER, with the
d9ad96c1d1e6612641c338d86699f5700fca7217rg * fields enclosed by brackets "[]" replaced with your own identifying
d9ad96c1d1e6612641c338d86699f5700fca7217rg * information: Portions Copyright [yyyy] [name of copyright owner]
d9ad96c1d1e6612641c338d86699f5700fca7217rg *
d9ad96c1d1e6612641c338d86699f5700fca7217rg * CDDL HEADER END
d9ad96c1d1e6612641c338d86699f5700fca7217rg */
d9ad96c1d1e6612641c338d86699f5700fca7217rg/*
d9ad96c1d1e6612641c338d86699f5700fca7217rg * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
7d12f3bc086bd094c3bf327e7bd04f94701e1c69maheshvs * Use is subject to license terms.
d9ad96c1d1e6612641c338d86699f5700fca7217rg */
d9ad96c1d1e6612641c338d86699f5700fca7217rg
d9ad96c1d1e6612641c338d86699f5700fca7217rg#pragma ident "%Z%%M% %I% %E% SMI"
d9ad96c1d1e6612641c338d86699f5700fca7217rg
d9ad96c1d1e6612641c338d86699f5700fca7217rg/*
6cb014625d9459c150e9e75ed2b8a5d06b5b6137rg * px_msiq.c
6cb014625d9459c150e9e75ed2b8a5d06b5b6137rg */
d9ad96c1d1e6612641c338d86699f5700fca7217rg
d9ad96c1d1e6612641c338d86699f5700fca7217rg#include <sys/types.h>
d9ad96c1d1e6612641c338d86699f5700fca7217rg#include <sys/kmem.h>
d9ad96c1d1e6612641c338d86699f5700fca7217rg#include <sys/conf.h>
d9ad96c1d1e6612641c338d86699f5700fca7217rg#include <sys/ddi.h>
d9ad96c1d1e6612641c338d86699f5700fca7217rg#include <sys/sunddi.h>
d9ad96c1d1e6612641c338d86699f5700fca7217rg#include <sys/modctl.h>
d9ad96c1d1e6612641c338d86699f5700fca7217rg#include <sys/disp.h>
d9ad96c1d1e6612641c338d86699f5700fca7217rg#include <sys/stat.h>
d9ad96c1d1e6612641c338d86699f5700fca7217rg#include <sys/ddi_impldefs.h>
7d12f3bc086bd094c3bf327e7bd04f94701e1c69maheshvs#include "px_obj.h"
7d12f3bc086bd094c3bf327e7bd04f94701e1c69maheshvs
d9ad96c1d1e6612641c338d86699f5700fca7217rgstatic void px_msiq_get_props(px_t *px_p);
d9ad96c1d1e6612641c338d86699f5700fca7217rg
d9ad96c1d1e6612641c338d86699f5700fca7217rg/*
d9ad96c1d1e6612641c338d86699f5700fca7217rg * px_msiq_attach()
d9ad96c1d1e6612641c338d86699f5700fca7217rg */
d9ad96c1d1e6612641c338d86699f5700fca7217rgint
d9ad96c1d1e6612641c338d86699f5700fca7217rgpx_msiq_attach(px_t *px_p)
d9ad96c1d1e6612641c338d86699f5700fca7217rg{
d9ad96c1d1e6612641c338d86699f5700fca7217rg px_msiq_state_t *msiq_state_p = &px_p->px_ib_p->ib_msiq_state;
d9ad96c1d1e6612641c338d86699f5700fca7217rg size_t msiq_size;
d9ad96c1d1e6612641c338d86699f5700fca7217rg int i, ret = DDI_SUCCESS;
d9ad96c1d1e6612641c338d86699f5700fca7217rg
d9ad96c1d1e6612641c338d86699f5700fca7217rg DBG(DBG_MSIQ, px_p->px_dip, "px_msiq_attach\n");
d9ad96c1d1e6612641c338d86699f5700fca7217rg
d9ad96c1d1e6612641c338d86699f5700fca7217rg /*
d9ad96c1d1e6612641c338d86699f5700fca7217rg * Check for all MSIQ related properties and
d9ad96c1d1e6612641c338d86699f5700fca7217rg * save all information.
d9ad96c1d1e6612641c338d86699f5700fca7217rg *
d9ad96c1d1e6612641c338d86699f5700fca7217rg * Avaialble MSIQs and its properties.
d9ad96c1d1e6612641c338d86699f5700fca7217rg */
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta px_msiq_get_props(px_p);
d9ad96c1d1e6612641c338d86699f5700fca7217rg
d9ad96c1d1e6612641c338d86699f5700fca7217rg /*
d9ad96c1d1e6612641c338d86699f5700fca7217rg * 10% of available MSIQs are reserved for the PCIe messages.
d9ad96c1d1e6612641c338d86699f5700fca7217rg * Around 90% of available MSIQs are reserved for the MSI/Xs.
d9ad96c1d1e6612641c338d86699f5700fca7217rg */
d9ad96c1d1e6612641c338d86699f5700fca7217rg msiq_state_p->msiq_msg_qcnt = howmany(msiq_state_p->msiq_cnt, 10);
d9ad96c1d1e6612641c338d86699f5700fca7217rg msiq_state_p->msiq_msi_qcnt = msiq_state_p->msiq_cnt -
d9ad96c1d1e6612641c338d86699f5700fca7217rg msiq_state_p->msiq_msg_qcnt;
d9ad96c1d1e6612641c338d86699f5700fca7217rg
d9ad96c1d1e6612641c338d86699f5700fca7217rg msiq_state_p->msiq_1st_msi_qid = msiq_state_p->msiq_1st_msiq_id;
d9ad96c1d1e6612641c338d86699f5700fca7217rg msiq_state_p->msiq_next_msi_qid = msiq_state_p->msiq_1st_msi_qid;
d9ad96c1d1e6612641c338d86699f5700fca7217rg
d9ad96c1d1e6612641c338d86699f5700fca7217rg msiq_state_p->msiq_1st_msg_qid = msiq_state_p->msiq_1st_msiq_id +
d9ad96c1d1e6612641c338d86699f5700fca7217rg msiq_state_p->msiq_msi_qcnt;
d9ad96c1d1e6612641c338d86699f5700fca7217rg msiq_state_p->msiq_next_msg_qid = msiq_state_p->msiq_1st_msg_qid;
d9ad96c1d1e6612641c338d86699f5700fca7217rg
d9ad96c1d1e6612641c338d86699f5700fca7217rg mutex_init(&msiq_state_p->msiq_mutex, NULL, MUTEX_DRIVER, NULL);
d9ad96c1d1e6612641c338d86699f5700fca7217rg msiq_state_p->msiq_p = kmem_zalloc(msiq_state_p->msiq_cnt *
d9ad96c1d1e6612641c338d86699f5700fca7217rg sizeof (px_msiq_t), KM_SLEEP);
d9ad96c1d1e6612641c338d86699f5700fca7217rg msiq_size = msiq_state_p->msiq_rec_cnt * sizeof (msiq_rec_t);
d9ad96c1d1e6612641c338d86699f5700fca7217rg msiq_state_p->msiq_buf_p = kmem_zalloc(msiq_state_p->msiq_cnt *
d9ad96c1d1e6612641c338d86699f5700fca7217rg msiq_size, KM_SLEEP);
d9ad96c1d1e6612641c338d86699f5700fca7217rg
d9ad96c1d1e6612641c338d86699f5700fca7217rg for (i = 0; i < msiq_state_p->msiq_cnt; i++) {
f3b585ce799a83688c5532c430f6133f098431c2samf msiq_state_p->msiq_p[i].msiq_id =
d9ad96c1d1e6612641c338d86699f5700fca7217rg msiq_state_p->msiq_1st_msiq_id + i;
d9ad96c1d1e6612641c338d86699f5700fca7217rg msiq_state_p->msiq_p[i].msiq_refcnt = 0;
d9ad96c1d1e6612641c338d86699f5700fca7217rg msiq_state_p->msiq_p[i].msiq_state = MSIQ_STATE_FREE;
d9ad96c1d1e6612641c338d86699f5700fca7217rg
d9ad96c1d1e6612641c338d86699f5700fca7217rg msiq_state_p->msiq_p[i].msiq_base_p = (msiqhead_t *)
d9ad96c1d1e6612641c338d86699f5700fca7217rg ((caddr_t)msiq_state_p->msiq_buf_p + (i * msiq_size));
d9ad96c1d1e6612641c338d86699f5700fca7217rg }
d9ad96c1d1e6612641c338d86699f5700fca7217rg
d9ad96c1d1e6612641c338d86699f5700fca7217rg if ((ret = px_lib_msiq_init(px_p->px_dip)) != DDI_SUCCESS)
d9ad96c1d1e6612641c338d86699f5700fca7217rg px_msiq_detach(px_p);
d9ad96c1d1e6612641c338d86699f5700fca7217rg
d9ad96c1d1e6612641c338d86699f5700fca7217rg return (ret);
d9ad96c1d1e6612641c338d86699f5700fca7217rg}
d9ad96c1d1e6612641c338d86699f5700fca7217rg
d9ad96c1d1e6612641c338d86699f5700fca7217rg/*
d9ad96c1d1e6612641c338d86699f5700fca7217rg * px_msiq_detach()
d9ad96c1d1e6612641c338d86699f5700fca7217rg */
d9ad96c1d1e6612641c338d86699f5700fca7217rgvoid
d9ad96c1d1e6612641c338d86699f5700fca7217rgpx_msiq_detach(px_t *px_p)
d9ad96c1d1e6612641c338d86699f5700fca7217rg{
d9ad96c1d1e6612641c338d86699f5700fca7217rg px_msiq_state_t *msiq_state_p = &px_p->px_ib_p->ib_msiq_state;
d9ad96c1d1e6612641c338d86699f5700fca7217rg
d9ad96c1d1e6612641c338d86699f5700fca7217rg DBG(DBG_MSIQ, px_p->px_dip, "px_msiq_detach\n");
d9ad96c1d1e6612641c338d86699f5700fca7217rg
d9ad96c1d1e6612641c338d86699f5700fca7217rg (void) px_lib_msiq_fini(px_p->px_dip);
d9ad96c1d1e6612641c338d86699f5700fca7217rg kmem_free(msiq_state_p->msiq_buf_p, msiq_state_p->msiq_cnt *
d9ad96c1d1e6612641c338d86699f5700fca7217rg msiq_state_p->msiq_rec_cnt * sizeof (msiq_rec_t));
d9ad96c1d1e6612641c338d86699f5700fca7217rg
d9ad96c1d1e6612641c338d86699f5700fca7217rg mutex_destroy(&msiq_state_p->msiq_mutex);
d9ad96c1d1e6612641c338d86699f5700fca7217rg kmem_free(msiq_state_p->msiq_p,
f3b585ce799a83688c5532c430f6133f098431c2samf msiq_state_p->msiq_cnt * sizeof (px_msiq_t));
d9ad96c1d1e6612641c338d86699f5700fca7217rg
d9ad96c1d1e6612641c338d86699f5700fca7217rg bzero(&px_p->px_ib_p->ib_msiq_state, sizeof (px_msiq_state_t));
d9ad96c1d1e6612641c338d86699f5700fca7217rg}
d9ad96c1d1e6612641c338d86699f5700fca7217rg
d9ad96c1d1e6612641c338d86699f5700fca7217rg/*
d9ad96c1d1e6612641c338d86699f5700fca7217rg * px_msiq_detach()
d9ad96c1d1e6612641c338d86699f5700fca7217rg */
d9ad96c1d1e6612641c338d86699f5700fca7217rgvoid
d9ad96c1d1e6612641c338d86699f5700fca7217rgpx_msiq_resume(px_t *px_p)
d9ad96c1d1e6612641c338d86699f5700fca7217rg{
d9ad96c1d1e6612641c338d86699f5700fca7217rg px_msiq_state_t *msiq_state_p = &px_p->px_ib_p->ib_msiq_state;
d9ad96c1d1e6612641c338d86699f5700fca7217rg int i;
d9ad96c1d1e6612641c338d86699f5700fca7217rg
d9ad96c1d1e6612641c338d86699f5700fca7217rg for (i = 0; i < msiq_state_p->msiq_cnt; i++) {
d9ad96c1d1e6612641c338d86699f5700fca7217rg (void) px_lib_msiq_gethead(px_p->px_dip, i,
d9ad96c1d1e6612641c338d86699f5700fca7217rg &msiq_state_p->msiq_p[i].msiq_curr_head_index);
d9ad96c1d1e6612641c338d86699f5700fca7217rg msiq_state_p->msiq_p[i].msiq_new_head_index = 0;
d9ad96c1d1e6612641c338d86699f5700fca7217rg msiq_state_p->msiq_p[i].msiq_recs2process = 0;
d9ad96c1d1e6612641c338d86699f5700fca7217rg }
d9ad96c1d1e6612641c338d86699f5700fca7217rg}
d9ad96c1d1e6612641c338d86699f5700fca7217rg
d9ad96c1d1e6612641c338d86699f5700fca7217rg/*
d9ad96c1d1e6612641c338d86699f5700fca7217rg * px_msiq_alloc()
d9ad96c1d1e6612641c338d86699f5700fca7217rg */
d9ad96c1d1e6612641c338d86699f5700fca7217rgint
d9ad96c1d1e6612641c338d86699f5700fca7217rgpx_msiq_alloc(px_t *px_p, msiq_rec_type_t rec_type, msiqid_t *msiq_id_p)
d9ad96c1d1e6612641c338d86699f5700fca7217rg{
d9ad96c1d1e6612641c338d86699f5700fca7217rg px_msiq_state_t *msiq_state_p = &px_p->px_ib_p->ib_msiq_state;
d9ad96c1d1e6612641c338d86699f5700fca7217rg msiqid_t first_msiq_id, *next_msiq_index;
d9ad96c1d1e6612641c338d86699f5700fca7217rg uint_t msiq_cnt;
d9ad96c1d1e6612641c338d86699f5700fca7217rg int i;
d9ad96c1d1e6612641c338d86699f5700fca7217rg
d9ad96c1d1e6612641c338d86699f5700fca7217rg DBG(DBG_MSIQ, px_p->px_dip, "px_msiq_alloc\n");
d9ad96c1d1e6612641c338d86699f5700fca7217rg
d9ad96c1d1e6612641c338d86699f5700fca7217rg mutex_enter(&msiq_state_p->msiq_mutex);
d9ad96c1d1e6612641c338d86699f5700fca7217rg
d9ad96c1d1e6612641c338d86699f5700fca7217rg if (rec_type == MSG_REC) {
d9ad96c1d1e6612641c338d86699f5700fca7217rg msiq_cnt = msiq_state_p->msiq_msg_qcnt;
d9ad96c1d1e6612641c338d86699f5700fca7217rg first_msiq_id = msiq_state_p->msiq_1st_msg_qid;
d9ad96c1d1e6612641c338d86699f5700fca7217rg next_msiq_index = &msiq_state_p->msiq_next_msg_qid;
d9ad96c1d1e6612641c338d86699f5700fca7217rg } else {
d9ad96c1d1e6612641c338d86699f5700fca7217rg msiq_cnt = msiq_state_p->msiq_msi_qcnt;
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta first_msiq_id = msiq_state_p->msiq_1st_msi_qid;
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta next_msiq_index = &msiq_state_p->msiq_next_msi_qid;
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta }
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta
d9ad96c1d1e6612641c338d86699f5700fca7217rg /* Allocate MSIQs */
d9ad96c1d1e6612641c338d86699f5700fca7217rg for (i = first_msiq_id; i < (first_msiq_id + msiq_cnt); i++) {
d9ad96c1d1e6612641c338d86699f5700fca7217rg if (msiq_state_p->msiq_p[i].msiq_state == MSIQ_STATE_FREE) {
d9ad96c1d1e6612641c338d86699f5700fca7217rg msiq_state_p->msiq_p[i].msiq_state = MSIQ_STATE_INUSE;
d9ad96c1d1e6612641c338d86699f5700fca7217rg msiq_state_p->msiq_p[i].msiq_refcnt = 1;
d9ad96c1d1e6612641c338d86699f5700fca7217rg break;
d9ad96c1d1e6612641c338d86699f5700fca7217rg }
d9ad96c1d1e6612641c338d86699f5700fca7217rg }
d9ad96c1d1e6612641c338d86699f5700fca7217rg
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta /*
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta * There are no free MSIQ.
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta * Use next available MSIQ.
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta */
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta if (i >= (first_msiq_id + msiq_cnt)) {
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta i = *next_msiq_index;
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta msiq_state_p->msiq_p[i].msiq_refcnt++;
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta }
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta *msiq_id_p = msiq_state_p->msiq_p[i].msiq_id;
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta DBG(DBG_MSIQ, px_p->px_dip,
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta "px_msiq_alloc: msiq_id 0x%x\n", *msiq_id_p);
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta (*next_msiq_index)++;
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta if (*next_msiq_index >= (first_msiq_id + msiq_cnt))
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta *next_msiq_index = first_msiq_id;
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta mutex_exit(&msiq_state_p->msiq_mutex);
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta return (DDI_SUCCESS);
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta}
d9ad96c1d1e6612641c338d86699f5700fca7217rg
d9ad96c1d1e6612641c338d86699f5700fca7217rg/*
d9ad96c1d1e6612641c338d86699f5700fca7217rg * px_msiq_free()
d9ad96c1d1e6612641c338d86699f5700fca7217rg */
d9ad96c1d1e6612641c338d86699f5700fca7217rgint
d9ad96c1d1e6612641c338d86699f5700fca7217rgpx_msiq_free(px_t *px_p, msiqid_t msiq_id)
f3b585ce799a83688c5532c430f6133f098431c2samf{
d9ad96c1d1e6612641c338d86699f5700fca7217rg px_msiq_state_t *msiq_state_p = &px_p->px_ib_p->ib_msiq_state;
d9ad96c1d1e6612641c338d86699f5700fca7217rg
d9ad96c1d1e6612641c338d86699f5700fca7217rg DBG(DBG_MSIQ, px_p->px_dip, "px_msiq_free: msiq_id 0x%x", msiq_id);
d9ad96c1d1e6612641c338d86699f5700fca7217rg
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta mutex_enter(&msiq_state_p->msiq_mutex);
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta if ((msiq_id < msiq_state_p->msiq_1st_msiq_id) || (msiq_id >=
f3b585ce799a83688c5532c430f6133f098431c2samf (msiq_state_p->msiq_1st_msiq_id + msiq_state_p->msiq_cnt))) {
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta DBG(DBG_MSIQ, px_p->px_dip,
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta "px_msiq_free: Invalid msiq_id 0x%x", msiq_id);
d9ad96c1d1e6612641c338d86699f5700fca7217rg return (DDI_FAILURE);
d9ad96c1d1e6612641c338d86699f5700fca7217rg }
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta if (--msiq_state_p->msiq_p[msiq_id].msiq_refcnt == 0)
d9ad96c1d1e6612641c338d86699f5700fca7217rg msiq_state_p->msiq_p[msiq_id].msiq_state = MSIQ_STATE_FREE;
d9ad96c1d1e6612641c338d86699f5700fca7217rg
d9ad96c1d1e6612641c338d86699f5700fca7217rg mutex_exit(&msiq_state_p->msiq_mutex);
d9ad96c1d1e6612641c338d86699f5700fca7217rg return (DDI_SUCCESS);
d9ad96c1d1e6612641c338d86699f5700fca7217rg}
d9ad96c1d1e6612641c338d86699f5700fca7217rg
d9ad96c1d1e6612641c338d86699f5700fca7217rg/*
d9ad96c1d1e6612641c338d86699f5700fca7217rg * px_msiqid_to_devino()
d9ad96c1d1e6612641c338d86699f5700fca7217rg */
48a344074403d73a2e38d76ad47299c16c89e0dcrmestadevino_t
48a344074403d73a2e38d76ad47299c16c89e0dcrmestapx_msiqid_to_devino(px_t *px_p, msiqid_t msiq_id)
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta{
d9ad96c1d1e6612641c338d86699f5700fca7217rg px_msiq_state_t *msiq_state_p = &px_p->px_ib_p->ib_msiq_state;
d9ad96c1d1e6612641c338d86699f5700fca7217rg devino_t devino;
d9ad96c1d1e6612641c338d86699f5700fca7217rg
d9ad96c1d1e6612641c338d86699f5700fca7217rg devino = msiq_state_p->msiq_1st_devino +
d9ad96c1d1e6612641c338d86699f5700fca7217rg msiq_id - msiq_state_p->msiq_1st_msiq_id;
d9ad96c1d1e6612641c338d86699f5700fca7217rg
d9ad96c1d1e6612641c338d86699f5700fca7217rg DBG(DBG_MSIQ, px_p->px_dip, "px_msiqid_to_devino: "
d9ad96c1d1e6612641c338d86699f5700fca7217rg "msiq_id 0x%x devino 0x%x\n", msiq_id, devino);
d9ad96c1d1e6612641c338d86699f5700fca7217rg
d9ad96c1d1e6612641c338d86699f5700fca7217rg return (devino);
d9ad96c1d1e6612641c338d86699f5700fca7217rg}
d9ad96c1d1e6612641c338d86699f5700fca7217rg
d9ad96c1d1e6612641c338d86699f5700fca7217rg/*
d9ad96c1d1e6612641c338d86699f5700fca7217rg * px_devino_to_msiqid()
d9ad96c1d1e6612641c338d86699f5700fca7217rg */
d9ad96c1d1e6612641c338d86699f5700fca7217rgmsiqid_t
d9ad96c1d1e6612641c338d86699f5700fca7217rgpx_devino_to_msiqid(px_t *px_p, devino_t devino)
d9ad96c1d1e6612641c338d86699f5700fca7217rg{
f3b585ce799a83688c5532c430f6133f098431c2samf px_msiq_state_t *msiq_state_p = &px_p->px_ib_p->ib_msiq_state;
d9ad96c1d1e6612641c338d86699f5700fca7217rg msiqid_t msiq_id;
d9ad96c1d1e6612641c338d86699f5700fca7217rg
f3b585ce799a83688c5532c430f6133f098431c2samf msiq_id = msiq_state_p->msiq_1st_msiq_id +
f3b585ce799a83688c5532c430f6133f098431c2samf devino - msiq_state_p->msiq_1st_devino;
f3b585ce799a83688c5532c430f6133f098431c2samf
d9ad96c1d1e6612641c338d86699f5700fca7217rg DBG(DBG_MSIQ, px_p->px_dip, "px_devino_to_msiq: "
d9ad96c1d1e6612641c338d86699f5700fca7217rg "devino 0x%x msiq_id 0x%x\n", devino, msiq_id);
d9ad96c1d1e6612641c338d86699f5700fca7217rg
d9ad96c1d1e6612641c338d86699f5700fca7217rg return (msiq_id);
d9ad96c1d1e6612641c338d86699f5700fca7217rg}
d9ad96c1d1e6612641c338d86699f5700fca7217rg
d9ad96c1d1e6612641c338d86699f5700fca7217rg/*
d9ad96c1d1e6612641c338d86699f5700fca7217rg * px_msiq_get_props()
f3b585ce799a83688c5532c430f6133f098431c2samf */
d9ad96c1d1e6612641c338d86699f5700fca7217rgstatic void
d9ad96c1d1e6612641c338d86699f5700fca7217rgpx_msiq_get_props(px_t *px_p)
d9ad96c1d1e6612641c338d86699f5700fca7217rg{
d9ad96c1d1e6612641c338d86699f5700fca7217rg px_msiq_state_t *msiq_state_p = &px_p->px_ib_p->ib_msiq_state;
d9ad96c1d1e6612641c338d86699f5700fca7217rg int ret = DDI_SUCCESS;
d9ad96c1d1e6612641c338d86699f5700fca7217rg int length = sizeof (int);
d9ad96c1d1e6612641c338d86699f5700fca7217rg char *valuep = NULL;
d9ad96c1d1e6612641c338d86699f5700fca7217rg
d9ad96c1d1e6612641c338d86699f5700fca7217rg DBG(DBG_MSIQ, px_p->px_dip, "px_msiq_get_props\n");
d9ad96c1d1e6612641c338d86699f5700fca7217rg
d9ad96c1d1e6612641c338d86699f5700fca7217rg /* #msi-eqs */
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta msiq_state_p->msiq_cnt = ddi_getprop(DDI_DEV_T_ANY, px_p->px_dip,
d9ad96c1d1e6612641c338d86699f5700fca7217rg DDI_PROP_DONTPASS, "#msi-eqs", PX_DEFAULT_MSIQ_CNT);
d9ad96c1d1e6612641c338d86699f5700fca7217rg
d9ad96c1d1e6612641c338d86699f5700fca7217rg DBG(DBG_MSIQ, px_p->px_dip, "obp: msiq_cnt=%d\n",
f3b585ce799a83688c5532c430f6133f098431c2samf msiq_state_p->msiq_cnt);
d9ad96c1d1e6612641c338d86699f5700fca7217rg
d9ad96c1d1e6612641c338d86699f5700fca7217rg /* msi-eq-size */
d9ad96c1d1e6612641c338d86699f5700fca7217rg msiq_state_p->msiq_rec_cnt = ddi_getprop(DDI_DEV_T_ANY, px_p->px_dip,
d9ad96c1d1e6612641c338d86699f5700fca7217rg DDI_PROP_DONTPASS, "msi-eq-size", PX_DEFAULT_MSIQ_REC_CNT);
d9ad96c1d1e6612641c338d86699f5700fca7217rg
d9ad96c1d1e6612641c338d86699f5700fca7217rg DBG(DBG_MSIQ, px_p->px_dip, "obp: msiq_rec_cnt=%d\n",
d9ad96c1d1e6612641c338d86699f5700fca7217rg msiq_state_p->msiq_rec_cnt);
d9ad96c1d1e6612641c338d86699f5700fca7217rg
d9ad96c1d1e6612641c338d86699f5700fca7217rg /* msi-eq-to-devino: msi-eq#, devino# fields */
d9ad96c1d1e6612641c338d86699f5700fca7217rg ret = ddi_prop_op(DDI_DEV_T_ANY, px_p->px_dip, PROP_LEN_AND_VAL_ALLOC,
d9ad96c1d1e6612641c338d86699f5700fca7217rg DDI_PROP_DONTPASS, "msi-eq-to-devino", (caddr_t)&valuep,
d9ad96c1d1e6612641c338d86699f5700fca7217rg &length);
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta
d9ad96c1d1e6612641c338d86699f5700fca7217rg if (ret == DDI_PROP_SUCCESS) {
d9ad96c1d1e6612641c338d86699f5700fca7217rg msiq_state_p->msiq_1st_msiq_id =
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta ((px_msi_eq_to_devino_t *)valuep)->msi_eq_no;
d9ad96c1d1e6612641c338d86699f5700fca7217rg msiq_state_p->msiq_1st_devino =
d9ad96c1d1e6612641c338d86699f5700fca7217rg ((px_msi_eq_to_devino_t *)valuep)->devino_no;
d9ad96c1d1e6612641c338d86699f5700fca7217rg kmem_free(valuep, (size_t)length);
d9ad96c1d1e6612641c338d86699f5700fca7217rg } else {
d9ad96c1d1e6612641c338d86699f5700fca7217rg msiq_state_p->msiq_1st_msiq_id = PX_DEFAULT_MSIQ_1ST_MSIQ_ID;
d9ad96c1d1e6612641c338d86699f5700fca7217rg msiq_state_p->msiq_1st_devino = PX_DEFAULT_MSIQ_1ST_DEVINO;
d9ad96c1d1e6612641c338d86699f5700fca7217rg }
d9ad96c1d1e6612641c338d86699f5700fca7217rg
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta DBG(DBG_MSIQ, px_p->px_dip, "obp: msiq_1st_msiq_id=%d\n",
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta msiq_state_p->msiq_1st_msiq_id);
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta DBG(DBG_MSIQ, px_p->px_dip, "obp: msiq_1st_devino=%d\n",
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta msiq_state_p->msiq_1st_devino);
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta}
48a344074403d73a2e38d76ad47299c16c89e0dcrmesta