From fcd5ace00b333ce31b11b02a2243dfbf39307f10 Mon Sep 17 00:00:00 2001 From: Eric Biederman Date: Thu, 14 Oct 2004 19:29:29 +0000 Subject: - Add new cvs code to cvs git-svn-id: svn://svn.coreboot.org/coreboot/trunk@1657 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1 --- src/cpu/intel/hyperthreading/Config.lb | 1 + src/cpu/intel/hyperthreading/intel_sibling.c | 74 ++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 src/cpu/intel/hyperthreading/Config.lb create mode 100644 src/cpu/intel/hyperthreading/intel_sibling.c (limited to 'src/cpu/intel/hyperthreading') diff --git a/src/cpu/intel/hyperthreading/Config.lb b/src/cpu/intel/hyperthreading/Config.lb new file mode 100644 index 0000000000..dce4044835 --- /dev/null +++ b/src/cpu/intel/hyperthreading/Config.lb @@ -0,0 +1 @@ +object intel_sibling.o diff --git a/src/cpu/intel/hyperthreading/intel_sibling.c b/src/cpu/intel/hyperthreading/intel_sibling.c new file mode 100644 index 0000000000..001fea81b2 --- /dev/null +++ b/src/cpu/intel/hyperthreading/intel_sibling.c @@ -0,0 +1,74 @@ +#include +#include +#include +#include +#include +#include +#include + +static int first_time = 1; +static int disable_siblings = !CONFIG_LOGICAL_CPUS; + +void intel_sibling_init(device_t cpu) +{ + unsigned i, siblings; + struct cpuid_result result; + + /* On the bootstrap processor see if I want sibling cpus enabled */ + if (first_time) { + first_time = 0; + get_option(&disable_siblings, "hyper_threading"); + } + result = cpuid(1); + /* Is hypethreading supported */ + if (!(result.edx & (1 << 28))) { + return; + } + /* See how many sibling cpus we have */ + siblings = (result.ebx >> 16) & 0xff; + if (siblings < 1) { + siblings = 1; + } + +#if 1 + printk_debug("CPU: %u %d siblings\n", + cpu->path.u.apic.apic_id, + siblings); +#endif + + /* See if I am a sibling cpu */ + if (cpu->path.u.apic.apic_id & (siblings -1)) { + if (disable_siblings) { + cpu->enabled = 0; + } + return; + } + + /* I am the primary cpu start up my siblings */ + for(i = 1; i < siblings; i++) { + struct device_path cpu_path; + device_t new; + unsigned long count; + /* Build the cpu device path */ + cpu_path.type = DEVICE_PATH_APIC; + cpu_path.u.apic.apic_id = cpu->path.u.apic.apic_id + i; + + + /* Allocate the new cpu device structure */ + new = alloc_dev(cpu->bus, &cpu_path); + + if (!new) { + continue; + } + +#if 1 + printk_debug("CPU: %u has sibling %u\n", + cpu->path.u.apic.apic_id, + new->path.u.apic.apic_id); +#endif + /* Start the new cpu */ + start_cpu(new); + } + +} + -- cgit v1.2.3