Merge branch 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc
* 'merge' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc: [POWERPC] Check for offline nodes in pci NUMA code [POWERPC] Better check in show_instructions [POWERPC] POWER6 has 6 PMCs [POWERPC] Never panic when taking altivec exceptions from userspace [POWERPC] Fix IO Window Updates on P2P bridges. [POWERPC] Add Makefile entry for MPC832x_mds support [POWERPC] Fix MPC8360EMDS PB board support [POWERPC] ppc: Add missing calls to set_irq_regs [POWERPC] Off-by-one in /arch/ppc/platforms/mpc8* [POWERPC] Add DOS partition table support to mpc834x_itx_defconfig [POWERPC] spufs: fix support for read/write on cntl [POWERPC] Don't crash on cell with 2 BEs when !CONFIG_NUMA
This commit is contained in:
@@ -1248,7 +1248,7 @@ CONFIG_PARTITION_ADVANCED=y
|
|||||||
# CONFIG_AMIGA_PARTITION is not set
|
# CONFIG_AMIGA_PARTITION is not set
|
||||||
# CONFIG_ATARI_PARTITION is not set
|
# CONFIG_ATARI_PARTITION is not set
|
||||||
# CONFIG_MAC_PARTITION is not set
|
# CONFIG_MAC_PARTITION is not set
|
||||||
# CONFIG_MSDOS_PARTITION is not set
|
CONFIG_MSDOS_PARTITION=y
|
||||||
# CONFIG_LDM_PARTITION is not set
|
# CONFIG_LDM_PARTITION is not set
|
||||||
# CONFIG_SGI_PARTITION is not set
|
# CONFIG_SGI_PARTITION is not set
|
||||||
# CONFIG_ULTRIX_PARTITION is not set
|
# CONFIG_ULTRIX_PARTITION is not set
|
||||||
|
@@ -268,7 +268,7 @@ struct cpu_spec cpu_specs[] = {
|
|||||||
.cpu_user_features = COMMON_USER_POWER6,
|
.cpu_user_features = COMMON_USER_POWER6,
|
||||||
.icache_bsize = 128,
|
.icache_bsize = 128,
|
||||||
.dcache_bsize = 128,
|
.dcache_bsize = 128,
|
||||||
.num_pmcs = 8,
|
.num_pmcs = 6,
|
||||||
.oprofile_cpu_type = "ppc64/power6",
|
.oprofile_cpu_type = "ppc64/power6",
|
||||||
.oprofile_type = PPC_OPROFILE_POWER4,
|
.oprofile_type = PPC_OPROFILE_POWER4,
|
||||||
.oprofile_mmcra_sihv = POWER6_MMCRA_SIHV,
|
.oprofile_mmcra_sihv = POWER6_MMCRA_SIHV,
|
||||||
|
@@ -441,14 +441,14 @@ update_bridge_base(struct pci_bus *bus, int i)
|
|||||||
end = res->end - off;
|
end = res->end - off;
|
||||||
io_base_lo = (start >> 8) & PCI_IO_RANGE_MASK;
|
io_base_lo = (start >> 8) & PCI_IO_RANGE_MASK;
|
||||||
io_limit_lo = (end >> 8) & PCI_IO_RANGE_MASK;
|
io_limit_lo = (end >> 8) & PCI_IO_RANGE_MASK;
|
||||||
if (end > 0xffff) {
|
if (end > 0xffff)
|
||||||
pci_write_config_word(dev, PCI_IO_BASE_UPPER16,
|
|
||||||
start >> 16);
|
|
||||||
pci_write_config_word(dev, PCI_IO_LIMIT_UPPER16,
|
|
||||||
end >> 16);
|
|
||||||
io_base_lo |= PCI_IO_RANGE_TYPE_32;
|
io_base_lo |= PCI_IO_RANGE_TYPE_32;
|
||||||
} else
|
else
|
||||||
io_base_lo |= PCI_IO_RANGE_TYPE_16;
|
io_base_lo |= PCI_IO_RANGE_TYPE_16;
|
||||||
|
pci_write_config_word(dev, PCI_IO_BASE_UPPER16,
|
||||||
|
start >> 16);
|
||||||
|
pci_write_config_word(dev, PCI_IO_LIMIT_UPPER16,
|
||||||
|
end >> 16);
|
||||||
pci_write_config_byte(dev, PCI_IO_BASE, io_base_lo);
|
pci_write_config_byte(dev, PCI_IO_BASE, io_base_lo);
|
||||||
pci_write_config_byte(dev, PCI_IO_LIMIT, io_limit_lo);
|
pci_write_config_byte(dev, PCI_IO_LIMIT, io_limit_lo);
|
||||||
|
|
||||||
|
@@ -199,8 +199,14 @@ struct pci_controller * pcibios_alloc_controller(struct device_node *dev)
|
|||||||
pci_setup_pci_controller(phb);
|
pci_setup_pci_controller(phb);
|
||||||
phb->arch_data = dev;
|
phb->arch_data = dev;
|
||||||
phb->is_dynamic = mem_init_done;
|
phb->is_dynamic = mem_init_done;
|
||||||
if (dev)
|
if (dev) {
|
||||||
PHB_SET_NODE(phb, of_node_to_nid(dev));
|
int nid = of_node_to_nid(dev);
|
||||||
|
|
||||||
|
if (nid < 0 || !node_online(nid))
|
||||||
|
nid = -1;
|
||||||
|
|
||||||
|
PHB_SET_NODE(phb, nid);
|
||||||
|
}
|
||||||
return phb;
|
return phb;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -341,13 +341,6 @@ struct task_struct *__switch_to(struct task_struct *prev,
|
|||||||
|
|
||||||
static int instructions_to_print = 16;
|
static int instructions_to_print = 16;
|
||||||
|
|
||||||
#ifdef CONFIG_PPC64
|
|
||||||
#define BAD_PC(pc) ((REGION_ID(pc) != KERNEL_REGION_ID) && \
|
|
||||||
(REGION_ID(pc) != VMALLOC_REGION_ID))
|
|
||||||
#else
|
|
||||||
#define BAD_PC(pc) ((pc) < KERNELBASE)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void show_instructions(struct pt_regs *regs)
|
static void show_instructions(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
@@ -366,7 +359,8 @@ static void show_instructions(struct pt_regs *regs)
|
|||||||
* bad address because the pc *should* only be a
|
* bad address because the pc *should* only be a
|
||||||
* kernel address.
|
* kernel address.
|
||||||
*/
|
*/
|
||||||
if (BAD_PC(pc) || __get_user(instr, (unsigned int __user *)pc)) {
|
if (!__kernel_text_address(pc) ||
|
||||||
|
__get_user(instr, (unsigned int __user *)pc)) {
|
||||||
printk("XXXXXXXX ");
|
printk("XXXXXXXX ");
|
||||||
} else {
|
} else {
|
||||||
if (regs->nip == pc)
|
if (regs->nip == pc)
|
||||||
|
@@ -900,14 +900,13 @@ void kernel_fp_unavailable_exception(struct pt_regs *regs)
|
|||||||
|
|
||||||
void altivec_unavailable_exception(struct pt_regs *regs)
|
void altivec_unavailable_exception(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
#if !defined(CONFIG_ALTIVEC)
|
|
||||||
if (user_mode(regs)) {
|
if (user_mode(regs)) {
|
||||||
/* A user program has executed an altivec instruction,
|
/* A user program has executed an altivec instruction,
|
||||||
but this kernel doesn't support altivec. */
|
but this kernel doesn't support altivec. */
|
||||||
_exception(SIGILL, regs, ILL_ILLOPC, regs->nip);
|
_exception(SIGILL, regs, ILL_ILLOPC, regs->nip);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
printk(KERN_EMERG "Unrecoverable VMX/Altivec Unavailable Exception "
|
printk(KERN_EMERG "Unrecoverable VMX/Altivec Unavailable Exception "
|
||||||
"%lx at %lx\n", regs->trap, regs->nip);
|
"%lx at %lx\n", regs->trap, regs->nip);
|
||||||
die("Unrecoverable VMX/Altivec Unavailable Exception", regs, SIGABRT);
|
die("Unrecoverable VMX/Altivec Unavailable Exception", regs, SIGABRT);
|
||||||
|
@@ -32,6 +32,13 @@ config MPC834x_ITX
|
|||||||
Be aware that PCI initialization is the bootloader's
|
Be aware that PCI initialization is the bootloader's
|
||||||
responsiblilty.
|
responsiblilty.
|
||||||
|
|
||||||
|
config MPC8360E_PB
|
||||||
|
bool "Freescale MPC8360E PB"
|
||||||
|
select DEFAULT_UIMAGE
|
||||||
|
select QUICC_ENGINE
|
||||||
|
help
|
||||||
|
This option enables support for the MPC836x EMDS Processor Board.
|
||||||
|
|
||||||
endchoice
|
endchoice
|
||||||
|
|
||||||
config PPC_MPC832x
|
config PPC_MPC832x
|
||||||
@@ -46,4 +53,10 @@ config MPC834x
|
|||||||
select PPC_INDIRECT_PCI
|
select PPC_INDIRECT_PCI
|
||||||
default y if MPC834x_SYS || MPC834x_ITX
|
default y if MPC834x_SYS || MPC834x_ITX
|
||||||
|
|
||||||
|
config PPC_MPC836x
|
||||||
|
bool
|
||||||
|
select PPC_UDBG_16550
|
||||||
|
select PPC_INDIRECT_PCI
|
||||||
|
default y if MPC8360E_PB
|
||||||
|
|
||||||
endmenu
|
endmenu
|
||||||
|
@@ -5,3 +5,5 @@ obj-y := misc.o
|
|||||||
obj-$(CONFIG_PCI) += pci.o
|
obj-$(CONFIG_PCI) += pci.o
|
||||||
obj-$(CONFIG_MPC834x_SYS) += mpc834x_sys.o
|
obj-$(CONFIG_MPC834x_SYS) += mpc834x_sys.o
|
||||||
obj-$(CONFIG_MPC834x_ITX) += mpc834x_itx.o
|
obj-$(CONFIG_MPC834x_ITX) += mpc834x_itx.o
|
||||||
|
obj-$(CONFIG_MPC8360E_PB) += mpc8360e_pb.o
|
||||||
|
obj-$(CONFIG_MPC832x_MDS) += mpc832x_mds.o
|
||||||
|
@@ -30,6 +30,7 @@
|
|||||||
#include <linux/root_dev.h>
|
#include <linux/root_dev.h>
|
||||||
#include <linux/initrd.h>
|
#include <linux/initrd.h>
|
||||||
|
|
||||||
|
#include <asm/of_device.h>
|
||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
#include <asm/atomic.h>
|
#include <asm/atomic.h>
|
||||||
#include <asm/time.h>
|
#include <asm/time.h>
|
||||||
@@ -141,6 +142,24 @@ static void __init mpc8360_sys_setup_arch(void)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int __init mpc8360_declare_of_platform_devices(void)
|
||||||
|
{
|
||||||
|
struct device_node *np;
|
||||||
|
|
||||||
|
for (np = NULL; (np = of_find_compatible_node(np, "network",
|
||||||
|
"ucc_geth")) != NULL;) {
|
||||||
|
int ucc_num;
|
||||||
|
char bus_id[BUS_ID_SIZE];
|
||||||
|
|
||||||
|
ucc_num = *((uint *) get_property(np, "device-id", NULL)) - 1;
|
||||||
|
snprintf(bus_id, BUS_ID_SIZE, "ucc_geth.%u", ucc_num);
|
||||||
|
of_platform_device_create(np, bus_id, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
device_initcall(mpc8360_declare_of_platform_devices);
|
||||||
|
|
||||||
void __init mpc8360_sys_init_IRQ(void)
|
void __init mpc8360_sys_init_IRQ(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@@ -781,6 +781,17 @@ static int __init create_spu(struct device_node *spe)
|
|||||||
if (!spu)
|
if (!spu)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
spu->node = find_spu_node_id(spe);
|
||||||
|
if (spu->node >= MAX_NUMNODES) {
|
||||||
|
printk(KERN_WARNING "SPE %s on node %d ignored,"
|
||||||
|
" node number too big\n", spe->full_name, spu->node);
|
||||||
|
printk(KERN_WARNING "Check if CONFIG_NUMA is enabled.\n");
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
spu->nid = of_node_to_nid(spe);
|
||||||
|
if (spu->nid == -1)
|
||||||
|
spu->nid = 0;
|
||||||
|
|
||||||
ret = spu_map_device(spu, spe);
|
ret = spu_map_device(spu, spe);
|
||||||
/* try old method */
|
/* try old method */
|
||||||
if (ret)
|
if (ret)
|
||||||
@@ -788,10 +799,6 @@ static int __init create_spu(struct device_node *spe)
|
|||||||
if (ret)
|
if (ret)
|
||||||
goto out_free;
|
goto out_free;
|
||||||
|
|
||||||
spu->node = find_spu_node_id(spe);
|
|
||||||
spu->nid = of_node_to_nid(spe);
|
|
||||||
if (spu->nid == -1)
|
|
||||||
spu->nid = 0;
|
|
||||||
ret = spu_map_interrupts(spu, spe);
|
ret = spu_map_interrupts(spu, spe);
|
||||||
if (ret)
|
if (ret)
|
||||||
ret = spu_map_interrupts_old(spu, spe);
|
ret = spu_map_interrupts_old(spu, spe);
|
||||||
|
@@ -246,6 +246,7 @@ static int spufs_cntl_open(struct inode *inode, struct file *file)
|
|||||||
|
|
||||||
static struct file_operations spufs_cntl_fops = {
|
static struct file_operations spufs_cntl_fops = {
|
||||||
.open = spufs_cntl_open,
|
.open = spufs_cntl_open,
|
||||||
|
.release = simple_attr_close,
|
||||||
.read = simple_attr_read,
|
.read = simple_attr_read,
|
||||||
.write = simple_attr_write,
|
.write = simple_attr_write,
|
||||||
.mmap = spufs_cntl_mmap,
|
.mmap = spufs_cntl_mmap,
|
||||||
|
@@ -62,6 +62,7 @@
|
|||||||
#include <asm/cache.h>
|
#include <asm/cache.h>
|
||||||
#include <asm/8xx_immap.h>
|
#include <asm/8xx_immap.h>
|
||||||
#include <asm/machdep.h>
|
#include <asm/machdep.h>
|
||||||
|
#include <asm/irq_regs.h>
|
||||||
|
|
||||||
#include <asm/time.h>
|
#include <asm/time.h>
|
||||||
|
|
||||||
@@ -129,6 +130,7 @@ void wakeup_decrementer(void)
|
|||||||
*/
|
*/
|
||||||
void timer_interrupt(struct pt_regs * regs)
|
void timer_interrupt(struct pt_regs * regs)
|
||||||
{
|
{
|
||||||
|
struct pt_regs *old_regs;
|
||||||
int next_dec;
|
int next_dec;
|
||||||
unsigned long cpu = smp_processor_id();
|
unsigned long cpu = smp_processor_id();
|
||||||
unsigned jiffy_stamp = last_jiffy_stamp(cpu);
|
unsigned jiffy_stamp = last_jiffy_stamp(cpu);
|
||||||
@@ -137,6 +139,7 @@ void timer_interrupt(struct pt_regs * regs)
|
|||||||
if (atomic_read(&ppc_n_lost_interrupts) != 0)
|
if (atomic_read(&ppc_n_lost_interrupts) != 0)
|
||||||
do_IRQ(regs);
|
do_IRQ(regs);
|
||||||
|
|
||||||
|
old_regs = set_irq_regs(regs);
|
||||||
irq_enter();
|
irq_enter();
|
||||||
|
|
||||||
while ((next_dec = tb_ticks_per_jiffy - tb_delta(&jiffy_stamp)) <= 0) {
|
while ((next_dec = tb_ticks_per_jiffy - tb_delta(&jiffy_stamp)) <= 0) {
|
||||||
@@ -188,6 +191,7 @@ void timer_interrupt(struct pt_regs * regs)
|
|||||||
ppc_md.heartbeat();
|
ppc_md.heartbeat();
|
||||||
|
|
||||||
irq_exit();
|
irq_exit();
|
||||||
|
set_irq_regs(old_regs);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -196,7 +196,7 @@ static void __init mpc8272ads_fixup_enet_pdata(struct platform_device *pdev,
|
|||||||
bd_t* bi = (void*)__res;
|
bd_t* bi = (void*)__res;
|
||||||
int fs_no = fsid_fcc1+pdev->id-1;
|
int fs_no = fsid_fcc1+pdev->id-1;
|
||||||
|
|
||||||
if(fs_no > ARRAY_SIZE(mpc82xx_enet_pdata)) {
|
if(fs_no >= ARRAY_SIZE(mpc82xx_enet_pdata)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -222,7 +222,7 @@ static void mpc8272ads_fixup_uart_pdata(struct platform_device *pdev,
|
|||||||
int id = fs_uart_id_scc2fsid(idx);
|
int id = fs_uart_id_scc2fsid(idx);
|
||||||
|
|
||||||
/* no need to alter anything if console */
|
/* no need to alter anything if console */
|
||||||
if ((id <= num) && (!pdev->dev.platform_data)) {
|
if ((id < num) && (!pdev->dev.platform_data)) {
|
||||||
pinfo = &mpc8272_uart_pdata[id];
|
pinfo = &mpc8272_uart_pdata[id];
|
||||||
pinfo->uart_clk = bd->bi_intfreq;
|
pinfo->uart_clk = bd->bi_intfreq;
|
||||||
pdev->dev.platform_data = pinfo;
|
pdev->dev.platform_data = pinfo;
|
||||||
|
@@ -259,7 +259,7 @@ static void mpc866ads_fixup_enet_pdata(struct platform_device *pdev, int fs_no)
|
|||||||
/* Get pointer to Communication Processor */
|
/* Get pointer to Communication Processor */
|
||||||
cp = cpmp;
|
cp = cpmp;
|
||||||
|
|
||||||
if(fs_no > ARRAY_SIZE(mpc8xx_enet_pdata)) {
|
if(fs_no >= ARRAY_SIZE(mpc8xx_enet_pdata)) {
|
||||||
printk(KERN_ERR"No network-suitable #%d device on bus", fs_no);
|
printk(KERN_ERR"No network-suitable #%d device on bus", fs_no);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -305,7 +305,7 @@ static void __init mpc866ads_fixup_uart_pdata(struct platform_device *pdev,
|
|||||||
int id = fs_uart_id_smc2fsid(idx);
|
int id = fs_uart_id_smc2fsid(idx);
|
||||||
|
|
||||||
/* no need to alter anything if console */
|
/* no need to alter anything if console */
|
||||||
if ((id <= num) && (!pdev->dev.platform_data)) {
|
if ((id < num) && (!pdev->dev.platform_data)) {
|
||||||
pinfo = &mpc866_uart_pdata[id];
|
pinfo = &mpc866_uart_pdata[id];
|
||||||
pinfo->uart_clk = bd->bi_intfreq;
|
pinfo->uart_clk = bd->bi_intfreq;
|
||||||
pdev->dev.platform_data = pinfo;
|
pdev->dev.platform_data = pinfo;
|
||||||
|
@@ -263,7 +263,7 @@ static void mpc885ads_fixup_enet_pdata(struct platform_device *pdev, int fs_no)
|
|||||||
char *e;
|
char *e;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if(fs_no > ARRAY_SIZE(mpc8xx_enet_pdata)) {
|
if(fs_no >= ARRAY_SIZE(mpc8xx_enet_pdata)) {
|
||||||
printk(KERN_ERR"No network-suitable #%d device on bus", fs_no);
|
printk(KERN_ERR"No network-suitable #%d device on bus", fs_no);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -371,7 +371,7 @@ static void __init mpc885ads_fixup_uart_pdata(struct platform_device *pdev,
|
|||||||
int id = fs_uart_id_smc2fsid(idx);
|
int id = fs_uart_id_smc2fsid(idx);
|
||||||
|
|
||||||
/* no need to alter anything if console */
|
/* no need to alter anything if console */
|
||||||
if ((id <= num) && (!pdev->dev.platform_data)) {
|
if ((id < num) && (!pdev->dev.platform_data)) {
|
||||||
pinfo = &mpc885_uart_pdata[id];
|
pinfo = &mpc885_uart_pdata[id];
|
||||||
pinfo->uart_clk = bd->bi_intfreq;
|
pinfo->uart_clk = bd->bi_intfreq;
|
||||||
pdev->dev.platform_data = pinfo;
|
pdev->dev.platform_data = pinfo;
|
||||||
|
Reference in New Issue
Block a user