aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorJung-uk Kim <jkim@FreeBSD.org>2008-10-21 00:17:55 +0000
committerJung-uk Kim <jkim@FreeBSD.org>2008-10-21 00:17:55 +0000
commit780f139b5b21166717ab4d63848ed0f6c4c3d0fb (patch)
tree8c5ecd5cef4e0ddf5adf4fa080ca8e3b054df5f2 /sys
parentb63f51d0d0c75d651d2c0a59d95fbbb85807f3c4 (diff)
downloadsrc-780f139b5b21166717ab4d63848ed0f6c4c3d0fb.tar.gz
src-780f139b5b21166717ab4d63848ed0f6c4c3d0fb.zip
Detect Advanced Power Management Information for AMD CPUs.
Notes
Notes: svn path=/head/; revision=184101
Diffstat (limited to 'sys')
-rw-r--r--sys/amd64/amd64/identcpu.c4
-rw-r--r--sys/amd64/amd64/initcpu.c1
-rw-r--r--sys/amd64/include/md_var.h1
-rw-r--r--sys/amd64/include/specialreg.h13
-rw-r--r--sys/i386/i386/identcpu.c4
-rw-r--r--sys/i386/i386/initcpu.c1
-rw-r--r--sys/i386/include/md_var.h1
-rw-r--r--sys/i386/include/specialreg.h13
8 files changed, 38 insertions, 0 deletions
diff --git a/sys/amd64/amd64/identcpu.c b/sys/amd64/amd64/identcpu.c
index 6558a5bda3ec..30ab367228ff 100644
--- a/sys/amd64/amd64/identcpu.c
+++ b/sys/amd64/amd64/identcpu.c
@@ -451,6 +451,10 @@ identify_cpu(void)
amd_feature = regs[3] & ~(cpu_feature & 0x0183f3ff);
amd_feature2 = regs[2];
}
+ if (cpu_exthigh >= 0x80000007) {
+ do_cpuid(0x80000007, regs);
+ amd_pminfo = regs[3];
+ }
if (cpu_exthigh >= 0x80000008) {
do_cpuid(0x80000008, regs);
cpu_procinfo2 = regs[2];
diff --git a/sys/amd64/amd64/initcpu.c b/sys/amd64/amd64/initcpu.c
index e6e94d65349e..bc5d10cdef33 100644
--- a/sys/amd64/amd64/initcpu.c
+++ b/sys/amd64/amd64/initcpu.c
@@ -53,6 +53,7 @@ u_int cpu_feature; /* Feature flags */
u_int cpu_feature2; /* Feature flags */
u_int amd_feature; /* AMD feature flags */
u_int amd_feature2; /* AMD feature flags */
+u_int amd_pminfo; /* AMD advanced power management info */
u_int cpu_high; /* Highest arg to CPUID */
u_int cpu_exthigh; /* Highest arg to extended CPUID */
u_int cpu_id; /* Stepping ID */
diff --git a/sys/amd64/include/md_var.h b/sys/amd64/include/md_var.h
index 348cb31468b5..7f9d2868816d 100644
--- a/sys/amd64/include/md_var.h
+++ b/sys/amd64/include/md_var.h
@@ -44,6 +44,7 @@ extern u_int cpu_feature;
extern u_int cpu_feature2;
extern u_int amd_feature;
extern u_int amd_feature2;
+extern u_int amd_pminfo;
extern u_int cpu_fxsr;
extern u_int cpu_high;
extern u_int cpu_id;
diff --git a/sys/amd64/include/specialreg.h b/sys/amd64/include/specialreg.h
index 4fd32ae07c52..d5b7c55f0f2a 100644
--- a/sys/amd64/include/specialreg.h
+++ b/sys/amd64/include/specialreg.h
@@ -161,6 +161,19 @@
#define CPUID_LOCAL_APIC_ID 0xff000000
/*
+ * AMD extended function 8000_0007h edx info
+ */
+#define AMDPM_TS 0x00000001
+#define AMDPM_FID 0x00000002
+#define AMDPM_VID 0x00000004
+#define AMDPM_TTP 0x00000008
+#define AMDPM_TM 0x00000010
+#define AMDPM_STC 0x00000020
+#define AMDPM_100MHZ_STEPS 0x00000040
+#define AMDPM_HW_PSTATE 0x00000080
+#define AMDPM_TSC_INVARIANT 0x00000100
+
+/*
* AMD extended function 8000_0008h ecx info
*/
#define AMDID_CMP_CORES 0x000000ff
diff --git a/sys/i386/i386/identcpu.c b/sys/i386/i386/identcpu.c
index 8f835bc77032..335851117577 100644
--- a/sys/i386/i386/identcpu.c
+++ b/sys/i386/i386/identcpu.c
@@ -1089,6 +1089,10 @@ finishidentcpu(void)
amd_feature = regs[3] & ~(cpu_feature & 0x0183f3ff);
amd_feature2 = regs[2];
}
+ if (cpu_exthigh >= 0x80000007) {
+ do_cpuid(0x80000007, regs);
+ amd_pminfo = regs[3];
+ }
if (cpu_exthigh >= 0x80000008) {
do_cpuid(0x80000008, regs);
cpu_procinfo2 = regs[2];
diff --git a/sys/i386/i386/initcpu.c b/sys/i386/i386/initcpu.c
index 0c212e474808..a3679d6e4ad1 100644
--- a/sys/i386/i386/initcpu.c
+++ b/sys/i386/i386/initcpu.c
@@ -82,6 +82,7 @@ u_int cpu_feature = 0; /* Feature flags */
u_int cpu_feature2 = 0; /* Feature flags */
u_int amd_feature = 0; /* AMD feature flags */
u_int amd_feature2 = 0; /* AMD feature flags */
+u_int amd_pminfo = 0; /* AMD advanced power management info */
u_int via_feature_rng = 0; /* VIA RNG features */
u_int via_feature_xcrypt = 0; /* VIA ACE features */
u_int cpu_high = 0; /* Highest arg to CPUID */
diff --git a/sys/i386/include/md_var.h b/sys/i386/include/md_var.h
index 4f8b96d4514f..af3ab7e68bbd 100644
--- a/sys/i386/include/md_var.h
+++ b/sys/i386/include/md_var.h
@@ -49,6 +49,7 @@ extern u_int cpu_feature;
extern u_int cpu_feature2;
extern u_int amd_feature;
extern u_int amd_feature2;
+extern u_int amd_pminfo;
extern u_int via_feature_rng;
extern u_int via_feature_xcrypt;
extern u_int cpu_fxsr;
diff --git a/sys/i386/include/specialreg.h b/sys/i386/include/specialreg.h
index eb6e0b5fbbf4..ec9de9f19c06 100644
--- a/sys/i386/include/specialreg.h
+++ b/sys/i386/include/specialreg.h
@@ -158,6 +158,19 @@
#define CPUID_LOCAL_APIC_ID 0xff000000
/*
+ * AMD extended function 8000_0007h edx info
+ */
+#define AMDPM_TS 0x00000001
+#define AMDPM_FID 0x00000002
+#define AMDPM_VID 0x00000004
+#define AMDPM_TTP 0x00000008
+#define AMDPM_TM 0x00000010
+#define AMDPM_STC 0x00000020
+#define AMDPM_100MHZ_STEPS 0x00000040
+#define AMDPM_HW_PSTATE 0x00000080
+#define AMDPM_TSC_INVARIANT 0x00000100
+
+/*
* AMD extended function 8000_0008h ecx info
*/
#define AMDID_CMP_CORES 0x000000ff