summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/pcmcia/sys/cis_handlers.h
blob: 4f61ea28fb19a52ee5d80bc11051be99b7cea6cd (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
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
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
/*
 * 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 (c) 1995-2001 by Sun Microsystems, Inc.
 * All rights reserved.
 */

#ifndef _CIS_HANDLERS_H
#define	_CIS_HANDLERS_H

#pragma ident	"%Z%%M%	%I%	%E% SMI"

#ifdef	__cplusplus
extern "C" {
#endif

/*
 * This is the CIS tuple handler header file.
 *
 * Each tuple that we recognize and are prepared to handle is assigned a
 *	cistpl_callout_t structure.  This lets us specify a handler for
 *	this tuple, as well as flags that describe this tuple and which
 *	are used by the CIS interpreter and tuple parser.
 */
typedef struct cistpl_callout_t {
    cisdata_t	type;		/* type of tuple */
    cisdata_t	subtype;	/* only used for CISTPL_FUNCE */
    uint32_t	flags;		/* misc flags */
    uint32_t	(*handler)();	/* tuple handler */
    char	*text;		/* name of tuple */
} cistpl_callout_t;

/*
 * Flags that are used by a tuple handler to specify what action it
 *	should perform.
 */
#define	HANDTPL_NOERROR		0x000000000 /* no error */
#define	HANDTPL_SET_FLAGS	0x000000001 /* set tuple flags */
#define	HANDTPL_COPY_DONE	0x000000002 /* tuple data copy is done */
#define	HANDTPL_PARSE_LTUPLE	0x000000004 /* parse tuple, return opt data */
#define	HANDTPL_RETURN_NAME	0x000000008 /* return tuple name string */

/*
 * This flag is returned by tuple handlers if they encounter an error. It
 *	is returned by cis_list_lcreate if any of the tuple handlers have
 *	return an error while processing the CIS.
 *
 * Note that the following bit is reserved:
 *		#define	BAD_CIS_ADDR	0x080000000
 *	It appears in cis.h and is used to indicate that cis_list_create
 *	tried to read past the end of the mapped in CIS space.
 */
#define	HANDTPL_ERROR		0x001000000 /* handler returned an error */

/*
 * General-use constants and macros that aren't specific to a tuple.
 */
#define	CISTPL_EXT_BIT	0x080		/* additional extension bytes follow */

/*
 * Constants, macros and structures used by cistpl_devspeed and
 *	cis_convert_devspeed functions.
 */
#define	CISTPL_DEVSPEED_TABLE	0x000000001 /* use the device speed table */
#define	CISTPL_DEVSPEED_EXT	0x000000002 /* use the extended speed table */
#define	CISTPL_DEVSPEED_MAX_TBL	8 		/* max devspeed table entries */
#define	CISTPL_DEVSPEED_MAX_EXP	8		/* max exponent entries */
#define	CISTPL_DEVSPEED_MAX_MAN	16		/* max mantissa entries */
#define	CISTPL_DEVSPEED_TBL(t)	cistpl_devspeed_struct.table[(t) &	\
						(CISTPL_DEVSPEED_MAX_TBL - 1)]
#define	CISTPL_DEVSPEED_MAN(m)	cistpl_devspeed_struct.mantissa[(m) &	\
						(CISTPL_DEVSPEED_MAX_MAN - 1)]
#define	CISTPL_DEVSPEED_EXP(e)	cistpl_devspeed_struct.exponent[(e) &	\
						(CISTPL_DEVSPEED_MAX_EXP - 1)]
typedef struct cistpl_devspeed_struct_t {
	uint32_t	*table;
	uint32_t	*tenfac;
	uint32_t	*mantissa;
	uint32_t	*exponent;
} cistpl_devspeed_struct_t;

/*
 * Constants, flags and structure typedefs that are used by specific tuples.
 *
 * CISTPL_DEVICE, CISTPL_DEVICE_A, CISTPL_DEVICE_OC and CISTPL_DEVICE_OA
 */
#define	CISTPL_DEVICE_DTYPE_NULL	0x00	/* a NULL device (hole) */
#define	CISTPL_DEVICE_DTYPE_ROM		0x01	/* device is of type ROM */
#define	CISTPL_DEVICE_DTYPE_OTPROM	0x02	/* device is of type OTPROM */
#define	CISTPL_DEVICE_DTYPE_EPROM	0x03	/* device is of type EPROM */
#define	CISTPL_DEVICE_DTYPE_EEPROM	0x04	/* device is of type EEPROM */
#define	CISTPL_DEVICE_DTYPE_FLASH	0x05	/* device is of type FLASH */
#define	CISTPL_DEVICE_DTYPE_SRAM	0x06	/* device is of type SRAM */
#define	CISTPL_DEVICE_DTYPE_DRAM	0x07	/* device is of type DRAM */
#define	CISTPL_DEVICE_DTYPE_RSVD_8	0x08	/* reserved */
#define	CISTPL_DEVICE_DTYPE_RSVD_9	0x09	/* reserved */
#define	CISTPL_DEVICE_DTYPE_RSVD_a	0x0a	/* reserved */
#define	CISTPL_DEVICE_DTYPE_RSVD_b	0x0b	/* reserved */
#define	CISTPL_DEVICE_DTYPE_RSVD_c	0x0c	/* reserved */
#define	CISTPL_DEVICE_DTYPE_FUNCSPEC	0x0d	/* device is of type FUNCSPEC */
#define	CISTPL_DEVICE_DTYPE_EXTEND	0x0e	/* device is of type extended */
#define	CISTPL_DEVICE_DTYPE_RSVD_f	0x0f	/* reserved */

/*
 * Flags for cistpl_device_node_t->flags member for CISTPL_DEVICE
 *	and CISTPL_DEVICE_A tuples
 */
#define	CISTPL_DEVICE_WPS		0x00000001	/* WPS bit is set */
/*
 * Flags and values for cistpl_device_node_t->flags member for
 *	CISTPL_DEVICE_OC and CISTPL_DEVICE_OA tuples
 */
#define	CISTPL_DEVICE_OC_MWAIT		0x00010000	/* use MWAIT */
#define	CISTPL_DEVICE_OC_Vcc_MASK	0x00060000	/* mask for Vcc value */
#define	CISTPL_DEVICE_OC_Vcc5		0x00000000	/* 5.0 volt operation */
#define	CISTPL_DEVICE_OC_Vcc33		0x00020000	/* 3.3 volt operation */
#define	CISTPL_DEVICE_OC_VccXX		0x00040000	/* X.X volt operation */
#define	CISTPL_DEVICE_OC_VccYY		0x00060000	/* Y.Y volt operation */
/*
 * CISTPL_DEVICE_MAX_DEVICES defines the maximum number of devices that
 *	we can parse in a CISTPL_DEVICE{...} tuple
 */
#define	CISTPL_DEVICE_MAX_DEVICES	10

/*
 * CISTPL_DEVICE_SPEED_SIZE_IGNORE if the device speed is set to this, then
 *	ignore the speed and size values
 */
#define	CISTPL_DEVICE_SPEED_SIZE_IGNORE	0x0ff	/* ignore size and speed info */

