1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson/*
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * CDDL HEADER START
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson *
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * The contents of this file are subject to the terms of the
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * Common Development and Distribution License (the "License").
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * You may not use this file except in compliance with the License.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson *
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * or http://www.opensolaris.org/os/licensing.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * See the License for the specific language governing permissions
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * and limitations under the License.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson *
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * When distributing Covered Code, include this CDDL HEADER in each
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * If applicable, add the following below this CDDL HEADER, with the
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * fields enclosed by brackets "[]" replaced with your own identifying
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * information: Portions Copyright [yyyy] [name of copyright owner]
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson *
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * CDDL HEADER END
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson */
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson/*
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * Use is subject to license terms.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson */
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson#ifndef _IBDMA_IMPL_H
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson#define _IBDMA_IMPL_H
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson/*
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * ibdma_impl.h
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson *
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * Device Management Agent private prototypes and structures.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson */
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson#ifdef __cpluplus
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesonextern "C" {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson#endif
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson#include <sys/ib/ibtl/ibvti.h> /* IB verrbs interfaces */
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson#include <sys/ib/mgt/ib_dm_attr.h> /* IB DM defines/structures */
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson#include <sys/ib/mgt/ib_mad.h> /* IB MAD defines/structures */
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesonenum {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson IBDMA_MAD_SIZE = 256,
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson IBDMA_DM_MAD_HDR_SIZE = 40,
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson IBDMA_DM_RESP_TIME = 20,
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson IBDMA_MAX_IOC = 16
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson};
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson/*
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * Implementation of handle returned to consumer.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson */
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesontypedef struct ibdma_hdl_impl_s {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson list_node_t ih_node;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson ib_guid_t ih_iou_guid;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson uint8_t ih_ioc_ndx;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson} ibdma_hdl_impl_t;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson/*
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * Each I/O Controller slot for the I/O Unit.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson */
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesontypedef struct ibdma_ioc_s {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson uint8_t ii_inuse;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson /*
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * Just to map handle back to slot number and hca
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson */
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson int ii_slot;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson struct ibdma_hca_s *ii_hcap;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson /*
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * Profile provided by the I/O Controller, must be stored
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * in network order. Note that the profile indicates the
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * number of service entries pointed to by ii_srvcs.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson */
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson ib_dm_ioc_ctrl_profile_t ii_profile;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson ib_dm_srv_t *ii_srvcs;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson} ibdma_ioc_t;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson/*
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * The ibdma_hca_t structure is only used internally by the
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * IB DM Agent. It is created when the associated HCA is
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * opened as part of initialization or as a result of a
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * notification via IBTF. It is destroyed when the HCA
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * is closed as part of fini processing or as a result of
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * a notification via IBTF. The structure is not directly
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * accessed by IBMF call-backs or the consumer API.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson */
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesontypedef struct ibdma_port_s {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson ibmf_handle_t ip_ibmf_hdl;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson ibmf_register_info_t ip_ibmf_reg;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson ibmf_impl_caps_t ip_ibmf_caps;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson struct ibdma_hca_s *ip_hcap;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson} ibdma_port_t;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesontypedef struct ibdma_hca_s {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson list_node_t ih_node;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson ibt_hca_hdl_t ih_ibt_hdl;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson /*
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * Consumer handles associated with I/O Controllers
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * that have registered with this I/O Unit.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson */
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson list_t ih_hdl_list;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson /*
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * The I/O Unit that is presented to the IB Fabric.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * It is stored in network order.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson */
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson krwlock_t ih_iou_rwlock;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson ib_guid_t ih_iou_guid;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson ib_dm_io_unitinfo_t ih_iou;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson ibdma_ioc_t ih_ioc[IBDMA_MAX_IOC];
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson uint8_t ih_nports;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson ibdma_port_t ih_port[1];
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson} ibdma_hca_t;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson/*
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * The IBDMA module state information created and initialized
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * at _init() and freed at _fini().
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson */
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesontypedef struct ibdma_mod_state_s {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson ibt_clnt_hdl_t ms_ibt_hdl;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson /*
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * The HCA list lock is used protect the HCA list and
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * is held during consumer routines (in place of a
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * reference count) to ensure the HCA exists for the
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * duration of it's use in the routine.
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson */
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson kmutex_t ms_hca_list_lock;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson list_t ms_hca_list;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson uint_t ms_num_hcas;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson} ibdma_mod_state_t;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson/*
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson * Client API internal helpers
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson */
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesontypedef enum ibdma_ioc_state_e {
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson IBDMA_IOC_NOT_INSTALLED = 0,
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson IBDMA_IOC_PRESENT = 1,
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson IBDMA_IOC_DOES_NOT_EXIST = 255,
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson IBDMA_HDL_MAGIC = 0x00931000
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson} ibdma_ioc_state_t;
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesonstatic void
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesonibdma_set_ioc_state(ibdma_hca_t *hca, int slot, ibdma_ioc_state_t state);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleesonstatic ibdma_ioc_state_t ibdma_get_ioc_state(ibdma_hca_t *hca, int slot);
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson
1bdd6c0e3710e91cb1f31aa78de33cb638494480Sue Gleeson#endif /* _IBDMA_IMPL_H */