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

Annotation of sys/arch/alpha/pci/tsc.c, Revision 1.1.1.1

1.1       nbrk        1: /* $OpenBSD: tsc.c,v 1.13 2006/12/14 17:36:12 kettenis Exp $ */
                      2: /* $NetBSD: tsc.c,v 1.3 2000/06/25 19:17:40 thorpej Exp $ */
                      3:
                      4: /*-
                      5:  * Copyright (c) 1999 by Ross Harvey.  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 Ross Harvey.
                     18:  * 4. The name of Ross Harvey may not be used to endorse or promote products
                     19:  *    derived from this software without specific prior written permission.
                     20:  *
                     21:  * THIS SOFTWARE IS PROVIDED BY ROSS HARVEY ``AS IS'' AND ANY EXPRESS
                     22:  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
                     23:  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURP0SE
                     24:  * ARE DISCLAIMED.  IN NO EVENT SHALL ROSS HARVEY BE LIABLE FOR ANY
                     25:  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
                     26:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
                     27:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     28:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     29:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     30:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     31:  * SUCH DAMAGE.
                     32:  *
                     33:  */
                     34:
                     35: #include <sys/param.h>
                     36: #include <sys/systm.h>
                     37: #include <sys/device.h>
                     38: #include <sys/malloc.h>
                     39:
                     40: #include <machine/autoconf.h>
                     41: #include <machine/rpb.h>
                     42:
                     43: #include <dev/isa/isareg.h>
                     44: #include <dev/isa/isavar.h>
                     45: #include <dev/pci/pcireg.h>
                     46: #include <dev/pci/pcivar.h>
                     47: #include <alpha/pci/tsreg.h>
                     48: #include <alpha/pci/tsvar.h>
                     49:
                     50: #ifdef DEC_6600
                     51: #include <alpha/pci/pci_6600.h>
                     52: #endif
                     53:
                     54: #define tsc() { Generate ctags(1) key. }
                     55:
                     56: int    tscmatch(struct device *, void *, void *);
                     57: void   tscattach(struct device *, struct device *, void *);
                     58:
                     59: struct cfattach tsc_ca = {
                     60:        sizeof(struct device), tscmatch, tscattach,
                     61: };
                     62:
                     63: struct cfdriver tsc_cd = {
                     64:         NULL, "tsc", DV_DULL,
                     65: };
                     66:
                     67: struct tsp_config tsp_configuration[2];
                     68:
                     69: static int tscprint(void *, const char *pnp);
                     70:
                     71: int    tspmatch(struct device *, void *, void *);
                     72: void   tspattach(struct device *, struct device *, void *);
                     73:
                     74: struct cfattach tsp_ca = {
                     75:        sizeof(struct tsp_softc), tspmatch, tspattach,
                     76: };
                     77:
                     78: struct cfdriver tsp_cd = {
                     79:         NULL, "tsp", DV_DULL,
                     80: };
                     81:
                     82:
                     83: static int tspprint(void *, const char *pnp);
                     84:
                     85: #if    0
                     86: static int tsp_bus_get_window(int, int,
                     87:        struct alpha_bus_space_translation *);
                     88: #endif
                     89:
                     90: /* There can be only one */
                     91: static int tscfound;
                     92:
                     93: /* Which hose is the display console connected to? */
                     94: int tsp_console_hose;
                     95:
                     96: int
                     97: tscmatch(parent, match, aux)
                     98:        struct device *parent;
                     99:        void *match;
                    100:        void *aux;
                    101: {
                    102:        struct mainbus_attach_args *ma = aux;
                    103:
                    104:        return cputype == ST_DEC_6600
                    105:            && strcmp(ma->ma_name, tsc_cd.cd_name) == 0
                    106:            && !tscfound;
                    107: }
                    108:
                    109: void tscattach(parent, self, aux)
                    110:        struct device *parent, *self;
                    111:        void *aux;
                    112: {
                    113:        int i;
                    114:        int nbus;
                    115:        u_int64_t csc, aar;
                    116:        struct tsp_attach_args tsp;
                    117:        struct mainbus_attach_args *ma = aux;
                    118:
                    119:        tscfound = 1;
                    120:
                    121:        csc = LDQP(TS_C_CSC);
                    122:
                    123:        nbus = 1 + (CSC_BC(csc) >= 2);
                    124:        printf(": 21272 Chipset, Cchip rev %d\n"
                    125:                "%s%d: %c Dchips, %d memory bus%s of %d bytes\n",
                    126:                (int)MISC_REV(LDQP(TS_C_MISC)),
                    127:                ma->ma_name, ma->ma_slot, "2448"[CSC_BC(csc)],
                    128:                nbus, nbus > 1 ? "es" : "", 16 + 16 * ((csc & CSC_AW) != 0));
                    129:        printf("%s%d: arrays present: ", ma->ma_name, ma->ma_slot);
                    130:        for(i = 0; i < 4; ++i) {
                    131:                aar = LDQP(TS_C_AAR0 + i * TS_STEP);
                    132:                printf("%s%dMB%s", i ? ", " : "", (8 << AAR_ASIZ(aar)) & ~0xf,
                    133:                    aar & AAR_SPLIT ? " (split)" : "");
                    134:        }
                    135:        printf(", Dchip 0 rev %d\n", (int)LDQP(TS_D_DREV) & 0xf);
                    136:
                    137:        bzero(&tsp, sizeof tsp);
                    138:        tsp.tsp_name = "tsp";
                    139:        config_found(self, &tsp, NULL);
                    140:
                    141:        if(LDQP(TS_C_CSC) & CSC_P1P) {
                    142:                ++tsp.tsp_slot;
                    143:                config_found(self, &tsp, tscprint);
                    144:        }
                    145: }
                    146:
                    147: static int
                    148: tscprint(aux, p)
                    149:        void *aux;
                    150:        const char *p;
                    151: {
                    152:        register struct tsp_attach_args *tsp = aux;
                    153:
                    154:        if(p)
                    155:                printf("%s%d at %s", tsp->tsp_name, tsp->tsp_slot, p);
                    156:        return UNCONF;
                    157: }
                    158:
                    159: #define tsp() { Generate ctags(1) key. }
                    160:
                    161: int
                    162: tspmatch(parent, match, aux)
                    163:        struct device *parent;
                    164:        void *match;
                    165:        void *aux;
                    166: {
                    167:        struct tsp_attach_args *t = aux;
                    168:
                    169:        return  cputype == ST_DEC_6600
                    170:            && strcmp(t->tsp_name, tsp_cd.cd_name) == 0;
                    171: }
                    172:
                    173: void
                    174: tspattach(parent, self, aux)
                    175:        struct device *parent, *self;
                    176:        void *aux;
                    177: {
                    178:        struct pcibus_attach_args pba;
                    179:        struct tsp_attach_args *t = aux;
                    180:        struct tsp_config *pcp;
                    181:
                    182:        printf("\n");
                    183:        pcp = tsp_init(1, t->tsp_slot);
                    184:
                    185:        tsp_dma_init(pcp);
                    186:
                    187:        /*
                    188:         * Do PCI memory initialization that needs to be deferred until
                    189:         * malloc is safe.  On the Tsunami, we need to do this after
                    190:         * DMA is initialized, as well.
                    191:         */
                    192:        tsp_bus_mem_init2(pcp);
                    193:
                    194:        pci_6600_pickintr(pcp);
                    195:
                    196:        pba.pba_busname = "pci";
                    197:        pba.pba_iot = &pcp->pc_iot;
                    198:        pba.pba_memt = &pcp->pc_memt;
                    199:        pba.pba_dmat =
                    200:            alphabus_dma_get_tag(&pcp->pc_dmat_direct, ALPHA_BUS_PCI);
                    201:        pba.pba_pc = &pcp->pc_pc;
                    202:        pba.pba_domain = pci_ndomains++;
                    203:        pba.pba_bus = 0;
                    204:        pba.pba_bridgetag = NULL;
                    205: #ifdef notyet
                    206:        pba.pba_flags = PCI_FLAGS_IO_ENABLED | PCI_FLAGS_MEM_ENABLED |
                    207:            PCI_FLAGS_MRL_OKAY | PCI_FLAGS_MRM_OKAY | PCI_FLAGS_MWI_OKAY;
                    208: #endif
                    209:        config_found(self, &pba, tspprint);
                    210: }
                    211:
                    212: struct tsp_config *
                    213: tsp_init(mallocsafe, n)
                    214:        int mallocsafe;
                    215:        int n;  /* Pchip number */
                    216: {
                    217:        struct tsp_config *pcp;
                    218:
                    219:        KASSERT((n | 1) == 1);
                    220:        pcp = &tsp_configuration[n];
                    221:        pcp->pc_pslot = n;
                    222:        pcp->pc_iobase = TS_Pn(n, 0);
                    223:        pcp->pc_csr = S_PAGE(TS_Pn(n, P_CSRBASE));
                    224:        snprintf(pcp->pc_io_ex_name, sizeof pcp->pc_io_ex_name,
                    225:            "tsp%d_bus_io", n);
                    226:        snprintf(pcp->pc_mem_ex_name, sizeof pcp->pc_mem_ex_name,
                    227:            "tsp%d_bus_mem", n);
                    228:
                    229:        if (!pcp->pc_initted) {
                    230:                tsp_bus_io_init(&pcp->pc_iot, pcp);
                    231:                tsp_bus_mem_init(&pcp->pc_memt, pcp);
                    232: #if 0
                    233:                alpha_bus_window_count[ALPHA_BUS_TYPE_PCI_IO] = 1;
                    234:                alpha_bus_window_count[ALPHA_BUS_TYPE_PCI_MEM] = 1;
                    235:
                    236:                alpha_bus_get_window = tsp_bus_get_window;
                    237: #endif
                    238:        }
                    239:        pcp->pc_mallocsafe = mallocsafe;
                    240:        tsp_pci_init(&pcp->pc_pc, pcp);
                    241:        alpha_pci_chipset = &pcp->pc_pc;
                    242:        alpha_pci_chipset->pc_name = "tsunami";
                    243:        alpha_pci_chipset->pc_mem = P_PCI_MEM;
                    244:        alpha_pci_chipset->pc_ports = P_PCI_IO;
                    245:        alpha_pci_chipset->pc_hae_mask = 0;
                    246:        alpha_pci_chipset->pc_dense = TS_P0(0);
                    247:        alpha_pci_chipset->pc_bwx = 1;
                    248:        pcp->pc_initted = 1;
                    249:        return pcp;
                    250: }
                    251:
                    252: static int
                    253: tspprint(aux, p)
                    254:        void *aux;
                    255:        const char *p;
                    256: {
                    257:        register struct pcibus_attach_args *pci = aux;
                    258:
                    259:        if(p)
                    260:                printf("%s at %s", pci->pba_busname, p);
                    261:        printf(" bus %d", pci->pba_bus);
                    262:        return UNCONF;
                    263: }
                    264:
                    265: #if 0
                    266: static int
                    267: tsp_bus_get_window(type, window, abst)
                    268:        int type, window;
                    269:        struct alpha_bus_space_translation *abst;
                    270: {
                    271:        struct tsp_config *tsp = &tsp_configuration[tsp_console_hose];
                    272:        bus_space_tag_t st;
                    273:        int error;
                    274:
                    275:        switch (type) {
                    276:        case ALPHA_BUS_TYPE_PCI_IO:
                    277:                st = &tsp->pc_iot;
                    278:                break;
                    279:
                    280:        case ALPHA_BUS_TYPE_PCI_MEM:
                    281:                st = &tsp->pc_memt;
                    282:                break;
                    283:
                    284:        default:
                    285:                panic("tsp_bus_get_window");
                    286:        }
                    287:
                    288:        error = alpha_bus_space_get_window(st, window, abst);
                    289:        if (error)
                    290:                return (error);
                    291:
                    292:        abst->abst_sys_start = TS_PHYSADDR(abst->abst_sys_start);
                    293:        abst->abst_sys_end = TS_PHYSADDR(abst->abst_sys_end);
                    294:
                    295:        return (0);
                    296: }
                    297: #endif

CVSweb