typedef struct cistpl_device_node_t {
	uint32_t	flags;	/* flags specific to this device */
	uint32_t	speed;	/* device speed in device speed code format */
	uint32_t	nS_speed; /* device speed in nS */
	uint32_t	type;	/* device type */
	uint32_t	size;	/* device size */
	uint32_t	size_in_bytes; /* device size in bytes */
} cistpl_device_node_t;

typedef struct cistpl_device_t {
	uint32_t		num_devices; /* number of devices found */
	cistpl_device_node_t	devnode[CISTPL_DEVICE_MAX_DEVICES];
} cistpl_device_t;

/*
 * CISTPL_CONFIG
 */
#define	MAKE_CONFIG_REG_ADDR(base, reg)	(base + (reg * 2))
#define	CISTPL_CONFIG_MAX_CONFIG_REGS	128 /* max num config regs */
typedef struct cistpl_config_t {
    uint32_t	present;	/* register present flags */
    uint32_t	nr;		/* number of config registers found */
    uint32_t	hr;		/* highest config register index found */
    uint32_t	regs[CISTPL_CONFIG_MAX_CONFIG_REGS];	/* reg offsets */
    uint32_t	base;		/* base offset of config registers */
    uint32_t	last;		/* last config index */
} cistpl_config_t;

/*
 * CISTPL_VERS_1
 */
#define	CISTPL_VERS_1_MAX_PROD_STRINGS	4 /* max number product strings */
typedef struct cistpl_vers_1_t {
    uint32_t	major;		/* major version number */
    uint32_t	minor;		/* minor version number */
    uint32_t	ns;		/* number of information strings */
				/* pointers to product information strings */
    char	pi[CISTPL_VERS_1_MAX_PROD_STRINGS][CIS_MAX_TUPLE_DATA_LEN];
} cistpl_vers_1_t;

/*
 * CISTPL_VERS_2
 */
typedef struct cistpl_vers_2_t {
    uint32_t	vers;		/* version number */
    uint32_t	comply;		/* level of compliance */
    uint32_t	dindex;		/* byte address of first data byte in card */
    uint32_t	reserved;	/* two reserved bytes */
    uint32_t	vspec8;		/* vendor specific (byte 8) */
    uint32_t	vspec9;		/* vendor specific (byte 9) */
    uint32_t	nhdr;		/* number of copies of CIS present on device */
    char	oem[CIS_MAX_TUPLE_DATA_LEN];	/* Vendor of software that */
							/* formatted card */
    char	info[CIS_MAX_TUPLE_DATA_LEN];	/* Informational message */
							/* about card */
} cistpl_vers_2_t;

/*
 * CISTPL_JEDEC_A and CISTPL_JEDEC_C
 */
#define	CISTPL_JEDEC_MAX_IDENTIFIERS	4
typedef struct jedec_ident_t {
	uint32_t	id;	/* manufacturer id */
	uint32_t	info;	/* manufacturer specific info */
} jedec_ident_t;

typedef struct cistpl_jedec_t {
	uint32_t	nid;		/* # of JEDEC identifiers present */
	jedec_ident_t	jid[CISTPL_JEDEC_MAX_IDENTIFIERS];
} cistpl_jedec_t;

/*
 * CISTPL_FORMAT and CISTPL_FORMAT_A
 *
 * These tuples describe the data recording format for a region.
 */
typedef struct cistpl_format_t {
	uint32_t	type;	/* format type code */
	uint32_t	edc_length; /* error detection code length */
	uint32_t	edc_type; /* error detection code type */
	uint32_t	offset;	/* offset of first byte of data in this part */
	uint32_t	nbytes;	/* number of bytes of data in this partition */
	union {
		struct disk {
		    uint32_t	bksize; /* block size */
		    uint32_t	nblocks; /* nblocks data for disk-like device */
		    uint32_t	edcloc; /* location of error detection code */
		} disk;
		struct mem {
		    uint32_t	flags; /* various flags */
		    uint32_t	reserved; /* reserved byte */
		    caddr_t	address; /* physical addr for mem-like device */
		    uint32_t	edcloc; /* location of error detection code */
		} mem;
	} dev;
} cistpl_format_t;

/*
 * device format types
 */
#define	TPLFMTTYPE_DISK	0x00	/* disk-like format */
#define	TPLFMTTYPE_MEM	0x01	/* memory-like format */
#define	TPLFMTTYPE_VS	0x80	/* vendor specific format */

/*
 * error detection code types
 */
#define	TPLFMTEDC_NONE	0x00	/* no error detection code */
#define	TPLFMTEDC_CKSUM	0x01	/* arithmetic checksum is used */
#define	TPLFMTEDC_CRC	0x02	/* 16-bit CRC */
#define	TPLFMTEDC_PCC	0x03	/* whole-partition arithmetic checksum */
#define	TPLFMTEDC_VS	0x80	/* vendor specific error checking */

#define	EDC_LENGTH_MASK	0x07
#define	EDC_TYPE_MASK   0x0f
#define	EDC_TYPE_SHIFT	3

/*
 * flags for memory-like devices
 */
#define	TPLFMTFLAGS_ADDR	0x01	/* address is valid */
#define	TPLFMTFLAGS_AUTO	0x02	/* automatically map memory region */

/*
 * CISTPL_GEOMETRY
 */
typedef struct cistpl_geometry_t {
	uint32_t	spt;
	uint32_t	tpc;
	uint32_t	ncyl;
} cistpl_geometry_t;

/*
 * CISTPL_BYTEORDER
 */
typedef struct cistpl_byteorder_t {
	uint32_t	order;		/* byte order code */
	uint32_t	map;		/* byte mapping code */
} cistpl_byteorder_t;

/*
 * byte order and mapping codes
 */
#define	TPLBYTEORD_LOW	0x00	/* specifies little endian order */
#define	TPLBYTEORD_HIGH	0x01	/* specifies big endian order */
#define	TPLBYTEORD_VS	0x80	/* vendor specific order 0x80-0xFF */

#define	TPLBYTEMAP_LOW	0x00	/* byte zero is least significant byte */
#define	TPLBYTEMAP_HIGH	0x01	/* byte zero is most significant byte */
#define	TPLBYTEMAP_VS	0x80	/* vendor specific mapping */

/*
 * CISTPL_DATE
 */
typedef struct cistpl_date_t {
	uint32_t	time;
	uint32_t	day;
} cistpl_date_t;

/*
 * CISTPL_BATTERY
 */
typedef struct cistpl_battery_t {
	uint32_t	rday;		/* replacement date */
	uint32_t	xday;		/* expiration date */
} cistpl_battery_t;

/*
 * CISTPL_ORG
 */
typedef struct cistpl_org_t {
	uint32_t	type;		/* data organization code */
	char	desc[CIS_MAX_TUPLE_DATA_LEN];	/* text description of */
						/* this organization */
} cistpl_org_t;

/*
 * CISTPL_MANFID
 */
typedef struct cistpl_manfid_t {
	uint32_t	manf;		/* PCMCIA PC Card manufacturer code */
	uint32_t	card;		/* manufacturer information */
} cistpl_manfid_t;

