[BACK]Return to lasi.c CVS log [TXT][DIR] Up to [local] / sys / arch / hppa / dev

Annotation of sys/arch/hppa/dev/lasi.c, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: lasi.c,v 1.22 2004/09/15 20:11:28 mickey Exp $        */
        !             2:
        !             3: /*
        !             4:  * Copyright (c) 1998-2003 Michael Shalayeff
        !             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 OR HIS RELATIVES BE LIABLE FOR ANY DIRECT,
        !            20:  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
        !            21:  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
        !            22:  * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            23:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
        !            24:  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
        !            25:  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
        !            26:  * THE POSSIBILITY OF SUCH DAMAGE.
        !            27:  */
        !            28:
        !            29: #undef LASIDEBUG
        !            30:
        !            31: #include <sys/param.h>
        !            32: #include <sys/systm.h>
        !            33: #include <sys/device.h>
        !            34: #include <sys/reboot.h>
        !            35:
        !            36: #include <machine/bus.h>
        !            37: #include <machine/iomod.h>
        !            38: #include <machine/reg.h>
        !            39: #include <machine/autoconf.h>
        !            40:
        !            41: #include <hppa/dev/cpudevs.h>
        !            42:
        !            43: #include <hppa/gsc/gscbusvar.h>
        !            44:
        !            45: #define        LASI_IOMASK     0xfff00000
        !            46:
        !            47: struct lasi_hwr {
        !            48:        u_int32_t lasi_power;
        !            49: #define        LASI_BLINK      0x01
        !            50: #define        LASI_OFF        0x02
        !            51:        u_int32_t lasi_error;
        !            52:        u_int32_t lasi_version;
        !            53:        u_int32_t lasi_reset;
        !            54:        u_int32_t lasi_arbmask;
        !            55: };
        !            56:
        !            57: struct lasi_trs {
        !            58:        u_int32_t lasi_irr;     /* int requset register */
        !            59:        u_int32_t lasi_imr;     /* int mask register */
        !            60:        u_int32_t lasi_ipr;     /* int pending register */
        !            61:        u_int32_t lasi_icr;     /* int command? register */
        !            62:        u_int32_t lasi_iar;     /* int acquire? register */
        !            63: };
        !            64:
        !            65: struct lasi_softc {
        !            66:        struct device sc_dev;
        !            67:        struct gscbus_ic sc_ic;
        !            68:
        !            69:        struct lasi_hwr volatile *sc_hw;
        !            70:        struct lasi_trs volatile *sc_trs;
        !            71:        struct gsc_attach_args ga;      /* for deferred attach */
        !            72: };
        !            73:
        !            74: int    lasimatch(struct device *, void *, void *);
        !            75: void   lasiattach(struct device *, struct device *, void *);
        !            76:
        !            77: struct cfattach lasi_ca = {
        !            78:        sizeof(struct lasi_softc), lasimatch, lasiattach
        !            79: };
        !            80:
        !            81: struct cfdriver lasi_cd = {
        !            82:        NULL, "lasi", DV_DULL
        !            83: };
        !            84:
        !            85: void lasi_cold_hook(int on);
        !            86: void lasi_gsc_attach(struct device *self);
        !            87:
        !            88: int
        !            89: lasimatch(parent, cfdata, aux)
        !            90:        struct device *parent;
        !            91:        void *cfdata;
        !            92:        void *aux;
        !            93: {
        !            94:        register struct confargs *ca = aux;
        !            95:        /* register struct cfdata *cf = cfdata; */
        !            96:
        !            97:        if (ca->ca_type.iodc_type != HPPA_TYPE_BHA ||
        !            98:            ca->ca_type.iodc_sv_model != HPPA_BHA_LASI)
        !            99:                return 0;
        !           100:
        !           101:        return 1;
        !           102: }
        !           103:
        !           104: void
        !           105: lasiattach(parent, self, aux)
        !           106:        struct device *parent;
        !           107:        struct device *self;
        !           108:        void *aux;
        !           109: {
        !           110:        struct lasi_softc *sc = (struct lasi_softc *)self;
        !           111:        struct confargs *ca = aux;
        !           112:        bus_space_handle_t ioh, ioh2;
        !           113:        int s, in;
        !           114:
        !           115:        if (bus_space_map(ca->ca_iot, ca->ca_hpa,
        !           116:            IOMOD_HPASIZE, 0, &ioh)) {
        !           117:                printf(": can't map TRS space\n");
        !           118:                return;
        !           119:        }
        !           120:
        !           121:        if (bus_space_map(ca->ca_iot, ca->ca_hpa + 0xc000,
        !           122:            IOMOD_HPASIZE, 0, &ioh2)) {
        !           123:                bus_space_unmap(ca->ca_iot, ioh, IOMOD_HPASIZE);
        !           124:                printf(": can't map IO space\n");
        !           125:                return;
        !           126:        }
        !           127:
        !           128:        sc->sc_trs = (struct lasi_trs *)ca->ca_hpa;
        !           129:        sc->sc_hw = (struct lasi_hwr *)(ca->ca_hpa + 0xc000);
        !           130:
        !           131:        /* XXX should we reset the chip here? */
        !           132:
        !           133:        printf(": rev %d.%d\n", (sc->sc_hw->lasi_version & 0xf0) >> 4,
        !           134:            sc->sc_hw->lasi_version & 0xf);
        !           135:
        !           136:        /* interrupts guts */
        !           137:        s = splhigh();
        !           138:        sc->sc_trs->lasi_iar = cpu_gethpa(0) | (31 - ca->ca_irq);
        !           139:        sc->sc_trs->lasi_icr = 0;
        !           140:        sc->sc_trs->lasi_imr = ~0U;
        !           141:        in = sc->sc_trs->lasi_irr;
        !           142:        sc->sc_trs->lasi_imr = 0;
        !           143:        splx(s);
        !           144:
        !           145:        sc->sc_ic.gsc_type = gsc_lasi;
        !           146:        sc->sc_ic.gsc_dv = sc;
        !           147:        sc->sc_ic.gsc_base = sc->sc_trs;
        !           148:
        !           149: #ifdef USELEDS
        !           150:        /* figure out the leds address */
        !           151:        switch (cpu_hvers) {
        !           152:        case HPPA_BOARD_HP712_60:
        !           153:        case HPPA_BOARD_HP712_80:
        !           154:        case HPPA_BOARD_HP712_100:
        !           155:        case HPPA_BOARD_HP743I_64:
        !           156:        case HPPA_BOARD_HP743I_100:
        !           157:        case HPPA_BOARD_HP712_120:
        !           158:                break;  /* only has one led. works different */
        !           159:
        !           160:        case HPPA_BOARD_HP715_64:
        !           161:        case HPPA_BOARD_HP715_80:
        !           162:        case HPPA_BOARD_HP715_100:
        !           163:        case HPPA_BOARD_HP715_100XC:
        !           164:        case HPPA_BOARD_HP725_100:
        !           165:        case HPPA_BOARD_HP725_120:
        !           166:                if (bus_space_map(ca->ca_iot, ca->ca_hpa - 0x20000,
        !           167:                    4, 0, (bus_space_handle_t *)&machine_ledaddr))
        !           168:                        machine_ledaddr = NULL;
        !           169:                machine_ledword = 1;
        !           170:                break;
        !           171:
        !           172:        case HPPA_BOARD_HP800_A180C:
        !           173:        case HPPA_BOARD_HP778_B132L:
        !           174:        case HPPA_BOARD_HP778_B132LP:
        !           175:        case HPPA_BOARD_HP778_B160L:
        !           176:        case HPPA_BOARD_HP778_B180L:
        !           177:        case HPPA_BOARD_HP780_C100:
        !           178:        case HPPA_BOARD_HP780_C110:
        !           179:        case HPPA_BOARD_HP779_C132L:
        !           180:        case HPPA_BOARD_HP779_C160L:
        !           181:        case HPPA_BOARD_HP779_C180L:
        !           182:        case HPPA_BOARD_HP779_C160L1:
        !           183:                if (bus_space_map(ca->ca_iot, 0xf0190000,
        !           184:                    4, 0, (bus_space_handle_t *)&machine_ledaddr))
        !           185:                        machine_ledaddr = NULL;
        !           186:                machine_ledword = 1;
        !           187:                break;
        !           188:
        !           189:        default:
        !           190:                machine_ledaddr = (u_int8_t *)sc->sc_hw;
        !           191:                machine_ledword = 1;
        !           192:                break;
        !           193:        }
        !           194: #endif
        !           195:
        !           196:        sc->ga.ga_ca = *ca;     /* clone from us */
        !           197:        if (!strcmp(parent->dv_xname, "mainbus0")) {
        !           198:                sc->ga.ga_dp.dp_bc[0] = sc->ga.ga_dp.dp_bc[1];
        !           199:                sc->ga.ga_dp.dp_bc[1] = sc->ga.ga_dp.dp_bc[2];
        !           200:                sc->ga.ga_dp.dp_bc[2] = sc->ga.ga_dp.dp_bc[3];
        !           201:                sc->ga.ga_dp.dp_bc[3] = sc->ga.ga_dp.dp_bc[4];
        !           202:                sc->ga.ga_dp.dp_bc[4] = sc->ga.ga_dp.dp_bc[5];
        !           203:                sc->ga.ga_dp.dp_bc[5] = sc->ga.ga_dp.dp_mod;
        !           204:                sc->ga.ga_dp.dp_mod = 0;
        !           205:        }
        !           206:        if (sc->sc_dev.dv_unit)
        !           207:                config_defer(self, lasi_gsc_attach);
        !           208:        else {
        !           209:                extern void (*cold_hook)(int);
        !           210:
        !           211:                lasi_gsc_attach(self);
        !           212:                /* could be already set by power(4) */
        !           213:                if (!cold_hook)
        !           214:                        cold_hook = lasi_cold_hook;
        !           215:        }
        !           216: }
        !           217:
        !           218: void
        !           219: lasi_gsc_attach(self)
        !           220:        struct device *self;
        !           221: {
        !           222:        struct lasi_softc *sc = (struct lasi_softc *)self;
        !           223:
        !           224:        sc->ga.ga_name = "gsc";
        !           225:        sc->ga.ga_hpamask = LASI_IOMASK;
        !           226:        sc->ga.ga_ic = &sc->sc_ic;
        !           227:        config_found(self, &sc->ga, gscprint);
        !           228: }
        !           229:
        !           230: void
        !           231: lasi_cold_hook(on)
        !           232:        int on;
        !           233: {
        !           234:        register struct lasi_softc *sc = lasi_cd.cd_devs[0];
        !           235:
        !           236:        if (!sc)
        !           237:                return;
        !           238:
        !           239:        switch (on) {
        !           240:        case HPPA_COLD_COLD:
        !           241:                sc->sc_hw->lasi_power = LASI_BLINK;
        !           242:                break;
        !           243:        case HPPA_COLD_HOT:
        !           244:                sc->sc_hw->lasi_power = 0;
        !           245:                break;
        !           246:        case HPPA_COLD_OFF:
        !           247:                sc->sc_hw->lasi_power = LASI_OFF;
        !           248:                break;
        !           249:        }
        !           250: }

CVSweb