Annotation of sys/arch/mvme68k/dev/pcctwo.c, Revision 1.1.1.1
1.1 nbrk 1:
2: /* $OpenBSD: pcctwo.c,v 1.15 2005/11/24 22:43:16 miod Exp $ */
3:
4: /*
5: * Copyright (c) 1995 Theo de Raadt
6: * 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: *
17: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26: * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27: */
28:
29: /*
30: * VME16x PCC2 chip
31: */
32: #include <sys/param.h>
33: #include <sys/conf.h>
34: #include <sys/ioctl.h>
35: #include <sys/proc.h>
36: #include <sys/user.h>
37: #include <sys/tty.h>
38: #include <sys/uio.h>
39: #include <sys/systm.h>
40: #include <sys/kernel.h>
41: #include <sys/syslog.h>
42: #include <sys/fcntl.h>
43: #include <sys/device.h>
44: #include <machine/cpu.h>
45: #include <machine/autoconf.h>
46: #include <dev/cons.h>
47:
48: #include <mvme68k/dev/pcctworeg.h>
49:
50: struct pcctwosoftc {
51: struct device sc_dev;
52: vaddr_t sc_vaddr; /* PCC2 space */
53: paddr_t sc_paddr;
54: struct pcctworeg *sc_pcc2; /* the actual registers */
55: };
56:
57: void pcctwoattach(struct device *, struct device *, void *);
58: int pcctwomatch(struct device *, void *, void *);
59: int pcctwo_print(void *, const char *);
60: int pcctwo_scan(struct device *, void *, void *);
61:
62: struct cfattach pcctwo_ca = {
63: sizeof(struct pcctwosoftc), pcctwomatch, pcctwoattach
64: };
65:
66: struct cfdriver pcctwo_cd = {
67: NULL, "pcctwo", DV_DULL
68: };
69:
70: struct pcctworeg *sys_pcc2 = NULL;
71:
72: int
73: pcctwomatch(parent, vcf, args)
74: struct device *parent;
75: void *vcf, *args;
76: {
77: struct confargs *ca = args;
78: struct pcctworeg *pcc2;
79:
80: /* the PCC2 only exists on MVME16x's except the 162, right? */
81: if (cputyp == CPU_162 || cputyp == CPU_147 || cputyp == CPU_172)
82: return (0);
83: pcc2 = (struct pcctworeg *)(IIOV(ca->ca_paddr) + PCC2_PCC2CHIP_OFF);
84: if (badvaddr((vaddr_t)pcc2, 1) || pcc2->pcc2_chipid != PCC2_CHIPID)
85: return (0);
86: return (1);
87: }
88:
89: int
90: pcctwo_print(args, bus)
91: void *args;
92: const char *bus;
93: {
94: struct confargs *ca = args;
95:
96: if (ca->ca_offset != -1)
97: printf(" offset 0x%x", ca->ca_offset);
98: if (ca->ca_ipl > 0)
99: printf(" ipl %d", ca->ca_ipl);
100: return (UNCONF);
101: }
102:
103: int
104: pcctwo_scan(parent, child, args)
105: struct device *parent;
106: void *child, *args;
107: {
108: struct cfdata *cf = child;
109: struct pcctwosoftc *sc = (struct pcctwosoftc *)parent;
110: struct confargs oca;
111:
112: bzero(&oca, sizeof oca);
113: oca.ca_offset = cf->cf_loc[0];
114: oca.ca_ipl = cf->cf_loc[1];
115: if (oca.ca_offset != -1 && ISIIOVA(sc->sc_vaddr + oca.ca_offset)) {
116: oca.ca_vaddr = sc->sc_vaddr + oca.ca_offset;
117: oca.ca_paddr = sc->sc_paddr + oca.ca_offset;
118: } else {
119: oca.ca_vaddr = (vaddr_t)-1;
120: oca.ca_paddr = (paddr_t)-1;
121: }
122: oca.ca_bustype = BUS_PCCTWO;
123: oca.ca_name = cf->cf_driver->cd_name;
124: if ((*cf->cf_attach->ca_match)(parent, cf, &oca) == 0)
125: return (0);
126: config_attach(parent, cf, &oca, pcctwo_print);
127: return (1);
128: }
129:
130: void
131: pcctwoattach(parent, self, args)
132: struct device *parent, *self;
133: void *args;
134: {
135: struct confargs *ca = args;
136: struct pcctwosoftc *sc = (struct pcctwosoftc *)self;
137:
138: if (sys_pcc2)
139: panic("pcc2 already attached!");
140:
141: /*
142: * since we know ourself to land in intiobase land,
143: * we must adjust our address
144: */
145: sc->sc_paddr = ca->ca_paddr;
146: sc->sc_vaddr = IIOV(sc->sc_paddr);
147: sc->sc_pcc2 = (struct pcctworeg *)(sc->sc_vaddr + PCC2_PCC2CHIP_OFF);
148: sys_pcc2 = sc->sc_pcc2;
149:
150: printf(": rev %d\n", sc->sc_pcc2->pcc2_chiprev);
151:
152: sc->sc_pcc2->pcc2_vecbase = PCC2_VECBASE;
153: sc->sc_pcc2->pcc2_genctl |= PCC2_GENCTL_IEN; /* global irq enable */
154:
155: config_search(pcctwo_scan, self, args);
156: }
157:
158: /*
159: * PCC2 interrupts land in a PCC2_NVEC sized hole starting at PCC2_VECBASE
160: */
161: int
162: pcctwointr_establish(vec, ih, name)
163: int vec;
164: struct intrhand *ih;
165: const char *name;
166: {
167: #ifdef DIAGNOSTIC
168: if (vec < 0 || vec >= PCC2_NVEC)
169: panic("pcctwointr_establish: illegal vector for %s: 0x%x",
170: name, vec);
171: #endif
172:
173: return intr_establish(PCC2_VECBASE + vec, ih, name);
174: }
CVSweb