aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
Diffstat (limited to 'arch')
-rw-r--r--arch/powerpc/boot/dts/fsl/b4420si-post.dtsi36
-rw-r--r--arch/powerpc/boot/dts/fsl/b4420si-pre.dtsi2
-rw-r--r--arch/powerpc/boot/dts/fsl/b4860si-post.dtsi36
-rw-r--r--arch/powerpc/boot/dts/fsl/b4860si-pre.dtsi4
-rw-r--r--arch/powerpc/boot/dts/fsl/p2041si-post.dtsi60
-rw-r--r--arch/powerpc/boot/dts/fsl/p2041si-pre.dtsi4
-rw-r--r--arch/powerpc/boot/dts/fsl/p3041si-post.dtsi61
-rw-r--r--arch/powerpc/boot/dts/fsl/p3041si-pre.dtsi4
-rw-r--r--arch/powerpc/boot/dts/fsl/p4080si-post.dtsi113
-rw-r--r--arch/powerpc/boot/dts/fsl/p4080si-pre.dtsi8
-rw-r--r--arch/powerpc/boot/dts/fsl/p5020si-post.dtsi43
-rw-r--r--arch/powerpc/boot/dts/fsl/p5020si-pre.dtsi2
-rw-r--r--arch/powerpc/boot/dts/fsl/p5040si-post.dtsi61
-rw-r--r--arch/powerpc/boot/dts/fsl/p5040si-pre.dtsi4
-rw-r--r--arch/powerpc/boot/dts/fsl/t4240si-post.dtsi86
-rw-r--r--arch/powerpc/boot/dts/fsl/t4240si-pre.dtsi12
-rw-r--r--arch/powerpc/boot/dts/t4240qds.dts42
-rw-r--r--arch/powerpc/configs/corenet64_smp_defconfig1
-rw-r--r--arch/powerpc/configs/mpc85xx_defconfig1
-rw-r--r--arch/powerpc/configs/mpc85xx_smp_defconfig1
-rw-r--r--arch/powerpc/include/asm/exception-64e.h15
-rw-r--r--arch/powerpc/include/asm/kvm_booke_hv_asm.h17
-rw-r--r--arch/powerpc/include/asm/mmu-book3e.h9
-rw-r--r--arch/powerpc/include/asm/paca.h9
-rw-r--r--arch/powerpc/include/asm/reg.h15
-rw-r--r--arch/powerpc/kernel/asm-offsets.c2
-rw-r--r--arch/powerpc/kernel/exceptions-64e.S435
-rw-r--r--arch/powerpc/kernel/setup_64.c20
-rw-r--r--arch/powerpc/kernel/vdso.c8
-rw-r--r--arch/powerpc/kernel/vdso32/getcpu.S2
-rw-r--r--arch/powerpc/kernel/vdso64/getcpu.S2
-rw-r--r--arch/powerpc/kvm/book3s_hv_rmhandlers.S4
-rw-r--r--arch/powerpc/kvm/book3s_interrupts.S4
-rw-r--r--arch/powerpc/kvm/bookehv_interrupts.S21
-rw-r--r--arch/powerpc/mm/tlb_low_64e.S63
-rw-r--r--arch/powerpc/mm/tlb_nohash.c11
-rw-r--r--arch/powerpc/platforms/85xx/c293pcie.c1
-rw-r--r--arch/powerpc/platforms/85xx/common.c6
-rw-r--r--arch/powerpc/platforms/85xx/corenet_generic.c17
-rw-r--r--arch/powerpc/platforms/85xx/ge_imp3a.c1
-rw-r--r--arch/powerpc/platforms/85xx/mpc8536_ds.c1
-rw-r--r--arch/powerpc/platforms/85xx/mpc85xx.h2
-rw-r--r--arch/powerpc/platforms/85xx/mpc85xx_cds.c1
-rw-r--r--arch/powerpc/platforms/85xx/mpc85xx_ds.c3
-rw-r--r--arch/powerpc/platforms/85xx/mpc85xx_mds.c4
-rw-r--r--arch/powerpc/platforms/85xx/mpc85xx_rdb.c16
-rw-r--r--arch/powerpc/platforms/85xx/p1010rdb.c1
-rw-r--r--arch/powerpc/platforms/85xx/p1022_ds.c1
-rw-r--r--arch/powerpc/platforms/85xx/p1022_rdk.c1
-rw-r--r--arch/powerpc/platforms/85xx/p1023_rds.c2
-rw-r--r--arch/powerpc/platforms/85xx/qemu_e500.c1
-rw-r--r--arch/powerpc/platforms/85xx/sbc8548.c1
-rw-r--r--arch/powerpc/platforms/85xx/twr_p102x.c1
-rw-r--r--arch/powerpc/platforms/85xx/xes_mpc85xx.c3
-rw-r--r--arch/powerpc/platforms/embedded6xx/Kconfig2
-rw-r--r--arch/powerpc/sysdev/fsl_pci.c178
-rw-r--r--arch/powerpc/sysdev/fsl_pci.h8
57 files changed, 1259 insertions, 210 deletions
diff --git a/arch/powerpc/boot/dts/fsl/b4420si-post.dtsi b/arch/powerpc/boot/dts/fsl/b4420si-post.dtsi
index 5a6615d0ade2..60566f9927be 100644
--- a/arch/powerpc/boot/dts/fsl/b4420si-post.dtsi
+++ b/arch/powerpc/boot/dts/fsl/b4420si-post.dtsi
@@ -86,6 +86,42 @@
86 86
87 clockgen: global-utilities@e1000 { 87 clockgen: global-utilities@e1000 {
88 compatible = "fsl,b4420-clockgen", "fsl,qoriq-clockgen-2.0"; 88 compatible = "fsl,b4420-clockgen", "fsl,qoriq-clockgen-2.0";
89 ranges = <0x0 0xe1000 0x1000>;
90 #address-cells = <1>;
91 #size-cells = <1>;
92
93 sysclk: sysclk {
94 #clock-cells = <0>;
95 compatible = "fsl,qoriq-sysclk-2.0";
96 clock-output-names = "sysclk";
97 };
98
99 pll0: pll0@800 {
100 #clock-cells = <1>;
101 reg = <0x800 0x4>;
102 compatible = "fsl,qoriq-core-pll-2.0";
103 clocks = <&sysclk>;
104 clock-output-names = "pll0", "pll0-div2", "pll0-div4";
105 };
106
107 pll1: pll1@820 {
108 #clock-cells = <1>;
109 reg = <0x820 0x4>;
110 compatible = "fsl,qoriq-core-pll-2.0";
111 clocks = <&sysclk>;
112 clock-output-names = "pll1", "pll1-div2", "pll1-div4";
113 };
114
115 mux0: mux0@0 {
116 #clock-cells = <0>;
117 reg = <0x0 0x4>;
118 compatible = "fsl,qoriq-core-mux-2.0";
119 clocks = <&pll0 0>, <&pll0 1>, <&pll0 2>,
120 <&pll1 0>, <&pll1 1>, <&pll1 2>;
121 clock-names = "pll0", "pll0-div2", "pll0-div4",
122 "pll1", "pll1-div2", "pll1-div4";
123 clock-output-names = "cmux0";
124 };
89 }; 125 };
90 126
91 rcpm: global-utilities@e2000 { 127 rcpm: global-utilities@e2000 {
diff --git a/arch/powerpc/boot/dts/fsl/b4420si-pre.dtsi b/arch/powerpc/boot/dts/fsl/b4420si-pre.dtsi
index c6e451affb05..2419731c2c54 100644
--- a/arch/powerpc/boot/dts/fsl/b4420si-pre.dtsi
+++ b/arch/powerpc/boot/dts/fsl/b4420si-pre.dtsi
@@ -64,11 +64,13 @@
64 cpu0: PowerPC,e6500@0 { 64 cpu0: PowerPC,e6500@0 {
65 device_type = "cpu"; 65 device_type = "cpu";
66 reg = <0 1>; 66 reg = <0 1>;
67 clocks = <&mux0>;
67 next-level-cache = <&L2>; 68 next-level-cache = <&L2>;
68 }; 69 };
69 cpu1: PowerPC,e6500@2 { 70 cpu1: PowerPC,e6500@2 {
70 device_type = "cpu"; 71 device_type = "cpu";
71 reg = <2 3>; 72 reg = <2 3>;
73 clocks = <&mux0>;
72 next-level-cache = <&L2>; 74 next-level-cache = <&L2>;
73 }; 75 };
74 }; 76 };
diff --git a/arch/powerpc/boot/dts/fsl/b4860si-post.dtsi b/arch/powerpc/boot/dts/fsl/b4860si-post.dtsi
index 981397518fc6..cbc354b05117 100644
--- a/arch/powerpc/boot/dts/fsl/b4860si-post.dtsi
+++ b/arch/powerpc/boot/dts/fsl/b4860si-post.dtsi
@@ -130,6 +130,42 @@
130 130
131 clockgen: global-utilities@e1000 { 131 clockgen: global-utilities@e1000 {
132 compatible = "fsl,b4860-clockgen", "fsl,qoriq-clockgen-2.0"; 132 compatible = "fsl,b4860-clockgen", "fsl,qoriq-clockgen-2.0";
133 ranges = <0x0 0xe1000 0x1000>;
134 #address-cells = <1>;
135 #size-cells = <1>;
136
137 sysclk: sysclk {
138 #clock-cells = <0>;
139 compatible = "fsl,qoriq-sysclk-2.0";
140 clock-output-names = "sysclk";
141 };
142
143 pll0: pll0@800 {
144 #clock-cells = <1>;
145 reg = <0x800 0x4>;
146 compatible = "fsl,qoriq-core-pll-2.0";
147 clocks = <&sysclk>;
148 clock-output-names = "pll0", "pll0-div2", "pll0-div4";
149 };
150
151 pll1: pll1@820 {
152 #clock-cells = <1>;
153 reg = <0x820 0x4>;
154 compatible = "fsl,qoriq-core-pll-2.0";
155 clocks = <&sysclk>;
156 clock-output-names = "pll1", "pll1-div2", "pll1-div4";
157 };
158
159 mux0: mux0@0 {
160 #clock-cells = <0>;
161 reg = <0x0 0x4>;
162 compatible = "fsl,qoriq-core-mux-2.0";
163 clocks = <&pll0 0>, <&pll0 1>, <&pll0 2>,
164 <&pll1 0>, <&pll1 1>, <&pll1 2>;
165 clock-names = "pll0", "pll0-div2", "pll0-div4",
166 "pll1", "pll1-div2", "pll1-div4";
167 clock-output-names = "cmux0";
168 };
133 }; 169 };
134 170
135 rcpm: global-utilities@e2000 { 171 rcpm: global-utilities@e2000 {
diff --git a/arch/powerpc/boot/dts/fsl/b4860si-pre.dtsi b/arch/powerpc/boot/dts/fsl/b4860si-pre.dtsi
index 9bc26b147900..142ac862cacf 100644
--- a/arch/powerpc/boot/dts/fsl/b4860si-pre.dtsi
+++ b/arch/powerpc/boot/dts/fsl/b4860si-pre.dtsi
@@ -64,21 +64,25 @@
64 cpu0: PowerPC,e6500@0 { 64 cpu0: PowerPC,e6500@0 {
65 device_type = "cpu"; 65 device_type = "cpu";
66 reg = <0 1>; 66 reg = <0 1>;
67 clocks = <&mux0>;
67 next-level-cache = <&L2>; 68 next-level-cache = <&L2>;
68 }; 69 };
69 cpu1: PowerPC,e6500@2 { 70 cpu1: PowerPC,e6500@2 {
70 device_type = "cpu"; 71 device_type = "cpu";
71 reg = <2 3>; 72 reg = <2 3>;
73 clocks = <&mux0>;
72 next-level-cache = <&L2>; 74 next-level-cache = <&L2>;
73 }; 75 };
74 cpu2: PowerPC,e6500@4 { 76 cpu2: PowerPC,e6500@4 {
75 device_type = "cpu"; 77 device_type = "cpu";
76 reg = <4 5>; 78 reg = <4 5>;
79 clocks = <&mux0>;
77 next-level-cache = <&L2>; 80 next-level-cache = <&L2>;
78 }; 81 };
79 cpu3: PowerPC,e6500@6 { 82 cpu3: PowerPC,e6500@6 {
80 device_type = "cpu"; 83 device_type = "cpu";
81 reg = <6 7>; 84 reg = <6 7>;
85 clocks = <&mux0>;
82 next-level-cache = <&L2>; 86 next-level-cache = <&L2>;
83 }; 87 };
84 }; 88 };
diff --git a/arch/powerpc/boot/dts/fsl/p2041si-post.dtsi b/arch/powerpc/boot/dts/fsl/p2041si-post.dtsi
index dc6cc5afd189..e2987a33083c 100644
--- a/arch/powerpc/boot/dts/fsl/p2041si-post.dtsi
+++ b/arch/powerpc/boot/dts/fsl/p2041si-post.dtsi
@@ -306,8 +306,68 @@
306 306
307 clockgen: global-utilities@e1000 { 307 clockgen: global-utilities@e1000 {
308 compatible = "fsl,p2041-clockgen", "fsl,qoriq-clockgen-1.0"; 308 compatible = "fsl,p2041-clockgen", "fsl,qoriq-clockgen-1.0";
309 ranges = <0x0 0xe1000 0x1000>;
309 reg = <0xe1000 0x1000>; 310 reg = <0xe1000 0x1000>;
310 clock-frequency = <0>; 311 clock-frequency = <0>;
312 #address-cells = <1>;
313 #size-cells = <1>;
314
315 sysclk: sysclk {
316 #clock-cells = <0>;
317 compatible = "fsl,qoriq-sysclk-1.0";
318 clock-output-names = "sysclk";
319 };
320
321 pll0: pll0@800 {
322 #clock-cells = <1>;
323 reg = <0x800 0x4>;
324 compatible = "fsl,qoriq-core-pll-1.0";
325 clocks = <&sysclk>;
326 clock-output-names = "pll0", "pll0-div2";
327 };
328
329 pll1: pll1@820 {
330 #clock-cells = <1>;
331 reg = <0x820 0x4>;
332 compatible = "fsl,qoriq-core-pll-1.0";
333 clocks = <&sysclk>;
334 clock-output-names = "pll1", "pll1-div2";
335 };
336
337 mux0: mux0@0 {
338 #clock-cells = <0>;
339 reg = <0x0 0x4>;
340 compatible = "fsl,qoriq-core-mux-1.0";
341 clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>;
342 clock-names = "pll0", "pll0-div2", "pll1", "pll1-div2";
343 clock-output-names = "cmux0";
344 };
345
346 mux1: mux1@20 {
347 #clock-cells = <0>;
348 reg = <0x20 0x4>;
349 compatible = "fsl,qoriq-core-mux-1.0";
350 clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>;
351 clock-names = "pll0", "pll0-div2", "pll1", "pll1-div2";
352 clock-output-names = "cmux1";
353 };
354
355 mux2: mux2@40 {
356 #clock-cells = <0>;
357 reg = <0x40 0x4>;
358 compatible = "fsl,qoriq-core-mux-1.0";
359 clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>;
360 clock-names = "pll0", "pll0-div2", "pll1", "pll1-div2";
361 };
362
363 mux3: mux3@60 {
364 #clock-cells = <0>;
365 reg = <0x60 0x4>;
366 compatible = "fsl,qoriq-core-mux-1.0";
367 clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>;
368 clock-names = "pll0", "pll0-div2", "pll1", "pll1-div2";
369 clock-output-names = "cmux3";
370 };
311 }; 371 };
312 372
313 rcpm: global-utilities@e2000 { 373 rcpm: global-utilities@e2000 {
diff --git a/arch/powerpc/boot/dts/fsl/p2041si-pre.dtsi b/arch/powerpc/boot/dts/fsl/p2041si-pre.dtsi
index 7a2697d04549..22f3b14517de 100644
--- a/arch/powerpc/boot/dts/fsl/p2041si-pre.dtsi
+++ b/arch/powerpc/boot/dts/fsl/p2041si-pre.dtsi
@@ -81,6 +81,7 @@
81 cpu0: PowerPC,e500mc@0 { 81 cpu0: PowerPC,e500mc@0 {
82 device_type = "cpu"; 82 device_type = "cpu";
83 reg = <0>; 83 reg = <0>;
84 clocks = <&mux0>;
84 next-level-cache = <&L2_0>; 85 next-level-cache = <&L2_0>;
85 L2_0: l2-cache { 86 L2_0: l2-cache {
86 next-level-cache = <&cpc>; 87 next-level-cache = <&cpc>;
@@ -89,6 +90,7 @@
89 cpu1: PowerPC,e500mc@1 { 90 cpu1: PowerPC,e500mc@1 {
90 device_type = "cpu"; 91 device_type = "cpu";
91 reg = <1>; 92 reg = <1>;
93 clocks = <&mux1>;
92 next-level-cache = <&L2_1>; 94 next-level-cache = <&L2_1>;
93 L2_1: l2-cache { 95 L2_1: l2-cache {
94 next-level-cache = <&cpc>; 96 next-level-cache = <&cpc>;
@@ -97,6 +99,7 @@
97 cpu2: PowerPC,e500mc@2 { 99 cpu2: PowerPC,e500mc@2 {
98 device_type = "cpu"; 100 device_type = "cpu";
99 reg = <2>; 101 reg = <2>;
102 clocks = <&mux2>;
100 next-level-cache = <&L2_2>; 103 next-level-cache = <&L2_2>;
101 L2_2: l2-cache { 104 L2_2: l2-cache {
102 next-level-cache = <&cpc>; 105 next-level-cache = <&cpc>;
@@ -105,6 +108,7 @@
105 cpu3: PowerPC,e500mc@3 { 108 cpu3: PowerPC,e500mc@3 {
106 device_type = "cpu"; 109 device_type = "cpu";
107 reg = <3>; 110 reg = <3>;
111 clocks = <&mux3>;
108 next-level-cache = <&L2_3>; 112 next-level-cache = <&L2_3>;
109 L2_3: l2-cache { 113 L2_3: l2-cache {
110 next-level-cache = <&cpc>; 114 next-level-cache = <&cpc>;
diff --git a/arch/powerpc/boot/dts/fsl/p3041si-post.dtsi b/arch/powerpc/boot/dts/fsl/p3041si-post.dtsi
index 3fa1e22d544a..7af6d45fd998 100644
--- a/arch/powerpc/boot/dts/fsl/p3041si-post.dtsi
+++ b/arch/powerpc/boot/dts/fsl/p3041si-post.dtsi
@@ -333,8 +333,69 @@
333 333
334 clockgen: global-utilities@e1000 { 334 clockgen: global-utilities@e1000 {
335 compatible = "fsl,p3041-clockgen", "fsl,qoriq-clockgen-1.0"; 335 compatible = "fsl,p3041-clockgen", "fsl,qoriq-clockgen-1.0";
336 ranges = <0x0 0xe1000 0x1000>;
336 reg = <0xe1000 0x1000>; 337 reg = <0xe1000 0x1000>;
337 clock-frequency = <0>; 338 clock-frequency = <0>;
339 #address-cells = <1>;
340 #size-cells = <1>;
341
342 sysclk: sysclk {
343 #clock-cells = <0>;
344 compatible = "fsl,qoriq-sysclk-1.0";
345 clock-output-names = "sysclk";
346 };
347
348 pll0: pll0@800 {
349 #clock-cells = <1>;
350 reg = <0x800 0x4>;
351 compatible = "fsl,qoriq-core-pll-1.0";
352 clocks = <&sysclk>;
353 clock-output-names = "pll0", "pll0-div2";
354 };
355
356 pll1: pll1@820 {
357 #clock-cells = <1>;
358 reg = <0x820 0x4>;
359 compatible = "fsl,qoriq-core-pll-1.0";
360 clocks = <&sysclk>;
361 clock-output-names = "pll1", "pll1-div2";
362 };
363
364 mux0: mux0@0 {
365 #clock-cells = <0>;
366 reg = <0x0 0x4>;
367 compatible = "fsl,qoriq-core-mux-1.0";
368 clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>;
369 clock-names = "pll0", "pll0-div2", "pll1", "pll1-div2";
370 clock-output-names = "cmux0";
371 };
372
373 mux1: mux1@20 {
374 #clock-cells = <0>;
375 reg = <0x20 0x4>;
376 compatible = "fsl,qoriq-core-mux-1.0";
377 clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>;
378 clock-names = "pll0", "pll0-div2", "pll1", "pll1-div2";
379 clock-output-names = "cmux1";
380 };
381
382 mux2: mux2@40 {
383 #clock-cells = <0>;
384 reg = <0x40 0x4>;
385 compatible = "fsl,qoriq-core-mux-1.0";
386 clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>;
387 clock-names = "pll0", "pll0-div2", "pll1", "pll1-div2";
388 clock-output-names = "cmux2";
389 };
390
391 mux3: mux3@60 {
392 #clock-cells = <0>;
393 reg = <0x60 0x4>;
394 compatible = "fsl,qoriq-core-mux-1.0";
395 clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>;
396 clock-names = "pll0", "pll0-div2", "pll1", "pll1-div2";
397 clock-output-names = "cmux3";
398 };
338 }; 399 };
339 400
340 rcpm: global-utilities@e2000 { 401 rcpm: global-utilities@e2000 {
diff --git a/arch/powerpc/boot/dts/fsl/p3041si-pre.dtsi b/arch/powerpc/boot/dts/fsl/p3041si-pre.dtsi
index c9ca2c305cfe..468e8be8ac6f 100644
--- a/arch/powerpc/boot/dts/fsl/p3041si-pre.dtsi
+++ b/arch/powerpc/boot/dts/fsl/p3041si-pre.dtsi
@@ -82,6 +82,7 @@
82 cpu0: PowerPC,e500mc@0 { 82 cpu0: PowerPC,e500mc@0 {
83 device_type = "cpu"; 83 device_type = "cpu";
84 reg = <0>; 84 reg = <0>;
85 clocks = <&mux0>;
85 next-level-cache = <&L2_0>; 86 next-level-cache = <&L2_0>;
86 L2_0: l2-cache { 87 L2_0: l2-cache {
87 next-level-cache = <&cpc>; 88 next-level-cache = <&cpc>;
@@ -90,6 +91,7 @@
90 cpu1: PowerPC,e500mc@1 { 91 cpu1: PowerPC,e500mc@1 {
91 device_type = "cpu"; 92 device_type = "cpu";
92 reg = <1>; 93 reg = <1>;
94 clocks = <&mux1>;
93 next-level-cache = <&L2_1>; 95 next-level-cache = <&L2_1>;
94 L2_1: l2-cache { 96 L2_1: l2-cache {
95 next-level-cache = <&cpc>; 97 next-level-cache = <&cpc>;
@@ -98,6 +100,7 @@
98 cpu2: PowerPC,e500mc@2 { 100 cpu2: PowerPC,e500mc@2 {
99 device_type = "cpu"; 101 device_type = "cpu";
100 reg = <2>; 102 reg = <2>;
103 clocks = <&mux2>;
101 next-level-cache = <&L2_2>; 104 next-level-cache = <&L2_2>;
102 L2_2: l2-cache { 105 L2_2: l2-cache {
103 next-level-cache = <&cpc>; 106 next-level-cache = <&cpc>;
@@ -106,6 +109,7 @@
106 cpu3: PowerPC,e500mc@3 { 109 cpu3: PowerPC,e500mc@3 {
107 device_type = "cpu"; 110 device_type = "cpu";
108 reg = <3>; 111 reg = <3>;
112 clocks = <&mux3>;
109 next-level-cache = <&L2_3>; 113 next-level-cache = <&L2_3>;
110 L2_3: l2-cache { 114 L2_3: l2-cache {
111 next-level-cache = <&cpc>; 115 next-level-cache = <&cpc>;
diff --git a/arch/powerpc/boot/dts/fsl/p4080si-post.dtsi b/arch/powerpc/boot/dts/fsl/p4080si-post.dtsi
index 34769a7eafea..2415e1f1d3fa 100644
--- a/arch/powerpc/boot/dts/fsl/p4080si-post.dtsi
+++ b/arch/powerpc/boot/dts/fsl/p4080si-post.dtsi
@@ -353,8 +353,121 @@
353 353
354 clockgen: global-utilities@e1000 { 354 clockgen: global-utilities@e1000 {
355 compatible = "fsl,p4080-clockgen", "fsl,qoriq-clockgen-1.0"; 355 compatible = "fsl,p4080-clockgen", "fsl,qoriq-clockgen-1.0";
356 ranges = <0x0 0xe1000 0x1000>;
356 reg = <0xe1000 0x1000>; 357 reg = <0xe1000 0x1000>;
357 clock-frequency = <0>; 358 clock-frequency = <0>;
359 #address-cells = <1>;
360 #size-cells = <1>;
361
362 sysclk: sysclk {
363 #clock-cells = <0>;
364 compatible = "fsl,qoriq-sysclk-1.0";
365 clock-output-names = "sysclk";
366 };
367
368 pll0: pll0@800 {
369 #clock-cells = <1>;
370 reg = <0x800 0x4>;
371 compatible = "fsl,qoriq-core-pll-1.0";
372 clocks = <&sysclk>;
373 clock-output-names = "pll0", "pll0-div2";
374 };
375
376 pll1: pll1@820 {
377 #clock-cells = <1>;
378 reg = <0x820 0x4>;
379 compatible = "fsl,qoriq-core-pll-1.0";
380 clocks = <&sysclk>;
381 clock-output-names = "pll1", "pll1-div2";
382 };
383
384 pll2: pll2@840 {
385 #clock-cells = <1>;
386 reg = <0x840 0x4>;
387 compatible = "fsl,qoriq-core-pll-1.0";
388 clocks = <&sysclk>;
389 clock-output-names = "pll2", "pll2-div2";
390 };
391
392 pll3: pll3@860 {
393 #clock-cells = <1>;
394 reg = <0x860 0x4>;
395 compatible = "fsl,qoriq-core-pll-1.0";
396 clocks = <&sysclk>;
397 clock-output-names = "pll3", "pll3-div2";
398 };
399
400 mux0: mux0@0 {
401 #clock-cells = <0>;
402 reg = <0x0 0x4>;
403 compatible = "fsl,qoriq-core-mux-1.0";
404 clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>;
405 clock-names = "pll0", "pll0-div2", "pll1", "pll1-div2";
406 clock-output-names = "cmux0";
407 };
408
409 mux1: mux1@20 {
410 #clock-cells = <0>;
411 reg = <0x20 0x4>;
412 compatible = "fsl,qoriq-core-mux-1.0";
413 clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>;
414 clock-names = "pll0", "pll0-div2", "pll1", "pll1-div2";
415 clock-output-names = "cmux1";
416 };
417
418 mux2: mux2@40 {
419 #clock-cells = <0>;
420 reg = <0x40 0x4>;
421 compatible = "fsl,qoriq-core-mux-1.0";
422 clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>;
423 clock-names = "pll0", "pll0-div2", "pll1", "pll1-div2";
424 clock-output-names = "cmux2";
425 };
426
427 mux3: mux3@60 {
428 #clock-cells = <0>;
429 reg = <0x60 0x4>;
430 compatible = "fsl,qoriq-core-mux-1.0";
431 clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>;
432 clock-names = "pll0", "pll0-div2", "pll1", "pll1-div2";
433 clock-output-names = "cmux3";
434 };
435
436 mux4: mux4@80 {
437 #clock-cells = <0>;
438 reg = <0x80 0x4>;
439 compatible = "fsl,qoriq-core-mux-1.0";
440 clocks = <&pll2 0>, <&pll2 1>, <&pll3 0>, <&pll3 1>;
441 clock-names = "pll2", "pll2-div2", "pll3", "pll3-div2";
442 clock-output-names = "cmux4";
443 };
444
445 mux5: mux5@a0 {
446 #clock-cells = <0>;
447 reg = <0xa0 0x4>;
448 compatible = "fsl,qoriq-core-mux-1.0";
449 clocks = <&pll2 0>, <&pll2 1>, <&pll3 0>, <&pll3 1>;
450 clock-names = "pll2", "pll2-div2", "pll3", "pll3-div2";
451 clock-output-names = "cmux5";
452 };
453
454 mux6: mux6@c0 {
455 #clock-cells = <0>;
456 reg = <0xc0 0x4>;
457 compatible = "fsl,qoriq-core-mux-1.0";
458 clocks = <&pll2 0>, <&pll2 1>, <&pll3 0>, <&pll3 1>;
459 clock-names = "pll2", "pll2-div2", "pll3", "pll3-div2";
460 clock-output-names = "cmux6";
461 };
462
463 mux7: mux7@e0 {
464 #clock-cells = <0>;
465 reg = <0xe0 0x4>;
466 compatible = "fsl,qoriq-core-mux-1.0";
467 clocks = <&pll2 0>, <&pll2 1>, <&pll3 0>, <&pll3 1>;
468 clock-names = "pll2", "pll2-div2", "pll3", "pll3-div2";
469 clock-output-names = "cmux7";
470 };
358 }; 471 };
359 472
360 rcpm: global-utilities@e2000 { 473 rcpm: global-utilities@e2000 {
diff --git a/arch/powerpc/boot/dts/fsl/p4080si-pre.dtsi b/arch/powerpc/boot/dts/fsl/p4080si-pre.dtsi
index 493d9a056b5c..0040b5a5379e 100644
--- a/arch/powerpc/boot/dts/fsl/p4080si-pre.dtsi
+++ b/arch/powerpc/boot/dts/fsl/p4080si-pre.dtsi
@@ -81,6 +81,7 @@
81 cpu0: PowerPC,e500mc@0 { 81 cpu0: PowerPC,e500mc@0 {
82 device_type = "cpu"; 82 device_type = "cpu";
83 reg = <0>; 83 reg = <0>;
84 clocks = <&mux0>;
84 next-level-cache = <&L2_0>; 85 next-level-cache = <&L2_0>;
85 L2_0: l2-cache { 86 L2_0: l2-cache {
86 next-level-cache = <&cpc>; 87 next-level-cache = <&cpc>;
@@ -89,6 +90,7 @@
89 cpu1: PowerPC,e500mc@1 { 90 cpu1: PowerPC,e500mc@1 {
90 device_type = "cpu"; 91 device_type = "cpu";
91 reg = <1>; 92 reg = <1>;
93 clocks = <&mux1>;
92 next-level-cache = <&L2_1>; 94 next-level-cache = <&L2_1>;
93 L2_1: l2-cache { 95 L2_1: l2-cache {
94 next-level-cache = <&cpc>; 96 next-level-cache = <&cpc>;
@@ -97,6 +99,7 @@
97 cpu2: PowerPC,e500mc@2 { 99 cpu2: PowerPC,e500mc@2 {
98 device_type = "cpu"; 100 device_type = "cpu";
99 reg = <2>; 101 reg = <2>;
102 clocks = <&mux2>;
100 next-level-cache = <&L2_2>; 103 next-level-cache = <&L2_2>;
101 L2_2: l2-cache { 104 L2_2: l2-cache {
102 next-level-cache = <&cpc>; 105 next-level-cache = <&cpc>;
@@ -105,6 +108,7 @@
105 cpu3: PowerPC,e500mc@3 { 108 cpu3: PowerPC,e500mc@3 {
106 device_type = "cpu"; 109 device_type = "cpu";
107 reg = <3>; 110 reg = <3>;
111 clocks = <&mux3>;
108 next-level-cache = <&L2_3>; 112 next-level-cache = <&L2_3>;
109 L2_3: l2-cache { 113 L2_3: l2-cache {
110 next-level-cache = <&cpc>; 114 next-level-cache = <&cpc>;
@@ -113,6 +117,7 @@
113 cpu4: PowerPC,e500mc@4 { 117 cpu4: PowerPC,e500mc@4 {
114 device_type = "cpu"; 118 device_type = "cpu";
115 reg = <4>; 119 reg = <4>;
120 clocks = <&mux4>;
116 next-level-cache = <&L2_4>; 121 next-level-cache = <&L2_4>;
117 L2_4: l2-cache { 122 L2_4: l2-cache {
118 next-level-cache = <&cpc>; 123 next-level-cache = <&cpc>;
@@ -121,6 +126,7 @@
121 cpu5: PowerPC,e500mc@5 { 126 cpu5: PowerPC,e500mc@5 {
122 device_type = "cpu"; 127 device_type = "cpu";
123 reg = <5>; 128 reg = <5>;
129 clocks = <&mux5>;
124 next-level-cache = <&L2_5>; 130 next-level-cache = <&L2_5>;
125 L2_5: l2-cache { 131 L2_5: l2-cache {
126 next-level-cache = <&cpc>; 132 next-level-cache = <&cpc>;
@@ -129,6 +135,7 @@
129 cpu6: PowerPC,e500mc@6 { 135 cpu6: PowerPC,e500mc@6 {
130 device_type = "cpu"; 136 device_type = "cpu";
131 reg = <6>; 137 reg = <6>;
138 clocks = <&mux6>;
132 next-level-cache = <&L2_6>; 139 next-level-cache = <&L2_6>;
133 L2_6: l2-cache { 140 L2_6: l2-cache {
134 next-level-cache = <&cpc>; 141 next-level-cache = <&cpc>;
@@ -137,6 +144,7 @@
137 cpu7: PowerPC,e500mc@7 { 144 cpu7: PowerPC,e500mc@7 {
138 device_type = "cpu"; 145 device_type = "cpu";
139 reg = <7>; 146 reg = <7>;
147 clocks = <&mux7>;
140 next-level-cache = <&L2_7>; 148 next-level-cache = <&L2_7>;
141 L2_7: l2-cache { 149 L2_7: l2-cache {
142 next-level-cache = <&cpc>; 150 next-level-cache = <&cpc>;
diff --git a/arch/powerpc/boot/dts/fsl/p5020si-post.dtsi b/arch/powerpc/boot/dts/fsl/p5020si-post.dtsi
index bc3ae5a2252f..2985de4ad6be 100644
--- a/arch/powerpc/boot/dts/fsl/p5020si-post.dtsi
+++ b/arch/powerpc/boot/dts/fsl/p5020si-post.dtsi
@@ -338,8 +338,51 @@
338 338
339 clockgen: global-utilities@e1000 { 339 clockgen: global-utilities@e1000 {
340 compatible = "fsl,p5020-clockgen", "fsl,qoriq-clockgen-1.0"; 340 compatible = "fsl,p5020-clockgen", "fsl,qoriq-clockgen-1.0";
341 ranges = <0x0 0xe1000 0x1000>;
341 reg = <0xe1000 0x1000>; 342 reg = <0xe1000 0x1000>;
342 clock-frequency = <0>; 343 clock-frequency = <0>;
344 #address-cells = <1>;
345 #size-cells = <1>;
346
347 sysclk: sysclk {
348 #clock-cells = <0>;
349 compatible = "fsl,qoriq-sysclk-1.0";
350 clock-output-names = "sysclk";
351 };
352
353 pll0: pll0@800 {
354 #clock-cells = <1>;
355 reg = <0x800 0x4>;
356 compatible = "fsl,qoriq-core-pll-1.0";
357 clocks = <&sysclk>;
358 clock-output-names = "pll0", "pll0-div2";
359 };
360
361 pll1: pll1@820 {
362 #clock-cells = <1>;
363 reg = <0x820 0x4>;
364 compatible = "fsl,qoriq-core-pll-1.0";
365 clocks = <&sysclk>;
366 clock-output-names = "pll1", "pll1-div2";
367 };
368
369 mux0: mux0@0 {
370 #clock-cells = <0>;
371 reg = <0x0 0x4>;
372 compatible = "fsl,qoriq-core-mux-1.0";
373 clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>;
374 clock-names = "pll0", "pll0-div2", "pll1", "pll1-div2";
375 clock-output-names = "cmux0";
376 };
377
378 mux1: mux1@20 {
379 #clock-cells = <0>;
380 reg = <0x20 0x4>;
381 compatible = "fsl,qoriq-core-mux-1.0";
382 clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>;
383 clock-names = "pll0", "pll0-div2", "pll1", "pll1-div2";
384 clock-output-names = "cmux1";
385 };
343 }; 386 };
344 387
345 rcpm: global-utilities@e2000 { 388 rcpm: global-utilities@e2000 {
diff --git a/arch/powerpc/boot/dts/fsl/p5020si-pre.dtsi b/arch/powerpc/boot/dts/fsl/p5020si-pre.dtsi
index 8df47fc45ab5..fe1a2e6613b4 100644
--- a/arch/powerpc/boot/dts/fsl/p5020si-pre.dtsi
+++ b/arch/powerpc/boot/dts/fsl/p5020si-pre.dtsi
@@ -88,6 +88,7 @@
88 cpu0: PowerPC,e5500@0 { 88 cpu0: PowerPC,e5500@0 {
89 device_type = "cpu"; 89 device_type = "cpu";
90 reg = <0>; 90 reg = <0>;
91 clocks = <&mux0>;
91 next-level-cache = <&L2_0>; 92 next-level-cache = <&L2_0>;
92 L2_0: l2-cache { 93 L2_0: l2-cache {
93 next-level-cache = <&cpc>; 94 next-level-cache = <&cpc>;
@@ -96,6 +97,7 @@
96 cpu1: PowerPC,e5500@1 { 97 cpu1: PowerPC,e5500@1 {
97 device_type = "cpu"; 98 device_type = "cpu";
98 reg = <1>; 99 reg = <1>;
100 clocks = <&mux1>;
99 next-level-cache = <&L2_1>; 101 next-level-cache = <&L2_1>;
100 L2_1: l2-cache { 102 L2_1: l2-cache {
101 next-level-cache = <&cpc>; 103 next-level-cache = <&cpc>;
diff --git a/arch/powerpc/boot/dts/fsl/p5040si-post.dtsi b/arch/powerpc/boot/dts/fsl/p5040si-post.dtsi
index a91897f6af09..546a899efe20 100644
--- a/arch/powerpc/boot/dts/fsl/p5040si-post.dtsi
+++ b/arch/powerpc/boot/dts/fsl/p5040si-post.dtsi
@@ -298,8 +298,69 @@
298 298
299 clockgen: global-utilities@e1000 { 299 clockgen: global-utilities@e1000 {
300 compatible = "fsl,p5040-clockgen", "fsl,qoriq-clockgen-1.0"; 300 compatible = "fsl,p5040-clockgen", "fsl,qoriq-clockgen-1.0";
301 ranges = <0x0 0xe1000 0x1000>;
301 reg = <0xe1000 0x1000>; 302 reg = <0xe1000 0x1000>;
302 clock-frequency = <0>; 303 clock-frequency = <0>;
304 #address-cells = <1>;
305 #size-cells = <1>;
306
307 sysclk: sysclk {
308 #clock-cells = <0>;
309 compatible = "fsl,qoriq-sysclk-1.0";
310 clock-output-names = "sysclk";
311 };
312
313 pll0: pll0@800 {
314 #clock-cells = <1>;
315 reg = <0x800 0x4>;
316 compatible = "fsl,qoriq-core-pll-1.0";
317 clocks = <&sysclk>;
318 clock-output-names = "pll0", "pll0-div2";
319 };
320
321 pll1: pll1@820 {
322 #clock-cells = <1>;
323 reg = <0x820 0x4>;
324 compatible = "fsl,qoriq-core-pll-1.0";
325 clocks = <&sysclk>;
326 clock-output-names = "pll1", "pll1-div2";
327 };
328
329 mux0: mux0@0 {
330 #clock-cells = <0>;
331 reg = <0x0 0x4>;
332 compatible = "fsl,qoriq-core-mux-1.0";
333 clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>;
334 clock-names = "pll0", "pll0-div2", "pll1", "pll1-div2";
335 clock-output-names = "cmux0";
336 };
337
338 mux1: mux1@20 {
339 #clock-cells = <0>;
340 reg = <0x20 0x4>;
341 compatible = "fsl,qoriq-core-mux-1.0";
342 clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>;
343 clock-names = "pll0", "pll0-div2", "pll1", "pll1-div2";
344 clock-output-names = "cmux1";
345 };
346
347 mux2: mux2@40 {
348 #clock-cells = <0>;
349 reg = <0x40 0x4>;
350 compatible = "fsl,qoriq-core-mux-1.0";
351 clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>;
352 clock-names = "pll0", "pll0-div2", "pll1", "pll1-div2";
353 clock-output-names = "cmux2";
354 };
355
356 mux3: mux3@60 {
357 #clock-cells = <0>;
358 reg = <0x60 0x4>;
359 compatible = "fsl,qoriq-core-mux-1.0";
360 clocks = <&pll0 0>, <&pll0 1>, <&pll1 0>, <&pll1 1>;
361 clock-names = "pll0", "pll0-div2", "pll1", "pll1-div2";
362 clock-output-names = "cmux3";
363 };
303 }; 364 };
304 365
305 rcpm: global-utilities@e2000 { 366 rcpm: global-utilities@e2000 {
diff --git a/arch/powerpc/boot/dts/fsl/p5040si-pre.dtsi b/arch/powerpc/boot/dts/fsl/p5040si-pre.dtsi
index 40ca943f5d1c..3674686687cb 100644
--- a/arch/powerpc/boot/dts/fsl/p5040si-pre.dtsi
+++ b/arch/powerpc/boot/dts/fsl/p5040si-pre.dtsi
@@ -81,6 +81,7 @@
81 cpu0: PowerPC,e5500@0 { 81 cpu0: PowerPC,e5500@0 {
82 device_type = "cpu"; 82 device_type = "cpu";
83 reg = <0>; 83 reg = <0>;
84 clocks = <&mux0>;
84 next-level-cache = <&L2_0>; 85 next-level-cache = <&L2_0>;
85 L2_0: l2-cache { 86 L2_0: l2-cache {
86 next-level-cache = <&cpc>; 87 next-level-cache = <&cpc>;
@@ -89,6 +90,7 @@
89 cpu1: PowerPC,e5500@1 { 90 cpu1: PowerPC,e5500@1 {
90 device_type = "cpu"; 91 device_type = "cpu";
91 reg = <1>; 92 reg = <1>;
93 clocks = <&mux1>;
92 next-level-cache = <&L2_1>; 94 next-level-cache = <&L2_1>;
93 L2_1: l2-cache { 95 L2_1: l2-cache {
94 next-level-cache = <&cpc>; 96 next-level-cache = <&cpc>;
@@ -97,6 +99,7 @@
97 cpu2: PowerPC,e5500@2 { 99 cpu2: PowerPC,e5500@2 {
98 device_type = "cpu"; 100 device_type = "cpu";
99 reg = <2>; 101 reg = <2>;
102 clocks = <&mux2>;
100 next-level-cache = <&L2_2>; 103 next-level-cache = <&L2_2>;
101 L2_2: l2-cache { 104 L2_2: l2-cache {
102 next-level-cache = <&cpc>; 105 next-level-cache = <&cpc>;
@@ -105,6 +108,7 @@
105 cpu3: PowerPC,e5500@3 { 108 cpu3: PowerPC,e5500@3 {
106 device_type = "cpu"; 109 device_type = "cpu";
107 reg = <3>; 110 reg = <3>;
111 clocks = <&mux3>;
108 next-level-cache = <&L2_3>; 112 next-level-cache = <&L2_3>;
109 L2_3: l2-cache { 113 L2_3: l2-cache {
110 next-level-cache = <&cpc>; 114 next-level-cache = <&cpc>;
diff --git a/arch/powerpc/boot/dts/fsl/t4240si-post.dtsi b/arch/powerpc/boot/dts/fsl/t4240si-post.dtsi
index 4143a9733cd0..f99d74ff11b4 100644
--- a/arch/powerpc/boot/dts/fsl/t4240si-post.dtsi
+++ b/arch/powerpc/boot/dts/fsl/t4240si-post.dtsi
@@ -369,7 +369,93 @@
369 369
370 clockgen: global-utilities@e1000 { 370 clockgen: global-utilities@e1000 {
371 compatible = "fsl,t4240-clockgen", "fsl,qoriq-clockgen-2.0"; 371 compatible = "fsl,t4240-clockgen", "fsl,qoriq-clockgen-2.0";
372 ranges = <0x0 0xe1000 0x1000>;
372 reg = <0xe1000 0x1000>; 373 reg = <0xe1000 0x1000>;
374 #address-cells = <1>;
375 #size-cells = <1>;
376
377 sysclk: sysclk {
378 #clock-cells = <0>;
379 compatible = "fsl,qoriq-sysclk-2.0";
380 clock-output-names = "sysclk";
381 };
382
383 pll0: pll0@800 {
384 #clock-cells = <1>;
385 reg = <0x800 0x4>;
386 compatible = "fsl,qoriq-core-pll-2.0";
387 clocks = <&sysclk>;
388 clock-output-names = "pll0", "pll0-div2", "pll0-div4";
389 };
390
391 pll1: pll1@820 {
392 #clock-cells = <1>;
393 reg = <0x820 0x4>;
394 compatible = "fsl,qoriq-core-pll-2.0";
395 clocks = <&sysclk>;
396 clock-output-names = "pll1", "pll1-div2", "pll1-div4";
397 };
398
399 pll2: pll2@840 {
400 #clock-cells = <1>;
401 reg = <0x840 0x4>;
402 compatible = "fsl,qoriq-core-pll-2.0";
403 clocks = <&sysclk>;
404 clock-output-names = "pll2", "pll2-div2", "pll2-div4";
405 };
406
407 pll3: pll3@860 {
408 #clock-cells = <1>;
409 reg = <0x860 0x4>;
410 compatible = "fsl,qoriq-core-pll-2.0";
411 clocks = <&sysclk>;
412 clock-output-names = "pll3", "pll3-div2", "pll3-div4";
413 };
414
415 pll4: pll4@880 {
416 #clock-cells = <1>;
417 reg = <0x880 0x4>;
418 compatible = "fsl,qoriq-core-pll-2.0";
419 clocks = <&sysclk>;
420 clock-output-names = "pll4", "pll4-div2", "pll4-div4";
421 };
422
423 mux0: mux0@0 {
424 #clock-cells = <0>;
425 reg = <0x0 0x4>;
426 compatible = "fsl,qoriq-core-mux-2.0";
427 clocks = <&pll0 0>, <&pll0 1>, <&pll0 2>,
428 <&pll1 0>, <&pll1 1>, <&pll1 2>,
429 <&pll2 0>, <&pll2 1>, <&pll2 2>;
430 clock-names = "pll0", "pll0-div2", "pll0-div4",
431 "pll1", "pll1-div2", "pll1-div4",
432 "pll2", "pll2-div2", "pll2-div4";
433 clock-output-names = "cmux0";
434 };
435
436 mux1: mux1@20 {
437 #clock-cells = <0>;
438 reg = <0x20 0x4>;
439 compatible = "fsl,qoriq-core-mux-2.0";
440 clocks = <&pll0 0>, <&pll0 1>, <&pll0 2>,
441 <&pll1 0>, <&pll1 1>, <&pll1 2>,
442 <&pll2 0>, <&pll2 1>, <&pll2 2>;
443 clock-names = "pll0", "pll0-div2", "pll0-div4",
444 "pll1", "pll1-div2", "pll1-div4",
445 "pll2", "pll2-div2", "pll2-div4";
446 clock-output-names = "cmux1";
447 };
448
449 mux2: mux2@40 {
450 #clock-cells = <0>;
451 reg = <0x40 0x4>;
452 compatible = "fsl,qoriq-core-mux-2.0";
453 clocks = <&pll3 0>, <&pll3 1>, <&pll3 2>,
454 <&pll4 0>, <&pll4 1>, <&pll4 2>;
455 clock-names = "pll3", "pll3-div2", "pll3-div4",
456 "pll4", "pll4-div2", "pll4-div4";
457 clock-output-names = "cmux2";
458 };
373 }; 459 };
374 460
375 rcpm: global-utilities@e2000 { 461 rcpm: global-utilities@e2000 {
diff --git a/arch/powerpc/boot/dts/fsl/t4240si-pre.dtsi b/arch/powerpc/boot/dts/fsl/t4240si-pre.dtsi
index a93c55a88560..0b8ccc5b4a46 100644
--- a/arch/powerpc/boot/dts/fsl/t4240si-pre.dtsi
+++ b/arch/powerpc/boot/dts/fsl/t4240si-pre.dtsi
@@ -67,61 +67,73 @@
67 cpu0: PowerPC,e6500@0 { 67 cpu0: PowerPC,e6500@0 {
68 device_type = "cpu"; 68 device_type = "cpu";
69 reg = <0 1>; 69 reg = <0 1>;
70 clocks = <&mux0>;
70 next-level-cache = <&L2_1>; 71 next-level-cache = <&L2_1>;
71 }; 72 };
72 cpu1: PowerPC,e6500@2 { 73 cpu1: PowerPC,e6500@2 {
73 device_type = "cpu"; 74 device_type = "cpu";
74 reg = <2 3>; 75 reg = <2 3>;
76 clocks = <&mux0>;
75 next-level-cache = <&L2_1>; 77 next-level-cache = <&L2_1>;
76 }; 78 };
77 cpu2: PowerPC,e6500@4 { 79 cpu2: PowerPC,e6500@4 {
78 device_type = "cpu"; 80 device_type = "cpu";
79 reg = <4 5>; 81 reg = <4 5>;
82 clocks = <&mux0>;
80 next-level-cache = <&L2_1>; 83 next-level-cache = <&L2_1>;
81 }; 84 };
82 cpu3: PowerPC,e6500@6 { 85 cpu3: PowerPC,e6500@6 {
83 device_type = "cpu"; 86 device_type = "cpu";
84 reg = <6 7>; 87 reg = <6 7>;
88 clocks = <&mux0>;
85 next-level-cache = <&L2_1>; 89 next-level-cache = <&L2_1>;
86 }; 90 };
87 cpu4: PowerPC,e6500@8 { 91 cpu4: PowerPC,e6500@8 {
88 device_type = "cpu"; 92 device_type = "cpu";
89 reg = <8 9>; 93 reg = <8 9>;
94 clocks = <&mux1>;
90 next-level-cache = <&L2_2>; 95 next-level-cache = <&L2_2>;
91 }; 96 };
92 cpu5: PowerPC,e6500@10 { 97 cpu5: PowerPC,e6500@10 {
93 device_type = "cpu"; 98 device_type = "cpu";
94 reg = <10 11>; 99 reg = <10 11>;
100 clocks = <&mux1>;
95 next-level-cache = <&L2_2>; 101 next-level-cache = <&L2_2>;
96 }; 102 };
97 cpu6: PowerPC,e6500@12 { 103 cpu6: PowerPC,e6500@12 {
98 device_type = "cpu"; 104 device_type = "cpu";
99 reg = <12 13>; 105 reg = <12 13>;
106 clocks = <&mux1>;
100 next-level-cache = <&L2_2>; 107 next-level-cache = <&L2_2>;
101 }; 108 };
102 cpu7: PowerPC,e6500@14 { 109 cpu7: PowerPC,e6500@14 {
103 device_type = "cpu"; 110 device_type = "cpu";
104 reg = <14 15>; 111 reg = <14 15>;
112 clocks = <&mux1>;
105 next-level-cache = <&L2_2>; 113 next-level-cache = <&L2_2>;
106 }; 114 };
107 cpu8: PowerPC,e6500@16 { 115 cpu8: PowerPC,e6500@16 {
108 device_type = "cpu"; 116 device_type = "cpu";
109 reg = <16 17>; 117 reg = <16 17>;
118 clocks = <&mux2>;
110 next-level-cache = <&L2_3>; 119 next-level-cache = <&L2_3>;
111 }; 120 };
112 cpu9: PowerPC,e6500@18 { 121 cpu9: PowerPC,e6500@18 {
113 device_type = "cpu"; 122 device_type = "cpu";
114 reg = <18 19>; 123 reg = <18 19>;
124 clocks = <&mux2>;
115 next-level-cache = <&L2_3>; 125 next-level-cache = <&L2_3>;
116 }; 126 };
117 cpu10: PowerPC,e6500@20 { 127 cpu10: PowerPC,e6500@20 {
118 device_type = "cpu"; 128 device_type = "cpu";
119 reg = <20 21>; 129 reg = <20 21>;
130 clocks = <&mux2>;
120 next-level-cache = <&L2_3>; 131 next-level-cache = <&L2_3>;
121 }; 132 };
122 cpu11: PowerPC,e6500@22 { 133 cpu11: PowerPC,e6500@22 {
123 device_type = "cpu"; 134 device_type = "cpu";
124 reg = <22 23>; 135 reg = <22 23>;
136 clocks = <&mux2>;
125 next-level-cache = <&L2_3>; 137 next-level-cache = <&L2_3>;
126 }; 138 };
127 }; 139 };
diff --git a/arch/powerpc/boot/dts/t4240qds.dts b/arch/powerpc/boot/dts/t4240qds.dts
index 63e81b010804..97683f6a2936 100644
--- a/arch/powerpc/boot/dts/t4240qds.dts
+++ b/arch/powerpc/boot/dts/t4240qds.dts
@@ -159,6 +159,48 @@
159 interrupts = <0x1 0x1 0 0>; 159 interrupts = <0x1 0x1 0 0>;
160 }; 160 };
161 }; 161 };
162
163 i2c@2 {
164 #address-cells = <1>;
165 #size-cells = <0>;
166 reg = <0x2>;
167
168 ina220@40 {
169 compatible = "ti,ina220";
170 reg = <0x40>;
171 shunt-resistor = <1000>;
172 };
173
174 ina220@41 {
175 compatible = "ti,ina220";
176 reg = <0x41>;
177 shunt-resistor = <1000>;
178 };
179
180 ina220@44 {
181 compatible = "ti,ina220";
182 reg = <0x44>;
183 shunt-resistor = <1000>;
184 };
185
186 ina220@45 {
187 compatible = "ti,ina220";
188 reg = <0x45>;
189 shunt-resistor = <1000>;
190 };
191
192 ina220@46 {
193 compatible = "ti,ina220";
194 reg = <0x46>;
195 shunt-resistor = <1000>;
196 };
197
198 ina220@47 {
199 compatible = "ti,ina220";
200 reg = <0x47>;
201 shunt-resistor = <1000>;
202 };
203 };
162 }; 204 };
163 }; 205 };
164 206
diff --git a/arch/powerpc/configs/corenet64_smp_defconfig b/arch/powerpc/configs/corenet64_smp_defconfig
index e6c8d203322b..5c7fa19ae4ef 100644
--- a/arch/powerpc/configs/corenet64_smp_defconfig
+++ b/arch/powerpc/configs/corenet64_smp_defconfig
@@ -26,7 +26,6 @@ CONFIG_CORENET_GENERIC=y
26CONFIG_BINFMT_MISC=m 26CONFIG_BINFMT_MISC=m
27CONFIG_MATH_EMULATION=y 27CONFIG_MATH_EMULATION=y
28CONFIG_MATH_EMULATION_HW_UNIMPLEMENTED=y 28CONFIG_MATH_EMULATION_HW_UNIMPLEMENTED=y
29CONFIG_FSL_IFC=y
30CONFIG_PCIEPORTBUS=y 29CONFIG_PCIEPORTBUS=y
31CONFIG_PCI_MSI=y 30CONFIG_PCI_MSI=y
32CONFIG_RAPIDIO=y 31CONFIG_RAPIDIO=y
diff --git a/arch/powerpc/configs/mpc85xx_defconfig b/arch/powerpc/configs/mpc85xx_defconfig
index 9fff2819b038..19f0fbe5ba4b 100644
--- a/arch/powerpc/configs/mpc85xx_defconfig
+++ b/arch/powerpc/configs/mpc85xx_defconfig
@@ -49,7 +49,6 @@ CONFIG_HIGHMEM=y
49CONFIG_BINFMT_MISC=m 49CONFIG_BINFMT_MISC=m
50CONFIG_MATH_EMULATION=y 50CONFIG_MATH_EMULATION=y
51CONFIG_FORCE_MAX_ZONEORDER=12 51CONFIG_FORCE_MAX_ZONEORDER=12
52CONFIG_FSL_IFC=y
53CONFIG_PCI=y 52CONFIG_PCI=y
54CONFIG_PCI_MSI=y 53CONFIG_PCI_MSI=y
55CONFIG_RAPIDIO=y 54CONFIG_RAPIDIO=y
diff --git a/arch/powerpc/configs/mpc85xx_smp_defconfig b/arch/powerpc/configs/mpc85xx_smp_defconfig
index c496cd6fe646..062312e1fe1a 100644
--- a/arch/powerpc/configs/mpc85xx_smp_defconfig
+++ b/arch/powerpc/configs/mpc85xx_smp_defconfig
@@ -52,7 +52,6 @@ CONFIG_HIGHMEM=y
52CONFIG_BINFMT_MISC=m 52CONFIG_BINFMT_MISC=m
53CONFIG_MATH_EMULATION=y 53CONFIG_MATH_EMULATION=y
54CONFIG_FORCE_MAX_ZONEORDER=12 54CONFIG_FORCE_MAX_ZONEORDER=12
55CONFIG_FSL_IFC=y
56CONFIG_PCI=y 55CONFIG_PCI=y
57CONFIG_PCI_MSI=y 56CONFIG_PCI_MSI=y
58CONFIG_RAPIDIO=y 57CONFIG_RAPIDIO=y
diff --git a/arch/powerpc/include/asm/exception-64e.h b/arch/powerpc/include/asm/exception-64e.h
index 51fa43e536b9..a563d9afd179 100644
--- a/arch/powerpc/include/asm/exception-64e.h
+++ b/arch/powerpc/include/asm/exception-64e.h
@@ -46,9 +46,8 @@
46#define EX_CR (1 * 8) 46#define EX_CR (1 * 8)
47#define EX_R10 (2 * 8) 47#define EX_R10 (2 * 8)
48#define EX_R11 (3 * 8) 48#define EX_R11 (3 * 8)
49#define EX_R13 (4 * 8) 49#define EX_R14 (4 * 8)
50#define EX_R14 (5 * 8) 50#define EX_R15 (5 * 8)
51#define EX_R15 (6 * 8)
52 51
53/* 52/*
54 * The TLB miss exception uses different slots. 53 * The TLB miss exception uses different slots.
@@ -173,16 +172,6 @@ exc_##label##_book3e:
173 ld r9,EX_TLB_R9(r12); \ 172 ld r9,EX_TLB_R9(r12); \
174 ld r8,EX_TLB_R8(r12); \ 173 ld r8,EX_TLB_R8(r12); \
175 mtlr r16; 174 mtlr r16;
176#define TLB_MISS_PROLOG_STATS_BOLTED \
177 mflr r10; \
178 std r8,PACA_EXTLB+EX_TLB_R8(r13); \
179 std r9,PACA_EXTLB+EX_TLB_R9(r13); \
180 std r10,PACA_EXTLB+EX_TLB_LR(r13);
181#define TLB_MISS_RESTORE_STATS_BOLTED \
182 ld r16,PACA_EXTLB+EX_TLB_LR(r13); \
183 ld r9,PACA_EXTLB+EX_TLB_R9(r13); \
184 ld r8,PACA_EXTLB+EX_TLB_R8(r13); \
185 mtlr r16;
186#define TLB_MISS_STATS_D(name) \ 175#define TLB_MISS_STATS_D(name) \
187 addi r9,r13,MMSTAT_DSTATS+name; \ 176 addi r9,r13,MMSTAT_DSTATS+name; \
188 bl .tlb_stat_inc; 177 bl .tlb_stat_inc;
diff --git a/arch/powerpc/include/asm/kvm_booke_hv_asm.h b/arch/powerpc/include/asm/kvm_booke_hv_asm.h
index 3a79f5325712..e5f048bbcb7c 100644
--- a/arch/powerpc/include/asm/kvm_booke_hv_asm.h
+++ b/arch/powerpc/include/asm/kvm_booke_hv_asm.h
@@ -36,26 +36,21 @@
36 * *(r8 + GPR11) = saved r11 36 * *(r8 + GPR11) = saved r11
37 * 37 *
38 * 64-bit host 38 * 64-bit host
39 * Expected inputs (GEN/GDBELL/DBG/MC exception types): 39 * Expected inputs (GEN/GDBELL/DBG/CRIT/MC exception types):
40 * r10 = saved CR 40 * r10 = saved CR
41 * r13 = PACA_POINTER 41 * r13 = PACA_POINTER
42 * *(r13 + PACA_EX##type + EX_R10) = saved r10 42 * *(r13 + PACA_EX##type + EX_R10) = saved r10
43 * *(r13 + PACA_EX##type + EX_R11) = saved r11 43 * *(r13 + PACA_EX##type + EX_R11) = saved r11
44 * SPRN_SPRG_##type##_SCRATCH = saved r13 44 * SPRN_SPRG_##type##_SCRATCH = saved r13
45 * 45 *
46 * Expected inputs (CRIT exception type):
47 * r10 = saved CR
48 * r13 = PACA_POINTER
49 * *(r13 + PACA_EX##type + EX_R10) = saved r10
50 * *(r13 + PACA_EX##type + EX_R11) = saved r11
51 * *(r13 + PACA_EX##type + EX_R13) = saved r13
52 *
53 * Expected inputs (TLB exception type): 46 * Expected inputs (TLB exception type):
54 * r10 = saved CR 47 * r10 = saved CR
48 * r12 = extlb pointer
55 * r13 = PACA_POINTER 49 * r13 = PACA_POINTER
56 * *(r13 + PACA_EX##type + EX_TLB_R10) = saved r10 50 * *(r12 + EX_TLB_R10) = saved r10
57 * *(r13 + PACA_EX##type + EX_TLB_R11) = saved r11 51 * *(r12 + EX_TLB_R11) = saved r11
58 * SPRN_SPRG_GEN_SCRATCH = saved r13 52 * *(r12 + EX_TLB_R13) = saved r13
53 * SPRN_SPRG_GEN_SCRATCH = saved r12
59 * 54 *
60 * Only the bolted version of TLB miss exception handlers is supported now. 55 * Only the bolted version of TLB miss exception handlers is supported now.
61 */ 56 */
diff --git a/arch/powerpc/include/asm/mmu-book3e.h b/arch/powerpc/include/asm/mmu-book3e.h
index 89b785d16846..901dac6b6cb7 100644
--- a/arch/powerpc/include/asm/mmu-book3e.h
+++ b/arch/powerpc/include/asm/mmu-book3e.h
@@ -287,11 +287,14 @@ extern int mmu_linear_psize;
287extern int mmu_vmemmap_psize; 287extern int mmu_vmemmap_psize;
288 288
289struct tlb_core_data { 289struct tlb_core_data {
290 /*
291 * Per-core spinlock for e6500 TLB handlers (no tlbsrx.)
292 * Must be the first struct element.
293 */
294 u8 lock;
295
290 /* For software way selection, as on Freescale TLB1 */ 296 /* For software way selection, as on Freescale TLB1 */
291 u8 esel_next, esel_max, esel_first; 297 u8 esel_next, esel_max, esel_first;
292
293 /* Per-core spinlock for e6500 TLB handlers (no tlbsrx.) */
294 u8 lock;
295}; 298};
296 299
297#ifdef CONFIG_PPC64 300#ifdef CONFIG_PPC64
diff --git a/arch/powerpc/include/asm/paca.h b/arch/powerpc/include/asm/paca.h
index 9c5dbc3833fb..8e956a0b6e85 100644
--- a/arch/powerpc/include/asm/paca.h
+++ b/arch/powerpc/include/asm/paca.h
@@ -116,8 +116,11 @@ struct paca_struct {
116 /* Shared by all threads of a core -- points to tcd of first thread */ 116 /* Shared by all threads of a core -- points to tcd of first thread */
117 struct tlb_core_data *tcd_ptr; 117 struct tlb_core_data *tcd_ptr;
118 118
119 /* We can have up to 3 levels of reentrancy in the TLB miss handler */ 119 /*
120 u64 extlb[3][EX_TLB_SIZE / sizeof(u64)]; 120 * We can have up to 3 levels of reentrancy in the TLB miss handler,
121 * in each of four exception levels (normal, crit, mcheck, debug).
122 */
123 u64 extlb[12][EX_TLB_SIZE / sizeof(u64)];
121 u64 exmc[8]; /* used for machine checks */ 124 u64 exmc[8]; /* used for machine checks */
122 u64 excrit[8]; /* used for crit interrupts */ 125 u64 excrit[8]; /* used for crit interrupts */
123 u64 exdbg[8]; /* used for debug interrupts */ 126 u64 exdbg[8]; /* used for debug interrupts */
@@ -146,7 +149,7 @@ struct paca_struct {
146 u8 io_sync; /* writel() needs spin_unlock sync */ 149 u8 io_sync; /* writel() needs spin_unlock sync */
147 u8 irq_work_pending; /* IRQ_WORK interrupt while soft-disable */ 150 u8 irq_work_pending; /* IRQ_WORK interrupt while soft-disable */
148 u8 nap_state_lost; /* NV GPR values lost in power7_idle */ 151 u8 nap_state_lost; /* NV GPR values lost in power7_idle */
149 u64 sprg3; /* Saved user-visible sprg */ 152 u64 sprg_vdso; /* Saved user-visible sprg */
150#ifdef CONFIG_PPC_TRANSACTIONAL_MEM 153#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
151 u64 tm_scratch; /* TM scratch area for reclaim */ 154 u64 tm_scratch; /* TM scratch area for reclaim */
152#endif 155#endif
diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h
index 980e8db2f261..1a36b8ede417 100644
--- a/arch/powerpc/include/asm/reg.h
+++ b/arch/powerpc/include/asm/reg.h
@@ -577,9 +577,13 @@
577#define SPRN_SPRG3 0x113 /* Special Purpose Register General 3 */ 577#define SPRN_SPRG3 0x113 /* Special Purpose Register General 3 */
578#define SPRN_USPRG3 0x103 /* SPRG3 userspace read */ 578#define SPRN_USPRG3 0x103 /* SPRG3 userspace read */
579#define SPRN_SPRG4 0x114 /* Special Purpose Register General 4 */ 579#define SPRN_SPRG4 0x114 /* Special Purpose Register General 4 */
580#define SPRN_USPRG4 0x104 /* SPRG4 userspace read */
580#define SPRN_SPRG5 0x115 /* Special Purpose Register General 5 */ 581#define SPRN_SPRG5 0x115 /* Special Purpose Register General 5 */
582#define SPRN_USPRG5 0x105 /* SPRG5 userspace read */
581#define SPRN_SPRG6 0x116 /* Special Purpose Register General 6 */ 583#define SPRN_SPRG6 0x116 /* Special Purpose Register General 6 */
584#define SPRN_USPRG6 0x106 /* SPRG6 userspace read */
582#define SPRN_SPRG7 0x117 /* Special Purpose Register General 7 */ 585#define SPRN_SPRG7 0x117 /* Special Purpose Register General 7 */
586#define SPRN_USPRG7 0x107 /* SPRG7 userspace read */
583#define SPRN_SRR0 0x01A /* Save/Restore Register 0 */ 587#define SPRN_SRR0 0x01A /* Save/Restore Register 0 */
584#define SPRN_SRR1 0x01B /* Save/Restore Register 1 */ 588#define SPRN_SRR1 0x01B /* Save/Restore Register 1 */
585#define SRR1_ISI_NOPT 0x40000000 /* ISI: Not found in hash */ 589#define SRR1_ISI_NOPT 0x40000000 /* ISI: Not found in hash */
@@ -882,11 +886,10 @@
882 * 64-bit embedded 886 * 64-bit embedded
883 * - SPRG0 generic exception scratch 887 * - SPRG0 generic exception scratch
884 * - SPRG2 TLB exception stack 888 * - SPRG2 TLB exception stack
885 * - SPRG3 critical exception scratch and 889 * - SPRG3 critical exception scratch (user visible, sorry!)
886 * CPU and NUMA node for VDSO getcpu (user visible)
887 * - SPRG4 unused (user visible) 890 * - SPRG4 unused (user visible)
888 * - SPRG6 TLB miss scratch (user visible, sorry !) 891 * - SPRG6 TLB miss scratch (user visible, sorry !)
889 * - SPRG7 critical exception scratch 892 * - SPRG7 CPU and NUMA node for VDSO getcpu (user visible)
890 * - SPRG8 machine check exception scratch 893 * - SPRG8 machine check exception scratch
891 * - SPRG9 debug exception scratch 894 * - SPRG9 debug exception scratch
892 * 895 *
@@ -943,6 +946,8 @@
943#define SPRN_SPRG_SCRATCH0 SPRN_SPRG2 946#define SPRN_SPRG_SCRATCH0 SPRN_SPRG2
944#define SPRN_SPRG_HPACA SPRN_HSPRG0 947#define SPRN_SPRG_HPACA SPRN_HSPRG0
945#define SPRN_SPRG_HSCRATCH0 SPRN_HSPRG1 948#define SPRN_SPRG_HSCRATCH0 SPRN_HSPRG1
949#define SPRN_SPRG_VDSO_READ SPRN_USPRG3
950#define SPRN_SPRG_VDSO_WRITE SPRN_SPRG3
946 951
947#define GET_PACA(rX) \ 952#define GET_PACA(rX) \
948 BEGIN_FTR_SECTION_NESTED(66); \ 953 BEGIN_FTR_SECTION_NESTED(66); \
@@ -986,6 +991,8 @@
986#define SPRN_SPRG_TLB_SCRATCH SPRN_SPRG6 991#define SPRN_SPRG_TLB_SCRATCH SPRN_SPRG6
987#define SPRN_SPRG_GEN_SCRATCH SPRN_SPRG0 992#define SPRN_SPRG_GEN_SCRATCH SPRN_SPRG0
988#define SPRN_SPRG_GDBELL_SCRATCH SPRN_SPRG_GEN_SCRATCH 993#define SPRN_SPRG_GDBELL_SCRATCH SPRN_SPRG_GEN_SCRATCH
994#define SPRN_SPRG_VDSO_READ SPRN_USPRG7
995#define SPRN_SPRG_VDSO_WRITE SPRN_SPRG7
989 996
990#define SET_PACA(rX) mtspr SPRN_SPRG_PACA,rX 997#define SET_PACA(rX) mtspr SPRN_SPRG_PACA,rX
991#define GET_PACA(rX) mfspr rX,SPRN_SPRG_PACA 998#define GET_PACA(rX) mfspr rX,SPRN_SPRG_PACA
@@ -1105,6 +1112,8 @@
1105#define PVR_8560 0x80200000 1112#define PVR_8560 0x80200000
1106#define PVR_VER_E500V1 0x8020 1113#define PVR_VER_E500V1 0x8020
1107#define PVR_VER_E500V2 0x8021 1114#define PVR_VER_E500V2 0x8021
1115#define PVR_VER_E500MC 0x8023
1116#define PVR_VER_E5500 0x8024
1108#define PVR_VER_E6500 0x8040 1117#define PVR_VER_E6500 0x8040
1109 1118
1110/* 1119/*
diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c
index b5aacf72ae6f..dba8140ebc20 100644
--- a/arch/powerpc/kernel/asm-offsets.c
+++ b/arch/powerpc/kernel/asm-offsets.c
@@ -253,7 +253,7 @@ int main(void)
253 DEFINE(PACA_SYSTEM_TIME, offsetof(struct paca_struct, system_time)); 253 DEFINE(PACA_SYSTEM_TIME, offsetof(struct paca_struct, system_time));
254 DEFINE(PACA_TRAP_SAVE, offsetof(struct paca_struct, trap_save)); 254 DEFINE(PACA_TRAP_SAVE, offsetof(struct paca_struct, trap_save));
255 DEFINE(PACA_NAPSTATELOST, offsetof(struct paca_struct, nap_state_lost)); 255 DEFINE(PACA_NAPSTATELOST, offsetof(struct paca_struct, nap_state_lost));
256 DEFINE(PACA_SPRG3, offsetof(struct paca_struct, sprg3)); 256 DEFINE(PACA_SPRG_VDSO, offsetof(struct paca_struct, sprg_vdso));
257#endif /* CONFIG_PPC64 */ 257#endif /* CONFIG_PPC64 */
258 258
259 /* RTAS */ 259 /* RTAS */
diff --git a/arch/powerpc/kernel/exceptions-64e.S b/arch/powerpc/kernel/exceptions-64e.S
index 063b65dd4f27..c1bee3ce9d1f 100644
--- a/arch/powerpc/kernel/exceptions-64e.S
+++ b/arch/powerpc/kernel/exceptions-64e.S
@@ -34,7 +34,250 @@
34 * special interrupts from within a non-standard level will probably 34 * special interrupts from within a non-standard level will probably
35 * blow you up 35 * blow you up
36 */ 36 */
37#define SPECIAL_EXC_FRAME_SIZE INT_FRAME_SIZE 37#define SPECIAL_EXC_SRR0 0
38#define SPECIAL_EXC_SRR1 1
39#define SPECIAL_EXC_SPRG_GEN 2
40#define SPECIAL_EXC_SPRG_TLB 3
41#define SPECIAL_EXC_MAS0 4
42#define SPECIAL_EXC_MAS1 5
43#define SPECIAL_EXC_MAS2 6
44#define SPECIAL_EXC_MAS3 7
45#define SPECIAL_EXC_MAS6 8
46#define SPECIAL_EXC_MAS7 9
47#define SPECIAL_EXC_MAS5 10 /* E.HV only */
48#define SPECIAL_EXC_MAS8 11 /* E.HV only */
49#define SPECIAL_EXC_IRQHAPPENED 12
50#define SPECIAL_EXC_DEAR 13
51#define SPECIAL_EXC_ESR 14
52#define SPECIAL_EXC_SOFTE 15
53#define SPECIAL_EXC_CSRR0 16
54#define SPECIAL_EXC_CSRR1 17
55/* must be even to keep 16-byte stack alignment */
56#define SPECIAL_EXC_END 18
57
58#define SPECIAL_EXC_FRAME_SIZE (INT_FRAME_SIZE + SPECIAL_EXC_END * 8)
59#define SPECIAL_EXC_FRAME_OFFS (INT_FRAME_SIZE - 288)
60
61#define SPECIAL_EXC_STORE(reg, name) \
62 std reg, (SPECIAL_EXC_##name * 8 + SPECIAL_EXC_FRAME_OFFS)(r1)
63
64#define SPECIAL_EXC_LOAD(reg, name) \
65 ld reg, (SPECIAL_EXC_##name * 8 + SPECIAL_EXC_FRAME_OFFS)(r1)
66
67special_reg_save:
68 lbz r9,PACAIRQHAPPENED(r13)
69 RECONCILE_IRQ_STATE(r3,r4)
70
71 /*
72 * We only need (or have stack space) to save this stuff if
73 * we interrupted the kernel.
74 */
75 ld r3,_MSR(r1)
76 andi. r3,r3,MSR_PR
77 bnelr
78
79 /* Copy info into temporary exception thread info */
80 ld r11,PACAKSAVE(r13)
81 CURRENT_THREAD_INFO(r11, r11)
82 CURRENT_THREAD_INFO(r12, r1)
83 ld r10,TI_FLAGS(r11)
84 std r10,TI_FLAGS(r12)
85 ld r10,TI_PREEMPT(r11)
86 std r10,TI_PREEMPT(r12)
87 ld r10,TI_TASK(r11)
88 std r10,TI_TASK(r12)
89
90 /*
91 * Advance to the next TLB exception frame for handler
92 * types that don't do it automatically.
93 */
94 LOAD_REG_ADDR(r11,extlb_level_exc)
95 lwz r12,0(r11)
96 mfspr r10,SPRN_SPRG_TLB_EXFRAME
97 add r10,r10,r12
98 mtspr SPRN_SPRG_TLB_EXFRAME,r10
99
100 /*
101 * Save registers needed to allow nesting of certain exceptions
102 * (such as TLB misses) inside special exception levels
103 */
104 mfspr r10,SPRN_SRR0
105 SPECIAL_EXC_STORE(r10,SRR0)
106 mfspr r10,SPRN_SRR1
107 SPECIAL_EXC_STORE(r10,SRR1)
108 mfspr r10,SPRN_SPRG_GEN_SCRATCH
109 SPECIAL_EXC_STORE(r10,SPRG_GEN)
110 mfspr r10,SPRN_SPRG_TLB_SCRATCH
111 SPECIAL_EXC_STORE(r10,SPRG_TLB)
112 mfspr r10,SPRN_MAS0
113 SPECIAL_EXC_STORE(r10,MAS0)
114 mfspr r10,SPRN_MAS1
115 SPECIAL_EXC_STORE(r10,MAS1)
116 mfspr r10,SPRN_MAS2
117 SPECIAL_EXC_STORE(r10,MAS2)
118 mfspr r10,SPRN_MAS3
119 SPECIAL_EXC_STORE(r10,MAS3)
120 mfspr r10,SPRN_MAS6
121 SPECIAL_EXC_STORE(r10,MAS6)
122 mfspr r10,SPRN_MAS7
123 SPECIAL_EXC_STORE(r10,MAS7)
124BEGIN_FTR_SECTION
125 mfspr r10,SPRN_MAS5
126 SPECIAL_EXC_STORE(r10,MAS5)
127 mfspr r10,SPRN_MAS8
128 SPECIAL_EXC_STORE(r10,MAS8)
129
130 /* MAS5/8 could have inappropriate values if we interrupted KVM code */
131 li r10,0
132 mtspr SPRN_MAS5,r10
133 mtspr SPRN_MAS8,r10
134END_FTR_SECTION_IFSET(CPU_FTR_EMB_HV)
135 SPECIAL_EXC_STORE(r9,IRQHAPPENED)
136
137 mfspr r10,SPRN_DEAR
138 SPECIAL_EXC_STORE(r10,DEAR)
139 mfspr r10,SPRN_ESR
140 SPECIAL_EXC_STORE(r10,ESR)
141
142 lbz r10,PACASOFTIRQEN(r13)
143 SPECIAL_EXC_STORE(r10,SOFTE)
144 ld r10,_NIP(r1)
145 SPECIAL_EXC_STORE(r10,CSRR0)
146 ld r10,_MSR(r1)
147 SPECIAL_EXC_STORE(r10,CSRR1)
148
149 blr
150
151ret_from_level_except:
152 ld r3,_MSR(r1)
153 andi. r3,r3,MSR_PR
154 beq 1f
155 b ret_from_except
1561:
157
158 LOAD_REG_ADDR(r11,extlb_level_exc)
159 lwz r12,0(r11)
160 mfspr r10,SPRN_SPRG_TLB_EXFRAME
161 sub r10,r10,r12
162 mtspr SPRN_SPRG_TLB_EXFRAME,r10
163
164 /*
165 * It's possible that the special level exception interrupted a
166 * TLB miss handler, and inserted the same entry that the
167 * interrupted handler was about to insert. On CPUs without TLB
168 * write conditional, this can result in a duplicate TLB entry.
169 * Wipe all non-bolted entries to be safe.
170 *
171 * Note that this doesn't protect against any TLB misses
172 * we may take accessing the stack from here to the end of
173 * the special level exception. It's not clear how we can
174 * reasonably protect against that, but only CPUs with
175 * neither TLB write conditional nor bolted kernel memory
176 * are affected. Do any such CPUs even exist?
177 */
178 PPC_TLBILX_ALL(0,R0)
179
180 REST_NVGPRS(r1)
181
182 SPECIAL_EXC_LOAD(r10,SRR0)
183 mtspr SPRN_SRR0,r10
184 SPECIAL_EXC_LOAD(r10,SRR1)
185 mtspr SPRN_SRR1,r10
186 SPECIAL_EXC_LOAD(r10,SPRG_GEN)
187 mtspr SPRN_SPRG_GEN_SCRATCH,r10
188 SPECIAL_EXC_LOAD(r10,SPRG_TLB)
189 mtspr SPRN_SPRG_TLB_SCRATCH,r10
190 SPECIAL_EXC_LOAD(r10,MAS0)
191 mtspr SPRN_MAS0,r10
192 SPECIAL_EXC_LOAD(r10,MAS1)
193 mtspr SPRN_MAS1,r10
194 SPECIAL_EXC_LOAD(r10,MAS2)
195 mtspr SPRN_MAS2,r10
196 SPECIAL_EXC_LOAD(r10,MAS3)
197 mtspr SPRN_MAS3,r10
198 SPECIAL_EXC_LOAD(r10,MAS6)
199 mtspr SPRN_MAS6,r10
200 SPECIAL_EXC_LOAD(r10,MAS7)
201 mtspr SPRN_MAS7,r10
202BEGIN_FTR_SECTION
203 SPECIAL_EXC_LOAD(r10,MAS5)
204 mtspr SPRN_MAS5,r10
205 SPECIAL_EXC_LOAD(r10,MAS8)
206 mtspr SPRN_MAS8,r10
207END_FTR_SECTION_IFSET(CPU_FTR_EMB_HV)
208
209 lbz r6,PACASOFTIRQEN(r13)
210 ld r5,SOFTE(r1)
211
212 /* Interrupts had better not already be enabled... */
213 twnei r6,0
214
215 cmpwi cr0,r5,0
216 beq 1f
217
218 TRACE_ENABLE_INTS
219 stb r5,PACASOFTIRQEN(r13)
2201:
221 /*
222 * Restore PACAIRQHAPPENED rather than setting it based on
223 * the return MSR[EE], since we could have interrupted
224 * __check_irq_replay() or other inconsistent transitory
225 * states that must remain that way.
226 */
227 SPECIAL_EXC_LOAD(r10,IRQHAPPENED)
228 stb r10,PACAIRQHAPPENED(r13)
229
230 SPECIAL_EXC_LOAD(r10,DEAR)
231 mtspr SPRN_DEAR,r10
232 SPECIAL_EXC_LOAD(r10,ESR)
233 mtspr SPRN_ESR,r10
234
235 stdcx. r0,0,r1 /* to clear the reservation */
236
237 REST_4GPRS(2, r1)
238 REST_4GPRS(6, r1)
239
240 ld r10,_CTR(r1)
241 ld r11,_XER(r1)
242 mtctr r10
243 mtxer r11
244
245 blr
246
247.macro ret_from_level srr0 srr1 paca_ex scratch
248 bl ret_from_level_except
249
250 ld r10,_LINK(r1)
251 ld r11,_CCR(r1)
252 ld r0,GPR13(r1)
253 mtlr r10
254 mtcr r11
255
256 ld r10,GPR10(r1)
257 ld r11,GPR11(r1)
258 ld r12,GPR12(r1)
259 mtspr \scratch,r0
260
261 std r10,\paca_ex+EX_R10(r13);
262 std r11,\paca_ex+EX_R11(r13);
263 ld r10,_NIP(r1)
264 ld r11,_MSR(r1)
265 ld r0,GPR0(r1)
266 ld r1,GPR1(r1)
267 mtspr \srr0,r10
268 mtspr \srr1,r11
269 ld r10,\paca_ex+EX_R10(r13)
270 ld r11,\paca_ex+EX_R11(r13)
271 mfspr r13,\scratch
272.endm
273
274ret_from_crit_except:
275 ret_from_level SPRN_CSRR0 SPRN_CSRR1 PACA_EXCRIT SPRN_SPRG_CRIT_SCRATCH
276 rfci
277
278ret_from_mc_except:
279 ret_from_level SPRN_MCSRR0 SPRN_MCSRR1 PACA_EXMC SPRN_SPRG_MC_SCRATCH
280 rfmci
38 281
39/* Exception prolog code for all exceptions */ 282/* Exception prolog code for all exceptions */
40#define EXCEPTION_PROLOG(n, intnum, type, addition) \ 283#define EXCEPTION_PROLOG(n, intnum, type, addition) \
@@ -42,7 +285,6 @@
42 mfspr r13,SPRN_SPRG_PACA; /* get PACA */ \ 285 mfspr r13,SPRN_SPRG_PACA; /* get PACA */ \
43 std r10,PACA_EX##type+EX_R10(r13); \ 286 std r10,PACA_EX##type+EX_R10(r13); \
44 std r11,PACA_EX##type+EX_R11(r13); \ 287 std r11,PACA_EX##type+EX_R11(r13); \
45 PROLOG_STORE_RESTORE_SCRATCH_##type; \
46 mfcr r10; /* save CR */ \ 288 mfcr r10; /* save CR */ \
47 mfspr r11,SPRN_##type##_SRR1;/* what are we coming from */ \ 289 mfspr r11,SPRN_##type##_SRR1;/* what are we coming from */ \
48 DO_KVM intnum,SPRN_##type##_SRR1; /* KVM hook */ \ 290 DO_KVM intnum,SPRN_##type##_SRR1; /* KVM hook */ \
@@ -69,19 +311,19 @@
69 311
70#define CRIT_SET_KSTACK \ 312#define CRIT_SET_KSTACK \
71 ld r1,PACA_CRIT_STACK(r13); \ 313 ld r1,PACA_CRIT_STACK(r13); \
72 subi r1,r1,SPECIAL_EXC_FRAME_SIZE; 314 subi r1,r1,SPECIAL_EXC_FRAME_SIZE
73#define SPRN_CRIT_SRR0 SPRN_CSRR0 315#define SPRN_CRIT_SRR0 SPRN_CSRR0
74#define SPRN_CRIT_SRR1 SPRN_CSRR1 316#define SPRN_CRIT_SRR1 SPRN_CSRR1
75 317
76#define DBG_SET_KSTACK \ 318#define DBG_SET_KSTACK \
77 ld r1,PACA_DBG_STACK(r13); \ 319 ld r1,PACA_DBG_STACK(r13); \
78 subi r1,r1,SPECIAL_EXC_FRAME_SIZE; 320 subi r1,r1,SPECIAL_EXC_FRAME_SIZE
79#define SPRN_DBG_SRR0 SPRN_DSRR0 321#define SPRN_DBG_SRR0 SPRN_DSRR0
80#define SPRN_DBG_SRR1 SPRN_DSRR1 322#define SPRN_DBG_SRR1 SPRN_DSRR1
81 323
82#define MC_SET_KSTACK \ 324#define MC_SET_KSTACK \
83 ld r1,PACA_MC_STACK(r13); \ 325 ld r1,PACA_MC_STACK(r13); \
84 subi r1,r1,SPECIAL_EXC_FRAME_SIZE; 326 subi r1,r1,SPECIAL_EXC_FRAME_SIZE
85#define SPRN_MC_SRR0 SPRN_MCSRR0 327#define SPRN_MC_SRR0 SPRN_MCSRR0
86#define SPRN_MC_SRR1 SPRN_MCSRR1 328#define SPRN_MC_SRR1 SPRN_MCSRR1
87 329
@@ -100,20 +342,6 @@
100#define GDBELL_EXCEPTION_PROLOG(n, intnum, addition) \ 342#define GDBELL_EXCEPTION_PROLOG(n, intnum, addition) \
101 EXCEPTION_PROLOG(n, intnum, GDBELL, addition##_GDBELL(n)) 343 EXCEPTION_PROLOG(n, intnum, GDBELL, addition##_GDBELL(n))
102 344
103/*
104 * Store user-visible scratch in PACA exception slots and restore proper value
105 */
106#define PROLOG_STORE_RESTORE_SCRATCH_GEN
107#define PROLOG_STORE_RESTORE_SCRATCH_GDBELL
108#define PROLOG_STORE_RESTORE_SCRATCH_DBG
109#define PROLOG_STORE_RESTORE_SCRATCH_MC
110
111#define PROLOG_STORE_RESTORE_SCRATCH_CRIT \
112 mfspr r10,SPRN_SPRG_CRIT_SCRATCH; /* get r13 */ \
113 std r10,PACA_EXCRIT+EX_R13(r13); \
114 ld r11,PACA_SPRG3(r13); \
115 mtspr SPRN_SPRG_CRIT_SCRATCH,r11;
116
117/* Variants of the "addition" argument for the prolog 345/* Variants of the "addition" argument for the prolog
118 */ 346 */
119#define PROLOG_ADDITION_NONE_GEN(n) 347#define PROLOG_ADDITION_NONE_GEN(n)
@@ -147,10 +375,8 @@
147 std r15,PACA_EXMC+EX_R15(r13) 375 std r15,PACA_EXMC+EX_R15(r13)
148 376
149 377
150/* Core exception code for all exceptions except TLB misses. 378/* Core exception code for all exceptions except TLB misses. */
151 * XXX: Needs to make SPRN_SPRG_GEN depend on exception type 379#define EXCEPTION_COMMON_LVL(n, scratch, excf) \
152 */
153#define EXCEPTION_COMMON(n, excf, ints) \
154exc_##n##_common: \ 380exc_##n##_common: \
155 std r0,GPR0(r1); /* save r0 in stackframe */ \ 381 std r0,GPR0(r1); /* save r0 in stackframe */ \
156 std r2,GPR2(r1); /* save r2 in stackframe */ \ 382 std r2,GPR2(r1); /* save r2 in stackframe */ \
@@ -163,7 +389,7 @@ exc_##n##_common: \
163 ACCOUNT_CPU_USER_ENTRY(r10,r11);/* accounting (uses cr0+eq) */ \ 389 ACCOUNT_CPU_USER_ENTRY(r10,r11);/* accounting (uses cr0+eq) */ \
1642: ld r3,excf+EX_R10(r13); /* get back r10 */ \ 3902: ld r3,excf+EX_R10(r13); /* get back r10 */ \
165 ld r4,excf+EX_R11(r13); /* get back r11 */ \ 391 ld r4,excf+EX_R11(r13); /* get back r11 */ \
166 mfspr r5,SPRN_SPRG_GEN_SCRATCH;/* get back r13 */ \ 392 mfspr r5,scratch; /* get back r13 */ \
167 std r12,GPR12(r1); /* save r12 in stackframe */ \ 393 std r12,GPR12(r1); /* save r12 in stackframe */ \
168 ld r2,PACATOC(r13); /* get kernel TOC into r2 */ \ 394 ld r2,PACATOC(r13); /* get kernel TOC into r2 */ \
169 mflr r6; /* save LR in stackframe */ \ 395 mflr r6; /* save LR in stackframe */ \
@@ -187,24 +413,29 @@ exc_##n##_common: \
187 std r11,SOFTE(r1); /* and save it to stackframe */ \ 413 std r11,SOFTE(r1); /* and save it to stackframe */ \
188 std r12,STACK_FRAME_OVERHEAD-16(r1); /* mark the frame */ \ 414 std r12,STACK_FRAME_OVERHEAD-16(r1); /* mark the frame */ \
189 std r3,_TRAP(r1); /* set trap number */ \ 415 std r3,_TRAP(r1); /* set trap number */ \
190 std r0,RESULT(r1); /* clear regs->result */ \ 416 std r0,RESULT(r1); /* clear regs->result */
191 ints;
192 417
193/* Variants for the "ints" argument. This one does nothing when we want 418#define EXCEPTION_COMMON(n) \
194 * to keep interrupts in their original state 419 EXCEPTION_COMMON_LVL(n, SPRN_SPRG_GEN_SCRATCH, PACA_EXGEN)
195 */ 420#define EXCEPTION_COMMON_CRIT(n) \
196#define INTS_KEEP 421 EXCEPTION_COMMON_LVL(n, SPRN_SPRG_CRIT_SCRATCH, PACA_EXCRIT)
422#define EXCEPTION_COMMON_MC(n) \
423 EXCEPTION_COMMON_LVL(n, SPRN_SPRG_MC_SCRATCH, PACA_EXMC)
424#define EXCEPTION_COMMON_DBG(n) \
425 EXCEPTION_COMMON_LVL(n, SPRN_SPRG_DBG_SCRATCH, PACA_EXDBG)
197 426
198/* This second version is meant for exceptions that don't immediately 427/*
199 * hard-enable. We set a bit in paca->irq_happened to ensure that 428 * This is meant for exceptions that don't immediately hard-enable. We
200 * a subsequent call to arch_local_irq_restore() will properly 429 * set a bit in paca->irq_happened to ensure that a subsequent call to
201 * hard-enable and avoid the fast-path, and then reconcile irq state. 430 * arch_local_irq_restore() will properly hard-enable and avoid the
431 * fast-path, and then reconcile irq state.
202 */ 432 */
203#define INTS_DISABLE RECONCILE_IRQ_STATE(r3,r4) 433#define INTS_DISABLE RECONCILE_IRQ_STATE(r3,r4)
204 434
205/* This is called by exceptions that used INTS_KEEP (that did not touch 435/*
206 * irq indicators in the PACA). This will restore MSR:EE to it's previous 436 * This is called by exceptions that don't use INTS_DISABLE (that did not
207 * value 437 * touch irq indicators in the PACA). This will restore MSR:EE to it's
438 * previous value
208 * 439 *
209 * XXX In the long run, we may want to open-code it in order to separate the 440 * XXX In the long run, we may want to open-code it in order to separate the
210 * load from the wrtee, thus limiting the latency caused by the dependency 441 * load from the wrtee, thus limiting the latency caused by the dependency
@@ -262,7 +493,8 @@ exc_##n##_bad_stack: \
262#define MASKABLE_EXCEPTION(trapnum, intnum, label, hdlr, ack) \ 493#define MASKABLE_EXCEPTION(trapnum, intnum, label, hdlr, ack) \
263 START_EXCEPTION(label); \ 494 START_EXCEPTION(label); \
264 NORMAL_EXCEPTION_PROLOG(trapnum, intnum, PROLOG_ADDITION_MASKABLE)\ 495 NORMAL_EXCEPTION_PROLOG(trapnum, intnum, PROLOG_ADDITION_MASKABLE)\
265 EXCEPTION_COMMON(trapnum, PACA_EXGEN, INTS_DISABLE) \ 496 EXCEPTION_COMMON(trapnum) \
497 INTS_DISABLE; \
266 ack(r8); \ 498 ack(r8); \
267 CHECK_NAPPING(); \ 499 CHECK_NAPPING(); \
268 addi r3,r1,STACK_FRAME_OVERHEAD; \ 500 addi r3,r1,STACK_FRAME_OVERHEAD; \
@@ -283,8 +515,8 @@ exception_marker:
283 .balign 0x1000 515 .balign 0x1000
284 .globl interrupt_base_book3e 516 .globl interrupt_base_book3e
285interrupt_base_book3e: /* fake trap */ 517interrupt_base_book3e: /* fake trap */
286 EXCEPTION_STUB(0x000, machine_check) /* 0x0200 */ 518 EXCEPTION_STUB(0x000, machine_check)
287 EXCEPTION_STUB(0x020, critical_input) /* 0x0580 */ 519 EXCEPTION_STUB(0x020, critical_input) /* 0x0100 */
288 EXCEPTION_STUB(0x040, debug_crit) /* 0x0d00 */ 520 EXCEPTION_STUB(0x040, debug_crit) /* 0x0d00 */
289 EXCEPTION_STUB(0x060, data_storage) /* 0x0300 */ 521 EXCEPTION_STUB(0x060, data_storage) /* 0x0300 */
290 EXCEPTION_STUB(0x080, instruction_storage) /* 0x0400 */ 522 EXCEPTION_STUB(0x080, instruction_storage) /* 0x0400 */
@@ -299,8 +531,8 @@ interrupt_base_book3e: /* fake trap */
299 EXCEPTION_STUB(0x1a0, watchdog) /* 0x09f0 */ 531 EXCEPTION_STUB(0x1a0, watchdog) /* 0x09f0 */
300 EXCEPTION_STUB(0x1c0, data_tlb_miss) 532 EXCEPTION_STUB(0x1c0, data_tlb_miss)
301 EXCEPTION_STUB(0x1e0, instruction_tlb_miss) 533 EXCEPTION_STUB(0x1e0, instruction_tlb_miss)
302 EXCEPTION_STUB(0x200, altivec_unavailable) /* 0x0f20 */ 534 EXCEPTION_STUB(0x200, altivec_unavailable)
303 EXCEPTION_STUB(0x220, altivec_assist) /* 0x1700 */ 535 EXCEPTION_STUB(0x220, altivec_assist)
304 EXCEPTION_STUB(0x260, perfmon) 536 EXCEPTION_STUB(0x260, perfmon)
305 EXCEPTION_STUB(0x280, doorbell) 537 EXCEPTION_STUB(0x280, doorbell)
306 EXCEPTION_STUB(0x2a0, doorbell_crit) 538 EXCEPTION_STUB(0x2a0, doorbell_crit)
@@ -317,25 +549,25 @@ interrupt_end_book3e:
317 START_EXCEPTION(critical_input); 549 START_EXCEPTION(critical_input);
318 CRIT_EXCEPTION_PROLOG(0x100, BOOKE_INTERRUPT_CRITICAL, 550 CRIT_EXCEPTION_PROLOG(0x100, BOOKE_INTERRUPT_CRITICAL,
319 PROLOG_ADDITION_NONE) 551 PROLOG_ADDITION_NONE)
320// EXCEPTION_COMMON(0x100, PACA_EXCRIT, INTS_DISABLE) 552 EXCEPTION_COMMON_CRIT(0x100)
321// bl special_reg_save_crit 553 bl .save_nvgprs
322// CHECK_NAPPING(); 554 bl special_reg_save
323// addi r3,r1,STACK_FRAME_OVERHEAD 555 CHECK_NAPPING();
324// bl .critical_exception 556 addi r3,r1,STACK_FRAME_OVERHEAD
325// b ret_from_crit_except 557 bl .unknown_exception
326 b . 558 b ret_from_crit_except
327 559
328/* Machine Check Interrupt */ 560/* Machine Check Interrupt */
329 START_EXCEPTION(machine_check); 561 START_EXCEPTION(machine_check);
330 MC_EXCEPTION_PROLOG(0x200, BOOKE_INTERRUPT_MACHINE_CHECK, 562 MC_EXCEPTION_PROLOG(0x000, BOOKE_INTERRUPT_MACHINE_CHECK,
331 PROLOG_ADDITION_NONE) 563 PROLOG_ADDITION_NONE)
332// EXCEPTION_COMMON(0x200, PACA_EXMC, INTS_DISABLE) 564 EXCEPTION_COMMON_MC(0x000)
333// bl special_reg_save_mc 565 bl .save_nvgprs
334// addi r3,r1,STACK_FRAME_OVERHEAD 566 bl special_reg_save
335// CHECK_NAPPING(); 567 CHECK_NAPPING();
336// bl .machine_check_exception 568 addi r3,r1,STACK_FRAME_OVERHEAD
337// b ret_from_mc_except 569 bl .machine_check_exception
338 b . 570 b ret_from_mc_except
339 571
340/* Data Storage Interrupt */ 572/* Data Storage Interrupt */
341 START_EXCEPTION(data_storage) 573 START_EXCEPTION(data_storage)
@@ -343,7 +575,8 @@ interrupt_end_book3e:
343 PROLOG_ADDITION_2REGS) 575 PROLOG_ADDITION_2REGS)
344 mfspr r14,SPRN_DEAR 576 mfspr r14,SPRN_DEAR
345 mfspr r15,SPRN_ESR 577 mfspr r15,SPRN_ESR
346 EXCEPTION_COMMON(0x300, PACA_EXGEN, INTS_DISABLE) 578 EXCEPTION_COMMON(0x300)
579 INTS_DISABLE
347 b storage_fault_common 580 b storage_fault_common
348 581
349/* Instruction Storage Interrupt */ 582/* Instruction Storage Interrupt */
@@ -352,7 +585,8 @@ interrupt_end_book3e:
352 PROLOG_ADDITION_2REGS) 585 PROLOG_ADDITION_2REGS)
353 li r15,0 586 li r15,0
354 mr r14,r10 587 mr r14,r10
355 EXCEPTION_COMMON(0x400, PACA_EXGEN, INTS_DISABLE) 588 EXCEPTION_COMMON(0x400)
589 INTS_DISABLE
356 b storage_fault_common 590 b storage_fault_common
357 591
358/* External Input Interrupt */ 592/* External Input Interrupt */
@@ -365,7 +599,7 @@ interrupt_end_book3e:
365 PROLOG_ADDITION_2REGS) 599 PROLOG_ADDITION_2REGS)
366 mfspr r14,SPRN_DEAR 600 mfspr r14,SPRN_DEAR
367 mfspr r15,SPRN_ESR 601 mfspr r15,SPRN_ESR
368 EXCEPTION_COMMON(0x600, PACA_EXGEN, INTS_KEEP) 602 EXCEPTION_COMMON(0x600)
369 b alignment_more /* no room, go out of line */ 603 b alignment_more /* no room, go out of line */
370 604
371/* Program Interrupt */ 605/* Program Interrupt */
@@ -373,7 +607,8 @@ interrupt_end_book3e:
373 NORMAL_EXCEPTION_PROLOG(0x700, BOOKE_INTERRUPT_PROGRAM, 607 NORMAL_EXCEPTION_PROLOG(0x700, BOOKE_INTERRUPT_PROGRAM,
374 PROLOG_ADDITION_1REG) 608 PROLOG_ADDITION_1REG)
375 mfspr r14,SPRN_ESR 609 mfspr r14,SPRN_ESR
376 EXCEPTION_COMMON(0x700, PACA_EXGEN, INTS_DISABLE) 610 EXCEPTION_COMMON(0x700)
611 INTS_DISABLE
377 std r14,_DSISR(r1) 612 std r14,_DSISR(r1)
378 addi r3,r1,STACK_FRAME_OVERHEAD 613 addi r3,r1,STACK_FRAME_OVERHEAD
379 ld r14,PACA_EXGEN+EX_R14(r13) 614 ld r14,PACA_EXGEN+EX_R14(r13)
@@ -386,7 +621,7 @@ interrupt_end_book3e:
386 NORMAL_EXCEPTION_PROLOG(0x800, BOOKE_INTERRUPT_FP_UNAVAIL, 621 NORMAL_EXCEPTION_PROLOG(0x800, BOOKE_INTERRUPT_FP_UNAVAIL,
387 PROLOG_ADDITION_NONE) 622 PROLOG_ADDITION_NONE)
388 /* we can probably do a shorter exception entry for that one... */ 623 /* we can probably do a shorter exception entry for that one... */
389 EXCEPTION_COMMON(0x800, PACA_EXGEN, INTS_KEEP) 624 EXCEPTION_COMMON(0x800)
390 ld r12,_MSR(r1) 625 ld r12,_MSR(r1)
391 andi. r0,r12,MSR_PR; 626 andi. r0,r12,MSR_PR;
392 beq- 1f 627 beq- 1f
@@ -403,7 +638,7 @@ interrupt_end_book3e:
403 NORMAL_EXCEPTION_PROLOG(0x200, BOOKE_INTERRUPT_SPE_ALTIVEC_UNAVAIL, 638 NORMAL_EXCEPTION_PROLOG(0x200, BOOKE_INTERRUPT_SPE_ALTIVEC_UNAVAIL,
404 PROLOG_ADDITION_NONE) 639 PROLOG_ADDITION_NONE)
405 /* we can probably do a shorter exception entry for that one... */ 640 /* we can probably do a shorter exception entry for that one... */
406 EXCEPTION_COMMON(0x200, PACA_EXGEN, INTS_KEEP) 641 EXCEPTION_COMMON(0x200)
407#ifdef CONFIG_ALTIVEC 642#ifdef CONFIG_ALTIVEC
408BEGIN_FTR_SECTION 643BEGIN_FTR_SECTION
409 ld r12,_MSR(r1) 644 ld r12,_MSR(r1)
@@ -425,7 +660,8 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
425 NORMAL_EXCEPTION_PROLOG(0x220, 660 NORMAL_EXCEPTION_PROLOG(0x220,
426 BOOKE_INTERRUPT_SPE_FP_DATA_ALTIVEC_ASSIST, 661 BOOKE_INTERRUPT_SPE_FP_DATA_ALTIVEC_ASSIST,
427 PROLOG_ADDITION_NONE) 662 PROLOG_ADDITION_NONE)
428 EXCEPTION_COMMON(0x220, PACA_EXGEN, INTS_DISABLE) 663 EXCEPTION_COMMON(0x220)
664 INTS_DISABLE
429 bl .save_nvgprs 665 bl .save_nvgprs
430 addi r3,r1,STACK_FRAME_OVERHEAD 666 addi r3,r1,STACK_FRAME_OVERHEAD
431#ifdef CONFIG_ALTIVEC 667#ifdef CONFIG_ALTIVEC
@@ -450,13 +686,17 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
450 START_EXCEPTION(watchdog); 686 START_EXCEPTION(watchdog);
451 CRIT_EXCEPTION_PROLOG(0x9f0, BOOKE_INTERRUPT_WATCHDOG, 687 CRIT_EXCEPTION_PROLOG(0x9f0, BOOKE_INTERRUPT_WATCHDOG,
452 PROLOG_ADDITION_NONE) 688 PROLOG_ADDITION_NONE)
453// EXCEPTION_COMMON(0x9f0, PACA_EXCRIT, INTS_DISABLE) 689 EXCEPTION_COMMON_CRIT(0x9f0)
454// bl special_reg_save_crit 690 bl .save_nvgprs
455// CHECK_NAPPING(); 691 bl special_reg_save
456// addi r3,r1,STACK_FRAME_OVERHEAD 692 CHECK_NAPPING();
457// bl .unknown_exception 693 addi r3,r1,STACK_FRAME_OVERHEAD
458// b ret_from_crit_except 694#ifdef CONFIG_BOOKE_WDT
459 b . 695 bl .WatchdogException
696#else
697 bl .unknown_exception
698#endif
699 b ret_from_crit_except
460 700
461/* System Call Interrupt */ 701/* System Call Interrupt */
462 START_EXCEPTION(system_call) 702 START_EXCEPTION(system_call)
@@ -470,7 +710,8 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
470 START_EXCEPTION(ap_unavailable); 710 START_EXCEPTION(ap_unavailable);
471 NORMAL_EXCEPTION_PROLOG(0xf20, BOOKE_INTERRUPT_AP_UNAVAIL, 711 NORMAL_EXCEPTION_PROLOG(0xf20, BOOKE_INTERRUPT_AP_UNAVAIL,
472 PROLOG_ADDITION_NONE) 712 PROLOG_ADDITION_NONE)
473 EXCEPTION_COMMON(0xf20, PACA_EXGEN, INTS_DISABLE) 713 EXCEPTION_COMMON(0xf20)
714 INTS_DISABLE
474 bl .save_nvgprs 715 bl .save_nvgprs
475 addi r3,r1,STACK_FRAME_OVERHEAD 716 addi r3,r1,STACK_FRAME_OVERHEAD
476 bl .unknown_exception 717 bl .unknown_exception
@@ -513,7 +754,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
513 mtcr r10 754 mtcr r10
514 ld r10,PACA_EXCRIT+EX_R10(r13) /* restore registers */ 755 ld r10,PACA_EXCRIT+EX_R10(r13) /* restore registers */
515 ld r11,PACA_EXCRIT+EX_R11(r13) 756 ld r11,PACA_EXCRIT+EX_R11(r13)
516 ld r13,PACA_EXCRIT+EX_R13(r13) 757 mfspr r13,SPRN_SPRG_CRIT_SCRATCH
517 rfci 758 rfci
518 759
519 /* Normal debug exception */ 760 /* Normal debug exception */
@@ -526,10 +767,8 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
526 /* Now we mash up things to make it look like we are coming on a 767 /* Now we mash up things to make it look like we are coming on a
527 * normal exception 768 * normal exception
528 */ 769 */
529 ld r15,PACA_EXCRIT+EX_R13(r13)
530 mtspr SPRN_SPRG_GEN_SCRATCH,r15
531 mfspr r14,SPRN_DBSR 770 mfspr r14,SPRN_DBSR
532 EXCEPTION_COMMON(0xd00, PACA_EXCRIT, INTS_DISABLE) 771 EXCEPTION_COMMON_CRIT(0xd00)
533 std r14,_DSISR(r1) 772 std r14,_DSISR(r1)
534 addi r3,r1,STACK_FRAME_OVERHEAD 773 addi r3,r1,STACK_FRAME_OVERHEAD
535 mr r4,r14 774 mr r4,r14
@@ -592,10 +831,9 @@ kernel_dbg_exc:
592 /* Now we mash up things to make it look like we are coming on a 831 /* Now we mash up things to make it look like we are coming on a
593 * normal exception 832 * normal exception
594 */ 833 */
595 mfspr r15,SPRN_SPRG_DBG_SCRATCH
596 mtspr SPRN_SPRG_GEN_SCRATCH,r15
597 mfspr r14,SPRN_DBSR 834 mfspr r14,SPRN_DBSR
598 EXCEPTION_COMMON(0xd08, PACA_EXDBG, INTS_DISABLE) 835 EXCEPTION_COMMON_DBG(0xd08)
836 INTS_DISABLE
599 std r14,_DSISR(r1) 837 std r14,_DSISR(r1)
600 addi r3,r1,STACK_FRAME_OVERHEAD 838 addi r3,r1,STACK_FRAME_OVERHEAD
601 mr r4,r14 839 mr r4,r14
@@ -608,7 +846,8 @@ kernel_dbg_exc:
608 START_EXCEPTION(perfmon); 846 START_EXCEPTION(perfmon);
609 NORMAL_EXCEPTION_PROLOG(0x260, BOOKE_INTERRUPT_PERFORMANCE_MONITOR, 847 NORMAL_EXCEPTION_PROLOG(0x260, BOOKE_INTERRUPT_PERFORMANCE_MONITOR,
610 PROLOG_ADDITION_NONE) 848 PROLOG_ADDITION_NONE)
611 EXCEPTION_COMMON(0x260, PACA_EXGEN, INTS_DISABLE) 849 EXCEPTION_COMMON(0x260)
850 INTS_DISABLE
612 CHECK_NAPPING() 851 CHECK_NAPPING()
613 addi r3,r1,STACK_FRAME_OVERHEAD 852 addi r3,r1,STACK_FRAME_OVERHEAD
614 bl .performance_monitor_exception 853 bl .performance_monitor_exception
@@ -622,13 +861,13 @@ kernel_dbg_exc:
622 START_EXCEPTION(doorbell_crit); 861 START_EXCEPTION(doorbell_crit);
623 CRIT_EXCEPTION_PROLOG(0x2a0, BOOKE_INTERRUPT_DOORBELL_CRITICAL, 862 CRIT_EXCEPTION_PROLOG(0x2a0, BOOKE_INTERRUPT_DOORBELL_CRITICAL,
624 PROLOG_ADDITION_NONE) 863 PROLOG_ADDITION_NONE)
625// EXCEPTION_COMMON(0x2a0, PACA_EXCRIT, INTS_DISABLE) 864 EXCEPTION_COMMON_CRIT(0x2a0)
626// bl special_reg_save_crit 865 bl .save_nvgprs
627// CHECK_NAPPING(); 866 bl special_reg_save
628// addi r3,r1,STACK_FRAME_OVERHEAD 867 CHECK_NAPPING();
629// bl .doorbell_critical_exception 868 addi r3,r1,STACK_FRAME_OVERHEAD
630// b ret_from_crit_except 869 bl .unknown_exception
631 b . 870 b ret_from_crit_except
632 871
633/* 872/*
634 * Guest doorbell interrupt 873 * Guest doorbell interrupt
@@ -637,7 +876,7 @@ kernel_dbg_exc:
637 START_EXCEPTION(guest_doorbell); 876 START_EXCEPTION(guest_doorbell);
638 GDBELL_EXCEPTION_PROLOG(0x2c0, BOOKE_INTERRUPT_GUEST_DBELL, 877 GDBELL_EXCEPTION_PROLOG(0x2c0, BOOKE_INTERRUPT_GUEST_DBELL,
639 PROLOG_ADDITION_NONE) 878 PROLOG_ADDITION_NONE)
640 EXCEPTION_COMMON(0x2c0, PACA_EXGEN, INTS_KEEP) 879 EXCEPTION_COMMON(0x2c0)
641 addi r3,r1,STACK_FRAME_OVERHEAD 880 addi r3,r1,STACK_FRAME_OVERHEAD
642 bl .save_nvgprs 881 bl .save_nvgprs
643 INTS_RESTORE_HARD 882 INTS_RESTORE_HARD
@@ -648,19 +887,19 @@ kernel_dbg_exc:
648 START_EXCEPTION(guest_doorbell_crit); 887 START_EXCEPTION(guest_doorbell_crit);
649 CRIT_EXCEPTION_PROLOG(0x2e0, BOOKE_INTERRUPT_GUEST_DBELL_CRIT, 888 CRIT_EXCEPTION_PROLOG(0x2e0, BOOKE_INTERRUPT_GUEST_DBELL_CRIT,
650 PROLOG_ADDITION_NONE) 889 PROLOG_ADDITION_NONE)
651// EXCEPTION_COMMON(0x2e0, PACA_EXCRIT, INTS_DISABLE) 890 EXCEPTION_COMMON_CRIT(0x2e0)
652// bl special_reg_save_crit 891 bl .save_nvgprs
653// CHECK_NAPPING(); 892 bl special_reg_save
654// addi r3,r1,STACK_FRAME_OVERHEAD 893 CHECK_NAPPING();
655// bl .guest_doorbell_critical_exception 894 addi r3,r1,STACK_FRAME_OVERHEAD
656// b ret_from_crit_except 895 bl .unknown_exception
657 b . 896 b ret_from_crit_except
658 897
659/* Hypervisor call */ 898/* Hypervisor call */
660 START_EXCEPTION(hypercall); 899 START_EXCEPTION(hypercall);
661 NORMAL_EXCEPTION_PROLOG(0x310, BOOKE_INTERRUPT_HV_SYSCALL, 900 NORMAL_EXCEPTION_PROLOG(0x310, BOOKE_INTERRUPT_HV_SYSCALL,
662 PROLOG_ADDITION_NONE) 901 PROLOG_ADDITION_NONE)
663 EXCEPTION_COMMON(0x310, PACA_EXGEN, INTS_KEEP) 902 EXCEPTION_COMMON(0x310)
664 addi r3,r1,STACK_FRAME_OVERHEAD 903 addi r3,r1,STACK_FRAME_OVERHEAD
665 bl .save_nvgprs 904 bl .save_nvgprs
666 INTS_RESTORE_HARD 905 INTS_RESTORE_HARD
@@ -671,7 +910,7 @@ kernel_dbg_exc:
671 START_EXCEPTION(ehpriv); 910 START_EXCEPTION(ehpriv);
672 NORMAL_EXCEPTION_PROLOG(0x320, BOOKE_INTERRUPT_HV_PRIV, 911 NORMAL_EXCEPTION_PROLOG(0x320, BOOKE_INTERRUPT_HV_PRIV,
673 PROLOG_ADDITION_NONE) 912 PROLOG_ADDITION_NONE)
674 EXCEPTION_COMMON(0x320, PACA_EXGEN, INTS_KEEP) 913 EXCEPTION_COMMON(0x320)
675 addi r3,r1,STACK_FRAME_OVERHEAD 914 addi r3,r1,STACK_FRAME_OVERHEAD
676 bl .save_nvgprs 915 bl .save_nvgprs
677 INTS_RESTORE_HARD 916 INTS_RESTORE_HARD
@@ -682,7 +921,7 @@ kernel_dbg_exc:
682 START_EXCEPTION(lrat_error); 921 START_EXCEPTION(lrat_error);
683 NORMAL_EXCEPTION_PROLOG(0x340, BOOKE_INTERRUPT_LRAT_ERROR, 922 NORMAL_EXCEPTION_PROLOG(0x340, BOOKE_INTERRUPT_LRAT_ERROR,
684 PROLOG_ADDITION_NONE) 923 PROLOG_ADDITION_NONE)
685 EXCEPTION_COMMON(0x340, PACA_EXGEN, INTS_KEEP) 924 EXCEPTION_COMMON(0x340)
686 addi r3,r1,STACK_FRAME_OVERHEAD 925 addi r3,r1,STACK_FRAME_OVERHEAD
687 bl .save_nvgprs 926 bl .save_nvgprs
688 INTS_RESTORE_HARD 927 INTS_RESTORE_HARD
diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c
index f5f11a7d30e5..4933909cc5c0 100644
--- a/arch/powerpc/kernel/setup_64.c
+++ b/arch/powerpc/kernel/setup_64.c
@@ -102,6 +102,8 @@ static void setup_tlb_core_data(void)
102{ 102{
103 int cpu; 103 int cpu;
104 104
105 BUILD_BUG_ON(offsetof(struct tlb_core_data, lock) != 0);
106
105 for_each_possible_cpu(cpu) { 107 for_each_possible_cpu(cpu) {
106 int first = cpu_first_thread_sibling(cpu); 108 int first = cpu_first_thread_sibling(cpu);
107 109
@@ -552,14 +554,20 @@ static void __init irqstack_early_init(void)
552static void __init exc_lvl_early_init(void) 554static void __init exc_lvl_early_init(void)
553{ 555{
554 unsigned int i; 556 unsigned int i;
557 unsigned long sp;
555 558
556 for_each_possible_cpu(i) { 559 for_each_possible_cpu(i) {
557 critirq_ctx[i] = (struct thread_info *) 560 sp = memblock_alloc(THREAD_SIZE, THREAD_SIZE);
558 __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE)); 561 critirq_ctx[i] = (struct thread_info *)__va(sp);
559 dbgirq_ctx[i] = (struct thread_info *) 562 paca[i].crit_kstack = __va(sp + THREAD_SIZE);
560 __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE)); 563
561 mcheckirq_ctx[i] = (struct thread_info *) 564 sp = memblock_alloc(THREAD_SIZE, THREAD_SIZE);
562 __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE)); 565 dbgirq_ctx[i] = (struct thread_info *)__va(sp);
566 paca[i].dbg_kstack = __va(sp + THREAD_SIZE);
567
568 sp = memblock_alloc(THREAD_SIZE, THREAD_SIZE);
569 mcheckirq_ctx[i] = (struct thread_info *)__va(sp);
570 paca[i].mc_kstack = __va(sp + THREAD_SIZE);
563 } 571 }
564 572
565 if (cpu_has_feature(CPU_FTR_DEBUG_LVL_EXC)) 573 if (cpu_has_feature(CPU_FTR_DEBUG_LVL_EXC))
diff --git a/arch/powerpc/kernel/vdso.c b/arch/powerpc/kernel/vdso.c
index 094e45c16a17..ce74c335a6a4 100644
--- a/arch/powerpc/kernel/vdso.c
+++ b/arch/powerpc/kernel/vdso.c
@@ -715,8 +715,8 @@ int vdso_getcpu_init(void)
715 unsigned long cpu, node, val; 715 unsigned long cpu, node, val;
716 716
717 /* 717 /*
718 * SPRG3 contains the CPU in the bottom 16 bits and the NUMA node in 718 * SPRG_VDSO contains the CPU in the bottom 16 bits and the NUMA node
719 * the next 16 bits. The VDSO uses this to implement getcpu(). 719 * in the next 16 bits. The VDSO uses this to implement getcpu().
720 */ 720 */
721 cpu = get_cpu(); 721 cpu = get_cpu();
722 WARN_ON_ONCE(cpu > 0xffff); 722 WARN_ON_ONCE(cpu > 0xffff);
@@ -725,8 +725,8 @@ int vdso_getcpu_init(void)
725 WARN_ON_ONCE(node > 0xffff); 725 WARN_ON_ONCE(node > 0xffff);
726 726
727 val = (cpu & 0xfff) | ((node & 0xffff) << 16); 727 val = (cpu & 0xfff) | ((node & 0xffff) << 16);
728 mtspr(SPRN_SPRG3, val); 728 mtspr(SPRN_SPRG_VDSO_WRITE, val);
729 get_paca()->sprg3 = val; 729 get_paca()->sprg_vdso = val;
730 730
731 put_cpu(); 731 put_cpu();
732 732
diff --git a/arch/powerpc/kernel/vdso32/getcpu.S b/arch/powerpc/kernel/vdso32/getcpu.S
index 47afd08c90f7..23eb9a9441bd 100644
--- a/arch/powerpc/kernel/vdso32/getcpu.S
+++ b/arch/powerpc/kernel/vdso32/getcpu.S
@@ -29,7 +29,7 @@
29 */ 29 */
30V_FUNCTION_BEGIN(__kernel_getcpu) 30V_FUNCTION_BEGIN(__kernel_getcpu)
31 .cfi_startproc 31 .cfi_startproc
32 mfspr r5,SPRN_USPRG3 32 mfspr r5,SPRN_SPRG_VDSO_READ
33 cmpdi cr0,r3,0 33 cmpdi cr0,r3,0
34 cmpdi cr1,r4,0 34 cmpdi cr1,r4,0
35 clrlwi r6,r5,16 35 clrlwi r6,r5,16
diff --git a/arch/powerpc/kernel/vdso64/getcpu.S b/arch/powerpc/kernel/vdso64/getcpu.S
index 47afd08c90f7..23eb9a9441bd 100644
--- a/arch/powerpc/kernel/vdso64/getcpu.S
+++ b/arch/powerpc/kernel/vdso64/getcpu.S
@@ -29,7 +29,7 @@
29 */ 29 */
30V_FUNCTION_BEGIN(__kernel_getcpu) 30V_FUNCTION_BEGIN(__kernel_getcpu)
31 .cfi_startproc 31 .cfi_startproc
32 mfspr r5,SPRN_USPRG3 32 mfspr r5,SPRN_SPRG_VDSO_READ
33 cmpdi cr0,r3,0 33 cmpdi cr0,r3,0
34 cmpdi cr1,r4,0 34 cmpdi cr1,r4,0
35 clrlwi r6,r5,16 35 clrlwi r6,r5,16
diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S
index e66d4ec04d95..fbfca5778b0b 100644
--- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S
+++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S
@@ -75,8 +75,8 @@ BEGIN_FTR_SECTION
75END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S) 75END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_207S)
76 76
77 /* Restore SPRG3 */ 77 /* Restore SPRG3 */
78 ld r3,PACA_SPRG3(r13) 78 ld r3,PACA_SPRG_VDSO(r13)
79 mtspr SPRN_SPRG3,r3 79 mtspr SPRN_SPRG_VDSO_WRITE,r3
80 80
81 /* Reload the host's PMU registers */ 81 /* Reload the host's PMU registers */
82 ld r3, PACALPPACAPTR(r13) /* is the host using the PMU? */ 82 ld r3, PACALPPACAPTR(r13) /* is the host using the PMU? */
diff --git a/arch/powerpc/kvm/book3s_interrupts.S b/arch/powerpc/kvm/book3s_interrupts.S
index f779450cb07c..3533c999194a 100644
--- a/arch/powerpc/kvm/book3s_interrupts.S
+++ b/arch/powerpc/kvm/book3s_interrupts.S
@@ -153,8 +153,8 @@ kvm_start_lightweight:
153 * Reload kernel SPRG3 value. 153 * Reload kernel SPRG3 value.
154 * No need to save guest value as usermode can't modify SPRG3. 154 * No need to save guest value as usermode can't modify SPRG3.
155 */ 155 */
156 ld r3, PACA_SPRG3(r13) 156 ld r3, PACA_SPRG_VDSO(r13)
157 mtspr SPRN_SPRG3, r3 157 mtspr SPRN_SPRG_VDSO_WRITE, r3
158#endif /* CONFIG_PPC_BOOK3S_64 */ 158#endif /* CONFIG_PPC_BOOK3S_64 */
159 159
160 /* R7 = vcpu */ 160 /* R7 = vcpu */
diff --git a/arch/powerpc/kvm/bookehv_interrupts.S b/arch/powerpc/kvm/bookehv_interrupts.S
index e4185f6b3309..a1712b818a5f 100644
--- a/arch/powerpc/kvm/bookehv_interrupts.S
+++ b/arch/powerpc/kvm/bookehv_interrupts.S
@@ -229,17 +229,20 @@
229 stw r10, VCPU_CR(r4) 229 stw r10, VCPU_CR(r4)
230 PPC_STL r11, VCPU_GPR(R4)(r4) 230 PPC_STL r11, VCPU_GPR(R4)(r4)
231 PPC_STL r5, VCPU_GPR(R5)(r4) 231 PPC_STL r5, VCPU_GPR(R5)(r4)
232 .if \type == EX_CRIT
233 PPC_LL r5, (\paca_ex + EX_R13)(r13)
234 .else
235 mfspr r5, \scratch
236 .endif
237 PPC_STL r6, VCPU_GPR(R6)(r4) 232 PPC_STL r6, VCPU_GPR(R6)(r4)
238 PPC_STL r8, VCPU_GPR(R8)(r4) 233 PPC_STL r8, VCPU_GPR(R8)(r4)
239 PPC_STL r9, VCPU_GPR(R9)(r4) 234 PPC_STL r9, VCPU_GPR(R9)(r4)
240 PPC_STL r5, VCPU_GPR(R13)(r4) 235 .if \type == EX_TLB
236 PPC_LL r5, EX_TLB_R13(r12)
237 PPC_LL r6, EX_TLB_R10(r12)
238 PPC_LL r8, EX_TLB_R11(r12)
239 mfspr r12, \scratch
240 .else
241 mfspr r5, \scratch
241 PPC_LL r6, (\paca_ex + \ex_r10)(r13) 242 PPC_LL r6, (\paca_ex + \ex_r10)(r13)
242 PPC_LL r8, (\paca_ex + \ex_r11)(r13) 243 PPC_LL r8, (\paca_ex + \ex_r11)(r13)
244 .endif
245 PPC_STL r5, VCPU_GPR(R13)(r4)
243 PPC_STL r3, VCPU_GPR(R3)(r4) 246 PPC_STL r3, VCPU_GPR(R3)(r4)
244 PPC_STL r7, VCPU_GPR(R7)(r4) 247 PPC_STL r7, VCPU_GPR(R7)(r4)
245 PPC_STL r12, VCPU_GPR(R12)(r4) 248 PPC_STL r12, VCPU_GPR(R12)(r4)
@@ -435,10 +438,16 @@ _GLOBAL(kvmppc_resume_host)
435 PPC_STL r5, VCPU_LR(r4) 438 PPC_STL r5, VCPU_LR(r4)
436 mfspr r7, SPRN_SPRG5 439 mfspr r7, SPRN_SPRG5
437 stw r3, VCPU_VRSAVE(r4) 440 stw r3, VCPU_VRSAVE(r4)
441#ifdef CONFIG_64BIT
442 PPC_LL r3, PACA_SPRG_VDSO(r13)
443#endif
438 PPC_STD(r6, VCPU_SHARED_SPRG4, r11) 444 PPC_STD(r6, VCPU_SHARED_SPRG4, r11)
439 mfspr r8, SPRN_SPRG6 445 mfspr r8, SPRN_SPRG6
440 PPC_STD(r7, VCPU_SHARED_SPRG5, r11) 446 PPC_STD(r7, VCPU_SHARED_SPRG5, r11)
441 mfspr r9, SPRN_SPRG7 447 mfspr r9, SPRN_SPRG7
448#ifdef CONFIG_64BIT
449 mtspr SPRN_SPRG_VDSO_WRITE, r3
450#endif
442 PPC_STD(r8, VCPU_SHARED_SPRG6, r11) 451 PPC_STD(r8, VCPU_SHARED_SPRG6, r11)
443 mfxer r3 452 mfxer r3
444 PPC_STD(r9, VCPU_SHARED_SPRG7, r11) 453 PPC_STD(r9, VCPU_SHARED_SPRG7, r11)
diff --git a/arch/powerpc/mm/tlb_low_64e.S b/arch/powerpc/mm/tlb_low_64e.S
index 6bf50507a4b5..356e8b41fb09 100644
--- a/arch/powerpc/mm/tlb_low_64e.S
+++ b/arch/powerpc/mm/tlb_low_64e.S
@@ -39,37 +39,49 @@
39 * * 39 * *
40 **********************************************************************/ 40 **********************************************************************/
41 41
42/*
43 * Note that, unlike non-bolted handlers, TLB_EXFRAME is not
44 * modified by the TLB miss handlers themselves, since the TLB miss
45 * handler code will not itself cause a recursive TLB miss.
46 *
47 * TLB_EXFRAME will be modified when crit/mc/debug exceptions are
48 * entered/exited.
49 */
42.macro tlb_prolog_bolted intnum addr 50.macro tlb_prolog_bolted intnum addr
43 mtspr SPRN_SPRG_GEN_SCRATCH,r13 51 mtspr SPRN_SPRG_GEN_SCRATCH,r12
52 mfspr r12,SPRN_SPRG_TLB_EXFRAME
53 std r13,EX_TLB_R13(r12)
54 std r10,EX_TLB_R10(r12)
44 mfspr r13,SPRN_SPRG_PACA 55 mfspr r13,SPRN_SPRG_PACA
45 std r10,PACA_EXTLB+EX_TLB_R10(r13) 56
46 mfcr r10 57 mfcr r10
47 std r11,PACA_EXTLB+EX_TLB_R11(r13) 58 std r11,EX_TLB_R11(r12)
48#ifdef CONFIG_KVM_BOOKE_HV 59#ifdef CONFIG_KVM_BOOKE_HV
49BEGIN_FTR_SECTION 60BEGIN_FTR_SECTION
50 mfspr r11, SPRN_SRR1 61 mfspr r11, SPRN_SRR1
51END_FTR_SECTION_IFSET(CPU_FTR_EMB_HV) 62END_FTR_SECTION_IFSET(CPU_FTR_EMB_HV)
52#endif 63#endif
53 DO_KVM \intnum, SPRN_SRR1 64 DO_KVM \intnum, SPRN_SRR1
54 std r16,PACA_EXTLB+EX_TLB_R16(r13) 65 std r16,EX_TLB_R16(r12)
55 mfspr r16,\addr /* get faulting address */ 66 mfspr r16,\addr /* get faulting address */
56 std r14,PACA_EXTLB+EX_TLB_R14(r13) 67 std r14,EX_TLB_R14(r12)
57 ld r14,PACAPGD(r13) 68 ld r14,PACAPGD(r13)
58 std r15,PACA_EXTLB+EX_TLB_R15(r13) 69 std r15,EX_TLB_R15(r12)
59 std r10,PACA_EXTLB+EX_TLB_CR(r13) 70 std r10,EX_TLB_CR(r12)
60 TLB_MISS_PROLOG_STATS_BOLTED 71 TLB_MISS_PROLOG_STATS
61.endm 72.endm
62 73
63.macro tlb_epilog_bolted 74.macro tlb_epilog_bolted
64 ld r14,PACA_EXTLB+EX_TLB_CR(r13) 75 ld r14,EX_TLB_CR(r12)
65 ld r10,PACA_EXTLB+EX_TLB_R10(r13) 76 ld r10,EX_TLB_R10(r12)
66 ld r11,PACA_EXTLB+EX_TLB_R11(r13) 77 ld r11,EX_TLB_R11(r12)
78 ld r13,EX_TLB_R13(r12)
67 mtcr r14 79 mtcr r14
68 ld r14,PACA_EXTLB+EX_TLB_R14(r13) 80 ld r14,EX_TLB_R14(r12)
69 ld r15,PACA_EXTLB+EX_TLB_R15(r13) 81 ld r15,EX_TLB_R15(r12)
70 TLB_MISS_RESTORE_STATS_BOLTED 82 TLB_MISS_RESTORE_STATS
71 ld r16,PACA_EXTLB+EX_TLB_R16(r13) 83 ld r16,EX_TLB_R16(r12)
72 mfspr r13,SPRN_SPRG_GEN_SCRATCH 84 mfspr r12,SPRN_SPRG_GEN_SCRATCH
73.endm 85.endm
74 86
75/* Data TLB miss */ 87/* Data TLB miss */
@@ -284,7 +296,7 @@ itlb_miss_fault_bolted:
284 * r14 = page table base 296 * r14 = page table base
285 * r13 = PACA 297 * r13 = PACA
286 * r11 = tlb_per_core ptr 298 * r11 = tlb_per_core ptr
287 * r10 = crap (free to use) 299 * r10 = cpu number
288 */ 300 */
289tlb_miss_common_e6500: 301tlb_miss_common_e6500:
290 /* 302 /*
@@ -293,15 +305,18 @@ tlb_miss_common_e6500:
293 * 305 *
294 * MAS6:IND should be already set based on MAS4 306 * MAS6:IND should be already set based on MAS4
295 */ 307 */
296 addi r10,r11,TCD_LOCK 3081: lbarx r15,0,r11
2971: lbarx r15,0,r10 309 lhz r10,PACAPACAINDEX(r13)
298 cmpdi r15,0 310 cmpdi r15,0
311 cmpdi cr1,r15,1 /* set cr1.eq = 0 for non-recursive */
299 bne 2f 312 bne 2f
300 li r15,1 313 stbcx. r10,0,r11
301 stbcx. r15,0,r10
302 bne 1b 314 bne 1b
3153:
303 .subsection 1 316 .subsection 1
3042: lbz r15,0(r10) 3172: cmpd cr1,r15,r10 /* recursive lock due to mcheck/crit/etc? */
318 beq cr1,3b /* unlock will happen if cr1.eq = 0 */
319 lbz r15,0(r11)
305 cmpdi r15,0 320 cmpdi r15,0
306 bne 2b 321 bne 2b
307 b 1b 322 b 1b
@@ -379,9 +394,11 @@ tlb_miss_common_e6500:
379 394
380tlb_miss_done_e6500: 395tlb_miss_done_e6500:
381 .macro tlb_unlock_e6500 396 .macro tlb_unlock_e6500
397 beq cr1,1f /* no unlock if lock was recursively grabbed */
382 li r15,0 398 li r15,0
383 isync 399 isync
384 stb r15,TCD_LOCK(r11) 400 stb r15,0(r11)
4011:
385 .endm 402 .endm
386 403
387 tlb_unlock_e6500 404 tlb_unlock_e6500
diff --git a/arch/powerpc/mm/tlb_nohash.c b/arch/powerpc/mm/tlb_nohash.c
index b37a58e1c92d..ae3d5b799b90 100644
--- a/arch/powerpc/mm/tlb_nohash.c
+++ b/arch/powerpc/mm/tlb_nohash.c
@@ -144,6 +144,15 @@ int mmu_vmemmap_psize; /* Page size used for the virtual mem map */
144int book3e_htw_mode; /* HW tablewalk? Value is PPC_HTW_* */ 144int book3e_htw_mode; /* HW tablewalk? Value is PPC_HTW_* */
145unsigned long linear_map_top; /* Top of linear mapping */ 145unsigned long linear_map_top; /* Top of linear mapping */
146 146
147
148/*
149 * Number of bytes to add to SPRN_SPRG_TLB_EXFRAME on crit/mcheck/debug
150 * exceptions. This is used for bolted and e6500 TLB miss handlers which
151 * do not modify this SPRG in the TLB miss code; for other TLB miss handlers,
152 * this is set to zero.
153 */
154int extlb_level_exc;
155
147#endif /* CONFIG_PPC64 */ 156#endif /* CONFIG_PPC64 */
148 157
149#ifdef CONFIG_PPC_FSL_BOOK3E 158#ifdef CONFIG_PPC_FSL_BOOK3E
@@ -559,6 +568,7 @@ static void setup_mmu_htw(void)
559 break; 568 break;
560#ifdef CONFIG_PPC_FSL_BOOK3E 569#ifdef CONFIG_PPC_FSL_BOOK3E
561 case PPC_HTW_E6500: 570 case PPC_HTW_E6500:
571 extlb_level_exc = EX_TLB_SIZE;
562 patch_exception(0x1c0, exc_data_tlb_miss_e6500_book3e); 572 patch_exception(0x1c0, exc_data_tlb_miss_e6500_book3e);
563 patch_exception(0x1e0, exc_instruction_tlb_miss_e6500_book3e); 573 patch_exception(0x1e0, exc_instruction_tlb_miss_e6500_book3e);
564 break; 574 break;
@@ -652,6 +662,7 @@ static void __early_init_mmu(int boot_cpu)
652 memblock_enforce_memory_limit(linear_map_top); 662 memblock_enforce_memory_limit(linear_map_top);
653 663
654 if (book3e_htw_mode == PPC_HTW_NONE) { 664 if (book3e_htw_mode == PPC_HTW_NONE) {
665 extlb_level_exc = EX_TLB_SIZE;
655 patch_exception(0x1c0, exc_data_tlb_miss_bolted_book3e); 666 patch_exception(0x1c0, exc_data_tlb_miss_bolted_book3e);
656 patch_exception(0x1e0, 667 patch_exception(0x1e0,
657 exc_instruction_tlb_miss_bolted_book3e); 668 exc_instruction_tlb_miss_bolted_book3e);
diff --git a/arch/powerpc/platforms/85xx/c293pcie.c b/arch/powerpc/platforms/85xx/c293pcie.c
index 213d5b815827..84476b646005 100644
--- a/arch/powerpc/platforms/85xx/c293pcie.c
+++ b/arch/powerpc/platforms/85xx/c293pcie.c
@@ -68,6 +68,7 @@ define_machine(c293_pcie) {
68 .init_IRQ = c293_pcie_pic_init, 68 .init_IRQ = c293_pcie_pic_init,
69#ifdef CONFIG_PCI 69#ifdef CONFIG_PCI
70 .pcibios_fixup_bus = fsl_pcibios_fixup_bus, 70 .pcibios_fixup_bus = fsl_pcibios_fixup_bus,
71 .pcibios_fixup_phb = fsl_pcibios_fixup_phb,
71#endif 72#endif
72 .get_irq = mpic_get_irq, 73 .get_irq = mpic_get_irq,
73 .restart = fsl_rstcr_restart, 74 .restart = fsl_rstcr_restart,
diff --git a/arch/powerpc/platforms/85xx/common.c b/arch/powerpc/platforms/85xx/common.c
index 3b085c7ee539..b564b5e23f7c 100644
--- a/arch/powerpc/platforms/85xx/common.c
+++ b/arch/powerpc/platforms/85xx/common.c
@@ -107,6 +107,12 @@ void __init mpc85xx_qe_init(void)
107 qe_reset(); 107 qe_reset();
108 of_node_put(np); 108 of_node_put(np);
109 109
110}
111
112void __init mpc85xx_qe_par_io_init(void)
113{
114 struct device_node *np;
115
110 np = of_find_node_by_name(NULL, "par_io"); 116 np = of_find_node_by_name(NULL, "par_io");
111 if (np) { 117 if (np) {
112 struct device_node *ucc; 118 struct device_node *ucc;
diff --git a/arch/powerpc/platforms/85xx/corenet_generic.c b/arch/powerpc/platforms/85xx/corenet_generic.c
index fbd871e69754..8e4b1e1a4911 100644
--- a/arch/powerpc/platforms/85xx/corenet_generic.c
+++ b/arch/powerpc/platforms/85xx/corenet_generic.c
@@ -26,11 +26,13 @@
26#include <asm/udbg.h> 26#include <asm/udbg.h>
27#include <asm/mpic.h> 27#include <asm/mpic.h>
28#include <asm/ehv_pic.h> 28#include <asm/ehv_pic.h>
29#include <asm/qe_ic.h>
29 30
30#include <linux/of_platform.h> 31#include <linux/of_platform.h>
31#include <sysdev/fsl_soc.h> 32#include <sysdev/fsl_soc.h>
32#include <sysdev/fsl_pci.h> 33#include <sysdev/fsl_pci.h>
33#include "smp.h" 34#include "smp.h"
35#include "mpc85xx.h"
34 36
35void __init corenet_gen_pic_init(void) 37void __init corenet_gen_pic_init(void)
36{ 38{
@@ -38,6 +40,8 @@ void __init corenet_gen_pic_init(void)
38 unsigned int flags = MPIC_BIG_ENDIAN | MPIC_SINGLE_DEST_CPU | 40 unsigned int flags = MPIC_BIG_ENDIAN | MPIC_SINGLE_DEST_CPU |
39 MPIC_NO_RESET; 41 MPIC_NO_RESET;
40 42
43 struct device_node *np;
44
41 if (ppc_md.get_irq == mpic_get_coreint_irq) 45 if (ppc_md.get_irq == mpic_get_coreint_irq)
42 flags |= MPIC_ENABLE_COREINT; 46 flags |= MPIC_ENABLE_COREINT;
43 47
@@ -45,6 +49,13 @@ void __init corenet_gen_pic_init(void)
45 BUG_ON(mpic == NULL); 49 BUG_ON(mpic == NULL);
46 50
47 mpic_init(mpic); 51 mpic_init(mpic);
52
53 np = of_find_compatible_node(NULL, NULL, "fsl,qe-ic");
54 if (np) {
55 qe_ic_init(np, 0, qe_ic_cascade_low_mpic,
56 qe_ic_cascade_high_mpic);
57 of_node_put(np);
58 }
48} 59}
49 60
50/* 61/*
@@ -57,6 +68,8 @@ void __init corenet_gen_setup_arch(void)
57 swiotlb_detect_4g(); 68 swiotlb_detect_4g();
58 69
59 pr_info("%s board from Freescale Semiconductor\n", ppc_md.name); 70 pr_info("%s board from Freescale Semiconductor\n", ppc_md.name);
71
72 mpc85xx_qe_init();
60} 73}
61 74
62static const struct of_device_id of_device_ids[] = { 75static const struct of_device_id of_device_ids[] = {
@@ -81,6 +94,9 @@ static const struct of_device_id of_device_ids[] = {
81 { 94 {
82 .compatible = "fsl,qoriq-pcie-v3.0", 95 .compatible = "fsl,qoriq-pcie-v3.0",
83 }, 96 },
97 {
98 .compatible = "fsl,qe",
99 },
84 /* The following two are for the Freescale hypervisor */ 100 /* The following two are for the Freescale hypervisor */
85 { 101 {
86 .name = "hypervisor", 102 .name = "hypervisor",
@@ -163,6 +179,7 @@ define_machine(corenet_generic) {
163 .init_IRQ = corenet_gen_pic_init, 179 .init_IRQ = corenet_gen_pic_init,
164#ifdef CONFIG_PCI 180#ifdef CONFIG_PCI
165 .pcibios_fixup_bus = fsl_pcibios_fixup_bus, 181 .pcibios_fixup_bus = fsl_pcibios_fixup_bus,
182 .pcibios_fixup_phb = fsl_pcibios_fixup_phb,
166#endif 183#endif
167 .get_irq = mpic_get_coreint_irq, 184 .get_irq = mpic_get_coreint_irq,
168 .restart = fsl_rstcr_restart, 185 .restart = fsl_rstcr_restart,
diff --git a/arch/powerpc/platforms/85xx/ge_imp3a.c b/arch/powerpc/platforms/85xx/ge_imp3a.c
index e6285ae6f423..11790e074c8a 100644
--- a/arch/powerpc/platforms/85xx/ge_imp3a.c
+++ b/arch/powerpc/platforms/85xx/ge_imp3a.c
@@ -215,6 +215,7 @@ define_machine(ge_imp3a) {
215 .show_cpuinfo = ge_imp3a_show_cpuinfo, 215 .show_cpuinfo = ge_imp3a_show_cpuinfo,
216#ifdef CONFIG_PCI 216#ifdef CONFIG_PCI
217 .pcibios_fixup_bus = fsl_pcibios_fixup_bus, 217 .pcibios_fixup_bus = fsl_pcibios_fixup_bus,
218 .pcibios_fixup_phb = fsl_pcibios_fixup_phb,
218#endif 219#endif
219 .get_irq = mpic_get_irq, 220 .get_irq = mpic_get_irq,
220 .restart = fsl_rstcr_restart, 221 .restart = fsl_rstcr_restart,
diff --git a/arch/powerpc/platforms/85xx/mpc8536_ds.c b/arch/powerpc/platforms/85xx/mpc8536_ds.c
index 15ce4b55f117..a378ba3519e9 100644
--- a/arch/powerpc/platforms/85xx/mpc8536_ds.c
+++ b/arch/powerpc/platforms/85xx/mpc8536_ds.c
@@ -76,6 +76,7 @@ define_machine(mpc8536_ds) {
76 .init_IRQ = mpc8536_ds_pic_init, 76 .init_IRQ = mpc8536_ds_pic_init,
77#ifdef CONFIG_PCI 77#ifdef CONFIG_PCI
78 .pcibios_fixup_bus = fsl_pcibios_fixup_bus, 78 .pcibios_fixup_bus = fsl_pcibios_fixup_bus,
79 .pcibios_fixup_phb = fsl_pcibios_fixup_phb,
79#endif 80#endif
80 .get_irq = mpic_get_irq, 81 .get_irq = mpic_get_irq,
81 .restart = fsl_rstcr_restart, 82 .restart = fsl_rstcr_restart,
diff --git a/arch/powerpc/platforms/85xx/mpc85xx.h b/arch/powerpc/platforms/85xx/mpc85xx.h
index fc51dd4092e5..39056f6befeb 100644
--- a/arch/powerpc/platforms/85xx/mpc85xx.h
+++ b/arch/powerpc/platforms/85xx/mpc85xx.h
@@ -10,8 +10,10 @@ static inline void __init mpc85xx_cpm2_pic_init(void) {}
10 10
11#ifdef CONFIG_QUICC_ENGINE 11#ifdef CONFIG_QUICC_ENGINE
12extern void mpc85xx_qe_init(void); 12extern void mpc85xx_qe_init(void);
13extern void mpc85xx_qe_par_io_init(void);
13#else 14#else
14static inline void __init mpc85xx_qe_init(void) {} 15static inline void __init mpc85xx_qe_init(void) {}
16static inline void __init mpc85xx_qe_par_io_init(void) {}
15#endif 17#endif
16 18
17#endif 19#endif
diff --git a/arch/powerpc/platforms/85xx/mpc85xx_cds.c b/arch/powerpc/platforms/85xx/mpc85xx_cds.c
index 7a31a0e1df29..b0753e222086 100644
--- a/arch/powerpc/platforms/85xx/mpc85xx_cds.c
+++ b/arch/powerpc/platforms/85xx/mpc85xx_cds.c
@@ -385,6 +385,7 @@ define_machine(mpc85xx_cds) {
385#ifdef CONFIG_PCI 385#ifdef CONFIG_PCI
386 .restart = mpc85xx_cds_restart, 386 .restart = mpc85xx_cds_restart,
387 .pcibios_fixup_bus = mpc85xx_cds_fixup_bus, 387 .pcibios_fixup_bus = mpc85xx_cds_fixup_bus,
388 .pcibios_fixup_phb = fsl_pcibios_fixup_phb,
388#else 389#else
389 .restart = fsl_rstcr_restart, 390 .restart = fsl_rstcr_restart,
390#endif 391#endif
diff --git a/arch/powerpc/platforms/85xx/mpc85xx_ds.c b/arch/powerpc/platforms/85xx/mpc85xx_ds.c
index 9ebb91ed96a3..ffdf02121a7c 100644
--- a/arch/powerpc/platforms/85xx/mpc85xx_ds.c
+++ b/arch/powerpc/platforms/85xx/mpc85xx_ds.c
@@ -209,6 +209,7 @@ define_machine(mpc8544_ds) {
209 .init_IRQ = mpc85xx_ds_pic_init, 209 .init_IRQ = mpc85xx_ds_pic_init,
210#ifdef CONFIG_PCI 210#ifdef CONFIG_PCI
211 .pcibios_fixup_bus = fsl_pcibios_fixup_bus, 211 .pcibios_fixup_bus = fsl_pcibios_fixup_bus,
212 .pcibios_fixup_phb = fsl_pcibios_fixup_phb,
212#endif 213#endif
213 .get_irq = mpic_get_irq, 214 .get_irq = mpic_get_irq,
214 .restart = fsl_rstcr_restart, 215 .restart = fsl_rstcr_restart,
@@ -223,6 +224,7 @@ define_machine(mpc8572_ds) {
223 .init_IRQ = mpc85xx_ds_pic_init, 224 .init_IRQ = mpc85xx_ds_pic_init,
224#ifdef CONFIG_PCI 225#ifdef CONFIG_PCI
225 .pcibios_fixup_bus = fsl_pcibios_fixup_bus, 226 .pcibios_fixup_bus = fsl_pcibios_fixup_bus,
227 .pcibios_fixup_phb = fsl_pcibios_fixup_phb,
226#endif 228#endif
227 .get_irq = mpic_get_irq, 229 .get_irq = mpic_get_irq,
228 .restart = fsl_rstcr_restart, 230 .restart = fsl_rstcr_restart,
@@ -237,6 +239,7 @@ define_machine(p2020_ds) {
237 .init_IRQ = mpc85xx_ds_pic_init, 239 .init_IRQ = mpc85xx_ds_pic_init,
238#ifdef CONFIG_PCI 240#ifdef CONFIG_PCI
239 .pcibios_fixup_bus = fsl_pcibios_fixup_bus, 241 .pcibios_fixup_bus = fsl_pcibios_fixup_bus,
242 .pcibios_fixup_phb = fsl_pcibios_fixup_phb,
240#endif 243#endif
241 .get_irq = mpic_get_irq, 244 .get_irq = mpic_get_irq,
242 .restart = fsl_rstcr_restart, 245 .restart = fsl_rstcr_restart,
diff --git a/arch/powerpc/platforms/85xx/mpc85xx_mds.c b/arch/powerpc/platforms/85xx/mpc85xx_mds.c
index 34f3c5eb3bee..a392e94a07fa 100644
--- a/arch/powerpc/platforms/85xx/mpc85xx_mds.c
+++ b/arch/powerpc/platforms/85xx/mpc85xx_mds.c
@@ -239,6 +239,7 @@ static void __init mpc85xx_mds_qe_init(void)
239 struct device_node *np; 239 struct device_node *np;
240 240
241 mpc85xx_qe_init(); 241 mpc85xx_qe_init();
242 mpc85xx_qe_par_io_init();
242 mpc85xx_mds_reset_ucc_phys(); 243 mpc85xx_mds_reset_ucc_phys();
243 244
244 if (machine_is(p1021_mds)) { 245 if (machine_is(p1021_mds)) {
@@ -391,6 +392,7 @@ define_machine(mpc8568_mds) {
391 .progress = udbg_progress, 392 .progress = udbg_progress,
392#ifdef CONFIG_PCI 393#ifdef CONFIG_PCI
393 .pcibios_fixup_bus = fsl_pcibios_fixup_bus, 394 .pcibios_fixup_bus = fsl_pcibios_fixup_bus,
395 .pcibios_fixup_phb = fsl_pcibios_fixup_phb,
394#endif 396#endif
395}; 397};
396 398
@@ -412,6 +414,7 @@ define_machine(mpc8569_mds) {
412 .progress = udbg_progress, 414 .progress = udbg_progress,
413#ifdef CONFIG_PCI 415#ifdef CONFIG_PCI
414 .pcibios_fixup_bus = fsl_pcibios_fixup_bus, 416 .pcibios_fixup_bus = fsl_pcibios_fixup_bus,
417 .pcibios_fixup_phb = fsl_pcibios_fixup_phb,
415#endif 418#endif
416}; 419};
417 420
@@ -434,6 +437,7 @@ define_machine(p1021_mds) {
434 .progress = udbg_progress, 437 .progress = udbg_progress,
435#ifdef CONFIG_PCI 438#ifdef CONFIG_PCI
436 .pcibios_fixup_bus = fsl_pcibios_fixup_bus, 439 .pcibios_fixup_bus = fsl_pcibios_fixup_bus,
440 .pcibios_fixup_phb = fsl_pcibios_fixup_phb,
437#endif 441#endif
438}; 442};
439 443
diff --git a/arch/powerpc/platforms/85xx/mpc85xx_rdb.c b/arch/powerpc/platforms/85xx/mpc85xx_rdb.c
index e15bdd18fdb2..e358bed66d01 100644
--- a/arch/powerpc/platforms/85xx/mpc85xx_rdb.c
+++ b/arch/powerpc/platforms/85xx/mpc85xx_rdb.c
@@ -86,10 +86,6 @@ void __init mpc85xx_rdb_pic_init(void)
86 */ 86 */
87static void __init mpc85xx_rdb_setup_arch(void) 87static void __init mpc85xx_rdb_setup_arch(void)
88{ 88{
89#ifdef CONFIG_QUICC_ENGINE
90 struct device_node *np;
91#endif
92
93 if (ppc_md.progress) 89 if (ppc_md.progress)
94 ppc_md.progress("mpc85xx_rdb_setup_arch()", 0); 90 ppc_md.progress("mpc85xx_rdb_setup_arch()", 0);
95 91
@@ -99,8 +95,10 @@ static void __init mpc85xx_rdb_setup_arch(void)
99 95
100#ifdef CONFIG_QUICC_ENGINE 96#ifdef CONFIG_QUICC_ENGINE
101 mpc85xx_qe_init(); 97 mpc85xx_qe_init();
98 mpc85xx_qe_par_io_init();
102#if defined(CONFIG_UCC_GETH) || defined(CONFIG_SERIAL_QE) 99#if defined(CONFIG_UCC_GETH) || defined(CONFIG_SERIAL_QE)
103 if (machine_is(p1025_rdb)) { 100 if (machine_is(p1025_rdb)) {
101 struct device_node *np;
104 102
105 struct ccsr_guts __iomem *guts; 103 struct ccsr_guts __iomem *guts;
106 104
@@ -233,6 +231,7 @@ define_machine(p2020_rdb) {
233 .init_IRQ = mpc85xx_rdb_pic_init, 231 .init_IRQ = mpc85xx_rdb_pic_init,
234#ifdef CONFIG_PCI 232#ifdef CONFIG_PCI
235 .pcibios_fixup_bus = fsl_pcibios_fixup_bus, 233 .pcibios_fixup_bus = fsl_pcibios_fixup_bus,
234 .pcibios_fixup_phb = fsl_pcibios_fixup_phb,
236#endif 235#endif
237 .get_irq = mpic_get_irq, 236 .get_irq = mpic_get_irq,
238 .restart = fsl_rstcr_restart, 237 .restart = fsl_rstcr_restart,
@@ -247,6 +246,7 @@ define_machine(p1020_rdb) {
247 .init_IRQ = mpc85xx_rdb_pic_init, 246 .init_IRQ = mpc85xx_rdb_pic_init,
248#ifdef CONFIG_PCI 247#ifdef CONFIG_PCI
249 .pcibios_fixup_bus = fsl_pcibios_fixup_bus, 248 .pcibios_fixup_bus = fsl_pcibios_fixup_bus,
249 .pcibios_fixup_phb = fsl_pcibios_fixup_phb,
250#endif 250#endif
251 .get_irq = mpic_get_irq, 251 .get_irq = mpic_get_irq,
252 .restart = fsl_rstcr_restart, 252 .restart = fsl_rstcr_restart,
@@ -261,6 +261,7 @@ define_machine(p1021_rdb_pc) {
261 .init_IRQ = mpc85xx_rdb_pic_init, 261 .init_IRQ = mpc85xx_rdb_pic_init,
262#ifdef CONFIG_PCI 262#ifdef CONFIG_PCI
263 .pcibios_fixup_bus = fsl_pcibios_fixup_bus, 263 .pcibios_fixup_bus = fsl_pcibios_fixup_bus,
264 .pcibios_fixup_phb = fsl_pcibios_fixup_phb,
264#endif 265#endif
265 .get_irq = mpic_get_irq, 266 .get_irq = mpic_get_irq,
266 .restart = fsl_rstcr_restart, 267 .restart = fsl_rstcr_restart,
@@ -275,6 +276,7 @@ define_machine(p2020_rdb_pc) {
275 .init_IRQ = mpc85xx_rdb_pic_init, 276 .init_IRQ = mpc85xx_rdb_pic_init,
276#ifdef CONFIG_PCI 277#ifdef CONFIG_PCI
277 .pcibios_fixup_bus = fsl_pcibios_fixup_bus, 278 .pcibios_fixup_bus = fsl_pcibios_fixup_bus,
279 .pcibios_fixup_phb = fsl_pcibios_fixup_phb,
278#endif 280#endif
279 .get_irq = mpic_get_irq, 281 .get_irq = mpic_get_irq,
280 .restart = fsl_rstcr_restart, 282 .restart = fsl_rstcr_restart,
@@ -289,6 +291,7 @@ define_machine(p1025_rdb) {
289 .init_IRQ = mpc85xx_rdb_pic_init, 291 .init_IRQ = mpc85xx_rdb_pic_init,
290#ifdef CONFIG_PCI 292#ifdef CONFIG_PCI
291 .pcibios_fixup_bus = fsl_pcibios_fixup_bus, 293 .pcibios_fixup_bus = fsl_pcibios_fixup_bus,
294 .pcibios_fixup_phb = fsl_pcibios_fixup_phb,
292#endif 295#endif
293 .get_irq = mpic_get_irq, 296 .get_irq = mpic_get_irq,
294 .restart = fsl_rstcr_restart, 297 .restart = fsl_rstcr_restart,
@@ -303,6 +306,7 @@ define_machine(p1020_mbg_pc) {
303 .init_IRQ = mpc85xx_rdb_pic_init, 306 .init_IRQ = mpc85xx_rdb_pic_init,
304#ifdef CONFIG_PCI 307#ifdef CONFIG_PCI
305 .pcibios_fixup_bus = fsl_pcibios_fixup_bus, 308 .pcibios_fixup_bus = fsl_pcibios_fixup_bus,
309 .pcibios_fixup_phb = fsl_pcibios_fixup_phb,
306#endif 310#endif
307 .get_irq = mpic_get_irq, 311 .get_irq = mpic_get_irq,
308 .restart = fsl_rstcr_restart, 312 .restart = fsl_rstcr_restart,
@@ -317,6 +321,7 @@ define_machine(p1020_utm_pc) {
317 .init_IRQ = mpc85xx_rdb_pic_init, 321 .init_IRQ = mpc85xx_rdb_pic_init,
318#ifdef CONFIG_PCI 322#ifdef CONFIG_PCI
319 .pcibios_fixup_bus = fsl_pcibios_fixup_bus, 323 .pcibios_fixup_bus = fsl_pcibios_fixup_bus,
324 .pcibios_fixup_phb = fsl_pcibios_fixup_phb,
320#endif 325#endif
321 .get_irq = mpic_get_irq, 326 .get_irq = mpic_get_irq,
322 .restart = fsl_rstcr_restart, 327 .restart = fsl_rstcr_restart,
@@ -331,6 +336,7 @@ define_machine(p1020_rdb_pc) {
331 .init_IRQ = mpc85xx_rdb_pic_init, 336 .init_IRQ = mpc85xx_rdb_pic_init,
332#ifdef CONFIG_PCI 337#ifdef CONFIG_PCI
333 .pcibios_fixup_bus = fsl_pcibios_fixup_bus, 338 .pcibios_fixup_bus = fsl_pcibios_fixup_bus,
339 .pcibios_fixup_phb = fsl_pcibios_fixup_phb,
334#endif 340#endif
335 .get_irq = mpic_get_irq, 341 .get_irq = mpic_get_irq,
336 .restart = fsl_rstcr_restart, 342 .restart = fsl_rstcr_restart,
@@ -345,6 +351,7 @@ define_machine(p1020_rdb_pd) {
345 .init_IRQ = mpc85xx_rdb_pic_init, 351 .init_IRQ = mpc85xx_rdb_pic_init,
346#ifdef CONFIG_PCI 352#ifdef CONFIG_PCI
347 .pcibios_fixup_bus = fsl_pcibios_fixup_bus, 353 .pcibios_fixup_bus = fsl_pcibios_fixup_bus,
354 .pcibios_fixup_phb = fsl_pcibios_fixup_phb,
348#endif 355#endif
349 .get_irq = mpic_get_irq, 356 .get_irq = mpic_get_irq,
350 .restart = fsl_rstcr_restart, 357 .restart = fsl_rstcr_restart,
@@ -359,6 +366,7 @@ define_machine(p1024_rdb) {
359 .init_IRQ = mpc85xx_rdb_pic_init, 366 .init_IRQ = mpc85xx_rdb_pic_init,
360#ifdef CONFIG_PCI 367#ifdef CONFIG_PCI
361 .pcibios_fixup_bus = fsl_pcibios_fixup_bus, 368 .pcibios_fixup_bus = fsl_pcibios_fixup_bus,
369 .pcibios_fixup_phb = fsl_pcibios_fixup_phb,
362#endif 370#endif
363 .get_irq = mpic_get_irq, 371 .get_irq = mpic_get_irq,
364 .restart = fsl_rstcr_restart, 372 .restart = fsl_rstcr_restart,
diff --git a/arch/powerpc/platforms/85xx/p1010rdb.c b/arch/powerpc/platforms/85xx/p1010rdb.c
index d6a3dd311494..ad1a3d438a9e 100644
--- a/arch/powerpc/platforms/85xx/p1010rdb.c
+++ b/arch/powerpc/platforms/85xx/p1010rdb.c
@@ -78,6 +78,7 @@ define_machine(p1010_rdb) {
78 .init_IRQ = p1010_rdb_pic_init, 78 .init_IRQ = p1010_rdb_pic_init,
79#ifdef CONFIG_PCI 79#ifdef CONFIG_PCI
80 .pcibios_fixup_bus = fsl_pcibios_fixup_bus, 80 .pcibios_fixup_bus = fsl_pcibios_fixup_bus,
81 .pcibios_fixup_phb = fsl_pcibios_fixup_phb,
81#endif 82#endif
82 .get_irq = mpic_get_irq, 83 .get_irq = mpic_get_irq,
83 .restart = fsl_rstcr_restart, 84 .restart = fsl_rstcr_restart,
diff --git a/arch/powerpc/platforms/85xx/p1022_ds.c b/arch/powerpc/platforms/85xx/p1022_ds.c
index e611e79f23ce..6ac986d3f8a3 100644
--- a/arch/powerpc/platforms/85xx/p1022_ds.c
+++ b/arch/powerpc/platforms/85xx/p1022_ds.c
@@ -567,6 +567,7 @@ define_machine(p1022_ds) {
567 .init_IRQ = p1022_ds_pic_init, 567 .init_IRQ = p1022_ds_pic_init,
568#ifdef CONFIG_PCI 568#ifdef CONFIG_PCI
569 .pcibios_fixup_bus = fsl_pcibios_fixup_bus, 569 .pcibios_fixup_bus = fsl_pcibios_fixup_bus,
570 .pcibios_fixup_phb = fsl_pcibios_fixup_phb,
570#endif 571#endif
571 .get_irq = mpic_get_irq, 572 .get_irq = mpic_get_irq,
572 .restart = fsl_rstcr_restart, 573 .restart = fsl_rstcr_restart,
diff --git a/arch/powerpc/platforms/85xx/p1022_rdk.c b/arch/powerpc/platforms/85xx/p1022_rdk.c
index 8c9297112b30..7a180f0308d5 100644
--- a/arch/powerpc/platforms/85xx/p1022_rdk.c
+++ b/arch/powerpc/platforms/85xx/p1022_rdk.c
@@ -147,6 +147,7 @@ define_machine(p1022_rdk) {
147 .init_IRQ = p1022_rdk_pic_init, 147 .init_IRQ = p1022_rdk_pic_init,
148#ifdef CONFIG_PCI 148#ifdef CONFIG_PCI
149 .pcibios_fixup_bus = fsl_pcibios_fixup_bus, 149 .pcibios_fixup_bus = fsl_pcibios_fixup_bus,
150 .pcibios_fixup_phb = fsl_pcibios_fixup_phb,
150#endif 151#endif
151 .get_irq = mpic_get_irq, 152 .get_irq = mpic_get_irq,
152 .restart = fsl_rstcr_restart, 153 .restart = fsl_rstcr_restart,
diff --git a/arch/powerpc/platforms/85xx/p1023_rds.c b/arch/powerpc/platforms/85xx/p1023_rds.c
index 2ae9d490c3d9..0e614007acfb 100644
--- a/arch/powerpc/platforms/85xx/p1023_rds.c
+++ b/arch/powerpc/platforms/85xx/p1023_rds.c
@@ -126,6 +126,7 @@ define_machine(p1023_rds) {
126 .progress = udbg_progress, 126 .progress = udbg_progress,
127#ifdef CONFIG_PCI 127#ifdef CONFIG_PCI
128 .pcibios_fixup_bus = fsl_pcibios_fixup_bus, 128 .pcibios_fixup_bus = fsl_pcibios_fixup_bus,
129 .pcibios_fixup_phb = fsl_pcibios_fixup_phb,
129#endif 130#endif
130}; 131};
131 132
@@ -140,5 +141,6 @@ define_machine(p1023_rdb) {
140 .progress = udbg_progress, 141 .progress = udbg_progress,
141#ifdef CONFIG_PCI 142#ifdef CONFIG_PCI
142 .pcibios_fixup_bus = fsl_pcibios_fixup_bus, 143 .pcibios_fixup_bus = fsl_pcibios_fixup_bus,
144 .pcibios_fixup_phb = fsl_pcibios_fixup_phb,
143#endif 145#endif
144}; 146};
diff --git a/arch/powerpc/platforms/85xx/qemu_e500.c b/arch/powerpc/platforms/85xx/qemu_e500.c
index 5cefc5a9a144..7f2673293549 100644
--- a/arch/powerpc/platforms/85xx/qemu_e500.c
+++ b/arch/powerpc/platforms/85xx/qemu_e500.c
@@ -66,6 +66,7 @@ define_machine(qemu_e500) {
66 .init_IRQ = qemu_e500_pic_init, 66 .init_IRQ = qemu_e500_pic_init,
67#ifdef CONFIG_PCI 67#ifdef CONFIG_PCI
68 .pcibios_fixup_bus = fsl_pcibios_fixup_bus, 68 .pcibios_fixup_bus = fsl_pcibios_fixup_bus,
69 .pcibios_fixup_phb = fsl_pcibios_fixup_phb,
69#endif 70#endif
70 .get_irq = mpic_get_coreint_irq, 71 .get_irq = mpic_get_coreint_irq,
71 .restart = fsl_rstcr_restart, 72 .restart = fsl_rstcr_restart,
diff --git a/arch/powerpc/platforms/85xx/sbc8548.c b/arch/powerpc/platforms/85xx/sbc8548.c
index f62121825914..b07214666d65 100644
--- a/arch/powerpc/platforms/85xx/sbc8548.c
+++ b/arch/powerpc/platforms/85xx/sbc8548.c
@@ -135,6 +135,7 @@ define_machine(sbc8548) {
135 .restart = fsl_rstcr_restart, 135 .restart = fsl_rstcr_restart,
136#ifdef CONFIG_PCI 136#ifdef CONFIG_PCI
137 .pcibios_fixup_bus = fsl_pcibios_fixup_bus, 137 .pcibios_fixup_bus = fsl_pcibios_fixup_bus,
138 .pcibios_fixup_phb = fsl_pcibios_fixup_phb,
138#endif 139#endif
139 .calibrate_decr = generic_calibrate_decr, 140 .calibrate_decr = generic_calibrate_decr,
140 .progress = udbg_progress, 141 .progress = udbg_progress,
diff --git a/arch/powerpc/platforms/85xx/twr_p102x.c b/arch/powerpc/platforms/85xx/twr_p102x.c
index c25ff10f05ee..1eadb6d0dc64 100644
--- a/arch/powerpc/platforms/85xx/twr_p102x.c
+++ b/arch/powerpc/platforms/85xx/twr_p102x.c
@@ -77,6 +77,7 @@ static void __init twr_p1025_setup_arch(void)
77 77
78#ifdef CONFIG_QUICC_ENGINE 78#ifdef CONFIG_QUICC_ENGINE
79 mpc85xx_qe_init(); 79 mpc85xx_qe_init();
80 mpc85xx_qe_par_io_init();
80 81
81#if defined(CONFIG_UCC_GETH) || defined(CONFIG_SERIAL_QE) 82#if defined(CONFIG_UCC_GETH) || defined(CONFIG_SERIAL_QE)
82 if (machine_is(twr_p1025)) { 83 if (machine_is(twr_p1025)) {
diff --git a/arch/powerpc/platforms/85xx/xes_mpc85xx.c b/arch/powerpc/platforms/85xx/xes_mpc85xx.c
index dcbf7e42dce7..1a9c1085855f 100644
--- a/arch/powerpc/platforms/85xx/xes_mpc85xx.c
+++ b/arch/powerpc/platforms/85xx/xes_mpc85xx.c
@@ -170,6 +170,7 @@ define_machine(xes_mpc8572) {
170 .init_IRQ = xes_mpc85xx_pic_init, 170 .init_IRQ = xes_mpc85xx_pic_init,
171#ifdef CONFIG_PCI 171#ifdef CONFIG_PCI
172 .pcibios_fixup_bus = fsl_pcibios_fixup_bus, 172 .pcibios_fixup_bus = fsl_pcibios_fixup_bus,
173 .pcibios_fixup_phb = fsl_pcibios_fixup_phb,
173#endif 174#endif
174 .get_irq = mpic_get_irq, 175 .get_irq = mpic_get_irq,
175 .restart = fsl_rstcr_restart, 176 .restart = fsl_rstcr_restart,
@@ -184,6 +185,7 @@ define_machine(xes_mpc8548) {
184 .init_IRQ = xes_mpc85xx_pic_init, 185 .init_IRQ = xes_mpc85xx_pic_init,
185#ifdef CONFIG_PCI 186#ifdef CONFIG_PCI
186 .pcibios_fixup_bus = fsl_pcibios_fixup_bus, 187 .pcibios_fixup_bus = fsl_pcibios_fixup_bus,
188 .pcibios_fixup_phb = fsl_pcibios_fixup_phb,
187#endif 189#endif
188 .get_irq = mpic_get_irq, 190 .get_irq = mpic_get_irq,
189 .restart = fsl_rstcr_restart, 191 .restart = fsl_rstcr_restart,
@@ -198,6 +200,7 @@ define_machine(xes_mpc8540) {
198 .init_IRQ = xes_mpc85xx_pic_init, 200 .init_IRQ = xes_mpc85xx_pic_init,
199#ifdef CONFIG_PCI 201#ifdef CONFIG_PCI
200 .pcibios_fixup_bus = fsl_pcibios_fixup_bus, 202 .pcibios_fixup_bus = fsl_pcibios_fixup_bus,
203 .pcibios_fixup_phb = fsl_pcibios_fixup_phb,
201#endif 204#endif
202 .get_irq = mpic_get_irq, 205 .get_irq = mpic_get_irq,
203 .restart = fsl_rstcr_restart, 206 .restart = fsl_rstcr_restart,
diff --git a/arch/powerpc/platforms/embedded6xx/Kconfig b/arch/powerpc/platforms/embedded6xx/Kconfig
index 3fdc8bc6258f..2a7024d8d8b1 100644
--- a/arch/powerpc/platforms/embedded6xx/Kconfig
+++ b/arch/powerpc/platforms/embedded6xx/Kconfig
@@ -34,7 +34,6 @@ config MPC7448HPC2
34 select TSI108_BRIDGE 34 select TSI108_BRIDGE
35 select DEFAULT_UIMAGE 35 select DEFAULT_UIMAGE
36 select PPC_UDBG_16550 36 select PPC_UDBG_16550
37 select TSI108_BRIDGE
38 help 37 help
39 Select MPC7448HPC2 if configuring for Freescale MPC7448HPC2 (Taiga) 38 Select MPC7448HPC2 if configuring for Freescale MPC7448HPC2 (Taiga)
40 platform 39 platform
@@ -44,7 +43,6 @@ config PPC_HOLLY
44 depends on EMBEDDED6xx 43 depends on EMBEDDED6xx
45 select TSI108_BRIDGE 44 select TSI108_BRIDGE
46 select PPC_UDBG_16550 45 select PPC_UDBG_16550
47 select TSI108_BRIDGE
48 help 46 help
49 Select PPC_HOLLY if configuring for an IBM 750GX/CL Eval 47 Select PPC_HOLLY if configuring for an IBM 750GX/CL Eval
50 Board with TSI108/9 bridge (Hickory/Holly) 48 Board with TSI108/9 bridge (Hickory/Holly)
diff --git a/arch/powerpc/sysdev/fsl_pci.c b/arch/powerpc/sysdev/fsl_pci.c
index a625dcf26b2b..3f415e252ea5 100644
--- a/arch/powerpc/sysdev/fsl_pci.c
+++ b/arch/powerpc/sysdev/fsl_pci.c
@@ -22,10 +22,13 @@
22#include <linux/delay.h> 22#include <linux/delay.h>
23#include <linux/string.h> 23#include <linux/string.h>
24#include <linux/init.h> 24#include <linux/init.h>
25#include <linux/interrupt.h>
25#include <linux/bootmem.h> 26#include <linux/bootmem.h>
26#include <linux/memblock.h> 27#include <linux/memblock.h>
27#include <linux/log2.h> 28#include <linux/log2.h>
28#include <linux/slab.h> 29#include <linux/slab.h>
30#include <linux/suspend.h>
31#include <linux/syscore_ops.h>
29#include <linux/uaccess.h> 32#include <linux/uaccess.h>
30 33
31#include <asm/io.h> 34#include <asm/io.h>
@@ -868,6 +871,14 @@ u64 fsl_pci_immrbar_base(struct pci_controller *hose)
868 871
869 pci_bus_read_config_dword(hose->bus, 872 pci_bus_read_config_dword(hose->bus,
870 PCI_DEVFN(0, 0), PCI_BASE_ADDRESS_0, &base); 873 PCI_DEVFN(0, 0), PCI_BASE_ADDRESS_0, &base);
874
875 /*
876 * For PEXCSRBAR, bit 3-0 indicate prefetchable and
877 * address type. So when getting base address, these
878 * bits should be masked
879 */
880 base &= PCI_BASE_ADDRESS_MEM_MASK;
881
871 return base; 882 return base;
872 } 883 }
873#endif 884#endif
@@ -1086,55 +1097,171 @@ void fsl_pci_assign_primary(void)
1086 } 1097 }
1087} 1098}
1088 1099
1089static int fsl_pci_probe(struct platform_device *pdev) 1100#ifdef CONFIG_PM_SLEEP
1101static irqreturn_t fsl_pci_pme_handle(int irq, void *dev_id)
1090{ 1102{
1091 int ret; 1103 struct pci_controller *hose = dev_id;
1092 struct device_node *node; 1104 struct ccsr_pci __iomem *pci = hose->private_data;
1105 u32 dr;
1093 1106
1094 node = pdev->dev.of_node; 1107 dr = in_be32(&pci->pex_pme_mes_dr);
1095 ret = fsl_add_bridge(pdev, fsl_pci_primary == node); 1108 if (!dr)
1109 return IRQ_NONE;
1096 1110
1097 mpc85xx_pci_err_probe(pdev); 1111 out_be32(&pci->pex_pme_mes_dr, dr);
1098 1112
1099 return 0; 1113 return IRQ_HANDLED;
1100} 1114}
1101 1115
1102#ifdef CONFIG_PM 1116static int fsl_pci_pme_probe(struct pci_controller *hose)
1103static int fsl_pci_resume(struct device *dev)
1104{ 1117{
1105 struct pci_controller *hose; 1118 struct ccsr_pci __iomem *pci;
1106 struct resource pci_rsrc; 1119 struct pci_dev *dev;
1120 int pme_irq;
1121 int res;
1122 u16 pms;
1107 1123
1108 hose = pci_find_hose_for_OF_device(dev->of_node); 1124 /* Get hose's pci_dev */
1109 if (!hose) 1125 dev = list_first_entry(&hose->bus->devices, typeof(*dev), bus_list);
1110 return -ENODEV; 1126
1127 /* PME Disable */
1128 pci_read_config_word(dev, dev->pm_cap + PCI_PM_CTRL, &pms);
1129 pms &= ~PCI_PM_CTRL_PME_ENABLE;
1130 pci_write_config_word(dev, dev->pm_cap + PCI_PM_CTRL, pms);
1131
1132 pme_irq = irq_of_parse_and_map(hose->dn, 0);
1133 if (!pme_irq) {
1134 dev_err(&dev->dev, "Failed to map PME interrupt.\n");
1135
1136 return -ENXIO;
1137 }
1138
1139 res = devm_request_irq(hose->parent, pme_irq,
1140 fsl_pci_pme_handle,
1141 IRQF_SHARED,
1142 "[PCI] PME", hose);
1143 if (res < 0) {
1144 dev_err(&dev->dev, "Unable to requiest irq %d for PME\n", pme_irq);
1145 irq_dispose_mapping(pme_irq);
1111 1146
1112 if (of_address_to_resource(dev->of_node, 0, &pci_rsrc)) {
1113 dev_err(dev, "Get pci register base failed.");
1114 return -ENODEV; 1147 return -ENODEV;
1115 } 1148 }
1116 1149
1117 setup_pci_atmu(hose); 1150 pci = hose->private_data;
1151
1152 /* Enable PTOD, ENL23D & EXL23D */
1153 out_be32(&pci->pex_pme_mes_disr, 0);
1154 setbits32(&pci->pex_pme_mes_disr,
1155 PME_DISR_EN_PTOD | PME_DISR_EN_ENL23D | PME_DISR_EN_EXL23D);
1156
1157 out_be32(&pci->pex_pme_mes_ier, 0);
1158 setbits32(&pci->pex_pme_mes_ier,
1159 PME_DISR_EN_PTOD | PME_DISR_EN_ENL23D | PME_DISR_EN_EXL23D);
1160
1161 /* PME Enable */
1162 pci_read_config_word(dev, dev->pm_cap + PCI_PM_CTRL, &pms);
1163 pms |= PCI_PM_CTRL_PME_ENABLE;
1164 pci_write_config_word(dev, dev->pm_cap + PCI_PM_CTRL, pms);
1118 1165
1119 return 0; 1166 return 0;
1120} 1167}
1121 1168
1122static const struct dev_pm_ops pci_pm_ops = { 1169static void send_pme_turnoff_message(struct pci_controller *hose)
1123 .resume = fsl_pci_resume, 1170{
1124}; 1171 struct ccsr_pci __iomem *pci = hose->private_data;
1172 u32 dr;
1173 int i;
1125 1174
1126#define PCI_PM_OPS (&pci_pm_ops) 1175 /* Send PME_Turn_Off Message Request */
1176 setbits32(&pci->pex_pmcr, PEX_PMCR_PTOMR);
1127 1177
1128#else 1178 /* Wait trun off done */
1179 for (i = 0; i < 150; i++) {
1180 dr = in_be32(&pci->pex_pme_mes_dr);
1181 if (dr) {
1182 out_be32(&pci->pex_pme_mes_dr, dr);
1183 break;
1184 }
1185
1186 udelay(1000);
1187 }
1188}
1189
1190static void fsl_pci_syscore_do_suspend(struct pci_controller *hose)
1191{
1192 send_pme_turnoff_message(hose);
1193}
1194
1195static int fsl_pci_syscore_suspend(void)
1196{
1197 struct pci_controller *hose, *tmp;
1129 1198
1130#define PCI_PM_OPS NULL 1199 list_for_each_entry_safe(hose, tmp, &hose_list, list_node)
1200 fsl_pci_syscore_do_suspend(hose);
1131 1201
1202 return 0;
1203}
1204
1205static void fsl_pci_syscore_do_resume(struct pci_controller *hose)
1206{
1207 struct ccsr_pci __iomem *pci = hose->private_data;
1208 u32 dr;
1209 int i;
1210
1211 /* Send Exit L2 State Message */
1212 setbits32(&pci->pex_pmcr, PEX_PMCR_EXL2S);
1213
1214 /* Wait exit done */
1215 for (i = 0; i < 150; i++) {
1216 dr = in_be32(&pci->pex_pme_mes_dr);
1217 if (dr) {
1218 out_be32(&pci->pex_pme_mes_dr, dr);
1219 break;
1220 }
1221
1222 udelay(1000);
1223 }
1224
1225 setup_pci_atmu(hose);
1226}
1227
1228static void fsl_pci_syscore_resume(void)
1229{
1230 struct pci_controller *hose, *tmp;
1231
1232 list_for_each_entry_safe(hose, tmp, &hose_list, list_node)
1233 fsl_pci_syscore_do_resume(hose);
1234}
1235
1236static struct syscore_ops pci_syscore_pm_ops = {
1237 .suspend = fsl_pci_syscore_suspend,
1238 .resume = fsl_pci_syscore_resume,
1239};
1132#endif 1240#endif
1133 1241
1242void fsl_pcibios_fixup_phb(struct pci_controller *phb)
1243{
1244#ifdef CONFIG_PM_SLEEP
1245 fsl_pci_pme_probe(phb);
1246#endif
1247}
1248
1249static int fsl_pci_probe(struct platform_device *pdev)
1250{
1251 struct device_node *node;
1252 int ret;
1253
1254 node = pdev->dev.of_node;
1255 ret = fsl_add_bridge(pdev, fsl_pci_primary == node);
1256
1257 mpc85xx_pci_err_probe(pdev);
1258
1259 return 0;
1260}
1261
1134static struct platform_driver fsl_pci_driver = { 1262static struct platform_driver fsl_pci_driver = {
1135 .driver = { 1263 .driver = {
1136 .name = "fsl-pci", 1264 .name = "fsl-pci",
1137 .pm = PCI_PM_OPS,
1138 .of_match_table = pci_ids, 1265 .of_match_table = pci_ids,
1139 }, 1266 },
1140 .probe = fsl_pci_probe, 1267 .probe = fsl_pci_probe,
@@ -1142,6 +1269,9 @@ static struct platform_driver fsl_pci_driver = {
1142 1269
1143static int __init fsl_pci_init(void) 1270static int __init fsl_pci_init(void)
1144{ 1271{
1272#ifdef CONFIG_PM_SLEEP
1273 register_syscore_ops(&pci_syscore_pm_ops);
1274#endif
1145 return platform_driver_register(&fsl_pci_driver); 1275 return platform_driver_register(&fsl_pci_driver);
1146} 1276}
1147arch_initcall(fsl_pci_init); 1277arch_initcall(fsl_pci_init);
diff --git a/arch/powerpc/sysdev/fsl_pci.h b/arch/powerpc/sysdev/fsl_pci.h
index 8d455df58471..c1cec771d5ea 100644
--- a/arch/powerpc/sysdev/fsl_pci.h
+++ b/arch/powerpc/sysdev/fsl_pci.h
@@ -32,6 +32,13 @@ struct platform_device;
32#define PIWAR_WRITE_SNOOP 0x00005000 32#define PIWAR_WRITE_SNOOP 0x00005000
33#define PIWAR_SZ_MASK 0x0000003f 33#define PIWAR_SZ_MASK 0x0000003f
34 34
35#define PEX_PMCR_PTOMR 0x1
36#define PEX_PMCR_EXL2S 0x2
37
38#define PME_DISR_EN_PTOD 0x00008000
39#define PME_DISR_EN_ENL23D 0x00002000
40#define PME_DISR_EN_EXL23D 0x00001000
41
35/* PCI/PCI Express outbound window reg */ 42/* PCI/PCI Express outbound window reg */
36struct pci_outbound_window_regs { 43struct pci_outbound_window_regs {
37 __be32 potar; /* 0x.0 - Outbound translation address register */ 44 __be32 potar; /* 0x.0 - Outbound translation address register */
@@ -111,6 +118,7 @@ struct ccsr_pci {
111 118
112extern int fsl_add_bridge(struct platform_device *pdev, int is_primary); 119extern int fsl_add_bridge(struct platform_device *pdev, int is_primary);
113extern void fsl_pcibios_fixup_bus(struct pci_bus *bus); 120extern void fsl_pcibios_fixup_bus(struct pci_bus *bus);
121extern void fsl_pcibios_fixup_phb(struct pci_controller *phb);
114extern int mpc83xx_add_bridge(struct device_node *dev); 122extern int mpc83xx_add_bridge(struct device_node *dev);
115u64 fsl_pci_immrbar_base(struct pci_controller *hose); 123u64 fsl_pci_immrbar_base(struct pci_controller *hose);
116 124