/*
 * CISTPL_FUNCID
 */
typedef struct cistpl_funcid_t {
	uint32_t	function;		/* PC Card function code */
	uint32_t	sysinit;		/* system initialization mask */
} cistpl_funcid_t;

/*
 * Function types for CISTPL_FUNCID; note that the TPLFUNC_UNKNOWN is
 *	not defined by the PCMCIA standard.
 *
 * Definitions for cistpl_funcid_t->function
 */
#define	TPLFUNC_MULTI		0x000	/* vendor-specific multifunction card */
#define	TPLFUNC_MEMORY		0x001	/* memory card */
#define	TPLFUNC_SERIAL		0x002	/* serial I/O port */
#define	TPLFUNC_PARALLEL	0x003	/* parallel printer port */
#define	TPLFUNC_FIXED		0x004	/* fixed disk, silicon or removeable */
#define	TPLFUNC_VIDEO		0x005	/* video interface */
#define	TPLFUNC_LAN		0x006	/* Local Area Network adapter */
#define	TPLFUNC_AIMS		0x007	/* Auto Incrementing Mass Storage */
#define	TPLFUNC_SCSI		0x008	/* SCSI bridge */
#define	TPLFUNC_SECURITY	0x009	/* Security Cards */
#define	TPLFUNC_VENDOR_SPECIFIC	0x0fe	/* Vendor Specific */
#define	TPLFUNC_UNKNOWN		0x0ff	/* unknown function(s) */
/*
 * Definitions for cistpl_funcid_t->sysinit
 */
#define	TPLINIT_POST		0x01	/* POST should attempt configure */
#define	TPLINIT_ROM		0x02	/* map ROM during sys init */

/*
 * CISTPL_FUNCE
 */
typedef struct cistpl_funce_t {
	uint32_t	function;		/* type of extended data */
	uint32_t	subfunction;
	union {
		struct serial {
			uint32_t ua;	/* UART in use */
			uint32_t uc;	/* UART capabilities */
		} serial;
		struct modem {
			uint32_t fc;	/* supported flow control methods */
			uint32_t cb;	/* size of DCE command buffer */
			uint32_t eb;	/* size of DCE to DCE buffer */
			uint32_t tb;	/* size of DTE to DCE buffer */
		} modem;
		struct data_modem {
			uint32_t ud;	/* highest data rate */
			uint32_t ms;	/* modulation standards */
			/* err correct proto and non-CCITT modulation */
			uint32_t em;
			uint32_t dc;	/* data compression protocols */
			uint32_t cm;	/* command protocols */
			uint32_t ex;	/* escape mechanisms */
			uint32_t dy;	/* standardized data encryption */
			uint32_t ef;	/* misc. end user features */
			uint32_t ncd;	/* number of country codes */
			uchar_t cd[16];	/* CCITT country code */
		} data_modem;
		struct fax {
			uint32_t uf;	/* highest data rate in DTE/UART */
			uint32_t fm;	/* CCITT modulation standards */
			uint32_t fy;	/* standardized data encryption */
			uint32_t fs;	/* feature selection */
			uint32_t ncf; /* number of country codes */
			uchar_t cf[16];	/* CCITT country codes */
		} fax;
		struct voice {
			uint32_t uv;	/* highest data rate */
			uint32_t nsr;
			uint32_t sr[16]; /* voice sampling rates (*100) */
			uint32_t nss;
			uint32_t ss[16]; /* voice sample sizes (*10) */
			uint32_t nsc;
			uint32_t sc[16]; /* voice compression methods */
		} voice;
		struct lan {
			uint32_t tech; /* network technology */
			uint32_t speed; /* media bit or baud rate */
			uint32_t media; /* network media supported */
			uint32_t con; /* open/closed connector standard */
			uint32_t id_sz; /* length of lan station id */
			uchar_t id[16]; /* station ID */
		} lan;
	}   data;
} cistpl_funce_t;

/* serial port subfunctions */
#define	TPLFE_SUB_SERIAL	0 /* serial port */
#define	TPLFE_SUB_MODEM_COMMON	1 /* common modem interface */
#define	TPLFE_SUB_MODEM_DATA	2 /* data modem services */
#define	TPLFE_SUB_MODEM_FAX	3 /* fax modem services */
#define	TPLFE_SUB_VOICE		4 /* voice services */
/* modem subfunctions for description of capabilities */
#define	TPLFE_CAP_MODEM_DATA	5 /* data modem capabilities */
#define	TPLFE_CAP_MODEM_FAX	6 /* fax modem capabilities */
#define	TPLFE_CAP_MODEM_VOICE	7 /* voice modem capabilities */
/* serial port subfunctions for description of capabilities */
#define	TPLFE_CAP_SERIAL_DATA	8 /* serial port capabilities - data modem */
#define	TPLFE_CAP_SERIAL_FAX	9 /* serial port capabilities - fax modem */
#define	TPLFE_CAP_SERIAL_VOICE 10 /* serial port capabilities - voice */

/* serial port UART definitions */
#define	TPLFE_UA_8250		0 /* Intel 8250 */
#define	TPLFE_UA_16450		1 /* NS 16450 */
#define	TPLFE_UA_16550		2 /* NS 16550 */

/* serial port capabilities definitions */
#define	TPLFE_UC_PARITY_SPACE	0x0001 /* space parity supported */
#define	TPLFE_UC_PARITY_MARK	0x0002 /* mark parity supported */
#define	TPLFE_UC_PARITY_ODD	0x0004 /* odd parity supported */
#define	TPLFE_UC_PARITY_EVEN	0x0008 /* even parity supported */
#define	TPLFE_UC_CS5		0x0100 /* 5 bit characters supported */
#define	TPLFE_UC_CS6		0x0200 /* 6 bit characters supported */
#define	TPLFE_UC_CS7		0x0400 /* 7 bit characters supported */
#define	TPLFE_UC_CS8		0x0800 /* 8 bit characters supported */
#define	TPLFE_UC_STOP_1		0x1000 /* 1 stop bit supported */
#define	TPLFE_UC_STOP_15	0x2000 /* 1.5 stop bits supported */
#define	TPLFE_UC_STOP_2		0x4000 /* 2 stop bits supported */

/* modem flow control methods */
#define	TPLFE_FC_TX_XONOFF	0x01 /* transmit XON/XOFF */
#define	TPLFE_FC_RX_XONOFF	0x02 /* receiver XON/XOFF */
#define	TPLFE_FC_TX_HW		0x04 /* transmit hardware flow control (CTS) */
#define	TPLFE_FC_RX_HW		0x08 /* receiver hardware flow control (RTS) */
#define	TPLFE_FC_TRANS		0x10 /* tranparent flow control */

