Annotation of sys/arch/mvme88k/dev/syscon.c, Revision 1.1
1.1 ! nbrk 1: /* $OpenBSD: syscon.c,v 1.27 2006/11/18 12:04:57 miod Exp $ */
! 2: /*
! 3: * Copyright (c) 1999 Steve Murphree, Jr.
! 4: * All rights reserved.
! 5: *
! 6: * Redistribution and use in source and binary forms, with or without
! 7: * modification, are permitted provided that the following conditions
! 8: * are met:
! 9: * 1. Redistributions of source code must retain the above copyright
! 10: * notice, this list of conditions and the following disclaimer.
! 11: * 2. Redistributions in binary form must reproduce the above copyright
! 12: * notice, this list of conditions and the following disclaimer in the
! 13: * documentation and/or other materials provided with the distribution.
! 14: *
! 15: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
! 16: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
! 17: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
! 18: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
! 19: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
! 20: * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
! 21: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
! 22: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
! 23: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
! 24: * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
! 25: */
! 26:
! 27: /*
! 28: * VME188 SYSCON
! 29: */
! 30:
! 31: #include <sys/param.h>
! 32: #include <sys/conf.h>
! 33: #include <sys/systm.h>
! 34: #include <sys/kernel.h>
! 35: #include <sys/device.h>
! 36:
! 37: #include <machine/autoconf.h>
! 38: #include <machine/cpu.h>
! 39:
! 40: #include <machine/mvme188.h>
! 41: #include <mvme88k/dev/sysconreg.h>
! 42:
! 43: struct sysconsoftc {
! 44: struct device sc_dev;
! 45:
! 46: struct intrhand sc_abih; /* `abort' switch */
! 47: struct intrhand sc_acih; /* `ac fail' */
! 48: struct intrhand sc_sfih; /* `sys fail' */
! 49: #if 0
! 50: struct intrhand sc_m188ih; /* `m188 interrupt' */
! 51: #endif
! 52: };
! 53:
! 54: void sysconattach(struct device *, struct device *, void *);
! 55: int sysconmatch(struct device *, void *, void *);
! 56:
! 57: int syscon_print(void *, const char *);
! 58: int syscon_scan(struct device *, void *, void *);
! 59: int sysconabort(void *);
! 60: int sysconacfail(void *);
! 61: int sysconsysfail(void *);
! 62: int sysconm188(void *);
! 63:
! 64: struct cfattach syscon_ca = {
! 65: sizeof(struct sysconsoftc), sysconmatch, sysconattach
! 66: };
! 67:
! 68: struct cfdriver syscon_cd = {
! 69: NULL, "syscon", DV_DULL
! 70: };
! 71:
! 72: int
! 73: sysconmatch(parent, vcf, args)
! 74: struct device *parent;
! 75: void *vcf, *args;
! 76: {
! 77: /* Don't match if wrong cpu */
! 78: if (brdtyp != BRD_188)
! 79: return (0);
! 80:
! 81: return (1);
! 82: }
! 83:
! 84: int
! 85: syscon_print(args, bus)
! 86: void *args;
! 87: const char *bus;
! 88: {
! 89: struct confargs *ca = args;
! 90:
! 91: if (ca->ca_offset != -1)
! 92: printf(" offset 0x%x", ca->ca_offset);
! 93: if (ca->ca_ipl > 0)
! 94: printf(" ipl %d", ca->ca_ipl);
! 95: return (UNCONF);
! 96: }
! 97:
! 98: int
! 99: syscon_scan(parent, child, args)
! 100: struct device *parent;
! 101: void *child, *args;
! 102: {
! 103: struct cfdata *cf = child;
! 104: struct confargs oca, *ca = args;
! 105:
! 106: bzero(&oca, sizeof oca);
! 107: oca.ca_iot = ca->ca_iot;
! 108: oca.ca_dmat = ca->ca_dmat;
! 109: oca.ca_offset = cf->cf_loc[0];
! 110: oca.ca_ipl = cf->cf_loc[1];
! 111: if (oca.ca_offset != -1) {
! 112: oca.ca_paddr = ca->ca_paddr + oca.ca_offset;
! 113: } else {
! 114: oca.ca_paddr = -1;
! 115: }
! 116: oca.ca_bustype = BUS_SYSCON;
! 117: oca.ca_name = cf->cf_driver->cd_name;
! 118: if ((*cf->cf_attach->ca_match)(parent, cf, &oca) == 0)
! 119: return (0);
! 120: config_attach(parent, cf, &oca, syscon_print);
! 121: return (1);
! 122: }
! 123:
! 124: void
! 125: sysconattach(parent, self, args)
! 126: struct device *parent, *self;
! 127: void *args;
! 128: {
! 129: struct sysconsoftc *sc = (struct sysconsoftc *)self;
! 130:
! 131: printf("\n");
! 132:
! 133: /*
! 134: * Clear SYSFAIL if lit.
! 135: */
! 136: *(volatile u_int32_t *)MVME188_UCSR |= UCSR_DRVSFBIT;
! 137:
! 138: /*
! 139: * pseudo driver, abort interrupt handler
! 140: */
! 141: sc->sc_abih.ih_fn = sysconabort;
! 142: sc->sc_abih.ih_arg = 0;
! 143: sc->sc_abih.ih_wantframe = 1;
! 144: sc->sc_abih.ih_ipl = IPL_ABORT;
! 145:
! 146: sc->sc_acih.ih_fn = sysconacfail;
! 147: sc->sc_acih.ih_arg = 0;
! 148: sc->sc_acih.ih_wantframe = 1;
! 149: sc->sc_acih.ih_ipl = IPL_ABORT;
! 150:
! 151: sc->sc_sfih.ih_fn = sysconsysfail;
! 152: sc->sc_sfih.ih_arg = 0;
! 153: sc->sc_sfih.ih_wantframe = 1;
! 154: sc->sc_sfih.ih_ipl = IPL_ABORT;
! 155:
! 156: #if 0
! 157: sc->sc_m188ih.ih_fn = sysconm188;
! 158: sc->sc_m188ih.ih_arg = 0;
! 159: sc->sc_m188ih.ih_wantframe = 1;
! 160: sc->sc_m188ih.ih_ipl = IPL_ABORT;
! 161: #endif
! 162:
! 163: sysconintr_establish(SYSCV_ABRT, &sc->sc_abih, "abort");
! 164: sysconintr_establish(SYSCV_ACF, &sc->sc_acih, "acfail");
! 165: sysconintr_establish(SYSCV_SYSF, &sc->sc_sfih, "sysfail");
! 166: #if 0
! 167: intr_establish(M188_IVEC, &sc->sc_m188ih, self->dv_xname);
! 168: #endif
! 169:
! 170: config_search(syscon_scan, self, args);
! 171: }
! 172:
! 173: int
! 174: sysconintr_establish(int vec, struct intrhand *ih, const char *name)
! 175: {
! 176: #ifdef DIAGNOSTIC
! 177: if (vec < 0 || vec >= SYSCON_NVEC)
! 178: panic("sysconintr_establish: illegal vector 0x%x", vec);
! 179: #endif
! 180:
! 181: return intr_establish(SYSCON_VECT + vec, ih, name);
! 182: }
! 183:
! 184: int
! 185: sysconabort(eframe)
! 186: void *eframe;
! 187: {
! 188: *(volatile u_int32_t *)MVME188_CLRINT = ISTATE_ABORT;
! 189: nmihand(eframe);
! 190: return (1);
! 191: }
! 192:
! 193: int
! 194: sysconsysfail(eframe)
! 195: void *eframe;
! 196: {
! 197: *(volatile u_int32_t *)MVME188_CLRINT = ISTATE_SYSFAIL;
! 198: printf("WARNING: SYSFAIL* ASSERTED\n");
! 199: return (1);
! 200: }
! 201:
! 202: int
! 203: sysconacfail(eframe)
! 204: void *eframe;
! 205: {
! 206: *(volatile u_int32_t *)MVME188_CLRINT = ISTATE_ACFAIL;
! 207: printf("WARNING: ACFAIL* ASSERTED\n");
! 208: return (1);
! 209: }
! 210:
! 211: #if 0
! 212: int
! 213: sysconm188(eframe)
! 214: void *eframe;
! 215: {
! 216: /* shouldn't happen! */
! 217: printf("MVME188: self-inflicted interrupt\n");
! 218: return (1);
! 219: }
! 220: #endif
CVSweb