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

Annotation of sys/arch/arm/arm/cpu.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $OpenBSD: cpu.c,v 1.8 2007/07/01 19:09:20 miod Exp $    */
                      2: /*     $NetBSD: cpu.c,v 1.56 2004/04/14 04:01:49 bsh Exp $     */
                      3:
                      4:
                      5: /*
                      6:  * Copyright (c) 1995 Mark Brinicombe.
                      7:  * Copyright (c) 1995 Brini.
                      8:  * All rights reserved.
                      9:  *
                     10:  * Redistribution and use in source and binary forms, with or without
                     11:  * modification, are permitted provided that the following conditions
                     12:  * are met:
                     13:  * 1. Redistributions of source code must retain the above copyright
                     14:  *    notice, this list of conditions and the following disclaimer.
                     15:  * 2. Redistributions in binary form must reproduce the above copyright
                     16:  *    notice, this list of conditions and the following disclaimer in the
                     17:  *    documentation and/or other materials provided with the distribution.
                     18:  * 3. All advertising materials mentioning features or use of this software
                     19:  *    must display the following acknowledgement:
                     20:  *     This product includes software developed by Brini.
                     21:  * 4. The name of the company nor the name of the author may be used to
                     22:  *    endorse or promote products derived from this software without specific
                     23:  *    prior written permission.
                     24:  *
                     25:  * THIS SOFTWARE IS PROVIDED BY BRINI ``AS IS'' AND ANY EXPRESS OR IMPLIED
                     26:  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
                     27:  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
                     28:  * IN NO EVENT SHALL BRINI OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
                     29:  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
                     30:  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
                     31:  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
                     32:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
                     33:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
                     34:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
                     35:  * SUCH DAMAGE.
                     36:  *
                     37:  * RiscBSD kernel project
                     38:  *
                     39:  * cpu.c
                     40:  *
                     41:  * Probing and configuration for the master CPU
                     42:  *
                     43:  * Created      : 10/10/95
                     44:  */
                     45:
                     46: #include <sys/param.h>
                     47:
                     48: #include <sys/systm.h>
                     49: #include <sys/malloc.h>
                     50: #include <sys/device.h>
                     51: #include <sys/proc.h>
                     52: #include <sys/conf.h>
                     53: #include <uvm/uvm_extern.h>
                     54: #include <machine/cpu.h>
                     55:
                     56: #include <arm/cpuconf.h>
                     57: #include <arm/undefined.h>
                     58:
                     59: #ifdef ARMFPE
                     60: #include <machine/bootconfig.h> /* For boot args */
                     61: #include <arm/fpe-arm/armfpe.h>
                     62: #endif
                     63:
                     64: char cpu_model[256];
                     65:
                     66: /* Prototypes */
                     67: void identify_arm_cpu(struct device *dv, struct cpu_info *);
                     68:
                     69: /*
                     70:  * Identify the master (boot) CPU
                     71:  */
                     72:
                     73: void
                     74: cpu_attach(struct device *dv)
                     75: {
                     76: #ifdef ARMFPE
                     77:        int usearmfpe;
                     78:
                     79:        usearmfpe = 1;  /* when compiled in, its enabled by default */
                     80: #endif
                     81:
                     82:        curcpu()->ci_dev = dv;
                     83:
                     84:        /* Get the CPU ID from coprocessor 15 */
                     85:
                     86:        curcpu()->ci_arm_cpuid = cpu_id();
                     87:        curcpu()->ci_arm_cputype = curcpu()->ci_arm_cpuid & CPU_ID_CPU_MASK;
                     88:        curcpu()->ci_arm_cpurev =
                     89:            curcpu()->ci_arm_cpuid & CPU_ID_REVISION_MASK;
                     90:
                     91:        identify_arm_cpu(dv, curcpu());
                     92:
                     93:        if (curcpu()->ci_arm_cputype == CPU_ID_SA110 &&
                     94:            curcpu()->ci_arm_cpurev < 3) {
                     95:                printf("%s: SA-110 with bugged STM^ instruction\n",
                     96:                       dv->dv_xname);
                     97:        }
                     98:
                     99: #ifdef CPU_ARM8
                    100:        if ((curcpu()->ci_arm_cpuid & CPU_ID_CPU_MASK) == CPU_ID_ARM810) {
                    101:                int clock = arm8_clock_config(0, 0);
                    102:                char *fclk;
                    103:                aprint_normal("%s: ARM810 cp15=%02x", dv->dv_xname, clock);
                    104:                aprint_normal(" clock:%s", (clock & 1) ? " dynamic" : "");
                    105:                aprint_normal("%s", (clock & 2) ? " sync" : "");
                    106:                switch ((clock >> 2) & 3) {
                    107:                case 0:
                    108:                        fclk = "bus clock";
                    109:                        break;
                    110:                case 1:
                    111:                        fclk = "ref clock";
                    112:                        break;
                    113:                case 3:
                    114:                        fclk = "pll";
                    115:                        break;
                    116:                default:
                    117:                        fclk = "illegal";
                    118:                        break;
                    119:                }
                    120:                aprint_normal(" fclk source=%s\n", fclk);
                    121:        }
                    122: #endif
                    123:
                    124: #ifdef ARMFPE
                    125:        /*
                    126:         * Ok now we test for an FPA
                    127:         * At this point no floating point emulator has been installed.
                    128:         * This means any FP instruction will cause undefined exception.
                    129:         * We install a temporay coproc 1 handler which will modify
                    130:         * undefined_test if it is called.
                    131:         * We then try to read the FP status register. If undefined_test
                    132:         * has been decremented then the instruction was not handled by
                    133:         * an FPA so we know the FPA is missing. If undefined_test is
                    134:         * still 1 then we know the instruction was handled by an FPA.
                    135:         * We then remove our test handler and look at the
                    136:         * FP status register for identification.
                    137:         */
                    138:
                    139:        /*
                    140:         * Ok if ARMFPE is defined and the boot options request the
                    141:         * ARM FPE then it will be installed as the FPE.
                    142:         * This is just while I work on integrating the new FPE.
                    143:         * It means the new FPE gets installed if compiled int (ARMFPE
                    144:         * defined) and also gives me a on/off option when I boot in
                    145:         * case the new FPE is causing panics.
                    146:         */
                    147:
                    148:
                    149:        if (boot_args)
                    150:                get_bootconf_option(boot_args, "armfpe",
                    151:                    BOOTOPT_TYPE_BOOLEAN, &usearmfpe);
                    152:        if (usearmfpe)
                    153:                initialise_arm_fpe();
                    154: #endif
                    155: }
                    156:
                    157: enum cpu_class {
                    158:        CPU_CLASS_NONE,
                    159:        CPU_CLASS_ARM2,
                    160:        CPU_CLASS_ARM2AS,
                    161:        CPU_CLASS_ARM3,
                    162:        CPU_CLASS_ARM6,
                    163:        CPU_CLASS_ARM7,
                    164:        CPU_CLASS_ARM7TDMI,
                    165:        CPU_CLASS_ARM8,
                    166:        CPU_CLASS_ARM9TDMI,
                    167:        CPU_CLASS_ARM9ES,
                    168:        CPU_CLASS_ARM10E,
                    169:        CPU_CLASS_SA1,
                    170:        CPU_CLASS_XSCALE
                    171: };
                    172:
                    173: static const char * const generic_steppings[16] = {
                    174:        "rev 0",        "rev 1",        "rev 2",        "rev 3",
                    175:        "rev 4",        "rev 5",        "rev 6",        "rev 7",
                    176:        "rev 8",        "rev 9",        "rev 10",       "rev 11",
                    177:        "rev 12",       "rev 13",       "rev 14",       "rev 15"
                    178: };
                    179:
                    180: static const char * const sa110_steppings[16] = {
                    181:        "rev 0",        "step J",       "step K",       "step S",
                    182:        "step T",       "rev 5",        "rev 6",        "rev 7",
                    183:        "rev 8",        "rev 9",        "rev 10",       "rev 11",
                    184:        "rev 12",       "rev 13",       "rev 14",       "rev 15"
                    185: };
                    186:
                    187: static const char * const sa1100_steppings[16] = {
                    188:        "rev 0",        "step B",       "step C",       "rev 3",
                    189:        "rev 4",        "rev 5",        "rev 6",        "rev 7",
                    190:        "step D",       "step E",       "rev 10"        "step G",
                    191:        "rev 12",       "rev 13",       "rev 14",       "rev 15"
                    192: };
                    193:
                    194: static const char * const sa1110_steppings[16] = {
                    195:        "step A-0",     "rev 1",        "rev 2",        "rev 3",
                    196:        "step B-0",     "step B-1",     "step B-2",     "step B-3",
                    197:        "step B-4",     "step B-5",     "rev 10",       "rev 11",
                    198:        "rev 12",       "rev 13",       "rev 14",       "rev 15"
                    199: };
                    200:
                    201: static const char * const ixp12x0_steppings[16] = {
                    202:        "(IXP1200 step A)",             "(IXP1200 step B)",
                    203:        "rev 2",                        "(IXP1200 step C)",
                    204:        "(IXP1200 step D)",             "(IXP1240/1250 step A)",
                    205:        "(IXP1240 step B)",             "(IXP1250 step B)",
                    206:        "rev 8",        "rev 9",        "rev 10",       "rev 11",
                    207:        "rev 12",       "rev 13",       "rev 14",       "rev 15"
                    208: };
                    209:
                    210: static const char * const xscale_steppings[16] = {
                    211:        "step A-0",     "step A-1",     "step B-0",     "step C-0",
                    212:        "step D-0",     "rev 5",        "rev 6",        "rev 7",
                    213:        "rev 8",        "rev 9",        "rev 10",       "rev 11",
                    214:        "rev 12",       "rev 13",       "rev 14",       "rev 15"
                    215: };
                    216:
                    217: static const char * const i80321_steppings[16] = {
                    218:        "step A-0",     "step B-0",     "rev 2",        "rev 3",
                    219:        "rev 4",        "rev 5",        "rev 6",        "rev 7",
                    220:        "rev 8",        "rev 9",        "rev 10",       "rev 11",
                    221:        "rev 12",       "rev 13",       "rev 14",       "rev 15"
                    222: };
                    223:
                    224: static const char * const i80219_steppings[16] = {
                    225:         "step A-0",     "rev 1",        "rev 2",        "rev 3",
                    226:         "rev 4",        "rev 5",        "rev 6",        "rev 7",
                    227:         "rev 8",        "rev 9",        "rev 10",       "rev 11",
                    228:         "rev 12",       "rev 13",       "rev 14",       "rev 15",
                    229: };
                    230:
                    231: /* Steppings for PXA2[15]0 */
                    232: static const char * const pxa2x0_steppings[16] = {
                    233:        "step A-0",     "step A-1",     "step B-0",     "step B-1",
                    234:        "step B-2",     "step C-0",     "rev 6",        "rev 7",
                    235:        "rev 8",        "rev 9",        "rev 10",       "rev 11",
                    236:        "rev 12",       "rev 13",       "rev 14",       "rev 15"
                    237: };
                    238:
                    239: /* Steppings for PXA255/26x.
                    240:  * rev 5: PXA26x B0, rev 6: PXA255 A0
                    241:  */
                    242: static const char * const pxa255_steppings[16] = {
                    243:        "rev 0",        "rev 1",        "rev 2",        "step A-0",
                    244:        "rev 4",        "step B-0",     "step A-0",     "rev 7",
                    245:        "rev 8",        "rev 9",        "rev 10",       "rev 11",
                    246:        "rev 12",       "rev 13",       "rev 14",       "rev 15"
                    247: };
                    248:
                    249: /* Steppings for PXA270 */
                    250: static const char * const pxa27x_steppings[16] = {
                    251:        "step A-0",     "step A-1",     "step B-0",     "step B-1",
                    252:        "step C-0",     "step ?",       "step ?",       "step C-5",
                    253:        "rev 8",        "rev 9",        "rev 10",       "rev 11",
                    254:        "rev 12",       "rev 13",       "rev 14",       "rev 15"
                    255: };
                    256:
                    257: static const char * const ixp425_steppings[16] = {
                    258:        "step 0",       "rev 1",        "rev 2",        "rev 3",
                    259:        "rev 4",        "rev 5",        "rev 6",        "rev 7",
                    260:        "rev 8",        "rev 9",        "rev 10",       "rev 11",
                    261:        "rev 12",       "rev 13",       "rev 14",       "rev 15"
                    262: };
                    263:
                    264: struct cpuidtab {
                    265:        u_int32_t       cpuid;
                    266:        enum            cpu_class cpu_class;
                    267:        const char      *cpu_name;
                    268:        const char * const *cpu_steppings;
                    269: };
                    270:
                    271: const struct cpuidtab cpuids[] = {
                    272:        { CPU_ID_ARM2,          CPU_CLASS_ARM2,         "ARM2",
                    273:          generic_steppings },
                    274:        { CPU_ID_ARM250,        CPU_CLASS_ARM2AS,       "ARM250",
                    275:          generic_steppings },
                    276:
                    277:        { CPU_ID_ARM3,          CPU_CLASS_ARM3,         "ARM3",
                    278:          generic_steppings },
                    279:
                    280:        { CPU_ID_ARM600,        CPU_CLASS_ARM6,         "ARM600",
                    281:          generic_steppings },
                    282:        { CPU_ID_ARM610,        CPU_CLASS_ARM6,         "ARM610",
                    283:          generic_steppings },
                    284:        { CPU_ID_ARM620,        CPU_CLASS_ARM6,         "ARM620",
                    285:          generic_steppings },
                    286:
                    287:        { CPU_ID_ARM700,        CPU_CLASS_ARM7,         "ARM700",
                    288:          generic_steppings },
                    289:        { CPU_ID_ARM710,        CPU_CLASS_ARM7,         "ARM710",
                    290:          generic_steppings },
                    291:        { CPU_ID_ARM7500,       CPU_CLASS_ARM7,         "ARM7500",
                    292:          generic_steppings },
                    293:        { CPU_ID_ARM710A,       CPU_CLASS_ARM7,         "ARM710a",
                    294:          generic_steppings },
                    295:        { CPU_ID_ARM7500FE,     CPU_CLASS_ARM7,         "ARM7500FE",
                    296:          generic_steppings },
                    297:        { CPU_ID_ARM710T,       CPU_CLASS_ARM7TDMI,     "ARM710T",
                    298:          generic_steppings },
                    299:        { CPU_ID_ARM720T,       CPU_CLASS_ARM7TDMI,     "ARM720T",
                    300:          generic_steppings },
                    301:        { CPU_ID_ARM740T8K,     CPU_CLASS_ARM7TDMI, "ARM740T (8 KB cache)",
                    302:          generic_steppings },
                    303:        { CPU_ID_ARM740T4K,     CPU_CLASS_ARM7TDMI, "ARM740T (4 KB cache)",
                    304:          generic_steppings },
                    305:
                    306:        { CPU_ID_ARM810,        CPU_CLASS_ARM8,         "ARM810",
                    307:          generic_steppings },
                    308:
                    309:        { CPU_ID_ARM920T,       CPU_CLASS_ARM9TDMI,     "ARM920T",
                    310:          generic_steppings },
                    311:        { CPU_ID_ARM922T,       CPU_CLASS_ARM9TDMI,     "ARM922T",
                    312:          generic_steppings },
                    313:        { CPU_ID_ARM940T,       CPU_CLASS_ARM9TDMI,     "ARM940T",
                    314:          generic_steppings },
                    315:        { CPU_ID_ARM946ES,      CPU_CLASS_ARM9ES,       "ARM946E-S",
                    316:          generic_steppings },
                    317:        { CPU_ID_ARM966ES,      CPU_CLASS_ARM9ES,       "ARM966E-S",
                    318:          generic_steppings },
                    319:        { CPU_ID_ARM966ESR1,    CPU_CLASS_ARM9ES,       "ARM966E-S",
                    320:          generic_steppings },
                    321:        { CPU_ID_TI925T,        CPU_CLASS_ARM9TDMI,     "TI ARM925T",
                    322:          generic_steppings },
                    323:
                    324:        { CPU_ID_ARM1020E,      CPU_CLASS_ARM10E,       "ARM1020E",
                    325:          generic_steppings },
                    326:        { CPU_ID_ARM1022ES,     CPU_CLASS_ARM10E,       "ARM1022E-S",
                    327:          generic_steppings },
                    328:
                    329:        { CPU_ID_SA110,         CPU_CLASS_SA1,          "SA-110",
                    330:          sa110_steppings },
                    331:        { CPU_ID_SA1100,        CPU_CLASS_SA1,          "SA-1100",
                    332:          sa1100_steppings },
                    333:        { CPU_ID_SA1110,        CPU_CLASS_SA1,          "SA-1110",
                    334:          sa1110_steppings },
                    335:
                    336:        { CPU_ID_IXP1200,       CPU_CLASS_SA1,          "IXP1200",
                    337:          ixp12x0_steppings },
                    338:
                    339:        { CPU_ID_80200,         CPU_CLASS_XSCALE,       "i80200",
                    340:          xscale_steppings },
                    341:
                    342:        { CPU_ID_80321_400,     CPU_CLASS_XSCALE,       "i80321 400MHz",
                    343:          i80321_steppings },
                    344:        { CPU_ID_80321_600,     CPU_CLASS_XSCALE,       "i80321 600MHz",
                    345:          i80321_steppings },
                    346:        { CPU_ID_80321_400_B0,  CPU_CLASS_XSCALE,       "i80321 400MHz",
                    347:          i80321_steppings },
                    348:        { CPU_ID_80321_600_B0,  CPU_CLASS_XSCALE,       "i80321 600MHz",
                    349:          i80321_steppings },
                    350:
                    351:        { CPU_ID_80219_400,     CPU_CLASS_XSCALE,       "i80219 400MHz",
                    352:          i80219_steppings },
                    353:        { CPU_ID_80219_600,     CPU_CLASS_XSCALE,       "i80219 600MHz",
                    354:          i80219_steppings },
                    355:
                    356:        { CPU_ID_PXA250A,       CPU_CLASS_XSCALE,       "PXA250",
                    357:          pxa2x0_steppings },
                    358:        { CPU_ID_PXA210A,       CPU_CLASS_XSCALE,       "PXA210",
                    359:          pxa2x0_steppings },
                    360:        { CPU_ID_PXA250B,       CPU_CLASS_XSCALE,       "PXA250",
                    361:          pxa2x0_steppings },
                    362:        { CPU_ID_PXA210B,       CPU_CLASS_XSCALE,       "PXA210",
                    363:          pxa2x0_steppings },
                    364:        { CPU_ID_PXA250C,       CPU_CLASS_XSCALE,       "PXA250",
                    365:          pxa2x0_steppings },
                    366:        { CPU_ID_PXA27X,        CPU_CLASS_XSCALE,       "PXA27x",
                    367:          pxa27x_steppings },
                    368:        { CPU_ID_PXA210C,       CPU_CLASS_XSCALE,       "PXA210",
                    369:          pxa2x0_steppings },
                    370:
                    371:        { CPU_ID_IXP425_533,    CPU_CLASS_XSCALE,       "IXP425 533MHz",
                    372:          ixp425_steppings },
                    373:        { CPU_ID_IXP425_400,    CPU_CLASS_XSCALE,       "IXP425 400MHz",
                    374:          ixp425_steppings },
                    375:        { CPU_ID_IXP425_266,    CPU_CLASS_XSCALE,       "IXP425 266MHz",
                    376:          ixp425_steppings },
                    377:
                    378:        { 0, CPU_CLASS_NONE, NULL, NULL }
                    379: };
                    380:
                    381: struct cpu_classtab {
                    382:        const char      *class_name;
                    383:        const char      *class_option;
                    384: };
                    385:
                    386: const struct cpu_classtab cpu_classes[] = {
                    387:        { "unknown",    NULL },                 /* CPU_CLASS_NONE */
                    388:        { "ARM2",       "CPU_ARM2" },           /* CPU_CLASS_ARM2 */
                    389:        { "ARM2as",     "CPU_ARM250" },         /* CPU_CLASS_ARM2AS */
                    390:        { "ARM3",       "CPU_ARM3" },           /* CPU_CLASS_ARM3 */
                    391:        { "ARM6",       "CPU_ARM6" },           /* CPU_CLASS_ARM6 */
                    392:        { "ARM7",       "CPU_ARM7" },           /* CPU_CLASS_ARM7 */
                    393:        { "ARM7TDMI",   "CPU_ARM7TDMI" },       /* CPU_CLASS_ARM7TDMI */
                    394:        { "ARM8",       "CPU_ARM8" },           /* CPU_CLASS_ARM8 */
                    395:        { "ARM9TDMI",   NULL },                 /* CPU_CLASS_ARM9TDMI */
                    396:        { "ARM9E-S",    NULL },                 /* CPU_CLASS_ARM9ES */
                    397:        { "ARM10E",     "CPU_ARM10" },          /* CPU_CLASS_ARM10E */
                    398:        { "SA-1",       "CPU_SA110" },          /* CPU_CLASS_SA1 */
                    399:        { "XScale",     "CPU_XSCALE_..." }      /* CPU_CLASS_XSCALE */
                    400: };
                    401:
                    402: /*
                    403:  * Report the type of the specified arm processor. This uses the generic and
                    404:  * arm specific information in the cpu structure to identify the processor.
                    405:  * The remaining fields in the cpu structure are filled in appropriately.
                    406:  */
                    407:
                    408: static const char * const wtnames[] = {
                    409:        "wr-thru",
                    410:        "wr-back",
                    411:        "wr-back",
                    412:        "**unknown 3**",
                    413:        "**unknown 4**",
                    414:        "wr-back-lock",         /* XXX XScale-specific? */
                    415:        "wr-back-lock-A",
                    416:        "wr-back-lock-B",
                    417:        "**unknown 8**",
                    418:        "**unknown 9**",
                    419:        "**unknown 10**",
                    420:        "**unknown 11**",
                    421:        "**unknown 12**",
                    422:        "**unknown 13**",
                    423:        "**unknown 14**",
                    424:        "**unknown 15**"
                    425: };
                    426:
                    427: void
                    428: identify_arm_cpu(struct device *dv, struct cpu_info *ci)
                    429: {
                    430:        u_int cpuid;
                    431:        enum cpu_class cpu_class = CPU_CLASS_NONE;
                    432:        int i;
                    433:
                    434:        cpuid = ci->ci_arm_cpuid;
                    435:
                    436:        if (cpuid == 0) {
                    437:                printf("Processor failed probe - no CPU ID\n");
                    438:                return;
                    439:        }
                    440:
                    441:        for (i = 0; cpuids[i].cpuid != 0; i++)
                    442:                if (cpuids[i].cpuid == (cpuid & CPU_ID_CPU_MASK)) {
                    443:                        cpu_class = cpuids[i].cpu_class;
                    444:                        snprintf(cpu_model, sizeof(cpu_model),
                    445:                            "%s %s (%s core)", cpuids[i].cpu_name,
                    446:                            cpuids[i].cpu_steppings[cpuid &
                    447:                                                    CPU_ID_REVISION_MASK],
                    448:                            cpu_classes[cpu_class].class_name);
                    449:                        break;
                    450:                }
                    451:
                    452:        if (cpuids[i].cpuid == 0)
                    453:                snprintf(cpu_model, sizeof(cpu_model),
                    454:                    "unknown CPU (ID = 0x%x)", cpuid);
                    455:
                    456:        printf(": %s\n", cpu_model);
                    457:
                    458:        printf("%s:", dv->dv_xname);
                    459:
                    460:        switch (cpu_class) {
                    461:        case CPU_CLASS_ARM6:
                    462:        case CPU_CLASS_ARM7:
                    463:        case CPU_CLASS_ARM7TDMI:
                    464:        case CPU_CLASS_ARM8:
                    465:                if ((ci->ci_ctrl & CPU_CONTROL_IDC_ENABLE) == 0)
                    466:                        printf(" IDC disabled");
                    467:                else
                    468:                        printf(" IDC enabled");
                    469:                break;
                    470:        case CPU_CLASS_ARM9TDMI:
                    471:        case CPU_CLASS_ARM10E:
                    472:        case CPU_CLASS_SA1:
                    473:        case CPU_CLASS_XSCALE:
                    474:                if ((ci->ci_ctrl & CPU_CONTROL_DC_ENABLE) == 0)
                    475:                        printf(" DC disabled");
                    476:                else
                    477:                        printf(" DC enabled");
                    478:                if ((ci->ci_ctrl & CPU_CONTROL_IC_ENABLE) == 0)
                    479:                        printf(" IC disabled");
                    480:                else
                    481:                        printf(" IC enabled");
                    482:                break;
                    483:        default:
                    484:                break;
                    485:        }
                    486:        if ((ci->ci_ctrl & CPU_CONTROL_WBUF_ENABLE) == 0)
                    487:                printf(" WB disabled");
                    488:        else
                    489:                printf(" WB enabled");
                    490:
                    491:        if (ci->ci_ctrl & CPU_CONTROL_LABT_ENABLE)
                    492:                printf(" LABT");
                    493:        else
                    494:                printf(" EABT");
                    495:
                    496:        if (ci->ci_ctrl & CPU_CONTROL_BPRD_ENABLE)
                    497:                printf(" branch prediction enabled");
                    498:
                    499:        printf("\n");
                    500:
                    501:        /* Print cache info. */
                    502:        if (arm_picache_line_size == 0 && arm_pdcache_line_size == 0)
                    503:                goto skip_pcache;
                    504:
                    505:        if (arm_pcache_unified) {
                    506:                printf("%s: %dKB/%dB %d-way %s unified cache\n",
                    507:                    dv->dv_xname, arm_pdcache_size / 1024,
                    508:                    arm_pdcache_line_size, arm_pdcache_ways,
                    509:                    wtnames[arm_pcache_type]);
                    510:        } else {
                    511:                printf("%s: %dKB(%db/l,%dway) I-cache, %dKB(%db/l,%dway) %s D-cache\n",
                    512:                    dv->dv_xname, arm_picache_size / 1024,
                    513:                    arm_picache_line_size, arm_picache_ways,
                    514:                    arm_pdcache_size / 1024, arm_pdcache_line_size,
                    515:                    arm_pdcache_ways, wtnames[arm_pcache_type]);
                    516:        }
                    517:
                    518:  skip_pcache:
                    519:
                    520:        switch (cpu_class) {
                    521: #ifdef CPU_ARM2
                    522:        case CPU_CLASS_ARM2:
                    523: #endif
                    524: #ifdef CPU_ARM250
                    525:        case CPU_CLASS_ARM2AS:
                    526: #endif
                    527: #ifdef CPU_ARM3
                    528:        case CPU_CLASS_ARM3:
                    529: #endif
                    530: #ifdef CPU_ARM6
                    531:        case CPU_CLASS_ARM6:
                    532: #endif
                    533: #ifdef CPU_ARM7
                    534:        case CPU_CLASS_ARM7:
                    535: #endif
                    536: #ifdef CPU_ARM7TDMI
                    537:        case CPU_CLASS_ARM7TDMI:
                    538: #endif
                    539: #ifdef CPU_ARM8
                    540:        case CPU_CLASS_ARM8:
                    541: #endif
                    542: #ifdef CPU_ARM9
                    543:        case CPU_CLASS_ARM9TDMI:
                    544: #endif
                    545: #ifdef CPU_ARM10
                    546:        case CPU_CLASS_ARM10E:
                    547: #endif
                    548: #if defined(CPU_SA1) || defined(CPU_SA110) || defined(CPU_SA1100) || \
                    549:     defined(CPU_SA1110) || defined(CPU_IXP12X0)
                    550:        case CPU_CLASS_SA1:
                    551: #endif
                    552: #if defined(CPU_XSCALE_80200) || defined(CPU_XSCALE_80321) || \
                    553:     defined(CPU_XSCALE_PXA2X0) || defined(CPU_XSCALE_IXP425)
                    554:        case CPU_CLASS_XSCALE:
                    555: #endif
                    556:                break;
                    557:        default:
                    558:                if (cpu_classes[cpu_class].class_option != NULL)
                    559:                        printf("%s: %s does not fully support this CPU."
                    560:                               "\n", dv->dv_xname, ostype);
                    561:                else {
                    562:                        printf("%s: This kernel does not fully support "
                    563:                               "this CPU.\n", dv->dv_xname);
                    564:                        printf("%s: Recompile with \"options %s\" to "
                    565:                               "correct this.\n", dv->dv_xname,
                    566:                               cpu_classes[cpu_class].class_option);
                    567:                }
                    568:                break;
                    569:        }
                    570:
                    571: }
                    572: #ifdef MULTIPROCESSOR
                    573: int
                    574: cpu_alloc_idlepcb(struct cpu_info *ci)
                    575: {
                    576:        vaddr_t uaddr;
                    577:        struct pcb *pcb;
                    578:        struct trapframe *tf;
                    579:        int error;
                    580:
                    581:        /*
                    582:         * Generate a kernel stack and PCB (in essence, a u-area) for the
                    583:         * new CPU.
                    584:         */
                    585:        if (uvm_uarea_alloc(&uaddr)) {
                    586:                error = uvm_fault_wire(kernel_map, uaddr, uaddr + USPACE,
                    587:                    VM_FAULT_WIRE, VM_PROT_READ | VM_PROT_WRITE);
                    588:                if (error)
                    589:                        return error;
                    590:        }
                    591:        ci->ci_idlepcb = pcb = (struct pcb *)uaddr;
                    592:
                    593:        /*
                    594:         * This code is largely derived from cpu_fork(), with which it
                    595:         * should perhaps be shared.
                    596:         */
                    597:
                    598:        /* Copy the pcb */
                    599:        *pcb = proc0.p_addr->u_pcb;
                    600:
                    601:        /* Set up the undefined stack for the process. */
                    602:        pcb->pcb_un.un_32.pcb32_und_sp = uaddr + USPACE_UNDEF_STACK_TOP;
                    603:        pcb->pcb_un.un_32.pcb32_sp = uaddr + USPACE_SVC_STACK_TOP;
                    604:
                    605: #ifdef STACKCHECKS
                    606:        /* Fill the undefined stack with a known pattern */
                    607:        memset(((u_char *)uaddr) + USPACE_UNDEF_STACK_BOTTOM, 0xdd,
                    608:            (USPACE_UNDEF_STACK_TOP - USPACE_UNDEF_STACK_BOTTOM));
                    609:        /* Fill the kernel stack with a known pattern */
                    610:        memset(((u_char *)uaddr) + USPACE_SVC_STACK_BOTTOM, 0xdd,
                    611:            (USPACE_SVC_STACK_TOP - USPACE_SVC_STACK_BOTTOM));
                    612: #endif /* STACKCHECKS */
                    613:
                    614:        pcb->pcb_tf = tf =
                    615:            (struct trapframe *)pcb->pcb_un.un_32.pcb32_sp - 1;
                    616:        *tf = *proc0.p_addr->u_pcb.pcb_tf;
                    617:        return 0;
                    618: }
                    619: #endif /* MULTIPROCESSOR */
                    620:
                    621: /* End of cpu.c */

CVSweb