1 /* $NetBSD: px.c,v 1.1 1997/11/08 07:27:49 jonathan Exp $ */ 2 3 /* 4 * Copyright (c) 1997 Jonathan Stone 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. All advertising materials mentioning features or use of this software 16 * must display the following acknowledgement: 17 * This product includes software developed by Jonathan Stone for 18 * the NetBSD Project. 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 #include <sys/cdefs.h> 35 __KERNEL_RCSID(0, "$NetBSD: px.c,v 1.1 1997/11/08 07:27:49 jonathan Exp $"); 36 37 /* 38 * px.c: placebo driver for the DEC TURBOchannel 2-d and 3-d 39 * accelerated framebuffers with PixelStamp blitter asics and i860 40 * accelerators. 41 */ 42 43 #include <sys/param.h> 44 #include <sys/systm.h> 45 #include <sys/device.h> 46 47 #include <dev/tc/tcvar.h> 48 #include <dev/tc/sticvar.h> 49 50 #include <machine/autoconf.h> 51 #include <machine/cpu.h> 52 #include <machine/bus.h> 53 54 /* 55 * hardware offsets within PX board's TC slot. 56 */ 57 #define PX_STIC_POLL_OFFSET 0x000000 58 #define PX_STAMP_OFFSET 0x0c0000 /* pixelstamp space on STIC */ 59 #define PX_STIC_OFFSET 0x180000 /* STIC registers */ 60 #define PX_VDAC_OFFSET 0x200000 61 #define PX_ROM_OFFSET 0x300000 62 63 64 struct px_softc { 65 struct device sc_dv; /* device information */ 66 tc_addr_t px_slotbase; /* kva of slot base. */ 67 struct stic_softc px_stic; /* address of pixelstamp and stic. */ 68 }; 69 70 /* 71 * Local prototypes. 72 */ 73 int px_match __P((struct device *, struct cfdata *, void *)); 74 void px_attach __P((struct device *, struct device *, void *)); 75 int px_intr __P((void *xxx_sc)); 76 void px_vblank_ctl __P((struct px_softc *sc, int onoff)); 77 void px_blank __P((struct px_softc *sc)); 78 void px_unblank __P((struct px_softc *sc)); 79 80 struct cfattach px_ca = { 81 sizeof (struct px_softc), px_match, px_attach, 82 }; 83 84 struct cfdriver px_cd = { 85 NULL, "px", DV_DULL 86 }; 87 88 /* 89 * Match a PMAG-C pixelstamp board. 90 */ 91 int 92 px_match(parent, match, aux) 93 struct device *parent; 94 struct cfdata *match; 95 void *aux; 96 { 97 struct tc_attach_args *ta = aux; 98 void *pxaddr; 99 100 if (strncmp("PMAG-CA ", ta->ta_modname, TC_ROM_LLEN)) 101 return (0); 102 103 pxaddr = (void*)ta->ta_addr; 104 #if 0 105 if (tc_badaddr(pxaddr + 0)) 106 return (0); 107 #endif 108 109 return (1); 110 } 111 112 113 /* 114 * Attach a PMAG-C pixelstamp graphics board. 115 */ 116 void 117 px_attach(parent, self, aux) 118 struct device *parent, *self; 119 void *aux; 120 { 121 struct px_softc *sc = (struct px_softc*)self; 122 struct tc_attach_args *ta = aux; 123 124 sc->px_slotbase = TC_PHYS_TO_UNCACHED(ta->ta_addr); 125 sc->px_stic.stic_pktbuf= 126 (void*)(sc->px_slotbase + PX_STIC_POLL_OFFSET); 127 sc->px_stic.stic_addr = (void*)(sc->px_slotbase + PX_STIC_OFFSET); 128 sc->px_stic.stamp_addr = (void*)(sc->px_slotbase + PX_STAMP_OFFSET); 129 sc->px_stic.vdac_addr = (void*)(sc->px_slotbase + PX_VDAC_OFFSET); 130 131 132 /* Turn off vertical-blank interrupts, unless we're debugging. */ 133 #if !defined(DIAGNOSTIC) && !defined(DEBUG) 134 px_vblank_ctl(sc, 0); 135 #endif 136 137 tc_intr_establish(parent, ta->ta_cookie, TC_IPL_NONE, px_intr, sc); 138 139 /* driver does nothing yet, except silently dismisses interrupts. */ 140 printf(": no raster-console or X11 support.\n"); 141 142 } 143 144 /* 145 * pixelstamp board interrupt hanlder. 146 * XXX examine pixelstamp blitter-chip packet area, and 147 * send new packets. 148 * 149 * For now, we ignore interrupts from the blitter chip or i860, 150 * and just handle vertical-retrace interrupt. 151 */ 152 int 153 px_intr(xxx_sc) 154 void *xxx_sc; 155 { 156 struct px_softc *sc = (struct px_softc *)xxx_sc; 157 158 volatile struct stic_regs * stic = 159 STICADDR(sc->px_stic.stic_addr); 160 161 register int intr_status = stic->ipdvint; 162 163 /* Clear packet-done intr so we don't interrupt again. */ 164 /* Packet interrupt? */ 165 if (intr_status & STIC_INT_P) { 166 167 /* 168 * Clear *only* packet done interrupt 169 */ 170 stic->ipdvint = (stic->ipdvint | STIC_INT_P_WE) & 171 ~(STIC_INT_E_WE | STIC_INT_V_WE | STIC_INT_P); 172 tc_wmb(); 173 174 } 175 /* Vertical-retrace interrupt ? */ 176 else if (intr_status & STIC_INT_V) { 177 178 stic->ipdvint = (stic->ipdvint | STIC_INT_V_WE) & 179 ~(STIC_INT_E_WE | STIC_INT_P_WE | STIC_INT_V); 180 tc_wmb(); 181 182 #ifdef notyet 183 /* Poll for LK-201 LED status, update LEDs */ 184 lk201_led(unit); 185 #endif 186 187 /* Error, stray interrupt ?*/ 188 } else if (intr_status & STIC_INT_E) { 189 #if defined(DIAGNOSTIC) || 1 190 /* XXX not for me */ 191 printf("px_intr: stray intr INT_E, %x %x %x %x %x", 192 intr_status, 193 stic->sticsr, stic->buscsr, 194 stic->busadr, stic->busdat); 195 DELAY(1000000); 196 /*panic("px_intr: no intr condition\n");*/ 197 #endif 198 } else { 199 #if defined(DIAGNOSTIC) || 1 200 DELAY(1000000); 201 /* XXX not for me */ 202 printf("px_intr:, no intr? %x %x %x %x %x", 203 intr_status, 204 stic->sticsr, stic->buscsr, 205 stic->busadr, stic->busdat); 206 DELAY(100000); 207 /*panic("px_intr: no intr condition\n");*/ 208 #endif 209 } 210 211 return(0); /* XXX forme */ 212 } 213 214 215 /* 216 * Turn vertical retrace interrupt on or off 217 */ 218 void 219 px_vblank_ctl(sc, switch_on) 220 struct px_softc *sc; 221 int switch_on; 222 223 { 224 register volatile struct stic_regs *stic = 225 STICADDR(sc->px_stic.stic_addr); 226 227 stic->ipdvint = (switch_on) ? 228 STIC_INT_V_WE | STIC_INT_V_EN : 229 STIC_INT_V_WE; 230 231 tc_wmb(); 232 } 233 234 void 235 px_blank(sc) 236 struct px_softc *sc; 237 { 238 239 } 240 241 242 void 243 px_unblank(sc) 244 struct px_softc *sc; 245 { 246 } 247