View | Details | Raw Unified | Return to bug 117197
Collapse All | Expand All

(-)x/arch/x86_64/kernel/setup.c.orig (+36 lines)
Lines 76-81 Link Here
76
extern acpi_interrupt_flags	acpi_sci_flags;
76
extern acpi_interrupt_flags	acpi_sci_flags;
77
int __initdata acpi_force = 0;
77
int __initdata acpi_force = 0;
78
#endif
78
#endif
79
#ifdef CONFIG_SMP
80
static int amd_pdc_disable = 0;
81
#endif
79
82
80
int acpi_numa __initdata;
83
int acpi_numa __initdata;
81
84
Lines 366-371 Link Here
366
			iommu_setup(from+6); 
369
			iommu_setup(from+6); 
367
		}
370
		}
368
#endif
371
#endif
372
#ifdef  CONFIG_SMP
373
		if (!memcmp(from, "pdc=off", 6))
374
			amd_pdc_disable = 1;
375
#endif
369
376
370
		if (!memcmp(from,"oops=panic", 10))
377
		if (!memcmp(from,"oops=panic", 10))
371
			panic_on_oops = 1;
378
			panic_on_oops = 1;
Lines 798-803 Link Here
798
#endif
805
#endif
799
}
806
}
800
807
808
static inline void amd_disable_advanced_pdc(void)
809
{
810
	__asm__ __volatile__ (
811
		" movl	 $0x9c5a203a,%%edi   \n" /* msr enable       */
812
		" movl	 $0xC0011023,%%ecx   \n" /* msr addr	     */
813
		" rdmsr			     \n" /* get reg val	     */
814
		" orl	 $0x00000001,%%edx   \n" /* set bit 32	     */
815
		" wrmsr			     \n" /* put it back	     */
816
		" xorl	%%edi, %%edi	     \n" /* clear msr enable */
817
		: /* no outputs */
818
		: /* no inputs, either */
819
		: "%eax","%ecx","%edx","%edi" /* clobbered regs */ );
820
}
821
801
static int __init init_amd(struct cpuinfo_x86 *c)
822
static int __init init_amd(struct cpuinfo_x86 *c)
802
{
823
{
803
	int r;
824
	int r;
Lines 812-817 Link Here
812
	if ((level >= 0x0f48 && level < 0x0f50) || level >= 0x0f58)
833
	if ((level >= 0x0f48 && level < 0x0f50) || level >= 0x0f58)
813
		set_bit(X86_FEATURE_K8_C, &c->x86_capability);
834
		set_bit(X86_FEATURE_K8_C, &c->x86_capability);
814
835
836
#ifdef  CONFIG_SMP
837
	if (amd_pdc_disable) {
838
		int family;
839
840
		family = (level & 0xf00) >> 8;
841
		if (family == 0x0f)
842
			family += (level & 0xff00000) >> 20;
843
844
		if (family == 0x0f || family == 0x10) {
845
			/* printk(KERN_INFO "Disabling advanced PDC\n"); */
846
			amd_disable_advanced_pdc();
847
		}
848
	}
849
#endif
850
815
	r = get_model_name(c);
851
	r = get_model_name(c);
816
	if (!r) { 
852
	if (!r) { 
817
		switch (c->x86) { 
853
		switch (c->x86) { 

Return to bug 117197