|
@@ -36,7 +36,8 @@ DECLARE_GLOBAL_DATA_PTR;
|
|
struct freq_desc {
|
|
struct freq_desc {
|
|
u8 x86_family; /* CPU family */
|
|
u8 x86_family; /* CPU family */
|
|
u8 x86_model; /* model */
|
|
u8 x86_model; /* model */
|
|
- u8 msr_plat; /* 1: use MSR_PLATFORM_INFO, 0: MSR_IA32_PERF_STATUS */
|
|
|
|
|
|
+ /* 2: use 100MHz, 1: use MSR_PLATFORM_INFO, 0: MSR_IA32_PERF_STATUS */
|
|
|
|
+ u8 msr_plat;
|
|
u32 freqs[MAX_NUM_FREQS];
|
|
u32 freqs[MAX_NUM_FREQS];
|
|
};
|
|
};
|
|
|
|
|
|
@@ -49,6 +50,8 @@ static struct freq_desc freq_desc_tables[] = {
|
|
{ 6, 0x4a, 1, { 0, FREQ_100, FREQ_133, 0, 0, 0, 0, 0 } },
|
|
{ 6, 0x4a, 1, { 0, FREQ_100, FREQ_133, 0, 0, 0, 0, 0 } },
|
|
/* VLV2 */
|
|
/* VLV2 */
|
|
{ 6, 0x37, 1, { FREQ_83, FREQ_100, FREQ_133, FREQ_166, 0, 0, 0, 0 } },
|
|
{ 6, 0x37, 1, { FREQ_83, FREQ_100, FREQ_133, FREQ_166, 0, 0, 0, 0 } },
|
|
|
|
+ /* Ivybridge */
|
|
|
|
+ { 6, 0x3a, 2, { 0, 0, 0, 0, 0, 0, 0, 0 } },
|
|
/* ANN */
|
|
/* ANN */
|
|
{ 6, 0x5a, 1, { FREQ_83, FREQ_100, FREQ_133, FREQ_100, 0, 0, 0, 0 } },
|
|
{ 6, 0x5a, 1, { FREQ_83, FREQ_100, FREQ_133, FREQ_100, 0, 0, 0, 0 } },
|
|
};
|
|
};
|
|
@@ -97,11 +100,18 @@ static unsigned long try_msr_calibrate_tsc(void)
|
|
if (!ratio)
|
|
if (!ratio)
|
|
goto fail;
|
|
goto fail;
|
|
|
|
|
|
- /* Get FSB FREQ ID */
|
|
|
|
- rdmsr(MSR_FSB_FREQ, lo, hi);
|
|
|
|
- freq_id = lo & 0x7;
|
|
|
|
- freq = id_to_freq(cpu_index, freq_id);
|
|
|
|
- debug("Resolved frequency ID: %u, frequency: %u KHz\n", freq_id, freq);
|
|
|
|
|
|
+ if (freq_desc_tables[cpu_index].msr_plat == 2) {
|
|
|
|
+ /* TODO: Figure out how best to deal with this */
|
|
|
|
+ freq = FREQ_100;
|
|
|
|
+ debug("Using frequency: %u KHz\n", freq);
|
|
|
|
+ } else {
|
|
|
|
+ /* Get FSB FREQ ID */
|
|
|
|
+ rdmsr(MSR_FSB_FREQ, lo, hi);
|
|
|
|
+ freq_id = lo & 0x7;
|
|
|
|
+ freq = id_to_freq(cpu_index, freq_id);
|
|
|
|
+ debug("Resolved frequency ID: %u, frequency: %u KHz\n",
|
|
|
|
+ freq_id, freq);
|
|
|
|
+ }
|
|
if (!freq)
|
|
if (!freq)
|
|
goto fail;
|
|
goto fail;
|
|
|
|
|
|
@@ -297,12 +307,12 @@ unsigned __attribute__((no_instrument_function)) long get_tbclk_mhz(void)
|
|
return gd->arch.tsc_mhz;
|
|
return gd->arch.tsc_mhz;
|
|
|
|
|
|
fast_calibrate = try_msr_calibrate_tsc();
|
|
fast_calibrate = try_msr_calibrate_tsc();
|
|
- if (fast_calibrate)
|
|
|
|
- return fast_calibrate;
|
|
|
|
|
|
+ if (!fast_calibrate) {
|
|
|
|
|
|
- fast_calibrate = quick_pit_calibrate();
|
|
|
|
- if (!fast_calibrate)
|
|
|
|
- panic("TSC frequency is ZERO");
|
|
|
|
|
|
+ fast_calibrate = quick_pit_calibrate();
|
|
|
|
+ if (!fast_calibrate)
|
|
|
|
+ panic("TSC frequency is ZERO");
|
|
|
|
+ }
|
|
|
|
|
|
gd->arch.tsc_mhz = fast_calibrate;
|
|
gd->arch.tsc_mhz = fast_calibrate;
|
|
return fast_calibrate;
|
|
return fast_calibrate;
|