[BACK]Return to mainbus.c CVS log [TXT][DIR] Up to [local] / sys / arch / amd64 / amd64

Annotation of sys/arch/amd64/amd64/mainbus.c, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: mainbus.c,v 1.12 2007/05/06 03:37:08 gwk Exp $        */
        !             2: /*     $NetBSD: mainbus.c,v 1.1 2003/04/26 18:39:29 fvdl Exp $ */
        !             3:
        !             4: /*
        !             5:  * Copyright (c) 1996 Christopher G. Demetriou.  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 Christopher G. Demetriou
        !            18:  *     for the NetBSD Project.
        !            19:  * 4. The name of the author may not be used to endorse or promote products
        !            20:  *    derived from this software without specific prior written permission
        !            21:  *
        !            22:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
        !            23:  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
        !            24:  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
        !            25:  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
        !            26:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
        !            27:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
        !            28:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
        !            29:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
        !            30:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
        !            31:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        !            32:  */
        !            33:
        !            34: #include <sys/param.h>
        !            35: #include <sys/systm.h>
        !            36: #include <sys/device.h>
        !            37:
        !            38: #include <machine/bus.h>
        !            39:
        !            40: #include <dev/isa/isavar.h>
        !            41: #include <dev/pci/pcivar.h>
        !            42:
        !            43: #include <dev/isa/isareg.h>
        !            44:
        !            45: #include "pci.h"
        !            46: #include "isa.h"
        !            47: #include "acpi.h"
        !            48: #include "ipmi.h"
        !            49: #include "bios.h"
        !            50:
        !            51: #include <machine/cpuvar.h>
        !            52: #include <machine/i82093var.h>
        !            53: #include <machine/mpbiosvar.h>
        !            54:
        !            55: #if NACPI > 0
        !            56: #include <dev/acpi/acpireg.h>
        !            57: #include <dev/acpi/acpivar.h>
        !            58: #endif
        !            59:
        !            60: #if NIPMI > 0
        !            61: #include <dev/ipmivar.h>
        !            62: #endif
        !            63:
        !            64: #if NBIOS > 0
        !            65: #include <machine/biosvar.h>
        !            66: #endif
        !            67:
        !            68: int    mainbus_match(struct device *, void *, void *);
        !            69: void   mainbus_attach(struct device *, struct device *, void *);
        !            70:
        !            71: struct cfattach mainbus_ca = {
        !            72:        sizeof(struct device), mainbus_match, mainbus_attach
        !            73: };
        !            74:
        !            75: struct cfdriver mainbus_cd = {
        !            76:        NULL, "mainbus", DV_DULL
        !            77: };
        !            78:
        !            79: int    mainbus_print(void *, const char *);
        !            80:
        !            81: union mainbus_attach_args {
        !            82:        const char *mba_busname;                /* first elem of all */
        !            83:        struct pcibus_attach_args mba_pba;
        !            84:        struct isabus_attach_args mba_iba;
        !            85:        struct cpu_attach_args mba_caa;
        !            86:        struct apic_attach_args aaa_caa;
        !            87: #if NACPI > 0
        !            88:        struct acpi_attach_args mba_aaa;
        !            89: #endif
        !            90: #if NIPMI > 0
        !            91:        struct ipmi_attach_args mba_iaa;
        !            92: #endif
        !            93: #if NBIOS > 0
        !            94:        struct bios_attach_args mba_bios;
        !            95: #endif
        !            96: };
        !            97:
        !            98: /*
        !            99:  * This is set when the ISA bus is attached.  If it's not set by the
        !           100:  * time it's checked below, then mainbus attempts to attach an ISA.
        !           101:  */
        !           102: int    isa_has_been_seen;
        !           103: #if NISA > 0
        !           104: struct isabus_attach_args mba_iba = {
        !           105:        "isa",
        !           106:        X86_BUS_SPACE_IO, X86_BUS_SPACE_MEM,
        !           107: #if NISADMA > 0
        !           108:        &isa_bus_dma_tag
        !           109: #else
        !           110:        NULL
        !           111: #endif
        !           112: };
        !           113: #endif
        !           114:
        !           115: #if defined(MPBIOS) || defined(MPACPI)
        !           116: struct mp_bus *mp_busses;
        !           117: int mp_nbus;
        !           118: struct mp_intr_map *mp_intrs;
        !           119: int mp_nintr;
        !           120:
        !           121: struct mp_bus *mp_isa_bus;
        !           122: struct mp_bus *mp_eisa_bus;
        !           123:
        !           124: #ifdef MPVERBOSE
        !           125: int mp_verbose = 1;
        !           126: #else
        !           127: int mp_verbose = 0;
        !           128: #endif
        !           129: #endif
        !           130:
        !           131:
        !           132: /*
        !           133:  * Probe for the mainbus; always succeeds.
        !           134:  */
        !           135: int
        !           136: mainbus_match(struct device *parent, void *match, void *aux)
        !           137: {
        !           138:        return (1);
        !           139: }
        !           140:
        !           141: /*
        !           142:  * Attach the mainbus.
        !           143:  */
        !           144: void
        !           145: mainbus_attach(struct device *parent, struct device *self, void *aux)
        !           146: {
        !           147: #if NPCI > 0
        !           148:        union mainbus_attach_args       mba;
        !           149: #endif
        !           150: #ifdef MPBIOS
        !           151:        int                             mpbios_present = 0;
        !           152: #endif
        !           153:        extern void                     (*setperf_setup)(struct cpu_info *);
        !           154:
        !           155:        printf("\n");
        !           156:
        !           157: #if NPCI > 0
        !           158:        pci_mode = pci_mode_detect();
        !           159: #endif
        !           160:
        !           161: #if NBIOS > 0
        !           162:        {
        !           163:                mba.mba_bios.bios_dev = "bios";
        !           164:                mba.mba_bios.bios_iot = X86_BUS_SPACE_IO;
        !           165:                mba.mba_bios.bios_memt = X86_BUS_SPACE_MEM;
        !           166:                config_found(self, &mba.mba_bios, mainbus_print);
        !           167:        }
        !           168: #endif
        !           169:
        !           170: #if NACPI > 0
        !           171: #if NPCI > 0
        !           172:        if (pci_mode != 0)
        !           173: #endif
        !           174:        {
        !           175:                memset(&mba.mba_aaa, 0, sizeof(mba.mba_aaa));
        !           176:                mba.mba_aaa.aaa_name = "acpi";
        !           177:                mba.mba_aaa.aaa_iot = X86_BUS_SPACE_IO;
        !           178:                mba.mba_aaa.aaa_memt = X86_BUS_SPACE_MEM;
        !           179:
        !           180:                config_found(self, &mba.mba_aaa, mainbus_print);
        !           181:        }
        !           182: #endif
        !           183:
        !           184: #if NIPMI > 0
        !           185:        {
        !           186:                memset(&mba.mba_iaa, 0, sizeof(mba.mba_iaa));
        !           187:                mba.mba_iaa.iaa_name = "ipmi";
        !           188:                mba.mba_iaa.iaa_iot  = X86_BUS_SPACE_IO;
        !           189:                mba.mba_iaa.iaa_memt = X86_BUS_SPACE_MEM;
        !           190:                if (ipmi_probe(&mba.mba_iaa))
        !           191:                        config_found(self, &mba.mba_iaa, mainbus_print);
        !           192:        }
        !           193: #endif
        !           194:
        !           195: #ifdef MPBIOS
        !           196:        mpbios_present = mpbios_probe(self);
        !           197: #endif
        !           198:
        !           199: #ifdef MPBIOS
        !           200:        if (mpbios_present)
        !           201:                mpbios_scan(self);
        !           202:        else
        !           203: #endif
        !           204:
        !           205:        if ((cpu_info_primary.ci_flags & CPUF_PRESENT) == 0) {
        !           206:                struct cpu_attach_args caa;
        !           207:
        !           208:                memset(&caa, 0, sizeof(caa));
        !           209:                caa.caa_name = "cpu";
        !           210:                caa.cpu_number = 0;
        !           211:                caa.cpu_role = CPU_ROLE_SP;
        !           212:                caa.cpu_func = 0;
        !           213:
        !           214:                config_found(self, &caa, mainbus_print);
        !           215:        }
        !           216:
        !           217: #if NACPI > 0
        !           218:        if (!acpi_hasprocfvs)
        !           219: #endif
        !           220:        {
        !           221:                if (setperf_setup != NULL)
        !           222:                        setperf_setup(&cpu_info_primary);
        !           223:        }
        !           224:
        !           225: #ifdef MULTIPROCESSOR
        !           226:        mp_setperf_init();
        !           227: #endif
        !           228:
        !           229: #if NPCI > 0
        !           230:        if (pci_mode != 0) {
        !           231:                mba.mba_pba.pba_busname = "pci";
        !           232:                mba.mba_pba.pba_iot = X86_BUS_SPACE_IO;
        !           233:                mba.mba_pba.pba_memt = X86_BUS_SPACE_MEM;
        !           234:                mba.mba_pba.pba_dmat = &pci_bus_dma_tag;
        !           235:                mba.mba_pba.pba_domain = pci_ndomains++;
        !           236:                mba.mba_pba.pba_bus = 0;
        !           237:                mba.mba_pba.pba_bridgetag = NULL;
        !           238:                mba.mba_pba.pba_pc = NULL;
        !           239:                config_found(self, &mba.mba_pba, mainbus_print);
        !           240:        }
        !           241: #endif
        !           242:
        !           243: #if NISA > 0
        !           244:        if (isa_has_been_seen == 0)
        !           245:                config_found(self, &mba_iba, mainbus_print);
        !           246: #endif
        !           247:
        !           248: }
        !           249:
        !           250: int
        !           251: mainbus_print(void *aux, const char *pnp)
        !           252: {
        !           253:        union mainbus_attach_args       *mba = aux;
        !           254:
        !           255:        if (pnp)
        !           256:                printf("%s at %s", mba->mba_busname, pnp);
        !           257:        if (strcmp(mba->mba_busname, "pci") == 0)
        !           258:                printf(" bus %d", mba->mba_pba.pba_bus);
        !           259:
        !           260:        return (UNCONF);
        !           261: }

CVSweb