Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 102bbe3a authored by Yinghai Lu's avatar Yinghai Lu Committed by Ingo Molnar
Browse files

x86: cpu/common*.c, merge identify_cpu()



Signed-off-by: default avatarYinghai Lu <yhlu.kernel@gmail.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent b89d3b3e
Loading
Loading
Loading
Loading
+60 −29
Original line number Original line Diff line number Diff line
@@ -104,34 +104,6 @@ static int __init cachesize_setup(char *str)
}
}
__setup("cachesize=", cachesize_setup);
__setup("cachesize=", cachesize_setup);


/*
 * Naming convention should be: <Name> [(<Codename>)]
 * This table only is used unless init_<vendor>() below doesn't set it;
 * in particular, if CPUID levels 0x80000002..4 are supported, this isn't used
 *
 */

/* Look up CPU names by table lookup. */
static char __cpuinit *table_lookup_model(struct cpuinfo_x86 *c)
{
	struct cpu_model_info *info;

	if (c->x86_model >= 16)
		return NULL;	/* Range check */

	if (!this_cpu)
		return NULL;

	info = this_cpu->c_models;

	while (info && info->family) {
		if (info->family == c->x86)
			return info->model_names[c->x86_model];
		info++;
	}
	return NULL;		/* Not found */
}

static int __init x86_fxsr_setup(char *s)
static int __init x86_fxsr_setup(char *s)
{
{
	setup_clear_cpu_cap(X86_FEATURE_FXSR);
	setup_clear_cpu_cap(X86_FEATURE_FXSR);
@@ -197,13 +169,48 @@ static int __init x86_serial_nr_setup(char *s)
}
}
__setup("serialnumber", x86_serial_nr_setup);
__setup("serialnumber", x86_serial_nr_setup);
#else
#else
static inline int flag_is_changeable_p(u32 flag)
{
	return 1;
}
/* Probe for the CPUID instruction */
/* Probe for the CPUID instruction */
static inline int have_cpuid_p(void)
static inline int have_cpuid_p(void)
{
{
	return 1;
	return 1;
}
}
static inline void squash_the_stupid_serial_number(struct cpuinfo_x86 *c)
{
}
#endif
#endif


/*
 * Naming convention should be: <Name> [(<Codename>)]
 * This table only is used unless init_<vendor>() below doesn't set it;
 * in particular, if CPUID levels 0x80000002..4 are supported, this isn't used
 *
 */

/* Look up CPU names by table lookup. */
static char __cpuinit *table_lookup_model(struct cpuinfo_x86 *c)
{
	struct cpu_model_info *info;

	if (c->x86_model >= 16)
		return NULL;	/* Range check */

	if (!this_cpu)
		return NULL;

	info = this_cpu->c_models;

	while (info && info->family) {
		if (info->family == c->x86)
			return info->model_names[c->x86_model];
		info++;
	}
	return NULL;		/* Not found */
}

__u32 cleared_cpu_caps[NCAPINTS] __cpuinitdata;
__u32 cleared_cpu_caps[NCAPINTS] __cpuinitdata;


/* Current gdt points %fs at the "master" per-cpu area: after this,
/* Current gdt points %fs at the "master" per-cpu area: after this,
@@ -620,12 +627,18 @@ static void __cpuinit identify_cpu(struct cpuinfo_x86 *c)
	c->loops_per_jiffy = loops_per_jiffy;
	c->loops_per_jiffy = loops_per_jiffy;
	c->x86_cache_size = -1;
	c->x86_cache_size = -1;
	c->x86_vendor = X86_VENDOR_UNKNOWN;
	c->x86_vendor = X86_VENDOR_UNKNOWN;
	c->cpuid_level = -1;	/* CPUID not detected */
	c->x86_model = c->x86_mask = 0;	/* So far unknown... */
	c->x86_model = c->x86_mask = 0;	/* So far unknown... */
	c->x86_vendor_id[0] = '\0'; /* Unset */
	c->x86_vendor_id[0] = '\0'; /* Unset */
	c->x86_model_id[0] = '\0';  /* Unset */
	c->x86_model_id[0] = '\0';  /* Unset */
	c->x86_max_cores = 1;
	c->x86_max_cores = 1;
#ifdef CONFIG_X86_64
	c->x86_coreid_bits = 0;
	c->x86_clflush_size = 64;
#else
	c->cpuid_level = -1;	/* CPUID not detected */
	c->x86_clflush_size = 32;
	c->x86_clflush_size = 32;
