Annotation of sys/arch/mvme68k/dev/ipic.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: ipic.c,v 1.17 2005/11/27 14:19:08 miod Exp $ */
! 2:
! 3: /*
! 4: * Copyright (c) 1995 Theo de Raadt
! 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: *
! 16: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
! 17: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
! 18: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
! 19: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
! 20: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
! 21: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
! 22: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
! 23: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
! 24: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
! 25: * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
! 26: */
! 27:
! 28: #include <sys/param.h>
! 29: #include <sys/conf.h>
! 30: #include <sys/ioctl.h>
! 31: #include <sys/proc.h>
! 32: #include <sys/user.h>
! 33: #include <sys/tty.h>
! 34: #include <sys/uio.h>
! 35: #include <sys/systm.h>
! 36: #include <sys/kernel.h>
! 37: #include <sys/syslog.h>
! 38: #include <sys/fcntl.h>
! 39: #include <sys/device.h>
! 40:
! 41: #include <machine/autoconf.h>
! 42: #include <machine/cpu.h>
! 43:
! 44: #include <mvme68k/dev/ipicreg.h>
! 45: #include <mvme68k/dev/mcreg.h>
! 46:
! 47: void ipicattach(struct device *, struct device *, void *);
! 48: int ipicmatch(struct device *, void *, void *);
! 49:
! 50: int ipicprint(void *, const char *);
! 51: int ipicscan(struct device *, void *, void *);
! 52: caddr_t ipicmap(struct ipicsoftc *, caddr_t, int);
! 53: void ipicunmap(struct ipicsoftc *, caddr_t, int);
! 54:
! 55: struct cfattach ipic_ca = {
! 56: sizeof(struct ipicsoftc), ipicmatch, ipicattach
! 57: };
! 58:
! 59: struct cfdriver ipic_cd = {
! 60: NULL, "ipic", DV_DULL
! 61: };
! 62:
! 63: int
! 64: ipicmatch(parent, cf, args)
! 65: struct device *parent;
! 66: void *cf;
! 67: void *args;
! 68: {
! 69: struct confargs *ca = args;
! 70: struct ipicreg *ipic = (struct ipicreg *)ca->ca_vaddr;
! 71:
! 72: if (badvaddr((vaddr_t)ipic, 1) || ipic->ipic_chipid != IPIC_CHIPID)
! 73: return (0);
! 74: return (1);
! 75: }
! 76:
! 77: int
! 78: ipicprint(args, bus)
! 79: void *args;
! 80: const char *bus;
! 81: {
! 82: struct confargs *ca = args;
! 83:
! 84: printf(" slot %d", ca->ca_offset);
! 85: if (ca->ca_vec > 0)
! 86: printf(" vec %d", ca->ca_vec);
! 87: if (ca->ca_ipl > 0)
! 88: printf(" ipl %d", ca->ca_ipl);
! 89: return (UNCONF);
! 90: }
! 91:
! 92: int
! 93: ipicscan(parent, child, args)
! 94: struct device *parent;
! 95: void *child, *args;
! 96: {
! 97: struct cfdata *cf = child;
! 98: struct ipicsoftc *sc = (struct ipicsoftc *)parent;
! 99: struct confargs oca;
! 100: int slot, n = 0;
! 101: vaddr_t ipv;
! 102: paddr_t ipp;
! 103: struct ipid *ipid;
! 104:
! 105: /* XXX can we determine IPIC_IPSPACE automatically? */
! 106: for (slot = 0; slot < sc->sc_nip; slot++) {
! 107: ipp = sc->sc_ipspace + (slot * IPIC_IP_MODSIZE);
! 108: if (badpaddr((paddr_t)ipp + IPIC_IP_IDOFFSET, 2))
! 109: continue;
! 110:
! 111: ipv = mapiodev(ipp, NBPG);
! 112: if (ipv == 0)
! 113: continue;
! 114:
! 115: ipid = (struct ipid *)(ipv + IPIC_IP_IDOFFSET);
! 116: if (ipid->ipid_A != 'A' || ipid->ipid_P != 'P' ||
! 117: ipid->ipid_I != 'I' || ipid->ipid_C != 'C' ||
! 118: (u_char)cf->cf_loc[0] != ipid->ipid_manu ||
! 119: (u_char)cf->cf_loc[1] != ipid->ipid_prod) {
! 120: unmapiodev(ipv, NBPG);
! 121: continue;
! 122: }
! 123:
! 124: bzero(&oca, sizeof oca);
! 125: oca.ca_bustype = BUS_IP;
! 126: oca.ca_offset = slot; /* slot number */
! 127: oca.ca_paddr = ipp;
! 128: oca.ca_vaddr = ipv;
! 129: oca.ca_ipl = cf->cf_loc[2];
! 130: oca.ca_vec = cf->cf_loc[3];
! 131: if (oca.ca_ipl > 0 && oca.ca_vec == -1)
! 132: oca.ca_vec = intr_findvec(255, 0);
! 133:
! 134: oca.ca_name = cf->cf_driver->cd_name;
! 135:
! 136: if ((*cf->cf_attach->ca_match)(parent, cf, &oca) == 0) {
! 137: unmapiodev(ipv, NBPG);
! 138: continue;
! 139: }
! 140: config_attach(parent, cf, &oca, ipicprint);
! 141: n++;
! 142: }
! 143: return (n);
! 144: }
! 145:
! 146: void
! 147: ipicattach(parent, self, args)
! 148: struct device *parent, *self;
! 149: void *args;
! 150: {
! 151: struct ipicsoftc *sc = (struct ipicsoftc *)self;
! 152: struct confargs *ca = args;
! 153:
! 154: sc->sc_ipic = (struct ipicreg *)ca->ca_vaddr;
! 155: sc->sc_ipspace = IPIC_IPSPACE;
! 156: sc->sc_nip = 2;
! 157:
! 158: /*
! 159: * Bug in IP2 chip. ipic_chiprev should be 0x01 if
! 160: * the MC chip is rev 1. XXX - smurph
! 161: */
! 162: if (sys_mc->mc_chiprev == 0x01)
! 163: printf(": rev 1\n");
! 164: else
! 165: printf(": rev %d\n", sc->sc_ipic->ipic_chiprev);
! 166:
! 167: sc->sc_ipic->ipic_reset = IPIC_RESET;
! 168: delay(2);
! 169:
! 170: config_search(ipicscan, self, args);
! 171: }
! 172:
! 173: caddr_t
! 174: ipicmap(sc, addr, len)
! 175: struct ipicsoftc *sc;
! 176: caddr_t addr;
! 177: int len;
! 178: {
! 179: return (NULL);
! 180: }
! 181:
! 182: void
! 183: ipicunmap(sc, addr, len)
! 184: struct ipicsoftc *sc;
! 185: caddr_t addr;
! 186: int len;
! 187: {
! 188: }
! 189:
! 190: int
! 191: ipicintr_establish(vec, ih, name)
! 192: int vec;
! 193: struct intrhand *ih;
! 194: const char *name;
! 195: {
! 196: return intr_establish(vec, ih, name);
! 197: }
CVSweb