diff options
Diffstat (limited to 'arch')
25 files changed, 580 insertions, 201 deletions
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index 56da47247fcc..98ae8b714d31 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig | |||
@@ -288,6 +288,10 @@ config PPC_EMULATE_SSTEP | |||
288 | bool | 288 | bool |
289 | default y if KPROBES || UPROBES || XMON || HAVE_HW_BREAKPOINT | 289 | default y if KPROBES || UPROBES || XMON || HAVE_HW_BREAKPOINT |
290 | 290 | ||
291 | config ZONE_DMA32 | ||
292 | bool | ||
293 | default y if PPC64 | ||
294 | |||
291 | source "init/Kconfig" | 295 | source "init/Kconfig" |
292 | 296 | ||
293 | source "kernel/Kconfig.freezer" | 297 | source "kernel/Kconfig.freezer" |
diff --git a/arch/powerpc/boot/dts/fsl/t2081si-post.dtsi b/arch/powerpc/boot/dts/fsl/t2081si-post.dtsi index 97479f0ce630..aecee9690a88 100644 --- a/arch/powerpc/boot/dts/fsl/t2081si-post.dtsi +++ b/arch/powerpc/boot/dts/fsl/t2081si-post.dtsi | |||
@@ -410,7 +410,7 @@ | |||
410 | /include/ "qoriq-gpio-3.dtsi" | 410 | /include/ "qoriq-gpio-3.dtsi" |
411 | /include/ "qoriq-usb2-mph-0.dtsi" | 411 | /include/ "qoriq-usb2-mph-0.dtsi" |
412 | usb0: usb@210000 { | 412 | usb0: usb@210000 { |
413 | compatible = "fsl-usb2-mph-v2.4", "fsl-usb2-mph"; | 413 | compatible = "fsl-usb2-mph-v2.5", "fsl-usb2-mph"; |
414 | fsl,iommu-parent = <&pamu1>; | 414 | fsl,iommu-parent = <&pamu1>; |
415 | fsl,liodn-reg = <&guts 0x520>; /* USB1LIODNR */ | 415 | fsl,liodn-reg = <&guts 0x520>; /* USB1LIODNR */ |
416 | phy_type = "utmi"; | 416 | phy_type = "utmi"; |
@@ -418,7 +418,7 @@ | |||
418 | }; | 418 | }; |
419 | /include/ "qoriq-usb2-dr-0.dtsi" | 419 | /include/ "qoriq-usb2-dr-0.dtsi" |
420 | usb1: usb@211000 { | 420 | usb1: usb@211000 { |
421 | compatible = "fsl-usb2-dr-v2.4", "fsl-usb2-dr"; | 421 | compatible = "fsl-usb2-dr-v2.5", "fsl-usb2-dr"; |
422 | fsl,iommu-parent = <&pamu1>; | 422 | fsl,iommu-parent = <&pamu1>; |
423 | fsl,liodn-reg = <&guts 0x524>; /* USB1LIODNR */ | 423 | fsl,liodn-reg = <&guts 0x524>; /* USB1LIODNR */ |
424 | dr_mode = "host"; | 424 | dr_mode = "host"; |
diff --git a/arch/powerpc/boot/dts/fsl/t4240si-post.dtsi b/arch/powerpc/boot/dts/fsl/t4240si-post.dtsi index a3d582e0361a..7e2fc7cdce48 100644 --- a/arch/powerpc/boot/dts/fsl/t4240si-post.dtsi +++ b/arch/powerpc/boot/dts/fsl/t4240si-post.dtsi | |||
@@ -498,13 +498,13 @@ | |||
498 | /include/ "qoriq-gpio-3.dtsi" | 498 | /include/ "qoriq-gpio-3.dtsi" |
499 | /include/ "qoriq-usb2-mph-0.dtsi" | 499 | /include/ "qoriq-usb2-mph-0.dtsi" |
500 | usb0: usb@210000 { | 500 | usb0: usb@210000 { |
501 | compatible = "fsl-usb2-mph-v2.4", "fsl-usb2-mph"; | 501 | compatible = "fsl-usb2-mph-v2.5", "fsl-usb2-mph"; |
502 | phy_type = "utmi"; | 502 | phy_type = "utmi"; |
503 | port0; | 503 | port0; |
504 | }; | 504 | }; |
505 | /include/ "qoriq-usb2-dr-0.dtsi" | 505 | /include/ "qoriq-usb2-dr-0.dtsi" |
506 | usb1: usb@211000 { | 506 | usb1: usb@211000 { |
507 | compatible = "fsl-usb2-dr-v2.4", "fsl-usb2-dr"; | 507 | compatible = "fsl-usb2-dr-v2.5", "fsl-usb2-dr"; |
508 | dr_mode = "host"; | 508 | dr_mode = "host"; |
509 | phy_type = "utmi"; | 509 | phy_type = "utmi"; |
510 | }; | 510 | }; |
diff --git a/arch/powerpc/boot/dts/t1040rdb.dts b/arch/powerpc/boot/dts/t1040rdb.dts new file mode 100644 index 000000000000..79a0bed04c1a --- /dev/null +++ b/arch/powerpc/boot/dts/t1040rdb.dts | |||
@@ -0,0 +1,48 @@ | |||
1 | /* | ||
2 | * T1040RDB Device Tree Source | ||
3 | * | ||
4 | * Copyright 2014 Freescale Semiconductor Inc. | ||
5 | * | ||
6 | * Redistribution and use in source and binary forms, with or without | ||
7 | * modification, are permitted provided that the following conditions are met: | ||
8 | * * Redistributions of source code must retain the above copyright | ||
9 | * notice, this list of conditions and the following disclaimer. | ||
10 | * * Redistributions in binary form must reproduce the above copyright | ||
11 | * notice, this list of conditions and the following disclaimer in the | ||
12 | * documentation and/or other materials provided with the distribution. | ||
13 | * * Neither the name of Freescale Semiconductor nor the | ||
14 | * names of its contributors may be used to endorse or promote products | ||
15 | * derived from this software without specific prior written permission. | ||
16 | * | ||
17 | * | ||
18 | * ALTERNATIVELY, this software may be distributed under the terms of the | ||
19 | * GNU General Public License ("GPL") as published by the Free Software | ||
20 | * Foundation, either version 2 of that License or (at your option) any | ||
21 | * later version. | ||
22 | * | ||
23 | * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor "AS IS" AND ANY | ||
24 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
25 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
26 | * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY | ||
27 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
28 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
29 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
30 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
31 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
32 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
33 | */ | ||
34 | |||
35 | /include/ "fsl/t104xsi-pre.dtsi" | ||
36 | /include/ "t104xrdb.dtsi" | ||
37 | |||
38 | / { | ||
39 | model = "fsl,T1040RDB"; | ||
40 | compatible = "fsl,T1040RDB"; | ||
41 | ifc: localbus@ffe124000 { | ||
42 | cpld@3,0 { | ||
43 | compatible = "fsl,t1040rdb-cpld"; | ||
44 | }; | ||
45 | }; | ||
46 | }; | ||
47 | |||
48 | /include/ "fsl/t1040si-post.dtsi" | ||
diff --git a/arch/powerpc/boot/dts/t1042rdb.dts b/arch/powerpc/boot/dts/t1042rdb.dts new file mode 100644 index 000000000000..738c23790e94 --- /dev/null +++ b/arch/powerpc/boot/dts/t1042rdb.dts | |||
@@ -0,0 +1,48 @@ | |||
1 | /* | ||
2 | * T1042RDB Device Tree Source | ||
3 | * | ||
4 | * Copyright 2014 Freescale Semiconductor Inc. | ||
5 | * | ||
6 | * Redistribution and use in source and binary forms, with or without | ||
7 | * modification, are permitted provided that the following conditions are met: | ||
8 | * * Redistributions of source code must retain the above copyright | ||
9 | * notice, this list of conditions and the following disclaimer. | ||
10 | * * Redistributions in binary form must reproduce the above copyright | ||
11 | * notice, this list of conditions and the following disclaimer in the | ||
12 | * documentation and/or other materials provided with the distribution. | ||
13 | * * Neither the name of Freescale Semiconductor nor the | ||
14 | * names of its contributors may be used to endorse or promote products | ||
15 | * derived from this software without specific prior written permission. | ||
16 | * | ||
17 | * | ||
18 | * ALTERNATIVELY, this software may be distributed under the terms of the | ||
19 | * GNU General Public License ("GPL") as published by the Free Software | ||
20 | * Foundation, either version 2 of that License or (at your option) any | ||
21 | * later version. | ||
22 | * | ||
23 | * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor "AS IS" AND ANY | ||
24 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
25 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
26 | * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY | ||
27 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
28 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
29 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
30 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
31 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
32 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
33 | */ | ||
34 | |||
35 | /include/ "fsl/t104xsi-pre.dtsi" | ||
36 | /include/ "t104xrdb.dtsi" | ||
37 | |||
38 | / { | ||
39 | model = "fsl,T1042RDB"; | ||
40 | compatible = "fsl,T1042RDB"; | ||
41 | ifc: localbus@ffe124000 { | ||
42 | cpld@3,0 { | ||
43 | compatible = "fsl,t1042rdb-cpld"; | ||
44 | }; | ||
45 | }; | ||
46 | }; | ||
47 | |||
48 | /include/ "fsl/t1042si-post.dtsi" | ||
diff --git a/arch/powerpc/boot/dts/t1042rdb_pi.dts b/arch/powerpc/boot/dts/t1042rdb_pi.dts new file mode 100644 index 000000000000..634f751fa6d3 --- /dev/null +++ b/arch/powerpc/boot/dts/t1042rdb_pi.dts | |||
@@ -0,0 +1,57 @@ | |||
1 | /* | ||
2 | * T1042RDB_PI Device Tree Source | ||
3 | * | ||
4 | * Copyright 2014 Freescale Semiconductor Inc. | ||
5 | * | ||
6 | * Redistribution and use in source and binary forms, with or without | ||
7 | * modification, are permitted provided that the following conditions are met: | ||
8 | * * Redistributions of source code must retain the above copyright | ||
9 | * notice, this list of conditions and the following disclaimer. | ||
10 | * * Redistributions in binary form must reproduce the above copyright | ||
11 | * notice, this list of conditions and the following disclaimer in the | ||
12 | * documentation and/or other materials provided with the distribution. | ||
13 | * * Neither the name of Freescale Semiconductor nor the | ||
14 | * names of its contributors may be used to endorse or promote products | ||
15 | * derived from this software without specific prior written permission. | ||
16 | * | ||
17 | * | ||
18 | * ALTERNATIVELY, this software may be distributed under the terms of the | ||
19 | * GNU General Public License ("GPL") as published by the Free Software | ||
20 | * Foundation, either version 2 of that License or (at your option) any | ||
21 | * later version. | ||
22 | * | ||
23 | * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor "AS IS" AND ANY | ||
24 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
25 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
26 | * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY | ||
27 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
28 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
29 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
30 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
31 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
32 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
33 | */ | ||
34 | |||
35 | /include/ "fsl/t104xsi-pre.dtsi" | ||
36 | /include/ "t104xrdb.dtsi" | ||
37 | |||
38 | / { | ||
39 | model = "fsl,T1042RDB_PI"; | ||
40 | compatible = "fsl,T1042RDB_PI"; | ||
41 | ifc: localbus@ffe124000 { | ||
42 | cpld@3,0 { | ||
43 | compatible = "fsl,t1042rdb_pi-cpld"; | ||
44 | }; | ||
45 | }; | ||
46 | soc: soc@ffe000000 { | ||
47 | i2c@118000 { | ||
48 | rtc@68 { | ||
49 | compatible = "dallas,ds1337"; | ||
50 | reg = <0x68>; | ||
51 | interrupts = <0x2 0x1 0 0>; | ||
52 | }; | ||
53 | }; | ||
54 | }; | ||
55 | }; | ||
56 | |||
57 | /include/ "fsl/t1042si-post.dtsi" | ||
diff --git a/arch/powerpc/boot/dts/t104xrdb.dtsi b/arch/powerpc/boot/dts/t104xrdb.dtsi new file mode 100644 index 000000000000..1cf0f3c5f7e5 --- /dev/null +++ b/arch/powerpc/boot/dts/t104xrdb.dtsi | |||
@@ -0,0 +1,156 @@ | |||
1 | /* | ||
2 | * T1040RDB/T1042RDB Device Tree Source | ||
3 | * | ||
4 | * Copyright 2014 Freescale Semiconductor Inc. | ||
5 | * | ||
6 | * Redistribution and use in source and binary forms, with or without | ||
7 | * modification, are permitted provided that the following conditions are met: | ||
8 | * * Redistributions of source code must retain the above copyright | ||
9 | * notice, this list of conditions and the following disclaimer. | ||
10 | * * Redistributions in binary form must reproduce the above copyright | ||
11 | * notice, this list of conditions and the following disclaimer in the | ||
12 | * documentation and/or other materials provided with the distribution. | ||
13 | * * Neither the name of Freescale Semiconductor nor the | ||
14 | * names of its contributors may be used to endorse or promote products | ||
15 | * derived from this software without specific prior written permission. | ||
16 | * | ||
17 | * | ||
18 | * ALTERNATIVELY, this software may be distributed under the terms of the | ||
19 | * GNU General Public License ("GPL") as published by the Free Software | ||
20 | * Foundation, either version 2 of that License or (at your option) any | ||
21 | * later version. | ||
22 | * | ||
23 | * THIS SOFTWARE IS PROVIDED BY Freescale Semiconductor "AS IS" AND ANY | ||
24 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
25 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
26 | * DISCLAIMED. IN NO EVENT SHALL Freescale Semiconductor BE LIABLE FOR ANY | ||
27 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
28 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
29 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
30 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
31 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
32 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
33 | */ | ||
34 | |||
35 | / { | ||
36 | |||
37 | ifc: localbus@ffe124000 { | ||
38 | reg = <0xf 0xfe124000 0 0x2000>; | ||
39 | ranges = <0 0 0xf 0xe8000000 0x08000000 | ||
40 | 2 0 0xf 0xff800000 0x00010000 | ||
41 | 3 0 0xf 0xffdf0000 0x00008000>; | ||
42 | |||
43 | nor@0,0 { | ||
44 | #address-cells = <1>; | ||
45 | #size-cells = <1>; | ||
46 | compatible = "cfi-flash"; | ||
47 | reg = <0x0 0x0 0x8000000>; | ||
48 | bank-width = <2>; | ||
49 | device-width = <1>; | ||
50 | }; | ||
51 | |||
52 | nand@2,0 { | ||
53 | #address-cells = <1>; | ||
54 | #size-cells = <1>; | ||
55 | compatible = "fsl,ifc-nand"; | ||
56 | reg = <0x2 0x0 0x10000>; | ||
57 | }; | ||
58 | |||
59 | cpld@3,0 { | ||
60 | reg = <3 0 0x300>; | ||
61 | }; | ||
62 | }; | ||
63 | |||
64 | memory { | ||
65 | device_type = "memory"; | ||
66 | }; | ||
67 | |||
68 | dcsr: dcsr@f00000000 { | ||
69 | ranges = <0x00000000 0xf 0x00000000 0x01072000>; | ||
70 | }; | ||
71 | |||
72 | soc: soc@ffe000000 { | ||
73 | ranges = <0x00000000 0xf 0xfe000000 0x1000000>; | ||
74 | reg = <0xf 0xfe000000 0 0x00001000>; | ||
75 | |||
76 | spi@110000 { | ||
77 | flash@0 { | ||
78 | #address-cells = <1>; | ||
79 | #size-cells = <1>; | ||
80 | compatible = "micron,n25q512a"; | ||
81 | reg = <0>; | ||
82 | spi-max-frequency = <10000000>; /* input clock */ | ||
83 | }; | ||
84 | }; | ||
85 | |||
86 | i2c@118100 { | ||
87 | pca9546@77 { | ||
88 | compatible = "nxp,pca9546"; | ||
89 | reg = <0x77>; | ||
90 | #address-cells = <1>; | ||
91 | #size-cells = <0>; | ||
92 | }; | ||
93 | }; | ||
94 | |||
95 | }; | ||
96 | |||
97 | pci0: pcie@ffe240000 { | ||
98 | reg = <0xf 0xfe240000 0 0x10000>; | ||
99 | ranges = <0x02000000 0 0xe0000000 0xc 0x00000000 0x0 0x10000000 | ||
100 | 0x01000000 0 0x00000000 0xf 0xf8000000 0x0 0x00010000>; | ||
101 | pcie@0 { | ||
102 | ranges = <0x02000000 0 0xe0000000 | ||
103 | 0x02000000 0 0xe0000000 | ||
104 | 0 0x10000000 | ||
105 | |||
106 | 0x01000000 0 0x00000000 | ||
107 | 0x01000000 0 0x00000000 | ||
108 | 0 0x00010000>; | ||
109 | }; | ||
110 | }; | ||
111 | |||
112 | pci1: pcie@ffe250000 { | ||
113 | reg = <0xf 0xfe250000 0 0x10000>; | ||
114 | ranges = <0x02000000 0x0 0xe0000000 0xc 0x10000000 0x0 0x10000000 | ||
115 | 0x01000000 0x0 0x00000000 0xf 0xf8010000 0x0 0x00010000>; | ||
116 | pcie@0 { | ||
117 | ranges = <0x02000000 0 0xe0000000 | ||
118 | 0x02000000 0 0xe0000000 | ||
119 | 0 0x10000000 | ||
120 | |||
121 | 0x01000000 0 0x00000000 | ||
122 | 0x01000000 0 0x00000000 | ||
123 | 0 0x00010000>; | ||
124 | }; | ||
125 | }; | ||
126 | |||
127 | pci2: pcie@ffe260000 { | ||
128 | reg = <0xf 0xfe260000 0 0x10000>; | ||
129 | ranges = <0x02000000 0 0xe0000000 0xc 0x20000000 0 0x10000000 | ||
130 | 0x01000000 0 0x00000000 0xf 0xf8020000 0 0x00010000>; | ||
131 | pcie@0 { | ||
132 | ranges = <0x02000000 0 0xe0000000 | ||
133 | 0x02000000 0 0xe0000000 | ||
134 | 0 0x10000000 | ||
135 | |||
136 | 0x01000000 0 0x00000000 | ||
137 | 0x01000000 0 0x00000000 | ||
138 | 0 0x00010000>; | ||
139 | }; | ||
140 | }; | ||
141 | |||
142 | pci3: pcie@ffe270000 { | ||
143 | reg = <0xf 0xfe270000 0 0x10000>; | ||
144 | ranges = <0x02000000 0 0xe0000000 0xc 0x30000000 0 0x10000000 | ||
145 | 0x01000000 0 0x00000000 0xf 0xf8030000 0 0x00010000>; | ||
146 | pcie@0 { | ||
147 | ranges = <0x02000000 0 0xe0000000 | ||
148 | 0x02000000 0 0xe0000000 | ||
149 | 0 0x10000000 | ||
150 | |||
151 | 0x01000000 0 0x00000000 | ||
152 | 0x01000000 0 0x00000000 | ||
153 | 0 0x00010000>; | ||
154 | }; | ||
155 | }; | ||
156 | }; | ||
diff --git a/arch/powerpc/configs/corenet32_smp_defconfig b/arch/powerpc/configs/corenet32_smp_defconfig index 6a3c58adf253..688e9e4d29a1 100644 --- a/arch/powerpc/configs/corenet32_smp_defconfig +++ b/arch/powerpc/configs/corenet32_smp_defconfig | |||
@@ -165,6 +165,8 @@ CONFIG_NFS_FS=y | |||
165 | CONFIG_NFS_V4=y | 165 | CONFIG_NFS_V4=y |
166 | CONFIG_ROOT_NFS=y | 166 | CONFIG_ROOT_NFS=y |
167 | CONFIG_NFSD=m | 167 | CONFIG_NFSD=m |
168 | CONFIG_NLS_CODEPAGE_437=y | ||
169 | CONFIG_NLS_CODEPAGE_850=y | ||
168 | CONFIG_NLS_ISO8859_1=y | 170 | CONFIG_NLS_ISO8859_1=y |
169 | CONFIG_NLS_UTF8=m | 171 | CONFIG_NLS_UTF8=m |
170 | CONFIG_MAGIC_SYSRQ=y | 172 | CONFIG_MAGIC_SYSRQ=y |
diff --git a/arch/powerpc/configs/corenet64_smp_defconfig b/arch/powerpc/configs/corenet64_smp_defconfig index 269d6e47c67d..6db97e4414b2 100644 --- a/arch/powerpc/configs/corenet64_smp_defconfig +++ b/arch/powerpc/configs/corenet64_smp_defconfig | |||
@@ -50,7 +50,6 @@ CONFIG_NET_IPIP=y | |||
50 | CONFIG_IP_MROUTE=y | 50 | CONFIG_IP_MROUTE=y |
51 | CONFIG_IP_PIMSM_V1=y | 51 | CONFIG_IP_PIMSM_V1=y |
52 | CONFIG_IP_PIMSM_V2=y | 52 | CONFIG_IP_PIMSM_V2=y |
53 | CONFIG_ARPD=y | ||
54 | CONFIG_INET_ESP=y | 53 | CONFIG_INET_ESP=y |
55 | # CONFIG_INET_XFRM_MODE_BEET is not set | 54 | # CONFIG_INET_XFRM_MODE_BEET is not set |
56 | # CONFIG_INET_LRO is not set | 55 | # CONFIG_INET_LRO is not set |
@@ -60,33 +59,17 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | |||
60 | CONFIG_DEVTMPFS=y | 59 | CONFIG_DEVTMPFS=y |
61 | CONFIG_DEVTMPFS_MOUNT=y | 60 | CONFIG_DEVTMPFS_MOUNT=y |
62 | CONFIG_MTD=y | 61 | CONFIG_MTD=y |
63 | CONFIG_MTD_OF_PARTS=y | ||
64 | CONFIG_MTD_CMDLINE_PARTS=y | 62 | CONFIG_MTD_CMDLINE_PARTS=y |
65 | CONFIG_MTD_CHAR=y | ||
66 | CONFIG_MTD_BLKDEVS=y | ||
67 | CONFIG_MTD_BLOCK=y | 63 | CONFIG_MTD_BLOCK=y |
68 | CONFIG_FTL=y | 64 | CONFIG_FTL=y |
69 | CONFIG_MTD_CFI=y | 65 | CONFIG_MTD_CFI=y |
70 | CONFIG_MTD_GEN_PROBE=y | ||
71 | CONFIG_MTD_MAP_BANK_WIDTH_1=y | ||
72 | CONFIG_MTD_MAP_BANK_WIDTH_2=y | ||
73 | CONFIG_MTD_MAP_BANK_WIDTH_4=y | ||
74 | CONFIG_MTD_CFI_I1=y | ||
75 | CONFIG_MTD_CFI_I2=y | ||
76 | CONFIG_MTD_CFI_INTELEXT=y | 66 | CONFIG_MTD_CFI_INTELEXT=y |
77 | CONFIG_MTD_CFI_AMDSTD=y | 67 | CONFIG_MTD_CFI_AMDSTD=y |
78 | CONFIG_MTD_PHYSMAP_OF=y | 68 | CONFIG_MTD_PHYSMAP_OF=y |
79 | CONFIG_MTD_M25P80=y | ||
80 | CONFIG_MTD_CFI_UTIL=y | ||
81 | CONFIG_MTD_NAND_ECC=y | ||
82 | CONFIG_MTD_NAND=y | 69 | CONFIG_MTD_NAND=y |
83 | CONFIG_MTD_NAND_IDS=y | ||
84 | CONFIG_MTD_NAND_FSL_ELBC=y | 70 | CONFIG_MTD_NAND_FSL_ELBC=y |
85 | CONFIG_MTD_NAND_FSL_IFC=y | 71 | CONFIG_MTD_NAND_FSL_IFC=y |
86 | CONFIG_MTD_UBI=y | 72 | CONFIG_MTD_UBI=y |
87 | CONFIG_MTD_UBI_WL_THRESHOLD=4096 | ||
88 | CONFIG_MTD_UBI_BEB_RESERVE=1 | ||
89 | CONFIG_PROC_DEVICETREE=y | ||
90 | CONFIG_BLK_DEV_LOOP=y | 73 | CONFIG_BLK_DEV_LOOP=y |
91 | CONFIG_BLK_DEV_RAM=y | 74 | CONFIG_BLK_DEV_RAM=y |
92 | CONFIG_BLK_DEV_RAM_SIZE=131072 | 75 | CONFIG_BLK_DEV_RAM_SIZE=131072 |
@@ -102,6 +85,7 @@ CONFIG_INPUT_FF_MEMLESS=m | |||
102 | # CONFIG_INPUT_KEYBOARD is not set | 85 | # CONFIG_INPUT_KEYBOARD is not set |
103 | # CONFIG_INPUT_MOUSE is not set | 86 | # CONFIG_INPUT_MOUSE is not set |
104 | CONFIG_SERIO_LIBPS2=y | 87 | CONFIG_SERIO_LIBPS2=y |
88 | CONFIG_PPC_EPAPR_HV_BYTECHAN=y | ||
105 | CONFIG_SERIAL_8250=y | 89 | CONFIG_SERIAL_8250=y |
106 | CONFIG_SERIAL_8250_CONSOLE=y | 90 | CONFIG_SERIAL_8250_CONSOLE=y |
107 | CONFIG_SERIAL_8250_MANY_PORTS=y | 91 | CONFIG_SERIAL_8250_MANY_PORTS=y |
@@ -115,7 +99,6 @@ CONFIG_SPI_GPIO=y | |||
115 | CONFIG_SPI_FSL_SPI=y | 99 | CONFIG_SPI_FSL_SPI=y |
116 | CONFIG_SPI_FSL_ESPI=y | 100 | CONFIG_SPI_FSL_ESPI=y |
117 | # CONFIG_HWMON is not set | 101 | # CONFIG_HWMON is not set |
118 | CONFIG_VIDEO_OUTPUT_CONTROL=y | ||
119 | CONFIG_USB_HID=m | 102 | CONFIG_USB_HID=m |
120 | CONFIG_USB=y | 103 | CONFIG_USB=y |
121 | CONFIG_USB_MON=y | 104 | CONFIG_USB_MON=y |
@@ -124,14 +107,17 @@ CONFIG_USB_EHCI_FSL=y | |||
124 | CONFIG_USB_STORAGE=y | 107 | CONFIG_USB_STORAGE=y |
125 | CONFIG_MMC=y | 108 | CONFIG_MMC=y |
126 | CONFIG_MMC_SDHCI=y | 109 | CONFIG_MMC_SDHCI=y |
110 | CONFIG_EDAC=y | ||
111 | CONFIG_EDAC_MM_EDAC=y | ||
127 | CONFIG_RTC_CLASS=y | 112 | CONFIG_RTC_CLASS=y |
128 | CONFIG_RTC_DRV_DS1307=y | 113 | CONFIG_RTC_DRV_DS1307=y |
129 | CONFIG_RTC_DRV_DS1374=y | 114 | CONFIG_RTC_DRV_DS1374=y |
130 | CONFIG_RTC_DRV_DS3232=y | 115 | CONFIG_RTC_DRV_DS3232=y |
131 | CONFIG_EDAC=y | ||
132 | CONFIG_EDAC_MM_EDAC=y | ||
133 | CONFIG_DMADEVICES=y | 116 | CONFIG_DMADEVICES=y |
134 | CONFIG_FSL_DMA=y | 117 | CONFIG_FSL_DMA=y |
118 | CONFIG_VIRT_DRIVERS=y | ||
119 | CONFIG_FSL_HV_MANAGER=y | ||
120 | CONFIG_FSL_CORENET_CF=y | ||
135 | CONFIG_EXT2_FS=y | 121 | CONFIG_EXT2_FS=y |
136 | CONFIG_EXT3_FS=y | 122 | CONFIG_EXT3_FS=y |
137 | CONFIG_ISO9660_FS=m | 123 | CONFIG_ISO9660_FS=m |
@@ -144,35 +130,24 @@ CONFIG_NTFS_FS=y | |||
144 | CONFIG_PROC_KCORE=y | 130 | CONFIG_PROC_KCORE=y |
145 | CONFIG_TMPFS=y | 131 | CONFIG_TMPFS=y |
146 | CONFIG_HUGETLBFS=y | 132 | CONFIG_HUGETLBFS=y |
147 | CONFIG_MISC_FILESYSTEMS=y | ||
148 | CONFIG_JFFS2_FS=y | 133 | CONFIG_JFFS2_FS=y |
149 | CONFIG_JFFS2_FS_DEBUG=1 | 134 | CONFIG_JFFS2_FS_DEBUG=1 |
150 | CONFIG_JFFS2_FS_WRITEBUFFER=y | ||
151 | CONFIG_JFFS2_ZLIB=y | ||
152 | CONFIG_JFFS2_RTIME=y | ||
153 | CONFIG_UBIFS_FS=y | 135 | CONFIG_UBIFS_FS=y |
154 | CONFIG_UBIFS_FS_XATTR=y | ||
155 | CONFIG_UBIFS_FS_LZO=y | ||
156 | CONFIG_UBIFS_FS_ZLIB=y | ||
157 | CONFIG_NFS_FS=y | 136 | CONFIG_NFS_FS=y |
158 | CONFIG_NFS_V4=y | 137 | CONFIG_NFS_V4=y |
159 | CONFIG_ROOT_NFS=y | 138 | CONFIG_ROOT_NFS=y |
160 | CONFIG_NFSD=m | 139 | CONFIG_NFSD=m |
140 | CONFIG_NLS_CODEPAGE_437=y | ||
141 | CONFIG_NLS_CODEPAGE_850=y | ||
161 | CONFIG_NLS_ISO8859_1=y | 142 | CONFIG_NLS_ISO8859_1=y |
162 | CONFIG_NLS_UTF8=m | 143 | CONFIG_NLS_UTF8=m |
163 | CONFIG_CRC_T10DIF=y | 144 | CONFIG_CRC_T10DIF=y |
164 | CONFIG_CRC16=y | 145 | CONFIG_DEBUG_INFO=y |
165 | CONFIG_ZLIB_DEFLATE=y | ||
166 | CONFIG_LZO_COMPRESS=y | ||
167 | CONFIG_LZO_DECOMPRESS=y | ||
168 | CONFIG_CRYPTO_DEFLATE=y | ||
169 | CONFIG_CRYPTO_LZO=y | ||
170 | CONFIG_FRAME_WARN=1024 | 146 | CONFIG_FRAME_WARN=1024 |
171 | CONFIG_MAGIC_SYSRQ=y | ||
172 | CONFIG_DEBUG_FS=y | 147 | CONFIG_DEBUG_FS=y |
148 | CONFIG_MAGIC_SYSRQ=y | ||
173 | CONFIG_DEBUG_SHIRQ=y | 149 | CONFIG_DEBUG_SHIRQ=y |
174 | CONFIG_DETECT_HUNG_TASK=y | 150 | CONFIG_DETECT_HUNG_TASK=y |
175 | CONFIG_DEBUG_INFO=y | ||
176 | CONFIG_CRYPTO_NULL=y | 151 | CONFIG_CRYPTO_NULL=y |
177 | CONFIG_CRYPTO_PCBC=m | 152 | CONFIG_CRYPTO_PCBC=m |
178 | CONFIG_CRYPTO_MD4=y | 153 | CONFIG_CRYPTO_MD4=y |
@@ -180,4 +155,3 @@ CONFIG_CRYPTO_SHA256=y | |||
180 | CONFIG_CRYPTO_SHA512=y | 155 | CONFIG_CRYPTO_SHA512=y |
181 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | 156 | # CONFIG_CRYPTO_ANSI_CPRNG is not set |
182 | CONFIG_CRYPTO_DEV_FSL_CAAM=y | 157 | CONFIG_CRYPTO_DEV_FSL_CAAM=y |
183 | CONFIG_FSL_CORENET_CF=y | ||
diff --git a/arch/powerpc/configs/mpc85xx_defconfig b/arch/powerpc/configs/mpc85xx_defconfig index fa1bfd37f1ec..d2c415489f72 100644 --- a/arch/powerpc/configs/mpc85xx_defconfig +++ b/arch/powerpc/configs/mpc85xx_defconfig | |||
@@ -213,7 +213,6 @@ CONFIG_RTC_DRV_DS1307=y | |||
213 | CONFIG_RTC_DRV_DS1374=y | 213 | CONFIG_RTC_DRV_DS1374=y |
214 | CONFIG_RTC_DRV_DS3232=y | 214 | CONFIG_RTC_DRV_DS3232=y |
215 | CONFIG_RTC_DRV_CMOS=y | 215 | CONFIG_RTC_DRV_CMOS=y |
216 | CONFIG_RTC_DRV_DS1307=y | ||
217 | CONFIG_DMADEVICES=y | 216 | CONFIG_DMADEVICES=y |
218 | CONFIG_FSL_DMA=y | 217 | CONFIG_FSL_DMA=y |
219 | # CONFIG_NET_DMA is not set | 218 | # CONFIG_NET_DMA is not set |
@@ -227,6 +226,9 @@ CONFIG_UDF_FS=m | |||
227 | CONFIG_MSDOS_FS=m | 226 | CONFIG_MSDOS_FS=m |
228 | CONFIG_VFAT_FS=y | 227 | CONFIG_VFAT_FS=y |
229 | CONFIG_NTFS_FS=y | 228 | CONFIG_NTFS_FS=y |
229 | CONFIG_NLS_CODEPAGE_437=y | ||
230 | CONFIG_NLS_CODEPAGE_850=y | ||
231 | CONFIG_NLS_ISO8859_1=y | ||
230 | CONFIG_PROC_KCORE=y | 232 | CONFIG_PROC_KCORE=y |
231 | CONFIG_TMPFS=y | 233 | CONFIG_TMPFS=y |
232 | CONFIG_HUGETLBFS=y | 234 | CONFIG_HUGETLBFS=y |
diff --git a/arch/powerpc/configs/mpc85xx_smp_defconfig b/arch/powerpc/configs/mpc85xx_smp_defconfig index 0b452ebd8b3d..87460083dbc7 100644 --- a/arch/powerpc/configs/mpc85xx_smp_defconfig +++ b/arch/powerpc/configs/mpc85xx_smp_defconfig | |||
@@ -214,7 +214,6 @@ CONFIG_RTC_DRV_DS1307=y | |||
214 | CONFIG_RTC_DRV_DS1374=y | 214 | CONFIG_RTC_DRV_DS1374=y |
215 | CONFIG_RTC_DRV_DS3232=y | 215 | CONFIG_RTC_DRV_DS3232=y |
216 | CONFIG_RTC_DRV_CMOS=y | 216 | CONFIG_RTC_DRV_CMOS=y |
217 | CONFIG_RTC_DRV_DS1307=y | ||
218 | CONFIG_DMADEVICES=y | 217 | CONFIG_DMADEVICES=y |
219 | CONFIG_FSL_DMA=y | 218 | CONFIG_FSL_DMA=y |
220 | # CONFIG_NET_DMA is not set | 219 | # CONFIG_NET_DMA is not set |
@@ -228,6 +227,9 @@ CONFIG_UDF_FS=m | |||
228 | CONFIG_MSDOS_FS=m | 227 | CONFIG_MSDOS_FS=m |
229 | CONFIG_VFAT_FS=y | 228 | CONFIG_VFAT_FS=y |
230 | CONFIG_NTFS_FS=y | 229 | CONFIG_NTFS_FS=y |
230 | CONFIG_NLS_CODEPAGE_437=y | ||
231 | CONFIG_NLS_CODEPAGE_850=y | ||
232 | CONFIG_NLS_ISO8859_1=y | ||
231 | CONFIG_PROC_KCORE=y | 233 | CONFIG_PROC_KCORE=y |
232 | CONFIG_TMPFS=y | 234 | CONFIG_TMPFS=y |
233 | CONFIG_HUGETLBFS=y | 235 | CONFIG_HUGETLBFS=y |
diff --git a/arch/powerpc/configs/mpc86xx_defconfig b/arch/powerpc/configs/mpc86xx_defconfig index 35595ea74ff4..fc58aa8a89e4 100644 --- a/arch/powerpc/configs/mpc86xx_defconfig +++ b/arch/powerpc/configs/mpc86xx_defconfig | |||
@@ -145,6 +145,9 @@ CONFIG_UDF_FS=m | |||
145 | CONFIG_MSDOS_FS=m | 145 | CONFIG_MSDOS_FS=m |
146 | CONFIG_VFAT_FS=y | 146 | CONFIG_VFAT_FS=y |
147 | CONFIG_NTFS_FS=y | 147 | CONFIG_NTFS_FS=y |
148 | CONFIG_NLS_CODEPAGE_437=y | ||
149 | CONFIG_NLS_CODEPAGE_850=y | ||
150 | CONFIG_NLS_ISO8859_1=y | ||
148 | CONFIG_PROC_KCORE=y | 151 | CONFIG_PROC_KCORE=y |
149 | CONFIG_TMPFS=y | 152 | CONFIG_TMPFS=y |
150 | CONFIG_ADFS_FS=m | 153 | CONFIG_ADFS_FS=m |
diff --git a/arch/powerpc/include/asm/pgtable.h b/arch/powerpc/include/asm/pgtable.h index d98c1ecc3266..6d74167bb6bf 100644 --- a/arch/powerpc/include/asm/pgtable.h +++ b/arch/powerpc/include/asm/pgtable.h | |||
@@ -4,6 +4,7 @@ | |||
4 | 4 | ||
5 | #ifndef __ASSEMBLY__ | 5 | #ifndef __ASSEMBLY__ |
6 | #include <linux/mmdebug.h> | 6 | #include <linux/mmdebug.h> |
7 | #include <linux/mmzone.h> | ||
7 | #include <asm/processor.h> /* For TASK_SIZE */ | 8 | #include <asm/processor.h> /* For TASK_SIZE */ |
8 | #include <asm/mmu.h> | 9 | #include <asm/mmu.h> |
9 | #include <asm/page.h> | 10 | #include <asm/page.h> |
@@ -281,6 +282,8 @@ extern unsigned long empty_zero_page[]; | |||
281 | 282 | ||
282 | extern pgd_t swapper_pg_dir[]; | 283 | extern pgd_t swapper_pg_dir[]; |
283 | 284 | ||
285 | void limit_zone_pfn(enum zone_type zone, unsigned long max_pfn); | ||
286 | int dma_pfn_limit_to_zone(u64 pfn_limit); | ||
284 | extern void paging_init(void); | 287 | extern void paging_init(void); |
285 | 288 | ||
286 | /* | 289 | /* |
diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h index 0c0505956a29..fe3f9488f321 100644 --- a/arch/powerpc/include/asm/reg.h +++ b/arch/powerpc/include/asm/reg.h | |||
@@ -947,7 +947,7 @@ | |||
947 | * 32-bit 8xx: | 947 | * 32-bit 8xx: |
948 | * - SPRG0 scratch for exception vectors | 948 | * - SPRG0 scratch for exception vectors |
949 | * - SPRG1 scratch for exception vectors | 949 | * - SPRG1 scratch for exception vectors |
950 | * - SPRG2 apparently unused but initialized | 950 | * - SPRG2 scratch for exception vectors |
951 | * | 951 | * |
952 | */ | 952 | */ |
953 | #ifdef CONFIG_PPC64 | 953 | #ifdef CONFIG_PPC64 |
@@ -1057,6 +1057,7 @@ | |||
1057 | #ifdef CONFIG_8xx | 1057 | #ifdef CONFIG_8xx |
1058 | #define SPRN_SPRG_SCRATCH0 SPRN_SPRG0 | 1058 | #define SPRN_SPRG_SCRATCH0 SPRN_SPRG0 |
1059 | #define SPRN_SPRG_SCRATCH1 SPRN_SPRG1 | 1059 | #define SPRN_SPRG_SCRATCH1 SPRN_SPRG1 |
1060 | #define SPRN_SPRG_SCRATCH2 SPRN_SPRG2 | ||
1060 | #endif | 1061 | #endif |
1061 | 1062 | ||
1062 | 1063 | ||
diff --git a/arch/powerpc/kernel/dma-swiotlb.c b/arch/powerpc/kernel/dma-swiotlb.c index bd1a2aba599f..735979764cd4 100644 --- a/arch/powerpc/kernel/dma-swiotlb.c +++ b/arch/powerpc/kernel/dma-swiotlb.c | |||
@@ -106,10 +106,14 @@ int __init swiotlb_setup_bus_notifier(void) | |||
106 | return 0; | 106 | return 0; |
107 | } | 107 | } |
108 | 108 | ||
109 | void swiotlb_detect_4g(void) | 109 | void __init swiotlb_detect_4g(void) |
110 | { | 110 | { |
111 | if ((memblock_end_of_DRAM() - 1) > 0xffffffff) | 111 | if ((memblock_end_of_DRAM() - 1) > 0xffffffff) { |
112 | ppc_swiotlb_enable = 1; | 112 | ppc_swiotlb_enable = 1; |
113 | #ifdef CONFIG_ZONE_DMA32 | ||
114 | limit_zone_pfn(ZONE_DMA32, (1ULL << 32) >> PAGE_SHIFT); | ||
115 | #endif | ||
116 | } | ||
113 | } | 117 | } |
114 | 118 | ||
115 | static int __init swiotlb_late_init(void) | 119 | static int __init swiotlb_late_init(void) |
diff --git a/arch/powerpc/kernel/dma.c b/arch/powerpc/kernel/dma.c index 210ff9d3c182..adac9dc54aee 100644 --- a/arch/powerpc/kernel/dma.c +++ b/arch/powerpc/kernel/dma.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <asm/vio.h> | 15 | #include <asm/vio.h> |
16 | #include <asm/bug.h> | 16 | #include <asm/bug.h> |
17 | #include <asm/machdep.h> | 17 | #include <asm/machdep.h> |
18 | #include <asm/swiotlb.h> | ||
18 | 19 | ||
19 | /* | 20 | /* |
20 | * Generic direct DMA implementation | 21 | * Generic direct DMA implementation |
@@ -25,6 +26,18 @@ | |||
25 | * default the offset is PCI_DRAM_OFFSET. | 26 | * default the offset is PCI_DRAM_OFFSET. |
26 | */ | 27 | */ |
27 | 28 | ||
29 | static u64 __maybe_unused get_pfn_limit(struct device *dev) | ||
30 | { | ||
31 | u64 pfn = (dev->coherent_dma_mask >> PAGE_SHIFT) + 1; | ||
32 | struct dev_archdata __maybe_unused *sd = &dev->archdata; | ||
33 | |||
34 | #ifdef CONFIG_SWIOTLB | ||
35 | if (sd->max_direct_dma_addr && sd->dma_ops == &swiotlb_dma_ops) | ||
36 | pfn = min_t(u64, pfn, sd->max_direct_dma_addr >> PAGE_SHIFT); | ||
37 | #endif | ||
38 | |||
39 | return pfn; | ||
40 | } | ||
28 | 41 | ||
29 | void *dma_direct_alloc_coherent(struct device *dev, size_t size, | 42 | void *dma_direct_alloc_coherent(struct device *dev, size_t size, |
30 | dma_addr_t *dma_handle, gfp_t flag, | 43 | dma_addr_t *dma_handle, gfp_t flag, |
@@ -40,6 +53,26 @@ void *dma_direct_alloc_coherent(struct device *dev, size_t size, | |||
40 | #else | 53 | #else |
41 | struct page *page; | 54 | struct page *page; |
42 | int node = dev_to_node(dev); | 55 | int node = dev_to_node(dev); |
56 | u64 pfn = get_pfn_limit(dev); | ||
57 | int zone; | ||
58 | |||
59 | zone = dma_pfn_limit_to_zone(pfn); | ||
60 | if (zone < 0) { | ||
61 | dev_err(dev, "%s: No suitable zone for pfn %#llx\n", | ||
62 | __func__, pfn); | ||
63 | return NULL; | ||
64 | } | ||
65 | |||
66 | switch (zone) { | ||
67 | case ZONE_DMA: | ||
68 | flag |= GFP_DMA; | ||
69 | break; | ||
70 | #ifdef CONFIG_ZONE_DMA32 | ||
71 | case ZONE_DMA32: | ||
72 | flag |= GFP_DMA32; | ||
73 | break; | ||
74 | #endif | ||
75 | }; | ||
43 | 76 | ||
44 | /* ignore region specifiers */ | 77 | /* ignore region specifiers */ |
45 | flag &= ~(__GFP_HIGHMEM); | 78 | flag &= ~(__GFP_HIGHMEM); |
diff --git a/arch/powerpc/kernel/head_8xx.S b/arch/powerpc/kernel/head_8xx.S index 7ee876d2adb5..fafff8dbd5d9 100644 --- a/arch/powerpc/kernel/head_8xx.S +++ b/arch/powerpc/kernel/head_8xx.S | |||
@@ -104,12 +104,15 @@ turn_on_mmu: | |||
104 | * task's thread_struct. | 104 | * task's thread_struct. |
105 | */ | 105 | */ |
106 | #define EXCEPTION_PROLOG \ | 106 | #define EXCEPTION_PROLOG \ |
107 | mtspr SPRN_SPRG_SCRATCH0,r10; \ | 107 | EXCEPTION_PROLOG_0; \ |
108 | mtspr SPRN_SPRG_SCRATCH1,r11; \ | ||
109 | mfcr r10; \ | ||
110 | EXCEPTION_PROLOG_1; \ | 108 | EXCEPTION_PROLOG_1; \ |
111 | EXCEPTION_PROLOG_2 | 109 | EXCEPTION_PROLOG_2 |
112 | 110 | ||
111 | #define EXCEPTION_PROLOG_0 \ | ||
112 | mtspr SPRN_SPRG_SCRATCH0,r10; \ | ||
113 | mtspr SPRN_SPRG_SCRATCH1,r11; \ | ||
114 | mfcr r10 | ||
115 | |||
113 | #define EXCEPTION_PROLOG_1 \ | 116 | #define EXCEPTION_PROLOG_1 \ |
114 | mfspr r11,SPRN_SRR1; /* check whether user or kernel */ \ | 117 | mfspr r11,SPRN_SRR1; /* check whether user or kernel */ \ |
115 | andi. r11,r11,MSR_PR; \ | 118 | andi. r11,r11,MSR_PR; \ |
@@ -145,6 +148,14 @@ turn_on_mmu: | |||
145 | SAVE_2GPRS(7, r11) | 148 | SAVE_2GPRS(7, r11) |
146 | 149 | ||
147 | /* | 150 | /* |
151 | * Exception exit code. | ||
152 | */ | ||
153 | #define EXCEPTION_EPILOG_0 \ | ||
154 | mtcr r10; \ | ||
155 | mfspr r10,SPRN_SPRG_SCRATCH0; \ | ||
156 | mfspr r11,SPRN_SPRG_SCRATCH1 | ||
157 | |||
158 | /* | ||
148 | * Note: code which follows this uses cr0.eq (set if from kernel), | 159 | * Note: code which follows this uses cr0.eq (set if from kernel), |
149 | * r11, r12 (SRR0), and r9 (SRR1). | 160 | * r11, r12 (SRR0), and r9 (SRR1). |
150 | * | 161 | * |
@@ -293,16 +304,8 @@ InstructionTLBMiss: | |||
293 | #ifdef CONFIG_8xx_CPU6 | 304 | #ifdef CONFIG_8xx_CPU6 |
294 | stw r3, 8(r0) | 305 | stw r3, 8(r0) |
295 | #endif | 306 | #endif |
296 | DO_8xx_CPU6(0x3f80, r3) | 307 | EXCEPTION_PROLOG_0 |
297 | mtspr SPRN_M_TW, r10 /* Save a couple of working registers */ | 308 | mtspr SPRN_SPRG_SCRATCH2, r10 |
298 | mfcr r10 | ||
299 | #ifdef CONFIG_8xx_CPU6 | ||
300 | stw r10, 0(r0) | ||
301 | stw r11, 4(r0) | ||
302 | #else | ||
303 | mtspr SPRN_DAR, r10 | ||
304 | mtspr SPRN_SPRG2, r11 | ||
305 | #endif | ||
306 | mfspr r10, SPRN_SRR0 /* Get effective address of fault */ | 309 | mfspr r10, SPRN_SRR0 /* Get effective address of fault */ |
307 | #ifdef CONFIG_8xx_CPU15 | 310 | #ifdef CONFIG_8xx_CPU15 |
308 | addi r11, r10, 0x1000 | 311 | addi r11, r10, 0x1000 |
@@ -359,18 +362,11 @@ InstructionTLBMiss: | |||
359 | mtspr SPRN_MI_RPN, r10 /* Update TLB entry */ | 362 | mtspr SPRN_MI_RPN, r10 /* Update TLB entry */ |
360 | 363 | ||
361 | /* Restore registers */ | 364 | /* Restore registers */ |
362 | #ifndef CONFIG_8xx_CPU6 | 365 | #ifdef CONFIG_8xx_CPU6 |
363 | mfspr r10, SPRN_DAR | ||
364 | mtcr r10 | ||
365 | mtspr SPRN_DAR, r11 /* Tag DAR */ | ||
366 | mfspr r11, SPRN_SPRG2 | ||
367 | #else | ||
368 | lwz r11, 0(r0) | ||
369 | mtcr r11 | ||
370 | lwz r11, 4(r0) | ||
371 | lwz r3, 8(r0) | 366 | lwz r3, 8(r0) |
372 | #endif | 367 | #endif |
373 | mfspr r10, SPRN_M_TW | 368 | mfspr r10, SPRN_SPRG_SCRATCH2 |
369 | EXCEPTION_EPILOG_0 | ||
374 | rfi | 370 | rfi |
375 | 2: | 371 | 2: |
376 | mfspr r11, SPRN_SRR1 | 372 | mfspr r11, SPRN_SRR1 |
@@ -381,19 +377,11 @@ InstructionTLBMiss: | |||
381 | mtspr SPRN_SRR1, r11 | 377 | mtspr SPRN_SRR1, r11 |
382 | 378 | ||
383 | /* Restore registers */ | 379 | /* Restore registers */ |
384 | #ifndef CONFIG_8xx_CPU6 | 380 | #ifdef CONFIG_8xx_CPU6 |
385 | mfspr r10, SPRN_DAR | ||
386 | mtcr r10 | ||
387 | li r11, 0x00f0 | ||
388 | mtspr SPRN_DAR, r11 /* Tag DAR */ | ||
389 | mfspr r11, SPRN_SPRG2 | ||
390 | #else | ||
391 | lwz r11, 0(r0) | ||
392 | mtcr r11 | ||
393 | lwz r11, 4(r0) | ||
394 | lwz r3, 8(r0) | 381 | lwz r3, 8(r0) |
395 | #endif | 382 | #endif |
396 | mfspr r10, SPRN_M_TW | 383 | mfspr r10, SPRN_SPRG_SCRATCH2 |
384 | EXCEPTION_EPILOG_0 | ||
397 | b InstructionAccess | 385 | b InstructionAccess |
398 | 386 | ||
399 | . = 0x1200 | 387 | . = 0x1200 |
@@ -401,16 +389,8 @@ DataStoreTLBMiss: | |||
401 | #ifdef CONFIG_8xx_CPU6 | 389 | #ifdef CONFIG_8xx_CPU6 |
402 | stw r3, 8(r0) | 390 | stw r3, 8(r0) |
403 | #endif | 391 | #endif |
404 | DO_8xx_CPU6(0x3f80, r3) | 392 | EXCEPTION_PROLOG_0 |
405 | mtspr SPRN_M_TW, r10 /* Save a couple of working registers */ | 393 | mtspr SPRN_SPRG_SCRATCH2, r10 |
406 | mfcr r10 | ||
407 | #ifdef CONFIG_8xx_CPU6 | ||
408 | stw r10, 0(r0) | ||
409 | stw r11, 4(r0) | ||
410 | #else | ||
411 | mtspr SPRN_DAR, r10 | ||
412 | mtspr SPRN_SPRG2, r11 | ||
413 | #endif | ||
414 | mfspr r10, SPRN_M_TWB /* Get level 1 table entry address */ | 394 | mfspr r10, SPRN_M_TWB /* Get level 1 table entry address */ |
415 | 395 | ||
416 | /* If we are faulting a kernel address, we have to use the | 396 | /* If we are faulting a kernel address, we have to use the |
@@ -483,19 +463,12 @@ DataStoreTLBMiss: | |||
483 | mtspr SPRN_MD_RPN, r10 /* Update TLB entry */ | 463 | mtspr SPRN_MD_RPN, r10 /* Update TLB entry */ |
484 | 464 | ||
485 | /* Restore registers */ | 465 | /* Restore registers */ |
486 | #ifndef CONFIG_8xx_CPU6 | 466 | #ifdef CONFIG_8xx_CPU6 |
487 | mfspr r10, SPRN_DAR | ||
488 | mtcr r10 | ||
489 | mtspr SPRN_DAR, r11 /* Tag DAR */ | ||
490 | mfspr r11, SPRN_SPRG2 | ||
491 | #else | ||
492 | mtspr SPRN_DAR, r11 /* Tag DAR */ | ||
493 | lwz r11, 0(r0) | ||
494 | mtcr r11 | ||
495 | lwz r11, 4(r0) | ||
496 | lwz r3, 8(r0) | 467 | lwz r3, 8(r0) |
497 | #endif | 468 | #endif |
498 | mfspr r10, SPRN_M_TW | 469 | mtspr SPRN_DAR, r11 /* Tag DAR */ |
470 | mfspr r10, SPRN_SPRG_SCRATCH2 | ||
471 | EXCEPTION_EPILOG_0 | ||
499 | rfi | 472 | rfi |
500 | 473 | ||
501 | /* This is an instruction TLB error on the MPC8xx. This could be due | 474 | /* This is an instruction TLB error on the MPC8xx. This could be due |
@@ -507,35 +480,18 @@ InstructionTLBError: | |||
507 | b InstructionAccess | 480 | b InstructionAccess |
508 | 481 | ||
509 | /* This is the data TLB error on the MPC8xx. This could be due to | 482 | /* This is the data TLB error on the MPC8xx. This could be due to |
510 | * many reasons, including a dirty update to a pte. We can catch that | 483 | * many reasons, including a dirty update to a pte. We bail out to |
511 | * one here, but anything else is an error. First, we track down the | 484 | * a higher level function that can handle it. |
512 | * Linux pte. If it is valid, write access is allowed, but the | ||
513 | * page dirty bit is not set, we will set it and reload the TLB. For | ||
514 | * any other case, we bail out to a higher level function that can | ||
515 | * handle it. | ||
516 | */ | 485 | */ |
517 | . = 0x1400 | 486 | . = 0x1400 |
518 | DataTLBError: | 487 | DataTLBError: |
519 | #ifdef CONFIG_8xx_CPU6 | 488 | EXCEPTION_PROLOG_0 |
520 | stw r3, 8(r0) | ||
521 | #endif | ||
522 | DO_8xx_CPU6(0x3f80, r3) | ||
523 | mtspr SPRN_M_TW, r10 /* Save a couple of working registers */ | ||
524 | mfcr r10 | ||
525 | stw r10, 0(r0) | ||
526 | stw r11, 4(r0) | ||
527 | 489 | ||
528 | mfspr r10, SPRN_DAR | 490 | mfspr r11, SPRN_DAR |
529 | cmpwi cr0, r10, 0x00f0 | 491 | cmpwi cr0, r11, 0x00f0 |
530 | beq- FixupDAR /* must be a buggy dcbX, icbi insn. */ | 492 | beq- FixupDAR /* must be a buggy dcbX, icbi insn. */ |
531 | DARFixed:/* Return from dcbx instruction bug workaround, r10 holds value of DAR */ | 493 | DARFixed:/* Return from dcbx instruction bug workaround */ |
532 | mfspr r10, SPRN_M_TW /* Restore registers */ | 494 | EXCEPTION_EPILOG_0 |
533 | lwz r11, 0(r0) | ||
534 | mtcr r11 | ||
535 | lwz r11, 4(r0) | ||
536 | #ifdef CONFIG_8xx_CPU6 | ||
537 | lwz r3, 8(r0) | ||
538 | #endif | ||
539 | b DataAccess | 495 | b DataAccess |
540 | 496 | ||
541 | EXCEPTION(0x1500, Trap_15, unknown_exception, EXC_XFER_EE) | 497 | EXCEPTION(0x1500, Trap_15, unknown_exception, EXC_XFER_EE) |
@@ -559,11 +515,15 @@ DARFixed:/* Return from dcbx instruction bug workaround, r10 holds value of DAR | |||
559 | 515 | ||
560 | /* This is the procedure to calculate the data EA for buggy dcbx,dcbi instructions | 516 | /* This is the procedure to calculate the data EA for buggy dcbx,dcbi instructions |
561 | * by decoding the registers used by the dcbx instruction and adding them. | 517 | * by decoding the registers used by the dcbx instruction and adding them. |
562 | * DAR is set to the calculated address and r10 also holds the EA on exit. | 518 | * DAR is set to the calculated address. |
563 | */ | 519 | */ |
564 | /* define if you don't want to use self modifying code */ | 520 | /* define if you don't want to use self modifying code */ |
565 | #define NO_SELF_MODIFYING_CODE | 521 | #define NO_SELF_MODIFYING_CODE |
566 | FixupDAR:/* Entry point for dcbx workaround. */ | 522 | FixupDAR:/* Entry point for dcbx workaround. */ |
523 | #ifdef CONFIG_8xx_CPU6 | ||
524 | stw r3, 8(r0) | ||
525 | #endif | ||
526 | mtspr SPRN_SPRG_SCRATCH2, r10 | ||
567 | /* fetch instruction from memory. */ | 527 | /* fetch instruction from memory. */ |
568 | mfspr r10, SPRN_SRR0 | 528 | mfspr r10, SPRN_SRR0 |
569 | andis. r11, r10, 0x8000 /* Address >= 0x80000000 */ | 529 | andis. r11, r10, 0x8000 /* Address >= 0x80000000 */ |
@@ -579,16 +539,17 @@ FixupDAR:/* Entry point for dcbx workaround. */ | |||
579 | mtspr SPRN_MD_TWC, r11 /* Load pte table base address */ | 539 | mtspr SPRN_MD_TWC, r11 /* Load pte table base address */ |
580 | mfspr r11, SPRN_MD_TWC /* ....and get the pte address */ | 540 | mfspr r11, SPRN_MD_TWC /* ....and get the pte address */ |
581 | lwz r11, 0(r11) /* Get the pte */ | 541 | lwz r11, 0(r11) /* Get the pte */ |
542 | #ifdef CONFIG_8xx_CPU6 | ||
543 | lwz r3, 8(r0) /* restore r3 from memory */ | ||
544 | #endif | ||
582 | /* concat physical page address(r11) and page offset(r10) */ | 545 | /* concat physical page address(r11) and page offset(r10) */ |
583 | rlwimi r11, r10, 0, 20, 31 | 546 | rlwimi r11, r10, 0, 20, 31 |
584 | lwz r11,0(r11) | 547 | lwz r11,0(r11) |
585 | /* Check if it really is a dcbx instruction. */ | 548 | /* Check if it really is a dcbx instruction. */ |
586 | /* dcbt and dcbtst does not generate DTLB Misses/Errors, | 549 | /* dcbt and dcbtst does not generate DTLB Misses/Errors, |
587 | * no need to include them here */ | 550 | * no need to include them here */ |
588 | srwi r10, r11, 26 /* check if major OP code is 31 */ | 551 | xoris r10, r11, 0x7c00 /* check if major OP code is 31 */ |
589 | cmpwi cr0, r10, 31 | 552 | rlwinm r10, r10, 0, 21, 5 |
590 | bne- 141f | ||
591 | rlwinm r10, r11, 0, 21, 30 | ||
592 | cmpwi cr0, r10, 2028 /* Is dcbz? */ | 553 | cmpwi cr0, r10, 2028 /* Is dcbz? */ |
593 | beq+ 142f | 554 | beq+ 142f |
594 | cmpwi cr0, r10, 940 /* Is dcbi? */ | 555 | cmpwi cr0, r10, 940 /* Is dcbi? */ |
@@ -599,16 +560,13 @@ FixupDAR:/* Entry point for dcbx workaround. */ | |||
599 | beq+ 142f | 560 | beq+ 142f |
600 | cmpwi cr0, r10, 1964 /* Is icbi? */ | 561 | cmpwi cr0, r10, 1964 /* Is icbi? */ |
601 | beq+ 142f | 562 | beq+ 142f |
602 | 141: mfspr r10, SPRN_DAR /* r10 must hold DAR at exit */ | 563 | 141: mfspr r10,SPRN_SPRG_SCRATCH2 |
603 | b DARFixed /* Nope, go back to normal TLB processing */ | 564 | b DARFixed /* Nope, go back to normal TLB processing */ |
604 | 565 | ||
605 | 144: mfspr r10, SPRN_DSISR | 566 | 144: mfspr r10, SPRN_DSISR |
606 | rlwinm r10, r10,0,7,5 /* Clear store bit for buggy dcbst insn */ | 567 | rlwinm r10, r10,0,7,5 /* Clear store bit for buggy dcbst insn */ |
607 | mtspr SPRN_DSISR, r10 | 568 | mtspr SPRN_DSISR, r10 |
608 | 142: /* continue, it was a dcbx, dcbi instruction. */ | 569 | 142: /* continue, it was a dcbx, dcbi instruction. */ |
609 | #ifdef CONFIG_8xx_CPU6 | ||
610 | lwz r3, 8(r0) /* restore r3 from memory */ | ||
611 | #endif | ||
612 | #ifndef NO_SELF_MODIFYING_CODE | 570 | #ifndef NO_SELF_MODIFYING_CODE |
613 | andis. r10,r11,0x1f /* test if reg RA is r0 */ | 571 | andis. r10,r11,0x1f /* test if reg RA is r0 */ |
614 | li r10,modified_instr@l | 572 | li r10,modified_instr@l |
@@ -619,14 +577,15 @@ FixupDAR:/* Entry point for dcbx workaround. */ | |||
619 | stw r11,0(r10) /* store add/and instruction */ | 577 | stw r11,0(r10) /* store add/and instruction */ |
620 | dcbf 0,r10 /* flush new instr. to memory. */ | 578 | dcbf 0,r10 /* flush new instr. to memory. */ |
621 | icbi 0,r10 /* invalidate instr. cache line */ | 579 | icbi 0,r10 /* invalidate instr. cache line */ |
622 | lwz r11, 4(r0) /* restore r11 from memory */ | 580 | mfspr r11, SPRN_SPRG_SCRATCH1 /* restore r11 */ |
623 | mfspr r10, SPRN_M_TW /* restore r10 from M_TW */ | 581 | mfspr r10, SPRN_SPRG_SCRATCH0 /* restore r10 */ |
624 | isync /* Wait until new instr is loaded from memory */ | 582 | isync /* Wait until new instr is loaded from memory */ |
625 | modified_instr: | 583 | modified_instr: |
626 | .space 4 /* this is where the add instr. is stored */ | 584 | .space 4 /* this is where the add instr. is stored */ |
627 | bne+ 143f | 585 | bne+ 143f |
628 | subf r10,r0,r10 /* r10=r10-r0, only if reg RA is r0 */ | 586 | subf r10,r0,r10 /* r10=r10-r0, only if reg RA is r0 */ |
629 | 143: mtdar r10 /* store faulting EA in DAR */ | 587 | 143: mtdar r10 /* store faulting EA in DAR */ |
588 | mfspr r10,SPRN_SPRG_SCRATCH2 | ||
630 | b DARFixed /* Go back to normal TLB handling */ | 589 | b DARFixed /* Go back to normal TLB handling */ |
631 | #else | 590 | #else |
632 | mfctr r10 | 591 | mfctr r10 |
@@ -680,13 +639,16 @@ modified_instr: | |||
680 | mfdar r11 | 639 | mfdar r11 |
681 | mtctr r11 /* restore ctr reg from DAR */ | 640 | mtctr r11 /* restore ctr reg from DAR */ |
682 | mtdar r10 /* save fault EA to DAR */ | 641 | mtdar r10 /* save fault EA to DAR */ |
642 | mfspr r10,SPRN_SPRG_SCRATCH2 | ||
683 | b DARFixed /* Go back to normal TLB handling */ | 643 | b DARFixed /* Go back to normal TLB handling */ |
684 | 644 | ||
685 | /* special handling for r10,r11 since these are modified already */ | 645 | /* special handling for r10,r11 since these are modified already */ |
686 | 153: lwz r11, 4(r0) /* load r11 from memory */ | 646 | 153: mfspr r11, SPRN_SPRG_SCRATCH1 /* load r11 from SPRN_SPRG_SCRATCH1 */ |
687 | b 155f | 647 | add r10, r10, r11 /* add it */ |
688 | 154: mfspr r11, SPRN_M_TW /* load r10 from M_TW */ | 648 | mfctr r11 /* restore r11 */ |
689 | 155: add r10, r10, r11 /* add it */ | 649 | b 151b |
650 | 154: mfspr r11, SPRN_SPRG_SCRATCH0 /* load r10 from SPRN_SPRG_SCRATCH0 */ | ||
651 | add r10, r10, r11 /* add it */ | ||
690 | mfctr r11 /* restore r11 */ | 652 | mfctr r11 /* restore r11 */ |
691 | b 151b | 653 | b 151b |
692 | #endif | 654 | #endif |
diff --git a/arch/powerpc/mm/mem.c b/arch/powerpc/mm/mem.c index e0f7a189c48e..8ebaac75c940 100644 --- a/arch/powerpc/mm/mem.c +++ b/arch/powerpc/mm/mem.c | |||
@@ -260,6 +260,60 @@ static int __init mark_nonram_nosave(void) | |||
260 | } | 260 | } |
261 | return 0; | 261 | return 0; |
262 | } | 262 | } |
263 | #else /* CONFIG_NEED_MULTIPLE_NODES */ | ||
264 | static int __init mark_nonram_nosave(void) | ||
265 | { | ||
266 | return 0; | ||
267 | } | ||
268 | #endif | ||
269 | |||
270 | static bool zone_limits_final; | ||
271 | |||
272 | static unsigned long max_zone_pfns[MAX_NR_ZONES] = { | ||
273 | [0 ... MAX_NR_ZONES - 1] = ~0UL | ||
274 | }; | ||
275 | |||
276 | /* | ||
277 | * Restrict the specified zone and all more restrictive zones | ||
278 | * to be below the specified pfn. May not be called after | ||
279 | * paging_init(). | ||
280 | */ | ||
281 | void __init limit_zone_pfn(enum zone_type zone, unsigned long pfn_limit) | ||
282 | { | ||
283 | int i; | ||
284 | |||
285 | if (WARN_ON(zone_limits_final)) | ||
286 | return; | ||
287 | |||
288 | for (i = zone; i >= 0; i--) { | ||
289 | if (max_zone_pfns[i] > pfn_limit) | ||
290 | max_zone_pfns[i] = pfn_limit; | ||
291 | } | ||
292 | } | ||
293 | |||
294 | /* | ||
295 | * Find the least restrictive zone that is entirely below the | ||
296 | * specified pfn limit. Returns < 0 if no suitable zone is found. | ||
297 | * | ||
298 | * pfn_limit must be u64 because it can exceed 32 bits even on 32-bit | ||
299 | * systems -- the DMA limit can be higher than any possible real pfn. | ||
300 | */ | ||
301 | int dma_pfn_limit_to_zone(u64 pfn_limit) | ||
302 | { | ||
303 | enum zone_type top_zone = ZONE_NORMAL; | ||
304 | int i; | ||
305 | |||
306 | #ifdef CONFIG_HIGHMEM | ||
307 | top_zone = ZONE_HIGHMEM; | ||
308 | #endif | ||
309 | |||
310 | for (i = top_zone; i >= 0; i--) { | ||
311 | if (max_zone_pfns[i] <= pfn_limit) | ||
312 | return i; | ||
313 | } | ||
314 | |||
315 | return -EPERM; | ||
316 | } | ||
263 | 317 | ||
264 | /* | 318 | /* |
265 | * paging_init() sets up the page tables - in fact we've already done this. | 319 | * paging_init() sets up the page tables - in fact we've already done this. |
@@ -268,7 +322,7 @@ void __init paging_init(void) | |||
268 | { | 322 | { |
269 | unsigned long long total_ram = memblock_phys_mem_size(); | 323 | unsigned long long total_ram = memblock_phys_mem_size(); |
270 | phys_addr_t top_of_ram = memblock_end_of_DRAM(); | 324 | phys_addr_t top_of_ram = memblock_end_of_DRAM(); |
271 | unsigned long max_zone_pfns[MAX_NR_ZONES]; | 325 | enum zone_type top_zone; |
272 | 326 | ||
273 | #ifdef CONFIG_PPC32 | 327 | #ifdef CONFIG_PPC32 |
274 | unsigned long v = __fix_to_virt(__end_of_fixed_addresses - 1); | 328 | unsigned long v = __fix_to_virt(__end_of_fixed_addresses - 1); |
@@ -290,18 +344,20 @@ void __init paging_init(void) | |||
290 | (unsigned long long)top_of_ram, total_ram); | 344 | (unsigned long long)top_of_ram, total_ram); |
291 | printk(KERN_DEBUG "Memory hole size: %ldMB\n", | 345 | printk(KERN_DEBUG "Memory hole size: %ldMB\n", |
292 | (long int)((top_of_ram - total_ram) >> 20)); | 346 | (long int)((top_of_ram - total_ram) >> 20)); |
293 | memset(max_zone_pfns, 0, sizeof(max_zone_pfns)); | 347 | |
294 | #ifdef CONFIG_HIGHMEM | 348 | #ifdef CONFIG_HIGHMEM |
295 | max_zone_pfns[ZONE_DMA] = lowmem_end_addr >> PAGE_SHIFT; | 349 | top_zone = ZONE_HIGHMEM; |
296 | max_zone_pfns[ZONE_HIGHMEM] = top_of_ram >> PAGE_SHIFT; | 350 | limit_zone_pfn(ZONE_NORMAL, lowmem_end_addr >> PAGE_SHIFT); |
297 | #else | 351 | #else |
298 | max_zone_pfns[ZONE_DMA] = top_of_ram >> PAGE_SHIFT; | 352 | top_zone = ZONE_NORMAL; |
299 | #endif | 353 | #endif |
354 | |||
355 | limit_zone_pfn(top_zone, top_of_ram >> PAGE_SHIFT); | ||
356 | zone_limits_final = true; | ||
300 | free_area_init_nodes(max_zone_pfns); | 357 | free_area_init_nodes(max_zone_pfns); |
301 | 358 | ||
302 | mark_nonram_nosave(); | 359 | mark_nonram_nosave(); |
303 | } | 360 | } |
304 | #endif /* ! CONFIG_NEED_MULTIPLE_NODES */ | ||
305 | 361 | ||
306 | static void __init register_page_bootmem_info(void) | 362 | static void __init register_page_bootmem_info(void) |
307 | { | 363 | { |
diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c index ec32d463cad9..649666d5d1c2 100644 --- a/arch/powerpc/mm/numa.c +++ b/arch/powerpc/mm/numa.c | |||
@@ -1134,14 +1134,6 @@ void __init do_init_bootmem(void) | |||
1134 | } | 1134 | } |
1135 | } | 1135 | } |
1136 | 1136 | ||
1137 | void __init paging_init(void) | ||
1138 | { | ||
1139 | unsigned long max_zone_pfns[MAX_NR_ZONES]; | ||
1140 | memset(max_zone_pfns, 0, sizeof(max_zone_pfns)); | ||
1141 | max_zone_pfns[ZONE_DMA] = memblock_end_of_DRAM() >> PAGE_SHIFT; | ||
1142 | free_area_init_nodes(max_zone_pfns); | ||
1143 | } | ||
1144 | |||
1145 | static int __init early_numa(char *p) | 1137 | static int __init early_numa(char *p) |
1146 | { | 1138 | { |
1147 | if (!p) | 1139 | if (!p) |
diff --git a/arch/powerpc/platforms/85xx/Kconfig b/arch/powerpc/platforms/85xx/Kconfig index 0c1e6903597e..f22635a71d01 100644 --- a/arch/powerpc/platforms/85xx/Kconfig +++ b/arch/powerpc/platforms/85xx/Kconfig | |||
@@ -276,7 +276,7 @@ config CORENET_GENERIC | |||
276 | For 64bit kernel, the following boards are supported: | 276 | For 64bit kernel, the following boards are supported: |
277 | T208x QDS/RDB, T4240 QDS/RDB and B4 QDS | 277 | T208x QDS/RDB, T4240 QDS/RDB and B4 QDS |
278 | The following boards are supported for both 32bit and 64bit kernel: | 278 | The following boards are supported for both 32bit and 64bit kernel: |
279 | P5020 DS, P5040 DS and T104xQDS | 279 | P5020 DS, P5040 DS and T104xQDS/RDB |
280 | 280 | ||
281 | endif # FSL_SOC_BOOKE | 281 | endif # FSL_SOC_BOOKE |
282 | 282 | ||
diff --git a/arch/powerpc/platforms/85xx/corenet_generic.c b/arch/powerpc/platforms/85xx/corenet_generic.c index d22dd85e50bf..e56b89a792ed 100644 --- a/arch/powerpc/platforms/85xx/corenet_generic.c +++ b/arch/powerpc/platforms/85xx/corenet_generic.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <asm/time.h> | 20 | #include <asm/time.h> |
21 | #include <asm/machdep.h> | 21 | #include <asm/machdep.h> |
22 | #include <asm/pci-bridge.h> | 22 | #include <asm/pci-bridge.h> |
23 | #include <asm/pgtable.h> | ||
23 | #include <asm/ppc-pci.h> | 24 | #include <asm/ppc-pci.h> |
24 | #include <mm/mmu_decl.h> | 25 | #include <mm/mmu_decl.h> |
25 | #include <asm/prom.h> | 26 | #include <asm/prom.h> |
@@ -67,6 +68,16 @@ void __init corenet_gen_setup_arch(void) | |||
67 | 68 | ||
68 | swiotlb_detect_4g(); | 69 | swiotlb_detect_4g(); |
69 | 70 | ||
71 | #if defined(CONFIG_FSL_PCI) && defined(CONFIG_ZONE_DMA32) | ||
72 | /* | ||
73 | * Inbound windows don't cover the full lower 4 GiB | ||
74 | * due to conflicts with PCICSRBAR and outbound windows, | ||
75 | * so limit the DMA32 zone to 2 GiB, to allow consistent | ||
76 | * allocations to succeed. | ||
77 | */ | ||
78 | limit_zone_pfn(ZONE_DMA32, 1UL << (31 - PAGE_SHIFT)); | ||
79 | #endif | ||
80 | |||
70 | pr_info("%s board\n", ppc_md.name); | 81 | pr_info("%s board\n", ppc_md.name); |
71 | 82 | ||
72 | mpc85xx_qe_init(); | 83 | mpc85xx_qe_init(); |
@@ -129,6 +140,9 @@ static const char * const boards[] __initconst = { | |||
129 | "fsl,B4220QDS", | 140 | "fsl,B4220QDS", |
130 | "fsl,T1040QDS", | 141 | "fsl,T1040QDS", |
131 | "fsl,T1042QDS", | 142 | "fsl,T1042QDS", |
143 | "fsl,T1040RDB", | ||
144 | "fsl,T1042RDB", | ||
145 | "fsl,T1042RDB_PI", | ||
132 | "keymile,kmcoge4", | 146 | "keymile,kmcoge4", |
133 | NULL | 147 | NULL |
134 | }; | 148 | }; |
diff --git a/arch/powerpc/platforms/85xx/qemu_e500.c b/arch/powerpc/platforms/85xx/qemu_e500.c index 7f2673293549..8ad2fe6f200a 100644 --- a/arch/powerpc/platforms/85xx/qemu_e500.c +++ b/arch/powerpc/platforms/85xx/qemu_e500.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <linux/kernel.h> | 18 | #include <linux/kernel.h> |
19 | #include <linux/of_fdt.h> | 19 | #include <linux/of_fdt.h> |
20 | #include <asm/machdep.h> | 20 | #include <asm/machdep.h> |
21 | #include <asm/pgtable.h> | ||
21 | #include <asm/time.h> | 22 | #include <asm/time.h> |
22 | #include <asm/udbg.h> | 23 | #include <asm/udbg.h> |
23 | #include <asm/mpic.h> | 24 | #include <asm/mpic.h> |
@@ -44,6 +45,15 @@ static void __init qemu_e500_setup_arch(void) | |||
44 | 45 | ||
45 | fsl_pci_assign_primary(); | 46 | fsl_pci_assign_primary(); |
46 | swiotlb_detect_4g(); | 47 | swiotlb_detect_4g(); |
48 | #if defined(CONFIG_FSL_PCI) && defined(CONFIG_ZONE_DMA32) | ||
49 | /* | ||
50 | * Inbound windows don't cover the full lower 4 GiB | ||
51 | * due to conflicts with PCICSRBAR and outbound windows, | ||
52 | * so limit the DMA32 zone to 2 GiB, to allow consistent | ||
53 | * allocations to succeed. | ||
54 | */ | ||
55 | limit_zone_pfn(ZONE_DMA32, 1UL << (31 - PAGE_SHIFT)); | ||
56 | #endif | ||
47 | mpc85xx_smp_init(); | 57 | mpc85xx_smp_init(); |
48 | } | 58 | } |
49 | 59 | ||
diff --git a/arch/powerpc/sysdev/fsl_msi.c b/arch/powerpc/sysdev/fsl_msi.c index 77efbaec7b9c..e2ee226464f8 100644 --- a/arch/powerpc/sysdev/fsl_msi.c +++ b/arch/powerpc/sysdev/fsl_msi.c | |||
@@ -18,6 +18,8 @@ | |||
18 | #include <linux/pci.h> | 18 | #include <linux/pci.h> |
19 | #include <linux/slab.h> | 19 | #include <linux/slab.h> |
20 | #include <linux/of_platform.h> | 20 | #include <linux/of_platform.h> |
21 | #include <linux/interrupt.h> | ||
22 | #include <linux/seq_file.h> | ||
21 | #include <sysdev/fsl_soc.h> | 23 | #include <sysdev/fsl_soc.h> |
22 | #include <asm/prom.h> | 24 | #include <asm/prom.h> |
23 | #include <asm/hw_irq.h> | 25 | #include <asm/hw_irq.h> |
@@ -50,6 +52,7 @@ struct fsl_msi_feature { | |||
50 | struct fsl_msi_cascade_data { | 52 | struct fsl_msi_cascade_data { |
51 | struct fsl_msi *msi_data; | 53 | struct fsl_msi *msi_data; |
52 | int index; | 54 | int index; |
55 | int virq; | ||
53 | }; | 56 | }; |
54 | 57 | ||
55 | static inline u32 fsl_msi_read(u32 __iomem *base, unsigned int reg) | 58 | static inline u32 fsl_msi_read(u32 __iomem *base, unsigned int reg) |
@@ -65,11 +68,24 @@ static void fsl_msi_end_irq(struct irq_data *d) | |||
65 | { | 68 | { |
66 | } | 69 | } |
67 | 70 | ||
71 | static void fsl_msi_print_chip(struct irq_data *irqd, struct seq_file *p) | ||
72 | { | ||
73 | struct fsl_msi *msi_data = irqd->domain->host_data; | ||
74 | irq_hw_number_t hwirq = irqd_to_hwirq(irqd); | ||
75 | int cascade_virq, srs; | ||
76 | |||
77 | srs = (hwirq >> msi_data->srs_shift) & MSI_SRS_MASK; | ||
78 | cascade_virq = msi_data->cascade_array[srs]->virq; | ||
79 | |||
80 | seq_printf(p, " fsl-msi-%d", cascade_virq); | ||
81 | } | ||
82 | |||
83 | |||
68 | static struct irq_chip fsl_msi_chip = { | 84 | static struct irq_chip fsl_msi_chip = { |
69 | .irq_mask = mask_msi_irq, | 85 | .irq_mask = mask_msi_irq, |
70 | .irq_unmask = unmask_msi_irq, | 86 | .irq_unmask = unmask_msi_irq, |
71 | .irq_ack = fsl_msi_end_irq, | 87 | .irq_ack = fsl_msi_end_irq, |
72 | .name = "FSL-MSI", | 88 | .irq_print_chip = fsl_msi_print_chip, |
73 | }; | 89 | }; |
74 | 90 | ||
75 | static int fsl_msi_host_map(struct irq_domain *h, unsigned int virq, | 91 | static int fsl_msi_host_map(struct irq_domain *h, unsigned int virq, |
@@ -180,7 +196,8 @@ static int fsl_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type) | |||
180 | np = of_parse_phandle(hose->dn, "fsl,msi", 0); | 196 | np = of_parse_phandle(hose->dn, "fsl,msi", 0); |
181 | if (np) { | 197 | if (np) { |
182 | if (of_device_is_compatible(np, "fsl,mpic-msi") || | 198 | if (of_device_is_compatible(np, "fsl,mpic-msi") || |
183 | of_device_is_compatible(np, "fsl,vmpic-msi")) | 199 | of_device_is_compatible(np, "fsl,vmpic-msi") || |
200 | of_device_is_compatible(np, "fsl,vmpic-msi-v4.3")) | ||
184 | phandle = np->phandle; | 201 | phandle = np->phandle; |
185 | else { | 202 | else { |
186 | dev_err(&pdev->dev, | 203 | dev_err(&pdev->dev, |
@@ -239,40 +256,24 @@ out_free: | |||
239 | return rc; | 256 | return rc; |
240 | } | 257 | } |
241 | 258 | ||
242 | static void fsl_msi_cascade(unsigned int irq, struct irq_desc *desc) | 259 | static irqreturn_t fsl_msi_cascade(int irq, void *data) |
243 | { | 260 | { |
244 | struct irq_chip *chip = irq_desc_get_chip(desc); | ||
245 | struct irq_data *idata = irq_desc_get_irq_data(desc); | ||
246 | unsigned int cascade_irq; | 261 | unsigned int cascade_irq; |
247 | struct fsl_msi *msi_data; | 262 | struct fsl_msi *msi_data; |
248 | int msir_index = -1; | 263 | int msir_index = -1; |
249 | u32 msir_value = 0; | 264 | u32 msir_value = 0; |
250 | u32 intr_index; | 265 | u32 intr_index; |
251 | u32 have_shift = 0; | 266 | u32 have_shift = 0; |
252 | struct fsl_msi_cascade_data *cascade_data; | 267 | struct fsl_msi_cascade_data *cascade_data = data; |
268 | irqreturn_t ret = IRQ_NONE; | ||
253 | 269 | ||
254 | cascade_data = irq_get_handler_data(irq); | ||
255 | msi_data = cascade_data->msi_data; | 270 | msi_data = cascade_data->msi_data; |
256 | 271 | ||
257 | raw_spin_lock(&desc->lock); | ||
258 | if ((msi_data->feature & FSL_PIC_IP_MASK) == FSL_PIC_IP_IPIC) { | ||
259 | if (chip->irq_mask_ack) | ||
260 | chip->irq_mask_ack(idata); | ||
261 | else { | ||
262 | chip->irq_mask(idata); | ||
263 | chip->irq_ack(idata); | ||
264 | } | ||
265 | } | ||
266 | |||
267 | if (unlikely(irqd_irq_inprogress(idata))) | ||
268 | goto unlock; | ||
269 | |||
270 | msir_index = cascade_data->index; | 272 | msir_index = cascade_data->index; |
271 | 273 | ||
272 | if (msir_index >= NR_MSI_REG_MAX) | 274 | if (msir_index >= NR_MSI_REG_MAX) |
273 | cascade_irq = NO_IRQ; | 275 | cascade_irq = NO_IRQ; |
274 | 276 | ||
275 | irqd_set_chained_irq_inprogress(idata); | ||
276 | switch (msi_data->feature & FSL_PIC_IP_MASK) { | 277 | switch (msi_data->feature & FSL_PIC_IP_MASK) { |
277 | case FSL_PIC_IP_MPIC: | 278 | case FSL_PIC_IP_MPIC: |
278 | msir_value = fsl_msi_read(msi_data->msi_regs, | 279 | msir_value = fsl_msi_read(msi_data->msi_regs, |
@@ -301,40 +302,32 @@ static void fsl_msi_cascade(unsigned int irq, struct irq_desc *desc) | |||
301 | cascade_irq = irq_linear_revmap(msi_data->irqhost, | 302 | cascade_irq = irq_linear_revmap(msi_data->irqhost, |
302 | msi_hwirq(msi_data, msir_index, | 303 | msi_hwirq(msi_data, msir_index, |
303 | intr_index + have_shift)); | 304 | intr_index + have_shift)); |
304 | if (cascade_irq != NO_IRQ) | 305 | if (cascade_irq != NO_IRQ) { |
305 | generic_handle_irq(cascade_irq); | 306 | generic_handle_irq(cascade_irq); |
307 | ret = IRQ_HANDLED; | ||
308 | } | ||
306 | have_shift += intr_index + 1; | 309 | have_shift += intr_index + 1; |
307 | msir_value = msir_value >> (intr_index + 1); | 310 | msir_value = msir_value >> (intr_index + 1); |
308 | } | 311 | } |
309 | irqd_clr_chained_irq_inprogress(idata); | ||
310 | 312 | ||
311 | switch (msi_data->feature & FSL_PIC_IP_MASK) { | 313 | return ret; |
312 | case FSL_PIC_IP_MPIC: | ||
313 | case FSL_PIC_IP_VMPIC: | ||
314 | chip->irq_eoi(idata); | ||
315 | break; | ||
316 | case FSL_PIC_IP_IPIC: | ||
317 | if (!irqd_irq_disabled(idata) && chip->irq_unmask) | ||
318 | chip->irq_unmask(idata); | ||
319 | break; | ||
320 | } | ||
321 | unlock: | ||
322 | raw_spin_unlock(&desc->lock); | ||
323 | } | 314 | } |
324 | 315 | ||
325 | static int fsl_of_msi_remove(struct platform_device *ofdev) | 316 | static int fsl_of_msi_remove(struct platform_device *ofdev) |
326 | { | 317 | { |
327 | struct fsl_msi *msi = platform_get_drvdata(ofdev); | 318 | struct fsl_msi *msi = platform_get_drvdata(ofdev); |
328 | int virq, i; | 319 | int virq, i; |
329 | struct fsl_msi_cascade_data *cascade_data; | ||
330 | 320 | ||
331 | if (msi->list.prev != NULL) | 321 | if (msi->list.prev != NULL) |
332 | list_del(&msi->list); | 322 | list_del(&msi->list); |
333 | for (i = 0; i < NR_MSI_REG_MAX; i++) { | 323 | for (i = 0; i < NR_MSI_REG_MAX; i++) { |
334 | virq = msi->msi_virqs[i]; | 324 | if (msi->cascade_array[i]) { |
335 | if (virq != NO_IRQ) { | 325 | virq = msi->cascade_array[i]->virq; |
336 | cascade_data = irq_get_handler_data(virq); | 326 | |
337 | kfree(cascade_data); | 327 | BUG_ON(virq == NO_IRQ); |
328 | |||
329 | free_irq(virq, msi->cascade_array[i]); | ||
330 | kfree(msi->cascade_array[i]); | ||
338 | irq_dispose_mapping(virq); | 331 | irq_dispose_mapping(virq); |
339 | } | 332 | } |
340 | } | 333 | } |
@@ -353,7 +346,7 @@ static int fsl_msi_setup_hwirq(struct fsl_msi *msi, struct platform_device *dev, | |||
353 | int offset, int irq_index) | 346 | int offset, int irq_index) |
354 | { | 347 | { |
355 | struct fsl_msi_cascade_data *cascade_data = NULL; | 348 | struct fsl_msi_cascade_data *cascade_data = NULL; |
356 | int virt_msir, i; | 349 | int virt_msir, i, ret; |
357 | 350 | ||
358 | virt_msir = irq_of_parse_and_map(dev->dev.of_node, irq_index); | 351 | virt_msir = irq_of_parse_and_map(dev->dev.of_node, irq_index); |
359 | if (virt_msir == NO_IRQ) { | 352 | if (virt_msir == NO_IRQ) { |
@@ -368,11 +361,18 @@ static int fsl_msi_setup_hwirq(struct fsl_msi *msi, struct platform_device *dev, | |||
368 | return -ENOMEM; | 361 | return -ENOMEM; |
369 | } | 362 | } |
370 | irq_set_lockdep_class(virt_msir, &fsl_msi_irq_class); | 363 | irq_set_lockdep_class(virt_msir, &fsl_msi_irq_class); |
371 | msi->msi_virqs[irq_index] = virt_msir; | ||
372 | cascade_data->index = offset; | 364 | cascade_data->index = offset; |
373 | cascade_data->msi_data = msi; | 365 | cascade_data->msi_data = msi; |
374 | irq_set_handler_data(virt_msir, cascade_data); | 366 | cascade_data->virq = virt_msir; |
375 | irq_set_chained_handler(virt_msir, fsl_msi_cascade); | 367 | msi->cascade_array[irq_index] = cascade_data; |
368 | |||
369 | ret = request_irq(virt_msir, fsl_msi_cascade, 0, | ||
370 | "fsl-msi-cascade", cascade_data); | ||
371 | if (ret) { | ||
372 | dev_err(&dev->dev, "failed to request_irq(%d), ret = %d\n", | ||
373 | virt_msir, ret); | ||
374 | return ret; | ||
375 | } | ||
376 | 376 | ||
377 | /* Release the hwirqs corresponding to this MSI register */ | 377 | /* Release the hwirqs corresponding to this MSI register */ |
378 | for (i = 0; i < IRQS_PER_MSI_REG; i++) | 378 | for (i = 0; i < IRQS_PER_MSI_REG; i++) |
@@ -466,7 +466,8 @@ static int fsl_of_msi_probe(struct platform_device *dev) | |||
466 | 466 | ||
467 | p = of_get_property(dev->dev.of_node, "msi-available-ranges", &len); | 467 | p = of_get_property(dev->dev.of_node, "msi-available-ranges", &len); |
468 | 468 | ||
469 | if (of_device_is_compatible(dev->dev.of_node, "fsl,mpic-msi-v4.3")) { | 469 | if (of_device_is_compatible(dev->dev.of_node, "fsl,mpic-msi-v4.3") || |
470 | of_device_is_compatible(dev->dev.of_node, "fsl,vmpic-msi-v4.3")) { | ||
470 | msi->srs_shift = MSIIR1_SRS_SHIFT; | 471 | msi->srs_shift = MSIIR1_SRS_SHIFT; |
471 | msi->ibs_shift = MSIIR1_IBS_SHIFT; | 472 | msi->ibs_shift = MSIIR1_IBS_SHIFT; |
472 | if (p) | 473 | if (p) |
@@ -572,6 +573,10 @@ static const struct of_device_id fsl_of_msi_ids[] = { | |||
572 | .compatible = "fsl,vmpic-msi", | 573 | .compatible = "fsl,vmpic-msi", |
573 | .data = &vmpic_msi_feature, | 574 | .data = &vmpic_msi_feature, |
574 | }, | 575 | }, |
576 | { | ||
577 | .compatible = "fsl,vmpic-msi-v4.3", | ||
578 | .data = &vmpic_msi_feature, | ||
579 | }, | ||
575 | #endif | 580 | #endif |
576 | {} | 581 | {} |
577 | }; | 582 | }; |
diff --git a/arch/powerpc/sysdev/fsl_msi.h b/arch/powerpc/sysdev/fsl_msi.h index df9aa9fe0933..420cfcbdac01 100644 --- a/arch/powerpc/sysdev/fsl_msi.h +++ b/arch/powerpc/sysdev/fsl_msi.h | |||
@@ -27,6 +27,8 @@ | |||
27 | #define FSL_PIC_IP_IPIC 0x00000002 | 27 | #define FSL_PIC_IP_IPIC 0x00000002 |
28 | #define FSL_PIC_IP_VMPIC 0x00000003 | 28 | #define FSL_PIC_IP_VMPIC 0x00000003 |
29 | 29 | ||
30 | struct fsl_msi_cascade_data; | ||
31 | |||
30 | struct fsl_msi { | 32 | struct fsl_msi { |
31 | struct irq_domain *irqhost; | 33 | struct irq_domain *irqhost; |
32 | 34 | ||
@@ -37,7 +39,7 @@ struct fsl_msi { | |||
37 | u32 srs_shift; /* Shift of the shared interrupt register select */ | 39 | u32 srs_shift; /* Shift of the shared interrupt register select */ |
38 | void __iomem *msi_regs; | 40 | void __iomem *msi_regs; |
39 | u32 feature; | 41 | u32 feature; |
40 | int msi_virqs[NR_MSI_REG_MAX]; | 42 | struct fsl_msi_cascade_data *cascade_array[NR_MSI_REG_MAX]; |
41 | 43 | ||
42 | struct msi_bitmap bitmap; | 44 | struct msi_bitmap bitmap; |
43 | 45 | ||
diff --git a/arch/powerpc/sysdev/fsl_pci.c b/arch/powerpc/sysdev/fsl_pci.c index c5077673bd94..65d2ed4549e6 100644 --- a/arch/powerpc/sysdev/fsl_pci.c +++ b/arch/powerpc/sysdev/fsl_pci.c | |||
@@ -522,7 +522,8 @@ int fsl_add_bridge(struct platform_device *pdev, int is_primary) | |||
522 | } else { | 522 | } else { |
523 | /* For PCI read PROG to identify controller mode */ | 523 | /* For PCI read PROG to identify controller mode */ |
524 | early_read_config_byte(hose, 0, 0, PCI_CLASS_PROG, &progif); | 524 | early_read_config_byte(hose, 0, 0, PCI_CLASS_PROG, &progif); |
525 | if ((progif & 1) == 1) | 525 | if ((progif & 1) && |
526 | !of_property_read_bool(dev, "fsl,pci-agent-force-enum")) | ||
526 | goto no_bridge; | 527 | goto no_bridge; |
527 | } | 528 | } |
528 | 529 | ||