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

Annotation of sys/arch/mvmeppc/dev/cpu.c, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: cpu.c,v 1.8 2004/11/18 16:10:28 miod Exp $ */
        !             2:
        !             3: /*
        !             4:  * Copyright (c) 1997 Per Fogelstrom
        !             5:  * Copyright (c) 1997 RTMX Inc
        !             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 under OpenBSD for RTMX Inc
        !            18:  *     North Carolina, USA, by Per Fogelstrom, Opsycon AB, Sweden.
        !            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
        !            23:  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
        !            24:  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
        !            25:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
        !            26:  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
        !            27:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
        !            28:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            29:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
        !            30:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
        !            31:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
        !            32:  * SUCH DAMAGE.
        !            33:  *
        !            34:  */
        !            35:
        !            36: #include <sys/param.h>
        !            37: #include <sys/systm.h>
        !            38: #include <sys/proc.h>
        !            39: #include <sys/user.h>
        !            40: #include <sys/device.h>
        !            41:
        !            42: #include <machine/autoconf.h>
        !            43:
        !            44: /* only valid on 603(e,ev) and G3, G4 */
        !            45: #define HID0_DOZE      (1 << (31-8))
        !            46: #define HID0_NAP       (1 << (31-9))
        !            47: #define HID0_SLEEP     (1 << (31-10))
        !            48: #define HID0_DPM       (1 << (31-11))
        !            49: #define HID0_SGE       (1 << (31-24))
        !            50: #define HID0_BTIC      (1 << (31-26))
        !            51: #define HID0_LRSTK     (1 << (31-27))
        !            52: #define HID0_FOLD      (1 << (31-28))
        !            53: #define HID0_BHT       (1 << (31-29))
        !            54:
        !            55: char cpu_model[80];
        !            56: char machine[] = MACHINE;      /* cpu architecture */
        !            57:
        !            58: /* Definition of the driver for autoconfig. */
        !            59: int    cpumatch(struct device *, void *, void *);
        !            60: void   cpuattach(struct device *, struct device *, void *);
        !            61:
        !            62: struct cfattach cpu_ca = {
        !            63:        sizeof(struct device), cpumatch, cpuattach
        !            64: };
        !            65:
        !            66: struct cfdriver cpu_cd = {
        !            67:        NULL, "cpu", DV_DULL
        !            68: };
        !            69:
        !            70: void config_l2cr(int cpu);
        !            71:
        !            72: int
        !            73: cpumatch(parent, cfdata, aux)
        !            74:        struct device *parent;
        !            75:        void *cfdata;
        !            76:        void *aux;
        !            77: {
        !            78:        struct confargs *ca = aux;
        !            79:
        !            80:        /* make sure that we're looking for a CPU. */
        !            81:        if (strcmp(ca->ca_name, cpu_cd.cd_name) != 0)
        !            82:                return (0);
        !            83:
        !            84:        return (1);
        !            85: }
        !            86:
        !            87: void
        !            88: cpuattach(struct device *parent, struct device *dev, void *aux)
        !            89: {
        !            90:        unsigned int cpu, pvr, hid0;
        !            91:
        !            92:        pvr = ppc_mfpvr();
        !            93:        cpu = pvr >> 16;
        !            94:        switch (cpu) {
        !            95:        case PPC_CPU_MPC601:
        !            96:                snprintf(cpu_model, sizeof(cpu_model), "601");
        !            97:                break;
        !            98:        case PPC_CPU_MPC603:
        !            99:                snprintf(cpu_model, sizeof(cpu_model), "603");
        !           100:                break;
        !           101:        case PPC_CPU_MPC604:
        !           102:                snprintf(cpu_model, sizeof(cpu_model), "604");
        !           103:                break;
        !           104:        case PPC_CPU_MPC603e:
        !           105:                snprintf(cpu_model, sizeof(cpu_model), "603e");
        !           106:                break;
        !           107:        case PPC_CPU_MPC603ev:
        !           108:                snprintf(cpu_model, sizeof(cpu_model), "603ev");
        !           109:                break;
        !           110:        case PPC_CPU_MPC750:
        !           111:                snprintf(cpu_model, sizeof(cpu_model), "750");
        !           112:                break;
        !           113:        case PPC_CPU_MPC604ev:
        !           114:                snprintf(cpu_model, sizeof(cpu_model), "604ev");
        !           115:                break;
        !           116:        case PPC_CPU_MPC7400:
        !           117:                snprintf(cpu_model, sizeof(cpu_model), "7400");
        !           118:                break;
        !           119:        case PPC_CPU_IBM750FX:
        !           120:                snprintf(cpu_model, sizeof(cpu_model), "750FX");
        !           121:                break;
        !           122:        case PPC_CPU_MPC7410:
        !           123:                snprintf(cpu_model, sizeof(cpu_model), "7410");
        !           124:                break;
        !           125:        case PPC_CPU_MPC7450:
        !           126:                if ((pvr & 0xf) < 3)
        !           127:                        snprintf(cpu_model, sizeof(cpu_model), "7450");
        !           128:                 else
        !           129:                        snprintf(cpu_model, sizeof(cpu_model), "7451");
        !           130:                break;
        !           131:        case PPC_CPU_MPC7455:
        !           132:                snprintf(cpu_model, sizeof(cpu_model), "7455");
        !           133:                break;
        !           134:        default:
        !           135:                snprintf(cpu_model, sizeof(cpu_model), "Version %x", cpu);
        !           136:                break;
        !           137:        }
        !           138:        snprintf(cpu_model + strlen(cpu_model),
        !           139:            sizeof(cpu_model) - strlen(cpu_model),
        !           140:            " (Revision %x)", pvr & 0xffff);
        !           141:        printf(": %s", cpu_model);
        !           142:
        !           143:        /* power savings mode */
        !           144:        hid0 = ppc_mfhid0();
        !           145:        switch (cpu) {
        !           146:        case PPC_CPU_MPC603:
        !           147:        case PPC_CPU_MPC603e:
        !           148:        case PPC_CPU_MPC750:
        !           149:        case PPC_CPU_MPC7400:
        !           150:        case PPC_CPU_IBM750FX:
        !           151:        case PPC_CPU_MPC7410:
        !           152:                /* select DOZE mode */
        !           153:                hid0 &= ~(HID0_NAP | HID0_SLEEP);
        !           154:                hid0 |= HID0_DOZE | HID0_DPM;
        !           155:                break;
        !           156:        case PPC_CPU_MPC7450:
        !           157:        case PPC_CPU_MPC7455:
        !           158:                /* select NAP mode */
        !           159:                hid0 &= ~(HID0_DOZE | HID0_SLEEP);
        !           160:                hid0 |= HID0_NAP | HID0_DPM;
        !           161:                /* try some other flags */
        !           162:                hid0 |= HID0_SGE | HID0_BTIC;
        !           163:                hid0 |= HID0_LRSTK | HID0_FOLD | HID0_BHT;
        !           164:                /* Disable BTIC on 7450 Rev 2.0 or earlier */
        !           165:                if (cpu == PPC_CPU_MPC7450 && (pvr & 0xffff) < 0x0200)
        !           166:                        hid0 &= ~HID0_BTIC;
        !           167:                break;
        !           168:        }
        !           169:        ppc_mthid0(hid0);
        !           170:
        !           171:        /* if processor is G3 or G4, configure l2 cache */
        !           172:        if (cpu == PPC_CPU_MPC750 || cpu == PPC_CPU_MPC7400 ||
        !           173:            cpu == PPC_CPU_IBM750FX || cpu == PPC_CPU_MPC7410 ||
        !           174:            cpu == PPC_CPU_MPC7450 || cpu == PPC_CPU_MPC7455) {
        !           175:                config_l2cr(cpu);
        !           176:        }
        !           177:        printf("\n");
        !           178: }
        !           179:
        !           180: /* L2CR bit definitions */
        !           181: #define L2CR_L2E        0x80000000 /* 0: L2 enable */
        !           182: #define L2CR_L2PE       0x40000000 /* 1: L2 data parity enable */
        !           183: #define L2CR_L2SIZ      0x30000000 /* 2-3: L2 size */
        !           184: #define  L2SIZ_RESERVED         0x00000000
        !           185: #define  L2SIZ_256K             0x10000000
        !           186: #define  L2SIZ_512K             0x20000000
        !           187: #define  L2SIZ_1M       0x30000000
        !           188: #define L2CR_L2CLK      0x0e000000 /* 4-6: L2 clock ratio */
        !           189: #define  L2CLK_DIS              0x00000000 /* disable L2 clock */
        !           190: #define  L2CLK_10               0x02000000 /* core clock / 1   */
        !           191: #define  L2CLK_15               0x04000000 /*            / 1.5 */
        !           192: #define  L2CLK_20               0x08000000 /*            / 2   */
        !           193: #define  L2CLK_25               0x0a000000 /*            / 2.5 */
        !           194: #define  L2CLK_30               0x0c000000 /*            / 3   */
        !           195: #define L2CR_L2RAM      0x01800000 /* 7-8: L2 RAM type */
        !           196: #define  L2RAM_FLOWTHRU_BURST   0x00000000
        !           197: #define  L2RAM_PIPELINE_BURST   0x01000000
        !           198: #define  L2RAM_PIPELINE_LATE    0x01800000
        !           199: #define L2CR_L2DO       0x00400000 /* 9: L2 data-only.
        !           200:                                       Setting this bit disables instruction
        !           201:                                       caching. */
        !           202: #define L2CR_L2I        0x00200000 /* 10: L2 global invalidate. */
        !           203: #define L2CR_L2CTL      0x00100000 /* 11: L2 RAM control (ZZ enable).
        !           204:                                       Enables automatic operation of the
        !           205:                                       L2ZZ (low-power mode) signal. */
        !           206: #define L2CR_L2WT       0x00080000 /* 12: L2 write-through. */
        !           207: #define L2CR_L2TS       0x00040000 /* 13: L2 test support. */
        !           208: #define L2CR_L2OH       0x00030000 /* 14-15: L2 output hold. */
        !           209: #define L2CR_L2SL       0x00008000 /* 16: L2 DLL slow. */
        !           210: #define L2CR_L2DF       0x00004000 /* 17: L2 differential clock. */
        !           211: #define L2CR_L2BYP      0x00002000 /* 18: L2 DLL bypass. */
        !           212: #define L2CR_L2IP       0x00000001 /* 31: L2 global invalidate in progress
        !           213:                                       (read only). */
        !           214: #ifdef L2CR_CONFIG
        !           215: u_int l2cr_config = L2CR_CONFIG;
        !           216: #else
        !           217: u_int l2cr_config = 0;
        !           218: #endif
        !           219:
        !           220: /* L3CR bit definitions */
        !           221: #define   L3CR_L3E                0x80000000 /*  0: L3 enable */
        !           222: #define   L3CR_L3SIZ              0x10000000 /*  3: L3 size (0=1MB, 1=2MB) */
        !           223:
        !           224: void
        !           225: config_l2cr(int cpu)
        !           226: {
        !           227:        u_int l2cr, x;
        !           228:
        !           229:        l2cr = ppc_mfl2cr();
        !           230:
        !           231:        /*
        !           232:         * Configure L2 cache if not enabled.
        !           233:         */
        !           234:        if ((l2cr & L2CR_L2E) == 0 && l2cr_config != 0) {
        !           235:                l2cr = l2cr_config;
        !           236:                ppc_mtl2cr(l2cr);
        !           237:
        !           238:                /* Wait for L2 clock to be stable (640 L2 clocks). */
        !           239:                delay(100);
        !           240:
        !           241:                /* Invalidate all L2 contents. */
        !           242:                l2cr |= L2CR_L2I;
        !           243:                ppc_mtl2cr(l2cr);
        !           244:                do {
        !           245:                        x = ppc_mfl2cr();
        !           246:                } while (x & L2CR_L2IP);
        !           247:
        !           248:                /* Enable L2 cache. */
        !           249:                l2cr &= ~L2CR_L2I;
        !           250:                l2cr |= L2CR_L2E;
        !           251:                ppc_mtl2cr(l2cr);
        !           252:        }
        !           253:
        !           254:        if (l2cr & L2CR_L2E) {
        !           255:                if (cpu == PPC_CPU_MPC7450 || cpu == PPC_CPU_MPC7455) {
        !           256:                        u_int l3cr;
        !           257:
        !           258:                        printf(": 256KB L2 cache");
        !           259:
        !           260:                        l3cr = ppc_mfl3cr();
        !           261:                        if (l3cr & L3CR_L3E)
        !           262:                                printf(", %cMB L3 cache",
        !           263:                                    l3cr & L3CR_L3SIZ ? '2' : '1');
        !           264:                } else if (cpu == PPC_CPU_IBM750FX)
        !           265:                        printf(": 512KB L2 cache");
        !           266:                else {
        !           267:                        switch (l2cr & L2CR_L2SIZ) {
        !           268:                        case L2SIZ_256K:
        !           269:                                printf(": 256KB");
        !           270:                                break;
        !           271:                        case L2SIZ_512K:
        !           272:                                printf(": 512KB");
        !           273:                                break;
        !           274:                        case L2SIZ_1M:
        !           275:                                printf(": 1MB");
        !           276:                                break;
        !           277:                        default:
        !           278:                                printf(": unknown size");
        !           279:                        }
        !           280:                        printf(" backside cache");
        !           281:                }
        !           282: #if 0
        !           283:                switch (l2cr & L2CR_L2RAM) {
        !           284:                case L2RAM_FLOWTHRU_BURST:
        !           285:                        printf(" Flow-through synchronous burst SRAM");
        !           286:                        break;
        !           287:                case L2RAM_PIPELINE_BURST:
        !           288:                        printf(" Pipelined synchronous burst SRAM");
        !           289:                        break;
        !           290:                case L2RAM_PIPELINE_LATE:
        !           291:                        printf(" Pipelined synchronous late-write SRAM");
        !           292:                        break;
        !           293:                default:
        !           294:                        printf(" unknown type");
        !           295:                }
        !           296:
        !           297:                if (l2cr & L2CR_L2PE)
        !           298:                        printf(" with parity");
        !           299: #endif
        !           300:        } else
        !           301:                printf(": L2 cache not enabled");
        !           302: }

CVSweb