1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License"). You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22 /*
23 * Copyright (c) 1995-1999 by Sun Microsystems, Inc.
24 * All rights reserved.
25 */
26
27 #include <sys/types.h>
28 #include <sys/systm.h>
29 #include <sys/user.h>
30 #include <sys/buf.h>
31 #include <sys/file.h>
32 #include <sys/uio.h>
33 #include <sys/conf.h>
34 #include <sys/stat.h>
35 #include <sys/autoconf.h>
36 #include <sys/vtoc.h>
37 #include <sys/dkio.h>
38 #include <sys/ddi.h>
39 #include <sys/sunddi.h>
40 #include <sys/ddi_impldefs.h>
41 #include <sys/kstat.h>
42 #include <sys/kmem.h>
43 #include <sys/modctl.h>
44 #include <sys/kobj.h>
45
46 #include <sys/pctypes.h>
47 #include <pcmcia/sys/cs_types.h>
48 #include <pcmcia/sys/cis.h>
49 #include <pcmcia/sys/cis_handlers.h>
50
51 /*
52 *
53 * The following speed tables are used by cistpl_devspeed() to generate
54 * device speeds from tuple data.
55 *
56 * Define the device speed table. For a description of this table's contents,
57 * see PCMCIA Release 2.01 Card Metaformat pg. 5-14 table 5-12.
58 *
59 * All times in this table are in nS.
60 */
61 uint32_t cistpl_devspeed_table[CISTPL_DEVSPEED_MAX_TBL] = {
62 0, /* 0x00 - DSPEED_NULL */
63 250, /* 0x01 - DSPEED_250NS */
64 200, /* 0x02 - DSPEED_200NS */
65 150, /* 0x03 - DSPEED_150NS */
66 100, /* 0x04 - DSPEED_100NS */
67 0, /* 0x05 - reserved */
68 0, /* 0x06 - reserved */
69 0 /* 0x07 - use extended speed byte */
70 };
71
72 /*
73 * Define the power-of-10 table.
74 */
75 uint32_t cistpl_exspeed_tenfac[] = {
76 1, /* 10^0 */
77 10, /* 10^1 */
78 100, /* 10^2 */
79 1000, /* 10^3 */
80 10000, /* 10^4 */
81 100000, /* 10^5 */
82 1000000, /* 10^6 */
83 10000000 /* 10^7 */
84 };
85
86 /*
87 * The extended device speed code mantissa table.
88 *
89 * This table is described in PCMCIA Release 2.01 Card Metaformat
90 * pg. 5-15 table 5-13.
91 *
92 * The description of this table uses non-integer values. We multiply
93 * everything by 10 before it goes into the table, and the code
94 * will divide by 10 after it calculates the device speed.
95 */
96 uint32_t cistpl_devspeed_man[CISTPL_DEVSPEED_MAX_MAN] = {
97 0, /* no units */
98 10, /* no units */
99 12, /* no units */
100 13, /* no units */
101 15, /* no units */
102 20, /* no units */
103 25, /* no units */
104 30, /* no units */
105 35, /* no units */
106 40, /* no units */
107 45, /* no units */
108 50, /* no units */
109 55, /* no units */
110 60, /* no units */
111 70, /* no units */
112 80, /* no units */
113 };
114
115 /*
116 * The extended device speed code exponent table.
117 *
118 * This table is described in PCMCIA Release 2.01 Card Metaformat
119 * pg. 5-15 table 5-13.
120 *
121 * The description of this table uses various timing units. This
122 * table contains all times in nS.
123 */
124 uint32_t cistpl_devspeed_exp[CISTPL_DEVSPEED_MAX_EXP] = {
125 1, /* 1 nS */
126 10, /* 10 nS */
127 100, /* 100 nS */
128 1000, /* 1000 nS */
129 10000, /* 10000 nS */
130 100000, /* 100000 nS */
131 1000000, /* 1000000 nS */
132 10000000 /* 10000000 nS */
133 };
134
135 /*
136 * The power description mantissa table.
137 *
138 * This table is described in PCMCIA Release 2.01 Card Metaformat
139 * pg. 5-28 table 5-32.
140 *
141 * The description of this table uses non-integer values. We multiply
142 * everything by 10 before it goes into the table, and the code
143 * will divide by 10 after it calculates the device power.
144 */
145 uint32_t cistpl_pd_man[] = {
146 10, /* no units */
147 12, /* no units */
148 13, /* no units */
149 15, /* no units */
150 20, /* no units */
151 25, /* no units */
152 30, /* no units */
153 35, /* no units */
154 40, /* no units */
155 45, /* no units */
156 50, /* no units */
157 55, /* no units */
158 60, /* no units */
159 70, /* no units */
160 80, /* no units */
161 90, /* no units */
162 };
163
164 /*
165 * The power description exponent table.
166 *
167 * This table is described in PCMCIA Release 2.01 Card Metaformat
168 * pg. 5-28 table 5-32.
169 *
170 * The description of this table uses various voltage and current units.
171 * This table contains all currents in nanoAMPS and all voltages
172 * in microVOLTS.
173 *
174 * Note if you're doing a current table lookup, you need to multiply
175 * the lookup value by ten.
176 */
177 uint32_t cistpl_pd_exp[] = {
178 10, /* 10 microVOLTS, 100 nanoAMPS */
179 100, /* 100 microVOLTS, 1000 nanoAMPS */
180 1000, /* 1000 microVOLTS, 10000 nanoAMPS */
181 10000, /* 10000 microVOLTS, 100000 nanoAMPS */
182 100000, /* 100000 microVOLTS, 1000000 nanoAMPS */
183 1000000, /* 1000000 microVOLTS, 10000000 nanoAMPS */
184 10000000, /* 10000000 microVOLTS, 100000000 nanoAMPS */
185 100000000 /* 100000000 microVOLTS, 1000000000 nanoAMPS */
186 };
187
188 /*
189 * Fill out the structure pointers.
190 */
191 cistpl_devspeed_struct_t cistpl_devspeed_struct = {
192 cistpl_devspeed_table,
193 cistpl_exspeed_tenfac,
194 cistpl_devspeed_man,
195 cistpl_devspeed_exp,
196 };
197
198 cistpl_pd_struct_t cistpl_pd_struct = {
199 cistpl_pd_man,
200 cistpl_pd_exp,
201 };
202
203 /*
204 * Some handy lookup tables that should probably eventually be
205 * done away with.
206 *
207 * These are used mostly by the CISTPL_CFTABLE_ENTRY tuple handler.
208 */
209 uint32_t cistpl_cftable_io_size_table[] = {
210 0,
211 1,
212 2,
213 4,
214 };
215
216 uint32_t cistpl_cftable_shift_table[] = {
217 0,
218 8,
219 16,
220 24,
221 };
222
223 /*
224 * List of tuples in the global CIS to ignore if they show
225 * up in both the global and function-specific CIS lists.
226 * This list MUST end with CISTPL_NULL.
227 */
228 cistpl_ignore_list_t cistpl_ignore_list[] = {
229 { CISTPL_FUNCID },
230 { CISTPL_FUNCE },
231 { CISTPL_CONFIG },
232 { CISTPL_CFTABLE_ENTRY },
233 { CISTPL_NULL } /* list must end with CISTPL_NULL */
234 };