aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc
diff options
context:
space:
mode:
Diffstat (limited to 'arch/powerpc')
-rw-r--r--arch/powerpc/boot/dts/fsl/mpc8536si-post.dtsi4
-rw-r--r--arch/powerpc/boot/dts/fsl/p1010si-post.dtsi3
-rw-r--r--arch/powerpc/boot/dts/fsl/p1020si-post.dtsi4
-rw-r--r--arch/powerpc/boot/dts/fsl/p1022si-post.dtsi3
-rw-r--r--arch/powerpc/boot/dts/fsl/p2020si-post.dtsi4
-rw-r--r--arch/powerpc/boot/dts/p1020rdb.dtsi13
-rw-r--r--arch/powerpc/boot/dts/p1021mds.dts3
-rw-r--r--arch/powerpc/boot/dts/p2020ds.dtsi3
-rw-r--r--arch/powerpc/boot/dts/p2020rdb.dts3
-rw-r--r--arch/powerpc/configs/ppc64_defconfig5
-rw-r--r--arch/powerpc/include/asm/ppc-pci.h5
-rw-r--r--arch/powerpc/include/asm/ptrace.h20
-rw-r--r--arch/powerpc/kernel/crash.c2
-rw-r--r--arch/powerpc/kernel/exceptions-64s.S2
-rw-r--r--arch/powerpc/kernel/irq.c6
-rw-r--r--arch/powerpc/kernel/legacy_serial.c2
-rw-r--r--arch/powerpc/kernel/perf_event.c8
-rw-r--r--arch/powerpc/kernel/process.c6
-rw-r--r--arch/powerpc/kernel/rtas.c5
-rw-r--r--arch/powerpc/platforms/85xx/p1022_ds.c1
-rw-r--r--arch/powerpc/platforms/powernv/pci-ioda.c43
-rw-r--r--arch/powerpc/platforms/powernv/pci.c22
-rw-r--r--arch/powerpc/platforms/pseries/Kconfig2
-rw-r--r--arch/powerpc/platforms/pseries/eeh.c4
-rw-r--r--arch/powerpc/platforms/pseries/suspend.c6
-rw-r--r--arch/powerpc/platforms/wsp/ics.c2
-rw-r--r--arch/powerpc/platforms/wsp/wsp_pci.c8
-rw-r--r--arch/powerpc/sysdev/fsl_pci.c53
28 files changed, 154 insertions, 88 deletions
diff --git a/arch/powerpc/boot/dts/fsl/mpc8536si-post.dtsi b/arch/powerpc/boot/dts/fsl/mpc8536si-post.dtsi
index 89af62637707..b37da56018b6 100644
--- a/arch/powerpc/boot/dts/fsl/mpc8536si-post.dtsi
+++ b/arch/powerpc/boot/dts/fsl/mpc8536si-post.dtsi
@@ -236,6 +236,10 @@
236 }; 236 };
237 237
238/include/ "pq3-esdhc-0.dtsi" 238/include/ "pq3-esdhc-0.dtsi"
239 sdhc@2e000 {
240 compatible = "fsl,mpc8536-esdhc", "fsl,esdhc";
241 };
242
239/include/ "pq3-sec3.0-0.dtsi" 243/include/ "pq3-sec3.0-0.dtsi"
240/include/ "pq3-mpic.dtsi" 244/include/ "pq3-mpic.dtsi"
241/include/ "pq3-mpic-timer-B.dtsi" 245/include/ "pq3-mpic-timer-B.dtsi"
diff --git a/arch/powerpc/boot/dts/fsl/p1010si-post.dtsi b/arch/powerpc/boot/dts/fsl/p1010si-post.dtsi
index bd9e163c764b..a97d1263372c 100644
--- a/arch/powerpc/boot/dts/fsl/p1010si-post.dtsi
+++ b/arch/powerpc/boot/dts/fsl/p1010si-post.dtsi
@@ -158,7 +158,8 @@
158/include/ "pq3-usb2-dr-0.dtsi" 158/include/ "pq3-usb2-dr-0.dtsi"
159/include/ "pq3-esdhc-0.dtsi" 159/include/ "pq3-esdhc-0.dtsi"
160 sdhc@2e000 { 160 sdhc@2e000 {
161 fsl,sdhci-auto-cmd12; 161 compatible = "fsl,p1010-esdhc", "fsl,esdhc";
162 sdhci,auto-cmd12;
162 }; 163 };
163 164
164/include/ "pq3-sec4.4-0.dtsi" 165/include/ "pq3-sec4.4-0.dtsi"
diff --git a/arch/powerpc/boot/dts/fsl/p1020si-post.dtsi b/arch/powerpc/boot/dts/fsl/p1020si-post.dtsi
index fc924c5ffebe..5de5fc351314 100644
--- a/arch/powerpc/boot/dts/fsl/p1020si-post.dtsi
+++ b/arch/powerpc/boot/dts/fsl/p1020si-post.dtsi
@@ -145,6 +145,10 @@
145/include/ "pq3-usb2-dr-1.dtsi" 145/include/ "pq3-usb2-dr-1.dtsi"
146 146
147/include/ "pq3-esdhc-0.dtsi" 147/include/ "pq3-esdhc-0.dtsi"
148 sdhc@2e000 {
149 compatible = "fsl,p1020-esdhc", "fsl,esdhc";
150 sdhci,auto-cmd12;
151 };
148/include/ "pq3-sec3.3-0.dtsi" 152/include/ "pq3-sec3.3-0.dtsi"
149 153
150/include/ "pq3-mpic.dtsi" 154/include/ "pq3-mpic.dtsi"
diff --git a/arch/powerpc/boot/dts/fsl/p1022si-post.dtsi b/arch/powerpc/boot/dts/fsl/p1022si-post.dtsi
index 16239b199d0a..ff9ed1d87929 100644
--- a/arch/powerpc/boot/dts/fsl/p1022si-post.dtsi
+++ b/arch/powerpc/boot/dts/fsl/p1022si-post.dtsi
@@ -203,7 +203,8 @@
203 203
204/include/ "pq3-esdhc-0.dtsi" 204/include/ "pq3-esdhc-0.dtsi"
205 sdhc@2e000 { 205 sdhc@2e000 {
206 fsl,sdhci-auto-cmd12; 206 compatible = "fsl,p1022-esdhc", "fsl,esdhc";
207 sdhci,auto-cmd12;
207 }; 208 };
208 209
209/include/ "pq3-sec3.3-0.dtsi" 210/include/ "pq3-sec3.3-0.dtsi"
diff --git a/arch/powerpc/boot/dts/fsl/p2020si-post.dtsi b/arch/powerpc/boot/dts/fsl/p2020si-post.dtsi
index c041050561a7..332e9e75e6c2 100644
--- a/arch/powerpc/boot/dts/fsl/p2020si-post.dtsi
+++ b/arch/powerpc/boot/dts/fsl/p2020si-post.dtsi
@@ -182,6 +182,10 @@
182/include/ "pq3-etsec1-1.dtsi" 182/include/ "pq3-etsec1-1.dtsi"
183/include/ "pq3-etsec1-2.dtsi" 183/include/ "pq3-etsec1-2.dtsi"
184/include/ "pq3-esdhc-0.dtsi" 184/include/ "pq3-esdhc-0.dtsi"
185 sdhc@2e000 {
186 compatible = "fsl,p2020-esdhc", "fsl,esdhc";
187 };
188
185/include/ "pq3-sec3.1-0.dtsi" 189/include/ "pq3-sec3.1-0.dtsi"
186/include/ "pq3-mpic.dtsi" 190/include/ "pq3-mpic.dtsi"
187/include/ "pq3-mpic-timer-B.dtsi" 191/include/ "pq3-mpic-timer-B.dtsi"
diff --git a/arch/powerpc/boot/dts/p1020rdb.dtsi b/arch/powerpc/boot/dts/p1020rdb.dtsi
index b5bd86f4baf2..1fb7e0e0940f 100644
--- a/arch/powerpc/boot/dts/p1020rdb.dtsi
+++ b/arch/powerpc/boot/dts/p1020rdb.dtsi
@@ -1,7 +1,7 @@
1/* 1/*
2 * P1020 RDB Device Tree Source stub (no addresses or top-level ranges) 2 * P1020 RDB Device Tree Source stub (no addresses or top-level ranges)
3 * 3 *
4 * Copyright 2011 Freescale Semiconductor Inc. 4 * Copyright 2011-2012 Freescale Semiconductor Inc.
5 * 5 *
6 * Redistribution and use in source and binary forms, with or without 6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are met: 7 * modification, are permitted provided that the following conditions are met:
@@ -190,17 +190,16 @@
190 190
191 usb@22000 { 191 usb@22000 {
192 phy_type = "ulpi"; 192 phy_type = "ulpi";
193 dr_mode = "host";
193 }; 194 };
194 195
195 /* USB2 is shared with localbus, so it must be disabled 196 /* USB2 is shared with localbus. It is used
196 by default. We can't put 'status = "disabled";' here 197 only in case of SPI and SD boot after
197 since U-Boot doesn't clear the status property when 198 appropriate device-tree fixup done by uboot */
198 it enables USB2. OTOH, U-Boot does create a new node
199 when there isn't any. So, just comment it out.
200 usb@23000 { 199 usb@23000 {
201 phy_type = "ulpi"; 200 phy_type = "ulpi";
201 dr_mode = "host";
202 }; 202 };
203 */
204 203
205 mdio@24000 { 204 mdio@24000 {
206 phy0: ethernet-phy@0 { 205 phy0: ethernet-phy@0 {
diff --git a/arch/powerpc/boot/dts/p1021mds.dts b/arch/powerpc/boot/dts/p1021mds.dts
index d9540791e434..97116f198a37 100644
--- a/arch/powerpc/boot/dts/p1021mds.dts
+++ b/arch/powerpc/boot/dts/p1021mds.dts
@@ -1,7 +1,7 @@
1/* 1/*
2 * P1021 MDS Device Tree Source 2 * P1021 MDS Device Tree Source
3 * 3 *
4 * Copyright 2010 Freescale Semiconductor Inc. 4 * Copyright 2010,2012 Freescale Semiconductor Inc.
5 * 5 *
6 * This program is free software; you can redistribute it and/or modify it 6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the 7 * under the terms of the GNU General Public License as published by the
@@ -151,6 +151,7 @@
151 151
152 usb@22000 { 152 usb@22000 {
153 phy_type = "ulpi"; 153 phy_type = "ulpi";
154 dr_mode = "host";
154 }; 155 };
155 156
156 mdio@24000 { 157 mdio@24000 {
diff --git a/arch/powerpc/boot/dts/p2020ds.dtsi b/arch/powerpc/boot/dts/p2020ds.dtsi
index c1cf6cef4dd6..d3b939c573b0 100644
--- a/arch/powerpc/boot/dts/p2020ds.dtsi
+++ b/arch/powerpc/boot/dts/p2020ds.dtsi
@@ -1,7 +1,7 @@
1/* 1/*
2 * P2020DS Device Tree Source stub (no addresses or top-level ranges) 2 * P2020DS Device Tree Source stub (no addresses or top-level ranges)
3 * 3 *
4 * Copyright 2011 Freescale Semiconductor Inc. 4 * Copyright 2011-2012 Freescale Semiconductor Inc.
5 * 5 *
6 * Redistribution and use in source and binary forms, with or without 6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are met: 7 * modification, are permitted provided that the following conditions are met:
@@ -134,6 +134,7 @@
134&board_soc { 134&board_soc {
135 usb@22000 { 135 usb@22000 {
136 phy_type = "ulpi"; 136 phy_type = "ulpi";
137 dr_mode = "host";
137 }; 138 };
138 139
139 mdio@24520 { 140 mdio@24520 {
diff --git a/arch/powerpc/boot/dts/p2020rdb.dts b/arch/powerpc/boot/dts/p2020rdb.dts
index 26759a591712..eb8a6aa2bda5 100644
--- a/arch/powerpc/boot/dts/p2020rdb.dts
+++ b/arch/powerpc/boot/dts/p2020rdb.dts
@@ -1,7 +1,7 @@
1/* 1/*
2 * P2020 RDB Device Tree Source 2 * P2020 RDB Device Tree Source
3 * 3 *
4 * Copyright 2009-2011 Freescale Semiconductor Inc. 4 * Copyright 2009-2012 Freescale Semiconductor Inc.
5 * 5 *
6 * This program is free software; you can redistribute it and/or modify it 6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the 7 * under the terms of the GNU General Public License as published by the
@@ -197,6 +197,7 @@
197 197
198 usb@22000 { 198 usb@22000 {
199 phy_type = "ulpi"; 199 phy_type = "ulpi";
200 dr_mode = "host";
200 }; 201 };
201 202
202 mdio@24520 { 203 mdio@24520 {
diff --git a/arch/powerpc/configs/ppc64_defconfig b/arch/powerpc/configs/ppc64_defconfig
index 2156e077859b..1acf65026773 100644
--- a/arch/powerpc/configs/ppc64_defconfig
+++ b/arch/powerpc/configs/ppc64_defconfig
@@ -24,10 +24,6 @@ CONFIG_PPC_SPLPAR=y
24CONFIG_SCANLOG=m 24CONFIG_SCANLOG=m
25CONFIG_PPC_SMLPAR=y 25CONFIG_PPC_SMLPAR=y
26CONFIG_DTL=y 26CONFIG_DTL=y
27CONFIG_PPC_ISERIES=y
28CONFIG_VIODASD=y
29CONFIG_VIOCD=m
30CONFIG_VIOTAPE=m
31CONFIG_PPC_MAPLE=y 27CONFIG_PPC_MAPLE=y
32CONFIG_PPC_PASEMI=y 28CONFIG_PPC_PASEMI=y
33CONFIG_PPC_PASEMI_IOMMU=y 29CONFIG_PPC_PASEMI_IOMMU=y
@@ -259,7 +255,6 @@ CONFIG_PASEMI_MAC=y
259CONFIG_MLX4_EN=m 255CONFIG_MLX4_EN=m
260CONFIG_QLGE=m 256CONFIG_QLGE=m
261CONFIG_BE2NET=m 257CONFIG_BE2NET=m
262CONFIG_ISERIES_VETH=m
263CONFIG_PPP=m 258CONFIG_PPP=m
264CONFIG_PPP_ASYNC=m 259CONFIG_PPP_ASYNC=m
265CONFIG_PPP_SYNC_TTY=m 260CONFIG_PPP_SYNC_TTY=m
diff --git a/arch/powerpc/include/asm/ppc-pci.h b/arch/powerpc/include/asm/ppc-pci.h
index 43268f15004e..6d422979ebaf 100644
--- a/arch/powerpc/include/asm/ppc-pci.h
+++ b/arch/powerpc/include/asm/ppc-pci.h
@@ -142,6 +142,11 @@ static inline const char *eeh_pci_name(struct pci_dev *pdev)
142 return pdev ? pci_name(pdev) : "<null>"; 142 return pdev ? pci_name(pdev) : "<null>";
143} 143}
144 144
145static inline const char *eeh_driver_name(struct pci_dev *pdev)
146{
147 return (pdev && pdev->driver) ? pdev->driver->name : "<null>";
148}
149
145#endif /* CONFIG_EEH */ 150#endif /* CONFIG_EEH */
146 151
147#else /* CONFIG_PCI */ 152#else /* CONFIG_PCI */
diff --git a/arch/powerpc/include/asm/ptrace.h b/arch/powerpc/include/asm/ptrace.h
index 78a205162fd7..84cc7840cd18 100644
--- a/arch/powerpc/include/asm/ptrace.h
+++ b/arch/powerpc/include/asm/ptrace.h
@@ -83,8 +83,18 @@ struct pt_regs {
83 83
84#ifndef __ASSEMBLY__ 84#ifndef __ASSEMBLY__
85 85
86#define instruction_pointer(regs) ((regs)->nip) 86#define GET_IP(regs) ((regs)->nip)
87#define user_stack_pointer(regs) ((regs)->gpr[1]) 87#define GET_USP(regs) ((regs)->gpr[1])
88#define GET_FP(regs) (0)
89#define SET_FP(regs, val)
90
91#ifdef CONFIG_SMP
92extern unsigned long profile_pc(struct pt_regs *regs);
93#define profile_pc profile_pc
94#endif
95
96#include <asm-generic/ptrace.h>
97
88#define kernel_stack_pointer(regs) ((regs)->gpr[1]) 98#define kernel_stack_pointer(regs) ((regs)->gpr[1])
89static inline int is_syscall_success(struct pt_regs *regs) 99static inline int is_syscall_success(struct pt_regs *regs)
90{ 100{
@@ -99,12 +109,6 @@ static inline long regs_return_value(struct pt_regs *regs)
99 return -regs->gpr[3]; 109 return -regs->gpr[3];
100} 110}
101 111
102#ifdef CONFIG_SMP
103extern unsigned long profile_pc(struct pt_regs *regs);
104#else
105#define profile_pc(regs) instruction_pointer(regs)
106#endif
107
108#ifdef __powerpc64__ 112#ifdef __powerpc64__
109#define user_mode(regs) ((((regs)->msr) >> MSR_PR_LG) & 0x1) 113#define user_mode(regs) ((((regs)->msr) >> MSR_PR_LG) & 0x1)
110#else 114#else
diff --git a/arch/powerpc/kernel/crash.c b/arch/powerpc/kernel/crash.c
index 28be3452e67a..abef75176c07 100644
--- a/arch/powerpc/kernel/crash.c
+++ b/arch/powerpc/kernel/crash.c
@@ -46,7 +46,6 @@
46 46
47/* This keeps a track of which one is the crashing cpu. */ 47/* This keeps a track of which one is the crashing cpu. */
48int crashing_cpu = -1; 48int crashing_cpu = -1;
49static atomic_t cpus_in_crash;
50static int time_to_dump; 49static int time_to_dump;
51 50
52#define CRASH_HANDLER_MAX 3 51#define CRASH_HANDLER_MAX 3
@@ -66,6 +65,7 @@ static int handle_fault(struct pt_regs *regs)
66 65
67#ifdef CONFIG_SMP 66#ifdef CONFIG_SMP
68 67
68static atomic_t cpus_in_crash;
69void crash_ipi_callback(struct pt_regs *regs) 69void crash_ipi_callback(struct pt_regs *regs)
70{ 70{
71 static cpumask_t cpus_state_saved = CPU_MASK_NONE; 71 static cpumask_t cpus_state_saved = CPU_MASK_NONE;
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S
index d4be7bb3dbdf..3844ca7c5099 100644
--- a/arch/powerpc/kernel/exceptions-64s.S
+++ b/arch/powerpc/kernel/exceptions-64s.S
@@ -775,7 +775,7 @@ program_check_common:
775 EXCEPTION_PROLOG_COMMON(0x700, PACA_EXGEN) 775 EXCEPTION_PROLOG_COMMON(0x700, PACA_EXGEN)
776 bl .save_nvgprs 776 bl .save_nvgprs
777 addi r3,r1,STACK_FRAME_OVERHEAD 777 addi r3,r1,STACK_FRAME_OVERHEAD
778 ENABLE_INTS 778 DISABLE_INTS
779 bl .program_check_exception 779 bl .program_check_exception
780 b .ret_from_except 780 b .ret_from_except
781 781
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c
index 701d4aceb4f4..01e2877e8e04 100644
--- a/arch/powerpc/kernel/irq.c
+++ b/arch/powerpc/kernel/irq.c
@@ -118,10 +118,14 @@ static inline notrace void set_soft_enabled(unsigned long enable)
118static inline notrace void decrementer_check_overflow(void) 118static inline notrace void decrementer_check_overflow(void)
119{ 119{
120 u64 now = get_tb_or_rtc(); 120 u64 now = get_tb_or_rtc();
121 u64 *next_tb = &__get_cpu_var(decrementers_next_tb); 121 u64 *next_tb;
122
123 preempt_disable();
124 next_tb = &__get_cpu_var(decrementers_next_tb);
122 125
123 if (now >= *next_tb) 126 if (now >= *next_tb)
124 set_dec(1); 127 set_dec(1);
128 preempt_enable();
125} 129}
126 130
127notrace void arch_local_irq_restore(unsigned long en) 131notrace void arch_local_irq_restore(unsigned long en)
diff --git a/arch/powerpc/kernel/legacy_serial.c b/arch/powerpc/kernel/legacy_serial.c
index 3fea3689527e..bedd12e1cfbc 100644
--- a/arch/powerpc/kernel/legacy_serial.c
+++ b/arch/powerpc/kernel/legacy_serial.c
@@ -442,8 +442,10 @@ static void __init fixup_port_irq(int index,
442 442
443 port->irq = virq; 443 port->irq = virq;
444 444
445#ifdef CONFIG_SERIAL_8250_FSL
445 if (of_device_is_compatible(np, "fsl,ns16550")) 446 if (of_device_is_compatible(np, "fsl,ns16550"))
446 port->handle_irq = fsl8250_handle_irq; 447 port->handle_irq = fsl8250_handle_irq;
448#endif
447} 449}
448 450
449static void __init fixup_port_pio(int index, 451static void __init fixup_port_pio(int index,
diff --git a/arch/powerpc/kernel/perf_event.c b/arch/powerpc/kernel/perf_event.c
index 10a140f82cb8..64483fde95c6 100644
--- a/arch/powerpc/kernel/perf_event.c
+++ b/arch/powerpc/kernel/perf_event.c
@@ -865,6 +865,7 @@ static void power_pmu_start(struct perf_event *event, int ef_flags)
865{ 865{
866 unsigned long flags; 866 unsigned long flags;
867 s64 left; 867 s64 left;
868 unsigned long val;
868 869
869 if (!event->hw.idx || !event->hw.sample_period) 870 if (!event->hw.idx || !event->hw.sample_period)
870 return; 871 return;
@@ -880,7 +881,12 @@ static void power_pmu_start(struct perf_event *event, int ef_flags)
880 881
881 event->hw.state = 0; 882 event->hw.state = 0;
882 left = local64_read(&event->hw.period_left); 883 left = local64_read(&event->hw.period_left);
883 write_pmc(event->hw.idx, left); 884
885 val = 0;
886 if (left < 0x80000000L)
887 val = 0x80000000L - left;
888
889 write_pmc(event->hw.idx, val);
884 890
885 perf_event_update_userpage(event); 891 perf_event_update_userpage(event);
886 perf_pmu_enable(event->pmu); 892 perf_pmu_enable(event->pmu);
diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
index ebe5766781aa..d817ab018486 100644
--- a/arch/powerpc/kernel/process.c
+++ b/arch/powerpc/kernel/process.c
@@ -566,12 +566,12 @@ static void show_instructions(struct pt_regs *regs)
566 */ 566 */
567 if (!__kernel_text_address(pc) || 567 if (!__kernel_text_address(pc) ||
568 __get_user(instr, (unsigned int __user *)pc)) { 568 __get_user(instr, (unsigned int __user *)pc)) {
569 printk("XXXXXXXX "); 569 printk(KERN_CONT "XXXXXXXX ");
570 } else { 570 } else {
571 if (regs->nip == pc) 571 if (regs->nip == pc)
572 printk("<%08x> ", instr); 572 printk(KERN_CONT "<%08x> ", instr);
573 else 573 else
574 printk("%08x ", instr); 574 printk(KERN_CONT "%08x ", instr);
575 } 575 }
576 576
577 pc += sizeof(int); 577 pc += sizeof(int);
diff --git a/arch/powerpc/kernel/rtas.c b/arch/powerpc/kernel/rtas.c
index 517b1d8f455b..9f843cdfee9e 100644
--- a/arch/powerpc/kernel/rtas.c
+++ b/arch/powerpc/kernel/rtas.c
@@ -716,7 +716,6 @@ static int __rtas_suspend_last_cpu(struct rtas_suspend_me_data *data, int wake_w
716 int cpu; 716 int cpu;
717 717
718 slb_set_size(SLB_MIN_SIZE); 718 slb_set_size(SLB_MIN_SIZE);
719 stop_topology_update();
720 printk(KERN_DEBUG "calling ibm,suspend-me on cpu %i\n", smp_processor_id()); 719 printk(KERN_DEBUG "calling ibm,suspend-me on cpu %i\n", smp_processor_id());
721 720
722 while (rc == H_MULTI_THREADS_ACTIVE && !atomic_read(&data->done) && 721 while (rc == H_MULTI_THREADS_ACTIVE && !atomic_read(&data->done) &&
@@ -732,7 +731,6 @@ static int __rtas_suspend_last_cpu(struct rtas_suspend_me_data *data, int wake_w
732 rc = atomic_read(&data->error); 731 rc = atomic_read(&data->error);
733 732
734 atomic_set(&data->error, rc); 733 atomic_set(&data->error, rc);
735 start_topology_update();
736 pSeries_coalesce_init(); 734 pSeries_coalesce_init();
737 735
738 if (wake_when_done) { 736 if (wake_when_done) {
@@ -846,6 +844,7 @@ int rtas_ibm_suspend_me(struct rtas_args *args)
846 atomic_set(&data.error, 0); 844 atomic_set(&data.error, 0);
847 data.token = rtas_token("ibm,suspend-me"); 845 data.token = rtas_token("ibm,suspend-me");
848 data.complete = &done; 846 data.complete = &done;
847 stop_topology_update();
849 848
850 /* Call function on all CPUs. One of us will make the 849 /* Call function on all CPUs. One of us will make the
851 * rtas call 850 * rtas call
@@ -858,6 +857,8 @@ int rtas_ibm_suspend_me(struct rtas_args *args)
858 if (atomic_read(&data.error) != 0) 857 if (atomic_read(&data.error) != 0)
859 printk(KERN_ERR "Error doing global join\n"); 858 printk(KERN_ERR "Error doing global join\n");
860 859
860 start_topology_update();
861
861 return atomic_read(&data.error); 862 return atomic_read(&data.error);
862} 863}
863#else /* CONFIG_PPC_PSERIES */ 864#else /* CONFIG_PPC_PSERIES */
diff --git a/arch/powerpc/platforms/85xx/p1022_ds.c b/arch/powerpc/platforms/85xx/p1022_ds.c
index bb3d84f4046f..b0984ada3f83 100644
--- a/arch/powerpc/platforms/85xx/p1022_ds.c
+++ b/arch/powerpc/platforms/85xx/p1022_ds.c
@@ -25,6 +25,7 @@
25 25
26#include <sysdev/fsl_soc.h> 26#include <sysdev/fsl_soc.h>
27#include <sysdev/fsl_pci.h> 27#include <sysdev/fsl_pci.h>
28#include <asm/udbg.h>
28#include <asm/fsl_guts.h> 29#include <asm/fsl_guts.h>
29#include "smp.h" 30#include "smp.h"
30 31
diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c
index f31162cfdaa9..5e155dfc4320 100644
--- a/arch/powerpc/platforms/powernv/pci-ioda.c
+++ b/arch/powerpc/platforms/powernv/pci-ioda.c
@@ -204,11 +204,10 @@ static void __devinit pnv_ioda_offset_bus(struct pci_bus *bus,
204 pr_devel(" -> OBR %s [%x] +%016llx\n", 204 pr_devel(" -> OBR %s [%x] +%016llx\n",
205 bus->self ? pci_name(bus->self) : "root", flags, offset); 205 bus->self ? pci_name(bus->self) : "root", flags, offset);
206 206
207 for (i = 0; i < 2; i++) { 207 pci_bus_for_each_resource(bus, r, i) {
208 r = bus->resource[i];
209 if (r && (r->flags & flags)) { 208 if (r && (r->flags & flags)) {
210 bus->resource[i]->start += offset; 209 r->start += offset;
211 bus->resource[i]->end += offset; 210 r->end += offset;
212 } 211 }
213 } 212 }
214 list_for_each_entry(dev, &bus->devices, bus_list) 213 list_for_each_entry(dev, &bus->devices, bus_list)
@@ -288,12 +287,17 @@ static void __devinit pnv_ioda_calc_bus(struct pci_bus *bus, unsigned int flags,
288 * assignment algorithm is going to be uber-trivial for now, we 287 * assignment algorithm is going to be uber-trivial for now, we
289 * can try to be smarter later at filling out holes. 288 * can try to be smarter later at filling out holes.
290 */ 289 */
291 start = bus->self ? 0 : bus->resource[bres]->start; 290 if (bus->self) {
292 291 /* No offset for downstream bridges */
293 /* Don't hand out IO 0 */ 292 start = 0;
294 if ((flags & IORESOURCE_IO) && !bus->self) 293 } else {
295 start += 0x1000; 294 /* Offset from the root */
296 295 if (flags & IORESOURCE_IO)
296 /* Don't hand out IO 0 */
297 start = hose->io_resource.start + 0x1000;
298 else
299 start = hose->mem_resources[0].start;
300 }
297 while(!list_empty(&head)) { 301 while(!list_empty(&head)) {
298 w = list_first_entry(&head, struct resource_wrap, link); 302 w = list_first_entry(&head, struct resource_wrap, link);
299 list_del(&w->link); 303 list_del(&w->link);
@@ -321,13 +325,20 @@ static void __devinit pnv_ioda_calc_bus(struct pci_bus *bus, unsigned int flags,
321 empty: 325 empty:
322 /* Only setup P2P's, not the PHB itself */ 326 /* Only setup P2P's, not the PHB itself */
323 if (bus->self) { 327 if (bus->self) {
324 WARN_ON(bus->resource[bres] == NULL); 328 struct resource *res = bus->resource[bres];
325 bus->resource[bres]->start = 0; 329
326 bus->resource[bres]->flags = (*size) ? flags : 0; 330 if (WARN_ON(res == NULL))
327 bus->resource[bres]->end = (*size) ? (*size - 1) : 0; 331 return;
328 332
329 /* Clear prefetch bus resources for now */ 333 /*
330 bus->resource[2]->flags = 0; 334 * FIXME: We should probably export and call
335 * pci_bridge_check_ranges() to properly re-initialize
336 * the PCI portion of the flags here, and to detect
337 * what the bridge actually supports.
338 */
339 res->start = 0;
340 res->flags = (*size) ? flags : 0;
341 res->end = (*size) ? (*size - 1) : 0;
331 } 342 }
332 343
333 pr_devel("<- CBR %s [%x] *size=%016llx *align=%016llx\n", 344 pr_devel("<- CBR %s [%x] *size=%016llx *align=%016llx\n",
diff --git a/arch/powerpc/platforms/powernv/pci.c b/arch/powerpc/platforms/powernv/pci.c
index a70bc1e385eb..f92b9ef7340e 100644
--- a/arch/powerpc/platforms/powernv/pci.c
+++ b/arch/powerpc/platforms/powernv/pci.c
@@ -52,32 +52,38 @@ static int pnv_msi_check_device(struct pci_dev* pdev, int nvec, int type)
52 52
53static unsigned int pnv_get_one_msi(struct pnv_phb *phb) 53static unsigned int pnv_get_one_msi(struct pnv_phb *phb)
54{ 54{
55 unsigned int id; 55 unsigned long flags;
56 unsigned int id, rc;
57
58 spin_lock_irqsave(&phb->lock, flags);
56 59
57 spin_lock(&phb->lock);
58 id = find_next_zero_bit(phb->msi_map, phb->msi_count, phb->msi_next); 60 id = find_next_zero_bit(phb->msi_map, phb->msi_count, phb->msi_next);
59 if (id >= phb->msi_count && phb->msi_next) 61 if (id >= phb->msi_count && phb->msi_next)
60 id = find_next_zero_bit(phb->msi_map, phb->msi_count, 0); 62 id = find_next_zero_bit(phb->msi_map, phb->msi_count, 0);
61 if (id >= phb->msi_count) { 63 if (id >= phb->msi_count) {
62 spin_unlock(&phb->lock); 64 rc = 0;
63 return 0; 65 goto out;
64 } 66 }
65 __set_bit(id, phb->msi_map); 67 __set_bit(id, phb->msi_map);
66 spin_unlock(&phb->lock); 68 rc = id + phb->msi_base;
67 return id + phb->msi_base; 69out:
70 spin_unlock_irqrestore(&phb->lock, flags);
71 return rc;
68} 72}
69 73
70static void pnv_put_msi(struct pnv_phb *phb, unsigned int hwirq) 74static void pnv_put_msi(struct pnv_phb *phb, unsigned int hwirq)
71{ 75{
76 unsigned long flags;
72 unsigned int id; 77 unsigned int id;
73 78
74 if (WARN_ON(hwirq < phb->msi_base || 79 if (WARN_ON(hwirq < phb->msi_base ||
75 hwirq >= (phb->msi_base + phb->msi_count))) 80 hwirq >= (phb->msi_base + phb->msi_count)))
76 return; 81 return;
77 id = hwirq - phb->msi_base; 82 id = hwirq - phb->msi_base;
78 spin_lock(&phb->lock); 83
84 spin_lock_irqsave(&phb->lock, flags);
79 __clear_bit(id, phb->msi_map); 85 __clear_bit(id, phb->msi_map);
80 spin_unlock(&phb->lock); 86 spin_unlock_irqrestore(&phb->lock, flags);
81} 87}
82 88
83static int pnv_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type) 89static int pnv_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
diff --git a/arch/powerpc/platforms/pseries/Kconfig b/arch/powerpc/platforms/pseries/Kconfig
index ae7b6d41fed3..31f22c1f657d 100644
--- a/arch/powerpc/platforms/pseries/Kconfig
+++ b/arch/powerpc/platforms/pseries/Kconfig
@@ -122,7 +122,7 @@ config DTL
122 Say N if you are unsure. 122 Say N if you are unsure.
123 123
124config PSERIES_IDLE 124config PSERIES_IDLE
125 tristate "Cpuidle driver for pSeries platforms" 125 bool "Cpuidle driver for pSeries platforms"
126 depends on CPU_IDLE 126 depends on CPU_IDLE
127 depends on PPC_PSERIES 127 depends on PPC_PSERIES
128 default y 128 default y
diff --git a/arch/powerpc/platforms/pseries/eeh.c b/arch/powerpc/platforms/pseries/eeh.c
index 565869022e3d..c0b40af4ce4f 100644
--- a/arch/powerpc/platforms/pseries/eeh.c
+++ b/arch/powerpc/platforms/pseries/eeh.c
@@ -551,9 +551,9 @@ int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev)
551 printk (KERN_ERR "EEH: %d reads ignored for recovering device at " 551 printk (KERN_ERR "EEH: %d reads ignored for recovering device at "
552 "location=%s driver=%s pci addr=%s\n", 552 "location=%s driver=%s pci addr=%s\n",
553 pdn->eeh_check_count, location, 553 pdn->eeh_check_count, location,
554 dev->driver->name, eeh_pci_name(dev)); 554 eeh_driver_name(dev), eeh_pci_name(dev));
555 printk (KERN_ERR "EEH: Might be infinite loop in %s driver\n", 555 printk (KERN_ERR "EEH: Might be infinite loop in %s driver\n",
556 dev->driver->name); 556 eeh_driver_name(dev));
557 dump_stack(); 557 dump_stack();
558 } 558 }
559 goto dn_unlock; 559 goto dn_unlock;
diff --git a/arch/powerpc/platforms/pseries/suspend.c b/arch/powerpc/platforms/pseries/suspend.c
index b84a8b2238dd..47226e04126d 100644
--- a/arch/powerpc/platforms/pseries/suspend.c
+++ b/arch/powerpc/platforms/pseries/suspend.c
@@ -24,6 +24,7 @@
24#include <asm/machdep.h> 24#include <asm/machdep.h>
25#include <asm/mmu.h> 25#include <asm/mmu.h>
26#include <asm/rtas.h> 26#include <asm/rtas.h>
27#include <asm/topology.h>
27 28
28static u64 stream_id; 29static u64 stream_id;
29static struct device suspend_dev; 30static struct device suspend_dev;
@@ -138,8 +139,11 @@ static ssize_t store_hibernate(struct device *dev,
138 ssleep(1); 139 ssleep(1);
139 } while (rc == -EAGAIN); 140 } while (rc == -EAGAIN);
140 141
141 if (!rc) 142 if (!rc) {
143 stop_topology_update();
142 rc = pm_suspend(PM_SUSPEND_MEM); 144 rc = pm_suspend(PM_SUSPEND_MEM);
145 start_topology_update();
146 }
143 147
144 stream_id = 0; 148 stream_id = 0;
145 149
diff --git a/arch/powerpc/platforms/wsp/ics.c b/arch/powerpc/platforms/wsp/ics.c
index 576874392543..97fe82ee8633 100644
--- a/arch/powerpc/platforms/wsp/ics.c
+++ b/arch/powerpc/platforms/wsp/ics.c
@@ -346,7 +346,7 @@ static int wsp_chip_set_affinity(struct irq_data *d,
346 * For the moment only implement delivery to all cpus or one cpu. 346 * For the moment only implement delivery to all cpus or one cpu.
347 * Get current irq_server for the given irq 347 * Get current irq_server for the given irq
348 */ 348 */
349 ret = cache_hwirq_map(ics, d->irq, cpumask); 349 ret = cache_hwirq_map(ics, hw_irq, cpumask);
350 if (ret == -1) { 350 if (ret == -1) {
351 char cpulist[128]; 351 char cpulist[128];
352 cpumask_scnprintf(cpulist, sizeof(cpulist), cpumask); 352 cpumask_scnprintf(cpulist, sizeof(cpulist), cpumask);
diff --git a/arch/powerpc/platforms/wsp/wsp_pci.c b/arch/powerpc/platforms/wsp/wsp_pci.c
index e0262cd0e2d3..d24b3acf858e 100644
--- a/arch/powerpc/platforms/wsp/wsp_pci.c
+++ b/arch/powerpc/platforms/wsp/wsp_pci.c
@@ -468,15 +468,15 @@ static void __init wsp_pcie_configure_hw(struct pci_controller *hose)
468#define DUMP_REG(x) \ 468#define DUMP_REG(x) \
469 pr_debug("%-30s : 0x%016llx\n", #x, in_be64(hose->cfg_data + x)) 469 pr_debug("%-30s : 0x%016llx\n", #x, in_be64(hose->cfg_data + x))
470 470
471#ifdef CONFIG_WSP_DD1_WORKAROUND_BAD_PCIE_CLASS 471 /*
472 /* WSP DD1 has a bogus class code by default in the PCI-E 472 * Some WSP variants has a bogus class code by default in the PCI-E
473 * root complex's built-in P2P bridge */ 473 * root complex's built-in P2P bridge
474 */
474 val = in_be64(hose->cfg_data + PCIE_REG_SYS_CFG1); 475 val = in_be64(hose->cfg_data + PCIE_REG_SYS_CFG1);
475 pr_debug("PCI-E SYS_CFG1 : 0x%llx\n", val); 476 pr_debug("PCI-E SYS_CFG1 : 0x%llx\n", val);
476 out_be64(hose->cfg_data + PCIE_REG_SYS_CFG1, 477 out_be64(hose->cfg_data + PCIE_REG_SYS_CFG1,
477 (val & ~PCIE_REG_SYS_CFG1_CLASS_CODE) | (PCI_CLASS_BRIDGE_PCI << 8)); 478 (val & ~PCIE_REG_SYS_CFG1_CLASS_CODE) | (PCI_CLASS_BRIDGE_PCI << 8));
478 pr_debug("PCI-E SYS_CFG1 : 0x%llx\n", in_be64(hose->cfg_data + PCIE_REG_SYS_CFG1)); 479 pr_debug("PCI-E SYS_CFG1 : 0x%llx\n", in_be64(hose->cfg_data + PCIE_REG_SYS_CFG1));
479#endif /* CONFIG_WSP_DD1_WORKAROUND_BAD_PCIE_CLASS */
480 480
481#ifdef CONFIG_WSP_DD1_WORKAROUND_DD1_TCE_BUGS 481#ifdef CONFIG_WSP_DD1_WORKAROUND_DD1_TCE_BUGS
482 /* XXX Disable TCE caching, it doesn't work on DD1 */ 482 /* XXX Disable TCE caching, it doesn't work on DD1 */
diff --git a/arch/powerpc/sysdev/fsl_pci.c b/arch/powerpc/sysdev/fsl_pci.c
index 3b61e8cf3421..6073288fed29 100644
--- a/arch/powerpc/sysdev/fsl_pci.c
+++ b/arch/powerpc/sysdev/fsl_pci.c
@@ -205,12 +205,12 @@ static void __init setup_pci_atmu(struct pci_controller *hose,
205 205
206 if (paddr_hi == paddr_lo) { 206 if (paddr_hi == paddr_lo) {
207 pr_err("%s: No outbound window space\n", name); 207 pr_err("%s: No outbound window space\n", name);
208 return ; 208 goto out;
209 } 209 }
210 210
211 if (paddr_lo == 0) { 211 if (paddr_lo == 0) {
212 pr_err("%s: No space for inbound window\n", name); 212 pr_err("%s: No space for inbound window\n", name);
213 return ; 213 goto out;
214 } 214 }
215 215
216 /* setup PCSRBAR/PEXCSRBAR */ 216 /* setup PCSRBAR/PEXCSRBAR */
@@ -357,6 +357,7 @@ static void __init setup_pci_atmu(struct pci_controller *hose,
357 (u64)hose->dma_window_size); 357 (u64)hose->dma_window_size);
358 } 358 }
359 359
360out:
360 iounmap(pci); 361 iounmap(pci);
361} 362}
362 363
@@ -384,26 +385,36 @@ static void __init setup_pci_cmd(struct pci_controller *hose)
384void fsl_pcibios_fixup_bus(struct pci_bus *bus) 385void fsl_pcibios_fixup_bus(struct pci_bus *bus)
385{ 386{
386 struct pci_controller *hose = pci_bus_to_host(bus); 387 struct pci_controller *hose = pci_bus_to_host(bus);
387 int i; 388 int i, is_pcie = 0, no_link;
388 389
389 if ((bus->parent == hose->bus) && 390 /* The root complex bridge comes up with bogus resources,
390 ((fsl_pcie_bus_fixup && 391 * we copy the PHB ones in.
391 early_find_capability(hose, 0, 0, PCI_CAP_ID_EXP)) || 392 *
392 (hose->indirect_type & PPC_INDIRECT_TYPE_NO_PCIE_LINK))) 393 * With the current generic PCI code, the PHB bus no longer
393 { 394 * has bus->resource[0..4] set, so things are a bit more
394 for (i = 0; i < 4; ++i) { 395 * tricky.
396 */
397
398 if (fsl_pcie_bus_fixup)
399 is_pcie = early_find_capability(hose, 0, 0, PCI_CAP_ID_EXP);
400 no_link = !!(hose->indirect_type & PPC_INDIRECT_TYPE_NO_PCIE_LINK);
401
402 if (bus->parent == hose->bus && (is_pcie || no_link)) {
403 for (i = 0; i < PCI_BRIDGE_RESOURCE_NUM; ++i) {
395 struct resource *res = bus->resource[i]; 404 struct resource *res = bus->resource[i];
396 struct resource *par = bus->parent->resource[i]; 405 struct resource *par;
397 if (res) { 406
398 res->start = 0; 407 if (!res)
399 res->end = 0; 408 continue;
400 res->flags = 0; 409 if (i == 0)
401 } 410 par = &hose->io_resource;
402 if (res && par) { 411 else if (i < 4)
403 res->start = par->start; 412 par = &hose->mem_resources[i-1];
404 res->end = par->end; 413 else par = NULL;
405 res->flags = par->flags; 414
406 } 415 res->start = par ? par->start : 0;
416 res->end = par ? par->end : 0;
417 res->flags = par ? par->flags : 0;
407 } 418 }
408 } 419 }
409} 420}