[BACK]Return to macobio.c CVS log [TXT][DIR] Up to [local] / sys / arch / macppc / pci

Annotation of sys/arch/macppc/pci/macobio.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: macobio.c,v 1.17 2006/06/19 22:42:35 miod Exp $       */
                      2: /*     $NetBSD: obio.c,v 1.6 1999/05/01 10:36:08 tsubai Exp $  */
                      3:
                      4: /*-
                      5:  * Copyright (C) 1998  Internet Research Institute, Inc.
                      6:  * All rights reserved.
                      7:  *
                      8:  * Redistribution and use in source and binary forms, with or without
                      9:  * modification, are permitted provided that the following conditions
                     10:  * are met:
                     11:  * 1. Redistributions of source code must retain the above copyright
                     12:  *    notice, this list of conditions and the following disclaimer.
                     13:  * 2. Redistributions in binary form must reproduce the above copyright
                     14:  *    notice, this list of conditions and the following disclaimer in the
                     15:  *    documentation and/or other materials provided with the distribution.
                     16:  * 3. All advertising materials mentioning features or use of this software
                     17:  *    must display the following acknowledgement:
                     18:  *     This product includes software developed by
                     19:  *     Internet Research Institute, Inc.
                     20:  * 4. The name of the author may not be used to endorse or promote products
                     21:  *    derived from this software without specific prior written permission.
                     22:  *
                     23:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
                     24:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
                     25:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
                     26:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
                     27:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
                     28:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
                     29:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
                     30:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
                     31:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
                     32:  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     33:  */
                     34:
                     35: #include <sys/types.h>
                     36: #include <sys/param.h>
                     37: #include <sys/systm.h>
                     38: #include <sys/kernel.h>
                     39: #include <sys/device.h>
                     40:
                     41: #include <dev/pci/pcivar.h>
                     42: #include <dev/pci/pcidevs.h>
                     43:
                     44: #include <dev/ofw/openfirm.h>
                     45:
                     46: #include <machine/bus.h>
                     47: #include <machine/autoconf.h>
                     48:
                     49: void macobio_attach(struct device *, struct device *, void *);
                     50: int macobio_match(struct device *, void *, void *);
                     51: int macobio_print(void *, const char *);
                     52: void macobio_modem_power(int enable);
                     53:
                     54: void *undef_mac_establish(void * lcv, int irq, int type, int level,
                     55:     int (*ih_fun)(void *), void *ih_arg, char *name);
                     56: void mac_intr_disestab(void *lcp, void *arg);
                     57:
                     58: struct macobio_softc {
                     59:        struct device sc_dev;
                     60:        int sc_node;
                     61:        struct ppc_bus_space sc_membus_space;
                     62:        int     sc_id; /* copy of the PCI pa_id */
                     63:        u_int8_t *obiomem;
                     64: };
                     65: struct cfdriver macobio_cd = {
                     66:        NULL, "macobio", DV_DULL,
                     67: };
                     68:
                     69:
                     70: struct cfattach macobio_ca = {
                     71:        sizeof(struct macobio_softc), macobio_match, macobio_attach
                     72: };
                     73:
                     74: int
                     75: macobio_match(struct device *parent, void *cf, void *aux)
                     76: {
                     77:        struct pci_attach_args *pa = aux;
                     78:
                     79:        if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_APPLE)
                     80:                switch (PCI_PRODUCT(pa->pa_id)) {
                     81:
                     82:                case PCI_PRODUCT_APPLE_GC:
                     83:                case PCI_PRODUCT_APPLE_OHARE:
                     84:                case PCI_PRODUCT_APPLE_HEATHROW:
                     85:                case PCI_PRODUCT_APPLE_PADDINGTON:
                     86:                case PCI_PRODUCT_APPLE_KEYLARGO:
                     87:                case PCI_PRODUCT_APPLE_INTREPID:
                     88:                case PCI_PRODUCT_APPLE_PANGEA_MACIO:
                     89:                case PCI_PRODUCT_APPLE_SHASTA:
                     90:                case PCI_PRODUCT_APPLE_K2_MACIO:
                     91:                        return 1;
                     92:                }
                     93:
                     94:        return 0;
                     95: }
                     96:
                     97: #define HEATHROW_FCR_OFFSET 0x38
                     98: u_int32_t *heathrow_FCR = NULL;
                     99:
                    100: /*
                    101:  * Attach all the sub-devices we can find
                    102:  */
                    103: void
                    104: macobio_attach(struct device *parent, struct device *self, void *aux)
                    105: {
                    106:        struct macobio_softc *sc = (struct macobio_softc *)self;
                    107:        struct pci_attach_args *pa = aux;
                    108:        struct confargs ca;
                    109:        int node, child, namelen;
                    110:        u_int32_t reg[20];
                    111:        int32_t intr[8];
                    112:        char name[32];
                    113:        int need_interrupt_controller = 0;
                    114:
                    115:        sc->sc_id = pa->pa_id; /* save of type for later */
                    116:
                    117:        switch (PCI_PRODUCT(pa->pa_id)) {
                    118:
                    119:        /* XXX should not use name */
                    120:        case PCI_PRODUCT_APPLE_GC:
                    121:                node = OF_finddevice("/bandit/gc");
                    122:                need_interrupt_controller = 1;
                    123:                break;
                    124:
                    125:        case PCI_PRODUCT_APPLE_OHARE:
                    126:                node = OF_finddevice("/bandit/ohare");
                    127:                need_interrupt_controller = 1;
                    128:                break;
                    129:
                    130:        case PCI_PRODUCT_APPLE_HEATHROW:
                    131:        case PCI_PRODUCT_APPLE_PADDINGTON:
                    132:                node = OF_finddevice("mac-io");
                    133:                if (node == -1)
                    134:                        node = OF_finddevice("/pci/mac-io");
                    135:                if (OF_getprop(node, "assigned-addresses", reg, sizeof(reg))
                    136:                        == (sizeof (reg[0]) * 5))
                    137:                {
                    138:                        /* always ??? */
                    139:                        heathrow_FCR = mapiodev(reg[2] + HEATHROW_FCR_OFFSET,
                    140:                            4);
                    141:                }
                    142:                break;
                    143:        case PCI_PRODUCT_APPLE_KEYLARGO:
                    144:        case PCI_PRODUCT_APPLE_INTREPID:
                    145:        case PCI_PRODUCT_APPLE_PANGEA_MACIO:
                    146:        case PCI_PRODUCT_APPLE_SHASTA:
                    147:        case PCI_PRODUCT_APPLE_K2_MACIO:
                    148:                node = OF_finddevice("mac-io");
                    149:                if (node == -1)
                    150:                        node = OF_finddevice("/pci/mac-io");
                    151:                if (OF_getprop(node, "assigned-addresses", reg, sizeof(reg))
                    152:                    == (sizeof (reg[0]) * 5))
                    153:                         sc->obiomem = mapiodev(reg[2], 0x100);
                    154:                break;
                    155:        default:
                    156:                printf(": unknown macobio controller\n");
                    157:                return;
                    158:        }
                    159:        sc->sc_node = node;
                    160:
                    161:        if (OF_getprop(node, "assigned-addresses", reg, sizeof(reg)) < 12)
                    162:                return;
                    163:
                    164:        ca.ca_baseaddr = reg[2];
                    165:
                    166:        sc->sc_membus_space.bus_base = ca.ca_baseaddr;
                    167:
                    168:        ca.ca_iot = &sc->sc_membus_space;
                    169:        ca.ca_dmat = pa->pa_dmat;
                    170:
                    171:        printf("\n");
                    172:
                    173:        /*
                    174:         * This might be a hack, but it makes the interrupt controller
                    175:         * attach as expected if a device node existed in the OF tree.
                    176:         */
                    177:        if (need_interrupt_controller) {
                    178:                /* force attachment of legacy interrupt controllers */
                    179:                ca.ca_name = "legacy-interrupt-controller";
                    180:                ca.ca_node = 0;
                    181:
                    182:                ca.ca_nreg  = 0;
                    183:                ca.ca_nintr = 0;
                    184:
                    185:                ca.ca_reg = NULL;
                    186:                ca.ca_intr = NULL;
                    187:
                    188:                config_found(self, &ca, macobio_print);
                    189:        }
                    190:
                    191:        for (child = OF_child(node); child; child = OF_peer(child)) {
                    192:                namelen = OF_getprop(child, "name", name, sizeof(name));
                    193:                if (namelen < 0)
                    194:                        continue;
                    195:                if (namelen >= sizeof(name))
                    196:                        continue;
                    197:
                    198:                name[namelen] = 0;
                    199:                ca.ca_name = name;
                    200:                ca.ca_node = child;
                    201:
                    202:                ca.ca_nreg  = OF_getprop(child, "reg", reg, sizeof(reg));
                    203:                ca.ca_nintr = OF_getprop(child, "AAPL,interrupts", intr,
                    204:                                sizeof(intr));
                    205:                if (ca.ca_nintr == -1)
                    206:                        ca.ca_nintr = OF_getprop(child, "interrupts", intr,
                    207:                                        sizeof(intr));
                    208:
                    209:                ca.ca_reg = reg;
                    210:                ca.ca_intr = intr;
                    211:
                    212:                config_found(self, &ca, macobio_print);
                    213:        }
                    214: }
                    215:
                    216: int
                    217: macobio_print(void *aux, const char *macobio)
                    218: {
                    219:        struct confargs *ca = aux;
                    220:
                    221:        if (macobio)
                    222:                printf("\"%s\" at %s", ca->ca_name, macobio);
                    223:
                    224:        if (ca->ca_nreg > 0)
                    225:                printf(" offset 0x%x", ca->ca_reg[0]);
                    226:
                    227:        return UNCONF;
                    228: }
                    229:
                    230: void *
                    231: undef_mac_establish(void * lcv, int irq, int type, int level,
                    232:     int (*ih_fun)(void *), void *ih_arg, char *name)
                    233: {
                    234:        printf("mac_intr_establish called, not yet inited\n");
                    235:        return 0;
                    236: }
                    237:
                    238: void
                    239: mac_intr_disestab(void *lcp, void *arg)
                    240: {
                    241:        printf("mac_intr_disestablish called, not yet inited\n");
                    242: }
                    243:
                    244: intr_establish_t *mac_intr_establish_func = undef_mac_establish;
                    245: intr_disestablish_t *mac_intr_disestablish_func = mac_intr_disestab;
                    246:
                    247: void *
                    248: mac_intr_establish(void * lcv, int irq, int type, int level,
                    249:     int (*ih_fun)(void *), void *ih_arg, char *name)
                    250: {
                    251:        return (*mac_intr_establish_func)(lcv, irq, type, level, ih_fun,
                    252:            ih_arg, name);
                    253: }
                    254: void
                    255: mac_intr_disestablish(void *lcp, void *arg)
                    256: {
                    257:        (*mac_intr_disestablish_func)(lcp, arg);
                    258: }
                    259:
                    260: void keylargo_fcr_enable(int offset, u_int32_t bits);
                    261: void keylargo_fcr_disable(int offset, u_int32_t bits);
                    262: u_int32_t keylargo_fcr_read(int offset);
                    263:
                    264: void
                    265: keylargo_fcr_enable(int offset, u_int32_t bits)
                    266: {
                    267:        struct macobio_softc *sc = macobio_cd.cd_devs[0];
                    268:        if (sc->obiomem == 0)
                    269:                return;
                    270:
                    271:        bits |=  in32rb(sc->obiomem + offset);
                    272:        out32rb(sc->obiomem + offset, bits);
                    273: }
                    274: void
                    275: keylargo_fcr_disable(int offset, u_int32_t bits)
                    276: {
                    277:        struct macobio_softc *sc = macobio_cd.cd_devs[0];
                    278:        if (sc->obiomem == 0)
                    279:                return;
                    280:
                    281:        bits =  in32rb(sc->obiomem + offset) & ~bits;
                    282:        out32rb(sc->obiomem + offset, bits);
                    283: }
                    284:
                    285: u_int32_t
                    286: keylargo_fcr_read(int offset)
                    287: {
                    288:        struct macobio_softc *sc = macobio_cd.cd_devs[0];
                    289:        if (sc->obiomem == 0)
                    290:                return -1;
                    291:
                    292:        return in32rb(sc->obiomem + offset);
                    293: }
                    294:
                    295: void
                    296: macobio_modem_power(int enable)
                    297: {
                    298:        u_int32_t val;
                    299:        struct macobio_softc *sc = macobio_cd.cd_devs[0];
                    300:        if (PCI_PRODUCT(sc->sc_id) == PCI_PRODUCT_APPLE_KEYLARGO ||
                    301:            PCI_PRODUCT(sc->sc_id) == PCI_PRODUCT_APPLE_INTREPID) {
                    302:                val = in32rb(sc->obiomem + 0x40);
                    303:                if (enable)
                    304:                        val = val & ~((u_int32_t)1<<25);
                    305:                else
                    306:                        val = val | ((u_int32_t)1<<25);
                    307:                out32rb(sc->obiomem + 0x40, val);
                    308:        }
                    309:        if (PCI_PRODUCT(sc->sc_id) == PCI_PRODUCT_APPLE_PANGEA_MACIO) {
                    310:                if (enable) {
                    311:                        /* set reset */
                    312:                        out8(sc->obiomem + 0x006a + 0x03, 0x04);
                    313:                        /* power modem on */
                    314:                        out8(sc->obiomem + 0x006a + 0x02, 0x04);
                    315:                        /* unset reset */
                    316:                        out8(sc->obiomem + 0x006a + 0x03, 0x05);
                    317:                }  else {
                    318:                        /* disable it how? */
                    319:                }
                    320:        }
                    321: }

CVSweb