/* modem modulation standards */
#define	TPLFE_MS_BELL103	0x0001 /* 300bps */
#define	TPLFE_MS_V21		0x0002 /* 300bps (V.21) */
#define	TPLFE_MS_V23		0x0004 /* 600/1200bps (V.23) */
#define	TPLFE_MS_V22AB		0x0008 /* 1200bps (V.22A V.22B) */
#define	TPLFE_MS_BELL212	0x0010 /* 2400bsp (US Bell 212) */
#define	TPLFE_MS_V22BIS		0x0020 /* 2400bps (V.22bis) */
#define	TPLFE_MS_V26		0x0040 /* 2400bps leased line (V.26) */
#define	TPLFE_MS_V26BIS		0x0080 /* 2400bps (V.26bis) */
#define	TPLFE_MS_V27BIS		0x0100 /* 4800/2400bps leased line (V.27bis) */
#define	TPLFE_MS_V29		0x0200 /* 9600/7200/4800 leased line (V.29) */
#define	TPLFE_MS_V32		0x0400 /* up to 9600bps (V.32) */
#define	TPLFE_MS_V32BIS		0x0800 /* up to 14400bps (V.32bis) */
#define	TPLFE_MS_VFAST		0x1000 /* up to 28800 V.FAST */

/* modem error correction/detection protocols */
#define	TPLFE_EM_MNP		0x01 /* MNP levels 2-4 */
#define	TPLFE_EM_V42		0x02 /* CCITT LAPM (V.42) */

/* modem data compression protocols */
#define	TPLFE_DC_V42BIS		0x01 /* CCITT compression V.42 */
#define	TPLFE_DC_MNP5		0x02 /* MNP compression (uses MNP 2, 3 or 4) */

/* modem command protocols */
#define	TPLFE_CM_AT1	0x01 /* ANSI/EIA/TIA 602 "Action" commands */
#define	TPLFE_CM_AT2	0x02 /* ANSI/EIA/TIA 602 "ACE/DCE IF Params" */
#define	TPLFE_CM_AT3	0x04 /* ANSI/EIA/TIA 602 "Ace Parameters" */
#define	TPLFE_CM_MNP_AT	0x08 /* MNP specificat AT commands */
#define	TPLFE_CM_V25BIS	0x10 /* V.25bis calling commands */
#define	TPLFE_CM_V25A	0x20 /* V.25bis test procedures */
#define	TPLFE_CM_DMCL	0x40 /* DMCL command mode */

/* modem escape mechanism */
#define	TPLFE_EX_BREAK		0x01 /* BREAK support standardized */
#define	TPLFE_EX_PLUS		0x02 /* +++ returns to command mode */
#define	TPLFE_EX_UD		0x04 /* user defined escape character */

/* modem miscellaneous features */
#define	TPLFE_EF_CALLERID	0x01 /* Caller ID is supported */

/* fax modulation standards */
#define	TPLFE_FM_V21C2	0x01 /* 300bps (V.21-C2) */
#define	TPLFE_FM_V27TER	0x02 /* 4800/2400bps (V.27ter) */
#define	TPLFE_FM_V29	0x04 /* 9600/7200/4800 leased line (V.29) */
#define	TPLFE_FM_V17	0x08 /* 14.4K/12K/9600/7200bps (V.17) */
#define	TPLFE_FM_V33	0x10 /* 14.4K/12K/9600/7200 lease line (V.33) */

/* fax feature selection */
#define	TPLFE_FS_T3		0x01 /* Group 2 (T.3) service class */
#define	TPLFE_FS_T4		0x02 /* Group 3 (T.4) service class */
#define	TPLFE_FS_T6		0x04 /* Group 4 (T.6) service class */
#define	TPLFE_FS_ECM		0x08 /* Error Correction Modeer */
#define	TPLFE_FS_VOICEREQ	0x10 /* voice requests allowed */
#define	TPLFE_FS_POLLING	0x20 /* polling support */
#define	TPLFE_FS_FTP		0x40 /* file transfer support */
#define	TPLFE_FS_PASSWORD	0x80 /* password support */

/* LAN tuple definitions */
#define	TPLFE_NETWORK_INFO	0x00

/* LAN technology types */
#define	TPLFE_LAN_TECH_ARCNET		1
#define	TPLFE_LAN_TECH_ETHERNET		2
#define	TPLFE_LAN_TECH_TOKENRING	3
#define	TPLFE_LAN_TECH_LOCALTALK	4
#define	TPLFE_LAN_TECH_FDDI		5
#define	TPLFE_LAN_TECH_ATM		6
#define	TPLFE_LAN_TECH_WIRELESS		7

/* LAN media types */
#define	TPLFE_LAN_MEDIA_INHERENT	0
#define	TPLFE_LAN_MEDIA_UTP		1
#define	TPLFE_LAN_MEDIA_STP		2
#define	TPLFE_LAN_MEDIA_THIN_COAX	3
#define	TPLFE_LAN_MEDIA_THICK_COAX	4
#define	TPLFE_LAN_MEDIA_FIBER		5
#define	TPLFE_LAN_MEDIA_SSR_902		6
#define	TPLFE_LAN_MEDIA_SSR_2_4		7
#define	TPLFE_LAN_MEDIA_SSR_5_4		8
#define	TPLFE_LAN_MEDIA_DIFFUSE_IR	9
#define	TPLFE_LAN_MEDIA_PTP_IR		10

/*
 * CISTPL_CFTABLE_ENTRY
 *
 * These flags and macros are used internally to the handler.
 */
	/* mask to get the config entry number from TPCE_INDX */
#define	CISTPL_CFTABLE_TPCE_CFGENTRYM		0x03f
		/* default config bit in TPCE_INDX */
#define	CISTPL_CFTABLE_TPCE_DEFAULTM		0x040
		/* interface config byte follows */
#define	CISTPL_CFTABLE_TPCE_IFM			0x080

		/* power bit mask for tpce_fs */
#define	CISTPL_CFTABLE_TPCE_FS_PWRM		0x003
		/* Vcc, Vpp1 and Vpp2 descriptions */
#define	CISTPL_CFTABLE_TPCE_FS_PWR_VPP2M	0x003
		/* Vcc and Vpp1=Vpp2 descriptions */
#define	CISTPL_CFTABLE_TPCE_FS_PWR_VPP1M	0x002
		/* Vcc description only */
#define	CISTPL_CFTABLE_TPCE_FS_PWR_VCCM		0x001
		/* no connection on sleep/power down */
#define	CISTPL_CFTABLE_PD_NC_SLEEPM		0x07d
		/* zero value required */
#define	CISTPL_CFTABLE_PD_ZEROM			0x07e
		/* no connection ever */
#define	CISTPL_CFTABLE_PD_NCM			0x07f

		/* timing data exists */
#define	CISTPL_CFTABLE_TPCE_FS_TDM		0x004
		/* WAIT scale mask */
#define	CISTPL_CFTABLE_TPCE_FS_TD_WAITM		0x003
#define	GET_TPCE_FS_TD_WAITS(sf)	((sf)& \
					    CISTPL_CFTABLE_TPCE_FS_TD_WAITM)
		/* RDY/BSY scale mask */
#define	CISTPL_CFTABLE_TPCE_FS_TD_RDYM		0x01c
#define	GET_TPCE_FS_TD_RDYS(sf)	(((sf)>>2)& \
					CISTPL_CFTABLE_TPCE_FS_TD_RDYM)
		/* RSVD scale mask */