#endif
	c->x86_cache_alignment = c->x86_clflush_size;
	memset(&c->x86_capability, 0, sizeof c->x86_capability);
	memset(&c->x86_capability, 0, sizeof c->x86_capability);


	if (!have_cpuid_p()) {
	if (!have_cpuid_p()) {
@@ -644,6 +657,10 @@ static void __cpuinit identify_cpu(struct cpuinfo_x86 *c)
	if (this_cpu->c_identify)
	if (this_cpu->c_identify)
		this_cpu->c_identify(c);
		this_cpu->c_identify(c);


#ifdef CONFIG_X86_64
	c->apicid = phys_pkg_id(0);
#endif

	/*
	/*
	 * Vendor-specific initialization.  In this section we
	 * Vendor-specific initialization.  In this section we
	 * canonicalize the feature flags, meaning if there are
	 * canonicalize the feature flags, meaning if there are
@@ -677,6 +694,10 @@ static void __cpuinit identify_cpu(struct cpuinfo_x86 *c)
				c->x86, c->x86_model);
				c->x86, c->x86_model);
	}
	}


#ifdef CONFIG_X86_64
	detect_ht(c);
#endif

	/*
	/*
	 * On SMP, boot_cpu_data holds the common feature set between
	 * On SMP, boot_cpu_data holds the common feature set between
	 * all CPUs; so make sure that we indicate which features are
	 * all CPUs; so make sure that we indicate which features are
@@ -693,24 +714,34 @@ static void __cpuinit identify_cpu(struct cpuinfo_x86 *c)
	for (i = 0; i < NCAPINTS; i++)
	for (i = 0; i < NCAPINTS; i++)
		c->x86_capability[i] &= ~cleared_cpu_caps[i];
		c->x86_capability[i] &= ~cleared_cpu_caps[i];


#ifdef CONFIG_X86_MCE
	/* Init Machine Check Exception if available. */
	/* Init Machine Check Exception if available. */
	mcheck_init(c);
	mcheck_init(c);
#endif


	select_idle_routine(c);
	select_idle_routine(c);

#if defined(CONFIG_NUMA) && defined(CONFIG_X86_64)
	numa_add_cpu(smp_processor_id());
#endif
}
}


void __init identify_boot_cpu(void)
void __init identify_boot_cpu(void)
{
{
	identify_cpu(&boot_cpu_data);
	identify_cpu(&boot_cpu_data);
#ifdef CONFIG_X86_32
	sysenter_setup();
	sysenter_setup();
	enable_sep_cpu();
	enable_sep_cpu();
#endif
}
}


void __cpuinit identify_secondary_cpu(struct cpuinfo_x86 *c)
void __cpuinit identify_secondary_cpu(struct cpuinfo_x86 *c)
{
{
	BUG_ON(c == &boot_cpu_data);
	BUG_ON(c == &boot_cpu_data);
	identify_cpu(c);
	identify_cpu(c);
#ifdef CONFIG_X86_32
	enable_sep_cpu();
	enable_sep_cpu();
#endif
	mtrr_ap_init();
	mtrr_ap_init();
}
}


+87 −29
Original line number Original line Diff line number Diff line
@@ -103,34 +103,6 @@ static int __init cachesize_setup(char *str)
}
}
__setup("cachesize=", cachesize_setup);
__setup("cachesize=", cachesize_setup);


/*
 * Naming convention should be: <Name> [(<Codename>)]
 * This table only is used unless init_<vendor>() below doesn't set it;
 * in particular, if CPUID levels 0x80000002..4 are supported, this isn't used
 *
 */

/* Look up CPU names by table lookup. */
static char __cpuinit *table_lookup_model(struct cpuinfo_x86 *c)
{
	struct cpu_model_info *info;

	if (c->x86_model >= 16)
		return NULL;	/* Range check */

	if (!this_cpu)
		return NULL;

	info = this_cpu->c_models;

	while (info && info->family) {
		if (info->family == c->x86)
			return info->model_names[c->x86_model];
		info++;
	}
	return NULL;		/* Not found */
}

static int __init x86_fxsr_setup(char *s)
static int __init x86_fxsr_setup(char *s)
{
{
	setup_clear_cpu_cap(X86_FEATURE_FXSR);
	setup_clear_cpu_cap(X86_FEATURE_FXSR);
@@ -196,13 +168,48 @@ static int __init x86_serial_nr_setup(char *s)
}
}
__setup("serialnumber", x86_serial_nr_setup);
__setup("serialnumber", x86_serial_nr_setup);
#else
#else
static inline int flag_is_changeable_p(u32 flag)
{
	return 1;
}
/* Probe for the CPUID instruction */
/* Probe for the CPUID instruction */
static inline int have_cpuid_p(void)
static inline int have_cpuid_p(void)
{
{
	return 1;
	return 1;
}
}
static inline void squash_the_stupid_serial_number(struct cpuinfo_x86 *c)
{
}
#endif
#endif


/*
 * Naming convention should be: <Name> [(<Codename>)]
 * This table only is used unless init_<vendor>() below doesn't set it;
 * in particular, if CPUID levels 0x80000002..4 are supported, this isn't used
 *
 */

/* Look up CPU names by table lookup. */
static char __cpuinit *table_lookup_model(struct cpuinfo_x86 *c)
{
	struct cpu_model_info *info;

	if (c->x86_model >= 16)
		return NULL;	/* Range check */

	if (!this_cpu)
		return NULL;

	info = this_cpu->c_models;

	while (info && info->family) {
		if (info->family == c->x86)
			return info->model_names[c->x86_model];
		info++;
	}
	return NULL;		/* Not found */
}

