diff options
Diffstat (limited to 'arch')
159 files changed, 1450 insertions, 682 deletions
diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile index b9d6a8b485e0..032030361bef 100644 --- a/arch/arm/boot/dts/Makefile +++ b/arch/arm/boot/dts/Makefile | |||
| @@ -38,6 +38,7 @@ dtb-$(CONFIG_ARCH_AT91) += at91sam9g35ek.dtb | |||
| 38 | dtb-$(CONFIG_ARCH_AT91) += at91sam9x25ek.dtb | 38 | dtb-$(CONFIG_ARCH_AT91) += at91sam9x25ek.dtb |
| 39 | dtb-$(CONFIG_ARCH_AT91) += at91sam9x35ek.dtb | 39 | dtb-$(CONFIG_ARCH_AT91) += at91sam9x35ek.dtb |
| 40 | # sama5d3 | 40 | # sama5d3 |
| 41 | dtb-$(CONFIG_ARCH_AT91) += at91-sama5d3_xplained.dtb | ||
| 41 | dtb-$(CONFIG_ARCH_AT91) += sama5d31ek.dtb | 42 | dtb-$(CONFIG_ARCH_AT91) += sama5d31ek.dtb |
| 42 | dtb-$(CONFIG_ARCH_AT91) += sama5d33ek.dtb | 43 | dtb-$(CONFIG_ARCH_AT91) += sama5d33ek.dtb |
| 43 | dtb-$(CONFIG_ARCH_AT91) += sama5d34ek.dtb | 44 | dtb-$(CONFIG_ARCH_AT91) += sama5d34ek.dtb |
| @@ -208,7 +209,8 @@ dtb-$(CONFIG_ARCH_OMAP2PLUS) += omap2420-h4.dtb \ | |||
| 208 | omap3-n900.dtb \ | 209 | omap3-n900.dtb \ |
| 209 | omap3-n9.dtb \ | 210 | omap3-n9.dtb \ |
| 210 | omap3-n950.dtb \ | 211 | omap3-n950.dtb \ |
| 211 | omap3-tobi.dtb \ | 212 | omap3-overo-tobi.dtb \ |
| 213 | omap3-overo-storm-tobi.dtb \ | ||
| 212 | omap3-gta04.dtb \ | 214 | omap3-gta04.dtb \ |
| 213 | omap3-igep0020.dtb \ | 215 | omap3-igep0020.dtb \ |
| 214 | omap3-igep0030.dtb \ | 216 | omap3-igep0030.dtb \ |
diff --git a/arch/arm/boot/dts/am335x-evmsk.dts b/arch/arm/boot/dts/am335x-evmsk.dts index 4718ec4a4dbf..486880b74831 100644 --- a/arch/arm/boot/dts/am335x-evmsk.dts +++ b/arch/arm/boot/dts/am335x-evmsk.dts | |||
| @@ -121,7 +121,7 @@ | |||
| 121 | ti,model = "AM335x-EVMSK"; | 121 | ti,model = "AM335x-EVMSK"; |
| 122 | ti,audio-codec = <&tlv320aic3106>; | 122 | ti,audio-codec = <&tlv320aic3106>; |
| 123 | ti,mcasp-controller = <&mcasp1>; | 123 | ti,mcasp-controller = <&mcasp1>; |
| 124 | ti,codec-clock-rate = <24576000>; | 124 | ti,codec-clock-rate = <24000000>; |
| 125 | ti,audio-routing = | 125 | ti,audio-routing = |
| 126 | "Headphone Jack", "HPLOUT", | 126 | "Headphone Jack", "HPLOUT", |
| 127 | "Headphone Jack", "HPROUT"; | 127 | "Headphone Jack", "HPROUT"; |
| @@ -256,6 +256,12 @@ | |||
| 256 | >; | 256 | >; |
| 257 | }; | 257 | }; |
| 258 | 258 | ||
| 259 | mmc1_pins: pinmux_mmc1_pins { | ||
| 260 | pinctrl-single,pins = < | ||
| 261 | 0x160 (PIN_INPUT | MUX_MODE7) /* spi0_cs1.gpio0_6 */ | ||
| 262 | >; | ||
| 263 | }; | ||
| 264 | |||
| 259 | mcasp1_pins: mcasp1_pins { | 265 | mcasp1_pins: mcasp1_pins { |
| 260 | pinctrl-single,pins = < | 266 | pinctrl-single,pins = < |
| 261 | 0x10c (PIN_INPUT_PULLDOWN | MUX_MODE4) /* mii1_crs.mcasp1_aclkx */ | 267 | 0x10c (PIN_INPUT_PULLDOWN | MUX_MODE4) /* mii1_crs.mcasp1_aclkx */ |
| @@ -456,6 +462,9 @@ | |||
| 456 | status = "okay"; | 462 | status = "okay"; |
| 457 | vmmc-supply = <&vmmc_reg>; | 463 | vmmc-supply = <&vmmc_reg>; |
| 458 | bus-width = <4>; | 464 | bus-width = <4>; |
| 465 | pinctrl-names = "default"; | ||
| 466 | pinctrl-0 = <&mmc1_pins>; | ||
| 467 | cd-gpios = <&gpio0 6 GPIO_ACTIVE_HIGH>; | ||
| 459 | }; | 468 | }; |
| 460 | 469 | ||
| 461 | &sham { | 470 | &sham { |
diff --git a/arch/arm/boot/dts/armada-xp-mv78260.dtsi b/arch/arm/boot/dts/armada-xp-mv78260.dtsi index 66609684d41b..9480cf891f8c 100644 --- a/arch/arm/boot/dts/armada-xp-mv78260.dtsi +++ b/arch/arm/boot/dts/armada-xp-mv78260.dtsi | |||
| @@ -23,6 +23,7 @@ | |||
| 23 | gpio0 = &gpio0; | 23 | gpio0 = &gpio0; |
| 24 | gpio1 = &gpio1; | 24 | gpio1 = &gpio1; |
| 25 | gpio2 = &gpio2; | 25 | gpio2 = &gpio2; |
| 26 | eth3 = ð3; | ||
| 26 | }; | 27 | }; |
| 27 | 28 | ||
| 28 | cpus { | 29 | cpus { |
| @@ -291,7 +292,7 @@ | |||
| 291 | interrupts = <91>; | 292 | interrupts = <91>; |
| 292 | }; | 293 | }; |
| 293 | 294 | ||
| 294 | ethernet@34000 { | 295 | eth3: ethernet@34000 { |
| 295 | compatible = "marvell,armada-370-neta"; | 296 | compatible = "marvell,armada-370-neta"; |
| 296 | reg = <0x34000 0x4000>; | 297 | reg = <0x34000 0x4000>; |
| 297 | interrupts = <14>; | 298 | interrupts = <14>; |
diff --git a/arch/arm/boot/dts/at91-sama5d3_xplained.dts b/arch/arm/boot/dts/at91-sama5d3_xplained.dts new file mode 100644 index 000000000000..ce1375595e5f --- /dev/null +++ b/arch/arm/boot/dts/at91-sama5d3_xplained.dts | |||
| @@ -0,0 +1,229 @@ | |||
| 1 | /* | ||
| 2 | * at91-sama5d3_xplained.dts - Device Tree file for the SAMA5D3 Xplained board | ||
| 3 | * | ||
| 4 | * Copyright (C) 2014 Atmel, | ||
| 5 | * 2014 Nicolas Ferre <nicolas.ferre@atmel.com> | ||
| 6 | * | ||
| 7 | * Licensed under GPLv2 or later. | ||
| 8 | */ | ||
| 9 | /dts-v1/; | ||
| 10 | #include "sama5d36.dtsi" | ||
| 11 | |||
| 12 | / { | ||
| 13 | model = "SAMA5D3 Xplained"; | ||
| 14 | compatible = "atmel,sama5d3-xplained", "atmel,sama5d3", "atmel,sama5"; | ||
| 15 | |||
| 16 | chosen { | ||
| 17 | bootargs = "console=ttyS0,115200"; | ||
| 18 | }; | ||
| 19 | |||
| 20 | memory { | ||
| 21 | reg = <0x20000000 0x10000000>; | ||
| 22 | }; | ||
| 23 | |||
| 24 | ahb { | ||
| 25 | apb { | ||
| 26 | mmc0: mmc@f0000000 { | ||
| 27 | pinctrl-0 = <&pinctrl_mmc0_clk_cmd_dat0 &pinctrl_mmc0_dat1_3 &pinctrl_mmc0_dat4_7 &pinctrl_mmc0_cd>; | ||
| 28 | status = "okay"; | ||
| 29 | slot@0 { | ||
| 30 | reg = <0>; | ||
| 31 | bus-width = <8>; | ||
| 32 | cd-gpios = <&pioE 0 GPIO_ACTIVE_LOW>; | ||
| 33 | }; | ||
| 34 | }; | ||
| 35 | |||
| 36 | spi0: spi@f0004000 { | ||
| 37 | cs-gpios = <&pioD 13 0>; | ||
| 38 | status = "okay"; | ||
| 39 | }; | ||
| 40 | |||
| 41 | can0: can@f000c000 { | ||
| 42 | status = "okay"; | ||
| 43 | }; | ||
| 44 | |||
| 45 | i2c0: i2c@f0014000 { | ||
| 46 | status = "okay"; | ||
| 47 | }; | ||
| 48 | |||
| 49 | i2c1: i2c@f0018000 { | ||
| 50 | status = "okay"; | ||
| 51 | }; | ||
| 52 | |||
| 53 | macb0: ethernet@f0028000 { | ||
| 54 | phy-mode = "rgmii"; | ||
| 55 | status = "okay"; | ||
| 56 | }; | ||
| 57 | |||
| 58 | usart0: serial@f001c000 { | ||
| 59 | status = "okay"; | ||
| 60 | }; | ||
| 61 | |||
| 62 | usart1: serial@f0020000 { | ||
| 63 | pinctrl-0 = <&pinctrl_usart1 &pinctrl_usart1_rts_cts>; | ||
| 64 | status = "okay"; | ||
| 65 | }; | ||
| 66 | |||
| 67 | uart0: serial@f0024000 { | ||
| 68 | status = "okay"; | ||
| 69 | }; | ||
| 70 | |||
| 71 | mmc1: mmc@f8000000 { | ||
| 72 | pinctrl-0 = <&pinctrl_mmc1_clk_cmd_dat0 &pinctrl_mmc1_dat1_3 &pinctrl_mmc1_cd>; | ||
| 73 | status = "okay"; | ||
| 74 | slot@0 { | ||
| 75 | reg = <0>; | ||
| 76 | bus-width = <4>; | ||
| 77 | cd-gpios = <&pioE 1 GPIO_ACTIVE_HIGH>; | ||
| 78 | }; | ||
| 79 | }; | ||
| 80 | |||
| 81 | spi1: spi@f8008000 { | ||
| 82 | cs-gpios = <&pioC 25 0>, <0>, <0>, <&pioD 16 0>; | ||
| 83 | status = "okay"; | ||
| 84 | }; | ||
| 85 | |||
| 86 | adc0: adc@f8018000 { | ||
| 87 | pinctrl-0 = < | ||
| 88 | &pinctrl_adc0_adtrg | ||
| 89 | &pinctrl_adc0_ad0 | ||
| 90 | &pinctrl_adc0_ad1 | ||
| 91 | &pinctrl_adc0_ad2 | ||
| 92 | &pinctrl_adc0_ad3 | ||
| 93 | &pinctrl_adc0_ad4 | ||
| 94 | &pinctrl_adc0_ad5 | ||
| 95 | &pinctrl_adc0_ad6 | ||
| 96 | &pinctrl_adc0_ad7 | ||
| 97 | &pinctrl_adc0_ad8 | ||
| 98 | &pinctrl_adc0_ad9 | ||
| 99 | >; | ||
| 100 | status = "okay"; | ||
| 101 | }; | ||
| 102 | |||
| 103 | i2c2: i2c@f801c000 { | ||
| 104 | dmas = <0>, <0>; /* Do not use DMA for i2c2 */ | ||
| 105 | status = "okay"; | ||
| 106 | }; | ||
| 107 | |||
| 108 | macb1: ethernet@f802c000 { | ||
| 109 | phy-mode = "rmii"; | ||
| 110 | status = "okay"; | ||
| 111 | }; | ||
| 112 | |||
| 113 | dbgu: serial@ffffee00 { | ||
| 114 | status = "okay"; | ||
| 115 | }; | ||
| 116 | |||
| 117 | pinctrl@fffff200 { | ||
| 118 | board { | ||
| 119 | pinctrl_mmc0_cd: mmc0_cd { | ||
| 120 | atmel,pins = | ||
| 121 | <AT91_PIOE 0 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_UP_DEGLITCH>; | ||
| 122 | }; | ||
| 123 | |||
| 124 | pinctrl_mmc1_cd: mmc1_cd { | ||
| 125 | atmel,pins = | ||
| 126 | <AT91_PIOE 1 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_UP_DEGLITCH>; | ||
| 127 | }; | ||
| 128 | |||
| 129 | pinctrl_usba_vbus: usba_vbus { | ||
| 130 | atmel,pins = | ||
| 131 | <AT91_PIOE 9 AT91_PERIPH_GPIO AT91_PINCTRL_DEGLITCH>; /* PE9, conflicts with A9 */ | ||
| 132 | }; | ||
| 133 | }; | ||
| 134 | }; | ||
| 135 | |||
| 136 | pmc: pmc@fffffc00 { | ||
| 137 | main: mainck { | ||
| 138 | clock-frequency = <12000000>; | ||
| 139 | }; | ||
| 140 | }; | ||
| 141 | }; | ||
| 142 | |||
| 143 | nand0: nand@60000000 { | ||
| 144 | nand-bus-width = <8>; | ||
| 145 | nand-ecc-mode = "hw"; | ||
| 146 | atmel,has-pmecc; | ||
| 147 | atmel,pmecc-cap = <4>; | ||
| 148 | atmel,pmecc-sector-size = <512>; | ||
| 149 | nand-on-flash-bbt; | ||
| 150 | status = "okay"; | ||
| 151 | |||
| 152 | at91bootstrap@0 { | ||
| 153 | label = "at91bootstrap"; | ||
| 154 | reg = <0x0 0x40000>; | ||
| 155 | }; | ||
| 156 | |||
| 157 | bootloader@40000 { | ||
| 158 | label = "bootloader"; | ||
| 159 | reg = <0x40000 0x80000>; | ||
| 160 | }; | ||
| 161 | |||
| 162 | bootloaderenv@c0000 { | ||
| 163 | label = "bootloader env"; | ||
| 164 | reg = <0xc0000 0xc0000>; | ||
| 165 | }; | ||
| 166 | |||
| 167 | dtb@180000 { | ||
| 168 | label = "device tree"; | ||
| 169 | reg = <0x180000 0x80000>; | ||
| 170 | }; | ||
| 171 | |||
| 172 | kernel@200000 { | ||
| 173 | label = "kernel"; | ||
| 174 | reg = <0x200000 0x600000>; | ||
| 175 | }; | ||
| 176 | |||
| 177 | rootfs@800000 { | ||
| 178 | label = "rootfs"; | ||
| 179 | reg = <0x800000 0x0f800000>; | ||
| 180 | }; | ||
| 181 | }; | ||
| 182 | |||
| 183 | usb0: gadget@00500000 { | ||
| 184 | atmel,vbus-gpio = <&pioE 9 GPIO_ACTIVE_HIGH>; /* PE9, conflicts with A9 */ | ||
| 185 | pinctrl-names = "default"; | ||
| 186 | pinctrl-0 = <&pinctrl_usba_vbus>; | ||
| 187 | status = "okay"; | ||
| 188 | }; | ||
| 189 | |||
| 190 | usb1: ohci@00600000 { | ||
| 191 | num-ports = <3>; | ||
| 192 | atmel,vbus-gpio = <0 | ||
| 193 | &pioE 3 GPIO_ACTIVE_LOW | ||
| 194 | &pioE 4 GPIO_ACTIVE_LOW | ||
| 195 | >; | ||
| 196 | status = "okay"; | ||
| 197 | }; | ||
| 198 | |||
| 199 | usb2: ehci@00700000 { | ||
| 200 | status = "okay"; | ||
| 201 | }; | ||
| 202 | }; | ||
| 203 | |||
| 204 | gpio_keys { | ||
| 205 | compatible = "gpio-keys"; | ||
| 206 | |||
| 207 | bp3 { | ||
| 208 | label = "PB_USER"; | ||
| 209 | gpios = <&pioE 29 GPIO_ACTIVE_LOW>; | ||
| 210 | linux,code = <0x104>; | ||
| 211 | gpio-key,wakeup; | ||
| 212 | }; | ||
| 213 | }; | ||
| 214 | |||
| 215 | leds { | ||
| 216 | compatible = "gpio-leds"; | ||
| 217 | |||
| 218 | d2 { | ||
| 219 | label = "d2"; | ||
| 220 | gpios = <&pioE 23 GPIO_ACTIVE_LOW>; /* PE23, conflicts with A23, CTS2 */ | ||
| 221 | linux,default-trigger = "heartbeat"; | ||
| 222 | }; | ||
| 223 | |||
| 224 | d3 { | ||
| 225 | label = "d3"; | ||
| 226 | gpios = <&pioE 24 GPIO_ACTIVE_HIGH>; | ||
| 227 | }; | ||
| 228 | }; | ||
| 229 | }; | ||
diff --git a/arch/arm/boot/dts/at91sam9263.dtsi b/arch/arm/boot/dts/at91sam9263.dtsi index 0042f73068b0..fece8665fb63 100644 --- a/arch/arm/boot/dts/at91sam9263.dtsi +++ b/arch/arm/boot/dts/at91sam9263.dtsi | |||
| @@ -523,7 +523,7 @@ | |||
| 523 | }; | 523 | }; |
| 524 | 524 | ||
| 525 | i2c0: i2c@fff88000 { | 525 | i2c0: i2c@fff88000 { |
| 526 | compatible = "atmel,at91sam9263-i2c"; | 526 | compatible = "atmel,at91sam9260-i2c"; |
| 527 | reg = <0xfff88000 0x100>; | 527 | reg = <0xfff88000 0x100>; |
| 528 | interrupts = <13 IRQ_TYPE_LEVEL_HIGH 6>; | 528 | interrupts = <13 IRQ_TYPE_LEVEL_HIGH 6>; |
| 529 | #address-cells = <1>; | 529 | #address-cells = <1>; |
diff --git a/arch/arm/boot/dts/at91sam9n12ek.dts b/arch/arm/boot/dts/at91sam9n12ek.dts index e9487f6f0166..924a6a6ffd0f 100644 --- a/arch/arm/boot/dts/at91sam9n12ek.dts +++ b/arch/arm/boot/dts/at91sam9n12ek.dts | |||
| @@ -124,6 +124,10 @@ | |||
| 124 | nand-on-flash-bbt; | 124 | nand-on-flash-bbt; |
| 125 | status = "okay"; | 125 | status = "okay"; |
| 126 | }; | 126 | }; |
| 127 | |||
| 128 | usb0: ohci@00500000 { | ||
| 129 | status = "okay"; | ||
| 130 | }; | ||
| 127 | }; | 131 | }; |
| 128 | 132 | ||
| 129 | leds { | 133 | leds { |
diff --git a/arch/arm/boot/dts/dove.dtsi b/arch/arm/boot/dts/dove.dtsi index 2b76524f4aa7..187fd46b7b5e 100644 --- a/arch/arm/boot/dts/dove.dtsi +++ b/arch/arm/boot/dts/dove.dtsi | |||
| @@ -379,15 +379,6 @@ | |||
| 379 | #clock-cells = <1>; | 379 | #clock-cells = <1>; |
| 380 | }; | 380 | }; |
| 381 | 381 | ||
| 382 | pmu_intc: pmu-interrupt-ctrl@d0050 { | ||
| 383 | compatible = "marvell,dove-pmu-intc"; | ||
| 384 | interrupt-controller; | ||
| 385 | #interrupt-cells = <1>; | ||
| 386 | reg = <0xd0050 0x8>; | ||
| 387 | interrupts = <33>; | ||
| 388 | marvell,#interrupts = <7>; | ||
| 389 | }; | ||
| 390 | |||
| 391 | pinctrl: pin-ctrl@d0200 { | 382 | pinctrl: pin-ctrl@d0200 { |
| 392 | compatible = "marvell,dove-pinctrl"; | 383 | compatible = "marvell,dove-pinctrl"; |
| 393 | reg = <0xd0200 0x10>; | 384 | reg = <0xd0200 0x10>; |
| @@ -610,8 +601,6 @@ | |||
| 610 | rtc: real-time-clock@d8500 { | 601 | rtc: real-time-clock@d8500 { |
| 611 | compatible = "marvell,orion-rtc"; | 602 | compatible = "marvell,orion-rtc"; |
| 612 | reg = <0xd8500 0x20>; | 603 | reg = <0xd8500 0x20>; |
| 613 | interrupt-parent = <&pmu_intc>; | ||
| 614 | interrupts = <5>; | ||
| 615 | }; | 604 | }; |
| 616 | 605 | ||
| 617 | gpio2: gpio-ctrl@e8400 { | 606 | gpio2: gpio-ctrl@e8400 { |
diff --git a/arch/arm/boot/dts/imx6dl-hummingboard.dts b/arch/arm/boot/dts/imx6dl-hummingboard.dts index fd8fc7cd53f3..5bfae54fb780 100644 --- a/arch/arm/boot/dts/imx6dl-hummingboard.dts +++ b/arch/arm/boot/dts/imx6dl-hummingboard.dts | |||
| @@ -52,12 +52,6 @@ | |||
| 52 | }; | 52 | }; |
| 53 | }; | 53 | }; |
| 54 | 54 | ||
| 55 | codec: spdif-transmitter { | ||
| 56 | compatible = "linux,spdif-dit"; | ||
| 57 | pinctrl-names = "default"; | ||
| 58 | pinctrl-0 = <&pinctrl_hummingboard_spdif>; | ||
| 59 | }; | ||
| 60 | |||
| 61 | sound-spdif { | 55 | sound-spdif { |
| 62 | compatible = "fsl,imx-audio-spdif"; | 56 | compatible = "fsl,imx-audio-spdif"; |
| 63 | model = "imx-spdif"; | 57 | model = "imx-spdif"; |
| @@ -111,7 +105,7 @@ | |||
| 111 | }; | 105 | }; |
| 112 | 106 | ||
| 113 | pinctrl_hummingboard_spdif: hummingboard-spdif { | 107 | pinctrl_hummingboard_spdif: hummingboard-spdif { |
| 114 | fsl,pins = <MX6QDL_PAD_GPIO_17__SPDIF_OUT 0x1b0b0>; | 108 | fsl,pins = <MX6QDL_PAD_GPIO_17__SPDIF_OUT 0x13091>; |
| 115 | }; | 109 | }; |
| 116 | 110 | ||
| 117 | pinctrl_hummingboard_usbh1_vbus: hummingboard-usbh1-vbus { | 111 | pinctrl_hummingboard_usbh1_vbus: hummingboard-usbh1-vbus { |
| @@ -142,6 +136,8 @@ | |||
| 142 | }; | 136 | }; |
| 143 | 137 | ||
| 144 | &spdif { | 138 | &spdif { |
| 139 | pinctrl-names = "default"; | ||
| 140 | pinctrl-0 = <&pinctrl_hummingboard_spdif>; | ||
| 145 | status = "okay"; | 141 | status = "okay"; |
| 146 | }; | 142 | }; |
| 147 | 143 | ||
diff --git a/arch/arm/boot/dts/imx6qdl-cubox-i.dtsi b/arch/arm/boot/dts/imx6qdl-cubox-i.dtsi index 64daa3b311f6..c2a24888a276 100644 --- a/arch/arm/boot/dts/imx6qdl-cubox-i.dtsi +++ b/arch/arm/boot/dts/imx6qdl-cubox-i.dtsi | |||
| @@ -46,12 +46,6 @@ | |||
| 46 | }; | 46 | }; |
| 47 | }; | 47 | }; |
| 48 | 48 | ||
| 49 | codec: spdif-transmitter { | ||
| 50 | compatible = "linux,spdif-dit"; | ||
| 51 | pinctrl-names = "default"; | ||
| 52 | pinctrl-0 = <&pinctrl_cubox_i_spdif>; | ||
| 53 | }; | ||
| 54 | |||
| 55 | sound-spdif { | 49 | sound-spdif { |
| 56 | compatible = "fsl,imx-audio-spdif"; | 50 | compatible = "fsl,imx-audio-spdif"; |
| 57 | model = "imx-spdif"; | 51 | model = "imx-spdif"; |
| @@ -89,7 +83,7 @@ | |||
| 89 | }; | 83 | }; |
| 90 | 84 | ||
| 91 | pinctrl_cubox_i_spdif: cubox-i-spdif { | 85 | pinctrl_cubox_i_spdif: cubox-i-spdif { |
| 92 | fsl,pins = <MX6QDL_PAD_GPIO_17__SPDIF_OUT 0x1b0b0>; | 86 | fsl,pins = <MX6QDL_PAD_GPIO_17__SPDIF_OUT 0x13091>; |
| 93 | }; | 87 | }; |
| 94 | 88 | ||
| 95 | pinctrl_cubox_i_usbh1_vbus: cubox-i-usbh1-vbus { | 89 | pinctrl_cubox_i_usbh1_vbus: cubox-i-usbh1-vbus { |
| @@ -121,6 +115,8 @@ | |||
| 121 | }; | 115 | }; |
| 122 | 116 | ||
| 123 | &spdif { | 117 | &spdif { |
| 118 | pinctrl-names = "default"; | ||
| 119 | pinctrl-0 = <&pinctrl_cubox_i_spdif>; | ||
| 124 | status = "okay"; | 120 | status = "okay"; |
| 125 | }; | 121 | }; |
| 126 | 122 | ||
diff --git a/arch/arm/boot/dts/omap3-gta04.dts b/arch/arm/boot/dts/omap3-gta04.dts index b9b55c95a566..c551e4af4d83 100644 --- a/arch/arm/boot/dts/omap3-gta04.dts +++ b/arch/arm/boot/dts/omap3-gta04.dts | |||
| @@ -32,7 +32,7 @@ | |||
| 32 | aux-button { | 32 | aux-button { |
| 33 | label = "aux"; | 33 | label = "aux"; |
| 34 | linux,code = <169>; | 34 | linux,code = <169>; |
| 35 | gpios = <&gpio1 7 GPIO_ACTIVE_LOW>; | 35 | gpios = <&gpio1 7 GPIO_ACTIVE_HIGH>; |
| 36 | gpio-key,wakeup; | 36 | gpio-key,wakeup; |
| 37 | }; | 37 | }; |
| 38 | }; | 38 | }; |
| @@ -92,6 +92,8 @@ | |||
| 92 | bmp085@77 { | 92 | bmp085@77 { |
| 93 | compatible = "bosch,bmp085"; | 93 | compatible = "bosch,bmp085"; |
| 94 | reg = <0x77>; | 94 | reg = <0x77>; |
| 95 | interrupt-parent = <&gpio4>; | ||
| 96 | interrupts = <17 IRQ_TYPE_EDGE_RISING>; | ||
| 95 | }; | 97 | }; |
| 96 | 98 | ||
| 97 | /* leds */ | 99 | /* leds */ |
| @@ -141,8 +143,8 @@ | |||
| 141 | pinctrl-names = "default"; | 143 | pinctrl-names = "default"; |
| 142 | pinctrl-0 = <&mmc1_pins>; | 144 | pinctrl-0 = <&mmc1_pins>; |
| 143 | vmmc-supply = <&vmmc1>; | 145 | vmmc-supply = <&vmmc1>; |
| 144 | vmmc_aux-supply = <&vsim>; | ||
| 145 | bus-width = <4>; | 146 | bus-width = <4>; |
| 147 | ti,non-removable; | ||
| 146 | }; | 148 | }; |
| 147 | 149 | ||
| 148 | &mmc2 { | 150 | &mmc2 { |
diff --git a/arch/arm/boot/dts/omap3-n9.dts b/arch/arm/boot/dts/omap3-n9.dts index 39828ce464ee..9938b5dc1909 100644 --- a/arch/arm/boot/dts/omap3-n9.dts +++ b/arch/arm/boot/dts/omap3-n9.dts | |||
| @@ -14,5 +14,5 @@ | |||
| 14 | 14 | ||
| 15 | / { | 15 | / { |
| 16 | model = "Nokia N9"; | 16 | model = "Nokia N9"; |
| 17 | compatible = "nokia,omap3-n9", "ti,omap3"; | 17 | compatible = "nokia,omap3-n9", "ti,omap36xx", "ti,omap3"; |
| 18 | }; | 18 | }; |
diff --git a/arch/arm/boot/dts/omap3-n900.dts b/arch/arm/boot/dts/omap3-n900.dts index 6fc85f963530..0bf40c90faba 100644 --- a/arch/arm/boot/dts/omap3-n900.dts +++ b/arch/arm/boot/dts/omap3-n900.dts | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (C) 2013 Pavel Machek <pavel@ucw.cz> | 2 | * Copyright (C) 2013 Pavel Machek <pavel@ucw.cz> |
| 3 | * Copyright 2013 Aaro Koskinen <aaro.koskinen@iki.fi> | 3 | * Copyright (C) 2013-2014 Aaro Koskinen <aaro.koskinen@iki.fi> |
| 4 | * | 4 | * |
| 5 | * This program is free software; you can redistribute it and/or modify | 5 | * This program is free software; you can redistribute it and/or modify |
| 6 | * it under the terms of the GNU General Public License version 2 (or later) as | 6 | * it under the terms of the GNU General Public License version 2 (or later) as |
| @@ -13,7 +13,7 @@ | |||
| 13 | 13 | ||
| 14 | / { | 14 | / { |
| 15 | model = "Nokia N900"; | 15 | model = "Nokia N900"; |
| 16 | compatible = "nokia,omap3-n900", "ti,omap3"; | 16 | compatible = "nokia,omap3-n900", "ti,omap3430", "ti,omap3"; |
| 17 | 17 | ||
| 18 | cpus { | 18 | cpus { |
| 19 | cpu@0 { | 19 | cpu@0 { |
diff --git a/arch/arm/boot/dts/omap3-n950.dts b/arch/arm/boot/dts/omap3-n950.dts index b076a526b999..261c5589bfa3 100644 --- a/arch/arm/boot/dts/omap3-n950.dts +++ b/arch/arm/boot/dts/omap3-n950.dts | |||
| @@ -14,5 +14,5 @@ | |||
| 14 | 14 | ||
| 15 | / { | 15 | / { |
| 16 | model = "Nokia N950"; | 16 | model = "Nokia N950"; |
| 17 | compatible = "nokia,omap3-n950", "ti,omap3"; | 17 | compatible = "nokia,omap3-n950", "ti,omap36xx", "ti,omap3"; |
| 18 | }; | 18 | }; |
diff --git a/arch/arm/boot/dts/omap3-overo-storm-tobi.dts b/arch/arm/boot/dts/omap3-overo-storm-tobi.dts new file mode 100644 index 000000000000..966b5c9cd96a --- /dev/null +++ b/arch/arm/boot/dts/omap3-overo-storm-tobi.dts | |||
| @@ -0,0 +1,22 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2012 Florian Vaussard, EPFL Mobots group | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or modify | ||
| 5 | * it under the terms of the GNU General Public License version 2 as | ||
| 6 | * published by the Free Software Foundation. | ||
| 7 | */ | ||
| 8 | |||
| 9 | /* | ||
| 10 | * Tobi expansion board is manufactured by Gumstix Inc. | ||
| 11 | */ | ||
| 12 | |||
| 13 | /dts-v1/; | ||
| 14 | |||
| 15 | #include "omap36xx.dtsi" | ||
| 16 | #include "omap3-overo-tobi-common.dtsi" | ||
| 17 | |||
| 18 | / { | ||
| 19 | model = "OMAP36xx/AM37xx/DM37xx Gumstix Overo on Tobi"; | ||
| 20 | compatible = "gumstix,omap3-overo-tobi", "gumstix,omap3-overo", "ti,omap36xx", "ti,omap3"; | ||
| 21 | }; | ||
| 22 | |||
diff --git a/arch/arm/boot/dts/omap3-tobi.dts b/arch/arm/boot/dts/omap3-overo-tobi-common.dtsi index 7e4ad2aec37a..4edc013a91c1 100644 --- a/arch/arm/boot/dts/omap3-tobi.dts +++ b/arch/arm/boot/dts/omap3-overo-tobi-common.dtsi | |||
| @@ -13,9 +13,6 @@ | |||
| 13 | #include "omap3-overo.dtsi" | 13 | #include "omap3-overo.dtsi" |
| 14 | 14 | ||
| 15 | / { | 15 | / { |
| 16 | model = "TI OMAP3 Gumstix Overo on Tobi"; | ||
| 17 | compatible = "ti,omap3-tobi", "ti,omap3-overo", "ti,omap3"; | ||
| 18 | |||
| 19 | leds { | 16 | leds { |
| 20 | compatible = "gpio-leds"; | 17 | compatible = "gpio-leds"; |
| 21 | heartbeat { | 18 | heartbeat { |
diff --git a/arch/arm/boot/dts/omap3-overo-tobi.dts b/arch/arm/boot/dts/omap3-overo-tobi.dts new file mode 100644 index 000000000000..de5653e1b5ca --- /dev/null +++ b/arch/arm/boot/dts/omap3-overo-tobi.dts | |||
| @@ -0,0 +1,22 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2012 Florian Vaussard, EPFL Mobots group | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or modify | ||
| 5 | * it under the terms of the GNU General Public License version 2 as | ||
| 6 | * published by the Free Software Foundation. | ||
| 7 | */ | ||
| 8 | |||
| 9 | /* | ||
| 10 | * Tobi expansion board is manufactured by Gumstix Inc. | ||
| 11 | */ | ||
| 12 | |||
| 13 | /dts-v1/; | ||
| 14 | |||
| 15 | #include "omap34xx.dtsi" | ||
| 16 | #include "omap3-overo-tobi-common.dtsi" | ||
| 17 | |||
| 18 | / { | ||
| 19 | model = "OMAP35xx Gumstix Overo on Tobi"; | ||
| 20 | compatible = "gumstix,omap3-overo-tobi", "gumstix,omap3-overo", "ti,omap3430", "ti,omap3"; | ||
| 21 | }; | ||
| 22 | |||
diff --git a/arch/arm/boot/dts/omap3-overo.dtsi b/arch/arm/boot/dts/omap3-overo.dtsi index a461d2fd1fb0..597099907f8e 100644 --- a/arch/arm/boot/dts/omap3-overo.dtsi +++ b/arch/arm/boot/dts/omap3-overo.dtsi | |||
| @@ -9,9 +9,6 @@ | |||
| 9 | /* | 9 | /* |
| 10 | * The Gumstix Overo must be combined with an expansion board. | 10 | * The Gumstix Overo must be combined with an expansion board. |
| 11 | */ | 11 | */ |
| 12 | /dts-v1/; | ||
| 13 | |||
| 14 | #include "omap34xx.dtsi" | ||
| 15 | 12 | ||
| 16 | / { | 13 | / { |
| 17 | pwmleds { | 14 | pwmleds { |
diff --git a/arch/arm/boot/dts/sama5d3.dtsi b/arch/arm/boot/dts/sama5d3.dtsi index 52447c17537a..3d5faf85f51b 100644 --- a/arch/arm/boot/dts/sama5d3.dtsi +++ b/arch/arm/boot/dts/sama5d3.dtsi | |||
| @@ -1228,7 +1228,7 @@ | |||
| 1228 | compatible = "atmel,at91rm9200-ohci", "usb-ohci"; | 1228 | compatible = "atmel,at91rm9200-ohci", "usb-ohci"; |
| 1229 | reg = <0x00600000 0x100000>; | 1229 | reg = <0x00600000 0x100000>; |
| 1230 | interrupts = <32 IRQ_TYPE_LEVEL_HIGH 2>; | 1230 | interrupts = <32 IRQ_TYPE_LEVEL_HIGH 2>; |
| 1231 | clocks = <&usb>, <&uhphs_clk>, <&udphs_clk>, | 1231 | clocks = <&usb>, <&uhphs_clk>, <&uhphs_clk>, |
| 1232 | <&uhpck>; | 1232 | <&uhpck>; |
| 1233 | clock-names = "usb_clk", "ohci_clk", "hclk", "uhpck"; | 1233 | clock-names = "usb_clk", "ohci_clk", "hclk", "uhpck"; |
| 1234 | status = "disabled"; | 1234 | status = "disabled"; |
diff --git a/arch/arm/boot/dts/ste-href.dtsi b/arch/arm/boot/dts/ste-href.dtsi index 0c1e8d871ed1..6cb9b68e2188 100644 --- a/arch/arm/boot/dts/ste-href.dtsi +++ b/arch/arm/boot/dts/ste-href.dtsi | |||
| @@ -188,7 +188,6 @@ | |||
| 188 | msp2: msp@80117000 { | 188 | msp2: msp@80117000 { |
| 189 | pinctrl-names = "default"; | 189 | pinctrl-names = "default"; |
| 190 | pinctrl-0 = <&msp2_default_mode>; | 190 | pinctrl-0 = <&msp2_default_mode>; |
| 191 | status = "okay"; | ||
| 192 | }; | 191 | }; |
| 193 | 192 | ||
| 194 | msp3: msp@80125000 { | 193 | msp3: msp@80125000 { |
diff --git a/arch/arm/boot/dts/sun4i-a10.dtsi b/arch/arm/boot/dts/sun4i-a10.dtsi index 040bb0eba152..10666ca8aee1 100644 --- a/arch/arm/boot/dts/sun4i-a10.dtsi +++ b/arch/arm/boot/dts/sun4i-a10.dtsi | |||
| @@ -315,7 +315,7 @@ | |||
| 315 | ranges; | 315 | ranges; |
| 316 | 316 | ||
| 317 | emac: ethernet@01c0b000 { | 317 | emac: ethernet@01c0b000 { |
| 318 | compatible = "allwinner,sun4i-emac"; | 318 | compatible = "allwinner,sun4i-a10-emac"; |
| 319 | reg = <0x01c0b000 0x1000>; | 319 | reg = <0x01c0b000 0x1000>; |
| 320 | interrupts = <55>; | 320 | interrupts = <55>; |
| 321 | clocks = <&ahb_gates 17>; | 321 | clocks = <&ahb_gates 17>; |
| @@ -323,7 +323,7 @@ | |||
| 323 | }; | 323 | }; |
| 324 | 324 | ||
| 325 | mdio@01c0b080 { | 325 | mdio@01c0b080 { |
| 326 | compatible = "allwinner,sun4i-mdio"; | 326 | compatible = "allwinner,sun4i-a10-mdio"; |
| 327 | reg = <0x01c0b080 0x14>; | 327 | reg = <0x01c0b080 0x14>; |
| 328 | status = "disabled"; | 328 | status = "disabled"; |
| 329 | #address-cells = <1>; | 329 | #address-cells = <1>; |
diff --git a/arch/arm/boot/dts/sun5i-a10s.dtsi b/arch/arm/boot/dts/sun5i-a10s.dtsi index ea16054857a4..64961595e8d6 100644 --- a/arch/arm/boot/dts/sun5i-a10s.dtsi +++ b/arch/arm/boot/dts/sun5i-a10s.dtsi | |||
| @@ -278,7 +278,7 @@ | |||
| 278 | ranges; | 278 | ranges; |
| 279 | 279 | ||
| 280 | emac: ethernet@01c0b000 { | 280 | emac: ethernet@01c0b000 { |
| 281 | compatible = "allwinner,sun4i-emac"; | 281 | compatible = "allwinner,sun4i-a10-emac"; |
| 282 | reg = <0x01c0b000 0x1000>; | 282 | reg = <0x01c0b000 0x1000>; |
| 283 | interrupts = <55>; | 283 | interrupts = <55>; |
| 284 | clocks = <&ahb_gates 17>; | 284 | clocks = <&ahb_gates 17>; |
| @@ -286,7 +286,7 @@ | |||
| 286 | }; | 286 | }; |
| 287 | 287 | ||
| 288 | mdio@01c0b080 { | 288 | mdio@01c0b080 { |
| 289 | compatible = "allwinner,sun4i-mdio"; | 289 | compatible = "allwinner,sun4i-a10-mdio"; |
| 290 | reg = <0x01c0b080 0x14>; | 290 | reg = <0x01c0b080 0x14>; |
| 291 | status = "disabled"; | 291 | status = "disabled"; |
| 292 | #address-cells = <1>; | 292 | #address-cells = <1>; |
diff --git a/arch/arm/boot/dts/sun7i-a20.dtsi b/arch/arm/boot/dts/sun7i-a20.dtsi index 119f066f0d98..9ff09484847b 100644 --- a/arch/arm/boot/dts/sun7i-a20.dtsi +++ b/arch/arm/boot/dts/sun7i-a20.dtsi | |||
| @@ -340,7 +340,7 @@ | |||
| 340 | ranges; | 340 | ranges; |
| 341 | 341 | ||
| 342 | emac: ethernet@01c0b000 { | 342 | emac: ethernet@01c0b000 { |
| 343 | compatible = "allwinner,sun4i-emac"; | 343 | compatible = "allwinner,sun4i-a10-emac"; |
| 344 | reg = <0x01c0b000 0x1000>; | 344 | reg = <0x01c0b000 0x1000>; |
| 345 | interrupts = <0 55 4>; | 345 | interrupts = <0 55 4>; |
| 346 | clocks = <&ahb_gates 17>; | 346 | clocks = <&ahb_gates 17>; |
| @@ -348,7 +348,7 @@ | |||
| 348 | }; | 348 | }; |
| 349 | 349 | ||
| 350 | mdio@01c0b080 { | 350 | mdio@01c0b080 { |
| 351 | compatible = "allwinner,sun4i-mdio"; | 351 | compatible = "allwinner,sun4i-a10-mdio"; |
| 352 | reg = <0x01c0b080 0x14>; | 352 | reg = <0x01c0b080 0x14>; |
| 353 | status = "disabled"; | 353 | status = "disabled"; |
| 354 | #address-cells = <1>; | 354 | #address-cells = <1>; |
diff --git a/arch/arm/boot/dts/tegra114.dtsi b/arch/arm/boot/dts/tegra114.dtsi index 389e987ec281..44ec401ec366 100644 --- a/arch/arm/boot/dts/tegra114.dtsi +++ b/arch/arm/boot/dts/tegra114.dtsi | |||
| @@ -57,6 +57,8 @@ | |||
| 57 | resets = <&tegra_car 27>; | 57 | resets = <&tegra_car 27>; |
| 58 | reset-names = "dc"; | 58 | reset-names = "dc"; |
| 59 | 59 | ||
| 60 | nvidia,head = <0>; | ||
| 61 | |||
| 60 | rgb { | 62 | rgb { |
| 61 | status = "disabled"; | 63 | status = "disabled"; |
| 62 | }; | 64 | }; |
| @@ -72,6 +74,8 @@ | |||
| 72 | resets = <&tegra_car 26>; | 74 | resets = <&tegra_car 26>; |
| 73 | reset-names = "dc"; | 75 | reset-names = "dc"; |
| 74 | 76 | ||
| 77 | nvidia,head = <1>; | ||
| 78 | |||
| 75 | rgb { | 79 | rgb { |
| 76 | status = "disabled"; | 80 | status = "disabled"; |
| 77 | }; | 81 | }; |
diff --git a/arch/arm/boot/dts/tegra20.dtsi b/arch/arm/boot/dts/tegra20.dtsi index 480ecda3416b..48d2a7f4d0c0 100644 --- a/arch/arm/boot/dts/tegra20.dtsi +++ b/arch/arm/boot/dts/tegra20.dtsi | |||
| @@ -94,6 +94,8 @@ | |||
| 94 | resets = <&tegra_car 27>; | 94 | resets = <&tegra_car 27>; |
| 95 | reset-names = "dc"; | 95 | reset-names = "dc"; |
| 96 | 96 | ||
| 97 | nvidia,head = <0>; | ||
| 98 | |||
| 97 | rgb { | 99 | rgb { |
| 98 | status = "disabled"; | 100 | status = "disabled"; |
| 99 | }; | 101 | }; |
| @@ -109,6 +111,8 @@ | |||
| 109 | resets = <&tegra_car 26>; | 111 | resets = <&tegra_car 26>; |
| 110 | reset-names = "dc"; | 112 | reset-names = "dc"; |
| 111 | 113 | ||
| 114 | nvidia,head = <1>; | ||
| 115 | |||
| 112 | rgb { | 116 | rgb { |
| 113 | status = "disabled"; | 117 | status = "disabled"; |
| 114 | }; | 118 | }; |
diff --git a/arch/arm/boot/dts/tegra30-cardhu.dtsi b/arch/arm/boot/dts/tegra30-cardhu.dtsi index 9104224124ee..1e156d9d0506 100644 --- a/arch/arm/boot/dts/tegra30-cardhu.dtsi +++ b/arch/arm/boot/dts/tegra30-cardhu.dtsi | |||
| @@ -28,7 +28,7 @@ | |||
| 28 | compatible = "nvidia,cardhu", "nvidia,tegra30"; | 28 | compatible = "nvidia,cardhu", "nvidia,tegra30"; |
| 29 | 29 | ||
| 30 | aliases { | 30 | aliases { |
| 31 | rtc0 = "/i2c@7000d000/tps6586x@34"; | 31 | rtc0 = "/i2c@7000d000/tps65911@2d"; |
| 32 | rtc1 = "/rtc@7000e000"; | 32 | rtc1 = "/rtc@7000e000"; |
| 33 | }; | 33 | }; |
| 34 | 34 | ||
diff --git a/arch/arm/boot/dts/tegra30.dtsi b/arch/arm/boot/dts/tegra30.dtsi index ed8e7700b46d..19a84e933f4e 100644 --- a/arch/arm/boot/dts/tegra30.dtsi +++ b/arch/arm/boot/dts/tegra30.dtsi | |||
| @@ -170,6 +170,8 @@ | |||
| 170 | resets = <&tegra_car 27>; | 170 | resets = <&tegra_car 27>; |
| 171 | reset-names = "dc"; | 171 | reset-names = "dc"; |
| 172 | 172 | ||
| 173 | nvidia,head = <0>; | ||
| 174 | |||
| 173 | rgb { | 175 | rgb { |
| 174 | status = "disabled"; | 176 | status = "disabled"; |
| 175 | }; | 177 | }; |
| @@ -185,6 +187,8 @@ | |||
| 185 | resets = <&tegra_car 26>; | 187 | resets = <&tegra_car 26>; |
| 186 | reset-names = "dc"; | 188 | reset-names = "dc"; |
| 187 | 189 | ||
| 190 | nvidia,head = <1>; | ||
| 191 | |||
| 188 | rgb { | 192 | rgb { |
| 189 | status = "disabled"; | 193 | status = "disabled"; |
| 190 | }; | 194 | }; |
diff --git a/arch/arm/boot/dts/testcases/tests-interrupts.dtsi b/arch/arm/boot/dts/testcases/tests-interrupts.dtsi deleted file mode 100644 index c843720bd3e5..000000000000 --- a/arch/arm/boot/dts/testcases/tests-interrupts.dtsi +++ /dev/null | |||
| @@ -1,58 +0,0 @@ | |||
| 1 | |||
| 2 | / { | ||
| 3 | testcase-data { | ||
| 4 | interrupts { | ||
| 5 | #address-cells = <1>; | ||
| 6 | #size-cells = <1>; | ||
| 7 | test_intc0: intc0 { | ||
| 8 | interrupt-controller; | ||
| 9 | #interrupt-cells = <1>; | ||
| 10 | }; | ||
| 11 | |||
| 12 | test_intc1: intc1 { | ||
| 13 | interrupt-controller; | ||
| 14 | #interrupt-cells = <3>; | ||
| 15 | }; | ||
| 16 | |||
| 17 | test_intc2: intc2 { | ||
| 18 | interrupt-controller; | ||
| 19 | #interrupt-cells = <2>; | ||
| 20 | }; | ||
| 21 | |||
| 22 | test_intmap0: intmap0 { | ||
| 23 | #interrupt-cells = <1>; | ||
| 24 | #address-cells = <0>; | ||
| 25 | interrupt-map = <1 &test_intc0 9>, | ||
| 26 | <2 &test_intc1 10 11 12>, | ||
| 27 | <3 &test_intc2 13 14>, | ||
| 28 | <4 &test_intc2 15 16>; | ||
| 29 | }; | ||
| 30 | |||
| 31 | test_intmap1: intmap1 { | ||
| 32 | #interrupt-cells = <2>; | ||
| 33 | interrupt-map = <0x5000 1 2 &test_intc0 15>; | ||
| 34 | }; | ||
| 35 | |||
| 36 | interrupts0 { | ||
| 37 | interrupt-parent = <&test_intc0>; | ||
| 38 | interrupts = <1>, <2>, <3>, <4>; | ||
| 39 | }; | ||
| 40 | |||
| 41 | interrupts1 { | ||
| 42 | interrupt-parent = <&test_intmap0>; | ||
| 43 | interrupts = <1>, <2>, <3>, <4>; | ||
| 44 | }; | ||
| 45 | |||
| 46 | interrupts-extended0 { | ||
| 47 | reg = <0x5000 0x100>; | ||
| 48 | interrupts-extended = <&test_intc0 1>, | ||
| 49 | <&test_intc1 2 3 4>, | ||
| 50 | <&test_intc2 5 6>, | ||
| 51 | <&test_intmap0 1>, | ||
| 52 | <&test_intmap0 2>, | ||
| 53 | <&test_intmap0 3>, | ||
| 54 | <&test_intmap1 1 2>; | ||
| 55 | }; | ||
| 56 | }; | ||
| 57 | }; | ||
| 58 | }; | ||
diff --git a/arch/arm/boot/dts/testcases/tests-phandle.dtsi b/arch/arm/boot/dts/testcases/tests-phandle.dtsi deleted file mode 100644 index 0007d3cd7dc2..000000000000 --- a/arch/arm/boot/dts/testcases/tests-phandle.dtsi +++ /dev/null | |||
| @@ -1,39 +0,0 @@ | |||
| 1 | |||
| 2 | / { | ||
| 3 | testcase-data { | ||
| 4 | phandle-tests { | ||
| 5 | provider0: provider0 { | ||
| 6 | #phandle-cells = <0>; | ||
| 7 | }; | ||
| 8 | |||
| 9 | provider1: provider1 { | ||
| 10 | #phandle-cells = <1>; | ||
| 11 | }; | ||
| 12 | |||
| 13 | provider2: provider2 { | ||
| 14 | #phandle-cells = <2>; | ||
| 15 | }; | ||
| 16 | |||
| 17 | provider3: provider3 { | ||
| 18 | #phandle-cells = <3>; | ||
| 19 | }; | ||
| 20 | |||
| 21 | consumer-a { | ||
| 22 | phandle-list = <&provider1 1>, | ||
| 23 | <&provider2 2 0>, | ||
| 24 | <0>, | ||
| 25 | <&provider3 4 4 3>, | ||
| 26 | <&provider2 5 100>, | ||
| 27 | <&provider0>, | ||
| 28 | <&provider1 7>; | ||
| 29 | phandle-list-names = "first", "second", "third"; | ||
| 30 | |||
| 31 | phandle-list-bad-phandle = <12345678 0 0>; | ||
| 32 | phandle-list-bad-args = <&provider2 1 0>, | ||
| 33 | <&provider3 0>; | ||
| 34 | empty-property; | ||
| 35 | unterminated-string = [40 41 42 43]; | ||
| 36 | }; | ||
| 37 | }; | ||
| 38 | }; | ||
| 39 | }; | ||
diff --git a/arch/arm/boot/dts/testcases/tests.dtsi b/arch/arm/boot/dts/testcases/tests.dtsi deleted file mode 100644 index 3f123ecc9dd7..000000000000 --- a/arch/arm/boot/dts/testcases/tests.dtsi +++ /dev/null | |||
| @@ -1,2 +0,0 @@ | |||
| 1 | /include/ "tests-phandle.dtsi" | ||
| 2 | /include/ "tests-interrupts.dtsi" | ||
diff --git a/arch/arm/boot/dts/versatile-pb.dts b/arch/arm/boot/dts/versatile-pb.dts index f43907c40c93..65f657711323 100644 --- a/arch/arm/boot/dts/versatile-pb.dts +++ b/arch/arm/boot/dts/versatile-pb.dts | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /include/ "versatile-ab.dts" | 1 | #include <versatile-ab.dts> |
| 2 | 2 | ||
| 3 | / { | 3 | / { |
| 4 | model = "ARM Versatile PB"; | 4 | model = "ARM Versatile PB"; |
| @@ -47,4 +47,4 @@ | |||
| 47 | }; | 47 | }; |
| 48 | }; | 48 | }; |
| 49 | 49 | ||
| 50 | /include/ "testcases/tests.dtsi" | 50 | #include <testcases.dtsi> |
diff --git a/arch/arm/configs/multi_v7_defconfig b/arch/arm/configs/multi_v7_defconfig index 845bc745706b..ee6982976d66 100644 --- a/arch/arm/configs/multi_v7_defconfig +++ b/arch/arm/configs/multi_v7_defconfig | |||
| @@ -29,6 +29,7 @@ CONFIG_ARCH_OMAP3=y | |||
| 29 | CONFIG_ARCH_OMAP4=y | 29 | CONFIG_ARCH_OMAP4=y |
| 30 | CONFIG_SOC_OMAP5=y | 30 | CONFIG_SOC_OMAP5=y |
| 31 | CONFIG_SOC_AM33XX=y | 31 | CONFIG_SOC_AM33XX=y |
| 32 | CONFIG_SOC_DRA7XX=y | ||
| 32 | CONFIG_SOC_AM43XX=y | 33 | CONFIG_SOC_AM43XX=y |
| 33 | CONFIG_ARCH_ROCKCHIP=y | 34 | CONFIG_ARCH_ROCKCHIP=y |
| 34 | CONFIG_ARCH_SOCFPGA=y | 35 | CONFIG_ARCH_SOCFPGA=y |
diff --git a/arch/arm/include/asm/cacheflush.h b/arch/arm/include/asm/cacheflush.h index e9a49fe0284e..8b8b61685a34 100644 --- a/arch/arm/include/asm/cacheflush.h +++ b/arch/arm/include/asm/cacheflush.h | |||
| @@ -212,6 +212,7 @@ extern void copy_to_user_page(struct vm_area_struct *, struct page *, | |||
| 212 | static inline void __flush_icache_all(void) | 212 | static inline void __flush_icache_all(void) |
| 213 | { | 213 | { |
| 214 | __flush_icache_preferred(); | 214 | __flush_icache_preferred(); |
| 215 | dsb(); | ||
| 215 | } | 216 | } |
| 216 | 217 | ||
| 217 | /* | 218 | /* |
diff --git a/arch/arm/include/asm/pgtable-3level.h b/arch/arm/include/asm/pgtable-3level.h index 03243f7eeddf..85c60adc8b60 100644 --- a/arch/arm/include/asm/pgtable-3level.h +++ b/arch/arm/include/asm/pgtable-3level.h | |||
| @@ -120,13 +120,16 @@ | |||
| 120 | /* | 120 | /* |
| 121 | * 2nd stage PTE definitions for LPAE. | 121 | * 2nd stage PTE definitions for LPAE. |
| 122 | */ | 122 | */ |
| 123 | #define L_PTE_S2_MT_UNCACHED (_AT(pteval_t, 0x5) << 2) /* MemAttr[3:0] */ | 123 | #define L_PTE_S2_MT_UNCACHED (_AT(pteval_t, 0x0) << 2) /* strongly ordered */ |
| 124 | #define L_PTE_S2_MT_WRITETHROUGH (_AT(pteval_t, 0xa) << 2) /* MemAttr[3:0] */ | 124 | #define L_PTE_S2_MT_WRITETHROUGH (_AT(pteval_t, 0xa) << 2) /* normal inner write-through */ |
| 125 | #define L_PTE_S2_MT_WRITEBACK (_AT(pteval_t, 0xf) << 2) /* MemAttr[3:0] */ | 125 | #define L_PTE_S2_MT_WRITEBACK (_AT(pteval_t, 0xf) << 2) /* normal inner write-back */ |
| 126 | #define L_PTE_S2_RDONLY (_AT(pteval_t, 1) << 6) /* HAP[1] */ | 126 | #define L_PTE_S2_MT_DEV_SHARED (_AT(pteval_t, 0x1) << 2) /* device */ |
| 127 | #define L_PTE_S2_RDWR (_AT(pteval_t, 3) << 6) /* HAP[2:1] */ | 127 | #define L_PTE_S2_MT_MASK (_AT(pteval_t, 0xf) << 2) |
| 128 | 128 | ||
| 129 | #define L_PMD_S2_RDWR (_AT(pmdval_t, 3) << 6) /* HAP[2:1] */ | 129 | #define L_PTE_S2_RDONLY (_AT(pteval_t, 1) << 6) /* HAP[1] */ |
| 130 | #define L_PTE_S2_RDWR (_AT(pteval_t, 3) << 6) /* HAP[2:1] */ | ||
| 131 | |||
| 132 | #define L_PMD_S2_RDWR (_AT(pmdval_t, 3) << 6) /* HAP[2:1] */ | ||
| 130 | 133 | ||
| 131 | /* | 134 | /* |
| 132 | * Hyp-mode PL2 PTE definitions for LPAE. | 135 | * Hyp-mode PL2 PTE definitions for LPAE. |
diff --git a/arch/arm/include/asm/spinlock.h b/arch/arm/include/asm/spinlock.h index ef3c6072aa45..ac4bfae26702 100644 --- a/arch/arm/include/asm/spinlock.h +++ b/arch/arm/include/asm/spinlock.h | |||
| @@ -37,18 +37,9 @@ | |||
| 37 | 37 | ||
| 38 | static inline void dsb_sev(void) | 38 | static inline void dsb_sev(void) |
| 39 | { | 39 | { |
| 40 | #if __LINUX_ARM_ARCH__ >= 7 | 40 | |
| 41 | __asm__ __volatile__ ( | 41 | dsb(ishst); |
| 42 | "dsb ishst\n" | 42 | __asm__(SEV); |
| 43 | SEV | ||
| 44 | ); | ||
| 45 | #else | ||
| 46 | __asm__ __volatile__ ( | ||
| 47 | "mcr p15, 0, %0, c7, c10, 4\n" | ||
| 48 | SEV | ||
| 49 | : : "r" (0) | ||
| 50 | ); | ||
| 51 | #endif | ||
| 52 | } | 43 | } |
| 53 | 44 | ||
| 54 | /* | 45 | /* |
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index b0df9761de6d..1e8b030dbefd 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c | |||
| @@ -731,7 +731,7 @@ static void __init request_standard_resources(const struct machine_desc *mdesc) | |||
| 731 | kernel_data.end = virt_to_phys(_end - 1); | 731 | kernel_data.end = virt_to_phys(_end - 1); |
| 732 | 732 | ||
| 733 | for_each_memblock(memory, region) { | 733 | for_each_memblock(memory, region) { |
| 734 | res = memblock_virt_alloc_low(sizeof(*res), 0); | 734 | res = memblock_virt_alloc(sizeof(*res), 0); |
| 735 | res->name = "System RAM"; | 735 | res->name = "System RAM"; |
| 736 | res->start = __pfn_to_phys(memblock_region_memory_base_pfn(region)); | 736 | res->start = __pfn_to_phys(memblock_region_memory_base_pfn(region)); |
| 737 | res->end = __pfn_to_phys(memblock_region_memory_end_pfn(region)) - 1; | 737 | res->end = __pfn_to_phys(memblock_region_memory_end_pfn(region)) - 1; |
diff --git a/arch/arm/mach-hisi/Kconfig b/arch/arm/mach-hisi/Kconfig index 8f4649b301b2..1abae5f6a418 100644 --- a/arch/arm/mach-hisi/Kconfig +++ b/arch/arm/mach-hisi/Kconfig | |||
| @@ -8,7 +8,7 @@ config ARCH_HI3xxx | |||
| 8 | select CLKSRC_OF | 8 | select CLKSRC_OF |
| 9 | select GENERIC_CLOCKEVENTS | 9 | select GENERIC_CLOCKEVENTS |
| 10 | select HAVE_ARM_SCU | 10 | select HAVE_ARM_SCU |
| 11 | select HAVE_ARM_TWD | 11 | select HAVE_ARM_TWD if SMP |
| 12 | select HAVE_SMP | 12 | select HAVE_SMP |
| 13 | select PINCTRL | 13 | select PINCTRL |
| 14 | select PINCTRL_SINGLE | 14 | select PINCTRL_SINGLE |
diff --git a/arch/arm/mach-imx/Makefile b/arch/arm/mach-imx/Makefile index befcaf5d0574..ec419649320f 100644 --- a/arch/arm/mach-imx/Makefile +++ b/arch/arm/mach-imx/Makefile | |||
| @@ -101,11 +101,9 @@ obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o | |||
| 101 | obj-$(CONFIG_SOC_IMX6Q) += clk-imx6q.o mach-imx6q.o | 101 | obj-$(CONFIG_SOC_IMX6Q) += clk-imx6q.o mach-imx6q.o |
| 102 | obj-$(CONFIG_SOC_IMX6SL) += clk-imx6sl.o mach-imx6sl.o | 102 | obj-$(CONFIG_SOC_IMX6SL) += clk-imx6sl.o mach-imx6sl.o |
| 103 | 103 | ||
| 104 | ifeq ($(CONFIG_PM),y) | ||
| 105 | obj-$(CONFIG_SOC_IMX6Q) += pm-imx6q.o headsmp.o | 104 | obj-$(CONFIG_SOC_IMX6Q) += pm-imx6q.o headsmp.o |
| 106 | # i.MX6SL reuses i.MX6Q code | 105 | # i.MX6SL reuses i.MX6Q code |
| 107 | obj-$(CONFIG_SOC_IMX6SL) += pm-imx6q.o headsmp.o | 106 | obj-$(CONFIG_SOC_IMX6SL) += pm-imx6q.o headsmp.o |
| 108 | endif | ||
| 109 | 107 | ||
| 110 | # i.MX5 based machines | 108 | # i.MX5 based machines |
| 111 | obj-$(CONFIG_MACH_MX51_BABBAGE) += mach-mx51_babbage.o | 109 | obj-$(CONFIG_MACH_MX51_BABBAGE) += mach-mx51_babbage.o |
diff --git a/arch/arm/mach-imx/clk-imx6q.c b/arch/arm/mach-imx/clk-imx6q.c index af2e582d2b74..4d677f442539 100644 --- a/arch/arm/mach-imx/clk-imx6q.c +++ b/arch/arm/mach-imx/clk-imx6q.c | |||
| @@ -482,6 +482,9 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node) | |||
| 482 | if (IS_ENABLED(CONFIG_PCI_IMX6)) | 482 | if (IS_ENABLED(CONFIG_PCI_IMX6)) |
| 483 | clk_set_parent(clk[lvds1_sel], clk[sata_ref]); | 483 | clk_set_parent(clk[lvds1_sel], clk[sata_ref]); |
| 484 | 484 | ||
| 485 | /* Set initial power mode */ | ||
| 486 | imx6q_set_lpm(WAIT_CLOCKED); | ||
| 487 | |||
| 485 | np = of_find_compatible_node(NULL, NULL, "fsl,imx6q-gpt"); | 488 | np = of_find_compatible_node(NULL, NULL, "fsl,imx6q-gpt"); |
| 486 | base = of_iomap(np, 0); | 489 | base = of_iomap(np, 0); |
| 487 | WARN_ON(!base); | 490 | WARN_ON(!base); |
diff --git a/arch/arm/mach-imx/clk-imx6sl.c b/arch/arm/mach-imx/clk-imx6sl.c index 3781a1853998..4c86f3035205 100644 --- a/arch/arm/mach-imx/clk-imx6sl.c +++ b/arch/arm/mach-imx/clk-imx6sl.c | |||
| @@ -266,6 +266,9 @@ static void __init imx6sl_clocks_init(struct device_node *ccm_node) | |||
| 266 | /* Audio-related clocks configuration */ | 266 | /* Audio-related clocks configuration */ |
| 267 | clk_set_parent(clks[IMX6SL_CLK_SPDIF0_SEL], clks[IMX6SL_CLK_PLL3_PFD3]); | 267 | clk_set_parent(clks[IMX6SL_CLK_SPDIF0_SEL], clks[IMX6SL_CLK_PLL3_PFD3]); |
| 268 | 268 | ||
| 269 | /* Set initial power mode */ | ||
| 270 | imx6q_set_lpm(WAIT_CLOCKED); | ||
| 271 | |||
| 269 | np = of_find_compatible_node(NULL, NULL, "fsl,imx6sl-gpt"); | 272 | np = of_find_compatible_node(NULL, NULL, "fsl,imx6sl-gpt"); |
| 270 | base = of_iomap(np, 0); | 273 | base = of_iomap(np, 0); |
| 271 | WARN_ON(!base); | 274 | WARN_ON(!base); |
diff --git a/arch/arm/mach-imx/common.h b/arch/arm/mach-imx/common.h index 59c3b9b26bb4..baf439dc22d8 100644 --- a/arch/arm/mach-imx/common.h +++ b/arch/arm/mach-imx/common.h | |||
| @@ -144,13 +144,11 @@ void imx6q_set_chicken_bit(void); | |||
| 144 | void imx_cpu_die(unsigned int cpu); | 144 | void imx_cpu_die(unsigned int cpu); |
| 145 | int imx_cpu_kill(unsigned int cpu); | 145 | int imx_cpu_kill(unsigned int cpu); |
| 146 | 146 | ||
| 147 | #ifdef CONFIG_PM | ||
| 148 | void imx6q_pm_init(void); | 147 | void imx6q_pm_init(void); |
| 149 | void imx6q_pm_set_ccm_base(void __iomem *base); | 148 | void imx6q_pm_set_ccm_base(void __iomem *base); |
| 149 | #ifdef CONFIG_PM | ||
| 150 | void imx5_pm_init(void); | 150 | void imx5_pm_init(void); |
| 151 | #else | 151 | #else |
| 152 | static inline void imx6q_pm_init(void) {} | ||
| 153 | static inline void imx6q_pm_set_ccm_base(void __iomem *base) {} | ||
| 154 | static inline void imx5_pm_init(void) {} | 152 | static inline void imx5_pm_init(void) {} |
| 155 | #endif | 153 | #endif |
| 156 | 154 | ||
diff --git a/arch/arm/mach-imx/pm-imx6q.c b/arch/arm/mach-imx/pm-imx6q.c index 9d47adc078aa..7a9b98589db7 100644 --- a/arch/arm/mach-imx/pm-imx6q.c +++ b/arch/arm/mach-imx/pm-imx6q.c | |||
| @@ -236,8 +236,6 @@ void __init imx6q_pm_init(void) | |||
| 236 | regmap_update_bits(gpr, IOMUXC_GPR1, IMX6Q_GPR1_GINT, | 236 | regmap_update_bits(gpr, IOMUXC_GPR1, IMX6Q_GPR1_GINT, |
| 237 | IMX6Q_GPR1_GINT); | 237 | IMX6Q_GPR1_GINT); |
| 238 | 238 | ||
| 239 | /* Set initial power mode */ | ||
| 240 | imx6q_set_lpm(WAIT_CLOCKED); | ||
| 241 | 239 | ||
| 242 | suspend_set_ops(&imx6q_pm_ops); | 240 | suspend_set_ops(&imx6q_pm_ops); |
| 243 | } | 241 | } |
diff --git a/arch/arm/mach-moxart/Kconfig b/arch/arm/mach-moxart/Kconfig index ba470d64493b..3795ae28a613 100644 --- a/arch/arm/mach-moxart/Kconfig +++ b/arch/arm/mach-moxart/Kconfig | |||
| @@ -2,7 +2,6 @@ config ARCH_MOXART | |||
| 2 | bool "MOXA ART SoC" if ARCH_MULTI_V4T | 2 | bool "MOXA ART SoC" if ARCH_MULTI_V4T |
| 3 | select CPU_FA526 | 3 | select CPU_FA526 |
| 4 | select ARM_DMA_MEM_BUFFERABLE | 4 | select ARM_DMA_MEM_BUFFERABLE |
| 5 | select DMA_OF | ||
| 6 | select USE_OF | 5 | select USE_OF |
| 7 | select CLKSRC_OF | 6 | select CLKSRC_OF |
| 8 | select CLKSRC_MMIO | 7 | select CLKSRC_MMIO |
diff --git a/arch/arm/mach-omap1/board-nokia770.c b/arch/arm/mach-omap1/board-nokia770.c index 91449c5cb70f..85089d821982 100644 --- a/arch/arm/mach-omap1/board-nokia770.c +++ b/arch/arm/mach-omap1/board-nokia770.c | |||
| @@ -156,6 +156,7 @@ static struct omap_usb_config nokia770_usb_config __initdata = { | |||
| 156 | .register_dev = 1, | 156 | .register_dev = 1, |
| 157 | .hmc_mode = 16, | 157 | .hmc_mode = 16, |
| 158 | .pins[0] = 6, | 158 | .pins[0] = 6, |
| 159 | .extcon = "tahvo-usb", | ||
| 159 | }; | 160 | }; |
| 160 | 161 | ||
| 161 | #if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE) | 162 | #if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE) |
diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig index 653b489479e0..0af7ca02314d 100644 --- a/arch/arm/mach-omap2/Kconfig +++ b/arch/arm/mach-omap2/Kconfig | |||
| @@ -50,11 +50,12 @@ config SOC_OMAP5 | |||
| 50 | bool "TI OMAP5" | 50 | bool "TI OMAP5" |
| 51 | depends on ARCH_MULTI_V7 | 51 | depends on ARCH_MULTI_V7 |
| 52 | select ARCH_OMAP2PLUS | 52 | select ARCH_OMAP2PLUS |
| 53 | select ARCH_HAS_OPP | ||
| 53 | select ARM_CPU_SUSPEND if PM | 54 | select ARM_CPU_SUSPEND if PM |
| 54 | select ARM_GIC | 55 | select ARM_GIC |
| 55 | select CPU_V7 | 56 | select CPU_V7 |
| 56 | select HAVE_ARM_SCU if SMP | 57 | select HAVE_ARM_SCU if SMP |
| 57 | select HAVE_ARM_TWD if LOCAL_TIMERS | 58 | select HAVE_ARM_TWD if SMP |
| 58 | select HAVE_SMP | 59 | select HAVE_SMP |
| 59 | select HAVE_ARM_ARCH_TIMER | 60 | select HAVE_ARM_ARCH_TIMER |
| 60 | select ARM_ERRATA_798181 if SMP | 61 | select ARM_ERRATA_798181 if SMP |
| @@ -63,6 +64,7 @@ config SOC_AM33XX | |||
| 63 | bool "TI AM33XX" | 64 | bool "TI AM33XX" |
| 64 | depends on ARCH_MULTI_V7 | 65 | depends on ARCH_MULTI_V7 |
| 65 | select ARCH_OMAP2PLUS | 66 | select ARCH_OMAP2PLUS |
| 67 | select ARCH_HAS_OPP | ||
| 66 | select ARM_CPU_SUSPEND if PM | 68 | select ARM_CPU_SUSPEND if PM |
| 67 | select CPU_V7 | 69 | select CPU_V7 |
| 68 | select MULTI_IRQ_HANDLER | 70 | select MULTI_IRQ_HANDLER |
| @@ -72,6 +74,7 @@ config SOC_AM43XX | |||
| 72 | depends on ARCH_MULTI_V7 | 74 | depends on ARCH_MULTI_V7 |
| 73 | select CPU_V7 | 75 | select CPU_V7 |
| 74 | select ARCH_OMAP2PLUS | 76 | select ARCH_OMAP2PLUS |
| 77 | select ARCH_HAS_OPP | ||
| 75 | select MULTI_IRQ_HANDLER | 78 | select MULTI_IRQ_HANDLER |
| 76 | select ARM_GIC | 79 | select ARM_GIC |
| 77 | select MACH_OMAP_GENERIC | 80 | select MACH_OMAP_GENERIC |
| @@ -80,6 +83,7 @@ config SOC_DRA7XX | |||
| 80 | bool "TI DRA7XX" | 83 | bool "TI DRA7XX" |
| 81 | depends on ARCH_MULTI_V7 | 84 | depends on ARCH_MULTI_V7 |
| 82 | select ARCH_OMAP2PLUS | 85 | select ARCH_OMAP2PLUS |
| 86 | select ARCH_HAS_OPP | ||
| 83 | select ARM_CPU_SUSPEND if PM | 87 | select ARM_CPU_SUSPEND if PM |
| 84 | select ARM_GIC | 88 | select ARM_GIC |
| 85 | select CPU_V7 | 89 | select CPU_V7 |
| @@ -268,9 +272,6 @@ config MACH_OMAP_3430SDP | |||
| 268 | default y | 272 | default y |
| 269 | select OMAP_PACKAGE_CBB | 273 | select OMAP_PACKAGE_CBB |
| 270 | 274 | ||
| 271 | config MACH_NOKIA_N800 | ||
| 272 | bool | ||
| 273 | |||
| 274 | config MACH_NOKIA_N810 | 275 | config MACH_NOKIA_N810 |
| 275 | bool | 276 | bool |
| 276 | 277 | ||
| @@ -281,7 +282,6 @@ config MACH_NOKIA_N8X0 | |||
| 281 | bool "Nokia N800/N810" | 282 | bool "Nokia N800/N810" |
| 282 | depends on SOC_OMAP2420 | 283 | depends on SOC_OMAP2420 |
| 283 | default y | 284 | default y |
| 284 | select MACH_NOKIA_N800 | ||
| 285 | select MACH_NOKIA_N810 | 285 | select MACH_NOKIA_N810 |
| 286 | select MACH_NOKIA_N810_WIMAX | 286 | select MACH_NOKIA_N810_WIMAX |
| 287 | select OMAP_PACKAGE_ZAC | 287 | select OMAP_PACKAGE_ZAC |
diff --git a/arch/arm/mach-omap2/gpmc.c b/arch/arm/mach-omap2/gpmc.c index d24926e6340f..ab43755364f5 100644 --- a/arch/arm/mach-omap2/gpmc.c +++ b/arch/arm/mach-omap2/gpmc.c | |||
| @@ -1339,7 +1339,7 @@ static void __maybe_unused gpmc_read_timings_dt(struct device_node *np, | |||
| 1339 | of_property_read_bool(np, "gpmc,time-para-granularity"); | 1339 | of_property_read_bool(np, "gpmc,time-para-granularity"); |
| 1340 | } | 1340 | } |
| 1341 | 1341 | ||
| 1342 | #ifdef CONFIG_MTD_NAND | 1342 | #if IS_ENABLED(CONFIG_MTD_NAND) |
| 1343 | 1343 | ||
| 1344 | static const char * const nand_xfer_types[] = { | 1344 | static const char * const nand_xfer_types[] = { |
| 1345 | [NAND_OMAP_PREFETCH_POLLED] = "prefetch-polled", | 1345 | [NAND_OMAP_PREFETCH_POLLED] = "prefetch-polled", |
| @@ -1429,7 +1429,7 @@ static int gpmc_probe_nand_child(struct platform_device *pdev, | |||
| 1429 | } | 1429 | } |
| 1430 | #endif | 1430 | #endif |
| 1431 | 1431 | ||
| 1432 | #ifdef CONFIG_MTD_ONENAND | 1432 | #if IS_ENABLED(CONFIG_MTD_ONENAND) |
| 1433 | static int gpmc_probe_onenand_child(struct platform_device *pdev, | 1433 | static int gpmc_probe_onenand_child(struct platform_device *pdev, |
| 1434 | struct device_node *child) | 1434 | struct device_node *child) |
| 1435 | { | 1435 | { |
diff --git a/arch/arm/mach-omap2/io.c b/arch/arm/mach-omap2/io.c index d408b15b4fbf..af432b191255 100644 --- a/arch/arm/mach-omap2/io.c +++ b/arch/arm/mach-omap2/io.c | |||
| @@ -179,15 +179,6 @@ static struct map_desc omap34xx_io_desc[] __initdata = { | |||
| 179 | .length = L4_EMU_34XX_SIZE, | 179 | .length = L4_EMU_34XX_SIZE, |
| 180 | .type = MT_DEVICE | 180 | .type = MT_DEVICE |
| 181 | }, | 181 | }, |
| 182 | #if defined(CONFIG_DEBUG_LL) && \ | ||
| 183 | (defined(CONFIG_MACH_OMAP_ZOOM2) || defined(CONFIG_MACH_OMAP_ZOOM3)) | ||
| 184 | { | ||
| 185 | .virtual = ZOOM_UART_VIRT, | ||
| 186 | .pfn = __phys_to_pfn(ZOOM_UART_BASE), | ||
| 187 | .length = SZ_1M, | ||
| 188 | .type = MT_DEVICE | ||
| 189 | }, | ||
| 190 | #endif | ||
| 191 | }; | 182 | }; |
| 192 | #endif | 183 | #endif |
| 193 | 184 | ||
diff --git a/arch/arm/mach-pxa/am300epd.c b/arch/arm/mach-pxa/am300epd.c index c9f309ae88c5..8b90c4f2d430 100644 --- a/arch/arm/mach-pxa/am300epd.c +++ b/arch/arm/mach-pxa/am300epd.c | |||
| @@ -30,6 +30,7 @@ | |||
| 30 | 30 | ||
| 31 | #include <mach/gumstix.h> | 31 | #include <mach/gumstix.h> |
| 32 | #include <mach/mfp-pxa25x.h> | 32 | #include <mach/mfp-pxa25x.h> |
| 33 | #include <mach/irqs.h> | ||
| 33 | #include <linux/platform_data/video-pxafb.h> | 34 | #include <linux/platform_data/video-pxafb.h> |
| 34 | 35 | ||
| 35 | #include "generic.h" | 36 | #include "generic.h" |
diff --git a/arch/arm/mach-pxa/include/mach/balloon3.h b/arch/arm/mach-pxa/include/mach/balloon3.h index 954641e6c8b1..1b0825911e62 100644 --- a/arch/arm/mach-pxa/include/mach/balloon3.h +++ b/arch/arm/mach-pxa/include/mach/balloon3.h | |||
| @@ -14,6 +14,8 @@ | |||
| 14 | #ifndef ASM_ARCH_BALLOON3_H | 14 | #ifndef ASM_ARCH_BALLOON3_H |
| 15 | #define ASM_ARCH_BALLOON3_H | 15 | #define ASM_ARCH_BALLOON3_H |
| 16 | 16 | ||
| 17 | #include "irqs.h" /* PXA_NR_BUILTIN_GPIO */ | ||
| 18 | |||
| 17 | enum balloon3_features { | 19 | enum balloon3_features { |
| 18 | BALLOON3_FEATURE_OHCI, | 20 | BALLOON3_FEATURE_OHCI, |
| 19 | BALLOON3_FEATURE_MMC, | 21 | BALLOON3_FEATURE_MMC, |
diff --git a/arch/arm/mach-pxa/include/mach/corgi.h b/arch/arm/mach-pxa/include/mach/corgi.h index f3c3493b468d..c030d955bbd7 100644 --- a/arch/arm/mach-pxa/include/mach/corgi.h +++ b/arch/arm/mach-pxa/include/mach/corgi.h | |||
| @@ -13,6 +13,7 @@ | |||
| 13 | #ifndef __ASM_ARCH_CORGI_H | 13 | #ifndef __ASM_ARCH_CORGI_H |
| 14 | #define __ASM_ARCH_CORGI_H 1 | 14 | #define __ASM_ARCH_CORGI_H 1 |
| 15 | 15 | ||
| 16 | #include "irqs.h" /* PXA_NR_BUILTIN_GPIO */ | ||
| 16 | 17 | ||
| 17 | /* | 18 | /* |
| 18 | * Corgi (Non Standard) GPIO Definitions | 19 | * Corgi (Non Standard) GPIO Definitions |
diff --git a/arch/arm/mach-pxa/include/mach/csb726.h b/arch/arm/mach-pxa/include/mach/csb726.h index 2628e7b72116..00cfbbbf73f7 100644 --- a/arch/arm/mach-pxa/include/mach/csb726.h +++ b/arch/arm/mach-pxa/include/mach/csb726.h | |||
| @@ -11,6 +11,8 @@ | |||
| 11 | #ifndef CSB726_H | 11 | #ifndef CSB726_H |
| 12 | #define CSB726_H | 12 | #define CSB726_H |
| 13 | 13 | ||
| 14 | #include "irqs.h" /* PXA_GPIO_TO_IRQ */ | ||
| 15 | |||
| 14 | #define CSB726_GPIO_IRQ_LAN 52 | 16 | #define CSB726_GPIO_IRQ_LAN 52 |
| 15 | #define CSB726_GPIO_IRQ_SM501 53 | 17 | #define CSB726_GPIO_IRQ_SM501 53 |
| 16 | #define CSB726_GPIO_MMC_DETECT 100 | 18 | #define CSB726_GPIO_MMC_DETECT 100 |
diff --git a/arch/arm/mach-pxa/include/mach/gumstix.h b/arch/arm/mach-pxa/include/mach/gumstix.h index dba14b6503ad..f7df27bbb42e 100644 --- a/arch/arm/mach-pxa/include/mach/gumstix.h +++ b/arch/arm/mach-pxa/include/mach/gumstix.h | |||
| @@ -6,6 +6,7 @@ | |||
| 6 | * published by the Free Software Foundation. | 6 | * published by the Free Software Foundation. |
| 7 | */ | 7 | */ |
| 8 | 8 | ||
| 9 | #include "irqs.h" /* PXA_GPIO_TO_IRQ */ | ||
| 9 | 10 | ||
| 10 | /* BTRESET - Reset line to Bluetooth module, active low signal. */ | 11 | /* BTRESET - Reset line to Bluetooth module, active low signal. */ |
| 11 | #define GPIO_GUMSTIX_BTRESET 7 | 12 | #define GPIO_GUMSTIX_BTRESET 7 |
diff --git a/arch/arm/mach-pxa/include/mach/idp.h b/arch/arm/mach-pxa/include/mach/idp.h index 22a96f87232b..7e63f4680271 100644 --- a/arch/arm/mach-pxa/include/mach/idp.h +++ b/arch/arm/mach-pxa/include/mach/idp.h | |||
| @@ -23,6 +23,7 @@ | |||
| 23 | * IDP hardware. | 23 | * IDP hardware. |
| 24 | */ | 24 | */ |
| 25 | 25 | ||
| 26 | #include "irqs.h" /* PXA_GPIO_TO_IRQ */ | ||
| 26 | 27 | ||
| 27 | #define IDP_FLASH_PHYS (PXA_CS0_PHYS) | 28 | #define IDP_FLASH_PHYS (PXA_CS0_PHYS) |
| 28 | #define IDP_ALT_FLASH_PHYS (PXA_CS1_PHYS) | 29 | #define IDP_ALT_FLASH_PHYS (PXA_CS1_PHYS) |
diff --git a/arch/arm/mach-pxa/include/mach/palmld.h b/arch/arm/mach-pxa/include/mach/palmld.h index 2c4471336570..b184f296023b 100644 --- a/arch/arm/mach-pxa/include/mach/palmld.h +++ b/arch/arm/mach-pxa/include/mach/palmld.h | |||
| @@ -13,6 +13,8 @@ | |||
| 13 | #ifndef _INCLUDE_PALMLD_H_ | 13 | #ifndef _INCLUDE_PALMLD_H_ |
| 14 | #define _INCLUDE_PALMLD_H_ | 14 | #define _INCLUDE_PALMLD_H_ |
| 15 | 15 | ||
| 16 | #include "irqs.h" /* PXA_GPIO_TO_IRQ */ | ||
| 17 | |||
| 16 | /** HERE ARE GPIOs **/ | 18 | /** HERE ARE GPIOs **/ |
| 17 | 19 | ||
| 18 | /* GPIOs */ | 20 | /* GPIOs */ |
diff --git a/arch/arm/mach-pxa/include/mach/palmt5.h b/arch/arm/mach-pxa/include/mach/palmt5.h index 0bd4f036c72f..e342c5921405 100644 --- a/arch/arm/mach-pxa/include/mach/palmt5.h +++ b/arch/arm/mach-pxa/include/mach/palmt5.h | |||
| @@ -15,6 +15,8 @@ | |||
| 15 | #ifndef _INCLUDE_PALMT5_H_ | 15 | #ifndef _INCLUDE_PALMT5_H_ |
| 16 | #define _INCLUDE_PALMT5_H_ | 16 | #define _INCLUDE_PALMT5_H_ |
| 17 | 17 | ||
| 18 | #include "irqs.h" /* PXA_GPIO_TO_IRQ */ | ||
| 19 | |||
| 18 | /** HERE ARE GPIOs **/ | 20 | /** HERE ARE GPIOs **/ |
| 19 | 21 | ||
| 20 | /* GPIOs */ | 22 | /* GPIOs */ |
diff --git a/arch/arm/mach-pxa/include/mach/palmtc.h b/arch/arm/mach-pxa/include/mach/palmtc.h index c383a21680b6..81c727b3cfd2 100644 --- a/arch/arm/mach-pxa/include/mach/palmtc.h +++ b/arch/arm/mach-pxa/include/mach/palmtc.h | |||
| @@ -16,6 +16,8 @@ | |||
| 16 | #ifndef _INCLUDE_PALMTC_H_ | 16 | #ifndef _INCLUDE_PALMTC_H_ |
| 17 | #define _INCLUDE_PALMTC_H_ | 17 | #define _INCLUDE_PALMTC_H_ |
| 18 | 18 | ||
| 19 | #include "irqs.h" /* PXA_GPIO_TO_IRQ */ | ||
| 20 | |||
| 19 | /** HERE ARE GPIOs **/ | 21 | /** HERE ARE GPIOs **/ |
| 20 | 22 | ||
| 21 | /* GPIOs */ | 23 | /* GPIOs */ |
diff --git a/arch/arm/mach-pxa/include/mach/palmtx.h b/arch/arm/mach-pxa/include/mach/palmtx.h index f2e530380253..92bc1f05300d 100644 --- a/arch/arm/mach-pxa/include/mach/palmtx.h +++ b/arch/arm/mach-pxa/include/mach/palmtx.h | |||
| @@ -16,6 +16,8 @@ | |||
| 16 | #ifndef _INCLUDE_PALMTX_H_ | 16 | #ifndef _INCLUDE_PALMTX_H_ |
| 17 | #define _INCLUDE_PALMTX_H_ | 17 | #define _INCLUDE_PALMTX_H_ |
| 18 | 18 | ||
| 19 | #include "irqs.h" /* PXA_GPIO_TO_IRQ */ | ||
| 20 | |||
| 19 | /** HERE ARE GPIOs **/ | 21 | /** HERE ARE GPIOs **/ |
| 20 | 22 | ||
| 21 | /* GPIOs */ | 23 | /* GPIOs */ |
diff --git a/arch/arm/mach-pxa/include/mach/pcm027.h b/arch/arm/mach-pxa/include/mach/pcm027.h index 6bf28de228bd..86ebd7b6c960 100644 --- a/arch/arm/mach-pxa/include/mach/pcm027.h +++ b/arch/arm/mach-pxa/include/mach/pcm027.h | |||
| @@ -23,6 +23,8 @@ | |||
| 23 | * Definitions of CPU card resources only | 23 | * Definitions of CPU card resources only |
| 24 | */ | 24 | */ |
| 25 | 25 | ||
| 26 | #include "irqs.h" /* PXA_GPIO_TO_IRQ */ | ||
| 27 | |||
| 26 | /* phyCORE-PXA270 (PCM027) Interrupts */ | 28 | /* phyCORE-PXA270 (PCM027) Interrupts */ |
| 27 | #define PCM027_IRQ(x) (IRQ_BOARD_START + (x)) | 29 | #define PCM027_IRQ(x) (IRQ_BOARD_START + (x)) |
| 28 | #define PCM027_BTDET_IRQ PCM027_IRQ(0) | 30 | #define PCM027_BTDET_IRQ PCM027_IRQ(0) |
diff --git a/arch/arm/mach-pxa/include/mach/pcm990_baseboard.h b/arch/arm/mach-pxa/include/mach/pcm990_baseboard.h index 0260aaa2fc17..7e544c14967e 100644 --- a/arch/arm/mach-pxa/include/mach/pcm990_baseboard.h +++ b/arch/arm/mach-pxa/include/mach/pcm990_baseboard.h | |||
| @@ -20,6 +20,7 @@ | |||
| 20 | */ | 20 | */ |
| 21 | 21 | ||
| 22 | #include <mach/pcm027.h> | 22 | #include <mach/pcm027.h> |
| 23 | #include "irqs.h" /* PXA_GPIO_TO_IRQ */ | ||
| 23 | 24 | ||
| 24 | /* | 25 | /* |
| 25 | * definitions relevant only when the PCM-990 | 26 | * definitions relevant only when the PCM-990 |
diff --git a/arch/arm/mach-pxa/include/mach/poodle.h b/arch/arm/mach-pxa/include/mach/poodle.h index f32ff75dcca8..b56b19351a03 100644 --- a/arch/arm/mach-pxa/include/mach/poodle.h +++ b/arch/arm/mach-pxa/include/mach/poodle.h | |||
| @@ -15,6 +15,8 @@ | |||
| 15 | #ifndef __ASM_ARCH_POODLE_H | 15 | #ifndef __ASM_ARCH_POODLE_H |
| 16 | #define __ASM_ARCH_POODLE_H 1 | 16 | #define __ASM_ARCH_POODLE_H 1 |
| 17 | 17 | ||
| 18 | #include "irqs.h" /* PXA_GPIO_TO_IRQ */ | ||
| 19 | |||
| 18 | /* | 20 | /* |
| 19 | * GPIOs | 21 | * GPIOs |
| 20 | */ | 22 | */ |
diff --git a/arch/arm/mach-pxa/include/mach/spitz.h b/arch/arm/mach-pxa/include/mach/spitz.h index 0bfe6507c95d..25c9f62e46aa 100644 --- a/arch/arm/mach-pxa/include/mach/spitz.h +++ b/arch/arm/mach-pxa/include/mach/spitz.h | |||
| @@ -15,8 +15,8 @@ | |||
| 15 | #define __ASM_ARCH_SPITZ_H 1 | 15 | #define __ASM_ARCH_SPITZ_H 1 |
| 16 | #endif | 16 | #endif |
| 17 | 17 | ||
| 18 | #include "irqs.h" /* PXA_NR_BUILTIN_GPIO, PXA_GPIO_TO_IRQ */ | ||
| 18 | #include <linux/fb.h> | 19 | #include <linux/fb.h> |
| 19 | #include <linux/gpio.h> | ||
| 20 | 20 | ||
| 21 | /* Spitz/Akita GPIOs */ | 21 | /* Spitz/Akita GPIOs */ |
| 22 | 22 | ||
diff --git a/arch/arm/mach-pxa/include/mach/tosa.h b/arch/arm/mach-pxa/include/mach/tosa.h index 2bb0e862598c..0497d95cef25 100644 --- a/arch/arm/mach-pxa/include/mach/tosa.h +++ b/arch/arm/mach-pxa/include/mach/tosa.h | |||
| @@ -13,6 +13,8 @@ | |||
| 13 | #ifndef _ASM_ARCH_TOSA_H_ | 13 | #ifndef _ASM_ARCH_TOSA_H_ |
| 14 | #define _ASM_ARCH_TOSA_H_ 1 | 14 | #define _ASM_ARCH_TOSA_H_ 1 |
| 15 | 15 | ||
| 16 | #include "irqs.h" /* PXA_NR_BUILTIN_GPIO */ | ||
| 17 | |||
| 16 | /* TOSA Chip selects */ | 18 | /* TOSA Chip selects */ |
| 17 | #define TOSA_LCDC_PHYS PXA_CS4_PHYS | 19 | #define TOSA_LCDC_PHYS PXA_CS4_PHYS |
| 18 | /* Internel Scoop */ | 20 | /* Internel Scoop */ |
diff --git a/arch/arm/mach-pxa/include/mach/trizeps4.h b/arch/arm/mach-pxa/include/mach/trizeps4.h index d2ca01053f69..ae3ca013afab 100644 --- a/arch/arm/mach-pxa/include/mach/trizeps4.h +++ b/arch/arm/mach-pxa/include/mach/trizeps4.h | |||
| @@ -10,6 +10,8 @@ | |||
| 10 | #ifndef _TRIPEPS4_H_ | 10 | #ifndef _TRIPEPS4_H_ |
| 11 | #define _TRIPEPS4_H_ | 11 | #define _TRIPEPS4_H_ |
| 12 | 12 | ||
| 13 | #include "irqs.h" /* PXA_GPIO_TO_IRQ */ | ||
| 14 | |||
| 13 | /* physical memory regions */ | 15 | /* physical memory regions */ |
| 14 | #define TRIZEPS4_FLASH_PHYS (PXA_CS0_PHYS) /* Flash region */ | 16 | #define TRIZEPS4_FLASH_PHYS (PXA_CS0_PHYS) /* Flash region */ |
| 15 | #define TRIZEPS4_DISK_PHYS (PXA_CS1_PHYS) /* Disk On Chip region */ | 17 | #define TRIZEPS4_DISK_PHYS (PXA_CS1_PHYS) /* Disk On Chip region */ |
diff --git a/arch/arm/mach-pxa/mioa701.c b/arch/arm/mach-pxa/mioa701.c index f70583fee59f..29997bde277d 100644 --- a/arch/arm/mach-pxa/mioa701.c +++ b/arch/arm/mach-pxa/mioa701.c | |||
| @@ -38,6 +38,7 @@ | |||
| 38 | #include <linux/mtd/physmap.h> | 38 | #include <linux/mtd/physmap.h> |
| 39 | #include <linux/usb/gpio_vbus.h> | 39 | #include <linux/usb/gpio_vbus.h> |
| 40 | #include <linux/reboot.h> | 40 | #include <linux/reboot.h> |
| 41 | #include <linux/regulator/fixed.h> | ||
| 41 | #include <linux/regulator/max1586.h> | 42 | #include <linux/regulator/max1586.h> |
| 42 | #include <linux/slab.h> | 43 | #include <linux/slab.h> |
| 43 | #include <linux/i2c/pxa-i2c.h> | 44 | #include <linux/i2c/pxa-i2c.h> |
| @@ -714,6 +715,10 @@ static struct gpio global_gpios[] = { | |||
| 714 | { GPIO56_MT9M111_nOE, GPIOF_OUT_INIT_LOW, "Camera nOE" }, | 715 | { GPIO56_MT9M111_nOE, GPIOF_OUT_INIT_LOW, "Camera nOE" }, |
| 715 | }; | 716 | }; |
| 716 | 717 | ||
| 718 | static struct regulator_consumer_supply fixed_5v0_consumers[] = { | ||
| 719 | REGULATOR_SUPPLY("power", "pwm-backlight"), | ||
| 720 | }; | ||
| 721 | |||
| 717 | static void __init mioa701_machine_init(void) | 722 | static void __init mioa701_machine_init(void) |
| 718 | { | 723 | { |
| 719 | int rc; | 724 | int rc; |
| @@ -753,6 +758,10 @@ static void __init mioa701_machine_init(void) | |||
| 753 | pxa_set_i2c_info(&i2c_pdata); | 758 | pxa_set_i2c_info(&i2c_pdata); |
| 754 | pxa27x_set_i2c_power_info(NULL); | 759 | pxa27x_set_i2c_power_info(NULL); |
| 755 | pxa_set_camera_info(&mioa701_pxacamera_platform_data); | 760 | pxa_set_camera_info(&mioa701_pxacamera_platform_data); |
| 761 | |||
| 762 | regulator_register_always_on(0, "fixed-5.0V", fixed_5v0_consumers, | ||
| 763 | ARRAY_SIZE(fixed_5v0_consumers), | ||
| 764 | 5000000); | ||
| 756 | } | 765 | } |
| 757 | 766 | ||
| 758 | static void mioa701_machine_exit(void) | 767 | static void mioa701_machine_exit(void) |
diff --git a/arch/arm/mach-shmobile/Kconfig b/arch/arm/mach-shmobile/Kconfig index 338640631e08..05fa505df585 100644 --- a/arch/arm/mach-shmobile/Kconfig +++ b/arch/arm/mach-shmobile/Kconfig | |||
| @@ -8,7 +8,7 @@ config ARCH_SHMOBILE_MULTI | |||
| 8 | select CPU_V7 | 8 | select CPU_V7 |
| 9 | select GENERIC_CLOCKEVENTS | 9 | select GENERIC_CLOCKEVENTS |
| 10 | select HAVE_ARM_SCU if SMP | 10 | select HAVE_ARM_SCU if SMP |
| 11 | select HAVE_ARM_TWD if LOCAL_TIMERS | 11 | select HAVE_ARM_TWD if SMP |
| 12 | select HAVE_SMP | 12 | select HAVE_SMP |
| 13 | select ARM_GIC | 13 | select ARM_GIC |
| 14 | select MIGHT_HAVE_CACHE_L2X0 | 14 | select MIGHT_HAVE_CACHE_L2X0 |
diff --git a/arch/arm/mach-tegra/pm.c b/arch/arm/mach-tegra/pm.c index 4ae0286b468d..f55b05a29b55 100644 --- a/arch/arm/mach-tegra/pm.c +++ b/arch/arm/mach-tegra/pm.c | |||
| @@ -24,6 +24,7 @@ | |||
| 24 | #include <linux/cpu_pm.h> | 24 | #include <linux/cpu_pm.h> |
| 25 | #include <linux/suspend.h> | 25 | #include <linux/suspend.h> |
| 26 | #include <linux/err.h> | 26 | #include <linux/err.h> |
| 27 | #include <linux/slab.h> | ||
| 27 | #include <linux/clk/tegra.h> | 28 | #include <linux/clk/tegra.h> |
| 28 | 29 | ||
| 29 | #include <asm/smp_plat.h> | 30 | #include <asm/smp_plat.h> |
diff --git a/arch/arm/mach-tegra/tegra.c b/arch/arm/mach-tegra/tegra.c index 303a285d80fd..6191603379e1 100644 --- a/arch/arm/mach-tegra/tegra.c +++ b/arch/arm/mach-tegra/tegra.c | |||
| @@ -73,10 +73,20 @@ u32 tegra_uart_config[3] = { | |||
| 73 | static void __init tegra_init_cache(void) | 73 | static void __init tegra_init_cache(void) |
| 74 | { | 74 | { |
| 75 | #ifdef CONFIG_CACHE_L2X0 | 75 | #ifdef CONFIG_CACHE_L2X0 |
| 76 | static const struct of_device_id pl310_ids[] __initconst = { | ||
| 77 | { .compatible = "arm,pl310-cache", }, | ||
| 78 | {} | ||
| 79 | }; | ||
| 80 | |||
| 81 | struct device_node *np; | ||
| 76 | int ret; | 82 | int ret; |
| 77 | void __iomem *p = IO_ADDRESS(TEGRA_ARM_PERIF_BASE) + 0x3000; | 83 | void __iomem *p = IO_ADDRESS(TEGRA_ARM_PERIF_BASE) + 0x3000; |
| 78 | u32 aux_ctrl, cache_type; | 84 | u32 aux_ctrl, cache_type; |
| 79 | 85 | ||
| 86 | np = of_find_matching_node(NULL, pl310_ids); | ||
| 87 | if (!np) | ||
| 88 | return; | ||
| 89 | |||
| 80 | cache_type = readl(p + L2X0_CACHE_TYPE); | 90 | cache_type = readl(p + L2X0_CACHE_TYPE); |
| 81 | aux_ctrl = (cache_type & 0x700) << (17-8); | 91 | aux_ctrl = (cache_type & 0x700) << (17-8); |
| 82 | aux_ctrl |= 0x7C400001; | 92 | aux_ctrl |= 0x7C400001; |
diff --git a/arch/arm/mach-zynq/common.c b/arch/arm/mach-zynq/common.c index 1db2a5ca9ab8..8c09a8393fb6 100644 --- a/arch/arm/mach-zynq/common.c +++ b/arch/arm/mach-zynq/common.c | |||
| @@ -25,6 +25,7 @@ | |||
| 25 | #include <linux/of_irq.h> | 25 | #include <linux/of_irq.h> |
| 26 | #include <linux/of_platform.h> | 26 | #include <linux/of_platform.h> |
| 27 | #include <linux/of.h> | 27 | #include <linux/of.h> |
| 28 | #include <linux/memblock.h> | ||
| 28 | #include <linux/irqchip.h> | 29 | #include <linux/irqchip.h> |
| 29 | #include <linux/irqchip/arm-gic.h> | 30 | #include <linux/irqchip/arm-gic.h> |
| 30 | 31 | ||
| @@ -41,6 +42,18 @@ | |||
| 41 | 42 | ||
| 42 | void __iomem *zynq_scu_base; | 43 | void __iomem *zynq_scu_base; |
| 43 | 44 | ||
| 45 | /** | ||
| 46 | * zynq_memory_init - Initialize special memory | ||
| 47 | * | ||
| 48 | * We need to stop things allocating the low memory as DMA can't work in | ||
| 49 | * the 1st 512K of memory. | ||
| 50 | */ | ||
| 51 | static void __init zynq_memory_init(void) | ||
| 52 | { | ||
| 53 | if (!__pa(PAGE_OFFSET)) | ||
| 54 | memblock_reserve(__pa(PAGE_OFFSET), __pa(swapper_pg_dir)); | ||
| 55 | } | ||
| 56 | |||
| 44 | static struct platform_device zynq_cpuidle_device = { | 57 | static struct platform_device zynq_cpuidle_device = { |
| 45 | .name = "cpuidle-zynq", | 58 | .name = "cpuidle-zynq", |
| 46 | }; | 59 | }; |
| @@ -117,5 +130,6 @@ DT_MACHINE_START(XILINX_EP107, "Xilinx Zynq Platform") | |||
| 117 | .init_machine = zynq_init_machine, | 130 | .init_machine = zynq_init_machine, |
| 118 | .init_time = zynq_timer_init, | 131 | .init_time = zynq_timer_init, |
| 119 | .dt_compat = zynq_dt_match, | 132 | .dt_compat = zynq_dt_match, |
| 133 | .reserve = zynq_memory_init, | ||
| 120 | .restart = zynq_system_reset, | 134 | .restart = zynq_system_reset, |
| 121 | MACHINE_END | 135 | MACHINE_END |
diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index 1a77450e728a..11b3914660d2 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c | |||
| @@ -1358,7 +1358,7 @@ static void *arm_iommu_alloc_attrs(struct device *dev, size_t size, | |||
| 1358 | *handle = DMA_ERROR_CODE; | 1358 | *handle = DMA_ERROR_CODE; |
| 1359 | size = PAGE_ALIGN(size); | 1359 | size = PAGE_ALIGN(size); |
| 1360 | 1360 | ||
| 1361 | if (gfp & GFP_ATOMIC) | 1361 | if (!(gfp & __GFP_WAIT)) |
| 1362 | return __iommu_alloc_atomic(dev, size, handle); | 1362 | return __iommu_alloc_atomic(dev, size, handle); |
| 1363 | 1363 | ||
| 1364 | /* | 1364 | /* |
diff --git a/arch/arm/mm/mm.h b/arch/arm/mm/mm.h index d5a982d15a88..7ea641b7aa7d 100644 --- a/arch/arm/mm/mm.h +++ b/arch/arm/mm/mm.h | |||
| @@ -38,6 +38,7 @@ static inline pmd_t *pmd_off_k(unsigned long virt) | |||
| 38 | 38 | ||
| 39 | struct mem_type { | 39 | struct mem_type { |
| 40 | pteval_t prot_pte; | 40 | pteval_t prot_pte; |
| 41 | pteval_t prot_pte_s2; | ||
| 41 | pmdval_t prot_l1; | 42 | pmdval_t prot_l1; |
| 42 | pmdval_t prot_sect; | 43 | pmdval_t prot_sect; |
| 43 | unsigned int domain; | 44 | unsigned int domain; |
diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c index 4f08c133cc25..a623cb3ad012 100644 --- a/arch/arm/mm/mmu.c +++ b/arch/arm/mm/mmu.c | |||
| @@ -232,12 +232,16 @@ __setup("noalign", noalign_setup); | |||
| 232 | #endif /* ifdef CONFIG_CPU_CP15 / else */ | 232 | #endif /* ifdef CONFIG_CPU_CP15 / else */ |
| 233 | 233 | ||
| 234 | #define PROT_PTE_DEVICE L_PTE_PRESENT|L_PTE_YOUNG|L_PTE_DIRTY|L_PTE_XN | 234 | #define PROT_PTE_DEVICE L_PTE_PRESENT|L_PTE_YOUNG|L_PTE_DIRTY|L_PTE_XN |
| 235 | #define PROT_PTE_S2_DEVICE PROT_PTE_DEVICE | ||
| 235 | #define PROT_SECT_DEVICE PMD_TYPE_SECT|PMD_SECT_AP_WRITE | 236 | #define PROT_SECT_DEVICE PMD_TYPE_SECT|PMD_SECT_AP_WRITE |
| 236 | 237 | ||
| 237 | static struct mem_type mem_types[] = { | 238 | static struct mem_type mem_types[] = { |
| 238 | [MT_DEVICE] = { /* Strongly ordered / ARMv6 shared device */ | 239 | [MT_DEVICE] = { /* Strongly ordered / ARMv6 shared device */ |
| 239 | .prot_pte = PROT_PTE_DEVICE | L_PTE_MT_DEV_SHARED | | 240 | .prot_pte = PROT_PTE_DEVICE | L_PTE_MT_DEV_SHARED | |
| 240 | L_PTE_SHARED, | 241 | L_PTE_SHARED, |
| 242 | .prot_pte_s2 = s2_policy(PROT_PTE_S2_DEVICE) | | ||
| 243 | s2_policy(L_PTE_S2_MT_DEV_SHARED) | | ||
| 244 | L_PTE_SHARED, | ||
| 241 | .prot_l1 = PMD_TYPE_TABLE, | 245 | .prot_l1 = PMD_TYPE_TABLE, |
| 242 | .prot_sect = PROT_SECT_DEVICE | PMD_SECT_S, | 246 | .prot_sect = PROT_SECT_DEVICE | PMD_SECT_S, |
| 243 | .domain = DOMAIN_IO, | 247 | .domain = DOMAIN_IO, |
| @@ -508,7 +512,8 @@ static void __init build_mem_type_table(void) | |||
| 508 | cp = &cache_policies[cachepolicy]; | 512 | cp = &cache_policies[cachepolicy]; |
| 509 | vecs_pgprot = kern_pgprot = user_pgprot = cp->pte; | 513 | vecs_pgprot = kern_pgprot = user_pgprot = cp->pte; |
| 510 | s2_pgprot = cp->pte_s2; | 514 | s2_pgprot = cp->pte_s2; |
| 511 | hyp_device_pgprot = s2_device_pgprot = mem_types[MT_DEVICE].prot_pte; | 515 | hyp_device_pgprot = mem_types[MT_DEVICE].prot_pte; |
| 516 | s2_device_pgprot = mem_types[MT_DEVICE].prot_pte_s2; | ||
| 512 | 517 | ||
| 513 | /* | 518 | /* |
| 514 | * ARMv6 and above have extended page tables. | 519 | * ARMv6 and above have extended page tables. |
diff --git a/arch/arm/mm/proc-v6.S b/arch/arm/mm/proc-v6.S index 45dc29f85d56..32b3558321c4 100644 --- a/arch/arm/mm/proc-v6.S +++ b/arch/arm/mm/proc-v6.S | |||
| @@ -208,7 +208,6 @@ __v6_setup: | |||
| 208 | mcr p15, 0, r0, c7, c14, 0 @ clean+invalidate D cache | 208 | mcr p15, 0, r0, c7, c14, 0 @ clean+invalidate D cache |
| 209 | mcr p15, 0, r0, c7, c5, 0 @ invalidate I cache | 209 | mcr p15, 0, r0, c7, c5, 0 @ invalidate I cache |
| 210 | mcr p15, 0, r0, c7, c15, 0 @ clean+invalidate cache | 210 | mcr p15, 0, r0, c7, c15, 0 @ clean+invalidate cache |
| 211 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer | ||
| 212 | #ifdef CONFIG_MMU | 211 | #ifdef CONFIG_MMU |
| 213 | mcr p15, 0, r0, c8, c7, 0 @ invalidate I + D TLBs | 212 | mcr p15, 0, r0, c8, c7, 0 @ invalidate I + D TLBs |
| 214 | mcr p15, 0, r0, c2, c0, 2 @ TTB control register | 213 | mcr p15, 0, r0, c2, c0, 2 @ TTB control register |
| @@ -218,6 +217,8 @@ __v6_setup: | |||
| 218 | ALT_UP(orr r8, r8, #TTB_FLAGS_UP) | 217 | ALT_UP(orr r8, r8, #TTB_FLAGS_UP) |
| 219 | mcr p15, 0, r8, c2, c0, 1 @ load TTB1 | 218 | mcr p15, 0, r8, c2, c0, 1 @ load TTB1 |
| 220 | #endif /* CONFIG_MMU */ | 219 | #endif /* CONFIG_MMU */ |
| 220 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer and | ||
| 221 | @ complete invalidations | ||
| 221 | adr r5, v6_crval | 222 | adr r5, v6_crval |
| 222 | ldmia r5, {r5, r6} | 223 | ldmia r5, {r5, r6} |
| 223 | ARM_BE8(orr r6, r6, #1 << 25) @ big-endian page tables | 224 | ARM_BE8(orr r6, r6, #1 << 25) @ big-endian page tables |
diff --git a/arch/arm/mm/proc-v7.S b/arch/arm/mm/proc-v7.S index bd1781979a39..74f6033e76dd 100644 --- a/arch/arm/mm/proc-v7.S +++ b/arch/arm/mm/proc-v7.S | |||
| @@ -351,7 +351,6 @@ __v7_setup: | |||
| 351 | 351 | ||
| 352 | 4: mov r10, #0 | 352 | 4: mov r10, #0 |
| 353 | mcr p15, 0, r10, c7, c5, 0 @ I+BTB cache invalidate | 353 | mcr p15, 0, r10, c7, c5, 0 @ I+BTB cache invalidate |
| 354 | dsb | ||
| 355 | #ifdef CONFIG_MMU | 354 | #ifdef CONFIG_MMU |
| 356 | mcr p15, 0, r10, c8, c7, 0 @ invalidate I + D TLBs | 355 | mcr p15, 0, r10, c8, c7, 0 @ invalidate I + D TLBs |
| 357 | v7_ttb_setup r10, r4, r8, r5 @ TTBCR, TTBRx setup | 356 | v7_ttb_setup r10, r4, r8, r5 @ TTBCR, TTBRx setup |
| @@ -360,6 +359,7 @@ __v7_setup: | |||
| 360 | mcr p15, 0, r5, c10, c2, 0 @ write PRRR | 359 | mcr p15, 0, r5, c10, c2, 0 @ write PRRR |
| 361 | mcr p15, 0, r6, c10, c2, 1 @ write NMRR | 360 | mcr p15, 0, r6, c10, c2, 1 @ write NMRR |
| 362 | #endif | 361 | #endif |
| 362 | dsb @ Complete invalidations | ||
| 363 | #ifndef CONFIG_ARM_THUMBEE | 363 | #ifndef CONFIG_ARM_THUMBEE |
| 364 | mrc p15, 0, r0, c0, c1, 0 @ read ID_PFR0 for ThumbEE | 364 | mrc p15, 0, r0, c0, c1, 0 @ read ID_PFR0 for ThumbEE |
| 365 | and r0, r0, #(0xf << 12) @ ThumbEE enabled field | 365 | and r0, r0, #(0xf << 12) @ ThumbEE enabled field |
diff --git a/arch/arm64/include/uapi/asm/kvm.h b/arch/arm64/include/uapi/asm/kvm.h index 495ab6f84a61..eaf54a30bedc 100644 --- a/arch/arm64/include/uapi/asm/kvm.h +++ b/arch/arm64/include/uapi/asm/kvm.h | |||
| @@ -148,6 +148,15 @@ struct kvm_arch_memory_slot { | |||
| 148 | #define KVM_REG_ARM_TIMER_CNT ARM64_SYS_REG(3, 3, 14, 3, 2) | 148 | #define KVM_REG_ARM_TIMER_CNT ARM64_SYS_REG(3, 3, 14, 3, 2) |
| 149 | #define KVM_REG_ARM_TIMER_CVAL ARM64_SYS_REG(3, 3, 14, 0, 2) | 149 | #define KVM_REG_ARM_TIMER_CVAL ARM64_SYS_REG(3, 3, 14, 0, 2) |
| 150 | 150 | ||
| 151 | /* Device Control API: ARM VGIC */ | ||
| 152 | #define KVM_DEV_ARM_VGIC_GRP_ADDR 0 | ||
| 153 | #define KVM_DEV_ARM_VGIC_GRP_DIST_REGS 1 | ||
| 154 | #define KVM_DEV_ARM_VGIC_GRP_CPU_REGS 2 | ||
| 155 | #define KVM_DEV_ARM_VGIC_CPUID_SHIFT 32 | ||
| 156 | #define KVM_DEV_ARM_VGIC_CPUID_MASK (0xffULL << KVM_DEV_ARM_VGIC_CPUID_SHIFT) | ||
| 157 | #define KVM_DEV_ARM_VGIC_OFFSET_SHIFT 0 | ||
| 158 | #define KVM_DEV_ARM_VGIC_OFFSET_MASK (0xffffffffULL << KVM_DEV_ARM_VGIC_OFFSET_SHIFT) | ||
| 159 | |||
| 151 | /* KVM_IRQ_LINE irq field index values */ | 160 | /* KVM_IRQ_LINE irq field index values */ |
| 152 | #define KVM_ARM_IRQ_TYPE_SHIFT 24 | 161 | #define KVM_ARM_IRQ_TYPE_SHIFT 24 |
| 153 | #define KVM_ARM_IRQ_TYPE_MASK 0xff | 162 | #define KVM_ARM_IRQ_TYPE_MASK 0xff |
diff --git a/arch/avr32/Makefile b/arch/avr32/Makefile index 22fb66590dcd..dba48a5d5bb9 100644 --- a/arch/avr32/Makefile +++ b/arch/avr32/Makefile | |||
| @@ -11,7 +11,7 @@ all: uImage vmlinux.elf | |||
| 11 | 11 | ||
| 12 | KBUILD_DEFCONFIG := atstk1002_defconfig | 12 | KBUILD_DEFCONFIG := atstk1002_defconfig |
| 13 | 13 | ||
| 14 | KBUILD_CFLAGS += -pipe -fno-builtin -mno-pic | 14 | KBUILD_CFLAGS += -pipe -fno-builtin -mno-pic -D__linux__ |
| 15 | KBUILD_AFLAGS += -mrelax -mno-pic | 15 | KBUILD_AFLAGS += -mrelax -mno-pic |
| 16 | KBUILD_CFLAGS_MODULE += -mno-relax | 16 | KBUILD_CFLAGS_MODULE += -mno-relax |
| 17 | LDFLAGS_vmlinux += --relax | 17 | LDFLAGS_vmlinux += --relax |
diff --git a/arch/avr32/boards/mimc200/fram.c b/arch/avr32/boards/mimc200/fram.c index 9764a1a1073e..c1466a872b9c 100644 --- a/arch/avr32/boards/mimc200/fram.c +++ b/arch/avr32/boards/mimc200/fram.c | |||
| @@ -11,6 +11,7 @@ | |||
| 11 | #define FRAM_VERSION "1.0" | 11 | #define FRAM_VERSION "1.0" |
| 12 | 12 | ||
| 13 | #include <linux/miscdevice.h> | 13 | #include <linux/miscdevice.h> |
| 14 | #include <linux/module.h> | ||
| 14 | #include <linux/proc_fs.h> | 15 | #include <linux/proc_fs.h> |
| 15 | #include <linux/mm.h> | 16 | #include <linux/mm.h> |
| 16 | #include <linux/io.h> | 17 | #include <linux/io.h> |
diff --git a/arch/avr32/include/asm/Kbuild b/arch/avr32/include/asm/Kbuild index cfb9fe1b8df9..c7c64a63c29f 100644 --- a/arch/avr32/include/asm/Kbuild +++ b/arch/avr32/include/asm/Kbuild | |||
| @@ -17,5 +17,6 @@ generic-y += scatterlist.h | |||
| 17 | generic-y += sections.h | 17 | generic-y += sections.h |
| 18 | generic-y += topology.h | 18 | generic-y += topology.h |
| 19 | generic-y += trace_clock.h | 19 | generic-y += trace_clock.h |
| 20 | generic-y += vga.h | ||
| 20 | generic-y += xor.h | 21 | generic-y += xor.h |
| 21 | generic-y += hash.h | 22 | generic-y += hash.h |
diff --git a/arch/avr32/include/asm/io.h b/arch/avr32/include/asm/io.h index fc6483f83ccc..4f5ec2bb7172 100644 --- a/arch/avr32/include/asm/io.h +++ b/arch/avr32/include/asm/io.h | |||
| @@ -295,6 +295,8 @@ extern void __iounmap(void __iomem *addr); | |||
| 295 | #define iounmap(addr) \ | 295 | #define iounmap(addr) \ |
| 296 | __iounmap(addr) | 296 | __iounmap(addr) |
| 297 | 297 | ||
| 298 | #define ioremap_wc ioremap_nocache | ||
| 299 | |||
| 298 | #define cached(addr) P1SEGADDR(addr) | 300 | #define cached(addr) P1SEGADDR(addr) |
| 299 | #define uncached(addr) P2SEGADDR(addr) | 301 | #define uncached(addr) P2SEGADDR(addr) |
| 300 | 302 | ||
diff --git a/arch/microblaze/include/asm/delay.h b/arch/microblaze/include/asm/delay.h index 05b7d39e4391..66fc24c24238 100644 --- a/arch/microblaze/include/asm/delay.h +++ b/arch/microblaze/include/asm/delay.h | |||
| @@ -13,6 +13,8 @@ | |||
| 13 | #ifndef _ASM_MICROBLAZE_DELAY_H | 13 | #ifndef _ASM_MICROBLAZE_DELAY_H |
| 14 | #define _ASM_MICROBLAZE_DELAY_H | 14 | #define _ASM_MICROBLAZE_DELAY_H |
| 15 | 15 | ||
| 16 | #include <linux/param.h> | ||
| 17 | |||
| 16 | extern inline void __delay(unsigned long loops) | 18 | extern inline void __delay(unsigned long loops) |
| 17 | { | 19 | { |
| 18 | asm volatile ("# __delay \n\t" \ | 20 | asm volatile ("# __delay \n\t" \ |
diff --git a/arch/microblaze/include/asm/io.h b/arch/microblaze/include/asm/io.h index a2cea7206077..3fbb7f1db3bc 100644 --- a/arch/microblaze/include/asm/io.h +++ b/arch/microblaze/include/asm/io.h | |||
| @@ -89,6 +89,11 @@ static inline unsigned int readl(const volatile void __iomem *addr) | |||
| 89 | { | 89 | { |
| 90 | return le32_to_cpu(*(volatile unsigned int __force *)addr); | 90 | return le32_to_cpu(*(volatile unsigned int __force *)addr); |
| 91 | } | 91 | } |
| 92 | #define readq readq | ||
| 93 | static inline u64 readq(const volatile void __iomem *addr) | ||
| 94 | { | ||
| 95 | return le64_to_cpu(__raw_readq(addr)); | ||
| 96 | } | ||
| 92 | static inline void writeb(unsigned char v, volatile void __iomem *addr) | 97 | static inline void writeb(unsigned char v, volatile void __iomem *addr) |
| 93 | { | 98 | { |
| 94 | *(volatile unsigned char __force *)addr = v; | 99 | *(volatile unsigned char __force *)addr = v; |
| @@ -101,6 +106,7 @@ static inline void writel(unsigned int v, volatile void __iomem *addr) | |||
| 101 | { | 106 | { |
| 102 | *(volatile unsigned int __force *)addr = cpu_to_le32(v); | 107 | *(volatile unsigned int __force *)addr = cpu_to_le32(v); |
| 103 | } | 108 | } |
| 109 | #define writeq(b, addr) __raw_writeq(cpu_to_le64(b), addr) | ||
| 104 | 110 | ||
| 105 | /* ioread and iowrite variants. thease are for now same as __raw_ | 111 | /* ioread and iowrite variants. thease are for now same as __raw_ |
| 106 | * variants of accessors. we might check for endianess in the feature | 112 | * variants of accessors. we might check for endianess in the feature |
diff --git a/arch/microblaze/kernel/head.S b/arch/microblaze/kernel/head.S index b7fb0438458c..17645b2e2f07 100644 --- a/arch/microblaze/kernel/head.S +++ b/arch/microblaze/kernel/head.S | |||
| @@ -66,7 +66,7 @@ real_start: | |||
| 66 | mts rmsr, r0 | 66 | mts rmsr, r0 |
| 67 | /* Disable stack protection from bootloader */ | 67 | /* Disable stack protection from bootloader */ |
| 68 | mts rslr, r0 | 68 | mts rslr, r0 |
| 69 | addi r8, r0, 0xFFFFFFF | 69 | addi r8, r0, 0xFFFFFFFF |
| 70 | mts rshr, r8 | 70 | mts rshr, r8 |
| 71 | /* | 71 | /* |
| 72 | * According to Xilinx, msrclr instruction behaves like 'mfs rX,rpc' | 72 | * According to Xilinx, msrclr instruction behaves like 'mfs rX,rpc' |
diff --git a/arch/powerpc/include/asm/dma-mapping.h b/arch/powerpc/include/asm/dma-mapping.h index e27e9ad6818e..150866b2a3fe 100644 --- a/arch/powerpc/include/asm/dma-mapping.h +++ b/arch/powerpc/include/asm/dma-mapping.h | |||
| @@ -134,6 +134,7 @@ static inline int dma_supported(struct device *dev, u64 mask) | |||
| 134 | } | 134 | } |
| 135 | 135 | ||
| 136 | extern int dma_set_mask(struct device *dev, u64 dma_mask); | 136 | extern int dma_set_mask(struct device *dev, u64 dma_mask); |
| 137 | extern int __dma_set_mask(struct device *dev, u64 dma_mask); | ||
| 137 | 138 | ||
| 138 | #define dma_alloc_coherent(d,s,h,f) dma_alloc_attrs(d,s,h,f,NULL) | 139 | #define dma_alloc_coherent(d,s,h,f) dma_alloc_attrs(d,s,h,f,NULL) |
| 139 | 140 | ||
diff --git a/arch/powerpc/include/asm/eeh.h b/arch/powerpc/include/asm/eeh.h index 9e39ceb1d19f..d4dd41fb951b 100644 --- a/arch/powerpc/include/asm/eeh.h +++ b/arch/powerpc/include/asm/eeh.h | |||
| @@ -172,10 +172,20 @@ struct eeh_ops { | |||
| 172 | }; | 172 | }; |
| 173 | 173 | ||
| 174 | extern struct eeh_ops *eeh_ops; | 174 | extern struct eeh_ops *eeh_ops; |
| 175 | extern int eeh_subsystem_enabled; | 175 | extern bool eeh_subsystem_enabled; |
| 176 | extern raw_spinlock_t confirm_error_lock; | 176 | extern raw_spinlock_t confirm_error_lock; |
| 177 | extern int eeh_probe_mode; | 177 | extern int eeh_probe_mode; |
| 178 | 178 | ||
| 179 | static inline bool eeh_enabled(void) | ||
| 180 | { | ||
| 181 | return eeh_subsystem_enabled; | ||
| 182 | } | ||
| 183 | |||
| 184 | static inline void eeh_set_enable(bool mode) | ||
| 185 | { | ||
| 186 | eeh_subsystem_enabled = mode; | ||
| 187 | } | ||
| 188 | |||
| 179 | #define EEH_PROBE_MODE_DEV (1<<0) /* From PCI device */ | 189 | #define EEH_PROBE_MODE_DEV (1<<0) /* From PCI device */ |
| 180 | #define EEH_PROBE_MODE_DEVTREE (1<<1) /* From device tree */ | 190 | #define EEH_PROBE_MODE_DEVTREE (1<<1) /* From device tree */ |
| 181 | 191 | ||
| @@ -246,7 +256,7 @@ void eeh_remove_device(struct pci_dev *); | |||
| 246 | * If this macro yields TRUE, the caller relays to eeh_check_failure() | 256 | * If this macro yields TRUE, the caller relays to eeh_check_failure() |
| 247 | * which does further tests out of line. | 257 | * which does further tests out of line. |
| 248 | */ | 258 | */ |
| 249 | #define EEH_POSSIBLE_ERROR(val, type) ((val) == (type)~0 && eeh_subsystem_enabled) | 259 | #define EEH_POSSIBLE_ERROR(val, type) ((val) == (type)~0 && eeh_enabled()) |
| 250 | 260 | ||
| 251 | /* | 261 | /* |
| 252 | * Reads from a device which has been isolated by EEH will return | 262 | * Reads from a device which has been isolated by EEH will return |
| @@ -257,6 +267,13 @@ void eeh_remove_device(struct pci_dev *); | |||
| 257 | 267 | ||
| 258 | #else /* !CONFIG_EEH */ | 268 | #else /* !CONFIG_EEH */ |
| 259 | 269 | ||
| 270 | static inline bool eeh_enabled(void) | ||
| 271 | { | ||
| 272 | return false; | ||
| 273 | } | ||
| 274 | |||
| 275 | static inline void eeh_set_enable(bool mode) { } | ||
| 276 | |||
| 260 | static inline int eeh_init(void) | 277 | static inline int eeh_init(void) |
| 261 | { | 278 | { |
| 262 | return 0; | 279 | return 0; |
diff --git a/arch/powerpc/include/asm/hugetlb.h b/arch/powerpc/include/asm/hugetlb.h index d750336b171d..623f2971ce0e 100644 --- a/arch/powerpc/include/asm/hugetlb.h +++ b/arch/powerpc/include/asm/hugetlb.h | |||
| @@ -127,7 +127,7 @@ static inline pte_t huge_ptep_get_and_clear(struct mm_struct *mm, | |||
| 127 | unsigned long addr, pte_t *ptep) | 127 | unsigned long addr, pte_t *ptep) |
| 128 | { | 128 | { |
| 129 | #ifdef CONFIG_PPC64 | 129 | #ifdef CONFIG_PPC64 |
| 130 | return __pte(pte_update(mm, addr, ptep, ~0UL, 1)); | 130 | return __pte(pte_update(mm, addr, ptep, ~0UL, 0, 1)); |
| 131 | #else | 131 | #else |
| 132 | return __pte(pte_update(ptep, ~0UL, 0)); | 132 | return __pte(pte_update(ptep, ~0UL, 0)); |
| 133 | #endif | 133 | #endif |
diff --git a/arch/powerpc/include/asm/iommu.h b/arch/powerpc/include/asm/iommu.h index f7a8036579b5..42632c7a2a4e 100644 --- a/arch/powerpc/include/asm/iommu.h +++ b/arch/powerpc/include/asm/iommu.h | |||
| @@ -77,6 +77,7 @@ struct iommu_table { | |||
| 77 | #ifdef CONFIG_IOMMU_API | 77 | #ifdef CONFIG_IOMMU_API |
| 78 | struct iommu_group *it_group; | 78 | struct iommu_group *it_group; |
| 79 | #endif | 79 | #endif |
| 80 | void (*set_bypass)(struct iommu_table *tbl, bool enable); | ||
| 80 | }; | 81 | }; |
| 81 | 82 | ||
| 82 | /* Pure 2^n version of get_order */ | 83 | /* Pure 2^n version of get_order */ |
diff --git a/arch/powerpc/include/asm/pgtable-ppc64.h b/arch/powerpc/include/asm/pgtable-ppc64.h index bc141c950b1e..eb9261024f51 100644 --- a/arch/powerpc/include/asm/pgtable-ppc64.h +++ b/arch/powerpc/include/asm/pgtable-ppc64.h | |||
| @@ -195,6 +195,7 @@ extern void hpte_need_flush(struct mm_struct *mm, unsigned long addr, | |||
| 195 | static inline unsigned long pte_update(struct mm_struct *mm, | 195 | static inline unsigned long pte_update(struct mm_struct *mm, |
| 196 | unsigned long addr, | 196 | unsigned long addr, |
| 197 | pte_t *ptep, unsigned long clr, | 197 | pte_t *ptep, unsigned long clr, |
| 198 | unsigned long set, | ||
| 198 | int huge) | 199 | int huge) |
| 199 | { | 200 | { |
| 200 | #ifdef PTE_ATOMIC_UPDATES | 201 | #ifdef PTE_ATOMIC_UPDATES |
| @@ -205,14 +206,15 @@ static inline unsigned long pte_update(struct mm_struct *mm, | |||
| 205 | andi. %1,%0,%6\n\ | 206 | andi. %1,%0,%6\n\ |
| 206 | bne- 1b \n\ | 207 | bne- 1b \n\ |
| 207 | andc %1,%0,%4 \n\ | 208 | andc %1,%0,%4 \n\ |
| 209 | or %1,%1,%7\n\ | ||
| 208 | stdcx. %1,0,%3 \n\ | 210 | stdcx. %1,0,%3 \n\ |
| 209 | bne- 1b" | 211 | bne- 1b" |
| 210 | : "=&r" (old), "=&r" (tmp), "=m" (*ptep) | 212 | : "=&r" (old), "=&r" (tmp), "=m" (*ptep) |
| 211 | : "r" (ptep), "r" (clr), "m" (*ptep), "i" (_PAGE_BUSY) | 213 | : "r" (ptep), "r" (clr), "m" (*ptep), "i" (_PAGE_BUSY), "r" (set) |
| 212 | : "cc" ); | 214 | : "cc" ); |
| 213 | #else | 215 | #else |
| 214 | unsigned long old = pte_val(*ptep); | 216 | unsigned long old = pte_val(*ptep); |
| 215 | *ptep = __pte(old & ~clr); | 217 | *ptep = __pte((old & ~clr) | set); |
| 216 | #endif | 218 | #endif |
| 217 | /* huge pages use the old page table lock */ | 219 | /* huge pages use the old page table lock */ |
| 218 | if (!huge) | 220 | if (!huge) |
| @@ -231,9 +233,9 @@ static inline int __ptep_test_and_clear_young(struct mm_struct *mm, | |||
| 231 | { | 233 | { |
| 232 | unsigned long old; | 234 | unsigned long old; |
| 233 | 235 | ||
| 234 | if ((pte_val(*ptep) & (_PAGE_ACCESSED | _PAGE_HASHPTE)) == 0) | 236 | if ((pte_val(*ptep) & (_PAGE_ACCESSED | _PAGE_HASHPTE)) == 0) |
| 235 | return 0; | 237 | return 0; |
| 236 | old = pte_update(mm, addr, ptep, _PAGE_ACCESSED, 0); | 238 | old = pte_update(mm, addr, ptep, _PAGE_ACCESSED, 0, 0); |
| 237 | return (old & _PAGE_ACCESSED) != 0; | 239 | return (old & _PAGE_ACCESSED) != 0; |
| 238 | } | 240 | } |
| 239 | #define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG | 241 | #define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG |
| @@ -252,7 +254,7 @@ static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr, | |||
| 252 | if ((pte_val(*ptep) & _PAGE_RW) == 0) | 254 | if ((pte_val(*ptep) & _PAGE_RW) == 0) |
| 253 | return; | 255 | return; |
| 254 | 256 | ||
| 255 | pte_update(mm, addr, ptep, _PAGE_RW, 0); | 257 | pte_update(mm, addr, ptep, _PAGE_RW, 0, 0); |
| 256 | } | 258 | } |
| 257 | 259 | ||
| 258 | static inline void huge_ptep_set_wrprotect(struct mm_struct *mm, | 260 | static inline void huge_ptep_set_wrprotect(struct mm_struct *mm, |
| @@ -261,7 +263,7 @@ static inline void huge_ptep_set_wrprotect(struct mm_struct *mm, | |||
| 261 | if ((pte_val(*ptep) & _PAGE_RW) == 0) | 263 | if ((pte_val(*ptep) & _PAGE_RW) == 0) |
| 262 | return; | 264 | return; |
| 263 | 265 | ||
| 264 | pte_update(mm, addr, ptep, _PAGE_RW, 1); | 266 | pte_update(mm, addr, ptep, _PAGE_RW, 0, 1); |
| 265 | } | 267 | } |
| 266 | 268 | ||
| 267 | /* | 269 | /* |
| @@ -284,14 +286,14 @@ static inline void huge_ptep_set_wrprotect(struct mm_struct *mm, | |||
| 284 | static inline pte_t ptep_get_and_clear(struct mm_struct *mm, | 286 | static inline pte_t ptep_get_and_clear(struct mm_struct *mm, |
| 285 | unsigned long addr, pte_t *ptep) | 287 | unsigned long addr, pte_t *ptep) |
| 286 | { | 288 | { |
| 287 | unsigned long old = pte_update(mm, addr, ptep, ~0UL, 0); | 289 | unsigned long old = pte_update(mm, addr, ptep, ~0UL, 0, 0); |
| 288 | return __pte(old); | 290 | return __pte(old); |
| 289 | } | 291 | } |
| 290 | 292 | ||
| 291 | static inline void pte_clear(struct mm_struct *mm, unsigned long addr, | 293 | static inline void pte_clear(struct mm_struct *mm, unsigned long addr, |
| 292 | pte_t * ptep) | 294 | pte_t * ptep) |
| 293 | { | 295 | { |
| 294 | pte_update(mm, addr, ptep, ~0UL, 0); | 296 | pte_update(mm, addr, ptep, ~0UL, 0, 0); |
| 295 | } | 297 | } |
| 296 | 298 | ||
| 297 | 299 | ||
| @@ -506,7 +508,9 @@ extern int pmdp_set_access_flags(struct vm_area_struct *vma, | |||
| 506 | 508 | ||
| 507 | extern unsigned long pmd_hugepage_update(struct mm_struct *mm, | 509 | extern unsigned long pmd_hugepage_update(struct mm_struct *mm, |
| 508 | unsigned long addr, | 510 | unsigned long addr, |
| 509 | pmd_t *pmdp, unsigned long clr); | 511 | pmd_t *pmdp, |
| 512 | unsigned long clr, | ||
| 513 | unsigned long set); | ||
| 510 | 514 | ||
| 511 | static inline int __pmdp_test_and_clear_young(struct mm_struct *mm, | 515 | static inline int __pmdp_test_and_clear_young(struct mm_struct *mm, |
| 512 | unsigned long addr, pmd_t *pmdp) | 516 | unsigned long addr, pmd_t *pmdp) |
| @@ -515,7 +519,7 @@ static inline int __pmdp_test_and_clear_young(struct mm_struct *mm, | |||
| 515 | 519 | ||
| 516 | if ((pmd_val(*pmdp) & (_PAGE_ACCESSED | _PAGE_HASHPTE)) == 0) | 520 | if ((pmd_val(*pmdp) & (_PAGE_ACCESSED | _PAGE_HASHPTE)) == 0) |
| 517 | return 0; | 521 | return 0; |
| 518 | old = pmd_hugepage_update(mm, addr, pmdp, _PAGE_ACCESSED); | 522 | old = pmd_hugepage_update(mm, addr, pmdp, _PAGE_ACCESSED, 0); |
| 519 | return ((old & _PAGE_ACCESSED) != 0); | 523 | return ((old & _PAGE_ACCESSED) != 0); |
| 520 | } | 524 | } |
| 521 | 525 | ||
| @@ -542,7 +546,7 @@ static inline void pmdp_set_wrprotect(struct mm_struct *mm, unsigned long addr, | |||
| 542 | if ((pmd_val(*pmdp) & _PAGE_RW) == 0) | 546 | if ((pmd_val(*pmdp) & _PAGE_RW) == 0) |
| 543 | return; | 547 | return; |
| 544 | 548 | ||
| 545 | pmd_hugepage_update(mm, addr, pmdp, _PAGE_RW); | 549 | pmd_hugepage_update(mm, addr, pmdp, _PAGE_RW, 0); |
| 546 | } | 550 | } |
| 547 | 551 | ||
| 548 | #define __HAVE_ARCH_PMDP_SPLITTING_FLUSH | 552 | #define __HAVE_ARCH_PMDP_SPLITTING_FLUSH |
diff --git a/arch/powerpc/include/asm/pgtable.h b/arch/powerpc/include/asm/pgtable.h index f83b6f3e1b39..3ebb188c3ff5 100644 --- a/arch/powerpc/include/asm/pgtable.h +++ b/arch/powerpc/include/asm/pgtable.h | |||
| @@ -75,12 +75,34 @@ static inline pte_t pte_mknuma(pte_t pte) | |||
| 75 | return pte; | 75 | return pte; |
| 76 | } | 76 | } |
| 77 | 77 | ||
| 78 | #define ptep_set_numa ptep_set_numa | ||
| 79 | static inline void ptep_set_numa(struct mm_struct *mm, unsigned long addr, | ||
| 80 | pte_t *ptep) | ||
| 81 | { | ||
| 82 | if ((pte_val(*ptep) & _PAGE_PRESENT) == 0) | ||
| 83 | VM_BUG_ON(1); | ||
| 84 | |||
| 85 | pte_update(mm, addr, ptep, _PAGE_PRESENT, _PAGE_NUMA, 0); | ||
| 86 | return; | ||
| 87 | } | ||
| 88 | |||
| 78 | #define pmd_numa pmd_numa | 89 | #define pmd_numa pmd_numa |
| 79 | static inline int pmd_numa(pmd_t pmd) | 90 | static inline int pmd_numa(pmd_t pmd) |
| 80 | { | 91 | { |
| 81 | return pte_numa(pmd_pte(pmd)); | 92 | return pte_numa(pmd_pte(pmd)); |
| 82 | } | 93 | } |
| 83 | 94 | ||
| 95 | #define pmdp_set_numa pmdp_set_numa | ||
| 96 | static inline void pmdp_set_numa(struct mm_struct *mm, unsigned long addr, | ||
| 97 | pmd_t *pmdp) | ||
| 98 | { | ||
| 99 | if ((pmd_val(*pmdp) & _PAGE_PRESENT) == 0) | ||
| 100 | VM_BUG_ON(1); | ||
| 101 | |||
| 102 | pmd_hugepage_update(mm, addr, pmdp, _PAGE_PRESENT, _PAGE_NUMA); | ||
| 103 | return; | ||
| 104 | } | ||
| 105 | |||
| 84 | #define pmd_mknonnuma pmd_mknonnuma | 106 | #define pmd_mknonnuma pmd_mknonnuma |
| 85 | static inline pmd_t pmd_mknonnuma(pmd_t pmd) | 107 | static inline pmd_t pmd_mknonnuma(pmd_t pmd) |
| 86 | { | 108 | { |
diff --git a/arch/powerpc/include/asm/sections.h b/arch/powerpc/include/asm/sections.h index 4ee06fe15de4..d0e784e0ff48 100644 --- a/arch/powerpc/include/asm/sections.h +++ b/arch/powerpc/include/asm/sections.h | |||
| @@ -8,6 +8,7 @@ | |||
| 8 | 8 | ||
| 9 | #ifdef __powerpc64__ | 9 | #ifdef __powerpc64__ |
| 10 | 10 | ||
| 11 | extern char __start_interrupts[]; | ||
| 11 | extern char __end_interrupts[]; | 12 | extern char __end_interrupts[]; |
| 12 | 13 | ||
| 13 | extern char __prom_init_toc_start[]; | 14 | extern char __prom_init_toc_start[]; |
| @@ -21,6 +22,17 @@ static inline int in_kernel_text(unsigned long addr) | |||
| 21 | return 0; | 22 | return 0; |
| 22 | } | 23 | } |
| 23 | 24 | ||
| 25 | static inline int overlaps_interrupt_vector_text(unsigned long start, | ||
| 26 | unsigned long end) | ||
| 27 | { | ||
| 28 | unsigned long real_start, real_end; | ||
| 29 | real_start = __start_interrupts - _stext; | ||
| 30 | real_end = __end_interrupts - _stext; | ||
| 31 | |||
| 32 | return start < (unsigned long)__va(real_end) && | ||
| 33 | (unsigned long)__va(real_start) < end; | ||
| 34 | } | ||
| 35 | |||
| 24 | static inline int overlaps_kernel_text(unsigned long start, unsigned long end) | 36 | static inline int overlaps_kernel_text(unsigned long start, unsigned long end) |
| 25 | { | 37 | { |
| 26 | return start < (unsigned long)__init_end && | 38 | return start < (unsigned long)__init_end && |
diff --git a/arch/powerpc/include/asm/vdso.h b/arch/powerpc/include/asm/vdso.h index 0d9cecddf8a4..c53f5f6d1761 100644 --- a/arch/powerpc/include/asm/vdso.h +++ b/arch/powerpc/include/asm/vdso.h | |||
| @@ -4,11 +4,11 @@ | |||
| 4 | #ifdef __KERNEL__ | 4 | #ifdef __KERNEL__ |
| 5 | 5 | ||
| 6 | /* Default link addresses for the vDSOs */ | 6 | /* Default link addresses for the vDSOs */ |
| 7 | #define VDSO32_LBASE 0x100000 | 7 | #define VDSO32_LBASE 0x0 |
| 8 | #define VDSO64_LBASE 0x100000 | 8 | #define VDSO64_LBASE 0x0 |
| 9 | 9 | ||
| 10 | /* Default map addresses for 32bit vDSO */ | 10 | /* Default map addresses for 32bit vDSO */ |
| 11 | #define VDSO32_MBASE VDSO32_LBASE | 11 | #define VDSO32_MBASE 0x100000 |
| 12 | 12 | ||
| 13 | #define VDSO_VERSION_STRING LINUX_2.6.15 | 13 | #define VDSO_VERSION_STRING LINUX_2.6.15 |
| 14 | 14 | ||
diff --git a/arch/powerpc/kernel/dma.c b/arch/powerpc/kernel/dma.c index 8032b97ccdcb..ee78f6e49d64 100644 --- a/arch/powerpc/kernel/dma.c +++ b/arch/powerpc/kernel/dma.c | |||
| @@ -191,12 +191,10 @@ EXPORT_SYMBOL(dma_direct_ops); | |||
| 191 | 191 | ||
| 192 | #define PREALLOC_DMA_DEBUG_ENTRIES (1 << 16) | 192 | #define PREALLOC_DMA_DEBUG_ENTRIES (1 << 16) |
| 193 | 193 | ||
| 194 | int dma_set_mask(struct device *dev, u64 dma_mask) | 194 | int __dma_set_mask(struct device *dev, u64 dma_mask) |
| 195 | { | 195 | { |
| 196 | struct dma_map_ops *dma_ops = get_dma_ops(dev); | 196 | struct dma_map_ops *dma_ops = get_dma_ops(dev); |
| 197 | 197 | ||
| 198 | if (ppc_md.dma_set_mask) | ||
| 199 | return ppc_md.dma_set_mask(dev, dma_mask); | ||
| 200 | if ((dma_ops != NULL) && (dma_ops->set_dma_mask != NULL)) | 198 | if ((dma_ops != NULL) && (dma_ops->set_dma_mask != NULL)) |
| 201 | return dma_ops->set_dma_mask(dev, dma_mask); | 199 | return dma_ops->set_dma_mask(dev, dma_mask); |
| 202 | if (!dev->dma_mask || !dma_supported(dev, dma_mask)) | 200 | if (!dev->dma_mask || !dma_supported(dev, dma_mask)) |
| @@ -204,6 +202,12 @@ int dma_set_mask(struct device *dev, u64 dma_mask) | |||
| 204 | *dev->dma_mask = dma_mask; | 202 | *dev->dma_mask = dma_mask; |
| 205 | return 0; | 203 | return 0; |
| 206 | } | 204 | } |
| 205 | int dma_set_mask(struct device *dev, u64 dma_mask) | ||
| 206 | { | ||
| 207 | if (ppc_md.dma_set_mask) | ||
| 208 | return ppc_md.dma_set_mask(dev, dma_mask); | ||
| 209 | return __dma_set_mask(dev, dma_mask); | ||
| 210 | } | ||
| 207 | EXPORT_SYMBOL(dma_set_mask); | 211 | EXPORT_SYMBOL(dma_set_mask); |
| 208 | 212 | ||
| 209 | u64 dma_get_required_mask(struct device *dev) | 213 | u64 dma_get_required_mask(struct device *dev) |
diff --git a/arch/powerpc/kernel/eeh.c b/arch/powerpc/kernel/eeh.c index 148db72a8c43..e7b76a6bf150 100644 --- a/arch/powerpc/kernel/eeh.c +++ b/arch/powerpc/kernel/eeh.c | |||
| @@ -28,6 +28,7 @@ | |||
| 28 | #include <linux/pci.h> | 28 | #include <linux/pci.h> |
| 29 | #include <linux/proc_fs.h> | 29 | #include <linux/proc_fs.h> |
| 30 | #include <linux/rbtree.h> | 30 | #include <linux/rbtree.h> |
| 31 | #include <linux/reboot.h> | ||
| 31 | #include <linux/seq_file.h> | 32 | #include <linux/seq_file.h> |
| 32 | #include <linux/spinlock.h> | 33 | #include <linux/spinlock.h> |
| 33 | #include <linux/export.h> | 34 | #include <linux/export.h> |
| @@ -89,7 +90,7 @@ | |||
| 89 | /* Platform dependent EEH operations */ | 90 | /* Platform dependent EEH operations */ |
| 90 | struct eeh_ops *eeh_ops = NULL; | 91 | struct eeh_ops *eeh_ops = NULL; |
| 91 | 92 | ||
| 92 | int eeh_subsystem_enabled; | 93 | bool eeh_subsystem_enabled = false; |
| 93 | EXPORT_SYMBOL(eeh_subsystem_enabled); | 94 | EXPORT_SYMBOL(eeh_subsystem_enabled); |
| 94 | 95 | ||
| 95 | /* | 96 | /* |
| @@ -364,7 +365,7 @@ int eeh_dev_check_failure(struct eeh_dev *edev) | |||
| 364 | 365 | ||
| 365 | eeh_stats.total_mmio_ffs++; | 366 | eeh_stats.total_mmio_ffs++; |
| 366 | 367 | ||
| 367 | if (!eeh_subsystem_enabled) | 368 | if (!eeh_enabled()) |
| 368 | return 0; | 369 | return 0; |
| 369 | 370 | ||
| 370 | if (!edev) { | 371 | if (!edev) { |
| @@ -747,6 +748,17 @@ int __exit eeh_ops_unregister(const char *name) | |||
| 747 | return -EEXIST; | 748 | return -EEXIST; |
| 748 | } | 749 | } |
| 749 | 750 | ||
| 751 | static int eeh_reboot_notifier(struct notifier_block *nb, | ||
| 752 | unsigned long action, void *unused) | ||
| 753 | { | ||
| 754 | eeh_set_enable(false); | ||
| 755 | return NOTIFY_DONE; | ||
| 756 | } | ||
| 757 | |||
| 758 | static struct notifier_block eeh_reboot_nb = { | ||
| 759 | .notifier_call = eeh_reboot_notifier, | ||
| 760 | }; | ||
| 761 | |||
| 750 | /** | 762 | /** |
| 751 | * eeh_init - EEH initialization | 763 | * eeh_init - EEH initialization |
| 752 | * | 764 | * |
| @@ -778,6 +790,14 @@ int eeh_init(void) | |||
| 778 | if (machine_is(powernv) && cnt++ <= 0) | 790 | if (machine_is(powernv) && cnt++ <= 0) |
| 779 | return ret; | 791 | return ret; |
| 780 | 792 | ||
| 793 | /* Register reboot notifier */ | ||
| 794 | ret = register_reboot_notifier(&eeh_reboot_nb); | ||
| 795 | if (ret) { | ||
| 796 | pr_warn("%s: Failed to register notifier (%d)\n", | ||
| 797 | __func__, ret); | ||
| 798 | return ret; | ||
| 799 | } | ||
| 800 | |||
| 781 | /* call platform initialization function */ | 801 | /* call platform initialization function */ |
| 782 | if (!eeh_ops) { | 802 | if (!eeh_ops) { |
| 783 | pr_warning("%s: Platform EEH operation not found\n", | 803 | pr_warning("%s: Platform EEH operation not found\n", |
| @@ -822,7 +842,7 @@ int eeh_init(void) | |||
| 822 | return ret; | 842 | return ret; |
| 823 | } | 843 | } |
| 824 | 844 | ||
| 825 | if (eeh_subsystem_enabled) | 845 | if (eeh_enabled()) |
| 826 | pr_info("EEH: PCI Enhanced I/O Error Handling Enabled\n"); | 846 | pr_info("EEH: PCI Enhanced I/O Error Handling Enabled\n"); |
| 827 | else | 847 | else |
| 828 | pr_warning("EEH: No capable adapters found\n"); | 848 | pr_warning("EEH: No capable adapters found\n"); |
| @@ -897,7 +917,7 @@ void eeh_add_device_late(struct pci_dev *dev) | |||
| 897 | struct device_node *dn; | 917 | struct device_node *dn; |
| 898 | struct eeh_dev *edev; | 918 | struct eeh_dev *edev; |
| 899 | 919 | ||
| 900 | if (!dev || !eeh_subsystem_enabled) | 920 | if (!dev || !eeh_enabled()) |
| 901 | return; | 921 | return; |
| 902 | 922 | ||
| 903 | pr_debug("EEH: Adding device %s\n", pci_name(dev)); | 923 | pr_debug("EEH: Adding device %s\n", pci_name(dev)); |
| @@ -1005,7 +1025,7 @@ void eeh_remove_device(struct pci_dev *dev) | |||
| 1005 | { | 1025 | { |
| 1006 | struct eeh_dev *edev; | 1026 | struct eeh_dev *edev; |
| 1007 | 1027 | ||
| 1008 | if (!dev || !eeh_subsystem_enabled) | 1028 | if (!dev || !eeh_enabled()) |
| 1009 | return; | 1029 | return; |
| 1010 | edev = pci_dev_to_eeh_dev(dev); | 1030 | edev = pci_dev_to_eeh_dev(dev); |
| 1011 | 1031 | ||
| @@ -1045,7 +1065,7 @@ void eeh_remove_device(struct pci_dev *dev) | |||
| 1045 | 1065 | ||
| 1046 | static int proc_eeh_show(struct seq_file *m, void *v) | 1066 | static int proc_eeh_show(struct seq_file *m, void *v) |
| 1047 | { | 1067 | { |
| 1048 | if (0 == eeh_subsystem_enabled) { | 1068 | if (!eeh_enabled()) { |
| 1049 | seq_printf(m, "EEH Subsystem is globally disabled\n"); | 1069 | seq_printf(m, "EEH Subsystem is globally disabled\n"); |
| 1050 | seq_printf(m, "eeh_total_mmio_ffs=%llu\n", eeh_stats.total_mmio_ffs); | 1070 | seq_printf(m, "eeh_total_mmio_ffs=%llu\n", eeh_stats.total_mmio_ffs); |
| 1051 | } else { | 1071 | } else { |
diff --git a/arch/powerpc/kernel/eeh_driver.c b/arch/powerpc/kernel/eeh_driver.c index 7bb30dca4e19..fdc679d309ec 100644 --- a/arch/powerpc/kernel/eeh_driver.c +++ b/arch/powerpc/kernel/eeh_driver.c | |||
| @@ -362,9 +362,13 @@ static void *eeh_rmv_device(void *data, void *userdata) | |||
| 362 | */ | 362 | */ |
| 363 | if (!dev || (dev->hdr_type & PCI_HEADER_TYPE_BRIDGE)) | 363 | if (!dev || (dev->hdr_type & PCI_HEADER_TYPE_BRIDGE)) |
| 364 | return NULL; | 364 | return NULL; |
| 365 | |||
| 365 | driver = eeh_pcid_get(dev); | 366 | driver = eeh_pcid_get(dev); |
| 366 | if (driver && driver->err_handler) | 367 | if (driver) { |
| 367 | return NULL; | 368 | eeh_pcid_put(dev); |
| 369 | if (driver->err_handler) | ||
| 370 | return NULL; | ||
| 371 | } | ||
| 368 | 372 | ||
| 369 | /* Remove it from PCI subsystem */ | 373 | /* Remove it from PCI subsystem */ |
| 370 | pr_debug("EEH: Removing %s without EEH sensitive driver\n", | 374 | pr_debug("EEH: Removing %s without EEH sensitive driver\n", |
diff --git a/arch/powerpc/kernel/iommu.c b/arch/powerpc/kernel/iommu.c index d773dd440a45..88e3ec6e1d96 100644 --- a/arch/powerpc/kernel/iommu.c +++ b/arch/powerpc/kernel/iommu.c | |||
| @@ -1088,6 +1088,14 @@ int iommu_take_ownership(struct iommu_table *tbl) | |||
| 1088 | memset(tbl->it_map, 0xff, sz); | 1088 | memset(tbl->it_map, 0xff, sz); |
| 1089 | iommu_clear_tces_and_put_pages(tbl, tbl->it_offset, tbl->it_size); | 1089 | iommu_clear_tces_and_put_pages(tbl, tbl->it_offset, tbl->it_size); |
| 1090 | 1090 | ||
| 1091 | /* | ||
| 1092 | * Disable iommu bypass, otherwise the user can DMA to all of | ||
| 1093 | * our physical memory via the bypass window instead of just | ||
| 1094 | * the pages that has been explicitly mapped into the iommu | ||
| 1095 | */ | ||
| 1096 | if (tbl->set_bypass) | ||
| 1097 | tbl->set_bypass(tbl, false); | ||
| 1098 | |||
| 1091 | return 0; | 1099 | return 0; |
| 1092 | } | 1100 | } |
| 1093 | EXPORT_SYMBOL_GPL(iommu_take_ownership); | 1101 | EXPORT_SYMBOL_GPL(iommu_take_ownership); |
| @@ -1102,6 +1110,10 @@ void iommu_release_ownership(struct iommu_table *tbl) | |||
| 1102 | /* Restore bit#0 set by iommu_init_table() */ | 1110 | /* Restore bit#0 set by iommu_init_table() */ |
| 1103 | if (tbl->it_offset == 0) | 1111 | if (tbl->it_offset == 0) |
| 1104 | set_bit(0, tbl->it_map); | 1112 | set_bit(0, tbl->it_map); |
| 1113 | |||
| 1114 | /* The kernel owns the device now, we can restore the iommu bypass */ | ||
| 1115 | if (tbl->set_bypass) | ||
| 1116 | tbl->set_bypass(tbl, true); | ||
| 1105 | } | 1117 | } |
| 1106 | EXPORT_SYMBOL_GPL(iommu_release_ownership); | 1118 | EXPORT_SYMBOL_GPL(iommu_release_ownership); |
| 1107 | 1119 | ||
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c index 9729b23bfb0a..1d0848bba049 100644 --- a/arch/powerpc/kernel/irq.c +++ b/arch/powerpc/kernel/irq.c | |||
| @@ -559,8 +559,13 @@ void exc_lvl_ctx_init(void) | |||
| 559 | #ifdef CONFIG_PPC64 | 559 | #ifdef CONFIG_PPC64 |
| 560 | cpu_nr = i; | 560 | cpu_nr = i; |
| 561 | #else | 561 | #else |
| 562 | #ifdef CONFIG_SMP | ||
| 562 | cpu_nr = get_hard_smp_processor_id(i); | 563 | cpu_nr = get_hard_smp_processor_id(i); |
| 564 | #else | ||
| 565 | cpu_nr = 0; | ||
| 563 | #endif | 566 | #endif |
| 567 | #endif | ||
| 568 | |||
| 564 | memset((void *)critirq_ctx[cpu_nr], 0, THREAD_SIZE); | 569 | memset((void *)critirq_ctx[cpu_nr], 0, THREAD_SIZE); |
| 565 | tp = critirq_ctx[cpu_nr]; | 570 | tp = critirq_ctx[cpu_nr]; |
| 566 | tp->cpu = cpu_nr; | 571 | tp->cpu = cpu_nr; |
diff --git a/arch/powerpc/kernel/machine_kexec.c b/arch/powerpc/kernel/machine_kexec.c index 75d4f7340da8..015ae55c1868 100644 --- a/arch/powerpc/kernel/machine_kexec.c +++ b/arch/powerpc/kernel/machine_kexec.c | |||
| @@ -196,7 +196,9 @@ int overlaps_crashkernel(unsigned long start, unsigned long size) | |||
| 196 | 196 | ||
| 197 | /* Values we need to export to the second kernel via the device tree. */ | 197 | /* Values we need to export to the second kernel via the device tree. */ |
| 198 | static phys_addr_t kernel_end; | 198 | static phys_addr_t kernel_end; |
| 199 | static phys_addr_t crashk_base; | ||
| 199 | static phys_addr_t crashk_size; | 200 | static phys_addr_t crashk_size; |
| 201 | static unsigned long long mem_limit; | ||
| 200 | 202 | ||
| 201 | static struct property kernel_end_prop = { | 203 | static struct property kernel_end_prop = { |
| 202 | .name = "linux,kernel-end", | 204 | .name = "linux,kernel-end", |
| @@ -207,7 +209,7 @@ static struct property kernel_end_prop = { | |||
| 207 | static struct property crashk_base_prop = { | 209 | static struct property crashk_base_prop = { |
| 208 | .name = "linux,crashkernel-base", | 210 | .name = "linux,crashkernel-base", |
| 209 | .length = sizeof(phys_addr_t), | 211 | .length = sizeof(phys_addr_t), |
| 210 | .value = &crashk_res.start, | 212 | .value = &crashk_base |
| 211 | }; | 213 | }; |
| 212 | 214 | ||
| 213 | static struct property crashk_size_prop = { | 215 | static struct property crashk_size_prop = { |
| @@ -219,9 +221,11 @@ static struct property crashk_size_prop = { | |||
| 219 | static struct property memory_limit_prop = { | 221 | static struct property memory_limit_prop = { |
| 220 | .name = "linux,memory-limit", | 222 | .name = "linux,memory-limit", |
| 221 | .length = sizeof(unsigned long long), | 223 | .length = sizeof(unsigned long long), |
| 222 | .value = &memory_limit, | 224 | .value = &mem_limit, |
| 223 | }; | 225 | }; |
| 224 | 226 | ||
| 227 | #define cpu_to_be_ulong __PASTE(cpu_to_be, BITS_PER_LONG) | ||
| 228 | |||
| 225 | static void __init export_crashk_values(struct device_node *node) | 229 | static void __init export_crashk_values(struct device_node *node) |
| 226 | { | 230 | { |
| 227 | struct property *prop; | 231 | struct property *prop; |
| @@ -237,8 +241,9 @@ static void __init export_crashk_values(struct device_node *node) | |||
| 237 | of_remove_property(node, prop); | 241 | of_remove_property(node, prop); |
| 238 | 242 | ||
| 239 | if (crashk_res.start != 0) { | 243 | if (crashk_res.start != 0) { |
| 244 | crashk_base = cpu_to_be_ulong(crashk_res.start), | ||
| 240 | of_add_property(node, &crashk_base_prop); | 245 | of_add_property(node, &crashk_base_prop); |
| 241 | crashk_size = resource_size(&crashk_res); | 246 | crashk_size = cpu_to_be_ulong(resource_size(&crashk_res)); |
| 242 | of_add_property(node, &crashk_size_prop); | 247 | of_add_property(node, &crashk_size_prop); |
| 243 | } | 248 | } |
| 244 | 249 | ||
| @@ -246,6 +251,7 @@ static void __init export_crashk_values(struct device_node *node) | |||
| 246 | * memory_limit is required by the kexec-tools to limit the | 251 | * memory_limit is required by the kexec-tools to limit the |
| 247 | * crash regions to the actual memory used. | 252 | * crash regions to the actual memory used. |
| 248 | */ | 253 | */ |
| 254 | mem_limit = cpu_to_be_ulong(memory_limit); | ||
| 249 | of_update_property(node, &memory_limit_prop); | 255 | of_update_property(node, &memory_limit_prop); |
| 250 | } | 256 | } |
| 251 | 257 | ||
| @@ -264,7 +270,7 @@ static int __init kexec_setup(void) | |||
| 264 | of_remove_property(node, prop); | 270 | of_remove_property(node, prop); |
| 265 | 271 | ||
| 266 | /* information needed by userspace when using default_machine_kexec */ | 272 | /* information needed by userspace when using default_machine_kexec */ |
| 267 | kernel_end = __pa(_end); | 273 | kernel_end = cpu_to_be_ulong(__pa(_end)); |
| 268 | of_add_property(node, &kernel_end_prop); | 274 | of_add_property(node, &kernel_end_prop); |
| 269 | 275 | ||
| 270 | export_crashk_values(node); | 276 | export_crashk_values(node); |
diff --git a/arch/powerpc/kernel/machine_kexec_64.c b/arch/powerpc/kernel/machine_kexec_64.c index be4e6d648f60..59d229a2a3e0 100644 --- a/arch/powerpc/kernel/machine_kexec_64.c +++ b/arch/powerpc/kernel/machine_kexec_64.c | |||
| @@ -369,6 +369,7 @@ void default_machine_kexec(struct kimage *image) | |||
| 369 | 369 | ||
| 370 | /* Values we need to export to the second kernel via the device tree. */ | 370 | /* Values we need to export to the second kernel via the device tree. */ |
| 371 | static unsigned long htab_base; | 371 | static unsigned long htab_base; |
| 372 | static unsigned long htab_size; | ||
| 372 | 373 | ||
| 373 | static struct property htab_base_prop = { | 374 | static struct property htab_base_prop = { |
| 374 | .name = "linux,htab-base", | 375 | .name = "linux,htab-base", |
| @@ -379,7 +380,7 @@ static struct property htab_base_prop = { | |||
| 379 | static struct property htab_size_prop = { | 380 | static struct property htab_size_prop = { |
| 380 | .name = "linux,htab-size", | 381 | .name = "linux,htab-size", |
| 381 | .length = sizeof(unsigned long), | 382 | .length = sizeof(unsigned long), |
| 382 | .value = &htab_size_bytes, | 383 | .value = &htab_size, |
| 383 | }; | 384 | }; |
| 384 | 385 | ||
| 385 | static int __init export_htab_values(void) | 386 | static int __init export_htab_values(void) |
| @@ -403,8 +404,9 @@ static int __init export_htab_values(void) | |||
| 403 | if (prop) | 404 | if (prop) |
| 404 | of_remove_property(node, prop); | 405 | of_remove_property(node, prop); |
| 405 | 406 | ||
| 406 | htab_base = __pa(htab_address); | 407 | htab_base = cpu_to_be64(__pa(htab_address)); |
| 407 | of_add_property(node, &htab_base_prop); | 408 | of_add_property(node, &htab_base_prop); |
| 409 | htab_size = cpu_to_be64(htab_size_bytes); | ||
| 408 | of_add_property(node, &htab_size_prop); | 410 | of_add_property(node, &htab_size_prop); |
| 409 | 411 | ||
| 410 | of_node_put(node); | 412 | of_node_put(node); |
diff --git a/arch/powerpc/kernel/misc_32.S b/arch/powerpc/kernel/misc_32.S index 879f09620f83..7c6bb4b17b49 100644 --- a/arch/powerpc/kernel/misc_32.S +++ b/arch/powerpc/kernel/misc_32.S | |||
| @@ -57,11 +57,14 @@ _GLOBAL(call_do_softirq) | |||
| 57 | mtlr r0 | 57 | mtlr r0 |
| 58 | blr | 58 | blr |
| 59 | 59 | ||
| 60 | /* | ||
| 61 | * void call_do_irq(struct pt_regs *regs, struct thread_info *irqtp); | ||
| 62 | */ | ||
| 60 | _GLOBAL(call_do_irq) | 63 | _GLOBAL(call_do_irq) |
| 61 | mflr r0 | 64 | mflr r0 |
| 62 | stw r0,4(r1) | 65 | stw r0,4(r1) |
| 63 | lwz r10,THREAD+KSP_LIMIT(r2) | 66 | lwz r10,THREAD+KSP_LIMIT(r2) |
| 64 | addi r11,r3,THREAD_INFO_GAP | 67 | addi r11,r4,THREAD_INFO_GAP |
| 65 | stwu r1,THREAD_SIZE-STACK_FRAME_OVERHEAD(r4) | 68 | stwu r1,THREAD_SIZE-STACK_FRAME_OVERHEAD(r4) |
| 66 | mr r1,r4 | 69 | mr r1,r4 |
| 67 | stw r10,8(r1) | 70 | stw r10,8(r1) |
diff --git a/arch/powerpc/kernel/reloc_64.S b/arch/powerpc/kernel/reloc_64.S index b47a0e1ab001..1482327cfeba 100644 --- a/arch/powerpc/kernel/reloc_64.S +++ b/arch/powerpc/kernel/reloc_64.S | |||
| @@ -69,8 +69,8 @@ _GLOBAL(relocate) | |||
| 69 | * R_PPC64_RELATIVE ones. | 69 | * R_PPC64_RELATIVE ones. |
| 70 | */ | 70 | */ |
| 71 | mtctr r8 | 71 | mtctr r8 |
| 72 | 5: lwz r0,12(9) /* ELF64_R_TYPE(reloc->r_info) */ | 72 | 5: ld r0,8(9) /* ELF64_R_TYPE(reloc->r_info) */ |
| 73 | cmpwi r0,R_PPC64_RELATIVE | 73 | cmpdi r0,R_PPC64_RELATIVE |
| 74 | bne 6f | 74 | bne 6f |
| 75 | ld r6,0(r9) /* reloc->r_offset */ | 75 | ld r6,0(r9) /* reloc->r_offset */ |
| 76 | ld r0,16(r9) /* reloc->r_addend */ | 76 | ld r0,16(r9) /* reloc->r_addend */ |
diff --git a/arch/powerpc/kernel/setup_32.c b/arch/powerpc/kernel/setup_32.c index 2b0da27eaee4..04cc4fcca78b 100644 --- a/arch/powerpc/kernel/setup_32.c +++ b/arch/powerpc/kernel/setup_32.c | |||
| @@ -247,7 +247,12 @@ static void __init exc_lvl_early_init(void) | |||
| 247 | /* interrupt stacks must be in lowmem, we get that for free on ppc32 | 247 | /* interrupt stacks must be in lowmem, we get that for free on ppc32 |
| 248 | * as the memblock is limited to lowmem by MEMBLOCK_REAL_LIMIT */ | 248 | * as the memblock is limited to lowmem by MEMBLOCK_REAL_LIMIT */ |
| 249 | for_each_possible_cpu(i) { | 249 | for_each_possible_cpu(i) { |
| 250 | #ifdef CONFIG_SMP | ||
| 250 | hw_cpu = get_hard_smp_processor_id(i); | 251 | hw_cpu = get_hard_smp_processor_id(i); |
| 252 | #else | ||
| 253 | hw_cpu = 0; | ||
| 254 | #endif | ||
| 255 | |||
| 251 | critirq_ctx[hw_cpu] = (struct thread_info *) | 256 | critirq_ctx[hw_cpu] = (struct thread_info *) |
| 252 | __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE)); | 257 | __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE)); |
| 253 | #ifdef CONFIG_BOOKE | 258 | #ifdef CONFIG_BOOKE |
diff --git a/arch/powerpc/kernel/vdso32/vdso32_wrapper.S b/arch/powerpc/kernel/vdso32/vdso32_wrapper.S index 79683d0393f5..6ac107ac402a 100644 --- a/arch/powerpc/kernel/vdso32/vdso32_wrapper.S +++ b/arch/powerpc/kernel/vdso32/vdso32_wrapper.S | |||
| @@ -6,7 +6,7 @@ | |||
| 6 | .globl vdso32_start, vdso32_end | 6 | .globl vdso32_start, vdso32_end |
| 7 | .balign PAGE_SIZE | 7 | .balign PAGE_SIZE |
| 8 | vdso32_start: | 8 | vdso32_start: |
| 9 | .incbin "arch/powerpc/kernel/vdso32/vdso32.so" | 9 | .incbin "arch/powerpc/kernel/vdso32/vdso32.so.dbg" |
| 10 | .balign PAGE_SIZE | 10 | .balign PAGE_SIZE |
| 11 | vdso32_end: | 11 | vdso32_end: |
| 12 | 12 | ||
diff --git a/arch/powerpc/kernel/vdso64/vdso64_wrapper.S b/arch/powerpc/kernel/vdso64/vdso64_wrapper.S index 8df9e2463007..df60fca6a13d 100644 --- a/arch/powerpc/kernel/vdso64/vdso64_wrapper.S +++ b/arch/powerpc/kernel/vdso64/vdso64_wrapper.S | |||
| @@ -6,7 +6,7 @@ | |||
| 6 | .globl vdso64_start, vdso64_end | 6 | .globl vdso64_start, vdso64_end |
| 7 | .balign PAGE_SIZE | 7 | .balign PAGE_SIZE |
| 8 | vdso64_start: | 8 | vdso64_start: |
| 9 | .incbin "arch/powerpc/kernel/vdso64/vdso64.so" | 9 | .incbin "arch/powerpc/kernel/vdso64/vdso64.so.dbg" |
| 10 | .balign PAGE_SIZE | 10 | .balign PAGE_SIZE |
| 11 | vdso64_end: | 11 | vdso64_end: |
| 12 | 12 | ||
diff --git a/arch/powerpc/mm/hash_utils_64.c b/arch/powerpc/mm/hash_utils_64.c index de6881259aef..d766d6ee33fe 100644 --- a/arch/powerpc/mm/hash_utils_64.c +++ b/arch/powerpc/mm/hash_utils_64.c | |||
| @@ -207,6 +207,20 @@ int htab_bolt_mapping(unsigned long vstart, unsigned long vend, | |||
| 207 | if (overlaps_kernel_text(vaddr, vaddr + step)) | 207 | if (overlaps_kernel_text(vaddr, vaddr + step)) |
| 208 | tprot &= ~HPTE_R_N; | 208 | tprot &= ~HPTE_R_N; |
| 209 | 209 | ||
| 210 | /* | ||
| 211 | * If relocatable, check if it overlaps interrupt vectors that | ||
| 212 | * are copied down to real 0. For relocatable kernel | ||
| 213 | * (e.g. kdump case) we copy interrupt vectors down to real | ||
| 214 | * address 0. Mark that region as executable. This is | ||
| 215 | * because on p8 system with relocation on exception feature | ||
| 216 | * enabled, exceptions are raised with MMU (IR=DR=1) ON. Hence | ||
| 217 | * in order to execute the interrupt handlers in virtual | ||
| 218 | * mode the vector region need to be marked as executable. | ||
| 219 | */ | ||
| 220 | if ((PHYSICAL_START > MEMORY_START) && | ||
| 221 | overlaps_interrupt_vector_text(vaddr, vaddr + step)) | ||
| 222 | tprot &= ~HPTE_R_N; | ||
| 223 | |||
| 210 | hash = hpt_hash(vpn, shift, ssize); | 224 | hash = hpt_hash(vpn, shift, ssize); |
| 211 | hpteg = ((hash & htab_hash_mask) * HPTES_PER_GROUP); | 225 | hpteg = ((hash & htab_hash_mask) * HPTES_PER_GROUP); |
| 212 | 226 | ||
diff --git a/arch/powerpc/mm/pgtable_64.c b/arch/powerpc/mm/pgtable_64.c index 65b7b65e8708..62bf5e8e78da 100644 --- a/arch/powerpc/mm/pgtable_64.c +++ b/arch/powerpc/mm/pgtable_64.c | |||
| @@ -510,7 +510,8 @@ int pmdp_set_access_flags(struct vm_area_struct *vma, unsigned long address, | |||
| 510 | } | 510 | } |
| 511 | 511 | ||
| 512 | unsigned long pmd_hugepage_update(struct mm_struct *mm, unsigned long addr, | 512 | unsigned long pmd_hugepage_update(struct mm_struct *mm, unsigned long addr, |
| 513 | pmd_t *pmdp, unsigned long clr) | 513 | pmd_t *pmdp, unsigned long clr, |
| 514 | unsigned long set) | ||
| 514 | { | 515 | { |
| 515 | 516 | ||
| 516 | unsigned long old, tmp; | 517 | unsigned long old, tmp; |
| @@ -526,14 +527,15 @@ unsigned long pmd_hugepage_update(struct mm_struct *mm, unsigned long addr, | |||
| 526 | andi. %1,%0,%6\n\ | 527 | andi. %1,%0,%6\n\ |
| 527 | bne- 1b \n\ | 528 | bne- 1b \n\ |
| 528 | andc %1,%0,%4 \n\ | 529 | andc %1,%0,%4 \n\ |
| 530 | or %1,%1,%7\n\ | ||
| 529 | stdcx. %1,0,%3 \n\ | 531 | stdcx. %1,0,%3 \n\ |
| 530 | bne- 1b" | 532 | bne- 1b" |
| 531 | : "=&r" (old), "=&r" (tmp), "=m" (*pmdp) | 533 | : "=&r" (old), "=&r" (tmp), "=m" (*pmdp) |
| 532 | : "r" (pmdp), "r" (clr), "m" (*pmdp), "i" (_PAGE_BUSY) | 534 | : "r" (pmdp), "r" (clr), "m" (*pmdp), "i" (_PAGE_BUSY), "r" (set) |
| 533 | : "cc" ); | 535 | : "cc" ); |
| 534 | #else | 536 | #else |
| 535 | old = pmd_val(*pmdp); | 537 | old = pmd_val(*pmdp); |
| 536 | *pmdp = __pmd(old & ~clr); | 538 | *pmdp = __pmd((old & ~clr) | set); |
| 537 | #endif | 539 | #endif |
| 538 | if (old & _PAGE_HASHPTE) | 540 | if (old & _PAGE_HASHPTE) |
| 539 | hpte_do_hugepage_flush(mm, addr, pmdp); | 541 | hpte_do_hugepage_flush(mm, addr, pmdp); |
| @@ -708,7 +710,7 @@ void set_pmd_at(struct mm_struct *mm, unsigned long addr, | |||
| 708 | void pmdp_invalidate(struct vm_area_struct *vma, unsigned long address, | 710 | void pmdp_invalidate(struct vm_area_struct *vma, unsigned long address, |
| 709 | pmd_t *pmdp) | 711 | pmd_t *pmdp) |
| 710 | { | 712 | { |
| 711 | pmd_hugepage_update(vma->vm_mm, address, pmdp, _PAGE_PRESENT); | 713 | pmd_hugepage_update(vma->vm_mm, address, pmdp, _PAGE_PRESENT, 0); |
| 712 | } | 714 | } |
| 713 | 715 | ||
| 714 | /* | 716 | /* |
| @@ -835,7 +837,7 @@ pmd_t pmdp_get_and_clear(struct mm_struct *mm, | |||
| 835 | unsigned long old; | 837 | unsigned long old; |
| 836 | pgtable_t *pgtable_slot; | 838 | pgtable_t *pgtable_slot; |
| 837 | 839 | ||
| 838 | old = pmd_hugepage_update(mm, addr, pmdp, ~0UL); | 840 | old = pmd_hugepage_update(mm, addr, pmdp, ~0UL, 0); |
| 839 | old_pmd = __pmd(old); | 841 | old_pmd = __pmd(old); |
| 840 | /* | 842 | /* |
| 841 | * We have pmd == none and we are holding page_table_lock. | 843 | * We have pmd == none and we are holding page_table_lock. |
diff --git a/arch/powerpc/mm/subpage-prot.c b/arch/powerpc/mm/subpage-prot.c index a770df2dae70..6c0b1f5f8d2c 100644 --- a/arch/powerpc/mm/subpage-prot.c +++ b/arch/powerpc/mm/subpage-prot.c | |||
| @@ -78,7 +78,7 @@ static void hpte_flush_range(struct mm_struct *mm, unsigned long addr, | |||
| 78 | pte = pte_offset_map_lock(mm, pmd, addr, &ptl); | 78 | pte = pte_offset_map_lock(mm, pmd, addr, &ptl); |
| 79 | arch_enter_lazy_mmu_mode(); | 79 | arch_enter_lazy_mmu_mode(); |
| 80 | for (; npages > 0; --npages) { | 80 | for (; npages > 0; --npages) { |
| 81 | pte_update(mm, addr, pte, 0, 0); | 81 | pte_update(mm, addr, pte, 0, 0, 0); |
| 82 | addr += PAGE_SIZE; | 82 | addr += PAGE_SIZE; |
| 83 | ++pte; | 83 | ++pte; |
| 84 | } | 84 | } |
diff --git a/arch/powerpc/perf/core-book3s.c b/arch/powerpc/perf/core-book3s.c index 29b89e863d7c..67cf22083f4c 100644 --- a/arch/powerpc/perf/core-book3s.c +++ b/arch/powerpc/perf/core-book3s.c | |||
| @@ -1147,6 +1147,9 @@ static void power_pmu_enable(struct pmu *pmu) | |||
| 1147 | mmcr0 = ebb_switch_in(ebb, cpuhw->mmcr[0]); | 1147 | mmcr0 = ebb_switch_in(ebb, cpuhw->mmcr[0]); |
| 1148 | 1148 | ||
| 1149 | mb(); | 1149 | mb(); |
| 1150 | if (cpuhw->bhrb_users) | ||
| 1151 | ppmu->config_bhrb(cpuhw->bhrb_filter); | ||
| 1152 | |||
| 1150 | write_mmcr0(cpuhw, mmcr0); | 1153 | write_mmcr0(cpuhw, mmcr0); |
| 1151 | 1154 | ||
| 1152 | /* | 1155 | /* |
| @@ -1158,8 +1161,6 @@ static void power_pmu_enable(struct pmu *pmu) | |||
| 1158 | } | 1161 | } |
| 1159 | 1162 | ||
| 1160 | out: | 1163 | out: |
| 1161 | if (cpuhw->bhrb_users) | ||
| 1162 | ppmu->config_bhrb(cpuhw->bhrb_filter); | ||
| 1163 | 1164 | ||
| 1164 | local_irq_restore(flags); | 1165 | local_irq_restore(flags); |
| 1165 | } | 1166 | } |
diff --git a/arch/powerpc/perf/power8-pmu.c b/arch/powerpc/perf/power8-pmu.c index a3f7abd2f13f..96cee20dcd34 100644 --- a/arch/powerpc/perf/power8-pmu.c +++ b/arch/powerpc/perf/power8-pmu.c | |||
| @@ -25,6 +25,37 @@ | |||
| 25 | #define PM_BRU_FIN 0x10068 | 25 | #define PM_BRU_FIN 0x10068 |
| 26 | #define PM_BR_MPRED_CMPL 0x400f6 | 26 | #define PM_BR_MPRED_CMPL 0x400f6 |
| 27 | 27 | ||
| 28 | /* All L1 D cache load references counted at finish, gated by reject */ | ||
| 29 | #define PM_LD_REF_L1 0x100ee | ||
| 30 | /* Load Missed L1 */ | ||
| 31 | #define PM_LD_MISS_L1 0x3e054 | ||
| 32 | /* Store Missed L1 */ | ||
| 33 | #define PM_ST_MISS_L1 0x300f0 | ||
| 34 | /* L1 cache data prefetches */ | ||
| 35 | #define PM_L1_PREF 0x0d8b8 | ||
| 36 | /* Instruction fetches from L1 */ | ||
| 37 | #define PM_INST_FROM_L1 0x04080 | ||
| 38 | /* Demand iCache Miss */ | ||
| 39 | #define PM_L1_ICACHE_MISS 0x200fd | ||
| 40 | /* Instruction Demand sectors wriittent into IL1 */ | ||
| 41 | #define PM_L1_DEMAND_WRITE 0x0408c | ||
| 42 | /* Instruction prefetch written into IL1 */ | ||
| 43 | #define PM_IC_PREF_WRITE 0x0408e | ||
| 44 | /* The data cache was reloaded from local core's L3 due to a demand load */ | ||
| 45 | #define PM_DATA_FROM_L3 0x4c042 | ||
| 46 | /* Demand LD - L3 Miss (not L2 hit and not L3 hit) */ | ||
| 47 | #define PM_DATA_FROM_L3MISS 0x300fe | ||
| 48 | /* All successful D-side store dispatches for this thread */ | ||
| 49 | #define PM_L2_ST 0x17080 | ||
| 50 | /* All successful D-side store dispatches for this thread that were L2 Miss */ | ||
| 51 | #define PM_L2_ST_MISS 0x17082 | ||
| 52 | /* Total HW L3 prefetches(Load+store) */ | ||
| 53 | #define PM_L3_PREF_ALL 0x4e052 | ||
| 54 | /* Data PTEG reload */ | ||
| 55 | #define PM_DTLB_MISS 0x300fc | ||
| 56 | /* ITLB Reloaded */ | ||
| 57 | #define PM_ITLB_MISS 0x400fc | ||
| 58 | |||
| 28 | 59 | ||
| 29 | /* | 60 | /* |
| 30 | * Raw event encoding for POWER8: | 61 | * Raw event encoding for POWER8: |
| @@ -557,6 +588,8 @@ static int power8_generic_events[] = { | |||
| 557 | [PERF_COUNT_HW_INSTRUCTIONS] = PM_INST_CMPL, | 588 | [PERF_COUNT_HW_INSTRUCTIONS] = PM_INST_CMPL, |
| 558 | [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = PM_BRU_FIN, | 589 | [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = PM_BRU_FIN, |
| 559 | [PERF_COUNT_HW_BRANCH_MISSES] = PM_BR_MPRED_CMPL, | 590 | [PERF_COUNT_HW_BRANCH_MISSES] = PM_BR_MPRED_CMPL, |
| 591 | [PERF_COUNT_HW_CACHE_REFERENCES] = PM_LD_REF_L1, | ||
| 592 | [PERF_COUNT_HW_CACHE_MISSES] = PM_LD_MISS_L1, | ||
| 560 | }; | 593 | }; |
| 561 | 594 | ||
| 562 | static u64 power8_bhrb_filter_map(u64 branch_sample_type) | 595 | static u64 power8_bhrb_filter_map(u64 branch_sample_type) |
| @@ -596,6 +629,116 @@ static void power8_config_bhrb(u64 pmu_bhrb_filter) | |||
| 596 | mtspr(SPRN_MMCRA, (mfspr(SPRN_MMCRA) | pmu_bhrb_filter)); | 629 | mtspr(SPRN_MMCRA, (mfspr(SPRN_MMCRA) | pmu_bhrb_filter)); |
| 597 | } | 630 | } |
| 598 | 631 | ||
| 632 | #define C(x) PERF_COUNT_HW_CACHE_##x | ||
| 633 | |||
| 634 | /* | ||
| 635 | * Table of generalized cache-related events. | ||
| 636 | * 0 means not supported, -1 means nonsensical, other values | ||
| 637 | * are event codes. | ||
| 638 | */ | ||
| 639 | static int power8_cache_events[C(MAX)][C(OP_MAX)][C(RESULT_MAX)] = { | ||
| 640 | [ C(L1D) ] = { | ||
| 641 | [ C(OP_READ) ] = { | ||
| 642 | [ C(RESULT_ACCESS) ] = PM_LD_REF_L1, | ||
| 643 | [ C(RESULT_MISS) ] = PM_LD_MISS_L1, | ||
| 644 | }, | ||
| 645 | [ C(OP_WRITE) ] = { | ||
| 646 | [ C(RESULT_ACCESS) ] = 0, | ||
| 647 | [ C(RESULT_MISS) ] = PM_ST_MISS_L1, | ||
| 648 | }, | ||
| 649 | [ C(OP_PREFETCH) ] = { | ||
| 650 | [ C(RESULT_ACCESS) ] = PM_L1_PREF, | ||
| 651 | [ C(RESULT_MISS) ] = 0, | ||
| 652 | }, | ||
| 653 | }, | ||
| 654 | [ C(L1I) ] = { | ||
| 655 | [ C(OP_READ) ] = { | ||
| 656 | [ C(RESULT_ACCESS) ] = PM_INST_FROM_L1, | ||
| 657 | [ C(RESULT_MISS) ] = PM_L1_ICACHE_MISS, | ||
| 658 | }, | ||
| 659 | [ C(OP_WRITE) ] = { | ||
| 660 | [ C(RESULT_ACCESS) ] = PM_L1_DEMAND_WRITE, | ||
| 661 | [ C(RESULT_MISS) ] = -1, | ||
| 662 | }, | ||
| 663 | [ C(OP_PREFETCH) ] = { | ||
| 664 | [ C(RESULT_ACCESS) ] = PM_IC_PREF_WRITE, | ||
| 665 | [ C(RESULT_MISS) ] = 0, | ||
| 666 | }, | ||
| 667 | }, | ||
| 668 | [ C(LL) ] = { | ||
| 669 | [ C(OP_READ) ] = { | ||
| 670 | [ C(RESULT_ACCESS) ] = PM_DATA_FROM_L3, | ||
| 671 | [ C(RESULT_MISS) ] = PM_DATA_FROM_L3MISS, | ||
| 672 | }, | ||
| 673 | [ C(OP_WRITE) ] = { | ||
| 674 | [ C(RESULT_ACCESS) ] = PM_L2_ST, | ||
| 675 | [ C(RESULT_MISS) ] = PM_L2_ST_MISS, | ||
| 676 | }, | ||
| 677 | [ C(OP_PREFETCH) ] = { | ||
| 678 | [ C(RESULT_ACCESS) ] = PM_L3_PREF_ALL, | ||
| 679 | [ C(RESULT_MISS) ] = 0, | ||
| 680 | }, | ||
| 681 | }, | ||
| 682 | [ C(DTLB) ] = { | ||
| 683 | [ C(OP_READ) ] = { | ||
| 684 | [ C(RESULT_ACCESS) ] = 0, | ||
| 685 | [ C(RESULT_MISS) ] = PM_DTLB_MISS, | ||
| 686 | }, | ||
| 687 | [ C(OP_WRITE) ] = { | ||
| 688 | [ C(RESULT_ACCESS) ] = -1, | ||
| 689 | [ C(RESULT_MISS) ] = -1, | ||
| 690 | }, | ||
| 691 | [ C(OP_PREFETCH) ] = { | ||
| 692 | [ C(RESULT_ACCESS) ] = -1, | ||
| 693 | [ C(RESULT_MISS) ] = -1, | ||
| 694 | }, | ||
| 695 | }, | ||
| 696 | [ C(ITLB) ] = { | ||
| 697 | [ C(OP_READ) ] = { | ||
| 698 | [ C(RESULT_ACCESS) ] = 0, | ||
| 699 | [ C(RESULT_MISS) ] = PM_ITLB_MISS, | ||
| 700 | }, | ||
| 701 | [ C(OP_WRITE) ] = { | ||
| 702 | [ C(RESULT_ACCESS) ] = -1, | ||
| 703 | [ C(RESULT_MISS) ] = -1, | ||
| 704 | }, | ||
| 705 | [ C(OP_PREFETCH) ] = { | ||
| 706 | [ C(RESULT_ACCESS) ] = -1, | ||
| 707 | [ C(RESULT_MISS) ] = -1, | ||
| 708 | }, | ||
| 709 | }, | ||
| 710 | [ C(BPU) ] = { | ||
| 711 | [ C(OP_READ) ] = { | ||
| 712 | [ C(RESULT_ACCESS) ] = PM_BRU_FIN, | ||
| 713 | [ C(RESULT_MISS) ] = PM_BR_MPRED_CMPL, | ||
| 714 | }, | ||
| 715 | [ C(OP_WRITE) ] = { | ||
| 716 | [ C(RESULT_ACCESS) ] = -1, | ||
| 717 | [ C(RESULT_MISS) ] = -1, | ||
| 718 | }, | ||
| 719 | [ C(OP_PREFETCH) ] = { | ||
| 720 | [ C(RESULT_ACCESS) ] = -1, | ||
| 721 | [ C(RESULT_MISS) ] = -1, | ||
| 722 | }, | ||
| 723 | }, | ||
| 724 | [ C(NODE) ] = { | ||
| 725 | [ C(OP_READ) ] = { | ||
| 726 | [ C(RESULT_ACCESS) ] = -1, | ||
| 727 | [ C(RESULT_MISS) ] = -1, | ||
| 728 | }, | ||
| 729 | [ C(OP_WRITE) ] = { | ||
| 730 | [ C(RESULT_ACCESS) ] = -1, | ||
| 731 | [ C(RESULT_MISS) ] = -1, | ||
| 732 | }, | ||
| 733 | [ C(OP_PREFETCH) ] = { | ||
| 734 | [ C(RESULT_ACCESS) ] = -1, | ||
| 735 | [ C(RESULT_MISS) ] = -1, | ||
| 736 | }, | ||
| 737 | }, | ||
| 738 | }; | ||
| 739 | |||
| 740 | #undef C | ||
| 741 | |||
| 599 | static struct power_pmu power8_pmu = { | 742 | static struct power_pmu power8_pmu = { |
| 600 | .name = "POWER8", | 743 | .name = "POWER8", |
| 601 | .n_counter = 6, | 744 | .n_counter = 6, |
| @@ -611,6 +754,7 @@ static struct power_pmu power8_pmu = { | |||
| 611 | .flags = PPMU_HAS_SSLOT | PPMU_HAS_SIER | PPMU_BHRB | PPMU_EBB, | 754 | .flags = PPMU_HAS_SSLOT | PPMU_HAS_SIER | PPMU_BHRB | PPMU_EBB, |
| 612 | .n_generic = ARRAY_SIZE(power8_generic_events), | 755 | .n_generic = ARRAY_SIZE(power8_generic_events), |
| 613 | .generic_events = power8_generic_events, | 756 | .generic_events = power8_generic_events, |
| 757 | .cache_events = &power8_cache_events, | ||
| 614 | .attr_groups = power8_pmu_attr_groups, | 758 | .attr_groups = power8_pmu_attr_groups, |
| 615 | .bhrb_nr = 32, | 759 | .bhrb_nr = 32, |
| 616 | }; | 760 | }; |
diff --git a/arch/powerpc/platforms/powernv/eeh-ioda.c b/arch/powerpc/platforms/powernv/eeh-ioda.c index e1e71618b70c..f51474336460 100644 --- a/arch/powerpc/platforms/powernv/eeh-ioda.c +++ b/arch/powerpc/platforms/powernv/eeh-ioda.c | |||
| @@ -44,7 +44,8 @@ static int ioda_eeh_event(struct notifier_block *nb, | |||
| 44 | 44 | ||
| 45 | /* We simply send special EEH event */ | 45 | /* We simply send special EEH event */ |
| 46 | if ((changed_evts & OPAL_EVENT_PCI_ERROR) && | 46 | if ((changed_evts & OPAL_EVENT_PCI_ERROR) && |
| 47 | (events & OPAL_EVENT_PCI_ERROR)) | 47 | (events & OPAL_EVENT_PCI_ERROR) && |
| 48 | eeh_enabled()) | ||
| 48 | eeh_send_failure_event(NULL); | 49 | eeh_send_failure_event(NULL); |
| 49 | 50 | ||
| 50 | return 0; | 51 | return 0; |
| @@ -489,8 +490,7 @@ static int ioda_eeh_bridge_reset(struct pci_controller *hose, | |||
| 489 | static int ioda_eeh_reset(struct eeh_pe *pe, int option) | 490 | static int ioda_eeh_reset(struct eeh_pe *pe, int option) |
| 490 | { | 491 | { |
| 491 | struct pci_controller *hose = pe->phb; | 492 | struct pci_controller *hose = pe->phb; |
| 492 | struct eeh_dev *edev; | 493 | struct pci_bus *bus; |
| 493 | struct pci_dev *dev; | ||
| 494 | int ret; | 494 | int ret; |
| 495 | 495 | ||
| 496 | /* | 496 | /* |
| @@ -519,31 +519,11 @@ static int ioda_eeh_reset(struct eeh_pe *pe, int option) | |||
| 519 | if (pe->type & EEH_PE_PHB) { | 519 | if (pe->type & EEH_PE_PHB) { |
| 520 | ret = ioda_eeh_phb_reset(hose, option); | 520 | ret = ioda_eeh_phb_reset(hose, option); |
| 521 | } else { | 521 | } else { |
| 522 | if (pe->type & EEH_PE_DEVICE) { | 522 | bus = eeh_pe_bus_get(pe); |
| 523 | /* | 523 | if (pci_is_root_bus(bus)) |
| 524 | * If it's device PE, we didn't refer to the parent | ||
| 525 | * PCI bus yet. So we have to figure it out indirectly. | ||
| 526 | */ | ||
| 527 | edev = list_first_entry(&pe->edevs, | ||
| 528 | struct eeh_dev, list); | ||
| 529 | dev = eeh_dev_to_pci_dev(edev); | ||
| 530 | dev = dev->bus->self; | ||
| 531 | } else { | ||
| 532 | /* | ||
| 533 | * If it's bus PE, the parent PCI bus is already there | ||
| 534 | * and just pick it up. | ||
| 535 | */ | ||
| 536 | dev = pe->bus->self; | ||
| 537 | } | ||
| 538 | |||
| 539 | /* | ||
| 540 | * Do reset based on the fact that the direct upstream bridge | ||
| 541 | * is root bridge (port) or not. | ||
| 542 | */ | ||
| 543 | if (dev->bus->number == 0) | ||
| 544 | ret = ioda_eeh_root_reset(hose, option); | 524 | ret = ioda_eeh_root_reset(hose, option); |
| 545 | else | 525 | else |
| 546 | ret = ioda_eeh_bridge_reset(hose, dev, option); | 526 | ret = ioda_eeh_bridge_reset(hose, bus->self, option); |
| 547 | } | 527 | } |
| 548 | 528 | ||
| 549 | return ret; | 529 | return ret; |
diff --git a/arch/powerpc/platforms/powernv/eeh-powernv.c b/arch/powerpc/platforms/powernv/eeh-powernv.c index a79fddc5e74e..a59788e83b8b 100644 --- a/arch/powerpc/platforms/powernv/eeh-powernv.c +++ b/arch/powerpc/platforms/powernv/eeh-powernv.c | |||
| @@ -145,7 +145,7 @@ static int powernv_eeh_dev_probe(struct pci_dev *dev, void *flag) | |||
| 145 | * Enable EEH explicitly so that we will do EEH check | 145 | * Enable EEH explicitly so that we will do EEH check |
| 146 | * while accessing I/O stuff | 146 | * while accessing I/O stuff |
| 147 | */ | 147 | */ |
| 148 | eeh_subsystem_enabled = 1; | 148 | eeh_set_enable(true); |
| 149 | 149 | ||
| 150 | /* Save memory bars */ | 150 | /* Save memory bars */ |
| 151 | eeh_save_bars(edev); | 151 | eeh_save_bars(edev); |
diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c index 7d6dcc6d5fa9..3b2b4fb3585b 100644 --- a/arch/powerpc/platforms/powernv/pci-ioda.c +++ b/arch/powerpc/platforms/powernv/pci-ioda.c | |||
| @@ -21,6 +21,7 @@ | |||
| 21 | #include <linux/irq.h> | 21 | #include <linux/irq.h> |
| 22 | #include <linux/io.h> | 22 | #include <linux/io.h> |
| 23 | #include <linux/msi.h> | 23 | #include <linux/msi.h> |
| 24 | #include <linux/memblock.h> | ||
| 24 | 25 | ||
| 25 | #include <asm/sections.h> | 26 | #include <asm/sections.h> |
| 26 | #include <asm/io.h> | 27 | #include <asm/io.h> |
| @@ -460,9 +461,39 @@ static void pnv_pci_ioda_dma_dev_setup(struct pnv_phb *phb, struct pci_dev *pdev | |||
| 460 | return; | 461 | return; |
| 461 | 462 | ||
| 462 | pe = &phb->ioda.pe_array[pdn->pe_number]; | 463 | pe = &phb->ioda.pe_array[pdn->pe_number]; |
| 464 | WARN_ON(get_dma_ops(&pdev->dev) != &dma_iommu_ops); | ||
| 463 | set_iommu_table_base_and_group(&pdev->dev, &pe->tce32_table); | 465 | set_iommu_table_base_and_group(&pdev->dev, &pe->tce32_table); |
| 464 | } | 466 | } |
| 465 | 467 | ||
| 468 | static int pnv_pci_ioda_dma_set_mask(struct pnv_phb *phb, | ||
| 469 | struct pci_dev *pdev, u64 dma_mask) | ||
| 470 | { | ||
| 471 | struct pci_dn *pdn = pci_get_pdn(pdev); | ||
| 472 | struct pnv_ioda_pe *pe; | ||
| 473 | uint64_t top; | ||
| 474 | bool bypass = false; | ||
| 475 | |||
| 476 | if (WARN_ON(!pdn || pdn->pe_number == IODA_INVALID_PE)) | ||
| 477 | return -ENODEV;; | ||
| 478 | |||
| 479 | pe = &phb->ioda.pe_array[pdn->pe_number]; | ||
| 480 | if (pe->tce_bypass_enabled) { | ||
| 481 | top = pe->tce_bypass_base + memblock_end_of_DRAM() - 1; | ||
| 482 | bypass = (dma_mask >= top); | ||
| 483 | } | ||
| 484 | |||
| 485 | if (bypass) { | ||
| 486 | dev_info(&pdev->dev, "Using 64-bit DMA iommu bypass\n"); | ||
| 487 | set_dma_ops(&pdev->dev, &dma_direct_ops); | ||
| 488 | set_dma_offset(&pdev->dev, pe->tce_bypass_base); | ||
| 489 | } else { | ||
| 490 | dev_info(&pdev->dev, "Using 32-bit DMA via iommu\n"); | ||
| 491 | set_dma_ops(&pdev->dev, &dma_iommu_ops); | ||
| 492 | set_iommu_table_base(&pdev->dev, &pe->tce32_table); | ||
| 493 | } | ||
| 494 | return 0; | ||
| 495 | } | ||
| 496 | |||
| 466 | static void pnv_ioda_setup_bus_dma(struct pnv_ioda_pe *pe, struct pci_bus *bus) | 497 | static void pnv_ioda_setup_bus_dma(struct pnv_ioda_pe *pe, struct pci_bus *bus) |
| 467 | { | 498 | { |
| 468 | struct pci_dev *dev; | 499 | struct pci_dev *dev; |
| @@ -657,6 +688,56 @@ static void pnv_pci_ioda_setup_dma_pe(struct pnv_phb *phb, | |||
| 657 | __free_pages(tce_mem, get_order(TCE32_TABLE_SIZE * segs)); | 688 | __free_pages(tce_mem, get_order(TCE32_TABLE_SIZE * segs)); |
| 658 | } | 689 | } |
| 659 | 690 | ||
| 691 | static void pnv_pci_ioda2_set_bypass(struct iommu_table *tbl, bool enable) | ||
| 692 | { | ||
| 693 | struct pnv_ioda_pe *pe = container_of(tbl, struct pnv_ioda_pe, | ||
| 694 | tce32_table); | ||
| 695 | uint16_t window_id = (pe->pe_number << 1 ) + 1; | ||
| 696 | int64_t rc; | ||
| 697 | |||
| 698 | pe_info(pe, "%sabling 64-bit DMA bypass\n", enable ? "En" : "Dis"); | ||
| 699 | if (enable) { | ||
| 700 | phys_addr_t top = memblock_end_of_DRAM(); | ||
| 701 | |||
| 702 | top = roundup_pow_of_two(top); | ||
| 703 | rc = opal_pci_map_pe_dma_window_real(pe->phb->opal_id, | ||
| 704 | pe->pe_number, | ||
| 705 | window_id, | ||
| 706 | pe->tce_bypass_base, | ||
| 707 | top); | ||
| 708 | } else { | ||
| 709 | rc = opal_pci_map_pe_dma_window_real(pe->phb->opal_id, | ||
| 710 | pe->pe_number, | ||
| 711 | window_id, | ||
| 712 | pe->tce_bypass_base, | ||
| 713 | 0); | ||
| 714 | |||
| 715 | /* | ||
| 716 | * We might want to reset the DMA ops of all devices on | ||
| 717 | * this PE. However in theory, that shouldn't be necessary | ||
| 718 | * as this is used for VFIO/KVM pass-through and the device | ||
| 719 | * hasn't yet been returned to its kernel driver | ||
| 720 | */ | ||
| 721 | } | ||
| 722 | if (rc) | ||
| 723 | pe_err(pe, "OPAL error %lld configuring bypass window\n", rc); | ||
| 724 | else | ||
| 725 | pe->tce_bypass_enabled = enable; | ||
| 726 | } | ||
| 727 | |||
| 728 | static void pnv_pci_ioda2_setup_bypass_pe(struct pnv_phb *phb, | ||
| 729 | struct pnv_ioda_pe *pe) | ||
| 730 | { | ||
| 731 | /* TVE #1 is selected by PCI address bit 59 */ | ||
| 732 | pe->tce_bypass_base = 1ull << 59; | ||
| 733 | |||
| 734 | /* Install set_bypass callback for VFIO */ | ||
| 735 | pe->tce32_table.set_bypass = pnv_pci_ioda2_set_bypass; | ||
| 736 | |||
| 737 | /* Enable bypass by default */ | ||
| 738 | pnv_pci_ioda2_set_bypass(&pe->tce32_table, true); | ||
| 739 | } | ||
| 740 | |||
| 660 | static void pnv_pci_ioda2_setup_dma_pe(struct pnv_phb *phb, | 741 | static void pnv_pci_ioda2_setup_dma_pe(struct pnv_phb *phb, |
| 661 | struct pnv_ioda_pe *pe) | 742 | struct pnv_ioda_pe *pe) |
| 662 | { | 743 | { |
| @@ -727,6 +808,8 @@ static void pnv_pci_ioda2_setup_dma_pe(struct pnv_phb *phb, | |||
| 727 | else | 808 | else |
| 728 | pnv_ioda_setup_bus_dma(pe, pe->pbus); | 809 | pnv_ioda_setup_bus_dma(pe, pe->pbus); |
| 729 | 810 | ||
| 811 | /* Also create a bypass window */ | ||
| 812 | pnv_pci_ioda2_setup_bypass_pe(phb, pe); | ||
| 730 | return; | 813 | return; |
| 731 | fail: | 814 | fail: |
| 732 | if (pe->tce32_seg >= 0) | 815 | if (pe->tce32_seg >= 0) |
| @@ -1286,6 +1369,7 @@ void __init pnv_pci_init_ioda_phb(struct device_node *np, | |||
| 1286 | 1369 | ||
| 1287 | /* Setup TCEs */ | 1370 | /* Setup TCEs */ |
| 1288 | phb->dma_dev_setup = pnv_pci_ioda_dma_dev_setup; | 1371 | phb->dma_dev_setup = pnv_pci_ioda_dma_dev_setup; |
| 1372 | phb->dma_set_mask = pnv_pci_ioda_dma_set_mask; | ||
| 1289 | 1373 | ||
| 1290 | /* Setup shutdown function for kexec */ | 1374 | /* Setup shutdown function for kexec */ |
| 1291 | phb->shutdown = pnv_pci_ioda_shutdown; | 1375 | phb->shutdown = pnv_pci_ioda_shutdown; |
diff --git a/arch/powerpc/platforms/powernv/pci.c b/arch/powerpc/platforms/powernv/pci.c index b555ebc57ef5..95633d79ef5d 100644 --- a/arch/powerpc/platforms/powernv/pci.c +++ b/arch/powerpc/platforms/powernv/pci.c | |||
| @@ -634,6 +634,16 @@ static void pnv_pci_dma_dev_setup(struct pci_dev *pdev) | |||
| 634 | pnv_pci_dma_fallback_setup(hose, pdev); | 634 | pnv_pci_dma_fallback_setup(hose, pdev); |
| 635 | } | 635 | } |
| 636 | 636 | ||
| 637 | int pnv_pci_dma_set_mask(struct pci_dev *pdev, u64 dma_mask) | ||
| 638 | { | ||
| 639 | struct pci_controller *hose = pci_bus_to_host(pdev->bus); | ||
| 640 | struct pnv_phb *phb = hose->private_data; | ||
| 641 | |||
| 642 | if (phb && phb->dma_set_mask) | ||
| 643 | return phb->dma_set_mask(phb, pdev, dma_mask); | ||
| 644 | return __dma_set_mask(&pdev->dev, dma_mask); | ||
| 645 | } | ||
| 646 | |||
| 637 | void pnv_pci_shutdown(void) | 647 | void pnv_pci_shutdown(void) |
| 638 | { | 648 | { |
| 639 | struct pci_controller *hose; | 649 | struct pci_controller *hose; |
diff --git a/arch/powerpc/platforms/powernv/pci.h b/arch/powerpc/platforms/powernv/pci.h index 13f1942a9a5f..cde169442775 100644 --- a/arch/powerpc/platforms/powernv/pci.h +++ b/arch/powerpc/platforms/powernv/pci.h | |||
| @@ -54,7 +54,9 @@ struct pnv_ioda_pe { | |||
| 54 | struct iommu_table tce32_table; | 54 | struct iommu_table tce32_table; |
| 55 | phys_addr_t tce_inval_reg_phys; | 55 | phys_addr_t tce_inval_reg_phys; |
| 56 | 56 | ||
| 57 | /* XXX TODO: Add support for additional 64-bit iommus */ | 57 | /* 64-bit TCE bypass region */ |
| 58 | bool tce_bypass_enabled; | ||
| 59 | uint64_t tce_bypass_base; | ||
| 58 | 60 | ||
| 59 | /* MSIs. MVE index is identical for for 32 and 64 bit MSI | 61 | /* MSIs. MVE index is identical for for 32 and 64 bit MSI |
| 60 | * and -1 if not supported. (It's actually identical to the | 62 | * and -1 if not supported. (It's actually identical to the |
| @@ -113,6 +115,8 @@ struct pnv_phb { | |||
| 113 | unsigned int hwirq, unsigned int virq, | 115 | unsigned int hwirq, unsigned int virq, |
| 114 | unsigned int is_64, struct msi_msg *msg); | 116 | unsigned int is_64, struct msi_msg *msg); |
| 115 | void (*dma_dev_setup)(struct pnv_phb *phb, struct pci_dev *pdev); | 117 | void (*dma_dev_setup)(struct pnv_phb *phb, struct pci_dev *pdev); |
| 118 | int (*dma_set_mask)(struct pnv_phb *phb, struct pci_dev *pdev, | ||
| 119 | u64 dma_mask); | ||
| 116 | void (*fixup_phb)(struct pci_controller *hose); | 120 | void (*fixup_phb)(struct pci_controller *hose); |
| 117 | u32 (*bdfn_to_pe)(struct pnv_phb *phb, struct pci_bus *bus, u32 devfn); | 121 | u32 (*bdfn_to_pe)(struct pnv_phb *phb, struct pci_bus *bus, u32 devfn); |
| 118 | void (*shutdown)(struct pnv_phb *phb); | 122 | void (*shutdown)(struct pnv_phb *phb); |
diff --git a/arch/powerpc/platforms/powernv/powernv.h b/arch/powerpc/platforms/powernv/powernv.h index de6819be1f95..0051e108ef0f 100644 --- a/arch/powerpc/platforms/powernv/powernv.h +++ b/arch/powerpc/platforms/powernv/powernv.h | |||
| @@ -7,12 +7,20 @@ extern void pnv_smp_init(void); | |||
| 7 | static inline void pnv_smp_init(void) { } | 7 | static inline void pnv_smp_init(void) { } |
| 8 | #endif | 8 | #endif |
| 9 | 9 | ||
| 10 | struct pci_dev; | ||
| 11 | |||
| 10 | #ifdef CONFIG_PCI | 12 | #ifdef CONFIG_PCI |
| 11 | extern void pnv_pci_init(void); | 13 | extern void pnv_pci_init(void); |
| 12 | extern void pnv_pci_shutdown(void); | 14 | extern void pnv_pci_shutdown(void); |
| 15 | extern int pnv_pci_dma_set_mask(struct pci_dev *pdev, u64 dma_mask); | ||
| 13 | #else | 16 | #else |
| 14 | static inline void pnv_pci_init(void) { } | 17 | static inline void pnv_pci_init(void) { } |
| 15 | static inline void pnv_pci_shutdown(void) { } | 18 | static inline void pnv_pci_shutdown(void) { } |
| 19 | |||
| 20 | static inline int pnv_pci_dma_set_mask(struct pci_dev *pdev, u64 dma_mask) | ||
| 21 | { | ||
| 22 | return -ENODEV; | ||
| 23 | } | ||
| 16 | #endif | 24 | #endif |
| 17 | 25 | ||
| 18 | extern void pnv_lpc_init(void); | 26 | extern void pnv_lpc_init(void); |
diff --git a/arch/powerpc/platforms/powernv/setup.c b/arch/powerpc/platforms/powernv/setup.c index 21166f65c97c..110f4fbd319f 100644 --- a/arch/powerpc/platforms/powernv/setup.c +++ b/arch/powerpc/platforms/powernv/setup.c | |||
| @@ -27,6 +27,7 @@ | |||
| 27 | #include <linux/interrupt.h> | 27 | #include <linux/interrupt.h> |
| 28 | #include <linux/bug.h> | 28 | #include <linux/bug.h> |
| 29 | #include <linux/cpuidle.h> | 29 | #include <linux/cpuidle.h> |
| 30 | #include <linux/pci.h> | ||
| 30 | 31 | ||
| 31 | #include <asm/machdep.h> | 32 | #include <asm/machdep.h> |
| 32 | #include <asm/firmware.h> | 33 | #include <asm/firmware.h> |
| @@ -141,6 +142,13 @@ static void pnv_progress(char *s, unsigned short hex) | |||
| 141 | { | 142 | { |
| 142 | } | 143 | } |
| 143 | 144 | ||
| 145 | static int pnv_dma_set_mask(struct device *dev, u64 dma_mask) | ||
| 146 | { | ||
| 147 | if (dev_is_pci(dev)) | ||
| 148 | return pnv_pci_dma_set_mask(to_pci_dev(dev), dma_mask); | ||
| 149 | return __dma_set_mask(dev, dma_mask); | ||
| 150 | } | ||
| 151 | |||
| 144 | static void pnv_shutdown(void) | 152 | static void pnv_shutdown(void) |
| 145 | { | 153 | { |
| 146 | /* Let the PCI code clear up IODA tables */ | 154 | /* Let the PCI code clear up IODA tables */ |
| @@ -238,6 +246,7 @@ define_machine(powernv) { | |||
| 238 | .machine_shutdown = pnv_shutdown, | 246 | .machine_shutdown = pnv_shutdown, |
| 239 | .power_save = powernv_idle, | 247 | .power_save = powernv_idle, |
| 240 | .calibrate_decr = generic_calibrate_decr, | 248 | .calibrate_decr = generic_calibrate_decr, |
| 249 | .dma_set_mask = pnv_dma_set_mask, | ||
| 241 | #ifdef CONFIG_KEXEC | 250 | #ifdef CONFIG_KEXEC |
| 242 | .kexec_cpu_down = pnv_kexec_cpu_down, | 251 | .kexec_cpu_down = pnv_kexec_cpu_down, |
| 243 | #endif | 252 | #endif |
diff --git a/arch/powerpc/platforms/pseries/Kconfig b/arch/powerpc/platforms/pseries/Kconfig index 37300f6ee244..80b1d57c306a 100644 --- a/arch/powerpc/platforms/pseries/Kconfig +++ b/arch/powerpc/platforms/pseries/Kconfig | |||
| @@ -20,6 +20,7 @@ config PPC_PSERIES | |||
| 20 | select PPC_DOORBELL | 20 | select PPC_DOORBELL |
| 21 | select HAVE_CONTEXT_TRACKING | 21 | select HAVE_CONTEXT_TRACKING |
| 22 | select HOTPLUG_CPU if SMP | 22 | select HOTPLUG_CPU if SMP |
| 23 | select ARCH_RANDOM | ||
| 23 | default y | 24 | default y |
| 24 | 25 | ||
| 25 | config PPC_SPLPAR | 26 | config PPC_SPLPAR |
diff --git a/arch/powerpc/platforms/pseries/eeh_pseries.c b/arch/powerpc/platforms/pseries/eeh_pseries.c index 9ef3cc8ebc11..8a8f0472d98f 100644 --- a/arch/powerpc/platforms/pseries/eeh_pseries.c +++ b/arch/powerpc/platforms/pseries/eeh_pseries.c | |||
| @@ -265,7 +265,7 @@ static void *pseries_eeh_of_probe(struct device_node *dn, void *flag) | |||
| 265 | enable = 1; | 265 | enable = 1; |
| 266 | 266 | ||
| 267 | if (enable) { | 267 | if (enable) { |
| 268 | eeh_subsystem_enabled = 1; | 268 | eeh_set_enable(true); |
| 269 | eeh_add_to_parent_pe(edev); | 269 | eeh_add_to_parent_pe(edev); |
| 270 | 270 | ||
| 271 | pr_debug("%s: EEH enabled on %s PHB#%d-PE#%x, config addr#%x\n", | 271 | pr_debug("%s: EEH enabled on %s PHB#%d-PE#%x, config addr#%x\n", |
diff --git a/arch/powerpc/platforms/pseries/pci.c b/arch/powerpc/platforms/pseries/pci.c index 70670a2d9cf2..c413ec158ff5 100644 --- a/arch/powerpc/platforms/pseries/pci.c +++ b/arch/powerpc/platforms/pseries/pci.c | |||
| @@ -113,7 +113,8 @@ int pseries_root_bridge_prepare(struct pci_host_bridge *bridge) | |||
| 113 | { | 113 | { |
| 114 | struct device_node *dn, *pdn; | 114 | struct device_node *dn, *pdn; |
| 115 | struct pci_bus *bus; | 115 | struct pci_bus *bus; |
| 116 | const __be32 *pcie_link_speed_stats; | 116 | u32 pcie_link_speed_stats[2]; |
| 117 | int rc; | ||
| 117 | 118 | ||
| 118 | bus = bridge->bus; | 119 | bus = bridge->bus; |
| 119 | 120 | ||
| @@ -122,38 +123,45 @@ int pseries_root_bridge_prepare(struct pci_host_bridge *bridge) | |||
| 122 | return 0; | 123 | return 0; |
| 123 | 124 | ||
| 124 | for (pdn = dn; pdn != NULL; pdn = of_get_next_parent(pdn)) { | 125 | for (pdn = dn; pdn != NULL; pdn = of_get_next_parent(pdn)) { |
| 125 | pcie_link_speed_stats = of_get_property(pdn, | 126 | rc = of_property_read_u32_array(pdn, |
| 126 | "ibm,pcie-link-speed-stats", NULL); | 127 | "ibm,pcie-link-speed-stats", |
| 127 | if (pcie_link_speed_stats) | 128 | &pcie_link_speed_stats[0], 2); |
| 129 | if (!rc) | ||
| 128 | break; | 130 | break; |
| 129 | } | 131 | } |
| 130 | 132 | ||
| 131 | of_node_put(pdn); | 133 | of_node_put(pdn); |
| 132 | 134 | ||
| 133 | if (!pcie_link_speed_stats) { | 135 | if (rc) { |
| 134 | pr_err("no ibm,pcie-link-speed-stats property\n"); | 136 | pr_err("no ibm,pcie-link-speed-stats property\n"); |
| 135 | return 0; | 137 | return 0; |
| 136 | } | 138 | } |
| 137 | 139 | ||
| 138 | switch (be32_to_cpup(pcie_link_speed_stats)) { | 140 | switch (pcie_link_speed_stats[0]) { |
| 139 | case 0x01: | 141 | case 0x01: |
| 140 | bus->max_bus_speed = PCIE_SPEED_2_5GT; | 142 | bus->max_bus_speed = PCIE_SPEED_2_5GT; |
| 141 | break; | 143 | break; |
| 142 | case 0x02: | 144 | case 0x02: |
| 143 | bus->max_bus_speed = PCIE_SPEED_5_0GT; | 145 | bus->max_bus_speed = PCIE_SPEED_5_0GT; |
| 144 | break; | 146 | break; |
| 147 | case 0x04: | ||
| 148 | bus->max_bus_speed = PCIE_SPEED_8_0GT; | ||
| 149 | break; | ||
| 145 | default: | 150 | default: |
| 146 | bus->max_bus_speed = PCI_SPEED_UNKNOWN; | 151 | bus->max_bus_speed = PCI_SPEED_UNKNOWN; |
| 147 | break; | 152 | break; |
| 148 | } | 153 | } |
| 149 | 154 | ||
| 150 | switch (be32_to_cpup(pcie_link_speed_stats)) { | 155 | switch (pcie_link_speed_stats[1]) { |
| 151 | case 0x01: | 156 | case 0x01: |
| 152 | bus->cur_bus_speed = PCIE_SPEED_2_5GT; | 157 | bus->cur_bus_speed = PCIE_SPEED_2_5GT; |
| 153 | break; | 158 | break; |
| 154 | case 0x02: | 159 | case 0x02: |
| 155 | bus->cur_bus_speed = PCIE_SPEED_5_0GT; | 160 | bus->cur_bus_speed = PCIE_SPEED_5_0GT; |
| 156 | break; | 161 | break; |
| 162 | case 0x04: | ||
| 163 | bus->cur_bus_speed = PCIE_SPEED_8_0GT; | ||
| 164 | break; | ||
| 157 | default: | 165 | default: |
| 158 | bus->cur_bus_speed = PCI_SPEED_UNKNOWN; | 166 | bus->cur_bus_speed = PCI_SPEED_UNKNOWN; |
| 159 | break; | 167 | break; |
diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c index 8e639d7cbda7..972df0ffd4dc 100644 --- a/arch/powerpc/platforms/pseries/setup.c +++ b/arch/powerpc/platforms/pseries/setup.c | |||
| @@ -430,8 +430,7 @@ static void pSeries_machine_kexec(struct kimage *image) | |||
| 430 | { | 430 | { |
| 431 | long rc; | 431 | long rc; |
| 432 | 432 | ||
| 433 | if (firmware_has_feature(FW_FEATURE_SET_MODE) && | 433 | if (firmware_has_feature(FW_FEATURE_SET_MODE)) { |
| 434 | (image->type != KEXEC_TYPE_CRASH)) { | ||
| 435 | rc = pSeries_disable_reloc_on_exc(); | 434 | rc = pSeries_disable_reloc_on_exc(); |
| 436 | if (rc != H_SUCCESS) | 435 | if (rc != H_SUCCESS) |
| 437 | pr_warning("Warning: Failed to disable relocation on " | 436 | pr_warning("Warning: Failed to disable relocation on " |
diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c index 0e166ed4cd16..8209744b2829 100644 --- a/arch/powerpc/sysdev/mpic.c +++ b/arch/powerpc/sysdev/mpic.c | |||
| @@ -886,25 +886,25 @@ int mpic_set_irq_type(struct irq_data *d, unsigned int flow_type) | |||
| 886 | 886 | ||
| 887 | /* Default: read HW settings */ | 887 | /* Default: read HW settings */ |
| 888 | if (flow_type == IRQ_TYPE_DEFAULT) { | 888 | if (flow_type == IRQ_TYPE_DEFAULT) { |
| 889 | switch(vold & (MPIC_INFO(VECPRI_POLARITY_MASK) | | 889 | int vold_ps; |
| 890 | MPIC_INFO(VECPRI_SENSE_MASK))) { | 890 | |
| 891 | case MPIC_INFO(VECPRI_SENSE_EDGE) | | 891 | vold_ps = vold & (MPIC_INFO(VECPRI_POLARITY_MASK) | |
| 892 | MPIC_INFO(VECPRI_POLARITY_POSITIVE): | 892 | MPIC_INFO(VECPRI_SENSE_MASK)); |
| 893 | flow_type = IRQ_TYPE_EDGE_RISING; | 893 | |
| 894 | break; | 894 | if (vold_ps == (MPIC_INFO(VECPRI_SENSE_EDGE) | |
| 895 | case MPIC_INFO(VECPRI_SENSE_EDGE) | | 895 | MPIC_INFO(VECPRI_POLARITY_POSITIVE))) |
| 896 | MPIC_INFO(VECPRI_POLARITY_NEGATIVE): | 896 | flow_type = IRQ_TYPE_EDGE_RISING; |
| 897 | flow_type = IRQ_TYPE_EDGE_FALLING; | 897 | else if (vold_ps == (MPIC_INFO(VECPRI_SENSE_EDGE) | |
| 898 | break; | 898 | MPIC_INFO(VECPRI_POLARITY_NEGATIVE))) |
| 899 | case MPIC_INFO(VECPRI_SENSE_LEVEL) | | 899 | flow_type = IRQ_TYPE_EDGE_FALLING; |
| 900 | MPIC_INFO(VECPRI_POLARITY_POSITIVE): | 900 | else if (vold_ps == (MPIC_INFO(VECPRI_SENSE_LEVEL) | |
| 901 | flow_type = IRQ_TYPE_LEVEL_HIGH; | 901 | MPIC_INFO(VECPRI_POLARITY_POSITIVE))) |
| 902 | break; | 902 | flow_type = IRQ_TYPE_LEVEL_HIGH; |
| 903 | case MPIC_INFO(VECPRI_SENSE_LEVEL) | | 903 | else if (vold_ps == (MPIC_INFO(VECPRI_SENSE_LEVEL) | |
| 904 | MPIC_INFO(VECPRI_POLARITY_NEGATIVE): | 904 | MPIC_INFO(VECPRI_POLARITY_NEGATIVE))) |
| 905 | flow_type = IRQ_TYPE_LEVEL_LOW; | 905 | flow_type = IRQ_TYPE_LEVEL_LOW; |
| 906 | break; | 906 | else |
| 907 | } | 907 | WARN_ONCE(1, "mpic: unknown IRQ type %d\n", vold); |
| 908 | } | 908 | } |
| 909 | 909 | ||
| 910 | /* Apply to irq desc */ | 910 | /* Apply to irq desc */ |
diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c index a90731b3d44a..b07909850f77 100644 --- a/arch/powerpc/xmon/xmon.c +++ b/arch/powerpc/xmon/xmon.c | |||
| @@ -309,16 +309,23 @@ static void get_output_lock(void) | |||
| 309 | 309 | ||
| 310 | if (xmon_speaker == me) | 310 | if (xmon_speaker == me) |
| 311 | return; | 311 | return; |
| 312 | |||
| 312 | for (;;) { | 313 | for (;;) { |
| 313 | if (xmon_speaker == 0) { | 314 | last_speaker = cmpxchg(&xmon_speaker, 0, me); |
| 314 | last_speaker = cmpxchg(&xmon_speaker, 0, me); | 315 | if (last_speaker == 0) |
| 315 | if (last_speaker == 0) | 316 | return; |
| 316 | return; | 317 | |
| 317 | } | 318 | /* |
| 318 | timeout = 10000000; | 319 | * Wait a full second for the lock, we might be on a slow |
| 320 | * console, but check every 100us. | ||
| 321 | */ | ||
| 322 | timeout = 10000; | ||
| 319 | while (xmon_speaker == last_speaker) { | 323 | while (xmon_speaker == last_speaker) { |
| 320 | if (--timeout > 0) | 324 | if (--timeout > 0) { |
| 325 | udelay(100); | ||
| 321 | continue; | 326 | continue; |
| 327 | } | ||
| 328 | |||
| 322 | /* hostile takeover */ | 329 | /* hostile takeover */ |
| 323 | prev = cmpxchg(&xmon_speaker, last_speaker, me); | 330 | prev = cmpxchg(&xmon_speaker, last_speaker, me); |
| 324 | if (prev == last_speaker) | 331 | if (prev == last_speaker) |
| @@ -397,7 +404,6 @@ static int xmon_core(struct pt_regs *regs, int fromipi) | |||
| 397 | } | 404 | } |
| 398 | 405 | ||
| 399 | xmon_fault_jmp[cpu] = recurse_jmp; | 406 | xmon_fault_jmp[cpu] = recurse_jmp; |
| 400 | cpumask_set_cpu(cpu, &cpus_in_xmon); | ||
| 401 | 407 | ||
| 402 | bp = NULL; | 408 | bp = NULL; |
| 403 | if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) == (MSR_IR|MSR_64BIT)) | 409 | if ((regs->msr & (MSR_IR|MSR_PR|MSR_64BIT)) == (MSR_IR|MSR_64BIT)) |
| @@ -419,6 +425,8 @@ static int xmon_core(struct pt_regs *regs, int fromipi) | |||
| 419 | release_output_lock(); | 425 | release_output_lock(); |
| 420 | } | 426 | } |
| 421 | 427 | ||
| 428 | cpumask_set_cpu(cpu, &cpus_in_xmon); | ||
| 429 | |||
| 422 | waiting: | 430 | waiting: |
| 423 | secondary = 1; | 431 | secondary = 1; |
| 424 | while (secondary && !xmon_gate) { | 432 | while (secondary && !xmon_gate) { |
diff --git a/arch/s390/appldata/appldata_base.c b/arch/s390/appldata/appldata_base.c index 4c4a1cef5208..47c8630c93cd 100644 --- a/arch/s390/appldata/appldata_base.c +++ b/arch/s390/appldata/appldata_base.c | |||
| @@ -529,6 +529,7 @@ static int __init appldata_init(void) | |||
| 529 | { | 529 | { |
| 530 | int rc; | 530 | int rc; |
| 531 | 531 | ||
| 532 | init_virt_timer(&appldata_timer); | ||
| 532 | appldata_timer.function = appldata_timer_function; | 533 | appldata_timer.function = appldata_timer_function; |
| 533 | appldata_timer.data = (unsigned long) &appldata_work; | 534 | appldata_timer.data = (unsigned long) &appldata_work; |
| 534 | 535 | ||
diff --git a/arch/s390/kernel/compat_wrapper.S b/arch/s390/kernel/compat_wrapper.S index 59c8efce1b99..0248949a756d 100644 --- a/arch/s390/kernel/compat_wrapper.S +++ b/arch/s390/kernel/compat_wrapper.S | |||
| @@ -1421,5 +1421,5 @@ ENTRY(sys_sched_setattr_wrapper) | |||
| 1421 | ENTRY(sys_sched_getattr_wrapper) | 1421 | ENTRY(sys_sched_getattr_wrapper) |
| 1422 | lgfr %r2,%r2 # pid_t | 1422 | lgfr %r2,%r2 # pid_t |
| 1423 | llgtr %r3,%r3 # const char __user * | 1423 | llgtr %r3,%r3 # const char __user * |
| 1424 | llgfr %r3,%r3 # unsigned int | 1424 | llgfr %r4,%r4 # unsigned int |
| 1425 | jg sys_sched_getattr | 1425 | jg sys_sched_getattr |
diff --git a/arch/s390/kernel/head64.S b/arch/s390/kernel/head64.S index b9e25ae2579c..d7c00507568a 100644 --- a/arch/s390/kernel/head64.S +++ b/arch/s390/kernel/head64.S | |||
| @@ -59,7 +59,7 @@ ENTRY(startup_continue) | |||
| 59 | .quad 0 # cr12: tracing off | 59 | .quad 0 # cr12: tracing off |
| 60 | .quad 0 # cr13: home space segment table | 60 | .quad 0 # cr13: home space segment table |
| 61 | .quad 0xc0000000 # cr14: machine check handling off | 61 | .quad 0xc0000000 # cr14: machine check handling off |
| 62 | .quad 0 # cr15: linkage stack operations | 62 | .quad .Llinkage_stack # cr15: linkage stack operations |
| 63 | .Lpcmsk:.quad 0x0000000180000000 | 63 | .Lpcmsk:.quad 0x0000000180000000 |
| 64 | .L4malign:.quad 0xffffffffffc00000 | 64 | .L4malign:.quad 0xffffffffffc00000 |
| 65 | .Lscan2g:.quad 0x80000000 + 0x20000 - 8 # 2GB + 128K - 8 | 65 | .Lscan2g:.quad 0x80000000 + 0x20000 - 8 # 2GB + 128K - 8 |
| @@ -67,12 +67,15 @@ ENTRY(startup_continue) | |||
| 67 | .Lparmaddr: | 67 | .Lparmaddr: |
| 68 | .quad PARMAREA | 68 | .quad PARMAREA |
| 69 | .align 64 | 69 | .align 64 |
| 70 | .Lduct: .long 0,0,0,0,.Lduald,0,0,0 | 70 | .Lduct: .long 0,.Laste,.Laste,0,.Lduald,0,0,0 |
| 71 | .long 0,0,0,0,0,0,0,0 | 71 | .long 0,0,0,0,0,0,0,0 |
| 72 | .Laste: .quad 0,0xffffffffffffffff,0,0,0,0,0,0 | ||
| 72 | .align 128 | 73 | .align 128 |
| 73 | .Lduald:.rept 8 | 74 | .Lduald:.rept 8 |
| 74 | .long 0x80000000,0,0,0 # invalid access-list entries | 75 | .long 0x80000000,0,0,0 # invalid access-list entries |
| 75 | .endr | 76 | .endr |
| 77 | .Llinkage_stack: | ||
| 78 | .long 0,0,0x89000000,0,0,0,0x8a000000,0 | ||
| 76 | 79 | ||
| 77 | ENTRY(_ehead) | 80 | ENTRY(_ehead) |
| 78 | 81 | ||
diff --git a/arch/s390/mm/page-states.c b/arch/s390/mm/page-states.c index a90d45e9dfb0..27c50f4d90cb 100644 --- a/arch/s390/mm/page-states.c +++ b/arch/s390/mm/page-states.c | |||
| @@ -12,6 +12,8 @@ | |||
| 12 | #include <linux/mm.h> | 12 | #include <linux/mm.h> |
| 13 | #include <linux/gfp.h> | 13 | #include <linux/gfp.h> |
| 14 | #include <linux/init.h> | 14 | #include <linux/init.h> |
| 15 | #include <asm/setup.h> | ||
| 16 | #include <asm/ipl.h> | ||
| 15 | 17 | ||
| 16 | #define ESSA_SET_STABLE 1 | 18 | #define ESSA_SET_STABLE 1 |
| 17 | #define ESSA_SET_UNUSED 2 | 19 | #define ESSA_SET_UNUSED 2 |
| @@ -41,6 +43,14 @@ void __init cmma_init(void) | |||
| 41 | 43 | ||
| 42 | if (!cmma_flag) | 44 | if (!cmma_flag) |
| 43 | return; | 45 | return; |
| 46 | /* | ||
| 47 | * Disable CMM for dump, otherwise the tprot based memory | ||
| 48 | * detection can fail because of unstable pages. | ||
| 49 | */ | ||
| 50 | if (OLDMEM_BASE || ipl_info.type == IPL_TYPE_FCP_DUMP) { | ||
| 51 | cmma_flag = 0; | ||
| 52 | return; | ||
| 53 | } | ||
| 44 | asm volatile( | 54 | asm volatile( |
| 45 | " .insn rrf,0xb9ab0000,%1,%1,0,0\n" | 55 | " .insn rrf,0xb9ab0000,%1,%1,0,0\n" |
| 46 | "0: la %0,0\n" | 56 | "0: la %0,0\n" |
diff --git a/arch/s390/pci/pci_dma.c b/arch/s390/pci/pci_dma.c index 60c11a629d96..f91c03119804 100644 --- a/arch/s390/pci/pci_dma.c +++ b/arch/s390/pci/pci_dma.c | |||
| @@ -206,11 +206,13 @@ static void dma_cleanup_tables(struct zpci_dev *zdev) | |||
| 206 | zdev->dma_table = NULL; | 206 | zdev->dma_table = NULL; |
| 207 | } | 207 | } |
| 208 | 208 | ||
| 209 | static unsigned long __dma_alloc_iommu(struct zpci_dev *zdev, unsigned long start, | 209 | static unsigned long __dma_alloc_iommu(struct zpci_dev *zdev, |
| 210 | int size) | 210 | unsigned long start, int size) |
| 211 | { | 211 | { |
| 212 | unsigned long boundary_size = 0x1000000; | 212 | unsigned long boundary_size; |
| 213 | 213 | ||
| 214 | boundary_size = ALIGN(dma_get_seg_boundary(&zdev->pdev->dev) + 1, | ||
| 215 | PAGE_SIZE) >> PAGE_SHIFT; | ||
| 214 | return iommu_area_alloc(zdev->iommu_bitmap, zdev->iommu_pages, | 216 | return iommu_area_alloc(zdev->iommu_bitmap, zdev->iommu_pages, |
| 215 | start, size, 0, boundary_size, 0); | 217 | start, size, 0, boundary_size, 0); |
| 216 | } | 218 | } |
diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig index c51efdcd07a2..7d8b7e94b93b 100644 --- a/arch/sparc/Kconfig +++ b/arch/sparc/Kconfig | |||
| @@ -27,7 +27,7 @@ config SPARC | |||
| 27 | select RTC_DRV_M48T59 | 27 | select RTC_DRV_M48T59 |
| 28 | select HAVE_DMA_ATTRS | 28 | select HAVE_DMA_ATTRS |
| 29 | select HAVE_DMA_API_DEBUG | 29 | select HAVE_DMA_API_DEBUG |
| 30 | select HAVE_ARCH_JUMP_LABEL | 30 | select HAVE_ARCH_JUMP_LABEL if SPARC64 |
| 31 | select GENERIC_IRQ_SHOW | 31 | select GENERIC_IRQ_SHOW |
| 32 | select ARCH_WANT_IPC_PARSE_VERSION | 32 | select ARCH_WANT_IPC_PARSE_VERSION |
| 33 | select GENERIC_PCI_IOMAP | 33 | select GENERIC_PCI_IOMAP |
diff --git a/arch/sparc/mm/srmmu.c b/arch/sparc/mm/srmmu.c index 869023abe5a4..cfbe53c17b0d 100644 --- a/arch/sparc/mm/srmmu.c +++ b/arch/sparc/mm/srmmu.c | |||
| @@ -14,6 +14,7 @@ | |||
| 14 | #include <linux/pagemap.h> | 14 | #include <linux/pagemap.h> |
| 15 | #include <linux/vmalloc.h> | 15 | #include <linux/vmalloc.h> |
| 16 | #include <linux/kdebug.h> | 16 | #include <linux/kdebug.h> |
| 17 | #include <linux/export.h> | ||
| 17 | #include <linux/kernel.h> | 18 | #include <linux/kernel.h> |
| 18 | #include <linux/init.h> | 19 | #include <linux/init.h> |
| 19 | #include <linux/log2.h> | 20 | #include <linux/log2.h> |
| @@ -62,6 +63,7 @@ extern unsigned long last_valid_pfn; | |||
| 62 | static pgd_t *srmmu_swapper_pg_dir; | 63 | static pgd_t *srmmu_swapper_pg_dir; |
| 63 | 64 | ||
| 64 | const struct sparc32_cachetlb_ops *sparc32_cachetlb_ops; | 65 | const struct sparc32_cachetlb_ops *sparc32_cachetlb_ops; |
| 66 | EXPORT_SYMBOL(sparc32_cachetlb_ops); | ||
| 65 | 67 | ||
| 66 | #ifdef CONFIG_SMP | 68 | #ifdef CONFIG_SMP |
| 67 | const struct sparc32_cachetlb_ops *local_ops; | 69 | const struct sparc32_cachetlb_ops *local_ops; |
diff --git a/arch/x86/include/asm/efi.h b/arch/x86/include/asm/efi.h index 3b978c472d08..3d6b9f81cc68 100644 --- a/arch/x86/include/asm/efi.h +++ b/arch/x86/include/asm/efi.h | |||
| @@ -132,6 +132,8 @@ extern void __init efi_map_region_fixed(efi_memory_desc_t *md); | |||
| 132 | extern void efi_sync_low_kernel_mappings(void); | 132 | extern void efi_sync_low_kernel_mappings(void); |
| 133 | extern void efi_setup_page_tables(void); | 133 | extern void efi_setup_page_tables(void); |
| 134 | extern void __init old_map_region(efi_memory_desc_t *md); | 134 | extern void __init old_map_region(efi_memory_desc_t *md); |
| 135 | extern void __init runtime_code_page_mkexec(void); | ||
| 136 | extern void __init efi_runtime_mkexec(void); | ||
| 135 | 137 | ||
| 136 | struct efi_setup_data { | 138 | struct efi_setup_data { |
| 137 | u64 fw_vendor; | 139 | u64 fw_vendor; |
diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h index bbc8b12fa443..5ad38ad07890 100644 --- a/arch/x86/include/asm/pgtable.h +++ b/arch/x86/include/asm/pgtable.h | |||
| @@ -445,10 +445,20 @@ static inline int pte_same(pte_t a, pte_t b) | |||
| 445 | return a.pte == b.pte; | 445 | return a.pte == b.pte; |
| 446 | } | 446 | } |
| 447 | 447 | ||
| 448 | static inline int pteval_present(pteval_t pteval) | ||
| 449 | { | ||
| 450 | /* | ||
| 451 | * Yes Linus, _PAGE_PROTNONE == _PAGE_NUMA. Expressing it this | ||
| 452 | * way clearly states that the intent is that protnone and numa | ||
| 453 | * hinting ptes are considered present for the purposes of | ||
| 454 | * pagetable operations like zapping, protection changes, gup etc. | ||
| 455 | */ | ||
| 456 | return pteval & (_PAGE_PRESENT | _PAGE_PROTNONE | _PAGE_NUMA); | ||
| 457 | } | ||
| 458 | |||
| 448 | static inline int pte_present(pte_t a) | 459 | static inline int pte_present(pte_t a) |
| 449 | { | 460 | { |
| 450 | return pte_flags(a) & (_PAGE_PRESENT | _PAGE_PROTNONE | | 461 | return pteval_present(pte_flags(a)); |
| 451 | _PAGE_NUMA); | ||
| 452 | } | 462 | } |
| 453 | 463 | ||
| 454 | #define pte_accessible pte_accessible | 464 | #define pte_accessible pte_accessible |
diff --git a/arch/x86/include/asm/tsc.h b/arch/x86/include/asm/tsc.h index 57ae63cd6ee2..94605c0e9cee 100644 --- a/arch/x86/include/asm/tsc.h +++ b/arch/x86/include/asm/tsc.h | |||
| @@ -66,6 +66,6 @@ extern void tsc_save_sched_clock_state(void); | |||
| 66 | extern void tsc_restore_sched_clock_state(void); | 66 | extern void tsc_restore_sched_clock_state(void); |
| 67 | 67 | ||
| 68 | /* MSR based TSC calibration for Intel Atom SoC platforms */ | 68 | /* MSR based TSC calibration for Intel Atom SoC platforms */ |
| 69 | int try_msr_calibrate_tsc(unsigned long *fast_calibrate); | 69 | unsigned long try_msr_calibrate_tsc(void); |
| 70 | 70 | ||
| 71 | #endif /* _ASM_X86_TSC_H */ | 71 | #endif /* _ASM_X86_TSC_H */ |
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index 24b6fd10625a..8e28bf2fc3ef 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c | |||
| @@ -284,8 +284,13 @@ static __always_inline void setup_smap(struct cpuinfo_x86 *c) | |||
| 284 | raw_local_save_flags(eflags); | 284 | raw_local_save_flags(eflags); |
| 285 | BUG_ON(eflags & X86_EFLAGS_AC); | 285 | BUG_ON(eflags & X86_EFLAGS_AC); |
| 286 | 286 | ||
| 287 | if (cpu_has(c, X86_FEATURE_SMAP)) | 287 | if (cpu_has(c, X86_FEATURE_SMAP)) { |
| 288 | #ifdef CONFIG_X86_SMAP | ||
| 288 | set_in_cr4(X86_CR4_SMAP); | 289 | set_in_cr4(X86_CR4_SMAP); |
| 290 | #else | ||
| 291 | clear_in_cr4(X86_CR4_SMAP); | ||
| 292 | #endif | ||
| 293 | } | ||
| 289 | } | 294 | } |
| 290 | 295 | ||
| 291 | /* | 296 | /* |
diff --git a/arch/x86/kernel/cpu/perf_event.c b/arch/x86/kernel/cpu/perf_event.c index b88645191fe5..895604f2e916 100644 --- a/arch/x86/kernel/cpu/perf_event.c +++ b/arch/x86/kernel/cpu/perf_event.c | |||
| @@ -1521,6 +1521,8 @@ static int __init init_hw_perf_events(void) | |||
| 1521 | 1521 | ||
| 1522 | pr_cont("%s PMU driver.\n", x86_pmu.name); | 1522 | pr_cont("%s PMU driver.\n", x86_pmu.name); |
| 1523 | 1523 | ||
| 1524 | x86_pmu.attr_rdpmc = 1; /* enable userspace RDPMC usage by default */ | ||
| 1525 | |||
| 1524 | for (quirk = x86_pmu.quirks; quirk; quirk = quirk->next) | 1526 | for (quirk = x86_pmu.quirks; quirk; quirk = quirk->next) |
| 1525 | quirk->func(); | 1527 | quirk->func(); |
| 1526 | 1528 | ||
| @@ -1534,7 +1536,6 @@ static int __init init_hw_perf_events(void) | |||
| 1534 | __EVENT_CONSTRAINT(0, (1ULL << x86_pmu.num_counters) - 1, | 1536 | __EVENT_CONSTRAINT(0, (1ULL << x86_pmu.num_counters) - 1, |
| 1535 | 0, x86_pmu.num_counters, 0, 0); | 1537 | 0, x86_pmu.num_counters, 0, 0); |
| 1536 | 1538 | ||
| 1537 | x86_pmu.attr_rdpmc = 1; /* enable userspace RDPMC usage by default */ | ||
| 1538 | x86_pmu_format_group.attrs = x86_pmu.format_attrs; | 1539 | x86_pmu_format_group.attrs = x86_pmu.format_attrs; |
| 1539 | 1540 | ||
| 1540 | if (x86_pmu.event_attrs) | 1541 | if (x86_pmu.event_attrs) |
| @@ -1820,9 +1821,12 @@ static ssize_t set_attr_rdpmc(struct device *cdev, | |||
| 1820 | if (ret) | 1821 | if (ret) |
| 1821 | return ret; | 1822 | return ret; |
| 1822 | 1823 | ||
| 1824 | if (x86_pmu.attr_rdpmc_broken) | ||
| 1825 | return -ENOTSUPP; | ||
| 1826 | |||
| 1823 | if (!!val != !!x86_pmu.attr_rdpmc) { | 1827 | if (!!val != !!x86_pmu.attr_rdpmc) { |
| 1824 | x86_pmu.attr_rdpmc = !!val; | 1828 | x86_pmu.attr_rdpmc = !!val; |
| 1825 | smp_call_function(change_rdpmc, (void *)val, 1); | 1829 | on_each_cpu(change_rdpmc, (void *)val, 1); |
| 1826 | } | 1830 | } |
| 1827 | 1831 | ||
| 1828 | return count; | 1832 | return count; |
diff --git a/arch/x86/kernel/cpu/perf_event.h b/arch/x86/kernel/cpu/perf_event.h index c1a861829d81..4972c244d0bc 100644 --- a/arch/x86/kernel/cpu/perf_event.h +++ b/arch/x86/kernel/cpu/perf_event.h | |||
| @@ -409,6 +409,7 @@ struct x86_pmu { | |||
| 409 | /* | 409 | /* |
| 410 | * sysfs attrs | 410 | * sysfs attrs |
| 411 | */ | 411 | */ |
| 412 | int attr_rdpmc_broken; | ||
| 412 | int attr_rdpmc; | 413 | int attr_rdpmc; |
| 413 | struct attribute **format_attrs; | 414 | struct attribute **format_attrs; |
| 414 | struct attribute **event_attrs; | 415 | struct attribute **event_attrs; |
diff --git a/arch/x86/kernel/cpu/perf_event_intel.c b/arch/x86/kernel/cpu/perf_event_intel.c index 0fa4f242f050..aa333d966886 100644 --- a/arch/x86/kernel/cpu/perf_event_intel.c +++ b/arch/x86/kernel/cpu/perf_event_intel.c | |||
| @@ -1361,10 +1361,8 @@ static int intel_pmu_handle_irq(struct pt_regs *regs) | |||
| 1361 | intel_pmu_disable_all(); | 1361 | intel_pmu_disable_all(); |
| 1362 | handled = intel_pmu_drain_bts_buffer(); | 1362 | handled = intel_pmu_drain_bts_buffer(); |
| 1363 | status = intel_pmu_get_status(); | 1363 | status = intel_pmu_get_status(); |
| 1364 | if (!status) { | 1364 | if (!status) |
| 1365 | intel_pmu_enable_all(0); | 1365 | goto done; |
| 1366 | return handled; | ||
| 1367 | } | ||
| 1368 | 1366 | ||
| 1369 | loops = 0; | 1367 | loops = 0; |
| 1370 | again: | 1368 | again: |
| @@ -2310,10 +2308,7 @@ __init int intel_pmu_init(void) | |||
| 2310 | if (version > 1) | 2308 | if (version > 1) |
| 2311 | x86_pmu.num_counters_fixed = max((int)edx.split.num_counters_fixed, 3); | 2309 | x86_pmu.num_counters_fixed = max((int)edx.split.num_counters_fixed, 3); |
| 2312 | 2310 | ||
| 2313 | /* | 2311 | if (boot_cpu_has(X86_FEATURE_PDCM)) { |
| 2314 | * v2 and above have a perf capabilities MSR | ||
| 2315 | */ | ||
| 2316 | if (version > 1) { | ||
| 2317 | u64 capabilities; | 2312 | u64 capabilities; |
| 2318 | 2313 | ||
| 2319 | rdmsrl(MSR_IA32_PERF_CAPABILITIES, capabilities); | 2314 | rdmsrl(MSR_IA32_PERF_CAPABILITIES, capabilities); |
diff --git a/arch/x86/kernel/cpu/perf_event_intel_uncore.c b/arch/x86/kernel/cpu/perf_event_intel_uncore.c index 29c248799ced..c88f7f4b03ee 100644 --- a/arch/x86/kernel/cpu/perf_event_intel_uncore.c +++ b/arch/x86/kernel/cpu/perf_event_intel_uncore.c | |||
| @@ -501,8 +501,11 @@ static struct extra_reg snbep_uncore_cbox_extra_regs[] = { | |||
| 501 | SNBEP_CBO_EVENT_EXTRA_REG(SNBEP_CBO_PMON_CTL_TID_EN, | 501 | SNBEP_CBO_EVENT_EXTRA_REG(SNBEP_CBO_PMON_CTL_TID_EN, |
| 502 | SNBEP_CBO_PMON_CTL_TID_EN, 0x1), | 502 | SNBEP_CBO_PMON_CTL_TID_EN, 0x1), |
| 503 | SNBEP_CBO_EVENT_EXTRA_REG(0x0334, 0xffff, 0x4), | 503 | SNBEP_CBO_EVENT_EXTRA_REG(0x0334, 0xffff, 0x4), |
| 504 | SNBEP_CBO_EVENT_EXTRA_REG(0x4334, 0xffff, 0x6), | ||
| 504 | SNBEP_CBO_EVENT_EXTRA_REG(0x0534, 0xffff, 0x4), | 505 | SNBEP_CBO_EVENT_EXTRA_REG(0x0534, 0xffff, 0x4), |
| 506 | SNBEP_CBO_EVENT_EXTRA_REG(0x4534, 0xffff, 0x6), | ||
| 505 | SNBEP_CBO_EVENT_EXTRA_REG(0x0934, 0xffff, 0x4), | 507 | SNBEP_CBO_EVENT_EXTRA_REG(0x0934, 0xffff, 0x4), |
| 508 | SNBEP_CBO_EVENT_EXTRA_REG(0x4934, 0xffff, 0x6), | ||
| 506 | SNBEP_CBO_EVENT_EXTRA_REG(0x4134, 0xffff, 0x6), | 509 | SNBEP_CBO_EVENT_EXTRA_REG(0x4134, 0xffff, 0x6), |
| 507 | SNBEP_CBO_EVENT_EXTRA_REG(0x0135, 0xffff, 0x8), | 510 | SNBEP_CBO_EVENT_EXTRA_REG(0x0135, 0xffff, 0x8), |
| 508 | SNBEP_CBO_EVENT_EXTRA_REG(0x0335, 0xffff, 0x8), | 511 | SNBEP_CBO_EVENT_EXTRA_REG(0x0335, 0xffff, 0x8), |
| @@ -1178,10 +1181,15 @@ static struct extra_reg ivt_uncore_cbox_extra_regs[] = { | |||
| 1178 | SNBEP_CBO_EVENT_EXTRA_REG(SNBEP_CBO_PMON_CTL_TID_EN, | 1181 | SNBEP_CBO_EVENT_EXTRA_REG(SNBEP_CBO_PMON_CTL_TID_EN, |
| 1179 | SNBEP_CBO_PMON_CTL_TID_EN, 0x1), | 1182 | SNBEP_CBO_PMON_CTL_TID_EN, 0x1), |
| 1180 | SNBEP_CBO_EVENT_EXTRA_REG(0x1031, 0x10ff, 0x2), | 1183 | SNBEP_CBO_EVENT_EXTRA_REG(0x1031, 0x10ff, 0x2), |
| 1184 | SNBEP_CBO_EVENT_EXTRA_REG(0x1134, 0xffff, 0x4), | ||
| 1185 | SNBEP_CBO_EVENT_EXTRA_REG(0x4134, 0xffff, 0xc), | ||
| 1186 | SNBEP_CBO_EVENT_EXTRA_REG(0x5134, 0xffff, 0xc), | ||
| 1181 | SNBEP_CBO_EVENT_EXTRA_REG(0x0334, 0xffff, 0x4), | 1187 | SNBEP_CBO_EVENT_EXTRA_REG(0x0334, 0xffff, 0x4), |
| 1188 | SNBEP_CBO_EVENT_EXTRA_REG(0x4334, 0xffff, 0xc), | ||
| 1182 | SNBEP_CBO_EVENT_EXTRA_REG(0x0534, 0xffff, 0x4), | 1189 | SNBEP_CBO_EVENT_EXTRA_REG(0x0534, 0xffff, 0x4), |
| 1190 | SNBEP_CBO_EVENT_EXTRA_REG(0x4534, 0xffff, 0xc), | ||
| 1183 | SNBEP_CBO_EVENT_EXTRA_REG(0x0934, 0xffff, 0x4), | 1191 | SNBEP_CBO_EVENT_EXTRA_REG(0x0934, 0xffff, 0x4), |
| 1184 | SNBEP_CBO_EVENT_EXTRA_REG(0x4134, 0xffff, 0xc), | 1192 | SNBEP_CBO_EVENT_EXTRA_REG(0x4934, 0xffff, 0xc), |
| 1185 | SNBEP_CBO_EVENT_EXTRA_REG(0x0135, 0xffff, 0x10), | 1193 | SNBEP_CBO_EVENT_EXTRA_REG(0x0135, 0xffff, 0x10), |
| 1186 | SNBEP_CBO_EVENT_EXTRA_REG(0x0335, 0xffff, 0x10), | 1194 | SNBEP_CBO_EVENT_EXTRA_REG(0x0335, 0xffff, 0x10), |
| 1187 | SNBEP_CBO_EVENT_EXTRA_REG(0x2135, 0xffff, 0x10), | 1195 | SNBEP_CBO_EVENT_EXTRA_REG(0x2135, 0xffff, 0x10), |
diff --git a/arch/x86/kernel/cpu/perf_event_p6.c b/arch/x86/kernel/cpu/perf_event_p6.c index b1e2fe115323..7c1a0c07b607 100644 --- a/arch/x86/kernel/cpu/perf_event_p6.c +++ b/arch/x86/kernel/cpu/perf_event_p6.c | |||
| @@ -231,31 +231,49 @@ static __initconst const struct x86_pmu p6_pmu = { | |||
| 231 | 231 | ||
| 232 | }; | 232 | }; |
| 233 | 233 | ||
| 234 | static __init void p6_pmu_rdpmc_quirk(void) | ||
| 235 | { | ||
| 236 | if (boot_cpu_data.x86_mask < 9) { | ||
| 237 | /* | ||
| 238 | * PPro erratum 26; fixed in stepping 9 and above. | ||
| 239 | */ | ||
| 240 | pr_warn("Userspace RDPMC support disabled due to a CPU erratum\n"); | ||
| 241 | x86_pmu.attr_rdpmc_broken = 1; | ||
| 242 | x86_pmu.attr_rdpmc = 0; | ||
| 243 | } | ||
| 244 | } | ||
| 245 | |||
| 234 | __init int p6_pmu_init(void) | 246 | __init int p6_pmu_init(void) |
| 235 | { | 247 | { |
| 248 | x86_pmu = p6_pmu; | ||
| 249 | |||
| 236 | switch (boot_cpu_data.x86_model) { | 250 | switch (boot_cpu_data.x86_model) { |
| 237 | case 1: | 251 | case 1: /* Pentium Pro */ |
| 238 | case 3: /* Pentium Pro */ | 252 | x86_add_quirk(p6_pmu_rdpmc_quirk); |
| 239 | case 5: | 253 | break; |
| 240 | case 6: /* Pentium II */ | 254 | |
| 241 | case 7: | 255 | case 3: /* Pentium II - Klamath */ |
| 242 | case 8: | 256 | case 5: /* Pentium II - Deschutes */ |
| 243 | case 11: /* Pentium III */ | 257 | case 6: /* Pentium II - Mendocino */ |
| 244 | case 9: | ||
| 245 | case 13: | ||
| 246 | /* Pentium M */ | ||
| 247 | break; | 258 | break; |
| 259 | |||
| 260 | case 7: /* Pentium III - Katmai */ | ||
| 261 | case 8: /* Pentium III - Coppermine */ | ||
| 262 | case 10: /* Pentium III Xeon */ | ||
| 263 | case 11: /* Pentium III - Tualatin */ | ||
| 264 | break; | ||
| 265 | |||
| 266 | case 9: /* Pentium M - Banias */ | ||
| 267 | case 13: /* Pentium M - Dothan */ | ||
| 268 | break; | ||
| 269 | |||
| 248 | default: | 270 | default: |
| 249 | pr_cont("unsupported p6 CPU model %d ", | 271 | pr_cont("unsupported p6 CPU model %d ", boot_cpu_data.x86_model); |
| 250 | boot_cpu_data.x86_model); | ||
| 251 | return -ENODEV; | 272 | return -ENODEV; |
| 252 | } | 273 | } |
| 253 | 274 | ||
| 254 | x86_pmu = p6_pmu; | ||
| 255 | |||
| 256 | memcpy(hw_cache_event_ids, p6_hw_cache_event_ids, | 275 | memcpy(hw_cache_event_ids, p6_hw_cache_event_ids, |
| 257 | sizeof(hw_cache_event_ids)); | 276 | sizeof(hw_cache_event_ids)); |
| 258 | 277 | ||
| 259 | |||
| 260 | return 0; | 278 | return 0; |
| 261 | } | 279 | } |
diff --git a/arch/x86/kernel/ftrace.c b/arch/x86/kernel/ftrace.c index d4bdd253fea7..e6253195a301 100644 --- a/arch/x86/kernel/ftrace.c +++ b/arch/x86/kernel/ftrace.c | |||
| @@ -77,8 +77,7 @@ within(unsigned long addr, unsigned long start, unsigned long end) | |||
| 77 | return addr >= start && addr < end; | 77 | return addr >= start && addr < end; |
| 78 | } | 78 | } |
| 79 | 79 | ||
| 80 | static int | 80 | static unsigned long text_ip_addr(unsigned long ip) |
| 81 | do_ftrace_mod_code(unsigned long ip, const void *new_code) | ||
| 82 | { | 81 | { |
| 83 | /* | 82 | /* |
| 84 | * On x86_64, kernel text mappings are mapped read-only with | 83 | * On x86_64, kernel text mappings are mapped read-only with |
| @@ -91,7 +90,7 @@ do_ftrace_mod_code(unsigned long ip, const void *new_code) | |||
| 91 | if (within(ip, (unsigned long)_text, (unsigned long)_etext)) | 90 | if (within(ip, (unsigned long)_text, (unsigned long)_etext)) |
| 92 | ip = (unsigned long)__va(__pa_symbol(ip)); | 91 | ip = (unsigned long)__va(__pa_symbol(ip)); |
| 93 | 92 | ||
| 94 | return probe_kernel_write((void *)ip, new_code, MCOUNT_INSN_SIZE); | 93 | return ip; |
| 95 | } | 94 | } |
| 96 | 95 | ||
| 97 | static const unsigned char *ftrace_nop_replace(void) | 96 | static const unsigned char *ftrace_nop_replace(void) |
| @@ -123,8 +122,10 @@ ftrace_modify_code_direct(unsigned long ip, unsigned const char *old_code, | |||
| 123 | if (memcmp(replaced, old_code, MCOUNT_INSN_SIZE) != 0) | 122 | if (memcmp(replaced, old_code, MCOUNT_INSN_SIZE) != 0) |
| 124 | return -EINVAL; | 123 | return -EINVAL; |
| 125 | 124 | ||
| 125 | ip = text_ip_addr(ip); | ||
| 126 | |||
| 126 | /* replace the text with the new text */ | 127 | /* replace the text with the new text */ |
| 127 | if (do_ftrace_mod_code(ip, new_code)) | 128 | if (probe_kernel_write((void *)ip, new_code, MCOUNT_INSN_SIZE)) |
| 128 | return -EPERM; | 129 | return -EPERM; |
| 129 | 130 | ||
| 130 | sync_core(); | 131 | sync_core(); |
| @@ -221,37 +222,51 @@ int ftrace_modify_call(struct dyn_ftrace *rec, unsigned long old_addr, | |||
| 221 | return -EINVAL; | 222 | return -EINVAL; |
| 222 | } | 223 | } |
| 223 | 224 | ||
| 224 | int ftrace_update_ftrace_func(ftrace_func_t func) | 225 | static unsigned long ftrace_update_func; |
| 226 | |||
| 227 | static int update_ftrace_func(unsigned long ip, void *new) | ||
| 225 | { | 228 | { |
| 226 | unsigned long ip = (unsigned long)(&ftrace_call); | 229 | unsigned char old[MCOUNT_INSN_SIZE]; |
| 227 | unsigned char old[MCOUNT_INSN_SIZE], *new; | ||
| 228 | int ret; | 230 | int ret; |
| 229 | 231 | ||
| 230 | memcpy(old, &ftrace_call, MCOUNT_INSN_SIZE); | 232 | memcpy(old, (void *)ip, MCOUNT_INSN_SIZE); |
| 231 | new = ftrace_call_replace(ip, (unsigned long)func); | 233 | |
| 234 | ftrace_update_func = ip; | ||
| 235 | /* Make sure the breakpoints see the ftrace_update_func update */ | ||
| 236 | smp_wmb(); | ||
| 232 | 237 | ||
| 233 | /* See comment above by declaration of modifying_ftrace_code */ | 238 | /* See comment above by declaration of modifying_ftrace_code */ |
| 234 | atomic_inc(&modifying_ftrace_code); | 239 | atomic_inc(&modifying_ftrace_code); |
| 235 | 240 | ||
| 236 | ret = ftrace_modify_code(ip, old, new); | 241 | ret = ftrace_modify_code(ip, old, new); |
| 237 | 242 | ||
| 243 | atomic_dec(&modifying_ftrace_code); | ||
| 244 | |||
| 245 | return ret; | ||
| 246 | } | ||
| 247 | |||
| 248 | int ftrace_update_ftrace_func(ftrace_func_t func) | ||
| 249 | { | ||
| 250 | unsigned long ip = (unsigned long)(&ftrace_call); | ||
| 251 | unsigned char *new; | ||
| 252 | int ret; | ||
| 253 | |||
| 254 | new = ftrace_call_replace(ip, (unsigned long)func); | ||
| 255 | ret = update_ftrace_func(ip, new); | ||
| 256 | |||
| 238 | /* Also update the regs callback function */ | 257 | /* Also update the regs callback function */ |
| 239 | if (!ret) { | 258 | if (!ret) { |
| 240 | ip = (unsigned long)(&ftrace_regs_call); | 259 | ip = (unsigned long)(&ftrace_regs_call); |
| 241 | memcpy(old, &ftrace_regs_call, MCOUNT_INSN_SIZE); | ||
| 242 | new = ftrace_call_replace(ip, (unsigned long)func); | 260 | new = ftrace_call_replace(ip, (unsigned long)func); |
| 243 | ret = ftrace_modify_code(ip, old, new); | 261 | ret = update_ftrace_func(ip, new); |
| 244 | } | 262 | } |
| 245 | 263 | ||
| 246 | atomic_dec(&modifying_ftrace_code); | ||
| 247 | |||
| 248 | return ret; | 264 | return ret; |
| 249 | } | 265 | } |
| 250 | 266 | ||
| 251 | static int is_ftrace_caller(unsigned long ip) | 267 | static int is_ftrace_caller(unsigned long ip) |
| 252 | { | 268 | { |
| 253 | if (ip == (unsigned long)(&ftrace_call) || | 269 | if (ip == ftrace_update_func) |
| 254 | ip == (unsigned long)(&ftrace_regs_call)) | ||
| 255 | return 1; | 270 | return 1; |
| 256 | 271 | ||
| 257 | return 0; | 272 | return 0; |
| @@ -677,45 +692,41 @@ int __init ftrace_dyn_arch_init(void *data) | |||
| 677 | #ifdef CONFIG_DYNAMIC_FTRACE | 692 | #ifdef CONFIG_DYNAMIC_FTRACE |
| 678 | extern void ftrace_graph_call(void); | 693 | extern void ftrace_graph_call(void); |
| 679 | 694 | ||
| 680 | static int ftrace_mod_jmp(unsigned long ip, | 695 | static unsigned char *ftrace_jmp_replace(unsigned long ip, unsigned long addr) |
| 681 | int old_offset, int new_offset) | ||
| 682 | { | 696 | { |
| 683 | unsigned char code[MCOUNT_INSN_SIZE]; | 697 | static union ftrace_code_union calc; |
| 684 | 698 | ||
| 685 | if (probe_kernel_read(code, (void *)ip, MCOUNT_INSN_SIZE)) | 699 | /* Jmp not a call (ignore the .e8) */ |
| 686 | return -EFAULT; | 700 | calc.e8 = 0xe9; |
| 701 | calc.offset = ftrace_calc_offset(ip + MCOUNT_INSN_SIZE, addr); | ||
| 687 | 702 | ||
| 688 | if (code[0] != 0xe9 || old_offset != *(int *)(&code[1])) | 703 | /* |
| 689 | return -EINVAL; | 704 | * ftrace external locks synchronize the access to the static variable. |
| 705 | */ | ||
| 706 | return calc.code; | ||
| 707 | } | ||
| 690 | 708 | ||
| 691 | *(int *)(&code[1]) = new_offset; | 709 | static int ftrace_mod_jmp(unsigned long ip, void *func) |
| 710 | { | ||
| 711 | unsigned char *new; | ||
| 692 | 712 | ||
| 693 | if (do_ftrace_mod_code(ip, &code)) | 713 | new = ftrace_jmp_replace(ip, (unsigned long)func); |
| 694 | return -EPERM; | ||
| 695 | 714 | ||
| 696 | return 0; | 715 | return update_ftrace_func(ip, new); |
| 697 | } | 716 | } |
| 698 | 717 | ||
| 699 | int ftrace_enable_ftrace_graph_caller(void) | 718 | int ftrace_enable_ftrace_graph_caller(void) |
| 700 | { | 719 | { |
| 701 | unsigned long ip = (unsigned long)(&ftrace_graph_call); | 720 | unsigned long ip = (unsigned long)(&ftrace_graph_call); |
| 702 | int old_offset, new_offset; | ||
| 703 | 721 | ||
| 704 | old_offset = (unsigned long)(&ftrace_stub) - (ip + MCOUNT_INSN_SIZE); | 722 | return ftrace_mod_jmp(ip, &ftrace_graph_caller); |
| 705 | new_offset = (unsigned long)(&ftrace_graph_caller) - (ip + MCOUNT_INSN_SIZE); | ||
| 706 | |||
| 707 | return ftrace_mod_jmp(ip, old_offset, new_offset); | ||
| 708 | } | 723 | } |
| 709 | 724 | ||
| 710 | int ftrace_disable_ftrace_graph_caller(void) | 725 | int ftrace_disable_ftrace_graph_caller(void) |
| 711 | { | 726 | { |
| 712 | unsigned long ip = (unsigned long)(&ftrace_graph_call); | 727 | unsigned long ip = (unsigned long)(&ftrace_graph_call); |
| 713 | int old_offset, new_offset; | ||
| 714 | |||
| 715 | old_offset = (unsigned long)(&ftrace_graph_caller) - (ip + MCOUNT_INSN_SIZE); | ||
| 716 | new_offset = (unsigned long)(&ftrace_stub) - (ip + MCOUNT_INSN_SIZE); | ||
| 717 | 728 | ||
| 718 | return ftrace_mod_jmp(ip, old_offset, new_offset); | 729 | return ftrace_mod_jmp(ip, &ftrace_stub); |
| 719 | } | 730 | } |
| 720 | 731 | ||
| 721 | #endif /* !CONFIG_DYNAMIC_FTRACE */ | 732 | #endif /* !CONFIG_DYNAMIC_FTRACE */ |
diff --git a/arch/x86/kernel/pci-dma.c b/arch/x86/kernel/pci-dma.c index 872079a67e4d..f7d0672481fd 100644 --- a/arch/x86/kernel/pci-dma.c +++ b/arch/x86/kernel/pci-dma.c | |||
| @@ -100,8 +100,10 @@ void *dma_generic_alloc_coherent(struct device *dev, size_t size, | |||
| 100 | flag |= __GFP_ZERO; | 100 | flag |= __GFP_ZERO; |
| 101 | again: | 101 | again: |
| 102 | page = NULL; | 102 | page = NULL; |
| 103 | if (!(flag & GFP_ATOMIC)) | 103 | /* CMA can be used only in the context which permits sleeping */ |
| 104 | if (flag & __GFP_WAIT) | ||
| 104 | page = dma_alloc_from_contiguous(dev, count, get_order(size)); | 105 | page = dma_alloc_from_contiguous(dev, count, get_order(size)); |
| 106 | /* fallback */ | ||
| 105 | if (!page) | 107 | if (!page) |
| 106 | page = alloc_pages_node(dev_to_node(dev), flag, get_order(size)); | 108 | page = alloc_pages_node(dev_to_node(dev), flag, get_order(size)); |
| 107 | if (!page) | 109 | if (!page) |
diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index 19e5adb49a27..cfbe99f88830 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c | |||
| @@ -209,7 +209,7 @@ static inline unsigned long long cycles_2_ns(unsigned long long cyc) | |||
| 209 | * dance when its actually needed. | 209 | * dance when its actually needed. |
| 210 | */ | 210 | */ |
| 211 | 211 | ||
| 212 | preempt_disable(); | 212 | preempt_disable_notrace(); |
| 213 | data = this_cpu_read(cyc2ns.head); | 213 | data = this_cpu_read(cyc2ns.head); |
| 214 | tail = this_cpu_read(cyc2ns.tail); | 214 | tail = this_cpu_read(cyc2ns.tail); |
| 215 | 215 | ||
| @@ -229,7 +229,7 @@ static inline unsigned long long cycles_2_ns(unsigned long long cyc) | |||
| 229 | if (!--data->__count) | 229 | if (!--data->__count) |
| 230 | this_cpu_write(cyc2ns.tail, data); | 230 | this_cpu_write(cyc2ns.tail, data); |
| 231 | } | 231 | } |
| 232 | preempt_enable(); | 232 | preempt_enable_notrace(); |
| 233 | 233 | ||
| 234 | return ns; | 234 | return ns; |
| 235 | } | 235 | } |
| @@ -653,13 +653,10 @@ unsigned long native_calibrate_tsc(void) | |||
| 653 | 653 | ||
| 654 | /* Calibrate TSC using MSR for Intel Atom SoCs */ | 654 | /* Calibrate TSC using MSR for Intel Atom SoCs */ |
| 655 | local_irq_save(flags); | 655 | local_irq_save(flags); |
| 656 | i = try_msr_calibrate_tsc(&fast_calibrate); | 656 | fast_calibrate = try_msr_calibrate_tsc(); |
| 657 | local_irq_restore(flags); | 657 | local_irq_restore(flags); |
| 658 | if (i >= 0) { | 658 | if (fast_calibrate) |
| 659 | if (i == 0) | ||
| 660 | pr_warn("Fast TSC calibration using MSR failed\n"); | ||
| 661 | return fast_calibrate; | 659 | return fast_calibrate; |
| 662 | } | ||
| 663 | 660 | ||
| 664 | local_irq_save(flags); | 661 | local_irq_save(flags); |
| 665 | fast_calibrate = quick_pit_calibrate(); | 662 | fast_calibrate = quick_pit_calibrate(); |
diff --git a/arch/x86/kernel/tsc_msr.c b/arch/x86/kernel/tsc_msr.c index 8b5434f4389f..92ae6acac8a7 100644 --- a/arch/x86/kernel/tsc_msr.c +++ b/arch/x86/kernel/tsc_msr.c | |||
| @@ -53,7 +53,7 @@ static struct freq_desc freq_desc_tables[] = { | |||
| 53 | /* TNG */ | 53 | /* TNG */ |
| 54 | { 6, 0x4a, 1, { 0, FREQ_100, FREQ_133, 0, 0, 0, 0, 0 } }, | 54 | { 6, 0x4a, 1, { 0, FREQ_100, FREQ_133, 0, 0, 0, 0, 0 } }, |
| 55 | /* VLV2 */ | 55 | /* VLV2 */ |
| 56 | { 6, 0x37, 1, { 0, FREQ_100, FREQ_133, FREQ_166, 0, 0, 0, 0 } }, | 56 | { 6, 0x37, 1, { FREQ_83, FREQ_100, FREQ_133, FREQ_166, 0, 0, 0, 0 } }, |
| 57 | /* ANN */ | 57 | /* ANN */ |
| 58 | { 6, 0x5a, 1, { FREQ_83, FREQ_100, FREQ_133, FREQ_100, 0, 0, 0, 0 } }, | 58 | { 6, 0x5a, 1, { FREQ_83, FREQ_100, FREQ_133, FREQ_100, 0, 0, 0, 0 } }, |
| 59 | }; | 59 | }; |
| @@ -77,21 +77,18 @@ static int match_cpu(u8 family, u8 model) | |||
| 77 | 77 | ||
| 78 | /* | 78 | /* |
| 79 | * Do MSR calibration only for known/supported CPUs. | 79 | * Do MSR calibration only for known/supported CPUs. |
| 80 | * Return values: | 80 | * |
| 81 | * -1: CPU is unknown/unsupported for MSR based calibration | 81 | * Returns the calibration value or 0 if MSR calibration failed. |
| 82 | * 0: CPU is known/supported, but calibration failed | ||
| 83 | * 1: CPU is known/supported, and calibration succeeded | ||
| 84 | */ | 82 | */ |
| 85 | int try_msr_calibrate_tsc(unsigned long *fast_calibrate) | 83 | unsigned long try_msr_calibrate_tsc(void) |
| 86 | { | 84 | { |
| 87 | int cpu_index; | ||
| 88 | u32 lo, hi, ratio, freq_id, freq; | 85 | u32 lo, hi, ratio, freq_id, freq; |
| 86 | unsigned long res; | ||
| 87 | int cpu_index; | ||
| 89 | 88 | ||
| 90 | cpu_index = match_cpu(boot_cpu_data.x86, boot_cpu_data.x86_model); | 89 | cpu_index = match_cpu(boot_cpu_data.x86, boot_cpu_data.x86_model); |
| 91 | if (cpu_index < 0) | 90 | if (cpu_index < 0) |
| 92 | return -1; | 91 | return 0; |
| 93 | |||
| 94 | *fast_calibrate = 0; | ||
| 95 | 92 | ||
| 96 | if (freq_desc_tables[cpu_index].msr_plat) { | 93 | if (freq_desc_tables[cpu_index].msr_plat) { |
| 97 | rdmsr(MSR_PLATFORM_INFO, lo, hi); | 94 | rdmsr(MSR_PLATFORM_INFO, lo, hi); |
| @@ -103,7 +100,7 @@ int try_msr_calibrate_tsc(unsigned long *fast_calibrate) | |||
| 103 | pr_info("Maximum core-clock to bus-clock ratio: 0x%x\n", ratio); | 100 | pr_info("Maximum core-clock to bus-clock ratio: 0x%x\n", ratio); |
| 104 | 101 | ||
| 105 | if (!ratio) | 102 | if (!ratio) |
| 106 | return 0; | 103 | goto fail; |
| 107 | 104 | ||
| 108 | /* Get FSB FREQ ID */ | 105 | /* Get FSB FREQ ID */ |
| 109 | rdmsr(MSR_FSB_FREQ, lo, hi); | 106 | rdmsr(MSR_FSB_FREQ, lo, hi); |
| @@ -112,16 +109,19 @@ int try_msr_calibrate_tsc(unsigned long *fast_calibrate) | |||
| 112 | pr_info("Resolved frequency ID: %u, frequency: %u KHz\n", | 109 | pr_info("Resolved frequency ID: %u, frequency: %u KHz\n", |
| 113 | freq_id, freq); | 110 | freq_id, freq); |
| 114 | if (!freq) | 111 | if (!freq) |
| 115 | return 0; | 112 | goto fail; |
| 116 | 113 | ||
| 117 | /* TSC frequency = maximum resolved freq * maximum resolved bus ratio */ | 114 | /* TSC frequency = maximum resolved freq * maximum resolved bus ratio */ |
| 118 | *fast_calibrate = freq * ratio; | 115 | res = freq * ratio; |
| 119 | pr_info("TSC runs at %lu KHz\n", *fast_calibrate); | 116 | pr_info("TSC runs at %lu KHz\n", res); |
| 120 | 117 | ||
| 121 | #ifdef CONFIG_X86_LOCAL_APIC | 118 | #ifdef CONFIG_X86_LOCAL_APIC |
| 122 | lapic_timer_frequency = (freq * 1000) / HZ; | 119 | lapic_timer_frequency = (freq * 1000) / HZ; |
| 123 | pr_info("lapic_timer_frequency = %d\n", lapic_timer_frequency); | 120 | pr_info("lapic_timer_frequency = %d\n", lapic_timer_frequency); |
| 124 | #endif | 121 | #endif |
| 122 | return res; | ||
| 125 | 123 | ||
| 126 | return 1; | 124 | fail: |
| 125 | pr_warn("Fast TSC calibration using MSR failed\n"); | ||
| 126 | return 0; | ||
| 127 | } | 127 | } |
diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c index 9d591c895803..6dea040cc3a1 100644 --- a/arch/x86/mm/fault.c +++ b/arch/x86/mm/fault.c | |||
| @@ -1001,6 +1001,12 @@ static int fault_in_kernel_space(unsigned long address) | |||
| 1001 | 1001 | ||
| 1002 | static inline bool smap_violation(int error_code, struct pt_regs *regs) | 1002 | static inline bool smap_violation(int error_code, struct pt_regs *regs) |
| 1003 | { | 1003 | { |
| 1004 | if (!IS_ENABLED(CONFIG_X86_SMAP)) | ||
| 1005 | return false; | ||
| 1006 | |||
| 1007 | if (!static_cpu_has(X86_FEATURE_SMAP)) | ||
| 1008 | return false; | ||
| 1009 | |||
| 1004 | if (error_code & PF_USER) | 1010 | if (error_code & PF_USER) |
| 1005 | return false; | 1011 | return false; |
| 1006 | 1012 | ||
| @@ -1087,11 +1093,9 @@ __do_page_fault(struct pt_regs *regs, unsigned long error_code) | |||
| 1087 | if (unlikely(error_code & PF_RSVD)) | 1093 | if (unlikely(error_code & PF_RSVD)) |
| 1088 | pgtable_bad(regs, error_code, address); | 1094 | pgtable_bad(regs, error_code, address); |
| 1089 | 1095 | ||
| 1090 | if (static_cpu_has(X86_FEATURE_SMAP)) { | 1096 | if (unlikely(smap_violation(error_code, regs))) { |
| 1091 | if (unlikely(smap_violation(error_code, regs))) { | 1097 | bad_area_nosemaphore(regs, error_code, address); |
| 1092 | bad_area_nosemaphore(regs, error_code, address); | 1098 | return; |
| 1093 | return; | ||
| 1094 | } | ||
| 1095 | } | 1099 | } |
| 1096 | 1100 | ||
| 1097 | /* | 1101 | /* |
diff --git a/arch/x86/platform/efi/efi-bgrt.c b/arch/x86/platform/efi/efi-bgrt.c index 4df9591eadad..f15103dff4b4 100644 --- a/arch/x86/platform/efi/efi-bgrt.c +++ b/arch/x86/platform/efi/efi-bgrt.c | |||
| @@ -42,7 +42,7 @@ void __init efi_bgrt_init(void) | |||
| 42 | 42 | ||
| 43 | if (bgrt_tab->header.length < sizeof(*bgrt_tab)) | 43 | if (bgrt_tab->header.length < sizeof(*bgrt_tab)) |
| 44 | return; | 44 | return; |
| 45 | if (bgrt_tab->version != 1) | 45 | if (bgrt_tab->version != 1 || bgrt_tab->status != 1) |
| 46 | return; | 46 | return; |
| 47 | if (bgrt_tab->image_type != 0 || !bgrt_tab->image_address) | 47 | if (bgrt_tab->image_type != 0 || !bgrt_tab->image_address) |
| 48 | return; | 48 | return; |
diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c index d62ec87a2b26..1a201ac7cef8 100644 --- a/arch/x86/platform/efi/efi.c +++ b/arch/x86/platform/efi/efi.c | |||
| @@ -792,7 +792,7 @@ void __init efi_set_executable(efi_memory_desc_t *md, bool executable) | |||
| 792 | set_memory_nx(addr, npages); | 792 | set_memory_nx(addr, npages); |
| 793 | } | 793 | } |
| 794 | 794 | ||
| 795 | static void __init runtime_code_page_mkexec(void) | 795 | void __init runtime_code_page_mkexec(void) |
| 796 | { | 796 | { |
| 797 | efi_memory_desc_t *md; | 797 | efi_memory_desc_t *md; |
| 798 | void *p; | 798 | void *p; |
| @@ -1069,8 +1069,7 @@ void __init efi_enter_virtual_mode(void) | |||
| 1069 | efi.update_capsule = virt_efi_update_capsule; | 1069 | efi.update_capsule = virt_efi_update_capsule; |
| 1070 | efi.query_capsule_caps = virt_efi_query_capsule_caps; | 1070 | efi.query_capsule_caps = virt_efi_query_capsule_caps; |
| 1071 | 1071 | ||
| 1072 | if (efi_enabled(EFI_OLD_MEMMAP) && (__supported_pte_mask & _PAGE_NX)) | 1072 | efi_runtime_mkexec(); |
| 1073 | runtime_code_page_mkexec(); | ||
| 1074 | 1073 | ||
| 1075 | kfree(new_memmap); | 1074 | kfree(new_memmap); |
| 1076 | 1075 | ||
diff --git a/arch/x86/platform/efi/efi_32.c b/arch/x86/platform/efi/efi_32.c index 249b183cf417..0b74cdf7f816 100644 --- a/arch/x86/platform/efi/efi_32.c +++ b/arch/x86/platform/efi/efi_32.c | |||
| @@ -77,3 +77,9 @@ void efi_call_phys_epilog(void) | |||
| 77 | 77 | ||
| 78 | local_irq_restore(efi_rt_eflags); | 78 | local_irq_restore(efi_rt_eflags); |
| 79 | } | 79 | } |
| 80 | |||
| 81 | void __init efi_runtime_mkexec(void) | ||
| 82 | { | ||
| 83 | if (__supported_pte_mask & _PAGE_NX) | ||
| 84 | runtime_code_page_mkexec(); | ||
| 85 | } | ||
diff --git a/arch/x86/platform/efi/efi_64.c b/arch/x86/platform/efi/efi_64.c index 6284f158a47d..0c2a234fef1e 100644 --- a/arch/x86/platform/efi/efi_64.c +++ b/arch/x86/platform/efi/efi_64.c | |||
| @@ -233,3 +233,12 @@ void __init parse_efi_setup(u64 phys_addr, u32 data_len) | |||
| 233 | { | 233 | { |
| 234 | efi_setup = phys_addr + sizeof(struct setup_data); | 234 | efi_setup = phys_addr + sizeof(struct setup_data); |
| 235 | } | 235 | } |
| 236 | |||
| 237 | void __init efi_runtime_mkexec(void) | ||
| 238 | { | ||
| 239 | if (!efi_enabled(EFI_OLD_MEMMAP)) | ||
| 240 | return; | ||
| 241 | |||
| 242 | if (__supported_pte_mask & _PAGE_NX) | ||
| 243 | runtime_code_page_mkexec(); | ||
| 244 | } | ||
diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c index 2423ef04ffea..256282e7888b 100644 --- a/arch/x86/xen/mmu.c +++ b/arch/x86/xen/mmu.c | |||
| @@ -365,7 +365,7 @@ void xen_ptep_modify_prot_commit(struct mm_struct *mm, unsigned long addr, | |||
| 365 | /* Assume pteval_t is equivalent to all the other *val_t types. */ | 365 | /* Assume pteval_t is equivalent to all the other *val_t types. */ |
| 366 | static pteval_t pte_mfn_to_pfn(pteval_t val) | 366 | static pteval_t pte_mfn_to_pfn(pteval_t val) |
| 367 | { | 367 | { |
| 368 | if (val & _PAGE_PRESENT) { | 368 | if (pteval_present(val)) { |
| 369 | unsigned long mfn = (val & PTE_PFN_MASK) >> PAGE_SHIFT; | 369 | unsigned long mfn = (val & PTE_PFN_MASK) >> PAGE_SHIFT; |
| 370 | unsigned long pfn = mfn_to_pfn(mfn); | 370 | unsigned long pfn = mfn_to_pfn(mfn); |
| 371 | 371 | ||
| @@ -381,7 +381,7 @@ static pteval_t pte_mfn_to_pfn(pteval_t val) | |||
| 381 | 381 | ||
| 382 | static pteval_t pte_pfn_to_mfn(pteval_t val) | 382 | static pteval_t pte_pfn_to_mfn(pteval_t val) |
| 383 | { | 383 | { |
| 384 | if (val & _PAGE_PRESENT) { | 384 | if (pteval_present(val)) { |
| 385 | unsigned long pfn = (val & PTE_PFN_MASK) >> PAGE_SHIFT; | 385 | unsigned long pfn = (val & PTE_PFN_MASK) >> PAGE_SHIFT; |
| 386 | pteval_t flags = val & PTE_FLAGS_MASK; | 386 | pteval_t flags = val & PTE_FLAGS_MASK; |
| 387 | unsigned long mfn; | 387 | unsigned long mfn; |
diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig index ba56e11cbf77..c87ae7c6e5f9 100644 --- a/arch/xtensa/Kconfig +++ b/arch/xtensa/Kconfig | |||
| @@ -20,6 +20,7 @@ config XTENSA | |||
| 20 | select HAVE_FUNCTION_TRACER | 20 | select HAVE_FUNCTION_TRACER |
| 21 | select HAVE_IRQ_TIME_ACCOUNTING | 21 | select HAVE_IRQ_TIME_ACCOUNTING |
| 22 | select HAVE_PERF_EVENTS | 22 | select HAVE_PERF_EVENTS |
| 23 | select COMMON_CLK | ||
| 23 | help | 24 | help |
| 24 | Xtensa processors are 32-bit RISC machines designed by Tensilica | 25 | Xtensa processors are 32-bit RISC machines designed by Tensilica |
| 25 | primarily for embedded systems. These processors are both | 26 | primarily for embedded systems. These processors are both |
| @@ -80,7 +81,6 @@ choice | |||
| 80 | config XTENSA_VARIANT_FSF | 81 | config XTENSA_VARIANT_FSF |
| 81 | bool "fsf - default (not generic) configuration" | 82 | bool "fsf - default (not generic) configuration" |
| 82 | select MMU | 83 | select MMU |
| 83 | select HAVE_XTENSA_GPIO32 | ||
| 84 | 84 | ||
| 85 | config XTENSA_VARIANT_DC232B | 85 | config XTENSA_VARIANT_DC232B |
| 86 | bool "dc232b - Diamond 232L Standard Core Rev.B (LE)" | 86 | bool "dc232b - Diamond 232L Standard Core Rev.B (LE)" |
| @@ -135,7 +135,6 @@ config HAVE_SMP | |||
| 135 | config SMP | 135 | config SMP |
| 136 | bool "Enable Symmetric multi-processing support" | 136 | bool "Enable Symmetric multi-processing support" |
| 137 | depends on HAVE_SMP | 137 | depends on HAVE_SMP |
| 138 | select USE_GENERIC_SMP_HELPERS | ||
| 139 | select GENERIC_SMP_IDLE_THREAD | 138 | select GENERIC_SMP_IDLE_THREAD |
| 140 | help | 139 | help |
| 141 | Enabled SMP Software; allows more than one CPU/CORE | 140 | Enabled SMP Software; allows more than one CPU/CORE |
diff --git a/arch/xtensa/boot/dts/xtfpga.dtsi b/arch/xtensa/boot/dts/xtfpga.dtsi index 46b4f5eab421..e7370b11348e 100644 --- a/arch/xtensa/boot/dts/xtfpga.dtsi +++ b/arch/xtensa/boot/dts/xtfpga.dtsi | |||
| @@ -35,6 +35,13 @@ | |||
| 35 | interrupt-controller; | 35 | interrupt-controller; |
| 36 | }; | 36 | }; |
| 37 | 37 | ||
| 38 | clocks { | ||
| 39 | osc: main-oscillator { | ||
| 40 | #clock-cells = <0>; | ||
| 41 | compatible = "fixed-clock"; | ||
| 42 | }; | ||
| 43 | }; | ||
| 44 | |||
| 38 | serial0: serial@fd050020 { | 45 | serial0: serial@fd050020 { |
| 39 | device_type = "serial"; | 46 | device_type = "serial"; |
| 40 | compatible = "ns16550a"; | 47 | compatible = "ns16550a"; |
| @@ -42,9 +49,7 @@ | |||
| 42 | reg = <0xfd050020 0x20>; | 49 | reg = <0xfd050020 0x20>; |
| 43 | reg-shift = <2>; | 50 | reg-shift = <2>; |
| 44 | interrupts = <0 1>; /* external irq 0 */ | 51 | interrupts = <0 1>; /* external irq 0 */ |
| 45 | /* Filled in by platform_setup from FPGA register | 52 | clocks = <&osc>; |
| 46 | * clock-frequency = <100000000>; | ||
| 47 | */ | ||
| 48 | }; | 53 | }; |
| 49 | 54 | ||
| 50 | enet0: ethoc@fd030000 { | 55 | enet0: ethoc@fd030000 { |
| @@ -52,5 +57,6 @@ | |||
| 52 | reg = <0xfd030000 0x4000 0xfd800000 0x4000>; | 57 | reg = <0xfd030000 0x4000 0xfd800000 0x4000>; |
| 53 | interrupts = <1 1>; /* external irq 1 */ | 58 | interrupts = <1 1>; /* external irq 1 */ |
| 54 | local-mac-address = [00 50 c2 13 6f 00]; | 59 | local-mac-address = [00 50 c2 13 6f 00]; |
| 60 | clocks = <&osc>; | ||
| 55 | }; | 61 | }; |
| 56 | }; | 62 | }; |
diff --git a/arch/xtensa/include/asm/io.h b/arch/xtensa/include/asm/io.h index 2a042d430c25..74944207167e 100644 --- a/arch/xtensa/include/asm/io.h +++ b/arch/xtensa/include/asm/io.h | |||
| @@ -25,7 +25,7 @@ | |||
| 25 | 25 | ||
| 26 | #ifdef CONFIG_MMU | 26 | #ifdef CONFIG_MMU |
| 27 | 27 | ||
| 28 | #if XCHAL_HAVE_PTP_MMU && XCHAL_HAVE_SPANNING_WAY && CONFIG_OF | 28 | #if XCHAL_HAVE_PTP_MMU && XCHAL_HAVE_SPANNING_WAY && defined(CONFIG_OF) |
| 29 | extern unsigned long xtensa_kio_paddr; | 29 | extern unsigned long xtensa_kio_paddr; |
| 30 | 30 | ||
| 31 | static inline unsigned long xtensa_get_kio_paddr(void) | 31 | static inline unsigned long xtensa_get_kio_paddr(void) |
diff --git a/arch/xtensa/include/asm/traps.h b/arch/xtensa/include/asm/traps.h index 8c194f6af45e..677bfcf4ee5d 100644 --- a/arch/xtensa/include/asm/traps.h +++ b/arch/xtensa/include/asm/traps.h | |||
| @@ -23,25 +23,37 @@ void secondary_trap_init(void); | |||
| 23 | 23 | ||
| 24 | static inline void spill_registers(void) | 24 | static inline void spill_registers(void) |
| 25 | { | 25 | { |
| 26 | 26 | #if XCHAL_NUM_AREGS > 16 | |
| 27 | __asm__ __volatile__ ( | 27 | __asm__ __volatile__ ( |
| 28 | "movi a14, "__stringify((1 << PS_EXCM_BIT) | LOCKLEVEL)"\n\t" | 28 | " call12 1f\n" |
| 29 | "mov a12, a0\n\t" | 29 | " _j 2f\n" |
| 30 | "rsr a13, sar\n\t" | 30 | " retw\n" |
| 31 | "xsr a14, ps\n\t" | 31 | " .align 4\n" |
| 32 | "movi a0, _spill_registers\n\t" | 32 | "1:\n" |
| 33 | "rsync\n\t" | 33 | " _entry a1, 48\n" |
| 34 | "callx0 a0\n\t" | 34 | " addi a12, a0, 3\n" |
| 35 | "mov a0, a12\n\t" | 35 | #if XCHAL_NUM_AREGS > 32 |
| 36 | "wsr a13, sar\n\t" | 36 | " .rept (" __stringify(XCHAL_NUM_AREGS) " - 32) / 12\n" |
| 37 | "wsr a14, ps\n\t" | 37 | " _entry a1, 48\n" |
| 38 | : : | 38 | " mov a12, a0\n" |
| 39 | #if defined(CONFIG_FRAME_POINTER) | 39 | " .endr\n" |
| 40 | : "a2", "a3", "a4", "a11", "a12", "a13", "a14", "a15", | 40 | #endif |
| 41 | " _entry a1, 48\n" | ||
| 42 | #if XCHAL_NUM_AREGS % 12 == 0 | ||
| 43 | " mov a8, a8\n" | ||
| 44 | #elif XCHAL_NUM_AREGS % 12 == 4 | ||
| 45 | " mov a12, a12\n" | ||
| 46 | #elif XCHAL_NUM_AREGS % 12 == 8 | ||
| 47 | " mov a4, a4\n" | ||
| 48 | #endif | ||
| 49 | " retw\n" | ||
| 50 | "2:\n" | ||
| 51 | : : : "a12", "a13", "memory"); | ||
| 41 | #else | 52 | #else |
| 42 | : "a2", "a3", "a4", "a7", "a11", "a12", "a13", "a14", "a15", | 53 | __asm__ __volatile__ ( |
| 54 | " mov a12, a12\n" | ||
| 55 | : : : "memory"); | ||
| 43 | #endif | 56 | #endif |
| 44 | "memory"); | ||
| 45 | } | 57 | } |
| 46 | 58 | ||
| 47 | #endif /* _XTENSA_TRAPS_H */ | 59 | #endif /* _XTENSA_TRAPS_H */ |
diff --git a/arch/xtensa/include/asm/vectors.h b/arch/xtensa/include/asm/vectors.h index 5791b45d5a5d..f74ddfbb92ef 100644 --- a/arch/xtensa/include/asm/vectors.h +++ b/arch/xtensa/include/asm/vectors.h | |||
| @@ -25,7 +25,7 @@ | |||
| 25 | #define XCHAL_KIO_DEFAULT_PADDR 0xf0000000 | 25 | #define XCHAL_KIO_DEFAULT_PADDR 0xf0000000 |
| 26 | #define XCHAL_KIO_SIZE 0x10000000 | 26 | #define XCHAL_KIO_SIZE 0x10000000 |
| 27 | 27 | ||
| 28 | #if XCHAL_HAVE_PTP_MMU && XCHAL_HAVE_SPANNING_WAY && CONFIG_OF | 28 | #if XCHAL_HAVE_PTP_MMU && XCHAL_HAVE_SPANNING_WAY && defined(CONFIG_OF) |
| 29 | #define XCHAL_KIO_PADDR xtensa_get_kio_paddr() | 29 | #define XCHAL_KIO_PADDR xtensa_get_kio_paddr() |
| 30 | #else | 30 | #else |
| 31 | #define XCHAL_KIO_PADDR XCHAL_KIO_DEFAULT_PADDR | 31 | #define XCHAL_KIO_PADDR XCHAL_KIO_DEFAULT_PADDR |
diff --git a/arch/xtensa/include/uapi/asm/unistd.h b/arch/xtensa/include/uapi/asm/unistd.h index 51940fec6990..b9395529f02d 100644 --- a/arch/xtensa/include/uapi/asm/unistd.h +++ b/arch/xtensa/include/uapi/asm/unistd.h | |||
| @@ -734,7 +734,12 @@ __SYSCALL(332, sys_finit_module, 3) | |||
| 734 | #define __NR_accept4 333 | 734 | #define __NR_accept4 333 |
| 735 | __SYSCALL(333, sys_accept4, 4) | 735 | __SYSCALL(333, sys_accept4, 4) |
| 736 | 736 | ||
| 737 | #define __NR_syscall_count 334 | 737 | #define __NR_sched_setattr 334 |
| 738 | __SYSCALL(334, sys_sched_setattr, 2) | ||
| 739 | #define __NR_sched_getattr 335 | ||
| 740 | __SYSCALL(335, sys_sched_getattr, 3) | ||
| 741 | |||
| 742 | #define __NR_syscall_count 336 | ||
| 738 | 743 | ||
| 739 | /* | 744 | /* |
| 740 | * sysxtensa syscall handler | 745 | * sysxtensa syscall handler |
diff --git a/arch/xtensa/kernel/entry.S b/arch/xtensa/kernel/entry.S index 21dbe6bdb8ed..ef7f4990722b 100644 --- a/arch/xtensa/kernel/entry.S +++ b/arch/xtensa/kernel/entry.S | |||
| @@ -1081,196 +1081,53 @@ ENTRY(fast_syscall_spill_registers) | |||
| 1081 | 1081 | ||
| 1082 | rsr a0, sar | 1082 | rsr a0, sar |
| 1083 | s32i a3, a2, PT_AREG3 | 1083 | s32i a3, a2, PT_AREG3 |
| 1084 | s32i a4, a2, PT_AREG4 | 1084 | s32i a0, a2, PT_SAR |
| 1085 | s32i a0, a2, PT_AREG5 # store SAR to PT_AREG5 | ||
| 1086 | 1085 | ||
| 1087 | /* The spill routine might clobber a7, a11, and a15. */ | 1086 | /* The spill routine might clobber a4, a7, a8, a11, a12, and a15. */ |
| 1088 | 1087 | ||
| 1088 | s32i a4, a2, PT_AREG4 | ||
| 1089 | s32i a7, a2, PT_AREG7 | 1089 | s32i a7, a2, PT_AREG7 |
| 1090 | s32i a8, a2, PT_AREG8 | ||
| 1090 | s32i a11, a2, PT_AREG11 | 1091 | s32i a11, a2, PT_AREG11 |
| 1092 | s32i a12, a2, PT_AREG12 | ||
| 1091 | s32i a15, a2, PT_AREG15 | 1093 | s32i a15, a2, PT_AREG15 |
| 1092 | 1094 | ||
| 1093 | call0 _spill_registers # destroys a3, a4, and SAR | ||
| 1094 | |||
| 1095 | /* Advance PC, restore registers and SAR, and return from exception. */ | ||
| 1096 | |||
| 1097 | l32i a3, a2, PT_AREG5 | ||
| 1098 | l32i a4, a2, PT_AREG4 | ||
| 1099 | l32i a0, a2, PT_AREG0 | ||
| 1100 | wsr a3, sar | ||
| 1101 | l32i a3, a2, PT_AREG3 | ||
| 1102 | |||
| 1103 | /* Restore clobbered registers. */ | ||
| 1104 | |||
| 1105 | l32i a7, a2, PT_AREG7 | ||
| 1106 | l32i a11, a2, PT_AREG11 | ||
| 1107 | l32i a15, a2, PT_AREG15 | ||
| 1108 | |||
| 1109 | movi a2, 0 | ||
| 1110 | rfe | ||
| 1111 | |||
| 1112 | ENDPROC(fast_syscall_spill_registers) | ||
| 1113 | |||
| 1114 | /* Fixup handler. | ||
| 1115 | * | ||
| 1116 | * We get here if the spill routine causes an exception, e.g. tlb miss. | ||
| 1117 | * We basically restore WINDOWBASE and WINDOWSTART to the condition when | ||
| 1118 | * we entered the spill routine and jump to the user exception handler. | ||
| 1119 | * | ||
| 1120 | * a0: value of depc, original value in depc | ||
| 1121 | * a2: trashed, original value in EXC_TABLE_DOUBLE_SAVE | ||
| 1122 | * a3: exctable, original value in excsave1 | ||
| 1123 | */ | ||
| 1124 | |||
| 1125 | ENTRY(fast_syscall_spill_registers_fixup) | ||
| 1126 | |||
| 1127 | rsr a2, windowbase # get current windowbase (a2 is saved) | ||
| 1128 | xsr a0, depc # restore depc and a0 | ||
| 1129 | ssl a2 # set shift (32 - WB) | ||
| 1130 | |||
| 1131 | /* We need to make sure the current registers (a0-a3) are preserved. | ||
| 1132 | * To do this, we simply set the bit for the current window frame | ||
| 1133 | * in WS, so that the exception handlers save them to the task stack. | ||
| 1134 | */ | ||
| 1135 | |||
| 1136 | xsr a3, excsave1 # get spill-mask | ||
| 1137 | slli a3, a3, 1 # shift left by one | ||
| 1138 | |||
| 1139 | slli a2, a3, 32-WSBITS | ||
| 1140 | src a2, a3, a2 # a2 = xxwww1yyxxxwww1yy...... | ||
| 1141 | wsr a2, windowstart # set corrected windowstart | ||
| 1142 | |||
| 1143 | srli a3, a3, 1 | ||
| 1144 | rsr a2, excsave1 | ||
| 1145 | l32i a2, a2, EXC_TABLE_DOUBLE_SAVE # restore a2 | ||
| 1146 | xsr a2, excsave1 | ||
| 1147 | s32i a3, a2, EXC_TABLE_DOUBLE_SAVE # save a3 | ||
| 1148 | l32i a3, a2, EXC_TABLE_PARAM # original WB (in user task) | ||
| 1149 | xsr a2, excsave1 | ||
| 1150 | |||
| 1151 | /* Return to the original (user task) WINDOWBASE. | ||
| 1152 | * We leave the following frame behind: | ||
| 1153 | * a0, a1, a2 same | ||
| 1154 | * a3: trashed (saved in EXC_TABLE_DOUBLE_SAVE) | ||
| 1155 | * depc: depc (we have to return to that address) | ||
| 1156 | * excsave_1: exctable | ||
| 1157 | */ | ||
| 1158 | |||
| 1159 | wsr a3, windowbase | ||
| 1160 | rsync | ||
| 1161 | |||
| 1162 | /* We are now in the original frame when we entered _spill_registers: | ||
| 1163 | * a0: return address | ||
| 1164 | * a1: used, stack pointer | ||
| 1165 | * a2: kernel stack pointer | ||
| 1166 | * a3: available | ||
| 1167 | * depc: exception address | ||
| 1168 | * excsave: exctable | ||
| 1169 | * Note: This frame might be the same as above. | ||
| 1170 | */ | ||
| 1171 | |||
| 1172 | /* Setup stack pointer. */ | ||
| 1173 | |||
| 1174 | addi a2, a2, -PT_USER_SIZE | ||
| 1175 | s32i a0, a2, PT_AREG0 | ||
| 1176 | |||
| 1177 | /* Make sure we return to this fixup handler. */ | ||
| 1178 | |||
| 1179 | movi a3, fast_syscall_spill_registers_fixup_return | ||
| 1180 | s32i a3, a2, PT_DEPC # setup depc | ||
| 1181 | |||
| 1182 | /* Jump to the exception handler. */ | ||
| 1183 | |||
| 1184 | rsr a3, excsave1 | ||
| 1185 | rsr a0, exccause | ||
| 1186 | addx4 a0, a0, a3 # find entry in table | ||
| 1187 | l32i a0, a0, EXC_TABLE_FAST_USER # load handler | ||
| 1188 | l32i a3, a3, EXC_TABLE_DOUBLE_SAVE | ||
| 1189 | jx a0 | ||
| 1190 | |||
| 1191 | ENDPROC(fast_syscall_spill_registers_fixup) | ||
| 1192 | |||
| 1193 | ENTRY(fast_syscall_spill_registers_fixup_return) | ||
| 1194 | |||
| 1195 | /* When we return here, all registers have been restored (a2: DEPC) */ | ||
| 1196 | |||
| 1197 | wsr a2, depc # exception address | ||
| 1198 | |||
| 1199 | /* Restore fixup handler. */ | ||
| 1200 | |||
| 1201 | rsr a2, excsave1 | ||
| 1202 | s32i a3, a2, EXC_TABLE_DOUBLE_SAVE | ||
| 1203 | movi a3, fast_syscall_spill_registers_fixup | ||
| 1204 | s32i a3, a2, EXC_TABLE_FIXUP | ||
| 1205 | rsr a3, windowbase | ||
| 1206 | s32i a3, a2, EXC_TABLE_PARAM | ||
| 1207 | l32i a2, a2, EXC_TABLE_KSTK | ||
| 1208 | |||
| 1209 | /* Load WB at the time the exception occurred. */ | ||
| 1210 | |||
| 1211 | rsr a3, sar # WB is still in SAR | ||
| 1212 | neg a3, a3 | ||
| 1213 | wsr a3, windowbase | ||
| 1214 | rsync | ||
| 1215 | |||
| 1216 | rsr a3, excsave1 | ||
| 1217 | l32i a3, a3, EXC_TABLE_DOUBLE_SAVE | ||
| 1218 | |||
| 1219 | rfde | ||
| 1220 | |||
| 1221 | ENDPROC(fast_syscall_spill_registers_fixup_return) | ||
| 1222 | |||
| 1223 | /* | ||
| 1224 | * spill all registers. | ||
| 1225 | * | ||
| 1226 | * This is not a real function. The following conditions must be met: | ||
| 1227 | * | ||
| 1228 | * - must be called with call0. | ||
| 1229 | * - uses a3, a4 and SAR. | ||
| 1230 | * - the last 'valid' register of each frame are clobbered. | ||
| 1231 | * - the caller must have registered a fixup handler | ||
| 1232 | * (or be inside a critical section) | ||
| 1233 | * - PS_EXCM must be set (PS_WOE cleared?) | ||
| 1234 | */ | ||
| 1235 | |||
| 1236 | ENTRY(_spill_registers) | ||
| 1237 | |||
| 1238 | /* | 1095 | /* |
| 1239 | * Rotate ws so that the current windowbase is at bit 0. | 1096 | * Rotate ws so that the current windowbase is at bit 0. |
| 1240 | * Assume ws = xxxwww1yy (www1 current window frame). | 1097 | * Assume ws = xxxwww1yy (www1 current window frame). |
| 1241 | * Rotate ws right so that a4 = yyxxxwww1. | 1098 | * Rotate ws right so that a4 = yyxxxwww1. |
| 1242 | */ | 1099 | */ |
| 1243 | 1100 | ||
| 1244 | rsr a4, windowbase | 1101 | rsr a0, windowbase |
| 1245 | rsr a3, windowstart # a3 = xxxwww1yy | 1102 | rsr a3, windowstart # a3 = xxxwww1yy |
| 1246 | ssr a4 # holds WB | 1103 | ssr a0 # holds WB |
| 1247 | slli a4, a3, WSBITS | 1104 | slli a0, a3, WSBITS |
| 1248 | or a3, a3, a4 # a3 = xxxwww1yyxxxwww1yy | 1105 | or a3, a3, a0 # a3 = xxxwww1yyxxxwww1yy |
| 1249 | srl a3, a3 # a3 = 00xxxwww1yyxxxwww1 | 1106 | srl a3, a3 # a3 = 00xxxwww1yyxxxwww1 |
| 1250 | 1107 | ||
| 1251 | /* We are done if there are no more than the current register frame. */ | 1108 | /* We are done if there are no more than the current register frame. */ |
| 1252 | 1109 | ||
| 1253 | extui a3, a3, 1, WSBITS-1 # a3 = 0yyxxxwww | 1110 | extui a3, a3, 1, WSBITS-1 # a3 = 0yyxxxwww |
| 1254 | movi a4, (1 << (WSBITS-1)) | 1111 | movi a0, (1 << (WSBITS-1)) |
| 1255 | _beqz a3, .Lnospill # only one active frame? jump | 1112 | _beqz a3, .Lnospill # only one active frame? jump |
| 1256 | 1113 | ||
| 1257 | /* We want 1 at the top, so that we return to the current windowbase */ | 1114 | /* We want 1 at the top, so that we return to the current windowbase */ |
| 1258 | 1115 | ||
| 1259 | or a3, a3, a4 # 1yyxxxwww | 1116 | or a3, a3, a0 # 1yyxxxwww |
| 1260 | 1117 | ||
| 1261 | /* Skip empty frames - get 'oldest' WINDOWSTART-bit. */ | 1118 | /* Skip empty frames - get 'oldest' WINDOWSTART-bit. */ |
| 1262 | 1119 | ||
| 1263 | wsr a3, windowstart # save shifted windowstart | 1120 | wsr a3, windowstart # save shifted windowstart |
| 1264 | neg a4, a3 | 1121 | neg a0, a3 |
| 1265 | and a3, a4, a3 # first bit set from right: 000010000 | 1122 | and a3, a0, a3 # first bit set from right: 000010000 |
| 1266 | 1123 | ||
| 1267 | ffs_ws a4, a3 # a4: shifts to skip empty frames | 1124 | ffs_ws a0, a3 # a0: shifts to skip empty frames |
| 1268 | movi a3, WSBITS | 1125 | movi a3, WSBITS |
| 1269 | sub a4, a3, a4 # WSBITS-a4:number of 0-bits from right | 1126 | sub a0, a3, a0 # WSBITS-a0:number of 0-bits from right |
| 1270 | ssr a4 # save in SAR for later. | 1127 | ssr a0 # save in SAR for later. |
| 1271 | 1128 | ||
| 1272 | rsr a3, windowbase | 1129 | rsr a3, windowbase |
| 1273 | add a3, a3, a4 | 1130 | add a3, a3, a0 |
| 1274 | wsr a3, windowbase | 1131 | wsr a3, windowbase |
| 1275 | rsync | 1132 | rsync |
| 1276 | 1133 | ||
| @@ -1285,22 +1142,6 @@ ENTRY(_spill_registers) | |||
| 1285 | * we have to save 4,8. or 12 registers. | 1142 | * we have to save 4,8. or 12 registers. |
| 1286 | */ | 1143 | */ |
| 1287 | 1144 | ||
| 1288 | _bbsi.l a3, 1, .Lc4 | ||
| 1289 | _bbsi.l a3, 2, .Lc8 | ||
| 1290 | |||
| 1291 | /* Special case: we have a call12-frame starting at a4. */ | ||
| 1292 | |||
| 1293 | _bbci.l a3, 3, .Lc12 # bit 3 shouldn't be zero! (Jump to Lc12 first) | ||
| 1294 | |||
| 1295 | s32e a4, a1, -16 # a1 is valid with an empty spill area | ||
| 1296 | l32e a4, a5, -12 | ||
| 1297 | s32e a8, a4, -48 | ||
| 1298 | mov a8, a4 | ||
| 1299 | l32e a4, a1, -16 | ||
| 1300 | j .Lc12c | ||
| 1301 | |||
| 1302 | .Lnospill: | ||
| 1303 | ret | ||
| 1304 | 1145 | ||
| 1305 | .Lloop: _bbsi.l a3, 1, .Lc4 | 1146 | .Lloop: _bbsi.l a3, 1, .Lc4 |
| 1306 | _bbci.l a3, 2, .Lc12 | 1147 | _bbci.l a3, 2, .Lc12 |
| @@ -1314,20 +1155,10 @@ ENTRY(_spill_registers) | |||
| 1314 | s32e a9, a4, -28 | 1155 | s32e a9, a4, -28 |
| 1315 | s32e a10, a4, -24 | 1156 | s32e a10, a4, -24 |
| 1316 | s32e a11, a4, -20 | 1157 | s32e a11, a4, -20 |
| 1317 | |||
| 1318 | srli a11, a3, 2 # shift windowbase by 2 | 1158 | srli a11, a3, 2 # shift windowbase by 2 |
| 1319 | rotw 2 | 1159 | rotw 2 |
| 1320 | _bnei a3, 1, .Lloop | 1160 | _bnei a3, 1, .Lloop |
| 1321 | 1161 | j .Lexit | |
| 1322 | .Lexit: /* Done. Do the final rotation, set WS, and return. */ | ||
| 1323 | |||
| 1324 | rotw 1 | ||
| 1325 | rsr a3, windowbase | ||
| 1326 | ssl a3 | ||
| 1327 | movi a3, 1 | ||
| 1328 | sll a3, a3 | ||
| 1329 | wsr a3, windowstart | ||
| 1330 | ret | ||
| 1331 | 1162 | ||
| 1332 | .Lc4: s32e a4, a9, -16 | 1163 | .Lc4: s32e a4, a9, -16 |
| 1333 | s32e a5, a9, -12 | 1164 | s32e a5, a9, -12 |
| @@ -1343,11 +1174,11 @@ ENTRY(_spill_registers) | |||
| 1343 | 1174 | ||
| 1344 | /* 12-register frame (call12) */ | 1175 | /* 12-register frame (call12) */ |
| 1345 | 1176 | ||
| 1346 | l32e a2, a5, -12 | 1177 | l32e a0, a5, -12 |
| 1347 | s32e a8, a2, -48 | 1178 | s32e a8, a0, -48 |
| 1348 | mov a8, a2 | 1179 | mov a8, a0 |
| 1349 | 1180 | ||
| 1350 | .Lc12c: s32e a9, a8, -44 | 1181 | s32e a9, a8, -44 |
| 1351 | s32e a10, a8, -40 | 1182 | s32e a10, a8, -40 |
| 1352 | s32e a11, a8, -36 | 1183 | s32e a11, a8, -36 |
| 1353 | s32e a12, a8, -32 | 1184 | s32e a12, a8, -32 |
| @@ -1367,30 +1198,54 @@ ENTRY(_spill_registers) | |||
| 1367 | */ | 1198 | */ |
| 1368 | 1199 | ||
| 1369 | rotw 1 | 1200 | rotw 1 |
| 1370 | mov a5, a13 | 1201 | mov a4, a13 |
| 1371 | rotw -1 | 1202 | rotw -1 |
| 1372 | 1203 | ||
| 1373 | s32e a4, a9, -16 | 1204 | s32e a4, a8, -16 |
| 1374 | s32e a5, a9, -12 | 1205 | s32e a5, a8, -12 |
| 1375 | s32e a6, a9, -8 | 1206 | s32e a6, a8, -8 |
| 1376 | s32e a7, a9, -4 | 1207 | s32e a7, a8, -4 |
| 1377 | 1208 | ||
| 1378 | rotw 3 | 1209 | rotw 3 |
| 1379 | 1210 | ||
| 1380 | _beqi a3, 1, .Lexit | 1211 | _beqi a3, 1, .Lexit |
| 1381 | j .Lloop | 1212 | j .Lloop |
| 1382 | 1213 | ||
| 1383 | .Linvalid_mask: | 1214 | .Lexit: |
| 1384 | 1215 | ||
| 1385 | /* We get here because of an unrecoverable error in the window | 1216 | /* Done. Do the final rotation and set WS */ |
| 1386 | * registers. If we are in user space, we kill the application, | 1217 | |
| 1387 | * however, this condition is unrecoverable in kernel space. | 1218 | rotw 1 |
| 1388 | */ | 1219 | rsr a3, windowbase |
| 1220 | ssl a3 | ||
| 1221 | movi a3, 1 | ||
| 1222 | sll a3, a3 | ||
| 1223 | wsr a3, windowstart | ||
| 1224 | .Lnospill: | ||
| 1225 | |||
| 1226 | /* Advance PC, restore registers and SAR, and return from exception. */ | ||
| 1227 | |||
| 1228 | l32i a3, a2, PT_SAR | ||
| 1229 | l32i a0, a2, PT_AREG0 | ||
| 1230 | wsr a3, sar | ||
| 1231 | l32i a3, a2, PT_AREG3 | ||
| 1389 | 1232 | ||
| 1390 | rsr a0, ps | 1233 | /* Restore clobbered registers. */ |
| 1391 | _bbci.l a0, PS_UM_BIT, 1f | ||
| 1392 | 1234 | ||
| 1393 | /* User space: Setup a dummy frame and kill application. | 1235 | l32i a4, a2, PT_AREG4 |
| 1236 | l32i a7, a2, PT_AREG7 | ||
| 1237 | l32i a8, a2, PT_AREG8 | ||
| 1238 | l32i a11, a2, PT_AREG11 | ||
| 1239 | l32i a12, a2, PT_AREG12 | ||
| 1240 | l32i a15, a2, PT_AREG15 | ||
| 1241 | |||
| 1242 | movi a2, 0 | ||
| 1243 | rfe | ||
| 1244 | |||
| 1245 | .Linvalid_mask: | ||
| 1246 | |||
| 1247 | /* We get here because of an unrecoverable error in the window | ||
| 1248 | * registers, so set up a dummy frame and kill the user application. | ||
| 1394 | * Note: We assume EXC_TABLE_KSTK contains a valid stack pointer. | 1249 | * Note: We assume EXC_TABLE_KSTK contains a valid stack pointer. |
| 1395 | */ | 1250 | */ |
| 1396 | 1251 | ||
| @@ -1414,14 +1269,136 @@ ENTRY(_spill_registers) | |||
| 1414 | movi a4, do_exit | 1269 | movi a4, do_exit |
| 1415 | callx4 a4 | 1270 | callx4 a4 |
| 1416 | 1271 | ||
| 1417 | 1: /* Kernel space: PANIC! */ | 1272 | /* shouldn't return, so panic */ |
| 1418 | 1273 | ||
| 1419 | wsr a0, excsave1 | 1274 | wsr a0, excsave1 |
| 1420 | movi a0, unrecoverable_exception | 1275 | movi a0, unrecoverable_exception |
| 1421 | callx0 a0 # should not return | 1276 | callx0 a0 # should not return |
| 1422 | 1: j 1b | 1277 | 1: j 1b |
| 1423 | 1278 | ||
| 1424 | ENDPROC(_spill_registers) | 1279 | |
| 1280 | ENDPROC(fast_syscall_spill_registers) | ||
| 1281 | |||
| 1282 | /* Fixup handler. | ||
| 1283 | * | ||
| 1284 | * We get here if the spill routine causes an exception, e.g. tlb miss. | ||
| 1285 | * We basically restore WINDOWBASE and WINDOWSTART to the condition when | ||
| 1286 | * we entered the spill routine and jump to the user exception handler. | ||
| 1287 | * | ||
| 1288 | * Note that we only need to restore the bits in windowstart that have not | ||
| 1289 | * been spilled yet by the _spill_register routine. Luckily, a3 contains a | ||
| 1290 | * rotated windowstart with only those bits set for frames that haven't been | ||
| 1291 | * spilled yet. Because a3 is rotated such that bit 0 represents the register | ||
| 1292 | * frame for the current windowbase - 1, we need to rotate a3 left by the | ||
| 1293 | * value of the current windowbase + 1 and move it to windowstart. | ||
| 1294 | * | ||
| 1295 | * a0: value of depc, original value in depc | ||
| 1296 | * a2: trashed, original value in EXC_TABLE_DOUBLE_SAVE | ||
| 1297 | * a3: exctable, original value in excsave1 | ||
| 1298 | */ | ||
| 1299 | |||
| 1300 | ENTRY(fast_syscall_spill_registers_fixup) | ||
| 1301 | |||
| 1302 | rsr a2, windowbase # get current windowbase (a2 is saved) | ||
| 1303 | xsr a0, depc # restore depc and a0 | ||
| 1304 | ssl a2 # set shift (32 - WB) | ||
| 1305 | |||
| 1306 | /* We need to make sure the current registers (a0-a3) are preserved. | ||
| 1307 | * To do this, we simply set the bit for the current window frame | ||
| 1308 | * in WS, so that the exception handlers save them to the task stack. | ||
| 1309 | * | ||
| 1310 | * Note: we use a3 to set the windowbase, so we take a special care | ||
| 1311 | * of it, saving it in the original _spill_registers frame across | ||
| 1312 | * the exception handler call. | ||
| 1313 | */ | ||
| 1314 | |||
| 1315 | xsr a3, excsave1 # get spill-mask | ||
| 1316 | slli a3, a3, 1 # shift left by one | ||
| 1317 | addi a3, a3, 1 # set the bit for the current window frame | ||
| 1318 | |||
| 1319 | slli a2, a3, 32-WSBITS | ||
| 1320 | src a2, a3, a2 # a2 = xxwww1yyxxxwww1yy...... | ||
| 1321 | wsr a2, windowstart # set corrected windowstart | ||
| 1322 | |||
| 1323 | srli a3, a3, 1 | ||
| 1324 | rsr a2, excsave1 | ||
| 1325 | l32i a2, a2, EXC_TABLE_DOUBLE_SAVE # restore a2 | ||
| 1326 | xsr a2, excsave1 | ||
| 1327 | s32i a3, a2, EXC_TABLE_DOUBLE_SAVE # save a3 | ||
| 1328 | l32i a3, a2, EXC_TABLE_PARAM # original WB (in user task) | ||
| 1329 | xsr a2, excsave1 | ||
| 1330 | |||
| 1331 | /* Return to the original (user task) WINDOWBASE. | ||
| 1332 | * We leave the following frame behind: | ||
| 1333 | * a0, a1, a2 same | ||
| 1334 | * a3: trashed (saved in EXC_TABLE_DOUBLE_SAVE) | ||
| 1335 | * depc: depc (we have to return to that address) | ||
| 1336 | * excsave_1: exctable | ||
| 1337 | */ | ||
| 1338 | |||
| 1339 | wsr a3, windowbase | ||
| 1340 | rsync | ||
| 1341 | |||
| 1342 | /* We are now in the original frame when we entered _spill_registers: | ||
| 1343 | * a0: return address | ||
| 1344 | * a1: used, stack pointer | ||
| 1345 | * a2: kernel stack pointer | ||
| 1346 | * a3: available | ||
| 1347 | * depc: exception address | ||
| 1348 | * excsave: exctable | ||
| 1349 | * Note: This frame might be the same as above. | ||
| 1350 | */ | ||
| 1351 | |||
| 1352 | /* Setup stack pointer. */ | ||
| 1353 | |||
| 1354 | addi a2, a2, -PT_USER_SIZE | ||
| 1355 | s32i a0, a2, PT_AREG0 | ||
| 1356 | |||
| 1357 | /* Make sure we return to this fixup handler. */ | ||
| 1358 | |||
| 1359 | movi a3, fast_syscall_spill_registers_fixup_return | ||
| 1360 | s32i a3, a2, PT_DEPC # setup depc | ||
| 1361 | |||
| 1362 | /* Jump to the exception handler. */ | ||
| 1363 | |||
| 1364 | rsr a3, excsave1 | ||
| 1365 | rsr a0, exccause | ||
| 1366 | addx4 a0, a0, a3 # find entry in table | ||
| 1367 | l32i a0, a0, EXC_TABLE_FAST_USER # load handler | ||
| 1368 | l32i a3, a3, EXC_TABLE_DOUBLE_SAVE | ||
| 1369 | jx a0 | ||
| 1370 | |||
| 1371 | ENDPROC(fast_syscall_spill_registers_fixup) | ||
| 1372 | |||
| 1373 | ENTRY(fast_syscall_spill_registers_fixup_return) | ||
| 1374 | |||
| 1375 | /* When we return here, all registers have been restored (a2: DEPC) */ | ||
| 1376 | |||
| 1377 | wsr a2, depc # exception address | ||
| 1378 | |||
| 1379 | /* Restore fixup handler. */ | ||
| 1380 | |||
| 1381 | rsr a2, excsave1 | ||
| 1382 | s32i a3, a2, EXC_TABLE_DOUBLE_SAVE | ||
| 1383 | movi a3, fast_syscall_spill_registers_fixup | ||
| 1384 | s32i a3, a2, EXC_TABLE_FIXUP | ||
| 1385 | rsr a3, windowbase | ||
| 1386 | s32i a3, a2, EXC_TABLE_PARAM | ||
| 1387 | l32i a2, a2, EXC_TABLE_KSTK | ||
| 1388 | |||
| 1389 | /* Load WB at the time the exception occurred. */ | ||
| 1390 | |||
| 1391 | rsr a3, sar # WB is still in SAR | ||
| 1392 | neg a3, a3 | ||
| 1393 | wsr a3, windowbase | ||
| 1394 | rsync | ||
| 1395 | |||
| 1396 | rsr a3, excsave1 | ||
| 1397 | l32i a3, a3, EXC_TABLE_DOUBLE_SAVE | ||
| 1398 | |||
| 1399 | rfde | ||
| 1400 | |||
| 1401 | ENDPROC(fast_syscall_spill_registers_fixup_return) | ||
| 1425 | 1402 | ||
| 1426 | #ifdef CONFIG_MMU | 1403 | #ifdef CONFIG_MMU |
| 1427 | /* | 1404 | /* |
| @@ -1794,6 +1771,43 @@ ENTRY(system_call) | |||
| 1794 | 1771 | ||
| 1795 | ENDPROC(system_call) | 1772 | ENDPROC(system_call) |
| 1796 | 1773 | ||
| 1774 | /* | ||
| 1775 | * Spill live registers on the kernel stack macro. | ||
| 1776 | * | ||
| 1777 | * Entry condition: ps.woe is set, ps.excm is cleared | ||
| 1778 | * Exit condition: windowstart has single bit set | ||
| 1779 | * May clobber: a12, a13 | ||
| 1780 | */ | ||
| 1781 | .macro spill_registers_kernel | ||
| 1782 | |||
| 1783 | #if XCHAL_NUM_AREGS > 16 | ||
| 1784 | call12 1f | ||
| 1785 | _j 2f | ||
| 1786 | retw | ||
| 1787 | .align 4 | ||
| 1788 | 1: | ||
| 1789 | _entry a1, 48 | ||
| 1790 | addi a12, a0, 3 | ||
| 1791 | #if XCHAL_NUM_AREGS > 32 | ||
| 1792 | .rept (XCHAL_NUM_AREGS - 32) / 12 | ||
| 1793 | _entry a1, 48 | ||
| 1794 | mov a12, a0 | ||
| 1795 | .endr | ||
| 1796 | #endif | ||
| 1797 | _entry a1, 48 | ||
| 1798 | #if XCHAL_NUM_AREGS % 12 == 0 | ||
| 1799 | mov a8, a8 | ||
| 1800 | #elif XCHAL_NUM_AREGS % 12 == 4 | ||
| 1801 | mov a12, a12 | ||
| 1802 | #elif XCHAL_NUM_AREGS % 12 == 8 | ||
| 1803 | mov a4, a4 | ||
| 1804 | #endif | ||
| 1805 | retw | ||
| 1806 | 2: | ||
| 1807 | #else | ||
| 1808 | mov a12, a12 | ||
| 1809 | #endif | ||
| 1810 | .endm | ||
| 1797 | 1811 | ||
| 1798 | /* | 1812 | /* |
| 1799 | * Task switch. | 1813 | * Task switch. |
| @@ -1806,21 +1820,20 @@ ENTRY(_switch_to) | |||
| 1806 | 1820 | ||
| 1807 | entry a1, 16 | 1821 | entry a1, 16 |
| 1808 | 1822 | ||
| 1809 | mov a12, a2 # preserve 'prev' (a2) | 1823 | mov a10, a2 # preserve 'prev' (a2) |
| 1810 | mov a13, a3 # and 'next' (a3) | 1824 | mov a11, a3 # and 'next' (a3) |
| 1811 | 1825 | ||
| 1812 | l32i a4, a2, TASK_THREAD_INFO | 1826 | l32i a4, a2, TASK_THREAD_INFO |
| 1813 | l32i a5, a3, TASK_THREAD_INFO | 1827 | l32i a5, a3, TASK_THREAD_INFO |
| 1814 | 1828 | ||
| 1815 | save_xtregs_user a4 a6 a8 a9 a10 a11 THREAD_XTREGS_USER | 1829 | save_xtregs_user a4 a6 a8 a9 a12 a13 THREAD_XTREGS_USER |
| 1816 | 1830 | ||
| 1817 | s32i a0, a12, THREAD_RA # save return address | 1831 | s32i a0, a10, THREAD_RA # save return address |
| 1818 | s32i a1, a12, THREAD_SP # save stack pointer | 1832 | s32i a1, a10, THREAD_SP # save stack pointer |
| 1819 | 1833 | ||
| 1820 | /* Disable ints while we manipulate the stack pointer. */ | 1834 | /* Disable ints while we manipulate the stack pointer. */ |
| 1821 | 1835 | ||
| 1822 | movi a14, (1 << PS_EXCM_BIT) | LOCKLEVEL | 1836 | rsil a14, LOCKLEVEL |
| 1823 | xsr a14, ps | ||
| 1824 | rsr a3, excsave1 | 1837 | rsr a3, excsave1 |
| 1825 | rsync | 1838 | rsync |
| 1826 | s32i a3, a3, EXC_TABLE_FIXUP /* enter critical section */ | 1839 | s32i a3, a3, EXC_TABLE_FIXUP /* enter critical section */ |
| @@ -1835,7 +1848,7 @@ ENTRY(_switch_to) | |||
| 1835 | 1848 | ||
| 1836 | /* Flush register file. */ | 1849 | /* Flush register file. */ |
| 1837 | 1850 | ||
| 1838 | call0 _spill_registers # destroys a3, a4, and SAR | 1851 | spill_registers_kernel |
| 1839 | 1852 | ||
| 1840 | /* Set kernel stack (and leave critical section) | 1853 | /* Set kernel stack (and leave critical section) |
| 1841 | * Note: It's save to set it here. The stack will not be overwritten | 1854 | * Note: It's save to set it here. The stack will not be overwritten |
| @@ -1851,13 +1864,13 @@ ENTRY(_switch_to) | |||
| 1851 | 1864 | ||
| 1852 | /* restore context of the task 'next' */ | 1865 | /* restore context of the task 'next' */ |
| 1853 | 1866 | ||
| 1854 | l32i a0, a13, THREAD_RA # restore return address | 1867 | l32i a0, a11, THREAD_RA # restore return address |
| 1855 | l32i a1, a13, THREAD_SP # restore stack pointer | 1868 | l32i a1, a11, THREAD_SP # restore stack pointer |
| 1856 | 1869 | ||
| 1857 | load_xtregs_user a5 a6 a8 a9 a10 a11 THREAD_XTREGS_USER | 1870 | load_xtregs_user a5 a6 a8 a9 a12 a13 THREAD_XTREGS_USER |
| 1858 | 1871 | ||
| 1859 | wsr a14, ps | 1872 | wsr a14, ps |
| 1860 | mov a2, a12 # return 'prev' | 1873 | mov a2, a10 # return 'prev' |
| 1861 | rsync | 1874 | rsync |
| 1862 | 1875 | ||
| 1863 | retw | 1876 | retw |
diff --git a/arch/xtensa/kernel/setup.c b/arch/xtensa/kernel/setup.c index 7d12af1317f1..84fe931bb60e 100644 --- a/arch/xtensa/kernel/setup.c +++ b/arch/xtensa/kernel/setup.c | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include <linux/bootmem.h> | 22 | #include <linux/bootmem.h> |
| 23 | #include <linux/kernel.h> | 23 | #include <linux/kernel.h> |
| 24 | #include <linux/percpu.h> | 24 | #include <linux/percpu.h> |
| 25 | #include <linux/clk-provider.h> | ||
| 25 | #include <linux/cpu.h> | 26 | #include <linux/cpu.h> |
| 26 | #include <linux/of_fdt.h> | 27 | #include <linux/of_fdt.h> |
| 27 | #include <linux/of_platform.h> | 28 | #include <linux/of_platform.h> |
| @@ -276,6 +277,7 @@ void __init early_init_devtree(void *params) | |||
| 276 | 277 | ||
| 277 | static int __init xtensa_device_probe(void) | 278 | static int __init xtensa_device_probe(void) |
| 278 | { | 279 | { |
| 280 | of_clk_init(NULL); | ||
| 279 | of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); | 281 | of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); |
| 280 | return 0; | 282 | return 0; |
| 281 | } | 283 | } |
diff --git a/arch/xtensa/kernel/time.c b/arch/xtensa/kernel/time.c index 08b769d3b3a1..2a1823de69cc 100644 --- a/arch/xtensa/kernel/time.c +++ b/arch/xtensa/kernel/time.c | |||
| @@ -30,6 +30,7 @@ | |||
| 30 | #include <asm/platform.h> | 30 | #include <asm/platform.h> |
| 31 | 31 | ||
| 32 | unsigned long ccount_freq; /* ccount Hz */ | 32 | unsigned long ccount_freq; /* ccount Hz */ |
| 33 | EXPORT_SYMBOL(ccount_freq); | ||
| 33 | 34 | ||
| 34 | static cycle_t ccount_read(struct clocksource *cs) | 35 | static cycle_t ccount_read(struct clocksource *cs) |
| 35 | { | 36 | { |
diff --git a/arch/xtensa/kernel/vectors.S b/arch/xtensa/kernel/vectors.S index cb8fd44caabc..f9e1ec346e35 100644 --- a/arch/xtensa/kernel/vectors.S +++ b/arch/xtensa/kernel/vectors.S | |||
| @@ -235,7 +235,7 @@ ENTRY(_DoubleExceptionVector) | |||
| 235 | 235 | ||
| 236 | /* Check for overflow/underflow exception, jump if overflow. */ | 236 | /* Check for overflow/underflow exception, jump if overflow. */ |
| 237 | 237 | ||
| 238 | _bbci.l a0, 6, _DoubleExceptionVector_WindowOverflow | 238 | bbci.l a0, 6, _DoubleExceptionVector_WindowOverflow |
| 239 | 239 | ||
| 240 | /* | 240 | /* |
| 241 | * Restart window underflow exception. | 241 | * Restart window underflow exception. |
diff --git a/arch/xtensa/kernel/xtensa_ksyms.c b/arch/xtensa/kernel/xtensa_ksyms.c index 74a60c7e085e..80b33ed51f31 100644 --- a/arch/xtensa/kernel/xtensa_ksyms.c +++ b/arch/xtensa/kernel/xtensa_ksyms.c | |||
| @@ -122,9 +122,7 @@ EXPORT_SYMBOL(insw); | |||
| 122 | EXPORT_SYMBOL(insl); | 122 | EXPORT_SYMBOL(insl); |
| 123 | 123 | ||
| 124 | extern long common_exception_return; | 124 | extern long common_exception_return; |
| 125 | extern long _spill_registers; | ||
| 126 | EXPORT_SYMBOL(common_exception_return); | 125 | EXPORT_SYMBOL(common_exception_return); |
| 127 | EXPORT_SYMBOL(_spill_registers); | ||
| 128 | 126 | ||
| 129 | #ifdef CONFIG_FUNCTION_TRACER | 127 | #ifdef CONFIG_FUNCTION_TRACER |
| 130 | EXPORT_SYMBOL(_mcount); | 128 | EXPORT_SYMBOL(_mcount); |
diff --git a/arch/xtensa/mm/init.c b/arch/xtensa/mm/init.c index 479d7537a32a..aff108df92d3 100644 --- a/arch/xtensa/mm/init.c +++ b/arch/xtensa/mm/init.c | |||
| @@ -90,7 +90,7 @@ int __init mem_reserve(unsigned long start, unsigned long end, int must_exist) | |||
| 90 | 90 | ||
| 91 | 91 | ||
| 92 | /* | 92 | /* |
| 93 | * Initialize the bootmem system and give it all the memory we have available. | 93 | * Initialize the bootmem system and give it all low memory we have available. |
| 94 | */ | 94 | */ |
| 95 | 95 | ||
| 96 | void __init bootmem_init(void) | 96 | void __init bootmem_init(void) |
| @@ -142,9 +142,14 @@ void __init bootmem_init(void) | |||
| 142 | 142 | ||
| 143 | /* Add all remaining memory pieces into the bootmem map */ | 143 | /* Add all remaining memory pieces into the bootmem map */ |
| 144 | 144 | ||
| 145 | for (i=0; i<sysmem.nr_banks; i++) | 145 | for (i = 0; i < sysmem.nr_banks; i++) { |
| 146 | free_bootmem(sysmem.bank[i].start, | 146 | if (sysmem.bank[i].start >> PAGE_SHIFT < max_low_pfn) { |
| 147 | sysmem.bank[i].end - sysmem.bank[i].start); | 147 | unsigned long end = min(max_low_pfn << PAGE_SHIFT, |
| 148 | sysmem.bank[i].end); | ||
| 149 | free_bootmem(sysmem.bank[i].start, | ||
| 150 | end - sysmem.bank[i].start); | ||
| 151 | } | ||
| 152 | } | ||
| 148 | 153 | ||
| 149 | } | 154 | } |
| 150 | 155 | ||
diff --git a/arch/xtensa/mm/mmu.c b/arch/xtensa/mm/mmu.c index 36ec171698b8..861203e958da 100644 --- a/arch/xtensa/mm/mmu.c +++ b/arch/xtensa/mm/mmu.c | |||
| @@ -39,7 +39,7 @@ void init_mmu(void) | |||
| 39 | set_itlbcfg_register(0); | 39 | set_itlbcfg_register(0); |
| 40 | set_dtlbcfg_register(0); | 40 | set_dtlbcfg_register(0); |
| 41 | #endif | 41 | #endif |
| 42 | #if XCHAL_HAVE_PTP_MMU && XCHAL_HAVE_SPANNING_WAY && CONFIG_OF | 42 | #if XCHAL_HAVE_PTP_MMU && XCHAL_HAVE_SPANNING_WAY && defined(CONFIG_OF) |
| 43 | /* | 43 | /* |
| 44 | * Update the IO area mapping in case xtensa_kio_paddr has changed | 44 | * Update the IO area mapping in case xtensa_kio_paddr has changed |
| 45 | */ | 45 | */ |
diff --git a/arch/xtensa/platforms/xtfpga/setup.c b/arch/xtensa/platforms/xtfpga/setup.c index 800227862fe8..57fd08b36f51 100644 --- a/arch/xtensa/platforms/xtfpga/setup.c +++ b/arch/xtensa/platforms/xtfpga/setup.c | |||
| @@ -135,11 +135,11 @@ static void __init update_local_mac(struct device_node *node) | |||
| 135 | 135 | ||
| 136 | static int __init machine_setup(void) | 136 | static int __init machine_setup(void) |
| 137 | { | 137 | { |
| 138 | struct device_node *serial; | 138 | struct device_node *clock; |
| 139 | struct device_node *eth = NULL; | 139 | struct device_node *eth = NULL; |
| 140 | 140 | ||
| 141 | for_each_compatible_node(serial, NULL, "ns16550a") | 141 | for_each_node_by_name(clock, "main-oscillator") |
| 142 | update_clock_frequency(serial); | 142 | update_clock_frequency(clock); |
| 143 | 143 | ||
| 144 | if ((eth = of_find_compatible_node(eth, NULL, "opencores,ethoc"))) | 144 | if ((eth = of_find_compatible_node(eth, NULL, "opencores,ethoc"))) |
| 145 | update_local_mac(eth); | 145 | update_local_mac(eth); |
| @@ -290,6 +290,7 @@ static int __init xtavnet_init(void) | |||
| 290 | * knows whether they set it correctly on the DIP switches. | 290 | * knows whether they set it correctly on the DIP switches. |
| 291 | */ | 291 | */ |
| 292 | pr_info("XTFPGA: Ethernet MAC %pM\n", ethoc_pdata.hwaddr); | 292 | pr_info("XTFPGA: Ethernet MAC %pM\n", ethoc_pdata.hwaddr); |
| 293 | ethoc_pdata.eth_clkfreq = *(long *)XTFPGA_CLKFRQ_VADDR; | ||
| 293 | 294 | ||
| 294 | return 0; | 295 | return 0; |
| 295 | } | 296 | } |
diff --git a/arch/xtensa/variants/fsf/include/variant/tie.h b/arch/xtensa/variants/fsf/include/variant/tie.h index bf4020116df5..244cdea4dee5 100644 --- a/arch/xtensa/variants/fsf/include/variant/tie.h +++ b/arch/xtensa/variants/fsf/include/variant/tie.h | |||
| @@ -18,13 +18,6 @@ | |||
| 18 | #define XCHAL_CP_MASK 0x00 /* bitmask of all CPs by ID */ | 18 | #define XCHAL_CP_MASK 0x00 /* bitmask of all CPs by ID */ |
| 19 | #define XCHAL_CP_PORT_MASK 0x00 /* bitmask of only port CPs */ | 19 | #define XCHAL_CP_PORT_MASK 0x00 /* bitmask of only port CPs */ |
| 20 | 20 | ||
| 21 | /* Basic parameters of each coprocessor: */ | ||
| 22 | #define XCHAL_CP7_NAME "XTIOP" | ||
| 23 | #define XCHAL_CP7_IDENT XTIOP | ||
| 24 | #define XCHAL_CP7_SA_SIZE 0 /* size of state save area */ | ||
| 25 | #define XCHAL_CP7_SA_ALIGN 1 /* min alignment of save area */ | ||
| 26 | #define XCHAL_CP_ID_XTIOP 7 /* coprocessor ID (0..7) */ | ||
| 27 | |||
| 28 | /* Filler info for unassigned coprocessors, to simplify arrays etc: */ | 21 | /* Filler info for unassigned coprocessors, to simplify arrays etc: */ |
| 29 | #define XCHAL_NCP_SA_SIZE 0 | 22 | #define XCHAL_NCP_SA_SIZE 0 |
| 30 | #define XCHAL_NCP_SA_ALIGN 1 | 23 | #define XCHAL_NCP_SA_ALIGN 1 |
| @@ -42,6 +35,8 @@ | |||
| 42 | #define XCHAL_CP5_SA_ALIGN 1 | 35 | #define XCHAL_CP5_SA_ALIGN 1 |
| 43 | #define XCHAL_CP6_SA_SIZE 0 | 36 | #define XCHAL_CP6_SA_SIZE 0 |
| 44 | #define XCHAL_CP6_SA_ALIGN 1 | 37 | #define XCHAL_CP6_SA_ALIGN 1 |
| 38 | #define XCHAL_CP7_SA_SIZE 0 | ||
| 39 | #define XCHAL_CP7_SA_ALIGN 1 | ||
| 45 | 40 | ||
| 46 | /* Save area for non-coprocessor optional and custom (TIE) state: */ | 41 | /* Save area for non-coprocessor optional and custom (TIE) state: */ |
| 47 | #define XCHAL_NCP_SA_SIZE 0 | 42 | #define XCHAL_NCP_SA_SIZE 0 |
