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

Annotation of sys/arch/i386/pci/pchb.c, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: pchb.c,v 1.56 2007/06/01 22:45:17 biorn Exp $ */
        !             2: /*     $NetBSD: pchb.c,v 1.6 1997/06/06 23:29:16 thorpej Exp $ */
        !             3:
        !             4: /*
        !             5:  * Copyright (c) 2000 Michael Shalayeff
        !             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:  *
        !            17:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
        !            18:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
        !            19:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
        !            20:  * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT,
        !            21:  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
        !            22:  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
        !            23:  * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            24:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
        !            25:  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
        !            26:  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
        !            27:  * THE POSSIBILITY OF SUCH DAMAGE.
        !            28:  */
        !            29: /*-
        !            30:  * Copyright (c) 1996 The NetBSD Foundation, Inc.
        !            31:  * All rights reserved.
        !            32:  *
        !            33:  * This code is derived from software contributed to The NetBSD Foundation
        !            34:  * by Jason R. Thorpe.
        !            35:  *
        !            36:  * Redistribution and use in source and binary forms, with or without
        !            37:  * modification, are permitted provided that the following conditions
        !            38:  * are met:
        !            39:  * 1. Redistributions of source code must retain the above copyright
        !            40:  *    notice, this list of conditions and the following disclaimer.
        !            41:  * 2. Redistributions in binary form must reproduce the above copyright
        !            42:  *    notice, this list of conditions and the following disclaimer in the
        !            43:  *    documentation and/or other materials provided with the distribution.
        !            44:  * 3. All advertising materials mentioning features or use of this software
        !            45:  *    must display the following acknowledgement:
        !            46:  *        This product includes software developed by the NetBSD
        !            47:  *        Foundation, Inc. and its contributors.
        !            48:  * 4. Neither the name of The NetBSD Foundation nor the names of its
        !            49:  *    contributors may be used to endorse or promote products derived
        !            50:  *    from this software without specific prior written permission.
        !            51:  *
        !            52:  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
        !            53:  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
        !            54:  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
        !            55:  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
        !            56:  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
        !            57:  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
        !            58:  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
        !            59:  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
        !            60:  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
        !            61:  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
        !            62:  * POSSIBILITY OF SUCH DAMAGE.
        !            63:  */
        !            64:
        !            65: #include <sys/param.h>
        !            66: #include <sys/systm.h>
        !            67: #include <sys/device.h>
        !            68: #include <sys/proc.h>
        !            69: #include <sys/timeout.h>
        !            70:
        !            71: #include <machine/bus.h>
        !            72:
        !            73: #include <dev/pci/pcivar.h>
        !            74: #include <dev/pci/pcireg.h>
        !            75: #include <dev/pci/pcidevs.h>
        !            76:
        !            77: #include <dev/rndvar.h>
        !            78:
        !            79: #include <dev/ic/i82802reg.h>
        !            80:
        !            81: #define PCISET_INTEL_BRIDGETYPE_MASK   0x3
        !            82: #define PCISET_INTEL_TYPE_COMPAT       0x1
        !            83: #define PCISET_INTEL_TYPE_AUX          0x2
        !            84:
        !            85: #define PCISET_INTEL_BUSCONFIG_REG     0x48
        !            86: #define PCISET_INTEL_BRIDGE_NUMBER(reg)        (((reg) >> 8) & 0xff)
        !            87: #define PCISET_INTEL_PCI_BUS_NUMBER(reg)       (((reg) >> 16) & 0xff)
        !            88:
        !            89: #define PCISET_INTEL_SDRAMC_REG        0x74
        !            90: #define PCISET_INTEL_SDRAMC_IPDLT      (1 << 24)
        !            91:
        !            92: /* XXX should be in dev/ic/i82424{reg.var}.h */
        !            93: #define I82424_CPU_BCTL_REG            0x53
        !            94: #define I82424_PCI_BCTL_REG            0x54
        !            95:
        !            96: #define I82424_BCTL_CPUMEM_POSTEN      0x01
        !            97: #define I82424_BCTL_CPUPCI_POSTEN      0x02
        !            98: #define I82424_BCTL_PCIMEM_BURSTEN     0x01
        !            99: #define I82424_BCTL_PCI_BURSTEN                0x02
        !           100:
        !           101: /* XXX should be in dev/ic/amd64htreg.h */
        !           102: #define AMD64HT_LDT0_BUS       0x94
        !           103: #define AMD64HT_LDT0_TYPE      0x98
        !           104: #define AMD64HT_LDT1_BUS       0xb4
        !           105: #define AMD64HT_LDT1_TYPE      0xb8
        !           106: #define AMD64HT_LDT2_BUS       0xd4
        !           107: #define AMD64HT_LDT2_TYPE      0xd8
        !           108:
        !           109: #define AMD64HT_NUM_LDT                3
        !           110:
        !           111: #define AMD64HT_LDT_TYPE_MASK          0x0000001f
        !           112: #define  AMD64HT_LDT_INIT_COMPLETE     0x00000002
        !           113: #define  AMD64HT_LDT_NC                        0x00000004
        !           114:
        !           115: #define AMD64HT_LDT_SEC_BUS_NUM(reg)   (((reg) >> 8) & 0xff)
        !           116:
        !           117: struct pchb_softc {
        !           118:        struct device sc_dev;
        !           119:
        !           120:        bus_space_tag_t bt;
        !           121:        bus_space_handle_t bh;
        !           122:
        !           123:        /* rng stuff */
        !           124:        int ax;
        !           125:        int i;
        !           126:        struct timeout sc_tmo;
        !           127: };
        !           128:
        !           129: int    pchbmatch(struct device *, void *, void *);
        !           130: void   pchbattach(struct device *, struct device *, void *);
        !           131:
        !           132: int    pchb_print(void *, const char *);
        !           133:
        !           134: struct cfattach pchb_ca = {
        !           135:        sizeof(struct pchb_softc), pchbmatch, pchbattach
        !           136: };
        !           137:
        !           138: struct cfdriver pchb_cd = {
        !           139:        NULL, "pchb", DV_DULL
        !           140: };
        !           141:
        !           142: void pchb_rnd(void *v);
        !           143: void   pchb_amd64ht_attach (struct device *, struct pci_attach_args *, int);
        !           144:
        !           145: const struct pci_matchid via_devices[] = {
        !           146:        { PCI_VENDOR_VIATECH, PCI_PRODUCT_VIATECH_VT82C586_PWR },
        !           147:        { PCI_VENDOR_VIATECH, PCI_PRODUCT_VIATECH_VT82C596 },
        !           148:        { PCI_VENDOR_VIATECH, PCI_PRODUCT_VIATECH_VT82C596B_PM },
        !           149:        { PCI_VENDOR_VIATECH, PCI_PRODUCT_VIATECH_VT82C686A_SMB }
        !           150: };
        !           151:
        !           152: int
        !           153: pchbmatch(struct device *parent, void *match, void *aux)
        !           154: {
        !           155:        struct pci_attach_args *pa = aux;
        !           156:
        !           157:        /* XXX work around broken via82x866 chipsets */
        !           158:        if (pci_matchbyid(pa, via_devices,
        !           159:            sizeof(via_devices) / sizeof(via_devices[0])))
        !           160:                return (0);
        !           161:
        !           162:        if (PCI_CLASS(pa->pa_class) == PCI_CLASS_BRIDGE &&
        !           163:            PCI_SUBCLASS(pa->pa_class) == PCI_SUBCLASS_BRIDGE_HOST)
        !           164:                return (1);
        !           165:
        !           166:        return (0);
        !           167: }
        !           168:
        !           169: /*
        !           170:  * The variable below is a bit vector representing the Serverworks
        !           171:  * busses that have already been attached.  Bit 0 represents bus 0 and
        !           172:  * so forth.  The initial value is 1 because we never actually want to
        !           173:  * attach bus 0 since bus 0 is the mainbus.
        !           174:  */
        !           175: u_int32_t rcc_bus_visited = 1;
        !           176:
        !           177: void
        !           178: pchbattach(struct device *parent, struct device *self, void *aux)
        !           179: {
        !           180:        struct pchb_softc *sc = (struct pchb_softc *)self;
        !           181:        struct pci_attach_args *pa = aux;
        !           182:        struct pcibus_attach_args pba;
        !           183:        struct timeval tv1, tv2;
        !           184:        pcireg_t bcreg;
        !           185:        u_char bdnum, pbnum;
        !           186:        pcitag_t tag;
        !           187:        int neednl = 1;
        !           188:        int i, r;
        !           189:
        !           190:        /*
        !           191:         * Print out a description, and configure certain chipsets which
        !           192:         * have auxiliary PCI buses.
        !           193:         */
        !           194:
        !           195:        switch (PCI_VENDOR(pa->pa_id)) {
        !           196: #ifdef PCIAGP
        !           197:        case PCI_VENDOR_ALI:
        !           198:        case PCI_VENDOR_SIS:
        !           199:        case PCI_VENDOR_VIATECH:
        !           200:                pciagp_set_pchb(pa);
        !           201:                break;
        !           202: #endif
        !           203:        case PCI_VENDOR_AMD:
        !           204:                switch (PCI_PRODUCT(pa->pa_id)) {
        !           205: #ifdef PCIAGP
        !           206:                case PCI_PRODUCT_AMD_SC751_SC:
        !           207:                case PCI_PRODUCT_AMD_762_PCHB:
        !           208:                        pciagp_set_pchb(pa);
        !           209:                        break;
        !           210: #endif
        !           211:                case PCI_PRODUCT_AMD_AMD64_HT:
        !           212:                        neednl = 0;
        !           213:                        printf("\n");
        !           214:                        for (i = 0; i < AMD64HT_NUM_LDT; i++)
        !           215:                                pchb_amd64ht_attach(self, pa, i);
        !           216:                        break;
        !           217:                }
        !           218:                break;
        !           219:        case PCI_VENDOR_RCC:
        !           220:                bdnum = pci_conf_read(pa->pa_pc, pa->pa_tag, 0x44);
        !           221:                if (bdnum >= (sizeof(rcc_bus_visited) * 8) ||
        !           222:                    (rcc_bus_visited & (1 << bdnum)))
        !           223:                        break;
        !           224:
        !           225:                rcc_bus_visited |= 1 << bdnum;
        !           226:
        !           227:                /*
        !           228:                 * This host bridge has a second PCI bus.
        !           229:                 * Configure it.
        !           230:                 */
        !           231:                neednl = 0;
        !           232:                pba.pba_busname = "pci";
        !           233:                pba.pba_iot = pa->pa_iot;
        !           234:                pba.pba_memt = pa->pa_memt;
        !           235:                pba.pba_dmat = pa->pa_dmat;
        !           236:                pba.pba_domain = pa->pa_domain;
        !           237:                pba.pba_bus = bdnum;
        !           238:                pba.pba_bridgetag = NULL;
        !           239:                pba.pba_pc = pa->pa_pc;
        !           240:                printf("\n");
        !           241:                config_found(self, &pba, pchb_print);
        !           242:                break;
        !           243:        case PCI_VENDOR_INTEL:
        !           244: #ifdef PCIAGP
        !           245:                pciagp_set_pchb(pa);
        !           246: #endif
        !           247:                switch (PCI_PRODUCT(pa->pa_id)) {
        !           248:                case PCI_PRODUCT_INTEL_82443BX_AGP:     /* 82443BX AGP (PAC) */
        !           249:                case PCI_PRODUCT_INTEL_82443BX_NOAGP:   /* 82443BX Host-PCI (no AGP) */
        !           250:                        /*
        !           251:                         * An incorrect address may be driven on the
        !           252:                         * DRAM bus, resulting in memory data being
        !           253:                         * fetched from the wrong location.  This is
        !           254:                         * the workaround.
        !           255:                         */
        !           256:                        if (PCI_REVISION(pa->pa_class) < 0x3) {
        !           257:                                bcreg = pci_conf_read(pa->pa_pc, pa->pa_tag,
        !           258:                                    PCISET_INTEL_SDRAMC_REG);
        !           259:                                bcreg |= PCISET_INTEL_SDRAMC_IPDLT;
        !           260:                                pci_conf_write(pa->pa_pc, pa->pa_tag,
        !           261:                                    PCISET_INTEL_SDRAMC_REG, bcreg);
        !           262:                        }
        !           263:                        break;
        !           264:                case PCI_PRODUCT_INTEL_PCI450_PB:
        !           265:                        bcreg = pci_conf_read(pa->pa_pc, pa->pa_tag,
        !           266:                            PCISET_INTEL_BUSCONFIG_REG);
        !           267:                        bdnum = PCISET_INTEL_BRIDGE_NUMBER(bcreg);
        !           268:                        pbnum = PCISET_INTEL_PCI_BUS_NUMBER(bcreg);
        !           269:                        switch (bdnum & PCISET_INTEL_BRIDGETYPE_MASK) {
        !           270:                        default:
        !           271:                                printf(": bdnum=%x (reserved)", bdnum);
        !           272:                                break;
        !           273:                        case PCISET_INTEL_TYPE_COMPAT:
        !           274:                                printf(": Compatibility PB (bus %d)", pbnum);
        !           275:                                break;
        !           276:                        case PCISET_INTEL_TYPE_AUX:
        !           277:                                printf(": Auxiliary PB (bus %d)", pbnum);
        !           278:                                neednl = 0;
        !           279:
        !           280:                                /*
        !           281:                                 * This host bridge has a second PCI bus.
        !           282:                                 * Configure it.
        !           283:                                 */
        !           284:                                pba.pba_busname = "pci";
        !           285:                                pba.pba_iot = pa->pa_iot;
        !           286:                                pba.pba_memt = pa->pa_memt;
        !           287:                                pba.pba_dmat = pa->pa_dmat;
        !           288:                                pba.pba_domain = pa->pa_domain;
        !           289:                                pba.pba_bus = pbnum;
        !           290:                                pba.pba_pc = pa->pa_pc;
        !           291:                                printf("\n");
        !           292:                                config_found(self, &pba, pchb_print);
        !           293:                                break;
        !           294:                        }
        !           295:                        break;
        !           296:                case PCI_PRODUCT_INTEL_82454NX:
        !           297:                        pbnum = 0;
        !           298:                        switch (pa->pa_device) {
        !           299:                        case 18: /* PXB 0 bus A - primary bus */
        !           300:                                break;
        !           301:                        case 19: /* PXB 0 bus B */
        !           302:                                /* read SUBA0 from MIOC */
        !           303:                                tag = pci_make_tag(pa->pa_pc, 0, 16, 0);
        !           304:                                bcreg = pci_conf_read(pa->pa_pc, tag, 0xd0);
        !           305:                                pbnum = ((bcreg & 0x0000ff00) >> 8) + 1;
        !           306:                                break;
        !           307:                        case 20: /* PXB 1 bus A */
        !           308:                                /* read BUSNO1 from MIOC */
        !           309:                                tag = pci_make_tag(pa->pa_pc, 0, 16, 0);
        !           310:                                bcreg = pci_conf_read(pa->pa_pc, tag, 0xd0);
        !           311:                                pbnum = (bcreg & 0xff000000) >> 24;
        !           312:                                break;
        !           313:                        case 21: /* PXB 1 bus B */
        !           314:                                /* read SUBA1 from MIOC */
        !           315:                                tag = pci_make_tag(pa->pa_pc, 0, 16, 0);
        !           316:                                bcreg = pci_conf_read(pa->pa_pc, tag, 0xd4);
        !           317:                                pbnum = (bcreg & 0x000000ff) + 1;
        !           318:                                break;
        !           319:                        }
        !           320:                        if (pbnum != 0) {
        !           321:                                pba.pba_busname = "pci";
        !           322:                                pba.pba_iot = pa->pa_iot;
        !           323:                                pba.pba_memt = pa->pa_memt;
        !           324:                                pba.pba_dmat = pa->pa_dmat;
        !           325:                                pba.pba_domain = pa->pa_domain;
        !           326:                                pba.pba_bus = pbnum;
        !           327:                                pba.pba_pc = pa->pa_pc;
        !           328:                                printf("\n");
        !           329:                                config_found(self, &pba, pchb_print);
        !           330:                        }
        !           331:                        break;
        !           332:                case PCI_PRODUCT_INTEL_CDC:
        !           333:                        bcreg = pci_conf_read(pa->pa_pc, pa->pa_tag,
        !           334:                            I82424_CPU_BCTL_REG);
        !           335:                        if (bcreg & I82424_BCTL_CPUPCI_POSTEN) {
        !           336:                                bcreg &= ~I82424_BCTL_CPUPCI_POSTEN;
        !           337:                                pci_conf_write(pa->pa_pc, pa->pa_tag,
        !           338:                                    I82424_CPU_BCTL_REG, bcreg);
        !           339:                                printf(": disabled CPU-PCI write posting");
        !           340:                        }
        !           341:                        break;
        !           342:                case PCI_PRODUCT_INTEL_82810_MCH:
        !           343:                case PCI_PRODUCT_INTEL_82810_DC100_MCH:
        !           344:                case PCI_PRODUCT_INTEL_82810E_MCH:
        !           345:                case PCI_PRODUCT_INTEL_82815_DC100_HUB:
        !           346:                case PCI_PRODUCT_INTEL_82815_NOGRAPH_HUB:
        !           347:                case PCI_PRODUCT_INTEL_82815_FULL_HUB:
        !           348:                case PCI_PRODUCT_INTEL_82815_NOAGP_HUB:
        !           349:                case PCI_PRODUCT_INTEL_82820_MCH:
        !           350:                case PCI_PRODUCT_INTEL_82840_HB:
        !           351:                case PCI_PRODUCT_INTEL_82850_HB:
        !           352:                case PCI_PRODUCT_INTEL_82860_HB:
        !           353:                case PCI_PRODUCT_INTEL_82915G_HB:
        !           354:                case PCI_PRODUCT_INTEL_82925X_HB:
        !           355:                case PCI_PRODUCT_INTEL_82945GP_MCH:
        !           356:                case PCI_PRODUCT_INTEL_82955X_HB:
        !           357:                        sc->bt = pa->pa_memt;
        !           358:                        if (bus_space_map(sc->bt, I82802_IOBASE, I82802_IOSIZE,
        !           359:                            0, &sc->bh))
        !           360:                                break;
        !           361:
        !           362:                        /* probe and init rng */
        !           363:                        if (!(bus_space_read_1(sc->bt, sc->bh,
        !           364:                            I82802_RNG_HWST) & I82802_RNG_HWST_PRESENT))
        !           365:                                break;
        !           366:
        !           367:                        /* enable RNG */
        !           368:                        bus_space_write_1(sc->bt, sc->bh, I82802_RNG_HWST,
        !           369:                            bus_space_read_1(sc->bt, sc->bh, I82802_RNG_HWST) |
        !           370:                            I82802_RNG_HWST_ENABLE);
        !           371:
        !           372:                        /* see if we can read anything */
        !           373:                        for (i = 1000; i-- &&
        !           374:                            !(bus_space_read_1(sc->bt,sc->bh,I82802_RNG_RNGST)&
        !           375:                              I82802_RNG_RNGST_DATAV);
        !           376:                            DELAY(10));
        !           377:
        !           378:                        if (!(bus_space_read_1(sc->bt, sc->bh,
        !           379:                            I82802_RNG_RNGST) & I82802_RNG_RNGST_DATAV))
        !           380:                                break;
        !           381:
        !           382:                        r = bus_space_read_1(sc->bt, sc->bh, I82802_RNG_DATA);
        !           383:
        !           384:                        /* benchmark the RNG */
        !           385:                        microtime(&tv1);
        !           386:                        for (i = 8 * 1024; i--; ) {
        !           387:                                while(!(bus_space_read_1(sc->bt, sc->bh,
        !           388:                                    I82802_RNG_RNGST) & I82802_RNG_RNGST_DATAV))
        !           389:                                        ;
        !           390:                                r = bus_space_read_1(sc->bt, sc->bh,
        !           391:                                    I82802_RNG_DATA);
        !           392:                        }
        !           393:                        microtime(&tv2);
        !           394:
        !           395:                        timersub(&tv2, &tv1, &tv1);
        !           396:                        if (tv1.tv_sec)
        !           397:                                tv1.tv_usec += 1000000 * tv1.tv_sec;
        !           398:                        printf(": rng active");
        !           399:                        if (tv1.tv_usec != 0)
        !           400:                                printf(", %dKb/sec",
        !           401:                                    8 * 1000000 / tv1.tv_usec);
        !           402:
        !           403:                        timeout_set(&sc->sc_tmo, pchb_rnd, sc);
        !           404:                        sc->i = 4;
        !           405:                        pchb_rnd(sc);
        !           406:                        break;
        !           407:                default:
        !           408:                        break;
        !           409:                }
        !           410:        }
        !           411:        if (neednl)
        !           412:                printf("\n");
        !           413: }
        !           414:
        !           415: int
        !           416: pchb_print(void *aux, const char *pnp)
        !           417: {
        !           418:        struct pcibus_attach_args *pba = aux;
        !           419:
        !           420:        if (pnp)
        !           421:                printf("%s at %s", pba->pba_busname, pnp);
        !           422:        printf(" bus %d", pba->pba_bus);
        !           423:        return (UNCONF);
        !           424: }
        !           425:
        !           426: /*
        !           427:  * Should do FIPS testing as per:
        !           428:  *     http://csrc.nist.gov/publications/fips/fips140-1/fips1401.pdf
        !           429:  */
        !           430: void
        !           431: pchb_rnd(void *v)
        !           432: {
        !           433:        struct pchb_softc *sc = v;
        !           434:
        !           435:        /*
        !           436:         * Don't wait for data to be ready. If it's not there, we'll check
        !           437:         * next time.
        !           438:         */
        !           439:        if ((bus_space_read_1(sc->bt, sc->bh, I82802_RNG_RNGST) &
        !           440:            I82802_RNG_RNGST_DATAV)) {
        !           441:
        !           442:                sc->ax = (sc->ax << 8) |
        !           443:                    bus_space_read_1(sc->bt, sc->bh, I82802_RNG_DATA);
        !           444:
        !           445:                if (!sc->i--) {
        !           446:                        sc->i = 4;
        !           447:                        add_true_randomness(sc->ax);
        !           448:                }
        !           449:        }
        !           450:
        !           451:        timeout_add(&sc->sc_tmo, 1);
        !           452: }
        !           453:
        !           454: void
        !           455: pchb_amd64ht_attach (struct device *self, struct pci_attach_args *pa, int i)
        !           456: {
        !           457:        struct pcibus_attach_args pba;
        !           458:        pcireg_t type, bus;
        !           459:        int reg;
        !           460:
        !           461:        reg = AMD64HT_LDT0_TYPE + i * 0x20;
        !           462:        type = pci_conf_read(pa->pa_pc, pa->pa_tag, reg);
        !           463:        if ((type & AMD64HT_LDT_INIT_COMPLETE) == 0 ||
        !           464:            (type & AMD64HT_LDT_NC) == 0)
        !           465:                return;
        !           466:
        !           467:        reg = AMD64HT_LDT0_BUS + i * 0x20;
        !           468:        bus = pci_conf_read(pa->pa_pc, pa->pa_tag, reg);
        !           469:        if (AMD64HT_LDT_SEC_BUS_NUM(bus) > 0) {
        !           470:                pba.pba_busname = "pci";
        !           471:                pba.pba_iot = pa->pa_iot;
        !           472:                pba.pba_memt = pa->pa_memt;
        !           473:                pba.pba_dmat = pa->pa_dmat;
        !           474:                pba.pba_domain = pa->pa_domain;
        !           475:                pba.pba_bus = AMD64HT_LDT_SEC_BUS_NUM(bus);
        !           476:                pba.pba_pc = pa->pa_pc;
        !           477:                config_found(self, &pba, pchb_print);
        !           478:        }
        !           479: }

CVSweb