[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

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