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

Annotation of sys/arch/i386/i386/est.c, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: est.c,v 1.30 2007/06/07 11:20:58 dim Exp $ */
        !             2: /*
        !             3:  * Copyright (c) 2003 Michael Eriksson.
        !             4:  * All rights reserved.
        !             5:  *
        !             6:  * Redistribution and use in source and binary forms, with or without
        !             7:  * modification, are permitted provided that the following conditions
        !             8:  * are met:
        !             9:  * 1. Redistributions of source code must retain the above copyright
        !            10:  *    notice, this list of conditions and the following disclaimer.
        !            11:  * 2. Redistributions in binary form must reproduce the above copyright
        !            12:  *    notice, this list of conditions and the following disclaimer in the
        !            13:  *    documentation and/or other materials provided with the distribution.
        !            14:  * 3. The name of the author may not be used to endorse or promote products
        !            15:  *    derived from this software without specific prior written permission.
        !            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 BE LIABLE FOR ANY DIRECT, INDIRECT,
        !            21:  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
        !            22:  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
        !            23:  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
        !            24:  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
        !            25:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
        !            26:  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
        !            27:  */
        !            28:
        !            29:
        !            30: /*
        !            31:  * This is a driver for Intel's Enhanced SpeedStep, as implemented in
        !            32:  * Pentium M processors.
        !            33:  *
        !            34:  * Reference documentation:
        !            35:  *
        !            36:  * - IA-32 Intel Architecture Software Developer's Manual, Volume 3:
        !            37:  *   System Programming Guide.
        !            38:  *   Section 13.14, Enhanced Intel SpeedStep technology.
        !            39:  *   Table B-2, MSRs in Pentium M Processors.
        !            40:  *   http://www.intel.com/design/pentium4/manuals/245472.htm
        !            41:  *
        !            42:  * - Intel Pentium M Processor Datasheet.
        !            43:  *   Table 5, Voltage and Current Specifications.
        !            44:  *   http://www.intel.com/design/mobile/datashts/252612.htm
        !            45:  *
        !            46:  * - Intel Pentium M Processor on 90 nm Process with 2-MB L2 Cache Datasheet
        !            47:  *   Table 3-4, Voltage and Current Specifications.
        !            48:  *   http://www.intel.com/design/mobile/datashts/302189.htm
        !            49:  *
        !            50:  * - Linux cpufreq patches, speedstep-centrino.c.
        !            51:  *   Encoding of MSR_PERF_CTL and MSR_PERF_STATUS.
        !            52:  *   http://www.codemonkey.org.uk/projects/cpufreq/cpufreq-2.4.22-pre6-1.gz
        !            53:  */
        !            54:
        !            55:
        !            56: #include <sys/param.h>
        !            57: #include <sys/systm.h>
        !            58: #include <sys/sysctl.h>
        !            59:
        !            60: #include <machine/cpu.h>
        !            61: #include <machine/cpufunc.h>
        !            62: #include <machine/specialreg.h>
        !            63:
        !            64:
        !            65: /* Convert MHz and mV into IDs for passing to the MSR. */
        !            66: #define ID16(MHz, mV, bus_clk) \
        !            67:        ((((MHz * 100 + 50) / bus_clk) << 8) | ((mV ? mV - 700 : 0) >> 4))
        !            68:
        !            69:
        !            70: /* Ultra Low Voltage Intel Pentium M processor 900 MHz */
        !            71: static const u_int16_t pm130_900_ulv[] = {
        !            72:        ID16( 900, 1004, BUS100),
        !            73:        ID16( 800,  988, BUS100),
        !            74:        ID16( 600,  844, BUS100),
        !            75: };
        !            76:
        !            77: /* Ultra Low Voltage Intel Pentium M processor 1.00 GHz */
        !            78: static const u_int16_t pm130_1000_ulv[] = {
        !            79:        ID16(1000, 1004, BUS100),
        !            80:        ID16( 900,  988, BUS100),
        !            81:        ID16( 800,  972, BUS100),
        !            82:        ID16( 600,  844, BUS100),
        !            83: };
        !            84:
        !            85: /* Ultra Low Voltage Intel Pentium M processor 1.10 GHz */
        !            86: static const u_int16_t pm130_1100_ulv[] = {
        !            87:        ID16(1100, 1004, BUS100),
        !            88:        ID16(1000,  988, BUS100),
        !            89:        ID16( 900,  972, BUS100),
        !            90:        ID16( 800,  956, BUS100),
        !            91:        ID16( 600,  844, BUS100),
        !            92: };
        !            93:
        !            94: /* Low Voltage Intel Pentium M processor 1.10 GHz */
        !            95: static const u_int16_t pm130_1100_lv[] = {
        !            96:        ID16(1100, 1180, BUS100),
        !            97:        ID16(1000, 1164, BUS100),
        !            98:        ID16( 900, 1100, BUS100),
        !            99:        ID16( 800, 1020, BUS100),
        !           100:        ID16( 600,  956, BUS100),
        !           101: };
        !           102:
        !           103: /* Low Voltage Intel Pentium M processor 1.20 GHz */
        !           104: static const u_int16_t pm130_1200_lv[] = {
        !           105:        ID16(1200, 1180, BUS100),
        !           106:        ID16(1100, 1164, BUS100),
        !           107:        ID16(1000, 1100, BUS100),
        !           108:        ID16( 900, 1020, BUS100),
        !           109:        ID16( 800, 1004, BUS100),
        !           110:        ID16( 600,  956, BUS100),
        !           111: };
        !           112:
        !           113: /* Low Voltage Intel Pentium M processor 1.30 GHz */
        !           114: static const u_int16_t pm130_1300_lv[] = {
        !           115:        ID16(1300, 1180, BUS100),
        !           116:        ID16(1200, 1164, BUS100),
        !           117:        ID16(1100, 1100, BUS100),
        !           118:        ID16(1000, 1020, BUS100),
        !           119:        ID16( 900, 1004, BUS100),
        !           120:        ID16( 800,  988, BUS100),
        !           121:        ID16( 600,  956, BUS100),
        !           122: };
        !           123:
        !           124: /* Intel Pentium M processor 1.30 GHz */
        !           125: static const u_int16_t pm130_1300[] = {
        !           126:        ID16(1300, 1388, BUS100),
        !           127:        ID16(1200, 1356, BUS100),
        !           128:        ID16(1000, 1292, BUS100),
        !           129:        ID16( 800, 1260, BUS100),
        !           130:        ID16( 600,  956, BUS100),
        !           131: };
        !           132:
        !           133: /* Intel Pentium M processor 1.40 GHz */
        !           134: static const u_int16_t pm130_1400[] = {
        !           135:        ID16(1400, 1484, BUS100),
        !           136:        ID16(1200, 1436, BUS100),
        !           137:        ID16(1000, 1308, BUS100),
        !           138:        ID16( 800, 1180, BUS100),
        !           139:        ID16( 600,  956, BUS100),
        !           140: };
        !           141:
        !           142: /* Intel Pentium M processor 1.50 GHz */
        !           143: static const u_int16_t pm130_1500[] = {
        !           144:        ID16(1500, 1484, BUS100),
        !           145:        ID16(1400, 1452, BUS100),
        !           146:        ID16(1200, 1356, BUS100),
        !           147:        ID16(1000, 1228, BUS100),
        !           148:        ID16( 800, 1116, BUS100),
        !           149:        ID16( 600,  956, BUS100),
        !           150: };
        !           151:
        !           152: /* Intel Pentium M processor 1.60 GHz */
        !           153: static const u_int16_t pm130_1600[] = {
        !           154:        ID16(1600, 1484, BUS100),
        !           155:        ID16(1400, 1420, BUS100),
        !           156:        ID16(1200, 1276, BUS100),
        !           157:        ID16(1000, 1164, BUS100),
        !           158:        ID16( 800, 1036, BUS100),
        !           159:        ID16( 600,  956, BUS100),
        !           160: };
        !           161:
        !           162: /* Intel Pentium M processor 1.70 GHz */
        !           163: static const u_int16_t pm130_1700[] = {
        !           164:        ID16(1700, 1484, BUS100),
        !           165:        ID16(1400, 1308, BUS100),
        !           166:        ID16(1200, 1228, BUS100),
        !           167:        ID16(1000, 1116, BUS100),
        !           168:        ID16( 800, 1004, BUS100),
        !           169:        ID16( 600,  956, BUS100),
        !           170: };
        !           171:
        !           172: /* Intel Pentium M processor 723 1.0 GHz */
        !           173: static const u_int16_t pm90_n723[] = {
        !           174:        ID16(1000,  940, BUS100),
        !           175:        ID16( 900,  908, BUS100),
        !           176:        ID16( 800,  876, BUS100),
        !           177:        ID16( 600,  812, BUS100),
        !           178: };
        !           179:
        !           180: /* Intel Pentium M processor 733 1.1 GHz, VID #G */
        !           181: static const u_int16_t pm90_n733g[] = {
        !           182:        ID16(1100,  956, BUS100),
        !           183:        ID16(1000,  940, BUS100),
        !           184:        ID16( 900,  908, BUS100),
        !           185:        ID16( 800,  876, BUS100),
        !           186:        ID16( 600,  812, BUS100),
        !           187: };
        !           188:
        !           189: /* Intel Pentium M processor 733 1.1 GHz, VID #H */
        !           190: static const u_int16_t pm90_n733h[] = {
        !           191:        ID16(1100,  940, BUS100),
        !           192:        ID16(1000,  924, BUS100),
        !           193:        ID16( 900,  892, BUS100),
        !           194:        ID16( 800,  876, BUS100),
        !           195:        ID16( 600,  812, BUS100),
        !           196: };
        !           197:
        !           198: /* Intel Pentium M processor 733 1.1 GHz, VID #I */
        !           199: static const u_int16_t pm90_n733i[] = {
        !           200:        ID16(1100,  924, BUS100),
        !           201:        ID16(1000,  908, BUS100),
        !           202:        ID16( 900,  892, BUS100),
        !           203:        ID16( 800,  860, BUS100),
        !           204:        ID16( 600,  812, BUS100),
        !           205: };
        !           206:
        !           207: /* Intel Pentium M processor 733 1.1 GHz, VID #J */
        !           208: static const u_int16_t pm90_n733j[] = {
        !           209:        ID16(1100,  908, BUS100),
        !           210:        ID16(1000,  892, BUS100),
        !           211:        ID16( 900,  876, BUS100),
        !           212:        ID16( 800,  860, BUS100),
        !           213:        ID16( 600,  812, BUS100),
        !           214: };
        !           215:
        !           216: /* Intel Pentium M processor 733 1.1 GHz, VID #K */
        !           217: static const u_int16_t pm90_n733k[] = {
        !           218:        ID16(1100,  892, BUS100),
        !           219:        ID16(1000,  876, BUS100),
        !           220:        ID16( 900,  860, BUS100),
        !           221:        ID16( 800,  844, BUS100),
        !           222:        ID16( 600,  812, BUS100),
        !           223: };
        !           224:
        !           225: /* Intel Pentium M processor 733 1.1 GHz, VID #L */
        !           226: static const u_int16_t pm90_n733l[] = {
        !           227:        ID16(1100,  876, BUS100),
        !           228:        ID16(1000,  876, BUS100),
        !           229:        ID16( 900,  860, BUS100),
        !           230:        ID16( 800,  844, BUS100),
        !           231:        ID16( 600,  812, BUS100),
        !           232: };
        !           233:
        !           234: /* Intel Pentium M processor 753 1.2 GHz, VID #G */
        !           235: static const u_int16_t pm90_n753g[] = {
        !           236:        ID16(1200,  956, BUS100),
        !           237:        ID16(1100,  940, BUS100),
        !           238:        ID16(1000,  908, BUS100),
        !           239:        ID16( 900,  892, BUS100),
        !           240:        ID16( 800,  860, BUS100),
        !           241:        ID16( 600,  812, BUS100),
        !           242: };
        !           243:
        !           244: /* Intel Pentium M processor 753 1.2 GHz, VID #H */
        !           245: static const u_int16_t pm90_n753h[] = {
        !           246:        ID16(1200,  940, BUS100),
        !           247:        ID16(1100,  924, BUS100),
        !           248:        ID16(1000,  908, BUS100),
        !           249:        ID16( 900,  876, BUS100),
        !           250:        ID16( 800,  860, BUS100),
        !           251:        ID16( 600,  812, BUS100),
        !           252: };
        !           253:
        !           254: /* Intel Pentium M processor 753 1.2 GHz, VID #I */
        !           255: static const u_int16_t pm90_n753i[] = {
        !           256:        ID16(1200,  924, BUS100),
        !           257:        ID16(1100,  908, BUS100),
        !           258:        ID16(1000,  892, BUS100),
        !           259:        ID16( 900,  876, BUS100),
        !           260:        ID16( 800,  860, BUS100),
        !           261:        ID16( 600,  812, BUS100),
        !           262: };
        !           263:
        !           264: /* Intel Pentium M processor 753 1.2 GHz, VID #J */
        !           265: static const u_int16_t pm90_n753j[] = {
        !           266:        ID16(1200,  908, BUS100),
        !           267:        ID16(1100,  892, BUS100),
        !           268:        ID16(1000,  876, BUS100),
        !           269:        ID16( 900,  860, BUS100),
        !           270:        ID16( 800,  844, BUS100),
        !           271:        ID16( 600,  812, BUS100),
        !           272: };
        !           273:
        !           274: /* Intel Pentium M processor 753 1.2 GHz, VID #K */
        !           275: static const u_int16_t pm90_n753k[] = {
        !           276:        ID16(1200,  892, BUS100),
        !           277:        ID16(1100,  892, BUS100),
        !           278:        ID16(1000,  876, BUS100),
        !           279:        ID16( 900,  860, BUS100),
        !           280:        ID16( 800,  844, BUS100),
        !           281:        ID16( 600,  812, BUS100),
        !           282: };
        !           283:
        !           284: /* Intel Pentium M processor 753 1.2 GHz, VID #L */
        !           285: static const u_int16_t pm90_n753l[] = {
        !           286:        ID16(1200,  876, BUS100),
        !           287:        ID16(1100,  876, BUS100),
        !           288:        ID16(1000,  860, BUS100),
        !           289:        ID16( 900,  844, BUS100),
        !           290:        ID16( 800,  844, BUS100),
        !           291:        ID16( 600,  812, BUS100),
        !           292: };
        !           293:
        !           294: /* Intel Pentium M processor 773 1.3 GHz, VID #G */
        !           295: static const u_int16_t pm90_n773g[] = {
        !           296:        ID16(1300,  956, BUS100),
        !           297:        ID16(1200,  940, BUS100),
        !           298:        ID16(1100,  924, BUS100),
        !           299:        ID16(1000,  908, BUS100),
        !           300:        ID16( 900,  876, BUS100),
        !           301:        ID16( 800,  860, BUS100),
        !           302:        ID16( 600,  812, BUS100),
        !           303: };
        !           304:
        !           305: /* Intel Pentium M processor 773 1.3 GHz, VID #H */
        !           306: static const u_int16_t pm90_n773h[] = {
        !           307:        ID16(1300,  940, BUS100),
        !           308:        ID16(1200,  924, BUS100),
        !           309:        ID16(1100,  908, BUS100),
        !           310:        ID16(1000,  892, BUS100),
        !           311:        ID16( 900,  876, BUS100),
        !           312:        ID16( 800,  860, BUS100),
        !           313:        ID16( 600,  812, BUS100),
        !           314: };
        !           315:
        !           316: /* Intel Pentium M processor 773 1.3 GHz, VID #I */
        !           317: static const u_int16_t pm90_n773i[] = {
        !           318:        ID16(1300,  924, BUS100),
        !           319:        ID16(1200,  908, BUS100),
        !           320:        ID16(1100,  892, BUS100),
        !           321:        ID16(1000,  876, BUS100),
        !           322:        ID16( 900,  860, BUS100),
        !           323:        ID16( 800,  844, BUS100),
        !           324:        ID16( 600,  812, BUS100),
        !           325: };
        !           326:
        !           327: /* Intel Pentium M processor 773 1.3 GHz, VID #J */
        !           328: static const u_int16_t pm90_n773j[] = {
        !           329:        ID16(1300,  908, BUS100),
        !           330:        ID16(1200,  908, BUS100),
        !           331:        ID16(1100,  892, BUS100),
        !           332:        ID16(1000,  876, BUS100),
        !           333:        ID16( 900,  860, BUS100),
        !           334:        ID16( 800,  844, BUS100),
        !           335:        ID16( 600,  812, BUS100),
        !           336: };
        !           337:
        !           338: /* Intel Pentium M processor 773 1.3 GHz, VID #K */
        !           339: static const u_int16_t pm90_n773k[] = {
        !           340:        ID16(1300,  892, BUS100),
        !           341:        ID16(1200,  892, BUS100),
        !           342:        ID16(1100,  876, BUS100),
        !           343:        ID16(1000,  860, BUS100),
        !           344:        ID16( 900,  860, BUS100),
        !           345:        ID16( 800,  844, BUS100),
        !           346:        ID16( 600,  812, BUS100),
        !           347: };
        !           348:
        !           349: /* Intel Pentium M processor 773 1.3 GHz, VID #L */
        !           350: static const u_int16_t pm90_n773l[] = {
        !           351:        ID16(1300,  876, BUS100),
        !           352:        ID16(1200,  876, BUS100),
        !           353:        ID16(1100,  860, BUS100),
        !           354:        ID16(1000,  860, BUS100),
        !           355:        ID16( 900,  844, BUS100),
        !           356:        ID16( 800,  844, BUS100),
        !           357:        ID16( 600,  812, BUS100),
        !           358: };
        !           359:
        !           360: /* Intel Pentium M processor 738 1.4 GHz */
        !           361: static const u_int16_t pm90_n738[] = {
        !           362:        ID16(1400, 1116, BUS100),
        !           363:        ID16(1300, 1116, BUS100),
        !           364:        ID16(1200, 1100, BUS100),
        !           365:        ID16(1100, 1068, BUS100),
        !           366:        ID16(1000, 1052, BUS100),
        !           367:        ID16( 900, 1036, BUS100),
        !           368:        ID16( 800, 1020, BUS100),
        !           369:        ID16( 600,  988, BUS100),
        !           370: };
        !           371:
        !           372: /* Intel Pentium M processor 758 1.5 GHz */
        !           373: static const u_int16_t pm90_n758[] = {
        !           374:        ID16(1500, 1116, BUS100),
        !           375:        ID16(1400, 1116, BUS100),
        !           376:        ID16(1300, 1100, BUS100),
        !           377:        ID16(1200, 1084, BUS100),
        !           378:        ID16(1100, 1068, BUS100),
        !           379:        ID16(1000, 1052, BUS100),
        !           380:        ID16( 900, 1036, BUS100),
        !           381:        ID16( 800, 1020, BUS100),
        !           382:        ID16( 600,  988, BUS100),
        !           383: };
        !           384:
        !           385: /* Intel Pentium M processor 778 1.6 GHz */
        !           386: static const u_int16_t pm90_n778[] = {
        !           387:        ID16(1600, 1116, BUS100),
        !           388:        ID16(1500, 1116, BUS100),
        !           389:        ID16(1400, 1100, BUS100),
        !           390:        ID16(1300, 1184, BUS100),
        !           391:        ID16(1200, 1068, BUS100),
        !           392:        ID16(1100, 1052, BUS100),
        !           393:        ID16(1000, 1052, BUS100),
        !           394:        ID16( 900, 1036, BUS100),
        !           395:        ID16( 800, 1020, BUS100),
        !           396:        ID16( 600,  988, BUS100),
        !           397: };
        !           398:
        !           399: /* Intel Pentium M processor 710 1.4 GHz, 533 MHz FSB */
        !           400: static const u_int16_t pm90_n710[] = {
        !           401:        ID16(1400, 1340, BUS133),
        !           402:        ID16(1200, 1228, BUS133),
        !           403:        ID16(1000, 1148, BUS133),
        !           404:        ID16( 800, 1068, BUS133),
        !           405:        ID16( 600,  998, BUS133),
        !           406: };
        !           407:
        !           408: /* Intel Pentium M processor 715 1.5 GHz, VID #A */
        !           409: static const u_int16_t pm90_n715a[] = {
        !           410:        ID16(1500, 1340, BUS100),
        !           411:        ID16(1200, 1228, BUS100),
        !           412:        ID16(1000, 1148, BUS100),
        !           413:        ID16( 800, 1068, BUS100),
        !           414:        ID16( 600,  988, BUS100),
        !           415: };
        !           416:
        !           417: /* Intel Pentium M processor 715 1.5 GHz, VID #B */
        !           418: static const u_int16_t pm90_n715b[] = {
        !           419:        ID16(1500, 1324, BUS100),
        !           420:        ID16(1200, 1212, BUS100),
        !           421:        ID16(1000, 1148, BUS100),
        !           422:        ID16( 800, 1068, BUS100),
        !           423:        ID16( 600,  988, BUS100),
        !           424: };
        !           425:
        !           426: /* Intel Pentium M processor 715 1.5 GHz, VID #C */
        !           427: static const u_int16_t pm90_n715c[] = {
        !           428:        ID16(1500, 1308, BUS100),
        !           429:        ID16(1200, 1212, BUS100),
        !           430:        ID16(1000, 1132, BUS100),
        !           431:        ID16( 800, 1068, BUS100),
        !           432:        ID16( 600,  988, BUS100),
        !           433: };
        !           434:
        !           435: /* Intel Pentium M processor 715 1.5 GHz, VID #D */
        !           436: static const u_int16_t pm90_n715d[] = {
        !           437:        ID16(1500, 1276, BUS100),
        !           438:        ID16(1200, 1180, BUS100),
        !           439:        ID16(1000, 1116, BUS100),
        !           440:        ID16( 800, 1052, BUS100),
        !           441:        ID16( 600,  988, BUS100),
        !           442: };
        !           443:
        !           444: /* Intel Pentium M processor 725 1.6 GHz, VID #A */
        !           445: static const u_int16_t pm90_n725a[] = {
        !           446:        ID16(1600, 1340, BUS100),
        !           447:        ID16(1400, 1276, BUS100),
        !           448:        ID16(1200, 1212, BUS100),
        !           449:        ID16(1000, 1132, BUS100),
        !           450:        ID16( 800, 1068, BUS100),
        !           451:        ID16( 600,  988, BUS100),
        !           452: };
        !           453:
        !           454: /* Intel Pentium M processor 725 1.6 GHz, VID #B */
        !           455: static const u_int16_t pm90_n725b[] = {
        !           456:        ID16(1600, 1324, BUS100),
        !           457:        ID16(1400, 1260, BUS100),
        !           458:        ID16(1200, 1196, BUS100),
        !           459:        ID16(1000, 1132, BUS100),
        !           460:        ID16( 800, 1068, BUS100),
        !           461:        ID16( 600,  988, BUS100),
        !           462: };
        !           463:
        !           464: /* Intel Pentium M processor 725 1.6 GHz, VID #C */
        !           465: static const u_int16_t pm90_n725c[] = {
        !           466:        ID16(1600, 1308, BUS100),
        !           467:        ID16(1400, 1244, BUS100),
        !           468:        ID16(1200, 1180, BUS100),
        !           469:        ID16(1000, 1116, BUS100),
        !           470:        ID16( 800, 1052, BUS100),
        !           471:        ID16( 600,  988, BUS100),
        !           472: };
        !           473:
        !           474: /* Intel Pentium M processor 725 1.6 GHz, VID #D */
        !           475: static const u_int16_t pm90_n725d[] = {
        !           476:        ID16(1600, 1276, BUS100),
        !           477:        ID16(1400, 1228, BUS100),
        !           478:        ID16(1200, 1164, BUS100),
        !           479:        ID16(1000, 1116, BUS100),
        !           480:        ID16( 800, 1052, BUS100),
        !           481:        ID16( 600,  988, BUS100),
        !           482: };
        !           483:
        !           484: /* Intel Pentium M processor 730 1.6 GHz, 533 MHz FSB */
        !           485: static const u_int16_t pm90_n730[] = {
        !           486:        ID16(1600, 1308, BUS133),
        !           487:        ID16(1333, 1260, BUS133),
        !           488:        ID16(1200, 1212, BUS133),
        !           489:        ID16(1067, 1180, BUS133),
        !           490:        ID16( 800,  988, BUS133),
        !           491: };
        !           492:
        !           493: /* Intel Pentium M processor 735 1.7 GHz, VID #A */
        !           494: static const u_int16_t pm90_n735a[] = {
        !           495:        ID16(1700, 1340, BUS100),
        !           496:        ID16(1400, 1244, BUS100),
        !           497:        ID16(1200, 1180, BUS100),
        !           498:        ID16(1000, 1116, BUS100),
        !           499:        ID16( 800, 1052, BUS100),
        !           500:        ID16( 600,  988, BUS100),
        !           501: };
        !           502:
        !           503: /* Intel Pentium M processor 735 1.7 GHz, VID #B */
        !           504: static const u_int16_t pm90_n735b[] = {
        !           505:        ID16(1700, 1324, BUS100),
        !           506:        ID16(1400, 1244, BUS100),
        !           507:        ID16(1200, 1180, BUS100),
        !           508:        ID16(1000, 1116, BUS100),
        !           509:        ID16( 800, 1052, BUS100),
        !           510:        ID16( 600,  988, BUS100),
        !           511: };
        !           512:
        !           513: /* Intel Pentium M processor 735 1.7 GHz, VID #C */
        !           514: static const u_int16_t pm90_n735c[] = {
        !           515:        ID16(1700, 1308, BUS100),
        !           516:        ID16(1400, 1228, BUS100),
        !           517:        ID16(1200, 1164, BUS100),
        !           518:        ID16(1000, 1116, BUS100),
        !           519:        ID16( 800, 1052, BUS100),
        !           520:        ID16( 600,  988, BUS100),
        !           521: };
        !           522:
        !           523: /* Intel Pentium M processor 735 1.7 GHz, VID #D */
        !           524: static const u_int16_t pm90_n735d[] = {
        !           525:        ID16(1700, 1276, BUS100),
        !           526:        ID16(1400, 1212, BUS100),
        !           527:        ID16(1200, 1148, BUS100),
        !           528:        ID16(1000, 1100, BUS100),
        !           529:        ID16( 800, 1052, BUS100),
        !           530:        ID16( 600,  988, BUS100),
        !           531: };
        !           532:
        !           533: /* Intel Pentium M processor 740 1.73 GHz, 533 MHz FSB */
        !           534: static const u_int16_t pm90_n740[] = {
        !           535:        ID16(1733, 1356, BUS133),
        !           536:        ID16(1333, 1212, BUS133),
        !           537:        ID16(1067, 1100, BUS133),
        !           538:        ID16( 800,  988, BUS133),
        !           539: };
        !           540:
        !           541: /* Intel Pentium M processor 745 1.8 GHz, VID #A */
        !           542: static const u_int16_t pm90_n745a[] = {
        !           543:        ID16(1800, 1340, BUS100),
        !           544:        ID16(1600, 1292, BUS100),
        !           545:        ID16(1400, 1228, BUS100),
        !           546:        ID16(1200, 1164, BUS100),
        !           547:        ID16(1000, 1116, BUS100),
        !           548:        ID16( 800, 1052, BUS100),
        !           549:        ID16( 600,  988, BUS100),
        !           550: };
        !           551:
        !           552: /* Intel Pentium M processor 745 1.8 GHz, VID #B */
        !           553: static const u_int16_t pm90_n745b[] = {
        !           554:        ID16(1800, 1324, BUS100),
        !           555:        ID16(1600, 1276, BUS100),
        !           556:        ID16(1400, 1212, BUS100),
        !           557:        ID16(1200, 1164, BUS100),
        !           558:        ID16(1000, 1116, BUS100),
        !           559:        ID16( 800, 1052, BUS100),
        !           560:        ID16( 600,  988, BUS100),
        !           561: };
        !           562:
        !           563: /* Intel Pentium M processor 745 1.8 GHz, VID #C */
        !           564: static const u_int16_t pm90_n745c[] = {
        !           565:        ID16(1800, 1308, BUS100),
        !           566:        ID16(1600, 1260, BUS100),
        !           567:        ID16(1400, 1212, BUS100),
        !           568:        ID16(1200, 1148, BUS100),
        !           569:        ID16(1000, 1100, BUS100),
        !           570:        ID16( 800, 1052, BUS100),
        !           571:        ID16( 600,  988, BUS100),
        !           572: };
        !           573:
        !           574: /* Intel Pentium M processor 745 1.8 GHz, VID #D */
        !           575: static const u_int16_t pm90_n745d[] = {
        !           576:        ID16(1800, 1276, BUS100),
        !           577:        ID16(1600, 1228, BUS100),
        !           578:        ID16(1400, 1180, BUS100),
        !           579:        ID16(1200, 1132, BUS100),
        !           580:        ID16(1000, 1084, BUS100),
        !           581:        ID16( 800, 1036, BUS100),
        !           582:        ID16( 600,  988, BUS100),
        !           583: };
        !           584:
        !           585: /* Intel Pentium M processor 750 1.86 GHz, 533 MHz FSB */
        !           586: /* values extracted from \_PR\NPSS (via _PSS) SDST ACPI table */
        !           587: static const u_int16_t pm90_n750[] = {
        !           588:        ID16(1867, 1308, BUS133),
        !           589:        ID16(1600, 1228, BUS133),
        !           590:        ID16(1333, 1148, BUS133),
        !           591:        ID16(1067, 1068, BUS133),
        !           592:        ID16( 800,  988, BUS133),
        !           593: };
        !           594:
        !           595: /* Intel Pentium M processor 755 2.0 GHz, VID #A */
        !           596: static const u_int16_t pm90_n755a[] = {
        !           597:        ID16(2000, 1340, BUS100),
        !           598:        ID16(1800, 1292, BUS100),
        !           599:        ID16(1600, 1244, BUS100),
        !           600:        ID16(1400, 1196, BUS100),
        !           601:        ID16(1200, 1148, BUS100),
        !           602:        ID16(1000, 1100, BUS100),
        !           603:        ID16( 800, 1052, BUS100),
        !           604:        ID16( 600,  988, BUS100),
        !           605: };
        !           606:
        !           607: /* Intel Pentium M processor 755 2.0 GHz, VID #B */
        !           608: static const u_int16_t pm90_n755b[] = {
        !           609:        ID16(2000, 1324, BUS100),
        !           610:        ID16(1800, 1276, BUS100),
        !           611:        ID16(1600, 1228, BUS100),
        !           612:        ID16(1400, 1180, BUS100),
        !           613:        ID16(1200, 1132, BUS100),
        !           614:        ID16(1000, 1084, BUS100),
        !           615:        ID16( 800, 1036, BUS100),
        !           616:        ID16( 600,  988, BUS100),
        !           617: };
        !           618:
        !           619: /* Intel Pentium M processor 755 2.0 GHz, VID #C */
        !           620: static const u_int16_t pm90_n755c[] = {
        !           621:        ID16(2000, 1308, BUS100),
        !           622:        ID16(1800, 1276, BUS100),
        !           623:        ID16(1600, 1228, BUS100),
        !           624:        ID16(1400, 1180, BUS100),
        !           625:        ID16(1200, 1132, BUS100),
        !           626:        ID16(1000, 1084, BUS100),
        !           627:        ID16( 800, 1036, BUS100),
        !           628:        ID16( 600,  988, BUS100),
        !           629: };
        !           630:
        !           631: /* Intel Pentium M processor 755 2.0 GHz, VID #D */
        !           632: static const u_int16_t pm90_n755d[] = {
        !           633:        ID16(2000, 1276, BUS100),
        !           634:        ID16(1800, 1244, BUS100),
        !           635:        ID16(1600, 1196, BUS100),
        !           636:        ID16(1400, 1164, BUS100),
        !           637:        ID16(1200, 1116, BUS100),
        !           638:        ID16(1000, 1084, BUS100),
        !           639:        ID16( 800, 1036, BUS100),
        !           640:        ID16( 600,  988, BUS100),
        !           641: };
        !           642:
        !           643: /* Intel Pentium M processor 760 2.0 GHz, 533 MHz FSB */
        !           644: static const u_int16_t pm90_n760[] = {
        !           645:        ID16(2000, 1356, BUS133),
        !           646:        ID16(1600, 1244, BUS133),
        !           647:        ID16(1333, 1164, BUS133),
        !           648:        ID16(1067, 1084, BUS133),
        !           649:        ID16( 800,  988, BUS133),
        !           650: };
        !           651:
        !           652: /* Intel Pentium M processor 765 2.1 GHz, VID #A */
        !           653: static const u_int16_t pm90_n765a[] = {
        !           654:        ID16(2100, 1340, BUS100),
        !           655:        ID16(1800, 1276, BUS100),
        !           656:        ID16(1600, 1228, BUS100),
        !           657:        ID16(1400, 1180, BUS100),
        !           658:        ID16(1200, 1132, BUS100),
        !           659:        ID16(1000, 1084, BUS100),
        !           660:        ID16( 800, 1036, BUS100),
        !           661:        ID16( 600,  988, BUS100),
        !           662: };
        !           663:
        !           664: /* Intel Pentium M processor 765 2.1 GHz, VID #B */
        !           665: static const u_int16_t pm90_n765b[] = {
        !           666:        ID16(2100, 1324, BUS100),
        !           667:        ID16(1800, 1260, BUS100),
        !           668:        ID16(1600, 1212, BUS100),
        !           669:        ID16(1400, 1180, BUS100),
        !           670:        ID16(1200, 1132, BUS100),
        !           671:        ID16(1000, 1084, BUS100),
        !           672:        ID16( 800, 1036, BUS100),
        !           673:        ID16( 600,  988, BUS100),
        !           674: };
        !           675:
        !           676: /* Intel Pentium M processor 765 2.1 GHz, VID #C */
        !           677: static const u_int16_t pm90_n765c[] = {
        !           678:        ID16(2100, 1308, BUS100),
        !           679:        ID16(1800, 1244, BUS100),
        !           680:        ID16(1600, 1212, BUS100),
        !           681:        ID16(1400, 1164, BUS100),
        !           682:        ID16(1200, 1116, BUS100),
        !           683:        ID16(1000, 1084, BUS100),
        !           684:        ID16( 800, 1036, BUS100),
        !           685:        ID16( 600,  988, BUS100),
        !           686: };
        !           687:
        !           688: /* Intel Pentium M processor 765 2.1 GHz, VID #E */
        !           689: static const u_int16_t pm90_n765e[] = {
        !           690:        ID16(2100, 1356, BUS100),
        !           691:        ID16(1800, 1292, BUS100),
        !           692:        ID16(1600, 1244, BUS100),
        !           693:        ID16(1400, 1196, BUS100),
        !           694:        ID16(1200, 1148, BUS100),
        !           695:        ID16(1000, 1100, BUS100),
        !           696:        ID16( 800, 1052, BUS100),
        !           697:        ID16( 600,  988, BUS100),
        !           698: };
        !           699:
        !           700: /* Intel Pentium M processor 770 2.13 GHz */
        !           701: static const u_int16_t pm90_n770[] = {
        !           702:        ID16(2133, 1356, BUS133),
        !           703:        ID16(1867, 1292, BUS133),
        !           704:        ID16(1600, 1212, BUS133),
        !           705:        ID16(1333, 1148, BUS133),
        !           706:        ID16(1067, 1068, BUS133),
        !           707:        ID16( 800,  988, BUS133),
        !           708: };
        !           709:
        !           710: /*
        !           711:  * VIA C7-M 500 MHz FSB, 400 MHz FSB, and ULV variants.
        !           712:  * Data from the "VIA C7-M Processor BIOS Writer's Guide (v2.17)" datasheet.
        !           713:  */
        !           714:
        !           715: /* 1.00GHz Centaur C7-M ULV */
        !           716: static const u_int16_t C7M_770_ULV[] = {
        !           717:        ID16(1000,  844, BUS100),
        !           718:        ID16( 800,  796, BUS100),
        !           719:        ID16( 600,  796, BUS100),
        !           720:        ID16( 400,  796, BUS100),
        !           721: };
        !           722:
        !           723: /* 1.00GHz Centaur C7-M ULV */
        !           724: static const u_int16_t C7M_779_ULV[] = {
        !           725:        ID16(1000,  796, BUS100),
        !           726:        ID16( 800,  796, BUS100),
        !           727:        ID16( 600,  796, BUS100),
        !           728:        ID16( 400,  796, BUS100),
        !           729: };
        !           730:
        !           731: /* 1.20GHz Centaur C7-M ULV */
        !           732: static const u_int16_t C7M_772_ULV[] = {
        !           733:        ID16(1200,  844, BUS100),
        !           734:        ID16(1000,  844, BUS100),
        !           735:        ID16( 800,  828, BUS100),
        !           736:        ID16( 600,  796, BUS100),
        !           737:        ID16( 400,  796, BUS100),
        !           738: };
        !           739:
        !           740: /* 1.50GHz Centaur C7-M ULV */
        !           741: static const u_int16_t C7M_775_ULV[] = {
        !           742:        ID16(1500,  956, BUS100),
        !           743:        ID16(1400,  940, BUS100),
        !           744:        ID16(1000,  860, BUS100),
        !           745:        ID16( 800,  828, BUS100),
        !           746:        ID16( 600,  796, BUS100),
        !           747:        ID16( 400,  796, BUS100),
        !           748: };
        !           749:
        !           750: /* 1.20GHz Centaur C7-M 400 MHz FSB */
        !           751: static const u_int16_t C7M_771[] = {
        !           752:        ID16(1200,  860, BUS100),
        !           753:        ID16(1000,  860, BUS100),
        !           754:        ID16( 800,  844, BUS100),
        !           755:        ID16( 600,  844, BUS100),
        !           756:        ID16( 400,  844, BUS100),
        !           757: };
        !           758:
        !           759: /* 1.50GHz Centaur C7-M 400 MHz FSB */
        !           760: static const u_int16_t C7M_754[] = {
        !           761:        ID16(1500, 1004, BUS100),
        !           762:        ID16(1400,  988, BUS100),
        !           763:        ID16(1000,  940, BUS100),
        !           764:        ID16( 800,  844, BUS100),
        !           765:        ID16( 600,  844, BUS100),
        !           766:        ID16( 400,  844, BUS100),
        !           767: };
        !           768:
        !           769: /* 1.60GHz Centaur C7-M 400 MHz FSB */
        !           770: static const u_int16_t C7M_764[] = {
        !           771:        ID16(1600, 1084, BUS100),
        !           772:        ID16(1400, 1052, BUS100),
        !           773:        ID16(1000, 1004, BUS100),
        !           774:        ID16( 800,  844, BUS100),
        !           775:        ID16( 600,  844, BUS100),
        !           776:        ID16( 400,  844, BUS100),
        !           777: };
        !           778:
        !           779: /* 1.80GHz Centaur C7-M 400 MHz FSB */
        !           780: static const u_int16_t C7M_784[] = {
        !           781:        ID16(1800, 1148, BUS100),
        !           782:        ID16(1600, 1100, BUS100),
        !           783:        ID16(1400, 1052, BUS100),
        !           784:        ID16(1000, 1004, BUS100),
        !           785:        ID16( 800,  844, BUS100),
        !           786:        ID16( 600,  844, BUS100),
        !           787:        ID16( 400,  844, BUS100),
        !           788: };
        !           789:
        !           790: /* 2.00GHz Centaur C7-M 400 MHz FSB */
        !           791: static const u_int16_t C7M_794[] = {
        !           792:        ID16(2000, 1148, BUS100),
        !           793:        ID16(1800, 1132, BUS100),
        !           794:        ID16(1600, 1100, BUS100),
        !           795:        ID16(1400, 1052, BUS100),
        !           796:        ID16(1000, 1004, BUS100),
        !           797:        ID16( 800,  844, BUS100),
        !           798:        ID16( 600,  844, BUS100),
        !           799:        ID16( 400,  844, BUS100),
        !           800: };
        !           801:
        !           802: /* 1.60GHz Centaur C7-M 533 MHz FSB */
        !           803: static const u_int16_t C7M_765[] = {
        !           804:        ID16(1600, 1084, BUS133),
        !           805:        ID16(1467, 1052, BUS133),
        !           806:        ID16(1200, 1004, BUS133),
        !           807:        ID16( 800,  844, BUS133),
        !           808:        ID16( 667,  844, BUS133),
        !           809:        ID16( 533,  844, BUS133),
        !           810: };
        !           811:
        !           812: /* 2.00GHz Centaur C7-M 533 MHz FSB */
        !           813: static const u_int16_t C7M_785[] = {
        !           814:        ID16(1867, 1148, BUS133),
        !           815:        ID16(1600, 1100, BUS133),
        !           816:        ID16(1467, 1052, BUS133),
        !           817:        ID16(1200, 1004, BUS133),
        !           818:        ID16( 800,  844, BUS133),
        !           819:        ID16( 667,  844, BUS133),
        !           820:        ID16( 533,  844, BUS133),
        !           821: };
        !           822:
        !           823: /* 2.00GHz Centaur C7-M 533 MHz FSB */
        !           824: static const u_int16_t C7M_795[] = {
        !           825:        ID16(2000, 1148, BUS133),
        !           826:        ID16(1867, 1132, BUS133),
        !           827:        ID16(1600, 1100, BUS133),
        !           828:        ID16(1467, 1052, BUS133),
        !           829:        ID16(1200, 1004, BUS133),
        !           830:        ID16( 800,  844, BUS133),
        !           831:        ID16( 667,  844, BUS133),
        !           832:        ID16( 533,  844, BUS133),
        !           833: };
        !           834:
        !           835: /* 1.00GHz VIA Eden 90nm 'Esther' */
        !           836: static const u_int16_t eden90_1000[] = {
        !           837:        ID16(1000,  844, BUS100),
        !           838:        ID16( 800,  844, BUS100),
        !           839:        ID16( 600,  844, BUS100),
        !           840:        ID16( 400,  844, BUS100),
        !           841: };
        !           842:
        !           843: struct fqlist {
        !           844:        int vendor : 5;
        !           845:        unsigned bus_clk : 1;
        !           846:        unsigned n : 5;
        !           847:        const u_int16_t *table;
        !           848: };
        !           849:
        !           850: #define NELEM(x) (sizeof(x) / sizeof((x)[0]))
        !           851:
        !           852: #define ENTRY(ven, bus_clk, tab) \
        !           853:        { CPUVENDOR_##ven, bus_clk == BUS133 ? 1 : 0, NELEM(tab), tab }
        !           854:
        !           855: #define BUS_CLK(fqp) ((fqp)->bus_clk ? BUS133 : BUS100)
        !           856:
        !           857: static const struct fqlist est_cpus[] = {
        !           858:        ENTRY(INTEL, BUS100, pm130_900_ulv),
        !           859:        ENTRY(INTEL, BUS100, pm130_1000_ulv),
        !           860:        ENTRY(INTEL, BUS100, pm130_1100_ulv),
        !           861:        ENTRY(INTEL, BUS100, pm130_1100_lv),
        !           862:        ENTRY(INTEL, BUS100, pm130_1200_lv),
        !           863:        ENTRY(INTEL, BUS100, pm130_1300_lv),
        !           864:        ENTRY(INTEL, BUS100, pm130_1300),
        !           865:        ENTRY(INTEL, BUS100, pm130_1400),
        !           866:        ENTRY(INTEL, BUS100, pm130_1500),
        !           867:        ENTRY(INTEL, BUS100, pm130_1600),
        !           868:        ENTRY(INTEL, BUS100, pm130_1700),
        !           869:
        !           870:        ENTRY(INTEL, BUS100, pm90_n723),
        !           871:        ENTRY(INTEL, BUS100, pm90_n733g),
        !           872:        ENTRY(INTEL, BUS100, pm90_n733h),
        !           873:        ENTRY(INTEL, BUS100, pm90_n733i),
        !           874:        ENTRY(INTEL, BUS100, pm90_n733j),
        !           875:        ENTRY(INTEL, BUS100, pm90_n733k),
        !           876:        ENTRY(INTEL, BUS100, pm90_n733l),
        !           877:        ENTRY(INTEL, BUS100, pm90_n753g),
        !           878:        ENTRY(INTEL, BUS100, pm90_n753h),
        !           879:        ENTRY(INTEL, BUS100, pm90_n753i),
        !           880:        ENTRY(INTEL, BUS100, pm90_n753j),
        !           881:        ENTRY(INTEL, BUS100, pm90_n753k),
        !           882:        ENTRY(INTEL, BUS100, pm90_n753l),
        !           883:        ENTRY(INTEL, BUS100, pm90_n773g),
        !           884:        ENTRY(INTEL, BUS100, pm90_n773h),
        !           885:        ENTRY(INTEL, BUS100, pm90_n773i),
        !           886:        ENTRY(INTEL, BUS100, pm90_n773j),
        !           887:        ENTRY(INTEL, BUS100, pm90_n773k),
        !           888:        ENTRY(INTEL, BUS100, pm90_n773l),
        !           889:        ENTRY(INTEL, BUS100, pm90_n738),
        !           890:        ENTRY(INTEL, BUS100, pm90_n758),
        !           891:        ENTRY(INTEL, BUS100, pm90_n778),
        !           892:
        !           893:        ENTRY(INTEL, BUS133, pm90_n710),
        !           894:        ENTRY(INTEL, BUS100, pm90_n715a),
        !           895:        ENTRY(INTEL, BUS100, pm90_n715b),
        !           896:        ENTRY(INTEL, BUS100, pm90_n715c),
        !           897:        ENTRY(INTEL, BUS100, pm90_n715d),
        !           898:        ENTRY(INTEL, BUS100, pm90_n725a),
        !           899:        ENTRY(INTEL, BUS100, pm90_n725b),
        !           900:        ENTRY(INTEL, BUS100, pm90_n725c),
        !           901:        ENTRY(INTEL, BUS100, pm90_n725d),
        !           902:        ENTRY(INTEL, BUS133, pm90_n730),
        !           903:        ENTRY(INTEL, BUS100, pm90_n735a),
        !           904:        ENTRY(INTEL, BUS100, pm90_n735b),
        !           905:        ENTRY(INTEL, BUS100, pm90_n735c),
        !           906:        ENTRY(INTEL, BUS100, pm90_n735d),
        !           907:        ENTRY(INTEL, BUS133, pm90_n740),
        !           908:        ENTRY(INTEL, BUS100, pm90_n745a),
        !           909:        ENTRY(INTEL, BUS100, pm90_n745b),
        !           910:        ENTRY(INTEL, BUS100, pm90_n745c),
        !           911:        ENTRY(INTEL, BUS100, pm90_n745d),
        !           912:        ENTRY(INTEL, BUS133, pm90_n750),
        !           913:        ENTRY(INTEL, BUS100, pm90_n755a),
        !           914:        ENTRY(INTEL, BUS100, pm90_n755b),
        !           915:        ENTRY(INTEL, BUS100, pm90_n755c),
        !           916:        ENTRY(INTEL, BUS100, pm90_n755d),
        !           917:        ENTRY(INTEL, BUS133, pm90_n760),
        !           918:        ENTRY(INTEL, BUS100, pm90_n765a),
        !           919:        ENTRY(INTEL, BUS100, pm90_n765b),
        !           920:        ENTRY(INTEL, BUS100, pm90_n765c),
        !           921:        ENTRY(INTEL, BUS100, pm90_n765e),
        !           922:        ENTRY(INTEL, BUS133, pm90_n770),
        !           923:
        !           924:        ENTRY(VIA,   BUS100, C7M_770_ULV),
        !           925:        ENTRY(VIA,   BUS100, C7M_779_ULV),
        !           926:        ENTRY(VIA,   BUS100, C7M_772_ULV),
        !           927:        ENTRY(VIA,   BUS100, C7M_771),
        !           928:        ENTRY(VIA,   BUS100, C7M_775_ULV),
        !           929:        ENTRY(VIA,   BUS100, C7M_754),
        !           930:        ENTRY(VIA,   BUS100, C7M_764),
        !           931:        ENTRY(VIA,   BUS133, C7M_765),
        !           932:        ENTRY(VIA,   BUS100, C7M_784),
        !           933:        ENTRY(VIA,   BUS133, C7M_785),
        !           934:        ENTRY(VIA,   BUS100, C7M_794),
        !           935:        ENTRY(VIA,   BUS133, C7M_795),
        !           936:
        !           937:        ENTRY(VIA,   BUS100, eden90_1000),
        !           938: };
        !           939:
        !           940:
        !           941: #define MSR2MHZ(msr, bus) \
        !           942:        (((((int) (msr) >> 8) & 0xff) * (bus) + 50) / 100)
        !           943: #define MSR2MV(msr) \
        !           944:        (((int) (msr) & 0xff) * 16 + 700)
        !           945:
        !           946: static const struct fqlist *est_fqlist;
        !           947:
        !           948: static u_int16_t fake_table[3];
        !           949: static struct fqlist fake_fqlist;
        !           950:
        !           951: extern int setperf_prio;
        !           952: extern int perflevel;
        !           953:
        !           954: void
        !           955: est_init(const char *cpu_device, int vendor)
        !           956: {
        !           957:        int i, mhz, mv, low, high;
        !           958:        u_int64_t msr;
        !           959:        u_int16_t idhi, idlo, cur;
        !           960:        u_int8_t crhi, crlo, crcur;
        !           961:        const struct fqlist *fql;
        !           962:
        !           963:        if (setperf_prio > 3)
        !           964:                return;
        !           965:
        !           966:        if ((cpu_ecxfeature & CPUIDECX_EST) == 0)
        !           967:                return;
        !           968:
        !           969:        if (bus_clock == 0) {
        !           970:                printf("%s: EST: unknown system bus clock\n", cpu_device);
        !           971:                return;
        !           972:        }
        !           973:
        !           974:        msr = rdmsr(MSR_PERF_STATUS);
        !           975:        idhi = (msr >> 32) & 0xffff;
        !           976:        idlo = (msr >> 48) & 0xffff;
        !           977:        cur = msr & 0xffff;
        !           978:        crhi = (idhi  >> 8) & 0xff;
        !           979:        crlo = (idlo  >> 8) & 0xff;
        !           980:        crcur = (cur >> 8) & 0xff;
        !           981:        if (crlo == 0 || crhi == crlo) {
        !           982:                /*
        !           983:                 * Don't complain about these cases, and silently disable EST:
        !           984:                 * - A lowest clock ratio of 0, which seems to happen on all
        !           985:                 *   Pentium 4's that report EST.
        !           986:                 * - An equal highest and lowest clock ratio, which happens on
        !           987:                 *   at least the Core 2 Duo X6800, maybe on newer models too.
        !           988:                 */
        !           989:                return;
        !           990:        }
        !           991:        if (crhi == 0 || crcur == 0 || crlo > crhi ||
        !           992:            crcur < crlo || crcur > crhi) {
        !           993:                /*
        !           994:                 * Do complain about other weirdness, because we first want to
        !           995:                 * know about it, before we decide what to do with it.
        !           996:                 */
        !           997:                printf("%s: EST: strange msr value 0x%016llx\n",
        !           998:                    cpu_device, msr);
        !           999:                return;
        !          1000:        }
        !          1001:        /*
        !          1002:         * Find an entry which matches (vendor, bus_clock, idhi, idlo)
        !          1003:         */
        !          1004:        for (i = 0; i < NELEM(est_cpus); i++) {
        !          1005:                fql = &est_cpus[i];
        !          1006:                if (vendor == fql->vendor && bus_clock == BUS_CLK(fql) &&
        !          1007:                    idhi == fql->table[0] && idlo == fql->table[fql->n - 1]) {
        !          1008:                        est_fqlist = fql;
        !          1009:                        break;
        !          1010:                }
        !          1011:        }
        !          1012:        if (est_fqlist == NULL) {
        !          1013:                printf("%s: unknown Enhanced SpeedStep CPU, msr 0x%016llx\n",
        !          1014:                    cpu_device, msr);
        !          1015:
        !          1016:                /*
        !          1017:                 * Generate a fake table with the power states we know.
        !          1018:                 */
        !          1019:                fake_table[0] = idhi;
        !          1020:                if (cur == idhi || cur == idlo) {
        !          1021:                        printf("%s: using only highest and lowest power "
        !          1022:                            "states\n", cpu_device);
        !          1023:
        !          1024:                        fake_table[1] = idlo;
        !          1025:                        fake_fqlist.n = 2;
        !          1026:                } else {
        !          1027:                        printf("%s: using only highest, current and lowest "
        !          1028:                            "power states\n", cpu_device);
        !          1029:
        !          1030:                        fake_table[1] = cur;
        !          1031:                        fake_table[2] = idlo;
        !          1032:                        fake_fqlist.n = 3;
        !          1033:                }
        !          1034:                fake_fqlist.vendor = vendor;
        !          1035:                fake_fqlist.table = fake_table;
        !          1036:                est_fqlist = &fake_fqlist;
        !          1037:        }
        !          1038:
        !          1039:        mhz = MSR2MHZ(cur, bus_clock);
        !          1040:        mv = MSR2MV(cur);
        !          1041:        printf("%s: Enhanced SpeedStep %d MHz (%d mV)", cpu_device, mhz, mv);
        !          1042:
        !          1043:        /*
        !          1044:         * Check that the current operating point is in our list.
        !          1045:         */
        !          1046:        for (i = est_fqlist->n - 1; i >= 0; i--) {
        !          1047:                if (cur == est_fqlist->table[i])
        !          1048:                        break;
        !          1049:        }
        !          1050:        if (i < 0) {
        !          1051:                printf(" (not in table, msr 0x%016llx)\n", msr);
        !          1052:                return;
        !          1053:        }
        !          1054:        low = MSR2MHZ(est_fqlist->table[est_fqlist->n - 1], bus_clock);
        !          1055:        high = MSR2MHZ(est_fqlist->table[0], bus_clock);
        !          1056:        perflevel = (mhz - low) * 100 / (high - low);
        !          1057:
        !          1058:        /*
        !          1059:         * OK, tell the user the available frequencies.
        !          1060:         */
        !          1061:        printf(": speeds: ");
        !          1062:        for (i = 0; i < est_fqlist->n; i++)
        !          1063:                printf("%d%s", MSR2MHZ(est_fqlist->table[i], bus_clock),
        !          1064:                    i < est_fqlist->n - 1 ? ", " : " MHz\n");
        !          1065:
        !          1066:        cpu_setperf = est_setperf;
        !          1067:        setperf_prio = 3;
        !          1068: }
        !          1069:
        !          1070: void
        !          1071: est_setperf(int level)
        !          1072: {
        !          1073:        int i;
        !          1074:        uint64_t msr;
        !          1075:
        !          1076:        if (est_fqlist == NULL)
        !          1077:                return;
        !          1078:
        !          1079:        i = ((level * est_fqlist->n) + 1) / 101;
        !          1080:        if (i >= est_fqlist->n)
        !          1081:                i = est_fqlist->n - 1;
        !          1082:        i = est_fqlist->n - 1 - i;
        !          1083:
        !          1084:        msr = rdmsr(MSR_PERF_CTL);
        !          1085:        msr &= ~0xffffULL;
        !          1086:        msr |= est_fqlist->table[i];
        !          1087:        wrmsr(MSR_PERF_CTL, msr);
        !          1088:        cpuspeed = MSR2MHZ(est_fqlist->table[i], bus_clock);
        !          1089: }

CVSweb