Merge git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc-merge
* git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc-merge: powerpc: Fix various syscall/signal/swapcontext bugs [PATCH] powerpc: incorrect rmo_top handling in prom_init [PATCH] powerpc: Fix incorrect pud_ERROR() message [PATCH] powerpc: Expose SMT and L1 icache snoop userland features [PATCH] powerpc: Fix windfarm_pm112 not starting all control loops [PATCH] powerpc: Fix old g5 issues with windfarm powerpc32: Fix timebase synchronization on 32-bit powermacs powerpc: Turn off verbose debug output in powermac platform functions powerpc: Fix might-sleep warning in program check exception handler
This commit is contained in:
commit
0d514f040a
|
@ -92,7 +92,6 @@ int main(void)
|
||||||
|
|
||||||
DEFINE(TI_FLAGS, offsetof(struct thread_info, flags));
|
DEFINE(TI_FLAGS, offsetof(struct thread_info, flags));
|
||||||
DEFINE(TI_PREEMPT, offsetof(struct thread_info, preempt_count));
|
DEFINE(TI_PREEMPT, offsetof(struct thread_info, preempt_count));
|
||||||
DEFINE(TI_SIGFRAME, offsetof(struct thread_info, nvgprs_frame));
|
|
||||||
DEFINE(TI_TASK, offsetof(struct thread_info, task));
|
DEFINE(TI_TASK, offsetof(struct thread_info, task));
|
||||||
#ifdef CONFIG_PPC32
|
#ifdef CONFIG_PPC32
|
||||||
DEFINE(TI_EXECDOMAIN, offsetof(struct thread_info, exec_domain));
|
DEFINE(TI_EXECDOMAIN, offsetof(struct thread_info, exec_domain));
|
||||||
|
|
|
@ -53,8 +53,10 @@ extern void __setup_cpu_ppc970(unsigned long offset, struct cpu_spec* spec);
|
||||||
PPC_FEATURE_HAS_MMU)
|
PPC_FEATURE_HAS_MMU)
|
||||||
#define COMMON_USER_PPC64 (COMMON_USER | PPC_FEATURE_64)
|
#define COMMON_USER_PPC64 (COMMON_USER | PPC_FEATURE_64)
|
||||||
#define COMMON_USER_POWER4 (COMMON_USER_PPC64 | PPC_FEATURE_POWER4)
|
#define COMMON_USER_POWER4 (COMMON_USER_PPC64 | PPC_FEATURE_POWER4)
|
||||||
#define COMMON_USER_POWER5 (COMMON_USER_PPC64 | PPC_FEATURE_POWER5)
|
#define COMMON_USER_POWER5 (COMMON_USER_PPC64 | PPC_FEATURE_POWER5 |\
|
||||||
#define COMMON_USER_POWER5_PLUS (COMMON_USER_PPC64 | PPC_FEATURE_POWER5_PLUS)
|
PPC_FEATURE_SMT | PPC_FEATURE_ICACHE_SNOOP)
|
||||||
|
#define COMMON_USER_POWER5_PLUS (COMMON_USER_PPC64 | PPC_FEATURE_POWER5_PLUS|\
|
||||||
|
PPC_FEATURE_SMT | PPC_FEATURE_ICACHE_SNOOP)
|
||||||
#define COMMON_USER_BOOKE (PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU | \
|
#define COMMON_USER_BOOKE (PPC_FEATURE_32 | PPC_FEATURE_HAS_MMU | \
|
||||||
PPC_FEATURE_BOOKE)
|
PPC_FEATURE_BOOKE)
|
||||||
|
|
||||||
|
@ -267,7 +269,8 @@ struct cpu_spec cpu_specs[] = {
|
||||||
.cpu_name = "Cell Broadband Engine",
|
.cpu_name = "Cell Broadband Engine",
|
||||||
.cpu_features = CPU_FTRS_CELL,
|
.cpu_features = CPU_FTRS_CELL,
|
||||||
.cpu_user_features = COMMON_USER_PPC64 |
|
.cpu_user_features = COMMON_USER_PPC64 |
|
||||||
PPC_FEATURE_CELL | PPC_FEATURE_HAS_ALTIVEC_COMP,
|
PPC_FEATURE_CELL | PPC_FEATURE_HAS_ALTIVEC_COMP |
|
||||||
|
PPC_FEATURE_SMT,
|
||||||
.icache_bsize = 128,
|
.icache_bsize = 128,
|
||||||
.dcache_bsize = 128,
|
.dcache_bsize = 128,
|
||||||
.cpu_setup = __setup_cpu_be,
|
.cpu_setup = __setup_cpu_be,
|
||||||
|
|
|
@ -227,7 +227,7 @@ ret_from_syscall:
|
||||||
MTMSRD(r10)
|
MTMSRD(r10)
|
||||||
lwz r9,TI_FLAGS(r12)
|
lwz r9,TI_FLAGS(r12)
|
||||||
li r8,-_LAST_ERRNO
|
li r8,-_LAST_ERRNO
|
||||||
andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SIGPENDING|_TIF_NEED_RESCHED|_TIF_RESTOREALL|_TIF_RESTORE_SIGMASK)
|
andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP|_TIF_USER_WORK_MASK|_TIF_PERSYSCALL_MASK)
|
||||||
bne- syscall_exit_work
|
bne- syscall_exit_work
|
||||||
cmplw 0,r3,r8
|
cmplw 0,r3,r8
|
||||||
blt+ syscall_exit_cont
|
blt+ syscall_exit_cont
|
||||||
|
@ -287,8 +287,10 @@ syscall_dotrace:
|
||||||
|
|
||||||
syscall_exit_work:
|
syscall_exit_work:
|
||||||
andi. r0,r9,_TIF_RESTOREALL
|
andi. r0,r9,_TIF_RESTOREALL
|
||||||
bne- 2f
|
beq+ 0f
|
||||||
cmplw 0,r3,r8
|
REST_NVGPRS(r1)
|
||||||
|
b 2f
|
||||||
|
0: cmplw 0,r3,r8
|
||||||
blt+ 1f
|
blt+ 1f
|
||||||
andi. r0,r9,_TIF_NOERROR
|
andi. r0,r9,_TIF_NOERROR
|
||||||
bne- 1f
|
bne- 1f
|
||||||
|
@ -302,9 +304,7 @@ syscall_exit_work:
|
||||||
2: andi. r0,r9,(_TIF_PERSYSCALL_MASK)
|
2: andi. r0,r9,(_TIF_PERSYSCALL_MASK)
|
||||||
beq 4f
|
beq 4f
|
||||||
|
|
||||||
/* Clear per-syscall TIF flags if any are set, but _leave_
|
/* Clear per-syscall TIF flags if any are set. */
|
||||||
_TIF_SAVE_NVGPRS set in r9 since we haven't dealt with that
|
|
||||||
yet. */
|
|
||||||
|
|
||||||
li r11,_TIF_PERSYSCALL_MASK
|
li r11,_TIF_PERSYSCALL_MASK
|
||||||
addi r12,r12,TI_FLAGS
|
addi r12,r12,TI_FLAGS
|
||||||
|
@ -318,8 +318,13 @@ syscall_exit_work:
|
||||||
subi r12,r12,TI_FLAGS
|
subi r12,r12,TI_FLAGS
|
||||||
|
|
||||||
4: /* Anything which requires enabling interrupts? */
|
4: /* Anything which requires enabling interrupts? */
|
||||||
andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP|_TIF_SAVE_NVGPRS)
|
andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP)
|
||||||
beq 7f
|
beq ret_from_except
|
||||||
|
|
||||||
|
/* Re-enable interrupts */
|
||||||
|
ori r10,r10,MSR_EE
|
||||||
|
SYNC
|
||||||
|
MTMSRD(r10)
|
||||||
|
|
||||||
/* Save NVGPRS if they're not saved already */
|
/* Save NVGPRS if they're not saved already */
|
||||||
lwz r4,_TRAP(r1)
|
lwz r4,_TRAP(r1)
|
||||||
|
@ -328,70 +333,10 @@ syscall_exit_work:
|
||||||
SAVE_NVGPRS(r1)
|
SAVE_NVGPRS(r1)
|
||||||
li r4,0xc00
|
li r4,0xc00
|
||||||
stw r4,_TRAP(r1)
|
stw r4,_TRAP(r1)
|
||||||
|
5:
|
||||||
/* Re-enable interrupts */
|
|
||||||
5: ori r10,r10,MSR_EE
|
|
||||||
SYNC
|
|
||||||
MTMSRD(r10)
|
|
||||||
|
|
||||||
andi. r0,r9,_TIF_SAVE_NVGPRS
|
|
||||||
bne save_user_nvgprs
|
|
||||||
|
|
||||||
save_user_nvgprs_cont:
|
|
||||||
andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP)
|
|
||||||
beq 7f
|
|
||||||
|
|
||||||
addi r3,r1,STACK_FRAME_OVERHEAD
|
addi r3,r1,STACK_FRAME_OVERHEAD
|
||||||
bl do_syscall_trace_leave
|
bl do_syscall_trace_leave
|
||||||
REST_NVGPRS(r1)
|
b ret_from_except_full
|
||||||
|
|
||||||
6: lwz r3,GPR3(r1)
|
|
||||||
LOAD_MSR_KERNEL(r10,MSR_KERNEL) /* doesn't include MSR_EE */
|
|
||||||
SYNC
|
|
||||||
MTMSRD(r10) /* disable interrupts again */
|
|
||||||
rlwinm r12,r1,0,0,(31-THREAD_SHIFT) /* current_thread_info() */
|
|
||||||
lwz r9,TI_FLAGS(r12)
|
|
||||||
7:
|
|
||||||
andi. r0,r9,_TIF_NEED_RESCHED
|
|
||||||
bne 8f
|
|
||||||
lwz r5,_MSR(r1)
|
|
||||||
andi. r5,r5,MSR_PR
|
|
||||||
beq ret_from_except
|
|
||||||
andi. r0,r9,_TIF_SIGPENDING|_TIF_RESTORE_SIGMASK
|
|
||||||
beq ret_from_except
|
|
||||||
b do_user_signal
|
|
||||||
8:
|
|
||||||
ori r10,r10,MSR_EE
|
|
||||||
SYNC
|
|
||||||
MTMSRD(r10) /* re-enable interrupts */
|
|
||||||
bl schedule
|
|
||||||
b 6b
|
|
||||||
|
|
||||||
save_user_nvgprs:
|
|
||||||
lwz r8,TI_SIGFRAME(r12)
|
|
||||||
|
|
||||||
.macro savewords start, end
|
|
||||||
1: stw \start,4*(\start)(r8)
|
|
||||||
.section __ex_table,"a"
|
|
||||||
.align 2
|
|
||||||
.long 1b,save_user_nvgprs_fault
|
|
||||||
.previous
|
|
||||||
.if \end - \start
|
|
||||||
savewords "(\start+1)",\end
|
|
||||||
.endif
|
|
||||||
.endm
|
|
||||||
savewords 14,31
|
|
||||||
b save_user_nvgprs_cont
|
|
||||||
|
|
||||||
|
|
||||||
save_user_nvgprs_fault:
|
|
||||||
li r3,11 /* SIGSEGV */
|
|
||||||
lwz r4,TI_TASK(r12)
|
|
||||||
bl force_sigsegv
|
|
||||||
|
|
||||||
rlwinm r12,r1,0,0,(31-THREAD_SHIFT) /* current_thread_info() */
|
|
||||||
lwz r9,TI_FLAGS(r12)
|
|
||||||
b save_user_nvgprs_cont
|
|
||||||
|
|
||||||
#ifdef SHOW_SYSCALLS
|
#ifdef SHOW_SYSCALLS
|
||||||
do_show_syscall:
|
do_show_syscall:
|
||||||
|
@ -490,6 +435,14 @@ ppc_clone:
|
||||||
stw r0,_TRAP(r1) /* register set saved */
|
stw r0,_TRAP(r1) /* register set saved */
|
||||||
b sys_clone
|
b sys_clone
|
||||||
|
|
||||||
|
.globl ppc_swapcontext
|
||||||
|
ppc_swapcontext:
|
||||||
|
SAVE_NVGPRS(r1)
|
||||||
|
lwz r0,_TRAP(r1)
|
||||||
|
rlwinm r0,r0,0,0,30 /* clear LSB to indicate full */
|
||||||
|
stw r0,_TRAP(r1) /* register set saved */
|
||||||
|
b sys_swapcontext
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Top-level page fault handling.
|
* Top-level page fault handling.
|
||||||
* This is in assembler because if do_page_fault tells us that
|
* This is in assembler because if do_page_fault tells us that
|
||||||
|
@ -683,7 +636,7 @@ user_exc_return: /* r10 contains MSR_KERNEL here */
|
||||||
/* Check current_thread_info()->flags */
|
/* Check current_thread_info()->flags */
|
||||||
rlwinm r9,r1,0,0,(31-THREAD_SHIFT)
|
rlwinm r9,r1,0,0,(31-THREAD_SHIFT)
|
||||||
lwz r9,TI_FLAGS(r9)
|
lwz r9,TI_FLAGS(r9)
|
||||||
andi. r0,r9,(_TIF_SIGPENDING|_TIF_NEED_RESCHED|_TIF_RESTOREALL|_TIF_RESTORE_SIGMASK)
|
andi. r0,r9,(_TIF_SIGPENDING|_TIF_RESTORE_SIGMASK|_TIF_NEED_RESCHED)
|
||||||
bne do_work
|
bne do_work
|
||||||
|
|
||||||
restore_user:
|
restore_user:
|
||||||
|
|
|
@ -160,7 +160,7 @@ syscall_exit:
|
||||||
mtmsrd r10,1
|
mtmsrd r10,1
|
||||||
ld r9,TI_FLAGS(r12)
|
ld r9,TI_FLAGS(r12)
|
||||||
li r11,-_LAST_ERRNO
|
li r11,-_LAST_ERRNO
|
||||||
andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP|_TIF_SIGPENDING|_TIF_NEED_RESCHED|_TIF_RESTOREALL|_TIF_SAVE_NVGPRS|_TIF_NOERROR|_TIF_RESTORE_SIGMASK)
|
andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP|_TIF_USER_WORK_MASK|_TIF_PERSYSCALL_MASK)
|
||||||
bne- syscall_exit_work
|
bne- syscall_exit_work
|
||||||
cmpld r3,r11
|
cmpld r3,r11
|
||||||
ld r5,_CCR(r1)
|
ld r5,_CCR(r1)
|
||||||
|
@ -216,8 +216,10 @@ syscall_exit_work:
|
||||||
If TIF_NOERROR is set, just save r3 as it is. */
|
If TIF_NOERROR is set, just save r3 as it is. */
|
||||||
|
|
||||||
andi. r0,r9,_TIF_RESTOREALL
|
andi. r0,r9,_TIF_RESTOREALL
|
||||||
bne- 2f
|
beq+ 0f
|
||||||
cmpld r3,r11 /* r10 is -LAST_ERRNO */
|
REST_NVGPRS(r1)
|
||||||
|
b 2f
|
||||||
|
0: cmpld r3,r11 /* r10 is -LAST_ERRNO */
|
||||||
blt+ 1f
|
blt+ 1f
|
||||||
andi. r0,r9,_TIF_NOERROR
|
andi. r0,r9,_TIF_NOERROR
|
||||||
bne- 1f
|
bne- 1f
|
||||||
|
@ -229,9 +231,7 @@ syscall_exit_work:
|
||||||
2: andi. r0,r9,(_TIF_PERSYSCALL_MASK)
|
2: andi. r0,r9,(_TIF_PERSYSCALL_MASK)
|
||||||
beq 4f
|
beq 4f
|
||||||
|
|
||||||
/* Clear per-syscall TIF flags if any are set, but _leave_
|
/* Clear per-syscall TIF flags if any are set. */
|
||||||
_TIF_SAVE_NVGPRS set in r9 since we haven't dealt with that
|
|
||||||
yet. */
|
|
||||||
|
|
||||||
li r11,_TIF_PERSYSCALL_MASK
|
li r11,_TIF_PERSYSCALL_MASK
|
||||||
addi r12,r12,TI_FLAGS
|
addi r12,r12,TI_FLAGS
|
||||||
|
@ -241,9 +241,8 @@ syscall_exit_work:
|
||||||
bne- 3b
|
bne- 3b
|
||||||
subi r12,r12,TI_FLAGS
|
subi r12,r12,TI_FLAGS
|
||||||
|
|
||||||
4: bl .save_nvgprs
|
4: /* Anything else left to do? */
|
||||||
/* Anything else left to do? */
|
andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP)
|
||||||
andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP|_TIF_SAVE_NVGPRS)
|
|
||||||
beq .ret_from_except_lite
|
beq .ret_from_except_lite
|
||||||
|
|
||||||
/* Re-enable interrupts */
|
/* Re-enable interrupts */
|
||||||
|
@ -251,26 +250,10 @@ syscall_exit_work:
|
||||||
ori r10,r10,MSR_EE
|
ori r10,r10,MSR_EE
|
||||||
mtmsrd r10,1
|
mtmsrd r10,1
|
||||||
|
|
||||||
andi. r0,r9,_TIF_SAVE_NVGPRS
|
bl .save_nvgprs
|
||||||
bne save_user_nvgprs
|
|
||||||
|
|
||||||
/* If tracing, re-enable interrupts and do it */
|
|
||||||
save_user_nvgprs_cont:
|
|
||||||
andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP)
|
|
||||||
beq 5f
|
|
||||||
|
|
||||||
addi r3,r1,STACK_FRAME_OVERHEAD
|
addi r3,r1,STACK_FRAME_OVERHEAD
|
||||||
bl .do_syscall_trace_leave
|
bl .do_syscall_trace_leave
|
||||||
REST_NVGPRS(r1)
|
b .ret_from_except
|
||||||
clrrdi r12,r1,THREAD_SHIFT
|
|
||||||
|
|
||||||
/* Disable interrupts again and handle other work if any */
|
|
||||||
5: mfmsr r10
|
|
||||||
rldicl r10,r10,48,1
|
|
||||||
rotldi r10,r10,16
|
|
||||||
mtmsrd r10,1
|
|
||||||
|
|
||||||
b .ret_from_except_lite
|
|
||||||
|
|
||||||
/* Save non-volatile GPRs, if not already saved. */
|
/* Save non-volatile GPRs, if not already saved. */
|
||||||
_GLOBAL(save_nvgprs)
|
_GLOBAL(save_nvgprs)
|
||||||
|
@ -283,51 +266,6 @@ _GLOBAL(save_nvgprs)
|
||||||
blr
|
blr
|
||||||
|
|
||||||
|
|
||||||
save_user_nvgprs:
|
|
||||||
ld r10,TI_SIGFRAME(r12)
|
|
||||||
andi. r0,r9,_TIF_32BIT
|
|
||||||
beq- save_user_nvgprs_64
|
|
||||||
|
|
||||||
/* 32-bit save to userspace */
|
|
||||||
|
|
||||||
.macro savewords start, end
|
|
||||||
1: stw \start,4*(\start)(r10)
|
|
||||||
.section __ex_table,"a"
|
|
||||||
.align 3
|
|
||||||
.llong 1b,save_user_nvgprs_fault
|
|
||||||
.previous
|
|
||||||
.if \end - \start
|
|
||||||
savewords "(\start+1)",\end
|
|
||||||
.endif
|
|
||||||
.endm
|
|
||||||
savewords 14,31
|
|
||||||
b save_user_nvgprs_cont
|
|
||||||
|
|
||||||
save_user_nvgprs_64:
|
|
||||||
/* 64-bit save to userspace */
|
|
||||||
|
|
||||||
.macro savelongs start, end
|
|
||||||
1: std \start,8*(\start)(r10)
|
|
||||||
.section __ex_table,"a"
|
|
||||||
.align 3
|
|
||||||
.llong 1b,save_user_nvgprs_fault
|
|
||||||
.previous
|
|
||||||
.if \end - \start
|
|
||||||
savelongs "(\start+1)",\end
|
|
||||||
.endif
|
|
||||||
.endm
|
|
||||||
savelongs 14,31
|
|
||||||
b save_user_nvgprs_cont
|
|
||||||
|
|
||||||
save_user_nvgprs_fault:
|
|
||||||
li r3,11 /* SIGSEGV */
|
|
||||||
ld r4,TI_TASK(r12)
|
|
||||||
bl .force_sigsegv
|
|
||||||
|
|
||||||
clrrdi r12,r1,THREAD_SHIFT
|
|
||||||
ld r9,TI_FLAGS(r12)
|
|
||||||
b save_user_nvgprs_cont
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The sigsuspend and rt_sigsuspend system calls can call do_signal
|
* The sigsuspend and rt_sigsuspend system calls can call do_signal
|
||||||
* and thus put the process into the stopped state where we might
|
* and thus put the process into the stopped state where we might
|
||||||
|
@ -352,6 +290,16 @@ _GLOBAL(ppc_clone)
|
||||||
bl .sys_clone
|
bl .sys_clone
|
||||||
b syscall_exit
|
b syscall_exit
|
||||||
|
|
||||||
|
_GLOBAL(ppc32_swapcontext)
|
||||||
|
bl .save_nvgprs
|
||||||
|
bl .compat_sys_swapcontext
|
||||||
|
b syscall_exit
|
||||||
|
|
||||||
|
_GLOBAL(ppc64_swapcontext)
|
||||||
|
bl .save_nvgprs
|
||||||
|
bl .sys_swapcontext
|
||||||
|
b syscall_exit
|
||||||
|
|
||||||
_GLOBAL(ret_from_fork)
|
_GLOBAL(ret_from_fork)
|
||||||
bl .schedule_tail
|
bl .schedule_tail
|
||||||
REST_NVGPRS(r1)
|
REST_NVGPRS(r1)
|
||||||
|
|
|
@ -978,7 +978,7 @@ static void __init prom_init_mem(void)
|
||||||
if (size == 0)
|
if (size == 0)
|
||||||
continue;
|
continue;
|
||||||
prom_debug(" %x %x\n", base, size);
|
prom_debug(" %x %x\n", base, size);
|
||||||
if (base == 0)
|
if (base == 0 && (RELOC(of_platform) & PLATFORM_LPAR))
|
||||||
RELOC(rmo_top) = size;
|
RELOC(rmo_top) = size;
|
||||||
if ((base + size) > RELOC(ram_top))
|
if ((base + size) > RELOC(ram_top))
|
||||||
RELOC(ram_top) = base + size;
|
RELOC(ram_top) = base + size;
|
||||||
|
|
|
@ -561,10 +561,7 @@ void do_syscall_trace_leave(struct pt_regs *regs)
|
||||||
regs->result);
|
regs->result);
|
||||||
|
|
||||||
if ((test_thread_flag(TIF_SYSCALL_TRACE)
|
if ((test_thread_flag(TIF_SYSCALL_TRACE)
|
||||||
#ifdef CONFIG_PPC64
|
|| test_thread_flag(TIF_SINGLESTEP))
|
||||||
|| test_thread_flag(TIF_SINGLESTEP)
|
|
||||||
#endif
|
|
||||||
)
|
|
||||||
&& (current->ptrace & PT_PTRACED))
|
&& (current->ptrace & PT_PTRACED))
|
||||||
do_syscall_trace();
|
do_syscall_trace();
|
||||||
}
|
}
|
||||||
|
|
|
@ -151,10 +151,7 @@ static inline int save_general_regs(struct pt_regs *regs,
|
||||||
elf_greg_t64 *gregs = (elf_greg_t64 *)regs;
|
elf_greg_t64 *gregs = (elf_greg_t64 *)regs;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (!FULL_REGS(regs)) {
|
WARN_ON(!FULL_REGS(regs));
|
||||||
set_thread_flag(TIF_SAVE_NVGPRS);
|
|
||||||
current_thread_info()->nvgprs_frame = frame->mc_gregs;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i <= PT_RESULT; i ++) {
|
for (i = 0; i <= PT_RESULT; i ++) {
|
||||||
if (i == 14 && !FULL_REGS(regs))
|
if (i == 14 && !FULL_REGS(regs))
|
||||||
|
@ -215,15 +212,7 @@ static inline int get_old_sigaction(struct k_sigaction *new_ka,
|
||||||
static inline int save_general_regs(struct pt_regs *regs,
|
static inline int save_general_regs(struct pt_regs *regs,
|
||||||
struct mcontext __user *frame)
|
struct mcontext __user *frame)
|
||||||
{
|
{
|
||||||
if (!FULL_REGS(regs)) {
|
WARN_ON(!FULL_REGS(regs));
|
||||||
/* Zero out the unsaved GPRs to avoid information
|
|
||||||
leak, and set TIF_SAVE_NVGPRS to ensure that the
|
|
||||||
registers do actually get saved later. */
|
|
||||||
memset(®s->gpr[14], 0, 18 * sizeof(unsigned long));
|
|
||||||
current_thread_info()->nvgprs_frame = &frame->mc_gregs;
|
|
||||||
set_thread_flag(TIF_SAVE_NVGPRS);
|
|
||||||
}
|
|
||||||
|
|
||||||
return __copy_to_user(&frame->mc_gregs, regs, GP_REGS_SIZE);
|
return __copy_to_user(&frame->mc_gregs, regs, GP_REGS_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -118,14 +118,7 @@ static long setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
|
||||||
err |= __put_user(0, &sc->v_regs);
|
err |= __put_user(0, &sc->v_regs);
|
||||||
#endif /* CONFIG_ALTIVEC */
|
#endif /* CONFIG_ALTIVEC */
|
||||||
err |= __put_user(&sc->gp_regs, &sc->regs);
|
err |= __put_user(&sc->gp_regs, &sc->regs);
|
||||||
if (!FULL_REGS(regs)) {
|
WARN_ON(!FULL_REGS(regs));
|
||||||
/* Zero out the unsaved GPRs to avoid information
|
|
||||||
leak, and set TIF_SAVE_NVGPRS to ensure that the
|
|
||||||
registers do actually get saved later. */
|
|
||||||
memset(®s->gpr[14], 0, 18 * sizeof(unsigned long));
|
|
||||||
set_thread_flag(TIF_SAVE_NVGPRS);
|
|
||||||
current_thread_info()->nvgprs_frame = &sc->gp_regs;
|
|
||||||
}
|
|
||||||
err |= __copy_to_user(&sc->gp_regs, regs, GP_REGS_SIZE);
|
err |= __copy_to_user(&sc->gp_regs, regs, GP_REGS_SIZE);
|
||||||
err |= __copy_to_user(&sc->fp_regs, ¤t->thread.fpr, FP_REGS_SIZE);
|
err |= __copy_to_user(&sc->fp_regs, ¤t->thread.fpr, FP_REGS_SIZE);
|
||||||
err |= __put_user(signr, &sc->signal);
|
err |= __put_user(signr, &sc->signal);
|
||||||
|
|
|
@ -288,7 +288,7 @@ COMPAT_SYS(clock_settime)
|
||||||
COMPAT_SYS(clock_gettime)
|
COMPAT_SYS(clock_gettime)
|
||||||
COMPAT_SYS(clock_getres)
|
COMPAT_SYS(clock_getres)
|
||||||
COMPAT_SYS(clock_nanosleep)
|
COMPAT_SYS(clock_nanosleep)
|
||||||
COMPAT_SYS(swapcontext)
|
SYSX(ppc64_swapcontext,ppc32_swapcontext,ppc_swapcontext)
|
||||||
COMPAT_SYS(tgkill)
|
COMPAT_SYS(tgkill)
|
||||||
COMPAT_SYS(utimes)
|
COMPAT_SYS(utimes)
|
||||||
COMPAT_SYS(statfs64)
|
COMPAT_SYS(statfs64)
|
||||||
|
|
|
@ -814,6 +814,8 @@ void __kprobes program_check_exception(struct pt_regs *regs)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
local_irq_enable();
|
||||||
|
|
||||||
/* Try to emulate it if we should. */
|
/* Try to emulate it if we should. */
|
||||||
if (reason & (REASON_ILLEGAL | REASON_PRIVILEGED)) {
|
if (reason & (REASON_ILLEGAL | REASON_PRIVILEGED)) {
|
||||||
switch (emulate_instruction(regs)) {
|
switch (emulate_instruction(regs)) {
|
||||||
|
|
|
@ -9,7 +9,12 @@
|
||||||
#include <asm/pmac_feature.h>
|
#include <asm/pmac_feature.h>
|
||||||
#include <asm/pmac_pfunc.h>
|
#include <asm/pmac_pfunc.h>
|
||||||
|
|
||||||
|
#undef DEBUG
|
||||||
|
#ifdef DEBUG
|
||||||
#define DBG(fmt...) printk(fmt)
|
#define DBG(fmt...) printk(fmt)
|
||||||
|
#else
|
||||||
|
#define DBG(fmt...)
|
||||||
|
#endif
|
||||||
|
|
||||||
static irqreturn_t macio_gpio_irq(int irq, void *data, struct pt_regs *regs)
|
static irqreturn_t macio_gpio_irq(int irq, void *data, struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
|
|
|
@ -20,7 +20,13 @@
|
||||||
#define LOG_PARSE(fmt...)
|
#define LOG_PARSE(fmt...)
|
||||||
#define LOG_ERROR(fmt...) printk(fmt)
|
#define LOG_ERROR(fmt...) printk(fmt)
|
||||||
#define LOG_BLOB(t,b,c)
|
#define LOG_BLOB(t,b,c)
|
||||||
|
|
||||||
|
#undef DEBUG
|
||||||
|
#ifdef DEBUG
|
||||||
#define DBG(fmt...) printk(fmt)
|
#define DBG(fmt...) printk(fmt)
|
||||||
|
#else
|
||||||
|
#define DBG(fmt...)
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Command numbers */
|
/* Command numbers */
|
||||||
#define PMF_CMD_LIST 0
|
#define PMF_CMD_LIST 0
|
||||||
|
|
|
@ -435,7 +435,7 @@ struct smp_ops_t psurge_smp_ops = {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void (*pmac_tb_freeze)(int freeze);
|
static void (*pmac_tb_freeze)(int freeze);
|
||||||
static unsigned long timebase;
|
static u64 timebase;
|
||||||
static int tb_req;
|
static int tb_req;
|
||||||
|
|
||||||
static void smp_core99_give_timebase(void)
|
static void smp_core99_give_timebase(void)
|
||||||
|
|
|
@ -131,7 +131,6 @@ main(void)
|
||||||
DEFINE(CPU_SPEC_FEATURES, offsetof(struct cpu_spec, cpu_features));
|
DEFINE(CPU_SPEC_FEATURES, offsetof(struct cpu_spec, cpu_features));
|
||||||
DEFINE(CPU_SPEC_SETUP, offsetof(struct cpu_spec, cpu_setup));
|
DEFINE(CPU_SPEC_SETUP, offsetof(struct cpu_spec, cpu_setup));
|
||||||
|
|
||||||
DEFINE(TI_SIGFRAME, offsetof(struct thread_info, nvgprs_frame));
|
|
||||||
DEFINE(TI_TASK, offsetof(struct thread_info, task));
|
DEFINE(TI_TASK, offsetof(struct thread_info, task));
|
||||||
DEFINE(TI_EXECDOMAIN, offsetof(struct thread_info, exec_domain));
|
DEFINE(TI_EXECDOMAIN, offsetof(struct thread_info, exec_domain));
|
||||||
DEFINE(TI_FLAGS, offsetof(struct thread_info, flags));
|
DEFINE(TI_FLAGS, offsetof(struct thread_info, flags));
|
||||||
|
|
|
@ -227,7 +227,7 @@ ret_from_syscall:
|
||||||
MTMSRD(r10)
|
MTMSRD(r10)
|
||||||
lwz r9,TI_FLAGS(r12)
|
lwz r9,TI_FLAGS(r12)
|
||||||
li r8,-_LAST_ERRNO
|
li r8,-_LAST_ERRNO
|
||||||
andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SIGPENDING|_TIF_NEED_RESCHED|_TIF_RESTOREALL)
|
andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP|_TIF_USER_WORK_MASK|_TIF_PERSYSCALL_MASK)
|
||||||
bne- syscall_exit_work
|
bne- syscall_exit_work
|
||||||
cmplw 0,r3,r8
|
cmplw 0,r3,r8
|
||||||
blt+ syscall_exit_cont
|
blt+ syscall_exit_cont
|
||||||
|
@ -287,8 +287,10 @@ syscall_dotrace:
|
||||||
|
|
||||||
syscall_exit_work:
|
syscall_exit_work:
|
||||||
andi. r0,r9,_TIF_RESTOREALL
|
andi. r0,r9,_TIF_RESTOREALL
|
||||||
bne- 2f
|
beq+ 0f
|
||||||
cmplw 0,r3,r8
|
REST_NVGPRS(r1)
|
||||||
|
b 2f
|
||||||
|
0: cmplw 0,r3,r8
|
||||||
blt+ 1f
|
blt+ 1f
|
||||||
andi. r0,r9,_TIF_NOERROR
|
andi. r0,r9,_TIF_NOERROR
|
||||||
bne- 1f
|
bne- 1f
|
||||||
|
@ -302,9 +304,7 @@ syscall_exit_work:
|
||||||
2: andi. r0,r9,(_TIF_PERSYSCALL_MASK)
|
2: andi. r0,r9,(_TIF_PERSYSCALL_MASK)
|
||||||
beq 4f
|
beq 4f
|
||||||
|
|
||||||
/* Clear per-syscall TIF flags if any are set, but _leave_
|
/* Clear per-syscall TIF flags if any are set. */
|
||||||
_TIF_SAVE_NVGPRS set in r9 since we haven't dealt with that
|
|
||||||
yet. */
|
|
||||||
|
|
||||||
li r11,_TIF_PERSYSCALL_MASK
|
li r11,_TIF_PERSYSCALL_MASK
|
||||||
addi r12,r12,TI_FLAGS
|
addi r12,r12,TI_FLAGS
|
||||||
|
@ -318,8 +318,13 @@ syscall_exit_work:
|
||||||
subi r12,r12,TI_FLAGS
|
subi r12,r12,TI_FLAGS
|
||||||
|
|
||||||
4: /* Anything which requires enabling interrupts? */
|
4: /* Anything which requires enabling interrupts? */
|
||||||
andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP|_TIF_SAVE_NVGPRS)
|
andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP)
|
||||||
beq 7f
|
beq ret_from_except
|
||||||
|
|
||||||
|
/* Re-enable interrupts */
|
||||||
|
ori r10,r10,MSR_EE
|
||||||
|
SYNC
|
||||||
|
MTMSRD(r10)
|
||||||
|
|
||||||
/* Save NVGPRS if they're not saved already */
|
/* Save NVGPRS if they're not saved already */
|
||||||
lwz r4,TRAP(r1)
|
lwz r4,TRAP(r1)
|
||||||
|
@ -328,70 +333,10 @@ syscall_exit_work:
|
||||||
SAVE_NVGPRS(r1)
|
SAVE_NVGPRS(r1)
|
||||||
li r4,0xc00
|
li r4,0xc00
|
||||||
stw r4,TRAP(r1)
|
stw r4,TRAP(r1)
|
||||||
|
5:
|
||||||
/* Re-enable interrupts */
|
|
||||||
5: ori r10,r10,MSR_EE
|
|
||||||
SYNC
|
|
||||||
MTMSRD(r10)
|
|
||||||
|
|
||||||
andi. r0,r9,_TIF_SAVE_NVGPRS
|
|
||||||
bne save_user_nvgprs
|
|
||||||
|
|
||||||
save_user_nvgprs_cont:
|
|
||||||
andi. r0,r9,(_TIF_SYSCALL_T_OR_A|_TIF_SINGLESTEP)
|
|
||||||
beq 7f
|
|
||||||
|
|
||||||
addi r3,r1,STACK_FRAME_OVERHEAD
|
addi r3,r1,STACK_FRAME_OVERHEAD
|
||||||
bl do_syscall_trace_leave
|
bl do_syscall_trace_leave
|
||||||
REST_NVGPRS(r1)
|
b ret_from_except_full
|
||||||
|
|
||||||
6: lwz r3,GPR3(r1)
|
|
||||||
LOAD_MSR_KERNEL(r10,MSR_KERNEL) /* doesn't include MSR_EE */
|
|
||||||
SYNC
|
|
||||||
MTMSRD(r10) /* disable interrupts again */
|
|
||||||
rlwinm r12,r1,0,0,18 /* current_thread_info() */
|
|
||||||
lwz r9,TI_FLAGS(r12)
|
|
||||||
7:
|
|
||||||
andi. r0,r9,_TIF_NEED_RESCHED
|
|
||||||
bne 8f
|
|
||||||
lwz r5,_MSR(r1)
|
|
||||||
andi. r5,r5,MSR_PR
|
|
||||||
beq ret_from_except
|
|
||||||
andi. r0,r9,_TIF_SIGPENDING
|
|
||||||
beq ret_from_except
|
|
||||||
b do_user_signal
|
|
||||||
8:
|
|
||||||
ori r10,r10,MSR_EE
|
|
||||||
SYNC
|
|
||||||
MTMSRD(r10) /* re-enable interrupts */
|
|
||||||
bl schedule
|
|
||||||
b 6b
|
|
||||||
|
|
||||||
save_user_nvgprs:
|
|
||||||
lwz r8,TI_SIGFRAME(r12)
|
|
||||||
|
|
||||||
.macro savewords start, end
|
|
||||||
1: stw \start,4*(\start)(r8)
|
|
||||||
.section __ex_table,"a"
|
|
||||||
.align 2
|
|
||||||
.long 1b,save_user_nvgprs_fault
|
|
||||||
.previous
|
|
||||||
.if \end - \start
|
|
||||||
savewords "(\start+1)",\end
|
|
||||||
.endif
|
|
||||||
.endm
|
|
||||||
savewords 14,31
|
|
||||||
b save_user_nvgprs_cont
|
|
||||||
|
|
||||||
|
|
||||||
save_user_nvgprs_fault:
|
|
||||||
li r3,11 /* SIGSEGV */
|
|
||||||
lwz r4,TI_TASK(r12)
|
|
||||||
bl force_sigsegv
|
|
||||||
|
|
||||||
rlwinm r12,r1,0,0,18 /* current_thread_info() */
|
|
||||||
lwz r9,TI_FLAGS(r12)
|
|
||||||
b save_user_nvgprs_cont
|
|
||||||
|
|
||||||
#ifdef SHOW_SYSCALLS
|
#ifdef SHOW_SYSCALLS
|
||||||
do_show_syscall:
|
do_show_syscall:
|
||||||
|
@ -490,6 +435,14 @@ ppc_clone:
|
||||||
stw r0,TRAP(r1) /* register set saved */
|
stw r0,TRAP(r1) /* register set saved */
|
||||||
b sys_clone
|
b sys_clone
|
||||||
|
|
||||||
|
.globl ppc_swapcontext
|
||||||
|
ppc_swapcontext:
|
||||||
|
SAVE_NVGPRS(r1)
|
||||||
|
lwz r0,TRAP(r1)
|
||||||
|
rlwinm r0,r0,0,0,30 /* clear LSB to indicate full */
|
||||||
|
stw r0,TRAP(r1) /* register set saved */
|
||||||
|
b sys_swapcontext
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Top-level page fault handling.
|
* Top-level page fault handling.
|
||||||
* This is in assembler because if do_page_fault tells us that
|
* This is in assembler because if do_page_fault tells us that
|
||||||
|
@ -683,7 +636,7 @@ user_exc_return: /* r10 contains MSR_KERNEL here */
|
||||||
/* Check current_thread_info()->flags */
|
/* Check current_thread_info()->flags */
|
||||||
rlwinm r9,r1,0,0,18
|
rlwinm r9,r1,0,0,18
|
||||||
lwz r9,TI_FLAGS(r9)
|
lwz r9,TI_FLAGS(r9)
|
||||||
andi. r0,r9,(_TIF_SIGPENDING|_TIF_NEED_RESCHED|_TIF_RESTOREALL)
|
andi. r0,r9,(_TIF_SIGPENDING|_TIF_RESTORE_SIGMASK|_TIF_NEED_RESCHED)
|
||||||
bne do_work
|
bne do_work
|
||||||
|
|
||||||
restore_user:
|
restore_user:
|
||||||
|
|
|
@ -35,6 +35,8 @@
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/mutex.h>
|
#include <linux/mutex.h>
|
||||||
|
|
||||||
|
#include <asm/prom.h>
|
||||||
|
|
||||||
#include "windfarm.h"
|
#include "windfarm.h"
|
||||||
|
|
||||||
#define VERSION "0.2"
|
#define VERSION "0.2"
|
||||||
|
@ -465,6 +467,11 @@ static int __init windfarm_core_init(void)
|
||||||
{
|
{
|
||||||
DBG("wf: core loaded\n");
|
DBG("wf: core loaded\n");
|
||||||
|
|
||||||
|
/* Don't register on old machines that use therm_pm72 for now */
|
||||||
|
if (machine_is_compatible("PowerMac7,2") ||
|
||||||
|
machine_is_compatible("PowerMac7,3") ||
|
||||||
|
machine_is_compatible("RackMac3,1"))
|
||||||
|
return -ENODEV;
|
||||||
platform_device_register(&wf_platform_device);
|
platform_device_register(&wf_platform_device);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,8 @@
|
||||||
#include <linux/wait.h>
|
#include <linux/wait.h>
|
||||||
#include <linux/cpufreq.h>
|
#include <linux/cpufreq.h>
|
||||||
|
|
||||||
|
#include <asm/prom.h>
|
||||||
|
|
||||||
#include "windfarm.h"
|
#include "windfarm.h"
|
||||||
|
|
||||||
#define VERSION "0.3"
|
#define VERSION "0.3"
|
||||||
|
@ -74,6 +76,12 @@ static int __init wf_cpufreq_clamp_init(void)
|
||||||
{
|
{
|
||||||
struct wf_control *clamp;
|
struct wf_control *clamp;
|
||||||
|
|
||||||
|
/* Don't register on old machines that use therm_pm72 for now */
|
||||||
|
if (machine_is_compatible("PowerMac7,2") ||
|
||||||
|
machine_is_compatible("PowerMac7,3") ||
|
||||||
|
machine_is_compatible("RackMac3,1"))
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
clamp = kmalloc(sizeof(struct wf_control), GFP_KERNEL);
|
clamp = kmalloc(sizeof(struct wf_control), GFP_KERNEL);
|
||||||
if (clamp == NULL)
|
if (clamp == NULL)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
|
|
||||||
#include "windfarm.h"
|
#include "windfarm.h"
|
||||||
|
|
||||||
#define VERSION "0.1"
|
#define VERSION "0.2"
|
||||||
|
|
||||||
#undef DEBUG
|
#undef DEBUG
|
||||||
|
|
||||||
|
@ -113,6 +113,7 @@ static struct wf_lm75_sensor *wf_lm75_create(struct i2c_adapter *adapter,
|
||||||
const char *loc)
|
const char *loc)
|
||||||
{
|
{
|
||||||
struct wf_lm75_sensor *lm;
|
struct wf_lm75_sensor *lm;
|
||||||
|
int rc;
|
||||||
|
|
||||||
DBG("wf_lm75: creating %s device at address 0x%02x\n",
|
DBG("wf_lm75: creating %s device at address 0x%02x\n",
|
||||||
ds1775 ? "ds1775" : "lm75", addr);
|
ds1775 ? "ds1775" : "lm75", addr);
|
||||||
|
@ -139,9 +140,11 @@ static struct wf_lm75_sensor *wf_lm75_create(struct i2c_adapter *adapter,
|
||||||
lm->i2c.driver = &wf_lm75_driver;
|
lm->i2c.driver = &wf_lm75_driver;
|
||||||
strncpy(lm->i2c.name, lm->sens.name, I2C_NAME_SIZE-1);
|
strncpy(lm->i2c.name, lm->sens.name, I2C_NAME_SIZE-1);
|
||||||
|
|
||||||
if (i2c_attach_client(&lm->i2c)) {
|
rc = i2c_attach_client(&lm->i2c);
|
||||||
printk(KERN_ERR "windfarm: failed to attach %s %s to i2c\n",
|
if (rc) {
|
||||||
ds1775 ? "ds1775" : "lm75", lm->i2c.name);
|
printk(KERN_ERR "windfarm: failed to attach %s %s to i2c,"
|
||||||
|
" err %d\n", ds1775 ? "ds1775" : "lm75",
|
||||||
|
lm->i2c.name, rc);
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -175,16 +178,22 @@ static int wf_lm75_attach(struct i2c_adapter *adapter)
|
||||||
(dev = of_get_next_child(busnode, dev)) != NULL;) {
|
(dev = of_get_next_child(busnode, dev)) != NULL;) {
|
||||||
const char *loc =
|
const char *loc =
|
||||||
get_property(dev, "hwsensor-location", NULL);
|
get_property(dev, "hwsensor-location", NULL);
|
||||||
u32 *reg = (u32 *)get_property(dev, "reg", NULL);
|
u8 addr;
|
||||||
DBG(" dev: %s... (loc: %p, reg: %p)\n", dev->name, loc, reg);
|
|
||||||
if (loc == NULL || reg == NULL)
|
/* We must re-match the adapter in order to properly check
|
||||||
|
* the channel on multibus setups
|
||||||
|
*/
|
||||||
|
if (!pmac_i2c_match_adapter(dev, adapter))
|
||||||
|
continue;
|
||||||
|
addr = pmac_i2c_get_dev_addr(dev);
|
||||||
|
if (loc == NULL || addr == 0)
|
||||||
continue;
|
continue;
|
||||||
/* real lm75 */
|
/* real lm75 */
|
||||||
if (device_is_compatible(dev, "lm75"))
|
if (device_is_compatible(dev, "lm75"))
|
||||||
wf_lm75_create(adapter, *reg, 0, loc);
|
wf_lm75_create(adapter, addr, 0, loc);
|
||||||
/* ds1775 (compatible, better resolution */
|
/* ds1775 (compatible, better resolution */
|
||||||
else if (device_is_compatible(dev, "ds1775"))
|
else if (device_is_compatible(dev, "ds1775"))
|
||||||
wf_lm75_create(adapter, *reg, 1, loc);
|
wf_lm75_create(adapter, addr, 1, loc);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -206,6 +215,11 @@ static int wf_lm75_detach(struct i2c_client *client)
|
||||||
|
|
||||||
static int __init wf_lm75_sensor_init(void)
|
static int __init wf_lm75_sensor_init(void)
|
||||||
{
|
{
|
||||||
|
/* Don't register on old machines that use therm_pm72 for now */
|
||||||
|
if (machine_is_compatible("PowerMac7,2") ||
|
||||||
|
machine_is_compatible("PowerMac7,3") ||
|
||||||
|
machine_is_compatible("RackMac3,1"))
|
||||||
|
return -ENODEV;
|
||||||
return i2c_add_driver(&wf_lm75_driver);
|
return i2c_add_driver(&wf_lm75_driver);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
|
|
||||||
#include "windfarm.h"
|
#include "windfarm.h"
|
||||||
|
|
||||||
#define VERSION "0.1"
|
#define VERSION "0.2"
|
||||||
|
|
||||||
/* This currently only exports the external temperature sensor,
|
/* This currently only exports the external temperature sensor,
|
||||||
since that's all the control loops need. */
|
since that's all the control loops need. */
|
||||||
|
@ -81,7 +81,7 @@ static struct wf_sensor_ops wf_max6690_ops = {
|
||||||
static void wf_max6690_create(struct i2c_adapter *adapter, u8 addr)
|
static void wf_max6690_create(struct i2c_adapter *adapter, u8 addr)
|
||||||
{
|
{
|
||||||
struct wf_6690_sensor *max;
|
struct wf_6690_sensor *max;
|
||||||
char *name = "u4-temp";
|
char *name = "backside-temp";
|
||||||
|
|
||||||
max = kzalloc(sizeof(struct wf_6690_sensor), GFP_KERNEL);
|
max = kzalloc(sizeof(struct wf_6690_sensor), GFP_KERNEL);
|
||||||
if (max == NULL) {
|
if (max == NULL) {
|
||||||
|
@ -118,7 +118,6 @@ static int wf_max6690_attach(struct i2c_adapter *adapter)
|
||||||
struct device_node *busnode, *dev = NULL;
|
struct device_node *busnode, *dev = NULL;
|
||||||
struct pmac_i2c_bus *bus;
|
struct pmac_i2c_bus *bus;
|
||||||
const char *loc;
|
const char *loc;
|
||||||
u32 *reg;
|
|
||||||
|
|
||||||
bus = pmac_i2c_adapter_to_bus(adapter);
|
bus = pmac_i2c_adapter_to_bus(adapter);
|
||||||
if (bus == NULL)
|
if (bus == NULL)
|
||||||
|
@ -126,16 +125,23 @@ static int wf_max6690_attach(struct i2c_adapter *adapter)
|
||||||
busnode = pmac_i2c_get_bus_node(bus);
|
busnode = pmac_i2c_get_bus_node(bus);
|
||||||
|
|
||||||
while ((dev = of_get_next_child(busnode, dev)) != NULL) {
|
while ((dev = of_get_next_child(busnode, dev)) != NULL) {
|
||||||
|
u8 addr;
|
||||||
|
|
||||||
|
/* We must re-match the adapter in order to properly check
|
||||||
|
* the channel on multibus setups
|
||||||
|
*/
|
||||||
|
if (!pmac_i2c_match_adapter(dev, adapter))
|
||||||
|
continue;
|
||||||
if (!device_is_compatible(dev, "max6690"))
|
if (!device_is_compatible(dev, "max6690"))
|
||||||
continue;
|
continue;
|
||||||
|
addr = pmac_i2c_get_dev_addr(dev);
|
||||||
loc = get_property(dev, "hwsensor-location", NULL);
|
loc = get_property(dev, "hwsensor-location", NULL);
|
||||||
reg = (u32 *) get_property(dev, "reg", NULL);
|
if (loc == NULL || addr == 0)
|
||||||
if (!loc || !reg)
|
|
||||||
continue;
|
continue;
|
||||||
printk("found max6690, loc=%s reg=%x\n", loc, *reg);
|
printk("found max6690, loc=%s addr=0x%02x\n", loc, addr);
|
||||||
if (strcmp(loc, "BACKSIDE"))
|
if (strcmp(loc, "BACKSIDE"))
|
||||||
continue;
|
continue;
|
||||||
wf_max6690_create(adapter, *reg);
|
wf_max6690_create(adapter, addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -153,6 +159,11 @@ static int wf_max6690_detach(struct i2c_client *client)
|
||||||
|
|
||||||
static int __init wf_max6690_sensor_init(void)
|
static int __init wf_max6690_sensor_init(void)
|
||||||
{
|
{
|
||||||
|
/* Don't register on old machines that use therm_pm72 for now */
|
||||||
|
if (machine_is_compatible("PowerMac7,2") ||
|
||||||
|
machine_is_compatible("PowerMac7,3") ||
|
||||||
|
machine_is_compatible("RackMac3,1"))
|
||||||
|
return -ENODEV;
|
||||||
return i2c_add_driver(&wf_max6690_driver);
|
return i2c_add_driver(&wf_max6690_driver);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -358,6 +358,7 @@ static void backside_fan_tick(void)
|
||||||
return;
|
return;
|
||||||
if (!backside_tick) {
|
if (!backside_tick) {
|
||||||
/* first time; initialize things */
|
/* first time; initialize things */
|
||||||
|
printk(KERN_INFO "windfarm: Backside control loop started.\n");
|
||||||
backside_param.min = backside_fan->ops->get_min(backside_fan);
|
backside_param.min = backside_fan->ops->get_min(backside_fan);
|
||||||
backside_param.max = backside_fan->ops->get_max(backside_fan);
|
backside_param.max = backside_fan->ops->get_max(backside_fan);
|
||||||
wf_pid_init(&backside_pid, &backside_param);
|
wf_pid_init(&backside_pid, &backside_param);
|
||||||
|
@ -407,6 +408,7 @@ static void drive_bay_fan_tick(void)
|
||||||
return;
|
return;
|
||||||
if (!drive_bay_tick) {
|
if (!drive_bay_tick) {
|
||||||
/* first time; initialize things */
|
/* first time; initialize things */
|
||||||
|
printk(KERN_INFO "windfarm: Drive bay control loop started.\n");
|
||||||
drive_bay_prm.min = drive_bay_fan->ops->get_min(drive_bay_fan);
|
drive_bay_prm.min = drive_bay_fan->ops->get_min(drive_bay_fan);
|
||||||
drive_bay_prm.max = drive_bay_fan->ops->get_max(drive_bay_fan);
|
drive_bay_prm.max = drive_bay_fan->ops->get_max(drive_bay_fan);
|
||||||
wf_pid_init(&drive_bay_pid, &drive_bay_prm);
|
wf_pid_init(&drive_bay_pid, &drive_bay_prm);
|
||||||
|
@ -458,6 +460,7 @@ static void slots_fan_tick(void)
|
||||||
return;
|
return;
|
||||||
if (!slots_started) {
|
if (!slots_started) {
|
||||||
/* first time; initialize things */
|
/* first time; initialize things */
|
||||||
|
printk(KERN_INFO "windfarm: Slots control loop started.\n");
|
||||||
wf_pid_init(&slots_pid, &slots_param);
|
wf_pid_init(&slots_pid, &slots_param);
|
||||||
slots_started = 1;
|
slots_started = 1;
|
||||||
}
|
}
|
||||||
|
@ -504,6 +507,7 @@ static void pm112_tick(void)
|
||||||
|
|
||||||
if (!started) {
|
if (!started) {
|
||||||
started = 1;
|
started = 1;
|
||||||
|
printk(KERN_INFO "windfarm: CPUs control loops started.\n");
|
||||||
for (i = 0; i < nr_cores; ++i) {
|
for (i = 0; i < nr_cores; ++i) {
|
||||||
if (create_cpu_loop(i) < 0) {
|
if (create_cpu_loop(i) < 0) {
|
||||||
failure_state = FAILURE_PERM;
|
failure_state = FAILURE_PERM;
|
||||||
|
@ -594,8 +598,6 @@ static void pm112_new_sensor(struct wf_sensor *sr)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
if (have_all_sensors)
|
|
||||||
return;
|
|
||||||
if (!strncmp(sr->name, "cpu-temp-", 9)) {
|
if (!strncmp(sr->name, "cpu-temp-", 9)) {
|
||||||
i = sr->name[9] - '0';
|
i = sr->name[9] - '0';
|
||||||
if (sr->name[10] == 0 && i < NR_CORES &&
|
if (sr->name[10] == 0 && i < NR_CORES &&
|
||||||
|
@ -613,7 +615,7 @@ static void pm112_new_sensor(struct wf_sensor *sr)
|
||||||
} else if (!strcmp(sr->name, "slots-power")) {
|
} else if (!strcmp(sr->name, "slots-power")) {
|
||||||
if (slots_power == NULL && wf_get_sensor(sr) == 0)
|
if (slots_power == NULL && wf_get_sensor(sr) == 0)
|
||||||
slots_power = sr;
|
slots_power = sr;
|
||||||
} else if (!strcmp(sr->name, "u4-temp")) {
|
} else if (!strcmp(sr->name, "backside-temp")) {
|
||||||
if (u4_temp == NULL && wf_get_sensor(sr) == 0)
|
if (u4_temp == NULL && wf_get_sensor(sr) == 0)
|
||||||
u4_temp = sr;
|
u4_temp = sr;
|
||||||
} else
|
} else
|
||||||
|
|
|
@ -20,6 +20,8 @@
|
||||||
#define PPC_FEATURE_POWER5_PLUS 0x00020000
|
#define PPC_FEATURE_POWER5_PLUS 0x00020000
|
||||||
#define PPC_FEATURE_CELL 0x00010000
|
#define PPC_FEATURE_CELL 0x00010000
|
||||||
#define PPC_FEATURE_BOOKE 0x00008000
|
#define PPC_FEATURE_BOOKE 0x00008000
|
||||||
|
#define PPC_FEATURE_SMT 0x00004000
|
||||||
|
#define PPC_FEATURE_ICACHE_SNOOP 0x00002000
|
||||||
|
|
||||||
#ifdef __KERNEL__
|
#ifdef __KERNEL__
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
|
@ -88,4 +88,4 @@
|
||||||
(((addr) >> PUD_SHIFT) & (PTRS_PER_PUD - 1)))
|
(((addr) >> PUD_SHIFT) & (PTRS_PER_PUD - 1)))
|
||||||
|
|
||||||
#define pud_ERROR(e) \
|
#define pud_ERROR(e) \
|
||||||
printk("%s:%d: bad pmd %08lx.\n", __FILE__, __LINE__, pud_val(e))
|
printk("%s:%d: bad pud %08lx.\n", __FILE__, __LINE__, pud_val(e))
|
||||||
|
|
|
@ -37,7 +37,6 @@ struct thread_info {
|
||||||
int preempt_count; /* 0 => preemptable,
|
int preempt_count; /* 0 => preemptable,
|
||||||
<0 => BUG */
|
<0 => BUG */
|
||||||
struct restart_block restart_block;
|
struct restart_block restart_block;
|
||||||
void __user *nvgprs_frame;
|
|
||||||
/* low level flags - has atomic operations done on it */
|
/* low level flags - has atomic operations done on it */
|
||||||
unsigned long flags ____cacheline_aligned_in_smp;
|
unsigned long flags ____cacheline_aligned_in_smp;
|
||||||
};
|
};
|
||||||
|
@ -120,7 +119,6 @@ static inline struct thread_info *current_thread_info(void)
|
||||||
#define TIF_MEMDIE 10
|
#define TIF_MEMDIE 10
|
||||||
#define TIF_SECCOMP 11 /* secure computing */
|
#define TIF_SECCOMP 11 /* secure computing */
|
||||||
#define TIF_RESTOREALL 12 /* Restore all regs (implies NOERROR) */
|
#define TIF_RESTOREALL 12 /* Restore all regs (implies NOERROR) */
|
||||||
#define TIF_SAVE_NVGPRS 13 /* Save r14-r31 in signal frame */
|
|
||||||
#define TIF_NOERROR 14 /* Force successful syscall return */
|
#define TIF_NOERROR 14 /* Force successful syscall return */
|
||||||
#define TIF_RESTORE_SIGMASK 15 /* Restore signal mask in do_signal */
|
#define TIF_RESTORE_SIGMASK 15 /* Restore signal mask in do_signal */
|
||||||
|
|
||||||
|
@ -137,15 +135,13 @@ static inline struct thread_info *current_thread_info(void)
|
||||||
#define _TIF_SINGLESTEP (1<<TIF_SINGLESTEP)
|
#define _TIF_SINGLESTEP (1<<TIF_SINGLESTEP)
|
||||||
#define _TIF_SECCOMP (1<<TIF_SECCOMP)
|
#define _TIF_SECCOMP (1<<TIF_SECCOMP)
|
||||||
#define _TIF_RESTOREALL (1<<TIF_RESTOREALL)
|
#define _TIF_RESTOREALL (1<<TIF_RESTOREALL)
|
||||||
#define _TIF_SAVE_NVGPRS (1<<TIF_SAVE_NVGPRS)
|
|
||||||
#define _TIF_NOERROR (1<<TIF_NOERROR)
|
#define _TIF_NOERROR (1<<TIF_NOERROR)
|
||||||
#define _TIF_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK)
|
#define _TIF_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK)
|
||||||
#define _TIF_SYSCALL_T_OR_A (_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SECCOMP)
|
#define _TIF_SYSCALL_T_OR_A (_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SECCOMP)
|
||||||
|
|
||||||
#define _TIF_USER_WORK_MASK (_TIF_NOTIFY_RESUME | _TIF_SIGPENDING | \
|
#define _TIF_USER_WORK_MASK (_TIF_NOTIFY_RESUME | _TIF_SIGPENDING | \
|
||||||
_TIF_NEED_RESCHED | _TIF_RESTOREALL | \
|
_TIF_NEED_RESCHED | _TIF_RESTORE_SIGMASK)
|
||||||
_TIF_RESTORE_SIGMASK)
|
#define _TIF_PERSYSCALL_MASK (_TIF_RESTOREALL|_TIF_NOERROR)
|
||||||
#define _TIF_PERSYSCALL_MASK (_TIF_RESTOREALL|_TIF_NOERROR|_TIF_SAVE_NVGPRS)
|
|
||||||
|
|
||||||
#endif /* __KERNEL__ */
|
#endif /* __KERNEL__ */
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue