Commit bc20aa48bb
("x86, intel-mid:
Add Merrifield platform support") added new instances of __cpuinit
usage. We removed this a couple versions ago; we now want to remove
the compat no-op stubs. Introducing new users is not what we want to
see at this point in time, as it will break once the stubs are gone.
This also fixes an out of sync __init vs. __cpuinit -- as the former
is real, and the latter is a no-op; hence it would have been a section
mismatch.
Cc: Fei Yang <fei.yang@intel.com>
Cc: H. Peter Anvin <hpa@linux.intel.com>
Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
Acked-by: David Cohen <david.a.cohen@linux.intel.com>
Link: http://lkml.kernel.org/r/1390412125-19439-1-git-send-email-paul.gortmaker@windriver.com
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
104 lines
2.4 KiB
C
104 lines
2.4 KiB
C
/*
|
|
* mrfl.c: Intel Merrifield platform specific setup code
|
|
*
|
|
* (C) Copyright 2013 Intel Corporation
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; version 2
|
|
* of the License.
|
|
*/
|
|
|
|
#include <linux/init.h>
|
|
|
|
#include <asm/apic.h>
|
|
#include <asm/intel-mid.h>
|
|
|
|
#include "intel_mid_weak_decls.h"
|
|
|
|
static unsigned long __init tangier_calibrate_tsc(void)
|
|
{
|
|
unsigned long fast_calibrate;
|
|
u32 lo, hi, ratio, fsb, bus_freq;
|
|
|
|
/* *********************** */
|
|
/* Compute TSC:Ratio * FSB */
|
|
/* *********************** */
|
|
|
|
/* Compute Ratio */
|
|
rdmsr(MSR_PLATFORM_INFO, lo, hi);
|
|
pr_debug("IA32 PLATFORM_INFO is 0x%x : %x\n", hi, lo);
|
|
|
|
ratio = (lo >> 8) & 0xFF;
|
|
pr_debug("ratio is %d\n", ratio);
|
|
if (!ratio) {
|
|
pr_err("Read a zero ratio, force tsc ratio to 4 ...\n");
|
|
ratio = 4;
|
|
}
|
|
|
|
/* Compute FSB */
|
|
rdmsr(MSR_FSB_FREQ, lo, hi);
|
|
pr_debug("Actual FSB frequency detected by SOC 0x%x : %x\n",
|
|
hi, lo);
|
|
|
|
bus_freq = lo & 0x7;
|
|
pr_debug("bus_freq = 0x%x\n", bus_freq);
|
|
|
|
if (bus_freq == 0)
|
|
fsb = FSB_FREQ_100SKU;
|
|
else if (bus_freq == 1)
|
|
fsb = FSB_FREQ_100SKU;
|
|
else if (bus_freq == 2)
|
|
fsb = FSB_FREQ_133SKU;
|
|
else if (bus_freq == 3)
|
|
fsb = FSB_FREQ_167SKU;
|
|
else if (bus_freq == 4)
|
|
fsb = FSB_FREQ_83SKU;
|
|
else if (bus_freq == 5)
|
|
fsb = FSB_FREQ_400SKU;
|
|
else if (bus_freq == 6)
|
|
fsb = FSB_FREQ_267SKU;
|
|
else if (bus_freq == 7)
|
|
fsb = FSB_FREQ_333SKU;
|
|
else {
|
|
BUG();
|
|
pr_err("Invalid bus_freq! Setting to minimal value!\n");
|
|
fsb = FSB_FREQ_100SKU;
|
|
}
|
|
|
|
/* TSC = FSB Freq * Resolved HFM Ratio */
|
|
fast_calibrate = ratio * fsb;
|
|
pr_debug("calculate tangier tsc %lu KHz\n", fast_calibrate);
|
|
|
|
/* ************************************ */
|
|
/* Calculate Local APIC Timer Frequency */
|
|
/* ************************************ */
|
|
lapic_timer_frequency = (fsb * 1000) / HZ;
|
|
|
|
pr_debug("Setting lapic_timer_frequency = %d\n",
|
|
lapic_timer_frequency);
|
|
|
|
/* mark tsc clocksource as reliable */
|
|
set_cpu_cap(&boot_cpu_data, X86_FEATURE_TSC_RELIABLE);
|
|
|
|
if (fast_calibrate)
|
|
return fast_calibrate;
|
|
|
|
return 0;
|
|
}
|
|
|
|
static void __init tangier_arch_setup(void)
|
|
{
|
|
x86_platform.calibrate_tsc = tangier_calibrate_tsc;
|
|
}
|
|
|
|
/* tangier arch ops */
|
|
static struct intel_mid_ops tangier_ops = {
|
|
.arch_setup = tangier_arch_setup,
|
|
};
|
|
|
|
void *get_tangier_ops()
|
|
{
|
|
return &tangier_ops;
|
|
}
|