#define	CISTPL_CFTABLE_TPCE_FS_TD_RSVDM		0x0e0
#define	GET_TPCE_FS_TD_RSVDS(sf)	(((sf)>>5)& \
					    CISTPL_CFTABLE_TPCE_FS_TD_RSVDM)

#define	CISTPL_CFTABLE_TPCE_FS_IOM		0x008	/* I/O data exists */
		/* I/O addr lines mask */
#define	CISTPL_CFTABLE_TPCE_FS_IO_ALM		0x01f
		/* RANGE bit in TPCE_IO */
#define	CISTPL_CFTABLE_TPCE_FS_IO_RANGEM	0x080
		/* max of 16 I/O ranges */
#define	CISTPL_CFTABLE_ENTRY_MAX_IO_RANGES	16

#define	CISTPL_CFTABLE_TPCE_FS_IRQM		0x010	/* IRQ data exists */
		/* extended IRQ mask exists */
#define	CISTPL_CFTABLE_TPCE_FS_IRQ_MASKM	0x010

#define	CISTPL_CFTABLE_TPCE_FS_MEMM		0x060	/* mem space mask */
		/* space selection byte ... */
#define	CISTPL_CFTABLE_TPCE_FS_MEM3M		0x060
		/* length (2 bytes) and card address (2 bytes) */
#define	CISTPL_CFTABLE_TPCE_FS_MEM2M		0x040
		/* single 2-byte length */
#define	CISTPL_CFTABLE_TPCE_FS_MEM1M		0x020
		/* max of 8 mem space descriptors */
#define	CISTPL_CFTABLE_ENTRY_MAX_MEM_WINDOWS	8
		/* number of bytes/page description */
#define	CISTPL_CFTABLE_TPCE_FS_MEM_PGSIZE	256
		/* host addr info present */
#define	CISTPL_CFTABLE_TPCE_FS_MEM_HOSTM	0x080

#define	CISTPL_CFTABLE_TPCE_FS_MISCM		0x080	/* misc fields mask */

/*
 * Constants, macros, structures and flags used by cistpl_pd_parse()
 *	cistpl_expd_parse() and the CISTPL_CFTABLE_ENTRY tuple handler.
 */
#define	CISTPL_PD_MAN(m)	cistpl_pd_struct.mantissa[m&15]
#define	CISTPL_PD_EXP(e)	cistpl_pd_struct.exponent[e&7]
typedef struct cistpl_pd_struct_t {
    uint32_t	*mantissa;
    uint32_t	*exponent;
} cistpl_pd_struct_t;

/*
 * These flags are passed to the caller in the cistpl_cftable_entry_t->flags
 *	field and indicate what interface information is available.  The low
 *	order byte of this field is reserved and no flags should be defined
 *	to exist there.
 */
#define	CISTPL_CFTABLE_TPCE_DEFAULT	0x000000100 /* this is a default conf */

/* interface config description present flags */
#define	CISTPL_CFTABLE_TPCE_IF		0x000000200 /* if config byte exists */
/*
 * When the CISTPL_CFTABLE_TPCE_IF flag is set, the following flags
 *	are available in the ifc member of the cistpl_cftable_entry_t
 *	structure.
 */
#define	CISTPL_CFTABLE_TPCE_IF_MEMORY	0x00	/* memory interface */
#define	CISTPL_CFTABLE_TPCE_IF_IO_MEM	0x01	/* IO and memory */
#define	CISTPL_CFTABLE_TPCE_IF_RSVD_2	0x02	/* reserved */
#define	CISTPL_CFTABLE_TPCE_IF_RSVD_3	0x03	/* reserved */
#define	CISTPL_CFTABLE_TPCE_IF_CUSTOM_0	0x04	/* custom interface 0 */
#define	CISTPL_CFTABLE_TPCE_IF_CUSTOM_1	0x05	/* custom interface 1 */
#define	CISTPL_CFTABLE_TPCE_IF_CUSTOM_2	0x06	/* custom interface 2 */
#define	CISTPL_CFTABLE_TPCE_IF_CUSTOM_3	0x07	/* custom interface 3 */
#define	CISTPL_CFTABLE_TPCE_IF_RSVD_8	0x08	/* reserved */
#define	CISTPL_CFTABLE_TPCE_IF_RSVD_9	0x09	/* reserved */
#define	CISTPL_CFTABLE_TPCE_IF_RSVD_a	0x0a	/* reserved */
#define	CISTPL_CFTABLE_TPCE_IF_RSVD_b	0x0b	/* reserved */
#define	CISTPL_CFTABLE_TPCE_IF_RSVD_c	0x0c	/* reserved */
#define	CISTPL_CFTABLE_TPCE_IF_RSVD_d	0x0d	/* reserved */
#define	CISTPL_CFTABLE_TPCE_IF_RSVD_e	0x0e	/* reserved */
#define	CISTPL_CFTABLE_TPCE_IF_RSVD_f	0x0f	/* reserved */
#define	CISTPL_CFTABLE_TPCE_IF_MASK	0x0f	/* interface type mask */
#define	CISTPL_CFTABLE_TPCE_IF_BVD	0x10	/* BVD active in PRR */
#define	CISTPL_CFTABLE_TPCE_IF_WP	0x20	/* WP active in PRR */
#define	CISTPL_CFTABLE_TPCE_IF_RDY	0x40	/* RDY active in PRR */
#define	CISTPL_CFTABLE_TPCE_IF_MWAIT	0x80	/* WAIT - mem cycles */

/* power description present flags */
#define	CISTPL_CFTABLE_TPCE_FS_PWR	0x000001000 /* power info exists */

/* timing description present flags */
#define	CISTPL_CFTABLE_TPCE_FS_TD	0x000010000 /* timing info exists */

/* I/O description present flags */
#define	CISTPL_CFTABLE_TPCE_FS_IO	0x000100000 /* I/O information exists */

/* IRQ description present flags */
#define	CISTPL_CFTABLE_TPCE_FS_IRQ	0x000200000 /* IRQ information exists */

/* memory space description present flags */
#define	CISTPL_CFTABLE_TPCE_FS_MEM	0x001000000 /* MEM space info exists */

/* misc description present flags */
#define	CISTPL_CFTABLE_TPCE_FS_MISC	0x002000000 /* MISC info exists */

/* additional information tuples present flags */
#define	CISTPL_CFTABLE_TPCE_FS_STCE_EV	0x004000000 /* STCE_EV exists */
#define	CISTPL_CFTABLE_TPCE_FS_STCE_PD	0x008000000 /* STCE_PD exists */

/*
 * Power description flags and structures.
 *
 * The following eight values represent what the power description structure
 *	parameter selection byte tells us is present.  A copy of this byte
 *	is in the low order byte of each parameter's flag field.
 */
#define	CISTPL_CFTABLE_PD_NOMV		0x001	/* nominal supply voltage */
#define	CISTPL_CFTABLE_PD_MINV		0x002	/* minimum supply voltage */
#define	CISTPL_CFTABLE_PD_MAXV		0x004	/* maximum supply voltage */
#define	CISTPL_CFTABLE_PD_STATICI	0x008	/* continuous supply current */
		/* max current required averaged over 1 second */
