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
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
|
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (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 2000-2001, 2003 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _SYS_HPC3130_DAK_H
#define _SYS_HPC3130_DAK_H
#pragma ident "%Z%%M% %I% %E% SMI"
#ifdef __cplusplus
extern "C" {
#endif
#if defined(_KERNEL)
#include <sys/i2c/clients/i2c_client.h>
/* masks */
#define HPC3130_PROTECT_ON 0x01 /* (R/W) protection enable mechanism */
#define HPC3130_SYSM66STAT 0x02 /* (R) indicates bus runs at 66Mhz */
#define HPC3130_SEQUENCING 0x0c /* (R/W) hotplug sequencing mode */
#define HPC3130_MANUAL_SEQ 0x00 /* controle with idividual register calls */
#define HPC3130_AUTO1_SEQ 0x04 /* enable CBT before disable RST# */
#define HPC3130_AUTO2_SEQ 0x08 /* enable CBT after disable RST# */
#define HPC3130_GCR 0x00
#define HPC3130_STATUS 0x01
#define HPC3130_CONTROL 0x02
#define HPC3130_ATTEN 0x03
#define HPC3130_EVENT_STATUS 0x06
#define HPC3130_INTERRUPT 0x07
#define HPC3130_NO_REGISTER 0xff
/*
* masks
*/
#define HPC3130_PRSNT1 0x01 /* (R) Logic level of PRSNT1# signal */
#define HPC3130_PRSNT2 0x02 /* (R) Logic level of PRSNT2# signal */
#define HPC3130_DETECT0 0x04 /* (R) Logic level of DETECT0# signal */
#define HPC3130_DETECT1 0x08 /* (R) Logic level of DETECT1# signal */
#define HPC3130_PWRFAULT 0x10 /* (R) Logic level of PWRFAULT# signal */
#define HPC3130_PWRGOOD 0x20 /* (R) Logic level of PWRGOOD# signal */
#define HPC3130_M66EN 0x40 /* (R) Logic level of M66EN terminal */
#define HPC3130_BUSON 0x80 /* (R) Logic level of BUSON# signal */
/*
* more masks
*/
/* (R/W) Logical level of SLOTRST# (used to reset a slot) */
#define HPC3130_SLOTRST 0x01
/* (R/W) Logical level of CLKON# (used to control clock signal) */
#define HPC3130_CLKON 0x02
/* (R/W) Logical level of REQ64ON# signal */
#define HPC3130_REQ64 0x04
/* (R/W) Logical level of SLOTREQ64# signal */
#define HPC3130_SLOTREQ64 0x08
/* (R/W) Bus control (for auto sequence level==1?disconnect:connect */
#define HPC3130_BUS_CTL 0x10
/* (R/W) Logical level of power control on the slot */
#define HPC3130_SLTPWRCTL 0x20
#define HPC3130_ATTN0 0x00
#define HPC3130_ATTN1 0x01
#define HPC3130_LED_FAULT HPC3130_ATTN1
#define HPC3130_LED_OK2REM HPC3130_ATTN0
#define HPC3130_ATTN_MASK(led) (3<<(HPC3130_ATTN_SHIFT(led))) /* 3 or c */
#define HPC3130_ATTN_SHIFT(led) (led<<1) /* 0 or 2 */
#define HPC3130_ATTN_OFF 0x00
#define HPC3130_ATTN_SLO 0x01 /* not used by Daktari */
#define HPC3130_ATTN_FST 0x02
#define HPC3130_ATTN_ON 0x03
/*
* These two macros map between the Hot Plug Services LED constants
* (cf. uts/common/sys/hotplug/hpctrl.h) and the values used by the
* HPC3130 hardware.
*/
static char hpc3130_to_hpc_led_map[] = {
HPC_LED_OFF, HPC_LED_BLINK, HPC_LED_BLINK, HPC_LED_ON
};
static char hpc3130_from_hpc_led_map[] = {
HPC3130_ATTN_OFF, HPC3130_ATTN_ON, HPC3130_ATTN_FST
};
#define HPC3130_TO_HPC_LED(val) (hpc3130_to_hpc_led_map[val])
#define HPC3130_FROM_HPC_LED(val) (hpc3130_from_hpc_led_map[val])
#define HPC3130_MAX_SLOT 0x4
#define HPC3130_TABLE_COLUMNS 3 /* number of colums in slot-table property */
#define HPC3130_DEBOUNCE_COUNT 2 /* consecutive equal readings == debounced */
#define HPC3130_DEBOUNCE_LIMIT 1000 /* hard upper limit on debouce code */
#define HPC3130_POWER_TRIES 3 /* Try this may times to connect/disconnect */
#define HPC3130_ADEQUATE_PAUSE 25000 /* usec delay for connect sequence */
/*
* This structure defines an element of the controller's
* slot table array
*/
typedef struct hpc3130_slot_table_entry hpc3130_slot_table_entry_t;
typedef struct hpc3130_callback_arg hpc3130_callback_arg_t;
struct hpc3130_callback_arg {
caddr_t handle;
caddr_t statep;
uint8_t offset;
};
struct hpc3130_slot_table_entry {
hpc_slot_info_t hpc3130_slot_info;
hpc_slot_t hpc3130_slot_handle;
char nexus[MAXNAMELEN];
hpc3130_callback_arg_t callback_info;
};
/*
* The soft state structure
*/
struct hpc3130_unit {
dev_info_t *dip;
hpc_slot_ops_t *hpc3130_slot_ops;
/*
* the following fields hold the value of the "slot-table"
* property for this controller
*/
caddr_t hpc3130_slot_table_data;
int hpc3130_slot_table_size;
/*
* the following fields represent the array of hot-plug
* slots derived from the "slot-table" property
*/
hpc3130_slot_table_entry_t *hpc3130_slot_table;
int hpc3130_slot_table_length;
/*
* Mutex associated with this structure
*/
kmutex_t hpc3130_mutex;
/*
* Trap interrupt cookie
*/
ddi_iblock_cookie_t ic_trap_cookie;
/*
* Open flag
*/
int hpc3130_oflag;
/*
* An integer field describing the type
* of slots (PCI/SBD).
*/
hpc3130_slot_type_t slots_are;
/*
* A place to put the name of this driver
* What gets put here is "hpc3130n" - where
* n is the instance number.
*/
char hpc3130_name[16];
/*
* The handle within the I2C nexus that this instance
* represents.
*/
i2c_client_hdl_t hpc3130_hdl;
/*
* condition variable used to throttle power OK signal
*/
kcondvar_t hpc3130_cond;
/*
* Present vector - if B_TRUE there is a card in the corresponding
* slot.
*/
boolean_t present[HPC3130_MAX_SLOT];
/*
* Power vector - if B_TRUE, then power is applied to the slot
*/
boolean_t power[HPC3130_MAX_SLOT];
/*
* Enable vector - if B_TRUE the slot is enabled.
*/
boolean_t enabled[HPC3130_MAX_SLOT];
/*
* LED state indicators.
*/
char fault_led[HPC3130_MAX_SLOT];
char ok2rem_led[HPC3130_MAX_SLOT];
/* For poll(9e)/ioctl(HPC3130_GET_SOFT_EVENT */
uint_t events[HPC3130_MAX_SLOT];
pollhead_t pollhead[HPC3130_MAX_SLOT];
};
typedef struct hpc3130_unit hpc3130_unit_t;
#endif /* _KERNEL */
#ifdef __cplusplus
}
#endif
#endif /* _SYS_HPC3130_DAK_H */
|