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 */
|