#define	CISTPL_CFTABLE_PD_AVGI		0x010
		/* maximum current required averaged over 10mS */
#define	CISTPL_CFTABLE_PD_PEAKI		0x020
		/* power down supply curent required */
#define	CISTPL_CFTABLE_PD_PDOWNI	0x040
		/* power supply is about to blow up */
#define	CISTPL_CFTABLE_PD_RFU		0x080

/*
 * For each voltage/current parameter, there is an associated flags field.
 *	The following flags are in this field.  The low order byte of each
 *	of these flags fields also contains a copy of the power description
 *	structure parameter selection byte as read from the tuple, that's why
 *	we start the flag values at 0x0100 and go up from there.
 */
		/* this parameter exists */
#define	CISTPL_CFTABLE_PD_EXISTS	0x000000100
		/* multiply return value by 10 */
#define	CISTPL_CFTABLE_PD_MUL10		0x000000200
		/* no connection on sleep/power down */
#define	CISTPL_CFTABLE_PD_NC_SLEEP	0x000001000
		/* zero value required */
#define	CISTPL_CFTABLE_PD_ZERO		0x000002000
		/* no connection ever */
#define	CISTPL_CFTABLE_PD_NC		0x000004000

typedef struct cistpl_cftable_entry_pwr_t {
	uint32_t	nomV;		/* nominal supply voltage */
	uint32_t	nomV_flags;
	uint32_t	minV;		/* minimum supply voltage */
	uint32_t	minV_flags;
	uint32_t	maxV;		/* maximum supply voltage */
	uint32_t	maxV_flags;
	uint32_t	staticI;	/* continuous supply current */
	uint32_t	staticI_flags;
	uint32_t	avgI;		/* max current required */
					/* averaged over 1 sec. */
	uint32_t	avgI_flags;
	uint32_t	peakI;		/* max current required */
					/* averaged over 10mS */
	uint32_t	peakI_flags;
	uint32_t	pdownI;		/* power down supply curent required */
	uint32_t	pdownI_flags;
} cistpl_cftable_entry_pwr_t;

/*
 * Flags for the global power description structure.  These show up in
 *	the flags field of the structure.
 */
#define	CISTPL_CFTABLE_TPCE_FS_PWR_VCC	0x000000001 /* Vcc description valid  */
#define	CISTPL_CFTABLE_TPCE_FS_PWR_VPP1	0x000000002 /* vpp1 description valid */
#define	CISTPL_CFTABLE_TPCE_FS_PWR_VPP2	0x000000004 /* Vpp2 description valid */

typedef struct cistpl_cftable_entry_pd_t {
	uint32_t	flags; /* which descriptions are valid */
	struct cistpl_cftable_entry_pwr_t pd_vcc; /* VCC power description */
	struct cistpl_cftable_entry_pwr_t pd_vpp1; /* Vpp1 power description */
	struct cistpl_cftable_entry_pwr_t pd_vpp2; /* Vpp2 power description */
} cistpl_cftable_entry_pd_t;

/*
 * Device speed structure.  Each field is only valid if the
 *	CISTPL_CFTABLE_TPCE_FS_TD flag is set.
 *
 * The following flags describe which timing information is available.
 *	They appear in the flags field of the device speed structure.
 */
		/* WAIT timing exists */
#define	CISTPL_CFTABLE_TPCE_FS_TD_WAIT	0x000000001
		/* RDY/BSY timing exists */
#define	CISTPL_CFTABLE_TPCE_FS_TD_RDY	0x000000002
		/* RSVD timing exists */
#define	CISTPL_CFTABLE_TPCE_FS_TD_RSVD	0x000000004

typedef struct cistpl_cftable_entry_speed_t {
    uint32_t	flags;		/* which timing information is present */
    uint32_t	wait;		/* max WAIT time in device speed format */
    uint32_t	nS_wait;	/* max WAIT time in nS */
    uint32_t	rdybsy;		/* max RDY/BSY time in device speed format */
    uint32_t	nS_rdybsy;	/* max RDY/BSY time in nS */
    uint32_t	rsvd;		/* max RSVD time in device speed format */
    uint32_t	nS_rsvd;	/* max RSVD time in nS */
} cistpl_cftable_entry_speed_t;

/*
 * Device I/O range description structures.  Only valid if the
 *	CISTPL_CFTABLE_TPCE_FS_IO flag is set.
 *
 * The following flags describe the IO description information. They
 *	appear in the flags field of the IO space description structure.
 */
#define	CISTPL_CFTABLE_TPCE_FS_IO_BUS	0x060	/* bus width mask */
#define	CISTPL_CFTABLE_TPCE_FS_IO_BUS8	0x020	/* 8-bit flag */
#define	CISTPL_CFTABLE_TPCE_FS_IO_BUS16	0x040	/* 16-bit flag */
#define	CISTPL_CFTABLE_TPCE_FS_IO_RANGE	0x080	/* IO address ranges exist */

typedef struct cistpl_cftable_entry_io_range_t {
    uint32_t	addr;		/* I/O start address */
    uint32_t	length;		/* I/O register length */
} cistpl_cftable_entry_io_range_t;
typedef struct cistpl_cftable_entry_io_t {
    uint32_t	flags;		/* direct copy of TPCE_IO byte in tuple */
    uint32_t	addr_lines;	/* number of decoded I/O address lines */
    uint32_t	ranges;		/* number of I/O ranges */
    struct cistpl_cftable_entry_io_range_t
	    range[CISTPL_CFTABLE_ENTRY_MAX_IO_RANGES];
} cistpl_cftable_entry_io_t;

/*
 * Device IRQ description structure.  Only valid if the
 *	CISTPL_CFTABLE_TPCE_FS_IRQ flag is set.
 */
typedef struct cistpl_cftable_entry_irq_t {
    uint32_t	flags;		/* direct copy of TPCE_IR byte in tuple */
    uint32_t	irqs;		/* bit mask for each allowed IRQ */
} cistpl_cftable_entry_irq_t;

/*
 * Device memory space description structure.  Only valid if the
 *	CISTPL_CFTABLE_TPCE_FS_MEM flag is set.
 *
 * The following flags describe the memory description information.  They
 *	appear in the flags field of the memory space description structure.
 */
		/* space descriptors */
#define	CISTPL_CFTABLE_TPCE_FS_MEM3	0x000000001
		/* host_addr=card_addr */
#define	CISTPL_CFTABLE_TPCE_FS_MEM2	0x000000002
		/* card address=0, any host address */
#define	CISTPL_CFTABLE_TPCE_FS_MEM1	0x000000004
		/* if host address is present in MEM3 */
#define	CISTPL_CFTABLE_TPCE_FS_MEM_HOST	0x000000008

typedef struct cistpl_cftable_entry_mem_window_t {
    uint32_t	length;		/* length of this window */
    uint32_t	card_addr;	/* card address */
    uint32_t	host_addr;	/* host address */
} cistpl_cftable_entry_mem_window_t;
typedef struct cistpl_cftable_entry_mem_t {
    uint32_t	flags;		/* memory desc type and host addr info */
    uint32_t	windows;	/* number of memory space descriptors */
    cistpl_cftable_entry_mem_window_t
	    window[CISTPL_CFTABLE_ENTRY_MAX_MEM_WINDOWS];
} cistpl_cftable_entry_mem_t;

/*
 * Devices misc description structure.  Only valid if the
 *	CISTPL_CFTABLE_TPCE_FS_MISC flag is set.
 */
#define	CISTPL_CFTABLE_TPCE_FS_MISC_MAX	2	   /* # bytes we understand */
#define	CISTPL_CFTABLE_TPCE_MI_MTC_MASK	0x00000007 /* max twin cards mask */
#define	CISTPL_CFTABLE_TPCE_MI_AUDIO	0x00000008 /* audio on BVD2 */
#define	CISTPL_CFTABLE_TPCE_MI_READONLY	0x00000010 /* R/O storage */
#define	CISTPL_CFTABLE_TPCE_MI_PWRDOWN	0x00000020 /* powerdown capable */
#define	CISTPL_CFTABLE_TPCE_MI_DRQ_MASK	0x00000c00 /* DMAREQ mask */
#define	CISTPL_CFTABLE_TPCE_MI_DRQ_SPK	0x00000400 /* DMAREQ on SPKR */
#define	CISTPL_CFTABLE_TPCE_MI_DRQ_IOIS	0x00000800 /* DMAREQ on IOIS16 */
#define	CISTPL_CFTABLE_TPCE_MI_DRQ_INP	0x00000c00 /* DMAREQ on INPACK */
#define	CISTPL_CFTABLE_TPCE_MI_DMA_8	0x00000000 /* DMA width 8 bits */
#define	CISTPL_CFTABLE_TPCE_MI_DMA_16	0x00001000 /* DMA width 16 bits */

typedef struct cistpl_cftable_entry_misc_t {
    uint32_t	flags;		/* misc features flags */
} cistpl_cftable_entry_misc_t;

/*
 * Additional information sub-tuples defines and structure
 */
#define	STCE_EV		0x0c0	/* Environment Descriptor Subtuple */
#define	STCE_PD		0x0c1	/* Physical Device Name Subtuple */
typedef struct cistpl_cftable_entry_stce_ev_t {
	char	stev_strs[CIS_MAX_TUPLE_DATA_LEN];
} cistpl_cftable_entry_stce_ev_t;

typedef struct cistpl_cftable_entry_stce_pd_t {
	char	stpd_strs[CIS_MAX_TUPLE_DATA_LEN];
} cistpl_cftable_entry_stce_pd_t;

/*
 * cistpl_cftable_entry_t - this is the struct that the caller passes
 *				to the CISTPL_CFTABLE_ENTRY handler
 */
typedef struct cistpl_cftable_entry_t {
    uint32_t	flags;		/* which descriptions are valid */
    uint32_t	ifc;		/* interface description info */
    uint32_t	pin;		/* values for PRR */
    uint32_t	index;		/* configuration index number */
    struct cistpl_cftable_entry_pd_t	pd; /* power requirements description */
    struct cistpl_cftable_entry_speed_t	speed; /* device speed description */
    struct cistpl_cftable_entry_io_t	io; /* device I/O map */
    struct cistpl_cftable_entry_irq_t	irq; /* device IRQ utilization */
    struct cistpl_cftable_entry_mem_t	mem; /* device memory space */
    struct cistpl_cftable_entry_misc_t	misc; /* misc device features */
} cistpl_cftable_entry_t;

/*
 * CISTPL_LINKTARGET
 *
 * This tuple is used to verify that tuple chains other than the primary
 *	chain which starts at offset 0 in Attribute Memory are valid. All
 *	secondary tuple chains are required to contain this tuple as the
 *	first tuple of the chain.
 * This tuple must have a link field of at least MIN_LINKTARGET_LENGTH and
 *	must contain the byte pattern CISTPL_LINKTARGET_MAGIC.
 * LINKTARGET_AC_HEADER_LENGTH is the number of bytes contained in a
 *	valid CISTPL_LINKTARGET tuple header.
 */
#define	MIN_LINKTARGET_LENGTH		3
#define	CISTPL_LINKTARGET_MAGIC		"CIS"
#define	LINKTARGET_AC_HEADER_LENGTH	2

typedef struct cistpl_linktarget_t {
	uint32_t	length;		/* number of bytes in tpltg_tag */
	char	tpltg_tag[CIS_MAX_TUPLE_DATA_LEN];
} cistpl_linktarget_t;

/*
 * CISTPL_LONGLINK_A and CISTPL_LONGLINK_C
 *
 * Both of these tuples are processed the same way. The target address is
 *	really an offset from the beginning of the specified address space
 *	and is not a virtual address.
 * This tuple must have a link field of at least MIN_LONGLINK_AC_LENGTH.
 */
#define	MIN_LONGLINK_AC_LENGTH		4

typedef struct cistpl_longlink_ac_t {
	uint32_t		flags;		/* space flags */
	uint32_t		tpll_addr;	/* target address, normalized */
} cistpl_longlink_ac_t;
/*
 * Flags for cistpl_longlink_ac_t->flags
 */
#define	CISTPL_LONGLINK_AC_AM	0x0001	/* longlink to AM */
#define	CISTPL_LONGLINK_AC_CM	0x0002	/* longlink to CM */

/*
 * CISTPL_LONGLINK_MFC
 *
 * This tuple describes the start of the function-specific CIS for each
 *	function on a multi-function card.
 *
 * This tuple must have a link field of at least MIN_LONGLINK_AC_LENGTH.
 */
#define	MIN_LONGLINK_MFC_LENGTH		6
#define	MIN_LONGLINK_MFC_NREGS		1

typedef struct cis_function_t {
	uint32_t	tas;    /* target address space of function */
	uint32_t	addr;   /* target address offset */
} cis_function_t;

typedef struct cistpl_longlink_mfc_t {
	uint32_t	nfuncs;		/* number of functions */
	uint32_t	nregs;		/* number of config register sets */
	cis_function_t	function[CIS_MAX_FUNCTIONS];
} cistpl_longlink_mfc_t;
/*
 * Flags for cistpl_longlink_mfc_t->function[n]->tas
 */
#define	CISTPL_LONGLINK_MFC_TAS_AM	0x00	/* CIS in attribute memory */
#define	CISTPL_LONGLINK_MFC_TAS_CM	0x01	/* CIS in common memory */

/*
 * CISTPL_LONGLINK_CB
 *
 * This tuple describes the start of a function's CIS chain
 *	for CardBus cards
 */
typedef struct cistpl_longlink_cb_t {
	uint32_t	flags;		/* address space flags */
	uint32_t	addr;		/* raw (unproessed) address value */
	union {
	    /* device-dependant config space info */
	    struct {
		uint32_t	offset;	/* offset within config space */
	    } cfg;
	    /* memory space info */
	    struct {
		uint32_t	asi;	/* BAR */
		uint32_t	offset;	/* offset within BAR space */
	    } mem;
	    /* expansion ROM space info */
	    struct {
		uint32_t	image;	/* image number */
		uint32_t	offset;	/* offset from iamge base */
	    } rom;
	} space;
} cistpl_longlink_cb_t;
/*
 * Flags for cistpl_longlink_cb_t->flags
 */
#define	CISTPL_LONGLINK_CB_CFG	0x0001	/* config space info valid */
#define	CISTPL_LONGLINK_CB_MEM	0x0002	/* memory space info valid */
#define	CISTPL_LONGLINK_CB_ROM	0x0004	/* expansion ROM space info valid */

/*
 * CISTPL_SPCL
 *
 * This tuple is the Special Purpose tuple and it's contents are dependant
 *	on the meaning of the header information in this tuple.
 */
typedef struct cistpl_spcl_t {
	uint32_t	id;		/* tuple contents identification */
	uint32_t	seq;		/* data sequence number */
	uint32_t	bytes;		/* number of bytes following */
	uchar_t		data[CIS_MAX_TUPLE_DATA_LEN];
} cistpl_spcl_t;
/*
 * Flags for cistpl_spcl_t->seq
 */
#define	CISTPL_SPCL_SEQ_END	0x080	/* last tuple in sequence */

/*
 * CISTPL_SWIL
 *
 * This tuple describes the software interleaving of data within a
 *	partition on the card.
 */
typedef struct cistpl_swil_t {
	uint32_t	intrlv;		/* interleave */
} cistpl_swil_t;

/*
 * CISTPL_BAR
 *
 * This tuple describes the CardBus Base Address Registers
 */
typedef struct cistpl_bar_t {
	uint32_t	attributes;	/* attributes */
	uint32_t	size;		/* BAR size */
} cistpl_bar_t;
/*
 * Flags for cistpl_bar_t->attributes
 */
#define	CISTPL_BAR_ASI_MASK	0x007	/* Base Address Register mask */
#define	CISTPL_BAR_ASI_BAR_1	0x001	/* Base Address Register 1 */
#define	CISTPL_BAR_ASI_BAR_2	0x002	/* Base Address Register 2 */
#define	CISTPL_BAR_ASI_BAR_3	0x003	/* Base Address Register 3 */
#define	CISTPL_BAR_ASI_BAR_4	0x004	/* Base Address Register 4 */
#define	CISTPL_BAR_ASI_BAR_5	0x005	/* Base Address Register 5 */
#define	CISTPL_BAR_ASI_BAR_6	0x006	/* Base Address Register 6 */
#define	CISTPL_BAR_ASI_BAR_7	0x007	/* Base Address Register 7 */
#define	CISTPL_BAR_ASI_EXP_ROM	0x007	/* Expansion ROM BAR */

#define	CISTPL_BAR_AS_MEM	0x000	/* BAR is of type memory */
#define	CISTPL_BAR_AS_IO	0x008	/* BAR is of type IO */

#define	CISTPL_BAR_PREFETCH_CACHE_MASK	0x060	/* prefetch/cache mask */
#define	CISTPL_BAR_PREFETCH		0x020	/* prefetchable not cacheable */
#define	CISTPL_BAR_PREFETCH_CACHE	0x040	/* prefetchable and cacheable */

#define	CISTPL_BAR_BELOW_1MB	0x080	/* must locate within first MB */

/*
 * CISTPL_DEVICEGEO and CISTPL_DEVICEGEO_A
 *
 * These tuples describe the device geometry of memory partitions.
 */
#define	CISTPL_DEVICEGEO_MAX_PARTITIONS	42
typedef struct cistpl_devicegeo_info_t {
	uint32_t	bus;		/* card interface width in bytes */
	uint32_t	ebs;		/* minimum erase block size */
	uint32_t	rbs;		/* minimum read block size */
	uint32_t	wbs;		/* minimum write bock size */
	uint32_t	part;		/* segment partition subdivisions */
	uint32_t	hwil;		/* hardware interleave */
} cistpl_devicegeo_info_t;
typedef struct cistpl_devicegeo_t {
	cistpl_devicegeo_info_t	info[CISTPL_DEVICEGEO_MAX_PARTITIONS];
} cistpl_devicegeo_t;

/*
 * The cistpl_get_tuple_name_t used to support the HANDTPL_RETURN_NAME
 *	operation of the CIS parser.
 */
typedef struct cistpl_get_tuple_name_t {
	char	name[CIS_MAX_TUPLE_NAME_LEN];
} cistpl_get_tuple_name_t;

/*
 * cisparse_t - the structure that unifies all tuple parsing structures
 */
typedef union cisparse_t {
	cistpl_config_t		cistpl_config;
	cistpl_device_t		cistpl_device;
	cistpl_vers_1_t		cistpl_vers_1;
	cistpl_vers_2_t		cistpl_vers_2;
	cistpl_jedec_t		cistpl_jedec;
	cistpl_format_t		cistpl_format;
	cistpl_geometry_t	cistpl_geometry;
	cistpl_byteorder_t	cistpl_byteorder;
	cistpl_date_t		cistpl_date;
	cistpl_battery_t	cistpl_battery;
	cistpl_org_t		cistpl_org;
	cistpl_manfid_t		cistpl_manfid;
	cistpl_funcid_t		cistpl_funcid;
	cistpl_funce_t		cistpl_funce;
	cistpl_cftable_entry_t	cistpl_cftable_entry;
	cistpl_linktarget_t	cistpl_linktarget;
	cistpl_longlink_ac_t	cistpl_longlink_ac;
	cistpl_longlink_mfc_t	cistpl_longlink_mfc;
	cistpl_spcl_t		cistpl_spcl;
	cistpl_swil_t		cistpl_swil;
	cistpl_bar_t		cistpl_bar;
	cistpl_devicegeo_t	cistpl_devicegeo;
	cistpl_longlink_cb_t	cistpl_longlink_cb;
	cistpl_get_tuple_name_t	cistpl_get_tuple_name;
	/* members below are for legacy support - REMOVE THEM BEFORE FCS!! */
	cistpl_config_t		config;
	cistpl_device_t		device;
	cistpl_vers_1_t		version_1;
	cistpl_vers_2_t		version_2;
	cistpl_jedec_t		jedec;
	cistpl_format_t		format;
	cistpl_geometry_t	geometry;
	cistpl_byteorder_t	byteorder;
	cistpl_date_t		date;
	cistpl_battery_t	battery;
	cistpl_org_t		org;
	cistpl_manfid_t		manfid;
	cistpl_funcid_t		funcid;
	cistpl_funce_t		funce;
	cistpl_cftable_entry_t	cftable;
	cistpl_linktarget_t	linktarget;
	cistpl_longlink_ac_t	longlink_ac;
	cistpl_longlink_mfc_t	longlink_mfc;
	cistpl_spcl_t		spcl;
	cistpl_swil_t		swil;
	cistpl_bar_t		bar;
	cistpl_devicegeo_t	devgeo;
	cistpl_longlink_cb_t	longlink_cb;
	cistpl_get_tuple_name_t	tuple_name;
} cisparse_t;

#ifdef	__cplusplus
}
#endif

#endif	/* _CIS_HANDLERS_H */