summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorDimitry Andric <dim@cvs.openbsd.org>2006-05-19 19:43:42 +0000
committerDimitry Andric <dim@cvs.openbsd.org>2006-05-19 19:43:42 +0000
commit3e51a11d950e38614a87079be7136f45b7c65d21 (patch)
treeebcddf0a8e948770a21394272b27b7c3c195859c /sys
parent439f511d167e44582850d991636b880b03a8d02d (diff)
Reimplement the Enhanced SpeedStep CPU detection by using the
quintuplet { vendor, MHz_hi, mV_hi, MHz_lo, mV_lo }, which works much better than parsing the branding string. It also makes it easier to add new models later. Shouldn't break any CPU's which previously worked okay with EST; if there's any trouble, please let me know! Also adds quite a number of VIA C7-M models, and a few more Pentium M models, all from FreeBSD. "go for it" deraadt@
Diffstat (limited to 'sys')
-rw-r--r--sys/arch/i386/i386/est.c752
-rw-r--r--sys/arch/i386/i386/machdep.c6
-rw-r--r--sys/arch/i386/include/cpu.h4
3 files changed, 639 insertions, 123 deletions
diff --git a/sys/arch/i386/i386/est.c b/sys/arch/i386/i386/est.c
index b84cfb0b427..fe1d92bb758 100644
--- a/sys/arch/i386/i386/est.c
+++ b/sys/arch/i386/i386/est.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: est.c,v 1.14 2006/05/11 13:21:11 mickey Exp $ */
+/* $OpenBSD: est.c,v 1.15 2006/05/19 19:43:41 dim Exp $ */
/*
* Copyright (c) 2003 Michael Eriksson.
* All rights reserved.
@@ -68,22 +68,31 @@ struct fq_info {
};
/* Ultra Low Voltage Intel Pentium M processor 900 MHz */
-static const struct fq_info pentium_m_900[] = {
+static const struct fq_info pm130_900_ulv[] = {
{ 900, 1004 },
{ 800, 988 },
{ 600, 844 },
};
/* Ultra Low Voltage Intel Pentium M processor 1.00 GHz */
-static const struct fq_info pentium_m_1000[] = {
+static const struct fq_info pm130_1000_ulv[] = {
{ 1000, 1004 },
{ 900, 988 },
{ 800, 972 },
{ 600, 844 },
};
+/* Ultra Low Voltage Intel Pentium M processor 1.10 GHz */
+static const struct fq_info pm130_1100_ulv[] = {
+ { 1100, 1004 },
+ { 1000, 988 },
+ { 900, 972 },
+ { 800, 956 },
+ { 600, 844 },
+};
+
/* Low Voltage Intel Pentium M processor 1.10 GHz */
-static const struct fq_info pentium_m_1100[] = {
+static const struct fq_info pm130_1100_lv[] = {
{ 1100, 1180 },
{ 1000, 1164 },
{ 900, 1100 },
@@ -92,7 +101,7 @@ static const struct fq_info pentium_m_1100[] = {
};
/* Low Voltage Intel Pentium M processor 1.20 GHz */
-static const struct fq_info pentium_m_1200[] = {
+static const struct fq_info pm130_1200_lv[] = {
{ 1200, 1180 },
{ 1100, 1164 },
{ 1000, 1100 },
@@ -101,8 +110,19 @@ static const struct fq_info pentium_m_1200[] = {
{ 600, 956 },
};
+/* Low Voltage Intel Pentium M processor 1.30 GHz */
+static const struct fq_info pm130_1300_lv[] = {
+ { 1300, 1180 },
+ { 1200, 1164 },
+ { 1100, 1100 },
+ { 1000, 1020 },
+ { 900, 1004 },
+ { 800, 988 },
+ { 600, 956 },
+};
+
/* Intel Pentium M processor 1.30 GHz */
-static const struct fq_info pentium_m_1300[] = {
+static const struct fq_info pm130_1300[] = {
{ 1300, 1388 },
{ 1200, 1356 },
{ 1000, 1292 },
@@ -111,7 +131,7 @@ static const struct fq_info pentium_m_1300[] = {
};
/* Intel Pentium M processor 1.40 GHz */
-static const struct fq_info pentium_m_1400[] = {
+static const struct fq_info pm130_1400[] = {
{ 1400, 1484 },
{ 1200, 1436 },
{ 1000, 1308 },
@@ -120,7 +140,7 @@ static const struct fq_info pentium_m_1400[] = {
};
/* Intel Pentium M processor 1.50 GHz */
-static const struct fq_info pentium_m_1500[] = {
+static const struct fq_info pm130_1500[] = {
{ 1500, 1484 },
{ 1400, 1452 },
{ 1200, 1356 },
@@ -130,7 +150,7 @@ static const struct fq_info pentium_m_1500[] = {
};
/* Intel Pentium M processor 1.60 GHz */
-static const struct fq_info pentium_m_1600[] = {
+static const struct fq_info pm130_1600[] = {
{ 1600, 1484 },
{ 1400, 1420 },
{ 1200, 1276 },
@@ -140,7 +160,7 @@ static const struct fq_info pentium_m_1600[] = {
};
/* Intel Pentium M processor 1.70 GHz */
-static const struct fq_info pentium_m_1700[] = {
+static const struct fq_info pm130_1700[] = {
{ 1700, 1484 },
{ 1400, 1308 },
{ 1200, 1228 },
@@ -150,7 +170,7 @@ static const struct fq_info pentium_m_1700[] = {
};
/* Intel Pentium M processor 723 1.0 GHz */
-static const struct fq_info pentium_m_n723[] = {
+static const struct fq_info pm90_n723[] = {
{ 1000, 940 },
{ 900, 908 },
{ 800, 876 },
@@ -158,7 +178,25 @@ static const struct fq_info pentium_m_n723[] = {
};
/* Intel Pentium M processor 733 1.1 GHz */
-static const struct fq_info pentium_m_n733[] = {
+static const struct fq_info pm90_n733[] = {
+ { 1100, 940 },
+ { 1000, 924 },
+ { 900, 892 },
+ { 800, 876 },
+ { 600, 812 }
+};
+
+/* Intel Pentium M processor 733 1.1 GHz, VID #G */
+static const struct fq_info pm90_n733g[] = {
+ { 1100, 956 },
+ { 1000, 940 },
+ { 900, 908 },
+ { 800, 876 },
+ { 600, 812 }
+};
+
+/* Intel Pentium M processor 733 1.1 GHz, VID #H */
+static const struct fq_info pm90_n733h[] = {
{ 1100, 940 },
{ 1000, 924 },
{ 900, 892 },
@@ -166,8 +204,54 @@ static const struct fq_info pentium_m_n733[] = {
{ 600, 812 }
};
-/* Intel Pentium M processor 753 1.2 GHz */
-static const struct fq_info pentium_m_n753[] = {
+/* Intel Pentium M processor 733 1.1 GHz, VID #I */
+static const struct fq_info pm90_n733i[] = {
+ { 1100, 924 },
+ { 1000, 908 },
+ { 900, 892 },
+ { 800, 860 },
+ { 600, 812 }
+};
+
+/* Intel Pentium M processor 733 1.1 GHz, VID #J */
+static const struct fq_info pm90_n733j[] = {
+ { 1100, 908 },
+ { 1000, 892 },
+ { 900, 876 },
+ { 800, 860 },
+ { 600, 812 }
+};
+
+/* Intel Pentium M processor 733 1.1 GHz, VID #K */
+static const struct fq_info pm90_n733k[] = {
+ { 1100, 892 },
+ { 1000, 876 },
+ { 900, 860 },
+ { 800, 844 },
+ { 600, 812 }
+};
+
+/* Intel Pentium M processor 733 1.1 GHz, VID #L */
+static const struct fq_info pm90_n733l[] = {
+ { 1100, 876 },
+ { 1000, 876 },
+ { 900, 860 },
+ { 800, 844 },
+ { 600, 812 }
+};
+
+/* Intel Pentium M processor 753 1.2 GHz, VID #G */
+static const struct fq_info pm90_n753g[] = {
+ { 1200, 956 },
+ { 1100, 940 },
+ { 1000, 908 },
+ { 900, 892 },
+ { 800, 860 },
+ { 600, 812 }
+};
+
+/* Intel Pentium M processor 753 1.2 GHz, VID #H */
+static const struct fq_info pm90_n753h[] = {
{ 1200, 940 },
{ 1100, 924 },
{ 1000, 908 },
@@ -176,8 +260,59 @@ static const struct fq_info pentium_m_n753[] = {
{ 600, 812 }
};
-/* Intel Pentium M processor 773 1.3 GHz */
-static const struct fq_info pentium_m_n773[] = {
+/* Intel Pentium M processor 753 1.2 GHz, VID #I */
+static const struct fq_info pm90_n753i[] = {
+ { 1200, 924 },
+ { 1100, 908 },
+ { 1000, 892 },
+ { 900, 876 },
+ { 800, 860 },
+ { 600, 812 }
+};
+
+/* Intel Pentium M processor 753 1.2 GHz, VID #J */
+static const struct fq_info pm90_n753j[] = {
+ { 1200, 908 },
+ { 1100, 892 },
+ { 1000, 876 },
+ { 900, 860 },
+ { 800, 844 },
+ { 600, 812 }
+};
+
+/* Intel Pentium M processor 753 1.2 GHz, VID #K */
+static const struct fq_info pm90_n753k[] = {
+ { 1200, 892 },
+ { 1100, 892 },
+ { 1000, 876 },
+ { 900, 860 },
+ { 800, 844 },
+ { 600, 812 }
+};
+
+/* Intel Pentium M processor 753 1.2 GHz, VID #L */
+static const struct fq_info pm90_n753l[] = {
+ { 1200, 876 },
+ { 1100, 876 },
+ { 1000, 860 },
+ { 900, 844 },
+ { 800, 844 },
+ { 600, 812 }
+};
+
+/* Intel Pentium M processor 773 1.3 GHz, VID #G */
+static const struct fq_info pm90_n773g[] = {
+ { 1300, 956 },
+ { 1200, 940 },
+ { 1100, 924 },
+ { 1000, 908 },
+ { 900, 876 },
+ { 800, 860 },
+ { 600, 812 }
+};
+
+/* Intel Pentium M processor 773 1.3 GHz, VID #H */
+static const struct fq_info pm90_n773h[] = {
{ 1300, 940 },
{ 1200, 924 },
{ 1100, 908 },
@@ -187,8 +322,52 @@ static const struct fq_info pentium_m_n773[] = {
{ 600, 812 }
};
+/* Intel Pentium M processor 773 1.3 GHz, VID #I */
+static const struct fq_info pm90_n773i[] = {
+ { 1300, 924 },
+ { 1200, 908 },
+ { 1100, 892 },
+ { 1000, 876 },
+ { 900, 860 },
+ { 800, 844 },
+ { 600, 812 }
+};
+
+/* Intel Pentium M processor 773 1.3 GHz, VID #J */
+static const struct fq_info pm90_n773j[] = {
+ { 1300, 908 },
+ { 1200, 908 },
+ { 1100, 892 },
+ { 1000, 876 },
+ { 900, 860 },
+ { 800, 844 },
+ { 600, 812 }
+};
+
+/* Intel Pentium M processor 773 1.3 GHz, VID #K */
+static const struct fq_info pm90_n773k[] = {
+ { 1300, 892 },
+ { 1200, 892 },
+ { 1100, 876 },
+ { 1000, 860 },
+ { 900, 860 },
+ { 800, 844 },
+ { 600, 812 }
+};
+
+/* Intel Pentium M processor 773 1.3 GHz, VID #L */
+static const struct fq_info pm90_n773l[] = {
+ { 1300, 876 },
+ { 1200, 876 },
+ { 1100, 860 },
+ { 1000, 860 },
+ { 900, 844 },
+ { 800, 844 },
+ { 600, 812 }
+};
+
/* Intel Pentium M processor 738 1.4 GHz */
-static const struct fq_info pentium_m_n738[] = {
+static const struct fq_info pm90_n738[] = {
{ 1400, 1116 },
{ 1300, 1116 },
{ 1200, 1100 },
@@ -200,7 +379,7 @@ static const struct fq_info pentium_m_n738[] = {
};
/* Intel Pentium M processor 758 1.5 GHz */
-static const struct fq_info pentium_m_n758[] = {
+static const struct fq_info pm90_n758[] = {
{ 1500, 1116 },
{ 1400, 1116 },
{ 1300, 1100 },
@@ -213,7 +392,7 @@ static const struct fq_info pentium_m_n758[] = {
};
/* Intel Pentium M processor 778 1.6 GHz */
-static const struct fq_info pentium_m_n778[] = {
+static const struct fq_info pm90_n778[] = {
{ 1600, 1116 },
{ 1500, 1116 },
{ 1400, 1100 },
@@ -226,8 +405,8 @@ static const struct fq_info pentium_m_n778[] = {
{ 600, 988 }
};
-/* Intel Pentium M processor 715 1.5 GHz */
-static const struct fq_info pentium_m_n715[] = {
+/* Intel Pentium M processor 715 1.5 GHz, VID #A */
+static const struct fq_info pm90_n715a[] = {
{ 1500, 1340 },
{ 1200, 1228 },
{ 1000, 1148 },
@@ -235,8 +414,35 @@ static const struct fq_info pentium_m_n715[] = {
{ 600, 988 }
};
-/* Intel Pentium M processor 725 1.6 GHz */
-static const struct fq_info pentium_m_n725[] = {
+/* Intel Pentium M processor 715 1.5 GHz, VID #B */
+static const struct fq_info pm90_n715b[] = {
+ { 1500, 1324 },
+ { 1200, 1212 },
+ { 1000, 1148 },
+ { 800, 1068 },
+ { 600, 988 }
+};
+
+/* Intel Pentium M processor 715 1.5 GHz, VID #C */
+static const struct fq_info pm90_n715c[] = {
+ { 1500, 1308 },
+ { 1200, 1212 },
+ { 1000, 1132 },
+ { 800, 1068 },
+ { 600, 988 }
+};
+
+/* Intel Pentium M processor 715 1.5 GHz, VID #D */
+static const struct fq_info pm90_n715d[] = {
+ { 1500, 1276 },
+ { 1200, 1180 },
+ { 1000, 1116 },
+ { 800, 1052 },
+ { 600, 988 }
+};
+
+/* Intel Pentium M processor 725 1.6 GHz, VID #A */
+static const struct fq_info pm90_n725a[] = {
{ 1600, 1340 },
{ 1400, 1276 },
{ 1200, 1212 },
@@ -245,8 +451,38 @@ static const struct fq_info pentium_m_n725[] = {
{ 600, 988 }
};
-/* Intel Pentium M processor 735 1.7 GHz */
-static const struct fq_info pentium_m_n735[] = {
+/* Intel Pentium M processor 725 1.6 GHz, VID #B */
+static const struct fq_info pm90_n725b[] = {
+ { 1600, 1324 },
+ { 1400, 1260 },
+ { 1200, 1196 },
+ { 1000, 1132 },
+ { 800, 1068 },
+ { 600, 988 }
+};
+
+/* Intel Pentium M processor 725 1.6 GHz, VID #C */
+static const struct fq_info pm90_n725c[] = {
+ { 1600, 1308 },
+ { 1400, 1244 },
+ { 1200, 1180 },
+ { 1000, 1116 },
+ { 800, 1052 },
+ { 600, 988 }
+};
+
+/* Intel Pentium M processor 725 1.6 GHz, VID #D */
+static const struct fq_info pm90_n725d[] = {
+ { 1600, 1276 },
+ { 1400, 1228 },
+ { 1200, 1164 },
+ { 1000, 1116 },
+ { 800, 1052 },
+ { 600, 988 }
+};
+
+/* Intel Pentium M processor 735 1.7 GHz, VID #A */
+static const struct fq_info pm90_n735a[] = {
{ 1700, 1340 },
{ 1400, 1244 },
{ 1200, 1180 },
@@ -255,8 +491,38 @@ static const struct fq_info pentium_m_n735[] = {
{ 600, 988 }
};
-/* Intel Pentium M processor 745 1.8 GHz */
-static const struct fq_info pentium_m_n745[] = {
+/* Intel Pentium M processor 735 1.7 GHz, VID #B */
+static const struct fq_info pm90_n735b[] = {
+ { 1700, 1324 },
+ { 1400, 1244 },
+ { 1200, 1180 },
+ { 1000, 1116 },
+ { 800, 1052 },
+ { 600, 988 }
+};
+
+/* Intel Pentium M processor 735 1.7 GHz, VID #C */
+static const struct fq_info pm90_n735c[] = {
+ { 1700, 1308 },
+ { 1400, 1228 },
+ { 1200, 1164 },
+ { 1000, 1116 },
+ { 800, 1052 },
+ { 600, 988 }
+};
+
+/* Intel Pentium M processor 735 1.7 GHz, VID #D */
+static const struct fq_info pm90_n735d[] = {
+ { 1700, 1276 },
+ { 1400, 1212 },
+ { 1200, 1148 },
+ { 1000, 1100 },
+ { 800, 1052 },
+ { 600, 988 }
+};
+
+/* Intel Pentium M processor 745 1.8 GHz, VID #A */
+static const struct fq_info pm90_n745a[] = {
{ 1800, 1340 },
{ 1600, 1292 },
{ 1400, 1228 },
@@ -266,8 +532,41 @@ static const struct fq_info pentium_m_n745[] = {
{ 600, 988 }
};
-/* Intel Pentium M processor 755 2.0 GHz */
-static const struct fq_info pentium_m_n755[] = {
+/* Intel Pentium M processor 745 1.8 GHz, VID #B */
+static const struct fq_info pm90_n745b[] = {
+ { 1800, 1324 },
+ { 1600, 1276 },
+ { 1400, 1212 },
+ { 1200, 1164 },
+ { 1000, 1116 },
+ { 800, 1052 },
+ { 600, 988 }
+};
+
+/* Intel Pentium M processor 745 1.8 GHz, VID #C */
+static const struct fq_info pm90_n745c[] = {
+ { 1800, 1308 },
+ { 1600, 1260 },
+ { 1400, 1212 },
+ { 1200, 1148 },
+ { 1000, 1100 },
+ { 800, 1052 },
+ { 600, 988 }
+};
+
+/* Intel Pentium M processor 745 1.8 GHz, VID #D */
+static const struct fq_info pm90_n745d[] = {
+ { 1800, 1276 },
+ { 1600, 1228 },
+ { 1400, 1180 },
+ { 1200, 1132 },
+ { 1000, 1084 },
+ { 800, 1036 },
+ { 600, 988 }
+};
+
+/* Intel Pentium M processor 755 2.0 GHz, VID #A */
+static const struct fq_info pm90_n755a[] = {
{ 2000, 1340 },
{ 1800, 1292 },
{ 1600, 1244 },
@@ -278,8 +577,44 @@ static const struct fq_info pentium_m_n755[] = {
{ 600, 988 }
};
-/* Intel Pentium M processor 765 2.1 GHz */
-static const struct fq_info pentium_m_n765[] = {
+/* Intel Pentium M processor 755 2.0 GHz, VID #B */
+static const struct fq_info pm90_n755b[] = {
+ { 2000, 1324 },
+ { 1800, 1276 },
+ { 1600, 1228 },
+ { 1400, 1180 },
+ { 1200, 1132 },
+ { 1000, 1084 },
+ { 800, 1036 },
+ { 600, 988 }
+};
+
+/* Intel Pentium M processor 755 2.0 GHz, VID #C */
+static const struct fq_info pm90_n755c[] = {
+ { 2000, 1308 },
+ { 1800, 1276 },
+ { 1600, 1228 },
+ { 1400, 1180 },
+ { 1200, 1132 },
+ { 1000, 1084 },
+ { 800, 1036 },
+ { 600, 988 }
+};
+
+/* Intel Pentium M processor 755 2.0 GHz, VID #D */
+static const struct fq_info pm90_n755d[] = {
+ { 2000, 1276 },
+ { 1800, 1244 },
+ { 1600, 1196 },
+ { 1400, 1164 },
+ { 1200, 1116 },
+ { 1000, 1084 },
+ { 800, 1036 },
+ { 600, 988 }
+};
+
+/* Intel Pentium M processor 765 2.1 GHz, VID #A */
+static const struct fq_info pm90_n765a[] = {
{ 2100, 1340 },
{ 1800, 1276 },
{ 1600, 1228 },
@@ -290,8 +625,44 @@ static const struct fq_info pentium_m_n765[] = {
{ 600, 988 }
};
+/* Intel Pentium M processor 765 2.1 GHz, VID #B */
+static const struct fq_info pm90_n765b[] = {
+ { 2100, 1324 },
+ { 1800, 1260 },
+ { 1600, 1212 },
+ { 1400, 1180 },
+ { 1200, 1132 },
+ { 1000, 1084 },
+ { 800, 1036 },
+ { 600, 988 }
+};
+
+/* Intel Pentium M processor 765 2.1 GHz, VID #C */
+static const struct fq_info pm90_n765c[] = {
+ { 2100, 1308 },
+ { 1800, 1244 },
+ { 1600, 1212 },
+ { 1400, 1164 },
+ { 1200, 1116 },
+ { 1000, 1084 },
+ { 800, 1036 },
+ { 600, 988 }
+};
+
+/* Intel Pentium M processor 765 2.1 GHz, VID #E */
+static const struct fq_info pm90_n765e[] = {
+ { 2100, 1356 },
+ { 1800, 1292 },
+ { 1600, 1244 },
+ { 1400, 1196 },
+ { 1200, 1148 },
+ { 1000, 1100 },
+ { 800, 1052 },
+ { 600, 988 }
+};
+
/* Intel Pentium M processor 770 2.13 GHz */
-static const struct fq_info pentium_m_n770[] = {
+static const struct fq_info pm90_n770[] = {
{ 2130, 1551 },
{ 1800, 1429 },
{ 1600, 1356 },
@@ -299,73 +670,232 @@ static const struct fq_info pentium_m_n770[] = {
{ 1200, 1132 },
{ 1000, 1084 },
{ 800, 1036 },
- { 600, 988 }
+ { 600, 988 }
+};
+
+/*
+ * VIA C7-M 500 MHz FSB, 400 MHz FSB, and ULV variants.
+ * Data from the "VIA C7-M Processor BIOS Writer's Guide (v2.17)" datasheet.
+ */
+
+/* 1.00GHz Centaur C7-M ULV */
+static const struct fq_info C7M_770_ULV[] = {
+ { 1000, 844 },
+ { 800, 796 },
+ { 600, 796 },
+ { 400, 796 },
+};
+
+/* 1.00GHz Centaur C7-M ULV */
+static const struct fq_info C7M_779_ULV[] = {
+ { 1000, 796 },
+ { 800, 796 },
+ { 600, 796 },
+ { 400, 796 },
+};
+
+/* 1.20GHz Centaur C7-M ULV */
+static const struct fq_info C7M_772_ULV[] = {
+ { 1200, 844 },
+ { 1000, 844 },
+ { 800, 828 },
+ { 600, 796 },
+ { 400, 796 },
+};
+
+/* 1.50GHz Centaur C7-M ULV */
+static const struct fq_info C7M_775_ULV[] = {
+ { 1500, 956 },
+ { 1400, 940 },
+ { 1000, 860 },
+ { 800, 828 },
+ { 600, 796 },
+ { 400, 796 },
+};
+
+/* 1.20GHz Centaur C7-M 400 Mhz FSB */
+static const struct fq_info C7M_771[] = {
+ { 1200, 860 },
+ { 1000, 860 },
+ { 800, 844 },
+ { 600, 844 },
+ { 400, 844 },
+};
+
+/* 1.50GHz Centaur C7-M 400 Mhz FSB */
+static const struct fq_info C7M_754[] = {
+ { 1500, 1004 },
+ { 1400, 988 },
+ { 1000, 940 },
+ { 800, 844 },
+ { 600, 844 },
+ { 400, 844 },
+};
+
+/* 1.60GHz Centaur C7-M 400 Mhz FSB */
+static const struct fq_info C7M_764[] = {
+ { 1600, 1084 },
+ { 1400, 1052 },
+ { 1000, 1004 },
+ { 800, 844 },
+ { 600, 844 },
+ { 400, 844 },
+};
+
+/* 1.80GHz Centaur C7-M 400 Mhz FSB */
+static const struct fq_info C7M_784[] = {
+ { 1800, 1148 },
+ { 1600, 1100 },
+ { 1400, 1052 },
+ { 1000, 1004 },
+ { 800, 844 },
+ { 600, 844 },
+ { 400, 844 },
};
+/* 2.00GHz Centaur C7-M 400 Mhz FSB */
+static const struct fq_info C7M_794[] = {
+ { 2000, 1148 },
+ { 1800, 1132 },
+ { 1600, 1100 },
+ { 1400, 1052 },
+ { 1000, 1004 },
+ { 800, 844 },
+ { 600, 844 },
+ { 400, 844 },
+};
+
+/* 1.60GHz Centaur C7-M 533 Mhz FSB */
+static const struct fq_info C7M_765[] = {
+ { 1600, 1084 },
+ { 1467, 1052 },
+ { 1200, 1004 },
+ { 800, 844 },
+ { 667, 844 },
+ { 533, 844 },
+};
+
+/* 2.00GHz Centaur C7-M 533 Mhz FSB */
+static const struct fq_info C7M_785[] = {
+ { 1867, 1148 },
+ { 1600, 1100 },
+ { 1467, 1052 },
+ { 1200, 1004 },
+ { 800, 844 },
+ { 667, 844 },
+ { 533, 844 },
+};
+
+/* 2.00GHz Centaur C7-M 533 Mhz FSB */
+static const struct fq_info C7M_795[] = {
+ { 2000, 1148 },
+ { 1867, 1132 },
+ { 1600, 1100 },
+ { 1467, 1052 },
+ { 1200, 1004 },
+ { 800, 844 },
+ { 667, 844 },
+ { 533, 844 },
+};
+
+/* Convert MHz and mV into IDs for passing to the MSR. */
+#define ID16(MHz, mV, bus_clk) \
+ (((MHz / bus_clk) << 8) | ((mV ? mV - 700 : 0) >> 4))
+#define ID32(MHz_hi, mV_hi, MHz_lo, mV_lo, bus_clk) \
+ ((ID16(MHz_lo, mV_lo, bus_clk) << 16) | (ID16(MHz_hi, mV_hi, bus_clk)))
+
struct fqlist {
- const char *brand_tag;
- const int cpu_id;
+ int vendor;
+ u_int32_t id32;
+ u_int32_t bus_clk;
const struct fq_info *table;
- u_int n;
-};
-
-static const struct fqlist pentium_m[] = {
-#define ENTRY(s, i, v) { s, i, v, sizeof(v) / sizeof((v)[0]) }
- ENTRY(" 900", 0, pentium_m_900),
- ENTRY("1000", 0, pentium_m_1000),
- ENTRY("1100", 0, pentium_m_1100),
- ENTRY("1200", 0, pentium_m_1200),
- ENTRY("1300", 0, pentium_m_1300),
- ENTRY("1400", 0, pentium_m_1400),
- ENTRY("1500", 0, pentium_m_1500),
- ENTRY("1600", 0, pentium_m_1600),
- ENTRY("1700", 0, pentium_m_1700),
-#undef ENTRY
-};
-
-static const struct fqlist pentium_m_dothan[] = {
-#define ENTRY(s, i, v) { s, i, v, sizeof(v) / sizeof((v)[0]) }
- ENTRY("1.00", 0, pentium_m_n723),
- ENTRY("1.10", 0, pentium_m_n733),
- ENTRY("1.20", 0, pentium_m_n753),
- ENTRY("1.30", 0, pentium_m_n773),
- ENTRY("1.40", 0, pentium_m_n738),
- ENTRY("1.50", 0x06d6, pentium_m_n715),
- ENTRY("1.50", 0x06d8, pentium_m_n758),
- ENTRY("1.60", 0x06d6, pentium_m_n725),
- ENTRY("1.60", 0x06d8, pentium_m_n778),
- ENTRY("1.70", 0, pentium_m_n735),
- ENTRY("1.80", 0, pentium_m_n745),
- ENTRY("2.00", 0, pentium_m_n755),
- ENTRY("2.10", 0, pentium_m_n765),
- ENTRY("2.13", 0, pentium_m_n770),
-#undef ENTRY
-};
-
-struct est_cpu {
- const char *brand_prefix;
- const char *brand_suffix;
- const struct fqlist *list;
- int n;
-};
-
-static const struct est_cpu est_cpus[] = {
- {
- "Intel(R) Pentium(R) M processor ", "MHz",
- pentium_m,
- (sizeof(pentium_m) / sizeof(pentium_m[0]))
- },
- {
- "Intel(R) Pentium(R) M processor ", "GHz",
- pentium_m_dothan,
- (sizeof(pentium_m_dothan) / sizeof(pentium_m_dothan[0]))
- },
+ unsigned n;
+};
+
+#define ENTRY(ven, tab, zhi, vhi, zlo, vlo, bus_clk) \
+ { CPUVENDOR_##ven, ID32(zhi, vhi, zlo, vlo, bus_clk), bus_clk, tab, \
+ sizeof(tab) / sizeof((tab)[0]) }
+
+static const struct fqlist est_cpus[] = {
+ ENTRY(INTEL, pm130_900_ulv, 900, 1004, 600, 844, 100),
+ ENTRY(INTEL, pm130_1000_ulv, 1000, 1004, 600, 844, 100),
+ ENTRY(INTEL, pm130_1100_ulv, 1100, 1004, 600, 844, 100),
+ ENTRY(INTEL, pm130_1100_lv, 1100, 1180, 600, 956, 100),
+ ENTRY(INTEL, pm130_1200_lv, 1200, 1180, 600, 956, 100),
+ ENTRY(INTEL, pm130_1300_lv, 1300, 1180, 600, 956, 100),
+ ENTRY(INTEL, pm130_1300, 1300, 1388, 600, 956, 100),
+ ENTRY(INTEL, pm130_1400, 1400, 1484, 600, 956, 100),
+ ENTRY(INTEL, pm130_1500, 1500, 1484, 600, 956, 100),
+ ENTRY(INTEL, pm130_1600, 1600, 1484, 600, 956, 100),
+ ENTRY(INTEL, pm130_1700, 1700, 1484, 600, 956, 100),
+
+ ENTRY(INTEL, pm90_n723, 1000, 940, 600, 812, 100),
+ ENTRY(INTEL, pm90_n733, 1100, 940, 600, 812, 100),
+ ENTRY(INTEL, pm90_n733g, 1100, 956, 600, 812, 100),
+ ENTRY(INTEL, pm90_n733h, 1100, 940, 600, 812, 100),
+ ENTRY(INTEL, pm90_n733i, 1100, 924, 600, 812, 100),
+ ENTRY(INTEL, pm90_n733j, 1100, 908, 600, 812, 100),
+ ENTRY(INTEL, pm90_n733k, 1100, 892, 600, 812, 100),
+ ENTRY(INTEL, pm90_n733l, 1100, 876, 600, 812, 100),
+ ENTRY(INTEL, pm90_n753g, 1200, 956, 600, 812, 100),
+ ENTRY(INTEL, pm90_n753h, 1200, 940, 600, 812, 100),
+ ENTRY(INTEL, pm90_n753i, 1200, 924, 600, 812, 100),
+ ENTRY(INTEL, pm90_n753j, 1200, 908, 600, 812, 100),
+ ENTRY(INTEL, pm90_n753k, 1200, 892, 600, 812, 100),
+ ENTRY(INTEL, pm90_n753l, 1200, 876, 600, 812, 100),
+ ENTRY(INTEL, pm90_n773g, 1300, 956, 600, 812, 100),
+ ENTRY(INTEL, pm90_n773h, 1300, 940, 600, 812, 100),
+ ENTRY(INTEL, pm90_n773i, 1300, 924, 600, 812, 100),
+ ENTRY(INTEL, pm90_n773j, 1300, 908, 600, 812, 100),
+ ENTRY(INTEL, pm90_n773k, 1300, 892, 600, 812, 100),
+ ENTRY(INTEL, pm90_n773l, 1300, 876, 600, 812, 100),
+ ENTRY(INTEL, pm90_n738, 1400, 1116, 600, 988, 100),
+ ENTRY(INTEL, pm90_n758, 1500, 1116, 600, 988, 100),
+ ENTRY(INTEL, pm90_n778, 1600, 1116, 600, 988, 100),
+ ENTRY(INTEL, pm90_n715a, 1500, 1340, 600, 988, 100),
+ ENTRY(INTEL, pm90_n715b, 1500, 1324, 600, 988, 100),
+ ENTRY(INTEL, pm90_n715c, 1500, 1308, 600, 988, 100),
+ ENTRY(INTEL, pm90_n715d, 1500, 1276, 600, 988, 100),
+ ENTRY(INTEL, pm90_n725a, 1600, 1340, 600, 988, 100),
+ ENTRY(INTEL, pm90_n725b, 1600, 1324, 600, 988, 100),
+ ENTRY(INTEL, pm90_n725c, 1600, 1308, 600, 988, 100),
+ ENTRY(INTEL, pm90_n725d, 1600, 1276, 600, 988, 100),
+ ENTRY(INTEL, pm90_n735a, 1700, 1340, 600, 988, 100),
+ ENTRY(INTEL, pm90_n735b, 1700, 1324, 600, 988, 100),
+ ENTRY(INTEL, pm90_n735c, 1700, 1308, 600, 988, 100),
+ ENTRY(INTEL, pm90_n735d, 1700, 1276, 600, 988, 100),
+ ENTRY(INTEL, pm90_n745a, 1800, 1340, 600, 988, 100),
+ ENTRY(INTEL, pm90_n745b, 1800, 1324, 600, 988, 100),
+ ENTRY(INTEL, pm90_n745c, 1800, 1308, 600, 988, 100),
+ ENTRY(INTEL, pm90_n745d, 1800, 1276, 600, 988, 100),
+ ENTRY(INTEL, pm90_n755a, 2000, 1340, 600, 988, 100),
+ ENTRY(INTEL, pm90_n755b, 2000, 1324, 600, 988, 100),
+ ENTRY(INTEL, pm90_n755c, 2000, 1308, 600, 988, 100),
+ ENTRY(INTEL, pm90_n755d, 2000, 1276, 600, 988, 100),
+ ENTRY(INTEL, pm90_n765a, 2100, 1340, 600, 988, 100),
+ ENTRY(INTEL, pm90_n765b, 2100, 1324, 600, 988, 100),
+ ENTRY(INTEL, pm90_n765c, 2100, 1308, 600, 988, 100),
+ ENTRY(INTEL, pm90_n765e, 2100, 1356, 600, 988, 100),
+ ENTRY(INTEL, pm90_n770, 2130, 1551, 600, 988, 100),
+
+ ENTRY(VIA, C7M_770_ULV, 1000, 844, 400, 796, 100),
+ ENTRY(VIA, C7M_779_ULV, 1000, 796, 400, 796, 100),
+ ENTRY(VIA, C7M_772_ULV, 1200, 844, 400, 796, 100),
+ ENTRY(VIA, C7M_771, 1200, 860, 400, 844, 100),
+ ENTRY(VIA, C7M_775_ULV, 1500, 956, 400, 796, 100),
+ ENTRY(VIA, C7M_754, 1500, 1004, 400, 844, 100),
+ ENTRY(VIA, C7M_764, 1600, 1084, 400, 844, 100),
+ ENTRY(VIA, C7M_765, 1600, 1084, 533, 844, 133),
+ ENTRY(VIA, C7M_784, 1800, 1148, 400, 844, 100),
+ ENTRY(VIA, C7M_785, 1867, 1148, 533, 844, 133),
+ ENTRY(VIA, C7M_794, 2000, 1148, 400, 844, 100),
+ ENTRY(VIA, C7M_795, 2000, 1148, 533, 844, 133),
};
#define NESTCPUS (sizeof(est_cpus) / sizeof(est_cpus[0]))
-#define MSRVALUE(mhz, mv) ((((mhz) / 100) << 8) | (((mv) - 700) / 16))
+#define MSRVALUE(mhz, mv, bus) ((((mhz) / (bus)) << 8) | (((mv) - 700) / 16))
#define MSR2MHZ(msr) ((((int) (msr) >> 8) & 0xff) * 100)
#define MSR2MV(msr) (((int) (msr) & 0xff) * 16 + 700)
@@ -375,16 +905,11 @@ extern int setperf_prio;
extern int perflevel;
void
-est_init(const char *cpu_device)
+est_init(const char *cpu_device, int vendor)
{
- int i, j, n, mhz, mv;
- const struct est_cpu *cpu;
+ int i, mhz, mv, low, high;
+ u_int32_t id;
u_int64_t msr;
- char *tag;
- const struct fqlist *fql;
- extern char cpu_brandstr[];
- extern int cpu_id;
- int low, high;
if (setperf_prio > 3)
return;
@@ -396,30 +921,20 @@ est_init(const char *cpu_device)
mhz = MSR2MHZ(msr);
mv = MSR2MV(msr);
printf("%s: Enhanced SpeedStep %d MHz (%d mV)",
- cpu_device, mhz, mv);
+ cpu_device, mhz, mv);
/*
- * Look for a CPU matching cpu_brandstr.
+ * Find an entry which matches (vendor, id32)
*/
- for (i = 0; est_fqlist == NULL && i < NESTCPUS; i++) {
- cpu = &est_cpus[i];
- n = strlen(cpu->brand_prefix);
- if (strncmp(cpu->brand_prefix, cpu_brandstr, n) != 0)
- continue;
- tag = cpu_brandstr + n;
- for (j = 0; j < cpu->n; j++) {
- fql = &cpu->list[j];
- n = strlen(fql->brand_tag);
- if (!strncmp(fql->brand_tag, tag, n) &&
- !strcmp(cpu->brand_suffix, tag + n) &&
- (fql->cpu_id == 0 || fql->cpu_id == cpu_id)) {
- est_fqlist = fql;
- break;
- }
+ id = msr >> 32;
+ for (i = 0; i < NESTCPUS; i++) {
+ if (est_cpus[i].vendor == vendor && est_cpus[i].id32 == id) {
+ est_fqlist = &est_cpus[i];
+ break;
}
}
if (est_fqlist == NULL) {
- printf(": unknown EST cpu, no changes possible\n");
+ printf(": unknown EST cpu, msr %016llx\n", msr);
return;
}
@@ -467,9 +982,10 @@ est_setperf(int level)
if (est_fqlist->table[i].mhz >= fq)
break;
msr = (rdmsr(MSR_PERF_CTL) & ~0xffffULL) |
- MSRVALUE(est_fqlist->table[i].mhz, est_fqlist->table[i].mv);
+ MSRVALUE(est_fqlist->table[i].mhz, est_fqlist->table[i].mv,
+ est_fqlist->bus_clk);
wrmsr(MSR_PERF_CTL, msr);
pentium_mhz = est_fqlist->table[i].mhz;
-
+
return (0);
}
diff --git a/sys/arch/i386/i386/machdep.c b/sys/arch/i386/i386/machdep.c
index aa7da3554bc..9547b343606 100644
--- a/sys/arch/i386/i386/machdep.c
+++ b/sys/arch/i386/i386/machdep.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: machdep.c,v 1.355 2006/05/18 17:36:31 dim Exp $ */
+/* $OpenBSD: machdep.c,v 1.356 2006/05/19 19:43:41 dim Exp $ */
/* $NetBSD: machdep.c,v 1.214 1996/11/10 03:16:17 thorpej Exp $ */
/*-
@@ -1180,7 +1180,7 @@ cyrix3_cpu_setup(struct cpu_info *ci)
if (cpu_ecxfeature & CPUIDECX_EST) {
if (rdmsr(MSR_MISC_ENABLE) & (1 << 16))
- est_init(ci->ci_dev.dv_xname);
+ est_init(ci->ci_dev.dv_xname, CPUVENDOR_VIA);
else
printf("%s: Enhanced SpeedStep disabled by BIOS\n",
ci->ci_dev.dv_xname);
@@ -1460,7 +1460,7 @@ intel686_common_cpu_setup(struct cpu_info *ci)
if (cpu_ecxfeature & CPUIDECX_EST) {
if (rdmsr(MSR_MISC_ENABLE) & (1 << 16))
- est_init(ci->ci_dev.dv_xname);
+ est_init(ci->ci_dev.dv_xname, CPUVENDOR_INTEL);
else
printf("%s: Enhanced SpeedStep disabled by BIOS\n",
ci->ci_dev.dv_xname);
diff --git a/sys/arch/i386/include/cpu.h b/sys/arch/i386/include/cpu.h
index 9e7082860f6..10ce69a46ea 100644
--- a/sys/arch/i386/include/cpu.h
+++ b/sys/arch/i386/include/cpu.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: cpu.h,v 1.76 2006/05/09 09:38:35 otto Exp $ */
+/* $OpenBSD: cpu.h,v 1.77 2006/05/19 19:43:41 dim Exp $ */
/* $NetBSD: cpu.h,v 1.35 1996/05/05 19:29:26 christos Exp $ */
/*-
@@ -355,7 +355,7 @@ void i8254_initclocks(void);
/* est.c */
#if !defined(SMALL_KERNEL) && defined(I686_CPU)
-void est_init(const char *);
+void est_init(const char *, int);
int est_setperf(int);
#endif