9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * CDDL HEADER START
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The contents of this file are subject to the terms of the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Common Development and Distribution License (the "License").
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * You may not use this file except in compliance with the License.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * or http://www.opensolaris.org/os/licensing.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * See the License for the specific language governing permissions
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * and limitations under the License.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * When distributing Covered Code, include this CDDL HEADER in each
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * If applicable, add the following below this CDDL HEADER, with the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * fields enclosed by brackets "[]" replaced with your own identifying
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * information: Portions Copyright [yyyy] [name of copyright owner]
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * CDDL HEADER END
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Use is subject to license terms.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#ifndef _SYS_IB_ADAPTERS_TAVOR_H
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define _SYS_IB_ADAPTERS_TAVOR_H
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor.h
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Contains the #defines and typedefs necessary for the Tavor softstate
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * structure and for proper attach() and detach() processing. Also
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * includes all the other Tavor header files (and so is the only header
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * file that is directly included by the Tavor source files).
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Additionally, this file contains some defines and macros used by
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Tavor TNF tracing mechanism.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Lastly, this file includes everything necessary for implementing the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * devmap interface and for maintaining the "mapped resource database".
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/types.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/conf.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/ddi.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/sunddi.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/tnf_probe.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/taskq.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/ib/ibtl/ibci.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/ib/adapters/mlnx_umap.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * First include all the Tavor typedefs, then include all the other Tavor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * specific headers (many of which depend on the typedefs having already
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * been defined.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/ib/adapters/tavor/tavor_typedef.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/ib/adapters/tavor/tavor_agents.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/ib/adapters/tavor/tavor_cfg.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/ib/adapters/tavor/tavor_cmd.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/ib/adapters/tavor/tavor_cq.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/ib/adapters/tavor/tavor_event.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/ib/adapters/tavor/tavor_hw.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/ib/adapters/tavor/tavor_ioctl.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/ib/adapters/tavor/tavor_misc.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/ib/adapters/tavor/tavor_mr.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/ib/adapters/tavor/tavor_qp.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/ib/adapters/tavor/tavor_srq.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/ib/adapters/tavor/tavor_rsrc.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include <sys/ib/adapters/tavor/tavor_wr.h>
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#ifdef __cplusplus
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorextern "C" {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#endif
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The following defines and macros are used for Tavor TNF tracing
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Note: TAVOR_TNF_FAIL is used in routines which has many failure cases.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * It will initialize the "errormsg" and "status" variables (both of which
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * must be declared locally in the routines where this macro is used) for use
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * in a later TNF probe and return from routine.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_TNF_ERROR "tavor tavor_error "
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_TNF_TRACE "tavor tavor_trace "
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_TNF_ENTER(func) \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0_DEBUG(func##_start, TAVOR_TNF_TRACE, "")
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_TNF_EXIT(func) \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TNF_PROBE_0_DEBUG(func##_end, TAVOR_TNF_TRACE, "")
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_TNF_FAIL(s, e) \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{ \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor errormsg = (e); \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor status = (s); \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_VPD_HDR_DWSIZE 0x10 /* 16 Dwords */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_VPD_HDR_BSIZE 0x40 /* 64 Bytes */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Number of initial states to setup. Used in call to ddi_soft_state_init()
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_INITIAL_STATES 3
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Macro and defines used to calculate device instance number from minor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * number (and vice versa).
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_MINORNUM_SHIFT 3
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_DEV_INSTANCE(dev) (getminor((dev)) & \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ((1 << TAVOR_MINORNUM_SHIFT) - 1))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Locations for the various Tavor hardware PCI BARs (CMD, UAR, DDR)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_CMD_BAR 1
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_UAR_BAR 2
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_DDR_BAR 3
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Some defines for the software reset. These define the value that should
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * be written to begin the reset (TAVOR_SW_RESET_START), the delay before
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * beginning to poll for completion (TAVOR_SW_RESET_DELAY), the in-between
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * polling delay (TAVOR_SW_RESET_POLL_DELAY), and the value that indicates
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * that the reset has not completed (TAVOR_SW_RESET_NOTDONE).
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_SW_RESET_START 0x00000001
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_SW_RESET_DELAY 100000 /* 100 ms */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_SW_RESET_POLL_DELAY 100 /* 100 us */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_SW_RESET_NOTDONE 0xFFFFFFFF
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * These defines are used in the Tavor software reset operation. They define
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * the total number PCI registers to read/restore during the reset. And they
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * also specify two config registers which should not be read or restored.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_SW_RESET_NUMREGS 0x40
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_SW_RESET_REG22_RSVD 0x16
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_SW_RESET_REG23_RSVD 0x17
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Macro used to output Tavor warning messages. Note: Tavor warning messages
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * are only generated when an unexpected condition has been detected. This
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * can be the result of a software bug or some other problem, but it is more
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * often an indication that the Tavor firmware (and/or hardware) has done
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * something unexpected. This warning message means that the driver state
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * in unpredictable and that shutdown/restart is suggested.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_WARNING(state, string) \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor cmn_err(CE_WARN, "tavor%d: "string, (state)->ts_instance)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Macro used to set attach failure messages. Also, the attach message buf
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * size is set here.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_ATTACH_MSGSIZE 80
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_ATTACH_MSG(attach_buf, attach_msg) \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) snprintf((attach_buf), TAVOR_ATTACH_MSGSIZE, (attach_msg));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_ATTACH_MSG_INIT(attach_buf) \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (attach_buf)[0] = '\0';
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Macros used for controlling whether or not event callbacks will be forwarded
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * to the IBTF. This is necessary because there are certain race conditions
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * that can occur (e.g. calling IBTF with an asynch event before the IBTF
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * registration has successfully completed or handling an event after we've
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * detached from the IBTF.)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * TAVOR_ENABLE_IBTF_CALLB() initializes the "ts_ibtfpriv" field in the Tavor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * softstate. When "ts_ibtfpriv" is non-NULL, it is OK to forward asynch
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * and CQ events to the IBTF.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * TAVOR_DO_IBTF_ASYNC_CALLB() and TAVOR_DO_IBTF_CQ_CALLB() both set and clear
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * the "ts_in_evcallb" flag, as necessary, to indicate that an IBTF
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * callback is currently in progress. This is necessary so that we can
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * block on this condition in tavor_detach().
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * TAVOR_QUIESCE_IBTF_CALLB() is used in tavor_detach() to set the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * "ts_ibtfpriv" to NULL (thereby disabling any further IBTF callbacks)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * and to poll on the "ts_in_evcallb" flag. When this flag is zero, all
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * IBTF callbacks have quiesced and it is safe to continue with detach
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * (i.e. continue detaching from IBTF).
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_ENABLE_IBTF_CALLB(state, tmp_ibtfpriv) \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (state)->ts_ibtfpriv = (tmp_ibtfpriv);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_DO_IBTF_ASYNC_CALLB(state, type, event) \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS((state)->ts_in_evcallb)) \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (state)->ts_in_evcallb = 1; \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibc_async_handler((state)->ts_ibtfpriv, (type), (event)); \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (state)->ts_in_evcallb = 0;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_DO_IBTF_CQ_CALLB(state, cq) \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor _NOTE(NOW_INVISIBLE_TO_OTHER_THREADS((state)->ts_in_evcallb)) \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (state)->ts_in_evcallb = 1; \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibc_cq_handler((state)->ts_ibtfpriv, (cq)->cq_hdlrarg); \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (state)->ts_in_evcallb = 0;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_QUIESCE_IBTF_CALLB(state) \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{ \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint_t count = 0; \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor state->ts_ibtfpriv = NULL; \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor while (((state)->ts_in_evcallb != 0) && \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (count++ < TAVOR_QUIESCE_IBTF_CALLB_POLL_MAX)) { \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor drv_usecwait(TAVOR_QUIESCE_IBTF_CALLB_POLL_DELAY); \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor } \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Defines used by the TAVOR_QUIESCE_IBTF_CALLB() macro to determine the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * duration and number of times (at maximum) to poll while waiting for IBTF
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * callbacks to quiesce.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_QUIESCE_IBTF_CALLB_POLL_DELAY 1
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_QUIESCE_IBTF_CALLB_POLL_MAX 1000000
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Define used to determine the device mode to which Tavor driver has been
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * attached. TAVOR_IS_MAINTENANCE_MODE() returns true when the device has
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * come up in the "maintenance mode". In this mode, no InfiniBand interfaces
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * are enabled, but the device's firmware can be updated/flashed (and
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * test/debug interfaces should be useable).
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * TAVOR_IS_HCA_MODE() returns true when the device has come up in the normal
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * HCA mode. In this mode, all necessary InfiniBand interfaces are enabled
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * (and, if necessary, Tavor firmware can be updated/flashed).
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_IS_MAINTENANCE_MODE(dip) \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (((ddi_prop_get_int(DDI_DEV_T_ANY, (dip), DDI_PROP_DONTPASS, \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor "device-id", -1) == 0x5a45) || \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (ddi_prop_get_int(DDI_DEV_T_ANY, (dip), DDI_PROP_DONTPASS, \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor "device-id", -1) == 0x6279)) && \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (ddi_prop_get_int(DDI_DEV_T_ANY, (dip), DDI_PROP_DONTPASS, \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor "vendor-id", -1) == 0x15b3))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_IS_COMPAT_MODE(dip) \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ((ddi_prop_get_int(DDI_DEV_T_ANY, (dip), DDI_PROP_DONTPASS, \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor "device-id", -1) == 0x6278) && \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (ddi_prop_get_int(DDI_DEV_T_ANY, (dip), DDI_PROP_DONTPASS, \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor "vendor-id", -1) == 0x15b3))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_IS_HCA_MODE(dip) \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ((ddi_prop_get_int(DDI_DEV_T_ANY, (dip), DDI_PROP_DONTPASS, \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor "device-id", -1) == 0x5a44) && \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (ddi_prop_get_int(DDI_DEV_T_ANY, (dip), DDI_PROP_DONTPASS, \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor "vendor-id", -1) == 0x15b3))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_MAINTENANCE_MODE 1
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_COMPAT_MODE 2
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_HCA_MODE 3
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Used to determine if the device is operational, or not in maintenance mode.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * This means either the driver has attached successfully against an arbel
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * device in tavor compatibility mode, or against a tavor device in full HCA
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * mode.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_IS_OPERATIONAL(mode) \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (mode == TAVOR_COMPAT_MODE || mode == TAVOR_HCA_MODE)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Used to determine if parent bridge is a PCI bridge; used in software reset
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_PARENT_IS_BRIDGE(dip) \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ((ddi_prop_get_int(DDI_DEV_T_ANY, (dip), DDI_PROP_DONTPASS, \
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor "device-id", -1) == 0x5a46))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The following define is used (in tavor_umap_db_set_onclose_cb()) to
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * indicate that a cleanup callback is needed to undo initialization done
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * by the firmware flash burn code.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_ONCLOSE_FLASH_INPROGRESS (1 << 0)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The following enumerated type and structures are used during driver
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * initialization. Note: The TAVOR_DRV_CLEANUP_ALL type is used as a marker
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * for end of the cleanup steps. No cleanup steps should be added after
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * TAVOR_DRV_CLEANUP_ALL. Any addition steps should be added before it.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortypedef enum {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_DRV_CLEANUP_LEVEL0,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_DRV_CLEANUP_LEVEL1,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_DRV_CLEANUP_LEVEL2,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_DRV_CLEANUP_LEVEL3,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_DRV_CLEANUP_LEVEL4,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_DRV_CLEANUP_LEVEL5,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_DRV_CLEANUP_LEVEL6,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_DRV_CLEANUP_LEVEL7,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_DRV_CLEANUP_LEVEL8,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_DRV_CLEANUP_LEVEL9,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_DRV_CLEANUP_LEVEL10,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_DRV_CLEANUP_LEVEL11,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_DRV_CLEANUP_LEVEL12,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_DRV_CLEANUP_LEVEL13,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_DRV_CLEANUP_LEVEL14,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* No more driver cleanup steps below this point! */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor TAVOR_DRV_CLEANUP_ALL
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor} tavor_drv_cleanup_level_t;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_mem_alloc_hdl_t structure store DMA handles for the new
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * ibc_alloc_io_mem calls
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortypedef struct tavor_mem_alloc_hdl_s {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ddi_dma_handle_t tavor_dma_hdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ddi_acc_handle_t tavor_acc_hdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor} *tavor_mem_alloc_hdl_t;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The tavor_cmd_reg_t structure is used to hold the address of the each of
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * the most frequently accessed hardware registers. Specifically, it holds
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * the HCA Command Registers (HCR, used to pass command and mailbox
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * information back and forth to Tavor firmware) and the lock used to guarantee
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * mutually exclusive access to the registers. It also holds the Event Cause
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Register (ECR) and its related clear register. These are used to indicate
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * during interrupt processing which EQs have fired and require servicing.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Related to this, is the "clr_int" register which is used to clear the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * interrupt once all EQs have been services.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Finally, there is the software reset register which is used to reinitialize
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * the Tavor device and to put it into a known state at driver startup time.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Below we also have the offsets (into the CMD register space) for each of
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * the various registers.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortypedef struct tavor_cmd_reg_s {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_hw_hcr_t *hcr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor kmutex_t hcr_lock;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint64_t *ecr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint64_t *clr_ecr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint64_t *clr_int;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint32_t *sw_reset;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor} tavor_cmd_reg_t;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor_NOTE(MUTEX_PROTECTS_DATA(tavor_cmd_reg_t::hcr_lock,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_cmd_reg_t::hcr))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The tavor_state_t structure is the Tavor software state structure. It
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * contains all the pointers and placeholder for everything that the Tavor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * driver needs to properly operate. One of these structures exists for
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * every instance of the Tavor driver.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstruct tavor_state_s {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dev_info_t *ts_dip;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int ts_instance;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Tavor interrupt/MSI information */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int ts_intr_types_avail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint_t ts_intr_type_chosen;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int ts_intrmsi_count;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int ts_intrmsi_avail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int ts_intrmsi_allocd;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ddi_intr_handle_t ts_intrmsi_hdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint_t ts_intrmsi_pri;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int ts_intrmsi_cap;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Tavor device operational mode */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int ts_operational_mode;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Attach buffer saved per state to store detailed attach errors */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor char ts_attach_buf[TAVOR_ATTACH_MSGSIZE];
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Tavor NodeGUID, SystemImageGUID, NodeDescription, HCA name,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * and HCA part number.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint64_t ts_nodeguid;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint64_t ts_sysimgguid;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor char ts_nodedesc[64];
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor char ts_hca_name[64];
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor char ts_hca_pn[64];
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int ts_hca_pn_len;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Info passed to IBTF during registration */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibc_hca_info_t ts_ibtfinfo;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibc_clnt_hdl_t ts_ibtfpriv;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Tavor register mapping. Holds the device access attributes,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * kernel mapped addresses, and DDI access handles for each of
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Tavor's three types of address register (CMD, UAR, and DDR).
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ddi_device_acc_attr_t ts_reg_accattr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor caddr_t ts_reg_cmd_baseaddr; /* Tavor CMD BAR */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ddi_acc_handle_t ts_reg_cmdhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor caddr_t ts_reg_uar_baseaddr; /* Tavor UAR BAR */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ddi_acc_handle_t ts_reg_uarhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor caddr_t ts_reg_ddr_baseaddr; /* Tavor DDR BAR */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ddi_acc_handle_t ts_reg_ddrhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Tavor PCI config space registers. These two arrays are used to
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * save and restore the PCI config registers before and after a
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * software reset. Note: We must save away both our own registers
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * and our parent's (the "virtual" PCI bridge in the device) because
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * the software reset will reset both sets.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint32_t ts_cfg_data[TAVOR_SW_RESET_NUMREGS];
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint32_t ts_cfg_pdata[TAVOR_SW_RESET_NUMREGS];
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Tavor UAR page resources. Holds the resource pointers for
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * UAR page #0 (reserved) and for UAR page #1 (used for kernel
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * driver doorbells). In addition, we save a pointer to the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * UAR page #1 doorbells which will be used throughout the driver
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * whenever it is necessary to ring one of them. And, in case we
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * are unable to do 64-bit writes to the page (because of system
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * architecture), we include a lock (to ensure atomic 64-bit access).
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_rsrc_t *ts_uarpg0_rsrc_rsrvd;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_rsrc_t *ts_uarpg1_rsrc;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_hw_uar_t *ts_uar;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor kmutex_t ts_uar_lock;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Used during a call to open() if we are in maintenance mode, this
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * field serves as a semi-unique rolling count index value, used only
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * in the setup of umap_db entries. This is primarily needed to
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * firmware device access ioctl operations can still be guaranteed to
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * close in the event of an unplanned process exit, even in maintenance
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * mode.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint_t ts_open_tr_indx;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Tavor command registers. This structure contains the addresses
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * for each of the most frequently accessed CMD registers. Since
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * almost all accesses to the Tavor hardware are through the Tavor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * command interface (i.e. the HCR), we save away the pointer to
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * the HCR, as well as pointers to the ECR and INT registers (as
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * well as their corresponding "clear" registers) for interrupt
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * processing. And we also save away a pointer to the software
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * reset register (see above).
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_cmd_reg_t ts_cmd_regs;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Tavor resource pointers. The following are pointers to the vmem
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * arena (created to manage the DDR memory), the kmem cache (from
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * which the Tavor resource handles are allocated), and the array
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * of "resource pools" (which store all the pertinent information
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * necessary to manage each of the various types of resources that
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * are used by the Tavor driver. See tavor_rsrc.h for more detail.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor vmem_t *ts_ddrvmem;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor kmem_cache_t *ts_rsrc_cache;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_rsrc_pool_info_t *ts_rsrc_hdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Tavor mailbox lists. These hold the information necessary to
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * manage the pools of pre-allocated Tavor mailboxes (both "In" and
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * "Out" type). See tavor_cmd.h for more detail.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_mboxlist_t ts_in_mblist;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_mboxlist_t ts_out_mblist;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Tavor interrupt mailbox lists. We allocate both an "In" mailbox
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * and an "Out" type mailbox for the interrupt context. This is in
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * order to guarantee that a mailbox entry will always be available in
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * the interrupt context, and we can NOSLEEP without having to worry
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * about possible failure allocating the mbox. We create this as an
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * mboxlist so that we have the potential for having multiple mboxes
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * available based on the number of interrupts we can receive at once.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_mboxlist_t ts_in_intr_mblist;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_mboxlist_t ts_out_intr_mblist;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Tavor outstanding command list. Used to hold all the information
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * necessary to manage the Tavor "outstanding command list". See
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_cmd.h for more detail.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_cmdlist_t ts_cmd_list;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * This structure contains the Tavor driver's "configuration profile".
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * This is the collected set of configuration information, such as
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * number of QPs, CQs, mailboxes and other resources, sizes of
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * individual resources, other system level configuration information,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * etc. See tavor_cfg.h for more detail.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_cfg_profile_t *ts_cfg_profile;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * This flag contains the profile setting, selecting which profile the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * driver would use. This is needed in the case where we have to
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * fallback to a smaller profile based on some DDR conditions. If we
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * don't fallback, then it is set to the size of DDR in the system.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint32_t ts_cfg_profile_setting;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The following are a collection of resource handles used by the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Tavor driver (internally). First is the protection domain (PD)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * handle that is used when mapping all kernel memory (work queues,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * completion queues, etc). Next is an array of EQ handles. This
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * array is indexed by EQ number and allows the Tavor driver to quickly
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * convert an EQ number into the software structure associated with the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * given EQ. Likewise, we have three arrays for CQ, QP and SRQ
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * handles. These arrays are also indexed by CQ, QP or SRQ number and
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * allow the driver to quickly find the corresponding CQ, QP or SRQ
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * software structure. Note: while the EQ table is of fixed size
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * (because there are a maximum of 64 EQs), each of the CQ, QP and SRQ
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * handle lists must be allocated at driver startup.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_pdhdl_t ts_pdhdl_internal;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_eqhdl_t ts_eqhdl[TAVOR_NUM_EQ];
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_cqhdl_t *ts_cqhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_qphdl_t *ts_qphdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_srqhdl_t *ts_srqhdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The AVL tree is used to store information regarding QP number
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * allocations. The lock protects access to the AVL tree.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor avl_tree_t ts_qpn_avl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor kmutex_t ts_qpn_avl_lock;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * This field is used to indicate whether or not the Tavor driver is
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * currently in an IBTF event callback elsewhere in the system. Note:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * It is "volatile" because we intend to poll on this value - in
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * tavor_detach() - until we are assured that no further IBTF callbacks
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * are currently being processed.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor volatile uint32_t ts_in_evcallb;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The following structures are used to store the results of several
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * device query commands passed to the Tavor hardware at startup.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Specifically, we have hung onto the results of QUERY_DDR (which
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * gives information about how much DDR memory is present and where
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * it is located), QUERY_FW (which gives information about firmware
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * version numbers and the location and extent of firmware's footprint
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * in DDR, QUERY_DEVLIM (which gives the device limitations/resource
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * maximums), QUERY_ADAPTER (which gives additional miscellaneous
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * information), and INIT/QUERY_HCA (which serves the purpose of
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * recording what configuration information was passed to the firmware
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * when the HCA was initialized).
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor struct tavor_hw_queryddr_s ts_ddr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor struct tavor_hw_queryfw_s ts_fw;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor struct tavor_hw_querydevlim_s ts_devlim;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor struct tavor_hw_queryadapter_s ts_adapter;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor struct tavor_hw_initqueryhca_s ts_hcaparams;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The following are used for managing special QP resources.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Specifically, we have a lock, a set of flags (in "ts_spec_qpflags")
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * used to track the special QP resources, and two Tavor resource
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * handle pointers. Each resource handle actually corresponds to two
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * consecutive QP contexts (one per port) for each special QP type.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor kmutex_t ts_spec_qplock;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint_t ts_spec_qpflags;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_rsrc_t *ts_spec_qp0;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_rsrc_t *ts_spec_qp1;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Related in some ways to the special QP handling above are these
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * resources which are used specifically for implementing the Tavor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * agents (SMA, PMA, and BMA). Although, each of these agents does
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * little more that intercept the appropriate incoming MAD and forward
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * it along to the firmware (see tavor_agents.c for more details), we
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * do still use a task queue to queue them up. We can also configure
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * the driver to force firmware handling for certain classes of MAD,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * and, therefore, we require the agent list and number of agents
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * in order to know what needs to be torn down at detach() time.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_agent_list_t *ts_agents;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ddi_taskq_t *ts_taskq_agents;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint_t ts_num_agents;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Multicast group lists. These are used to track the "shadow" MCG
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * lists that speed up the processing of attach and detach multicast
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * group operations. See tavor_misc.h for more details. Note: we
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * need the pointer to the "temporary" MCG entry here primarily
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * because the size of a given MCG entry is configurable. Therefore,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * it is impossible to put this variable on the stack. And rather
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * than allocate and deallocate the entry multiple times, we choose
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * instead to preallocate it once and reuse it over and over again.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor kmutex_t ts_mcglock;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_mcghdl_t ts_mcghdl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_hw_mcg_t *ts_mcgtmp;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Used for tracking Tavor kstat information
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_ks_info_t *ts_ks_info;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Used for Tavor info ioctl used by VTS
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor kmutex_t ts_info_lock;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Used for Tavor FW flash burning. They are used exclusively
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * within the ioctl calls for use when accessing the tavor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * flash device.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor kmutex_t ts_fw_flashlock;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int ts_fw_flashstarted;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dev_t ts_fw_flashdev;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint32_t ts_fw_log_sector_sz;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint32_t ts_fw_device_sz;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint32_t ts_fw_flashbank;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint32_t *ts_fw_sector;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint32_t ts_fw_gpio[4];
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ddi_acc_handle_t ts_pci_cfghdl; /* PCI cfg handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int ts_fw_cmdset;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Tavor fastreboot support */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor boolean_t ts_quiescing; /* in fastreboot */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor};
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor_NOTE(MUTEX_PROTECTS_DATA(tavor_state_s::ts_fw_flashlock,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_s::ts_fw_flashstarted
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_s::ts_fw_flashdev
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_s::ts_fw_log_sector_sz
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_s::ts_fw_device_sz))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor_NOTE(MUTEX_PROTECTS_DATA(tavor_state_s::ts_spec_qplock,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_s::ts_spec_qpflags
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_s::ts_spec_qp0
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_s::ts_spec_qp1))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor_NOTE(MUTEX_PROTECTS_DATA(tavor_state_s::ts_mcglock,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_s::ts_mcghdl
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_s::ts_mcgtmp))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor_NOTE(DATA_READABLE_WITHOUT_LOCK(tavor_state_s::ts_in_evcallb
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_s::ts_fw_log_sector_sz
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_s::ts_fw_device_sz
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_s::ts_fw_sector
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_s::ts_spec_qpflags
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_s::ts_spec_qp0
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_s::ts_spec_qp1))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor_NOTE(MUTEX_PROTECTS_DATA(tavor_state_s::ts_qpn_avl_lock,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_s::ts_qpn_avl))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * TAVOR_IN_FASTREBOOT() shows if Hermon driver is at fastreboot.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * This macro should be used to check if the mutex lock can be used
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * since the lock cannot be used if the driver is in the quiesce mode.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_IN_FASTREBOOT(state) (state->ts_quiescing == B_TRUE)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Bit positions in the "ts_spec_qpflags" field above. The flags are (from
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * least significant to most): (QP0,Port1), (QP0,Port2), (QP1,Port1), and
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * (QP1,Port2). The masks are there to help with some specific allocation
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * and freeing operations
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_SPECIAL_QP0_RSRC 0
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_SPECIAL_QP0_RSRC_MASK 0x3
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_SPECIAL_QP1_RSRC 2
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_SPECIAL_QP1_RSRC_MASK 0xC
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * These flags specifies additional behaviors on database access.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * TAVOR_UMAP_DB_REMOVE, for example, specifies that (if found) the database
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * entry should be removed from the database. TAVOR_UMAP_DB_IGNORE_INSTANCE
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * specifies that a particular database query should ignore value in the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * "tdb_instance" field as a criterion for the search.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_UMAP_DB_REMOVE (1 << 0)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#define TAVOR_UMAP_DB_IGNORE_INSTANCE (1 << 1)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The tavor_umap_db_t structure contains what is referred to throughout the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * driver code as the "userland resources database". This structure contains
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * all the necessary information to track resources that have been prepared
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * for direct-from-userland access. There is an AVL tree ("tdl_umapdb_avl")
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * which consists of the "tavor_umap_db_entry_t" (below) and a lock to ensure
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * atomic access when adding or removing entries from the database.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortypedef struct tavor_umap_db_s {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor kmutex_t tdl_umapdb_lock;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor avl_tree_t tdl_umapdb_avl;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor} tavor_umap_db_t;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The tavor_umap_db_priv_t structure currently contains information necessary
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * to provide the "on close" callback to the firmware flash interfaces. It
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * is intended that this structure could be extended to enable other "on
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * close" callbacks as well.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortypedef struct tavor_umap_db_priv_s {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor void (*tdp_cb)(void *);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor void *tdp_arg;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor} tavor_umap_db_priv_t;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The tavor_umap_db_common_t structure contains fields which are common
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * between the database entries ("tavor_umap_db_entry_t") and the structure
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * used to contain the search criteria ("tavor_umap_db_query_t"). This
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * structure contains a key, a resource type (described above), an instance
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * (corresponding to the driver instance which inserted the database entry),
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * and a "value" field. Typically, "tdb_value" is a pointer to a Tavor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * resource object. Although for memory regions, the value field corresponds
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * to the ddi_umem_cookie_t for the pinned userland memory.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The structure also includes a placeholder for private data ("tdb_priv").
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Currently this data is being used for holding "on close" callback
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * information to allow certain kinds of cleanup even if a userland process
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * prematurely exits.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortypedef struct tavor_umap_db_common_s {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint64_t tdb_key;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint64_t tdb_value;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint_t tdb_type;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint_t tdb_instance;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor void *tdb_priv;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor} tavor_umap_db_common_t;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The tavor_umap_db_entry_t structure is the entry in "userland resources
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * database". As required by the AVL framework, each entry contains an
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * "avl_node_t". Then, as required to implement the database, each entry
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * contains a "tavor_umap_db_common_t" structure used to contain all of the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * relevant entries.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortypedef struct tavor_umap_db_entry_s {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor avl_node_t tdbe_avlnode;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_umap_db_common_t tdbe_common;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor} tavor_umap_db_entry_t;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The tavor_umap_db_query_t structure is used in queries to the "userland
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * resources database". In addition to the "tavor_umap_db_common_t" structure
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * used to contain the various search criteria, this structure also contains
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * a flags field "tqdb_flags" which can be used to specify additional behaviors
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * (as described above). Specifically, the flags field can be used to specify
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * that an entry should be removed from the database, if found, and to
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * specify whether the database lookup should consider "tdb_instance" in the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * search.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortypedef struct tavor_umap_db_query_s {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint_t tqdb_flags;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_umap_db_common_t tqdb_common;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor} tavor_umap_db_query_t;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor_NOTE(MUTEX_PROTECTS_DATA(tavor_umap_db_s::tdl_umapdb_lock,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_umap_db_entry_s::tdbe_avlnode
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_umap_db_entry_s::tdbe_common.tdb_key
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_umap_db_entry_s::tdbe_common.tdb_value
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_umap_db_entry_s::tdbe_common.tdb_type
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_umap_db_entry_s::tdbe_common.tdb_instance))
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The tavor_devmap_track_t structure contains all the necessary information
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * to track resources that have been mapped through devmap. There is a
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * back-pointer to the Tavor softstate, the logical offset corresponding with
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * the mapped resource, the size of the mapped resource (zero indicates an
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * "invalid mapping"), and a reference count and lock used to determine when
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * to free the structure (specifically, this is necessary to handle partial
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * unmappings).
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortypedef struct tavor_devmap_track_s {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor tavor_state_t *tdt_state;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint64_t tdt_offset;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint_t tdt_size;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor int tdt_refcnt;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor kmutex_t tdt_lock;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor} tavor_devmap_track_t;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* Defined in tavor_umap.c */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorint tavor_devmap(dev_t dev, devmap_cookie_t dhp, offset_t off, size_t len,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor size_t *maplen, uint_t model);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Tayloribt_status_t tavor_umap_ci_data_in(tavor_state_t *state,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_ci_data_flags_t flags, ibt_object_type_t object, void *hdl,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor void *data_p, size_t data_sz);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Tayloribt_status_t tavor_umap_ci_data_out(tavor_state_t *state,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ibt_ci_data_flags_t flags, ibt_object_type_t object, void *hdl,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor void *data_p, size_t data_sz);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorvoid tavor_umap_db_init(void);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorvoid tavor_umap_db_fini(void);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylortavor_umap_db_entry_t *tavor_umap_db_alloc(uint_t instance, uint64_t key,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint_t type, uint64_t value);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorvoid tavor_umap_db_free(tavor_umap_db_entry_t *umapdb);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorvoid tavor_umap_db_add(tavor_umap_db_entry_t *umapdb);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorvoid tavor_umap_db_add_nolock(tavor_umap_db_entry_t *umapdb);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorint tavor_umap_db_find(uint_t instance, uint64_t key, uint_t type,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint64_t *value, uint_t flags, tavor_umap_db_entry_t **umapdb);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorint tavor_umap_db_find_nolock(uint_t instance, uint64_t key, uint_t type,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor uint64_t *value, uint_t flags, tavor_umap_db_entry_t **umapdb);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorvoid tavor_umap_umemlock_cb(ddi_umem_cookie_t *umem_cookie);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorint tavor_umap_db_set_onclose_cb(dev_t dev, uint64_t flag,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor void (*callback)(void *), void *arg);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorint tavor_umap_db_clear_onclose_cb(dev_t dev, uint64_t flag);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorvoid tavor_umap_db_handle_onclose_cb(tavor_umap_db_priv_t *priv);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#ifdef __cplusplus
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#endif
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#endif /* _SYS_IB_ADAPTERS_TAVOR_H */