Commit 135637aa authored by Kumar Gala's avatar Kumar Gala

Merge branch 'master' into 83xx

parents 97c5a20a d003e7a1
...@@ -436,6 +436,21 @@ config PPC_MPC52xx ...@@ -436,6 +436,21 @@ config PPC_MPC52xx
bool bool
default n default n
config PPC_MPC5200
bool
select PPC_MPC52xx
default n
config PPC_MPC5200_BUGFIX
bool "MPC5200 (L25R) bugfix support"
depends on PPC_MPC5200
default n
help
Enable workarounds for original MPC5200 errata. This is not required
for MPC5200B based boards.
It is safe to say 'Y' here
config PPC_EFIKA config PPC_EFIKA
bool "bPlan Efika 5k2. MPC5200B based computer" bool "bPlan Efika 5k2. MPC5200B based computer"
depends on PPC_MULTIPLATFORM && PPC32 depends on PPC_MULTIPLATFORM && PPC32
...@@ -448,7 +463,7 @@ config PPC_EFIKA ...@@ -448,7 +463,7 @@ config PPC_EFIKA
config PPC_LITE5200 config PPC_LITE5200
bool "Freescale Lite5200 Eval Board" bool "Freescale Lite5200 Eval Board"
depends on PPC_MULTIPLATFORM && PPC32 depends on PPC_MULTIPLATFORM && PPC32
select PPC_MPC52xx select PPC_MPC5200
default n default n
config PPC_PMAC config PPC_PMAC
...@@ -1206,7 +1221,7 @@ source "arch/powerpc/oprofile/Kconfig" ...@@ -1206,7 +1221,7 @@ source "arch/powerpc/oprofile/Kconfig"
config KPROBES config KPROBES
bool "Kprobes (EXPERIMENTAL)" bool "Kprobes (EXPERIMENTAL)"
depends on PPC64 && KALLSYMS && EXPERIMENTAL && MODULES depends on !BOOKE && !4xx && KALLSYMS && EXPERIMENTAL && MODULES
help help
Kprobes allows you to trap at almost any kernel address and Kprobes allows you to trap at almost any kernel address and
execute a callback function. register_kprobe() establishes execute a callback function. register_kprobe() establishes
......
...@@ -281,10 +281,10 @@ void do_IRQ(struct pt_regs *regs) ...@@ -281,10 +281,10 @@ void do_IRQ(struct pt_regs *regs)
/* /*
* Every platform is required to implement ppc_md.get_irq. * Every platform is required to implement ppc_md.get_irq.
* This function will either return an irq number or -1 to * This function will either return an irq number or NO_IRQ to
* indicate there are no more pending. * indicate there are no more pending.
* The value -2 is for buggy hardware and means that this IRQ * The value NO_IRQ_IGNORE is for buggy hardware and means that this
* has already been handled. -- Tom * IRQ has already been handled. -- Tom
*/ */
irq = ppc_md.get_irq(); irq = ppc_md.get_irq();
......
...@@ -46,8 +46,8 @@ int __kprobes arch_prepare_kprobe(struct kprobe *p) ...@@ -46,8 +46,8 @@ int __kprobes arch_prepare_kprobe(struct kprobe *p)
if ((unsigned long)p->addr & 0x03) { if ((unsigned long)p->addr & 0x03) {
printk("Attempt to register kprobe at an unaligned address\n"); printk("Attempt to register kprobe at an unaligned address\n");
ret = -EINVAL; ret = -EINVAL;
} else if (IS_MTMSRD(insn) || IS_RFID(insn)) { } else if (IS_MTMSRD(insn) || IS_RFID(insn) || IS_RFI(insn)) {
printk("Cannot register a kprobe on rfid or mtmsrd\n"); printk("Cannot register a kprobe on rfi/rfid or mtmsr[d]\n");
ret = -EINVAL; ret = -EINVAL;
} }
...@@ -483,8 +483,12 @@ int __kprobes setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs) ...@@ -483,8 +483,12 @@ int __kprobes setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs)
memcpy(&kcb->jprobe_saved_regs, regs, sizeof(struct pt_regs)); memcpy(&kcb->jprobe_saved_regs, regs, sizeof(struct pt_regs));
/* setup return addr to the jprobe handler routine */ /* setup return addr to the jprobe handler routine */
#ifdef CONFIG_PPC64
regs->nip = (unsigned long)(((func_descr_t *)jp->entry)->entry); regs->nip = (unsigned long)(((func_descr_t *)jp->entry)->entry);
regs->gpr[2] = (unsigned long)(((func_descr_t *)jp->entry)->toc); regs->gpr[2] = (unsigned long)(((func_descr_t *)jp->entry)->toc);
#else
regs->nip = (unsigned long)jp->entry;
#endif
return 1; return 1;
} }
......
...@@ -439,6 +439,10 @@ static ssize_t lparcfg_write(struct file *file, const char __user * buf, ...@@ -439,6 +439,10 @@ static ssize_t lparcfg_write(struct file *file, const char __user * buf,
ssize_t retval = -ENOMEM; ssize_t retval = -ENOMEM;
if (!firmware_has_feature(FW_FEATURE_SPLPAR) ||
firmware_has_feature(FW_FEATURE_ISERIES))
return -EINVAL;
kbuf = kmalloc(count, GFP_KERNEL); kbuf = kmalloc(count, GFP_KERNEL);
if (!kbuf) if (!kbuf)
goto out; goto out;
...@@ -517,7 +521,7 @@ static int pseries_lparcfg_data(struct seq_file *m, void *v) ...@@ -517,7 +521,7 @@ static int pseries_lparcfg_data(struct seq_file *m, void *v)
static ssize_t lparcfg_write(struct file *file, const char __user * buf, static ssize_t lparcfg_write(struct file *file, const char __user * buf,
size_t count, loff_t * off) size_t count, loff_t * off)
{ {
return count; return -EINVAL;
} }
#endif /* CONFIG_PPC_PSERIES */ #endif /* CONFIG_PPC_PSERIES */
...@@ -570,6 +574,7 @@ static int lparcfg_open(struct inode *inode, struct file *file) ...@@ -570,6 +574,7 @@ static int lparcfg_open(struct inode *inode, struct file *file)
struct file_operations lparcfg_fops = { struct file_operations lparcfg_fops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.read = seq_read, .read = seq_read,
.write = lparcfg_write,
.open = lparcfg_open, .open = lparcfg_open,
.release = single_release, .release = single_release,
}; };
...@@ -581,10 +586,8 @@ int __init lparcfg_init(void) ...@@ -581,10 +586,8 @@ int __init lparcfg_init(void)
/* Allow writing if we have FW_FEATURE_SPLPAR */ /* Allow writing if we have FW_FEATURE_SPLPAR */
if (firmware_has_feature(FW_FEATURE_SPLPAR) && if (firmware_has_feature(FW_FEATURE_SPLPAR) &&
!firmware_has_feature(FW_FEATURE_ISERIES)) { !firmware_has_feature(FW_FEATURE_ISERIES))
lparcfg_fops.write = lparcfg_write;
mode |= S_IWUSR; mode |= S_IWUSR;
}
ent = create_proc_entry("ppc64/lparcfg", mode, NULL); ent = create_proc_entry("ppc64/lparcfg", mode, NULL);
if (ent) { if (ent) {
......
...@@ -65,6 +65,7 @@ int have_of = 1; ...@@ -65,6 +65,7 @@ int have_of = 1;
#ifdef CONFIG_VGA_CONSOLE #ifdef CONFIG_VGA_CONSOLE
unsigned long vgacon_remap_base; unsigned long vgacon_remap_base;
EXPORT_SYMBOL(vgacon_remap_base);
#endif #endif
/* /*
......
...@@ -535,34 +535,40 @@ static void emulate_single_step(struct pt_regs *regs) ...@@ -535,34 +535,40 @@ static void emulate_single_step(struct pt_regs *regs)
} }
} }
static void parse_fpe(struct pt_regs *regs) static inline int __parse_fpscr(unsigned long fpscr)
{ {
int code = 0; int ret = 0;
unsigned long fpscr;
flush_fp_to_thread(current);
fpscr = current->thread.fpscr.val;
/* Invalid operation */ /* Invalid operation */
if ((fpscr & FPSCR_VE) && (fpscr & FPSCR_VX)) if ((fpscr & FPSCR_VE) && (fpscr & FPSCR_VX))
code = FPE_FLTINV; ret = FPE_FLTINV;
/* Overflow */ /* Overflow */
else if ((fpscr & FPSCR_OE) && (fpscr & FPSCR_OX)) else if ((fpscr & FPSCR_OE) && (fpscr & FPSCR_OX))
code = FPE_FLTOVF; ret = FPE_FLTOVF;
/* Underflow */ /* Underflow */
else if ((fpscr & FPSCR_UE) && (fpscr & FPSCR_UX)) else if ((fpscr & FPSCR_UE) && (fpscr & FPSCR_UX))
code = FPE_FLTUND; ret = FPE_FLTUND;
/* Divide by zero */ /* Divide by zero */
else if ((fpscr & FPSCR_ZE) && (fpscr & FPSCR_ZX)) else if ((fpscr & FPSCR_ZE) && (fpscr & FPSCR_ZX))
code = FPE_FLTDIV; ret = FPE_FLTDIV;
/* Inexact result */ /* Inexact result */
else if ((fpscr & FPSCR_XE) && (fpscr & FPSCR_XX)) else if ((fpscr & FPSCR_XE) && (fpscr & FPSCR_XX))
code = FPE_FLTRES; ret = FPE_FLTRES;
return ret;
}
static void parse_fpe(struct pt_regs *regs)
{
int code = 0;
flush_fp_to_thread(current);
code = __parse_fpscr(current->thread.fpscr.val);
_exception(SIGFPE, regs, code, regs->nip); _exception(SIGFPE, regs, code, regs->nip);
} }
...@@ -739,20 +745,7 @@ void __kprobes program_check_exception(struct pt_regs *regs) ...@@ -739,20 +745,7 @@ void __kprobes program_check_exception(struct pt_regs *regs)
extern int do_mathemu(struct pt_regs *regs); extern int do_mathemu(struct pt_regs *regs);
/* We can now get here via a FP Unavailable exception if the core /* We can now get here via a FP Unavailable exception if the core
* has no FPU, in that case no reason flags will be set */ * has no FPU, in that case the reason flags will be 0 */
#ifdef CONFIG_MATH_EMULATION
/* (reason & REASON_ILLEGAL) would be the obvious thing here,
* but there seems to be a hardware bug on the 405GP (RevD)
* that means ESR is sometimes set incorrectly - either to
* ESR_DST (!?) or 0. In the process of chasing this with the
* hardware people - not sure if it can happen on any illegal
* instruction or only on FP instructions, whether there is a
* pattern to occurences etc. -dgibson 31/Mar/2003 */
if (!(reason & REASON_TRAP) && do_mathemu(regs) == 0) {
emulate_single_step(regs);
return;
}
#endif /* CONFIG_MATH_EMULATION */
if (reason & REASON_FP) { if (reason & REASON_FP) {
/* IEEE FP exception */ /* IEEE FP exception */
...@@ -778,6 +771,31 @@ void __kprobes program_check_exception(struct pt_regs *regs) ...@@ -778,6 +771,31 @@ void __kprobes program_check_exception(struct pt_regs *regs)
local_irq_enable(); local_irq_enable();
#ifdef CONFIG_MATH_EMULATION
/* (reason & REASON_ILLEGAL) would be the obvious thing here,
* but there seems to be a hardware bug on the 405GP (RevD)
* that means ESR is sometimes set incorrectly - either to
* ESR_DST (!?) or 0. In the process of chasing this with the
* hardware people - not sure if it can happen on any illegal
* instruction or only on FP instructions, whether there is a
* pattern to occurences etc. -dgibson 31/Mar/2003 */
switch (do_mathemu(regs)) {
case 0:
emulate_single_step(regs);
return;
case 1: {
int code = 0;
code = __parse_fpscr(current->thread.fpscr.val);
_exception(SIGFPE, regs, code, regs->nip);
return;
}
case -EFAULT:
_exception(SIGSEGV, regs, SEGV_MAPERR, regs->nip);
return;
}
/* fall through on any other errors */
#endif /* CONFIG_MATH_EMULATION */
/* 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)) {
...@@ -891,18 +909,39 @@ void SoftwareEmulation(struct pt_regs *regs) ...@@ -891,18 +909,39 @@ void SoftwareEmulation(struct pt_regs *regs)
#ifdef CONFIG_MATH_EMULATION #ifdef CONFIG_MATH_EMULATION
errcode = do_mathemu(regs); errcode = do_mathemu(regs);
switch (errcode) {
case 0:
emulate_single_step(regs);
return;
case 1: {
int code = 0;
code = __parse_fpscr(current->thread.fpscr.val);
_exception(SIGFPE, regs, code, regs->nip);
return;
}
case -EFAULT:
_exception(SIGSEGV, regs, SEGV_MAPERR, regs->nip);
return;
default:
_exception(SIGILL, regs, ILL_ILLOPC, regs->nip);
return;
}
#else #else
errcode = Soft_emulate_8xx(regs); errcode = Soft_emulate_8xx(regs);
#endif switch (errcode) {
if (errcode) { case 0:
if (errcode > 0)
_exception(SIGFPE, regs, 0, 0);
else if (errcode == -EFAULT)
_exception(SIGSEGV, regs, 0, 0);
else
_exception(SIGILL, regs, ILL_ILLOPC, regs->nip);
} else
emulate_single_step(regs); emulate_single_step(regs);
return;
case 1:
_exception(SIGILL, regs, ILL_ILLOPC, regs->nip);
return;
case -EFAULT:
_exception(SIGSEGV, regs, SEGV_MAPERR, regs->nip);
return;
}
#endif
} }
#endif /* CONFIG_8xx */ #endif /* CONFIG_8xx */
......
...@@ -16,11 +16,11 @@ obj-$(CONFIG_PPC64) += checksum_64.o copypage_64.o copyuser_64.o \ ...@@ -16,11 +16,11 @@ obj-$(CONFIG_PPC64) += checksum_64.o copypage_64.o copyuser_64.o \
strcase.o strcase.o
obj-$(CONFIG_QUICC_ENGINE) += rheap.o obj-$(CONFIG_QUICC_ENGINE) += rheap.o
obj-$(CONFIG_XMON) += sstep.o obj-$(CONFIG_XMON) += sstep.o
obj-$(CONFIG_KPROBES) += sstep.o
obj-$(CONFIG_NOT_COHERENT_CACHE) += dma-noncoherent.o obj-$(CONFIG_NOT_COHERENT_CACHE) += dma-noncoherent.o
ifeq ($(CONFIG_PPC64),y) ifeq ($(CONFIG_PPC64),y)
obj-$(CONFIG_SMP) += locks.o obj-$(CONFIG_SMP) += locks.o
obj-$(CONFIG_DEBUG_KERNEL) += sstep.o
endif endif
# Temporary hack until we have migrated to asm-powerpc # Temporary hack until we have migrated to asm-powerpc
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
*/ */
#include <linux/types.h> #include <linux/types.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/kernel.h>
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/slab.h> #include <linux/slab.h>
...@@ -671,7 +672,7 @@ void rh_dump(rh_info_t * info) ...@@ -671,7 +672,7 @@ void rh_dump(rh_info_t * info)
int maxnr; int maxnr;
int i, nr; int i, nr;
maxnr = sizeof(st) / sizeof(st[0]); maxnr = ARRAY_SIZE(st);
printk(KERN_INFO printk(KERN_INFO
"info @0x%p (%d slots empty / %d max)\n", "info @0x%p (%d slots empty / %d max)\n",
......
...@@ -61,10 +61,6 @@ unsigned long memory_limit; ...@@ -61,10 +61,6 @@ unsigned long memory_limit;
extern void hash_preload(struct mm_struct *mm, unsigned long ea, extern void hash_preload(struct mm_struct *mm, unsigned long ea,
unsigned long access, unsigned long trap); unsigned long access, unsigned long trap);
/*
* This is called by /dev/mem to know if a given address has to
* be mapped non-cacheable or not
*/
int page_is_ram(unsigned long pfn) int page_is_ram(unsigned long pfn)
{ {
unsigned long paddr = (pfn << PAGE_SHIFT); unsigned long paddr = (pfn << PAGE_SHIFT);
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
# #
ifeq ($(CONFIG_PPC_MERGE),y) ifeq ($(CONFIG_PPC_MERGE),y)
obj-y += mpc52xx_pic.o mpc52xx_common.o obj-y += mpc52xx_pic.o mpc52xx_common.o
obj-$(CONFIG_PCI) += mpc52xx_pci.o
endif endif
obj-$(CONFIG_PPC_EFIKA) += efika-setup.o efika-pci.o obj-$(CONFIG_PPC_EFIKA) += efika-setup.o efika-pci.o
......
...@@ -107,6 +107,12 @@ static void __init lite52xx_setup_arch(void) ...@@ -107,6 +107,12 @@ static void __init lite52xx_setup_arch(void)
mpc52xx_setup_cpu(); /* Generic */ mpc52xx_setup_cpu(); /* Generic */
lite52xx_setup_cpu(); /* Platorm specific */ lite52xx_setup_cpu(); /* Platorm specific */
#ifdef CONFIG_PCI
np = of_find_node_by_type(np, "pci");
if (np)
mpc52xx_add_bridge(np);
#endif
#ifdef CONFIG_BLK_DEV_INITRD #ifdef CONFIG_BLK_DEV_INITRD
if (initrd_start) if (initrd_start)
ROOT_DEV = Root_RAM0; ROOT_DEV = Root_RAM0;
......
This diff is collapsed.
...@@ -59,6 +59,7 @@ firmware_features_table[FIRMWARE_MAX_FEATURES] = { ...@@ -59,6 +59,7 @@ firmware_features_table[FIRMWARE_MAX_FEATURES] = {
{FW_FEATURE_XDABR, "hcall-xdabr"}, {FW_FEATURE_XDABR, "hcall-xdabr"},
{FW_FEATURE_MULTITCE, "hcall-multi-tce"}, {FW_FEATURE_MULTITCE, "hcall-multi-tce"},
{FW_FEATURE_SPLPAR, "hcall-splpar"}, {FW_FEATURE_SPLPAR, "hcall-splpar"},
{FW_FEATURE_BULK_REMOVE, "hcall-bulk"},
}; };
/* Build up the firmware features bitmask using the contents of /* Build up the firmware features bitmask using the contents of
......
...@@ -516,7 +516,7 @@ static void pSeries_lpar_hpte_invalidate(unsigned long slot, unsigned long va, ...@@ -516,7 +516,7 @@ static void pSeries_lpar_hpte_invalidate(unsigned long slot, unsigned long va,
static void pSeries_lpar_flush_hash_range(unsigned long number, int local) static void pSeries_lpar_flush_hash_range(unsigned long number, int local)
{ {
unsigned long i, pix, rc; unsigned long i, pix, rc;
unsigned long flags; unsigned long flags = 0;
struct ppc64_tlb_batch *batch = &__get_cpu_var(ppc64_tlb_batch); struct ppc64_tlb_batch *batch = &__get_cpu_var(ppc64_tlb_batch);
int lock_tlbie = !cpu_has_feature(CPU_FTR_LOCKLESS_TLBIE); int lock_tlbie = !cpu_has_feature(CPU_FTR_LOCKLESS_TLBIE);
unsigned long param[9]; unsigned long param[9];
...@@ -540,16 +540,22 @@ static void pSeries_lpar_flush_hash_range(unsigned long number, int local) ...@@ -540,16 +540,22 @@ static void pSeries_lpar_flush_hash_range(unsigned long number, int local)
hash = ~hash; hash = ~hash;
slot = (hash & htab_hash_mask) * HPTES_PER_GROUP; slot = (hash & htab_hash_mask) * HPTES_PER_GROUP;
slot += hidx & _PTEIDX_GROUP_IX; slot += hidx & _PTEIDX_GROUP_IX;
param[pix] = HBR_REQUEST | HBR_AVPN | slot; if (!firmware_has_feature(FW_FEATURE_BULK_REMOVE)) {
param[pix+1] = hpte_encode_v(va, psize) & HPTE_V_AVPN; pSeries_lpar_hpte_invalidate(slot, va, psize,
pix += 2; local);
if (pix == 8) { } else {
rc = plpar_hcall9(H_BULK_REMOVE, param, param[pix] = HBR_REQUEST | HBR_AVPN | slot;
param[pix+1] = hpte_encode_v(va, psize) &
HPTE_V_AVPN;
pix += 2;
if (pix == 8) {
rc = plpar_hcall9(H_BULK_REMOVE, param,
param[0], param[1], param[2], param[0], param[1], param[2],
param[3], param[4], param[5], param[3], param[4], param[5],
param[6], param[7]); param[6], param[7]);
BUG_ON(rc != H_SUCCESS); BUG_ON(rc != H_SUCCESS);
pix = 0; pix = 0;
}
} }
} pte_iterate_hashed_end(); } pte_iterate_hashed_end();
} }
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
02110-1301, USA. */ 02110-1301, USA. */
#include <linux/stddef.h> #include <linux/stddef.h>
#include <linux/kernel.h>
#include "nonstdio.h" #include "nonstdio.h"
#include "ppc.h" #include "ppc.h"
...@@ -4932,8 +4933,7 @@ const struct powerpc_opcode powerpc_opcodes[] = { ...@@ -4932,8 +4933,7 @@ const struct powerpc_opcode powerpc_opcodes[] = {
}; };
const int powerpc_num_opcodes = const int powerpc_num_opcodes = ARRAY_SIZE(powerpc_opcodes);
sizeof (powerpc_opcodes) / sizeof (powerpc_opcodes[0]);
/* The macro table. This is only used by the assembler. */ /* The macro table. This is only used by the assembler. */
...@@ -4989,5 +4989,4 @@ const struct powerpc_macro powerpc_macros[] = { ...@@ -4989,5 +4989,4 @@ const struct powerpc_macro powerpc_macros[] = {
{ "clrlslwi.",4, PPCCOM, "rlwinm. %0,%1,%3,(%2)-(%3),31-(%3)" }, { "clrlslwi.",4, PPCCOM, "rlwinm. %0,%1,%3,(%2)-(%3),31-(%3)" },
}; };
const int powerpc_num_macros = const int powerpc_num_macros = ARRAY_SIZE(powerpc_macros);
sizeof (powerpc_macros) / sizeof (powerpc_macros[0]);
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
with this program; if not, write to the Free Software Foundation, Inc., with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
#include <linux/kernel.h>
#include "spu.h" #include "spu.h"
/* This file holds the Spu opcode table */ /* This file holds the Spu opcode table */
...@@ -40,5 +41,4 @@ const struct spu_opcode spu_opcodes[] = { ...@@ -40,5 +41,4 @@ const struct spu_opcode spu_opcodes[] = {
#undef APUOPFB #undef APUOPFB
}; };
const int spu_num_opcodes = const int spu_num_opcodes = ARRAY_SIZE(spu_opcodes);
sizeof (spu_opcodes) / sizeof (spu_opcodes[0]);
...@@ -1379,7 +1379,6 @@ static void cs_nosound(unsigned long xx) ...@@ -1379,7 +1379,6 @@ static void cs_nosound(unsigned long xx)
} }
static DEFINE_TIMER(beep_timer, cs_nosound, 0, 0); static DEFINE_TIMER(beep_timer, cs_nosound, 0, 0);
};
static void cs_mksound(unsigned int hz, unsigned int ticks) static void cs_mksound(unsigned int hz, unsigned int ticks)
{ {
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
*/ */
#include <linux/types.h> #include <linux/types.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/kernel.h>
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/slab.h> #include <linux/slab.h>
...@@ -654,7 +655,7 @@ void rh_dump(rh_info_t * info) ...@@ -654,7 +655,7 @@ void rh_dump(rh_info_t * info)
int maxnr; int maxnr;
int i, nr; int i, nr;
maxnr = sizeof(st) / sizeof(st[0]); maxnr = ARRAY_SIZE(st);
printk(KERN_INFO printk(KERN_INFO
"info @0x%p (%d slots empty / %d max)\n", "info @0x%p (%d slots empty / %d max)\n",
......
...@@ -105,7 +105,8 @@ void idma_pci9_init(void) ...@@ -105,7 +105,8 @@ void idma_pci9_init(void)
idma_reg[IDMA_CHAN].idmr = 0; /* mask all IDMA interrupts */ idma_reg[IDMA_CHAN].idmr = 0; /* mask all IDMA interrupts */
idma_reg[IDMA_CHAN].idsr = 0xff; /* clear all event flags */ idma_reg[IDMA_CHAN].idsr = 0xff; /* clear all event flags */
printk("<4>Using IDMA%d for MPC8260 device erratum PCI 9 workaround\n", printk(KERN_WARNING
"Using IDMA%d for MPC8260 device erratum PCI 9 workaround\n",
IDMA_CHAN + 1); IDMA_CHAN + 1);
return; return;
......
...@@ -77,7 +77,7 @@ static struct mtd_partition mpc8xxads_partitions[] = { ...@@ -77,7 +77,7 @@ static struct mtd_partition mpc8xxads_partitions[] = {
} }
}; };
#define mpc8xxads_part_num (sizeof (mpc8xxads_partitions) / sizeof (mpc8xxads_partitions[0])) #define mpc8xxads_part_num ARRAY_SIZE(mpc8xxads_partitions)
#endif #endif
......
...@@ -19,6 +19,7 @@ along with this file; see the file COPYING. If not, write to the Free ...@@ -19,6 +19,7 @@ along with this file; see the file COPYING. If not, write to the Free
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include <linux/posix_types.h> #include <linux/posix_types.h>
#include <linux/kernel.h>
#include "ansidecl.h" #include "ansidecl.h"
#include "ppc.h" #include "ppc.h"
...@@ -2669,8 +2670,7 @@ const struct powerpc_opcode powerpc_opcodes[] = { ...@@ -2669,8 +2670,7 @@ const struct powerpc_opcode powerpc_opcodes[] = {
}; };
const int powerpc_num_opcodes = const int powerpc_num_opcodes = ARRAY_SIZE(powerpc_opcodes);
sizeof (powerpc_opcodes) / sizeof (powerpc_opcodes[0]);
/* The macro table. This is only used by the assembler. */ /* The macro table. This is only used by the assembler. */
...@@ -2717,5 +2717,4 @@ const struct powerpc_macro powerpc_macros[] = { ...@@ -2717,5 +2717,4 @@ const struct powerpc_macro powerpc_macros[] = {
}; };
const int powerpc_num_macros = const int powerpc_num_macros = ARRAY_SIZE(powerpc_macros);
sizeof (powerpc_macros) / sizeof (powerpc_macros[0]);
...@@ -35,7 +35,7 @@ ...@@ -35,7 +35,7 @@
#ifdef CONFIG_FSL_BOOKE #ifdef CONFIG_FSL_BOOKE
#define WDT_PERIOD_DEFAULT 63 /* Ex. wdt_period=28 bus=333Mhz , reset=~40sec */ #define WDT_PERIOD_DEFAULT 63 /* Ex. wdt_period=28 bus=333Mhz , reset=~40sec */
#else #else
#define WDT_PERIOD_DEFAULT 4 /* Refer to the PPC40x and PPC4xx manuals */ #define WDT_PERIOD_DEFAULT 3 /* Refer to the PPC40x and PPC4xx manuals */
#endif /* for timing information */ #endif /* for timing information */
u32 booke_wdt_enabled = 0; u32 booke_wdt_enabled = 0;
...@@ -47,6 +47,14 @@ u32 booke_wdt_period = WDT_PERIOD_DEFAULT; ...@@ -47,6 +47,14 @@ u32 booke_wdt_period = WDT_PERIOD_DEFAULT;
#define WDTP(x) (TCR_WP(x)) #define WDTP(x) (TCR_WP(x))
#endif #endif
/*
* booke_wdt_ping:
*/
static __inline__ void booke_wdt_ping(void)
{
mtspr(SPRN_TSR, TSR_ENW|TSR_WIS);
}
/* /*
* booke_wdt_enable: * booke_wdt_enable:
*/ */
...@@ -54,20 +62,14 @@ static __inline__ void booke_wdt_enable(void) ...@@ -54,20 +62,14 @@ static __inline__ void booke_wdt_enable(void)
{ {
u32 val; u32 val;
/* clear status before enabling watchdog */
booke_wdt_ping();
val = mfspr(SPRN_TCR); val = mfspr(SPRN_TCR);
val |= (TCR_WIE|TCR_WRC(WRC_CHIP)|WDTP(booke_wdt_period)); val |= (TCR_WIE|TCR_WRC(WRC_CHIP)|WDTP(booke_wdt_period));
mtspr(SPRN_TCR, val); mtspr(SPRN_TCR, val);
} }
/*
* booke_wdt_ping:
*/
static __inline__ void booke_wdt_ping(void)
{
mtspr(SPRN_TSR, TSR_ENW|TSR_WIS);
}
/* /*
* booke_wdt_write: * booke_wdt_write:
*/ */
......
...@@ -94,8 +94,6 @@ static int wf_thread_func(void *data) ...@@ -94,8 +94,6 @@ static int wf_thread_func(void *data)
DBG("wf: thread started\n"); DBG("wf: thread started\n");
while(!kthread_should_stop()) { while(!kthread_should_stop()) {
try_to_freeze();
if (time_after_eq(jiffies, next)) { if (time_after_eq(jiffies, next)) {
wf_notify(WF_EVENT_TICK, NULL); wf_notify(WF_EVENT_TICK, NULL);
if (wf_overtemp) { if (wf_overtemp) {
...@@ -118,8 +116,8 @@ static int wf_thread_func(void *data) ...@@ -118,8 +116,8 @@ static int wf_thread_func(void *data)
if (delay <= HZ) if (delay <= HZ)
schedule_timeout_interruptible(delay); schedule_timeout_interruptible(delay);
/* there should be no signal, but oh well */ /* there should be no non-suspend signal, but oh well */
if (signal_pending(current)) { if (signal_pending(current) && !try_to_freeze()) {
printk(KERN_WARNING "windfarm: thread got sigl !\n"); printk(KERN_WARNING "windfarm: thread got sigl !\n");
break; break;
} }
......
...@@ -44,6 +44,7 @@ ...@@ -44,6 +44,7 @@
#define FW_FEATURE_LPAR ASM_CONST(0x0000000000400000) #define FW_FEATURE_LPAR ASM_CONST(0x0000000000400000)
#define FW_FEATURE_PS3_LV1 ASM_CONST(0x0000000000800000) #define FW_FEATURE_PS3_LV1 ASM_CONST(0x0000000000800000)
#define FW_FEATURE_BEAT ASM_CONST(0x0000000001000000) #define FW_FEATURE_BEAT ASM_CONST(0x0000000001000000)
#define FW_FEATURE_BULK_REMOVE ASM_CONST(0x0000000002000000)
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
......
...@@ -44,6 +44,7 @@ typedef unsigned int kprobe_opcode_t; ...@@ -44,6 +44,7 @@ typedef unsigned int kprobe_opcode_t;
#define IS_TDI(instr) (((instr) & 0xfc000000) == 0x08000000) #define IS_TDI(instr) (((instr) & 0xfc000000) == 0x08000000)
#define IS_TWI(instr) (((instr) & 0xfc000000) == 0x0c000000) #define IS_TWI(instr) (((instr) & 0xfc000000) == 0x0c000000)
#ifdef CONFIG_PPC64
/* /*
* 64bit powerpc uses function descriptors. * 64bit powerpc uses function descriptors.
* Handle cases where: * Handle cases where:
...@@ -67,9 +68,13 @@ typedef unsigned int kprobe_opcode_t; ...@@ -67,9 +68,13 @@ typedef unsigned int kprobe_opcode_t;
} }
#define JPROBE_ENTRY(pentry) (kprobe_opcode_t *)((func_descr_t *)pentry) #define JPROBE_ENTRY(pentry) (kprobe_opcode_t *)((func_descr_t *)pentry)
#define is_trap(instr) (IS_TW(instr) || IS_TD(instr) || \ #define is_trap(instr) (IS_TW(instr) || IS_TD(instr) || \
IS_TWI(instr) || IS_TDI(instr)) IS_TWI(instr) || IS_TDI(instr))
#else
/* Use stock kprobe_lookup_name since ppc32 doesn't use function descriptors */
#define JPROBE_ENTRY(pentry) (kprobe_opcode_t *)(pentry)
#define is_trap(instr) (IS_TW(instr) || IS_TWI(instr))
#endif
#define ARCH_SUPPORTS_KRETPROBES #define ARCH_SUPPORTS_KRETPROBES
#define ARCH_INACTIVE_KPROBE_COUNT 1 #define ARCH_INACTIVE_KPROBE_COUNT 1
......
...@@ -249,6 +249,8 @@ extern void mpc52xx_declare_of_platform_devices(void); ...@@ -249,6 +249,8 @@ extern void mpc52xx_declare_of_platform_devices(void);
extern void mpc52xx_init_irq(void); extern void mpc52xx_init_irq(void);
extern unsigned int mpc52xx_get_irq(void); extern unsigned int mpc52xx_get_irq(void);
extern int __init mpc52xx_add_bridge(struct device_node *node);
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
#endif /* __ASM_POWERPC_MPC52xx_H__ */ #endif /* __ASM_POWERPC_MPC52xx_H__ */
......
...@@ -21,6 +21,7 @@ struct pt_regs; ...@@ -21,6 +21,7 @@ struct pt_regs;
*/ */
#define IS_MTMSRD(instr) (((instr) & 0xfc0007be) == 0x7c000124) #define IS_MTMSRD(instr) (((instr) & 0xfc0007be) == 0x7c000124)
#define IS_RFID(instr) (((instr) & 0xfc0007fe) == 0x4c000024) #define IS_RFID(instr) (((instr) & 0xfc0007fe) == 0x4c000024)
#define IS_RFI(instr) (((instr) & 0xfc0007fe) == 0x4c000064)
/* Emulate instructions that cause a transfer of control. */ /* Emulate instructions that cause a transfer of control. */
extern int emulate_step(struct pt_regs *regs, unsigned int instr); extern int emulate_step(struct pt_regs *regs, unsigned int instr);
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment