pcmciavar.h revision 1.1.2.1 1 1.1.2.1 marc #include <sys/types.h>
2 1.1.2.1 marc #include <sys/queue.h>
3 1.1.2.1 marc
4 1.1.2.1 marc #include <machine/bus.h>
5 1.1.2.1 marc
6 1.1.2.1 marc #include <dev/pcmcia/pcmciachip.h>
7 1.1.2.1 marc
8 1.1.2.1 marc /* pcmcia itself */
9 1.1.2.1 marc
10 1.1.2.1 marc #define PCMCIA_CFE_MWAIT_REQUIRED 0x0001
11 1.1.2.1 marc #define PCMCIA_CFE_RDYBSY_ACTIVE 0x0002
12 1.1.2.1 marc #define PCMCIA_CFE_WP_ACTIVE 0x0004
13 1.1.2.1 marc #define PCMCIA_CFE_BVD_ACTIVE 0x0008
14 1.1.2.1 marc #define PCMCIA_CFE_IO8 0x0010
15 1.1.2.1 marc #define PCMCIA_CFE_IO16 0x0020
16 1.1.2.1 marc #define PCMCIA_CFE_IRQSHARE 0x0040
17 1.1.2.1 marc #define PCMCIA_CFE_IRQPULSE 0x0080
18 1.1.2.1 marc #define PCMCIA_CFE_IRQLEVEL 0x0100
19 1.1.2.1 marc #define PCMCIA_CFE_POWERDOWN 0x0200
20 1.1.2.1 marc #define PCMCIA_CFE_READONLY 0x0400
21 1.1.2.1 marc #define PCMCIA_CFE_AUDIO 0x0800
22 1.1.2.1 marc
23 1.1.2.1 marc struct pcmcia_config_entry {
24 1.1.2.1 marc int number;
25 1.1.2.1 marc u_int32_t flags;
26 1.1.2.1 marc int iftype;
27 1.1.2.1 marc int num_iospace;
28 1.1.2.1 marc u_long iomask; /* the card will only decode this mask in any case,
29 1.1.2.1 marc so we can do dynamic allocation with this in
30 1.1.2.1 marc mind, in case the suggestions below are no good */
31 1.1.2.1 marc struct {
32 1.1.2.1 marc u_long length;
33 1.1.2.1 marc u_long start;
34 1.1.2.1 marc } iospace[4]; /* XXX this could be as high as 16 */
35 1.1.2.1 marc u_int16_t irqmask;
36 1.1.2.1 marc int num_memspace;
37 1.1.2.1 marc struct {
38 1.1.2.1 marc u_long length;
39 1.1.2.1 marc u_long cardaddr;
40 1.1.2.1 marc u_long hostaddr;
41 1.1.2.1 marc } memspace[2]; /* XXX this could be as high as 8 */
42 1.1.2.1 marc int maxtwins;
43 1.1.2.1 marc SIMPLEQ_ENTRY(pcmcia_config_entry) cfe_list;
44 1.1.2.1 marc };
45 1.1.2.1 marc
46 1.1.2.1 marc struct pcmcia_function {
47 1.1.2.1 marc /* read off the card */
48 1.1.2.1 marc int number;
49 1.1.2.1 marc int function;
50 1.1.2.1 marc int last_config_index;
51 1.1.2.1 marc u_long ccr_base;
52 1.1.2.1 marc u_long ccr_mask;
53 1.1.2.1 marc SIMPLEQ_HEAD(, pcmcia_config_entry) cfe_head;
54 1.1.2.1 marc SIMPLEQ_ENTRY(pcmcia_function) pf_list;
55 1.1.2.1 marc /* run-time state */
56 1.1.2.1 marc struct pcmcia_softc *sc;
57 1.1.2.1 marc struct pcmcia_config_entry *cfe;
58 1.1.2.1 marc bus_space_tag_t ccrt;
59 1.1.2.1 marc bus_space_handle_t ccrh;
60 1.1.2.1 marc u_long ccr_offset;
61 1.1.2.1 marc int ccr_window;
62 1.1.2.1 marc pcmcia_mem_handle_t ccr_mhandle;
63 1.1.2.1 marc u_long ccr_realsize;
64 1.1.2.1 marc int (*ih_fct) __P((void *));
65 1.1.2.1 marc void *ih_arg;
66 1.1.2.1 marc int ih_ipl;
67 1.1.2.1 marc };
68 1.1.2.1 marc
69 1.1.2.1 marc struct pcmcia_card {
70 1.1.2.1 marc int cis1_major, cis1_minor;
71 1.1.2.1 marc /* XXX waste of space? */
72 1.1.2.1 marc char cis1_info_buf[256];
73 1.1.2.1 marc char *cis1_info[4];
74 1.1.2.1 marc int manufacturer;
75 1.1.2.1 marc u_int16_t product;
76 1.1.2.1 marc u_int16_t error;
77 1.1.2.1 marc SIMPLEQ_HEAD(, pcmcia_function) pf_head;
78 1.1.2.1 marc };
79 1.1.2.1 marc
80 1.1.2.1 marc struct pcmcia_softc {
81 1.1.2.1 marc struct device dev;
82 1.1.2.1 marc /* this stuff is for the socket */
83 1.1.2.1 marc pcmcia_chipset_tag_t pct;
84 1.1.2.1 marc pcmcia_chipset_handle_t pch;
85 1.1.2.1 marc /* this stuff is for the card */
86 1.1.2.1 marc struct pcmcia_card card;
87 1.1.2.1 marc void *ih;
88 1.1.2.1 marc };
89 1.1.2.1 marc
90 1.1.2.1 marc struct pcmcia_attach_args {
91 1.1.2.1 marc u_int16_t manufacturer;
92 1.1.2.1 marc u_int16_t product;
93 1.1.2.1 marc struct pcmcia_card *card;
94 1.1.2.1 marc struct pcmcia_function *pf;
95 1.1.2.1 marc };
96 1.1.2.1 marc
97 1.1.2.1 marc struct pcmcia_tuple {
98 1.1.2.1 marc unsigned int code;
99 1.1.2.1 marc unsigned int length;
100 1.1.2.1 marc u_long mult;
101 1.1.2.1 marc u_long ptr;
102 1.1.2.1 marc bus_space_tag_t memt;
103 1.1.2.1 marc bus_space_handle_t memh;
104 1.1.2.1 marc };
105 1.1.2.1 marc
106 1.1.2.1 marc void pcmcia_read_cis __P((struct pcmcia_softc *));
107 1.1.2.1 marc void pcmcia_print_cis __P((struct pcmcia_softc *));
108 1.1.2.1 marc int pcmcia_scan_cis __P((struct device *dev,
109 1.1.2.1 marc int (*)(struct pcmcia_tuple *, void *), void *));
110 1.1.2.1 marc
111 1.1.2.1 marc #define pcmcia_cis_read_1(tuple, idx0) \
112 1.1.2.1 marc (bus_space_read_1((tuple)->memt, (tuple)->memh, \
113 1.1.2.1 marc (tuple)->mult*(idx0)))
114 1.1.2.1 marc #define pcmcia_tuple_read_1(tuple, idx1) \
115 1.1.2.1 marc (pcmcia_cis_read_1((tuple), ((tuple)->ptr+(2+(idx1)))))
116 1.1.2.1 marc #define pcmcia_tuple_read_2(tuple, idx2) \
117 1.1.2.1 marc (pcmcia_tuple_read_1((tuple), (idx2)) | \
118 1.1.2.1 marc (pcmcia_tuple_read_1((tuple), (idx2)+1)<<8))
119 1.1.2.1 marc #define pcmcia_tuple_read_3(tuple, idx3) \
120 1.1.2.1 marc (pcmcia_tuple_read_1((tuple), (idx3)) | \
121 1.1.2.1 marc (pcmcia_tuple_read_1((tuple), (idx3)+1)<<8) | \
122 1.1.2.1 marc (pcmcia_tuple_read_1((tuple), (idx3)+2)<<16))
123 1.1.2.1 marc #define pcmcia_tuple_read_4(tuple, idx4) \
124 1.1.2.1 marc (pcmcia_tuple_read_1((tuple), (idx4)) | \
125 1.1.2.1 marc (pcmcia_tuple_read_1((tuple), (idx4)+1)<<8) | \
126 1.1.2.1 marc (pcmcia_tuple_read_1((tuple), (idx4)+2)<<16) | \
127 1.1.2.1 marc (pcmcia_tuple_read_1((tuple), (idx4)+3)<<24))
128 1.1.2.1 marc #define pcmcia_tuple_read_n(tuple, n, idxn) \
129 1.1.2.1 marc (((n)==1)?pcmcia_tuple_read_1((tuple), (idxn)): \
130 1.1.2.1 marc (((n)==2)?pcmcia_tuple_read_2((tuple), (idxn)): \
131 1.1.2.1 marc (((n)==3)?pcmcia_tuple_read_3((tuple), (idxn)): \
132 1.1.2.1 marc /* n == 4 */ pcmcia_tuple_read_4((tuple), (idxn)))))
133 1.1.2.1 marc
134 1.1.2.1 marc #define PCMCIA_SPACE_MEMORY 1
135 1.1.2.1 marc #define PCMCIA_SPACE_IO 2
136 1.1.2.1 marc
137 1.1.2.1 marc int pcmcia_ccr_read __P((struct pcmcia_function *, int));
138 1.1.2.1 marc void pcmcia_ccr_write __P((struct pcmcia_function *, int, int));
139 1.1.2.1 marc
140 1.1.2.1 marc #define pcmcia_mfc(sc) ((sc)->card.pf_head.sqh_first && \
141 1.1.2.1 marc (sc)->card.pf_head.sqh_first->pf_list.sqe_next)
142 1.1.2.1 marc
143 1.1.2.1 marc int pcmcia_enable_function __P((struct pcmcia_function *,
144 1.1.2.1 marc struct device *,
145 1.1.2.1 marc struct pcmcia_config_entry *));
146 1.1.2.1 marc
147 1.1.2.1 marc #define pcmcia_io_alloc(pf, start, size, iotp, iohp) \
148 1.1.2.1 marc (pcmcia_chip_io_alloc((pf)->sc->pct, pf->sc->pch, \
149 1.1.2.1 marc (start), (size), (iotp), (iohp)))
150 1.1.2.1 marc
151 1.1.2.1 marc int pcmcia_io_map __P((struct pcmcia_function *, int, bus_size_t,
152 1.1.2.1 marc bus_space_tag_t, bus_space_handle_t, int *));
153 1.1.2.1 marc
154 1.1.2.1 marc #define pcmcia_mem_alloc(pf, size, memtp, memhp, mhandle, realsize) \
155 1.1.2.1 marc (pcmcia_chip_mem_alloc((pf)->sc->pct, (pf)->sc->pch, \
156 1.1.2.1 marc (size), (memtp), (memhp), (mhandle), \
157 1.1.2.1 marc (realsize)))
158 1.1.2.1 marc #define pcmcia_mem_free(pf, size, memt, memh, mhandle) \
159 1.1.2.1 marc (pcmcia_chip_mem_free((pf)->sc->pct, (pf)->sc->pch, \
160 1.1.2.1 marc (size), (memt), (memh), (mhandle)))
161 1.1.2.1 marc #define pcmcia_mem_map(pf, kind, size, memt, memh, \
162 1.1.2.1 marc card_addr, offsetp, windowp) \
163 1.1.2.1 marc (pcmcia_chip_mem_map((pf)->sc->pct, (pf)->sc->pch, \
164 1.1.2.1 marc (kind), (size), (memt), (memh), \
165 1.1.2.1 marc (card_addr), (offsetp), (windowp)))
166 1.1.2.1 marc #define pcmcia_mem_unmap(pf, window) \
167 1.1.2.1 marc (pcmcia_chip_mem_unmap((pf)->sc->pct, (pf)->sc->pch, (window)))
168 1.1.2.1 marc
169 1.1.2.1 marc void *pcmcia_intr_establish __P((struct pcmcia_function *, int,
170 1.1.2.1 marc int (*)(void *), void *));
171 1.1.2.1 marc void pcmcia_intr_disestablish __P((struct pcmcia_function *, void *));
172 1.1.2.1 marc
173