Annotation of sys/dev/ic/tcic2var.h, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: tcic2var.h,v 1.4 2005/11/23 11:39:37 mickey Exp $ */
2: /* $NetBSD: tcic2var.h,v 1.1 1999/03/23 20:04:14 bad Exp $ */
3:
4: /*
5: * Copyright (c) 1998, 1999 Christoph Badura. All rights reserved.
6: * Copyright (c) 1997 Marc Horowitz. All rights reserved.
7: *
8: * Redistribution and use in source and binary forms, with or without
9: * modification, are permitted provided that the following conditions
10: * are met:
11: * 1. Redistributions of source code must retain the above copyright
12: * notice, this list of conditions and the following disclaimer.
13: * 2. Redistributions in binary form must reproduce the above copyright
14: * notice, this list of conditions and the following disclaimer in the
15: * documentation and/or other materials provided with the distribution.
16: * 3. All advertising materials mentioning features or use of this software
17: * must display the following acknowledgement:
18: * This product includes software developed by Marc Horowitz.
19: * 4. The name of the author may not be used to endorse or promote products
20: * derived from this software without specific prior written permission.
21: *
22: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31: * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32: */
33:
34: #ifndef _TCIC2VAR_H
35: #define _TCIC2VAR_H
36:
37: #include <sys/device.h>
38:
39: #include <dev/pcmcia/pcmciareg.h>
40: #include <dev/pcmcia/pcmciachip.h>
41:
42: #include <dev/ic/tcic2reg.h>
43:
44: struct proc;
45:
46: struct tcic_event {
47: SIMPLEQ_ENTRY(tcic_event) pe_q;
48: int pe_type;
49: };
50:
51: /* pe_type */
52: #define TCIC_EVENT_INSERTION 0
53: #define TCIC_EVENT_REMOVAL 1
54:
55:
56: struct tcic_handle {
57: struct tcic_softc *sc;
58: int sock; /* socket number */
59: int flags;
60: int sstat; /* last value of R_SSTAT */
61: int memalloc;
62: int memwins;
63: struct {
64: bus_addr_t addr;
65: bus_size_t size;
66: int size2; /* size as 2^n scaled by 4K */
67: long offset;
68: int speed; /* in ns */
69: int kind;
70: } mem[TCIC_MAX_MEM_WINS];
71: int ioalloc;
72: struct {
73: bus_addr_t addr;
74: bus_size_t size;
75: int width;
76: int speed; /* in ns */
77: } io[TCIC_IO_WINS];
78: int ih_irq;
79: struct device *pcmcia;
80:
81: int shutdown;
82: struct proc *event_thread;
83: SIMPLEQ_HEAD(, tcic_event) events;
84: };
85:
86: #define TCIC_FLAG_SOCKETP 0x0001
87: #define TCIC_FLAG_CARDP 0x0002
88:
89: /*
90: * This is sort of arbitrary. It merely needs to be "enough". It can be
91: * overridden in the conf file, anyway.
92: */
93:
94: #define TCIC_MEM_PAGES 4
95: #define TCIC_MEMSIZE TCIC_MEM_PAGES*TCIC_MEM_PAGESIZE
96:
97: #define TCIC_NSLOTS 2
98:
99: struct tcic_softc {
100: struct device dev;
101:
102: bus_space_tag_t memt;
103: bus_space_handle_t memh;
104: bus_space_tag_t iot;
105: bus_space_handle_t ioh;
106:
107: int chipid;
108: int validirqs;
109: int pwrena; /* holds TCIC_PWR_ENA on'084 and successors */
110:
111: /* XXX isa_chipset_tag_t, pci_chipset_tag_t, etc. */
112: void *intr_est;
113:
114: pcmcia_chipset_tag_t pct;
115:
116: /* this needs to be large enough to hold TCIC_MEM_PAGES bits */
117: int subregionmask;
118:
119: /* used by memory window mapping functions */
120: bus_addr_t membase;
121: int memsize2; /* int(log2(memsize)) */
122:
123: /*
124: * used by io window mapping functions. These can actually overlap
125: * with another tcic, since the underlying extent mapper will deal
126: * with individual allocations. This is here to deal with the fact
127: * that different busses have different real widths (different pc
128: * hardware seems to use 10 or 12 bits for the I/O bus).
129: */
130: bus_addr_t iobase;
131: bus_size_t iosize;
132:
133: int irq;
134: void *ih;
135:
136: struct tcic_handle handle[TCIC_NSLOTS];
137: };
138:
139: int tcic_log2(u_int);
140: int tcic_ns2wscnt(int);
141:
142: int tcic_check_reserved_bits(bus_space_tag_t, bus_space_handle_t);
143: int tcic_chipid(bus_space_tag_t, bus_space_handle_t);
144: int tcic_chipid_known(int);
145: char *tcic_chipid_to_string(int);
146: int tcic_validirqs(int);
147:
148: void tcic_attach(struct tcic_softc *);
149: void tcic_attach_sockets(struct tcic_softc *);
150: int tcic_intr(void *arg);
151:
152: static __inline__ int tcic_read_1(struct tcic_handle *, int);
153: static __inline__ int tcic_read_2(struct tcic_handle *, int);
154: static __inline__ int tcic_read_4(struct tcic_handle *, int);
155: static __inline__ void tcic_write_1(struct tcic_handle *, int, int);
156: static __inline__ void tcic_write_2(struct tcic_handle *, int, int);
157: static __inline__ void tcic_write_4(struct tcic_handle *, int, int);
158: static __inline__ int tcic_read_ind_2(struct tcic_handle *, int);
159: static __inline__ void tcic_write_ind_2(struct tcic_handle *, int, int);
160: static __inline__ void tcic_sel_sock(struct tcic_handle *);
161: static __inline__ void tcic_wait_ready(struct tcic_handle *);
162: static __inline__ int tcic_read_aux_1(bus_space_tag_t, bus_space_handle_t, int, int);
163: static __inline__ int tcic_read_aux_2(bus_space_tag_t, bus_space_handle_t, int);
164: static __inline__ void tcic_write_aux_1(bus_space_tag_t, bus_space_handle_t, int, int, int);
165: static __inline__ void tcic_write_aux_2(bus_space_tag_t, bus_space_handle_t, int, int);
166:
167: int tcic_chip_mem_alloc(pcmcia_chipset_handle_t, bus_size_t,
168: struct pcmcia_mem_handle *);
169: void tcic_chip_mem_free(pcmcia_chipset_handle_t,
170: struct pcmcia_mem_handle *);
171: int tcic_chip_mem_map(pcmcia_chipset_handle_t, int, bus_addr_t,
172: bus_size_t, struct pcmcia_mem_handle *, bus_size_t *, int *);
173: void tcic_chip_mem_unmap(pcmcia_chipset_handle_t, int);
174:
175: int tcic_chip_io_alloc(pcmcia_chipset_handle_t, bus_addr_t,
176: bus_size_t, bus_size_t, struct pcmcia_io_handle *);
177: void tcic_chip_io_free(pcmcia_chipset_handle_t,
178: struct pcmcia_io_handle *);
179: int tcic_chip_io_map(pcmcia_chipset_handle_t, int, bus_addr_t,
180: bus_size_t, struct pcmcia_io_handle *, int *);
181: void tcic_chip_io_unmap(pcmcia_chipset_handle_t, int);
182:
183: void tcic_chip_socket_enable(pcmcia_chipset_handle_t);
184: void tcic_chip_socket_disable(pcmcia_chipset_handle_t);
185:
186: static __inline__ int tcic_read_1(struct tcic_handle *, int);
187: static __inline__ int
188: tcic_read_1(h, reg)
189: struct tcic_handle *h;
190: int reg;
191: {
192: return (bus_space_read_1(h->sc->iot, h->sc->ioh, reg));
193: }
194:
195: static __inline__ int tcic_read_2(struct tcic_handle *, int);
196: static __inline__ int
197: tcic_read_2(h, reg)
198: struct tcic_handle *h;
199: int reg;
200: {
201: return (bus_space_read_2(h->sc->iot, h->sc->ioh, reg));
202: }
203:
204: static __inline__ int tcic_read_4(struct tcic_handle *, int);
205: static __inline__ int
206: tcic_read_4(h, reg)
207: struct tcic_handle *h;
208: int reg;
209: {
210: int val;
211: val = bus_space_read_2(h->sc->iot, h->sc->ioh, reg);
212: val |= bus_space_read_2(h->sc->iot, h->sc->ioh, reg+2) << 16;
213: return val;
214: }
215:
216: static __inline__ void tcic_write_1(struct tcic_handle *, int, int);
217: static __inline__ void
218: tcic_write_1(h, reg, data)
219: struct tcic_handle *h;
220: int reg;
221: int data;
222: {
223: bus_space_write_1(h->sc->iot, h->sc->ioh, reg, (data));
224: }
225:
226: static __inline__ void tcic_write_2(struct tcic_handle *, int, int);
227: static __inline__ void
228: tcic_write_2(h, reg, data)
229: struct tcic_handle *h;
230: int reg;
231: int data;
232: {
233: bus_space_write_2(h->sc->iot, h->sc->ioh, reg, (data));
234: }
235:
236: static __inline__ void tcic_write_4(struct tcic_handle *, int, int);
237: static __inline__ void
238: tcic_write_4(h, reg, data)
239: struct tcic_handle *h;
240: int reg;
241: int data;
242: {
243: bus_space_write_2(h->sc->iot, h->sc->ioh, reg, (data));
244: bus_space_write_2(h->sc->iot, h->sc->ioh, reg+2, (data)>>16);
245: }
246:
247: static __inline__ int tcic_read_ind_2(struct tcic_handle *, int);
248: static __inline__ int
249: tcic_read_ind_2(h, reg)
250: struct tcic_handle *h;
251: int reg;
252: {
253: int r_addr, val;
254: r_addr = tcic_read_4(h, TCIC_R_ADDR);
255: tcic_write_4(h, TCIC_R_ADDR, reg|TCIC_ADDR_INDREG);
256: val = bus_space_read_2(h->sc->iot, h->sc->ioh, TCIC_R_DATA);
257: tcic_write_4(h, TCIC_R_ADDR, r_addr);
258: return val;
259: }
260:
261: static __inline__ void tcic_write_ind_2(struct tcic_handle *, int, int);
262: static __inline__ void
263: tcic_write_ind_2(h, reg, data)
264: struct tcic_handle *h;
265: int reg;
266: int data;
267: {
268: int r_addr;
269: r_addr = tcic_read_4(h, TCIC_R_ADDR);
270: tcic_write_4(h, TCIC_R_ADDR, reg|TCIC_ADDR_INDREG);
271: bus_space_write_2(h->sc->iot, h->sc->ioh, TCIC_R_DATA, (data));
272: tcic_write_4(h, TCIC_R_ADDR, r_addr);
273: }
274:
275: static __inline__ void tcic_sel_sock(struct tcic_handle *);
276: static __inline__ void
277: tcic_sel_sock(h)
278: struct tcic_handle *h;
279: {
280: int r_addr;
281: r_addr = tcic_read_2(h, TCIC_R_ADDR2);
282: tcic_write_2(h, TCIC_R_ADDR2,
283: (h->sock<<TCIC_ADDR2_SS_SHFT)|(r_addr & ~TCIC_ADDR2_SS_MASK));
284: }
285:
286: static __inline__ void tcic_wait_ready(struct tcic_handle *);
287: static __inline__ void
288: tcic_wait_ready(h)
289: struct tcic_handle *h;
290: {
291: int i;
292:
293: /* XXX appropriate socket must have been selected already. */
294: for (i = 0; i < 10000; i++) {
295: if (tcic_read_1(h, TCIC_R_SSTAT) & TCIC_SSTAT_RDY)
296: return;
297: delay(500);
298: }
299:
300: #ifdef DIAGNOSTIC
301: printf("tcic_wait_ready ready never happened\n");
302: #endif
303: }
304:
305: static __inline__ int tcic_read_aux_1(bus_space_tag_t, bus_space_handle_t, int, int);
306: static __inline__ int
307: tcic_read_aux_1(iot, ioh, auxreg, reg)
308: bus_space_tag_t iot;
309: bus_space_handle_t ioh;
310: int auxreg, reg;
311: {
312: int mode, val;
313: mode = bus_space_read_1(iot, ioh, TCIC_R_MODE);
314: bus_space_write_1(iot, ioh, TCIC_R_MODE, (mode & ~TCIC_AR_MASK)|auxreg);
315: val = bus_space_read_1(iot, ioh, reg);
316: return val;
317: }
318:
319: static __inline__ int tcic_read_aux_2(bus_space_tag_t, bus_space_handle_t, int);
320: static __inline__ int
321: tcic_read_aux_2(iot, ioh, auxreg)
322: bus_space_tag_t iot;
323: bus_space_handle_t ioh;
324: int auxreg;
325: {
326: int mode, val;
327: mode = bus_space_read_1(iot, ioh, TCIC_R_MODE);
328: bus_space_write_1(iot, ioh, TCIC_R_MODE, (mode & ~TCIC_AR_MASK)|auxreg);
329: val = bus_space_read_2(iot, ioh, TCIC_R_AUX);
330: return val;
331: }
332:
333: static __inline__ void tcic_write_aux_1(bus_space_tag_t, bus_space_handle_t, int, int, int);
334: static __inline__ void
335: tcic_write_aux_1(iot, ioh, auxreg, reg, val)
336: bus_space_tag_t iot;
337: bus_space_handle_t ioh;
338: int auxreg, reg, val;
339: {
340: int mode;
341: mode = bus_space_read_1(iot, ioh, TCIC_R_MODE);
342: bus_space_write_1(iot, ioh, TCIC_R_MODE, (mode & ~TCIC_AR_MASK)|auxreg);
343: bus_space_write_1(iot, ioh, reg, val);
344: }
345:
346: static __inline__ void tcic_write_aux_2(bus_space_tag_t, bus_space_handle_t, int, int);
347: static __inline__ void
348: tcic_write_aux_2(iot, ioh, auxreg, val)
349: bus_space_tag_t iot;
350: bus_space_handle_t ioh;
351: int auxreg, val;
352: {
353: int mode;
354: mode = bus_space_read_1(iot, ioh, TCIC_R_MODE);
355: bus_space_write_1(iot, ioh, TCIC_R_MODE, (mode & ~TCIC_AR_MASK)|auxreg);
356: bus_space_write_2(iot, ioh, TCIC_R_AUX, val);
357: }
358:
359: #endif /* _TCIC2VAR_H */
CVSweb