From: "H. Peter Anvin" <hpa@zytor.com>
To: linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org,
andi@firstfloor.org, akpm@linux-foundation.org
Cc: Venki Pallipadi <venkatesh.pallipadi@intel.com>,
"H. Peter Anvin" <hpa@zytor.com>
Subject: [x86 setup 07/33] Use a new CPU feature word to cover all Intel features that are spread around
Date: Mon, 9 Jul 2007 19:51:46 -0700 [thread overview]
Message-ID: <11840366692770-git-send-email-hpa@zytor.com> (raw)
Message-ID: <32e7eb05f31e6fbff33ecce6580ee4f7bdf38fef.1184032749.git.hpa@zytor.com> (raw)
In-Reply-To: <1184036564610-git-send-email-hpa@zytor.com>
In-Reply-To: <2034f71d414def30de582fb59573295cadbdabb4.1184032748.git.hpa@zytor.com>
From: Venki Pallipadi <venkatesh.pallipadi@intel.com>
in different CPUID leafs like 0x5, 0x6 and 0xA. Make this
feature detection code common across i386 and x86_64.
Display Intel Dynamic Acceleration feature in /proc/cpuinfo. This feature
will be enabled automatically by current acpi-cpufreq driver.
Refer to Intel Software Developer's Manual for more details about the feature.
Thanks to hpa (H Peter Anvin) for the making the actual code detecting the
scattered features data-driven.
Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
---
arch/i386/kernel/cpu/Makefile | 2 +-
arch/i386/kernel/cpu/addon_cpuid_features.c | 50 +++++++++++++++++++++++++++
arch/i386/kernel/cpu/common.c | 2 +
arch/i386/kernel/cpu/proc.c | 6 +++
arch/x86_64/kernel/Makefile | 2 +
arch/x86_64/kernel/setup.c | 8 ++++
include/asm-i386/cpufeature.h | 11 +++++-
include/asm-i386/processor.h | 1 +
include/asm-i386/required-features.h | 1 +
include/asm-x86_64/processor.h | 1 +
include/asm-x86_64/required-features.h | 1 +
11 files changed, 82 insertions(+), 3 deletions(-)
create mode 100644 arch/i386/kernel/cpu/addon_cpuid_features.c
diff --git a/arch/i386/kernel/cpu/Makefile b/arch/i386/kernel/cpu/Makefile
index 74f27a4..0b6a855 100644
--- a/arch/i386/kernel/cpu/Makefile
+++ b/arch/i386/kernel/cpu/Makefile
@@ -8,7 +8,7 @@ obj-y += amd.o
obj-y += cyrix.o
obj-y += centaur.o
obj-y += transmeta.o
-obj-y += intel.o intel_cacheinfo.o
+obj-y += intel.o intel_cacheinfo.o addon_cpuid_features.o
obj-y += rise.o
obj-y += nexgen.o
obj-y += umc.o
diff --git a/arch/i386/kernel/cpu/addon_cpuid_features.c b/arch/i386/kernel/cpu/addon_cpuid_features.c
new file mode 100644
index 0000000..3e91d3e
--- /dev/null
+++ b/arch/i386/kernel/cpu/addon_cpuid_features.c
@@ -0,0 +1,50 @@
+
+/*
+ * Routines to indentify additional cpu features that are scattered in
+ * cpuid space.
+ */
+
+#include <linux/cpu.h>
+
+#include <asm/processor.h>
+
+struct cpuid_bit {
+ u16 feature;
+ u8 reg;
+ u8 bit;
+ u32 level;
+};
+
+enum cpuid_regs {
+ CR_EAX = 0,
+ CR_ECX,
+ CR_EDX,
+ CR_EBX
+};
+
+void __cpuinit init_scattered_cpuid_features(struct cpuinfo_x86 *c)
+{
+ u32 max_level;
+ u32 regs[4];
+ const struct cpuid_bit *cb;
+
+ static const struct cpuid_bit cpuid_bits[] = {
+ { X86_FEATURE_IDA, CR_EAX, 1, 0x00000006 },
+ { 0, 0, 0, 0 }
+ };
+
+ for (cb = cpuid_bits; cb->feature; cb++) {
+
+ /* Verify that the level is valid */
+ max_level = cpuid_eax(cb->level & 0xffff0000);
+ if (max_level < cb->level ||
+ max_level > (cb->level | 0xffff))
+ continue;
+
+ cpuid(cb->level, ®s[CR_EAX], ®s[CR_EBX],
+ ®s[CR_ECX], ®s[CR_EDX]);
+
+ if (regs[cb->reg] & (1 << cb->bit))
+ set_bit(cb->feature, c->x86_capability);
+ }
+}
diff --git a/arch/i386/kernel/cpu/common.c b/arch/i386/kernel/cpu/common.c
index 794d593..e5419a9 100644
--- a/arch/i386/kernel/cpu/common.c
+++ b/arch/i386/kernel/cpu/common.c
@@ -353,6 +353,8 @@ static void __cpuinit generic_identify(struct cpuinfo_x86 * c)
if ( xlvl >= 0x80000004 )
get_model_name(c); /* Default name */
}
+
+ init_scattered_cpuid_features(c);
}
early_intel_workaround(c);
diff --git a/arch/i386/kernel/cpu/proc.c b/arch/i386/kernel/cpu/proc.c
index ed73091..1e31b6c 100644
--- a/arch/i386/kernel/cpu/proc.c
+++ b/arch/i386/kernel/cpu/proc.c
@@ -65,6 +65,12 @@ static int show_cpuinfo(struct seq_file *m, void *v)
"osvw", "ibs", NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+ /* Auxiliary (Linux-defined) */
+ "ida", NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
};
static const char * const x86_power_flags[] = {
"ts", /* temperature sensor */
diff --git a/arch/x86_64/kernel/Makefile b/arch/x86_64/kernel/Makefile
index de1de8a..47f1dc3 100644
--- a/arch/x86_64/kernel/Makefile
+++ b/arch/x86_64/kernel/Makefile
@@ -44,6 +44,7 @@ obj-$(CONFIG_PCI) += early-quirks.o
obj-y += topology.o
obj-y += intel_cacheinfo.o
+obj-y += addon_cpuid_features.o
obj-y += pcspeaker.o
CFLAGS_vsyscall.o := $(PROFILING) -g0
@@ -55,6 +56,7 @@ cpuid-$(subst m,y,$(CONFIG_X86_CPUID)) += ../../i386/kernel/cpuid.o
topology-y += ../../i386/kernel/topology.o
microcode-$(subst m,y,$(CONFIG_MICROCODE)) += ../../i386/kernel/microcode.o
intel_cacheinfo-y += ../../i386/kernel/cpu/intel_cacheinfo.o
+addon_cpuid_features-y += ../../i386/kernel/cpu/addon_cpuid_features.o
quirks-y += ../../i386/kernel/quirks.o
i8237-y += ../../i386/kernel/i8237.o
msr-$(subst m,y,$(CONFIG_X86_MSR)) += ../../i386/kernel/msr.o
diff --git a/arch/x86_64/kernel/setup.c b/arch/x86_64/kernel/setup.c
index dc7630d..33ef718 100644
--- a/arch/x86_64/kernel/setup.c
+++ b/arch/x86_64/kernel/setup.c
@@ -846,6 +846,8 @@ void __cpuinit identify_cpu(struct cpuinfo_x86 *c)
c->x86_capability[2] = cpuid_edx(0x80860001);
}
+ init_scattered_cpuid_features(c);
+
c->apicid = phys_pkg_id(0);
/*
@@ -973,6 +975,12 @@ static int show_cpuinfo(struct seq_file *m, void *v)
"osvw", "ibs", NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+
+ /* Auxiliary (Linux-defined) */
+ "ida", NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
};
static char *x86_power_flags[] = {
"ts", /* temperature sensor */
diff --git a/include/asm-i386/cpufeature.h b/include/asm-i386/cpufeature.h
index 7ea5f4a..c961c03 100644
--- a/include/asm-i386/cpufeature.h
+++ b/include/asm-i386/cpufeature.h
@@ -12,7 +12,7 @@
#endif
#include <asm/required-features.h>
-#define NCAPINTS 7 /* N 32-bit words worth of info */
+#define NCAPINTS 8 /* N 32-bit words worth of info */
/* Intel-defined CPU features, CPUID level 0x00000001 (edx), word 0 */
#define X86_FEATURE_FPU (0*32+ 0) /* Onboard FPU */
@@ -109,6 +109,12 @@
#define X86_FEATURE_LAHF_LM (6*32+ 0) /* LAHF/SAHF in long mode */
#define X86_FEATURE_CMP_LEGACY (6*32+ 1) /* If yes HyperThreading not valid */
+/*
+ * Auxiliary flags: Linux defined - For features scattered in various
+ * CPUID levels like 0x6, 0xA etc
+ */
+#define X86_FEATURE_IDA (7*32+ 0) /* Intel Dynamic Acceleration */
+
#define cpu_has(c, bit) \
(__builtin_constant_p(bit) && \
( (((bit)>>5)==0 && (1UL<<((bit)&31) & REQUIRED_MASK0)) || \
@@ -117,7 +123,8 @@
(((bit)>>5)==3 && (1UL<<((bit)&31) & REQUIRED_MASK3)) || \
(((bit)>>5)==4 && (1UL<<((bit)&31) & REQUIRED_MASK4)) || \
(((bit)>>5)==5 && (1UL<<((bit)&31) & REQUIRED_MASK5)) || \
- (((bit)>>5)==6 && (1UL<<((bit)&31) & REQUIRED_MASK6)) ) \
+ (((bit)>>5)==6 && (1UL<<((bit)&31) & REQUIRED_MASK6)) || \
+ (((bit)>>5)==7 && (1UL<<((bit)&31) & REQUIRED_MASK7)) ) \
? 1 : \
test_bit(bit, (c)->x86_capability))
#define boot_cpu_has(bit) cpu_has(&boot_cpu_data, bit)
diff --git a/include/asm-i386/processor.h b/include/asm-i386/processor.h
index 338668b..94e0c14 100644
--- a/include/asm-i386/processor.h
+++ b/include/asm-i386/processor.h
@@ -119,6 +119,7 @@ void __init cpu_detect(struct cpuinfo_x86 *c);
extern void identify_boot_cpu(void);
extern void identify_secondary_cpu(struct cpuinfo_x86 *);
extern void print_cpu_info(struct cpuinfo_x86 *);
+extern void init_scattered_cpuid_features(struct cpuinfo_x86 *c);
extern unsigned int init_intel_cacheinfo(struct cpuinfo_x86 *c);
extern unsigned short num_cache_leaves;
diff --git a/include/asm-i386/required-features.h b/include/asm-i386/required-features.h
index a9c3b11..65848a0 100644
--- a/include/asm-i386/required-features.h
+++ b/include/asm-i386/required-features.h
@@ -50,5 +50,6 @@
#define REQUIRED_MASK4 0
#define REQUIRED_MASK5 0
#define REQUIRED_MASK6 0
+#define REQUIRED_MASK7 0
#endif
diff --git a/include/asm-x86_64/processor.h b/include/asm-x86_64/processor.h
index df64572..efc87a5 100644
--- a/include/asm-x86_64/processor.h
+++ b/include/asm-x86_64/processor.h
@@ -100,6 +100,7 @@ extern char ignore_irq13;
extern void identify_cpu(struct cpuinfo_x86 *);
extern void print_cpu_info(struct cpuinfo_x86 *);
+extern void init_scattered_cpuid_features(struct cpuinfo_x86 *c);
extern unsigned int init_intel_cacheinfo(struct cpuinfo_x86 *c);
extern unsigned short num_cache_leaves;
diff --git a/include/asm-x86_64/required-features.h b/include/asm-x86_64/required-features.h
index 262f315..e80d576 100644
--- a/include/asm-x86_64/required-features.h
+++ b/include/asm-x86_64/required-features.h
@@ -41,5 +41,6 @@
#define REQUIRED_MASK4 0
#define REQUIRED_MASK5 0
#define REQUIRED_MASK6 0
+#define REQUIRED_MASK7 0
#endif
--
1.5.2.2
next prev parent reply other threads:[~2007-07-10 3:11 UTC|newest]
Thread overview: 69+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-07-10 2:51 x86 setup code rewrite in C H. Peter Anvin
[not found] ` <2034f71d414def30de582fb59573295cadbdabb4.1184032748.git.hpa@zytor.com>
2007-07-10 2:51 ` [x86 setup 01/33] x86 setup: MAINTAINERS: formally take responsibility for the i386 boot code H. Peter Anvin
[not found] ` <de4df4ebeb6ec1bf47d4adf19f6a388035e2bfec.1184032748.git.hpa@zytor.com>
2007-07-10 2:51 ` [x86 setup 02/33] hd.c: remove BIOS/CMOS queries H. Peter Anvin
[not found] ` <38825725eb2e4aac1dd8e312460c5c239466b39a.1184032749.git.hpa@zytor.com>
2007-07-10 2:51 ` [x86 setup 03/33] include/asm-i386/boot.h: This is <asm/boot.h>, not <linux/boot.h> H. Peter Anvin
[not found] ` <62f9b07039d6bef798882977f3c8986fc2d2c6c6.1184032749.git.hpa@zytor.com>
2007-07-10 2:51 ` [x86 setup 04/33] Unify the CPU features vectors between i386 and x86-64 H. Peter Anvin
[not found] ` <8376b111bbf6bf6c8c884fabcb9c1844950737b0.1184032749.git.hpa@zytor.com>
2007-07-10 2:51 ` [x86 setup 05/33] Change CONFIG_X86_MINIMUM_CPU_MODEL to CONFIG_X86_MINIMUM_CPU_FAMILY H. Peter Anvin
[not found] ` <06a26dd135e1fc3b7f8b238c5b1bc8404d23acac.1184032749.git.hpa@zytor.com>
2007-07-10 2:51 ` [x86 setup 06/33] Clean up struct screen_info (<linux/screen_info.h>) H. Peter Anvin
[not found] ` <32e7eb05f31e6fbff33ecce6580ee4f7bdf38fef.1184032749.git.hpa@zytor.com>
2007-07-10 2:51 ` H. Peter Anvin [this message]
[not found] ` <a8e9d4bffc9fa216d32c930606475fd8d1df9405.1184032749.git.hpa@zytor.com>
2007-07-10 2:51 ` [x86 setup 08/33] Define zero-page offset 0x1e4 as a scratch field, and use it H. Peter Anvin
[not found] ` <361d0a8b7b7ea9d41d0c25664b3e2b30fd99e329.1184032749.git.hpa@zytor.com>
2007-07-10 2:51 ` [x86 setup 09/33] Make definitions for struct e820entry and struct e820map consistent H. Peter Anvin
2007-07-10 11:48 ` Andi Kleen
[not found] ` <0ff939788c542b0560ec39668550557dcc134afe.1184032749.git.hpa@zytor.com>
2007-07-10 2:51 ` [x86 setup 10/33] Make struct boot_params a real structure, and remove obsolete fields H. Peter Anvin
[not found] ` <bbeadd1995da049cf6880ab58794f84ec8785a08.1184032749.git.hpa@zytor.com>
2007-07-10 2:51 ` [x86 setup 11/33] x86-64: add CONFIG_PHYSICAL_ALIGN for consistency with i386 H. Peter Anvin
[not found] ` <e3ff2ad47d4610cdafbe24dcabadef42bb3166fb.1184032749.git.hpa@zytor.com>
2007-07-10 2:51 ` [x86 setup 12/33] x86-64: add symbolic constants for the boot segment selectors H. Peter Anvin
[not found] ` <96024b4c88d58a8473deb48a8038f6893b8b6b55.1184032749.git.hpa@zytor.com>
2007-07-10 2:51 ` [x86 setup 13/33] Header file to produce 16-bit code with gcc H. Peter Anvin
2007-07-10 14:16 ` Segher Boessenkool
2007-07-10 15:21 ` Andi Kleen
2007-07-10 15:48 ` H. Peter Anvin
2007-07-10 15:53 ` H. Peter Anvin
2007-07-10 20:08 ` Segher Boessenkool
2007-07-10 20:43 ` H. Peter Anvin
2007-07-10 21:08 ` Pawel Dziepak
2007-07-10 21:20 ` H. Peter Anvin
2007-07-11 0:26 ` Brian Gerst
2007-07-10 19:57 ` Segher Boessenkool
2007-07-10 20:42 ` H. Peter Anvin
2007-07-10 21:10 ` Segher Boessenkool
2007-07-10 21:40 ` H. Peter Anvin
2007-07-10 22:06 ` Segher Boessenkool
2007-07-10 21:43 ` Adrian Bunk
2007-07-10 21:46 ` H. Peter Anvin
2007-07-11 0:30 ` Brian Gerst
[not found] ` <a862328acf06a9587458c615848099f96fbab1ce.1184032749.git.hpa@zytor.com>
2007-07-10 2:51 ` [x86 setup 14/33] Top header file for new x86 setup code H. Peter Anvin
[not found] ` <899e4acb1fe3e4313dfdca5398431274808d71ef.1184032749.git.hpa@zytor.com>
2007-07-10 2:51 ` [x86 setup 15/33] Simple bitops for the " H. Peter Anvin
[not found] ` <d5bd30fc697149284a73e09efe54884ab178de7e.1184032749.git.hpa@zytor.com>
2007-07-10 2:51 ` [x86 setup 16/33] String-handling functions " H. Peter Anvin
2007-07-10 18:25 ` Jan Engelhardt
2007-07-10 18:35 ` H. Peter Anvin
2007-07-10 20:10 ` Segher Boessenkool
2007-07-10 20:44 ` H. Peter Anvin
2007-07-10 21:14 ` Segher Boessenkool
2007-07-11 12:46 ` Andi Kleen
[not found] ` <17db5b2c8a43cf36b2eb36afc142ce9ca0552282.1184032749.git.hpa@zytor.com>
2007-07-10 2:51 ` [x86 setup 17/33] A20 handling code H. Peter Anvin
2007-07-10 18:27 ` Jan Engelhardt
2007-07-10 18:33 ` H. Peter Anvin
2007-07-10 18:36 ` H. Peter Anvin
[not found] ` <c488ae7cd0ddd799b666f55652248be3c346a076.1184032749.git.hpa@zytor.com>
2007-07-10 2:51 ` [x86 setup 18/33] APM probing code H. Peter Anvin
[not found] ` <3726c75f36dc97c1fce93835e872bbc814857990.1184032749.git.hpa@zytor.com>
2007-07-10 2:51 ` [x86 setup 19/33] Command-line parsing code for the new x86 setup code H. Peter Anvin
[not found] ` <bf3e29f3d8c12230b38cae29ef5b476267d40cd1.1184032749.git.hpa@zytor.com>
2007-07-10 2:51 ` [x86 setup 20/33] Console-writing " H. Peter Anvin
2007-07-10 18:35 ` Jan Engelhardt
2007-07-10 18:48 ` H. Peter Anvin
[not found] ` <b4eed00df1889f94e8799ca6c0ce081bc5140688.1184032749.git.hpa@zytor.com>
2007-07-10 2:52 ` [x86 setup 21/33] Version string " H. Peter Anvin
[not found] ` <f1626ee0c265de9c41725f61eaee8a9017d8c8ff.1184032749.git.hpa@zytor.com>
2007-07-10 2:52 ` [x86 setup 22/33] CPU features verification " H. Peter Anvin
2007-07-10 7:37 ` Sébastien Dugué
[not found] ` <b577403d806edfbb1c17ecfec94971fc757a066c.1184032749.git.hpa@zytor.com>
2007-07-10 2:52 ` [x86 setup 23/33] EDD probing code " H. Peter Anvin
[not found] ` <77f7b2e92bb1de0f9d423b6537b8156296bcf931.1184032749.git.hpa@zytor.com>
2007-07-10 2:52 ` [x86 setup 24/33] MCA support for " H. Peter Anvin
[not found] ` <75642968817648a7816a4782f76138e4f608f1ab.1184032749.git.hpa@zytor.com>
2007-07-10 2:52 ` [x86 setup 25/33] Memory probing support for the " H. Peter Anvin
[not found] ` <dd2fade47882935c137f6d2a3c955eac1f6f8ecf.1184032749.git.hpa@zytor.com>
2007-07-10 2:52 ` [x86 setup 26/33] Voyager " H. Peter Anvin
[not found] ` <f8afa57a4934b75080449e8dd3a23d178be77a41.1184032749.git.hpa@zytor.com>
2007-07-10 2:52 ` [x86 setup 27/33] Video mode probing " H. Peter Anvin
[not found] ` <ae628cbaed0874c2c552ddbd77d61340438f9820.1184032749.git.hpa@zytor.com>
2007-07-10 2:52 ` [x86 setup 28/33] Code for actual protected-mode entry H. Peter Anvin
[not found] ` <26d4ebeefed3e0b1593d4fa2357db6912ee944cb.1184032749.git.hpa@zytor.com>
2007-07-10 2:52 ` [x86 setup 29/33] Assembly header and main routine for new x86 setup code H. Peter Anvin
[not found] ` <fd5cf379a91de82890893de655876e39e78c1dc9.1184032749.git.hpa@zytor.com>
2007-07-10 2:52 ` [x86 setup 30/33] Linker script for the " H. Peter Anvin
[not found] ` <842bbe280e87886e7a1b187434841c7f7334244c.1184032749.git.hpa@zytor.com>
2007-07-10 2:52 ` [x86 setup 31/33] Use the new x86 setup code for i386 H. Peter Anvin
2007-07-10 7:55 ` Tilman Schmidt
[not found] ` <0daaab19675363b0c9126a9b98a8325883bbcfea.1184032749.git.hpa@zytor.com>
2007-07-10 2:52 ` [x86 setup 32/33] Use the new x86 setup code for x86-64; unify with i386 H. Peter Anvin
[not found] ` <51664bcb2a5a2f1fe130229d34128a642dc81a4c.1184032749.git.hpa@zytor.com>
2007-07-10 2:52 ` [x86 setup 33/33] Remove old i386 setup code H. Peter Anvin
2007-07-10 4:24 ` x86 setup code rewrite in C Yinghai Lu
2007-07-10 4:39 ` H. Peter Anvin
2007-07-10 5:25 ` Jeff Garzik
2007-07-10 16:24 ` Jeremy Fitzhardinge
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=11840366692770-git-send-email-hpa@zytor.com \
--to=hpa@zytor.com \
--cc=akpm@linux-foundation.org \
--cc=andi@firstfloor.org \
--cc=linux-arch@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=venkatesh.pallipadi@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).