summaryrefslogtreecommitdiff
path: root/usr/src/uts/sun4v/io/niumx/niumx_var.h
blob: 792287ff7333a35a6f578676d617439d5ba581cb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef	_SYS_NIUMX_VAR_H
#define	_SYS_NIUMX_VAR_H

#ifdef	__cplusplus
extern "C" {
#endif

typedef enum {	/* same sequence as niumx_debug_sym[] */
	/*  0 */ NIUMX_DBG_ATTACH,
	/*  1 */ NIUMX_DBG_MAP,
	/*  2 */ NIUMX_DBG_CTLOPS,
	/*  3 */ NIUMX_DBG_INTROPS,
	/*  4 */ NIUMX_DBG_A_INTX,
	/*  5 */ NIUMX_DBG_R_INTX,
	/*  6 */ NIUMX_DBG_INTR,
	/*  7 */ NIUMX_DBG_DMA_ALLOCH,
	/*  8 */ NIUMX_DBG_DMA_BINDH,
	/*  9 */ NIUMX_DBG_DMA_UNBINDH,
	/* 10 */ NIUMX_DBG_CHK_MOD
} niumx_debug_bit_t;

#if defined(DEBUG)
#define	DBG niumx_dbg
extern void niumx_dbg(niumx_debug_bit_t bit, dev_info_t *dip, char *fmt, ...);
#else
#define	DBG 0 &&
#endif	/* DEBUG */

typedef uint64_t niudevhandle_t;
#define	NIUMX_DEVHDLE_MASK	0xFFFFFFF
typedef uint32_t niucpuid_t;
typedef uint32_t niudevino_t;
typedef	uint64_t niusysino_t;

/*
 * The following structure represents an interrupt handler control block for
 * each interrupt added via ddi_intr_add_handler().
 */
typedef struct niumx_ih {
	dev_info_t	*ih_dip;	/* devinfo structure */
	uint32_t	ih_inum;	/* interrupt index, from leaf */
	niusysino_t	ih_sysino;	/* System virtual inumber, from HV */
	niucpuid_t	ih_cpuid;	/* cpu that ino is targeting */
	int		ih_state;	/* interrupt valid state */
	int		ih_pri;		/* interrupt priority */
	uint_t		(*ih_hdlr)();	/* interrupt handler */
	caddr_t		ih_arg1;	/* interrupt handler argument #1 */
	caddr_t		ih_arg2;	/* interrupt handler argument #2 */
	struct niumx_ih	*ih_next;	/* next in the chain */
} niumx_ih_t;

#define	NIUMX_MAX_INTRS			64

#define	NIUMX_SOFT_STATE_OPEN		1
#define	NIUMX_SOFT_STATE_OPEN_EXCL	2
#define	NIUMX_SOFT_STATE_CLOSED		4


typedef struct niumx_devstate {
	dev_info_t *dip;
	int niumx_soft_state;
	int niumx_open_count;
	niudevhandle_t	niumx_dev_hdl;	/* device handle */
	kmutex_t niumx_mutex;
	int niumx_fm_cap;
	ddi_iblock_cookie_t niumx_fm_ibc;
	niumx_ih_t niumx_ihtable[NIUMX_MAX_INTRS];
} niumx_devstate_t;

/*
 * flags for overloading dmai_inuse field of the dma request structure:
 */
#define	dmai_pfnlst		dmai_iopte
#define	dmai_pfn0		dmai_sbi
#define	dmai_roffset		dmai_pool

#define	NIUMX_PAGE_SHIFT		13
#define	NIUMX_PAGE_SIZE		(1 << NIUMX_PAGE_SHIFT)
#define	NIUMX_PAGE_MASK		~(NIUMX_PAGE_SIZE - 1)
#define	NIUMX_PAGE_OFFSET		(NIUMX_PAGE_SIZE - 1)
#define	NIUMX_PTOB(x)		(((uint64_t)(x)) << NIUMX_PAGE_SHIFT)

/* for "ranges" property */
typedef struct niumx_ranges {
	uint32_t child_hi;
	uint32_t child_lo;
	uint32_t parent_hi;
	uint32_t parent_lo;
	uint32_t size_hi;
	uint32_t size_lo;
} niumx_ranges_t;

/* IPL of 6 for networking devices */
#define	NIUMX_DEFAULT_PIL	6

typedef struct {
	uint32_t addr_high;
	uint32_t addr_low;
	uint32_t size_high;
	uint32_t size_low;
} niu_regspec_t;

/*
 * HV INTR  API versioning.
 *
 * Currently NIU nexus driver supports version 1.0
 */
#define	NIUMX_INTR_MAJOR_VER_1	0x1ull
#define	NIUMX_INTR_MAJOR_VER	NIUMX_INTR_MAJOR_VER_1

#define	NIUMX_INTR_MINOR_VER_0	0x0ull
#define	NIUMX_INTR_MINOR_VER	NIUMX_INTR_MINOR_VER_0

#define	NIUMX_NAMEINST(dip)   ddi_driver_name(dip), ddi_get_instance(dip)
#define	NIUMX_DIP_TO_HANDLE(dip) \
		((niumx_devstate_t *)NIUMX_DIP_TO_STATE(dip))->niumx_dev_hdl
#define	NIUMX_DIP_TO_INST(dip)	ddi_get_instance(dip)
#define	NIUMX_INST_TO_STATE(inst)	ddi_get_soft_state(niumx_state, inst)
#define	NIUMX_DIP_TO_STATE(dip)	NIUMX_INST_TO_STATE(NIUMX_DIP_TO_INST(dip))
#define	NIUMX_DEV_TO_SOFTSTATE(dev) \
	((pci_t *)ddi_get_soft_state(niumx_state, \
	PCI_MINOR_NUM_TO_INSTANCE(getminor(dev))))

#ifdef	__cplusplus
}
#endif

#endif	/* _SYS_NIUMX_VAR_H */