diff options
Diffstat (limited to 'arch')
52 files changed, 422 insertions, 187 deletions
diff --git a/arch/arm/boot/dts/at91sam9263.dtsi b/arch/arm/boot/dts/at91sam9263.dtsi index 1467750e3377..e8c6c600a5b6 100644 --- a/arch/arm/boot/dts/at91sam9263.dtsi +++ b/arch/arm/boot/dts/at91sam9263.dtsi | |||
| @@ -953,6 +953,8 @@ | |||
| 953 | interrupts = <26 IRQ_TYPE_LEVEL_HIGH 3>; | 953 | interrupts = <26 IRQ_TYPE_LEVEL_HIGH 3>; |
| 954 | pinctrl-names = "default"; | 954 | pinctrl-names = "default"; |
| 955 | pinctrl-0 = <&pinctrl_fb>; | 955 | pinctrl-0 = <&pinctrl_fb>; |
| 956 | clocks = <&lcd_clk>, <&lcd_clk>; | ||
| 957 | clock-names = "lcdc_clk", "hclk"; | ||
| 956 | status = "disabled"; | 958 | status = "disabled"; |
| 957 | }; | 959 | }; |
| 958 | 960 | ||
diff --git a/arch/arm/boot/dts/berlin2q-marvell-dmp.dts b/arch/arm/boot/dts/berlin2q-marvell-dmp.dts index 28e7e2060c33..a98ac1bd8f65 100644 --- a/arch/arm/boot/dts/berlin2q-marvell-dmp.dts +++ b/arch/arm/boot/dts/berlin2q-marvell-dmp.dts | |||
| @@ -65,6 +65,8 @@ | |||
| 65 | }; | 65 | }; |
| 66 | 66 | ||
| 67 | &sdhci2 { | 67 | &sdhci2 { |
| 68 | broken-cd; | ||
| 69 | bus-width = <8>; | ||
| 68 | non-removable; | 70 | non-removable; |
| 69 | status = "okay"; | 71 | status = "okay"; |
| 70 | }; | 72 | }; |
diff --git a/arch/arm/boot/dts/berlin2q.dtsi b/arch/arm/boot/dts/berlin2q.dtsi index 35253c947a7c..e2f61f27944e 100644 --- a/arch/arm/boot/dts/berlin2q.dtsi +++ b/arch/arm/boot/dts/berlin2q.dtsi | |||
| @@ -83,7 +83,8 @@ | |||
| 83 | compatible = "mrvl,pxav3-mmc"; | 83 | compatible = "mrvl,pxav3-mmc"; |
| 84 | reg = <0xab1000 0x200>; | 84 | reg = <0xab1000 0x200>; |
| 85 | interrupts = <GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>; | 85 | interrupts = <GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>; |
| 86 | clocks = <&chip CLKID_SDIO1XIN>; | 86 | clocks = <&chip CLKID_NFC_ECC>, <&chip CLKID_NFC>; |
| 87 | clock-names = "io", "core"; | ||
| 87 | status = "disabled"; | 88 | status = "disabled"; |
| 88 | }; | 89 | }; |
| 89 | 90 | ||
| @@ -348,36 +349,6 @@ | |||
| 348 | interrupt-parent = <&gic>; | 349 | interrupt-parent = <&gic>; |
| 349 | interrupts = <GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>; | 350 | interrupts = <GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>; |
| 350 | }; | 351 | }; |
| 351 | |||
| 352 | gpio4: gpio@5000 { | ||
| 353 | compatible = "snps,dw-apb-gpio"; | ||
| 354 | reg = <0x5000 0x400>; | ||
| 355 | #address-cells = <1>; | ||
| 356 | #size-cells = <0>; | ||
| 357 | |||
| 358 | porte: gpio-port@4 { | ||
| 359 | compatible = "snps,dw-apb-gpio-port"; | ||
| 360 | gpio-controller; | ||
| 361 | #gpio-cells = <2>; | ||
| 362 | snps,nr-gpios = <32>; | ||
| 363 | reg = <0>; | ||
| 364 | }; | ||
| 365 | }; | ||
| 366 | |||
| 367 | gpio5: gpio@c000 { | ||
| 368 | compatible = "snps,dw-apb-gpio"; | ||
| 369 | reg = <0xc000 0x400>; | ||
| 370 | #address-cells = <1>; | ||
| 371 | #size-cells = <0>; | ||
| 372 | |||
| 373 | portf: gpio-port@5 { | ||
| 374 | compatible = "snps,dw-apb-gpio-port"; | ||
| 375 | gpio-controller; | ||
| 376 | #gpio-cells = <2>; | ||
| 377 | snps,nr-gpios = <32>; | ||
| 378 | reg = <0>; | ||
| 379 | }; | ||
| 380 | }; | ||
| 381 | }; | 352 | }; |
| 382 | 353 | ||
| 383 | chip: chip-control@ea0000 { | 354 | chip: chip-control@ea0000 { |
| @@ -466,6 +437,21 @@ | |||
| 466 | ranges = <0 0xfc0000 0x10000>; | 437 | ranges = <0 0xfc0000 0x10000>; |
| 467 | interrupt-parent = <&sic>; | 438 | interrupt-parent = <&sic>; |
| 468 | 439 | ||
| 440 | sm_gpio1: gpio@5000 { | ||
| 441 | compatible = "snps,dw-apb-gpio"; | ||
| 442 | reg = <0x5000 0x400>; | ||
| 443 | #address-cells = <1>; | ||
| 444 | #size-cells = <0>; | ||
| 445 | |||
| 446 | portf: gpio-port@5 { | ||
| 447 | compatible = "snps,dw-apb-gpio-port"; | ||
| 448 | gpio-controller; | ||
| 449 | #gpio-cells = <2>; | ||
| 450 | snps,nr-gpios = <32>; | ||
| 451 | reg = <0>; | ||
| 452 | }; | ||
| 453 | }; | ||
| 454 | |||
| 469 | i2c2: i2c@7000 { | 455 | i2c2: i2c@7000 { |
| 470 | compatible = "snps,designware-i2c"; | 456 | compatible = "snps,designware-i2c"; |
| 471 | #address-cells = <1>; | 457 | #address-cells = <1>; |
| @@ -516,6 +502,21 @@ | |||
| 516 | status = "disabled"; | 502 | status = "disabled"; |
| 517 | }; | 503 | }; |
| 518 | 504 | ||
| 505 | sm_gpio0: gpio@c000 { | ||
| 506 | compatible = "snps,dw-apb-gpio"; | ||
| 507 | reg = <0xc000 0x400>; | ||
| 508 | #address-cells = <1>; | ||
| 509 | #size-cells = <0>; | ||
| 510 | |||
| 511 | porte: gpio-port@4 { | ||
| 512 | compatible = "snps,dw-apb-gpio-port"; | ||
| 513 | gpio-controller; | ||
| 514 | #gpio-cells = <2>; | ||
| 515 | snps,nr-gpios = <32>; | ||
| 516 | reg = <0>; | ||
| 517 | }; | ||
| 518 | }; | ||
| 519 | |||
| 519 | sysctrl: pin-controller@d000 { | 520 | sysctrl: pin-controller@d000 { |
| 520 | compatible = "marvell,berlin2q-system-ctrl"; | 521 | compatible = "marvell,berlin2q-system-ctrl"; |
| 521 | reg = <0xd000 0x100>; | 522 | reg = <0xd000 0x100>; |
diff --git a/arch/arm/boot/dts/dra7-evm.dts b/arch/arm/boot/dts/dra7-evm.dts index 10b725c7bfc0..ad4118f7e1a6 100644 --- a/arch/arm/boot/dts/dra7-evm.dts +++ b/arch/arm/boot/dts/dra7-evm.dts | |||
| @@ -499,23 +499,23 @@ | |||
| 499 | }; | 499 | }; |
| 500 | partition@5 { | 500 | partition@5 { |
| 501 | label = "QSPI.u-boot-spl-os"; | 501 | label = "QSPI.u-boot-spl-os"; |
| 502 | reg = <0x00140000 0x00010000>; | 502 | reg = <0x00140000 0x00080000>; |
| 503 | }; | 503 | }; |
| 504 | partition@6 { | 504 | partition@6 { |
| 505 | label = "QSPI.u-boot-env"; | 505 | label = "QSPI.u-boot-env"; |
| 506 | reg = <0x00150000 0x00010000>; | 506 | reg = <0x001c0000 0x00010000>; |
| 507 | }; | 507 | }; |
| 508 | partition@7 { | 508 | partition@7 { |
| 509 | label = "QSPI.u-boot-env.backup1"; | 509 | label = "QSPI.u-boot-env.backup1"; |
| 510 | reg = <0x00160000 0x0010000>; | 510 | reg = <0x001d0000 0x0010000>; |
| 511 | }; | 511 | }; |
| 512 | partition@8 { | 512 | partition@8 { |
| 513 | label = "QSPI.kernel"; | 513 | label = "QSPI.kernel"; |
| 514 | reg = <0x00170000 0x0800000>; | 514 | reg = <0x001e0000 0x0800000>; |
| 515 | }; | 515 | }; |
| 516 | partition@9 { | 516 | partition@9 { |
| 517 | label = "QSPI.file-system"; | 517 | label = "QSPI.file-system"; |
| 518 | reg = <0x00970000 0x01690000>; | 518 | reg = <0x009e0000 0x01620000>; |
| 519 | }; | 519 | }; |
| 520 | }; | 520 | }; |
| 521 | }; | 521 | }; |
diff --git a/arch/arm/boot/dts/exynos5250.dtsi b/arch/arm/boot/dts/exynos5250.dtsi index 0a229fcd7acf..d75c89d7666a 100644 --- a/arch/arm/boot/dts/exynos5250.dtsi +++ b/arch/arm/boot/dts/exynos5250.dtsi | |||
| @@ -736,7 +736,7 @@ | |||
| 736 | 736 | ||
| 737 | dp_phy: video-phy@10040720 { | 737 | dp_phy: video-phy@10040720 { |
| 738 | compatible = "samsung,exynos5250-dp-video-phy"; | 738 | compatible = "samsung,exynos5250-dp-video-phy"; |
| 739 | reg = <0x10040720 4>; | 739 | samsung,pmu-syscon = <&pmu_system_controller>; |
| 740 | #phy-cells = <0>; | 740 | #phy-cells = <0>; |
| 741 | }; | 741 | }; |
| 742 | 742 | ||
diff --git a/arch/arm/boot/dts/exynos5420-arndale-octa.dts b/arch/arm/boot/dts/exynos5420-arndale-octa.dts index aa7a7d727a7e..db2c1c4cd900 100644 --- a/arch/arm/boot/dts/exynos5420-arndale-octa.dts +++ b/arch/arm/boot/dts/exynos5420-arndale-octa.dts | |||
| @@ -372,3 +372,7 @@ | |||
| 372 | &usbdrd_dwc3_1 { | 372 | &usbdrd_dwc3_1 { |
| 373 | dr_mode = "host"; | 373 | dr_mode = "host"; |
| 374 | }; | 374 | }; |
| 375 | |||
| 376 | &cci { | ||
| 377 | status = "disabled"; | ||
| 378 | }; | ||
diff --git a/arch/arm/boot/dts/exynos5420.dtsi b/arch/arm/boot/dts/exynos5420.dtsi index 517e50f6760b..6d38f8bfd0e6 100644 --- a/arch/arm/boot/dts/exynos5420.dtsi +++ b/arch/arm/boot/dts/exynos5420.dtsi | |||
| @@ -120,7 +120,7 @@ | |||
| 120 | }; | 120 | }; |
| 121 | }; | 121 | }; |
| 122 | 122 | ||
| 123 | cci@10d20000 { | 123 | cci: cci@10d20000 { |
| 124 | compatible = "arm,cci-400"; | 124 | compatible = "arm,cci-400"; |
| 125 | #address-cells = <1>; | 125 | #address-cells = <1>; |
| 126 | #size-cells = <1>; | 126 | #size-cells = <1>; |
| @@ -503,8 +503,8 @@ | |||
| 503 | }; | 503 | }; |
| 504 | 504 | ||
| 505 | dp_phy: video-phy@10040728 { | 505 | dp_phy: video-phy@10040728 { |
| 506 | compatible = "samsung,exynos5250-dp-video-phy"; | 506 | compatible = "samsung,exynos5420-dp-video-phy"; |
| 507 | reg = <0x10040728 4>; | 507 | samsung,pmu-syscon = <&pmu_system_controller>; |
| 508 | #phy-cells = <0>; | 508 | #phy-cells = <0>; |
| 509 | }; | 509 | }; |
| 510 | 510 | ||
diff --git a/arch/arm/boot/dts/imx25.dtsi b/arch/arm/boot/dts/imx25.dtsi index 58d3c3cf2923..d238676a9107 100644 --- a/arch/arm/boot/dts/imx25.dtsi +++ b/arch/arm/boot/dts/imx25.dtsi | |||
| @@ -162,7 +162,7 @@ | |||
| 162 | #size-cells = <0>; | 162 | #size-cells = <0>; |
| 163 | compatible = "fsl,imx25-cspi", "fsl,imx35-cspi"; | 163 | compatible = "fsl,imx25-cspi", "fsl,imx35-cspi"; |
| 164 | reg = <0x43fa4000 0x4000>; | 164 | reg = <0x43fa4000 0x4000>; |
| 165 | clocks = <&clks 62>, <&clks 62>; | 165 | clocks = <&clks 78>, <&clks 78>; |
| 166 | clock-names = "ipg", "per"; | 166 | clock-names = "ipg", "per"; |
| 167 | interrupts = <14>; | 167 | interrupts = <14>; |
| 168 | status = "disabled"; | 168 | status = "disabled"; |
diff --git a/arch/arm/boot/dts/imx51-babbage.dts b/arch/arm/boot/dts/imx51-babbage.dts index 56569cecaa78..649befeb2cf9 100644 --- a/arch/arm/boot/dts/imx51-babbage.dts +++ b/arch/arm/boot/dts/imx51-babbage.dts | |||
| @@ -127,24 +127,12 @@ | |||
| 127 | #address-cells = <1>; | 127 | #address-cells = <1>; |
| 128 | #size-cells = <0>; | 128 | #size-cells = <0>; |
| 129 | 129 | ||
| 130 | reg_usbh1_vbus: regulator@0 { | 130 | reg_hub_reset: regulator@0 { |
| 131 | compatible = "regulator-fixed"; | ||
| 132 | pinctrl-names = "default"; | ||
| 133 | pinctrl-0 = <&pinctrl_usbh1reg>; | ||
| 134 | reg = <0>; | ||
| 135 | regulator-name = "usbh1_vbus"; | ||
| 136 | regulator-min-microvolt = <5000000>; | ||
| 137 | regulator-max-microvolt = <5000000>; | ||
| 138 | gpio = <&gpio2 5 GPIO_ACTIVE_HIGH>; | ||
| 139 | enable-active-high; | ||
| 140 | }; | ||
| 141 | |||
| 142 | reg_usbotg_vbus: regulator@1 { | ||
| 143 | compatible = "regulator-fixed"; | 131 | compatible = "regulator-fixed"; |
| 144 | pinctrl-names = "default"; | 132 | pinctrl-names = "default"; |
| 145 | pinctrl-0 = <&pinctrl_usbotgreg>; | 133 | pinctrl-0 = <&pinctrl_usbotgreg>; |
| 146 | reg = <1>; | 134 | reg = <0>; |
| 147 | regulator-name = "usbotg_vbus"; | 135 | regulator-name = "hub_reset"; |
| 148 | regulator-min-microvolt = <5000000>; | 136 | regulator-min-microvolt = <5000000>; |
| 149 | regulator-max-microvolt = <5000000>; | 137 | regulator-max-microvolt = <5000000>; |
| 150 | gpio = <&gpio1 7 GPIO_ACTIVE_HIGH>; | 138 | gpio = <&gpio1 7 GPIO_ACTIVE_HIGH>; |
| @@ -176,6 +164,7 @@ | |||
| 176 | reg = <0>; | 164 | reg = <0>; |
| 177 | clocks = <&clks IMX5_CLK_DUMMY>; | 165 | clocks = <&clks IMX5_CLK_DUMMY>; |
| 178 | clock-names = "main_clk"; | 166 | clock-names = "main_clk"; |
| 167 | reset-gpios = <&gpio2 5 GPIO_ACTIVE_LOW>; | ||
| 179 | }; | 168 | }; |
| 180 | }; | 169 | }; |
| 181 | }; | 170 | }; |
| @@ -419,7 +408,7 @@ | |||
| 419 | &usbh1 { | 408 | &usbh1 { |
| 420 | pinctrl-names = "default"; | 409 | pinctrl-names = "default"; |
| 421 | pinctrl-0 = <&pinctrl_usbh1>; | 410 | pinctrl-0 = <&pinctrl_usbh1>; |
| 422 | vbus-supply = <®_usbh1_vbus>; | 411 | vbus-supply = <®_hub_reset>; |
| 423 | fsl,usbphy = <&usbh1phy>; | 412 | fsl,usbphy = <&usbh1phy>; |
| 424 | phy_type = "ulpi"; | 413 | phy_type = "ulpi"; |
| 425 | status = "okay"; | 414 | status = "okay"; |
| @@ -429,7 +418,6 @@ | |||
| 429 | dr_mode = "otg"; | 418 | dr_mode = "otg"; |
| 430 | disable-over-current; | 419 | disable-over-current; |
| 431 | phy_type = "utmi_wide"; | 420 | phy_type = "utmi_wide"; |
| 432 | vbus-supply = <®_usbotg_vbus>; | ||
| 433 | status = "okay"; | 421 | status = "okay"; |
| 434 | }; | 422 | }; |
| 435 | 423 | ||
diff --git a/arch/arm/boot/dts/imx6qdl.dtsi b/arch/arm/boot/dts/imx6qdl.dtsi index 4fc03b7f1cee..2109d0763c1b 100644 --- a/arch/arm/boot/dts/imx6qdl.dtsi +++ b/arch/arm/boot/dts/imx6qdl.dtsi | |||
| @@ -335,8 +335,8 @@ | |||
| 335 | vpu: vpu@02040000 { | 335 | vpu: vpu@02040000 { |
| 336 | compatible = "cnm,coda960"; | 336 | compatible = "cnm,coda960"; |
| 337 | reg = <0x02040000 0x3c000>; | 337 | reg = <0x02040000 0x3c000>; |
| 338 | interrupts = <0 3 IRQ_TYPE_LEVEL_HIGH>, | 338 | interrupts = <0 12 IRQ_TYPE_LEVEL_HIGH>, |
| 339 | <0 12 IRQ_TYPE_LEVEL_HIGH>; | 339 | <0 3 IRQ_TYPE_LEVEL_HIGH>; |
| 340 | interrupt-names = "bit", "jpeg"; | 340 | interrupt-names = "bit", "jpeg"; |
| 341 | clocks = <&clks IMX6QDL_CLK_VPU_AXI>, | 341 | clocks = <&clks IMX6QDL_CLK_VPU_AXI>, |
| 342 | <&clks IMX6QDL_CLK_MMDC_CH0_AXI>, | 342 | <&clks IMX6QDL_CLK_MMDC_CH0_AXI>, |
diff --git a/arch/arm/boot/dts/ls1021a.dtsi b/arch/arm/boot/dts/ls1021a.dtsi index 657da14cb4b5..c70bb27ac65a 100644 --- a/arch/arm/boot/dts/ls1021a.dtsi +++ b/arch/arm/boot/dts/ls1021a.dtsi | |||
| @@ -142,6 +142,7 @@ | |||
| 142 | scfg: scfg@1570000 { | 142 | scfg: scfg@1570000 { |
| 143 | compatible = "fsl,ls1021a-scfg", "syscon"; | 143 | compatible = "fsl,ls1021a-scfg", "syscon"; |
| 144 | reg = <0x0 0x1570000 0x0 0x10000>; | 144 | reg = <0x0 0x1570000 0x0 0x10000>; |
| 145 | big-endian; | ||
| 145 | }; | 146 | }; |
| 146 | 147 | ||
| 147 | clockgen: clocking@1ee1000 { | 148 | clockgen: clocking@1ee1000 { |
diff --git a/arch/arm/boot/dts/omap3-n900.dts b/arch/arm/boot/dts/omap3-n900.dts index 53f3ca064140..b550c41b46f1 100644 --- a/arch/arm/boot/dts/omap3-n900.dts +++ b/arch/arm/boot/dts/omap3-n900.dts | |||
| @@ -700,11 +700,9 @@ | |||
| 700 | }; | 700 | }; |
| 701 | }; | 701 | }; |
| 702 | 702 | ||
| 703 | /* Ethernet is on some early development boards and qemu */ | ||
| 703 | ethernet@gpmc { | 704 | ethernet@gpmc { |
| 704 | compatible = "smsc,lan91c94"; | 705 | compatible = "smsc,lan91c94"; |
| 705 | |||
| 706 | status = "disabled"; | ||
| 707 | |||
| 708 | interrupt-parent = <&gpio2>; | 706 | interrupt-parent = <&gpio2>; |
| 709 | interrupts = <22 IRQ_TYPE_LEVEL_HIGH>; /* gpio54 */ | 707 | interrupts = <22 IRQ_TYPE_LEVEL_HIGH>; /* gpio54 */ |
| 710 | reg = <1 0x300 0xf>; /* 16 byte IO range at offset 0x300 */ | 708 | reg = <1 0x300 0xf>; /* 16 byte IO range at offset 0x300 */ |
diff --git a/arch/arm/boot/dts/rk3288-evb.dtsi b/arch/arm/boot/dts/rk3288-evb.dtsi index 3e067dd65d0c..6194d673e80b 100644 --- a/arch/arm/boot/dts/rk3288-evb.dtsi +++ b/arch/arm/boot/dts/rk3288-evb.dtsi | |||
| @@ -155,6 +155,15 @@ | |||
| 155 | }; | 155 | }; |
| 156 | 156 | ||
| 157 | &pinctrl { | 157 | &pinctrl { |
| 158 | pcfg_pull_none_drv_8ma: pcfg-pull-none-drv-8ma { | ||
| 159 | drive-strength = <8>; | ||
| 160 | }; | ||
| 161 | |||
| 162 | pcfg_pull_up_drv_8ma: pcfg-pull-up-drv-8ma { | ||
| 163 | bias-pull-up; | ||
| 164 | drive-strength = <8>; | ||
| 165 | }; | ||
| 166 | |||
| 158 | backlight { | 167 | backlight { |
| 159 | bl_en: bl-en { | 168 | bl_en: bl-en { |
| 160 | rockchip,pins = <7 2 RK_FUNC_GPIO &pcfg_pull_none>; | 169 | rockchip,pins = <7 2 RK_FUNC_GPIO &pcfg_pull_none>; |
| @@ -173,6 +182,27 @@ | |||
| 173 | }; | 182 | }; |
| 174 | }; | 183 | }; |
| 175 | 184 | ||
| 185 | sdmmc { | ||
| 186 | /* | ||
| 187 | * Default drive strength isn't enough to achieve even | ||
| 188 | * high-speed mode on EVB board so bump up to 8ma. | ||
| 189 | */ | ||
| 190 | sdmmc_bus4: sdmmc-bus4 { | ||
| 191 | rockchip,pins = <6 16 RK_FUNC_1 &pcfg_pull_up_drv_8ma>, | ||
| 192 | <6 17 RK_FUNC_1 &pcfg_pull_up_drv_8ma>, | ||
| 193 | <6 18 RK_FUNC_1 &pcfg_pull_up_drv_8ma>, | ||
| 194 | <6 19 RK_FUNC_1 &pcfg_pull_up_drv_8ma>; | ||
| 195 | }; | ||
| 196 | |||
| 197 | sdmmc_clk: sdmmc-clk { | ||
| 198 | rockchip,pins = <6 20 RK_FUNC_1 &pcfg_pull_none_drv_8ma>; | ||
| 199 | }; | ||
| 200 | |||
| 201 | sdmmc_cmd: sdmmc-cmd { | ||
| 202 | rockchip,pins = <6 21 RK_FUNC_1 &pcfg_pull_up_drv_8ma>; | ||
| 203 | }; | ||
| 204 | }; | ||
| 205 | |||
| 176 | usb { | 206 | usb { |
| 177 | host_vbus_drv: host-vbus-drv { | 207 | host_vbus_drv: host-vbus-drv { |
| 178 | rockchip,pins = <0 14 RK_FUNC_GPIO &pcfg_pull_none>; | 208 | rockchip,pins = <0 14 RK_FUNC_GPIO &pcfg_pull_none>; |
diff --git a/arch/arm/boot/dts/sama5d3xmb.dtsi b/arch/arm/boot/dts/sama5d3xmb.dtsi index 49c10d33df30..77e03655aca3 100644 --- a/arch/arm/boot/dts/sama5d3xmb.dtsi +++ b/arch/arm/boot/dts/sama5d3xmb.dtsi | |||
| @@ -176,7 +176,7 @@ | |||
| 176 | "Headphone Jack", "HPOUTR", | 176 | "Headphone Jack", "HPOUTR", |
| 177 | "IN2L", "Line In Jack", | 177 | "IN2L", "Line In Jack", |
| 178 | "IN2R", "Line In Jack", | 178 | "IN2R", "Line In Jack", |
| 179 | "MICBIAS", "IN1L", | 179 | "Mic", "MICBIAS", |
| 180 | "IN1L", "Mic"; | 180 | "IN1L", "Mic"; |
| 181 | 181 | ||
| 182 | atmel,ssc-controller = <&ssc0>; | 182 | atmel,ssc-controller = <&ssc0>; |
diff --git a/arch/arm/boot/dts/sama5d4.dtsi b/arch/arm/boot/dts/sama5d4.dtsi index 1b0f30c2c4a5..b94995d1889f 100644 --- a/arch/arm/boot/dts/sama5d4.dtsi +++ b/arch/arm/boot/dts/sama5d4.dtsi | |||
| @@ -1008,7 +1008,7 @@ | |||
| 1008 | 1008 | ||
| 1009 | pit: timer@fc068630 { | 1009 | pit: timer@fc068630 { |
| 1010 | compatible = "atmel,at91sam9260-pit"; | 1010 | compatible = "atmel,at91sam9260-pit"; |
| 1011 | reg = <0xfc068630 0xf>; | 1011 | reg = <0xfc068630 0x10>; |
| 1012 | interrupts = <3 IRQ_TYPE_LEVEL_HIGH 5>; | 1012 | interrupts = <3 IRQ_TYPE_LEVEL_HIGH 5>; |
| 1013 | clocks = <&h32ck>; | 1013 | clocks = <&h32ck>; |
| 1014 | }; | 1014 | }; |
diff --git a/arch/arm/boot/dts/ste-nomadik-nhk15.dts b/arch/arm/boot/dts/ste-nomadik-nhk15.dts index a8c00ee7522a..3d0b8755caee 100644 --- a/arch/arm/boot/dts/ste-nomadik-nhk15.dts +++ b/arch/arm/boot/dts/ste-nomadik-nhk15.dts | |||
| @@ -25,11 +25,11 @@ | |||
| 25 | stmpe2401_1 { | 25 | stmpe2401_1 { |
| 26 | stmpe2401_1_nhk_mode: stmpe2401_1_nhk { | 26 | stmpe2401_1_nhk_mode: stmpe2401_1_nhk { |
| 27 | nhk_cfg1 { | 27 | nhk_cfg1 { |
| 28 | ste,pins = "GPIO76_B20"; // IRQ line | 28 | pins = "GPIO76_B20"; // IRQ line |
| 29 | ste,input = <0>; | 29 | ste,input = <0>; |
| 30 | }; | 30 | }; |
| 31 | nhk_cfg2 { | 31 | nhk_cfg2 { |
| 32 | ste,pins = "GPIO77_B8"; // reset line | 32 | pins = "GPIO77_B8"; // reset line |
| 33 | ste,output = <1>; | 33 | ste,output = <1>; |
| 34 | }; | 34 | }; |
| 35 | }; | 35 | }; |
| @@ -37,11 +37,11 @@ | |||
| 37 | stmpe2401_2 { | 37 | stmpe2401_2 { |
| 38 | stmpe2401_2_nhk_mode: stmpe2401_2_nhk { | 38 | stmpe2401_2_nhk_mode: stmpe2401_2_nhk { |
| 39 | nhk_cfg1 { | 39 | nhk_cfg1 { |
| 40 | ste,pins = "GPIO78_A8"; // IRQ line | 40 | pins = "GPIO78_A8"; // IRQ line |
| 41 | ste,input = <0>; | 41 | ste,input = <0>; |
| 42 | }; | 42 | }; |
| 43 | nhk_cfg2 { | 43 | nhk_cfg2 { |
| 44 | ste,pins = "GPIO79_C9"; // reset line | 44 | pins = "GPIO79_C9"; // reset line |
| 45 | ste,output = <1>; | 45 | ste,output = <1>; |
| 46 | }; | 46 | }; |
| 47 | }; | 47 | }; |
diff --git a/arch/arm/configs/exynos_defconfig b/arch/arm/configs/exynos_defconfig index 5ef14de00a29..3d0c5d65c741 100644 --- a/arch/arm/configs/exynos_defconfig +++ b/arch/arm/configs/exynos_defconfig | |||
| @@ -84,7 +84,8 @@ CONFIG_DEBUG_GPIO=y | |||
| 84 | CONFIG_POWER_SUPPLY=y | 84 | CONFIG_POWER_SUPPLY=y |
| 85 | CONFIG_BATTERY_SBS=y | 85 | CONFIG_BATTERY_SBS=y |
| 86 | CONFIG_CHARGER_TPS65090=y | 86 | CONFIG_CHARGER_TPS65090=y |
| 87 | # CONFIG_HWMON is not set | 87 | CONFIG_HWMON=y |
| 88 | CONFIG_SENSORS_LM90=y | ||
| 88 | CONFIG_THERMAL=y | 89 | CONFIG_THERMAL=y |
| 89 | CONFIG_EXYNOS_THERMAL=y | 90 | CONFIG_EXYNOS_THERMAL=y |
| 90 | CONFIG_EXYNOS_THERMAL_CORE=y | 91 | CONFIG_EXYNOS_THERMAL_CORE=y |
| @@ -109,11 +110,26 @@ CONFIG_REGULATOR_S2MPA01=y | |||
| 109 | CONFIG_REGULATOR_S2MPS11=y | 110 | CONFIG_REGULATOR_S2MPS11=y |
| 110 | CONFIG_REGULATOR_S5M8767=y | 111 | CONFIG_REGULATOR_S5M8767=y |
| 111 | CONFIG_REGULATOR_TPS65090=y | 112 | CONFIG_REGULATOR_TPS65090=y |
| 113 | CONFIG_DRM=y | ||
| 114 | CONFIG_DRM_BRIDGE=y | ||
| 115 | CONFIG_DRM_PTN3460=y | ||
| 116 | CONFIG_DRM_PS8622=y | ||
| 117 | CONFIG_DRM_EXYNOS=y | ||
| 118 | CONFIG_DRM_EXYNOS_FIMD=y | ||
| 119 | CONFIG_DRM_EXYNOS_DP=y | ||
| 120 | CONFIG_DRM_PANEL=y | ||
| 121 | CONFIG_DRM_PANEL_SIMPLE=y | ||
| 112 | CONFIG_FB=y | 122 | CONFIG_FB=y |
| 113 | CONFIG_FB_MODE_HELPERS=y | 123 | CONFIG_FB_MODE_HELPERS=y |
| 114 | CONFIG_FB_SIMPLE=y | 124 | CONFIG_FB_SIMPLE=y |
| 115 | CONFIG_EXYNOS_VIDEO=y | 125 | CONFIG_EXYNOS_VIDEO=y |
| 116 | CONFIG_EXYNOS_MIPI_DSI=y | 126 | CONFIG_EXYNOS_MIPI_DSI=y |
| 127 | CONFIG_BACKLIGHT_LCD_SUPPORT=y | ||
| 128 | CONFIG_LCD_CLASS_DEVICE=y | ||
| 129 | CONFIG_LCD_PLATFORM=y | ||
| 130 | CONFIG_BACKLIGHT_CLASS_DEVICE=y | ||
| 131 | CONFIG_BACKLIGHT_GENERIC=y | ||
| 132 | CONFIG_BACKLIGHT_PWM=y | ||
| 117 | CONFIG_FRAMEBUFFER_CONSOLE=y | 133 | CONFIG_FRAMEBUFFER_CONSOLE=y |
| 118 | CONFIG_FONTS=y | 134 | CONFIG_FONTS=y |
| 119 | CONFIG_FONT_7x14=y | 135 | CONFIG_FONT_7x14=y |
diff --git a/arch/arm/configs/omap2plus_defconfig b/arch/arm/configs/omap2plus_defconfig index c2c3a852af9f..667d9d52aa01 100644 --- a/arch/arm/configs/omap2plus_defconfig +++ b/arch/arm/configs/omap2plus_defconfig | |||
| @@ -68,7 +68,7 @@ CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y | |||
| 68 | CONFIG_CPU_FREQ_GOV_POWERSAVE=y | 68 | CONFIG_CPU_FREQ_GOV_POWERSAVE=y |
| 69 | CONFIG_CPU_FREQ_GOV_USERSPACE=y | 69 | CONFIG_CPU_FREQ_GOV_USERSPACE=y |
| 70 | CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y | 70 | CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y |
| 71 | CONFIG_GENERIC_CPUFREQ_CPU0=y | 71 | CONFIG_CPUFREQ_DT=y |
| 72 | # CONFIG_ARM_OMAP2PLUS_CPUFREQ is not set | 72 | # CONFIG_ARM_OMAP2PLUS_CPUFREQ is not set |
| 73 | CONFIG_CPU_IDLE=y | 73 | CONFIG_CPU_IDLE=y |
| 74 | CONFIG_BINFMT_MISC=y | 74 | CONFIG_BINFMT_MISC=y |
diff --git a/arch/arm/mach-at91/board-dt-sama5.c b/arch/arm/mach-at91/board-dt-sama5.c index 8fb9ef5333f1..97f7367d32b8 100644 --- a/arch/arm/mach-at91/board-dt-sama5.c +++ b/arch/arm/mach-at91/board-dt-sama5.c | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | #include <linux/of_platform.h> | 17 | #include <linux/of_platform.h> |
| 18 | #include <linux/phy.h> | 18 | #include <linux/phy.h> |
| 19 | #include <linux/clk-provider.h> | 19 | #include <linux/clk-provider.h> |
| 20 | #include <linux/phy.h> | ||
| 20 | 21 | ||
| 21 | #include <asm/setup.h> | 22 | #include <asm/setup.h> |
| 22 | #include <asm/irq.h> | 23 | #include <asm/irq.h> |
| @@ -26,8 +27,25 @@ | |||
| 26 | 27 | ||
| 27 | #include "generic.h" | 28 | #include "generic.h" |
| 28 | 29 | ||
| 30 | static int ksz8081_phy_fixup(struct phy_device *phy) | ||
| 31 | { | ||
| 32 | int value; | ||
| 33 | |||
| 34 | value = phy_read(phy, 0x16); | ||
| 35 | value &= ~0x20; | ||
| 36 | phy_write(phy, 0x16, value); | ||
| 37 | |||
| 38 | return 0; | ||
| 39 | } | ||
| 40 | |||
| 29 | static void __init sama5_dt_device_init(void) | 41 | static void __init sama5_dt_device_init(void) |
| 30 | { | 42 | { |
| 43 | if (of_machine_is_compatible("atmel,sama5d4ek") && | ||
| 44 | IS_ENABLED(CONFIG_PHYLIB)) { | ||
| 45 | phy_register_fixup_for_id("fc028000.etherne:00", | ||
| 46 | ksz8081_phy_fixup); | ||
| 47 | } | ||
| 48 | |||
| 31 | of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); | 49 | of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); |
| 32 | } | 50 | } |
| 33 | 51 | ||
diff --git a/arch/arm/mach-imx/clk-imx6q.c b/arch/arm/mach-imx/clk-imx6q.c index 5951660d1bd2..2daef619d053 100644 --- a/arch/arm/mach-imx/clk-imx6q.c +++ b/arch/arm/mach-imx/clk-imx6q.c | |||
| @@ -144,7 +144,7 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node) | |||
| 144 | post_div_table[1].div = 1; | 144 | post_div_table[1].div = 1; |
| 145 | post_div_table[2].div = 1; | 145 | post_div_table[2].div = 1; |
| 146 | video_div_table[1].div = 1; | 146 | video_div_table[1].div = 1; |
| 147 | video_div_table[2].div = 1; | 147 | video_div_table[3].div = 1; |
| 148 | } | 148 | } |
| 149 | 149 | ||
| 150 | clk[IMX6QDL_PLL1_BYPASS_SRC] = imx_clk_mux("pll1_bypass_src", base + 0x00, 14, 2, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels)); | 150 | clk[IMX6QDL_PLL1_BYPASS_SRC] = imx_clk_mux("pll1_bypass_src", base + 0x00, 14, 2, pll_bypass_src_sels, ARRAY_SIZE(pll_bypass_src_sels)); |
diff --git a/arch/arm/mach-imx/clk-imx6sx.c b/arch/arm/mach-imx/clk-imx6sx.c index 17354a11356f..5a3e5a159e70 100644 --- a/arch/arm/mach-imx/clk-imx6sx.c +++ b/arch/arm/mach-imx/clk-imx6sx.c | |||
| @@ -558,6 +558,9 @@ static void __init imx6sx_clocks_init(struct device_node *ccm_node) | |||
| 558 | clk_set_parent(clks[IMX6SX_CLK_GPU_CORE_SEL], clks[IMX6SX_CLK_PLL3_PFD0]); | 558 | clk_set_parent(clks[IMX6SX_CLK_GPU_CORE_SEL], clks[IMX6SX_CLK_PLL3_PFD0]); |
| 559 | clk_set_parent(clks[IMX6SX_CLK_GPU_AXI_SEL], clks[IMX6SX_CLK_PLL3_PFD0]); | 559 | clk_set_parent(clks[IMX6SX_CLK_GPU_AXI_SEL], clks[IMX6SX_CLK_PLL3_PFD0]); |
| 560 | 560 | ||
| 561 | clk_set_parent(clks[IMX6SX_CLK_QSPI1_SEL], clks[IMX6SX_CLK_PLL2_BUS]); | ||
| 562 | clk_set_parent(clks[IMX6SX_CLK_QSPI2_SEL], clks[IMX6SX_CLK_PLL2_BUS]); | ||
| 563 | |||
| 561 | /* Set initial power mode */ | 564 | /* Set initial power mode */ |
| 562 | imx6q_set_lpm(WAIT_CLOCKED); | 565 | imx6q_set_lpm(WAIT_CLOCKED); |
| 563 | } | 566 | } |
diff --git a/arch/arm/mach-omap2/board-generic.c b/arch/arm/mach-omap2/board-generic.c index 608079a1aba6..b61c049f92d6 100644 --- a/arch/arm/mach-omap2/board-generic.c +++ b/arch/arm/mach-omap2/board-generic.c | |||
| @@ -77,6 +77,24 @@ MACHINE_END | |||
| 77 | #endif | 77 | #endif |
| 78 | 78 | ||
| 79 | #ifdef CONFIG_ARCH_OMAP3 | 79 | #ifdef CONFIG_ARCH_OMAP3 |
| 80 | /* Some boards need board name for legacy userspace in /proc/cpuinfo */ | ||
| 81 | static const char *const n900_boards_compat[] __initconst = { | ||
| 82 | "nokia,omap3-n900", | ||
| 83 | NULL, | ||
| 84 | }; | ||
| 85 | |||
| 86 | DT_MACHINE_START(OMAP3_N900_DT, "Nokia RX-51 board") | ||
| 87 | .reserve = omap_reserve, | ||
| 88 | .map_io = omap3_map_io, | ||
| 89 | .init_early = omap3430_init_early, | ||
| 90 | .init_machine = omap_generic_init, | ||
| 91 | .init_late = omap3_init_late, | ||
| 92 | .init_time = omap3_sync32k_timer_init, | ||
| 93 | .dt_compat = n900_boards_compat, | ||
| 94 | .restart = omap3xxx_restart, | ||
| 95 | MACHINE_END | ||
| 96 | |||
| 97 | /* Generic omap3 boards, most boards can use these */ | ||
| 80 | static const char *const omap3_boards_compat[] __initconst = { | 98 | static const char *const omap3_boards_compat[] __initconst = { |
| 81 | "ti,omap3430", | 99 | "ti,omap3430", |
| 82 | "ti,omap3", | 100 | "ti,omap3", |
diff --git a/arch/arm/mach-omap2/common.h b/arch/arm/mach-omap2/common.h index 377eea849e7b..db57741c9c8a 100644 --- a/arch/arm/mach-omap2/common.h +++ b/arch/arm/mach-omap2/common.h | |||
| @@ -249,6 +249,7 @@ extern void omap4_cpu_die(unsigned int cpu); | |||
| 249 | extern struct smp_operations omap4_smp_ops; | 249 | extern struct smp_operations omap4_smp_ops; |
| 250 | 250 | ||
| 251 | extern void omap5_secondary_startup(void); | 251 | extern void omap5_secondary_startup(void); |
| 252 | extern void omap5_secondary_hyp_startup(void); | ||
| 252 | #endif | 253 | #endif |
| 253 | 254 | ||
| 254 | #if defined(CONFIG_SMP) && defined(CONFIG_PM) | 255 | #if defined(CONFIG_SMP) && defined(CONFIG_PM) |
diff --git a/arch/arm/mach-omap2/control.h b/arch/arm/mach-omap2/control.h index a3c013345c45..a80ac2d70bb1 100644 --- a/arch/arm/mach-omap2/control.h +++ b/arch/arm/mach-omap2/control.h | |||
| @@ -286,6 +286,10 @@ | |||
| 286 | #define OMAP5XXX_CONTROL_STATUS 0x134 | 286 | #define OMAP5XXX_CONTROL_STATUS 0x134 |
| 287 | #define OMAP5_DEVICETYPE_MASK (0x7 << 6) | 287 | #define OMAP5_DEVICETYPE_MASK (0x7 << 6) |
| 288 | 288 | ||
| 289 | /* DRA7XX CONTROL CORE BOOTSTRAP */ | ||
| 290 | #define DRA7_CTRL_CORE_BOOTSTRAP 0x6c4 | ||
| 291 | #define DRA7_SPEEDSELECT_MASK (0x3 << 8) | ||
| 292 | |||
| 289 | /* | 293 | /* |
| 290 | * REVISIT: This list of registers is not comprehensive - there are more | 294 | * REVISIT: This list of registers is not comprehensive - there are more |
| 291 | * that should be added. | 295 | * that should be added. |
diff --git a/arch/arm/mach-omap2/omap-headsmp.S b/arch/arm/mach-omap2/omap-headsmp.S index 4993d4bfe9b2..6d1dffca6c7b 100644 --- a/arch/arm/mach-omap2/omap-headsmp.S +++ b/arch/arm/mach-omap2/omap-headsmp.S | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | 22 | ||
| 23 | /* Physical address needed since MMU not enabled yet on secondary core */ | 23 | /* Physical address needed since MMU not enabled yet on secondary core */ |
| 24 | #define AUX_CORE_BOOT0_PA 0x48281800 | 24 | #define AUX_CORE_BOOT0_PA 0x48281800 |
| 25 | #define API_HYP_ENTRY 0x102 | ||
| 25 | 26 | ||
| 26 | /* | 27 | /* |
| 27 | * OMAP5 specific entry point for secondary CPU to jump from ROM | 28 | * OMAP5 specific entry point for secondary CPU to jump from ROM |
| @@ -41,6 +42,26 @@ wait: ldr r2, =AUX_CORE_BOOT0_PA @ read from AuxCoreBoot0 | |||
| 41 | b secondary_startup | 42 | b secondary_startup |
| 42 | ENDPROC(omap5_secondary_startup) | 43 | ENDPROC(omap5_secondary_startup) |
| 43 | /* | 44 | /* |
| 45 | * Same as omap5_secondary_startup except we call into the ROM to | ||
| 46 | * enable HYP mode first. This is called instead of | ||
| 47 | * omap5_secondary_startup if the primary CPU was put into HYP mode by | ||
| 48 | * the boot loader. | ||
| 49 | */ | ||
| 50 | ENTRY(omap5_secondary_hyp_startup) | ||
| 51 | wait_2: ldr r2, =AUX_CORE_BOOT0_PA @ read from AuxCoreBoot0 | ||
| 52 | ldr r0, [r2] | ||
| 53 | mov r0, r0, lsr #5 | ||
| 54 | mrc p15, 0, r4, c0, c0, 5 | ||
| 55 | and r4, r4, #0x0f | ||
| 56 | cmp r0, r4 | ||
| 57 | bne wait_2 | ||
| 58 | ldr r12, =API_HYP_ENTRY | ||
| 59 | adr r0, hyp_boot | ||
| 60 | smc #0 | ||
| 61 | hyp_boot: | ||
| 62 | b secondary_startup | ||
| 63 | ENDPROC(omap5_secondary_hyp_startup) | ||
| 64 | /* | ||
| 44 | * OMAP4 specific entry point for secondary CPU to jump from ROM | 65 | * OMAP4 specific entry point for secondary CPU to jump from ROM |
| 45 | * code. This routine also provides a holding flag into which | 66 | * code. This routine also provides a holding flag into which |
| 46 | * secondary core is held until we're ready for it to initialise. | 67 | * secondary core is held until we're ready for it to initialise. |
diff --git a/arch/arm/mach-omap2/omap-smp.c b/arch/arm/mach-omap2/omap-smp.c index 256e84ef0f67..5305ec7341ec 100644 --- a/arch/arm/mach-omap2/omap-smp.c +++ b/arch/arm/mach-omap2/omap-smp.c | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include <linux/irqchip/arm-gic.h> | 22 | #include <linux/irqchip/arm-gic.h> |
| 23 | 23 | ||
| 24 | #include <asm/smp_scu.h> | 24 | #include <asm/smp_scu.h> |
| 25 | #include <asm/virt.h> | ||
| 25 | 26 | ||
| 26 | #include "omap-secure.h" | 27 | #include "omap-secure.h" |
| 27 | #include "omap-wakeupgen.h" | 28 | #include "omap-wakeupgen.h" |
| @@ -227,8 +228,16 @@ static void __init omap4_smp_prepare_cpus(unsigned int max_cpus) | |||
| 227 | if (omap_secure_apis_support()) | 228 | if (omap_secure_apis_support()) |
| 228 | omap_auxcoreboot_addr(virt_to_phys(startup_addr)); | 229 | omap_auxcoreboot_addr(virt_to_phys(startup_addr)); |
| 229 | else | 230 | else |
| 230 | writel_relaxed(virt_to_phys(omap5_secondary_startup), | 231 | /* |
| 231 | base + OMAP_AUX_CORE_BOOT_1); | 232 | * If the boot CPU is in HYP mode then start secondary |
| 233 | * CPU in HYP mode as well. | ||
| 234 | */ | ||
| 235 | if ((__boot_cpu_mode & MODE_MASK) == HYP_MODE) | ||
| 236 | writel_relaxed(virt_to_phys(omap5_secondary_hyp_startup), | ||
| 237 | base + OMAP_AUX_CORE_BOOT_1); | ||
| 238 | else | ||
| 239 | writel_relaxed(virt_to_phys(omap5_secondary_startup), | ||
| 240 | base + OMAP_AUX_CORE_BOOT_1); | ||
| 232 | 241 | ||
| 233 | } | 242 | } |
| 234 | 243 | ||
diff --git a/arch/arm/mach-omap2/timer.c b/arch/arm/mach-omap2/timer.c index 4f61148ec168..7d45c84c69ba 100644 --- a/arch/arm/mach-omap2/timer.c +++ b/arch/arm/mach-omap2/timer.c | |||
| @@ -54,6 +54,7 @@ | |||
| 54 | 54 | ||
| 55 | #include "soc.h" | 55 | #include "soc.h" |
| 56 | #include "common.h" | 56 | #include "common.h" |
| 57 | #include "control.h" | ||
| 57 | #include "powerdomain.h" | 58 | #include "powerdomain.h" |
| 58 | #include "omap-secure.h" | 59 | #include "omap-secure.h" |
| 59 | 60 | ||
| @@ -496,7 +497,8 @@ static void __init realtime_counter_init(void) | |||
| 496 | void __iomem *base; | 497 | void __iomem *base; |
| 497 | static struct clk *sys_clk; | 498 | static struct clk *sys_clk; |
| 498 | unsigned long rate; | 499 | unsigned long rate; |
| 499 | unsigned int reg, num, den; | 500 | unsigned int reg; |
| 501 | unsigned long long num, den; | ||
| 500 | 502 | ||
| 501 | base = ioremap(REALTIME_COUNTER_BASE, SZ_32); | 503 | base = ioremap(REALTIME_COUNTER_BASE, SZ_32); |
| 502 | if (!base) { | 504 | if (!base) { |
| @@ -511,13 +513,42 @@ static void __init realtime_counter_init(void) | |||
| 511 | } | 513 | } |
| 512 | 514 | ||
| 513 | rate = clk_get_rate(sys_clk); | 515 | rate = clk_get_rate(sys_clk); |
| 516 | |||
| 517 | if (soc_is_dra7xx()) { | ||
| 518 | /* | ||
| 519 | * Errata i856 says the 32.768KHz crystal does not start at | ||
| 520 | * power on, so the CPU falls back to an emulated 32KHz clock | ||
| 521 | * based on sysclk / 610 instead. This causes the master counter | ||
| 522 | * frequency to not be 6.144MHz but at sysclk / 610 * 375 / 2 | ||
| 523 | * (OR sysclk * 75 / 244) | ||
| 524 | * | ||
| 525 | * This affects at least the DRA7/AM572x 1.0, 1.1 revisions. | ||
| 526 | * Of course any board built without a populated 32.768KHz | ||
| 527 | * crystal would also need this fix even if the CPU is fixed | ||
| 528 | * later. | ||
| 529 | * | ||
| 530 | * Either case can be detected by using the two speedselect bits | ||
| 531 | * If they are not 0, then the 32.768KHz clock driving the | ||
| 532 | * coarse counter that corrects the fine counter every time it | ||
| 533 | * ticks is actually rate/610 rather than 32.768KHz and we | ||
| 534 | * should compensate to avoid the 570ppm (at 20MHz, much worse | ||
| 535 | * at other rates) too fast system time. | ||
| 536 | */ | ||
| 537 | reg = omap_ctrl_readl(DRA7_CTRL_CORE_BOOTSTRAP); | ||
| 538 | if (reg & DRA7_SPEEDSELECT_MASK) { | ||
| 539 | num = 75; | ||
| 540 | den = 244; | ||
| 541 | goto sysclk1_based; | ||
| 542 | } | ||
| 543 | } | ||
| 544 | |||
| 514 | /* Numerator/denumerator values refer TRM Realtime Counter section */ | 545 | /* Numerator/denumerator values refer TRM Realtime Counter section */ |
| 515 | switch (rate) { | 546 | switch (rate) { |
| 516 | case 1200000: | 547 | case 12000000: |
| 517 | num = 64; | 548 | num = 64; |
| 518 | den = 125; | 549 | den = 125; |
| 519 | break; | 550 | break; |
| 520 | case 1300000: | 551 | case 13000000: |
| 521 | num = 768; | 552 | num = 768; |
| 522 | den = 1625; | 553 | den = 1625; |
| 523 | break; | 554 | break; |
| @@ -529,11 +560,11 @@ static void __init realtime_counter_init(void) | |||
| 529 | num = 192; | 560 | num = 192; |
| 530 | den = 625; | 561 | den = 625; |
| 531 | break; | 562 | break; |
| 532 | case 2600000: | 563 | case 26000000: |
| 533 | num = 384; | 564 | num = 384; |
| 534 | den = 1625; | 565 | den = 1625; |
| 535 | break; | 566 | break; |
| 536 | case 2700000: | 567 | case 27000000: |
| 537 | num = 256; | 568 | num = 256; |
| 538 | den = 1125; | 569 | den = 1125; |
| 539 | break; | 570 | break; |
| @@ -545,6 +576,7 @@ static void __init realtime_counter_init(void) | |||
| 545 | break; | 576 | break; |
| 546 | } | 577 | } |
| 547 | 578 | ||
| 579 | sysclk1_based: | ||
| 548 | /* Program numerator and denumerator registers */ | 580 | /* Program numerator and denumerator registers */ |
| 549 | reg = readl_relaxed(base + INCREMENTER_NUMERATOR_OFFSET) & | 581 | reg = readl_relaxed(base + INCREMENTER_NUMERATOR_OFFSET) & |
| 550 | NUMERATOR_DENUMERATOR_MASK; | 582 | NUMERATOR_DENUMERATOR_MASK; |
| @@ -556,7 +588,7 @@ static void __init realtime_counter_init(void) | |||
| 556 | reg |= den; | 588 | reg |= den; |
| 557 | writel_relaxed(reg, base + INCREMENTER_DENUMERATOR_RELOAD_OFFSET); | 589 | writel_relaxed(reg, base + INCREMENTER_DENUMERATOR_RELOAD_OFFSET); |
| 558 | 590 | ||
| 559 | arch_timer_freq = (rate / den) * num; | 591 | arch_timer_freq = DIV_ROUND_UP_ULL(rate * num, den); |
| 560 | set_cntfreq(); | 592 | set_cntfreq(); |
| 561 | 593 | ||
| 562 | iounmap(base); | 594 | iounmap(base); |
diff --git a/arch/arm/mach-rockchip/rockchip.c b/arch/arm/mach-rockchip/rockchip.c index d226b71d21d5..a611f4852582 100644 --- a/arch/arm/mach-rockchip/rockchip.c +++ b/arch/arm/mach-rockchip/rockchip.c | |||
| @@ -19,11 +19,37 @@ | |||
| 19 | #include <linux/init.h> | 19 | #include <linux/init.h> |
| 20 | #include <linux/of_platform.h> | 20 | #include <linux/of_platform.h> |
| 21 | #include <linux/irqchip.h> | 21 | #include <linux/irqchip.h> |
| 22 | #include <linux/clk-provider.h> | ||
| 23 | #include <linux/clocksource.h> | ||
| 24 | #include <linux/mfd/syscon.h> | ||
| 25 | #include <linux/regmap.h> | ||
| 22 | #include <asm/mach/arch.h> | 26 | #include <asm/mach/arch.h> |
| 23 | #include <asm/mach/map.h> | 27 | #include <asm/mach/map.h> |
| 24 | #include <asm/hardware/cache-l2x0.h> | 28 | #include <asm/hardware/cache-l2x0.h> |
| 25 | #include "core.h" | 29 | #include "core.h" |
| 26 | 30 | ||
| 31 | #define RK3288_GRF_SOC_CON0 0x244 | ||
| 32 | |||
| 33 | static void __init rockchip_timer_init(void) | ||
| 34 | { | ||
| 35 | if (of_machine_is_compatible("rockchip,rk3288")) { | ||
| 36 | struct regmap *grf; | ||
| 37 | |||
| 38 | /* | ||
| 39 | * Disable auto jtag/sdmmc switching that causes issues | ||
| 40 | * with the mmc controllers making them unreliable | ||
| 41 | */ | ||
| 42 | grf = syscon_regmap_lookup_by_compatible("rockchip,rk3288-grf"); | ||
| 43 | if (!IS_ERR(grf)) | ||
| 44 | regmap_write(grf, RK3288_GRF_SOC_CON0, 0x10000000); | ||
| 45 | else | ||
| 46 | pr_err("rockchip: could not get grf syscon\n"); | ||
| 47 | } | ||
| 48 | |||
| 49 | of_clk_init(NULL); | ||
| 50 | clocksource_of_init(); | ||
| 51 | } | ||
| 52 | |||
| 27 | static void __init rockchip_dt_init(void) | 53 | static void __init rockchip_dt_init(void) |
| 28 | { | 54 | { |
| 29 | of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); | 55 | of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); |
| @@ -42,6 +68,7 @@ static const char * const rockchip_board_dt_compat[] = { | |||
| 42 | DT_MACHINE_START(ROCKCHIP_DT, "Rockchip Cortex-A9 (Device Tree)") | 68 | DT_MACHINE_START(ROCKCHIP_DT, "Rockchip Cortex-A9 (Device Tree)") |
| 43 | .l2c_aux_val = 0, | 69 | .l2c_aux_val = 0, |
| 44 | .l2c_aux_mask = ~0, | 70 | .l2c_aux_mask = ~0, |
| 71 | .init_time = rockchip_timer_init, | ||
| 45 | .dt_compat = rockchip_board_dt_compat, | 72 | .dt_compat = rockchip_board_dt_compat, |
| 46 | .init_machine = rockchip_dt_init, | 73 | .init_machine = rockchip_dt_init, |
| 47 | MACHINE_END | 74 | MACHINE_END |
diff --git a/arch/arm/mach-shmobile/setup-r8a7740.c b/arch/arm/mach-shmobile/setup-r8a7740.c index 79ad93dfdae4..d191cf419731 100644 --- a/arch/arm/mach-shmobile/setup-r8a7740.c +++ b/arch/arm/mach-shmobile/setup-r8a7740.c | |||
| @@ -800,7 +800,14 @@ void __init r8a7740_init_irq_of(void) | |||
| 800 | void __iomem *intc_msk_base = ioremap_nocache(0xe6900040, 0x10); | 800 | void __iomem *intc_msk_base = ioremap_nocache(0xe6900040, 0x10); |
| 801 | void __iomem *pfc_inta_ctrl = ioremap_nocache(0xe605807c, 0x4); | 801 | void __iomem *pfc_inta_ctrl = ioremap_nocache(0xe605807c, 0x4); |
| 802 | 802 | ||
| 803 | #ifdef CONFIG_ARCH_SHMOBILE_LEGACY | ||
| 804 | void __iomem *gic_dist_base = ioremap_nocache(0xc2800000, 0x1000); | ||
| 805 | void __iomem *gic_cpu_base = ioremap_nocache(0xc2000000, 0x1000); | ||
| 806 | |||
| 807 | gic_init(0, 29, gic_dist_base, gic_cpu_base); | ||
| 808 | #else | ||
| 803 | irqchip_init(); | 809 | irqchip_init(); |
| 810 | #endif | ||
| 804 | 811 | ||
| 805 | /* route signals to GIC */ | 812 | /* route signals to GIC */ |
| 806 | iowrite32(0x0, pfc_inta_ctrl); | 813 | iowrite32(0x0, pfc_inta_ctrl); |
diff --git a/arch/arm/mach-shmobile/setup-sh73a0.c b/arch/arm/mach-shmobile/setup-sh73a0.c index 93ebe3430bfe..fb5e1bb34be8 100644 --- a/arch/arm/mach-shmobile/setup-sh73a0.c +++ b/arch/arm/mach-shmobile/setup-sh73a0.c | |||
| @@ -595,6 +595,7 @@ static struct platform_device ipmmu_device = { | |||
| 595 | 595 | ||
| 596 | static struct renesas_intc_irqpin_config irqpin0_platform_data = { | 596 | static struct renesas_intc_irqpin_config irqpin0_platform_data = { |
| 597 | .irq_base = irq_pin(0), /* IRQ0 -> IRQ7 */ | 597 | .irq_base = irq_pin(0), /* IRQ0 -> IRQ7 */ |
| 598 | .control_parent = true, | ||
| 598 | }; | 599 | }; |
| 599 | 600 | ||
| 600 | static struct resource irqpin0_resources[] = { | 601 | static struct resource irqpin0_resources[] = { |
| @@ -656,6 +657,7 @@ static struct platform_device irqpin1_device = { | |||
| 656 | 657 | ||
| 657 | static struct renesas_intc_irqpin_config irqpin2_platform_data = { | 658 | static struct renesas_intc_irqpin_config irqpin2_platform_data = { |
| 658 | .irq_base = irq_pin(16), /* IRQ16 -> IRQ23 */ | 659 | .irq_base = irq_pin(16), /* IRQ16 -> IRQ23 */ |
| 660 | .control_parent = true, | ||
| 659 | }; | 661 | }; |
| 660 | 662 | ||
| 661 | static struct resource irqpin2_resources[] = { | 663 | static struct resource irqpin2_resources[] = { |
| @@ -686,6 +688,7 @@ static struct platform_device irqpin2_device = { | |||
| 686 | 688 | ||
| 687 | static struct renesas_intc_irqpin_config irqpin3_platform_data = { | 689 | static struct renesas_intc_irqpin_config irqpin3_platform_data = { |
| 688 | .irq_base = irq_pin(24), /* IRQ24 -> IRQ31 */ | 690 | .irq_base = irq_pin(24), /* IRQ24 -> IRQ31 */ |
| 691 | .control_parent = true, | ||
| 689 | }; | 692 | }; |
| 690 | 693 | ||
| 691 | static struct resource irqpin3_resources[] = { | 694 | static struct resource irqpin3_resources[] = { |
diff --git a/arch/arm64/include/asm/unistd.h b/arch/arm64/include/asm/unistd.h index b780c6c76eec..23e9432ac112 100644 --- a/arch/arm64/include/asm/unistd.h +++ b/arch/arm64/include/asm/unistd.h | |||
| @@ -44,7 +44,7 @@ | |||
| 44 | #define __ARM_NR_compat_cacheflush (__ARM_NR_COMPAT_BASE+2) | 44 | #define __ARM_NR_compat_cacheflush (__ARM_NR_COMPAT_BASE+2) |
| 45 | #define __ARM_NR_compat_set_tls (__ARM_NR_COMPAT_BASE+5) | 45 | #define __ARM_NR_compat_set_tls (__ARM_NR_COMPAT_BASE+5) |
| 46 | 46 | ||
| 47 | #define __NR_compat_syscalls 387 | 47 | #define __NR_compat_syscalls 388 |
| 48 | #endif | 48 | #endif |
| 49 | 49 | ||
| 50 | #define __ARCH_WANT_SYS_CLONE | 50 | #define __ARCH_WANT_SYS_CLONE |
diff --git a/arch/arm64/include/asm/unistd32.h b/arch/arm64/include/asm/unistd32.h index 8893cebcea5b..27224426e0bf 100644 --- a/arch/arm64/include/asm/unistd32.h +++ b/arch/arm64/include/asm/unistd32.h | |||
| @@ -795,3 +795,5 @@ __SYSCALL(__NR_getrandom, sys_getrandom) | |||
| 795 | __SYSCALL(__NR_memfd_create, sys_memfd_create) | 795 | __SYSCALL(__NR_memfd_create, sys_memfd_create) |
| 796 | #define __NR_bpf 386 | 796 | #define __NR_bpf 386 |
| 797 | __SYSCALL(__NR_bpf, sys_bpf) | 797 | __SYSCALL(__NR_bpf, sys_bpf) |
| 798 | #define __NR_execveat 387 | ||
| 799 | __SYSCALL(__NR_execveat, compat_sys_execveat) | ||
diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c index bac492c12fcc..c95464a33f36 100644 --- a/arch/arm64/mm/init.c +++ b/arch/arm64/mm/init.c | |||
| @@ -335,14 +335,8 @@ static int keep_initrd; | |||
| 335 | 335 | ||
| 336 | void free_initrd_mem(unsigned long start, unsigned long end) | 336 | void free_initrd_mem(unsigned long start, unsigned long end) |
| 337 | { | 337 | { |
| 338 | if (!keep_initrd) { | 338 | if (!keep_initrd) |
| 339 | if (start == initrd_start) | ||
| 340 | start = round_down(start, PAGE_SIZE); | ||
| 341 | if (end == initrd_end) | ||
| 342 | end = round_up(end, PAGE_SIZE); | ||
| 343 | |||
| 344 | free_reserved_area((void *)start, (void *)end, 0, "initrd"); | 339 | free_reserved_area((void *)start, (void *)end, 0, "initrd"); |
| 345 | } | ||
| 346 | } | 340 | } |
| 347 | 341 | ||
| 348 | static int __init keepinitrd_setup(char *__unused) | 342 | static int __init keepinitrd_setup(char *__unused) |
diff --git a/arch/m68k/include/asm/unistd.h b/arch/m68k/include/asm/unistd.h index 75e75d7b1702..244e0dbe45db 100644 --- a/arch/m68k/include/asm/unistd.h +++ b/arch/m68k/include/asm/unistd.h | |||
| @@ -4,7 +4,7 @@ | |||
| 4 | #include <uapi/asm/unistd.h> | 4 | #include <uapi/asm/unistd.h> |
| 5 | 5 | ||
| 6 | 6 | ||
| 7 | #define NR_syscalls 355 | 7 | #define NR_syscalls 356 |
| 8 | 8 | ||
| 9 | #define __ARCH_WANT_OLD_READDIR | 9 | #define __ARCH_WANT_OLD_READDIR |
| 10 | #define __ARCH_WANT_OLD_STAT | 10 | #define __ARCH_WANT_OLD_STAT |
diff --git a/arch/m68k/include/uapi/asm/unistd.h b/arch/m68k/include/uapi/asm/unistd.h index 2c1bec9a14b6..61fb6cb9d2ae 100644 --- a/arch/m68k/include/uapi/asm/unistd.h +++ b/arch/m68k/include/uapi/asm/unistd.h | |||
| @@ -360,5 +360,6 @@ | |||
| 360 | #define __NR_getrandom 352 | 360 | #define __NR_getrandom 352 |
| 361 | #define __NR_memfd_create 353 | 361 | #define __NR_memfd_create 353 |
| 362 | #define __NR_bpf 354 | 362 | #define __NR_bpf 354 |
| 363 | #define __NR_execveat 355 | ||
| 363 | 364 | ||
| 364 | #endif /* _UAPI_ASM_M68K_UNISTD_H_ */ | 365 | #endif /* _UAPI_ASM_M68K_UNISTD_H_ */ |
diff --git a/arch/m68k/kernel/syscalltable.S b/arch/m68k/kernel/syscalltable.S index 2ca219e184cd..a0ec4303f2c8 100644 --- a/arch/m68k/kernel/syscalltable.S +++ b/arch/m68k/kernel/syscalltable.S | |||
| @@ -375,4 +375,5 @@ ENTRY(sys_call_table) | |||
| 375 | .long sys_getrandom | 375 | .long sys_getrandom |
| 376 | .long sys_memfd_create | 376 | .long sys_memfd_create |
| 377 | .long sys_bpf | 377 | .long sys_bpf |
| 378 | .long sys_execveat /* 355 */ | ||
| 378 | 379 | ||
diff --git a/arch/powerpc/include/asm/thread_info.h b/arch/powerpc/include/asm/thread_info.h index ebc4f165690a..0be6c681cab1 100644 --- a/arch/powerpc/include/asm/thread_info.h +++ b/arch/powerpc/include/asm/thread_info.h | |||
| @@ -23,9 +23,9 @@ | |||
| 23 | #define THREAD_SIZE (1 << THREAD_SHIFT) | 23 | #define THREAD_SIZE (1 << THREAD_SHIFT) |
| 24 | 24 | ||
| 25 | #ifdef CONFIG_PPC64 | 25 | #ifdef CONFIG_PPC64 |
| 26 | #define CURRENT_THREAD_INFO(dest, sp) clrrdi dest, sp, THREAD_SHIFT | 26 | #define CURRENT_THREAD_INFO(dest, sp) stringify_in_c(clrrdi dest, sp, THREAD_SHIFT) |
| 27 | #else | 27 | #else |
| 28 | #define CURRENT_THREAD_INFO(dest, sp) rlwinm dest, sp, 0, 0, 31-THREAD_SHIFT | 28 | #define CURRENT_THREAD_INFO(dest, sp) stringify_in_c(rlwinm dest, sp, 0, 0, 31-THREAD_SHIFT) |
| 29 | #endif | 29 | #endif |
| 30 | 30 | ||
| 31 | #ifndef __ASSEMBLY__ | 31 | #ifndef __ASSEMBLY__ |
| @@ -71,12 +71,13 @@ struct thread_info { | |||
| 71 | #define THREAD_SIZE_ORDER (THREAD_SHIFT - PAGE_SHIFT) | 71 | #define THREAD_SIZE_ORDER (THREAD_SHIFT - PAGE_SHIFT) |
| 72 | 72 | ||
| 73 | /* how to get the thread information struct from C */ | 73 | /* how to get the thread information struct from C */ |
| 74 | register unsigned long __current_r1 asm("r1"); | ||
| 75 | static inline struct thread_info *current_thread_info(void) | 74 | static inline struct thread_info *current_thread_info(void) |
| 76 | { | 75 | { |
| 77 | /* gcc4, at least, is smart enough to turn this into a single | 76 | unsigned long val; |
| 78 | * rlwinm for ppc32 and clrrdi for ppc64 */ | 77 | |
| 79 | return (struct thread_info *)(__current_r1 & ~(THREAD_SIZE-1)); | 78 | asm (CURRENT_THREAD_INFO(%0,1) : "=r" (val)); |
| 79 | |||
| 80 | return (struct thread_info *)val; | ||
| 80 | } | 81 | } |
| 81 | 82 | ||
| 82 | #endif /* __ASSEMBLY__ */ | 83 | #endif /* __ASSEMBLY__ */ |
diff --git a/arch/powerpc/platforms/powernv/opal-wrappers.S b/arch/powerpc/platforms/powernv/opal-wrappers.S index 54eca8b3b288..0509bca5e830 100644 --- a/arch/powerpc/platforms/powernv/opal-wrappers.S +++ b/arch/powerpc/platforms/powernv/opal-wrappers.S | |||
| @@ -40,7 +40,6 @@ BEGIN_FTR_SECTION; \ | |||
| 40 | b 1f; \ | 40 | b 1f; \ |
| 41 | END_FTR_SECTION(0, 1); \ | 41 | END_FTR_SECTION(0, 1); \ |
| 42 | ld r12,opal_tracepoint_refcount@toc(r2); \ | 42 | ld r12,opal_tracepoint_refcount@toc(r2); \ |
| 43 | std r12,32(r1); \ | ||
| 44 | cmpdi r12,0; \ | 43 | cmpdi r12,0; \ |
| 45 | bne- LABEL; \ | 44 | bne- LABEL; \ |
| 46 | 1: | 45 | 1: |
diff --git a/arch/x86/boot/compressed/misc.c b/arch/x86/boot/compressed/misc.c index dcc1c536cc21..a950864a64da 100644 --- a/arch/x86/boot/compressed/misc.c +++ b/arch/x86/boot/compressed/misc.c | |||
| @@ -373,6 +373,8 @@ asmlinkage __visible void *decompress_kernel(void *rmode, memptr heap, | |||
| 373 | unsigned long output_len, | 373 | unsigned long output_len, |
| 374 | unsigned long run_size) | 374 | unsigned long run_size) |
| 375 | { | 375 | { |
| 376 | unsigned char *output_orig = output; | ||
| 377 | |||
| 376 | real_mode = rmode; | 378 | real_mode = rmode; |
| 377 | 379 | ||
| 378 | sanitize_boot_params(real_mode); | 380 | sanitize_boot_params(real_mode); |
| @@ -421,7 +423,12 @@ asmlinkage __visible void *decompress_kernel(void *rmode, memptr heap, | |||
| 421 | debug_putstr("\nDecompressing Linux... "); | 423 | debug_putstr("\nDecompressing Linux... "); |
| 422 | decompress(input_data, input_len, NULL, NULL, output, NULL, error); | 424 | decompress(input_data, input_len, NULL, NULL, output, NULL, error); |
| 423 | parse_elf(output); | 425 | parse_elf(output); |
| 424 | handle_relocations(output, output_len); | 426 | /* |
| 427 | * 32-bit always performs relocations. 64-bit relocations are only | ||
| 428 | * needed if kASLR has chosen a different load address. | ||
| 429 | */ | ||
| 430 | if (!IS_ENABLED(CONFIG_X86_64) || output != output_orig) | ||
| 431 | handle_relocations(output, output_len); | ||
| 425 | debug_putstr("done.\nBooting the kernel.\n"); | 432 | debug_putstr("done.\nBooting the kernel.\n"); |
| 426 | return output; | 433 | return output; |
| 427 | } | 434 | } |
diff --git a/arch/x86/include/asm/acpi.h b/arch/x86/include/asm/acpi.h index 0ab4f9fd2687..3a45668f6dc3 100644 --- a/arch/x86/include/asm/acpi.h +++ b/arch/x86/include/asm/acpi.h | |||
| @@ -50,6 +50,7 @@ void acpi_pic_sci_set_trigger(unsigned int, u16); | |||
| 50 | 50 | ||
| 51 | extern int (*__acpi_register_gsi)(struct device *dev, u32 gsi, | 51 | extern int (*__acpi_register_gsi)(struct device *dev, u32 gsi, |
| 52 | int trigger, int polarity); | 52 | int trigger, int polarity); |
| 53 | extern void (*__acpi_unregister_gsi)(u32 gsi); | ||
| 53 | 54 | ||
| 54 | static inline void disable_acpi(void) | 55 | static inline void disable_acpi(void) |
| 55 | { | 56 | { |
diff --git a/arch/x86/include/asm/desc.h b/arch/x86/include/asm/desc.h index 50d033a8947d..a94b82e8f156 100644 --- a/arch/x86/include/asm/desc.h +++ b/arch/x86/include/asm/desc.h | |||
| @@ -251,7 +251,8 @@ static inline void native_load_tls(struct thread_struct *t, unsigned int cpu) | |||
| 251 | gdt[GDT_ENTRY_TLS_MIN + i] = t->tls_array[i]; | 251 | gdt[GDT_ENTRY_TLS_MIN + i] = t->tls_array[i]; |
| 252 | } | 252 | } |
| 253 | 253 | ||
| 254 | #define _LDT_empty(info) \ | 254 | /* This intentionally ignores lm, since 32-bit apps don't have that field. */ |
| 255 | #define LDT_empty(info) \ | ||
| 255 | ((info)->base_addr == 0 && \ | 256 | ((info)->base_addr == 0 && \ |
| 256 | (info)->limit == 0 && \ | 257 | (info)->limit == 0 && \ |
| 257 | (info)->contents == 0 && \ | 258 | (info)->contents == 0 && \ |
| @@ -261,11 +262,18 @@ static inline void native_load_tls(struct thread_struct *t, unsigned int cpu) | |||
| 261 | (info)->seg_not_present == 1 && \ | 262 | (info)->seg_not_present == 1 && \ |
| 262 | (info)->useable == 0) | 263 | (info)->useable == 0) |
| 263 | 264 | ||
| 264 | #ifdef CONFIG_X86_64 | 265 | /* Lots of programs expect an all-zero user_desc to mean "no segment at all". */ |
| 265 | #define LDT_empty(info) (_LDT_empty(info) && ((info)->lm == 0)) | 266 | static inline bool LDT_zero(const struct user_desc *info) |
| 266 | #else | 267 | { |
| 267 | #define LDT_empty(info) (_LDT_empty(info)) | 268 | return (info->base_addr == 0 && |
| 268 | #endif | 269 | info->limit == 0 && |
| 270 | info->contents == 0 && | ||
| 271 | info->read_exec_only == 0 && | ||
| 272 | info->seg_32bit == 0 && | ||
| 273 | info->limit_in_pages == 0 && | ||
| 274 | info->seg_not_present == 0 && | ||
| 275 | info->useable == 0); | ||
| 276 | } | ||
| 269 | 277 | ||
| 270 | static inline void clear_LDT(void) | 278 | static inline void clear_LDT(void) |
| 271 | { | 279 | { |
diff --git a/arch/x86/include/asm/mmu_context.h b/arch/x86/include/asm/mmu_context.h index 40269a2bf6f9..4b75d591eb5e 100644 --- a/arch/x86/include/asm/mmu_context.h +++ b/arch/x86/include/asm/mmu_context.h | |||
| @@ -130,7 +130,25 @@ static inline void arch_bprm_mm_init(struct mm_struct *mm, | |||
| 130 | static inline void arch_unmap(struct mm_struct *mm, struct vm_area_struct *vma, | 130 | static inline void arch_unmap(struct mm_struct *mm, struct vm_area_struct *vma, |
| 131 | unsigned long start, unsigned long end) | 131 | unsigned long start, unsigned long end) |
| 132 | { | 132 | { |
| 133 | mpx_notify_unmap(mm, vma, start, end); | 133 | /* |
| 134 | * mpx_notify_unmap() goes and reads a rarely-hot | ||
| 135 | * cacheline in the mm_struct. That can be expensive | ||
| 136 | * enough to be seen in profiles. | ||
| 137 | * | ||
| 138 | * The mpx_notify_unmap() call and its contents have been | ||
| 139 | * observed to affect munmap() performance on hardware | ||
| 140 | * where MPX is not present. | ||
| 141 | * | ||
| 142 | * The unlikely() optimizes for the fast case: no MPX | ||
| 143 | * in the CPU, or no MPX use in the process. Even if | ||
| 144 | * we get this wrong (in the unlikely event that MPX | ||
| 145 | * is widely enabled on some system) the overhead of | ||
| 146 | * MPX itself (reading bounds tables) is expected to | ||
| 147 | * overwhelm the overhead of getting this unlikely() | ||
| 148 | * consistently wrong. | ||
| 149 | */ | ||
| 150 | if (unlikely(cpu_feature_enabled(X86_FEATURE_MPX))) | ||
| 151 | mpx_notify_unmap(mm, vma, start, end); | ||
| 134 | } | 152 | } |
| 135 | 153 | ||
| 136 | #endif /* _ASM_X86_MMU_CONTEXT_H */ | 154 | #endif /* _ASM_X86_MMU_CONTEXT_H */ |
diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c index d1626364a28a..b9e30daa0881 100644 --- a/arch/x86/kernel/acpi/boot.c +++ b/arch/x86/kernel/acpi/boot.c | |||
| @@ -611,20 +611,20 @@ void __init acpi_pic_sci_set_trigger(unsigned int irq, u16 trigger) | |||
| 611 | 611 | ||
| 612 | int acpi_gsi_to_irq(u32 gsi, unsigned int *irqp) | 612 | int acpi_gsi_to_irq(u32 gsi, unsigned int *irqp) |
| 613 | { | 613 | { |
| 614 | int irq; | 614 | int rc, irq, trigger, polarity; |
| 615 | 615 | ||
| 616 | if (acpi_irq_model == ACPI_IRQ_MODEL_PIC) { | 616 | rc = acpi_get_override_irq(gsi, &trigger, &polarity); |
| 617 | *irqp = gsi; | 617 | if (rc == 0) { |
| 618 | } else { | 618 | trigger = trigger ? ACPI_LEVEL_SENSITIVE : ACPI_EDGE_SENSITIVE; |
| 619 | mutex_lock(&acpi_ioapic_lock); | 619 | polarity = polarity ? ACPI_ACTIVE_LOW : ACPI_ACTIVE_HIGH; |
| 620 | irq = mp_map_gsi_to_irq(gsi, | 620 | irq = acpi_register_gsi(NULL, gsi, trigger, polarity); |
| 621 | IOAPIC_MAP_ALLOC | IOAPIC_MAP_CHECK); | 621 | if (irq >= 0) { |
| 622 | mutex_unlock(&acpi_ioapic_lock); | 622 | *irqp = irq; |
| 623 | if (irq < 0) | 623 | return 0; |
| 624 | return -1; | 624 | } |
| 625 | *irqp = irq; | ||
| 626 | } | 625 | } |
| 627 | return 0; | 626 | |
| 627 | return -1; | ||
| 628 | } | 628 | } |
| 629 | EXPORT_SYMBOL_GPL(acpi_gsi_to_irq); | 629 | EXPORT_SYMBOL_GPL(acpi_gsi_to_irq); |
| 630 | 630 | ||
diff --git a/arch/x86/kernel/cpu/mshyperv.c b/arch/x86/kernel/cpu/mshyperv.c index a450373e8e91..939155ffdece 100644 --- a/arch/x86/kernel/cpu/mshyperv.c +++ b/arch/x86/kernel/cpu/mshyperv.c | |||
| @@ -107,6 +107,7 @@ static struct clocksource hyperv_cs = { | |||
| 107 | .rating = 400, /* use this when running on Hyperv*/ | 107 | .rating = 400, /* use this when running on Hyperv*/ |
| 108 | .read = read_hv_clock, | 108 | .read = read_hv_clock, |
| 109 | .mask = CLOCKSOURCE_MASK(64), | 109 | .mask = CLOCKSOURCE_MASK(64), |
| 110 | .flags = CLOCK_SOURCE_IS_CONTINUOUS, | ||
| 110 | }; | 111 | }; |
| 111 | 112 | ||
| 112 | static void __init ms_hyperv_init_platform(void) | 113 | static void __init ms_hyperv_init_platform(void) |
diff --git a/arch/x86/kernel/cpu/perf_event_intel_ds.c b/arch/x86/kernel/cpu/perf_event_intel_ds.c index 3c895d480cd7..073983398364 100644 --- a/arch/x86/kernel/cpu/perf_event_intel_ds.c +++ b/arch/x86/kernel/cpu/perf_event_intel_ds.c | |||
| @@ -568,8 +568,8 @@ struct event_constraint intel_atom_pebs_event_constraints[] = { | |||
| 568 | }; | 568 | }; |
| 569 | 569 | ||
| 570 | struct event_constraint intel_slm_pebs_event_constraints[] = { | 570 | struct event_constraint intel_slm_pebs_event_constraints[] = { |
| 571 | /* UOPS_RETIRED.ALL, inv=1, cmask=16 (cycles:p). */ | 571 | /* INST_RETIRED.ANY_P, inv=1, cmask=16 (cycles:p). */ |
| 572 | INTEL_FLAGS_EVENT_CONSTRAINT(0x108001c2, 0xf), | 572 | INTEL_FLAGS_EVENT_CONSTRAINT(0x108000c0, 0x1), |
| 573 | /* Allow all events as PEBS with no flags */ | 573 | /* Allow all events as PEBS with no flags */ |
| 574 | INTEL_ALL_EVENT_CONSTRAINT(0, 0x1), | 574 | INTEL_ALL_EVENT_CONSTRAINT(0, 0x1), |
| 575 | EVENT_CONSTRAINT_END | 575 | EVENT_CONSTRAINT_END |
diff --git a/arch/x86/kernel/cpu/perf_event_intel_rapl.c b/arch/x86/kernel/cpu/perf_event_intel_rapl.c index 673f930c700f..6e434f8e5fc8 100644 --- a/arch/x86/kernel/cpu/perf_event_intel_rapl.c +++ b/arch/x86/kernel/cpu/perf_event_intel_rapl.c | |||
| @@ -103,6 +103,13 @@ static struct kobj_attribute format_attr_##_var = \ | |||
| 103 | 103 | ||
| 104 | #define RAPL_CNTR_WIDTH 32 /* 32-bit rapl counters */ | 104 | #define RAPL_CNTR_WIDTH 32 /* 32-bit rapl counters */ |
| 105 | 105 | ||
| 106 | #define RAPL_EVENT_ATTR_STR(_name, v, str) \ | ||
| 107 | static struct perf_pmu_events_attr event_attr_##v = { \ | ||
| 108 | .attr = __ATTR(_name, 0444, rapl_sysfs_show, NULL), \ | ||
| 109 | .id = 0, \ | ||
| 110 | .event_str = str, \ | ||
| 111 | }; | ||
| 112 | |||
| 106 | struct rapl_pmu { | 113 | struct rapl_pmu { |
| 107 | spinlock_t lock; | 114 | spinlock_t lock; |
| 108 | int hw_unit; /* 1/2^hw_unit Joule */ | 115 | int hw_unit; /* 1/2^hw_unit Joule */ |
| @@ -379,23 +386,36 @@ static struct attribute_group rapl_pmu_attr_group = { | |||
| 379 | .attrs = rapl_pmu_attrs, | 386 | .attrs = rapl_pmu_attrs, |
| 380 | }; | 387 | }; |
| 381 | 388 | ||
| 382 | EVENT_ATTR_STR(energy-cores, rapl_cores, "event=0x01"); | 389 | static ssize_t rapl_sysfs_show(struct device *dev, |
| 383 | EVENT_ATTR_STR(energy-pkg , rapl_pkg, "event=0x02"); | 390 | struct device_attribute *attr, |
| 384 | EVENT_ATTR_STR(energy-ram , rapl_ram, "event=0x03"); | 391 | char *page) |
| 385 | EVENT_ATTR_STR(energy-gpu , rapl_gpu, "event=0x04"); | 392 | { |
| 393 | struct perf_pmu_events_attr *pmu_attr = \ | ||
| 394 | container_of(attr, struct perf_pmu_events_attr, attr); | ||
| 395 | |||
| 396 | if (pmu_attr->event_str) | ||
| 397 | return sprintf(page, "%s", pmu_attr->event_str); | ||
| 398 | |||
| 399 | return 0; | ||
| 400 | } | ||
| 401 | |||
| 402 | RAPL_EVENT_ATTR_STR(energy-cores, rapl_cores, "event=0x01"); | ||
| 403 | RAPL_EVENT_ATTR_STR(energy-pkg , rapl_pkg, "event=0x02"); | ||
| 404 | RAPL_EVENT_ATTR_STR(energy-ram , rapl_ram, "event=0x03"); | ||
| 405 | RAPL_EVENT_ATTR_STR(energy-gpu , rapl_gpu, "event=0x04"); | ||
| 386 | 406 | ||
| 387 | EVENT_ATTR_STR(energy-cores.unit, rapl_cores_unit, "Joules"); | 407 | RAPL_EVENT_ATTR_STR(energy-cores.unit, rapl_cores_unit, "Joules"); |
| 388 | EVENT_ATTR_STR(energy-pkg.unit , rapl_pkg_unit, "Joules"); | 408 | RAPL_EVENT_ATTR_STR(energy-pkg.unit , rapl_pkg_unit, "Joules"); |
| 389 | EVENT_ATTR_STR(energy-ram.unit , rapl_ram_unit, "Joules"); | 409 | RAPL_EVENT_ATTR_STR(energy-ram.unit , rapl_ram_unit, "Joules"); |
| 390 | EVENT_ATTR_STR(energy-gpu.unit , rapl_gpu_unit, "Joules"); | 410 | RAPL_EVENT_ATTR_STR(energy-gpu.unit , rapl_gpu_unit, "Joules"); |
| 391 | 411 | ||
| 392 | /* | 412 | /* |
| 393 | * we compute in 0.23 nJ increments regardless of MSR | 413 | * we compute in 0.23 nJ increments regardless of MSR |
| 394 | */ | 414 | */ |
| 395 | EVENT_ATTR_STR(energy-cores.scale, rapl_cores_scale, "2.3283064365386962890625e-10"); | 415 | RAPL_EVENT_ATTR_STR(energy-cores.scale, rapl_cores_scale, "2.3283064365386962890625e-10"); |
| 396 | EVENT_ATTR_STR(energy-pkg.scale, rapl_pkg_scale, "2.3283064365386962890625e-10"); | 416 | RAPL_EVENT_ATTR_STR(energy-pkg.scale, rapl_pkg_scale, "2.3283064365386962890625e-10"); |
| 397 | EVENT_ATTR_STR(energy-ram.scale, rapl_ram_scale, "2.3283064365386962890625e-10"); | 417 | RAPL_EVENT_ATTR_STR(energy-ram.scale, rapl_ram_scale, "2.3283064365386962890625e-10"); |
| 398 | EVENT_ATTR_STR(energy-gpu.scale, rapl_gpu_scale, "2.3283064365386962890625e-10"); | 418 | RAPL_EVENT_ATTR_STR(energy-gpu.scale, rapl_gpu_scale, "2.3283064365386962890625e-10"); |
| 399 | 419 | ||
| 400 | static struct attribute *rapl_events_srv_attr[] = { | 420 | static struct attribute *rapl_events_srv_attr[] = { |
| 401 | EVENT_PTR(rapl_cores), | 421 | EVENT_PTR(rapl_cores), |
diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c index 6307a0f0cf17..705ef8d48e2d 100644 --- a/arch/x86/kernel/irq.c +++ b/arch/x86/kernel/irq.c | |||
| @@ -127,7 +127,7 @@ int arch_show_interrupts(struct seq_file *p, int prec) | |||
| 127 | seq_puts(p, " Machine check polls\n"); | 127 | seq_puts(p, " Machine check polls\n"); |
| 128 | #endif | 128 | #endif |
| 129 | #if IS_ENABLED(CONFIG_HYPERV) || defined(CONFIG_XEN) | 129 | #if IS_ENABLED(CONFIG_HYPERV) || defined(CONFIG_XEN) |
| 130 | seq_printf(p, "%*s: ", prec, "THR"); | 130 | seq_printf(p, "%*s: ", prec, "HYP"); |
| 131 | for_each_online_cpu(j) | 131 | for_each_online_cpu(j) |
| 132 | seq_printf(p, "%10u ", irq_stats(j)->irq_hv_callback_count); | 132 | seq_printf(p, "%10u ", irq_stats(j)->irq_hv_callback_count); |
| 133 | seq_puts(p, " Hypervisor callback interrupts\n"); | 133 | seq_puts(p, " Hypervisor callback interrupts\n"); |
diff --git a/arch/x86/kernel/kprobes/core.c b/arch/x86/kernel/kprobes/core.c index f7e3cd50ece0..98f654d466e5 100644 --- a/arch/x86/kernel/kprobes/core.c +++ b/arch/x86/kernel/kprobes/core.c | |||
| @@ -1020,6 +1020,15 @@ int setjmp_pre_handler(struct kprobe *p, struct pt_regs *regs) | |||
| 1020 | regs->flags &= ~X86_EFLAGS_IF; | 1020 | regs->flags &= ~X86_EFLAGS_IF; |
| 1021 | trace_hardirqs_off(); | 1021 | trace_hardirqs_off(); |
| 1022 | regs->ip = (unsigned long)(jp->entry); | 1022 | regs->ip = (unsigned long)(jp->entry); |
| 1023 | |||
| 1024 | /* | ||
| 1025 | * jprobes use jprobe_return() which skips the normal return | ||
| 1026 | * path of the function, and this messes up the accounting of the | ||
| 1027 | * function graph tracer to get messed up. | ||
| 1028 | * | ||
| 1029 | * Pause function graph tracing while performing the jprobe function. | ||
| 1030 | */ | ||
| 1031 | pause_graph_tracing(); | ||
| 1023 | return 1; | 1032 | return 1; |
| 1024 | } | 1033 | } |
| 1025 | NOKPROBE_SYMBOL(setjmp_pre_handler); | 1034 | NOKPROBE_SYMBOL(setjmp_pre_handler); |
| @@ -1048,24 +1057,25 @@ int longjmp_break_handler(struct kprobe *p, struct pt_regs *regs) | |||
| 1048 | struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); | 1057 | struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); |
| 1049 | u8 *addr = (u8 *) (regs->ip - 1); | 1058 | u8 *addr = (u8 *) (regs->ip - 1); |
| 1050 | struct jprobe *jp = container_of(p, struct jprobe, kp); | 1059 | struct jprobe *jp = container_of(p, struct jprobe, kp); |
| 1060 | void *saved_sp = kcb->jprobe_saved_sp; | ||
| 1051 | 1061 | ||
| 1052 | if ((addr > (u8 *) jprobe_return) && | 1062 | if ((addr > (u8 *) jprobe_return) && |
| 1053 | (addr < (u8 *) jprobe_return_end)) { | 1063 | (addr < (u8 *) jprobe_return_end)) { |
| 1054 | if (stack_addr(regs) != kcb->jprobe_saved_sp) { | 1064 | if (stack_addr(regs) != saved_sp) { |
| 1055 | struct pt_regs *saved_regs = &kcb->jprobe_saved_regs; | 1065 | struct pt_regs *saved_regs = &kcb->jprobe_saved_regs; |
| 1056 | printk(KERN_ERR | 1066 | printk(KERN_ERR |
| 1057 | "current sp %p does not match saved sp %p\n", | 1067 | "current sp %p does not match saved sp %p\n", |
| 1058 | stack_addr(regs), kcb->jprobe_saved_sp); | 1068 | stack_addr(regs), saved_sp); |
| 1059 | printk(KERN_ERR "Saved registers for jprobe %p\n", jp); | 1069 | printk(KERN_ERR "Saved registers for jprobe %p\n", jp); |
| 1060 | show_regs(saved_regs); | 1070 | show_regs(saved_regs); |
| 1061 | printk(KERN_ERR "Current registers\n"); | 1071 | printk(KERN_ERR "Current registers\n"); |
| 1062 | show_regs(regs); | 1072 | show_regs(regs); |
| 1063 | BUG(); | 1073 | BUG(); |
| 1064 | } | 1074 | } |
| 1075 | /* It's OK to start function graph tracing again */ | ||
| 1076 | unpause_graph_tracing(); | ||
| 1065 | *regs = kcb->jprobe_saved_regs; | 1077 | *regs = kcb->jprobe_saved_regs; |
| 1066 | memcpy((kprobe_opcode_t *)(kcb->jprobe_saved_sp), | 1078 | memcpy(saved_sp, kcb->jprobes_stack, MIN_STACK_SIZE(saved_sp)); |
| 1067 | kcb->jprobes_stack, | ||
| 1068 | MIN_STACK_SIZE(kcb->jprobe_saved_sp)); | ||
| 1069 | preempt_enable_no_resched(); | 1079 | preempt_enable_no_resched(); |
| 1070 | return 1; | 1080 | return 1; |
| 1071 | } | 1081 | } |
diff --git a/arch/x86/kernel/tls.c b/arch/x86/kernel/tls.c index 4e942f31b1a7..7fc5e843f247 100644 --- a/arch/x86/kernel/tls.c +++ b/arch/x86/kernel/tls.c | |||
| @@ -29,7 +29,28 @@ static int get_free_idx(void) | |||
| 29 | 29 | ||
| 30 | static bool tls_desc_okay(const struct user_desc *info) | 30 | static bool tls_desc_okay(const struct user_desc *info) |
| 31 | { | 31 | { |
| 32 | if (LDT_empty(info)) | 32 | /* |
| 33 | * For historical reasons (i.e. no one ever documented how any | ||
| 34 | * of the segmentation APIs work), user programs can and do | ||
| 35 | * assume that a struct user_desc that's all zeros except for | ||
| 36 | * entry_number means "no segment at all". This never actually | ||
| 37 | * worked. In fact, up to Linux 3.19, a struct user_desc like | ||
| 38 | * this would create a 16-bit read-write segment with base and | ||
| 39 | * limit both equal to zero. | ||
| 40 | * | ||
| 41 | * That was close enough to "no segment at all" until we | ||
| 42 | * hardened this function to disallow 16-bit TLS segments. Fix | ||
| 43 | * it up by interpreting these zeroed segments the way that they | ||
| 44 | * were almost certainly intended to be interpreted. | ||
| 45 | * | ||
| 46 | * The correct way to ask for "no segment at all" is to specify | ||
| 47 | * a user_desc that satisfies LDT_empty. To keep everything | ||
| 48 | * working, we accept both. | ||
| 49 | * | ||
| 50 | * Note that there's a similar kludge in modify_ldt -- look at | ||
| 51 | * the distinction between modes 1 and 0x11. | ||
| 52 | */ | ||
| 53 | if (LDT_empty(info) || LDT_zero(info)) | ||
| 33 | return true; | 54 | return true; |
| 34 | 55 | ||
| 35 | /* | 56 | /* |
| @@ -71,7 +92,7 @@ static void set_tls_desc(struct task_struct *p, int idx, | |||
| 71 | cpu = get_cpu(); | 92 | cpu = get_cpu(); |
| 72 | 93 | ||
| 73 | while (n-- > 0) { | 94 | while (n-- > 0) { |
| 74 | if (LDT_empty(info)) | 95 | if (LDT_empty(info) || LDT_zero(info)) |
| 75 | desc->a = desc->b = 0; | 96 | desc->a = desc->b = 0; |
| 76 | else | 97 | else |
| 77 | fill_ldt(desc, info); | 98 | fill_ldt(desc, info); |
diff --git a/arch/x86/mm/mpx.c b/arch/x86/mm/mpx.c index 67ebf5751222..c439ec478216 100644 --- a/arch/x86/mm/mpx.c +++ b/arch/x86/mm/mpx.c | |||
| @@ -349,6 +349,12 @@ static __user void *task_get_bounds_dir(struct task_struct *tsk) | |||
| 349 | return MPX_INVALID_BOUNDS_DIR; | 349 | return MPX_INVALID_BOUNDS_DIR; |
| 350 | 350 | ||
| 351 | /* | 351 | /* |
| 352 | * 32-bit binaries on 64-bit kernels are currently | ||
| 353 | * unsupported. | ||
| 354 | */ | ||
| 355 | if (IS_ENABLED(CONFIG_X86_64) && test_thread_flag(TIF_IA32)) | ||
| 356 | return MPX_INVALID_BOUNDS_DIR; | ||
| 357 | /* | ||
| 352 | * The bounds directory pointer is stored in a register | 358 | * The bounds directory pointer is stored in a register |
| 353 | * only accessible if we first do an xsave. | 359 | * only accessible if we first do an xsave. |
| 354 | */ | 360 | */ |
diff --git a/arch/x86/mm/pat.c b/arch/x86/mm/pat.c index edf299c8ff6c..7ac68698406c 100644 --- a/arch/x86/mm/pat.c +++ b/arch/x86/mm/pat.c | |||
| @@ -234,8 +234,13 @@ void pat_init(void) | |||
| 234 | PAT(4, WB) | PAT(5, WC) | PAT(6, UC_MINUS) | PAT(7, UC); | 234 | PAT(4, WB) | PAT(5, WC) | PAT(6, UC_MINUS) | PAT(7, UC); |
| 235 | 235 | ||
| 236 | /* Boot CPU check */ | 236 | /* Boot CPU check */ |
| 237 | if (!boot_pat_state) | 237 | if (!boot_pat_state) { |
| 238 | rdmsrl(MSR_IA32_CR_PAT, boot_pat_state); | 238 | rdmsrl(MSR_IA32_CR_PAT, boot_pat_state); |
| 239 | if (!boot_pat_state) { | ||
| 240 | pat_disable("PAT read returns always zero, disabled."); | ||
| 241 | return; | ||
| 242 | } | ||
| 243 | } | ||
| 239 | 244 | ||
| 240 | wrmsrl(MSR_IA32_CR_PAT, pat); | 245 | wrmsrl(MSR_IA32_CR_PAT, pat); |
| 241 | 246 | ||
diff --git a/arch/x86/pci/xen.c b/arch/x86/pci/xen.c index c489ef2c1a39..9098d880c476 100644 --- a/arch/x86/pci/xen.c +++ b/arch/x86/pci/xen.c | |||
| @@ -458,6 +458,7 @@ int __init pci_xen_hvm_init(void) | |||
| 458 | * just how GSIs get registered. | 458 | * just how GSIs get registered. |
| 459 | */ | 459 | */ |
| 460 | __acpi_register_gsi = acpi_register_gsi_xen_hvm; | 460 | __acpi_register_gsi = acpi_register_gsi_xen_hvm; |
| 461 | __acpi_unregister_gsi = NULL; | ||
| 461 | #endif | 462 | #endif |
| 462 | 463 | ||
| 463 | #ifdef CONFIG_PCI_MSI | 464 | #ifdef CONFIG_PCI_MSI |
| @@ -471,52 +472,6 @@ int __init pci_xen_hvm_init(void) | |||
| 471 | } | 472 | } |
| 472 | 473 | ||
| 473 | #ifdef CONFIG_XEN_DOM0 | 474 | #ifdef CONFIG_XEN_DOM0 |
| 474 | static __init void xen_setup_acpi_sci(void) | ||
| 475 | { | ||
| 476 | int rc; | ||
| 477 | int trigger, polarity; | ||
| 478 | int gsi = acpi_sci_override_gsi; | ||
| 479 | int irq = -1; | ||
| 480 | int gsi_override = -1; | ||
| 481 | |||
| 482 | if (!gsi) | ||
| 483 | return; | ||
| 484 | |||
| 485 | rc = acpi_get_override_irq(gsi, &trigger, &polarity); | ||
| 486 | if (rc) { | ||
| 487 | printk(KERN_WARNING "xen: acpi_get_override_irq failed for acpi" | ||
| 488 | " sci, rc=%d\n", rc); | ||
| 489 | return; | ||
| 490 | } | ||
| 491 | trigger = trigger ? ACPI_LEVEL_SENSITIVE : ACPI_EDGE_SENSITIVE; | ||
| 492 | polarity = polarity ? ACPI_ACTIVE_LOW : ACPI_ACTIVE_HIGH; | ||
| 493 | |||
| 494 | printk(KERN_INFO "xen: sci override: global_irq=%d trigger=%d " | ||
| 495 | "polarity=%d\n", gsi, trigger, polarity); | ||
| 496 | |||
| 497 | /* Before we bind the GSI to a Linux IRQ, check whether | ||
| 498 | * we need to override it with bus_irq (IRQ) value. Usually for | ||
| 499 | * IRQs below IRQ_LEGACY_IRQ this holds IRQ == GSI, as so: | ||
| 500 | * ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 low level) | ||
| 501 | * but there are oddballs where the IRQ != GSI: | ||
| 502 | * ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 20 low level) | ||
| 503 | * which ends up being: gsi_to_irq[9] == 20 | ||
| 504 | * (which is what acpi_gsi_to_irq ends up calling when starting the | ||
| 505 | * the ACPI interpreter and keels over since IRQ 9 has not been | ||
| 506 | * setup as we had setup IRQ 20 for it). | ||
| 507 | */ | ||
| 508 | if (acpi_gsi_to_irq(gsi, &irq) == 0) { | ||
| 509 | /* Use the provided value if it's valid. */ | ||
| 510 | if (irq >= 0) | ||
| 511 | gsi_override = irq; | ||
| 512 | } | ||
| 513 | |||
| 514 | gsi = xen_register_gsi(gsi, gsi_override, trigger, polarity); | ||
| 515 | printk(KERN_INFO "xen: acpi sci %d\n", gsi); | ||
| 516 | |||
| 517 | return; | ||
| 518 | } | ||
| 519 | |||
| 520 | int __init pci_xen_initial_domain(void) | 475 | int __init pci_xen_initial_domain(void) |
| 521 | { | 476 | { |
| 522 | int irq; | 477 | int irq; |
| @@ -527,8 +482,8 @@ int __init pci_xen_initial_domain(void) | |||
| 527 | x86_msi.restore_msi_irqs = xen_initdom_restore_msi_irqs; | 482 | x86_msi.restore_msi_irqs = xen_initdom_restore_msi_irqs; |
| 528 | pci_msi_ignore_mask = 1; | 483 | pci_msi_ignore_mask = 1; |
| 529 | #endif | 484 | #endif |
| 530 | xen_setup_acpi_sci(); | ||
| 531 | __acpi_register_gsi = acpi_register_gsi_xen; | 485 | __acpi_register_gsi = acpi_register_gsi_xen; |
| 486 | __acpi_unregister_gsi = NULL; | ||
| 532 | /* Pre-allocate legacy irqs */ | 487 | /* Pre-allocate legacy irqs */ |
| 533 | for (irq = 0; irq < nr_legacy_irqs(); irq++) { | 488 | for (irq = 0; irq < nr_legacy_irqs(); irq++) { |
| 534 | int trigger, polarity; | 489 | int trigger, polarity; |
