diff options
Diffstat (limited to 'arch/x86/kernel')
| -rw-r--r-- | arch/x86/kernel/acpi/processor.c | 3 | ||||
| -rw-r--r-- | arch/x86/kernel/amd_iommu.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/amd_iommu_init.c | 24 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c | 23 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/cpufreq/longhaul.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/cpufreq/powernow-k8.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/cpufreq/speedstep-ich.c | 19 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/mtrr/cleanup.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/microcode_amd.c | 6 | ||||
| -rw-r--r-- | arch/x86/kernel/pci-dma.c | 6 | ||||
| -rw-r--r-- | arch/x86/kernel/process_64.c | 5 | ||||
| -rw-r--r-- | arch/x86/kernel/reboot.c | 8 | ||||
| -rw-r--r-- | arch/x86/kernel/setup.c | 7 | 
13 files changed, 82 insertions, 27 deletions
diff --git a/arch/x86/kernel/acpi/processor.c b/arch/x86/kernel/acpi/processor.c index d296f4a195c..d85d1b2432b 100644 --- a/arch/x86/kernel/acpi/processor.c +++ b/arch/x86/kernel/acpi/processor.c @@ -79,7 +79,8 @@ void arch_acpi_processor_init_pdc(struct acpi_processor *pr)  	struct cpuinfo_x86 *c = &cpu_data(pr->id);  	pr->pdc = NULL; -	if (c->x86_vendor == X86_VENDOR_INTEL) +	if (c->x86_vendor == X86_VENDOR_INTEL || +	    c->x86_vendor == X86_VENDOR_CENTAUR)  		init_intel_pdc(pr, c);  	return; diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c index 98f230f6a28..0285521e0a9 100644 --- a/arch/x86/kernel/amd_iommu.c +++ b/arch/x86/kernel/amd_iommu.c @@ -1220,6 +1220,8 @@ static void __detach_device(struct protection_domain *domain, u16 devid)  	amd_iommu_dev_table[devid].data[1] = 0;  	amd_iommu_dev_table[devid].data[2] = 0; +	amd_iommu_apply_erratum_63(devid); +  	/* decrease reference counter */  	domain->dev_cnt -= 1; diff --git a/arch/x86/kernel/amd_iommu_init.c b/arch/x86/kernel/amd_iommu_init.c index b4b61d462dc..c20001e4f55 100644 --- a/arch/x86/kernel/amd_iommu_init.c +++ b/arch/x86/kernel/amd_iommu_init.c @@ -240,7 +240,7 @@ static void iommu_feature_enable(struct amd_iommu *iommu, u8 bit)  	writel(ctrl, iommu->mmio_base + MMIO_CONTROL_OFFSET);  } -static void __init iommu_feature_disable(struct amd_iommu *iommu, u8 bit) +static void iommu_feature_disable(struct amd_iommu *iommu, u8 bit)  {  	u32 ctrl; @@ -519,6 +519,26 @@ static void set_dev_entry_bit(u16 devid, u8 bit)  	amd_iommu_dev_table[devid].data[i] |= (1 << _bit);  } +static int get_dev_entry_bit(u16 devid, u8 bit) +{ +	int i = (bit >> 5) & 0x07; +	int _bit = bit & 0x1f; + +	return (amd_iommu_dev_table[devid].data[i] & (1 << _bit)) >> _bit; +} + + +void amd_iommu_apply_erratum_63(u16 devid) +{ +	int sysmgt; + +	sysmgt = get_dev_entry_bit(devid, DEV_ENTRY_SYSMGT1) | +		 (get_dev_entry_bit(devid, DEV_ENTRY_SYSMGT2) << 1); + +	if (sysmgt == 0x01) +		set_dev_entry_bit(devid, DEV_ENTRY_IW); +} +  /* Writes the specific IOMMU for a device into the rlookup table */  static void __init set_iommu_for_device(struct amd_iommu *iommu, u16 devid)  { @@ -547,6 +567,8 @@ static void __init set_dev_entry_from_acpi(struct amd_iommu *iommu,  	if (flags & ACPI_DEVFLAG_LINT1)  		set_dev_entry_bit(devid, DEV_ENTRY_LINT1_PASS); +	amd_iommu_apply_erratum_63(devid); +  	set_iommu_for_device(iommu, devid);  } diff --git a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c index 7d5c3b0ea8d..8b581d3905c 100644 --- a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c +++ b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c @@ -526,15 +526,21 @@ static const struct dmi_system_id sw_any_bug_dmi_table[] = {  static int acpi_cpufreq_blacklist(struct cpuinfo_x86 *c)  { -	/* http://www.intel.com/Assets/PDF/specupdate/314554.pdf +	/* Intel Xeon Processor 7100 Series Specification Update +	 * http://www.intel.com/Assets/PDF/specupdate/314554.pdf  	 * AL30: A Machine Check Exception (MCE) Occurring during an  	 * Enhanced Intel SpeedStep Technology Ratio Change May Cause -	 * Both Processor Cores to Lock Up when HT is enabled*/ +	 * Both Processor Cores to Lock Up. */  	if (c->x86_vendor == X86_VENDOR_INTEL) {  		if ((c->x86 == 15) &&  		    (c->x86_model == 6) && -		    (c->x86_mask == 8) && smt_capable()) +		    (c->x86_mask == 8)) { +			printk(KERN_INFO "acpi-cpufreq: Intel(R) " +			    "Xeon(R) 7100 Errata AL30, processors may " +			    "lock up on frequency changes: disabling " +			    "acpi-cpufreq.\n");  			return -ENODEV; +		    }  		}  	return 0;  } @@ -549,13 +555,18 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)  	unsigned int result = 0;  	struct cpuinfo_x86 *c = &cpu_data(policy->cpu);  	struct acpi_processor_performance *perf; +#ifdef CONFIG_SMP +	static int blacklisted; +#endif  	dprintk("acpi_cpufreq_cpu_init\n");  #ifdef CONFIG_SMP -	result = acpi_cpufreq_blacklist(c); -	if (result) -		return result; +	if (blacklisted) +		return blacklisted; +	blacklisted = acpi_cpufreq_blacklist(c); +	if (blacklisted) +		return blacklisted;  #endif  	data = kzalloc(sizeof(struct acpi_cpufreq_data), GFP_KERNEL); diff --git a/arch/x86/kernel/cpu/cpufreq/longhaul.c b/arch/x86/kernel/cpu/cpufreq/longhaul.c index ce2ed3e4aad..cabd2fa3fc9 100644 --- a/arch/x86/kernel/cpu/cpufreq/longhaul.c +++ b/arch/x86/kernel/cpu/cpufreq/longhaul.c @@ -813,7 +813,7 @@ static int __init longhaul_cpu_init(struct cpufreq_policy *policy)  			memcpy(eblcr, samuel2_eblcr, sizeof(samuel2_eblcr));  			break;  		case 1 ... 15: -			longhaul_version = TYPE_LONGHAUL_V1; +			longhaul_version = TYPE_LONGHAUL_V2;  			if (c->x86_mask < 8) {  				cpu_model = CPU_SAMUEL2;  				cpuname = "C3 'Samuel 2' [C5B]"; diff --git a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c index 6394aa5c798..3f12dabeab5 100644 --- a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c +++ b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c @@ -1022,7 +1022,7 @@ static int get_transition_latency(struct powernow_k8_data *data)  		 * set it to 1 to avoid problems in the future.  		 * For all others it's a BIOS bug.  		 */ -		if (!boot_cpu_data.x86 == 0x11) +		if (boot_cpu_data.x86 != 0x11)  			printk(KERN_ERR FW_WARN PFX "Invalid zero transition "  				"latency\n");  		max_latency = 1; diff --git a/arch/x86/kernel/cpu/cpufreq/speedstep-ich.c b/arch/x86/kernel/cpu/cpufreq/speedstep-ich.c index 6911e91fb4f..3ae5a7a3a50 100644 --- a/arch/x86/kernel/cpu/cpufreq/speedstep-ich.c +++ b/arch/x86/kernel/cpu/cpufreq/speedstep-ich.c @@ -232,28 +232,23 @@ static unsigned int speedstep_detect_chipset(void)  	return 0;  } -struct get_freq_data { -	unsigned int speed; -	unsigned int processor; -}; - -static void get_freq_data(void *_data) +static void get_freq_data(void *_speed)  { -	struct get_freq_data *data = _data; +	unsigned int *speed = _speed; -	data->speed = speedstep_get_frequency(data->processor); +	*speed = speedstep_get_frequency(speedstep_processor);  }  static unsigned int speedstep_get(unsigned int cpu)  { -	struct get_freq_data data = { .processor = cpu }; +	unsigned int speed;  	/* You're supposed to ensure CPU is online. */ -	if (smp_call_function_single(cpu, get_freq_data, &data, 1) != 0) +	if (smp_call_function_single(cpu, get_freq_data, &speed, 1) != 0)  		BUG(); -	dprintk("detected %u kHz as current frequency\n", data.speed); -	return data.speed; +	dprintk("detected %u kHz as current frequency\n", speed); +	return speed;  }  /** diff --git a/arch/x86/kernel/cpu/mtrr/cleanup.c b/arch/x86/kernel/cpu/mtrr/cleanup.c index 315738c74aa..73c86db5acb 100644 --- a/arch/x86/kernel/cpu/mtrr/cleanup.c +++ b/arch/x86/kernel/cpu/mtrr/cleanup.c @@ -846,7 +846,7 @@ int __init mtrr_cleanup(unsigned address_bits)  	sort(range, nr_range, sizeof(struct res_range), cmp_range, NULL);  	range_sums = sum_ranges(range, nr_range); -	printk(KERN_INFO "total RAM coverred: %ldM\n", +	printk(KERN_INFO "total RAM covered: %ldM\n",  	       range_sums >> (20 - PAGE_SHIFT));  	if (mtrr_chunk_size && mtrr_gran_size) { diff --git a/arch/x86/kernel/microcode_amd.c b/arch/x86/kernel/microcode_amd.c index 366baa17991..f4c538b681c 100644 --- a/arch/x86/kernel/microcode_amd.c +++ b/arch/x86/kernel/microcode_amd.c @@ -317,6 +317,12 @@ static enum ucode_state request_microcode_fw(int cpu, struct device *device)  		return UCODE_NFOUND;  	} +	if (*(u32 *)firmware->data != UCODE_MAGIC) { +		printk(KERN_ERR "microcode: invalid UCODE_MAGIC (0x%08x)\n", +		       *(u32 *)firmware->data); +		return UCODE_ERROR; +	} +  	ret = generic_load_microcode(cpu, firmware->data, firmware->size);  	release_firmware(firmware); diff --git a/arch/x86/kernel/pci-dma.c b/arch/x86/kernel/pci-dma.c index b2a71dca564..a6e804d16c3 100644 --- a/arch/x86/kernel/pci-dma.c +++ b/arch/x86/kernel/pci-dma.c @@ -45,12 +45,10 @@ int iommu_pass_through __read_mostly;  dma_addr_t bad_dma_address __read_mostly = 0;  EXPORT_SYMBOL(bad_dma_address); -/* Dummy device used for NULL arguments (normally ISA). Better would -   be probably a smaller DMA mask, but this is bug-to-bug compatible -   to older i386. */ +/* Dummy device used for NULL arguments (normally ISA). */  struct device x86_dma_fallback_dev = {  	.init_name = "fallback device", -	.coherent_dma_mask = DMA_BIT_MASK(32), +	.coherent_dma_mask = ISA_DMA_BIT_MASK,  	.dma_mask = &x86_dma_fallback_dev.coherent_dma_mask,  };  EXPORT_SYMBOL(x86_dma_fallback_dev); diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c index ad535b68317..eb62cbcaa49 100644 --- a/arch/x86/kernel/process_64.c +++ b/arch/x86/kernel/process_64.c @@ -664,3 +664,8 @@ long sys_arch_prctl(int code, unsigned long addr)  	return do_arch_prctl(current, code, addr);  } +unsigned long KSTK_ESP(struct task_struct *task) +{ +	return (test_tsk_thread_flag(task, TIF_IA32)) ? +			(task_pt_regs(task)->sp) : ((task)->thread.usersp); +} diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c index a1a3cdda06e..f93078746e0 100644 --- a/arch/x86/kernel/reboot.c +++ b/arch/x86/kernel/reboot.c @@ -436,6 +436,14 @@ static struct dmi_system_id __initdata pci_reboot_dmi_table[] = {  			DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro5"),  		},  	}, +	{	/* Handle problems with rebooting on Apple Macmini3,1 */ +		.callback = set_pci_reboot, +		.ident = "Apple Macmini3,1", +		.matches = { +			DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), +			DMI_MATCH(DMI_PRODUCT_NAME, "Macmini3,1"), +		}, +	},  	{ }  }; diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index e09f0e2c14b..2a34f9c5be2 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c @@ -660,6 +660,13 @@ static struct dmi_system_id __initdata bad_bios_dmi_table[] = {  		},  	},  	{ +		.callback = dmi_low_memory_corruption, +		.ident = "Phoenix/MSC BIOS", +		.matches = { +			DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix/MSC"), +		}, +	}, +	{  	/*  	 * AMI BIOS with low memory corruption was found on Intel DG45ID board.  	 * It hase different DMI_BIOS_VENDOR = "Intel Corp.", for now we will  |