__u32 cleared_cpu_caps[NCAPINTS] __cpuinitdata;
__u32 cleared_cpu_caps[NCAPINTS] __cpuinitdata;


/* Current gdt points %fs at the "master" per-cpu area: after this,
/* Current gdt points %fs at the "master" per-cpu area: after this,
@@ -628,14 +635,35 @@ static void __cpuinit identify_cpu(struct cpuinfo_x86 *c)
	c->x86_vendor_id[0] = '\0'; /* Unset */
	c->x86_vendor_id[0] = '\0'; /* Unset */
	c->x86_model_id[0] = '\0';  /* Unset */
	c->x86_model_id[0] = '\0';  /* Unset */
	c->x86_max_cores = 1;
	c->x86_max_cores = 1;
#ifdef CONFIG_X86_64
	c->x86_coreid_bits = 0;
	c->x86_coreid_bits = 0;
	c->x86_clflush_size = 64;
	c->x86_clflush_size = 64;
#else
	c->cpuid_level = -1;	/* CPUID not detected */
	c->x86_clflush_size = 32;
#endif
	c->x86_cache_alignment = c->x86_clflush_size;
	c->x86_cache_alignment = c->x86_clflush_size;
	memset(&c->x86_capability, 0, sizeof c->x86_capability);
	memset(&c->x86_capability, 0, sizeof c->x86_capability);


	if (!have_cpuid_p()) {
		/*
		 * First of all, decide if this is a 486 or higher
		 * It's a 486 if we can modify the AC flag
		 */
		if (flag_is_changeable_p(X86_EFLAGS_AC))
			c->x86 = 4;
		else
			c->x86 = 3;
	}

	generic_identify(c);
	generic_identify(c);


	if (this_cpu->c_identify)
		this_cpu->c_identify(c);

#ifdef CONFIG_X86_64
	c->apicid = phys_pkg_id(0);
	c->apicid = phys_pkg_id(0);
#endif


	/*
	/*
	 * Vendor-specific initialization.  In this section we
	 * Vendor-specific initialization.  In this section we
@@ -650,7 +678,29 @@ static void __cpuinit identify_cpu(struct cpuinfo_x86 *c)
	if (this_cpu->c_init)
	if (this_cpu->c_init)
		this_cpu->c_init(c);
		this_cpu->c_init(c);


	/* Disable the PN if appropriate */
	squash_the_stupid_serial_number(c);

	/*
	 * The vendor-specific functions might have changed features.  Now
	 * we do "generic changes."
	 */

	/* If the model name is still unset, do table lookup. */
	if (!c->x86_model_id[0]) {
		char *p;
		p = table_lookup_model(c);
		if (p)
			strcpy(c->x86_model_id, p);
		else
			/* Last resort... */
			sprintf(c->x86_model_id, "%02x/%02x",
				c->x86, c->x86_model);
	}

#ifdef CONFIG_X86_64
	detect_ht(c);
	detect_ht(c);
#endif


	/*
	/*
	 * On SMP, boot_cpu_data holds the common feature set between
	 * On SMP, boot_cpu_data holds the common feature set between
@@ -669,11 +719,12 @@ static void __cpuinit identify_cpu(struct cpuinfo_x86 *c)
		c->x86_capability[i] &= ~cleared_cpu_caps[i];
		c->x86_capability[i] &= ~cleared_cpu_caps[i];


#ifdef CONFIG_X86_MCE
#ifdef CONFIG_X86_MCE
	/* Init Machine Check Exception if available. */
	mcheck_init(c);
	mcheck_init(c);
#endif
#endif
	select_idle_routine(c);
	select_idle_routine(c);


#ifdef CONFIG_NUMA
#if defined(CONFIG_NUMA) && defined(CONFIG_X86_64)
	numa_add_cpu(smp_processor_id());
	numa_add_cpu(smp_processor_id());
#endif
#endif


@@ -682,12 +733,19 @@ static void __cpuinit identify_cpu(struct cpuinfo_x86 *c)
void __init identify_boot_cpu(void)
void __init identify_boot_cpu(void)
{
{
	identify_cpu(&boot_cpu_data);
	identify_cpu(&boot_cpu_data);
#ifdef CONFIG_X86_32
	sysenter_setup();
	enable_sep_cpu();
#endif
}
}


void __cpuinit identify_secondary_cpu(struct cpuinfo_x86 *c)
void __cpuinit identify_secondary_cpu(struct cpuinfo_x86 *c)
{
{
	BUG_ON(c == &boot_cpu_data);
	BUG_ON(c == &boot_cpu_data);
	identify_cpu(c);
	identify_cpu(c);
#ifdef CONFIG_X86_32
	enable_sep_cpu();
#endif
	mtrr_ap_init();
	mtrr_ap_init();
}
}