zssc.c revision 1.46 1 1.46 msaitoh /* $NetBSD: zssc.c,v 1.46 2019/11/12 13:17:43 msaitoh Exp $ */
2 1.6 cgd
3 1.1 chopps /*
4 1.1 chopps * Copyright (c) 1982, 1990 The Regents of the University of California.
5 1.1 chopps * All rights reserved.
6 1.1 chopps *
7 1.1 chopps * Redistribution and use in source and binary forms, with or without
8 1.1 chopps * modification, are permitted provided that the following conditions
9 1.1 chopps * are met:
10 1.1 chopps * 1. Redistributions of source code must retain the above copyright
11 1.1 chopps * notice, this list of conditions and the following disclaimer.
12 1.1 chopps * 2. Redistributions in binary form must reproduce the above copyright
13 1.1 chopps * notice, this list of conditions and the following disclaimer in the
14 1.1 chopps * documentation and/or other materials provided with the distribution.
15 1.35 agc * 3. Neither the name of the University nor the names of its contributors
16 1.35 agc * may be used to endorse or promote products derived from this software
17 1.35 agc * without specific prior written permission.
18 1.35 agc *
19 1.35 agc * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20 1.35 agc * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 1.35 agc * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 1.35 agc * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23 1.35 agc * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 1.35 agc * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 1.35 agc * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 1.35 agc * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 1.35 agc * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 1.35 agc * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 1.35 agc * SUCH DAMAGE.
30 1.35 agc *
31 1.35 agc * @(#)dma.c
32 1.35 agc */
33 1.35 agc
34 1.35 agc /*
35 1.35 agc * Copyright (c) 1994 Michael L. Hitch
36 1.35 agc *
37 1.35 agc * Redistribution and use in source and binary forms, with or without
38 1.35 agc * modification, are permitted provided that the following conditions
39 1.35 agc * are met:
40 1.35 agc * 1. Redistributions of source code must retain the above copyright
41 1.35 agc * notice, this list of conditions and the following disclaimer.
42 1.35 agc * 2. Redistributions in binary form must reproduce the above copyright
43 1.35 agc * notice, this list of conditions and the following disclaimer in the
44 1.35 agc * documentation and/or other materials provided with the distribution.
45 1.1 chopps *
46 1.36 mhitch * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
47 1.36 mhitch * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
48 1.36 mhitch * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
49 1.36 mhitch * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
50 1.36 mhitch * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
51 1.36 mhitch * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
52 1.36 mhitch * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
53 1.36 mhitch * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
54 1.36 mhitch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
55 1.36 mhitch * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
56 1.1 chopps *
57 1.1 chopps * @(#)dma.c
58 1.1 chopps */
59 1.31 aymeric
60 1.31 aymeric #include <sys/cdefs.h>
61 1.46 msaitoh __KERNEL_RCSID(0, "$NetBSD: zssc.c,v 1.46 2019/11/12 13:17:43 msaitoh Exp $");
62 1.1 chopps
63 1.2 chopps #include <sys/param.h>
64 1.2 chopps #include <sys/systm.h>
65 1.2 chopps #include <sys/kernel.h>
66 1.2 chopps #include <sys/device.h>
67 1.34 thorpej
68 1.23 bouyer #include <dev/scsipi/scsi_all.h>
69 1.23 bouyer #include <dev/scsipi/scsipi_all.h>
70 1.23 bouyer #include <dev/scsipi/scsiconf.h>
71 1.2 chopps #include <amiga/amiga/custom.h>
72 1.2 chopps #include <amiga/amiga/cc.h>
73 1.2 chopps #include <amiga/amiga/device.h>
74 1.10 chopps #include <amiga/amiga/isr.h>
75 1.2 chopps #include <amiga/dev/siopreg.h>
76 1.2 chopps #include <amiga/dev/siopvar.h>
77 1.8 chopps #include <amiga/dev/zbusvar.h>
78 1.2 chopps
79 1.45 chs void zsscattach(device_t, device_t, void *);
80 1.45 chs int zsscmatch(device_t, cfdata_t, void *);
81 1.30 aymeric int zssc_dmaintr(void *);
82 1.16 veego #ifdef DEBUG
83 1.30 aymeric void zssc_dump(void);
84 1.16 veego #endif
85 1.2 chopps
86 1.45 chs CFATTACH_DECL_NEW(zssc, sizeof(struct siop_softc),
87 1.33 thorpej zsscmatch, zsscattach, NULL, NULL);
88 1.15 thorpej
89 1.1 chopps /*
90 1.2 chopps * if we are an PPI Zeus
91 1.1 chopps */
92 1.2 chopps int
93 1.45 chs zsscmatch(device_t parent, cfdata_t cf, void *aux)
94 1.2 chopps {
95 1.8 chopps struct zbus_args *zap;
96 1.2 chopps
97 1.45 chs zap = aux;
98 1.2 chopps if (zap->manid == 2026 && zap->prodid == 150)
99 1.2 chopps return(1);
100 1.2 chopps return(0);
101 1.2 chopps }
102 1.2 chopps
103 1.2 chopps void
104 1.45 chs zsscattach(device_t parent, device_t self, void *aux)
105 1.2 chopps {
106 1.46 msaitoh struct siop_softc *sc = device_private(self);
107 1.8 chopps struct zbus_args *zap;
108 1.2 chopps siop_regmap_p rp;
109 1.5 chopps
110 1.20 christos printf("\n");
111 1.2 chopps
112 1.46 msaitoh sc->sc_dev = self;
113 1.45 chs zap = aux;
114 1.11 chopps
115 1.40 he sc->sc_siopp = rp = (siop_regmap_p)((char *)zap->va + 0x4000);
116 1.2 chopps
117 1.2 chopps /*
118 1.2 chopps * CTEST7 = 00
119 1.2 chopps */
120 1.38 lukem sc->sc_clock_freq = 66; /* Clock = 66 MHz */
121 1.12 chopps sc->sc_ctest7 = 0x00;
122 1.14 mhitch sc->sc_dcntl = 0x00;
123 1.1 chopps
124 1.42 phx sc->sc_siop_si = softint_establish(SOFTINT_BIO,
125 1.42 phx (void (*)(void *))siopintr, sc);
126 1.1 chopps
127 1.45 chs sc->sc_adapter.adapt_dev = self;
128 1.29 bouyer sc->sc_adapter.adapt_nchannels = 1;
129 1.29 bouyer sc->sc_adapter.adapt_openings = 7;
130 1.29 bouyer sc->sc_adapter.adapt_max_periph = 1;
131 1.29 bouyer sc->sc_adapter.adapt_ioctl = NULL;
132 1.29 bouyer sc->sc_adapter.adapt_minphys = siop_minphys;
133 1.29 bouyer sc->sc_adapter.adapt_request = siop_scsipi_request;
134 1.29 bouyer
135 1.29 bouyer sc->sc_channel.chan_adapter = &sc->sc_adapter;
136 1.29 bouyer sc->sc_channel.chan_bustype = &scsi_bustype;
137 1.30 aymeric sc->sc_channel.chan_channel = 0;
138 1.29 bouyer sc->sc_channel.chan_ntargets = 8;
139 1.30 aymeric sc->sc_channel.chan_nluns = 8;
140 1.29 bouyer sc->sc_channel.chan_id = 7;
141 1.1 chopps
142 1.11 chopps siopinitialize(sc);
143 1.10 chopps
144 1.10 chopps sc->sc_isr.isr_intr = zssc_dmaintr;
145 1.10 chopps sc->sc_isr.isr_arg = sc;
146 1.10 chopps sc->sc_isr.isr_ipl = 6;
147 1.10 chopps add_isr(&sc->sc_isr);
148 1.2 chopps
149 1.2 chopps /*
150 1.2 chopps * attach all scsi units on us
151 1.2 chopps */
152 1.45 chs config_found(self, &sc->sc_channel, scsiprint);
153 1.2 chopps }
154 1.2 chopps
155 1.2 chopps /*
156 1.2 chopps * Level 6 interrupt processing for the Progressive Peripherals Inc
157 1.2 chopps * Zeus SCSI. Because the level 6 interrupt is above splbio, the
158 1.42 phx * interrupt status is saved and a softint scheduled. This way,
159 1.42 phx * the actual processing of the interrupt can be deferred until
160 1.42 phx * splbio is unblocked.
161 1.2 chopps */
162 1.2 chopps
163 1.2 chopps int
164 1.30 aymeric zssc_dmaintr(void *arg)
165 1.2 chopps {
166 1.16 veego struct siop_softc *sc = arg;
167 1.2 chopps siop_regmap_p rp;
168 1.10 chopps int istat;
169 1.2 chopps
170 1.11 chopps if (sc->sc_flags & SIOP_INTSOFF)
171 1.11 chopps return (0); /* interrupts are not active */
172 1.10 chopps rp = sc->sc_siopp;
173 1.10 chopps istat = rp->siop_istat;
174 1.10 chopps if ((istat & (SIOP_ISTAT_SIP | SIOP_ISTAT_DIP)) == 0)
175 1.10 chopps return(0);
176 1.10 chopps /*
177 1.10 chopps * save interrupt status, DMA status, and SCSI status 0
178 1.10 chopps * (may need to deal with stacked interrupts?)
179 1.10 chopps */
180 1.11 chopps sc->sc_sstat0 = rp->siop_sstat0;
181 1.10 chopps sc->sc_istat = istat;
182 1.10 chopps sc->sc_dstat = rp->siop_dstat;
183 1.11 chopps /*
184 1.11 chopps * disable interrupts until the callback can process this
185 1.11 chopps * interrupt.
186 1.11 chopps */
187 1.11 chopps rp->siop_sien = 0;
188 1.11 chopps rp->siop_dien = 0;
189 1.11 chopps sc->sc_flags |= SIOP_INTDEFER | SIOP_INTSOFF;
190 1.42 phx softint_schedule(sc->sc_siop_si);
191 1.10 chopps return(1);
192 1.2 chopps }
193 1.12 chopps
194 1.12 chopps #ifdef DEBUG
195 1.12 chopps void
196 1.30 aymeric zssc_dump(void)
197 1.12 chopps {
198 1.24 thorpej extern struct cfdriver zssc_cd;
199 1.41 cegger struct siop_softc *sc;
200 1.12 chopps int i;
201 1.12 chopps
202 1.43 phx for (i = 0; i < zssc_cd.cd_ndevs; ++i) {
203 1.43 phx sc = device_lookup_private(&zssc_cd, i);
204 1.41 cegger if (sc != NULL)
205 1.41 cegger siop_dump(sc);
206 1.43 phx }
207 1.12 chopps }
208 1.12 chopps #endif
209