Merge branch 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull x86 arch fixes from Peter Anvin: "Here is a collection of fixes for 3.7-rc7. This is a superset of tglx' earlier pull request." * 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: x86-64: Fix ordering of CFI directives and recent ASM_CLAC additions x86, microcode, AMD: Add support for family 16h processors x86-32: Export kernel_stack_pointer() for modules x86-32: Fix invalid stack address while in softirq x86, efi: Fix processor-specific memcpy() build error x86: remove dummy long from EFI stub x86, mm: Correct vmflag test for checking VM_HUGETLB x86, amd: Disable way access filter on Piledriver CPUs x86/mce: Do not change worker's running cpu in cmci_rediscover(). x86/ce4100: Fix PCI configuration register access for devices without interrupts x86/ce4100: Fix reboot by forcing the reboot method to be KBD x86/ce4100: Fix pm_poweroff MAINTAINERS: Update email address for Robert Richter x86, microcode_amd: Change email addresses, MAINTAINERS entry MAINTAINERS: Change Boris' email address EDAC: Change Boris' email address x86, AMD: Change Boris' email address
This commit is contained in:
14
MAINTAINERS
14
MAINTAINERS
@@ -534,9 +534,9 @@ F: drivers/iommu/amd_iommu*.[ch]
|
|||||||
F: include/linux/amd-iommu.h
|
F: include/linux/amd-iommu.h
|
||||||
|
|
||||||
AMD MICROCODE UPDATE SUPPORT
|
AMD MICROCODE UPDATE SUPPORT
|
||||||
M: Andreas Herrmann <andreas.herrmann3@amd.com>
|
M: Andreas Herrmann <herrmann.der.user@googlemail.com>
|
||||||
L: amd64-microcode@amd64.org
|
L: amd64-microcode@amd64.org
|
||||||
S: Supported
|
S: Maintained
|
||||||
F: arch/x86/kernel/microcode_amd.c
|
F: arch/x86/kernel/microcode_amd.c
|
||||||
|
|
||||||
AMS (Apple Motion Sensor) DRIVER
|
AMS (Apple Motion Sensor) DRIVER
|
||||||
@@ -2716,10 +2716,10 @@ F: include/linux/edac.h
|
|||||||
|
|
||||||
EDAC-AMD64
|
EDAC-AMD64
|
||||||
M: Doug Thompson <dougthompson@xmission.com>
|
M: Doug Thompson <dougthompson@xmission.com>
|
||||||
M: Borislav Petkov <borislav.petkov@amd.com>
|
M: Borislav Petkov <bp@alien8.de>
|
||||||
L: linux-edac@vger.kernel.org
|
L: linux-edac@vger.kernel.org
|
||||||
W: bluesmoke.sourceforge.net
|
W: bluesmoke.sourceforge.net
|
||||||
S: Supported
|
S: Maintained
|
||||||
F: drivers/edac/amd64_edac*
|
F: drivers/edac/amd64_edac*
|
||||||
|
|
||||||
EDAC-E752X
|
EDAC-E752X
|
||||||
@@ -3761,7 +3761,7 @@ S: Maintained
|
|||||||
F: drivers/platform/x86/ideapad-laptop.c
|
F: drivers/platform/x86/ideapad-laptop.c
|
||||||
|
|
||||||
IDE/ATAPI DRIVERS
|
IDE/ATAPI DRIVERS
|
||||||
M: Borislav Petkov <petkovbb@gmail.com>
|
M: Borislav Petkov <bp@alien8.de>
|
||||||
L: linux-ide@vger.kernel.org
|
L: linux-ide@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: Documentation/cdrom/ide-cd
|
F: Documentation/cdrom/ide-cd
|
||||||
@@ -5421,7 +5421,7 @@ S: Maintained
|
|||||||
F: sound/drivers/opl4/
|
F: sound/drivers/opl4/
|
||||||
|
|
||||||
OPROFILE
|
OPROFILE
|
||||||
M: Robert Richter <robert.richter@amd.com>
|
M: Robert Richter <rric@kernel.org>
|
||||||
L: oprofile-list@lists.sf.net
|
L: oprofile-list@lists.sf.net
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/*/include/asm/oprofile*.h
|
F: arch/*/include/asm/oprofile*.h
|
||||||
@@ -8206,7 +8206,7 @@ F: drivers/platform/x86
|
|||||||
|
|
||||||
X86 MCE INFRASTRUCTURE
|
X86 MCE INFRASTRUCTURE
|
||||||
M: Tony Luck <tony.luck@intel.com>
|
M: Tony Luck <tony.luck@intel.com>
|
||||||
M: Borislav Petkov <bp@amd64.org>
|
M: Borislav Petkov <bp@alien8.de>
|
||||||
L: linux-edac@vger.kernel.org
|
L: linux-edac@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/x86/kernel/cpu/mcheck/*
|
F: arch/x86/kernel/cpu/mcheck/*
|
||||||
|
@@ -12,6 +12,8 @@
|
|||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
#include <asm/desc.h>
|
#include <asm/desc.h>
|
||||||
|
|
||||||
|
#undef memcpy /* Use memcpy from misc.c */
|
||||||
|
|
||||||
#include "eboot.h"
|
#include "eboot.h"
|
||||||
|
|
||||||
static efi_system_table_t *sys_table;
|
static efi_system_table_t *sys_table;
|
||||||
|
@@ -476,6 +476,3 @@ die:
|
|||||||
setup_corrupt:
|
setup_corrupt:
|
||||||
.byte 7
|
.byte 7
|
||||||
.string "No setup signature found...\n"
|
.string "No setup signature found...\n"
|
||||||
|
|
||||||
.data
|
|
||||||
dummy: .long 0
|
|
||||||
|
@@ -205,21 +205,14 @@ static inline bool user_64bit_mode(struct pt_regs *regs)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
#ifdef CONFIG_X86_32
|
||||||
* X86_32 CPUs don't save ss and esp if the CPU is already in kernel mode
|
extern unsigned long kernel_stack_pointer(struct pt_regs *regs);
|
||||||
* when it traps. The previous stack will be directly underneath the saved
|
#else
|
||||||
* registers, and 'sp/ss' won't even have been saved. Thus the '®s->sp'.
|
|
||||||
*
|
|
||||||
* This is valid only for kernel mode traps.
|
|
||||||
*/
|
|
||||||
static inline unsigned long kernel_stack_pointer(struct pt_regs *regs)
|
static inline unsigned long kernel_stack_pointer(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_X86_32
|
|
||||||
return (unsigned long)(®s->sp);
|
|
||||||
#else
|
|
||||||
return regs->sp;
|
return regs->sp;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#define GET_IP(regs) ((regs)->ip)
|
#define GET_IP(regs) ((regs)->ip)
|
||||||
#define GET_FP(regs) ((regs)->bp)
|
#define GET_FP(regs) ((regs)->bp)
|
||||||
|
@@ -631,6 +631,20 @@ static void __cpuinit init_amd(struct cpuinfo_x86 *c)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The way access filter has a performance penalty on some workloads.
|
||||||
|
* Disable it on the affected CPUs.
|
||||||
|
*/
|
||||||
|
if ((c->x86 == 0x15) &&
|
||||||
|
(c->x86_model >= 0x02) && (c->x86_model < 0x20)) {
|
||||||
|
u64 val;
|
||||||
|
|
||||||
|
if (!rdmsrl_safe(0xc0011021, &val) && !(val & 0x1E)) {
|
||||||
|
val |= 0x1E;
|
||||||
|
wrmsrl_safe(0xc0011021, val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
cpu_detect_cache_sizes(c);
|
cpu_detect_cache_sizes(c);
|
||||||
|
|
||||||
/* Multi core CPU? */
|
/* Multi core CPU? */
|
||||||
|
@@ -6,7 +6,7 @@
|
|||||||
*
|
*
|
||||||
* Written by Jacob Shin - AMD, Inc.
|
* Written by Jacob Shin - AMD, Inc.
|
||||||
*
|
*
|
||||||
* Support: borislav.petkov@amd.com
|
* Maintained by: Borislav Petkov <bp@alien8.de>
|
||||||
*
|
*
|
||||||
* April 2006
|
* April 2006
|
||||||
* - added support for AMD Family 0x10 processors
|
* - added support for AMD Family 0x10 processors
|
||||||
|
@@ -285,34 +285,39 @@ void cmci_clear(void)
|
|||||||
raw_spin_unlock_irqrestore(&cmci_discover_lock, flags);
|
raw_spin_unlock_irqrestore(&cmci_discover_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static long cmci_rediscover_work_func(void *arg)
|
||||||
|
{
|
||||||
|
int banks;
|
||||||
|
|
||||||
|
/* Recheck banks in case CPUs don't all have the same */
|
||||||
|
if (cmci_supported(&banks))
|
||||||
|
cmci_discover(banks);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* After a CPU went down cycle through all the others and rediscover
|
* After a CPU went down cycle through all the others and rediscover
|
||||||
* Must run in process context.
|
* Must run in process context.
|
||||||
*/
|
*/
|
||||||
void cmci_rediscover(int dying)
|
void cmci_rediscover(int dying)
|
||||||
{
|
{
|
||||||
int banks;
|
int cpu, banks;
|
||||||
int cpu;
|
|
||||||
cpumask_var_t old;
|
|
||||||
|
|
||||||
if (!cmci_supported(&banks))
|
if (!cmci_supported(&banks))
|
||||||
return;
|
return;
|
||||||
if (!alloc_cpumask_var(&old, GFP_KERNEL))
|
|
||||||
return;
|
|
||||||
cpumask_copy(old, ¤t->cpus_allowed);
|
|
||||||
|
|
||||||
for_each_online_cpu(cpu) {
|
for_each_online_cpu(cpu) {
|
||||||
if (cpu == dying)
|
if (cpu == dying)
|
||||||
continue;
|
continue;
|
||||||
if (set_cpus_allowed_ptr(current, cpumask_of(cpu)))
|
|
||||||
|
if (cpu == smp_processor_id()) {
|
||||||
|
cmci_rediscover_work_func(NULL);
|
||||||
continue;
|
continue;
|
||||||
/* Recheck banks in case CPUs don't all have the same */
|
|
||||||
if (cmci_supported(&banks))
|
|
||||||
cmci_discover(banks);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
set_cpus_allowed_ptr(current, old);
|
work_on_cpu(cpu, cmci_rediscover_work_func, NULL);
|
||||||
free_cpumask_var(old);
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -995,8 +995,8 @@ END(interrupt)
|
|||||||
*/
|
*/
|
||||||
.p2align CONFIG_X86_L1_CACHE_SHIFT
|
.p2align CONFIG_X86_L1_CACHE_SHIFT
|
||||||
common_interrupt:
|
common_interrupt:
|
||||||
ASM_CLAC
|
|
||||||
XCPT_FRAME
|
XCPT_FRAME
|
||||||
|
ASM_CLAC
|
||||||
addq $-0x80,(%rsp) /* Adjust vector to [-256,-1] range */
|
addq $-0x80,(%rsp) /* Adjust vector to [-256,-1] range */
|
||||||
interrupt do_IRQ
|
interrupt do_IRQ
|
||||||
/* 0(%rsp): old_rsp-ARGOFFSET */
|
/* 0(%rsp): old_rsp-ARGOFFSET */
|
||||||
@@ -1135,8 +1135,8 @@ END(common_interrupt)
|
|||||||
*/
|
*/
|
||||||
.macro apicinterrupt num sym do_sym
|
.macro apicinterrupt num sym do_sym
|
||||||
ENTRY(\sym)
|
ENTRY(\sym)
|
||||||
ASM_CLAC
|
|
||||||
INTR_FRAME
|
INTR_FRAME
|
||||||
|
ASM_CLAC
|
||||||
pushq_cfi $~(\num)
|
pushq_cfi $~(\num)
|
||||||
.Lcommon_\sym:
|
.Lcommon_\sym:
|
||||||
interrupt \do_sym
|
interrupt \do_sym
|
||||||
@@ -1190,8 +1190,8 @@ apicinterrupt IRQ_WORK_VECTOR \
|
|||||||
*/
|
*/
|
||||||
.macro zeroentry sym do_sym
|
.macro zeroentry sym do_sym
|
||||||
ENTRY(\sym)
|
ENTRY(\sym)
|
||||||
ASM_CLAC
|
|
||||||
INTR_FRAME
|
INTR_FRAME
|
||||||
|
ASM_CLAC
|
||||||
PARAVIRT_ADJUST_EXCEPTION_FRAME
|
PARAVIRT_ADJUST_EXCEPTION_FRAME
|
||||||
pushq_cfi $-1 /* ORIG_RAX: no syscall to restart */
|
pushq_cfi $-1 /* ORIG_RAX: no syscall to restart */
|
||||||
subq $ORIG_RAX-R15, %rsp
|
subq $ORIG_RAX-R15, %rsp
|
||||||
@@ -1208,8 +1208,8 @@ END(\sym)
|
|||||||
|
|
||||||
.macro paranoidzeroentry sym do_sym
|
.macro paranoidzeroentry sym do_sym
|
||||||
ENTRY(\sym)
|
ENTRY(\sym)
|
||||||
ASM_CLAC
|
|
||||||
INTR_FRAME
|
INTR_FRAME
|
||||||
|
ASM_CLAC
|
||||||
PARAVIRT_ADJUST_EXCEPTION_FRAME
|
PARAVIRT_ADJUST_EXCEPTION_FRAME
|
||||||
pushq_cfi $-1 /* ORIG_RAX: no syscall to restart */
|
pushq_cfi $-1 /* ORIG_RAX: no syscall to restart */
|
||||||
subq $ORIG_RAX-R15, %rsp
|
subq $ORIG_RAX-R15, %rsp
|
||||||
@@ -1227,8 +1227,8 @@ END(\sym)
|
|||||||
#define INIT_TSS_IST(x) PER_CPU_VAR(init_tss) + (TSS_ist + ((x) - 1) * 8)
|
#define INIT_TSS_IST(x) PER_CPU_VAR(init_tss) + (TSS_ist + ((x) - 1) * 8)
|
||||||
.macro paranoidzeroentry_ist sym do_sym ist
|
.macro paranoidzeroentry_ist sym do_sym ist
|
||||||
ENTRY(\sym)
|
ENTRY(\sym)
|
||||||
ASM_CLAC
|
|
||||||
INTR_FRAME
|
INTR_FRAME
|
||||||
|
ASM_CLAC
|
||||||
PARAVIRT_ADJUST_EXCEPTION_FRAME
|
PARAVIRT_ADJUST_EXCEPTION_FRAME
|
||||||
pushq_cfi $-1 /* ORIG_RAX: no syscall to restart */
|
pushq_cfi $-1 /* ORIG_RAX: no syscall to restart */
|
||||||
subq $ORIG_RAX-R15, %rsp
|
subq $ORIG_RAX-R15, %rsp
|
||||||
@@ -1247,8 +1247,8 @@ END(\sym)
|
|||||||
|
|
||||||
.macro errorentry sym do_sym
|
.macro errorentry sym do_sym
|
||||||
ENTRY(\sym)
|
ENTRY(\sym)
|
||||||
ASM_CLAC
|
|
||||||
XCPT_FRAME
|
XCPT_FRAME
|
||||||
|
ASM_CLAC
|
||||||
PARAVIRT_ADJUST_EXCEPTION_FRAME
|
PARAVIRT_ADJUST_EXCEPTION_FRAME
|
||||||
subq $ORIG_RAX-R15, %rsp
|
subq $ORIG_RAX-R15, %rsp
|
||||||
CFI_ADJUST_CFA_OFFSET ORIG_RAX-R15
|
CFI_ADJUST_CFA_OFFSET ORIG_RAX-R15
|
||||||
@@ -1266,8 +1266,8 @@ END(\sym)
|
|||||||
/* error code is on the stack already */
|
/* error code is on the stack already */
|
||||||
.macro paranoiderrorentry sym do_sym
|
.macro paranoiderrorentry sym do_sym
|
||||||
ENTRY(\sym)
|
ENTRY(\sym)
|
||||||
ASM_CLAC
|
|
||||||
XCPT_FRAME
|
XCPT_FRAME
|
||||||
|
ASM_CLAC
|
||||||
PARAVIRT_ADJUST_EXCEPTION_FRAME
|
PARAVIRT_ADJUST_EXCEPTION_FRAME
|
||||||
subq $ORIG_RAX-R15, %rsp
|
subq $ORIG_RAX-R15, %rsp
|
||||||
CFI_ADJUST_CFA_OFFSET ORIG_RAX-R15
|
CFI_ADJUST_CFA_OFFSET ORIG_RAX-R15
|
||||||
|
@@ -8,8 +8,8 @@
|
|||||||
* Tigran Aivazian <tigran@aivazian.fsnet.co.uk>
|
* Tigran Aivazian <tigran@aivazian.fsnet.co.uk>
|
||||||
*
|
*
|
||||||
* Maintainers:
|
* Maintainers:
|
||||||
* Andreas Herrmann <andreas.herrmann3@amd.com>
|
* Andreas Herrmann <herrmann.der.user@googlemail.com>
|
||||||
* Borislav Petkov <borislav.petkov@amd.com>
|
* Borislav Petkov <bp@alien8.de>
|
||||||
*
|
*
|
||||||
* This driver allows to upgrade microcode on F10h AMD
|
* This driver allows to upgrade microcode on F10h AMD
|
||||||
* CPUs and later.
|
* CPUs and later.
|
||||||
@@ -190,6 +190,7 @@ static unsigned int verify_patch_size(int cpu, u32 patch_size,
|
|||||||
#define F1XH_MPB_MAX_SIZE 2048
|
#define F1XH_MPB_MAX_SIZE 2048
|
||||||
#define F14H_MPB_MAX_SIZE 1824
|
#define F14H_MPB_MAX_SIZE 1824
|
||||||
#define F15H_MPB_MAX_SIZE 4096
|
#define F15H_MPB_MAX_SIZE 4096
|
||||||
|
#define F16H_MPB_MAX_SIZE 3458
|
||||||
|
|
||||||
switch (c->x86) {
|
switch (c->x86) {
|
||||||
case 0x14:
|
case 0x14:
|
||||||
@@ -198,6 +199,9 @@ static unsigned int verify_patch_size(int cpu, u32 patch_size,
|
|||||||
case 0x15:
|
case 0x15:
|
||||||
max_size = F15H_MPB_MAX_SIZE;
|
max_size = F15H_MPB_MAX_SIZE;
|
||||||
break;
|
break;
|
||||||
|
case 0x16:
|
||||||
|
max_size = F16H_MPB_MAX_SIZE;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
max_size = F1XH_MPB_MAX_SIZE;
|
max_size = F1XH_MPB_MAX_SIZE;
|
||||||
break;
|
break;
|
||||||
|
@@ -22,6 +22,7 @@
|
|||||||
#include <linux/perf_event.h>
|
#include <linux/perf_event.h>
|
||||||
#include <linux/hw_breakpoint.h>
|
#include <linux/hw_breakpoint.h>
|
||||||
#include <linux/rcupdate.h>
|
#include <linux/rcupdate.h>
|
||||||
|
#include <linux/module.h>
|
||||||
|
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
@@ -166,6 +167,35 @@ static inline bool invalid_selector(u16 value)
|
|||||||
|
|
||||||
#define FLAG_MASK FLAG_MASK_32
|
#define FLAG_MASK FLAG_MASK_32
|
||||||
|
|
||||||
|
/*
|
||||||
|
* X86_32 CPUs don't save ss and esp if the CPU is already in kernel mode
|
||||||
|
* when it traps. The previous stack will be directly underneath the saved
|
||||||
|
* registers, and 'sp/ss' won't even have been saved. Thus the '®s->sp'.
|
||||||
|
*
|
||||||
|
* Now, if the stack is empty, '®s->sp' is out of range. In this
|
||||||
|
* case we try to take the previous stack. To always return a non-null
|
||||||
|
* stack pointer we fall back to regs as stack if no previous stack
|
||||||
|
* exists.
|
||||||
|
*
|
||||||
|
* This is valid only for kernel mode traps.
|
||||||
|
*/
|
||||||
|
unsigned long kernel_stack_pointer(struct pt_regs *regs)
|
||||||
|
{
|
||||||
|
unsigned long context = (unsigned long)regs & ~(THREAD_SIZE - 1);
|
||||||
|
unsigned long sp = (unsigned long)®s->sp;
|
||||||
|
struct thread_info *tinfo;
|
||||||
|
|
||||||
|
if (context == (sp & ~(THREAD_SIZE - 1)))
|
||||||
|
return sp;
|
||||||
|
|
||||||
|
tinfo = (struct thread_info *)context;
|
||||||
|
if (tinfo->previous_esp)
|
||||||
|
return tinfo->previous_esp;
|
||||||
|
|
||||||
|
return (unsigned long)regs;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(kernel_stack_pointer);
|
||||||
|
|
||||||
static unsigned long *pt_regs_access(struct pt_regs *regs, unsigned long regno)
|
static unsigned long *pt_regs_access(struct pt_regs *regs, unsigned long regno)
|
||||||
{
|
{
|
||||||
BUILD_BUG_ON(offsetof(struct pt_regs, bx) != 0);
|
BUILD_BUG_ON(offsetof(struct pt_regs, bx) != 0);
|
||||||
|
@@ -197,7 +197,7 @@ void flush_tlb_mm_range(struct mm_struct *mm, unsigned long start,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (end == TLB_FLUSH_ALL || tlb_flushall_shift == -1
|
if (end == TLB_FLUSH_ALL || tlb_flushall_shift == -1
|
||||||
|| vmflag == VM_HUGETLB) {
|
|| vmflag & VM_HUGETLB) {
|
||||||
local_flush_tlb();
|
local_flush_tlb();
|
||||||
goto flush_all;
|
goto flush_all;
|
||||||
}
|
}
|
||||||
|
@@ -115,6 +115,16 @@ static void sata_revid_read(struct sim_dev_reg *reg, u32 *value)
|
|||||||
reg_read(reg, value);
|
reg_read(reg, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void reg_noirq_read(struct sim_dev_reg *reg, u32 *value)
|
||||||
|
{
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
|
raw_spin_lock_irqsave(&pci_config_lock, flags);
|
||||||
|
/* force interrupt pin value to 0 */
|
||||||
|
*value = reg->sim_reg.value & 0xfff00ff;
|
||||||
|
raw_spin_unlock_irqrestore(&pci_config_lock, flags);
|
||||||
|
}
|
||||||
|
|
||||||
static struct sim_dev_reg bus1_fixups[] = {
|
static struct sim_dev_reg bus1_fixups[] = {
|
||||||
DEFINE_REG(2, 0, 0x10, (16*MB), reg_init, reg_read, reg_write)
|
DEFINE_REG(2, 0, 0x10, (16*MB), reg_init, reg_read, reg_write)
|
||||||
DEFINE_REG(2, 0, 0x14, (256), reg_init, reg_read, reg_write)
|
DEFINE_REG(2, 0, 0x14, (256), reg_init, reg_read, reg_write)
|
||||||
@@ -144,6 +154,7 @@ static struct sim_dev_reg bus1_fixups[] = {
|
|||||||
DEFINE_REG(11, 5, 0x10, (64*KB), reg_init, reg_read, reg_write)
|
DEFINE_REG(11, 5, 0x10, (64*KB), reg_init, reg_read, reg_write)
|
||||||
DEFINE_REG(11, 6, 0x10, (256), reg_init, reg_read, reg_write)
|
DEFINE_REG(11, 6, 0x10, (256), reg_init, reg_read, reg_write)
|
||||||
DEFINE_REG(11, 7, 0x10, (64*KB), reg_init, reg_read, reg_write)
|
DEFINE_REG(11, 7, 0x10, (64*KB), reg_init, reg_read, reg_write)
|
||||||
|
DEFINE_REG(11, 7, 0x3c, 256, reg_init, reg_noirq_read, reg_write)
|
||||||
DEFINE_REG(12, 0, 0x10, (128*KB), reg_init, reg_read, reg_write)
|
DEFINE_REG(12, 0, 0x10, (128*KB), reg_init, reg_read, reg_write)
|
||||||
DEFINE_REG(12, 0, 0x14, (256), reg_init, reg_read, reg_write)
|
DEFINE_REG(12, 0, 0x14, (256), reg_init, reg_read, reg_write)
|
||||||
DEFINE_REG(12, 1, 0x10, (1024), reg_init, reg_read, reg_write)
|
DEFINE_REG(12, 1, 0x10, (1024), reg_init, reg_read, reg_write)
|
||||||
@@ -161,8 +172,10 @@ static struct sim_dev_reg bus1_fixups[] = {
|
|||||||
DEFINE_REG(16, 0, 0x10, (64*KB), reg_init, reg_read, reg_write)
|
DEFINE_REG(16, 0, 0x10, (64*KB), reg_init, reg_read, reg_write)
|
||||||
DEFINE_REG(16, 0, 0x14, (64*MB), reg_init, reg_read, reg_write)
|
DEFINE_REG(16, 0, 0x14, (64*MB), reg_init, reg_read, reg_write)
|
||||||
DEFINE_REG(16, 0, 0x18, (64*MB), reg_init, reg_read, reg_write)
|
DEFINE_REG(16, 0, 0x18, (64*MB), reg_init, reg_read, reg_write)
|
||||||
|
DEFINE_REG(16, 0, 0x3c, 256, reg_init, reg_noirq_read, reg_write)
|
||||||
DEFINE_REG(17, 0, 0x10, (128*KB), reg_init, reg_read, reg_write)
|
DEFINE_REG(17, 0, 0x10, (128*KB), reg_init, reg_read, reg_write)
|
||||||
DEFINE_REG(18, 0, 0x10, (1*KB), reg_init, reg_read, reg_write)
|
DEFINE_REG(18, 0, 0x10, (1*KB), reg_init, reg_read, reg_write)
|
||||||
|
DEFINE_REG(18, 0, 0x3c, 256, reg_init, reg_noirq_read, reg_write)
|
||||||
};
|
};
|
||||||
|
|
||||||
static void __init init_sim_regs(void)
|
static void __init init_sim_regs(void)
|
||||||
|
@@ -21,12 +21,25 @@
|
|||||||
#include <asm/i8259.h>
|
#include <asm/i8259.h>
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/io_apic.h>
|
#include <asm/io_apic.h>
|
||||||
|
#include <asm/emergency-restart.h>
|
||||||
|
|
||||||
static int ce4100_i8042_detect(void)
|
static int ce4100_i8042_detect(void)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The CE4100 platform has an internal 8051 Microcontroller which is
|
||||||
|
* responsible for signaling to the external Power Management Unit the
|
||||||
|
* intention to reset, reboot or power off the system. This 8051 device has
|
||||||
|
* its command register mapped at I/O port 0xcf9 and the value 0x4 is used
|
||||||
|
* to power off the system.
|
||||||
|
*/
|
||||||
|
static void ce4100_power_off(void)
|
||||||
|
{
|
||||||
|
outb(0x4, 0xcf9);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_SERIAL_8250
|
#ifdef CONFIG_SERIAL_8250
|
||||||
|
|
||||||
static unsigned int mem_serial_in(struct uart_port *p, int offset)
|
static unsigned int mem_serial_in(struct uart_port *p, int offset)
|
||||||
@@ -139,8 +152,19 @@ void __init x86_ce4100_early_setup(void)
|
|||||||
x86_init.mpparse.find_smp_config = x86_init_noop;
|
x86_init.mpparse.find_smp_config = x86_init_noop;
|
||||||
x86_init.pci.init = ce4100_pci_init;
|
x86_init.pci.init = ce4100_pci_init;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* By default, the reboot method is ACPI which is supported by the
|
||||||
|
* CE4100 bootloader CEFDK using FADT.ResetReg Address and ResetValue
|
||||||
|
* the bootloader will however issue a system power off instead of
|
||||||
|
* reboot. By using BOOT_KBD we ensure proper system reboot as
|
||||||
|
* expected.
|
||||||
|
*/
|
||||||
|
reboot_type = BOOT_KBD;
|
||||||
|
|
||||||
#ifdef CONFIG_X86_IO_APIC
|
#ifdef CONFIG_X86_IO_APIC
|
||||||
x86_init.pci.init_irq = sdv_pci_init;
|
x86_init.pci.init_irq = sdv_pci_init;
|
||||||
x86_init.mpparse.setup_ioapic_ids = setup_ioapic_ids_from_mpc_nocheck;
|
x86_init.mpparse.setup_ioapic_ids = setup_ioapic_ids_from_mpc_nocheck;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
pm_power_off = ce4100_power_off;
|
||||||
}
|
}
|
||||||
|
@@ -33,7 +33,7 @@
|
|||||||
* detection. The mods to Rev F required more family
|
* detection. The mods to Rev F required more family
|
||||||
* information detection.
|
* information detection.
|
||||||
*
|
*
|
||||||
* Changes/Fixes by Borislav Petkov <borislav.petkov@amd.com>:
|
* Changes/Fixes by Borislav Petkov <bp@alien8.de>:
|
||||||
* - misc fixes and code cleanups
|
* - misc fixes and code cleanups
|
||||||
*
|
*
|
||||||
* This module is based on the following documents
|
* This module is based on the following documents
|
||||||
|
@@ -5,7 +5,7 @@
|
|||||||
*
|
*
|
||||||
* 2007 (c) MontaVista Software, Inc.
|
* 2007 (c) MontaVista Software, Inc.
|
||||||
* 2010 (c) Advanced Micro Devices Inc.
|
* 2010 (c) Advanced Micro Devices Inc.
|
||||||
* Borislav Petkov <borislav.petkov@amd.com>
|
* Borislav Petkov <bp@alien8.de>
|
||||||
*
|
*
|
||||||
* This file is licensed under the terms of the GNU General Public
|
* This file is licensed under the terms of the GNU General Public
|
||||||
* License version 2. This program is licensed "as is" without any
|
* License version 2. This program is licensed "as is" without any
|
||||||
|
@@ -6,7 +6,7 @@
|
|||||||
* This file may be distributed under the terms of the GNU General Public
|
* This file may be distributed under the terms of the GNU General Public
|
||||||
* License version 2.
|
* License version 2.
|
||||||
*
|
*
|
||||||
* Copyright (c) 2010: Borislav Petkov <borislav.petkov@amd.com>
|
* Copyright (c) 2010: Borislav Petkov <bp@alien8.de>
|
||||||
* Advanced Micro Devices Inc.
|
* Advanced Micro Devices Inc.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -168,6 +168,6 @@ module_init(edac_init_mce_inject);
|
|||||||
module_exit(edac_exit_mce_inject);
|
module_exit(edac_exit_mce_inject);
|
||||||
|
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
MODULE_AUTHOR("Borislav Petkov <borislav.petkov@amd.com>");
|
MODULE_AUTHOR("Borislav Petkov <bp@alien8.de>");
|
||||||
MODULE_AUTHOR("AMD Inc.");
|
MODULE_AUTHOR("AMD Inc.");
|
||||||
MODULE_DESCRIPTION("MCE injection facility for testing MCE decoding");
|
MODULE_DESCRIPTION("MCE injection facility for testing MCE decoding");
|
||||||
|
Reference in New Issue
Block a user