jforbes pushed to kernel (f20). "Linux v3.19.3"

notifications at fedoraproject.org notifications at fedoraproject.org
Fri Mar 27 16:29:58 UTC 2015


>From fa02ba3c8d618a327939db8ae3dc8f3282a89351 Mon Sep 17 00:00:00 2001
From: "Justin M. Forbes" <jforbes at redhat.com>
Date: Fri, 27 Mar 2015 11:29:40 -0500
Subject: Linux v3.19.3


diff --git a/Add-sysrq-option-to-disable-secure-boot-mode.patch b/Add-sysrq-option-to-disable-secure-boot-mode.patch
index 414fe6e..67302f2 100644
--- a/Add-sysrq-option-to-disable-secure-boot-mode.patch
+++ b/Add-sysrq-option-to-disable-secure-boot-mode.patch
@@ -15,7 +15,7 @@ Upstream-status: Fedora mustard
  7 files changed, 65 insertions(+), 10 deletions(-)
 
 diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
-index fb282ff6a802..d291d16ba257 100644
+index b40d6174242f..0ee7749bad74 100644
 --- a/arch/x86/kernel/setup.c
 +++ b/arch/x86/kernel/setup.c
 @@ -70,6 +70,11 @@
@@ -30,7 +30,7 @@ index fb282ff6a802..d291d16ba257 100644
  #include <video/edid.h>
  
  #include <asm/mtrr.h>
-@@ -1268,6 +1273,37 @@ void __init i386_reserve_resources(void)
+@@ -1277,6 +1282,37 @@ void __init i386_reserve_resources(void)
  
  #endif /* CONFIG_X86_32 */
  
@@ -215,23 +215,23 @@ index 387fa7d05c98..4b07e30b3279 100644
  int unregister_sysrq_key(int key, struct sysrq_key_op *op);
  struct sysrq_key_op *__sysrq_get_key_op(int key);
 diff --git a/kernel/debug/kdb/kdb_main.c b/kernel/debug/kdb/kdb_main.c
-index 379650b984f8..070f29fefdc2 100644
+index 60f6bb817f70..c0a20ee0ad96 100644
 --- a/kernel/debug/kdb/kdb_main.c
 +++ b/kernel/debug/kdb/kdb_main.c
-@@ -1924,7 +1924,7 @@ static int kdb_sr(int argc, const char **argv)
- 	if (argc != 1)
+@@ -1968,7 +1968,7 @@ static int kdb_sr(int argc, const char **argv)
  		return KDB_ARGCOUNT;
+ 
  	kdb_trap_printk++;
--	__handle_sysrq(*argv[1], false);
-+	__handle_sysrq(*argv[1], SYSRQ_FROM_KERNEL);
+-	__handle_sysrq(*argv[1], check_mask);
++	__handle_sysrq(*argv[1], check_mask & SYSRQ_FROM_KERNEL);
  	kdb_trap_printk--;
  
  	return 0;
 diff --git a/kernel/module.c b/kernel/module.c
-index 866417ecc76a..d7ca95c5a349 100644
+index 6244f24abe27..b77554170d76 100644
 --- a/kernel/module.c
 +++ b/kernel/module.c
-@@ -108,9 +108,9 @@ struct list_head *kdb_modules = &modules; /* kdb needs the list of modules */
+@@ -107,9 +107,9 @@ struct list_head *kdb_modules = &modules; /* kdb needs the list of modules */
  
  #ifdef CONFIG_MODULE_SIG
  #ifdef CONFIG_MODULE_SIG_FORCE
@@ -244,5 +244,5 @@ index 866417ecc76a..d7ca95c5a349 100644
  static int param_set_bool_enable_only(const char *val,
  				      const struct kernel_param *kp)
 -- 
-1.9.3
+2.1.0
 
diff --git a/HID-add-support-for-MS-Surface-Pro-3-Type-Cover.patch b/HID-add-support-for-MS-Surface-Pro-3-Type-Cover.patch
deleted file mode 100644
index b427661..0000000
--- a/HID-add-support-for-MS-Surface-Pro-3-Type-Cover.patch
+++ /dev/null
@@ -1,84 +0,0 @@
-From: Alan Wu <alan.c.wu at gmail.com>
-Date: Mon, 3 Nov 2014 18:26:12 -0800
-Subject: [PATCH] HID: add support for MS Surface Pro 3 Type Cover
-
-Surface Pro 3 Type Cover that works with Ubuntu (and possibly Arch) from this thread. Both trackpad and keyboard work after compiling my own kernel.
-http://ubuntuforums.org/showthread.php?t=2231207&page=2&s=44910e0c56047e4f93dfd9fea58121ef
-
-Also includes Jarrad Whitaker's message which sources
-http://winaero.com/blog/how-to-install-linux-on-surface-pro-3/
-which he says is sourced from a Russian site
-
-Signed-off-by: Alan Wu <alan.c.wu at gmail.com>
-Signed-off-by: Jiri Kosina <jkosina at suse.cz>
----
- drivers/hid/hid-core.c          | 6 ++++++
- drivers/hid/hid-ids.h           | 1 +
- drivers/hid/hid-microsoft.c     | 2 ++
- drivers/hid/usbhid/hid-quirks.c | 1 +
- 4 files changed, 10 insertions(+)
-
-diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
-index 73bd9e2e42bc..e94afcc19eda 100644
---- a/drivers/hid/hid-core.c
-+++ b/drivers/hid/hid-core.c
-@@ -702,6 +702,11 @@ static void hid_scan_collection(struct hid_parser *parser, unsigned type)
- 	if (((parser->global.usage_page << 16) == HID_UP_SENSOR) &&
- 	    type == HID_COLLECTION_PHYSICAL)
- 		hid->group = HID_GROUP_SENSOR_HUB;
-+
-+	if (hid->vendor == USB_VENDOR_ID_MICROSOFT &&
-+	    hid->product == USB_DEVICE_ID_MS_TYPE_COVER_3 &&
-+	    hid->group == HID_GROUP_MULTITOUCH)
-+		hid->group = HID_GROUP_GENERIC;
- }
- 
- static int hid_scan_main(struct hid_parser *parser, struct hid_item *item)
-@@ -1861,6 +1866,7 @@ static const struct hid_device_id hid_have_special_driver[] = {
- 	{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_DIGITAL_MEDIA_3K) },
- 	{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_WIRELESS_OPTICAL_DESKTOP_3_0) },
- 	{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_OFFICE_KB) },
-+	{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_3) },
- 	{ HID_USB_DEVICE(USB_VENDOR_ID_MONTEREY, USB_DEVICE_ID_GENIUS_KB29E) },
- 	{ HID_USB_DEVICE(USB_VENDOR_ID_MSI, USB_DEVICE_ID_MSI_GT683R_LED_PANEL) },
- 	{ HID_USB_DEVICE(USB_VENDOR_ID_NTRIG, USB_DEVICE_ID_NTRIG_TOUCH_SCREEN) },
-diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
-index e23ab8b30626..15f32c22178c 100644
---- a/drivers/hid/hid-ids.h
-+++ b/drivers/hid/hid-ids.h
-@@ -648,6 +648,7 @@
- #define USB_DEVICE_ID_MS_SURFACE_PRO_2   0x0799
- #define USB_DEVICE_ID_MS_TOUCH_COVER_2   0x07a7
- #define USB_DEVICE_ID_MS_TYPE_COVER_2    0x07a9
-+#define USB_DEVICE_ID_MS_TYPE_COVER_3    0x07dc
- 
- #define USB_VENDOR_ID_MOJO		0x8282
- #define USB_DEVICE_ID_RETRO_ADAPTER	0x3201
-diff --git a/drivers/hid/hid-microsoft.c b/drivers/hid/hid-microsoft.c
-index 8ba17a946f2a..cacda43f6a6f 100644
---- a/drivers/hid/hid-microsoft.c
-+++ b/drivers/hid/hid-microsoft.c
-@@ -274,6 +274,8 @@ static const struct hid_device_id ms_devices[] = {
- 		.driver_data = MS_NOGET },
- 	{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_COMFORT_MOUSE_4500),
- 		.driver_data = MS_DUPLICATE_USAGES },
-+	{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_3),
-+		.driver_data = MS_HIDINPUT },
- 
- 	{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_PRESENTER_8K_BT),
- 		.driver_data = MS_PRESENTER },
-diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c
-index 5014bb567b29..cebfaf288bd3 100644
---- a/drivers/hid/usbhid/hid-quirks.c
-+++ b/drivers/hid/usbhid/hid-quirks.c
-@@ -77,6 +77,7 @@ static const struct hid_blacklist {
- 	{ USB_VENDOR_ID_FORMOSA, USB_DEVICE_ID_FORMOSA_IR_RECEIVER, HID_QUIRK_NO_INIT_REPORTS },
- 	{ USB_VENDOR_ID_FREESCALE, USB_DEVICE_ID_FREESCALE_MX28, HID_QUIRK_NOGET },
- 	{ USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS, HID_QUIRK_NOGET },
-+	{ USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_3, HID_QUIRK_NO_INIT_REPORTS },
- 	{ USB_VENDOR_ID_MSI, USB_DEVICE_ID_MSI_GT683R_LED_PANEL, HID_QUIRK_NO_INIT_REPORTS },
- 	{ USB_VENDOR_ID_NEXIO, USB_DEVICE_ID_NEXIO_MULTITOUCH_PTI0750, HID_QUIRK_NO_INIT_REPORTS },
- 	{ USB_VENDOR_ID_NOVATEK, USB_DEVICE_ID_NOVATEK_MOUSE, HID_QUIRK_NO_INIT_REPORTS },
--- 
-1.9.3
-
diff --git a/NFS-fix-clp-cl_revoked-list-deletion-causing-softloc.patch b/NFS-fix-clp-cl_revoked-list-deletion-causing-softloc.patch
deleted file mode 100644
index a7067ff..0000000
--- a/NFS-fix-clp-cl_revoked-list-deletion-causing-softloc.patch
+++ /dev/null
@@ -1,35 +0,0 @@
-From: Andrew Elble <aweits at rit.edu>
-Date: Wed, 25 Feb 2015 13:42:55 -0500
-Subject: [PATCH] NFS: fix clp->cl_revoked list deletion causing softlock in
- nfsd
-
-commit 2d4a532d385f ("nfsd: ensure that clp->cl_revoked list is
-protected by clp->cl_lock") removed the use of the reaplist to
-clean out clp->cl_revoked. It failed to change list_entry() to
-walk clp->cl_revoked.next instead of reaplist.next
-
-Fixes: 2d4a532d385f ("nfsd: ensure that clp->cl_revoked list is protected by clp->cl_lock")
-Cc: stable at vger.kernel.org
-Reported-by: Eric Meddaugh <etmsys at rit.edu>
-Tested-by: Eric Meddaugh <etmsys at rit.edu>
-Signed-off-by: Andrew Elble <aweits at rit.edu>
----
- fs/nfsd/nfs4state.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
-index d66e3ad1de48..5c9c13ee72f9 100644
---- a/fs/nfsd/nfs4state.c
-+++ b/fs/nfsd/nfs4state.c
-@@ -1650,7 +1650,7 @@ __destroy_client(struct nfs4_client *clp)
- 		nfs4_put_stid(&dp->dl_stid);
- 	}
- 	while (!list_empty(&clp->cl_revoked)) {
--		dp = list_entry(reaplist.next, struct nfs4_delegation, dl_recall_lru);
-+		dp = list_entry(clp->cl_revoked.next, struct nfs4_delegation, dl_recall_lru);
- 		list_del_init(&dp->dl_recall_lru);
- 		nfs4_put_stid(&dp->dl_stid);
- 	}
--- 
-2.1.0
-
diff --git a/Set-UID-in-sess_auth_rawntlmssp_authenticate-too.patch b/Set-UID-in-sess_auth_rawntlmssp_authenticate-too.patch
deleted file mode 100644
index bc08ddc..0000000
--- a/Set-UID-in-sess_auth_rawntlmssp_authenticate-too.patch
+++ /dev/null
@@ -1,44 +0,0 @@
-From: Sachin Prabhu <sprabhu at redhat.com>
-Date: Wed, 3 Dec 2014 12:26:36 +0000
-Subject: [PATCH] Set UID in sess_auth_rawntlmssp_authenticate too
-
-A user complained that they were unable to login to their cifs share
-after a kernel update. From the wiretrace we can see that the server
-returns different UIDs as response to NTLMSSP_NEGOTIATE and NTLMSSP_AUTH
-phases.
-
-With changes in the authentication code, we no longer set the
-cifs_sess->Suid returned in response to the NTLM_AUTH phase and continue
-to use the UID sent in response to the NTLMSSP_NEGOTIATE phase. This
-results in the server denying access to the user when the user attempts
-to do a tcon connect.
-
-See https://bugzilla.redhat.com/show_bug.cgi?id=1163927
-
-A test kernel containing patch was tested successfully by the user.
-
-Signed-off-by: Sachin Prabhu <sprabhu at redhat.com>
-Signed-off-by: Steve French <steve.french at primarydata.com>
----
- fs/cifs/sess.c | 5 +++++
- 1 file changed, 5 insertions(+)
-
-diff --git a/fs/cifs/sess.c b/fs/cifs/sess.c
-index 57db63ff88da..446cb7fb3f58 100644
---- a/fs/cifs/sess.c
-+++ b/fs/cifs/sess.c
-@@ -1303,6 +1303,11 @@ sess_auth_rawntlmssp_authenticate(struct sess_data *sess_data)
- 	if (le16_to_cpu(pSMB->resp.Action) & GUEST_LOGIN)
- 		cifs_dbg(FYI, "Guest login\n"); /* BB mark SesInfo struct? */
- 
-+	if (ses->Suid != smb_buf->Uid) {
-+		ses->Suid = smb_buf->Uid;
-+		cifs_dbg(FYI, "UID changed! new UID = %llu\n", ses->Suid);
-+	}
-+
- 	bytes_remaining = get_bcc(smb_buf);
- 	bcc_ptr = pByteArea(smb_buf);
- 	blob_len = le16_to_cpu(pSMB->resp.SecurityBlobLength);
--- 
-2.1.0
-
diff --git a/acpi-video-Add-disable_native_backlight-quirk-for-De.patch b/acpi-video-Add-disable_native_backlight-quirk-for-De.patch
deleted file mode 100644
index 6e7ca6e..0000000
--- a/acpi-video-Add-disable_native_backlight-quirk-for-De.patch
+++ /dev/null
@@ -1,38 +0,0 @@
-From: Hans de Goede <hdegoede at redhat.com>
-Date: Fri, 21 Nov 2014 13:39:19 +0100
-Subject: [PATCH] acpi-video: Add disable_native_backlight quirk for Dell XPS15
- L521X
-
-The L521X variant of the Dell XPS15 has integrated nvidia graphics, and
-backlight control does not work properly when using the native interfaces.
-
-BugLink: https://bugzilla.redhat.com/show_bug.cgi?id=1163574
-Signed-off-by: Hans de Goede <hdegoede at redhat.com>
----
- drivers/acpi/video.c | 10 ++++++++++
- 1 file changed, 10 insertions(+)
-
-diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c
-index a3d293806f96..e109b2cfb5b3 100644
---- a/drivers/acpi/video.c
-+++ b/drivers/acpi/video.c
-@@ -769,6 +769,16 @@ static struct dmi_system_id video_dmi_table[] __initdata = {
- 		DMI_MATCH(DMI_PRODUCT_NAME, "HP ENVY 15 Notebook PC"),
- 		},
- 	},
-+
-+	{
-+	 /* https://bugzilla.redhat.com/show_bug.cgi?id=1163574 */
-+	 .callback = video_disable_native_backlight,
-+	 .ident = "Dell XPS15 L521X",
-+	 .matches = {
-+		DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
-+		DMI_MATCH(DMI_PRODUCT_NAME, "XPS L521X"),
-+		},
-+	},
- 	{}
- };
- 
--- 
-2.1.0
-
diff --git a/arm-dts-sun7i-bananapi.patch b/arm-dts-sun7i-bananapi.patch
deleted file mode 100644
index 0628096..0000000
--- a/arm-dts-sun7i-bananapi.patch
+++ /dev/null
@@ -1,213 +0,0 @@
-From: Hans de Goede <hdegoede at redhat.com>
-Date: Tue, 30 Sep 2014 14:29:26 +0100
-Subject: [PATCH] arm: dts sun7i bananapi
-
-The Banana Pi is an A20 based development board using Raspberry Pi compatible
-IO headers. It comes with 1 GB RAM, 1 Gb ethernet, 2x USB host, sata, hdmi
-and stereo audio out + various expenansion headers:
-
-Signed-off-by: Hans de Goede <hdegoede at xxxxxxxxxx>
----
- arch/arm/boot/dts/Makefile               |   1 +
- arch/arm/boot/dts/sun7i-a20-bananapi.dts | 177 +++++++++++++++++++++++++++++++
- 2 files changed, 178 insertions(+)
- create mode 100644 arch/arm/boot/dts/sun7i-a20-bananapi.dts
-
-diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile
-index e6aa6e77a3ec..0e858ebdad9e 100644
---- a/arch/arm/boot/dts/Makefile
-+++ b/arch/arm/boot/dts/Makefile
-@@ -414,6 +414,7 @@ dtb-$(CONFIG_MACH_SUN6I) += \
- 	sun6i-a31-hummingbird.dtb \
- 	sun6i-a31-m9.dtb
- dtb-$(CONFIG_MACH_SUN7I) += \
-+	sun7i-a20-bananapi.dtb \
- 	sun7i-a20-cubieboard2.dtb \
- 	sun7i-a20-cubietruck.dtb \
- 	sun7i-a20-i12-tvbox.dtb \
-diff --git a/arch/arm/boot/dts/sun7i-a20-bananapi.dts b/arch/arm/boot/dts/sun7i-a20-bananapi.dts
-new file mode 100644
-index 000000000000..7214475a3c36
---- /dev/null
-+++ b/arch/arm/boot/dts/sun7i-a20-bananapi.dts
-@@ -0,0 +1,177 @@
-+/*
-+ * Copyright 2014 Hans de Goede <hdegoede at xxxxxxxxxx>
-+ *
-+ * The code contained herein is licensed under the GNU General Public
-+ * License. You may obtain a copy of the GNU General Public License
-+ * Version 2 or later at the following locations:
-+ *
-+ * http://www.opensource.org/licenses/gpl-license.html
-+ * http://www.gnu.org/copyleft/gpl.html
-+ */
-+
-+/dts-v1/;
-+/include/ "sun7i-a20.dtsi"
-+/include/ "sunxi-common-regulators.dtsi"
-+
-+/ {
-+	model = "LeMaker Banana Pi";
-+	compatible = "lemaker,bananapi", "allwinner,sun7i-a20";
-+
-+	soc at 01c00000 {
-+		mmc0: mmc at 01c0f000 {
-+			pinctrl-names = "default";
-+			pinctrl-0 = <&mmc0_pins_a>, <&mmc0_cd_pin_bananapi>;
-+			vmmc-supply = <&reg_vcc3v3>;
-+			bus-width = <4>;
-+			cd-gpios = <&pio 7 10 0>; /* PH10 */
-+			cd-inverted;
-+			status = "okay";
-+		};
-+
-+		usbphy: phy at 01c13400 {
-+			usb1_vbus-supply = <&reg_usb1_vbus>;
-+			usb2_vbus-supply = <&reg_usb2_vbus>;
-+			status = "okay";
-+		};
-+
-+		ehci0: usb at 01c14000 {
-+			status = "okay";
-+		};
-+
-+		ohci0: usb at 01c14400 {
-+			status = "okay";
-+		};
-+
-+		ahci: sata at 01c18000 {
-+			status = "okay";
-+		};
-+
-+		ehci1: usb at 01c1c000 {
-+			status = "okay";
-+		};
-+
-+		ohci1: usb at 01c1c400 {
-+			status = "okay";
-+		};
-+
-+		pinctrl at 01c20800 {
-+			uart3_pins_bananapi: uart3_pin at 0 {
-+				allwinner,pins = "PH0", "PH1";
-+				allwinner,function = "uart3";
-+				allwinner,drive = <0>;
-+				allwinner,pull = <0>;
-+			};
-+
-+			mmc0_cd_pin_bananapi: mmc0_cd_pin at 0 {
-+				allwinner,pins = "PH10";
-+				allwinner,function = "gpio_in";
-+				allwinner,drive = <0>;
-+				allwinner,pull = <1>;
-+			};
-+
-+			gmac_power_pin_bananapi: gmac_power_pin at 0 {
-+				allwinner,pins = "PH23";
-+				allwinner,function = "gpio_out";
-+				allwinner,drive = <0>;
-+				allwinner,pull = <0>;
-+			};
-+
-+			led_pins_bananapi: led_pins at 0 {
-+				allwinner,pins = "PH24";
-+				allwinner,function = "gpio_out";
-+				allwinner,drive = <0>;
-+				allwinner,pull = <0>;
-+			};
-+		};
-+
-+		ir0: ir at 01c21800 {
-+			pinctrl-names = "default";
-+			pinctrl-0 = <&ir0_pins_a>;
-+			status = "okay";
-+		};
-+
-+		uart0: serial at 01c28000 {
-+			pinctrl-names = "default";
-+			pinctrl-0 = <&uart0_pins_a>;
-+			status = "okay";
-+		};
-+
-+		uart3: serial at 01c28c00 {
-+			pinctrl-names = "default";
-+			pinctrl-0 = <&uart3_pins_bananapi>;
-+			status = "okay";
-+		};
-+
-+		uart7: serial at 01c29c00 {
-+			pinctrl-names = "default";
-+			pinctrl-0 = <&uart7_pins_a>;
-+			status = "okay";
-+		};
-+
-+		i2c0: i2c at 01c2ac00 {
-+			pinctrl-names = "default";
-+			pinctrl-0 = <&i2c0_pins_a>;
-+			status = "okay";
-+
-+			axp209: pmic at 34 {
-+				compatible = "x-powers,axp209";
-+				reg = <0x34>;
-+				interrupt-parent = <&nmi_intc>;
-+				interrupts = <0 8>;
-+
-+				interrupt-controller;
-+				#interrupt-cells = <1>;
-+			};
-+		};
-+
-+		i2c2: i2c at 01c2b400 {
-+			pinctrl-names = "default";
-+			pinctrl-0 = <&i2c2_pins_a>;
-+			status = "okay";
-+		};
-+
-+		gmac: ethernet at 01c50000 {
-+			pinctrl-names = "default";
-+			pinctrl-0 = <&gmac_pins_rgmii_a>;
-+			phy = <&phy1>;
-+			phy-mode = "rgmii";
-+			phy-supply = <&reg_gmac_3v3>;
-+			status = "okay";
-+
-+			phy1: ethernet-phy at 1 {
-+				reg = <1>;
-+			};
-+		};
-+	};
-+
-+	leds {
-+		compatible = "gpio-leds";
-+		pinctrl-names = "default";
-+		pinctrl-0 = <&led_pins_bananapi>;
-+
-+		green {
-+			label = "bananapi:green:usr";
-+			gpios = <&pio 7 24 0>;
-+		};
-+	};
-+
-+	reg_usb1_vbus: usb1-vbus {
-+		status = "okay";
-+	};
-+
-+	reg_usb2_vbus: usb2-vbus {
-+		status = "okay";
-+	};
-+
-+	reg_gmac_3v3: gmac-3v3 {
-+		compatible = "regulator-fixed";
-+		pinctrl-names = "default";
-+		pinctrl-0 = <&gmac_power_pin_bananapi>;
-+		regulator-name = "gmac-3v3";
-+		regulator-min-microvolt = <3300000>;
-+		regulator-max-microvolt = <3300000>;
-+		startup-delay-us = <50000>;
-+		enable-active-high;
-+		gpio = <&pio 7 23 0>;
-+	};
-+};
--- 
-1.9.3
-
diff --git a/config-arm-generic b/config-arm-generic
index c0fa94d..c47b3e9 100644
--- a/config-arm-generic
+++ b/config-arm-generic
@@ -25,6 +25,7 @@ CONFIG_RESET_GPIO=y
 
 CONFIG_RCU_FANOUT_LEAF=16
 CONFIG_BACKLIGHT_PWM=m
+CONFIG_BACKLIGHT_GENERIC=m
 CONFIG_INPUT_PWM_BEEPER=m
 CONFIG_ARM_SP805_WATCHDOG=m
 CONFIG_ARM_ARCH_TIMER=y
@@ -40,11 +41,15 @@ CONFIG_HAVE_PERF_USER_STACK_DUMP=y
 
 # ARM AMBA generic HW
 CONFIG_ARM_AMBA=y
+# CONFIG_TEGRA_AHB is not set
 CONFIG_ARM_CCI=y
 CONFIG_ARM_CCN=y
 CONFIG_ARM_DMA_USE_IOMMU=y
 CONFIG_ARM_DMA_IOMMU_ALIGNMENT=8
 CONFIG_ARM_GIC=y
+CONFIG_ARM_GIC_V2M=y
+CONFIG_ARM_GIC_V3=y
+CONFIG_ARM_GIC_V3_ITS=y
 CONFIG_KVM_ARM_VGIC=y
 CONFIG_ARM_GLOBAL_TIMER=y
 CONFIG_ARM_SMMU=y
@@ -79,6 +84,7 @@ CONFIG_POWER_RESET_VERSATILE=y
 CONFIG_DTC=y
 CONFIG_DMA_OF=y
 CONFIG_OF=y
+# CONFIG_OF_UNITTEST is not set
 CONFIG_OF_ADDRESS=y
 CONFIG_OF_DYNAMIC=y
 CONFIG_OF_EARLY_FLATTREE=y
@@ -88,10 +94,12 @@ CONFIG_OF_IOMMU=y
 CONFIG_OF_IRQ=y
 CONFIG_OF_MTD=y
 CONFIG_OF_NET=y
+CONFIG_OF_OVERLAY=y
 CONFIG_OF_PCI_IRQ=m
 CONFIG_OF_PCI=m
 CONFIG_OF_RESERVED_MEM=y
 CONFIG_OF_RESOLVE=y
+CONFIG_PM_GENERIC_DOMAINS_OF=y
 CONFIG_PATA_OF_PLATFORM=m
 # CONFIG_OF_SELFTEST is not set
 CONFIG_SERIAL_OF_PLATFORM=y
@@ -101,6 +109,11 @@ CONFIG_THERMAL_OF=y
 # CONFIG_MDIO_BUS_MUX_GPIO is not set
 # CONFIG_MDIO_BUS_MUX_MMIOREG is not set
 
+# USB
+CONFIG_USB_OHCI_HCD_PLATFORM=m
+CONFIG_USB_EHCI_HCD_PLATFORM=m
+CONFIG_USB_XHCI_PLATFORM=m
+
 # External Connectors
 CONFIG_EXTCON=m
 CONFIG_EXTCON_GPIO=m
@@ -134,6 +147,7 @@ CONFIG_BACKLIGHT_GPIO=m
 CONFIG_POWER_RESET_GPIO=y
 CONFIG_POWER_RESET_GPIO_RESTART=y
 CONFIG_POWER_RESET_RESTART=y
+# CONFIG_GPIO_74XX_MMIO is not set
 
 #i2c
 CONFIG_I2C_ARB_GPIO_CHALLENGE=m
@@ -200,6 +214,8 @@ CONFIG_CMA_AREAS=7
 
 # CONFIG_PATA_PLATFORM is not set
 # CONFIG_USB_ULPI is not set
+# CONFIG_KEYBOARD_OMAP4 is not set
+# CONFIG_PHY_SAMSUNG_USB2 is not set
 
 ### turn off things which make no sense on embedded SoC
 
@@ -260,6 +276,7 @@ CONFIG_CMA_AREAS=7
 # CONFIG_IMX_IPUV3_CORE is not set
 
 # CONFIG_DEBUG_SET_MODULE_RONX is not set
+# CONFIG_CORESIGHT is not set
 
 # CONFIG_LATTICE_ECP3_CONFIG is not set
 # CONFIG_BMP085_SPI is not set
diff --git a/config-arm64 b/config-arm64
index 9fd40b9..1c48624 100644
--- a/config-arm64
+++ b/config-arm64
@@ -8,8 +8,16 @@ CONFIG_SCHED_SMT=y
 
 # arm64 only SoCs
 CONFIG_ARCH_XGENE=y
+CONFIG_ARCH_SEATTLE=y
 # CONFIG_ARCH_THUNDER is not set
 
+# Erratum
+CONFIG_ARM64_ERRATUM_826319=y
+CONFIG_ARM64_ERRATUM_827319=y
+CONFIG_ARM64_ERRATUM_824069=y
+CONFIG_ARM64_ERRATUM_819472=y
+CONFIG_ARM64_ERRATUM_832075=y
+
 # CONFIG_AMBA_PL08X is not set
 CONFIG_ARCH_HAS_HOLES_MEMORYMODEL=y
 CONFIG_ARCH_REQUIRE_GPIOLIB=y
@@ -78,6 +86,7 @@ CONFIG_CRYPTO_AES_ARM64_CE=m
 CONFIG_CRYPTO_AES_ARM64_CE_CCM=m
 CONFIG_CRYPTO_AES_ARM64_CE_BLK=m
 CONFIG_CRYPTO_AES_ARM64_NEON_BLK=m
+CONFIG_CRYPTO_CRC32_ARM64=m
 CONFIG_CRYPTO_DEV_CCP=y
 CONFIG_CRYPTO_DEV_CCP_DD=m
 CONFIG_CRYPTO_DEV_CCP_CRYPTO=m
@@ -112,11 +121,10 @@ CONFIG_HOTPLUG_PCI=y
 # CONFIG_ARM64_RANDOMIZE_TEXT_OFFSET is not set
 
 # CONFIG_PNP_DEBUG_MESSAGES is not set
-CONFIG_NET_SB1000=y
 CONFIG_SBSAUART_TTY=y
 CONFIG_I2C_SCMI=m
 CONFIG_SENSORS_ACPI_POWER=m
-CONFIG_PWM_LPSS=m
+
 CONFIG_ACPI=y
 CONFIG_ACPI_PROCFS_POWER=y
 CONFIG_ACPI_EC_DEBUGFS=y
@@ -128,17 +136,20 @@ CONFIG_ACPI_CONTAINER=y
 CONFIG_ACPI_HED=m
 CONFIG_ACPI_CUSTOM_METHOD=m
 
+CONFIG_NET_SB1000=y
 CONFIG_AMD_XGBE=m
 CONFIG_AMD_XGBE_PHY=m
 # CONFIG_AMD_XGBE_DCB is not set
 
 # CONFIG_IMX_THERMAL is not set
-
-# still? 2014-11-11
-# CONFIG_BPF_JIT is not set
+# CONFIG_MMC_DW is not set
 
 CONFIG_DMI=y
 CONFIG_DMIID=y
 CONFIG_DMI_SYSFS=y
 
 CONFIG_SATA_AHCI_PLATFORM=y
+
+# CONFIG_SND_SOC is not set
+
+# CONFIG_PMIC_OPREGION is not set
diff --git a/config-armv7 b/config-armv7
index 8eb0e1a..c59977a 100644
--- a/config-armv7
+++ b/config-armv7
@@ -4,15 +4,12 @@
 # CONFIG_ARCH_KEYSTONE is not set
 CONFIG_ARCH_MVEBU=y
 CONFIG_ARCH_MXC=y
-# CONFIG_ARCH_OMAP2 is not set
 CONFIG_ARCH_OMAP3=y
 CONFIG_ARCH_OMAP4=y
 CONFIG_ARCH_PICOXCELL=y
 CONFIG_ARCH_QCOM=y
-CONFIG_ARCH_ROCKCHIP=y
 CONFIG_ARCH_TEGRA=y
 CONFIG_ARCH_U8500=y
-# CONFIG_ARCH_VIRT is not set
 CONFIG_ARCH_ZYNQ=y
 
 # These are supported in the LPAE kernel
@@ -80,7 +77,6 @@ CONFIG_SOC_TI81XX=y
 # CONFIG_MACH_CRANEBOARD is not set
 # CONFIG_MACH_DEVKIT8000 is not set
 # CONFIG_MACH_NOKIA_RX51 is not set
-# CONFIG_MACH_OMAP_3430SDP is not set
 # CONFIG_MACH_OMAP_LDP is not set
 # CONFIG_MACH_OMAP3_BEAGLE is not set
 # CONFIG_MACH_OMAP3517EVM is not set
@@ -89,8 +85,6 @@ CONFIG_SOC_TI81XX=y
 # CONFIG_MACH_OMAP3_TORPEDO is not set
 # CONFIG_MACH_OVERO is not set
 # CONFIG_MACH_SBC3530 is not set
-# CONFIG_MACH_TI8168EVM is not set
-# CONFIG_MACH_TI8148EVM is not set
 # CONFIG_MACH_TOUCHBOOK is not set
 
 CONFIG_SOC_HAS_REALTIME_COUNTER=y
@@ -109,14 +103,15 @@ CONFIG_OMAP_PM_NOOP=y
 CONFIG_DMA_OMAP=y
 CONFIG_OMAP_IOMMU=y
 CONFIG_HWSPINLOCK_OMAP=m
-CONFIG_OMAP3_EMU=y
 # CONFIG_OMAP3_SDRC_AC_TIMING is not set
 
 CONFIG_SERIAL_OMAP=y
 CONFIG_SERIAL_OMAP_CONSOLE=y
+CONFIG_SERIAL_8250_OMAP=m
 
 CONFIG_GPIO_TWL4030=m
 CONFIG_GPIO_TWL6040=m
+CONFIG_GPIO_PCF857X=m
 CONFIG_I2C_OMAP=m
 CONFIG_CHARGER_TWL4030=m
 CONFIG_OMAP_WATCHDOG=m
@@ -143,6 +138,7 @@ CONFIG_USB_EHCI_HCD_OMAP=m
 CONFIG_USB_OHCI_HCD_OMAP3=m
 CONFIG_USB_MUSB_AM35X=m
 CONFIG_USB_MUSB_OMAP2PLUS=m
+CONFIG_USB_DWC3_OMAP=m
 CONFIG_MMC_OMAP=m
 CONFIG_MMC_OMAP_HS=y
 CONFIG_RTC_DRV_MAX8907=m
@@ -242,10 +238,10 @@ CONFIG_DISPLAY_PANEL_NEC_NL8048HL11=m
 CONFIG_DISPLAY_PANEL_TPO_TD028TTEC1=m
 
 # Enable V4L2 drivers for OMAP2+
-CONFIG_MEDIA_CONTROLLER=y
 CONFIG_V4L_PLATFORM_DRIVERS=y
 # CONFIG_VIDEO_OMAP2_VOUT is not set
 CONFIG_VIDEO_OMAP3=m
+CONFIG_VIDEO_ADP1653=m
 # CONFIG_VIDEO_OMAP4 is not set
 # The ones below are for TI Davinci
 # CONFIG_VIDEO_DM6446_CCDC is not set
@@ -255,10 +251,9 @@ CONFIG_SND_OMAP_SOC=m
 CONFIG_SND_SOC_I2C_AND_SPI=m
 CONFIG_SND_OMAP_SOC_AM3517EVM=m
 CONFIG_SND_OMAP_SOC_DMIC=m
-CONFIG_SND_OMAP_SOC_HDMI=m
+CONFIG_SND_OMAP_SOC_HDMI_AUDIO=m
 CONFIG_SND_OMAP_SOC_MCBSP=m
 CONFIG_SND_OMAP_SOC_MCPDM=m
-CONFIG_SND_OMAP_SOC_OMAP_HDMI=m
 CONFIG_SND_OMAP_SOC_OMAP_ABE_TWL6040=m
 CONFIG_SND_OMAP_SOC_OMAP_TWL4030=m
 CONFIG_SND_OMAP_SOC_OMAP3_PANDORA=m
@@ -326,6 +321,7 @@ CONFIG_PINCTRL_APQ8084=m
 CONFIG_PINCTRL_IPQ8064=m
 CONFIG_PINCTRL_MSM8960=m
 CONFIG_PINCTRL_MSM8X74=m
+CONFIG_PINCTRL_QCOM_SPMI_PMIC=m
 CONFIG_COMMON_CLK_QCOM=m
 CONFIG_MFD_QCOM_RPM=m
 CONFIG_MFD_PM8921_CORE=m
@@ -352,7 +348,7 @@ CONFIG_PHY_QCOM_APQ8064_SATA=m
 CONFIG_PHY_QCOM_IPQ806X_SATA=m
 CONFIG_USB_DWC3_QCOM=m
 CONFIG_CRYPTO_DEV_QCE=m
-CONFIG_MSM_IOMMU=y
+# CONFIG_MSM_IOMMU is not set
 CONFIG_DRM_MSM=m
 CONFIG_DRM_MSM_FBDEV=y
 CONFIG_USB_EHCI_MSM=m
@@ -363,6 +359,10 @@ CONFIG_INPUT_PMIC8XXX_PWRKEY=m
 CONFIG_RTC_DRV_PM8XXX=m
 # CONFIG_DRM_MSM_REGISTER_LOGGING is not set 
 CONFIG_QCOM_WDT=m
+CONFIG_MFD_SPMI_PMIC=m
+CONFIG_SPMI=m
+CONFIG_SPMI_MSM_PMIC_ARB=m
+CONFIG_QCOM_SPMI_IADC=m
 
 # i.MX
 # CONFIG_MXC_DEBUG_BOARD is not set
@@ -372,8 +372,10 @@ CONFIG_SOC_IMX53=y
 CONFIG_SOC_IMX6Q=y
 CONFIG_SOC_IMX6SL=y
 CONFIG_SOC_IMX6SX=y
+# CONFIG_SOC_LS1021A is not set
 # CONFIG_SOC_VF610 is not set
 CONFIG_ARM_IMX6Q_CPUFREQ=m
+CONFIG_POWER_RESET_IMX=y
 CONFIG_PCI_IMX6=y
 CONFIG_IMX_THERMAL=m
 CONFIG_IMX_SDMA=m
@@ -411,6 +413,7 @@ CONFIG_CRYPTO_DEV_SAHARA=m
 CONFIG_RTC_DRV_SNVS=m
 # CONFIG_FB_MX3 is not set
 # CONFIG_FB_IMX is not set
+# CONFIG_FB_MXS is not set
 
 CONFIG_SND_IMX_SOC=m
 CONFIG_SND_SOC_FSL_ASOC_CARD=m
@@ -459,8 +462,6 @@ CONFIG_DRM_IMX_PARALLEL_DISPLAY=m
 CONFIG_DRM_IMX_TVE=m
 CONFIG_VIDEO_CODA=m
 
-CONFIG_MFD_SYSCON=y
-CONFIG_GPIO_SYSCON=m
 CONFIG_SENSORS_MC13783_ADC=m
 CONFIG_REGULATOR_ANATOP=m
 CONFIG_REGULATOR_MC13783=m
@@ -501,27 +502,13 @@ CONFIG_REGULATOR_DA9055=m
 CONFIG_ARCH_EXYNOS4=y
 CONFIG_SOC_EXYNOS4212=y
 CONFIG_SOC_EXYNOS4412=y
+CONFIG_SOC_EXYNOS4415=y
 CONFIG_ARM_EXYNOS4210_CPUFREQ=y
 CONFIG_ARM_EXYNOS4X12_CPUFREQ=y
 CONFIG_AK8975=m
 CONFIG_CM36651=m
 CONFIG_KEYBOARD_SAMSUNG=m
 
-# Rockchips
-CONFIG_I2C_RK3X=m
-CONFIG_SPI_ROCKCHIP=m
-CONFIG_SND_SOC_ROCKCHIP=m
-CONFIG_PWM_ROCKCHIP=m
-CONFIG_ROCKCHIP_SARADC=m
-CONFIG_ROCKCHIP_IODOMAIN=m
-CONFIG_MMC_DW_ROCKCHIP=m
-CONFIG_EMAC_ROCKCHIP=m
-CONFIG_MFD_RK808=m
-CONFIG_COMMON_CLK_RK808=m
-CONFIG_REGULATOR_RK808=m
-CONFIG_RTC_DRV_HYM8563=m
-CONFIG_ROCKCHIP_SARADC=m
-
 # ST Ericsson
 CONFIG_MACH_HREFV60=y
 CONFIG_MACH_SNOWBALL=y
@@ -615,6 +602,7 @@ CONFIG_SERIAL_XILINX_PS_UART=y
 CONFIG_SERIAL_XILINX_PS_UART_CONSOLE=y
 CONFIG_COMMON_CLK_AXI_CLKGEN=m
 CONFIG_COMMON_CLK_SI570=m
+CONFIG_COMMON_CLK_XLNX_CLKWZRD=m
 CONFIG_ARM_ZYNQ_CPUIDLE=y
 CONFIG_LATTICE_ECP3_CONFIG=m
 CONFIG_NET_VENDOR_XILINX=y
diff --git a/config-armv7-generic b/config-armv7-generic
index dd233a7..0a930f3 100644
--- a/config-armv7-generic
+++ b/config-armv7-generic
@@ -2,8 +2,6 @@
 # Generic ARM config options
 CONFIG_ARM=y
 
-# CONFIG_ARCH_MULTI_V4 is not set
-# CONFIG_ARCH_MULTI_V4T is not set
 # CONFIG_ARCH_MULTI_V6 is not set
 CONFIG_ARCH_MULTI_V7=y
 
@@ -52,10 +50,11 @@ CONFIG_IRQ_CROSSBAR=y
 # Platforms enabled/disabled globally on ARMv7
 CONFIG_ARCH_EXYNOS=y
 CONFIG_ARCH_HIGHBANK=y
+CONFIG_ARCH_ROCKCHIP=y
 CONFIG_ARCH_SUNXI=y
 CONFIG_ARCH_TEGRA=y
-CONFIG_ARCH_VEXPRESS_CA9X4=y
 CONFIG_ARCH_VEXPRESS_CORTEX_A5_A9_ERRATA=y
+CONFIG_ARCH_VIRT=y
 # CONFIG_ARCH_BCM is not set
 # CONFIG_ARCH_BERLIN is not set
 # CONFIG_ARCH_HI3xxx is not set
@@ -113,6 +112,8 @@ CONFIG_SCHED_SMT=y
 
 CONFIG_RCU_FANOUT=32
 
+CONFIG_CHECKPOINT_RESTORE=y
+
 # Power management / thermal / cpu scaling
 CONFIG_CPU_IDLE=y
 # CONFIG_CPU_IDLE_GOV_LADDER is not set
@@ -123,6 +124,7 @@ CONFIG_PM_OPP=y
 CONFIG_ARM_CPU_SUSPEND=y
 CONFIG_ARM_PSCI=y
 CONFIG_THERMAL=y
+CONFIG_CLOCK_THERMAL=y
 CONFIG_CPUFREQ_DT=y
 # CONFIG_ARM_BIG_LITTLE_CPUFREQ is not set
 
@@ -134,6 +136,7 @@ CONFIG_XZ_DEC_ARM=y
 CONFIG_UACCESS_WITH_MEMCPY=y
 
 CONFIG_PCI_HOST_GENERIC=y
+# CONFIG_PCI_LAYERSCAPE is not set
 
 CONFIG_LBDAF=y
 
@@ -160,6 +163,7 @@ CONFIG_PL330_DMA=m
 CONFIG_AMBA_PL08X=y
 CONFIG_GPIO_PL061=y
 CONFIG_PL320_MBOX=y
+CONFIG_SND_ARMAACI=m
 
 # highbank
 CONFIG_EDAC_HIGHBANK_MC=m
@@ -173,12 +177,12 @@ CONFIG_ARM_HIGHBANK_CPUFREQ=m
 # CONFIG_MACH_SUN5I is not set
 CONFIG_MACH_SUN6I=y
 CONFIG_MACH_SUN7I=y
-# CONFIG_MACH_SUN8I is not set
+CONFIG_MACH_SUN8I=y
+# CONFIG_MACH_SUN9I is not set
 CONFIG_DMA_SUN6I=m
 CONFIG_SUNXI_WATCHDOG=m
 CONFIG_NET_VENDOR_ALLWINNER=y
-CONFIG_STMMAC_PLATFORM=y
-CONFIG_DWMAC_SUNXI=y
+CONFIG_STMMAC_PLATFORM=m
 CONFIG_EEPROM_SUNXI_SID=m
 CONFIG_RTC_DRV_SUNXI=m
 CONFIG_PHY_SUN4I_USB=m
@@ -196,6 +200,8 @@ CONFIG_IR_SUNXI=m
 CONFIG_MDIO_SUN4I=m
 CONFIG_SUN4I_EMAC=m
 CONFIG_RTC_DRV_SUN6I=m
+CONFIG_AXP288_ADC=m
+CONFIG_MTD_NAND_SUNXI=m
 
 # Exynos
 CONFIG_ARCH_EXYNOS3=y
@@ -228,6 +234,7 @@ CONFIG_MMC_DW_EXYNOS=m
 CONFIG_EXYNOS_IOMMU=y
 CONFIG_PCI_EXYNOS=y
 CONFIG_PHY_EXYNOS5_USBDRD=m
+CONFIG_PHY_SAMSUNG_USB2=m
 CONFIG_USB_EHCI_EXYNOS=m
 CONFIG_USB_OHCI_EXYNOS=m
 CONFIG_USB_DWC3_EXYNOS=m
@@ -241,10 +248,10 @@ CONFIG_REGULATOR_S2MPS11=m
 CONFIG_REGULATOR_S5M8767=m
 CONFIG_TCG_TIS_I2C_INFINEON=m
 CONFIG_RTC_DRV_S5M=m
+CONFIG_RTC_DRV_S3C=m
 CONFIG_MFD_WM8994=m
 CONFIG_GPIO_WM8994=m
 CONFIG_REGULATOR_WM8994=m
-# CONFIG_RTC_DRV_S3C is not set
 
 CONFIG_EXYNOS_VIDEO=y
 CONFIG_EXYNOS_MIPI_DSI=y
@@ -308,6 +315,25 @@ CONFIG_RTC_DRV_MAX77802=m
 CONFIG_RTC_DRV_RK808=m
 CONFIG_EXTCON_MAX8997=m
 
+# Rockchips
+CONFIG_I2C_RK3X=m
+CONFIG_SPI_ROCKCHIP=m
+CONFIG_PWM_ROCKCHIP=m
+CONFIG_ROCKCHIP_SARADC=m
+CONFIG_ROCKCHIP_IODOMAIN=m
+CONFIG_MMC_DW_ROCKCHIP=m
+CONFIG_EMAC_ROCKCHIP=m
+CONFIG_MFD_RK808=m
+CONFIG_COMMON_CLK_RK808=m
+CONFIG_REGULATOR_RK808=m
+CONFIG_RTC_DRV_HYM8563=m
+CONFIG_ROCKCHIP_SARADC=m
+CONFIG_ROCKCHIP_IOMMU=y
+CONFIG_SND_SOC_ROCKCHIP=m
+CONFIG_SND_SOC_ROCKCHIP_I2S=m
+CONFIG_ROCKCHIP_THERMAL=m
+CONFIG_DRM_ROCKCHIP=m
+
 # Tegra
 CONFIG_ARCH_TEGRA_114_SOC=y
 CONFIG_ARCH_TEGRA_124_SOC=y
@@ -344,6 +370,8 @@ CONFIG_NOUVEAU_PLATFORM_DRIVER=m
 CONFIG_AD525X_DPOT=m
 CONFIG_AD525X_DPOT_I2C=m
 CONFIG_AD525X_DPOT_SPI=m
+CONFIG_TEGRA_SOCTHERM=m
+CONFIG_TEGRA_MC=y
 
 # Jetson TK1
 CONFIG_PINCTRL_AS3722=y
@@ -361,6 +389,7 @@ CONFIG_DRM_PANEL=y
 CONFIG_DRM_PANEL_SIMPLE=m
 CONFIG_DRM_PANEL_LD9040=m
 CONFIG_DRM_PANEL_S6E8AA0=m
+CONFIG_DRM_PANEL_SHARP_LQ101R1SX01=m
 
 # regmap
 CONFIG_REGMAP=y
@@ -370,13 +399,7 @@ CONFIG_REGMAP_SPMI=m
 CONFIG_REGMAP_MMIO=m
 CONFIG_REGMAP_IRQ=y
 
-# Power management
-CONFIG_PM_OPP=y
-CONFIG_ARM_CPU_SUSPEND=y
-
 # usb
-CONFIG_USB_OHCI_HCD_PLATFORM=m
-CONFIG_USB_EHCI_HCD_PLATFORM=m
 # CONFIG_USB_OTG_BLACKLIST_HUB is not set
 CONFIG_USB_ULPI=y
 CONFIG_AX88796=m
@@ -393,6 +416,8 @@ CONFIG_MUSB_PIO_ONLY=y
 CONFIG_USB_MUSB_HDRC=m
 CONFIG_USB_MUSB_DUAL_ROLE=y
 CONFIG_USB_MUSB_DSPS=m
+# CONFIG_USB_MUSB_TUSB6010 is not set
+# CONFIG_USB_MUSB_UX500 is not set
 CONFIG_USB_GPIO_VBUS=m
 CONFIG_USB_CONFIGFS=m
 CONFIG_USB_CONFIGFS_ACM=y
@@ -406,17 +431,21 @@ CONFIG_USB_CONFIGFS_OBEX=y
 CONFIG_USB_CONFIGFS_SERIAL=y
 # CONFIG_USB_CONFIGFS_F_LB_SS is not set
 # CONFIG_USB_CONFIGFS_F_FS is not set
+# CONFIG_USB_CONFIGFS_F_UAC1 is not set
+# CONFIG_USB_CONFIGFS_F_UAC2 is not set
+# CONFIG_USB_CONFIGFS_F_MIDI is not set
+# CONFIG_USB_CONFIGFS_F_HID is not set
 
 # CONFIG_USB_GADGET_DEBUG is not set
 # CONFIG_USB_GADGET_DEBUG_FILES is not set
 # CONFIG_USB_GADGET_DEBUG_FS is not set
 # CONFIG_USB_FUSB300 is not set
-# CONFIG_USB_RENESAS_USBHS is not set
 # CONFIG_USB_FOTG210_UDC is not set
 # CONFIG_USB_R8A66597 is not set
 # CONFIG_USB_PXA27X is not set
 # CONFIG_USB_MV_UDC is not set
 # CONFIG_USB_MV_U3D is not set
+# CONFIG_USB_BDC_UDC is not set
 # CONFIG_USB_M66592 is not set
 # CONFIG_USB_AMD5536UDC is not set
 # CONFIG_USB_NET2272 is not set
@@ -571,96 +600,23 @@ CONFIG_SPI_DW_PCI=m
 # CONFIG_MMC_DW_IDMAC is not set
 # CONFIG_MMC_DW_K3 is not set
 # CONFIG_MMC_QCOM_DML is not set
-# CONFIG_MMC_DW_ROCKCHIP is not set
-CONFIG_USB_DWC2=y
-CONFIG_USB_DWC2_HOST=m
-CONFIG_USB_DWC2_PLATFORM=y
-CONFIG_USB_DWC2_PCI=y
-# CONFIG_USB_DWC2_PERIPHERAL is not set
+CONFIG_USB_DWC2=m
+CONFIG_USB_DWC2_DUAL_ROLE=y
+CONFIG_USB_DWC2_PLATFORM=m
+CONFIG_USB_DWC2_PCI=m
 # CONFIG_USB_DWC2_DEBUG is not set
 # CONFIG_USB_DWC2_TRACK_MISSED_SOFS is not set
 CONFIG_USB_DWC3=m
-CONFIG_USB_DWC3_OMAP=m
+CONFIG_USB_DWC3_DUAL_ROLE=y
 CONFIG_USB_DWC3_PCI=m
 # CONFIG_USB_DWC3_DEBUG is not set
-# CONFIG_USB_DWC3_KEYSTONE is not set
-# CONFIG_USB_DWC3_QCOM is not set
 # CONFIG_DWC3_HOST_USB3_LPM_ENABLE is not set
 CONFIG_DW_WATCHDOG=m
 CONFIG_PCIE_DW=y
 
 # Sound
-CONFIG_SND_SOC=m
-CONFIG_SND_SPI=y
 CONFIG_SND_ARM=y
-CONFIG_SND_ARMAACI=m
-CONFIG_SND_COMPRESS_OFFLOAD=m
-CONFIG_SND_DESIGNWARE_I2S=m
-CONFIG_SND_DMAENGINE_PCM=m
-CONFIG_SND_JACK=y
-CONFIG_SND_SIMPLE_CARD=m
-CONFIG_SND_SOC_ALL_CODECS=m
-CONFIG_SND_SOC_DMIC=m
-CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y
-CONFIG_SND_SOC_HDMI_CODEC=m
-CONFIG_SND_SOC_SPDIF=m
-# CONFIG_SND_SOC_ADAU1701 is not set
-# CONFIG_SND_SOC_AK4104 is not set
-# CONFIG_SND_SOC_AK4554 is not set
-# CONFIG_SND_SOC_AK4642 is not set
-# CONFIG_SND_SOC_AK5386 is not set
-# CONFIG_SND_SOC_CS42L52 is not set
-# CONFIG_SND_SOC_CS42L73 is not set
-# CONFIG_SND_SOC_CS4270 is not set
-# CONFIG_SND_SOC_CS4271 is not set
-# CONFIG_SND_SOC_CS42XX8_I2C is not set
-# CONFIG_SND_SOC_PCM1681 is not set
-# CONFIG_SND_SOC_PCM1792A is not set
-# CONFIG_SND_SOC_PCM512x_I2C is not set
-# CONFIG_SND_SOC_PCM512x_SPI is not set
-# CONFIG_SND_SOC_SGTL5000 is not set
-# CONFIG_SND_SOC_SIRF_AUDIO_CODEC is not set
-# CONFIG_SND_SOC_TAS5086 is not set
-# CONFIG_SND_SOC_TLV320AIC3X is not set
-# CONFIG_SND_SOC_WM8510 is not set
-# CONFIG_SND_SOC_WM8523 is not set
-# CONFIG_SND_SOC_WM8580 is not set
-# CONFIG_SND_SOC_WM8711 is not set
-# CONFIG_SND_SOC_WM8728 is not set
-# CONFIG_SND_SOC_WM8731 is not set
-# CONFIG_SND_SOC_WM8737 is not set
-# CONFIG_SND_SOC_WM8741 is not set
-# CONFIG_SND_SOC_WM8750 is not set
-# CONFIG_SND_SOC_WM8753 is not set
-# CONFIG_SND_SOC_WM8770 is not set
-# CONFIG_SND_SOC_WM8776 is not set
-# CONFIG_SND_SOC_WM8804 is not set
-# CONFIG_SND_SOC_WM8903 is not set
-# CONFIG_SND_SOC_WM8962 is not set
-# CONFIG_SND_SOC_TPA6130A2 is not set
-# CONFIG_SND_SOC_FSL_ASRC is not set
-# CONFIG_SND_SOC_FSL_ESAI is not set
-# CONFIG_SND_SOC_FSL_SAI is not set
-# CONFIG_SND_SOC_FSL_SPDIF is not set
-# CONFIG_SND_SOC_FSL_SSI is not set
-# CONFIG_SND_SOC_IMX_AUDMUX is not set
-# CONFIG_SND_SOC_ALC5623 is not set
-# CONFIG_SND_SOC_CS42L56 is not set
-# CONFIG_SND_SOC_STA350 is not set
-# CONFIG_SND_SOC_CS35L32 is not set
-# CONFIG_SND_SOC_ES8328 is not set
-# CONFIG_SND_SOC_SSM2602_SPI is not set
-# CONFIG_SND_SOC_SSM2602_I2C is not set
-# CONFIG_SND_SOC_SSM4567 is not set
-# CONFIG_SND_SOC_WM8978 is not set
-# CONFIG_SND_ATMEL_SOC is not set
-# CONFIG_SND_SOC_TLV320AIC31XX is not set
-# CONFIG_SND_SOC_TAS2552 is not set
-# CONFIG_SND_SOC_CS4265 is not set
-# CONFIG_SND_SOC_IMX_ES8328 is not set
-# CONFIG_SND_SOC_FSL_ASOC_CARD is not set
-# CONFIG_SND_EDMA_SOC is not set
-# CONFIG_SND_SOC_ROCKCHIP is not set
+CONFIG_SND_SOC_AC97_BUS=y
 
 # Displays
 CONFIG_BACKLIGHT_TPS65217=m
@@ -722,6 +678,7 @@ CONFIG_REGULATOR_DA9211=m
 CONFIG_REGULATOR_ISL9305=m
 CONFIG_REGULATOR_MAX77802=m
 CONFIG_REGULATOR_PWM=m
+CONFIG_SENSORS_LTC2978_REGULATOR=y
 
 CONFIG_POWER_AVS=y
 CONFIG_CHARGER_MANAGER=y
@@ -767,7 +724,7 @@ CONFIG_LCD_HX8357=m
 CONFIG_INPUT_GP2A=m
 CONFIG_INPUT_ARIZONA_HAPTICS=m
 CONFIG_INPUT_MC13783_PWRBUTTON=m
-# CONFIG_INPUT_SOC_BUTTON_ARRAY is not set
+CONFIG_INPUT_SOC_BUTTON_ARRAY=m
 
 CONFIG_TOUCHSCREEN_ADS7846=m
 CONFIG_TOUCHSCREEN_AD7877=m
@@ -780,6 +737,10 @@ CONFIG_LEDS_PWM=m
 CONFIG_LEDS_SYSCON=y
 CONFIG_BMP085_SPI=m
 
+CONFIG_MFD_SYSCON=y
+CONFIG_GPIO_SYSCON=m
+CONFIG_POWER_RESET_SYSCON=y
+
 CONFIG_SRAM=y
 
 # Ethernet
@@ -824,6 +785,7 @@ CONFIG_MFD_CROS_EC_I2C=m
 CONFIG_MFD_CROS_EC_SPI=m
 CONFIG_KEYBOARD_CROS_EC=m
 CONFIG_I2C_CROS_EC_TUNNEL=m
+CONFIG_SND_SOC_TS3A227E=m
 
 # Needs work/investigation
 # CONFIG_ARM_KPROBES_TEST is not set
@@ -845,7 +807,6 @@ CONFIG_I2C_CROS_EC_TUNNEL=m
 # CONFIG_EZX_PCAP is not set
 # CONFIG_CS89x0 is not set
 # CONFIG_DM9000 is not set
-# CONFIG_HW_RANDOM_ATMEL is not set
 # CONFIG_MTD_AFS_PARTS is not set
 # CONFIG_SPI_PXA2XX is not set
 # CONFIG_DEPRECATED_PARAM_STRUCT is not set
@@ -854,6 +815,7 @@ CONFIG_I2C_CROS_EC_TUNNEL=m
 # CONFIG_SERIAL_MAX3100 is not set
 # CONFIG_SERIAL_MAX310X is not set
 # CONFIG_SERIAL_IFX6X60 is not set
+# CONFIG_SERIAL_BCM63XX is not set
 # CONFIG_FB_XILINX is not set
 # CONFIG_BRCMSTB_GISB_ARB is not set
 # CONFIG_SUNGEM is not set
@@ -889,3 +851,4 @@ CONFIG_I2C_CROS_EC_TUNNEL=m
 # CONFIG_OMAP2_DSS_DEBUG is not set
 # CONFIG_CRYPTO_DEV_UX500_DEBUG is not set
 # CONFIG_AB8500_DEBUG is not set
+# CONFIG_ARM_KERNMEM_PERMS is not set
diff --git a/config-armv7-lpae b/config-armv7-lpae
index b08f4da..c42b38c 100644
--- a/config-armv7-lpae
+++ b/config-armv7-lpae
@@ -1,6 +1,5 @@
 # ARM A15 lpae unified arch kernel
 CONFIG_ARCH_KEYSTONE=y
-CONFIG_ARCH_VIRT=y
 
 # CONFIG_ARCH_MVEBU is not set
 # CONFIG_ARCH_MXC is not set
@@ -10,7 +9,6 @@ CONFIG_ARCH_VIRT=y
 # CONFIG_SOC_AM33XX is not set
 # CONFIG_SOC_AM43XX is not set
 # CONFIG_SOC_DRA7XX is not set
-# CONFIG_ARCH_ROCKCHIP is not set
 # CONFIG_ARCH_ZYNQ is not set
 # CONFIG_ARCH_AXXIA is not set
 
@@ -64,6 +62,8 @@ CONFIG_SPI_DAVINCI=m
 CONFIG_TI_DAVINCI_MDIO=m
 CONFIG_KEYSTONE_IRQ=m
 CONFIG_PCI_KEYSTONE=y
+CONFIG_MTD_NAND_DAVINCI=m
+CONFIG_GPIO_SYSCON=m
 
 # Tegra (non A15 device options)
 # CONFIG_ARCH_TEGRA_2x_SOC is not set
diff --git a/config-debug b/config-debug
index 467f33a..fcc5aac 100644
--- a/config-debug
+++ b/config-debug
@@ -35,6 +35,8 @@ CONFIG_ACPI_DEBUG=y
 CONFIG_DEBUG_SG=y
 CONFIG_DEBUG_PI_LIST=y
 
+# CONFIG_PAGE_EXTENSION is not set
+# CONFIG_PAGE_OWNER is not set
 # CONFIG_DEBUG_PAGEALLOC is not set
 
 CONFIG_DEBUG_OBJECTS=y
@@ -45,6 +47,7 @@ CONFIG_DEBUG_OBJECTS_RCU_HEAD=y
 CONFIG_DEBUG_OBJECTS_ENABLE_DEFAULT=1
 
 CONFIG_X86_PTDUMP=y
+CONFIG_ARM64_PTDUMP=y
 CONFIG_EFI_PGT_DUMP=y
 
 CONFIG_CAN_DEBUG_DEVICES=y
@@ -97,6 +100,7 @@ CONFIG_QUOTA_DEBUG=y
 
 CONFIG_KGDB_KDB=y
 CONFIG_KDB_KEYBOARD=y
+CONFIG_KDB_DEFAULT_ENABLE=0x1
 CONFIG_KDB_CONTINUE_CATASTROPHIC=0
 
 CONFIG_DEBUG_OBJECTS_PERCPU_COUNTER=y
diff --git a/config-generic b/config-generic
index 9cac4c4..eb7287b 100644
--- a/config-generic
+++ b/config-generic
@@ -145,6 +145,7 @@ CONFIG_MMC_USHC=m
 CONFIG_MMC_REALTEK_PCI=m
 CONFIG_MMC_REALTEK_USB=m
 CONFIG_MMC_VUB300=m
+CONFIG_MMC_TOSHIBA_PCI=m
 # CONFIG_MMC_SPI is not set
 # CONFIG_MMC_SDHCI_PXAV2 is not set
 # CONFIG_MMC_SDHCI_PXAV3 is not set
@@ -166,6 +167,7 @@ CONFIG_INFINIBAND_SRP=m
 CONFIG_INFINIBAND_SRPT=m
 CONFIG_INFINIBAND_USER_MAD=m
 CONFIG_INFINIBAND_USER_ACCESS=m
+CONFIG_INFINIBAND_ON_DEMAND_PAGING=y
 CONFIG_INFINIBAND_IPATH=m
 CONFIG_INFINIBAND_ISER=m
 CONFIG_INFINIBAND_ISERT=m
@@ -504,6 +506,7 @@ CONFIG_SCSI_BUSLOGIC=m
 CONFIG_SCSI_INITIO=m
 CONFIG_SCSI_FLASHPOINT=y
 CONFIG_SCSI_DMX3191D=m
+CONFIG_SCSI_AM53C974=m
 # CONFIG_SCSI_EATA is not set
 # CONFIG_SCSI_EATA_PIO is not set
 # CONFIG_SCSI_FUTURE_DOMAIN is not set
@@ -524,6 +527,7 @@ CONFIG_SCSI_SYM53C8XX_MMIO=y
 CONFIG_SCSI_QLOGIC_1280=m
 CONFIG_SCSI_DC395x=m
 # CONFIG_SCSI_NSP32 is not set
+CONFIG_SCSI_WD719X=m
 CONFIG_SCSI_DEBUG=m
 CONFIG_SCSI_DC390T=m
 CONFIG_SCSI_QLA_FC=m
@@ -561,7 +565,6 @@ CONFIG_SATA_NV=m
 CONFIG_SATA_PMP=y
 CONFIG_SATA_PROMISE=m
 CONFIG_SATA_QSTOR=m
-# CONFIG_SATA_RCAR is not set
 CONFIG_SATA_SIL=m
 CONFIG_SATA_SIL24=m
 CONFIG_SATA_SIS=m
@@ -761,6 +764,7 @@ CONFIG_IP_PIMSM_V2=y
 CONFIG_SYN_COOKIES=y
 CONFIG_NET_IPVTI=m
 CONFIG_NET_FOU=m
+CONFIG_NET_FOU_IP_TUNNELS=y
 CONFIG_GENEVE=m
 CONFIG_INET_AH=m
 CONFIG_INET_ESP=m
@@ -1027,6 +1031,9 @@ CONFIG_NFT_MASQ_IPV4=m
 CONFIG_NFT_MASQ_IPV6=m
 CONFIG_NFT_NAT=m
 CONFIG_NFT_QUEUE=m
+CONFIG_NFT_REDIR=m
+CONFIG_NFT_REDIR_IPV4=m
+CONFIG_NFT_REDIR_IPV6=m
 CONFIG_NFT_REJECT=m
 CONFIG_NFT_COMPAT=m
 
@@ -1204,6 +1211,7 @@ CONFIG_NET_ACT_PEDIT=m
 CONFIG_NET_ACT_POLICE=m
 CONFIG_NET_ACT_SIMP=m
 CONFIG_NET_ACT_SKBEDIT=m
+CONFIG_NET_ACT_VLAN=m
 
 CONFIG_DCB=y
 CONFIG_DNS_RESOLVER=m
@@ -1246,6 +1254,7 @@ CONFIG_DUMMY=m
 CONFIG_BONDING=m
 CONFIG_MACVLAN=m
 CONFIG_MACVTAP=m
+CONFIG_IPVLAN=m
 CONFIG_VXLAN=m
 CONFIG_EQUALIZER=m
 CONFIG_TUN=m
@@ -1414,7 +1423,7 @@ CONFIG_IXGBE_DCA=y
 CONFIG_IXGBE_DCB=y
 CONFIG_IXGBE_HWMON=y
 CONFIG_I40E=m
-# CONFIG_I40E_VXLAN is not set
+CONFIG_I40E_VXLAN=y
 # CONFIG_I40E_DCB is not set
 # CONFIG_I40E_FCOE is not set
 CONFIG_I40EVF=m
@@ -1488,6 +1497,9 @@ CONFIG_SH_ETH=m
 CONFIG_NET_VENDOR_RDC=y
 CONFIG_R6040=m
 
+CONFIG_NET_VENDOR_ROCKER=y
+CONFIG_ROCKER=m
+
 # CONFIG_NET_VENDOR_SEEQ is not set
 # CONFIG_NET_VENDOR_SAMSUNG is not set
 
@@ -1560,8 +1572,6 @@ CONFIG_STE10XP=m
 CONFIG_VITESSE_PHY=m
 CONFIG_MICREL_PHY=m
 # CONFIG_MICREL_KS8995MA is not set
-# CONFIG_OMAP_CONTROL_PHY is not set
-# CONFIG_PHY_SAMSUNG_USB2 is not set
 
 CONFIG_MII=m
 CONFIG_NET_CORE=y
@@ -1570,7 +1580,6 @@ CONFIG_VORTEX=m
 CONFIG_TYPHOON=m
 CONFIG_DNET=m
 
-
 CONFIG_B44=m
 CONFIG_B44_PCI=y
 CONFIG_BCMGENET=m
@@ -1833,15 +1842,16 @@ CONFIG_MWIFIEX_USB=m
 CONFIG_IEEE802154=m
 CONFIG_IEEE802154_6LOWPAN=m
 CONFIG_IEEE802154_DRIVERS=m
-CONFIG_IEEE802154_FAKEHARD=m
 CONFIG_IEEE802154_FAKELB=m
+CONFIG_IEEE802154_CC2520=m
 # CONFIG_IEEE802154_AT86RF230 is not set
 # CONFIG_IEEE802154_MRF24J40 is not set
-# CONFIG_IEEE802154_CC2520 is not set
 
 CONFIG_MAC802154=m
 CONFIG_NET_MPLS_GSO=m
 
+CONFIG_NET_SWITCHDEV=y
+
 CONFIG_6LOWPAN=m
 
 #
@@ -1951,6 +1961,8 @@ CONFIG_WINBOND_FIR=m
 # Bluetooth support
 #
 CONFIG_BT=m
+CONFIG_BT_BREDR=y
+CONFIG_BT_LE=y
 CONFIG_BT_6LOWPAN=m
 CONFIG_BT_SCO=y
 CONFIG_BT_CMTP=m
@@ -2199,7 +2211,7 @@ CONFIG_KEYBOARD_ATKBD=y
 # CONFIG_KEYBOARD_TCA6416 is not set
 # CONFIG_KEYBOARD_TCA8418 is not set
 # CONFIG_KEYBOARD_OMAP4 is not set
-# CONFIG_KEYBOARD_CAP1106 is not set
+# CONFIG_KEYBOARD_CAP11XX is not set
 CONFIG_INPUT_MOUSE=y
 CONFIG_MOUSE_PS2=y
 # CONFIG_MOUSE_PS2_TOUCHKIT is not set
@@ -2212,6 +2224,9 @@ CONFIG_MOUSE_BCM5974=m
 CONFIG_MOUSE_SYNAPTICS_I2C=m
 CONFIG_MOUSE_SYNAPTICS_USB=m
 CONFIG_MOUSE_CYAPA=m
+CONFIG_MOUSE_ELAN_I2C=m
+CONFIG_MOUSE_ELAN_I2C_I2C=y
+CONFIG_MOUSE_ELAN_I2C_SMBUS=y
 CONFIG_INPUT_JOYSTICK=y
 CONFIG_JOYSTICK_ANALOG=m
 CONFIG_JOYSTICK_A3D=m
@@ -2254,6 +2269,7 @@ CONFIG_TOUCHSCREEN_DYNAPRO=m
 CONFIG_TOUCHSCREEN_EDT_FT5X06=m
 CONFIG_TOUCHSCREEN_EETI=m
 CONFIG_TOUCHSCREEN_EGALAX=m
+CONFIG_TOUCHSCREEN_ELAN=m
 CONFIG_TOUCHSCREEN_ELO=m
 CONFIG_TOUCHSCREEN_FUJITSU=m
 CONFIG_TOUCHSCREEN_GUNZE=m
@@ -2462,6 +2478,8 @@ CONFIG_I2C_PCA_PLATFORM=m
 # CONFIG_I2C_SIS96X is not set
 CONFIG_I2C_SIMTEC=m
 CONFIG_I2C_STUB=m
+CONFIG_I2C_SLAVE=y
+CONFIG_I2C_SLAVE_EEPROM=m
 CONFIG_I2C_TINY_USB=m
 # CONFIG_I2C_TAOS_EVM is not set
 # CONFIG_I2C_VIA is not set
@@ -2544,6 +2562,7 @@ CONFIG_SENSORS_MAX6697=m
 CONFIG_SENSORS_MCP3021=m
 CONFIG_SENSORS_NCT6775=m
 CONFIG_SENSORS_NCT6683=m
+CONFIG_SENSORS_NCT7802=m
 CONFIG_SENSORS_NTC_THERMISTOR=m
 CONFIG_SENSORS_PC87360=m
 CONFIG_SENSORS_PC87427=m
@@ -2684,6 +2703,7 @@ CONFIG_HID_SENSOR_DEVICE_ROTATION=m
 # CONFIG_MAG3110 is not set
 # CONFIG_TMP006 is not set
 # CONFIG_MLX90614 is not set
+# CONFIG_BMP280 is not set
 # CONFIG_HID_SENSOR_PRESS is not set
 # CONFIG_IIO_ST_PRESS is not set
 # CONFIG_KXSD9 is not set
@@ -2722,6 +2742,7 @@ CONFIG_HID_SENSOR_DEVICE_ROTATION=m
 # CONFIG_MPL3115 is not set
 # CONFIG_MPL115 is not set
 # CONFIG_SI7005 is not set
+# CONFIG_SI7020 is not set
 # CONFIG_AS3935 is not set
 CONFIG_KXCJK1013=m
 # CONFIG_ISL29125 is not set
@@ -2817,6 +2838,7 @@ CONFIG_IPMI_DEVICE_INTERFACE=m
 CONFIG_IPMI_WATCHDOG=m
 CONFIG_IPMI_SI=m
 # CONFIG_IPMI_SI_PROBE_DEFAULTS is not set
+CONFIG_IPMI_SSIF=m
 CONFIG_IPMI_POWEROFF=m
 
 #
@@ -2866,8 +2888,6 @@ CONFIG_WM831X_WATCHDOG=m
 CONFIG_HW_RANDOM=y
 CONFIG_HW_RANDOM_TIMERIOMEM=m
 CONFIG_HW_RANDOM_TPM=m
-# CONFIG_HW_RANDOM_ATMEL is not set
-# CONFIG_HW_RANDOM_EXYNOS is not set
 # CONFIG_NVRAM is not set
 # CONFIG_RTC is not set
 # CONFIG_RTC_DEBUG is not set
@@ -2887,6 +2907,7 @@ CONFIG_RTC_DRV_DS1553=m
 CONFIG_RTC_DRV_DS1672=m
 CONFIG_RTC_DRV_DS1742=m
 CONFIG_RTC_DRV_DS1374=m
+CONFIG_RTC_DRV_DS1374_WDT=y
 # CONFIG_RTC_DRV_EP93XX is not set
 CONFIG_RTC_DRV_FM3130=m
 # CONFIG_RTC_DRV_HYM8563 is not set
@@ -2989,6 +3010,7 @@ CONFIG_DRM_NOUVEAU=m
 CONFIG_NOUVEAU_DEBUG=5
 CONFIG_NOUVEAU_DEBUG_DEFAULT=3
 CONFIG_DRM_NOUVEAU_BACKLIGHT=y
+CONFIG_DRM_I2C_ADV7511=m
 CONFIG_DRM_I2C_CH7006=m
 CONFIG_DRM_I2C_SIL164=m
 CONFIG_DRM_I2C_NXP_TDA998X=m
@@ -3111,7 +3133,6 @@ CONFIG_VIDEO_TLG2300=m
 # CONFIG_VIDEO_M5MOLS is not set
 # CONFIG_VIDEO_TW68 is not set
 # CONFIG_VIDEO_VIVID is not set
-# CONFIG_EXYNOS_VIDEO is not set
 CONFIG_VIDEO_USBTV=m
 # CONFIG_VIDEO_AU0828_RC is not set
 
@@ -3171,6 +3192,7 @@ CONFIG_DVB_DM1105=m
 CONFIG_DVB_FIREDTV=m
 CONFIG_DVB_NGENE=m
 CONFIG_DVB_DDBRIDGE=m
+CONFIG_DVB_SMIPCIE=m
 CONFIG_DVB_USB_TECHNISAT_USB2=m
 CONFIG_DVB_USB_V2=m
 
@@ -3261,6 +3283,7 @@ CONFIG_IR_REDRAT3=m
 CONFIG_IR_ENE=m
 CONFIG_IR_STREAMZAP=m
 CONFIG_IR_WINBOND_CIR=m
+CONFIG_IR_IGORPLUGUSB=m
 CONFIG_IR_IGUANA=m
 CONFIG_IR_TTUSBIR=m
 CONFIG_IR_GPIO_CIR=m
@@ -3391,10 +3414,12 @@ CONFIG_SND=y
 CONFIG_SOUND_OSS_CORE_PRECLAIM=y
 # CONFIG_SND_DEBUG_VERBOSE is not set
 CONFIG_SND_VERBOSE_PROCFS=y
-CONFIG_SND_SEQUENCER=y
+CONFIG_SND_COMPRESS_OFFLOAD=m
 CONFIG_SND_HRTIMER=y
+CONFIG_SND_JACK=y
 CONFIG_SND_SEQ_HRTIMER_DEFAULT=y
 CONFIG_SND_SEQ_DUMMY=m
+CONFIG_SND_SEQUENCER=y
 CONFIG_SND_SEQUENCER_OSS=y
 CONFIG_SND_SEQ_RTCTIMER_DEFAULT=y
 CONFIG_SND_OSSEMUL=y
@@ -3536,8 +3561,9 @@ CONFIG_SND_FIREWIRE_SPEAKERS=m
 CONFIG_SND_ISIGHT=m
 CONFIG_SND_SCS1X=m
 CONFIG_SND_DICE=m
+CONFIG_SND_OXFW=m
 CONFIG_SND_FIREWORKS=m
-# CONFIG_SND_BEBOB is not set
+CONFIG_SND_BEBOB=m
 
 #
 # Open Sound System
@@ -3633,6 +3659,7 @@ CONFIG_UHID=m
 CONFIG_HID_PID=y
 CONFIG_LOGITECH_FF=y
 CONFIG_HID_LOGITECH_DJ=m
+CONFIG_HID_LOGITECH_HIDPP=m
 CONFIG_LOGIRUMBLEPAD2_FF=y
 CONFIG_PANTHERLORD_FF=y
 CONFIG_THRUSTMASTER_FF=y
@@ -3648,6 +3675,7 @@ CONFIG_LOGIWHEELS_FF=y
 CONFIG_HID_MAGICMOUSE=y
 CONFIG_HID_MULTITOUCH=m
 CONFIG_HID_NTRIG=y
+CONFIG_HID_PLANTRONICS=m
 CONFIG_HID_PRIMAX=m
 CONFIG_HID_PRODIKEYS=m
 CONFIG_HID_DRAGONRISE=m
@@ -4041,7 +4069,9 @@ CONFIG_MFD_VIPERBOARD=m
 # CONFIG_MFD_TPS65912 is not set
 # CONFIG_MFD_SYSCON is not set
 # CONFIG_MFD_DA9063 is not set
+# CONFIG_MFD_DLN2 is not set
 # CONFIG_MFD_LP3943 is not set
+# CONFIG_MFD_ATMEL_HLCDC is not set
 # CONFIG_MFD_BCM590XX is not set
 # CONFIG_MFD_TPS65218 is not set
 # CONFIG_MFD_WM831X_SPI is not set
@@ -4171,6 +4201,7 @@ CONFIG_CRAMFS=m
 CONFIG_SQUASHFS=m
 CONFIG_SQUASHFS_XATTR=y
 CONFIG_SQUASHFS_LZO=y
+CONFIG_SQUASHFS_LZ4=y
 CONFIG_SQUASHFS_XZ=y
 CONFIG_SQUASHFS_ZLIB=y
 # CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set
@@ -4580,6 +4611,19 @@ CONFIG_ZLIB_INFLATE=y
 CONFIG_ZLIB_DEFLATE=m
 
 CONFIG_INITRAMFS_SOURCE=""
+
+# These were all enabled by default before 3.19 made them individually
+# selectable.  Possibly look at enabling only the one(s) Fedora actually
+# uses.
+CONFIG_RD_GZIP=y
+CONFIG_RD_BZIP2=y
+CONFIG_RD_LZMA=y
+CONFIG_RD_XZ=y
+CONFIG_RD_LZO=y
+CONFIG_RD_LZ4=y
+
+CONFIG_INIT_FALLBACK=y
+
 CONFIG_KEYS=y
 CONFIG_PERSISTENT_KEYRINGS=y
 CONFIG_BIG_KEYS=y
@@ -4748,7 +4792,81 @@ CONFIG_SND_INDIGOIO=m
 CONFIG_SND_INDIGODJ=m
 CONFIG_SND_INDIGOIOX=m
 CONFIG_SND_INDIGODJX=m
-# CONFIG_SND_SOC is not set
+
+CONFIG_SND_SOC=m
+CONFIG_SND_SIMPLE_CARD=m
+CONFIG_SND_DESIGNWARE_I2S=m
+CONFIG_SND_SOC_ALL_CODECS=m
+CONFIG_SND_SOC_DMIC=m
+CONFIG_SND_SOC_HDMI_CODEC=m
+CONFIG_SND_SOC_SPDIF=m
+CONFIG_SND_DMAENGINE_PCM=m
+CONFIG_SND_SOC_GENERIC_DMAENGINE_PCM=y
+# CONFIG_SND_SOC_ADAU1701 is not set
+# CONFIG_SND_SOC_AK4104 is not set
+# CONFIG_SND_SOC_AK4554 is not set
+# CONFIG_SND_SOC_AK4642 is not set
+# CONFIG_SND_SOC_AK5386 is not set
+# CONFIG_SND_SOC_CS42L52 is not set
+# CONFIG_SND_SOC_CS42L73 is not set
+# CONFIG_SND_SOC_CS4270 is not set
+# CONFIG_SND_SOC_CS4271 is not set
+# CONFIG_SND_SOC_CS42XX8_I2C is not set
+# CONFIG_SND_SOC_PCM1681 is not set
+# CONFIG_SND_SOC_PCM1792A is not set
+# CONFIG_SND_SOC_PCM512x_I2C is not set
+# CONFIG_SND_SOC_PCM512x_SPI is not set
+# CONFIG_SND_SOC_SGTL5000 is not set
+# CONFIG_SND_SOC_SIRF_AUDIO_CODEC is not set
+# CONFIG_SND_SOC_TAS5086 is not set
+# CONFIG_SND_SOC_TLV320AIC3X is not set
+# CONFIG_SND_SOC_WM8510 is not set
+# CONFIG_SND_SOC_WM8523 is not set
+# CONFIG_SND_SOC_WM8580 is not set
+# CONFIG_SND_SOC_WM8711 is not set
+# CONFIG_SND_SOC_WM8728 is not set
+# CONFIG_SND_SOC_WM8731 is not set
+# CONFIG_SND_SOC_WM8737 is not set
+# CONFIG_SND_SOC_WM8741 is not set
+# CONFIG_SND_SOC_WM8750 is not set
+# CONFIG_SND_SOC_WM8753 is not set
+# CONFIG_SND_SOC_WM8770 is not set
+# CONFIG_SND_SOC_WM8776 is not set
+# CONFIG_SND_SOC_WM8804 is not set
+# CONFIG_SND_SOC_WM8903 is not set
+# CONFIG_SND_SOC_WM8962 is not set
+# CONFIG_SND_SOC_TPA6130A2 is not set
+# CONFIG_SND_SOC_FSL_ASRC is not set
+# CONFIG_SND_SOC_FSL_ESAI is not set
+# CONFIG_SND_SOC_FSL_SAI is not set
+# CONFIG_SND_SOC_FSL_SPDIF is not set
+# CONFIG_SND_SOC_FSL_SSI is not set
+# CONFIG_SND_SOC_IMX_AUDMUX is not set
+# CONFIG_SND_SOC_ALC5623 is not set
+# CONFIG_SND_SOC_CS42L56 is not set
+# CONFIG_SND_SOC_STA350 is not set
+# CONFIG_SND_SOC_CS35L32 is not set
+# CONFIG_SND_SOC_ES8328 is not set
+# CONFIG_SND_SOC_SSM2602_SPI is not set
+# CONFIG_SND_SOC_SSM2602_I2C is not set
+# CONFIG_SND_SOC_SSM4567 is not set
+# CONFIG_SND_SOC_WM8978 is not set
+# CONFIG_SND_ATMEL_SOC is not set
+# CONFIG_SND_SOC_TLV320AIC31XX is not set
+# CONFIG_SND_SOC_TAS2552 is not set
+# CONFIG_SND_SOC_CS4265 is not set
+# CONFIG_SND_SOC_IMX_ES8328 is not set
+# CONFIG_SND_SOC_FSL_ASOC_CARD is not set
+# CONFIG_SND_EDMA_SOC is not set
+# CONFIG_SND_SOC_ARNDALE_RT5631_ALC5631 is not set
+# CONFIG_SND_SOC_CS42L51_I2C is not set
+# CONFIG_SND_SOC_CS4271_I2C is not set
+# CONFIG_SND_SOC_CS4271_SPI is not set
+# CONFIG_SND_SOC_RT5631 is not set
+# CONFIG_SND_SOC_TFA9879 is not set
+# CONFIG_SND_SOC_TLV320AIC23_I2C is not set
+# CONFIG_SND_SOC_TLV320AIC23_SPI is not set
+# CONFIG_SND_SOC_TS3A227E is not set
 
 CONFIG_BALLOON_COMPACTION=y
 CONFIG_COMPACTION=y
@@ -4768,6 +4886,7 @@ CONFIG_LEDS_DELL_NETBOOKS=m
 # CONFIG_LEDS_OT200 is not set
 # CONFIG_LEDS_PWM is not set
 # CONFIG_LEDS_LP8501 is not set
+# CONFIG_LEDS_LP8860 is not set
 # CONFIG_LEDS_PCA963X is not set
 # CONFIG_LEDS_SYSCON is not set
 CONFIG_LEDS_TRIGGERS=y
@@ -4965,17 +5084,18 @@ CONFIG_GPIOLIB=y
 # CONFIG_PINCONF is not set
 
 CONFIG_NET_DSA=m
+CONFIG_NET_DSA_HWMON=y
 CONFIG_NET_DSA_MV88E6060=m
 CONFIG_NET_DSA_MV88E6131=m
 CONFIG_NET_DSA_MV88E6123_61_65=m
 CONFIG_NET_DSA_MV88E6171=m
+CONFIG_NET_DSA_MV88E6352=m
 CONFIG_NET_DSA_BCM_SF2=m
 
 # Used by Maemo, we don't care.
 # CONFIG_PHONET is not set
 
 # CONFIG_ICS932S401 is not set
-# CONFIG_ATMEL_SSC is not set
 
 # CONFIG_C2PORT is not set
 
@@ -5062,6 +5182,10 @@ CONFIG_USBIP_HOST=m
 # CONFIG_GS_FPGABOOT is not set
 # CONFIG_UNISYSSPAR is not set
 # CONFIG_MEDIA_TUNER_MSI001 is not set
+# CONFIG_COMMON_CLK_XLNX_CLKWZRD is not set
+# CONFIG_VIDEO_SAA7191 is not set
+# CONFIG_DVB_MN88472 is not set
+# CONFIG_DVB_MN88473 is not set
 # END OF STAGING
 
 #
diff --git a/config-nodebug b/config-nodebug
index ed69133..01008d6 100644
--- a/config-nodebug
+++ b/config-nodebug
@@ -35,6 +35,8 @@ CONFIG_CPUMASK_OFFSTACK=y
 # CONFIG_DEBUG_SG is not set
 # CONFIG_DEBUG_PI_LIST is not set
 
+# CONFIG_PAGE_EXTENSION is not set
+# CONFIG_PAGE_OWNER is not set
 # CONFIG_DEBUG_PAGEALLOC is not set
 
 # CONFIG_DEBUG_OBJECTS is not set
@@ -44,7 +46,8 @@ CONFIG_CPUMASK_OFFSTACK=y
 # CONFIG_DEBUG_OBJECTS_RCU_HEAD is not set
 CONFIG_DEBUG_OBJECTS_ENABLE_DEFAULT=1
 
-# CONFIG_X86_PTDUMP is not set
+CONFIG_X86_PTDUMP=y
+# CONFIG_ARM64_PTDUMP is not set
 # CONFIG_EFI_PGT_DUMP is not set
 
 # CONFIG_CAN_DEBUG_DEVICES is not set
@@ -96,6 +99,7 @@ CONFIG_PM_ADVANCED_DEBUG=y
 
 
 CONFIG_KGDB_KDB=y
+CONFIG_KDB_DEFAULT_ENABLE=0x0
 CONFIG_KDB_KEYBOARD=y
 CONFIG_KDB_CONTINUE_CATASTROPHIC=0
 
diff --git a/config-powerpc-generic b/config-powerpc-generic
index ce4da57..e3dbc6a 100644
--- a/config-powerpc-generic
+++ b/config-powerpc-generic
@@ -49,6 +49,7 @@ CONFIG_SND_AOA_ONYX=m
 CONFIG_SND_AOA_TAS=m
 CONFIG_SND_AOA_TOONIE=m
 CONFIG_SND_AOA_SOUNDBUS_I2S=m
+# CONFIG_SND_SOC is not set
 
 CONFIG_XMON=y
 # CONFIG_XMON_DEFAULT is not set
@@ -306,6 +307,7 @@ CONFIG_SERIAL_GRLIB_GAISLER_APBUART=m
 # CONFIG_MFD_AAT2870_CORE is not set
 
 # CONFIG_GPIO_SCH is not set
+# CONFIG_GPIO_74XX_MMIO is not set
 
 # CONFIG_PPC_MPC512x is not set
 # CONFIG_RTC_DRV_MPC5121 is not set
@@ -330,6 +332,7 @@ CONFIG_I2C_MPC=m
 # CONFIG_NET_VENDOR_TOSHIBA is not set
 
 # CONFIG_CPU_IDLE is not set
+# CONFIG_OF_UNITTEST is not set
 # CONFIG_OF_SELFTEST is not set
 # CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set
 # CONFIG_INPUT_GP2A is not set
diff --git a/config-powerpc64 b/config-powerpc64
index 49b4f2e..5d9d29b 100644
--- a/config-powerpc64
+++ b/config-powerpc64
@@ -15,6 +15,7 @@ CONFIG_PPC_POWERNV_RTAS=y
 CONFIG_SENSORS_IBMPOWERNV=y
 CONFIG_HW_RANDOM_POWERNV=m
 CONFIG_POWERNV_CPUFREQ=m
+CONFIG_IPMI_POWERNV=m
 CONFIG_SCOM_DEBUGFS=y
 # CONFIG_PPC_PASEMI is not set
 # CONFIG_PPC_PASEMI_IOMMU_DMA_FORCE is not set
@@ -165,6 +166,9 @@ CONFIG_HW_RANDOM_AMD=m
 
 CONFIG_UIO_PDRV=m
 
+CONFIG_I2C_OPAL=m
+CONFIG_RTC_DRV_OPAL=m
+
 CONFIG_HW_RANDOM_PSERIES=m
 CONFIG_CRYPTO_DEV_NX=y
 CONFIG_CRYPTO_842=m
diff --git a/config-powerpc64p7 b/config-powerpc64p7
index 6a5e1c6..eabb28c 100644
--- a/config-powerpc64p7
+++ b/config-powerpc64p7
@@ -10,6 +10,7 @@ CONFIG_PPC_POWERNV_RTAS=y
 CONFIG_HW_RANDOM_POWERNV=m
 CONFIG_SENSORS_IBMPOWERNV=y
 CONFIG_POWERNV_CPUFREQ=m
+CONFIG_IPMI_POWERNV=m
 CONFIG_SCOM_DEBUGFS=y
 # CONFIG_PPC_PASEMI is not set
 # CONFIG_PPC_PASEMI_IOMMU_DMA_FORCE is not set
@@ -155,6 +156,9 @@ CONFIG_HW_RANDOM_AMD=m
 
 CONFIG_UIO_PDRV=m
 
+CONFIG_I2C_OPAL=m
+CONFIG_RTC_DRV_OPAL=m
+
 CONFIG_HW_RANDOM_PSERIES=m
 CONFIG_CRYPTO_DEV_NX=y
 CONFIG_CRYPTO_842=m
diff --git a/config-s390x b/config-s390x
index 9534f51..5f35e49 100644
--- a/config-s390x
+++ b/config-s390x
@@ -63,6 +63,7 @@ CONFIG_SCLP_VT220_TTY=y
 CONFIG_SCLP_VT220_CONSOLE=y
 CONFIG_SCLP_CPI=m
 CONFIG_SCLP_ASYNC=m
+CONFIG_SCLP_ASYNC_ID="000000000"
 CONFIG_S390_TAPE=m
 CONFIG_S390_TAPE_3590=m
 
@@ -150,8 +151,6 @@ CONFIG_VIRT_CPU_ACCOUNTING=y
 
 # CONFIG_CLAW is not set
 
-# CONFIG_ATMEL is not set
-
 # CONFIG_CDROM_PKTCDVD is not set
 # CONFIG_ATA_OVER_ETH is not set
 # CONFIG_MII is not set
diff --git a/config-x86-32-generic b/config-x86-32-generic
index 5daa9b8..bdf1b75 100644
--- a/config-x86-32-generic
+++ b/config-x86-32-generic
@@ -197,6 +197,7 @@ CONFIG_BACKLIGHT_PWM=m
 
 # CONFIG_EDAC_SBRIDGE is not set
 
+# CONFIG_OF_UNITTEST is not set
 # CONFIG_OF_SELFTEST is not set
 # CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set
 # CONFIG_INPUT_GP2A is not set
@@ -206,6 +207,7 @@ CONFIG_BACKLIGHT_PWM=m
 # CONFIG_MDIO_BUS_MUX_GPIO is not set
 # CONFIG_MDIO_BUS_MUX_MMIOREG is not set
 # CONFIG_GPIO_SODAVILLE is not set
+# CONFIG_GPIO_74XX_MMIO is not set
 # CONFIG_BACKLIGHT_OT200 is not set
 
 # CONFIG_MLX5_INFINIBAND is not set
diff --git a/config-x86-generic b/config-x86-generic
index 1af8775..a473db3 100644
--- a/config-x86-generic
+++ b/config-x86-generic
@@ -10,12 +10,12 @@ CONFIG_HPET_TIMER=y
 
 CONFIG_I8K=m
 CONFIG_SONYPI_COMPAT=y
-CONFIG_MICROCODE=m
-# CONFIG_MICROCODE_EARLY is not set
+CONFIG_MICROCODE=y
+CONFIG_MICROCODE_EARLY=y
 CONFIG_MICROCODE_INTEL=y
 CONFIG_MICROCODE_INTEL_EARLY=y
 CONFIG_MICROCODE_AMD=y
-# CONFIG_MICROCODE_AMD_EARLY is not set
+CONFIG_MICROCODE_AMD_EARLY=y
 
 CONFIG_X86_MSR=y
 CONFIG_X86_CPUID=y
@@ -34,6 +34,10 @@ CONFIG_MTRR_SANITIZER_SPARE_REG_NR_DEFAULT=1
 CONFIG_X86_PAT=y
 CONFIG_X86_PM_TIMER=y
 
+# This requires changes to binutils and the compiler.  Plus you can't actually
+# buy hardware with MPX yet.  So... leave it off until all of that seems set.
+# CONFIG_X86_INTEL_MPX is not set
+
 CONFIG_EFI=y
 CONFIG_EFI_STUB=y
 # CONFIG_EFI_MIXED is not set
@@ -99,6 +103,8 @@ CONFIG_ACPI_CUSTOM_METHOD=m
 CONFIG_ACPI_BGRT=y
 # CONFIG_ACPI_EXTLOG is not set
 
+# CONFIG_PMIC_OPREGION is not set
+
 CONFIG_X86_INTEL_PSTATE=y
 CONFIG_X86_ACPI_CPUFREQ=m
 CONFIG_X86_ACPI_CPUFREQ_CPB=y
@@ -166,6 +172,8 @@ CONFIG_DCDBAS=m
 
 CONFIG_EDAC=y
 CONFIG_EDAC_MM_EDAC=m
+# CONFIG_EDAC_AMD64_ERROR_INJECTION is not set
+CONFIG_EDAC_AMD64=m
 CONFIG_EDAC_AMD76X=m
 CONFIG_EDAC_AMD8111=m
 CONFIG_EDAC_AMD8131=m
@@ -327,6 +335,7 @@ CONFIG_INTEL_IOATDMA=m
 CONFIG_SENSORS_I5K_AMB=m
 CONFIG_SENSORS_FAM15H_POWER=m
 CONFIG_SENSORS_ACPI_POWER=m
+CONFIG_SENSORS_I5500=m
 
 # CONFIG_CPA_DEBUG is not set
 
@@ -488,12 +497,28 @@ CONFIG_PWM_LPSS_PCI=m
 CONFIG_PWM_LPSS_PLATFORM=m
 CONFIG_PINCTRL=y
 CONFIG_PINCTRL_BAYTRAIL=y
+CONFIG_PINCTRL_CHERRYVIEW=m
+
+#baytrail/cherrytrail stuff
+CONFIG_KEYBOARD_GPIO=m
+CONFIG_INPUT_SOC_BUTTON_ARRAY=m
+CONFIG_SND_SOC_INTEL_SST=m
+CONFIG_SND_SOC_INTEL_SST_ACPI=m
+CONFIG_SND_SOC_INTEL_HASWELL_MACH=m
+CONFIG_SND_SOC_INTEL_BROADWELL_MACH=m
+CONFIG_SND_SOC_INTEL_BAYTRAIL=m
+CONFIG_SND_SOC_INTEL_BYT_RT5640_MACH=m
+CONFIG_SND_SOC_INTEL_BYT_MAX98090_MACH=m
+CONFIG_SND_SOC_INTEL_BYTCR_RT5640_MACH=m
+CONFIG_SND_SOC_INTEL_CHT_BSW_RT5672_MACH=m
+
+
 
 # CONFIG_INTEL_POWERCLAMP is not set
 CONFIG_X86_PKG_TEMP_THERMAL=m
 CONFIG_INTEL_SOC_DTS_THERMAL=m
-CONFIG_INTEL_RAPL=m
 CONFIG_INT340X_THERMAL=m
+CONFIG_INTEL_RAPL=m
 
 CONFIG_VMWARE_VMCI=m
 CONFIG_VMWARE_VMCI_VSOCKETS=m
diff --git a/config-x86_64-generic b/config-x86_64-generic
index 89b7070..3a2ef08 100644
--- a/config-x86_64-generic
+++ b/config-x86_64-generic
@@ -177,6 +177,8 @@ CONFIG_SFC_MTD=y
 # Override MTD stuff because SFC_MTD needs it
 CONFIG_MTD_BLOCK=m
 
+CONFIG_HSA_AMD=m
+
 CONFIG_NO_HZ_FULL=y
 # CONFIG_NO_HZ_IDLE is not set
 # CONFIG_NO_HZ_FULL_ALL is not set
diff --git a/drm-i915-hush-check-crtc-state.patch b/drm-i915-hush-check-crtc-state.patch
new file mode 100644
index 0000000..d2169e6
--- /dev/null
+++ b/drm-i915-hush-check-crtc-state.patch
@@ -0,0 +1,31 @@
+From: Adam Jackson <ajax at redhat.com>
+Date: Wed, 13 Nov 2013 10:17:24 -0500
+Subject: [PATCH] drm/i915: hush check crtc state
+
+This is _by far_ the most common backtrace for i915 on retrace.fp.o, and
+it's mostly useless noise.  There's not enough context when it's generated
+to know if something actually went wrong.  Downgrade the message to
+KMS debugging so we can still get it if we want it.
+
+Bugzilla: 1027037 1028785
+Upstream-status: http://lists.freedesktop.org/archives/intel-gfx/2013-November/035948.html
+---
+ drivers/gpu/drm/i915/intel_display.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
+index 2e2f6443fd53..2a0813e5ace9 100644
+--- a/drivers/gpu/drm/i915/intel_display.c
++++ b/drivers/gpu/drm/i915/intel_display.c
+@@ -10869,7 +10869,7 @@ check_crtc_state(struct drm_device *dev)
+ 
+ 		if (active &&
+ 		    !intel_pipe_config_compare(dev, &crtc->config, &pipe_config)) {
+-			I915_STATE_WARN(1, "pipe state doesn't match!\n");
++			DRM_DEBUG_KMS("pipe state doesn't match!\n");
+ 			intel_dump_pipe_config(crtc, &pipe_config,
+ 					       "[hw state]");
+ 			intel_dump_pipe_config(crtc, &crtc->config,
+-- 
+2.1.0
+
diff --git a/drm-i915-tame-the-chattermouth-v2.patch b/drm-i915-tame-the-chattermouth-v2.patch
index 18a1b1b..9cf29f5 100644
--- a/drm-i915-tame-the-chattermouth-v2.patch
+++ b/drm-i915-tame-the-chattermouth-v2.patch
@@ -20,21 +20,20 @@ v2: paint the macro names blue, clarify that the default behavior
 Signed-off-by: Rob Clark <robdclark at gmail.com>
 Acked-by: Jani Nikula <jani.nikula at intel.com>
 Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>
-Backported-by: Josh Boyer <jwboyer at fedoraproject.org>
 ---
  drivers/gpu/drm/i915/i915_drv.h      |  30 ++++++++
  drivers/gpu/drm/i915/i915_params.c   |   5 ++
- drivers/gpu/drm/i915/intel_display.c | 132 +++++++++++++++++------------------
- drivers/gpu/drm/i915/intel_dp.c      |   2 +-
- 4 files changed, 102 insertions(+), 67 deletions(-)
+ drivers/gpu/drm/i915/intel_display.c | 134 +++++++++++++++++------------------
+ drivers/gpu/drm/i915/intel_dp.c      |   4 +-
+ 4 files changed, 104 insertions(+), 69 deletions(-)
 
 diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
-index 346aee828dc3..8ac3d534434e 100644
+index ddd005ce3a94..204dd676ebac 100644
 --- a/drivers/gpu/drm/i915/i915_drv.h
 +++ b/drivers/gpu/drm/i915/i915_drv.h
-@@ -57,6 +57,35 @@
- #define DRIVER_DESC		"Intel Graphics"
- #define DRIVER_DATE		"20140905"
+@@ -60,6 +60,35 @@
+ #undef WARN_ON
+ #define WARN_ON(x)		WARN(x, "WARN_ON(" #x ")")
  
 +/* Use I915_STATE_WARN(x) and I915_STATE_WARN_ON() (rather than WARN() and
 + * WARN_ON()) for hw state sanity checks to check for unexpected conditions
@@ -68,7 +67,7 @@ index 346aee828dc3..8ac3d534434e 100644
  enum pipe {
  	INVALID_PIPE = -1,
  	PIPE_A = 0,
-@@ -2222,6 +2251,7 @@ struct i915_params {
+@@ -2315,6 +2344,7 @@ struct i915_params {
  	bool disable_vtd_wa;
  	int use_mmio_flip;
  	bool mmio_debug;
@@ -97,10 +96,10 @@ index c91cb2033cc5..db07153b693f 100644
 +MODULE_PARM_DESC(verbose_state_checks,
 +	"Enable verbose logs (ie. WARN_ON()) in case of unexpected hw state conditions.");
 diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
-index cadc3bcf1de2..752dbe7ff017 100644
+index c10b52ef116d..2e2f6443fd53 100644
 --- a/drivers/gpu/drm/i915/intel_display.c
 +++ b/drivers/gpu/drm/i915/intel_display.c
-@@ -1060,7 +1060,7 @@ void assert_pll(struct drm_i915_private *dev_priv,
+@@ -1024,7 +1024,7 @@ void assert_pll(struct drm_i915_private *dev_priv,
  	reg = DPLL(pipe);
  	val = I915_READ(reg);
  	cur_state = !!(val & DPLL_VCO_ENABLE);
@@ -109,7 +108,7 @@ index cadc3bcf1de2..752dbe7ff017 100644
  	     "PLL state assertion failure (expected %s, current %s)\n",
  	     state_string(state), state_string(cur_state));
  }
-@@ -1076,7 +1076,7 @@ static void assert_dsi_pll(struct drm_i915_private *dev_priv, bool state)
+@@ -1040,7 +1040,7 @@ static void assert_dsi_pll(struct drm_i915_private *dev_priv, bool state)
  	mutex_unlock(&dev_priv->dpio_lock);
  
  	cur_state = val & DSI_PLL_VCO_EN;
@@ -118,7 +117,7 @@ index cadc3bcf1de2..752dbe7ff017 100644
  	     "DSI PLL state assertion failure (expected %s, current %s)\n",
  	     state_string(state), state_string(cur_state));
  }
-@@ -1107,7 +1107,7 @@ void assert_shared_dpll(struct drm_i915_private *dev_priv,
+@@ -1071,7 +1071,7 @@ void assert_shared_dpll(struct drm_i915_private *dev_priv,
  		return;
  
  	cur_state = pll->get_hw_state(dev_priv, pll, &hw_state);
@@ -127,7 +126,7 @@ index cadc3bcf1de2..752dbe7ff017 100644
  	     "%s assertion failure (expected %s, current %s)\n",
  	     pll->name, state_string(state), state_string(cur_state));
  }
-@@ -1131,7 +1131,7 @@ static void assert_fdi_tx(struct drm_i915_private *dev_priv,
+@@ -1095,7 +1095,7 @@ static void assert_fdi_tx(struct drm_i915_private *dev_priv,
  		val = I915_READ(reg);
  		cur_state = !!(val & FDI_TX_ENABLE);
  	}
@@ -136,7 +135,7 @@ index cadc3bcf1de2..752dbe7ff017 100644
  	     "FDI TX state assertion failure (expected %s, current %s)\n",
  	     state_string(state), state_string(cur_state));
  }
-@@ -1148,7 +1148,7 @@ static void assert_fdi_rx(struct drm_i915_private *dev_priv,
+@@ -1112,7 +1112,7 @@ static void assert_fdi_rx(struct drm_i915_private *dev_priv,
  	reg = FDI_RX_CTL(pipe);
  	val = I915_READ(reg);
  	cur_state = !!(val & FDI_RX_ENABLE);
@@ -145,7 +144,7 @@ index cadc3bcf1de2..752dbe7ff017 100644
  	     "FDI RX state assertion failure (expected %s, current %s)\n",
  	     state_string(state), state_string(cur_state));
  }
-@@ -1171,7 +1171,7 @@ static void assert_fdi_tx_pll_enabled(struct drm_i915_private *dev_priv,
+@@ -1135,7 +1135,7 @@ static void assert_fdi_tx_pll_enabled(struct drm_i915_private *dev_priv,
  
  	reg = FDI_TX_CTL(pipe);
  	val = I915_READ(reg);
@@ -154,7 +153,7 @@ index cadc3bcf1de2..752dbe7ff017 100644
  }
  
  void assert_fdi_rx_pll(struct drm_i915_private *dev_priv,
-@@ -1184,7 +1184,7 @@ void assert_fdi_rx_pll(struct drm_i915_private *dev_priv,
+@@ -1148,7 +1148,7 @@ void assert_fdi_rx_pll(struct drm_i915_private *dev_priv,
  	reg = FDI_RX_CTL(pipe);
  	val = I915_READ(reg);
  	cur_state = !!(val & FDI_RX_PLL_ENABLE);
@@ -163,7 +162,7 @@ index cadc3bcf1de2..752dbe7ff017 100644
  	     "FDI RX PLL assertion failure (expected %s, current %s)\n",
  	     state_string(state), state_string(cur_state));
  }
-@@ -1226,7 +1226,7 @@ static void assert_panel_unlocked(struct drm_i915_private *dev_priv,
+@@ -1190,7 +1190,7 @@ void assert_panel_unlocked(struct drm_i915_private *dev_priv,
  	    ((val & PANEL_UNLOCK_MASK) == PANEL_UNLOCK_REGS))
  		locked = false;
  
@@ -172,7 +171,7 @@ index cadc3bcf1de2..752dbe7ff017 100644
  	     "panel assertion failure, pipe %c regs locked\n",
  	     pipe_name(pipe));
  }
-@@ -1242,7 +1242,7 @@ static void assert_cursor(struct drm_i915_private *dev_priv,
+@@ -1206,7 +1206,7 @@ static void assert_cursor(struct drm_i915_private *dev_priv,
  	else
  		cur_state = I915_READ(CURCNTR(pipe)) & CURSOR_MODE;
  
@@ -181,7 +180,7 @@ index cadc3bcf1de2..752dbe7ff017 100644
  	     "cursor on pipe %c assertion failure (expected %s, current %s)\n",
  	     pipe_name(pipe), state_string(state), state_string(cur_state));
  }
-@@ -1272,7 +1272,7 @@ void assert_pipe(struct drm_i915_private *dev_priv,
+@@ -1236,7 +1236,7 @@ void assert_pipe(struct drm_i915_private *dev_priv,
  		cur_state = !!(val & PIPECONF_ENABLE);
  	}
  
@@ -190,7 +189,7 @@ index cadc3bcf1de2..752dbe7ff017 100644
  	     "pipe %c assertion failure (expected %s, current %s)\n",
  	     pipe_name(pipe), state_string(state), state_string(cur_state));
  }
-@@ -1287,7 +1287,7 @@ static void assert_plane(struct drm_i915_private *dev_priv,
+@@ -1251,7 +1251,7 @@ static void assert_plane(struct drm_i915_private *dev_priv,
  	reg = DSPCNTR(plane);
  	val = I915_READ(reg);
  	cur_state = !!(val & DISPLAY_PLANE_ENABLE);
@@ -199,7 +198,7 @@ index cadc3bcf1de2..752dbe7ff017 100644
  	     "plane %c assertion failure (expected %s, current %s)\n",
  	     plane_name(plane), state_string(state), state_string(cur_state));
  }
-@@ -1307,7 +1307,7 @@ static void assert_planes_disabled(struct drm_i915_private *dev_priv,
+@@ -1271,7 +1271,7 @@ static void assert_planes_disabled(struct drm_i915_private *dev_priv,
  	if (INTEL_INFO(dev)->gen >= 4) {
  		reg = DSPCNTR(pipe);
  		val = I915_READ(reg);
@@ -208,7 +207,7 @@ index cadc3bcf1de2..752dbe7ff017 100644
  		     "plane %c assertion failure, should be disabled but not\n",
  		     plane_name(pipe));
  		return;
-@@ -1319,7 +1319,7 @@ static void assert_planes_disabled(struct drm_i915_private *dev_priv,
+@@ -1283,7 +1283,7 @@ static void assert_planes_disabled(struct drm_i915_private *dev_priv,
  		val = I915_READ(reg);
  		cur_pipe = (val & DISPPLANE_SEL_PIPE_MASK) >>
  			DISPPLANE_SEL_PIPE_SHIFT;
@@ -217,7 +216,16 @@ index cadc3bcf1de2..752dbe7ff017 100644
  		     "plane %c assertion failure, should be off on pipe %c but is still active\n",
  		     plane_name(i), pipe_name(pipe));
  	}
-@@ -1336,20 +1336,20 @@ static void assert_sprites_disabled(struct drm_i915_private *dev_priv,
+@@ -1299,7 +1299,7 @@ static void assert_sprites_disabled(struct drm_i915_private *dev_priv,
+ 	if (INTEL_INFO(dev)->gen >= 9) {
+ 		for_each_sprite(pipe, sprite) {
+ 			val = I915_READ(PLANE_CTL(pipe, sprite));
+-			WARN(val & PLANE_CTL_ENABLE,
++			I915_STATE_WARN(val & PLANE_CTL_ENABLE,
+ 			     "plane %d assertion failure, should be off on pipe %c but is still active\n",
+ 			     sprite, pipe_name(pipe));
+ 		}
+@@ -1307,20 +1307,20 @@ static void assert_sprites_disabled(struct drm_i915_private *dev_priv,
  		for_each_sprite(pipe, sprite) {
  			reg = SPCNTR(pipe, sprite);
  			val = I915_READ(reg);
@@ -241,7 +249,7 @@ index cadc3bcf1de2..752dbe7ff017 100644
  		     "sprite %c assertion failure, should be off on pipe %c but is still active\n",
  		     plane_name(pipe), pipe_name(pipe));
  	}
-@@ -1357,7 +1357,7 @@ static void assert_sprites_disabled(struct drm_i915_private *dev_priv,
+@@ -1328,7 +1328,7 @@ static void assert_sprites_disabled(struct drm_i915_private *dev_priv,
  
  static void assert_vblank_disabled(struct drm_crtc *crtc)
  {
@@ -250,7 +258,7 @@ index cadc3bcf1de2..752dbe7ff017 100644
  		drm_crtc_vblank_put(crtc);
  }
  
-@@ -1366,12 +1366,12 @@ static void ibx_assert_pch_refclk_enabled(struct drm_i915_private *dev_priv)
+@@ -1337,12 +1337,12 @@ static void ibx_assert_pch_refclk_enabled(struct drm_i915_private *dev_priv)
  	u32 val;
  	bool enabled;
  
@@ -265,7 +273,7 @@ index cadc3bcf1de2..752dbe7ff017 100644
  }
  
  static void assert_pch_transcoder_disabled(struct drm_i915_private *dev_priv,
-@@ -1384,7 +1384,7 @@ static void assert_pch_transcoder_disabled(struct drm_i915_private *dev_priv,
+@@ -1355,7 +1355,7 @@ static void assert_pch_transcoder_disabled(struct drm_i915_private *dev_priv,
  	reg = PCH_TRANSCONF(pipe);
  	val = I915_READ(reg);
  	enabled = !!(val & TRANS_ENABLE);
@@ -274,7 +282,7 @@ index cadc3bcf1de2..752dbe7ff017 100644
  	     "transcoder assertion failed, should be off on pipe %c but is still active\n",
  	     pipe_name(pipe));
  }
-@@ -1464,11 +1464,11 @@ static void assert_pch_dp_disabled(struct drm_i915_private *dev_priv,
+@@ -1435,11 +1435,11 @@ static void assert_pch_dp_disabled(struct drm_i915_private *dev_priv,
  				   enum pipe pipe, int reg, u32 port_sel)
  {
  	u32 val = I915_READ(reg);
@@ -288,7 +296,7 @@ index cadc3bcf1de2..752dbe7ff017 100644
  	     && (val & DP_PIPEB_SELECT),
  	     "IBX PCH dp port still using transcoder B\n");
  }
-@@ -1477,11 +1477,11 @@ static void assert_pch_hdmi_disabled(struct drm_i915_private *dev_priv,
+@@ -1448,11 +1448,11 @@ static void assert_pch_hdmi_disabled(struct drm_i915_private *dev_priv,
  				     enum pipe pipe, int reg)
  {
  	u32 val = I915_READ(reg);
@@ -302,7 +310,7 @@ index cadc3bcf1de2..752dbe7ff017 100644
  	     && (val & SDVO_PIPE_B_SELECT),
  	     "IBX PCH hdmi port still using transcoder B\n");
  }
-@@ -1498,13 +1498,13 @@ static void assert_pch_ports_disabled(struct drm_i915_private *dev_priv,
+@@ -1469,13 +1469,13 @@ static void assert_pch_ports_disabled(struct drm_i915_private *dev_priv,
  
  	reg = PCH_ADPA;
  	val = I915_READ(reg);
@@ -318,7 +326,7 @@ index cadc3bcf1de2..752dbe7ff017 100644
  	     "PCH LVDS enabled on transcoder %c, should be disabled\n",
  	     pipe_name(pipe));
  
-@@ -5152,25 +5152,25 @@ static void intel_connector_check_state(struct intel_connector *connector)
+@@ -5382,25 +5382,25 @@ static void intel_connector_check_state(struct intel_connector *connector)
  		if (connector->mst_port)
  			return;
  
@@ -352,7 +360,7 @@ index cadc3bcf1de2..752dbe7ff017 100644
  			     "encoder active on the wrong pipe\n");
  		}
  	}
-@@ -7523,24 +7523,24 @@ static void assert_can_disable_lcpll(struct drm_i915_private *dev_priv)
+@@ -7810,24 +7810,24 @@ static void assert_can_disable_lcpll(struct drm_i915_private *dev_priv)
  	struct intel_crtc *crtc;
  
  	for_each_intel_crtc(dev, crtc)
@@ -388,7 +396,7 @@ index cadc3bcf1de2..752dbe7ff017 100644
  
  	/*
  	 * In theory we can still leave IRQs enabled, as long as only the HPD
-@@ -7548,7 +7548,7 @@ static void assert_can_disable_lcpll(struct drm_i915_private *dev_priv)
+@@ -7835,7 +7835,7 @@ static void assert_can_disable_lcpll(struct drm_i915_private *dev_priv)
  	 * gen-specific and since we only disable LCPLL after we fully disable
  	 * the interrupts, the check below should be enough.
  	 */
@@ -397,7 +405,7 @@ index cadc3bcf1de2..752dbe7ff017 100644
  }
  
  static uint32_t hsw_read_dcomp(struct drm_i915_private *dev_priv)
-@@ -10838,7 +10838,7 @@ check_connector_state(struct drm_device *dev)
+@@ -10742,7 +10742,7 @@ check_connector_state(struct drm_device *dev)
  		 * ->get_hw_state callbacks. */
  		intel_connector_check_state(connector);
  
@@ -406,7 +414,7 @@ index cadc3bcf1de2..752dbe7ff017 100644
  		     "connector's staged encoder doesn't match current encoder\n");
  	}
  }
-@@ -10858,9 +10858,9 @@ check_encoder_state(struct drm_device *dev)
+@@ -10762,9 +10762,9 @@ check_encoder_state(struct drm_device *dev)
  			      encoder->base.base.id,
  			      encoder->base.name);
  
@@ -418,7 +426,7 @@ index cadc3bcf1de2..752dbe7ff017 100644
  		     "encoder's active_connectors set, but no crtc\n");
  
  		list_for_each_entry(connector, &dev->mode_config.connector_list,
-@@ -10879,19 +10879,19 @@ check_encoder_state(struct drm_device *dev)
+@@ -10783,19 +10783,19 @@ check_encoder_state(struct drm_device *dev)
  		if (!enabled && encoder->base.encoder_type == DRM_MODE_ENCODER_DPMST)
  			continue;
  
@@ -442,7 +450,7 @@ index cadc3bcf1de2..752dbe7ff017 100644
  		     "encoder's hw state doesn't match sw tracking "
  		     "(expected %i, found %i)\n",
  		     encoder->connectors_active, active);
-@@ -10900,7 +10900,7 @@ check_encoder_state(struct drm_device *dev)
+@@ -10804,7 +10804,7 @@ check_encoder_state(struct drm_device *dev)
  			continue;
  
  		tracked_pipe = to_intel_crtc(encoder->base.crtc)->pipe;
@@ -451,7 +459,7 @@ index cadc3bcf1de2..752dbe7ff017 100644
  		     "active encoder's pipe doesn't match"
  		     "(expected %i, found %i)\n",
  		     tracked_pipe, pipe);
-@@ -10925,7 +10925,7 @@ check_crtc_state(struct drm_device *dev)
+@@ -10829,7 +10829,7 @@ check_crtc_state(struct drm_device *dev)
  		DRM_DEBUG_KMS("[CRTC:%d]\n",
  			      crtc->base.base.id);
  
@@ -460,7 +468,7 @@ index cadc3bcf1de2..752dbe7ff017 100644
  		     "active crtc, but not enabled in sw tracking\n");
  
  		for_each_intel_encoder(dev, encoder) {
-@@ -10936,10 +10936,10 @@ check_crtc_state(struct drm_device *dev)
+@@ -10840,10 +10840,10 @@ check_crtc_state(struct drm_device *dev)
  				active = true;
  		}
  
@@ -473,7 +481,7 @@ index cadc3bcf1de2..752dbe7ff017 100644
  		     "crtc's computed enabled state doesn't match tracked enabled state "
  		     "(expected %i, found %i)\n", enabled, crtc->base.enabled);
  
-@@ -10959,13 +10959,13 @@ check_crtc_state(struct drm_device *dev)
+@@ -10863,13 +10863,13 @@ check_crtc_state(struct drm_device *dev)
  				encoder->get_config(encoder, &pipe_config);
  		}
  
@@ -489,14 +497,14 @@ index cadc3bcf1de2..752dbe7ff017 100644
  			intel_dump_pipe_config(crtc, &pipe_config,
  					       "[hw state]");
  			intel_dump_pipe_config(crtc, &crtc->config,
-@@ -10993,14 +10993,14 @@ check_shared_dpll_state(struct drm_device *dev)
+@@ -10897,14 +10897,14 @@ check_shared_dpll_state(struct drm_device *dev)
  
  		active = pll->get_hw_state(dev_priv, pll, &dpll_hw_state);
  
--		WARN(pll->active > pll->refcount,
-+		I915_STATE_WARN(pll->active > pll->refcount,
+-		WARN(pll->active > hweight32(pll->config.crtc_mask),
++		I915_STATE_WARN(pll->active > hweight32(pll->config.crtc_mask),
  		     "more active pll users than references: %i vs %i\n",
- 		     pll->active, pll->refcount);
+ 		     pll->active, hweight32(pll->config.crtc_mask));
 -		WARN(pll->active && !pll->on,
 +		I915_STATE_WARN(pll->active && !pll->on,
  		     "pll in active use but not on in sw tracking\n");
@@ -508,7 +516,7 @@ index cadc3bcf1de2..752dbe7ff017 100644
  		     "pll on state mismatch (expected %i, found %i)\n",
  		     pll->on, active);
  
-@@ -11010,14 +11010,14 @@ check_shared_dpll_state(struct drm_device *dev)
+@@ -10914,14 +10914,14 @@ check_shared_dpll_state(struct drm_device *dev)
  			if (crtc->active && intel_crtc_to_shared_dpll(crtc) == pll)
  				active_crtcs++;
  		}
@@ -516,29 +524,38 @@ index cadc3bcf1de2..752dbe7ff017 100644
 +		I915_STATE_WARN(pll->active != active_crtcs,
  		     "pll active crtcs mismatch (expected %i, found %i)\n",
  		     pll->active, active_crtcs);
--		WARN(pll->refcount != enabled_crtcs,
-+		I915_STATE_WARN(pll->refcount != enabled_crtcs,
+-		WARN(hweight32(pll->config.crtc_mask) != enabled_crtcs,
++		I915_STATE_WARN(hweight32(pll->config.crtc_mask) != enabled_crtcs,
  		     "pll enabled crtcs mismatch (expected %i, found %i)\n",
- 		     pll->refcount, enabled_crtcs);
+ 		     hweight32(pll->config.crtc_mask), enabled_crtcs);
  
--		WARN(pll->on && memcmp(&pll->hw_state, &dpll_hw_state,
-+		I915_STATE_WARN(pll->on && memcmp(&pll->hw_state, &dpll_hw_state,
+-		WARN(pll->on && memcmp(&pll->config.hw_state, &dpll_hw_state,
++		I915_STATE_WARN(pll->on && memcmp(&pll->config.hw_state, &dpll_hw_state,
  				       sizeof(dpll_hw_state)),
  		     "pll hw state mismatch\n");
  	}
 diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
-index 4bcd91757321..4b5d6c5ee544 100644
+index 9f6c8971855c..67adf6437f78 100644
 --- a/drivers/gpu/drm/i915/intel_dp.c
 +++ b/drivers/gpu/drm/i915/intel_dp.c
-@@ -1501,7 +1501,7 @@ static void edp_panel_vdd_off(struct intel_dp *intel_dp, bool sync)
+@@ -1558,7 +1558,7 @@ void intel_edp_panel_vdd_on(struct intel_dp *intel_dp)
+ 	vdd = edp_panel_vdd_on(intel_dp);
+ 	pps_unlock(intel_dp);
+ 
+-	WARN(!vdd, "eDP port %c VDD already requested on\n",
++	I915_STATE_WARN(!vdd, "eDP port %c VDD already requested on\n",
+ 	     port_name(dp_to_dig_port(intel_dp)->port));
+ }
+ 
+@@ -1642,7 +1642,7 @@ static void edp_panel_vdd_off(struct intel_dp *intel_dp, bool sync)
  	if (!is_edp(intel_dp))
  		return;
  
--	WARN(!intel_dp->want_panel_vdd, "eDP VDD not forced on");
-+	I915_STATE_WARN(!intel_dp->want_panel_vdd, "eDP VDD not forced on");
+-	WARN(!intel_dp->want_panel_vdd, "eDP port %c VDD not forced on",
++	I915_STATE_WARN(!intel_dp->want_panel_vdd, "eDP port %c VDD not forced on",
+ 	     port_name(dp_to_dig_port(intel_dp)->port));
  
  	intel_dp->want_panel_vdd = false;
- 
 -- 
 2.1.0
 
diff --git a/drm-radeon-dp-Set-EDP_CONFIGURATION_SET-for-bridge-c.patch b/drm-radeon-dp-Set-EDP_CONFIGURATION_SET-for-bridge-c.patch
deleted file mode 100644
index 0a0abd2..0000000
--- a/drm-radeon-dp-Set-EDP_CONFIGURATION_SET-for-bridge-c.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-From: Alex Deucher <alexander.deucher at amd.com>
-Date: Wed, 11 Feb 2015 18:34:36 -0500
-Subject: [PATCH] drm/radeon/dp: Set EDP_CONFIGURATION_SET for bridge chips if
- necessary
-
-Don't restrict it to just eDP panels.  Some LVDS bridge chips require
-this.  Fixes blank panels on resume on certain laptops.  Noticed
-by mrnuke on IRC.
-
-bug:
-https://bugs.freedesktop.org/show_bug.cgi?id=42960
-
-Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
-Cc: stable at vger.kernel.org
----
- drivers/gpu/drm/radeon/atombios_dp.c | 4 +---
- 1 file changed, 1 insertion(+), 3 deletions(-)
-
-diff --git a/drivers/gpu/drm/radeon/atombios_dp.c b/drivers/gpu/drm/radeon/atombios_dp.c
-index db42a670f995..5bf825dfaa09 100644
---- a/drivers/gpu/drm/radeon/atombios_dp.c
-+++ b/drivers/gpu/drm/radeon/atombios_dp.c
-@@ -623,10 +623,8 @@ static int radeon_dp_link_train_init(struct radeon_dp_link_train_info *dp_info)
- 		drm_dp_dpcd_writeb(dp_info->aux,
- 				   DP_DOWNSPREAD_CTRL, 0);
- 
--	if ((dp_info->connector->connector_type == DRM_MODE_CONNECTOR_eDP) &&
--	    (dig->panel_mode == DP_PANEL_MODE_INTERNAL_DP2_MODE)) {
-+	if (dig->panel_mode == DP_PANEL_MODE_INTERNAL_DP2_MODE)
- 		drm_dp_dpcd_writeb(dp_info->aux, DP_EDP_CONFIGURATION_SET, 1);
--	}
- 
- 	/* set the lane count on the sink */
- 	tmp = dp_info->dp_lane_count;
--- 
-2.1.0
-
diff --git a/hibernate-Disable-in-a-signed-modules-environment.patch b/hibernate-Disable-in-a-signed-modules-environment.patch
index 53dd6de..f1cc679 100644
--- a/hibernate-Disable-in-a-signed-modules-environment.patch
+++ b/hibernate-Disable-in-a-signed-modules-environment.patch
@@ -13,18 +13,18 @@ Signed-off-by: Josh Boyer <jwboyer at fedoraproject.org>
  1 file changed, 2 insertions(+), 1 deletion(-)
 
 diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c
-index a9dfa79b6bab..14c7356ff53a 100644
+index 2329daae5255..48a8e82c7e2e 100644
 --- a/kernel/power/hibernate.c
 +++ b/kernel/power/hibernate.c
-@@ -28,6 +28,7 @@
- #include <linux/syscore_ops.h>
+@@ -29,6 +29,7 @@
  #include <linux/ctype.h>
  #include <linux/genhd.h>
+ #include <linux/ktime.h>
 +#include <linux/module.h>
  #include <trace/events/power.h>
  
  #include "power.h"
-@@ -65,7 +66,7 @@ static const struct platform_hibernation_ops *hibernation_ops;
+@@ -66,7 +67,7 @@ static const struct platform_hibernation_ops *hibernation_ops;
  
  bool hibernation_available(void)
  {
@@ -34,5 +34,5 @@ index a9dfa79b6bab..14c7356ff53a 100644
  
  /**
 -- 
-1.9.3
+2.1.0
 
diff --git a/iommu-exynos-Play-nice-in-multi-platform-builds.patch b/iommu-exynos-Play-nice-in-multi-platform-builds.patch
new file mode 100644
index 0000000..950eebd
--- /dev/null
+++ b/iommu-exynos-Play-nice-in-multi-platform-builds.patch
@@ -0,0 +1,49 @@
+From: Thierry Reding <treding at nvidia.com>
+Date: Fri, 6 Feb 2015 11:44:05 +0100
+Subject: [PATCH] iommu/exynos: Play nice in multi-platform builds
+
+The Exynos System MMU driver unconditionally executes code and registers
+a struct iommu_ops with the platform bus irrespective of whether it runs
+on an Exynos SoC or not. This causes problems in multi-platform kernels
+where drivers for other SoCs will no longer be able to register their
+own struct iommu_ops or even try to use a struct iommu_ops for an IOMMU
+that obviously isn't there.
+
+The smallest fix I could think of is to check for the existence of any
+Exynos System MMU devices in the device tree and skip initialization
+otherwise.
+
+This fixes a problem on Tegra20 where the DRM driver will try to use the
+obviously non-existent Exynos System MMU.
+
+Reported-by: Nicolas Chauvet <kwizart at gmail.com>
+Cc: Kukjin Kim <kgene at kernel.org>
+Signed-off-by: Thierry Reding <treding at nvidia.com>
+Signed-off-by: Joerg Roedel <jroedel at suse.de>
+---
+ drivers/iommu/exynos-iommu.c | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/drivers/iommu/exynos-iommu.c b/drivers/iommu/exynos-iommu.c
+index 7ce52737c7a1..dc14fec4ede1 100644
+--- a/drivers/iommu/exynos-iommu.c
++++ b/drivers/iommu/exynos-iommu.c
+@@ -1186,8 +1186,15 @@ static const struct iommu_ops exynos_iommu_ops = {
+ 
+ static int __init exynos_iommu_init(void)
+ {
++	struct device_node *np;
+ 	int ret;
+ 
++	np = of_find_matching_node(NULL, sysmmu_of_match);
++	if (!np)
++		return 0;
++
++	of_node_put(np);
++
+ 	lv2table_kmem_cache = kmem_cache_create("exynos-iommu-lv2table",
+ 				LV2TABLE_SIZE, LV2TABLE_SIZE, 0, NULL);
+ 	if (!lv2table_kmem_cache) {
+-- 
+2.1.0
+
diff --git a/iommu-omap-Play-nice-in-multi-platform-builds.patch b/iommu-omap-Play-nice-in-multi-platform-builds.patch
new file mode 100644
index 0000000..8d57e42
--- /dev/null
+++ b/iommu-omap-Play-nice-in-multi-platform-builds.patch
@@ -0,0 +1,49 @@
+From: Thierry Reding <treding at nvidia.com>
+Date: Fri, 6 Feb 2015 11:44:06 +0100
+Subject: [PATCH] iommu/omap: Play nice in multi-platform builds
+
+The OMAP IOMMU driver unconditionally executes code and registers a
+struct iommu_ops with the platform bus irrespective of whether it runs
+on an OMAP SoC or not. This causes problems in multi-platform kernels
+where drivers for other SoCs will no longer be able to register their
+own struct iommu_ops or even try to use a struct iommu_ops for an IOMMU
+that obviously isn't there.
+
+The smallest fix I could think of is to check for the existence of any
+OMAP IOMMU devices in the device tree and skip initialization otherwise.
+
+This fixes a problem on Tegra20 where the DRM driver will try to use the
+obviously non-existent OMAP IOMMU.
+
+Reported-by: Nicolas Chauvet <kwizart at gmail.com>
+Cc: Tony Lindgren <tony at atomide.com>
+Cc: Suman Anna <s-anna at ti.com>
+Cc: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
+Signed-off-by: Thierry Reding <treding at nvidia.com>
+Acked-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
+Signed-off-by: Joerg Roedel <jroedel at suse.de>
+---
+ drivers/iommu/omap-iommu.c | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/drivers/iommu/omap-iommu.c b/drivers/iommu/omap-iommu.c
+index bbb7dcef02d3..19db0b684b7f 100644
+--- a/drivers/iommu/omap-iommu.c
++++ b/drivers/iommu/omap-iommu.c
+@@ -1376,6 +1376,13 @@ static int __init omap_iommu_init(void)
+ 	struct kmem_cache *p;
+ 	const unsigned long flags = SLAB_HWCACHE_ALIGN;
+ 	size_t align = 1 << 10; /* L2 pagetable alignement */
++	struct device_node *np;
++
++	np = of_find_matching_node(NULL, omap_iommu_of_match);
++	if (!np)
++		return 0;
++
++	of_node_put(np);
+ 
+ 	p = kmem_cache_create("iopte_cache", IOPTE_TABLE_SIZE, align, flags,
+ 			      iopte_cachep_ctor);
+-- 
+2.1.0
+
diff --git a/iommu-rockchip-Play-nice-in-multi-platform-builds.patch b/iommu-rockchip-Play-nice-in-multi-platform-builds.patch
new file mode 100644
index 0000000..0050b89
--- /dev/null
+++ b/iommu-rockchip-Play-nice-in-multi-platform-builds.patch
@@ -0,0 +1,52 @@
+From: Thierry Reding <treding at nvidia.com>
+Date: Fri, 6 Feb 2015 11:44:07 +0100
+Subject: [PATCH] iommu/rockchip: Play nice in multi-platform builds
+
+The Rockchip IOMMU driver unconditionally executes code and registers a
+struct iommu_ops with the platform bus irrespective of whether it runs
+on a Rockchip SoC or not. This causes problems in multi-platform kernels
+where drivers for other SoCs will no longer be able to register their
+own struct iommu_ops or even try to use a struct iommu_ops for an IOMMU
+that obviously isn't there.
+
+The smallest fix I could think of is to check for the existence of any
+Rockchip IOMMU devices in the device tree and skip initialization
+otherwise.
+
+This fixes a problem on Tegra20 where the DRM driver will try to use the
+obviously non-existent Rockchip IOMMU.
+
+Reported-by: Nicolas Chauvet <kwizart at gmail.com>
+Cc: Heiko Stuebner <heiko at sntech.de>
+Cc: Daniel Kurtz <djkurtz at chromium.org>
+Reviewed-by: Heiko Stuebner <heiko at sntech.de>
+Tested-by: Heiko Stuebner <heiko at sntech.de>
+Signed-off-by: Thierry Reding <treding at nvidia.com>
+Signed-off-by: Joerg Roedel <jroedel at suse.de>
+---
+ drivers/iommu/rockchip-iommu.c | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/drivers/iommu/rockchip-iommu.c b/drivers/iommu/rockchip-iommu.c
+index 6a8b1ec4a48a..9f74fddcd304 100644
+--- a/drivers/iommu/rockchip-iommu.c
++++ b/drivers/iommu/rockchip-iommu.c
+@@ -1015,8 +1015,15 @@ static struct platform_driver rk_iommu_driver = {
+ 
+ static int __init rk_iommu_init(void)
+ {
++	struct device_node *np;
+ 	int ret;
+ 
++	np = of_find_matching_node(NULL, rk_iommu_dt_ids);
++	if (!np)
++		return 0;
++
++	of_node_put(np);
++
+ 	ret = bus_set_iommu(&platform_bus_type, &rk_iommu_ops);
+ 	if (ret)
+ 		return ret;
+-- 
+2.1.0
+
diff --git a/kernel-arm64.patch b/kernel-arm64.patch
index e98d10a..df9c19d 100644
--- a/kernel-arm64.patch
+++ b/kernel-arm64.patch
@@ -1,1920 +1,59 @@
-commit 0335b5034b998e978bf9343da77246bcbad33981
-Author: Mark Salter <msalter at redhat.com>
-Date:   Wed Nov 19 10:32:11 2014 -0500
-
-    arm64: explicitly set noncoherent ops for _CCA handling
-    
-    Signed-off-by: Mark Salter <msalter at redhat.com>
-
-commit 4a2d43442e20a24b78594d12914706deddc119de
-Author: Mark Salter <msalter at redhat.com>
-Date:   Mon Nov 10 17:09:29 2014 -0500
-
-    DO NOT UPSTREAM - pci/xgene: Provide fixup for ACPI MCFG support
-    
-    Xgene doesn't decode bus bits of mmconfig region and only
-    supports devfn 0 of bus 0. For other buses/devices, some
-    internal registers need to be poked. This patch provides
-    a fixup to support ACPI MCFG tables. This is a horrible
-    hack allowing the hardware to be used for PCI testing, but
-    it is not intended to be a long term patch.
-    
-    Signed-off-by: Mark Salter <msalter at redhat.com>
-
-commit b93f804830d9ef6d572dd6be9734108199141b87
-Author: Mark Salter <msalter at redhat.com>
-Date:   Mon Nov 10 17:33:18 2014 -0500
-
-    DO NOT UPSTREAM - provide hook for MCFG fixups
-    
-    This is a temprary mechanism needed by at least one early
-    arm64 hardware platform with broken MCFG support. This is
-    not intended for upstream and will go away as soon as newer
-    hardware with fully compliant ECAM becomes available.
-    
-    Signed-off-by: Mark Salter <msalter at redhat.com>
-
-commit 2d76cb937a6c0010d1de181d0142f0822df5071d
-Author: Mark Salter <msalter at redhat.com>
-Date:   Mon Nov 10 17:30:25 2014 -0500
-
-    arm64/pci/acpi: initial support for ACPI probing of PCI
-    
-    Signed-off-by: Mark Salter <msalter at redhat.com>
-
-commit a438ff7be0140738b1224d5ade6345a9febad279
-Author: Mark Salter <msalter at redhat.com>
-Date:   Mon Nov 10 17:23:57 2014 -0500
-
-    arm64/acpi/pci: add support for parsing MCFG table
-    
-    Add support for parsing MCFG table and provide functions to read/write
-    PCI configuration space based on the parsed info. This provides the
-    low-level raw_pci_read/raw_pci_write functionality.
-    
-    Signed-off-by: Mark Salter <msalter at redhat.com>
-
-commit 814b22167d35b18fc3de745277a2190ff0841585
-Author: Mark Salter <msalter at redhat.com>
-Date:   Mon Nov 10 16:42:14 2014 -0500
-
-    DO NOT UPSTREAM - pci/xgene: workaround CRS issue
-    
-    CRS is not behaving properly for some reason. Until this
-    gets diagnosed properly, pretend not to support it in order
-    to prevent hangs in 3.18 kernel.
-    
-    Signed-off-by: Mark Salter <msalter at redhat.com>
-
-commit b90d000000801b473ed4c69757d3be9e433b6c5e
-Author: Mark Salter <msalter at redhat.com>
-Date:   Mon Nov 10 16:31:05 2014 -0500
-
-    iommu/arm-smmu: fix NULL dereference with ACPI PCI devices
-    
-    Fix a NULL dereference in find_mmu_master which occurs when
-    booting with ACPI. In that case, PCI bridges with not have
-    an of_node. Add a check for NULL of_node and bail out if that
-    is the case.
-    
-    Signed-off-by: Mark Salter <msalter at redhat.com>
-
-commit 243e5c1dc198958ce862e39d33efc798a47b339a
-Author: Mark Salter <msalter at redhat.com>
-Date:   Mon Nov 10 21:35:11 2014 -0500
-
-    DO NOT UPSTREAM - arm64: fix dma_ops for ACPI and PCI devices
-    
-    Commit 2189064795dc3fb4101e5:
-    
-      arm64: Implement set_arch_dma_coherent_ops() to replace bus notifiers
-    
-    removed the bus notifiers from dma-mapping.c. This patch
-    adds the notifier back for ACPI and PCI devices until a
-    better permanent solution is worked out.
-    
-    Signed-off-by: Mark Salter <msalter at redhat.com>
-
-commit 612eea3ae291b28f7ed50ccf50bd1685a2a7f753
-Author: Mark Salter <msalter at redhat.com>
-Date:   Thu Aug 14 12:32:13 2014 -0400
-
-    acpi: add utility to test for device dma coherency
-    
-    ACPI 5.1 adds a _CCA object to indicate memory coherency
-    of a bus master device. It is an integer with zero meaning
-    non-coherent and one meaning coherent. This attribute may
-    be inherited from a parent device. It may also be missing
-    entirely, in which case, an architecture-specific default
-    is assumed.
-    
-    This patch adds a utility function to parse a device handle
-    (and its parents) for a _CCA object and return the coherency
-    attribute if found.
-    
-    Signed-off-by: Mark Salter <msalter at redhat.com>
-
-commit 3d509a508c6fd70eb0fb2f0e82d08d92cc96568c
-Author: Mark Salter <msalter at redhat.com>
-Date:   Sat Nov 22 12:08:53 2014 -0500
-
-    DO NOT UPSTREAM - arm64: kvm: Change vgic resource size error to info
-    
-    From: Donald Dutile <ddutile at redhat.com>
-    
-    A new check was added to upstream to ensure a full
-    kernel page was allocated to the vgic.  The check failed
-    kvm configuration if the condition wasn't met. An arm64
-    kernel with 64K pagesize and certain early firmware will
-    fail this test. Change error to info & continue configuration
-    for now.
-    
-    Signed-off-by: Mark Salter <msalter at redhat.com>
-
-commit 2b5dd4609e947b418afbbeae95da7f34594bc048
-Author: Wei Huang <wei at redhat.com>
-Date:   Sat Nov 22 10:38:45 2014 -0500
-
-    KVM/ACPI: Enable ACPI support for KVM virt GIC
-    
-    This patches enables ACPI support for KVM virtual GIC. KVM parses
-    ACPI table for virt GIC related information when DT table is not
-    present. This is done by retrieving the information defined in
-    generic_interrupt entry of MADT table.
-    
-    Note: Alexander Spyridakis from Virtual Open System posts a
-    _very_ similar patch to enable acpi-kvm. This patch borrows some
-    ideas from his patch.
-    
-    Signed-off-by: Wei Huang <wei at redhat.com>
-    [combined with subsequent patch to use acpi_disabled]
-    Signed-off-by: Mark Salter <msalter at redhat.com>
-
-commit 756fc31666a4a3094727da5274fc0705a05f13a3
-Author: Wei Huang <wei at redhat.com>
-Date:   Sat Nov 22 10:18:57 2014 -0500
-
-    KVM/ACPI: Enable ACPI support for virt arch timer
-    
-    This patches enables ACPI support for KVM virtual arch_timer. It
-    allows KVM to parse ACPI table for virt arch_timer PPI when DT table
-    is not present. This is done by retrieving the information from
-    arch_timer_ppi array in arm_arch_timer driver.
-    
-    Signed-off-by: Wei Huang <wei at redhat.com>
-    [combined with subsequent patch to use acpi_disabled]
-    Signed-off-by: Mark Salter <msalter at redhat.com>
-
-commit b189108603f6db4a11e0c30050e840e8bb36f098
-Author: Ard Biesheuvel <ard.biesheuvel at linaro.org>
-Date:   Tue Nov 18 21:52:34 2014 +0100
-
-    arm, arm64: KVM: handle potential incoherency of readonly memslots
-    
-    Upstream posting:
-    http://thread.gmane.org/gmane.comp.emulators.kvm.devel/129475/focus=129477
-    
-    Readonly memslots are often used to implement emulation of ROMs and
-    NOR flashes, in which case the guest may legally map these regions as
-    uncached.
-    To deal with the incoherency associated with uncached guest mappings,
-    treat all readonly memslots as incoherent, and ensure that pages that
-    belong to regions tagged as such are flushed to DRAM before being passed
-    to the guest.
-    
-    Signed-off-by: Ard Biesheuvel <ard.biesheuvel at linaro.org>
-    
-    Acadia backport notes:
-    
-    - we have a few more conflicts here. The main thing is that our
-      kvm_arch_prepare_memory_region() is "empty" at the moment; in upstream
-      Ard introduced performance related, host device related code there, in
-      commit 8eef91239.
-    
-      What we certainly need to grab from commit 8eef91239 is the acquiring of
-      "kvm->mmu_lock" (which is visible in the upstream patch context too),
-      and the filtering against
-    
-        (change != KVM_MR_CREATE && change != KVM_MR_MOVE)
-    
-      near the top of the function (which is not visible in the upstream patch
-      context). (If (change == KVM_MR_DELETE), then the caller has set up
-      "memslot" in such a way that calling stage2_flush_memslot() on it is
-      invalid, and it would actually crash the host -- speaking from
-      experience. :))
-    
-    - The hunk that seems to matter in practice, in my testing on Mustang, is
-      the "fault_ipa_uncached" assignment one (which  affects the the
-      demand-paged case, ie. the coherent_cache_guest_page() function,
-      modified in the previous patch).
-    
-      The kvm_arch_prepare_memory_region() hunk exists for completeness of
-      implementation, and while it could certainly make a difference, I've
-      never seen it make one, in my testing. We should pick it up nonetheless.
-    
-    Signed-off-by: Laszlo Ersek <lersek at redhat.com>
-
-commit 8ab19d68b49c2f6a9f0e6226c51bf9b2fe553022
-Author: Laszlo Ersek <lersek at redhat.com>
-Date:   Tue Nov 18 21:52:33 2014 +0100
-
-    arm, arm64: KVM: allow forced dcache flush on page faults
-    
-    Upstream posting:
-    http://thread.gmane.org/gmane.comp.emulators.kvm.devel/129475/focus=129476
-    
-    From: Laszlo Ersek <lersek at redhat.com>
-    
-    To allow handling of incoherent memslots in a subsequent patch, this
-    patch adds a paramater 'ipa_uncached' to cache_coherent_guest_page()
-    so that we can instruct it to flush the page's contents to DRAM even
-    if the guest has caching globally enabled.
-    
-    Signed-off-by: Laszlo Ersek <lersek at redhat.com>
-    Signed-off-by: Ard Biesheuvel <ard.biesheuvel at linaro.org>
-    
-    Acadia backport notes:
-    - minimal context conflict in user_mem_abort(): upstream passes
-    
-        pgprot_val(mem_type) == pgprot_val(PAGE_S2_DEVICE)
-    
-      as last parameter of stage2_set_pte(), while we do a direct comparison.
-    
-      (See upstream commit 3d08c629, "arm: kvm: STRICT_MM_TYPECHECKS fix for
-      user_mem_abort".)
-    
-    Signed-off-by: Laszlo Ersek <lersek at redhat.com>
-
-commit 1ac87393dff5d6fb10edfba84dfff89f57a7224a
-Author: Ard Biesheuvel <ard.biesheuvel at linaro.org>
-Date:   Tue Nov 18 21:52:32 2014 +0100
-
-    kvm: add a memslot flag for incoherent memory regions
-    
-    Upstream posting:
-    http://thread.gmane.org/gmane.comp.emulators.kvm.devel/129475
-    
-    Memory regions may be incoherent with the caches, typically when the
-    guest has mapped a host system RAM backed memory region as uncached.
-    Add a flag KVM_MEMSLOT_INCOHERENT so that we can tag these memslots
-    and handle them appropriately when mapping them.
-    
-    Signed-off-by: Ard Biesheuvel <ard.biesheuvel at linaro.org>
-    Signed-off-by: Laszlo Ersek <lersek at redhat.com>
-
-commit 2a0a5cbf98c94e2906d9a357a63fbbb153488e1c
-Author: Tom Lendacky <thomas.lendacky at amd.com>
-Date:   Mon Sep 15 17:02:52 2014 -0600
-
-    amd-xgbe: AMD 10GbE driver APCI support for A0
-    
-    This patch provides ACPI support for the AMD 10GbE device driver
-    and AMD 10GbE phy driver.
-    
-    Signed-off-by: Tom Lendacky <thomas.lendacky at amd.com>
-
-commit 807e95abb96e7868e1c8e863a92298937a69d437
-Author: Mark Salter <msalter at redhat.com>
-Date:   Tue Oct 7 12:54:08 2014 -0400
-
-    xgene acpi network - first cut
-
-commit bdecd2af5d4234ed50042ab28a21736edcec6d41
-Author: Geert Uytterhoeven <geert+renesas at glider.be>
-Date:   Thu Nov 6 12:23:23 2014 +0100
-
-    leds: leds-gpio: Fix legacy GPIO number case
-    
-    In the legacy case, led_dat->gpiod is initialized correctly, but
-    overwritten later by template->gpiod, which is NULL, causing leds-gpio
-    to fail with:
-    
-        gpiod_direction_output: invalid GPIO
-        leds-gpio: probe of leds-gpio failed with error -22
-    
-    Move the initialization of led_dat->gpiod from template->gpiod up, and
-    always use led_dat->gpiod later, to fix this.
-    
-    Fixes: 5c51277a9ababfa4 (leds: leds-gpio: Add support for GPIO descriptors)
-    Signed-off-by: Geert Uytterhoeven <geert+renesas at glider.be>
-    Reviewed-by: Mika Westerberg <mika.westerberg at linux.intel.com>
-    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
-
-commit 42b0d1b64cdf1c8d37e69ff7cff45852f7a16f65
-Author: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
-Date:   Wed Nov 5 00:29:07 2014 +0100
-
-    ACPI / property: Drop size_prop from acpi_dev_get_property_reference()
-    
-    The size_prop argument of the recently added function
-    acpi_dev_get_property_reference() is not used by the only current
-    caller of that function and is very unlikely to be used at any time
-    going forward.
-    
-    Namely, for a property whose value is a list of items each containing
-    a references to a device object possibly accompanied by some integers,
-    the number of items in the list can always be computed as the number
-    of elements of type ACPI_TYPE_LOCAL_REFERENCE in the property package.
-    Thus it should never be necessary to provide an additional "cells"
-    property with a value equal to the number of items in that list.  It
-    also should never be necessary to provide a "cells" property specifying
-    how many integers are supposed to be following each reference.
-    
-    For this reason, drop the size_prop argument from
-    acpi_dev_get_property_reference() and update its caller accordingly.
-    
-    Link: http://marc.info/?l=linux-kernel&m=141511255610556&w=2
-    Suggested-by: Grant Likely <grant.likely at linaro.org>
-    Acked-by: Grant Likely <grant.likely at linaro.org>
-    Acked-by: Mika Westerberg <mika.westerberg at linux.intel.com>
-    Tested-by: Mika Westerberg <mika.westerberg at linux.intel.com>
-    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
-
-commit c3f29cda7420da6a721d40d116f369cfc1533d38
-Author: Mika Westerberg <mika.westerberg at linux.intel.com>
-Date:   Fri Oct 31 13:40:58 2014 +0200
-
-    leds: leds-gpio: Convert gpio_blink_set() to use GPIO descriptors
-    
-    Commit 21f2aae91e902aad ("leds: leds-gpio: Add support for GPIO
-    descriptors") already converted most of the driver to use GPIO descriptors.
-    What is still missing is the platform specific hook gpio_blink_set() and
-    board files which pass legacy GPIO numbers to this driver in platform data.
-    
-    In this patch we handle the former and convert gpio_blink_set() to take
-    GPIO descriptor instead. In order to do this we convert the existing four
-    users to accept GPIO descriptor and translate it to legacy GPIO number in
-    the platform code. This effectively "pushes" legacy GPIO number usage from
-    the driver to platforms.
-    
-    Also add comment to the remaining block describing that it is legacy code
-    path and we are getting rid of it eventually.
-    
-    Suggested-by: Linus Walleij <linus.walleij at linaro.org>
-    Signed-off-by: Mika Westerberg <mika.westerberg at linux.intel.com>
-    Acked-by: Andrew Lunn <andrew at lunn.ch>
-    Reviewed-by: Linus Walleij <linus.walleij at linaro.org>
-    Acked-by: Alexandre Courbot <acourbot at nvidia.com>
-    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
-
-commit 4117b39d39f59d2497ceac1091ec54aa3056cb4f
-Author: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
-Date:   Mon Nov 3 23:39:57 2014 +0100
-
-    ACPI / GPIO: Document ACPI GPIO mappings API
-    
-    Document the previously introduced method that can be used by device
-    drivers to provide the GPIO subsystem with mappings between GPIO names
-    (connection IDs) and GpioIo()/GpioInt() resources in _CRS.
-    
-    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
-    Reviewed-by: Mika Westerberg <mika.westerberg at linux.intel.com>
-
-commit d9345c86ad290bb4ca98b37520f94fc8075b2b94
-Author: Mika Westerberg <mika.westerberg at linux.intel.com>
-Date:   Mon Oct 27 12:15:14 2014 +0200
-
-    net: rfkill: gpio: Add default GPIO driver mappings for ACPI
-    
-    The driver uses devm_gpiod_get_index(..., index) so that the index refers
-    directly to the GpioIo resource under the ACPI device. The problem with
-    this is that if the ordering changes we get wrong GPIOs.
-    
-    With ACPI 5.1 _DSD we can now use names instead to reference GPIOs
-    analogous to Device Tree. However, we still have systems out there that do
-    not provide _DSD at all. These systems must be supported as well.
-    
-    Luckily we now have acpi_dev_add_driver_gpios() that can be used to provide
-    mappings for systems where _DSD is not provided and still take advantage of
-    _DSD if it exists.
-    
-    This patch changes the driver to create default GPIO mappings if we are
-    running on ACPI system.
-    
-    While there we can drop the indices completely and use devm_gpiod_get()
-    with name instead.
-    
-    Signed-off-by: Mika Westerberg <mika.westerberg at linux.intel.com>
-    Reviewed-by: Johannes Berg <johannes at sipsolutions.net>
-    Acked-by: John W. Linville <linville at tuxdriver.com>
-    Acked-by: Linus Walleij <linus.walleij at linaro.org>
-    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
-
-commit 22cb8c44e198b7e3f3299324edbcaa1389016d52
-Author: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
-Date:   Mon Nov 3 23:39:41 2014 +0100
-
-    ACPI / GPIO: Driver GPIO mappings for ACPI GPIOs
-    
-    Provide a way for device drivers using GPIOs described by ACPI
-    GpioIo resources in _CRS to tell the GPIO subsystem what names
-    (connection IDs) to associate with specific GPIO pins defined
-    in there.
-    
-    To do that, a driver needs to define a mapping table as a
-    NULL-terminated array of struct acpi_gpio_mapping objects
-    that each contain a name, a pointer to an array of line data
-    (struct acpi_gpio_params) objects and the size of that array.
-    
-    Each struct acpi_gpio_params object consists of three fields,
-    crs_entry_index, line_index, active_low, representing the index of
-    the target GpioIo()/GpioInt() resource in _CRS starting from zero,
-    the index of the target line in that resource starting from zero,
-    and the active-low flag for that line, respectively.
-    
-    Next, the mapping table needs to be passed as the second
-    argument to acpi_dev_add_driver_gpios() that will register it with
-    the ACPI device object pointed to by its first argument.  That
-    should be done in the driver's .probe() routine.
-    
-    On removal, the driver should unregister its GPIO mapping table
-    by calling acpi_dev_remove_driver_gpios() on the ACPI device
-    object where that table was previously registered.
-    
-    Included are fixes from Mika Westerberg.
-    
-    Acked-by: Alexandre Courbot <acourbot at nvidia.com>
-    Reviewed-by: Linus Walleij <linus.walleij at linaro.org>
-    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
-
-commit c70e2807a8bacbdfed992b58ca24eb152a778a01
-Author: Aaron Lu <aaron.lu at intel.com>
-Date:   Tue Oct 21 13:34:00 2014 +0200
-
-    input: gpio_keys_polled: Make use of device property API
-    
-    Make use of device property API in this driver so that both OF based
-    system and ACPI based system can use this driver.
-    
-    Signed-off-by: Aaron Lu <aaron.lu at intel.com>
-    Signed-off-by: Mika Westerberg <mika.westerberg at linux.intel.com>
-    Acked-by: Dmitry Torokhov <dmitry.torokhov at gmail.com>
-    Acked-by: Grant Likely <grant.likely at linaro.org>
-    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
-
-commit 29257e751014d0d43f78bcfecd9a56a603096c95
-Author: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
-Date:   Mon Oct 27 23:30:10 2014 +0100
-
-    leds: leds-gpio: Make use of device property API
-    
-    Make use of device property API in this driver so that both OF and ACPI
-    based system can use the same driver.
-    
-    This change contains material from Max Eliaser and Mika Westerberg.
-    
-    Signed-off-by: Mika Westerberg <mika.westerberg at linux.intel.com>
-    Acked-by: Bryan Wu <cooloney at gmail.com>
-    Acked-by: Grant Likely <grant.likely at linaro.org>
-    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
-
-commit 08ddbc9678ce8465f17acc8e1b1b67442593d1b5
-Author: Mika Westerberg <mika.westerberg at linux.intel.com>
-Date:   Tue Oct 21 13:33:59 2014 +0200
-
-    gpio: Support for unified device properties interface
-    
-    Some drivers need to deal with only firmware representation of its
-    GPIOs. An example would be a GPIO button array driver where each button
-    is described as a separate firmware node in device tree. Typically these
-    child nodes do not have physical representation in the Linux device
-    model.
-    
-    In order to help device drivers to handle such firmware child nodes we
-    add dev[m]_get_named_gpiod_from_child() that takes a child firmware
-    node pointer as its second argument (the first one is the parent device
-    itself), finds the GPIO using whatever is the underlying firmware
-    method, and requests the GPIO properly.
-    
-    Signed-off-by: Mika Westerberg <mika.westerberg at linux.intel.com>
-    Acked-by: Alexandre Courbot <acourbot at nvidia.com>
-    Acked-by: Grant Likely <grant.likely at linaro.org>
-    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
-
-commit 880614f83402ae8b408f33cb252505da0760f3e5
-Author: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
-Date:   Tue Nov 4 14:03:59 2014 +0100
-
-    Driver core: Unified interface for firmware node properties
-    
-    Add new generic routines are provided for retrieving properties from
-    device description objects in the platform firmware in case there are
-    no struct device objects for them (either those objects have not been
-    created yet or they do not exist at all).
-    
-    The following functions are provided:
-    
-    fwnode_property_present()
-    fwnode_property_read_u8()
-    fwnode_property_read_u16()
-    fwnode_property_read_u32()
-    fwnode_property_read_u64()
-    fwnode_property_read_string()
-    fwnode_property_read_u8_array()
-    fwnode_property_read_u16_array()
-    fwnode_property_read_u32_array()
-    fwnode_property_read_u64_array()
-    fwnode_property_read_string_array()
-    
-    in analogy with the corresponding functions for struct device added
-    previously.  For all of them, the first argument is a pointer to struct
-    fwnode_handle (new type) that allows a device description object
-    (depending on what platform firmware interface is in use) to be
-    obtained.
-    
-    Add a new macro device_for_each_child_node() for iterating over the
-    children of the device description object associated with a given
-    device and a new function device_get_child_node_count() returning the
-    number of a given device's child nodes.
-    
-    The interface covers both ACPI and Device Trees.
-    
-    Suggested-by: Grant Likely <grant.likely at linaro.org>
-    Acked-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
-    Acked-by: Grant Likely <grant.likely at linaro.org>
-    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
-
-commit b5923f9dc379c1861a70d8836c7d9976d9521390
-Author: Aaron Lu <aaron.lu at intel.com>
-Date:   Tue Oct 21 23:30:25 2014 +0200
-
-    input: gpio_keys_polled: Add support for GPIO descriptors
-    
-    GPIO descriptors are the preferred way over legacy GPIO numbers
-    nowadays. Convert the driver to use GPIO descriptors internally but
-    still allow passing legacy GPIO numbers from platform data to support
-    existing platforms.
-    
-    Signed-off-by: Aaron Lu <aaron.lu at intel.com>
-    Signed-off-by: Mika Westerberg <mika.westerberg at linux.intel.com>
-    Acked-by: Alexandre Courbot <acourbot at nvidia.com>
-    Reviewed-by: Linus Walleij <linus.walleij at linaro.org>
-    Acked-by: Dmitry Torokhov <dmitry.torokhov at gmail.com>
-    Acked-by: Grant Likely <grant.likely at linaro.org>
-    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
-
-commit 5c3c4fe36a05672113646f8fb839e4c91256ef5d
-Author: Mika Westerberg <mika.westerberg at linux.intel.com>
-Date:   Mon Oct 27 23:29:32 2014 +0100
-
-    leds: leds-gpio: Add support for GPIO descriptors
-    
-    GPIO descriptors are the preferred way over legacy GPIO numbers
-    nowadays. Convert the driver to use GPIO descriptors internally but
-    still allow passing legacy GPIO numbers from platform data to support
-    existing platforms.
-    
-    Signed-off-by: Mika Westerberg <mika.westerberg at linux.intel.com>
-    Acked-by: Alexandre Courbot <acourbot at nvidia.com>
-    Acked-by: Bryan Wu <cooloney at gmail.com>
-    Acked-by: Arnd Bergmann <arnd at arndb.de>
-    Acked-by: Grant Likely <grant.likely at linaro.org>
-    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
-
-commit 8105c03352f32060c765837cbb7d619e075289d9
-Author: Mika Westerberg <mika.westerberg at linux.intel.com>
-Date:   Tue Oct 21 13:33:56 2014 +0200
-
-    gpio: sch: Consolidate core and resume banks
-    
-    This is actually a single device with two sets of identical registers,
-    which just happen to start from a different offset. Instead of having
-    separate GPIO chips created we consolidate them to be single GPIO chip.
-    
-    In addition having a single GPIO chip allows us to handle ACPI GPIO
-    translation in the core in a more generic way, since the two GPIO chips
-    share the same parent ACPI device.
-    
-    Signed-off-by: Mika Westerberg <mika.westerberg at linux.intel.com>
-    Acked-by: Linus Walleij <linus.walleij at linaro.org>
-    Acked-by: Grant Likely <grant.likely at linaro.org>
-    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
-
-commit ce0e2672808ce2805d0aadfd12d94e2dd6be5ab9
-Author: Mika Westerberg <mika.westerberg at linux.intel.com>
-Date:   Wed Oct 29 15:41:01 2014 +0100
-
-    gpio / ACPI: Add support for _DSD device properties
-    
-    With release of ACPI 5.1 and _DSD method we can finally name GPIOs (and
-    other things as well) returned by _CRS. Previously we were only able to
-    use integer index to find the corresponding GPIO, which is pretty error
-    prone if the order changes.
-    
-    With _DSD we can now query GPIOs using name instead of an integer index,
-    like the below example shows:
-    
-      // Bluetooth device with reset and shutdown GPIOs
-      Device (BTH)
-      {
-          Name (_HID, ...)
-    
-          Name (_CRS, ResourceTemplate ()
-          {
-              GpioIo (Exclusive, PullUp, 0, 0, IoRestrictionInputOnly,
-                      "\\_SB.GPO0", 0, ResourceConsumer) {15}
-              GpioIo (Exclusive, PullUp, 0, 0, IoRestrictionInputOnly,
-                      "\\_SB.GPO0", 0, ResourceConsumer) {27, 31}
-          })
-    
-          Name (_DSD, Package ()
-          {
-              ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
-              Package ()
-    	  {
-                  Package () {"reset-gpio", Package() {^BTH, 1, 1, 0 }},
-                  Package () {"shutdown-gpio", Package() {^BTH, 0, 0, 0 }},
-              }
-          })
-      }
-    
-    The format of the supported GPIO property is:
-    
-      Package () { "name", Package () { ref, index, pin, active_low }}
-    
-      ref - The device that has _CRS containing GpioIo()/GpioInt() resources,
-            typically this is the device itself (BTH in our case).
-      index - Index of the GpioIo()/GpioInt() resource in _CRS starting from zero.
-      pin - Pin in the GpioIo()/GpioInt() resource. Typically this is zero.
-      active_low - If 1 the GPIO is marked as active_low.
-    
-    Since ACPI GpioIo() resource does not have field saying whether it is
-    active low or high, the "active_low" argument can be used here. Setting
-    it to 1 marks the GPIO as active low.
-    
-    In our Bluetooth example the "reset-gpio" refers to the second GpioIo()
-    resource, second pin in that resource with the GPIO number of 31.
-    
-    This patch implements necessary support to gpiolib for extracting GPIOs
-    using _DSD device properties.
-    
-    Signed-off-by: Mika Westerberg <mika.westerberg at linux.intel.com>
-    Acked-by: Linus Walleij <linus.walleij at linaro.org>
-    Acked-by: Grant Likely <grant.likely at linaro.org>
-    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
-
-commit e072a051ef3a5d612949dc22ca71e40dbe978ed1
-Author: Mika Westerberg <mika.westerberg at linux.intel.com>
-Date:   Tue Oct 21 13:33:56 2014 +0200
-
-    misc: at25: Make use of device property API
-    
-    Make use of device property API in this driver so that both DT and ACPI
-    based systems can use this driver.
-    
-    In addition we hard-code the name of the chip to be "at25" for the
-    reason that there is no common mechanism to fetch name of the firmware
-    node. The only existing user (arch/arm/boot/dts/phy3250.dts) uses the
-    same name so it should continue to work.
-    
-    Signed-off-by: Mika Westerberg <mika.westerberg at linux.intel.com>
-    Acked-by: Grant Likely <grant.likely at linaro.org>
-    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
-
-commit e176d66bf1a8e613e501dae1fc6798e1a42b7062
-Author: Mika Westerberg <mika.westerberg at linux.intel.com>
-Date:   Tue Oct 21 13:33:56 2014 +0200
-
-    ACPI: Allow drivers to match using Device Tree compatible property
-    
-    We have lots of existing Device Tree enabled drivers and allocating
-    separate _HID for each is not feasible. Instead we allocate special _HID
-    "PRP0001" that means that the match should be done using Device Tree
-    compatible property using driver's .of_match_table instead if the driver
-    is missing .acpi_match_table.
-    
-    If there is a need to distinguish from where the device is enumerated
-    (DT/ACPI) driver can check dev->of_node or ACPI_COMPATION(dev).
-    
-    Signed-off-by: Mika Westerberg <mika.westerberg at linux.intel.com>
-    Acked-by: Grant Likely <grant.likely at linaro.org>
-    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
-
-commit e30b98eab5645fa42d372cc1be44e22db5f5e9b8
-Author: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
-Date:   Tue Nov 4 01:28:56 2014 +0100
-
-    Driver core: Unified device properties interface for platform firmware
-    
-    Add a uniform interface by which device drivers can request device
-    properties from the platform firmware by providing a property name
-    and the corresponding data type.  The purpose of it is to help to
-    write portable code that won't depend on any particular platform
-    firmware interface.
-    
-    The following general helper functions are added:
-    
-    device_property_present()
-    device_property_read_u8()
-    device_property_read_u16()
-    device_property_read_u32()
-    device_property_read_u64()
-    device_property_read_string()
-    device_property_read_u8_array()
-    device_property_read_u16_array()
-    device_property_read_u32_array()
-    device_property_read_u64_array()
-    device_property_read_string_array()
-    
-    The first one allows the caller to check if the given property is
-    present.  The next 5 of them allow single-valued properties of
-    various types to be retrieved in a uniform way.  The remaining 5 are
-    for reading properties with multiple values (arrays of either numbers
-    or strings).
-    
-    The interface covers both ACPI and Device Trees.
-    
-    This change set includes material from Mika Westerberg and Aaron Lu.
-    
-    Signed-off-by: Aaron Lu <aaron.lu at intel.com>
-    Signed-off-by: Mika Westerberg <mika.westerberg at linux.intel.com>
-    Acked-by: Greg Kroah-Hartman <gregkh at linuxfoundation.org>
-    Acked-by: Grant Likely <grant.likely at linaro.org>
-    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
-
-commit a8762c178234b62dce5e55df8de8528857a47bb7
-Author: Mika Westerberg <mika.westerberg at linux.intel.com>
-Date:   Tue Oct 21 13:33:55 2014 +0200
-
-    ACPI: Add support for device specific properties
-    
-    Device Tree is used in many embedded systems to describe the system
-    configuration to the OS. It supports attaching properties or name-value
-    pairs to the devices it describe. With these properties one can pass
-    additional information to the drivers that would not be available
-    otherwise.
-    
-    ACPI is another configuration mechanism (among other things) typically
-    seen, but not limited to, x86 machines. ACPI allows passing arbitrary
-    data from methods but there has not been mechanism equivalent to Device
-    Tree until the introduction of _DSD in the recent publication of the
-    ACPI 5.1 specification.
-    
-    In order to facilitate ACPI usage in systems where Device Tree is
-    typically used, it would be beneficial to standardize a way to retrieve
-    Device Tree style properties from ACPI devices, which is what we do in
-    this patch.
-    
-    If a given device described in ACPI namespace wants to export properties it
-    must implement _DSD method (Device Specific Data, introduced with ACPI 5.1)
-    that returns the properties in a package of packages. For example:
-    
-    	Name (_DSD, Package () {
-    		ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
-    		Package () {
-    			Package () {"name1", <VALUE1>},
-    			Package () {"name2", <VALUE2>},
-    			...
-    		}
-    	})
-    
-    The UUID reserved for properties is daffd814-6eba-4d8c-8a91-bc9bbf4aa301
-    and is documented in the ACPI 5.1 companion document called "_DSD
-    Implementation Guide" [1], [2].
-    
-    We add several helper functions that can be used to extract these
-    properties and convert them to different Linux data types.
-    
-    The ultimate goal is that we only have one device property API that
-    retrieves the requested properties from Device Tree or from ACPI
-    transparent to the caller.
-    
-    [1] http://www.uefi.org/sites/default/files/resources/_DSD-implementation-guide-toplevel.htm
-    [2] http://www.uefi.org/sites/default/files/resources/_DSD-device-properties-UUID.pdf
-    
-    Reviewed-by: Hanjun Guo <hanjun.guo at linaro.org>
-    Reviewed-by: Josh Triplett <josh at joshtriplett.org>
-    Reviewed-by: Grant Likely <grant.likely at linaro.org>
-    Signed-off-by: Darren Hart <dvhart at linux.intel.com>
-    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
-    Signed-off-by: Mika Westerberg <mika.westerberg at linux.intel.com>
-    Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
-
-commit a9240791b83abd372e4efb77f20444c27a56ebae
-Author: Mark Salter <msalter at redhat.com>
-Date:   Tue Sep 30 17:19:24 2014 -0400
-
-    arm64: avoid need for console= to enable serial console
-    
-    Tell kernel to prefer one of the serial ports on platforms
-    pl011, 8250, or sbsa uarts. console= on command line will
-    override these assumed preferences. This is just a hack to
-    get the behavior we want from SPCR table support. Once SPCR
-    is supported, we can drop this.
-    
-    Signed-off-by: Mark Salter <msalter at redhat.com>
-
-commit 6fee3b2bd2ad6349e7bb3082393bf6355e01ce6f
-Author: Tom Lendacky <thomas.lendacky at amd.com>
-Date:   Tue Sep 9 23:33:17 2014 -0400
-
-    drivers: net: AMD Seattle XGBE PHY support for A0 silicon
-    
-    This patch modifies the upstream AMD XGBE PHY driver to support
-    A0 Seattle silicon in currently shipping systems. The upstream
-    Linux driver is targetted for Seattle B0 silicon.
-    
-    Signed-off-by: Mark Salter <msalter at redhat.com>
-
-commit 0a0eea6d358d51ab381e2945c0e9db2f6cc06157
-Author: Tom Lendacky <thomas.lendacky at amd.com>
-Date:   Tue Sep 9 23:34:07 2014 -0400
-
-    drivers: net: AMD Seattle XGBE 10GbE support for A0 silicon
-    
-    This patch modifies the upstream AMD 10GbE XGBE Ethernet driver to
-    support A0 Seattle silicon in currently shipping systems. The
-    upstream Linux driver is targetted for Seattle B0 silicon.
-    
-    Signed-off-by: Mark Salter <msalter at redhat.com>
-
-commit ff93b53f3ca8748529855d421bf79329086544cd
-Author: Graeme Gregory <graeme.gregory at linaro.org>
-Date:   Fri Jul 26 17:55:02 2013 +0100
-
-    virtio-mmio: add ACPI probing
-    
-    Added the match table and pointers for ACPI probing to the driver.
-    
-    Signed-off-by: Graeme Gregory <graeme.gregory at linaro.org>
-
-commit 5315cb5a532e900612ac1202507551761e8bd13c
-Author: Graeme Gregory <graeme.gregory at linaro.org>
-Date:   Wed Jul 24 11:29:48 2013 +0100
-
-    net: smc91x: add ACPI probing support.
-    
-    Add device ID LINA0003 for this device and add the match table.
-    
-    As its a platform device it needs no other code and will be probed in by
-    acpi_platform once device ID is added.
-    
-    Signed-off-by: Graeme Gregory <graeme.gregory at linaro.org>
-
-commit 640f607f1fa10c7c0cd6025dde8883d02fc9b411
-Author: Mark Salter <msalter at redhat.com>
-Date:   Sun Sep 14 09:44:44 2014 -0400
-
-    Revert "ahci_xgene: Skip the PHY and clock initialization if already configured by the firmware."
-    
-    This reverts commit 0bed13bebd6c99d097796d2ca6c4f10fb5b2eabc.
-    
-    Temporarily revert for backwards compatibility with rh-0.12-1 firmware
-
-commit e8afbea7e3e11f37c234770d72725894f92de415
-Author: Mark Salter <msalter at redhat.com>
-Date:   Mon Aug 11 13:46:43 2014 -0400
-
-    xgene: add support for ACPI-probed serial port
-
-commit 3d0ad3e452a81a32842d85dbb88078b74582efb5
-Author: Mark Salter <msalter at redhat.com>
-Date:   Sat Aug 9 12:01:20 2014 -0400
-
-    sata/xgene: support acpi probing
-    
-    Signed-off-by: Mark Salter <msalter at redhat.com>
-
-commit a42353df5a2f741e8d2e356c3f053aac8d3eff0e
-Author: Mark Salter <msalter at redhat.com>
-Date:   Thu Sep 18 15:05:23 2014 -0400
-
-    arm64: add sev to parking protocol
-    
-    Parking protocol wakes secondary cores with an interrupt.
-    This patch adds an additional sev() to send an event. This
-    is a temporary hack for APM Mustang board and not intended
-    for upstream.
-    
-    Signed-off-by: Mark Salter <msalter at redhat.com>
-
-commit d81f088880b9d763a7006e40dff6bb526c534255
-Author: Mark Salter <msalter at redhat.com>
-Date:   Tue Sep 9 22:59:48 2014 -0400
-
-    arm64: add parking protocol support
-    
-    This is a first-cut effort at parking protocol support. It is
-    very much a work in progress (as is the spec it is based on).
-    This code deviates from the current spec in a number of ways
-    to work around current firmware issues and issues with kernels
-    using 64K page sizes.
-    
-    caveat utilitor
-    
-    Signed-off-by: Mark Salter <msalter at redhat.com>
-
-commit 475b6ce1555e1146761b53c550f2ac019311739f
-Author: Hanjun Guo <hanjun.guo at linaro.org>
-Date:   Thu Aug 28 14:26:16 2014 -0400
-
-    ARM64 / ACPI: Introduce some PCI functions when PCI is enabled
-    
-    Introduce some PCI functions to make ACPI can be compiled when
-    CONFIG_PCI is enabled, these functions should be revisited when
-    implemented on ARM64.
-    
-    Signed-off-by: Hanjun Guo <hanjun.guo at linaro.org>
-    [fixed up for 3.17-rc]
-    Signed-off-by: Mark Salter <msalter at redhat.com>
-
-commit cb6ebe40936adc5c3154abbec6f89ccb8a0536b7
-Author: Al Stone <ahs3 at redhat.com>
-Date:   Thu Aug 28 13:14:16 2014 -0400
-
-    Fix arm64 compilation error in PNP code
-    
-    Signed-off-by: Mark Salter <msalter at redhat.com>
-
-commit b7fc0378e13207a53a3e8466ba6329cfbcaa0526
-Author: Suravee Suthikulpanit <Suravee.Suthikulpanit at amd.com>
-Date:   Tue Sep 9 15:37:15 2014 -0500
-
-    ata: ahci_platform: Add ACPI support for AMD Seattle SATA controller
-    
-    This patch adds ACPI support for non-PCI SATA contoller in ahci_platform driver.
-    It adds ACPI matching table in ahci_platform to support AMD Seattle SATA controller
-    with following ASL structure in DSDT:
-    
-        Device (SATA0)
-        {
-          Name(_HID, "AMDI0600")	// Seattle AHSATA
-          Name (_CCA, 1)		// Cache-coherent controller
-          Name (_CRS, ResourceTemplate ()
-          {
-            Memory32Fixed (ReadWrite, 0xE0300000, 0x00010000)
-            Interrupt (ResourceConsumer, Level, ActiveHigh, Exclusive,,,) { 387 }
-          })
-        }
-    
-    Since ATA driver should not require PCI support for ATA_ACPI,
-    this patch also removes dependency in the driver/ata/Kconfig.
-    
-    Signed-off-by: Suravee Suthikulpanit <Suravee.Suthikulpanit at amd.com>
-
-commit c5b655e6af273a61e7ec3653deb3550ae4f7abf1
-Author: Mark Salter <msalter at redhat.com>
-Date:   Wed Nov 19 10:08:29 2014 -0500
-
-    tty/sbsauart: make ttySBSA the active console device
-    
-    The sbsauart driver doesn't register itself as a console
-    until module_initcall time. This allows the virtual console
-    driver to register the active console if no console= is
-    given on the cmdline. This patch allows ttySBSA to take
-    over the active console device role from any existing
-    console device if no console= is given on the cmdline.
-    
-    Signed-off-by: Mark Salter <msalter at redhat.com>
-
-commit 6bee52af3d281d91b871f6876138fa51a41f0472
-Author: Graeme Gregory <graeme.gregory at linaro.org>
-Date:   Wed Aug 13 13:47:18 2014 +0100
-
-    tty: SBSA compatible UART
-    
-    This is a subset of pl011 UART which does not supprt DMA or baud rate
-    changing.  It does, however, provide earlycon support (i.e., using
-    "earlycon=ttySBSA" on the kernel command line).
-    
-    It is specified in the Server Base System Architecture document from
-    ARM.
-    
-    Signed-off-by: Graeme Gregory <graeme.gregory at linaro.org>
-
-commit a66f13e7c17cf7283b9987da2349c0a5c204fa4b
-Author: Mark Salter <msalter at redhat.com>
-Date:   Mon Sep 8 11:58:46 2014 -0400
-
-    acpi: fix acpi_os_ioremap for arm64
-    
-    The acpi_os_ioremap() function may be used to map normal RAM or IO
-    regions. The current implementation simply uses ioremap_cache(). This
-    will work for some architectures, but arm64 ioremap_cache() cannot be
-    used to map IO regions which don't support caching. So for arm64, use
-    ioremap() for non-RAM regions.
-    
-    Signed-off-by: Mark Salter <msalter at redhat.com>
-
-commit b00f36975b651c0afbddee49e84109694e610f43
-Author: Graeme Gregory <graeme.gregory at linaro.org>
-Date:   Mon Sep 8 10:36:44 2014 -0400
-
-    acpi: add arm to the platforms that use ioremap
-    
-    Now with the base changes to the arm memory mapping it is safe
-    to convert to using ioremap to map in the tables.
-    
-    Signed-off-by: Al Stone <al.stone at linaro.org>
-    Signed-off-by: Graeme Gregory <graeme.gregory at linaro.org>
-
-commit 4f6ca522fc13d8c13c844a2c2f9eafe091a336a9
-Author: Mark Salter <msalter at redhat.com>
-Date:   Mon Sep 8 17:04:28 2014 -0400
-
-    acpi/arm64: NOT FOR UPSTREAM - remove EXPERT dependency
-    
-    For convenience to keep existing configs working, remove
-    CONFIG_EXPERT dependency from ACPI for ARM64. This shouldn't
-    go upstream just yet.
-    
-    Signed-off-by: Mark Salter <msalter at redhat.com>
-
-commit 91eaa3c5387ebcf698b070a4c21e39e5240699ba
-Author: Graeme Gregory <graeme.gregory at linaro.org>
-Date:   Fri Oct 17 21:37:14 2014 +0800
-
-    Documentation: ACPI for ARM64
-    
-    Add documentation for the guidelines of how to use ACPI
-    on ARM64.
-    
-    Signed-off-by: Graeme Gregory <graeme.gregory at linaro.org>
-    Signed-off-by: Al Stone <al.stone at linaro.org>
-    Signed-off-by: Hanjun Guo <hanjun.guo at linaro.org>
-
-commit ef17919599275fd58edb255ecf69807653cdd763
-Author: Graeme Gregory <graeme.gregory at linaro.org>
-Date:   Fri Oct 17 21:37:13 2014 +0800
-
-    ARM64 / ACPI: Enable ARM64 in Kconfig
-    
-    Add Kconfigs to build ACPI on ARM64, and make ACPI available on ARM64.
-    
-    acpi_idle driver is x86/IA64 dependent now, so make CONFIG_ACPI_PROCESSOR
-    depend on X86 || IA64, and implement it on ARM64 in the future.
-    
-    Reviewed-by: Grant Likely <grant.likely at linaro.org>
-    Signed-off-by: Graeme Gregory <graeme.gregory at linaro.org>
-    Signed-off-by: Al Stone <al.stone at linaro.org>
-    Signed-off-by: Hanjun Guo <hanjun.guo at linaro.org>
-
-commit 7d78ff059af78cc5a80576314c38584834557fc1
-Author: Al Stone <al.stone at linaro.org>
-Date:   Fri Oct 17 21:37:12 2014 +0800
-
-    ARM64 / ACPI: Select ACPI_REDUCED_HARDWARE_ONLY if ACPI is enabled on ARM64
-    
-    ACPI reduced hardware mode is disabled by default, but ARM64
-    can only run properly in ACPI hardware reduced mode, so select
-    ACPI_REDUCED_HARDWARE_ONLY if ACPI is enabled on ARM64.
-    
-    Reviewed-by: Grant Likely <grant.likely at linaro.org>
-    Signed-off-by: Al Stone <al.stone at linaro.org>
-    Signed-off-by: Hanjun Guo <hanjun.guo at linaro.org>
-
-commit 8a387ea5071c9d8bdaf5305320130022ec1d4f7d
-Author: Hanjun Guo <hanjun.guo at linaro.org>
-Date:   Fri Oct 17 21:37:11 2014 +0800
-
-    ARM64 / ACPI: Parse GTDT to initialize arch timer
-    
-    Using the information presented by GTDT to initialize the arch
-    timer (not memory-mapped).
-    
-    Originally-by: Amit Daniel Kachhap <amit.daniel at samsung.com>
-    Signed-off-by: Hanjun Guo <hanjun.guo at linaro.org>
-
-commit 7523c8b3b0d23629781c4581272c0647fa543af5
-Author: Tomasz Nowicki <tomasz.nowicki at linaro.org>
-Date:   Fri Oct 17 21:37:10 2014 +0800
-
-    ARM64 / ACPI: Add GICv2 specific ACPI boot support
-    
-    ACPI kernel uses MADT table for proper GIC initialization. It needs to
-    parse GIC related subtables, collect CPU interface and distributor
-    addresses and call driver initialization function (which is hardware
-    abstraction agnostic). In a similar way, FDT initialize GICv1/2.
-    
-    NOTE: This commit allow to initialize GICv1/2 basic functionality.
-    GICv2 vitalization extension, GICv3/4 and ITS are considered as next
-    steps.
-    
-    Signed-off-by: Tomasz Nowicki <tomasz.nowicki at linaro.org>
-    Signed-off-by: Hanjun Guo <hanjun.guo at linaro.org>
-
-commit 743691994f2fb03bc05f539a42ba6ccccb5d18b8
-Author: Hanjun Guo <hanjun.guo at linaro.org>
-Date:   Fri Oct 17 21:37:09 2014 +0800
-
-    ARM64 / ACPI: Introduce ACPI_IRQ_MODEL_GIC and register device's gsi
-    
-    Introduce ACPI_IRQ_MODEL_GIC which is needed for ARM64 as GIC is
-    used, and then register device's gsi with the core IRQ subsystem.
-    
-    acpi_register_gsi() is similar to DT based irq_of_parse_and_map(),
-    since gsi is unique in the system, so use hwirq number directly
-    for the mapping.
-    
-    Originally-by: Amit Daniel Kachhap <amit.daniel at samsung.com>
-    Signed-off-by: Hanjun Guo <hanjun.guo at linaro.org>
-
-commit 0c4d9983cb7b50351aad0aa32e8b6134adaabb0d
-Author: Hanjun Guo <hanjun.guo at linaro.org>
-Date:   Fri Oct 17 21:37:08 2014 +0800
-
-    ACPI / processor: Make it possible to get CPU hardware ID via GICC
-    
-    Introduce a new function map_gicc_mpidr() to allow MPIDRs to be obtained
-    from the GICC Structure introduced by ACPI 5.1.
-    
-    MPIDR is the CPU hardware ID as local APIC ID on x86 platform, so we use
-    MPIDR not the GIC CPU interface ID to identify CPUs.
-    
-    Signed-off-by: Hanjun Guo <hanjun.guo at linaro.org>
-
-commit cb6b980abe388e25e357f73c5780aa1cf1b2e337
-Author: Hanjun Guo <hanjun.guo at linaro.org>
-Date:   Fri Oct 17 21:37:07 2014 +0800
-
-    ARM64 / ACPI: Parse MADT for SMP initialization
-    
-    MADT contains the information for MPIDR which is essential for
-    SMP initialization, parse the GIC cpu interface structures to
-    get the MPIDR value and map it to cpu_logical_map(), and add
-    enabled cpu with valid MPIDR into cpu_possible_map.
-    
-    ACPI 5.1 only has two explicit methods to boot up SMP, PSCI and
-    Parking protocol, but the Parking protocol is only specified for
-    ARMv7 now, so make PSCI as the only way for the SMP boot protocol
-    before some updates for the ACPI spec or the Parking protocol spec.
-    
-    Signed-off-by: Hanjun Guo <hanjun.guo at linaro.org>
-    Signed-off-by: Tomasz Nowicki <tomasz.nowicki at linaro.org>
-
-commit 74a72e003ae388f460294a0910a536aced8ce93c
-Author: Hanjun Guo <hanjun.guo at linaro.org>
-Date:   Fri Oct 17 21:37:06 2014 +0800
-
-    ACPI / table: Print GIC information when MADT is parsed
-    
-    When MADT is parsed, print GIC information to make the boot
-    log look pretty:
-    
-    ACPI: GICC (acpi_id[0x0000] address[00000000e112f000] MPDIR[0x0] enabled)
-    ACPI: GICC (acpi_id[0x0001] address[00000000e112f000] MPDIR[0x1] enabled)
-    ...
-    ACPI: GICC (acpi_id[0x0201] address[00000000e112f000] MPDIR[0x201] enabled)
-    
-    These information will be very helpful to bring up early systems to
-    see if acpi_id and MPIDR are matched or not as spec defined.
-    
-    Signed-off-by: Hanjun Guo <hanjun.guo at linaro.org>
-    Signed-off-by: Tomasz Nowicki <tomasz.nowicki at linaro.org>
-
-commit 059facbd0f0664aaaf6d732ce02b2f56ea6ad98f
-Author: Hanjun Guo <hanjun.guo at linaro.org>
-Date:   Fri Oct 17 21:37:05 2014 +0800
-
-    ARM64 / ACPI: Parse FADT table to get PSCI flags for PSCI init
-    
-    There are two flags: PSCI_COMPLIANT and PSCI_USE_HVC. When set,
-    the former signals to the OS that the firmware is PSCI compliant.
-    The latter selects the appropriate conduit for PSCI calls by
-    toggling between Hypervisor Calls (HVC) and Secure Monitor Calls
-    (SMC).
-    
-    FADT table contains such information, parse FADT to get the flags
-    for PSCI init. Since ACPI 5.1 doesn't support self defined PSCI
-    function IDs, which means that only PSCI 0.2+ is supported in ACPI.
-    
-    At the same time, only ACPI 5.1 or higher verison supports PSCI,
-    and FADT Major.Minor version was introduced in ACPI 5.1, so we
-    will check the version and only parse FADT table with version >= 5.1.
-    
-    If firmware provides ACPI tables with ACPI version less than 5.1,
-    OS will be messed up with those information and have no way to init
-    smp and GIC, so disable ACPI if we get an FADT table with version
-    less that 5.1.
-    
-    Signed-off-by: Hanjun Guo <hanjun.guo at linaro.org>
-    Signed-off-by: Graeme Gregory <graeme.gregory at linaro.org>
-    Signed-off-by: Tomasz Nowicki <tomasz.nowicki at linaro.org>
-
-commit 7ec63267bb1630c62e5f7fd2eb75a9a31131c89a
-Author: Hanjun Guo <hanjun.guo at linaro.org>
-Date:   Fri Oct 17 21:37:04 2014 +0800
-
-    ARM64 / ACPI: Make PCI optional for ACPI on ARM64
-    
-    As PCI for ARM64 is not ready, so introduce some stub functions
-    to make PCI optional for ACPI, and make ACPI core run without
-    CONFIG_PCI on ARM64.
-    
-    Since ACPI on X86 and IA64 depends on PCI and this patch only makes
-    PCI optional for ARM64, it will not break anything on X86 and IA64.
-    
-    Signed-off-by: Hanjun Guo <hanjun.guo at linaro.org>
-
-commit 2f1dd91e7866f2b617af29e9973b88b2cc2e00d6
-Author: Graeme Gregory <graeme.gregory at linaro.org>
-Date:   Fri Oct 17 21:37:03 2014 +0800
-
-    ARM64 / ACPI: If we chose to boot from acpi then disable FDT
-    
-    If the early boot methods of acpi are happy that we have valid ACPI
-    tables and acpi=force has been passed, then do not unflat devicetree
-    effectively disabling further hardware probing from DT.
-    
-    Signed-off-by: Graeme Gregory <graeme.gregory at linaro.org>
-    Signed-off-by: Hanjun Guo <hanjun.guo at linaro.org>
-
-commit 6941a3cced9ca3d29e6e9c8b0f43917526b74789
-Author: Al Stone <al.stone at linaro.org>
-Date:   Fri Oct 17 21:37:02 2014 +0800
-
-    ARM64 / ACPI: Introduce early_param for "acpi" and pass acpi=force to enable ACPI
-    
-    Introduce one early parameters "off" and "force" for "acpi", acpi=off
-    will be the default behavior for ARM64, so introduce acpi=force to
-    enable ACPI on ARM64.
-    
-    Disable ACPI before early parameters parsed, and enable it to pass
-    "acpi=force" if people want use ACPI on ARM64. This ensures DT be
-    the prefer one if ACPI table and DT both are provided at this moment.
-    
-    Signed-off-by: Al Stone <al.stone at linaro.org>
-    Signed-off-by: Graeme Gregory <graeme.gregory at linaro.org>
-    Signed-off-by: Hanjun Guo <hanjun.guo at linaro.org>
-
-commit 8764d6bd07827a2a29eaaa382fc397527ad1ba19
-Author: Graeme Gregory <graeme.gregory at linaro.org>
-Date:   Fri Oct 17 21:37:01 2014 +0800
-
-    ARM64 / ACPI: Introduce sleep-arm.c
-    
-    ACPI 5.1 does not currently support S states for ARM64 hardware but
-    ACPI code will call acpi_target_system_state() for device power
-    managment, so introduce sleep-arm.c to allow other drivers to function
-    until S states are defined.
-    
-    Signed-off-by: Graeme Gregory <graeme.gregory at linaro.org>
-    Signed-off-by: Tomasz Nowicki <tomasz.nowicki at linaro.org>
-    Signed-off-by: Hanjun Guo <hanjun.guo at linaro.org>
-
-commit 37144fd61ca68e9d542e875187739c982c8d3662
-Author: Al Stone <al.stone at linaro.org>
-Date:   Fri Oct 17 21:37:00 2014 +0800
-
-    ARM64 / ACPI: Get RSDP and ACPI boot-time tables
-    
-    As we want to get ACPI tables to parse and then use the information
-    for system initialization, we should get the RSDP (Root System
-    Description Pointer) first, it then locates Extended Root Description
-    Table (XSDT) which contains all the 64-bit physical address that
-    pointer to other boot-time tables.
-    
-    Introduce acpi.c and its related head file in this patch to provide
-    fundamental needs of extern variables and functions for ACPI core,
-    and then get boot-time tables as needed.
-      - asm/acenv.h for arch specific ACPICA environments and
-        implementation, It is needed unconditionally by ACPI core;
-      - asm/acpi.h for arch specific variables and functions needed by
-        ACPI driver core;
-      - acpi.c for ARM64 related ACPI implementation for ACPI driver
-        core;
-    
-    acpi_boot_table_init() is introduced to get RSDP and boot-time tables,
-    it will be called in setup_arch() before paging_init(), so we should
-    use eary_memremap() mechanism here to get the RSDP and all the table
-    pointers.
-    
-    Signed-off-by: Al Stone <al.stone at linaro.org>
-    Signed-off-by: Graeme Gregory <graeme.gregory at linaro.org>
-    Signed-off-by: Tomasz Nowicki <tomasz.nowicki at linaro.org>
-    Signed-off-by: Hanjun Guo <hanjun.guo at linaro.org>
-
-commit a4f035d2876b41b6f224321da6b6278de577d4c5
-Author: Tomasz Nowicki <tomasz.nowicki at linaro.org>
-Date:   Fri Oct 17 21:36:59 2014 +0800
-
-    ACPI / table: Count matched and successfully parsed entries without specifying max entries
-    
-    It is very useful to traverse all available table entries without max
-    number of expected entries type. Current acpi_parse_entries()
-    implementation gives that feature but it does not count those entries,
-    it returns 0 instead, so fix it to count matched and successfully
-    entries and return it.
-    
-    NOTE: This change has no impact to x86 and ia64 archs since existing code
-    checks for error occurrence only (acpi_parse_entries(...,0) < 0).
-    
-    Acked-by: Grant Likely <grant.likely at linaro.org>
-    Signed-off-by: Tomasz Nowicki <tomasz.nowicki at linaro.org>
-    Signed-off-by: Hanjun Guo <hanjun.guo at linaro.org>
-
-commit b3055f38d52f5be0103b436a1b04fbf3947aaa39
-Author: Ashwin Chaugule <ashwin.chaugule at linaro.org>
-Date:   Fri Oct 17 21:36:58 2014 +0800
-
-    ACPI / table: Add new function to get table entries
-    
-    The acpi_table_parse() function has a callback that
-    passes a pointer to a table_header. Add a new function
-    which takes this pointer and parses its entries. This
-    eliminates the need to re-traverse all the tables for
-    each call. e.g. as in acpi_table_parse_madt() which is
-    normally called after acpi_table_parse().
-    
-    Acked-by: Grant Likely <grant.likely at linaro.org>
-    Signed-off-by: Ashwin Chaugule <ashwin.chaugule at linaro.org>
-    Signed-off-by: Tomasz Nowicki <tomasz.nowicki at linaro.org>
-    Signed-off-by: Hanjun Guo <hanjun.guo at linaro.org>
-
-commit fff62dfc1d7ab6ad3d528b008413fd116d208150
-Author: Mark Salter <msalter at redhat.com>
-Date:   Sat Nov 8 22:25:48 2014 -0500
-
-    arm64: use UEFI for reboot
-    
-    Wire in support for UEFI reboot. We want UEFI reboot to have
-    highest priority for capsule support.
-    
-    Signed-off-by: Mark Salter <msalter at redhat.com>
-
-commit 997a0488adb3f525aedb678b584f2733f43e248e
-Author: Mark Salter <msalter at redhat.com>
-Date:   Sat Nov 8 15:25:41 2014 -0500
-
-    arm64: use UEFI as last resort for poweroff
-    
-    Wire in support for poweroff via UEFI.
-    
-    Signed-off-by: Mark Salter <msalter at redhat.com>
-
-commit 5b823d4bf52286f97dc76683b533ae5c08763897
-Author: Mark Salter <msalter at redhat.com>
-Date:   Thu Jul 17 13:34:50 2014 -0400
-
-    ahci_xgene: add errata workaround for ATA_CMD_SMART
-    
-    commit 2a0bdff6b958d1b2:
-    
-     ahci_xgene: fix the dma state machine lockup for the IDENTIFY DEVICE PIO mode command.
-    
-    added a workaround for X-Gene AHCI controller errata. This was done
-    for all ATA_CMD_ID_ATA commands. The errata also appears to affect
-    ATA_CMD_SMART commands as well. This was discovered when running
-    smartd or just smartctl -x. This patch adds a dma engine restart for
-    ATA_CMD_SMART commands which clears up the issues seen with smartd.
-    
-    Signed-off-by: Mark Salter <msalter at redhat.com>
-
-commit f866806e1ca75a0efc62cda59559286faa7c9926
-Author: Kyle McMartin <kmcmarti at redhat.com>
-Date:   Tue May 13 22:25:26 2014 -0400
-
-    arm64: don't set READ_IMPLIES_EXEC for EM_AARCH64 ELF objects
-    
-    Message-id: <20140513222526.GC26038 at redacted.bos.redhat.com>
-    Patchwork-id: 79789
-    O-Subject: [ACADIA PATCH] arm64: don't set READ_IMPLIES_EXEC for EM_AARCH64 ELF objects
-    Bugzilla: 1085528
-    
-    BZ: https://bugzilla.redhat.com/show_bug.cgi?id=1085528
-    Upstream: submitted soon
-    
-    [Sadly this isn't (yet) sufficient... but it fixes at least one issue
-     here... cat /proc/$$/personality shows READ_IMPLIES_EXEC before. I'll
-     try to figure the rest out tomorrow.]
-    
-    Currently, we're accidentally ending up with executable stacks on
-    AArch64 when the ABI says we shouldn't be, and relying on glibc to fix
-    things up for us when we're loaded. However, SELinux will deny us
-    mucking with the stack, and hit us with execmem AVCs.
-    
-    The reason this is happening is somewhat complex:
-    
-    fs/binfmt_elf.c:load_elf_binary()
-     - initializes executable_stack = EXSTACK_DEFAULT implying the
-       architecture should make up its mind.
-     - does a pile of loading goo
-     - runs through the program headers, looking for PT_GNU_STACK
-       and setting (or unsetting) executable_stack if it finds it.
-    
-       This is our first problem, we won't generate these unless an
-       executable stack is explicitly requested.
-    
-     - more ELF loading goo
-     - sets whether we're a compat task or not (TIF_32BIT) based on compat.h
-     - for compat reasons (pre-GNU_STACK) checks if the READ_IMPLIES_EXEC
-       flag should be set for ancient toolchains
-    
-       Here's our second problem, we test if read_implies_exec based on
-       stk != EXSTACK_DISABLE_X, which is true since stk == EXSTACK_DEFAULT.
-    
-       So we set current->personality |= READ_IMPLIES_EXEC like a broken
-       legacy toolchain would want.
-    
-     - Now we call setup_arg_pages to set up the stack...
-    
-    fs/exec.c:setup_arg_pages()
-     - lots of magic happens here
-     - vm_flags gets initialized to VM_STACK_FLAGS
-    
-       Here's our third problem, VM_STACK_FLAGS on arm64 is
-       VM_DEFAULT_DATA_FLAG which tests READ_IMPLIES_EXEC and sets VM_EXEC
-       if it's true. So we end up with an executable stack mapping, since we
-       don't have executable_stack set (it's still EXSTACK_DEFAULT at this
-       point) to unset it anywhere.
-    
-    Bang. execstack AVC when the program starts running.
-    
-    The easiest way I can see to fix this is to test if we're a legacy task
-    and fix it up there. But that's not as simple as it sounds, because
-    the 32-bit ABI depends on what revision of the CPU we've enabled (not
-    that it matters since we're ARMv8...) Regardless, in the compat case,
-    set READ_IMPLIES_EXEC if we've found a GNU_STACK header which explicitly
-    requested it as in arch/arm/kernel/elf.c:arm_elf_read_implies_exec().
-    
-    Signed-off-by: Kyle McMartin <kmcmarti at redhat.com>
-    Signed-off-by: Donald Dutile <ddutile at redhat.com>
-
-commit a68d368ceb495cabafe82cdd0b83ec1e271a7f9d
-Author: Ard Biesheuvel <ard.biesheuvel at linaro.org>
-Date:   Fri Nov 7 14:12:34 2014 +0000
-
-    arm64: kvm: eliminate literal pool entries
-    
-    Replace two instances of 'ldr xN, =(constant)' in the world switch
-    hot path with 'mov' instructions.
-    
-    Acked-by: Marc Zyngier <marc.zyngier at arm.com>
-    Acked-by: Christoffer Dall <christoffer.dall at linaro.org>
-    Signed-off-by: Ard Biesheuvel <ard.biesheuvel at linaro.org>
-    Signed-off-by: Will Deacon <will.deacon at arm.com>
-
-commit 246a31b3a8f065e831a6d8d9fd96f3a8e17dbdb9
-Author: Ard Biesheuvel <ard.biesheuvel at linaro.org>
-Date:   Fri Nov 7 14:12:33 2014 +0000
-
-    arm64: ftrace: eliminate literal pool entries
-    
-    Replace ldr xN, =<symbol> with adrp/add or adrp/ldr [as appropriate]
-    in the implementation of _mcount(), which may be called very often.
-    
-    Signed-off-by: Ard Biesheuvel <ard.biesheuvel at linaro.org>
-    Signed-off-by: Will Deacon <will.deacon at arm.com>
-
-commit ecd0f8e21514e8ac758ed16a188faaa4c5ef75c7
-Author: Mark Rutland <mark.rutland at arm.com>
-Date:   Tue Nov 4 10:50:16 2014 +0000
-
-    arm64: log physical ID of boot CPU
-    
-    In certain debugging scenarios it's useful to know the physical ID (i.e.
-    the MPIDR_EL1.Aff* fields) of the boot CPU, but we don't currently log
-    this as we do for 32-bit ARM kernels.
-    
-    This patch makes the kernel log the physical ID of the boot CPU early in
-    the boot process. The CPU logical map initialisation is folded in to
-    smp_setup_processor_id (which contrary to its name is also called by UP
-    kernels). This is called before setup_arch, so should not adversely
-    affect existing cpu_logical_map users.
-    
-    Acked-by: Sudeep Holla <sudeep.holla at arm.com>
-    Acked-by: Catalin Marinas <catalin.marinas at arm.com>
-    Acked-by: Lorenzo Pieralisis <lorenzo.pieralisi at arm.com>
-    Signed-off-by: Mark Rutland <mark.rutland at arm.com>
-    Signed-off-by: Will Deacon <will.deacon at arm.com>
-
-commit 2899d6ea451eb0037427bbf430069f73cb76becc
-Author: Ard Biesheuvel <ard.biesheuvel at linaro.org>
-Date:   Mon Nov 3 16:50:01 2014 +0000
-
-    arm64/crypto: use crypto instructions to generate AES key schedule
-    
-    This patch implements the AES key schedule generation using ARMv8
-    Crypto Instructions. It replaces the table based C implementation
-    in aes_generic.ko, which means we can drop the dependency on that
-    module.
-    
-    Tested-by: Steve Capper <steve.capper at linaro.org>
-    Acked-by: Steve Capper <steve.capper at linaro.org>
-    Signed-off-by: Ard Biesheuvel <ard.biesheuvel at linaro.org>
-    Signed-off-by: Will Deacon <will.deacon at arm.com>
-
-commit 67b1122c25f0c7a9a126ebabcd2085ef99640c13
-Author: Geoff Levand <geoff at infradead.org>
-Date:   Fri Oct 31 23:06:47 2014 +0000
-
-    arm64/kvm: Fix assembler compatibility of macros
-    
-    Some of the macros defined in kvm_arm.h are useful in assembly files, but are
-    not compatible with the assembler.  Change any C language integer constant
-    definitions using appended U, UL, or ULL to the UL() preprocessor macro.  Also,
-    add a preprocessor include of the asm/memory.h file which defines the UL()
-    macro.
-    
-    Fixes build errors like these when using kvm_arm.h in assembly
-    source files:
-    
-      Error: unexpected characters following instruction at operand 3 -- `and x0,x1,#((1U<<25)-1)'
-    
-    Acked-by: Mark Rutland <mark.rutland at arm.com>
-    Signed-off-by: Geoff Levand <geoff at infradead.org>
-    Signed-off-by: Will Deacon <will.deacon at arm.com>
-
-commit 6a3c07e9aa03b7fbec14ab8bc21fce8590f12d83
-Author: Ard Biesheuvel <ard.biesheuvel at linaro.org>
-Date:   Tue Oct 28 12:24:20 2014 +0000
-
-    arm64/dt: add machine name to kernel call stack dump output
-    
-    This installs the machine name as recorded by setup_machine_fdt()
-    as dump stack arch description. This results in the string to be
-    included in call stack dumps, as is shown here:
-    
-      ...
-      Bad mode in Synchronous Abort handler detected, code 0x84000005
-      CPU: 0 PID: 1 Comm: swapper/0 Not tainted 3.18.0-rc2+ #548
-    > Hardware name: linux,dummy-virt (DT)
-      task: ffffffc07c870000 ti: ffffffc07c878000 task.ti: ffffffc07c878000
-      PC is at 0x0
-      ...
-    
-    Note that systems that support DMI/SMBIOS may override this later.
-    
-    Signed-off-by: Ard Biesheuvel <ard.biesheuvel at linaro.org>
-    Signed-off-by: Will Deacon <will.deacon at arm.com>
-
-commit 7c0569a739d0f1dd8ffd709cf37c53bb42143687
-Author: Steve Capper <steve.capper at linaro.org>
-Date:   Fri Oct 24 13:22:20 2014 +0100
-
-    arm64: xchg: Implement cmpxchg_double
-    
-    The arm64 architecture has the ability to exclusively load and store
-    a pair of registers from an address (ldxp/stxp). Also the SLUB can take
-    advantage of a cmpxchg_double implementation to avoid taking some
-    locks.
-    
-    This patch provides an implementation of cmpxchg_double for 64-bit
-    pairs, and activates the logic required for the SLUB to use these
-    functions (HAVE_ALIGNED_STRUCT_PAGE and HAVE_CMPXCHG_DOUBLE).
-    
-    Also definitions of this_cpu_cmpxchg_8 and this_cpu_cmpxchg_double_8
-    are wired up to cmpxchg_local and cmpxchg_double_local (rather than the
-    stock implementations that perform non-atomic operations with
-    interrupts disabled) as they are used by the SLUB.
-    
-    On a Juno platform running on only the A57s I get quite a noticeable
-    performance improvement with 5 runs of hackbench on v3.17:
-    
-             Baseline | With Patch
-     -----------------+-----------
-     Mean    119.2312 | 106.1782
-     StdDev    0.4919 |   0.4494
-    
-    (times taken to complete `./hackbench 100 process 1000', in seconds)
-    
-    Signed-off-by: Steve Capper <steve.capper at linaro.org>
-    Signed-off-by: Will Deacon <will.deacon at arm.com>
-
-commit 7acf53bfb80c2823d233c14d33cfd2d119713b89
-Author: Joonwoo Park <joonwoop at codeaurora.org>
-Date:   Tue Oct 21 01:59:03 2014 +0100
-
-    arm64: optimize memcpy_{from,to}io() and memset_io()
-    
-    Optimize memcpy_{from,to}io() and memset_io() by transferring in 64 bit
-    as much as possible with minimized barrier usage.  This simplest
-    optimization brings faster throughput compare to current byte-by-byte read
-    and write with barrier in the loop.  Code's skeleton is taken from the
-    powerpc.
-    
-    Link: http://lkml.kernel.org/p/20141020133304.GH23751@e104818-lin.cambridge.arm.com
-    Reviewed-by: Catalin Marinas <catalin.marinas at arm.com>
-    Reviewed-by: Trilok Soni <tsoni at codeaurora.org>
-    Signed-off-by: Joonwoo Park <joonwoop at codeaurora.org>
-    Signed-off-by: Will Deacon <will.deacon at arm.com>
-
-commit 1971c19fb2a38a1d94cedada404760a917c36cd4
-Author: Mark Rutland <mark.rutland at arm.com>
-Date:   Thu Oct 23 16:33:33 2014 +0100
-
-    efi: efi-stub: notify on DTB absence
-    
-    In the absence of a DTB configuration table, the EFI stub will happily
-    continue attempting to boot a kernel, despite the fact that this kernel
-    may not function without a description of the hardware. In this case, as
-    with a typo'd "dtb=" option (e.g. "dbt=") or many other possible
-    failures, the only output seen by the user will be the rather terse
-    output from the EFI stub:
-    
-    EFI stub: Booting Linux Kernel...
-    
-    To aid those attempting to debug such failures, this patch adds a notice
-    when no DTB is found, making the output more helpful:
-    
-    EFI stub: Booting Linux Kernel...
-    EFI stub: Generating empty DTB
-    
-    Additionally, a positive acknowledgement is added when a user-specified
-    DTB is in use:
-    
-    EFI stub: Booting Linux Kernel...
-    EFI stub: Using DTB from command line
-    
-    Similarly, a positive acknowledgement is added when a DTB from a
-    configuration table is in use:
-    
-    EFI stub: Booting Linux Kernel...
-    EFI stub: Using DTB from configuration table
-    
-    Signed-off-by: Mark Rutland <mark.rutland at arm.com>
-    Acked-by: Leif Lindholm <leif.lindholm at linaro.org>
-    Acked-by: Ard Biesheuvel <ard.biesheuvel at linaro.org>
-    Acked-by: Roy Franz <roy.franz at linaro.org>
-    Acked-by: Matt Fleming <matt.fleming at intel.com>
-    Signed-off-by: Ard Biesheuvel <ard.biesheuvel at linaro.org>
-
-commit 7652016ff98e614ed2e3abac19b996af02434293
-Author: Ard Biesheuvel <ard.biesheuvel at linaro.org>
-Date:   Wed Oct 15 09:36:50 2014 +0200
-
-    arm64: dmi: set DMI string as dump stack arch description
-    
-    This sets the DMI string, containing system type, serial number,
-    firmware version etc. as dump stack arch description, so that oopses
-    and other kernel stack dumps automatically have this information
-    included, if available.
-    
-    Tested-by: Leif Lindholm <leif.lindholm at linaro.org>
-    Acked-by: Leif Lindholm <leif.lindholm at linaro.org>
-    Signed-off-by: Ard Biesheuvel <ard.biesheuvel at linaro.org>
-
-commit 2586f232bd388d2223f3c7bcba446b2bd25d8e3d
-Author: Yi Li <yi.li at linaro.org>
-Date:   Sat Oct 4 23:46:43 2014 +0800
-
-    arm64: dmi: Add SMBIOS/DMI support
-    
-    SMBIOS is important for server hardware vendors. It implements a spec for
-    providing descriptive information about the platform. Things like serial
-    numbers, physical layout of the ports, build configuration data, and the like.
-    
-    Signed-off-by: Yi Li <yi.li at linaro.org>
-    Tested-by: Suravee Suthikulpanit <suravee.suthikulpanit at amd.com>
-    Tested-by: Leif Lindholm <leif.lindholm at linaro.org>
-    Signed-off-by: Ard Biesheuvel <ard.biesheuvel at linaro.org>
-
-commit 16b52b24f3d7a4f1555e4233398172b32306c1e4
-Author: Ard Biesheuvel <ard.biesheuvel at linaro.org>
-Date:   Tue Oct 14 16:41:27 2014 +0200
-
-    dmi: add support for SMBIOS 3.0 64-bit entry point
-    
-    The DMTF SMBIOS reference spec v3.0.0 defines a new 64-bit entry point,
-    which enables support for SMBIOS structure tables residing at a physical
-    offset over 4 GB. This is especially important for upcoming arm64
-    platforms whose system RAM resides entirely above the 4 GB boundary.
-    
-    For the UEFI case, this code attempts to detect the new SMBIOS 3.0
-    header magic at the offset passed in the SMBIOS3_TABLE_GUID UEFI
-    configuration table. If this configuration table is not provided, or
-    if we fail to parse the header, we fall back to using the legacy
-    SMBIOS_TABLE_GUID configuration table. This is in line with the spec,
-    that allows both configuration tables to be provided, but mandates that
-    they must point to the same structure table, unless the version pointed
-    to by the 64-bit entry point is a superset of the 32-bit one.
-    
-    For the non-UEFI case, the detection logic is modified to look for the
-    SMBIOS 3.0 header magic before it looks for the legacy header magic.
-    
-    Note that this patch is based on version 3.0.0d [draft] of the
-    specification, which is expected not to deviate from the final version
-    in ways that would affect the correctness of this implementation.
-    
-    Tested-by: Suravee Suthikulpanit <suravee.suthikulpanit at amd.com>
-    Acked-by: Leif Lindholm <leif.lindholm at linaro.org>
-    Tested-by: Leif Lindholm <leif.lindholm at linaro.org>
-    Cc: Andrew Morton <akpm at linux-foundation.org>
-    Cc: Tony Luck <tony.luck at intel.com>
-    Acked-by: Matt Fleming <matt.fleming at intel.com>
-    Signed-off-by: Ard Biesheuvel <ard.biesheuvel at linaro.org>
-
-commit 016f4b4f5cee9ddd8c243a36c220a65bdfb82dc8
-Author: Ard Biesheuvel <ard.biesheuvel at linaro.org>
-Date:   Tue Oct 14 16:34:47 2014 +0200
-
-    efi: dmi: add support for SMBIOS 3.0 UEFI configuration table
-    
-    This adds support to the UEFI side for detecting the presence of
-    a SMBIOS 3.0 64-bit entry point. This allows the actual SMBIOS
-    structure table to reside at a physical offset over 4 GB, which
-    cannot be supported by the legacy SMBIOS 32-bit entry point.
-    
-    Since the firmware can legally provide both entry points, store
-    the SMBIOS 3.0 entry point in a separate variable, and let the
-    DMI decoding layer decide which one will be used.
-    
-    Tested-by: Suravee Suthikulpanit <suravee.suthikulpanit at amd.com>
-    Acked-by: Leif Lindholm <leif.lindholm at linaro.org>
-    Acked-by: Matt Fleming <matt.fleming at intel.com>
-    Signed-off-by: Ard Biesheuvel <ard.biesheuvel at linaro.org>
-
-commit ac627ea950e853f0a3f91607fb16cb9477f434d7
-Author: Ard Biesheuvel <ard.biesheuvel at linaro.org>
-Date:   Fri Oct 17 12:44:11 2014 +0200
-
-    arm64/efi: drop redundant set_bit(EFI_CONFIG_TABLES)
-    
-    The EFI_CONFIG_TABLES bit already gets set by efi_config_init(),
-    so there is no reason to set it again after this function returns
-    successfully.
-    
-    Acked-by: Will Deacon <will.deacon at arm.com>
-    Signed-off-by: Ard Biesheuvel <ard.biesheuvel at linaro.org>
-
-commit 850ba08a3f4756a8340edadd4fdeccd881813ba5
-Author: Ard Biesheuvel <ard.biesheuvel at linaro.org>
-Date:   Mon Oct 20 15:31:57 2014 +0200
-
-    arm64/efi: invert UEFI memory region reservation logic
-    
-    Instead of reserving the memory regions based on which types we know
-    need to be reserved, consider only regions of the following types as
-    free for general use by the OS:
-    
-    EFI_LOADER_CODE
-    EFI_LOADER_DATA
-    EFI_BOOT_SERVICES_CODE
-    EFI_BOOT_SERVICES_DATA
-    EFI_CONVENTIONAL_MEMORY
-    
-    Note that this also fixes a problem with the original code, which would
-    misidentify a EFI_RUNTIME_SERVICES_DATA region as not reserved if it
-    does not have the EFI_MEMORY_RUNTIME attribute set. However, it is
-    perfectly legal for the firmware not to request a virtual mapping for
-    EFI_RUNTIME_SERVICES_DATA regions that contain configuration tables, in
-    which case the EFI_MEMORY_RUNTIME attribute would not be set.
-    
-    Acked-by: Roy Franz <roy.franz at linaro.org>
-    Signed-off-by: Ard Biesheuvel <ard.biesheuvel at linaro.org>
-
-commit 2787807ca4f5f7df82a5c54312753b157e8c052e
-Author: Ard Biesheuvel <ard.biesheuvel at linaro.org>
-Date:   Fri Oct 10 18:42:55 2014 +0200
-
-    arm64/efi: set PE/COFF file alignment to 512 bytes
-    
-    Change our PE/COFF header to use the minimum file alignment of
-    512 bytes (0x200), as mandated by the PE/COFF spec v8.3
-    
-    Also update the linker script so that the Image file itself is also a
-    round multiple of FileAlignment.
-    
-    Acked-by: Catalin Marinas <catalin.marinas at arm.com>
-    Acked-by: Roy Franz <roy.franz at linaro.org>
-    Signed-off-by: Ard Biesheuvel <ard.biesheuvel at linaro.org>
-
-commit 7bd0585d9ab62d9787c389d3b62141b76319e5f7
-Author: Ard Biesheuvel <ard.biesheuvel at linaro.org>
-Date:   Fri Oct 10 11:25:24 2014 +0200
-
-    arm64/efi: set PE/COFF section alignment to 4 KB
-    
-    Position independent AArch64 code needs to be linked and loaded at the
-    same relative offset from a 4 KB boundary, or adrp/add and adrp/ldr
-    pairs will not work correctly. (This is how PC relative symbol
-    references with a 4 GB reach are emitted)
-    
-    We need to declare this in the PE/COFF header, otherwise the PE/COFF
-    loader may load the Image and invoke the stub at an offset which
-    violates this rule.
-    
-    Reviewed-by: Roy Franz <roy.franz at linaro.org>
-    Acked-by: Mark Rutland <mark.rutland at arm.com>
-    Signed-off-by: Ard Biesheuvel <ard.biesheuvel at linaro.org>
-
-commit 5a0edb2dbdf9327322ae57e8e16d162c2a371318
-Author: Ard Biesheuvel <ard.biesheuvel at linaro.org>
-Date:   Wed Oct 8 16:11:27 2014 +0200
-
-    arm64/efi: efistub: jump to 'stext' directly, not through the header
-    
-    After the EFI stub has done its business, it jumps into the kernel by
-    branching to offset #0 of the loaded Image, which is where it expects
-    to find the header containing a 'branch to stext' instruction.
-    
-    However, the UEFI spec 2.1.1 states the following regarding PE/COFF
-    image loading:
-    "A UEFI image is loaded into memory through the LoadImage() Boot
-    Service. This service loads an image with a PE32+ format into memory.
-    This PE32+ loader is required to load all sections of the PE32+ image
-    into memory."
-    
-    In other words, it is /not/ required to load parts of the image that are
-    not covered by a PE/COFF section, so it may not have loaded the header
-    at the expected offset, as it is not covered by any PE/COFF section.
-    
-    So instead, jump to 'stext' directly, which is at the base of the
-    PE/COFF .text section, by supplying a symbol 'stext_offset' to
-    efi-entry.o which contains the relative offset of stext into the Image.
-    Also replace other open coded calculations of the same value with a
-    reference to 'stext_offset'
-    
-    Acked-by: Mark Rutland <mark.rutland at arm.com>
-    Acked-by: Roy Franz <roy.franz at linaro.org>
-    Signed-off-by: Ard Biesheuvel <ard.biesheuvel at linaro.org>
-
- Documentation/acpi/gpio-properties.txt           |  96 +++
  Documentation/arm64/arm-acpi.txt                 | 323 ++++++++++
- Documentation/gpio/consumer.txt                  |  18 +
  Documentation/kernel-parameters.txt              |   3 +-
- arch/arm/include/asm/kvm_mmu.h                   |   5 +-
- arch/arm/kvm/mmu.c                               |  22 +-
- arch/arm/mach-s3c24xx/h1940-bluetooth.c          |   4 +-
- arch/arm/mach-s3c24xx/h1940.h                    |   4 +-
- arch/arm/mach-s3c24xx/mach-h1940.c               |   3 +-
- arch/arm/mach-s3c24xx/mach-rx1950.c              |   3 +-
- arch/arm/plat-orion/gpio.c                       |   3 +-
- arch/arm/plat-orion/include/plat/orion-gpio.h    |   5 +-
- arch/arm64/Kconfig                               |  22 +
+ arch/arm/kvm/mmu.c                               |   4 +
+ arch/arm64/Kconfig                               |   9 +
  arch/arm64/Makefile                              |   1 +
- arch/arm64/crypto/Kconfig                        |   5 +-
- arch/arm64/crypto/aes-ce-ccm-glue.c              |   4 +-
- arch/arm64/crypto/aes-ce-cipher.c                | 112 +++-
- arch/arm64/crypto/aes-ce-setkey.h                |   5 +
- arch/arm64/crypto/aes-glue.c                     |  18 +-
  arch/arm64/include/asm/acenv.h                   |  18 +
  arch/arm64/include/asm/acpi.h                    | 102 +++
- arch/arm64/include/asm/cmpxchg.h                 |  71 +++
  arch/arm64/include/asm/cpu_ops.h                 |   1 +
- arch/arm64/include/asm/dmi.h                     |  31 +
  arch/arm64/include/asm/elf.h                     |   3 +-
- arch/arm64/include/asm/kvm_arm.h                 |  21 +-
- arch/arm64/include/asm/kvm_mmu.h                 |   5 +-
  arch/arm64/include/asm/pci.h                     |  51 ++
  arch/arm64/include/asm/psci.h                    |   3 +-
  arch/arm64/include/asm/smp.h                     |  10 +-
  arch/arm64/kernel/Makefile                       |   4 +-
  arch/arm64/kernel/acpi.c                         | 398 ++++++++++++
  arch/arm64/kernel/cpu_ops.c                      |   8 +-
- arch/arm64/kernel/efi-entry.S                    |   3 +-
- arch/arm64/kernel/efi.c                          |  74 ++-
- arch/arm64/kernel/entry-ftrace.S                 |  21 +-
- arch/arm64/kernel/head.S                         |  24 +-
- arch/arm64/kernel/io.c                           |  66 +-
+ arch/arm64/kernel/efi.c                          |  37 ++
  arch/arm64/kernel/pci.c                          |  97 ++-
  arch/arm64/kernel/psci.c                         |  78 ++-
- arch/arm64/kernel/setup.c                        |  51 +-
+ arch/arm64/kernel/setup.c                        |  44 +-
  arch/arm64/kernel/smp.c                          |   2 +-
  arch/arm64/kernel/smp_parking_protocol.c         | 110 ++++
  arch/arm64/kernel/time.c                         |   7 +
- arch/arm64/kernel/vmlinux.lds.S                  |  17 +
- arch/arm64/kvm/hyp.S                             |   4 +-
  arch/arm64/mm/dma-mapping.c                      | 112 ++++
  arch/arm64/pci/Makefile                          |   2 +
  arch/arm64/pci/mmconfig.c                        | 292 +++++++++
  arch/arm64/pci/pci.c                             | 461 ++++++++++++++
  drivers/acpi/Kconfig                             |   6 +-
- drivers/acpi/Makefile                            |   7 +-
+ drivers/acpi/Makefile                            |   6 +-
  drivers/acpi/bus.c                               |   3 +
- drivers/acpi/internal.h                          |  11 +
+ drivers/acpi/internal.h                          |   5 +
  drivers/acpi/osl.c                               |   6 +-
  drivers/acpi/processor_core.c                    |  37 ++
- drivers/acpi/property.c                          | 551 ++++++++++++++++
- drivers/acpi/scan.c                              | 129 +++-
  drivers/acpi/sleep-arm.c                         |  28 +
- drivers/acpi/tables.c                            | 115 +++-
+ drivers/acpi/tables.c                            |  48 +-
  drivers/acpi/utils.c                             |  26 +
  drivers/ata/Kconfig                              |   2 +-
  drivers/ata/ahci_platform.c                      |  13 +
  drivers/ata/ahci_xgene.c                         |  30 +-
- drivers/base/Makefile                            |   2 +-
- drivers/base/property.c                          | 431 +++++++++++++
- drivers/clocksource/arm_arch_timer.c             | 120 +++-
- drivers/firmware/dmi_scan.c                      |  79 ++-
- drivers/firmware/efi/efi.c                       |   4 +
- drivers/firmware/efi/libstub/arm-stub.c          |  11 +-
- drivers/gpio/devres.c                            |  32 +
- drivers/gpio/gpio-sch.c                          | 293 ++++-----
- drivers/gpio/gpiolib-acpi.c                      | 117 +++-
- drivers/gpio/gpiolib.c                           |  85 ++-
- drivers/gpio/gpiolib.h                           |   7 +-
- drivers/input/keyboard/gpio_keys_polled.c        | 112 ++--
+ drivers/clocksource/arm_arch_timer.c             | 136 +++-
+ drivers/input/keyboard/gpio_keys_polled.c        |   1 +
  drivers/iommu/arm-smmu.c                         |   8 +-
  drivers/irqchip/irq-gic-v3.c                     |  10 +
- drivers/irqchip/irq-gic.c                        | 116 ++++
+ drivers/irqchip/irq-gic.c                        | 118 ++++
  drivers/irqchip/irqchip.c                        |   3 +
- drivers/leds/leds-gpio.c                         | 140 ++--
- drivers/misc/eeprom/at25.c                       |  34 +-
- drivers/net/ethernet/amd/Kconfig                 |   2 +-
+ drivers/leds/leds-gpio.c                         |   1 +
  drivers/net/ethernet/amd/xgbe/xgbe-dev.c         |  16 +-
  drivers/net/ethernet/amd/xgbe/xgbe-drv.c         |   3 +
- drivers/net/ethernet/amd/xgbe/xgbe-main.c        | 289 +++++++--
+ drivers/net/ethernet/amd/xgbe/xgbe-main.c        | 276 ++++++--
  drivers/net/ethernet/amd/xgbe/xgbe-mdio.c        |  20 +-
  drivers/net/ethernet/amd/xgbe/xgbe-ptp.c         |   4 +-
  drivers/net/ethernet/amd/xgbe/xgbe.h             |  13 +
  drivers/net/ethernet/apm/xgene/xgene_enet_hw.c   |  69 +-
- drivers/net/ethernet/apm/xgene/xgene_enet_main.c |  68 +-
+ drivers/net/ethernet/apm/xgene/xgene_enet_main.c |  80 ++-
  drivers/net/ethernet/apm/xgene/xgene_enet_main.h |   1 +
  drivers/net/ethernet/smsc/smc91x.c               |  10 +
- drivers/net/phy/Kconfig                          |   2 +-
  drivers/net/phy/amd-xgbe-phy.c                   | 777 ++++++++++++-----------
- drivers/of/base.c                                |  33 +
  drivers/pci/host/pci-xgene.c                     | 167 +++++
  drivers/pnp/resource.c                           |   2 +
  drivers/tty/Kconfig                              |   6 +
@@ -1922,132 +61,21 @@ Date:   Wed Oct 8 16:11:27 2014 +0200
  drivers/tty/sbsauart.c                           | 358 +++++++++++
  drivers/tty/serial/8250/8250_dw.c                |   9 +
  drivers/virtio/virtio_mmio.c                     |  12 +-
- drivers/xen/efi.c                                |   1 +
- include/acpi/acpi_bus.h                          |  30 +
+ include/acpi/acpi_bus.h                          |   2 +
  include/acpi/acpi_io.h                           |   6 +
  include/asm-generic/vmlinux.lds.h                |   7 +
  include/kvm/arm_vgic.h                           |  20 +-
- include/linux/acpi.h                             | 141 +++-
+ include/linux/acpi.h                             |   1 +
  include/linux/clocksource.h                      |   6 +
- include/linux/efi.h                              |   6 +-
- include/linux/gpio/consumer.h                    |   7 +
- include/linux/gpio_keys.h                        |   3 +
  include/linux/irqchip/arm-gic-acpi.h             |  31 +
  include/linux/irqchip/arm-gic.h                  |   2 +
- include/linux/kvm_host.h                         |   1 +
- include/linux/leds.h                             |   3 +-
- include/linux/of.h                               |  34 +
  include/linux/pci.h                              |  37 +-
- include/linux/property.h                         | 143 +++++
- net/rfkill/rfkill-gpio.c                         |  18 +-
  virt/kvm/arm/arch_timer.c                        | 107 ++--
  virt/kvm/arm/vgic-v2.c                           |  86 ++-
  virt/kvm/arm/vgic-v3.c                           |   8 +-
  virt/kvm/arm/vgic.c                              |  30 +-
- 125 files changed, 6843 insertions(+), 1117 deletions(-)
+ 76 files changed, 4208 insertions(+), 626 deletions(-)
 
-diff --git a/Documentation/acpi/gpio-properties.txt b/Documentation/acpi/gpio-properties.txt
-new file mode 100644
-index 0000000..ae36fcf
---- /dev/null
-+++ b/Documentation/acpi/gpio-properties.txt
-@@ -0,0 +1,96 @@
-+_DSD Device Properties Related to GPIO
-+--------------------------------------
-+
-+With the release of ACPI 5.1 and the _DSD configuration objecte names
-+can finally be given to GPIOs (and other things as well) returned by
-+_CRS.  Previously, we were only able to use an integer index to find
-+the corresponding GPIO, which is pretty error prone (it depends on
-+the _CRS output ordering, for example).
-+
-+With _DSD we can now query GPIOs using a name instead of an integer
-+index, like the ASL example below shows:
-+
-+  // Bluetooth device with reset and shutdown GPIOs
-+  Device (BTH)
-+  {
-+      Name (_HID, ...)
-+
-+      Name (_CRS, ResourceTemplate ()
-+      {
-+          GpioIo (Exclusive, PullUp, 0, 0, IoRestrictionInputOnly,
-+                  "\\_SB.GPO0", 0, ResourceConsumer) {15}
-+          GpioIo (Exclusive, PullUp, 0, 0, IoRestrictionInputOnly,
-+                  "\\_SB.GPO0", 0, ResourceConsumer) {27, 31}
-+      })
-+
-+      Name (_DSD, Package ()
-+      {
-+          ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
-+          Package ()
-+	  {
-+              Package () {"reset-gpio", Package() {^BTH, 1, 1, 0 }},
-+              Package () {"shutdown-gpio", Package() {^BTH, 0, 0, 0 }},
-+          }
-+      })
-+  }
-+
-+The format of the supported GPIO property is:
-+
-+  Package () { "name", Package () { ref, index, pin, active_low }}
-+
-+  ref - The device that has _CRS containing GpioIo()/GpioInt() resources,
-+        typically this is the device itself (BTH in our case).
-+  index - Index of the GpioIo()/GpioInt() resource in _CRS starting from zero.
-+  pin - Pin in the GpioIo()/GpioInt() resource. Typically this is zero.
-+  active_low - If 1 the GPIO is marked as active_low.
-+
-+Since ACPI GpioIo() resource does not have a field saying whether it is
-+active low or high, the "active_low" argument can be used here.  Setting
-+it to 1 marks the GPIO as active low.
-+
-+In our Bluetooth example the "reset-gpio" refers to the second GpioIo()
-+resource, second pin in that resource with the GPIO number of 31.
-+
-+ACPI GPIO Mappings Provided by Drivers
-+--------------------------------------
-+
-+There are systems in which the ACPI tables do not contain _DSD but provide _CRS
-+with GpioIo()/GpioInt() resources and device drivers still need to work with
-+them.
-+
-+In those cases ACPI device identification objects, _HID, _CID, _CLS, _SUB, _HRV,
-+available to the driver can be used to identify the device and that is supposed
-+to be sufficient to determine the meaning and purpose of all of the GPIO lines
-+listed by the GpioIo()/GpioInt() resources returned by _CRS.  In other words,
-+the driver is supposed to know what to use the GpioIo()/GpioInt() resources for
-+once it has identified the device.  Having done that, it can simply assign names
-+to the GPIO lines it is going to use and provide the GPIO subsystem with a
-+mapping between those names and the ACPI GPIO resources corresponding to them.
-+
-+To do that, the driver needs to define a mapping table as a NULL-terminated
-+array of struct acpi_gpio_mapping objects that each contain a name, a pointer
-+to an array of line data (struct acpi_gpio_params) objects and the size of that
-+array.  Each struct acpi_gpio_params object consists of three fields,
-+crs_entry_index, line_index, active_low, representing the index of the target
-+GpioIo()/GpioInt() resource in _CRS starting from zero, the index of the target
-+line in that resource starting from zero, and the active-low flag for that line,
-+respectively, in analogy with the _DSD GPIO property format specified above.
-+
-+For the example Bluetooth device discussed previously the data structures in
-+question would look like this:
-+
-+static const struct acpi_gpio_params reset_gpio = { 1, 1, false };
-+static const struct acpi_gpio_params shutdown_gpio = { 0, 0, false };
-+
-+static const struct acpi_gpio_mapping bluetooth_acpi_gpios[] = {
-+  { "reset-gpio", &reset_gpio, 1 },
-+  { "shutdown-gpio", &shutdown_gpio, 1 },
-+  { },
-+};
-+
-+Next, the mapping table needs to be passed as the second argument to
-+acpi_dev_add_driver_gpios() that will register it with the ACPI device object
-+pointed to by its first argument.  That should be done in the driver's .probe()
-+routine.  On removal, the driver should unregister its GPIO mapping table by
-+calling acpi_dev_remove_driver_gpios() on the ACPI device object where that
-+table was previously registered.
 diff --git a/Documentation/arm64/arm-acpi.txt b/Documentation/arm64/arm-acpi.txt
 new file mode 100644
 index 0000000..17cf96d
@@ -2377,37 +405,8 @@ index 0000000..17cf96d
 +submitted to ASWG and go through the normal approval process; for those that
 +are not UEFI members, many other members of the Linux community are and would
 +likely be willing to assist in submitting ECRs.
-diff --git a/Documentation/gpio/consumer.txt b/Documentation/gpio/consumer.txt
-index 6ce5441..859918d 100644
---- a/Documentation/gpio/consumer.txt
-+++ b/Documentation/gpio/consumer.txt
-@@ -219,6 +219,24 @@ part of the IRQ interface, e.g. IRQF_TRIGGER_FALLING, as are system wakeup
- capabilities.
- 
- 
-+GPIOs and ACPI
-+==============
-+
-+On ACPI systems, GPIOs are described by GpioIo()/GpioInt() resources listed by
-+the _CRS configuration objects of devices.  Those resources do not provide
-+connection IDs (names) for GPIOs, so it is necessary to use an additional
-+mechanism for this purpose.
-+
-+Systems compliant with ACPI 5.1 or newer may provide a _DSD configuration object
-+which, among other things, may be used to provide connection IDs for specific
-+GPIOs described by the GpioIo()/GpioInt() resources in _CRS.  If that is the
-+case, it will be handled by the GPIO subsystem automatically.  However, if the
-+_DSD is not present, the mappings between GpioIo()/GpioInt() resources and GPIO
-+connection IDs need to be provided by device drivers.
-+
-+For details refer to Documentation/acpi/gpio-properties.txt
-+
-+
- Interacting With the Legacy GPIO Subsystem
- ==========================================
- Many kernel subsystems still handle GPIOs using the legacy integer-based
 diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
-index 479f332..6187d9b 100644
+index 4df73da..4adfd50 100644
 --- a/Documentation/kernel-parameters.txt
 +++ b/Documentation/kernel-parameters.txt
 @@ -165,7 +165,7 @@ multipliers 'Kilo', 'Mega', and 'Giga', equalling 2^10, 2^20, and 2^30
@@ -2427,65 +426,11 @@ index 479f332..6187d9b 100644
  
  			See also Documentation/power/runtime_pm.txt, pci=noacpi
  
-diff --git a/arch/arm/include/asm/kvm_mmu.h b/arch/arm/include/asm/kvm_mmu.h
-index acb0d57..f867060 100644
---- a/arch/arm/include/asm/kvm_mmu.h
-+++ b/arch/arm/include/asm/kvm_mmu.h
-@@ -161,9 +161,10 @@ static inline bool vcpu_has_cache_enabled(struct kvm_vcpu *vcpu)
- }
- 
- static inline void coherent_cache_guest_page(struct kvm_vcpu *vcpu, hva_t hva,
--					     unsigned long size)
-+					     unsigned long size,
-+					     bool ipa_uncached)
- {
--	if (!vcpu_has_cache_enabled(vcpu))
-+	if (!vcpu_has_cache_enabled(vcpu) || ipa_uncached)
- 		kvm_flush_dcache_to_poc((void *)hva, size);
- 	
- 	/*
 diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c
-index 8664ff1..8fa2060 100644
+index 1dc9778..0b88d36 100644
 --- a/arch/arm/kvm/mmu.c
 +++ b/arch/arm/kvm/mmu.c
-@@ -853,6 +853,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
- 	struct vm_area_struct *vma;
- 	pfn_t pfn;
- 	pgprot_t mem_type = PAGE_S2;
-+	bool fault_ipa_uncached;
- 
- 	write_fault = kvm_is_write_fault(vcpu);
- 	if (fault_status == FSC_PERM && !write_fault) {
-@@ -919,6 +920,8 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
- 	if (!hugetlb && !force_pte)
- 		hugetlb = transparent_hugepage_adjust(&pfn, &fault_ipa);
- 
-+	fault_ipa_uncached = memslot->flags & KVM_MEMSLOT_INCOHERENT;
-+
- 	if (hugetlb) {
- 		pmd_t new_pmd = pfn_pmd(pfn, mem_type);
- 		new_pmd = pmd_mkhuge(new_pmd);
-@@ -926,7 +929,8 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
- 			kvm_set_s2pmd_writable(&new_pmd);
- 			kvm_set_pfn_dirty(pfn);
- 		}
--		coherent_cache_guest_page(vcpu, hva & PMD_MASK, PMD_SIZE);
-+		coherent_cache_guest_page(vcpu, hva & PMD_MASK, PMD_SIZE,
-+					  fault_ipa_uncached);
- 		ret = stage2_set_pmd_huge(kvm, memcache, fault_ipa, &new_pmd);
- 	} else {
- 		pte_t new_pte = pfn_pte(pfn, mem_type);
-@@ -934,7 +938,8 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
- 			kvm_set_s2pte_writable(&new_pte);
- 			kvm_set_pfn_dirty(pfn);
- 		}
--		coherent_cache_guest_page(vcpu, hva, PAGE_SIZE);
-+		coherent_cache_guest_page(vcpu, hva, PAGE_SIZE,
-+					  fault_ipa_uncached);
- 		ret = stage2_set_pte(kvm, memcache, fault_ipa, &new_pte,
- 			pgprot_val(mem_type) == pgprot_val(PAGE_S2_DEVICE));
- 	}
-@@ -1245,6 +1250,10 @@ int kvm_arch_prepare_memory_region(struct kvm *kvm,
+@@ -1315,6 +1315,10 @@ int kvm_arch_prepare_memory_region(struct kvm *kvm,
  	    (KVM_PHYS_SIZE >> PAGE_SHIFT))
  		return -EFAULT;
  
@@ -2496,159 +441,19 @@ index 8664ff1..8fa2060 100644
  	/*
  	 * A memory region could potentially cover multiple VMAs, and any holes
  	 * between them, so iterate over all of them to find out if we can map
-@@ -1310,6 +1319,15 @@ void kvm_arch_free_memslot(struct kvm *kvm, struct kvm_memory_slot *free,
- int kvm_arch_create_memslot(struct kvm *kvm, struct kvm_memory_slot *slot,
- 			    unsigned long npages)
- {
-+	/*
-+	 * Readonly memslots are not incoherent with the caches by definition,
-+	 * but in practice, they are used mostly to emulate ROMs or NOR flashes
-+	 * that the guest may consider devices and hence map as uncached.
-+	 * To prevent incoherency issues in these cases, tag all readonly
-+	 * regions as incoherent.
-+	 */
-+	if (slot->flags & KVM_MEM_READONLY)
-+		slot->flags |= KVM_MEMSLOT_INCOHERENT;
- 	return 0;
- }
- 
-diff --git a/arch/arm/mach-s3c24xx/h1940-bluetooth.c b/arch/arm/mach-s3c24xx/h1940-bluetooth.c
-index b4d14b8..9c8b127 100644
---- a/arch/arm/mach-s3c24xx/h1940-bluetooth.c
-+++ b/arch/arm/mach-s3c24xx/h1940-bluetooth.c
-@@ -41,7 +41,7 @@ static void h1940bt_enable(int on)
- 		mdelay(10);
- 		gpio_set_value(S3C2410_GPH(1), 0);
- 
--		h1940_led_blink_set(-EINVAL, GPIO_LED_BLINK, NULL, NULL);
-+		h1940_led_blink_set(NULL, GPIO_LED_BLINK, NULL, NULL);
- 	}
- 	else {
- 		gpio_set_value(S3C2410_GPH(1), 1);
-@@ -50,7 +50,7 @@ static void h1940bt_enable(int on)
- 		mdelay(10);
- 		gpio_set_value(H1940_LATCH_BLUETOOTH_POWER, 0);
- 
--		h1940_led_blink_set(-EINVAL, GPIO_LED_NO_BLINK_LOW, NULL, NULL);
-+		h1940_led_blink_set(NULL, GPIO_LED_NO_BLINK_LOW, NULL, NULL);
- 	}
- }
- 
-diff --git a/arch/arm/mach-s3c24xx/h1940.h b/arch/arm/mach-s3c24xx/h1940.h
-index 2950cc4..596d9f6 100644
---- a/arch/arm/mach-s3c24xx/h1940.h
-+++ b/arch/arm/mach-s3c24xx/h1940.h
-@@ -19,8 +19,10 @@
- #define H1940_SUSPEND_RESUMEAT		(0x30081000)
- #define H1940_SUSPEND_CHECK		(0x30080000)
- 
-+struct gpio_desc;
-+
- extern void h1940_pm_return(void);
--extern int h1940_led_blink_set(unsigned gpio, int state,
-+extern int h1940_led_blink_set(struct gpio_desc *desc, int state,
- 			       unsigned long *delay_on,
- 			       unsigned long *delay_off);
- 
-diff --git a/arch/arm/mach-s3c24xx/mach-h1940.c b/arch/arm/mach-s3c24xx/mach-h1940.c
-index d35ddc1..d40d4f5 100644
---- a/arch/arm/mach-s3c24xx/mach-h1940.c
-+++ b/arch/arm/mach-s3c24xx/mach-h1940.c
-@@ -359,10 +359,11 @@ static struct platform_device h1940_battery = {
- 
- static DEFINE_SPINLOCK(h1940_blink_spin);
- 
--int h1940_led_blink_set(unsigned gpio, int state,
-+int h1940_led_blink_set(struct gpio_desc *desc, int state,
- 	unsigned long *delay_on, unsigned long *delay_off)
- {
- 	int blink_gpio, check_gpio1, check_gpio2;
-+	int gpio = desc ? desc_to_gpio(desc) : -EINVAL;
- 
- 	switch (gpio) {
- 	case H1940_LATCH_LED_GREEN:
-diff --git a/arch/arm/mach-s3c24xx/mach-rx1950.c b/arch/arm/mach-s3c24xx/mach-rx1950.c
-index c3f2682..1d35ff3 100644
---- a/arch/arm/mach-s3c24xx/mach-rx1950.c
-+++ b/arch/arm/mach-s3c24xx/mach-rx1950.c
-@@ -250,9 +250,10 @@ static void rx1950_disable_charger(void)
- 
- static DEFINE_SPINLOCK(rx1950_blink_spin);
- 
--static int rx1950_led_blink_set(unsigned gpio, int state,
-+static int rx1950_led_blink_set(struct gpio_desc *desc, int state,
- 	unsigned long *delay_on, unsigned long *delay_off)
- {
-+	int gpio = desc_to_gpio(desc);
- 	int blink_gpio, check_gpio;
- 
- 	switch (gpio) {
-diff --git a/arch/arm/plat-orion/gpio.c b/arch/arm/plat-orion/gpio.c
-index e048f61..e53fc8d 100644
---- a/arch/arm/plat-orion/gpio.c
-+++ b/arch/arm/plat-orion/gpio.c
-@@ -306,9 +306,10 @@ EXPORT_SYMBOL(orion_gpio_set_blink);
- 
- #define ORION_BLINK_HALF_PERIOD 100 /* ms */
- 
--int orion_gpio_led_blink_set(unsigned gpio, int state,
-+int orion_gpio_led_blink_set(struct gpio_desc *desc, int state,
- 	unsigned long *delay_on, unsigned long *delay_off)
- {
-+	unsigned gpio = desc_to_gpio(desc);
- 
- 	if (delay_on && delay_off && !*delay_on && !*delay_off)
- 		*delay_on = *delay_off = ORION_BLINK_HALF_PERIOD;
-diff --git a/arch/arm/plat-orion/include/plat/orion-gpio.h b/arch/arm/plat-orion/include/plat/orion-gpio.h
-index e763988..e856b07 100644
---- a/arch/arm/plat-orion/include/plat/orion-gpio.h
-+++ b/arch/arm/plat-orion/include/plat/orion-gpio.h
-@@ -14,12 +14,15 @@
- #include <linux/init.h>
- #include <linux/types.h>
- #include <linux/irqdomain.h>
-+
-+struct gpio_desc;
-+
- /*
-  * Orion-specific GPIO API extensions.
-  */
- void orion_gpio_set_unused(unsigned pin);
- void orion_gpio_set_blink(unsigned pin, int blink);
--int orion_gpio_led_blink_set(unsigned gpio, int state,
-+int orion_gpio_led_blink_set(struct gpio_desc *desc, int state,
- 	unsigned long *delay_on, unsigned long *delay_off);
- 
- #define GPIO_INPUT_OK		(1 << 0)
 diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
-index 9532f8d..80a82ac 100644
+index b1f9a20..d60e537 100644
 --- a/arch/arm64/Kconfig
 +++ b/arch/arm64/Kconfig
-@@ -4,6 +4,7 @@ config ARM64
- 	select ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE
+@@ -5,6 +5,7 @@ config ARM64
+ 	select ARCH_HAS_GCOV_PROFILE_ALL
  	select ARCH_HAS_SG_CHAIN
  	select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST
 +	select ACPI_REDUCED_HARDWARE_ONLY if ACPI
  	select ARCH_USE_CMPXCHG_LOCKREF
  	select ARCH_SUPPORTS_ATOMIC_RMW
  	select ARCH_WANT_OPTIONAL_GPIOLIB
-@@ -34,6 +35,7 @@ config ARM64
- 	select GENERIC_TIME_VSYSCALL
- 	select HANDLE_DOMAIN_IRQ
- 	select HARDIRQS_SW_RESEND
-+	select HAVE_ALIGNED_STRUCT_PAGE if SLUB
- 	select HAVE_ARCH_AUDITSYSCALL
- 	select HAVE_ARCH_JUMP_LABEL
- 	select HAVE_ARCH_KGDB
-@@ -41,6 +43,7 @@ config ARM64
- 	select HAVE_BPF_JIT
- 	select HAVE_C_RECORDMCOUNT
- 	select HAVE_CC_STACKPROTECTOR
-+	select HAVE_CMPXCHG_DOUBLE
- 	select HAVE_DEBUG_BUGVERBOSE
- 	select HAVE_DEBUG_KMEMLEAK
- 	select HAVE_DMA_API_DEBUG
-@@ -185,6 +188,9 @@ config PCI_DOMAINS_GENERIC
+@@ -193,6 +194,9 @@ config PCI_DOMAINS_GENERIC
  config PCI_SYSCALL
  	def_bool PCI
  
@@ -2658,7 +463,7 @@ index 9532f8d..80a82ac 100644
  source "drivers/pci/Kconfig"
  source "drivers/pci/pcie/Kconfig"
  source "drivers/pci/hotplug/Kconfig"
-@@ -268,6 +274,9 @@ config SMP
+@@ -384,6 +388,9 @@ config SMP
  
  	  If you don't know what to do here, say N.
  
@@ -2668,25 +473,7 @@ index 9532f8d..80a82ac 100644
  config SCHED_MC
  	bool "Multi-core scheduler support"
  	depends on SMP
-@@ -401,6 +410,17 @@ config EFI
- 	  allow the kernel to be booted as an EFI application. This
- 	  is only useful on systems that have UEFI firmware.
- 
-+config DMI
-+	bool "Enable support for SMBIOS (DMI) tables"
-+	depends on EFI
-+	default y
-+	help
-+	  This enables SMBIOS/DMI feature for systems.
-+
-+	  This option is only useful on systems that have UEFI firmware.
-+	  However, even with this option, the resultant kernel should
-+	  continue to boot on existing non-UEFI platforms.
-+
- endmenu
- 
- menu "Userspace binary formats"
-@@ -454,6 +474,8 @@ source "drivers/Kconfig"
+@@ -646,6 +653,8 @@ source "drivers/Kconfig"
  
  source "drivers/firmware/Kconfig"
  
@@ -2696,7 +483,7 @@ index 9532f8d..80a82ac 100644
  
  source "arch/arm64/kvm/Kconfig"
 diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile
-index 20901ff..983d72a 100644
+index 1c43cec..ab3b0b1 100644
 --- a/arch/arm64/Makefile
 +++ b/arch/arm64/Makefile
 @@ -49,6 +49,7 @@ core-$(CONFIG_NET) += arch/arm64/net/
@@ -2707,293 +494,28 @@ index 20901ff..983d72a 100644
  libs-y		:= arch/arm64/lib/ $(libs-y)
  libs-y		+= $(LIBGCC)
  libs-$(CONFIG_EFI_STUB) += drivers/firmware/efi/libstub/
-diff --git a/arch/arm64/crypto/Kconfig b/arch/arm64/crypto/Kconfig
-index 5562652..a38b02c 100644
---- a/arch/arm64/crypto/Kconfig
-+++ b/arch/arm64/crypto/Kconfig
-@@ -27,20 +27,19 @@ config CRYPTO_AES_ARM64_CE
- 	tristate "AES core cipher using ARMv8 Crypto Extensions"
- 	depends on ARM64 && KERNEL_MODE_NEON
- 	select CRYPTO_ALGAPI
--	select CRYPTO_AES
- 
- config CRYPTO_AES_ARM64_CE_CCM
- 	tristate "AES in CCM mode using ARMv8 Crypto Extensions"
- 	depends on ARM64 && KERNEL_MODE_NEON
- 	select CRYPTO_ALGAPI
--	select CRYPTO_AES
-+	select CRYPTO_AES_ARM64_CE
- 	select CRYPTO_AEAD
- 
- config CRYPTO_AES_ARM64_CE_BLK
- 	tristate "AES in ECB/CBC/CTR/XTS modes using ARMv8 Crypto Extensions"
- 	depends on ARM64 && KERNEL_MODE_NEON
- 	select CRYPTO_BLKCIPHER
--	select CRYPTO_AES
-+	select CRYPTO_AES_ARM64_CE
- 	select CRYPTO_ABLK_HELPER
- 
- config CRYPTO_AES_ARM64_NEON_BLK
-diff --git a/arch/arm64/crypto/aes-ce-ccm-glue.c b/arch/arm64/crypto/aes-ce-ccm-glue.c
-index 9e6cdde..0ac73b8 100644
---- a/arch/arm64/crypto/aes-ce-ccm-glue.c
-+++ b/arch/arm64/crypto/aes-ce-ccm-glue.c
-@@ -16,6 +16,8 @@
- #include <linux/crypto.h>
- #include <linux/module.h>
- 
-+#include "aes-ce-setkey.h"
-+
- static int num_rounds(struct crypto_aes_ctx *ctx)
- {
- 	/*
-@@ -48,7 +50,7 @@ static int ccm_setkey(struct crypto_aead *tfm, const u8 *in_key,
- 	struct crypto_aes_ctx *ctx = crypto_aead_ctx(tfm);
- 	int ret;
- 
--	ret = crypto_aes_expand_key(ctx, in_key, key_len);
-+	ret = ce_aes_expandkey(ctx, in_key, key_len);
- 	if (!ret)
- 		return 0;
- 
-diff --git a/arch/arm64/crypto/aes-ce-cipher.c b/arch/arm64/crypto/aes-ce-cipher.c
-index 2075e1a..ce47792 100644
---- a/arch/arm64/crypto/aes-ce-cipher.c
-+++ b/arch/arm64/crypto/aes-ce-cipher.c
-@@ -14,6 +14,8 @@
- #include <linux/crypto.h>
- #include <linux/module.h>
- 
-+#include "aes-ce-setkey.h"
-+
- MODULE_DESCRIPTION("Synchronous AES cipher using ARMv8 Crypto Extensions");
- MODULE_AUTHOR("Ard Biesheuvel <ard.biesheuvel at linaro.org>");
- MODULE_LICENSE("GPL v2");
-@@ -124,6 +126,114 @@ static void aes_cipher_decrypt(struct crypto_tfm *tfm, u8 dst[], u8 const src[])
- 	kernel_neon_end();
- }
- 
+diff --git a/arch/arm64/include/asm/acenv.h b/arch/arm64/include/asm/acenv.h
+new file mode 100644
+index 0000000..b49166f
+--- /dev/null
++++ b/arch/arm64/include/asm/acenv.h
+@@ -0,0 +1,18 @@
 +/*
-+ * aes_sub() - use the aese instruction to perform the AES sbox substitution
-+ *             on each byte in 'input'
++ * ARM64 specific ACPICA environments and implementation
++ *
++ * Copyright (C) 2014, Linaro Ltd.
++ *   Author: Hanjun Guo <hanjun.guo at linaro.org>
++ *   Author: Graeme Gregory <graeme.gregory at linaro.org>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License version 2 as
++ * published by the Free Software Foundation.
 + */
-+static u32 aes_sub(u32 input)
-+{
-+	u32 ret;
 +
-+	__asm__("dup	v1.4s, %w[in]		;"
-+		"movi	v0.16b, #0		;"
-+		"aese	v0.16b, v1.16b		;"
-+		"umov	%w[out], v0.4s[0]	;"
++#ifndef _ASM_ACENV_H
++#define _ASM_ACENV_H
 +
-+	:	[out]	"=r"(ret)
-+	:	[in]	"r"(input)
-+	:		"v0","v1");
-+
-+	return ret;
-+}
-+
-+int ce_aes_expandkey(struct crypto_aes_ctx *ctx, const u8 *in_key,
-+		     unsigned int key_len)
-+{
-+	/*
-+	 * The AES key schedule round constants
-+	 */
-+	static u8 const rcon[] = {
-+		0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36,
-+	};
-+
-+	u32 kwords = key_len / sizeof(u32);
-+	struct aes_block *key_enc, *key_dec;
-+	int i, j;
-+
-+	if (key_len != AES_KEYSIZE_128 &&
-+	    key_len != AES_KEYSIZE_192 &&
-+	    key_len != AES_KEYSIZE_256)
-+		return -EINVAL;
-+
-+	memcpy(ctx->key_enc, in_key, key_len);
-+	ctx->key_length = key_len;
-+
-+	kernel_neon_begin_partial(2);
-+	for (i = 0; i < sizeof(rcon); i++) {
-+		u32 *rki = ctx->key_enc + (i * kwords);
-+		u32 *rko = rki + kwords;
-+
-+		rko[0] = ror32(aes_sub(rki[kwords - 1]), 8) ^ rcon[i] ^ rki[0];
-+		rko[1] = rko[0] ^ rki[1];
-+		rko[2] = rko[1] ^ rki[2];
-+		rko[3] = rko[2] ^ rki[3];
-+
-+		if (key_len == AES_KEYSIZE_192) {
-+			if (i >= 7)
-+				break;
-+			rko[4] = rko[3] ^ rki[4];
-+			rko[5] = rko[4] ^ rki[5];
-+		} else if (key_len == AES_KEYSIZE_256) {
-+			if (i >= 6)
-+				break;
-+			rko[4] = aes_sub(rko[3]) ^ rki[4];
-+			rko[5] = rko[4] ^ rki[5];
-+			rko[6] = rko[5] ^ rki[6];
-+			rko[7] = rko[6] ^ rki[7];
-+		}
-+	}
-+
-+	/*
-+	 * Generate the decryption keys for the Equivalent Inverse Cipher.
-+	 * This involves reversing the order of the round keys, and applying
-+	 * the Inverse Mix Columns transformation on all but the first and
-+	 * the last one.
-+	 */
-+	key_enc = (struct aes_block *)ctx->key_enc;
-+	key_dec = (struct aes_block *)ctx->key_dec;
-+	j = num_rounds(ctx);
-+
-+	key_dec[0] = key_enc[j];
-+	for (i = 1, j--; j > 0; i++, j--)
-+		__asm__("ld1	{v0.16b}, %[in]		;"
-+			"aesimc	v1.16b, v0.16b		;"
-+			"st1	{v1.16b}, %[out]	;"
-+
-+		:	[out]	"=Q"(key_dec[i])
-+		:	[in]	"Q"(key_enc[j])
-+		:		"v0","v1");
-+	key_dec[i] = key_enc[0];
-+
-+	kernel_neon_end();
-+	return 0;
-+}
-+EXPORT_SYMBOL(ce_aes_expandkey);
-+
-+int ce_aes_setkey(struct crypto_tfm *tfm, const u8 *in_key,
-+		  unsigned int key_len)
-+{
-+	struct crypto_aes_ctx *ctx = crypto_tfm_ctx(tfm);
-+	int ret;
-+
-+	ret = ce_aes_expandkey(ctx, in_key, key_len);
-+	if (!ret)
-+		return 0;
-+
-+	tfm->crt_flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
-+	return -EINVAL;
-+}
-+EXPORT_SYMBOL(ce_aes_setkey);
-+
- static struct crypto_alg aes_alg = {
- 	.cra_name		= "aes",
- 	.cra_driver_name	= "aes-ce",
-@@ -135,7 +245,7 @@ static struct crypto_alg aes_alg = {
- 	.cra_cipher = {
- 		.cia_min_keysize	= AES_MIN_KEY_SIZE,
- 		.cia_max_keysize	= AES_MAX_KEY_SIZE,
--		.cia_setkey		= crypto_aes_set_key,
-+		.cia_setkey		= ce_aes_setkey,
- 		.cia_encrypt		= aes_cipher_encrypt,
- 		.cia_decrypt		= aes_cipher_decrypt
- 	}
-diff --git a/arch/arm64/crypto/aes-ce-setkey.h b/arch/arm64/crypto/aes-ce-setkey.h
-new file mode 100644
-index 0000000..f08a647
---- /dev/null
-+++ b/arch/arm64/crypto/aes-ce-setkey.h
-@@ -0,0 +1,5 @@
-+
-+int ce_aes_setkey(struct crypto_tfm *tfm, const u8 *in_key,
-+		  unsigned int key_len);
-+int ce_aes_expandkey(struct crypto_aes_ctx *ctx, const u8 *in_key,
-+		     unsigned int key_len);
-diff --git a/arch/arm64/crypto/aes-glue.c b/arch/arm64/crypto/aes-glue.c
-index 79cd911..801aae3 100644
---- a/arch/arm64/crypto/aes-glue.c
-+++ b/arch/arm64/crypto/aes-glue.c
-@@ -16,9 +16,13 @@
- #include <linux/module.h>
- #include <linux/cpufeature.h>
- 
-+#include "aes-ce-setkey.h"
-+
- #ifdef USE_V8_CRYPTO_EXTENSIONS
- #define MODE			"ce"
- #define PRIO			300
-+#define aes_setkey		ce_aes_setkey
-+#define aes_expandkey		ce_aes_expandkey
- #define aes_ecb_encrypt		ce_aes_ecb_encrypt
- #define aes_ecb_decrypt		ce_aes_ecb_decrypt
- #define aes_cbc_encrypt		ce_aes_cbc_encrypt
-@@ -30,6 +34,8 @@ MODULE_DESCRIPTION("AES-ECB/CBC/CTR/XTS using ARMv8 Crypto Extensions");
- #else
- #define MODE			"neon"
- #define PRIO			200
-+#define aes_setkey		crypto_aes_set_key
-+#define aes_expandkey		crypto_aes_expand_key
- #define aes_ecb_encrypt		neon_aes_ecb_encrypt
- #define aes_ecb_decrypt		neon_aes_ecb_decrypt
- #define aes_cbc_encrypt		neon_aes_cbc_encrypt
-@@ -79,10 +85,10 @@ static int xts_set_key(struct crypto_tfm *tfm, const u8 *in_key,
- 	struct crypto_aes_xts_ctx *ctx = crypto_tfm_ctx(tfm);
- 	int ret;
- 
--	ret = crypto_aes_expand_key(&ctx->key1, in_key, key_len / 2);
-+	ret = aes_expandkey(&ctx->key1, in_key, key_len / 2);
- 	if (!ret)
--		ret = crypto_aes_expand_key(&ctx->key2, &in_key[key_len / 2],
--					    key_len / 2);
-+		ret = aes_expandkey(&ctx->key2, &in_key[key_len / 2],
-+				    key_len / 2);
- 	if (!ret)
- 		return 0;
- 
-@@ -288,7 +294,7 @@ static struct crypto_alg aes_algs[] = { {
- 		.min_keysize	= AES_MIN_KEY_SIZE,
- 		.max_keysize	= AES_MAX_KEY_SIZE,
- 		.ivsize		= AES_BLOCK_SIZE,
--		.setkey		= crypto_aes_set_key,
-+		.setkey		= aes_setkey,
- 		.encrypt	= ecb_encrypt,
- 		.decrypt	= ecb_decrypt,
- 	},
-@@ -306,7 +312,7 @@ static struct crypto_alg aes_algs[] = { {
- 		.min_keysize	= AES_MIN_KEY_SIZE,
- 		.max_keysize	= AES_MAX_KEY_SIZE,
- 		.ivsize		= AES_BLOCK_SIZE,
--		.setkey		= crypto_aes_set_key,
-+		.setkey		= aes_setkey,
- 		.encrypt	= cbc_encrypt,
- 		.decrypt	= cbc_decrypt,
- 	},
-@@ -324,7 +330,7 @@ static struct crypto_alg aes_algs[] = { {
- 		.min_keysize	= AES_MIN_KEY_SIZE,
- 		.max_keysize	= AES_MAX_KEY_SIZE,
- 		.ivsize		= AES_BLOCK_SIZE,
--		.setkey		= crypto_aes_set_key,
-+		.setkey		= aes_setkey,
- 		.encrypt	= ctr_encrypt,
- 		.decrypt	= ctr_encrypt,
- 	},
-diff --git a/arch/arm64/include/asm/acenv.h b/arch/arm64/include/asm/acenv.h
-new file mode 100644
-index 0000000..b49166f
---- /dev/null
-+++ b/arch/arm64/include/asm/acenv.h
-@@ -0,0 +1,18 @@
-+/*
-+ * ARM64 specific ACPICA environments and implementation
-+ *
-+ * Copyright (C) 2014, Linaro Ltd.
-+ *   Author: Hanjun Guo <hanjun.guo at linaro.org>
-+ *   Author: Graeme Gregory <graeme.gregory at linaro.org>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ */
-+
-+#ifndef _ASM_ACENV_H
-+#define _ASM_ACENV_H
-+
-+/* It is required unconditionally by ACPI core, update it when needed. */
++/* It is required unconditionally by ACPI core, update it when needed. */
 +
 +#endif /* _ASM_ACENV_H */
 diff --git a/arch/arm64/include/asm/acpi.h b/arch/arm64/include/asm/acpi.h
@@ -3104,102 +626,6 @@ index 0000000..6e692f4
 +#endif /* CONFIG_ACPI */
 +
 +#endif /*_ASM_ACPI_H*/
-diff --git a/arch/arm64/include/asm/cmpxchg.h b/arch/arm64/include/asm/cmpxchg.h
-index ddb9d78..89e397b 100644
---- a/arch/arm64/include/asm/cmpxchg.h
-+++ b/arch/arm64/include/asm/cmpxchg.h
-@@ -19,6 +19,7 @@
- #define __ASM_CMPXCHG_H
- 
- #include <linux/bug.h>
-+#include <linux/mmdebug.h>
- 
- #include <asm/barrier.h>
- 
-@@ -152,6 +153,51 @@ static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old,
- 	return oldval;
- }
- 
-+#define system_has_cmpxchg_double()     1
-+
-+static inline int __cmpxchg_double(volatile void *ptr1, volatile void *ptr2,
-+		unsigned long old1, unsigned long old2,
-+		unsigned long new1, unsigned long new2, int size)
-+{
-+	unsigned long loop, lost;
-+
-+	switch (size) {
-+	case 8:
-+		VM_BUG_ON((unsigned long *)ptr2 - (unsigned long *)ptr1 != 1);
-+		do {
-+			asm volatile("// __cmpxchg_double8\n"
-+			"	ldxp	%0, %1, %2\n"
-+			"	eor	%0, %0, %3\n"
-+			"	eor	%1, %1, %4\n"
-+			"	orr	%1, %0, %1\n"
-+			"	mov	%w0, #0\n"
-+			"	cbnz	%1, 1f\n"
-+			"	stxp	%w0, %5, %6, %2\n"
-+			"1:\n"
-+				: "=&r"(loop), "=&r"(lost), "+Q" (*(u64 *)ptr1)
-+				: "r" (old1), "r"(old2), "r"(new1), "r"(new2));
-+		} while (loop);
-+		break;
-+	default:
-+		BUILD_BUG();
-+	}
-+
-+	return !lost;
-+}
-+
-+static inline int __cmpxchg_double_mb(volatile void *ptr1, volatile void *ptr2,
-+			unsigned long old1, unsigned long old2,
-+			unsigned long new1, unsigned long new2, int size)
-+{
-+	int ret;
-+
-+	smp_mb();
-+	ret = __cmpxchg_double(ptr1, ptr2, old1, old2, new1, new2, size);
-+	smp_mb();
-+
-+	return ret;
-+}
-+
- static inline unsigned long __cmpxchg_mb(volatile void *ptr, unsigned long old,
- 					 unsigned long new, int size)
- {
-@@ -182,6 +228,31 @@ static inline unsigned long __cmpxchg_mb(volatile void *ptr, unsigned long old,
- 	__ret; \
- })
- 
-+#define cmpxchg_double(ptr1, ptr2, o1, o2, n1, n2) \
-+({\
-+	int __ret;\
-+	__ret = __cmpxchg_double_mb((ptr1), (ptr2), (unsigned long)(o1), \
-+			(unsigned long)(o2), (unsigned long)(n1), \
-+			(unsigned long)(n2), sizeof(*(ptr1)));\
-+	__ret; \
-+})
-+
-+#define cmpxchg_double_local(ptr1, ptr2, o1, o2, n1, n2) \
-+({\
-+	int __ret;\
-+	__ret = __cmpxchg_double((ptr1), (ptr2), (unsigned long)(o1), \
-+			(unsigned long)(o2), (unsigned long)(n1), \
-+			(unsigned long)(n2), sizeof(*(ptr1)));\
-+	__ret; \
-+})
-+
-+#define this_cpu_cmpxchg_8(ptr, o, n) \
-+	cmpxchg_local(raw_cpu_ptr(&(ptr)), o, n)
-+
-+#define this_cpu_cmpxchg_double_8(ptr1, ptr2, o1, o2, n1, n2) \
-+	cmpxchg_double_local(raw_cpu_ptr(&(ptr1)), raw_cpu_ptr(&(ptr2)), \
-+				o1, o2, n1, n2)
-+
- #define cmpxchg64(ptr,o,n)		cmpxchg((ptr),(o),(n))
- #define cmpxchg64_local(ptr,o,n)	cmpxchg_local((ptr),(o),(n))
- 
 diff --git a/arch/arm64/include/asm/cpu_ops.h b/arch/arm64/include/asm/cpu_ops.h
 index 6f8e2ef..978f567 100644
 --- a/arch/arm64/include/asm/cpu_ops.h
@@ -3212,43 +638,6 @@ index 6f8e2ef..978f567 100644
  int __init cpu_read_ops(struct device_node *dn, int cpu);
  void __init cpu_read_bootcpu_ops(void);
  
-diff --git a/arch/arm64/include/asm/dmi.h b/arch/arm64/include/asm/dmi.h
-new file mode 100644
-index 0000000..69d37d8
---- /dev/null
-+++ b/arch/arm64/include/asm/dmi.h
-@@ -0,0 +1,31 @@
-+/*
-+ * arch/arm64/include/asm/dmi.h
-+ *
-+ * Copyright (C) 2013 Linaro Limited.
-+ * Written by: Yi Li (yi.li at linaro.org)
-+ *
-+ * based on arch/ia64/include/asm/dmi.h
-+ *
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License.  See the file "COPYING" in the main directory of this archive
-+ * for more details.
-+ */
-+
-+#ifndef __ASM_DMI_H
-+#define __ASM_DMI_H
-+
-+#include <linux/io.h>
-+#include <linux/slab.h>
-+
-+/*
-+ * According to section 2.3.6 of the UEFI spec, the firmware should not
-+ * request a virtual mapping for configuration tables such as SMBIOS.
-+ * This means we have to map them before use.
-+ */
-+#define dmi_early_remap(x, l)		ioremap_cache(x, l)
-+#define dmi_early_unmap(x, l)		iounmap(x)
-+#define dmi_remap(x, l)			ioremap_cache(x, l)
-+#define dmi_unmap(x)			iounmap(x)
-+#define dmi_alloc(l)			kzalloc(l, GFP_KERNEL)
-+
-+#endif
 diff --git a/arch/arm64/include/asm/elf.h b/arch/arm64/include/asm/elf.h
 index 1f65be3..c0f89a0 100644
 --- a/arch/arm64/include/asm/elf.h
@@ -3263,86 +652,6 @@ index 1f65be3..c0f89a0 100644
  
  #define CORE_DUMP_USE_REGSET
  #define ELF_EXEC_PAGESIZE	PAGE_SIZE
-diff --git a/arch/arm64/include/asm/kvm_arm.h b/arch/arm64/include/asm/kvm_arm.h
-index 7fd3e27..8afb863 100644
---- a/arch/arm64/include/asm/kvm_arm.h
-+++ b/arch/arm64/include/asm/kvm_arm.h
-@@ -18,6 +18,7 @@
- #ifndef __ARM64_KVM_ARM_H__
- #define __ARM64_KVM_ARM_H__
- 
-+#include <asm/memory.h>
- #include <asm/types.h>
- 
- /* Hyp Configuration Register (HCR) bits */
-@@ -160,9 +161,9 @@
- #endif
- 
- #define VTTBR_BADDR_SHIFT (VTTBR_X - 1)
--#define VTTBR_BADDR_MASK  (((1LLU << (PHYS_MASK_SHIFT - VTTBR_X)) - 1) << VTTBR_BADDR_SHIFT)
--#define VTTBR_VMID_SHIFT  (48LLU)
--#define VTTBR_VMID_MASK	  (0xffLLU << VTTBR_VMID_SHIFT)
-+#define VTTBR_BADDR_MASK  (((UL(1) << (PHYS_MASK_SHIFT - VTTBR_X)) - 1) << VTTBR_BADDR_SHIFT)
-+#define VTTBR_VMID_SHIFT  (UL(48))
-+#define VTTBR_VMID_MASK	  (UL(0xFF) << VTTBR_VMID_SHIFT)
- 
- /* Hyp System Trap Register */
- #define HSTR_EL2_TTEE	(1 << 16)
-@@ -185,13 +186,13 @@
- 
- /* Exception Syndrome Register (ESR) bits */
- #define ESR_EL2_EC_SHIFT	(26)
--#define ESR_EL2_EC		(0x3fU << ESR_EL2_EC_SHIFT)
--#define ESR_EL2_IL		(1U << 25)
-+#define ESR_EL2_EC		(UL(0x3f) << ESR_EL2_EC_SHIFT)
-+#define ESR_EL2_IL		(UL(1) << 25)
- #define ESR_EL2_ISS		(ESR_EL2_IL - 1)
- #define ESR_EL2_ISV_SHIFT	(24)
--#define ESR_EL2_ISV		(1U << ESR_EL2_ISV_SHIFT)
-+#define ESR_EL2_ISV		(UL(1) << ESR_EL2_ISV_SHIFT)
- #define ESR_EL2_SAS_SHIFT	(22)
--#define ESR_EL2_SAS		(3U << ESR_EL2_SAS_SHIFT)
-+#define ESR_EL2_SAS		(UL(3) << ESR_EL2_SAS_SHIFT)
- #define ESR_EL2_SSE		(1 << 21)
- #define ESR_EL2_SRT_SHIFT	(16)
- #define ESR_EL2_SRT_MASK	(0x1f << ESR_EL2_SRT_SHIFT)
-@@ -205,16 +206,16 @@
- #define ESR_EL2_FSC_TYPE	(0x3c)
- 
- #define ESR_EL2_CV_SHIFT	(24)
--#define ESR_EL2_CV		(1U << ESR_EL2_CV_SHIFT)
-+#define ESR_EL2_CV		(UL(1) << ESR_EL2_CV_SHIFT)
- #define ESR_EL2_COND_SHIFT	(20)
--#define ESR_EL2_COND		(0xfU << ESR_EL2_COND_SHIFT)
-+#define ESR_EL2_COND		(UL(0xf) << ESR_EL2_COND_SHIFT)
- 
- 
- #define FSC_FAULT	(0x04)
- #define FSC_PERM	(0x0c)
- 
- /* Hyp Prefetch Fault Address Register (HPFAR/HDFAR) */
--#define HPFAR_MASK	(~0xFUL)
-+#define HPFAR_MASK	(~UL(0xf))
- 
- #define ESR_EL2_EC_UNKNOWN	(0x00)
- #define ESR_EL2_EC_WFI		(0x01)
-diff --git a/arch/arm64/include/asm/kvm_mmu.h b/arch/arm64/include/asm/kvm_mmu.h
-index 0caf7a5..123b521 100644
---- a/arch/arm64/include/asm/kvm_mmu.h
-+++ b/arch/arm64/include/asm/kvm_mmu.h
-@@ -243,9 +243,10 @@ static inline bool vcpu_has_cache_enabled(struct kvm_vcpu *vcpu)
- }
- 
- static inline void coherent_cache_guest_page(struct kvm_vcpu *vcpu, hva_t hva,
--					     unsigned long size)
-+					     unsigned long size,
-+					     bool ipa_uncached)
- {
--	if (!vcpu_has_cache_enabled(vcpu))
-+	if (!vcpu_has_cache_enabled(vcpu) || ipa_uncached)
- 		kvm_flush_dcache_to_poc((void *)hva, size);
- 
- 	if (!icache_is_aliasing()) {		/* PIPT */
 diff --git a/arch/arm64/include/asm/pci.h b/arch/arm64/include/asm/pci.h
 index 872ba93..2f287a6 100644
 --- a/arch/arm64/include/asm/pci.h
@@ -3447,11 +756,11 @@ index 780f82c..3411561 100644
   */
  asmlinkage void secondary_start_kernel(void);
 diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile
-index 5bd029b..f4ba4fe 100644
+index eaa77ed..63ffe3c 100644
 --- a/arch/arm64/kernel/Makefile
 +++ b/arch/arm64/kernel/Makefile
-@@ -21,7 +21,8 @@ arm64-obj-$(CONFIG_COMPAT)		+= sys32.o kuser32.o signal32.o 	\
- 					   sys_compat.o
+@@ -23,7 +23,8 @@ arm64-obj-$(CONFIG_COMPAT)		+= sys32.o kuser32.o signal32.o 	\
+ 					   ../../arm/kernel/opcodes.o
  arm64-obj-$(CONFIG_FUNCTION_TRACER)	+= ftrace.o entry-ftrace.o
  arm64-obj-$(CONFIG_MODULES)		+= arm64ksyms.o module.o
 -arm64-obj-$(CONFIG_SMP)			+= smp.o smp_spin_table.o topology.o
@@ -3460,14 +769,14 @@ index 5bd029b..f4ba4fe 100644
  arm64-obj-$(CONFIG_PERF_EVENTS)		+= perf_regs.o
  arm64-obj-$(CONFIG_HW_PERF_EVENTS)	+= perf_event.o
  arm64-obj-$(CONFIG_HAVE_HW_BREAKPOINT)	+= hw_breakpoint.o
-@@ -31,6 +32,7 @@ arm64-obj-$(CONFIG_JUMP_LABEL)		+= jump_label.o
+@@ -33,6 +34,7 @@ arm64-obj-$(CONFIG_JUMP_LABEL)		+= jump_label.o
  arm64-obj-$(CONFIG_KGDB)		+= kgdb.o
  arm64-obj-$(CONFIG_EFI)			+= efi.o efi-stub.o efi-entry.o
  arm64-obj-$(CONFIG_PCI)			+= pci.o
 +arm64-obj-$(CONFIG_ACPI)		+= acpi.o
+ arm64-obj-$(CONFIG_ARMV8_DEPRECATED)	+= armv8_deprecated.o
  
  obj-y					+= $(arm64-obj-y) vdso/
- obj-m					+= $(arm64-obj-m)
 diff --git a/arch/arm64/kernel/acpi.c b/arch/arm64/kernel/acpi.c
 new file mode 100644
 index 0000000..06a96be
@@ -3902,87 +1211,14 @@ index cce9524..1d90f31 100644
  {
  	const struct cpu_operations **ops = supported_cpu_ops;
  
-diff --git a/arch/arm64/kernel/efi-entry.S b/arch/arm64/kernel/efi-entry.S
-index d18a449..8ce9b05 100644
---- a/arch/arm64/kernel/efi-entry.S
-+++ b/arch/arm64/kernel/efi-entry.S
-@@ -61,7 +61,8 @@ ENTRY(efi_stub_entry)
- 	 */
- 	mov	x20, x0		// DTB address
- 	ldr	x0, [sp, #16]	// relocated _text address
--	mov	x21, x0
-+	ldr	x21, =stext_offset
-+	add	x21, x0, x21
- 
- 	/*
- 	 * Calculate size of the kernel Image (same for original and copy).
 diff --git a/arch/arm64/kernel/efi.c b/arch/arm64/kernel/efi.c
-index 95c49eb..f9de195 100644
+index 6fac253..f9de195 100644
 --- a/arch/arm64/kernel/efi.c
 +++ b/arch/arm64/kernel/efi.c
-@@ -11,6 +11,7 @@
-  *
-  */
- 
-+#include <linux/dmi.h>
- #include <linux/efi.h>
- #include <linux/export.h>
- #include <linux/memblock.h>
-@@ -112,8 +113,6 @@ static int __init uefi_init(void)
- 		efi.systab->hdr.revision & 0xffff, vendor);
- 
- 	retval = efi_config_init(NULL);
--	if (retval == 0)
--		set_bit(EFI_CONFIG_TABLES, &efi.flags);
- 
- out:
- 	early_memunmap(efi.systab,  sizeof(efi_system_table_t));
-@@ -125,17 +124,17 @@ out:
-  */
- static __init int is_reserve_region(efi_memory_desc_t *md)
- {
--	if (!is_normal_ram(md))
-+	switch (md->type) {
-+	case EFI_LOADER_CODE:
-+	case EFI_LOADER_DATA:
-+	case EFI_BOOT_SERVICES_CODE:
-+	case EFI_BOOT_SERVICES_DATA:
-+	case EFI_CONVENTIONAL_MEMORY:
- 		return 0;
--
--	if (md->attribute & EFI_MEMORY_RUNTIME)
--		return 1;
--
--	if (md->type == EFI_ACPI_RECLAIM_MEMORY ||
--	    md->type == EFI_RESERVED_TYPE)
--		return 1;
--
--	return 0;
-+	default:
-+		break;
-+	}
-+	return is_normal_ram(md);
- }
- 
- static __init void reserve_regions(void)
-@@ -471,3 +470,54 @@ err_unmap:
- 	return -1;
+@@ -484,3 +484,40 @@ static int __init arm64_dmi_init(void)
+ 	return 0;
  }
- early_initcall(arm64_enter_virtual_mode);
-+
-+static int __init arm64_dmi_init(void)
-+{
-+	/*
-+	 * On arm64, DMI depends on UEFI, and dmi_scan_machine() needs to
-+	 * be called early because dmi_id_init(), which is an arch_initcall
-+	 * itself, depends on dmi_scan_machine() having been called already.
-+	 */
-+	dmi_scan_machine();
-+	if (dmi_available)
-+		dmi_set_dump_stack_arch_desc();
-+	return 0;
-+}
-+core_initcall(arm64_dmi_init);
+ core_initcall(arm64_dmi_init);
 +
 +/*
 + * If nothing else is handling pm_power_off, use EFI
@@ -4020,208 +1256,6 @@ index 95c49eb..f9de195 100644
 +	return ret;
 +}
 +late_initcall(arm64_register_efi_restart);
-diff --git a/arch/arm64/kernel/entry-ftrace.S b/arch/arm64/kernel/entry-ftrace.S
-index 38e704e..08cafc5 100644
---- a/arch/arm64/kernel/entry-ftrace.S
-+++ b/arch/arm64/kernel/entry-ftrace.S
-@@ -98,8 +98,8 @@
- ENTRY(_mcount)
- 	mcount_enter
- 
--	ldr	x0, =ftrace_trace_function
--	ldr	x2, [x0]
-+	adrp	x0, ftrace_trace_function
-+	ldr	x2, [x0, #:lo12:ftrace_trace_function]
- 	adr	x0, ftrace_stub
- 	cmp	x0, x2			// if (ftrace_trace_function
- 	b.eq	skip_ftrace_call	//     != ftrace_stub) {
-@@ -115,14 +115,15 @@ skip_ftrace_call:			//   return;
- 	mcount_exit			//   return;
- 					// }
- skip_ftrace_call:
--	ldr	x1, =ftrace_graph_return
--	ldr	x2, [x1]		//   if ((ftrace_graph_return
--	cmp	x0, x2			//        != ftrace_stub)
--	b.ne	ftrace_graph_caller
--
--	ldr	x1, =ftrace_graph_entry	//     || (ftrace_graph_entry
--	ldr	x2, [x1]		//        != ftrace_graph_entry_stub))
--	ldr	x0, =ftrace_graph_entry_stub
-+	adrp	x1, ftrace_graph_return
-+	ldr	x2, [x1, #:lo12:ftrace_graph_return]
-+	cmp	x0, x2			//   if ((ftrace_graph_return
-+	b.ne	ftrace_graph_caller	//        != ftrace_stub)
-+
-+	adrp	x1, ftrace_graph_entry	//     || (ftrace_graph_entry
-+	adrp	x0, ftrace_graph_entry_stub //     != ftrace_graph_entry_stub))
-+	ldr	x2, [x1, #:lo12:ftrace_graph_entry]
-+	add	x0, x0, #:lo12:ftrace_graph_entry_stub
- 	cmp	x0, x2
- 	b.ne	ftrace_graph_caller	//     ftrace_graph_caller();
- 
-diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S
-index 0a6e4f9..5a76e3a 100644
---- a/arch/arm64/kernel/head.S
-+++ b/arch/arm64/kernel/head.S
-@@ -132,6 +132,8 @@ efi_head:
- #endif
- 
- #ifdef CONFIG_EFI
-+	.globl	stext_offset
-+	.set	stext_offset, stext - efi_head
- 	.align 3
- pe_header:
- 	.ascii	"PE"
-@@ -155,12 +157,12 @@ optional_header:
- 	.long	0				// SizeOfInitializedData
- 	.long	0				// SizeOfUninitializedData
- 	.long	efi_stub_entry - efi_head	// AddressOfEntryPoint
--	.long	stext - efi_head		// BaseOfCode
-+	.long	stext_offset			// BaseOfCode
- 
- extra_header_fields:
- 	.quad	0				// ImageBase
--	.long	0x20				// SectionAlignment
--	.long	0x8				// FileAlignment
-+	.long	0x1000				// SectionAlignment
-+	.long	PECOFF_FILE_ALIGNMENT		// FileAlignment
- 	.short	0				// MajorOperatingSystemVersion
- 	.short	0				// MinorOperatingSystemVersion
- 	.short	0				// MajorImageVersion
-@@ -172,7 +174,7 @@ extra_header_fields:
- 	.long	_end - efi_head			// SizeOfImage
- 
- 	// Everything before the kernel image is considered part of the header
--	.long	stext - efi_head		// SizeOfHeaders
-+	.long	stext_offset			// SizeOfHeaders
- 	.long	0				// CheckSum
- 	.short	0xa				// Subsystem (EFI application)
- 	.short	0				// DllCharacteristics
-@@ -217,16 +219,24 @@ section_table:
- 	.byte	0
- 	.byte	0        		// end of 0 padding of section name
- 	.long	_end - stext		// VirtualSize
--	.long	stext - efi_head	// VirtualAddress
-+	.long	stext_offset		// VirtualAddress
- 	.long	_edata - stext		// SizeOfRawData
--	.long	stext - efi_head	// PointerToRawData
-+	.long	stext_offset		// PointerToRawData
- 
- 	.long	0		// PointerToRelocations (0 for executables)
- 	.long	0		// PointerToLineNumbers (0 for executables)
- 	.short	0		// NumberOfRelocations  (0 for executables)
- 	.short	0		// NumberOfLineNumbers  (0 for executables)
- 	.long	0xe0500020	// Characteristics (section flags)
--	.align 5
-+
-+	/*
-+	 * EFI will load stext onwards at the 4k section alignment
-+	 * described in the PE/COFF header. To ensure that instruction
-+	 * sequences using an adrp and a :lo12: immediate will function
-+	 * correctly at this alignment, we must ensure that stext is
-+	 * placed at a 4k boundary in the Image to begin with.
-+	 */
-+	.align 12
- #endif
- 
- ENTRY(stext)
-diff --git a/arch/arm64/kernel/io.c b/arch/arm64/kernel/io.c
-index 7d37ead..354be2a 100644
---- a/arch/arm64/kernel/io.c
-+++ b/arch/arm64/kernel/io.c
-@@ -25,12 +25,26 @@
-  */
- void __memcpy_fromio(void *to, const volatile void __iomem *from, size_t count)
- {
--	unsigned char *t = to;
--	while (count) {
-+	while (count && (!IS_ALIGNED((unsigned long)from, 8) ||
-+			 !IS_ALIGNED((unsigned long)to, 8))) {
-+		*(u8 *)to = __raw_readb(from);
-+		from++;
-+		to++;
- 		count--;
--		*t = readb(from);
--		t++;
-+	}
-+
-+	while (count >= 8) {
-+		*(u64 *)to = __raw_readq(from);
-+		from += 8;
-+		to += 8;
-+		count -= 8;
-+	}
-+
-+	while (count) {
-+		*(u8 *)to = __raw_readb(from);
- 		from++;
-+		to++;
-+		count--;
- 	}
- }
- EXPORT_SYMBOL(__memcpy_fromio);
-@@ -40,12 +54,26 @@ EXPORT_SYMBOL(__memcpy_fromio);
-  */
- void __memcpy_toio(volatile void __iomem *to, const void *from, size_t count)
- {
--	const unsigned char *f = from;
--	while (count) {
-+	while (count && (!IS_ALIGNED((unsigned long)to, 8) ||
-+			 !IS_ALIGNED((unsigned long)from, 8))) {
-+		__raw_writeb(*(volatile u8 *)from, to);
-+		from++;
-+		to++;
- 		count--;
--		writeb(*f, to);
--		f++;
-+	}
-+
-+	while (count >= 8) {
-+		__raw_writeq(*(volatile u64 *)from, to);
-+		from += 8;
-+		to += 8;
-+		count -= 8;
-+	}
-+
-+	while (count) {
-+		__raw_writeb(*(volatile u8 *)from, to);
-+		from++;
- 		to++;
-+		count--;
- 	}
- }
- EXPORT_SYMBOL(__memcpy_toio);
-@@ -55,10 +83,28 @@ EXPORT_SYMBOL(__memcpy_toio);
-  */
- void __memset_io(volatile void __iomem *dst, int c, size_t count)
- {
--	while (count) {
-+	u64 qc = (u8)c;
-+
-+	qc |= qc << 8;
-+	qc |= qc << 16;
-+	qc |= qc << 32;
-+
-+	while (count && !IS_ALIGNED((unsigned long)dst, 8)) {
-+		__raw_writeb(c, dst);
-+		dst++;
- 		count--;
--		writeb(c, dst);
-+	}
-+
-+	while (count >= 8) {
-+		__raw_writeq(qc, dst);
-+		dst += 8;
-+		count -= 8;
-+	}
-+
-+	while (count) {
-+		__raw_writeb(c, dst);
- 		dst++;
-+		count--;
- 	}
- }
- EXPORT_SYMBOL(__memset_io);
 diff --git a/arch/arm64/kernel/pci.c b/arch/arm64/kernel/pci.c
 index ce5836c..978cd21 100644
 --- a/arch/arm64/kernel/pci.c
@@ -4351,7 +1385,7 @@ index ce5836c..978cd21 100644
 + */
 +fs_initcall(pcibios_assign_resources);
 diff --git a/arch/arm64/kernel/psci.c b/arch/arm64/kernel/psci.c
-index 663da77..2d0deda 100644
+index f1dbca7..dbb3945 100644
 --- a/arch/arm64/kernel/psci.c
 +++ b/arch/arm64/kernel/psci.c
 @@ -15,6 +15,7 @@
@@ -4475,7 +1509,7 @@ index 663da77..2d0deda 100644
  
  static int __init cpu_psci_cpu_init(struct device_node *dn, unsigned int cpu)
 diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c
-index 2437196..914287d 100644
+index 20fe2932ad0c..cf4ab5661088 100644
 --- a/arch/arm64/kernel/setup.c
 +++ b/arch/arm64/kernel/setup.c
 @@ -43,6 +43,7 @@
@@ -4486,7 +1520,7 @@ index 2437196..914287d 100644
  #include <linux/personality.h>
  
  #include <asm/fixmap.h>
-@@ -59,6 +60,7 @@
+@@ -61,6 +62,7 @@
  #include <asm/memblock.h>
  #include <asm/psci.h>
  #include <asm/efi.h>
@@ -4494,33 +1528,8 @@ index 2437196..914287d 100644
  
  unsigned int processor_id;
  EXPORT_SYMBOL(processor_id);
-@@ -116,12 +118,16 @@ void __init early_print(const char *str, ...)
- 
- void __init smp_setup_processor_id(void)
- {
-+	u64 mpidr = read_cpuid_mpidr() & MPIDR_HWID_BITMASK;
-+	cpu_logical_map(0) = mpidr;
-+
- 	/*
- 	 * clear __my_cpu_offset on boot CPU to avoid hang caused by
- 	 * using percpu variable early, for example, lockdep will
- 	 * access percpu variable inside lock_release
- 	 */
- 	set_my_cpu_offset(0);
-+	pr_info("Booting Linux on physical CPU 0x%lx\n", (unsigned long)mpidr);
- }
- 
- bool arch_match_cpu_phys_id(int cpu, u64 phys_id)
-@@ -312,6 +318,7 @@ static void __init setup_machine_fdt(phys_addr_t dt_phys)
-		while (true)
- 			cpu_relax();
- 	}
-+	dump_stack_set_arch_desc("%s (DT)", machine_name);
- }
- 
- /*
-@@ -378,6 +385,8 @@ void __init setup_arch(char **cmdline_p)
- 
+@@ -387,6 +389,8 @@ void __init setup_arch(char **cmdline_p)
+ 	early_fixmap_init();
  	early_ioremap_init();
  
 +	disable_acpi();
@@ -4528,7 +1537,7 @@ index 2437196..914287d 100644
  	parse_early_param();
  
  	/*
-@@ -389,19 +398,27 @@ void __init setup_arch(char **cmdline_p)
+@@ -398,19 +402,29 @@ void __init setup_arch(char **cmdline_p)
  	efi_init();
  	arm64_memblock_init();
  
@@ -4539,7 +1548,7 @@ index 2437196..914287d 100644
  	request_standard_resources();
  
  	efi_idmap_init();
-	early_ioremap_reset();
+ 	early_ioremap_reset();
  
 -	unflatten_device_tree();
 -
@@ -4556,14 +1565,13 @@ index 2437196..914287d 100644
 +		acpi_smp_init_cpus();
 +	}
  
--	cpu_logical_map(0) = read_cpuid_mpidr() & MPIDR_HWID_BITMASK;
--	cpu_read_bootcpu_ops();
+ 	cpu_read_bootcpu_ops();
  #ifdef CONFIG_SMP
 -	smp_init_cpus();
  	smp_build_mpidr_hash();
  #endif
  
-@@ -506,3 +523,25 @@ const struct seq_operations cpuinfo_op = {
+@@ -565,3 +579,25 @@ const struct seq_operations cpuinfo_op = {
  	.stop	= c_stop,
  	.show	= c_show
  };
@@ -4590,10 +1598,10 @@ index 2437196..914287d 100644
 +}
 +early_initcall(arm64_console_setup);
 diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c
-index b06d1d9..2988829 100644
+index 7ae6ee0..5aaf5a4 100644
 --- a/arch/arm64/kernel/smp.c
 +++ b/arch/arm64/kernel/smp.c
-@@ -321,7 +321,7 @@ void __init smp_prepare_boot_cpu(void)
+@@ -323,7 +323,7 @@ void __init smp_prepare_boot_cpu(void)
   * cpu logical map array containing MPIDR values related to logical
   * cpus. Assumes that cpu_logical_map(0) has already been initialized.
   */
@@ -4743,58 +1751,6 @@ index 1a7125c..42f9195 100644
  	arch_timer_rate = arch_timer_get_rate();
  	if (!arch_timer_rate)
  		panic("Unable to initialise architected timer.\n");
-diff --git a/arch/arm64/kernel/vmlinux.lds.S b/arch/arm64/kernel/vmlinux.lds.S
-index edf8715..4596f46 100644
---- a/arch/arm64/kernel/vmlinux.lds.S
-+++ b/arch/arm64/kernel/vmlinux.lds.S
-@@ -32,6 +32,22 @@ jiffies = jiffies_64;
- 	*(.hyp.text)					\
- 	VMLINUX_SYMBOL(__hyp_text_end) = .;
- 
-+/*
-+ * The size of the PE/COFF section that covers the kernel image, which
-+ * runs from stext to _edata, must be a round multiple of the PE/COFF
-+ * FileAlignment, which we set to its minimum value of 0x200. 'stext'
-+ * itself is 4 KB aligned, so padding out _edata to a 0x200 aligned
-+ * boundary should be sufficient.
-+ */
-+PECOFF_FILE_ALIGNMENT = 0x200;
-+
-+#ifdef CONFIG_EFI
-+#define PECOFF_EDATA_PADDING	\
-+	.pecoff_edata_padding : { BYTE(0); . = ALIGN(PECOFF_FILE_ALIGNMENT); }
-+#else
-+#define PECOFF_EDATA_PADDING
-+#endif
-+
- SECTIONS
- {
- 	/*
-@@ -103,6 +119,7 @@ SECTIONS
- 	_data = .;
- 	_sdata = .;
- 	RW_DATA_SECTION(64, PAGE_SIZE, THREAD_SIZE)
-+	PECOFF_EDATA_PADDING
- 	_edata = .;
- 
- 	BSS_SECTION(0, 0, 0)
-diff --git a/arch/arm64/kvm/hyp.S b/arch/arm64/kvm/hyp.S
-index b72aa9f..fbe909f 100644
---- a/arch/arm64/kvm/hyp.S
-+++ b/arch/arm64/kvm/hyp.S
-@@ -761,10 +761,10 @@
- .macro activate_traps
- 	ldr     x2, [x0, #VCPU_HCR_EL2]
- 	msr     hcr_el2, x2
--	ldr	x2, =(CPTR_EL2_TTA)
-+	mov	x2, #CPTR_EL2_TTA
- 	msr	cptr_el2, x2
- 
--	ldr	x2, =(1 << 15)	// Trap CP15 Cr=15
-+	mov	x2, #(1 << 15)	// Trap CP15 Cr=15
- 	msr	hstr_el2, x2
- 
- 	mrs	x2, mdcr_el2
 diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c
 index d920942..cf890e3 100644
 --- a/arch/arm64/mm/dma-mapping.c
@@ -5705,7 +2661,7 @@ index 0000000..0166475
 +
 +#endif /* CONFIG_ACPI */
 diff --git a/drivers/acpi/Kconfig b/drivers/acpi/Kconfig
-index b23fe37..555e226 100644
+index 8951cef..63aa47c 100644
 --- a/drivers/acpi/Kconfig
 +++ b/drivers/acpi/Kconfig
 @@ -5,8 +5,7 @@
@@ -5736,7 +2692,7 @@ index b23fe37..555e226 100644
  	help
  	  This driver creates entries in /sys/bus/pci/slots/ for all PCI
 diff --git a/drivers/acpi/Makefile b/drivers/acpi/Makefile
-index c3b2fcb..5a21476 100644
+index f74317c..c346011 100644
 --- a/drivers/acpi/Makefile
 +++ b/drivers/acpi/Makefile
 @@ -23,7 +23,11 @@ acpi-y				+= nvs.o
@@ -5760,14 +2716,6 @@ index c3b2fcb..5a21476 100644
  acpi-y				+= acpi_lpss.o
  acpi-y				+= acpi_platform.o
  acpi-y				+= acpi_pnp.o
-@@ -47,6 +51,7 @@ acpi-y				+= int340x_thermal.o
- acpi-y				+= power.o
- acpi-y				+= event.o
- acpi-y				+= sysfs.o
-+acpi-y				+= property.o
- acpi-$(CONFIG_X86)		+= acpi_cmos_rtc.o
- acpi-$(CONFIG_DEBUG_FS)		+= debugfs.o
- acpi-$(CONFIG_ACPI_NUMA)	+= numa.o
 diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c
 index 8b67bd0..c412fdb 100644
 --- a/drivers/acpi/bus.c
@@ -5783,7 +2731,7 @@ index 8b67bd0..c412fdb 100644
  		message = "platform specific model";
  		break;
 diff --git a/drivers/acpi/internal.h b/drivers/acpi/internal.h
-index 447f6d6..c5ff8ba 100644
+index 163e82f..c5ff8ba 100644
 --- a/drivers/acpi/internal.h
 +++ b/drivers/acpi/internal.h
 @@ -26,8 +26,13 @@
@@ -5800,19 +2748,8 @@ index 447f6d6..c5ff8ba 100644
  void acpi_processor_init(void);
  void acpi_platform_init(void);
  void acpi_pnp_init(void);
-@@ -173,4 +178,10 @@ static inline void suspend_nvs_restore(void) {}
- bool acpi_osi_is_win8(void);
- #endif
- 
-+/*--------------------------------------------------------------------------
-+				Device properties
-+  -------------------------------------------------------------------------- */
-+void acpi_init_properties(struct acpi_device *adev);
-+void acpi_free_properties(struct acpi_device *adev);
-+
- #endif /* _ACPI_INTERNAL_H_ */
 diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c
-index 9964f70..5c480d5 100644
+index f9eeae8..581b9f7 100644
 --- a/drivers/acpi/osl.c
 +++ b/drivers/acpi/osl.c
 @@ -336,11 +336,11 @@ acpi_map_lookup_virt(void __iomem *virt, acpi_size size)
@@ -5831,7 +2768,7 @@ index 9964f70..5c480d5 100644
  
  static void __iomem *acpi_map(acpi_physical_address pg_off, unsigned long pg_sz)
 diff --git a/drivers/acpi/processor_core.c b/drivers/acpi/processor_core.c
-index ef58f46..5c84e0d 100644
+index 342942f..734c029 100644
 --- a/drivers/acpi/processor_core.c
 +++ b/drivers/acpi/processor_core.c
 @@ -64,6 +64,38 @@ static int map_lsapic_id(struct acpi_subtable_header *entry,
@@ -5875,2897 +2812,487 @@ index ef58f46..5c84e0d 100644
  	unsigned long madt_end, entry;
 @@ -99,6 +131,9 @@ static int map_madt_entry(int type, u32 acpi_id)
  		} else if (header->type == ACPI_MADT_TYPE_LOCAL_SAPIC) {
- 			if (!map_lsapic_id(header, type, acpi_id, &apic_id))
+ 			if (!map_lsapic_id(header, type, acpi_id, &phys_id))
  				break;
 +		} else if (header->type == ACPI_MADT_TYPE_GENERIC_INTERRUPT) {
-+			if (!map_gicc_mpidr(header, type, acpi_id, &apic_id))
++			if (!map_gicc_mpidr(header, type, acpi_id, &phys_id))
 +				break;
  		}
  		entry += header->length;
  	}
 @@ -131,6 +166,8 @@ static int map_mat_entry(acpi_handle handle, int type, u32 acpi_id)
- 		map_lsapic_id(header, type, acpi_id, &apic_id);
- 	} else if (header->type == ACPI_MADT_TYPE_LOCAL_X2APIC) {
- 		map_x2apic_id(header, type, acpi_id, &apic_id);
-+	} else if (header->type == ACPI_MADT_TYPE_GENERIC_INTERRUPT) {
-+		map_gicc_mpidr(header, type, acpi_id, &apic_id);
- 	}
+ 		map_lsapic_id(header, type, acpi_id, &phys_id);
+ 	else if (header->type == ACPI_MADT_TYPE_LOCAL_X2APIC)
+ 		map_x2apic_id(header, type, acpi_id, &phys_id);
++	else if (header->type == ACPI_MADT_TYPE_GENERIC_INTERRUPT)
++		map_gicc_mpidr(header, type, acpi_id, &phys_id);
  
  exit:
-diff --git a/drivers/acpi/property.c b/drivers/acpi/property.c
+ 	kfree(buffer.pointer);
+diff --git a/drivers/acpi/sleep-arm.c b/drivers/acpi/sleep-arm.c
 new file mode 100644
-index 0000000..0d08373
+index 0000000..54578ef
 --- /dev/null
-+++ b/drivers/acpi/property.c
-@@ -0,0 +1,551 @@
++++ b/drivers/acpi/sleep-arm.c
+@@ -0,0 +1,28 @@
 +/*
-+ * ACPI device specific properties support.
-+ *
-+ * Copyright (C) 2014, Intel Corporation
-+ * All rights reserved.
++ *  ARM64 Specific Sleep Functionality
 + *
-+ * Authors: Mika Westerberg <mika.westerberg at linux.intel.com>
-+ *          Darren Hart <dvhart at linux.intel.com>
-+ *          Rafael J. Wysocki <rafael.j.wysocki at intel.com>
++ *  Copyright (C) 2013-2014, Linaro Ltd.
++ *      Author: Graeme Gregory <graeme.gregory at linaro.org>
 + *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
++ *  This program is free software; you can redistribute it and/or modify
++ *  it under the terms of the GNU General Public License version 2 as
++ *  published by the Free Software Foundation.
 + */
 +
 +#include <linux/acpi.h>
-+#include <linux/device.h>
-+#include <linux/export.h>
-+
-+#include "internal.h"
 +
-+/* ACPI _DSD device properties UUID: daffd814-6eba-4d8c-8a91-bc9bbf4aa301 */
-+static const u8 prp_uuid[16] = {
-+	0x14, 0xd8, 0xff, 0xda, 0xba, 0x6e, 0x8c, 0x4d,
-+	0x8a, 0x91, 0xbc, 0x9b, 0xbf, 0x4a, 0xa3, 0x01
-+};
-+
-+static bool acpi_property_value_ok(const union acpi_object *value)
++/*
++ * Currently the ACPI 5.1 standard does not define S states in a
++ * manner which is usable for ARM64. These two stubs are sufficient
++ * that system initialises and device PM works.
++ */
++u32 acpi_target_system_state(void)
 +{
-+	int j;
-+
-+	/*
-+	 * The value must be an integer, a string, a reference, or a package
-+	 * whose every element must be an integer, a string, or a reference.
-+	 */
-+	switch (value->type) {
-+	case ACPI_TYPE_INTEGER:
-+	case ACPI_TYPE_STRING:
-+	case ACPI_TYPE_LOCAL_REFERENCE:
-+		return true;
-+
-+	case ACPI_TYPE_PACKAGE:
-+		for (j = 0; j < value->package.count; j++)
-+			switch (value->package.elements[j].type) {
-+			case ACPI_TYPE_INTEGER:
-+			case ACPI_TYPE_STRING:
-+			case ACPI_TYPE_LOCAL_REFERENCE:
-+				continue;
-+
-+			default:
-+				return false;
-+			}
-+
-+		return true;
-+	}
-+	return false;
++	return ACPI_STATE_S0;
 +}
++EXPORT_SYMBOL_GPL(acpi_target_system_state);
 +
-+static bool acpi_properties_format_valid(const union acpi_object *properties)
++int __init acpi_sleep_init(void)
 +{
-+	int i;
-+
-+	for (i = 0; i < properties->package.count; i++) {
-+		const union acpi_object *property;
-+
-+		property = &properties->package.elements[i];
-+		/*
-+		 * Only two elements allowed, the first one must be a string and
-+		 * the second one has to satisfy certain conditions.
-+		 */
-+		if (property->package.count != 2
-+		    || property->package.elements[0].type != ACPI_TYPE_STRING
-+		    || !acpi_property_value_ok(&property->package.elements[1]))
-+			return false;
-+	}
-+	return true;
++	return -ENOSYS;
 +}
+diff --git a/drivers/acpi/tables.c b/drivers/acpi/tables.c
+index 93b8152..122b48f 100644
+--- a/drivers/acpi/tables.c
++++ b/drivers/acpi/tables.c
+@@ -183,6 +183,49 @@ void acpi_table_print_madt_entry(struct acpi_subtable_header *header)
+ 		}
+ 		break;
+ 
++	case ACPI_MADT_TYPE_GENERIC_INTERRUPT:
++		{
++			struct acpi_madt_generic_interrupt *p =
++				(struct acpi_madt_generic_interrupt *)header;
++			pr_info("GICC (acpi_id[0x%04x] address[%p] MPDIR[0x%llx] %s)\n",
++				p->uid, (void *)(unsigned long)p->base_address,
++				p->arm_mpidr,
++				(p->flags & ACPI_MADT_ENABLED) ? "enabled" : "disabled");
 +
-+static void acpi_init_of_compatible(struct acpi_device *adev)
-+{
-+	const union acpi_object *of_compatible;
-+	struct acpi_hardware_id *hwid;
-+	bool acpi_of = false;
-+	int ret;
-+
-+	/*
-+	 * Check if the special PRP0001 ACPI ID is present and in that
-+	 * case we fill in Device Tree compatible properties for this
-+	 * device.
-+	 */
-+	list_for_each_entry(hwid, &adev->pnp.ids, list) {
-+		if (!strcmp(hwid->id, "PRP0001")) {
-+			acpi_of = true;
-+			break;
 +		}
-+	}
-+
-+	if (!acpi_of)
-+		return;
-+
-+	ret = acpi_dev_get_property_array(adev, "compatible", ACPI_TYPE_STRING,
-+					  &of_compatible);
-+	if (ret) {
-+		ret = acpi_dev_get_property(adev, "compatible",
-+					    ACPI_TYPE_STRING, &of_compatible);
-+		if (ret) {
-+			acpi_handle_warn(adev->handle,
-+					 "PRP0001 requires compatible property\n");
-+			return;
-+		}
-+	}
-+	adev->data.of_compatible = of_compatible;
-+}
-+
-+void acpi_init_properties(struct acpi_device *adev)
-+{
-+	struct acpi_buffer buf = { ACPI_ALLOCATE_BUFFER };
-+	const union acpi_object *desc;
-+	acpi_status status;
-+	int i;
-+
-+	status = acpi_evaluate_object_typed(adev->handle, "_DSD", NULL, &buf,
-+					    ACPI_TYPE_PACKAGE);
-+	if (ACPI_FAILURE(status))
-+		return;
-+
-+	desc = buf.pointer;
-+	if (desc->package.count % 2)
-+		goto fail;
-+
-+	/* Look for the device properties UUID. */
-+	for (i = 0; i < desc->package.count; i += 2) {
-+		const union acpi_object *uuid, *properties;
-+
-+		uuid = &desc->package.elements[i];
-+		properties = &desc->package.elements[i + 1];
-+
-+		/*
-+		 * The first element must be a UUID and the second one must be
-+		 * a package.
-+		 */
-+		if (uuid->type != ACPI_TYPE_BUFFER || uuid->buffer.length != 16
-+		    || properties->type != ACPI_TYPE_PACKAGE)
-+			break;
-+
-+		if (memcmp(uuid->buffer.pointer, prp_uuid, sizeof(prp_uuid)))
-+			continue;
-+
-+		/*
-+		 * We found the matching UUID. Now validate the format of the
-+		 * package immediately following it.
-+		 */
-+		if (!acpi_properties_format_valid(properties))
-+			break;
-+
-+		adev->data.pointer = buf.pointer;
-+		adev->data.properties = properties;
-+
-+		acpi_init_of_compatible(adev);
-+		return;
-+	}
-+
-+ fail:
-+	dev_warn(&adev->dev, "Returned _DSD data is not valid, skipping\n");
-+	ACPI_FREE(buf.pointer);
-+}
-+
-+void acpi_free_properties(struct acpi_device *adev)
-+{
-+	ACPI_FREE((void *)adev->data.pointer);
-+	adev->data.of_compatible = NULL;
-+	adev->data.pointer = NULL;
-+	adev->data.properties = NULL;
-+}
-+
-+/**
-+ * acpi_dev_get_property - return an ACPI property with given name
-+ * @adev: ACPI device to get property
-+ * @name: Name of the property
-+ * @type: Expected property type
-+ * @obj: Location to store the property value (if not %NULL)
-+ *
-+ * Look up a property with @name and store a pointer to the resulting ACPI
-+ * object at the location pointed to by @obj if found.
-+ *
-+ * Callers must not attempt to free the returned objects.  These objects will be
-+ * freed by the ACPI core automatically during the removal of @adev.
-+ *
-+ * Return: %0 if property with @name has been found (success),
-+ *         %-EINVAL if the arguments are invalid,
-+ *         %-ENODATA if the property doesn't exist,
-+ *         %-EPROTO if the property value type doesn't match @type.
-+ */
-+int acpi_dev_get_property(struct acpi_device *adev, const char *name,
-+			  acpi_object_type type, const union acpi_object **obj)
-+{
-+	const union acpi_object *properties;
-+	int i;
-+
-+	if (!adev || !name)
-+		return -EINVAL;
-+
-+	if (!adev->data.pointer || !adev->data.properties)
-+		return -ENODATA;
-+
-+	properties = adev->data.properties;
-+	for (i = 0; i < properties->package.count; i++) {
-+		const union acpi_object *propname, *propvalue;
-+		const union acpi_object *property;
-+
-+		property = &properties->package.elements[i];
-+
-+		propname = &property->package.elements[0];
-+		propvalue = &property->package.elements[1];
-+
-+		if (!strcmp(name, propname->string.pointer)) {
-+			if (type != ACPI_TYPE_ANY && propvalue->type != type)
-+				return -EPROTO;
-+			else if (obj)
-+				*obj = propvalue;
-+
-+			return 0;
-+		}
-+	}
-+	return -ENODATA;
-+}
-+EXPORT_SYMBOL_GPL(acpi_dev_get_property);
-+
-+/**
-+ * acpi_dev_get_property_array - return an ACPI array property with given name
-+ * @adev: ACPI device to get property
-+ * @name: Name of the property
-+ * @type: Expected type of array elements
-+ * @obj: Location to store a pointer to the property value (if not NULL)
-+ *
-+ * Look up an array property with @name and store a pointer to the resulting
-+ * ACPI object at the location pointed to by @obj if found.
-+ *
-+ * Callers must not attempt to free the returned objects.  Those objects will be
-+ * freed by the ACPI core automatically during the removal of @adev.
-+ *
-+ * Return: %0 if array property (package) with @name has been found (success),
-+ *         %-EINVAL if the arguments are invalid,
-+ *         %-ENODATA if the property doesn't exist,
-+ *         %-EPROTO if the property is not a package or the type of its elements
-+ *           doesn't match @type.
-+ */
-+int acpi_dev_get_property_array(struct acpi_device *adev, const char *name,
-+				acpi_object_type type,
-+				const union acpi_object **obj)
-+{
-+	const union acpi_object *prop;
-+	int ret, i;
-+
-+	ret = acpi_dev_get_property(adev, name, ACPI_TYPE_PACKAGE, &prop);
-+	if (ret)
-+		return ret;
-+
-+	if (type != ACPI_TYPE_ANY) {
-+		/* Check that all elements are of correct type. */
-+		for (i = 0; i < prop->package.count; i++)
-+			if (prop->package.elements[i].type != type)
-+				return -EPROTO;
-+	}
-+	if (obj)
-+		*obj = prop;
-+
-+	return 0;
-+}
-+EXPORT_SYMBOL_GPL(acpi_dev_get_property_array);
-+
-+/**
-+ * acpi_dev_get_property_reference - returns handle to the referenced object
-+ * @adev: ACPI device to get property
-+ * @name: Name of the property
-+ * @index: Index of the reference to return
-+ * @args: Location to store the returned reference with optional arguments
-+ *
-+ * Find property with @name, verifify that it is a package containing at least
-+ * one object reference and if so, store the ACPI device object pointer to the
-+ * target object in @args->adev.  If the reference includes arguments, store
-+ * them in the @args->args[] array.
-+ *
-+ * If there's more than one reference in the property value package, @index is
-+ * used to select the one to return.
-+ *
-+ * Return: %0 on success, negative error code on failure.
-+ */
-+int acpi_dev_get_property_reference(struct acpi_device *adev,
-+				    const char *name, size_t index,
-+				    struct acpi_reference_args *args)
-+{
-+	const union acpi_object *element, *end;
-+	const union acpi_object *obj;
-+	struct acpi_device *device;
-+	int ret, idx = 0;
-+
-+	ret = acpi_dev_get_property(adev, name, ACPI_TYPE_ANY, &obj);
-+	if (ret)
-+		return ret;
-+
-+	/*
-+	 * The simplest case is when the value is a single reference.  Just
-+	 * return that reference then.
-+	 */
-+	if (obj->type == ACPI_TYPE_LOCAL_REFERENCE) {
-+		if (index)
-+			return -EINVAL;
-+
-+		ret = acpi_bus_get_device(obj->reference.handle, &device);
-+		if (ret)
-+			return ret;
-+
-+		args->adev = device;
-+		args->nargs = 0;
-+		return 0;
-+	}
-+
-+	/*
-+	 * If it is not a single reference, then it is a package of
-+	 * references followed by number of ints as follows:
-+	 *
-+	 *  Package () { REF, INT, REF, INT, INT }
-+	 *
-+	 * The index argument is then used to determine which reference
-+	 * the caller wants (along with the arguments).
-+	 */
-+	if (obj->type != ACPI_TYPE_PACKAGE || index >= obj->package.count)
-+		return -EPROTO;
-+
-+	element = obj->package.elements;
-+	end = element + obj->package.count;
-+
-+	while (element < end) {
-+		u32 nargs, i;
-+
-+		if (element->type != ACPI_TYPE_LOCAL_REFERENCE)
-+			return -EPROTO;
-+
-+		ret = acpi_bus_get_device(element->reference.handle, &device);
-+		if (ret)
-+			return -ENODEV;
-+
-+		element++;
-+		nargs = 0;
-+
-+		/* assume following integer elements are all args */
-+		for (i = 0; element + i < end; i++) {
-+			int type = element[i].type;
-+
-+			if (type == ACPI_TYPE_INTEGER)
-+				nargs++;
-+			else if (type == ACPI_TYPE_LOCAL_REFERENCE)
-+				break;
-+			else
-+				return -EPROTO;
-+		}
-+
-+		if (idx++ == index) {
-+			args->adev = device;
-+			args->nargs = nargs;
-+			for (i = 0; i < nargs; i++)
-+				args->args[i] = element[i].integer.value;
++		break;
 +
-+			return 0;
++	case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR:
++		{
++			struct acpi_madt_generic_distributor *p =
++				(struct acpi_madt_generic_distributor *)header;
++			pr_info("GIC Distributor (gic_id[0x%04x] address[%p] gsi_base[%d])\n",
++				p->gic_id,
++				(void *)(unsigned long)p->base_address,
++				p->global_irq_base);
 +		}
++		break;
 +
-+		element += nargs;
-+	}
-+
-+	return -EPROTO;
-+}
-+EXPORT_SYMBOL_GPL(acpi_dev_get_property_reference);
-+
-+int acpi_dev_prop_get(struct acpi_device *adev, const char *propname,
-+		      void **valptr)
-+{
-+	return acpi_dev_get_property(adev, propname, ACPI_TYPE_ANY,
-+				     (const union acpi_object **)valptr);
-+}
-+
-+int acpi_dev_prop_read_single(struct acpi_device *adev, const char *propname,
-+			      enum dev_prop_type proptype, void *val)
-+{
-+	const union acpi_object *obj;
-+	int ret;
-+
-+	if (!val)
-+		return -EINVAL;
-+
-+	if (proptype >= DEV_PROP_U8 && proptype <= DEV_PROP_U64) {
-+		ret = acpi_dev_get_property(adev, propname, ACPI_TYPE_INTEGER, &obj);
-+		if (ret)
-+			return ret;
-+
-+		switch (proptype) {
-+		case DEV_PROP_U8:
-+			if (obj->integer.value > U8_MAX)
-+				return -EOVERFLOW;
-+			*(u8 *)val = obj->integer.value;
-+			break;
-+		case DEV_PROP_U16:
-+			if (obj->integer.value > U16_MAX)
-+				return -EOVERFLOW;
-+			*(u16 *)val = obj->integer.value;
-+			break;
-+		case DEV_PROP_U32:
-+			if (obj->integer.value > U32_MAX)
-+				return -EOVERFLOW;
-+			*(u32 *)val = obj->integer.value;
-+			break;
-+		default:
-+			*(u64 *)val = obj->integer.value;
-+			break;
++	case ACPI_MADT_TYPE_GENERIC_MSI_FRAME:
++		{
++			struct acpi_madt_generic_msi_frame *p =
++				(struct acpi_madt_generic_msi_frame *)header;
++			pr_info("GIC MSI Frame (msi_fame_id[%d] address[%p])\n",
++				p->msi_frame_id,
++				(void *)(unsigned long)p->base_address);
 +		}
-+	} else if (proptype == DEV_PROP_STRING) {
-+		ret = acpi_dev_get_property(adev, propname, ACPI_TYPE_STRING, &obj);
-+		if (ret)
-+			return ret;
-+
-+		*(char **)val = obj->string.pointer;
-+	} else {
-+		ret = -EINVAL;
-+	}
-+	return ret;
-+}
-+
-+static int acpi_copy_property_array_u8(const union acpi_object *items, u8 *val,
-+				       size_t nval)
-+{
-+	int i;
-+
-+	for (i = 0; i < nval; i++) {
-+		if (items[i].type != ACPI_TYPE_INTEGER)
-+			return -EPROTO;
-+		if (items[i].integer.value > U8_MAX)
-+			return -EOVERFLOW;
-+
-+		val[i] = items[i].integer.value;
-+	}
-+	return 0;
-+}
-+
-+static int acpi_copy_property_array_u16(const union acpi_object *items,
-+					u16 *val, size_t nval)
-+{
-+	int i;
-+
-+	for (i = 0; i < nval; i++) {
-+		if (items[i].type != ACPI_TYPE_INTEGER)
-+			return -EPROTO;
-+		if (items[i].integer.value > U16_MAX)
-+			return -EOVERFLOW;
-+
-+		val[i] = items[i].integer.value;
-+	}
-+	return 0;
-+}
-+
-+static int acpi_copy_property_array_u32(const union acpi_object *items,
-+					u32 *val, size_t nval)
-+{
-+	int i;
-+
-+	for (i = 0; i < nval; i++) {
-+		if (items[i].type != ACPI_TYPE_INTEGER)
-+			return -EPROTO;
-+		if (items[i].integer.value > U32_MAX)
-+			return -EOVERFLOW;
-+
-+		val[i] = items[i].integer.value;
-+	}
-+	return 0;
-+}
-+
-+static int acpi_copy_property_array_u64(const union acpi_object *items,
-+					u64 *val, size_t nval)
-+{
-+	int i;
-+
-+	for (i = 0; i < nval; i++) {
-+		if (items[i].type != ACPI_TYPE_INTEGER)
-+			return -EPROTO;
-+
-+		val[i] = items[i].integer.value;
-+	}
-+	return 0;
-+}
-+
-+static int acpi_copy_property_array_string(const union acpi_object *items,
-+					   char **val, size_t nval)
-+{
-+	int i;
-+
-+	for (i = 0; i < nval; i++) {
-+		if (items[i].type != ACPI_TYPE_STRING)
-+			return -EPROTO;
-+
-+		val[i] = items[i].string.pointer;
-+	}
-+	return 0;
-+}
-+
-+int acpi_dev_prop_read(struct acpi_device *adev, const char *propname,
-+		       enum dev_prop_type proptype, void *val, size_t nval)
-+{
-+	const union acpi_object *obj;
-+	const union acpi_object *items;
-+	int ret;
-+
-+	if (val && nval == 1) {
-+		ret = acpi_dev_prop_read_single(adev, propname, proptype, val);
-+		if (!ret)
-+			return ret;
-+	}
-+
-+	ret = acpi_dev_get_property_array(adev, propname, ACPI_TYPE_ANY, &obj);
-+	if (ret)
-+		return ret;
-+
-+	if (!val)
-+		return obj->package.count;
-+	else if (nval <= 0)
-+		return -EINVAL;
-+
-+	if (nval > obj->package.count)
-+		return -EOVERFLOW;
-+
-+	items = obj->package.elements;
-+	switch (proptype) {
-+	case DEV_PROP_U8:
-+		ret = acpi_copy_property_array_u8(items, (u8 *)val, nval);
-+		break;
-+	case DEV_PROP_U16:
-+		ret = acpi_copy_property_array_u16(items, (u16 *)val, nval);
-+		break;
-+	case DEV_PROP_U32:
-+		ret = acpi_copy_property_array_u32(items, (u32 *)val, nval);
-+		break;
-+	case DEV_PROP_U64:
-+		ret = acpi_copy_property_array_u64(items, (u64 *)val, nval);
-+		break;
-+	case DEV_PROP_STRING:
-+		ret = acpi_copy_property_array_string(items, (char **)val, nval);
 +		break;
-+	default:
-+		ret = -EINVAL;
-+		break;
-+	}
-+	return ret;
-+}
-diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
-index 0476e90..9cb5cca 100644
---- a/drivers/acpi/scan.c
-+++ b/drivers/acpi/scan.c
-@@ -124,17 +124,56 @@ static int create_modalias(struct acpi_device *acpi_dev, char *modalias,
- 	if (list_empty(&acpi_dev->pnp.ids))
- 		return 0;
- 
--	len = snprintf(modalias, size, "acpi:");
--	size -= len;
--
--	list_for_each_entry(id, &acpi_dev->pnp.ids, list) {
--		count = snprintf(&modalias[len], size, "%s:", id->id);
--		if (count < 0)
--			return -EINVAL;
--		if (count >= size)
--			return -ENOMEM;
--		len += count;
--		size -= count;
-+	/*
-+	 * If the device has PRP0001 we expose DT compatible modalias
-+	 * instead in form of of:NnameTCcompatible.
-+	 */
-+	if (acpi_dev->data.of_compatible) {
-+		struct acpi_buffer buf = { ACPI_ALLOCATE_BUFFER };
-+		const union acpi_object *of_compatible, *obj;
-+		int i, nval;
-+		char *c;
-+
-+		acpi_get_name(acpi_dev->handle, ACPI_SINGLE_NAME, &buf);
-+		/* DT strings are all in lower case */
-+		for (c = buf.pointer; *c != '\0'; c++)
-+			*c = tolower(*c);
-+
-+		len = snprintf(modalias, size, "of:N%sT", (char *)buf.pointer);
-+		ACPI_FREE(buf.pointer);
-+
-+		of_compatible = acpi_dev->data.of_compatible;
-+		if (of_compatible->type == ACPI_TYPE_PACKAGE) {
-+			nval = of_compatible->package.count;
-+			obj = of_compatible->package.elements;
-+		} else { /* Must be ACPI_TYPE_STRING. */
-+			nval = 1;
-+			obj = of_compatible;
-+		}
-+		for (i = 0; i < nval; i++, obj++) {
-+			count = snprintf(&modalias[len], size, "C%s",
-+					 obj->string.pointer);
-+			if (count < 0)
-+				return -EINVAL;
-+			if (count >= size)
-+				return -ENOMEM;
 +
-+			len += count;
-+			size -= count;
++	case ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR:
++		{
++			struct acpi_madt_generic_redistributor *p =
++				(struct acpi_madt_generic_redistributor *)header;
++			pr_info("GIC Redistributor (address[%p] region_size[0x%x])\n",
++				(void *)(unsigned long)p->base_address,
++				p->length);
 +		}
-+	} else {
-+		len = snprintf(modalias, size, "acpi:");
-+		size -= len;
++		break;
 +
-+		list_for_each_entry(id, &acpi_dev->pnp.ids, list) {
-+			count = snprintf(&modalias[len], size, "%s:", id->id);
-+			if (count < 0)
-+				return -EINVAL;
-+			if (count >= size)
-+				return -ENOMEM;
-+			len += count;
-+			size -= count;
-+		}
+ 	default:
+ 		pr_warn("Found unsupported MADT entry (type = 0x%x)\n",
+ 			header->type);
+@@ -210,7 +253,7 @@ acpi_parse_entries(char *id, unsigned long table_size,
+ 		return -EINVAL;
+ 
+ 	if (!table_header) {
+-		pr_warn("%4.4s not present\n", id);
++		pr_warn("Table header not present\n");
+ 		return -ENODEV;
  	}
  
- 	modalias[len] = '\0';
-@@ -902,6 +941,51 @@ int acpi_match_device_ids(struct acpi_device *device,
- }
- EXPORT_SYMBOL(acpi_match_device_ids);
+@@ -246,7 +289,8 @@ acpi_parse_entries(char *id, unsigned long table_size,
  
-+/* Performs match against special "PRP0001" shoehorn ACPI ID */
-+static bool acpi_of_driver_match_device(struct device *dev,
-+					const struct device_driver *drv)
-+{
-+	const union acpi_object *of_compatible, *obj;
-+	struct acpi_device *adev;
-+	int i, nval;
-+
-+	adev = ACPI_COMPANION(dev);
-+	if (!adev)
-+		return false;
-+
-+	of_compatible = adev->data.of_compatible;
-+	if (!drv->of_match_table || !of_compatible)
-+		return false;
-+
-+	if (of_compatible->type == ACPI_TYPE_PACKAGE) {
-+		nval = of_compatible->package.count;
-+		obj = of_compatible->package.elements;
-+	} else { /* Must be ACPI_TYPE_STRING. */
-+		nval = 1;
-+		obj = of_compatible;
-+	}
-+	/* Now we can look for the driver DT compatible strings */
-+	for (i = 0; i < nval; i++, obj++) {
-+		const struct of_device_id *id;
-+
-+		for (id = drv->of_match_table; id->compatible[0]; id++)
-+			if (!strcasecmp(obj->string.pointer, id->compatible))
-+				return true;
-+	}
-+
-+	return false;
-+}
-+
-+bool acpi_driver_match_device(struct device *dev,
-+			      const struct device_driver *drv)
-+{
-+	if (!drv->acpi_match_table)
-+		return acpi_of_driver_match_device(dev, drv);
-+
-+	return !!acpi_match_device(drv->acpi_match_table, dev);
-+}
-+EXPORT_SYMBOL_GPL(acpi_driver_match_device);
-+
- static void acpi_free_power_resources_lists(struct acpi_device *device)
- {
- 	int i;
-@@ -922,6 +1006,7 @@ static void acpi_device_release(struct device *dev)
- {
- 	struct acpi_device *acpi_dev = to_acpi_device(dev);
- 
-+	acpi_free_properties(acpi_dev);
- 	acpi_free_pnp_ids(&acpi_dev->pnp);
- 	acpi_free_power_resources_lists(acpi_dev);
- 	kfree(acpi_dev);
-@@ -1304,6 +1389,26 @@ int acpi_device_add(struct acpi_device *device,
- 	return result;
- }
- 
-+struct acpi_device *acpi_get_next_child(struct device *dev,
-+					struct acpi_device *child)
-+{
-+	struct acpi_device *adev = ACPI_COMPANION(dev);
-+	struct list_head *head, *next;
-+
-+	if (!adev)
-+		return NULL;
-+
-+	head = &adev->children;
-+	if (list_empty(head))
-+		return NULL;
-+
-+	if (!child)
-+		return list_first_entry(head, struct acpi_device, node);
-+
-+	next = child->node.next;
-+	return next == head ? NULL : list_entry(next, struct acpi_device, node);
-+}
-+
- /* --------------------------------------------------------------------------
-                                  Driver Management
-    -------------------------------------------------------------------------- */
-@@ -1923,9 +2028,11 @@ void acpi_init_device_object(struct acpi_device *device, acpi_handle handle,
- 	device->device_type = type;
- 	device->handle = handle;
- 	device->parent = acpi_bus_get_parent(handle);
-+	device->fwnode.type = FWNODE_ACPI;
- 	acpi_set_device_status(device, sta);
- 	acpi_device_get_busid(device);
- 	acpi_set_pnp_ids(handle, &device->pnp, type);
-+	acpi_init_properties(device);
- 	acpi_bus_get_flags(device);
- 	device->flags.match_driver = false;
- 	device->flags.initialized = true;
-diff --git a/drivers/acpi/sleep-arm.c b/drivers/acpi/sleep-arm.c
-new file mode 100644
-index 0000000..54578ef
---- /dev/null
-+++ b/drivers/acpi/sleep-arm.c
-@@ -0,0 +1,28 @@
-+/*
-+ *  ARM64 Specific Sleep Functionality
-+ *
-+ *  Copyright (C) 2013-2014, Linaro Ltd.
-+ *      Author: Graeme Gregory <graeme.gregory at linaro.org>
-+ *
-+ *  This program is free software; you can redistribute it and/or modify
-+ *  it under the terms of the GNU General Public License version 2 as
-+ *  published by the Free Software Foundation.
-+ */
-+
-+#include <linux/acpi.h>
-+
-+/*
-+ * Currently the ACPI 5.1 standard does not define S states in a
-+ * manner which is usable for ARM64. These two stubs are sufficient
-+ * that system initialises and device PM works.
-+ */
-+u32 acpi_target_system_state(void)
-+{
-+	return ACPI_STATE_S0;
-+}
-+EXPORT_SYMBOL_GPL(acpi_target_system_state);
-+
-+int __init acpi_sleep_init(void)
-+{
-+	return -ENOSYS;
-+}
-diff --git a/drivers/acpi/tables.c b/drivers/acpi/tables.c
-index 6d5a6cd..47f36d4 100644
---- a/drivers/acpi/tables.c
-+++ b/drivers/acpi/tables.c
-@@ -183,6 +183,49 @@ void acpi_table_print_madt_entry(struct acpi_subtable_header *header)
- 		}
- 		break;
- 
-+	case ACPI_MADT_TYPE_GENERIC_INTERRUPT:
-+		{
-+			struct acpi_madt_generic_interrupt *p =
-+				(struct acpi_madt_generic_interrupt *)header;
-+			pr_info("GICC (acpi_id[0x%04x] address[%p] MPDIR[0x%llx] %s)\n",
-+				p->uid, (void *)(unsigned long)p->base_address,
-+				p->arm_mpidr,
-+				(p->flags & ACPI_MADT_ENABLED) ? "enabled" : "disabled");
-+
-+		}
-+		break;
-+
-+	case ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR:
-+		{
-+			struct acpi_madt_generic_distributor *p =
-+				(struct acpi_madt_generic_distributor *)header;
-+			pr_info("GIC Distributor (gic_id[0x%04x] address[%p] gsi_base[%d])\n",
-+				p->gic_id,
-+				(void *)(unsigned long)p->base_address,
-+				p->global_irq_base);
-+		}
-+		break;
-+
-+	case ACPI_MADT_TYPE_GENERIC_MSI_FRAME:
-+		{
-+			struct acpi_madt_generic_msi_frame *p =
-+				(struct acpi_madt_generic_msi_frame *)header;
-+			pr_info("GIC MSI Frame (msi_fame_id[%d] address[%p])\n",
-+				p->msi_frame_id,
-+				(void *)(unsigned long)p->base_address);
-+		}
-+		break;
-+
-+	case ACPI_MADT_TYPE_GENERIC_REDISTRIBUTOR:
-+		{
-+			struct acpi_madt_generic_redistributor *p =
-+				(struct acpi_madt_generic_redistributor *)header;
-+			pr_info("GIC Redistributor (address[%p] region_size[0x%x])\n",
-+				(void *)(unsigned long)p->base_address,
-+				p->length);
-+		}
-+		break;
-+
- 	default:
- 		pr_warn("Found unsupported MADT entry (type = 0x%x)\n",
- 			header->type);
-@@ -192,17 +235,14 @@ void acpi_table_print_madt_entry(struct acpi_subtable_header *header)
- 
- 
- int __init
--acpi_table_parse_entries(char *id,
--			     unsigned long table_size,
--			     int entry_id,
--			     acpi_tbl_entry_handler handler,
--			     unsigned int max_entries)
-+acpi_parse_entries(unsigned long table_size,
-+		acpi_tbl_entry_handler handler,
-+		struct acpi_table_header *table_header,
-+		int entry_id, unsigned int max_entries)
- {
--	struct acpi_table_header *table_header = NULL;
- 	struct acpi_subtable_header *entry;
--	unsigned int count = 0;
-+	int count = 0;
- 	unsigned long table_end;
--	acpi_size tbl_size;
- 
- 	if (acpi_disabled)
- 		return -ENODEV;
-@@ -210,13 +250,11 @@ acpi_table_parse_entries(char *id,
- 	if (!handler)
- 		return -EINVAL;
- 
--	if (strncmp(id, ACPI_SIG_MADT, 4) == 0)
--		acpi_get_table_with_size(id, acpi_apic_instance, &table_header, &tbl_size);
--	else
--		acpi_get_table_with_size(id, 0, &table_header, &tbl_size);
-+	if (!table_size)
-+		return -EINVAL;
- 
- 	if (!table_header) {
--		pr_warn("%4.4s not present\n", id);
-+		pr_warn("Table header not present\n");
- 		return -ENODEV;
- 	}
- 
-@@ -230,32 +268,67 @@ acpi_table_parse_entries(char *id,
- 	while (((unsigned long)entry) + sizeof(struct acpi_subtable_header) <
- 	       table_end) {
- 		if (entry->type == entry_id
--		    && (!max_entries || count++ < max_entries))
-+		    && (!max_entries || count < max_entries)) {
- 			if (handler(entry, table_end))
--				goto err;
-+				return -EINVAL;
-+
-+			count++;
-+		}
- 
- 		/*
- 		 * If entry->length is 0, break from this loop to avoid
- 		 * infinite loop.
- 		 */
- 		if (entry->length == 0) {
--			pr_err("[%4.4s:0x%02x] Invalid zero length\n", id, entry_id);
--			goto err;
-+			pr_err("[0x%02x] Invalid zero length\n", entry_id);
-+			return -EINVAL;
- 		}
- 
- 		entry = (struct acpi_subtable_header *)
- 		    ((unsigned long)entry + entry->length);
- 	}
-+
  	if (max_entries && count > max_entries) {
  		pr_warn("[%4.4s:0x%02x] ignored %i entries of %i found\n",
 -			id, entry_id, count - max_entries, count);
 +			table_header->signature, entry_id, count - max_entries,
 +			count);
- 	}
- 
--	early_acpi_os_unmap_memory((char *)table_header, tbl_size);
- 	return count;
--err:
-+}
-+
-+int __init
-+acpi_table_parse_entries(char *id,
-+			 unsigned long table_size,
-+			 int entry_id,
-+			 acpi_tbl_entry_handler handler,
-+			 unsigned int max_entries)
-+{
-+	struct acpi_table_header *table_header = NULL;
-+	acpi_size tbl_size;
-+	int count;
-+
-+	if (acpi_disabled)
-+		return -ENODEV;
-+
-+	if (!handler)
-+		return -EINVAL;
-+
-+	if (strncmp(id, ACPI_SIG_MADT, 4) == 0)
-+		acpi_get_table_with_size(id, acpi_apic_instance, &table_header, &tbl_size);
-+	else
-+		acpi_get_table_with_size(id, 0, &table_header, &tbl_size);
-+
-+	if (!table_header) {
-+		pr_warn("%4.4s not present\n", id);
-+		return -ENODEV;
-+	}
-+
-+	count = acpi_parse_entries(table_size, handler, table_header,
-+			entry_id, max_entries);
-+
- 	early_acpi_os_unmap_memory((char *)table_header, tbl_size);
--	return -EINVAL;
-+	return count;
- }
- 
- int __init
-diff --git a/drivers/acpi/utils.c b/drivers/acpi/utils.c
-index 371ac12..af325a7 100644
---- a/drivers/acpi/utils.c
-+++ b/drivers/acpi/utils.c
-@@ -723,3 +723,29 @@ bool acpi_check_dsm(acpi_handle handle, const u8 *uuid, int rev, u64 funcs)
- 	return false;
- }
- EXPORT_SYMBOL(acpi_check_dsm);
-+
-+/**
-+ * acpi_check_coherency - check for memory coherency of a device
-+ * @handle: ACPI device handle
-+ * @val:    Pointer to returned value
-+ *
-+ * Search a device and its parents for a _CCA method and return
-+ * its value.
-+ */
-+acpi_status acpi_check_coherency(acpi_handle handle, int *val)
-+{
-+	unsigned long long data;
-+	acpi_status status;
-+
-+	do {
-+		status = acpi_evaluate_integer(handle, "_CCA", NULL, &data);
-+		if (!ACPI_FAILURE(status)) {
-+			*val = data;
-+			break;
-+		}
-+		status = acpi_get_parent(handle, &handle);
-+	} while (!ACPI_FAILURE(status));
-+
-+	return status;
-+}
-+EXPORT_SYMBOL(acpi_check_coherency);
-diff --git a/drivers/ata/Kconfig b/drivers/ata/Kconfig
-index cd4cccb..edb00c6 100644
---- a/drivers/ata/Kconfig
-+++ b/drivers/ata/Kconfig
-@@ -48,7 +48,7 @@ config ATA_VERBOSE_ERROR
- 
- config ATA_ACPI
- 	bool "ATA ACPI Support"
--	depends on ACPI && PCI
-+	depends on ACPI
- 	default y
- 	help
- 	  This option adds support for ATA-related ACPI objects.
-diff --git a/drivers/ata/ahci_platform.c b/drivers/ata/ahci_platform.c
-index 06f1d59..df2ea85 100644
---- a/drivers/ata/ahci_platform.c
-+++ b/drivers/ata/ahci_platform.c
-@@ -20,6 +20,9 @@
- #include <linux/platform_device.h>
- #include <linux/libata.h>
- #include <linux/ahci_platform.h>
-+#ifdef CONFIG_ATA_ACPI
-+#include <linux/acpi.h>
-+#endif
- #include "ahci.h"
- 
- static const struct ata_port_info ahci_port_info = {
-@@ -71,6 +74,13 @@ static const struct of_device_id ahci_of_match[] = {
- };
- MODULE_DEVICE_TABLE(of, ahci_of_match);
- 
-+#ifdef CONFIG_ATA_ACPI
-+static const struct acpi_device_id ahci_acpi_match[] = {
-+	{ "AMDI0600", 0 }, /* AMD Seattle AHCI */
-+	{ },
-+};
-+#endif
-+
- static struct platform_driver ahci_driver = {
- 	.probe = ahci_probe,
- 	.remove = ata_platform_remove_one,
-@@ -78,6 +88,9 @@ static struct platform_driver ahci_driver = {
- 		.name = "ahci",
- 		.owner = THIS_MODULE,
- 		.of_match_table = ahci_of_match,
-+#ifdef CONFIG_ATA_ACPI
-+		.acpi_match_table = ACPI_PTR(ahci_acpi_match),
-+#endif
- 		.pm = &ahci_pm_ops,
- 	},
- };
-diff --git a/drivers/ata/ahci_xgene.c b/drivers/ata/ahci_xgene.c
-index 0f8538f..2d8103a 100644
---- a/drivers/ata/ahci_xgene.c
-+++ b/drivers/ata/ahci_xgene.c
-@@ -28,6 +28,7 @@
- #include <linux/of_address.h>
- #include <linux/of_irq.h>
- #include <linux/phy/phy.h>
-+#include <linux/acpi.h>
- #include "ahci.h"
- 
- /* Max # of disk per a controller */
-@@ -137,7 +138,8 @@ static unsigned int xgene_ahci_qc_issue(struct ata_queued_cmd *qc)
- 	struct xgene_ahci_context *ctx = hpriv->plat_data;
- 	int rc = 0;
- 
--	if (unlikely(ctx->last_cmd[ap->port_no] == ATA_CMD_ID_ATA))
-+	if (unlikely(ctx->last_cmd[ap->port_no] == ATA_CMD_ID_ATA ||
-+		     ctx->last_cmd[ap->port_no] == ATA_CMD_SMART))
- 		xgene_ahci_restart_engine(ap);
- 
- 	rc = ahci_qc_issue(qc);
-@@ -148,14 +150,6 @@ static unsigned int xgene_ahci_qc_issue(struct ata_queued_cmd *qc)
- 	return rc;
- }
- 
--static bool xgene_ahci_is_memram_inited(struct xgene_ahci_context *ctx)
--{
--	void __iomem *diagcsr = ctx->csr_diag;
--
--	return (readl(diagcsr + CFG_MEM_RAM_SHUTDOWN) == 0 &&
--	        readl(diagcsr + BLOCK_MEM_RDY) == 0xFFFFFFFF);
--}
--
- /**
-  * xgene_ahci_read_id - Read ID data from the specified device
-  * @dev: device
-@@ -501,11 +495,6 @@ static int xgene_ahci_probe(struct platform_device *pdev)
- 		return -ENODEV;
- 	}
- 
--	if (xgene_ahci_is_memram_inited(ctx)) {
--		dev_info(dev, "skip clock and PHY initialization\n");
--		goto skip_clk_phy;
--	}
--
- 	/* Due to errata, HW requires full toggle transition */
- 	rc = ahci_platform_enable_clks(hpriv);
- 	if (rc)
-@@ -518,7 +507,7 @@ static int xgene_ahci_probe(struct platform_device *pdev)
- 
- 	/* Configure the host controller */
- 	xgene_ahci_hw_init(hpriv);
--skip_clk_phy:
-+
- 	hpriv->flags = AHCI_HFLAG_NO_PMP | AHCI_HFLAG_NO_NCQ;
- 
- 	rc = ahci_platform_init_host(pdev, hpriv, &xgene_ahci_port_info);
-@@ -533,6 +522,16 @@ disable_resources:
- 	return rc;
- }
- 
-+#ifdef CONFIG_ACPI
-+static const struct acpi_device_id xgene_ahci_acpi_match[] = {
-+	{ "APMC0D00", },
-+	{ "APMC0D0D", },
-+	{ "APMC0D09", },
-+	{ }
-+};
-+MODULE_DEVICE_TABLE(acpi, xgene_ahci_acpi_match);
-+#endif
-+
- static const struct of_device_id xgene_ahci_of_match[] = {
- 	{.compatible = "apm,xgene-ahci"},
- 	{},
-@@ -546,6 +545,7 @@ static struct platform_driver xgene_ahci_driver = {
- 		.name = "xgene-ahci",
- 		.owner = THIS_MODULE,
- 		.of_match_table = xgene_ahci_of_match,
-+		.acpi_match_table = ACPI_PTR(xgene_ahci_acpi_match),
- 	},
- };
- 
-diff --git a/drivers/base/Makefile b/drivers/base/Makefile
-index 6922cd6..53c3fe1 100644
---- a/drivers/base/Makefile
-+++ b/drivers/base/Makefile
-@@ -4,7 +4,7 @@ obj-y			:= component.o core.o bus.o dd.o syscore.o \
- 			   driver.o class.o platform.o \
- 			   cpu.o firmware.o init.o map.o devres.o \
- 			   attribute_container.o transport_class.o \
--			   topology.o container.o
-+			   topology.o container.o property.o
- obj-$(CONFIG_DEVTMPFS)	+= devtmpfs.o
- obj-$(CONFIG_DMA_CMA) += dma-contiguous.o
- obj-y			+= power/
-diff --git a/drivers/base/property.c b/drivers/base/property.c
-new file mode 100644
-index 0000000..c458458
---- /dev/null
-+++ b/drivers/base/property.c
-@@ -0,0 +1,431 @@
-+/*
-+ * property.c - Unified device property interface.
-+ *
-+ * Copyright (C) 2014, Intel Corporation
-+ * Authors: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
-+ *          Mika Westerberg <mika.westerberg at linux.intel.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ */
-+
-+#include <linux/property.h>
-+#include <linux/export.h>
-+#include <linux/acpi.h>
-+#include <linux/of.h>
-+
-+/**
-+ * device_property_present - check if a property of a device is present
-+ * @dev: Device whose property is being checked
-+ * @propname: Name of the property
-+ *
-+ * Check if property @propname is present in the device firmware description.
-+ */
-+bool device_property_present(struct device *dev, const char *propname)
-+{
-+	if (IS_ENABLED(CONFIG_OF) && dev->of_node)
-+		return of_property_read_bool(dev->of_node, propname);
-+
-+	return !acpi_dev_prop_get(ACPI_COMPANION(dev), propname, NULL);
-+}
-+EXPORT_SYMBOL_GPL(device_property_present);
-+
-+/**
-+ * fwnode_property_present - check if a property of a firmware node is present
-+ * @fwnode: Firmware node whose property to check
-+ * @propname: Name of the property
-+ */
-+bool fwnode_property_present(struct fwnode_handle *fwnode, const char *propname)
-+{
-+	if (is_of_node(fwnode))
-+		return of_property_read_bool(of_node(fwnode), propname);
-+	else if (is_acpi_node(fwnode))
-+		return !acpi_dev_prop_get(acpi_node(fwnode), propname, NULL);
-+
-+	return false;
-+}
-+EXPORT_SYMBOL_GPL(fwnode_property_present);
-+
-+#define OF_DEV_PROP_READ_ARRAY(node, propname, type, val, nval) \
-+	(val) ? of_property_read_##type##_array((node), (propname), (val), (nval)) \
-+	      : of_property_count_elems_of_size((node), (propname), sizeof(type))
-+
-+#define DEV_PROP_READ_ARRAY(_dev_, _propname_, _type_, _proptype_, _val_, _nval_) \
-+	IS_ENABLED(CONFIG_OF) && _dev_->of_node ? \
-+		(OF_DEV_PROP_READ_ARRAY(_dev_->of_node, _propname_, _type_, \
-+					_val_, _nval_)) : \
-+		acpi_dev_prop_read(ACPI_COMPANION(_dev_), _propname_, \
-+				   _proptype_, _val_, _nval_)
-+
-+/**
-+ * device_property_read_u8_array - return a u8 array property of a device
-+ * @dev: Device to get the property of
-+ * @propname: Name of the property
-+ * @val: The values are stored here
-+ * @nval: Size of the @val array
-+ *
-+ * Function reads an array of u8 properties with @propname from the device
-+ * firmware description and stores them to @val if found.
-+ *
-+ * Return: %0 if the property was found (success),
-+ *	   %-EINVAL if given arguments are not valid,
-+ *	   %-ENODATA if the property does not have a value,
-+ *	   %-EPROTO if the property is not an array of numbers,
-+ *	   %-EOVERFLOW if the size of the property is not as expected.
-+ */
-+int device_property_read_u8_array(struct device *dev, const char *propname,
-+				  u8 *val, size_t nval)
-+{
-+	return DEV_PROP_READ_ARRAY(dev, propname, u8, DEV_PROP_U8, val, nval);
-+}
-+EXPORT_SYMBOL_GPL(device_property_read_u8_array);
-+
-+/**
-+ * device_property_read_u16_array - return a u16 array property of a device
-+ * @dev: Device to get the property of
-+ * @propname: Name of the property
-+ * @val: The values are stored here
-+ * @nval: Size of the @val array
-+ *
-+ * Function reads an array of u16 properties with @propname from the device
-+ * firmware description and stores them to @val if found.
-+ *
-+ * Return: %0 if the property was found (success),
-+ *	   %-EINVAL if given arguments are not valid,
-+ *	   %-ENODATA if the property does not have a value,
-+ *	   %-EPROTO if the property is not an array of numbers,
-+ *	   %-EOVERFLOW if the size of the property is not as expected.
-+ */
-+int device_property_read_u16_array(struct device *dev, const char *propname,
-+				   u16 *val, size_t nval)
-+{
-+	return DEV_PROP_READ_ARRAY(dev, propname, u16, DEV_PROP_U16, val, nval);
-+}
-+EXPORT_SYMBOL_GPL(device_property_read_u16_array);
-+
-+/**
-+ * device_property_read_u32_array - return a u32 array property of a device
-+ * @dev: Device to get the property of
-+ * @propname: Name of the property
-+ * @val: The values are stored here
-+ * @nval: Size of the @val array
-+ *
-+ * Function reads an array of u32 properties with @propname from the device
-+ * firmware description and stores them to @val if found.
-+ *
-+ * Return: %0 if the property was found (success),
-+ *	   %-EINVAL if given arguments are not valid,
-+ *	   %-ENODATA if the property does not have a value,
-+ *	   %-EPROTO if the property is not an array of numbers,
-+ *	   %-EOVERFLOW if the size of the property is not as expected.
-+ */
-+int device_property_read_u32_array(struct device *dev, const char *propname,
-+				   u32 *val, size_t nval)
-+{
-+	return DEV_PROP_READ_ARRAY(dev, propname, u32, DEV_PROP_U32, val, nval);
-+}
-+EXPORT_SYMBOL_GPL(device_property_read_u32_array);
-+
-+/**
-+ * device_property_read_u64_array - return a u64 array property of a device
-+ * @dev: Device to get the property of
-+ * @propname: Name of the property
-+ * @val: The values are stored here
-+ * @nval: Size of the @val array
-+ *
-+ * Function reads an array of u64 properties with @propname from the device
-+ * firmware description and stores them to @val if found.
-+ *
-+ * Return: %0 if the property was found (success),
-+ *	   %-EINVAL if given arguments are not valid,
-+ *	   %-ENODATA if the property does not have a value,
-+ *	   %-EPROTO if the property is not an array of numbers,
-+ *	   %-EOVERFLOW if the size of the property is not as expected.
-+ */
-+int device_property_read_u64_array(struct device *dev, const char *propname,
-+				   u64 *val, size_t nval)
-+{
-+	return DEV_PROP_READ_ARRAY(dev, propname, u64, DEV_PROP_U64, val, nval);
-+}
-+EXPORT_SYMBOL_GPL(device_property_read_u64_array);
-+
-+/**
-+ * device_property_read_string_array - return a string array property of device
-+ * @dev: Device to get the property of
-+ * @propname: Name of the property
-+ * @val: The values are stored here
-+ * @nval: Size of the @val array
-+ *
-+ * Function reads an array of string properties with @propname from the device
-+ * firmware description and stores them to @val if found.
-+ *
-+ * Return: %0 if the property was found (success),
-+ *	   %-EINVAL if given arguments are not valid,
-+ *	   %-ENODATA if the property does not have a value,
-+ *	   %-EPROTO or %-EILSEQ if the property is not an array of strings,
-+ *	   %-EOVERFLOW if the size of the property is not as expected.
-+ */
-+int device_property_read_string_array(struct device *dev, const char *propname,
-+				      const char **val, size_t nval)
-+{
-+	return IS_ENABLED(CONFIG_OF) && dev->of_node ?
-+		of_property_read_string_array(dev->of_node, propname, val, nval) :
-+		acpi_dev_prop_read(ACPI_COMPANION(dev), propname,
-+				   DEV_PROP_STRING, val, nval);
-+}
-+EXPORT_SYMBOL_GPL(device_property_read_string_array);
-+
-+/**
-+ * device_property_read_string - return a string property of a device
-+ * @dev: Device to get the property of
-+ * @propname: Name of the property
-+ * @val: The value is stored here
-+ *
-+ * Function reads property @propname from the device firmware description and
-+ * stores the value into @val if found. The value is checked to be a string.
-+ *
-+ * Return: %0 if the property was found (success),
-+ *	   %-EINVAL if given arguments are not valid,
-+ *	   %-ENODATA if the property does not have a value,
-+ *	   %-EPROTO or %-EILSEQ if the property type is not a string.
-+ */
-+int device_property_read_string(struct device *dev, const char *propname,
-+				const char **val)
-+{
-+	return IS_ENABLED(CONFIG_OF) && dev->of_node ?
-+		of_property_read_string(dev->of_node, propname, val) :
-+		acpi_dev_prop_read(ACPI_COMPANION(dev), propname,
-+				   DEV_PROP_STRING, val, 1);
-+}
-+EXPORT_SYMBOL_GPL(device_property_read_string);
-+
-+#define FWNODE_PROP_READ_ARRAY(_fwnode_, _propname_, _type_, _proptype_, _val_, _nval_) \
-+({ \
-+	int _ret_; \
-+	if (is_of_node(_fwnode_)) \
-+		_ret_ = OF_DEV_PROP_READ_ARRAY(of_node(_fwnode_), _propname_, \
-+					       _type_, _val_, _nval_); \
-+	else if (is_acpi_node(_fwnode_)) \
-+		_ret_ = acpi_dev_prop_read(acpi_node(_fwnode_), _propname_, \
-+					   _proptype_, _val_, _nval_); \
-+	else \
-+		_ret_ = -ENXIO; \
-+	_ret_; \
-+})
-+
-+/**
-+ * fwnode_property_read_u8_array - return a u8 array property of firmware node
-+ * @fwnode: Firmware node to get the property of
-+ * @propname: Name of the property
-+ * @val: The values are stored here
-+ * @nval: Size of the @val array
-+ *
-+ * Read an array of u8 properties with @propname from @fwnode and stores them to
-+ * @val if found.
-+ *
-+ * Return: %0 if the property was found (success),
-+ *	   %-EINVAL if given arguments are not valid,
-+ *	   %-ENODATA if the property does not have a value,
-+ *	   %-EPROTO if the property is not an array of numbers,
-+ *	   %-EOVERFLOW if the size of the property is not as expected,
-+ *	   %-ENXIO if no suitable firmware interface is present.
-+ */
-+int fwnode_property_read_u8_array(struct fwnode_handle *fwnode,
-+				  const char *propname, u8 *val, size_t nval)
-+{
-+	return FWNODE_PROP_READ_ARRAY(fwnode, propname, u8, DEV_PROP_U8,
-+				      val, nval);
-+}
-+EXPORT_SYMBOL_GPL(fwnode_property_read_u8_array);
-+
-+/**
-+ * fwnode_property_read_u16_array - return a u16 array property of firmware node
-+ * @fwnode: Firmware node to get the property of
-+ * @propname: Name of the property
-+ * @val: The values are stored here
-+ * @nval: Size of the @val array
-+ *
-+ * Read an array of u16 properties with @propname from @fwnode and store them to
-+ * @val if found.
-+ *
-+ * Return: %0 if the property was found (success),
-+ *	   %-EINVAL if given arguments are not valid,
-+ *	   %-ENODATA if the property does not have a value,
-+ *	   %-EPROTO if the property is not an array of numbers,
-+ *	   %-EOVERFLOW if the size of the property is not as expected,
-+ *	   %-ENXIO if no suitable firmware interface is present.
-+ */
-+int fwnode_property_read_u16_array(struct fwnode_handle *fwnode,
-+				   const char *propname, u16 *val, size_t nval)
-+{
-+	return FWNODE_PROP_READ_ARRAY(fwnode, propname, u16, DEV_PROP_U16,
-+				      val, nval);
-+}
-+EXPORT_SYMBOL_GPL(fwnode_property_read_u16_array);
-+
-+/**
-+ * fwnode_property_read_u32_array - return a u32 array property of firmware node
-+ * @fwnode: Firmware node to get the property of
-+ * @propname: Name of the property
-+ * @val: The values are stored here
-+ * @nval: Size of the @val array
-+ *
-+ * Read an array of u32 properties with @propname from @fwnode store them to
-+ * @val if found.
-+ *
-+ * Return: %0 if the property was found (success),
-+ *	   %-EINVAL if given arguments are not valid,
-+ *	   %-ENODATA if the property does not have a value,
-+ *	   %-EPROTO if the property is not an array of numbers,
-+ *	   %-EOVERFLOW if the size of the property is not as expected,
-+ *	   %-ENXIO if no suitable firmware interface is present.
-+ */
-+int fwnode_property_read_u32_array(struct fwnode_handle *fwnode,
-+				   const char *propname, u32 *val, size_t nval)
-+{
-+	return FWNODE_PROP_READ_ARRAY(fwnode, propname, u32, DEV_PROP_U32,
-+				      val, nval);
-+}
-+EXPORT_SYMBOL_GPL(fwnode_property_read_u32_array);
-+
-+/**
-+ * fwnode_property_read_u64_array - return a u64 array property firmware node
-+ * @fwnode: Firmware node to get the property of
-+ * @propname: Name of the property
-+ * @val: The values are stored here
-+ * @nval: Size of the @val array
-+ *
-+ * Read an array of u64 properties with @propname from @fwnode and store them to
-+ * @val if found.
-+ *
-+ * Return: %0 if the property was found (success),
-+ *	   %-EINVAL if given arguments are not valid,
-+ *	   %-ENODATA if the property does not have a value,
-+ *	   %-EPROTO if the property is not an array of numbers,
-+ *	   %-EOVERFLOW if the size of the property is not as expected,
-+ *	   %-ENXIO if no suitable firmware interface is present.
-+ */
-+int fwnode_property_read_u64_array(struct fwnode_handle *fwnode,
-+				   const char *propname, u64 *val, size_t nval)
-+{
-+	return FWNODE_PROP_READ_ARRAY(fwnode, propname, u64, DEV_PROP_U64,
-+				      val, nval);
-+}
-+EXPORT_SYMBOL_GPL(fwnode_property_read_u64_array);
-+
-+/**
-+ * fwnode_property_read_string_array - return string array property of a node
-+ * @fwnode: Firmware node to get the property of
-+ * @propname: Name of the property
-+ * @val: The values are stored here
-+ * @nval: Size of the @val array
-+ *
-+ * Read an string list property @propname from the given firmware node and store
-+ * them to @val if found.
-+ *
-+ * Return: %0 if the property was found (success),
-+ *	   %-EINVAL if given arguments are not valid,
-+ *	   %-ENODATA if the property does not have a value,
-+ *	   %-EPROTO if the property is not an array of strings,
-+ *	   %-EOVERFLOW if the size of the property is not as expected,
-+ *	   %-ENXIO if no suitable firmware interface is present.
-+ */
-+int fwnode_property_read_string_array(struct fwnode_handle *fwnode,
-+				      const char *propname, const char **val,
-+				      size_t nval)
-+{
-+	if (is_of_node(fwnode))
-+		return of_property_read_string_array(of_node(fwnode), propname,
-+						     val, nval);
-+	else if (is_acpi_node(fwnode))
-+		return acpi_dev_prop_read(acpi_node(fwnode), propname,
-+					  DEV_PROP_STRING, val, nval);
-+
-+	return -ENXIO;
-+}
-+EXPORT_SYMBOL_GPL(fwnode_property_read_string_array);
-+
-+/**
-+ * fwnode_property_read_string - return a string property of a firmware node
-+ * @fwnode: Firmware node to get the property of
-+ * @propname: Name of the property
-+ * @val: The value is stored here
-+ *
-+ * Read property @propname from the given firmware node and store the value into
-+ * @val if found.  The value is checked to be a string.
-+ *
-+ * Return: %0 if the property was found (success),
-+ *	   %-EINVAL if given arguments are not valid,
-+ *	   %-ENODATA if the property does not have a value,
-+ *	   %-EPROTO or %-EILSEQ if the property is not a string,
-+ *	   %-ENXIO if no suitable firmware interface is present.
-+ */
-+int fwnode_property_read_string(struct fwnode_handle *fwnode,
-+				const char *propname, const char **val)
-+{
-+	if (is_of_node(fwnode))
-+		return of_property_read_string(of_node(fwnode),propname, val);
-+	else if (is_acpi_node(fwnode))
-+		return acpi_dev_prop_read(acpi_node(fwnode), propname,
-+					  DEV_PROP_STRING, val, 1);
-+
-+	return -ENXIO;
-+}
-+EXPORT_SYMBOL_GPL(fwnode_property_read_string);
-+
-+/**
-+ * device_get_next_child_node - Return the next child node handle for a device
-+ * @dev: Device to find the next child node for.
-+ * @child: Handle to one of the device's child nodes or a null handle.
-+ */
-+struct fwnode_handle *device_get_next_child_node(struct device *dev,
-+						 struct fwnode_handle *child)
-+{
-+	if (IS_ENABLED(CONFIG_OF) && dev->of_node) {
-+		struct device_node *node;
-+
-+		node = of_get_next_available_child(dev->of_node, of_node(child));
-+		if (node)
-+			return &node->fwnode;
-+	} else if (IS_ENABLED(CONFIG_ACPI)) {
-+		struct acpi_device *node;
-+
-+		node = acpi_get_next_child(dev, acpi_node(child));
-+		if (node)
-+			return acpi_fwnode_handle(node);
-+	}
-+	return NULL;
-+}
-+EXPORT_SYMBOL_GPL(device_get_next_child_node);
-+
-+/**
-+ * fwnode_handle_put - Drop reference to a device node
-+ * @fwnode: Pointer to the device node to drop the reference to.
-+ *
-+ * This has to be used when terminating device_for_each_child_node() iteration
-+ * with break or return to prevent stale device node references from being left
-+ * behind.
-+ */
-+void fwnode_handle_put(struct fwnode_handle *fwnode)
-+{
-+	if (is_of_node(fwnode))
-+		of_node_put(of_node(fwnode));
-+}
-+EXPORT_SYMBOL_GPL(fwnode_handle_put);
-+
-+/**
-+ * device_get_child_node_count - return the number of child nodes for device
-+ * @dev: Device to cound the child nodes for
-+ */
-+unsigned int device_get_child_node_count(struct device *dev)
-+{
-+	struct fwnode_handle *child;
-+	unsigned int count = 0;
-+
-+	device_for_each_child_node(dev, child)
-+		count++;
-+
-+	return count;
-+}
-+EXPORT_SYMBOL_GPL(device_get_child_node_count);
-diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c
-index 43005d4..c9411e6 100644
---- a/drivers/clocksource/arm_arch_timer.c
-+++ b/drivers/clocksource/arm_arch_timer.c
-@@ -21,6 +21,7 @@
- #include <linux/io.h>
- #include <linux/slab.h>
- #include <linux/sched_clock.h>
-+#include <linux/acpi.h>
- 
- #include <asm/arch_timer.h>
- #include <asm/virt.h>
-@@ -61,7 +62,8 @@ enum ppi_nr {
- 	MAX_TIMER_PPI
- };
- 
--static int arch_timer_ppi[MAX_TIMER_PPI];
-+int arch_timer_ppi[MAX_TIMER_PPI];
-+EXPORT_SYMBOL(arch_timer_ppi);
- 
- static struct clock_event_device __percpu *arch_timer_evt;
- 
-@@ -370,8 +372,12 @@ arch_timer_detect_rate(void __iomem *cntbase, struct device_node *np)
- 	if (arch_timer_rate)
- 		return;
- 
--	/* Try to determine the frequency from the device tree or CNTFRQ */
--	if (of_property_read_u32(np, "clock-frequency", &arch_timer_rate)) {
-+	/*
-+	 * Try to determine the frequency from the device tree or CNTFRQ,
-+	 * if ACPI is enabled, get the frequency from CNTFRQ ONLY.
-+	 */
-+	if (!acpi_disabled ||
-+	    of_property_read_u32(np, "clock-frequency", &arch_timer_rate)) {
- 		if (cntbase)
- 			arch_timer_rate = readl_relaxed(cntbase + CNTFRQ);
- 		else
-@@ -687,20 +693,8 @@ static void __init arch_timer_common_init(void)
- 	arch_timer_arch_init();
- }
- 
--static void __init arch_timer_init(struct device_node *np)
-+static void __init arch_timer_init(void)
- {
--	int i;
--
--	if (arch_timers_present & ARCH_CP15_TIMER) {
--		pr_warn("arch_timer: multiple nodes in dt, skipping\n");
--		return;
--	}
--
--	arch_timers_present |= ARCH_CP15_TIMER;
--	for (i = PHYS_SECURE_PPI; i < MAX_TIMER_PPI; i++)
--		arch_timer_ppi[i] = irq_of_parse_and_map(np, i);
--	arch_timer_detect_rate(NULL, np);
--
- 	/*
- 	 * If HYP mode is available, we know that the physical timer
- 	 * has been configured to be accessible from PL1. Use it, so
-@@ -719,13 +713,31 @@ static void __init arch_timer_init(struct device_node *np)
- 		}
- 	}
- 
--	arch_timer_c3stop = !of_property_read_bool(np, "always-on");
--
- 	arch_timer_register();
- 	arch_timer_common_init();
- }
--CLOCKSOURCE_OF_DECLARE(armv7_arch_timer, "arm,armv7-timer", arch_timer_init);
--CLOCKSOURCE_OF_DECLARE(armv8_arch_timer, "arm,armv8-timer", arch_timer_init);
-+
-+static void __init arch_timer_of_init(struct device_node *np)
-+{
-+	int i;
-+
-+	if (arch_timers_present & ARCH_CP15_TIMER) {
-+		pr_warn("arch_timer: multiple nodes in dt, skipping\n");
-+		return;
-+	}
-+
-+	arch_timers_present |= ARCH_CP15_TIMER;
-+	for (i = PHYS_SECURE_PPI; i < MAX_TIMER_PPI; i++)
-+		arch_timer_ppi[i] = irq_of_parse_and_map(np, i);
-+
-+	arch_timer_detect_rate(NULL, np);
-+
-+	arch_timer_c3stop = !of_property_read_bool(np, "always-on");
-+
-+	arch_timer_init();
-+}
-+CLOCKSOURCE_OF_DECLARE(armv7_arch_timer, "arm,armv7-timer", arch_timer_of_init);
-+CLOCKSOURCE_OF_DECLARE(armv8_arch_timer, "arm,armv8-timer", arch_timer_of_init);
- 
- static void __init arch_timer_mem_init(struct device_node *np)
- {
-@@ -792,3 +804,71 @@ static void __init arch_timer_mem_init(struct device_node *np)
- }
- CLOCKSOURCE_OF_DECLARE(armv7_arch_timer_mem, "arm,armv7-timer-mem",
- 		       arch_timer_mem_init);
-+
-+#ifdef CONFIG_ACPI
-+static int __init
-+map_generic_timer_interrupt(u32 interrupt, u32 flags)
-+{
-+	int trigger, polarity;
-+
-+	if (!interrupt)
-+		return 0;
-+
-+	trigger = (flags & ACPI_GTDT_INTERRUPT_MODE) ? ACPI_EDGE_SENSITIVE
-+			: ACPI_LEVEL_SENSITIVE;
-+
-+	polarity = (flags & ACPI_GTDT_INTERRUPT_POLARITY) ? ACPI_ACTIVE_LOW
-+			: ACPI_ACTIVE_HIGH;
-+
-+	return acpi_register_gsi(NULL, interrupt, trigger, polarity);
-+}
-+
-+/* Initialize per-processor generic timer */
-+static int __init arch_timer_acpi_init(struct acpi_table_header *table)
-+{
-+	struct acpi_table_gtdt *gtdt;
-+
-+	if (arch_timers_present & ARCH_CP15_TIMER) {
-+		pr_warn("arch_timer: already initialized, skipping\n");
-+		return -EINVAL;
-+	}
-+
-+	gtdt = container_of(table, struct acpi_table_gtdt, header);
-+
-+	arch_timers_present |= ARCH_CP15_TIMER;
-+
-+	arch_timer_ppi[PHYS_SECURE_PPI] =
-+		map_generic_timer_interrupt(gtdt->secure_el1_interrupt,
-+		gtdt->secure_el1_flags);
-+
-+	arch_timer_ppi[PHYS_NONSECURE_PPI] =
-+		map_generic_timer_interrupt(gtdt->non_secure_el1_interrupt,
-+		gtdt->non_secure_el1_flags);
-+
-+	arch_timer_ppi[VIRT_PPI] =
-+		map_generic_timer_interrupt(gtdt->virtual_timer_interrupt,
-+		gtdt->virtual_timer_flags);
-+
-+	arch_timer_ppi[HYP_PPI] =
-+		map_generic_timer_interrupt(gtdt->non_secure_el2_interrupt,
-+		gtdt->non_secure_el2_flags);
-+
-+	/* Get the frequency from CNTFRQ */
-+	arch_timer_detect_rate(NULL, NULL);
-+
-+	/* Always-on capability */
-+	arch_timer_c3stop = !(gtdt->non_secure_el1_flags & ACPI_GTDT_ALWAYS_ON);
-+
-+	arch_timer_init();
-+	return 0;
-+}
-+
-+/* Initialize all the generic timers presented in GTDT */
-+void __init acpi_generic_timer_init(void)
-+{
-+	if (acpi_disabled)
-+		return;
-+
-+	acpi_table_parse(ACPI_SIG_GTDT, arch_timer_acpi_init);
-+}
-+#endif
-diff --git a/drivers/firmware/dmi_scan.c b/drivers/firmware/dmi_scan.c
-index 17afc51..c5f7b4e 100644
---- a/drivers/firmware/dmi_scan.c
-+++ b/drivers/firmware/dmi_scan.c
-@@ -93,6 +93,12 @@ static void dmi_table(u8 *buf, int len, int num,
- 		const struct dmi_header *dm = (const struct dmi_header *)data;
- 
- 		/*
-+		 * 7.45 End-of-Table (Type 127) [SMBIOS reference spec v3.0.0]
-+		 */
-+		if (dm->type == DMI_ENTRY_END_OF_TABLE)
-+			break;
-+
-+		/*
- 		 *  We want to know the total length (formatted area and
- 		 *  strings) before decoding to make sure we won't run off the
- 		 *  table in dmi_decode or dmi_string
-@@ -107,7 +113,7 @@ static void dmi_table(u8 *buf, int len, int num,
- 	}
- }
- 
--static u32 dmi_base;
-+static phys_addr_t dmi_base;
- static u16 dmi_len;
- static u16 dmi_num;
- 
-@@ -467,7 +473,7 @@ static int __init dmi_present(const u8 *buf)
- 
- 	if (memcmp(buf, "_SM_", 4) == 0 &&
- 	    buf[5] < 32 && dmi_checksum(buf, buf[5])) {
--		smbios_ver = (buf[6] << 8) + buf[7];
-+		smbios_ver = get_unaligned_be16(buf + 6);
- 
- 		/* Some BIOS report weird SMBIOS version, fix that up */
- 		switch (smbios_ver) {
-@@ -489,10 +495,9 @@ static int __init dmi_present(const u8 *buf)
- 	buf += 16;
- 
- 	if (memcmp(buf, "_DMI_", 5) == 0 && dmi_checksum(buf, 15)) {
--		dmi_num = (buf[13] << 8) | buf[12];
--		dmi_len = (buf[7] << 8) | buf[6];
--		dmi_base = (buf[11] << 24) | (buf[10] << 16) |
--			(buf[9] << 8) | buf[8];
-+		dmi_num = get_unaligned_le16(buf + 12);
-+		dmi_len = get_unaligned_le16(buf + 6);
-+		dmi_base = get_unaligned_le32(buf + 8);
- 
- 		if (dmi_walk_early(dmi_decode) == 0) {
- 			if (smbios_ver) {
-@@ -514,12 +519,72 @@ static int __init dmi_present(const u8 *buf)
- 	return 1;
- }
- 
-+/*
-+ * Check for the SMBIOS 3.0 64-bit entry point signature. Unlike the legacy
-+ * 32-bit entry point, there is no embedded DMI header (_DMI_) in here.
-+ */
-+static int __init dmi_smbios3_present(const u8 *buf)
-+{
-+	if (memcmp(buf, "_SM3_", 5) == 0 &&
-+	    buf[6] < 32 && dmi_checksum(buf, buf[6])) {
-+		dmi_ver = get_unaligned_be16(buf + 7);
-+		dmi_len = get_unaligned_le32(buf + 12);
-+		dmi_base = get_unaligned_le64(buf + 16);
-+
-+		/*
-+		 * The 64-bit SMBIOS 3.0 entry point no longer has a field
-+		 * containing the number of structures present in the table.
-+		 * Instead, it defines the table size as a maximum size, and
-+		 * relies on the end-of-table structure type (#127) to be used
-+		 * to signal the end of the table.
-+		 * So let's define dmi_num as an upper bound as well: each
-+		 * structure has a 4 byte header, so dmi_len / 4 is an upper
-+		 * bound for the number of structures in the table.
-+		 */
-+		dmi_num = dmi_len / 4;
-+
-+		if (dmi_walk_early(dmi_decode) == 0) {
-+			pr_info("SMBIOS %d.%d present.\n",
-+				dmi_ver >> 8, dmi_ver & 0xFF);
-+			dmi_format_ids(dmi_ids_string, sizeof(dmi_ids_string));
-+			pr_debug("DMI: %s\n", dmi_ids_string);
-+			return 0;
-+		}
-+	}
-+	return 1;
-+}
-+
- void __init dmi_scan_machine(void)
- {
- 	char __iomem *p, *q;
- 	char buf[32];
- 
- 	if (efi_enabled(EFI_CONFIG_TABLES)) {
-+		/*
-+		 * According to the DMTF SMBIOS reference spec v3.0.0, it is
-+		 * allowed to define both the 64-bit entry point (smbios3) and
-+		 * the 32-bit entry point (smbios), in which case they should
-+		 * either both point to the same SMBIOS structure table, or the
-+		 * table pointed to by the 64-bit entry point should contain a
-+		 * superset of the table contents pointed to by the 32-bit entry
-+		 * point (section 5.2)
-+		 * This implies that the 64-bit entry point should have
-+		 * precedence if it is defined and supported by the OS. If we
-+		 * have the 64-bit entry point, but fail to decode it, fall
-+		 * back to the legacy one (if available)
-+		 */
-+		if (efi.smbios3 != EFI_INVALID_TABLE_ADDR) {
-+			p = dmi_early_remap(efi.smbios3, 32);
-+			if (p == NULL)
-+				goto error;
-+			memcpy_fromio(buf, p, 32);
-+			dmi_early_unmap(p, 32);
-+
-+			if (!dmi_smbios3_present(buf)) {
-+				dmi_available = 1;
-+				goto out;
-+			}
-+		}
- 		if (efi.smbios == EFI_INVALID_TABLE_ADDR)
- 			goto error;
- 
-@@ -552,7 +617,7 @@ void __init dmi_scan_machine(void)
- 		memset(buf, 0, 16);
- 		for (q = p; q < p + 0x10000; q += 16) {
- 			memcpy_fromio(buf + 16, q, 16);
--			if (!dmi_present(buf)) {
-+			if (!dmi_smbios3_present(buf) || !dmi_present(buf)) {
- 				dmi_available = 1;
- 				dmi_early_unmap(p, 0x10000);
- 				goto out;
-diff --git a/drivers/firmware/efi/efi.c b/drivers/firmware/efi/efi.c
-index 8590099..9035c1b 100644
---- a/drivers/firmware/efi/efi.c
-+++ b/drivers/firmware/efi/efi.c
-@@ -30,6 +30,7 @@ struct efi __read_mostly efi = {
- 	.acpi       = EFI_INVALID_TABLE_ADDR,
- 	.acpi20     = EFI_INVALID_TABLE_ADDR,
- 	.smbios     = EFI_INVALID_TABLE_ADDR,
-+	.smbios3    = EFI_INVALID_TABLE_ADDR,
- 	.sal_systab = EFI_INVALID_TABLE_ADDR,
- 	.boot_info  = EFI_INVALID_TABLE_ADDR,
- 	.hcdp       = EFI_INVALID_TABLE_ADDR,
-@@ -86,6 +87,8 @@ static ssize_t systab_show(struct kobject *kobj,
- 		str += sprintf(str, "ACPI=0x%lx\n", efi.acpi);
- 	if (efi.smbios != EFI_INVALID_TABLE_ADDR)
- 		str += sprintf(str, "SMBIOS=0x%lx\n", efi.smbios);
-+	if (efi.smbios3 != EFI_INVALID_TABLE_ADDR)
-+		str += sprintf(str, "SMBIOS3=0x%lx\n", efi.smbios3);
- 	if (efi.hcdp != EFI_INVALID_TABLE_ADDR)
- 		str += sprintf(str, "HCDP=0x%lx\n", efi.hcdp);
- 	if (efi.boot_info != EFI_INVALID_TABLE_ADDR)
-@@ -260,6 +263,7 @@ static __initdata efi_config_table_type_t common_tables[] = {
- 	{MPS_TABLE_GUID, "MPS", &efi.mps},
- 	{SAL_SYSTEM_TABLE_GUID, "SALsystab", &efi.sal_systab},
- 	{SMBIOS_TABLE_GUID, "SMBIOS", &efi.smbios},
-+	{SMBIOS3_TABLE_GUID, "SMBIOS 3.0", &efi.smbios3},
- 	{UGA_IO_PROTOCOL_GUID, "UGA", &efi.uga},
- 	{NULL_GUID, NULL, NULL},
- };
-diff --git a/drivers/firmware/efi/libstub/arm-stub.c b/drivers/firmware/efi/libstub/arm-stub.c
-index 75ee059..eb48a1a 100644
---- a/drivers/firmware/efi/libstub/arm-stub.c
-+++ b/drivers/firmware/efi/libstub/arm-stub.c
-@@ -247,9 +247,18 @@ unsigned long __init efi_entry(void *handle, efi_system_table_t *sys_table,
- 			goto fail_free_cmdline;
- 		}
- 	}
--	if (!fdt_addr)
-+
-+	if (fdt_addr) {
-+		pr_efi(sys_table, "Using DTB from command line\n");
-+	} else {
- 		/* Look for a device tree configuration table entry. */
- 		fdt_addr = (uintptr_t)get_fdt(sys_table);
-+		if (fdt_addr)
-+			pr_efi(sys_table, "Using DTB from configuration table\n");
-+	}
-+
-+	if (!fdt_addr)
-+		pr_efi(sys_table, "Generating empty DTB\n");
- 
- 	status = handle_cmdline_files(sys_table, image, cmdline_ptr,
- 				      "initrd=", dram_base + SZ_512M,
-diff --git a/drivers/gpio/devres.c b/drivers/gpio/devres.c
-index 954b9f6..13dbd3d 100644
---- a/drivers/gpio/devres.c
-+++ b/drivers/gpio/devres.c
-@@ -109,6 +109,38 @@ struct gpio_desc *__must_check __devm_gpiod_get_index(struct device *dev,
- EXPORT_SYMBOL(__devm_gpiod_get_index);
+ 	}
  
- /**
-+ * devm_get_gpiod_from_child - get a GPIO descriptor from a device's child node
-+ * @dev:	GPIO consumer
-+ * @child:	firmware node (child of @dev)
+ 	return count;
+diff --git a/drivers/acpi/utils.c b/drivers/acpi/utils.c
+index cd49a39..7f68f96 100644
+--- a/drivers/acpi/utils.c
++++ b/drivers/acpi/utils.c
+@@ -712,3 +712,29 @@ bool acpi_check_dsm(acpi_handle handle, const u8 *uuid, int rev, u64 funcs)
+ 	return false;
+ }
+ EXPORT_SYMBOL(acpi_check_dsm);
++
++/**
++ * acpi_check_coherency - check for memory coherency of a device
++ * @handle: ACPI device handle
++ * @val:    Pointer to returned value
 + *
-+ * GPIO descriptors returned from this function are automatically disposed on
-+ * driver detach.
++ * Search a device and its parents for a _CCA method and return
++ * its value.
 + */
-+struct gpio_desc *devm_get_gpiod_from_child(struct device *dev,
-+					    struct fwnode_handle *child)
++acpi_status acpi_check_coherency(acpi_handle handle, int *val)
 +{
-+	struct gpio_desc **dr;
-+	struct gpio_desc *desc;
-+
-+	dr = devres_alloc(devm_gpiod_release, sizeof(struct gpio_desc *),
-+			  GFP_KERNEL);
-+	if (!dr)
-+		return ERR_PTR(-ENOMEM);
-+
-+	desc = fwnode_get_named_gpiod(child, "gpios");
-+	if (IS_ERR(desc)) {
-+		devres_free(dr);
-+		return desc;
-+	}
++	unsigned long long data;
++	acpi_status status;
 +
-+	*dr = desc;
-+	devres_add(dev, dr);
++	do {
++		status = acpi_evaluate_integer(handle, "_CCA", NULL, &data);
++		if (!ACPI_FAILURE(status)) {
++			*val = data;
++			break;
++		}
++		status = acpi_get_parent(handle, &handle);
++	} while (!ACPI_FAILURE(status));
 +
-+	return desc;
++	return status;
 +}
-+EXPORT_SYMBOL(devm_get_gpiod_from_child);
-+
-+/**
-  * devm_gpiod_get_index_optional - Resource-managed gpiod_get_index_optional()
-  * @dev: GPIO consumer
-  * @con_id: function within the GPIO consumer
-diff --git a/drivers/gpio/gpio-sch.c b/drivers/gpio/gpio-sch.c
-index 41e91d7..99720c8 100644
---- a/drivers/gpio/gpio-sch.c
-+++ b/drivers/gpio/gpio-sch.c
-@@ -29,290 +29,221 @@
- 
- #include <linux/gpio.h>
- 
--static DEFINE_SPINLOCK(gpio_lock);
--
--#define CGEN	(0x00)
--#define CGIO	(0x04)
--#define CGLV	(0x08)
--
--#define RGEN	(0x20)
--#define RGIO	(0x24)
--#define RGLV	(0x28)
--
--static unsigned short gpio_ba;
--
--static int sch_gpio_core_direction_in(struct gpio_chip *gc, unsigned  gpio_num)
--{
--	u8 curr_dirs;
--	unsigned short offset, bit;
--
--	spin_lock(&gpio_lock);
--
--	offset = CGIO + gpio_num / 8;
--	bit = gpio_num % 8;
--
--	curr_dirs = inb(gpio_ba + offset);
--
--	if (!(curr_dirs & (1 << bit)))
--		outb(curr_dirs | (1 << bit), gpio_ba + offset);
-+#define GEN	0x00
-+#define GIO	0x04
-+#define GLV	0x08
-+
-+struct sch_gpio {
-+	struct gpio_chip chip;
-+	spinlock_t lock;
-+	unsigned short iobase;
-+	unsigned short core_base;
-+	unsigned short resume_base;
-+};
++EXPORT_SYMBOL(acpi_check_coherency);
+diff --git a/drivers/ata/Kconfig b/drivers/ata/Kconfig
+index a3a1360..edca892 100644
+--- a/drivers/ata/Kconfig
++++ b/drivers/ata/Kconfig
+@@ -48,7 +48,7 @@ config ATA_VERBOSE_ERROR
  
--	spin_unlock(&gpio_lock);
--	return 0;
--}
-+#define to_sch_gpio(c)	container_of(c, struct sch_gpio, chip)
+ config ATA_ACPI
+ 	bool "ATA ACPI Support"
+-	depends on ACPI && PCI
++	depends on ACPI
+ 	default y
+ 	help
+ 	  This option adds support for ATA-related ACPI objects.
+diff --git a/drivers/ata/ahci_platform.c b/drivers/ata/ahci_platform.c
+index 18d5398..999e577 100644
+--- a/drivers/ata/ahci_platform.c
++++ b/drivers/ata/ahci_platform.c
+@@ -20,6 +20,9 @@
+ #include <linux/platform_device.h>
+ #include <linux/libata.h>
+ #include <linux/ahci_platform.h>
++#ifdef CONFIG_ATA_ACPI
++#include <linux/acpi.h>
++#endif
+ #include "ahci.h"
  
--static int sch_gpio_core_get(struct gpio_chip *gc, unsigned gpio_num)
-+static unsigned sch_gpio_offset(struct sch_gpio *sch, unsigned gpio,
-+				unsigned reg)
- {
--	int res;
--	unsigned short offset, bit;
-+	unsigned base = 0;
- 
--	offset = CGLV + gpio_num / 8;
--	bit = gpio_num % 8;
-+	if (gpio >= sch->resume_base) {
-+		gpio -= sch->resume_base;
-+		base += 0x20;
-+	}
+ static const struct ata_port_info ahci_port_info = {
+@@ -71,12 +74,22 @@ static const struct of_device_id ahci_of_match[] = {
+ };
+ MODULE_DEVICE_TABLE(of, ahci_of_match);
  
--	res = !!(inb(gpio_ba + offset) & (1 << bit));
--	return res;
-+	return base + reg + gpio / 8;
- }
++#ifdef CONFIG_ATA_ACPI
++static const struct acpi_device_id ahci_acpi_match[] = {
++	{ "AMDI0600", 0 }, /* AMD Seattle AHCI */
++	{ },
++};
++#endif
++
+ static struct platform_driver ahci_driver = {
+ 	.probe = ahci_probe,
+ 	.remove = ata_platform_remove_one,
+ 	.driver = {
+ 		.name = "ahci",
+ 		.of_match_table = ahci_of_match,
++#ifdef CONFIG_ATA_ACPI
++		.acpi_match_table = ACPI_PTR(ahci_acpi_match),
++#endif
+ 		.pm = &ahci_pm_ops,
+ 	},
+ };
+diff --git a/drivers/ata/ahci_xgene.c b/drivers/ata/ahci_xgene.c
+index feeb8f1..8f82267 100644
+--- a/drivers/ata/ahci_xgene.c
++++ b/drivers/ata/ahci_xgene.c
+@@ -28,6 +28,7 @@
+ #include <linux/of_address.h>
+ #include <linux/of_irq.h>
+ #include <linux/phy/phy.h>
++#include <linux/acpi.h>
+ #include "ahci.h"
  
--static void sch_gpio_core_set(struct gpio_chip *gc, unsigned gpio_num, int val)
-+static unsigned sch_gpio_bit(struct sch_gpio *sch, unsigned gpio)
- {
--	u8 curr_vals;
--	unsigned short offset, bit;
--
--	spin_lock(&gpio_lock);
--
--	offset = CGLV + gpio_num / 8;
--	bit = gpio_num % 8;
--
--	curr_vals = inb(gpio_ba + offset);
--
--	if (val)
--		outb(curr_vals | (1 << bit), gpio_ba + offset);
--	else
--		outb((curr_vals & ~(1 << bit)), gpio_ba + offset);
--	spin_unlock(&gpio_lock);
-+	if (gpio >= sch->resume_base)
-+		gpio -= sch->resume_base;
-+	return gpio % 8;
+ /* Max # of disk per a controller */
+@@ -148,14 +150,6 @@ static unsigned int xgene_ahci_qc_issue(struct ata_queued_cmd *qc)
+ 	return rc;
  }
  
--static int sch_gpio_core_direction_out(struct gpio_chip *gc,
--					unsigned gpio_num, int val)
-+static void sch_gpio_enable(struct sch_gpio *sch, unsigned gpio)
- {
--	u8 curr_dirs;
- 	unsigned short offset, bit;
-+	u8 enable;
- 
--	spin_lock(&gpio_lock);
-+	spin_lock(&sch->lock);
- 
--	offset = CGIO + gpio_num / 8;
--	bit = gpio_num % 8;
+-static bool xgene_ahci_is_memram_inited(struct xgene_ahci_context *ctx)
+-{
+-	void __iomem *diagcsr = ctx->csr_diag;
 -
--	curr_dirs = inb(gpio_ba + offset);
--	if (curr_dirs & (1 << bit))
--		outb(curr_dirs & ~(1 << bit), gpio_ba + offset);
-+	offset = sch_gpio_offset(sch, gpio, GEN);
-+	bit = sch_gpio_bit(sch, gpio);
- 
--	spin_unlock(&gpio_lock);
-+	enable = inb(sch->iobase + offset);
-+	if (!(enable & (1 << bit)))
-+		outb(enable | (1 << bit), sch->iobase + offset);
- 
--	/*
--	 * according to the datasheet, writing to the level register has no
--	 * effect when GPIO is programmed as input.
--	 * Actually the the level register is read-only when configured as input.
--	 * Thus presetting the output level before switching to output is _NOT_ possible.
--	 * Hence we set the level after configuring the GPIO as output.
--	 * But we cannot prevent a short low pulse if direction is set to high
--	 * and an external pull-up is connected.
--	 */
--	sch_gpio_core_set(gc, gpio_num, val);
--	return 0;
-+	spin_unlock(&sch->lock);
- }
- 
--static struct gpio_chip sch_gpio_core = {
--	.label			= "sch_gpio_core",
--	.owner			= THIS_MODULE,
--	.direction_input	= sch_gpio_core_direction_in,
--	.get			= sch_gpio_core_get,
--	.direction_output	= sch_gpio_core_direction_out,
--	.set			= sch_gpio_core_set,
--};
+-	return (readl(diagcsr + CFG_MEM_RAM_SHUTDOWN) == 0 &&
+-	        readl(diagcsr + BLOCK_MEM_RDY) == 0xFFFFFFFF);
+-}
 -
--static int sch_gpio_resume_direction_in(struct gpio_chip *gc,
--					unsigned gpio_num)
-+static int sch_gpio_direction_in(struct gpio_chip *gc, unsigned  gpio_num)
- {
-+	struct sch_gpio *sch = to_sch_gpio(gc);
- 	u8 curr_dirs;
- 	unsigned short offset, bit;
- 
--	spin_lock(&gpio_lock);
-+	spin_lock(&sch->lock);
- 
--	offset = RGIO + gpio_num / 8;
--	bit = gpio_num % 8;
-+	offset = sch_gpio_offset(sch, gpio_num, GIO);
-+	bit = sch_gpio_bit(sch, gpio_num);
- 
--	curr_dirs = inb(gpio_ba + offset);
-+	curr_dirs = inb(sch->iobase + offset);
- 
- 	if (!(curr_dirs & (1 << bit)))
--		outb(curr_dirs | (1 << bit), gpio_ba + offset);
-+		outb(curr_dirs | (1 << bit), sch->iobase + offset);
- 
--	spin_unlock(&gpio_lock);
-+	spin_unlock(&sch->lock);
- 	return 0;
- }
+ /**
+  * xgene_ahci_read_id - Read ID data from the specified device
+  * @dev: device
+@@ -501,11 +495,6 @@ static int xgene_ahci_probe(struct platform_device *pdev)
+ 		return -ENODEV;
+ 	}
  
--static int sch_gpio_resume_get(struct gpio_chip *gc, unsigned gpio_num)
-+static int sch_gpio_get(struct gpio_chip *gc, unsigned gpio_num)
- {
-+	struct sch_gpio *sch = to_sch_gpio(gc);
-+	int res;
- 	unsigned short offset, bit;
+-	if (xgene_ahci_is_memram_inited(ctx)) {
+-		dev_info(dev, "skip clock and PHY initialization\n");
+-		goto skip_clk_phy;
+-	}
+-
+ 	/* Due to errata, HW requires full toggle transition */
+ 	rc = ahci_platform_enable_clks(hpriv);
+ 	if (rc)
+@@ -518,7 +507,7 @@ static int xgene_ahci_probe(struct platform_device *pdev)
  
--	offset = RGLV + gpio_num / 8;
--	bit = gpio_num % 8;
-+	offset = sch_gpio_offset(sch, gpio_num, GLV);
-+	bit = sch_gpio_bit(sch, gpio_num);
+ 	/* Configure the host controller */
+ 	xgene_ahci_hw_init(hpriv);
+-skip_clk_phy:
 +
-+	res = !!(inb(sch->iobase + offset) & (1 << bit));
+ 	hpriv->flags = AHCI_HFLAG_NO_PMP | AHCI_HFLAG_NO_NCQ;
  
--	return !!(inb(gpio_ba + offset) & (1 << bit));
-+	return res;
+ 	rc = ahci_platform_init_host(pdev, hpriv, &xgene_ahci_port_info);
+@@ -533,6 +522,16 @@ disable_resources:
+ 	return rc;
  }
  
--static void sch_gpio_resume_set(struct gpio_chip *gc,
--				unsigned gpio_num, int val)
-+static void sch_gpio_set(struct gpio_chip *gc, unsigned gpio_num, int val)
- {
-+	struct sch_gpio *sch = to_sch_gpio(gc);
- 	u8 curr_vals;
- 	unsigned short offset, bit;
- 
--	spin_lock(&gpio_lock);
-+	spin_lock(&sch->lock);
- 
--	offset = RGLV + gpio_num / 8;
--	bit = gpio_num % 8;
-+	offset = sch_gpio_offset(sch, gpio_num, GLV);
-+	bit = sch_gpio_bit(sch, gpio_num);
- 
--	curr_vals = inb(gpio_ba + offset);
-+	curr_vals = inb(sch->iobase + offset);
- 
- 	if (val)
--		outb(curr_vals | (1 << bit), gpio_ba + offset);
-+		outb(curr_vals | (1 << bit), sch->iobase + offset);
- 	else
--		outb((curr_vals & ~(1 << bit)), gpio_ba + offset);
-+		outb((curr_vals & ~(1 << bit)), sch->iobase + offset);
- 
--	spin_unlock(&gpio_lock);
-+	spin_unlock(&sch->lock);
- }
++#ifdef CONFIG_ACPI
++static const struct acpi_device_id xgene_ahci_acpi_match[] = {
++	{ "APMC0D00", },
++	{ "APMC0D0D", },
++	{ "APMC0D09", },
++	{ }
++};
++MODULE_DEVICE_TABLE(acpi, xgene_ahci_acpi_match);
++#endif
++
+ static const struct of_device_id xgene_ahci_of_match[] = {
+ 	{.compatible = "apm,xgene-ahci"},
+ 	{},
+@@ -545,6 +544,7 @@ static struct platform_driver xgene_ahci_driver = {
+ 	.driver = {
+ 		.name = "xgene-ahci",
+ 		.of_match_table = xgene_ahci_of_match,
++		.acpi_match_table = ACPI_PTR(xgene_ahci_acpi_match),
+ 	},
+ };
  
--static int sch_gpio_resume_direction_out(struct gpio_chip *gc,
--					unsigned gpio_num, int val)
-+static int sch_gpio_direction_out(struct gpio_chip *gc, unsigned gpio_num,
-+				  int val)
- {
-+	struct sch_gpio *sch = to_sch_gpio(gc);
- 	u8 curr_dirs;
- 	unsigned short offset, bit;
+diff --git a/drivers/clocksource/arm_arch_timer.c b/drivers/clocksource/arm_arch_timer.c
+index 095c177..fd5ebbf 100644
+--- a/drivers/clocksource/arm_arch_timer.c
++++ b/drivers/clocksource/arm_arch_timer.c
+@@ -21,6 +21,7 @@
+ #include <linux/io.h>
+ #include <linux/slab.h>
+ #include <linux/sched_clock.h>
++#include <linux/acpi.h>
  
--	offset = RGIO + gpio_num / 8;
--	bit = gpio_num % 8;
-+	spin_lock(&sch->lock);
+ #include <asm/arch_timer.h>
+ #include <asm/virt.h>
+@@ -61,7 +62,8 @@ enum ppi_nr {
+ 	MAX_TIMER_PPI
+ };
  
--	spin_lock(&gpio_lock);
-+	offset = sch_gpio_offset(sch, gpio_num, GIO);
-+	bit = sch_gpio_bit(sch, gpio_num);
+-static int arch_timer_ppi[MAX_TIMER_PPI];
++int arch_timer_ppi[MAX_TIMER_PPI];
++EXPORT_SYMBOL(arch_timer_ppi);
  
--	curr_dirs = inb(gpio_ba + offset);
-+	curr_dirs = inb(sch->iobase + offset);
- 	if (curr_dirs & (1 << bit))
--		outb(curr_dirs & ~(1 << bit), gpio_ba + offset);
-+		outb(curr_dirs & ~(1 << bit), sch->iobase + offset);
+ static struct clock_event_device __percpu *arch_timer_evt;
  
--	spin_unlock(&gpio_lock);
-+	spin_unlock(&sch->lock);
+@@ -370,8 +372,12 @@ arch_timer_detect_rate(void __iomem *cntbase, struct device_node *np)
+ 	if (arch_timer_rate)
+ 		return;
  
- 	/*
--	* according to the datasheet, writing to the level register has no
--	* effect when GPIO is programmed as input.
--	* Actually the the level register is read-only when configured as input.
--	* Thus presetting the output level before switching to output is _NOT_ possible.
--	* Hence we set the level after configuring the GPIO as output.
--	* But we cannot prevent a short low pulse if direction is set to high
--	* and an external pull-up is connected.
--	*/
--	sch_gpio_resume_set(gc, gpio_num, val);
-+	 * according to the datasheet, writing to the level register has no
-+	 * effect when GPIO is programmed as input.
-+	 * Actually the the level register is read-only when configured as input.
-+	 * Thus presetting the output level before switching to output is _NOT_ possible.
-+	 * Hence we set the level after configuring the GPIO as output.
-+	 * But we cannot prevent a short low pulse if direction is set to high
-+	 * and an external pull-up is connected.
+-	/* Try to determine the frequency from the device tree or CNTFRQ */
+-	if (of_property_read_u32(np, "clock-frequency", &arch_timer_rate)) {
++	/*
++	 * Try to determine the frequency from the device tree or CNTFRQ,
++	 * if ACPI is enabled, get the frequency from CNTFRQ ONLY.
 +	 */
-+	sch_gpio_set(gc, gpio_num, val);
- 	return 0;
++	if (!acpi_disabled ||
++	    of_property_read_u32(np, "clock-frequency", &arch_timer_rate)) {
+ 		if (cntbase)
+ 			arch_timer_rate = readl_relaxed(cntbase + CNTFRQ);
+ 		else
+@@ -690,28 +696,8 @@ static void __init arch_timer_common_init(void)
+ 	arch_timer_arch_init();
  }
  
--static struct gpio_chip sch_gpio_resume = {
--	.label			= "sch_gpio_resume",
-+static struct gpio_chip sch_gpio_chip = {
-+	.label			= "sch_gpio",
- 	.owner			= THIS_MODULE,
--	.direction_input	= sch_gpio_resume_direction_in,
--	.get			= sch_gpio_resume_get,
--	.direction_output	= sch_gpio_resume_direction_out,
--	.set			= sch_gpio_resume_set,
-+	.direction_input	= sch_gpio_direction_in,
-+	.get			= sch_gpio_get,
-+	.direction_output	= sch_gpio_direction_out,
-+	.set			= sch_gpio_set,
- };
- 
- static int sch_gpio_probe(struct platform_device *pdev)
+-static void __init arch_timer_init(struct device_node *np)
++static void __init arch_timer_init(void)
  {
-+	struct sch_gpio *sch;
- 	struct resource *res;
--	int err, id;
- 
--	id = pdev->id;
--	if (!id)
--		return -ENODEV;
-+	sch = devm_kzalloc(&pdev->dev, sizeof(*sch), GFP_KERNEL);
-+	if (!sch)
-+		return -ENOMEM;
- 
- 	res = platform_get_resource(pdev, IORESOURCE_IO, 0);
- 	if (!res)
- 		return -EBUSY;
- 
--	if (!request_region(res->start, resource_size(res), pdev->name))
-+	if (!devm_request_region(&pdev->dev, res->start, resource_size(res),
-+				 pdev->name))
- 		return -EBUSY;
- 
--	gpio_ba = res->start;
-+	spin_lock_init(&sch->lock);
-+	sch->iobase = res->start;
-+	sch->chip = sch_gpio_chip;
-+	sch->chip.label = dev_name(&pdev->dev);
-+	sch->chip.dev = &pdev->dev;
- 
--	switch (id) {
-+	switch (pdev->id) {
- 	case PCI_DEVICE_ID_INTEL_SCH_LPC:
--		sch_gpio_core.base = 0;
--		sch_gpio_core.ngpio = 10;
--		sch_gpio_resume.base = 10;
--		sch_gpio_resume.ngpio = 4;
-+		sch->core_base = 0;
-+		sch->resume_base = 10;
-+		sch->chip.ngpio = 14;
-+
- 		/*
- 		 * GPIO[6:0] enabled by default
- 		 * GPIO7 is configured by the CMC as SLPIOVR
- 		 * Enable GPIO[9:8] core powered gpios explicitly
- 		 */
--		outb(0x3, gpio_ba + CGEN + 1);
-+		sch_gpio_enable(sch, 8);
-+		sch_gpio_enable(sch, 9);
- 		/*
- 		 * SUS_GPIO[2:0] enabled by default
- 		 * Enable SUS_GPIO3 resume powered gpio explicitly
- 		 */
--		outb(0x8, gpio_ba + RGEN);
-+		sch_gpio_enable(sch, 13);
- 		break;
- 
- 	case PCI_DEVICE_ID_INTEL_ITC_LPC:
--		sch_gpio_core.base = 0;
--		sch_gpio_core.ngpio = 5;
--		sch_gpio_resume.base = 5;
--		sch_gpio_resume.ngpio = 9;
-+		sch->core_base = 0;
-+		sch->resume_base = 5;
-+		sch->chip.ngpio = 14;
- 		break;
- 
- 	case PCI_DEVICE_ID_INTEL_CENTERTON_ILB:
--		sch_gpio_core.base = 0;
--		sch_gpio_core.ngpio = 21;
--		sch_gpio_resume.base = 21;
--		sch_gpio_resume.ngpio = 9;
-+		sch->core_base = 0;
-+		sch->resume_base = 21;
-+		sch->chip.ngpio = 30;
- 		break;
- 
- 	default:
--		err = -ENODEV;
--		goto err_sch_gpio_core;
-+		return -ENODEV;
- 	}
- 
--	sch_gpio_core.dev = &pdev->dev;
--	sch_gpio_resume.dev = &pdev->dev;
--
--	err = gpiochip_add(&sch_gpio_core);
--	if (err < 0)
--		goto err_sch_gpio_core;
-+	platform_set_drvdata(pdev, sch);
- 
--	err = gpiochip_add(&sch_gpio_resume);
--	if (err < 0)
--		goto err_sch_gpio_resume;
--
--	return 0;
--
--err_sch_gpio_resume:
--	gpiochip_remove(&sch_gpio_core);
--
--err_sch_gpio_core:
--	release_region(res->start, resource_size(res));
--	gpio_ba = 0;
+-	int i;
 -
--	return err;
-+	return gpiochip_add(&sch->chip);
- }
- 
- static int sch_gpio_remove(struct platform_device *pdev)
- {
--	struct resource *res;
--	if (gpio_ba) {
+-	if (arch_timers_present & ARCH_CP15_TIMER) {
+-		pr_warn("arch_timer: multiple nodes in dt, skipping\n");
+-		return;
+-	}
 -
--		gpiochip_remove(&sch_gpio_core);
--		gpiochip_remove(&sch_gpio_resume);
+-	arch_timers_present |= ARCH_CP15_TIMER;
+-	for (i = PHYS_SECURE_PPI; i < MAX_TIMER_PPI; i++)
+-		arch_timer_ppi[i] = irq_of_parse_and_map(np, i);
+-	arch_timer_detect_rate(NULL, np);
 -
--		res = platform_get_resource(pdev, IORESOURCE_IO, 0);
+-	/*
+-	 * If we cannot rely on firmware initializing the timer registers then
+-	 * we should use the physical timers instead.
+-	 */
+-	if (IS_ENABLED(CONFIG_ARM) &&
+-	    of_property_read_bool(np, "arm,cpu-registers-not-fw-configured"))
+-			arch_timer_use_virtual = false;
 -
--		release_region(res->start, resource_size(res));
--		gpio_ba = 0;
--	}
-+	struct sch_gpio *sch = platform_get_drvdata(pdev);
- 
-+	gpiochip_remove(&sch->chip);
- 	return 0;
- }
- 
-diff --git a/drivers/gpio/gpiolib-acpi.c b/drivers/gpio/gpiolib-acpi.c
-index 05c6275..ba98bb5 100644
---- a/drivers/gpio/gpiolib-acpi.c
-+++ b/drivers/gpio/gpiolib-acpi.c
-@@ -287,9 +287,45 @@ void acpi_gpiochip_free_interrupts(struct gpio_chip *chip)
+ 	/*
+ 	 * If HYP mode is available, we know that the physical timer
+ 	 * has been configured to be accessible from PL1. Use it, so
+@@ -730,13 +716,39 @@ static void __init arch_timer_init(struct device_node *np)
+ 		}
  	}
- }
  
-+int acpi_dev_add_driver_gpios(struct acpi_device *adev,
-+			      const struct acpi_gpio_mapping *gpios)
-+{
-+	if (adev && gpios) {
-+		adev->driver_gpios = gpios;
-+		return 0;
-+	}
-+	return -EINVAL;
-+}
-+EXPORT_SYMBOL_GPL(acpi_dev_add_driver_gpios);
+-	arch_timer_c3stop = !of_property_read_bool(np, "always-on");
+-
+ 	arch_timer_register();
+ 	arch_timer_common_init();
+ }
+-CLOCKSOURCE_OF_DECLARE(armv7_arch_timer, "arm,armv7-timer", arch_timer_init);
+-CLOCKSOURCE_OF_DECLARE(armv8_arch_timer, "arm,armv8-timer", arch_timer_init);
 +
-+static bool acpi_get_driver_gpio_data(struct acpi_device *adev,
-+				      const char *name, int index,
-+				      struct acpi_reference_args *args)
++static void __init arch_timer_of_init(struct device_node *np)
 +{
-+	const struct acpi_gpio_mapping *gm;
-+
-+	if (!adev->driver_gpios)
-+		return false;
++	int i;
 +
-+	for (gm = adev->driver_gpios; gm->name; gm++)
-+		if (!strcmp(name, gm->name) && gm->data && index < gm->size) {
-+			const struct acpi_gpio_params *par = gm->data + index;
++	/*
++	 * If we cannot rely on firmware initializing the timer registers then
++	 * we should use the physical timers instead.
++	 */
++	if (IS_ENABLED(CONFIG_ARM) &&
++	    of_property_read_bool(np, "arm,cpu-registers-not-fw-configured"))
++			arch_timer_use_virtual = false;
 +
-+			args->adev = adev;
-+			args->args[0] = par->crs_entry_index;
-+			args->args[1] = par->line_index;
-+			args->args[2] = par->active_low;
-+			args->nargs = 3;
-+			return true;
-+		}
++	if (arch_timers_present & ARCH_CP15_TIMER) {
++		pr_warn("arch_timer: multiple nodes in dt, skipping\n");
++		return;
++	}
 +
-+	return false;
-+}
++	arch_timers_present |= ARCH_CP15_TIMER;
++	for (i = PHYS_SECURE_PPI; i < MAX_TIMER_PPI; i++)
++		arch_timer_ppi[i] = irq_of_parse_and_map(np, i);
 +
- struct acpi_gpio_lookup {
- 	struct acpi_gpio_info info;
- 	int index;
-+	int pin_index;
- 	struct gpio_desc *desc;
- 	int n;
- };
-@@ -303,13 +339,24 @@ static int acpi_find_gpio(struct acpi_resource *ares, void *data)
- 
- 	if (lookup->n++ == lookup->index && !lookup->desc) {
- 		const struct acpi_resource_gpio *agpio = &ares->data.gpio;
-+		int pin_index = lookup->pin_index;
++	arch_timer_detect_rate(NULL, np);
 +
-+		if (pin_index >= agpio->pin_table_length)
-+			return 1;
- 
- 		lookup->desc = acpi_get_gpiod(agpio->resource_source.string_ptr,
--					      agpio->pin_table[0]);
-+					      agpio->pin_table[pin_index]);
- 		lookup->info.gpioint =
- 			agpio->connection_type == ACPI_RESOURCE_GPIO_TYPE_INT;
--		lookup->info.active_low =
--			agpio->polarity == ACPI_ACTIVE_LOW;
++	arch_timer_c3stop = !of_property_read_bool(np, "always-on");
 +
-+		/*
-+		 * ActiveLow is only specified for GpioInt resource. If
-+		 * GpioIo is used then the only way to set the flag is
-+		 * to use _DSD "gpios" property.
-+		 */
-+		if (lookup->info.gpioint)
-+			lookup->info.active_low =
-+				agpio->polarity == ACPI_ACTIVE_LOW;
- 	}
- 
- 	return 1;
-@@ -317,40 +364,79 @@ static int acpi_find_gpio(struct acpi_resource *ares, void *data)
++	arch_timer_init();
++}
++CLOCKSOURCE_OF_DECLARE(armv7_arch_timer, "arm,armv7-timer", arch_timer_of_init);
++CLOCKSOURCE_OF_DECLARE(armv8_arch_timer, "arm,armv8-timer", arch_timer_of_init);
  
- /**
-  * acpi_get_gpiod_by_index() - get a GPIO descriptor from device resources
-- * @dev: pointer to a device to get GPIO from
-+ * @adev: pointer to a ACPI device to get GPIO from
-+ * @propname: Property name of the GPIO (optional)
-  * @index: index of GpioIo/GpioInt resource (starting from %0)
-  * @info: info pointer to fill in (optional)
-  *
-- * Function goes through ACPI resources for @dev and based on @index looks
-+ * Function goes through ACPI resources for @adev and based on @index looks
-  * up a GpioIo/GpioInt resource, translates it to the Linux GPIO descriptor,
-  * and returns it. @index matches GpioIo/GpioInt resources only so if there
-  * are total %3 GPIO resources, the index goes from %0 to %2.
-  *
-+ * If @propname is specified the GPIO is looked using device property. In
-+ * that case @index is used to select the GPIO entry in the property value
-+ * (in case of multiple).
-+ *
-  * If the GPIO cannot be translated or there is an error an ERR_PTR is
-  * returned.
-  *
-  * Note: if the GPIO resource has multiple entries in the pin list, this
-  * function only returns the first.
-  */
--struct gpio_desc *acpi_get_gpiod_by_index(struct device *dev, int index,
-+struct gpio_desc *acpi_get_gpiod_by_index(struct acpi_device *adev,
-+					  const char *propname, int index,
- 					  struct acpi_gpio_info *info)
+ static void __init arch_timer_mem_init(struct device_node *np)
  {
- 	struct acpi_gpio_lookup lookup;
- 	struct list_head resource_list;
--	struct acpi_device *adev;
--	acpi_handle handle;
-+	bool active_low = false;
- 	int ret;
- 
--	if (!dev)
--		return ERR_PTR(-EINVAL);
--
--	handle = ACPI_HANDLE(dev);
--	if (!handle || acpi_bus_get_device(handle, &adev))
-+	if (!adev)
- 		return ERR_PTR(-ENODEV);
- 
- 	memset(&lookup, 0, sizeof(lookup));
- 	lookup.index = index;
- 
-+	if (propname) {
-+		struct acpi_reference_args args;
-+
-+		dev_dbg(&adev->dev, "GPIO: looking up %s\n", propname);
-+
-+		memset(&args, 0, sizeof(args));
-+		ret = acpi_dev_get_property_reference(adev, propname,
-+						      index, &args);
-+		if (ret) {
-+			bool found = acpi_get_driver_gpio_data(adev, propname,
-+							       index, &args);
-+			if (!found)
-+				return ERR_PTR(ret);
-+		}
+@@ -803,3 +815,71 @@ static void __init arch_timer_mem_init(struct device_node *np)
+ }
+ CLOCKSOURCE_OF_DECLARE(armv7_arch_timer_mem, "arm,armv7-timer-mem",
+ 		       arch_timer_mem_init);
 +
-+		/*
-+		 * The property was found and resolved so need to
-+		 * lookup the GPIO based on returned args instead.
-+		 */
-+		adev = args.adev;
-+		if (args.nargs >= 2) {
-+			lookup.index = args.args[0];
-+			lookup.pin_index = args.args[1];
-+			/*
-+			 * 3rd argument, if present is used to
-+			 * specify active_low.
-+			 */
-+			if (args.nargs >= 3)
-+				active_low = !!args.args[2];
-+		}
++#ifdef CONFIG_ACPI
++static int __init
++map_generic_timer_interrupt(u32 interrupt, u32 flags)
++{
++	int trigger, polarity;
 +
-+		dev_dbg(&adev->dev, "GPIO: _DSD returned %s %zd %llu %llu %llu\n",
-+			dev_name(&adev->dev), args.nargs,
-+			args.args[0], args.args[1], args.args[2]);
-+	} else {
-+		dev_dbg(&adev->dev, "GPIO: looking up %d in _CRS\n", index);
-+	}
++	if (!interrupt)
++		return 0;
 +
- 	INIT_LIST_HEAD(&resource_list);
- 	ret = acpi_dev_get_resources(adev, &resource_list, acpi_find_gpio,
- 				     &lookup);
-@@ -359,8 +445,11 @@ struct gpio_desc *acpi_get_gpiod_by_index(struct device *dev, int index,
- 
- 	acpi_dev_free_resource_list(&resource_list);
- 
--	if (lookup.desc && info)
-+	if (lookup.desc && info) {
- 		*info = lookup.info;
-+		if (active_low)
-+			info->active_low = active_low;
-+	}
- 
- 	return lookup.desc ? lookup.desc : ERR_PTR(-ENOENT);
- }
-diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
-index e8e98ca..58659db 100644
---- a/drivers/gpio/gpiolib.c
-+++ b/drivers/gpio/gpiolib.c
-@@ -1505,14 +1505,36 @@ static struct gpio_desc *acpi_find_gpio(struct device *dev, const char *con_id,
- 					unsigned int idx,
- 					enum gpio_lookup_flags *flags)
- {
-+	static const char * const suffixes[] = { "gpios", "gpio" };
-+	struct acpi_device *adev = ACPI_COMPANION(dev);
- 	struct acpi_gpio_info info;
- 	struct gpio_desc *desc;
-+	char propname[32];
-+	int i;
- 
--	desc = acpi_get_gpiod_by_index(dev, idx, &info);
--	if (IS_ERR(desc))
--		return desc;
-+	/* Try first from _DSD */
-+	for (i = 0; i < ARRAY_SIZE(suffixes); i++) {
-+		if (con_id && strcmp(con_id, "gpios")) {
-+			snprintf(propname, sizeof(propname), "%s-%s",
-+				 con_id, suffixes[i]);
-+		} else {
-+			snprintf(propname, sizeof(propname), "%s",
-+				 suffixes[i]);
-+		}
++	trigger = (flags & ACPI_GTDT_INTERRUPT_MODE) ? ACPI_EDGE_SENSITIVE
++			: ACPI_LEVEL_SENSITIVE;
 +
-+		desc = acpi_get_gpiod_by_index(adev, propname, idx, &info);
-+		if (!IS_ERR(desc) || (PTR_ERR(desc) == -EPROBE_DEFER))
-+			break;
-+	}
- 
--	if (info.gpioint && info.active_low)
-+	/* Then from plain _CRS GPIOs */
-+	if (IS_ERR(desc)) {
-+		desc = acpi_get_gpiod_by_index(adev, NULL, idx, &info);
-+		if (IS_ERR(desc))
-+			return desc;
-+	}
++	polarity = (flags & ACPI_GTDT_INTERRUPT_POLARITY) ? ACPI_ACTIVE_LOW
++			: ACPI_ACTIVE_HIGH;
 +
-+	if (info.active_low)
- 		*flags |= GPIO_ACTIVE_LOW;
- 
- 	return desc;
-@@ -1713,6 +1735,61 @@ struct gpio_desc *__must_check __gpiod_get_index(struct device *dev,
- EXPORT_SYMBOL_GPL(__gpiod_get_index);
- 
- /**
-+ * fwnode_get_named_gpiod - obtain a GPIO from firmware node
-+ * @fwnode:	handle of the firmware node
-+ * @propname:	name of the firmware property representing the GPIO
-+ *
-+ * This function can be used for drivers that get their configuration
-+ * from firmware.
-+ *
-+ * Function properly finds the corresponding GPIO using whatever is the
-+ * underlying firmware interface and then makes sure that the GPIO
-+ * descriptor is requested before it is returned to the caller.
-+ *
-+ * In case of error an ERR_PTR() is returned.
-+ */
-+struct gpio_desc *fwnode_get_named_gpiod(struct fwnode_handle *fwnode,
-+					 const char *propname)
++	return acpi_register_gsi(NULL, interrupt, trigger, polarity);
++}
++
++/* Initialize per-processor generic timer */
++static int __init arch_timer_acpi_init(struct acpi_table_header *table)
 +{
-+	struct gpio_desc *desc = ERR_PTR(-ENODEV);
-+	bool active_low = false;
-+	int ret;
++	struct acpi_table_gtdt *gtdt;
++
++	if (arch_timers_present & ARCH_CP15_TIMER) {
++		pr_warn("arch_timer: already initialized, skipping\n");
++		return -EINVAL;
++	}
 +
-+	if (!fwnode)
-+		return ERR_PTR(-EINVAL);
++	gtdt = container_of(table, struct acpi_table_gtdt, header);
 +
-+	if (is_of_node(fwnode)) {
-+		enum of_gpio_flags flags;
++	arch_timers_present |= ARCH_CP15_TIMER;
 +
-+		desc = of_get_named_gpiod_flags(of_node(fwnode), propname, 0,
-+						&flags);
-+		if (!IS_ERR(desc))
-+			active_low = flags & OF_GPIO_ACTIVE_LOW;
-+	} else if (is_acpi_node(fwnode)) {
-+		struct acpi_gpio_info info;
++	arch_timer_ppi[PHYS_SECURE_PPI] =
++		map_generic_timer_interrupt(gtdt->secure_el1_interrupt,
++		gtdt->secure_el1_flags);
 +
-+		desc = acpi_get_gpiod_by_index(acpi_node(fwnode), propname, 0,
-+					       &info);
-+		if (!IS_ERR(desc))
-+			active_low = info.active_low;
-+	}
++	arch_timer_ppi[PHYS_NONSECURE_PPI] =
++		map_generic_timer_interrupt(gtdt->non_secure_el1_interrupt,
++		gtdt->non_secure_el1_flags);
 +
-+	if (IS_ERR(desc))
-+		return desc;
++	arch_timer_ppi[VIRT_PPI] =
++		map_generic_timer_interrupt(gtdt->virtual_timer_interrupt,
++		gtdt->virtual_timer_flags);
 +
-+	ret = gpiod_request(desc, NULL);
-+	if (ret)
-+		return ERR_PTR(ret);
++	arch_timer_ppi[HYP_PPI] =
++		map_generic_timer_interrupt(gtdt->non_secure_el2_interrupt,
++		gtdt->non_secure_el2_flags);
++
++	/* Get the frequency from CNTFRQ */
++	arch_timer_detect_rate(NULL, NULL);
 +
-+	/* Only value flag can be set from both DT and ACPI is active_low */
-+	if (active_low)
-+		set_bit(FLAG_ACTIVE_LOW, &desc->flags);
++	/* Always-on capability */
++	arch_timer_c3stop = !(gtdt->non_secure_el1_flags & ACPI_GTDT_ALWAYS_ON);
 +
-+	return desc;
++	arch_timer_init();
++	return 0;
 +}
-+EXPORT_SYMBOL_GPL(fwnode_get_named_gpiod);
 +
-+/**
-  * gpiod_get_index_optional - obtain an optional GPIO from a multi-index GPIO
-  *                            function
-  * @dev: GPIO consumer, can be NULL for system-global GPIOs
-diff --git a/drivers/gpio/gpiolib.h b/drivers/gpio/gpiolib.h
-index 9db2b6a..e3a5211 100644
---- a/drivers/gpio/gpiolib.h
-+++ b/drivers/gpio/gpiolib.h
-@@ -34,7 +34,8 @@ void acpi_gpiochip_remove(struct gpio_chip *chip);
- void acpi_gpiochip_request_interrupts(struct gpio_chip *chip);
- void acpi_gpiochip_free_interrupts(struct gpio_chip *chip);
- 
--struct gpio_desc *acpi_get_gpiod_by_index(struct device *dev, int index,
-+struct gpio_desc *acpi_get_gpiod_by_index(struct acpi_device *adev,
-+					  const char *propname, int index,
- 					  struct acpi_gpio_info *info);
- #else
- static inline void acpi_gpiochip_add(struct gpio_chip *chip) { }
-@@ -47,8 +48,8 @@ static inline void
- acpi_gpiochip_free_interrupts(struct gpio_chip *chip) { }
- 
- static inline struct gpio_desc *
--acpi_get_gpiod_by_index(struct device *dev, int index,
--			struct acpi_gpio_info *info)
-+acpi_get_gpiod_by_index(struct acpi_device *adev, const char *propname,
-+			int index, struct acpi_gpio_info *info)
- {
- 	return ERR_PTR(-ENOSYS);
- }
++/* Initialize all the generic timers presented in GTDT */
++void __init acpi_generic_timer_init(void)
++{
++	if (acpi_disabled)
++		return;
++
++	acpi_table_parse(ACPI_SIG_GTDT, arch_timer_acpi_init);
++}
++#endif
 diff --git a/drivers/input/keyboard/gpio_keys_polled.c b/drivers/input/keyboard/gpio_keys_polled.c
-index 432d363..c9c1c8c 100644
+index 90df4df..c9c1c8c 100644
 --- a/drivers/input/keyboard/gpio_keys_polled.c
 +++ b/drivers/input/keyboard/gpio_keys_polled.c
-@@ -23,10 +23,9 @@
- #include <linux/ioport.h>
- #include <linux/platform_device.h>
- #include <linux/gpio.h>
-+#include <linux/gpio/consumer.h>
- #include <linux/gpio_keys.h>
--#include <linux/of.h>
--#include <linux/of_platform.h>
--#include <linux/of_gpio.h>
-+#include <linux/property.h>
- 
- #define DRV_NAME	"gpio-keys-polled"
- 
-@@ -51,15 +50,14 @@ static void gpio_keys_polled_check_state(struct input_dev *input,
- 	int state;
- 
- 	if (bdata->can_sleep)
--		state = !!gpio_get_value_cansleep(button->gpio);
-+		state = !!gpiod_get_value_cansleep(button->gpiod);
- 	else
--		state = !!gpio_get_value(button->gpio);
-+		state = !!gpiod_get_value(button->gpiod);
- 
- 	if (state != bdata->last_state) {
- 		unsigned int type = button->type ?: EV_KEY;
- 
--		input_event(input, type, button->code,
--			    !!(state ^ button->active_low));
-+		input_event(input, type, button->code, state);
- 		input_sync(input);
- 		bdata->count = 0;
- 		bdata->last_state = state;
-@@ -102,21 +100,15 @@ static void gpio_keys_polled_close(struct input_polled_dev *dev)
- 		pdata->disable(bdev->dev);
- }
- 
--#ifdef CONFIG_OF
- static struct gpio_keys_platform_data *gpio_keys_polled_get_devtree_pdata(struct device *dev)
- {
--	struct device_node *node, *pp;
- 	struct gpio_keys_platform_data *pdata;
- 	struct gpio_keys_button *button;
-+	struct fwnode_handle *child;
- 	int error;
- 	int nbuttons;
--	int i;
--
--	node = dev->of_node;
--	if (!node)
--		return NULL;
- 
--	nbuttons = of_get_child_count(node);
-+	nbuttons = device_get_child_node_count(dev);
- 	if (nbuttons == 0)
- 		return NULL;
- 
-@@ -126,52 +118,44 @@ static struct gpio_keys_platform_data *gpio_keys_polled_get_devtree_pdata(struct
- 		return ERR_PTR(-ENOMEM);
- 
- 	pdata->buttons = (struct gpio_keys_button *)(pdata + 1);
--	pdata->nbuttons = nbuttons;
- 
--	pdata->rep = !!of_get_property(node, "autorepeat", NULL);
--	of_property_read_u32(node, "poll-interval", &pdata->poll_interval);
-+	pdata->rep = device_property_present(dev, "autorepeat");
-+	device_property_read_u32(dev, "poll-interval", &pdata->poll_interval);
- 
--	i = 0;
--	for_each_child_of_node(node, pp) {
--		int gpio;
--		enum of_gpio_flags flags;
-+	device_for_each_child_node(dev, child) {
-+		struct gpio_desc *desc;
- 
--		if (!of_find_property(pp, "gpios", NULL)) {
--			pdata->nbuttons--;
--			dev_warn(dev, "Found button without gpios\n");
--			continue;
--		}
--
--		gpio = of_get_gpio_flags(pp, 0, &flags);
--		if (gpio < 0) {
--			error = gpio;
-+		desc = devm_get_gpiod_from_child(dev, child);
-+		if (IS_ERR(desc)) {
-+			error = PTR_ERR(desc);
- 			if (error != -EPROBE_DEFER)
- 				dev_err(dev,
- 					"Failed to get gpio flags, error: %d\n",
- 					error);
-+			fwnode_handle_put(child);
- 			return ERR_PTR(error);
- 		}
- 
--		button = &pdata->buttons[i++];
--
--		button->gpio = gpio;
--		button->active_low = flags & OF_GPIO_ACTIVE_LOW;
-+		button = &pdata->buttons[pdata->nbuttons++];
-+		button->gpiod = desc;
- 
--		if (of_property_read_u32(pp, "linux,code", &button->code)) {
--			dev_err(dev, "Button without keycode: 0x%x\n",
--				button->gpio);
-+		if (fwnode_property_read_u32(child, "linux,code", &button->code)) {
-+			dev_err(dev, "Button without keycode: %d\n",
-+				pdata->nbuttons - 1);
-+			fwnode_handle_put(child);
- 			return ERR_PTR(-EINVAL);
- 		}
- 
--		button->desc = of_get_property(pp, "label", NULL);
-+		fwnode_property_read_string(child, "label", &button->desc);
- 
--		if (of_property_read_u32(pp, "linux,input-type", &button->type))
-+		if (fwnode_property_read_u32(child, "linux,input-type",
-+					     &button->type))
- 			button->type = EV_KEY;
- 
--		button->wakeup = !!of_get_property(pp, "gpio-key,wakeup", NULL);
-+		button->wakeup = fwnode_property_present(child, "gpio-key,wakeup");
- 
--		if (of_property_read_u32(pp, "debounce-interval",
--					 &button->debounce_interval))
-+		if (fwnode_property_read_u32(child, "debounce-interval",
-+					     &button->debounce_interval))
- 			button->debounce_interval = 5;
- 	}
- 
-@@ -187,15 +171,6 @@ static const struct of_device_id gpio_keys_polled_of_match[] = {
- };
- MODULE_DEVICE_TABLE(of, gpio_keys_polled_of_match);
- 
--#else
--
--static inline struct gpio_keys_platform_data *
--gpio_keys_polled_get_devtree_pdata(struct device *dev)
--{
--	return NULL;
--}
--#endif
--
- static int gpio_keys_polled_probe(struct platform_device *pdev)
- {
- 	struct device *dev = &pdev->dev;
-@@ -259,7 +234,6 @@ static int gpio_keys_polled_probe(struct platform_device *pdev)
- 	for (i = 0; i < pdata->nbuttons; i++) {
- 		struct gpio_keys_button *button = &pdata->buttons[i];
- 		struct gpio_keys_button_data *bdata = &bdev->data[i];
--		unsigned int gpio = button->gpio;
- 		unsigned int type = button->type ?: EV_KEY;
- 
- 		if (button->wakeup) {
-@@ -267,15 +241,31 @@ static int gpio_keys_polled_probe(struct platform_device *pdev)
- 			return -EINVAL;
- 		}
- 
--		error = devm_gpio_request_one(&pdev->dev, gpio, GPIOF_IN,
--					      button->desc ? : DRV_NAME);
--		if (error) {
--			dev_err(dev, "unable to claim gpio %u, err=%d\n",
--				gpio, error);
--			return error;
-+		/*
-+		 * Legacy GPIO number so request the GPIO here and
-+		 * convert it to descriptor.
-+		 */
-+		if (!button->gpiod && gpio_is_valid(button->gpio)) {
-+			unsigned flags = 0;
-+
-+			if (button->active_low)
-+				flags |= GPIOF_ACTIVE_LOW;
-+
-+			error = devm_gpio_request_one(&pdev->dev, button->gpio,
-+					flags, button->desc ? : DRV_NAME);
-+			if (error) {
-+				dev_err(dev, "unable to claim gpio %u, err=%d\n",
-+					button->gpio, error);
-+				return error;
-+			}
-+
-+			button->gpiod = gpio_to_desc(button->gpio);
- 		}
- 
--		bdata->can_sleep = gpio_cansleep(gpio);
-+		if (IS_ERR(button->gpiod))
-+			return PTR_ERR(button->gpiod);
-+
-+		bdata->can_sleep = gpiod_cansleep(button->gpiod);
- 		bdata->last_state = -1;
- 		bdata->threshold = DIV_ROUND_UP(button->debounce_interval,
- 						pdata->poll_interval);
-@@ -308,7 +298,7 @@ static struct platform_driver gpio_keys_polled_driver = {
+@@ -297,6 +297,7 @@ static struct platform_driver gpio_keys_polled_driver = {
+ 	.probe	= gpio_keys_polled_probe,
  	.driver	= {
  		.name	= DRV_NAME,
- 		.owner	= THIS_MODULE,
--		.of_match_table = of_match_ptr(gpio_keys_polled_of_match),
-+		.of_match_table = gpio_keys_polled_of_match,
++		.owner	= THIS_MODULE,
+ 		.of_match_table = gpio_keys_polled_of_match,
  	},
  };
- module_platform_driver(gpio_keys_polled_driver);
 diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c
-index 60558f7..3b92862 100644
+index 6cd47b7..09f904a 100644
 --- a/drivers/iommu/arm-smmu.c
 +++ b/drivers/iommu/arm-smmu.c
-@@ -444,7 +444,10 @@ static struct device_node *dev_get_dev_node(struct device *dev)
+@@ -451,7 +451,10 @@ static struct device_node *dev_get_dev_node(struct device *dev)
  
  		while (!pci_is_root_bus(bus))
  			bus = bus->parent;
@@ -8777,7 +3304,7 @@ index 60558f7..3b92862 100644
  	}
  
  	return dev->of_node;
-@@ -560,6 +563,9 @@ static struct arm_smmu_device *find_smmu_for_device(struct device *dev)
+@@ -567,6 +570,9 @@ static struct arm_smmu_device *find_smmu_for_device(struct device *dev)
  	struct arm_smmu_master *master = NULL;
  	struct device_node *dev_node = dev_get_dev_node(dev);
  
@@ -8788,10 +3315,10 @@ index 60558f7..3b92862 100644
  	list_for_each_entry(smmu, &arm_smmu_devices, list) {
  		master = find_smmu_master(smmu, dev_node);
 diff --git a/drivers/irqchip/irq-gic-v3.c b/drivers/irqchip/irq-gic-v3.c
-index aa17ae8..d330dab 100644
+index 1a146cc..ab7dfe2 100644
 --- a/drivers/irqchip/irq-gic-v3.c
 +++ b/drivers/irqchip/irq-gic-v3.c
-@@ -506,9 +506,19 @@ static void gic_raise_softirq(const struct cpumask *mask, unsigned int irq)
+@@ -520,9 +520,19 @@ static void gic_raise_softirq(const struct cpumask *mask, unsigned int irq)
  	isb();
  }
  
@@ -8812,7 +3339,7 @@ index aa17ae8..d330dab 100644
  }
  
 diff --git a/drivers/irqchip/irq-gic.c b/drivers/irqchip/irq-gic.c
-index 38493ff..26e6773 100644
+index d617ee5..da0cd51 100644
 --- a/drivers/irqchip/irq-gic.c
 +++ b/drivers/irqchip/irq-gic.c
 @@ -33,12 +33,14 @@
@@ -8844,7 +3371,7 @@ index 38493ff..26e6773 100644
  #endif
  
  #ifdef CONFIG_BL_SWITCHER
-@@ -996,6 +1005,9 @@ void __init gic_init_bases(unsigned int gic_nr, int irq_start,
+@@ -1025,6 +1034,9 @@ void __init gic_init_bases(unsigned int gic_nr, int irq_start,
  #ifdef CONFIG_SMP
  		set_smp_cross_call(gic_raise_softirq);
  		register_cpu_notifier(&gic_cpu_notifier);
@@ -8854,7 +3381,7 @@ index 38493ff..26e6773 100644
  #endif
  		set_handle_irq(gic_handle_irq);
  	}
-@@ -1048,3 +1060,107 @@ IRQCHIP_DECLARE(msm_8660_qgic, "qcom,msm-8660-qgic", gic_of_init);
+@@ -1083,3 +1095,109 @@ IRQCHIP_DECLARE(msm_8660_qgic, "qcom,msm-8660-qgic", gic_of_init);
  IRQCHIP_DECLARE(msm_qgic2, "qcom,msm-qgic2", gic_of_init);
  
  #endif
@@ -8910,7 +3437,8 @@ index 38493ff..26e6773 100644
 +	int count;
 +
 +	/* Collect CPU base addresses */
-+	count = acpi_parse_entries(sizeof(struct acpi_table_madt),
++	count = acpi_parse_entries(ACPI_SIG_MADT,
++				   sizeof(struct acpi_table_madt),
 +				   gic_acpi_parse_madt_cpu, table,
 +				   ACPI_MADT_TYPE_GENERIC_INTERRUPT, 0);
 +	if (count < 0) {
@@ -8925,7 +3453,8 @@ index 38493ff..26e6773 100644
 +	 * Find distributor base address. We expect one distributor entry since
 +	 * ACPI 5.1 spec neither support multi-GIC instances nor GIC cascade.
 +	 */
-+	count = acpi_parse_entries(sizeof(struct acpi_table_madt),
++	count = acpi_parse_entries(ACPI_SIG_MADT,
++				   sizeof(struct acpi_table_madt),
 +				   gic_acpi_parse_madt_distributor, table,
 +				   ACPI_MADT_TYPE_GENERIC_DISTRIBUTOR, 0);
 +	if (count <= 0) {
@@ -8982,393 +3511,19 @@ index 0fe2f71..9106c6d 100644
 +	acpi_gic_init();
  }
 diff --git a/drivers/leds/leds-gpio.c b/drivers/leds/leds-gpio.c
-index b4518c8..b3c5d9d 100644
+index 7ea1ea42..5fb4440 100644
 --- a/drivers/leds/leds-gpio.c
 +++ b/drivers/leds/leds-gpio.c
-@@ -12,25 +12,23 @@
-  */
- #include <linux/err.h>
- #include <linux/gpio.h>
-+#include <linux/gpio/consumer.h>
- #include <linux/kernel.h>
- #include <linux/leds.h>
- #include <linux/module.h>
--#include <linux/of.h>
--#include <linux/of_gpio.h>
--#include <linux/of_platform.h>
- #include <linux/platform_device.h>
-+#include <linux/property.h>
- #include <linux/slab.h>
- #include <linux/workqueue.h>
- 
- struct gpio_led_data {
- 	struct led_classdev cdev;
--	unsigned gpio;
-+	struct gpio_desc *gpiod;
- 	struct work_struct work;
- 	u8 new_level;
- 	u8 can_sleep;
--	u8 active_low;
- 	u8 blinking;
--	int (*platform_gpio_blink_set)(unsigned gpio, int state,
-+	int (*platform_gpio_blink_set)(struct gpio_desc *desc, int state,
- 			unsigned long *delay_on, unsigned long *delay_off);
- };
- 
-@@ -40,12 +38,11 @@ static void gpio_led_work(struct work_struct *work)
- 		container_of(work, struct gpio_led_data, work);
- 
- 	if (led_dat->blinking) {
--		led_dat->platform_gpio_blink_set(led_dat->gpio,
--						 led_dat->new_level,
--						 NULL, NULL);
-+		led_dat->platform_gpio_blink_set(led_dat->gpiod,
-+					led_dat->new_level, NULL, NULL);
- 		led_dat->blinking = 0;
- 	} else
--		gpio_set_value_cansleep(led_dat->gpio, led_dat->new_level);
-+		gpiod_set_value_cansleep(led_dat->gpiod, led_dat->new_level);
- }
- 
- static void gpio_led_set(struct led_classdev *led_cdev,
-@@ -60,9 +57,6 @@ static void gpio_led_set(struct led_classdev *led_cdev,
- 	else
- 		level = 1;
- 
--	if (led_dat->active_low)
--		level = !level;
--
- 	/* Setting GPIOs with I2C/etc requires a task context, and we don't
- 	 * seem to have a reliable way to know if we're already in one; so
- 	 * let's just assume the worst.
-@@ -72,11 +66,11 @@ static void gpio_led_set(struct led_classdev *led_cdev,
- 		schedule_work(&led_dat->work);
- 	} else {
- 		if (led_dat->blinking) {
--			led_dat->platform_gpio_blink_set(led_dat->gpio, level,
-+			led_dat->platform_gpio_blink_set(led_dat->gpiod, level,
- 							 NULL, NULL);
- 			led_dat->blinking = 0;
- 		} else
--			gpio_set_value(led_dat->gpio, level);
-+			gpiod_set_value(led_dat->gpiod, level);
- 	}
- }
- 
-@@ -87,34 +81,49 @@ static int gpio_blink_set(struct led_classdev *led_cdev,
- 		container_of(led_cdev, struct gpio_led_data, cdev);
- 
- 	led_dat->blinking = 1;
--	return led_dat->platform_gpio_blink_set(led_dat->gpio, GPIO_LED_BLINK,
-+	return led_dat->platform_gpio_blink_set(led_dat->gpiod, GPIO_LED_BLINK,
- 						delay_on, delay_off);
- }
- 
- static int create_gpio_led(const struct gpio_led *template,
- 	struct gpio_led_data *led_dat, struct device *parent,
--	int (*blink_set)(unsigned, int, unsigned long *, unsigned long *))
-+	int (*blink_set)(struct gpio_desc *, int, unsigned long *,
-+			 unsigned long *))
- {
- 	int ret, state;
- 
--	led_dat->gpio = -1;
-+	led_dat->gpiod = template->gpiod;
-+	if (!led_dat->gpiod) {
-+		/*
-+		 * This is the legacy code path for platform code that
-+		 * still uses GPIO numbers. Ultimately we would like to get
-+		 * rid of this block completely.
-+		 */
-+		unsigned long flags = 0;
-+
-+		/* skip leds that aren't available */
-+		if (!gpio_is_valid(template->gpio)) {
-+			dev_info(parent, "Skipping unavailable LED gpio %d (%s)\n",
-+					template->gpio, template->name);
-+			return 0;
-+		}
- 
--	/* skip leds that aren't available */
--	if (!gpio_is_valid(template->gpio)) {
--		dev_info(parent, "Skipping unavailable LED gpio %d (%s)\n",
--				template->gpio, template->name);
--		return 0;
--	}
-+		if (template->active_low)
-+			flags |= GPIOF_ACTIVE_LOW;
- 
--	ret = devm_gpio_request(parent, template->gpio, template->name);
--	if (ret < 0)
--		return ret;
-+		ret = devm_gpio_request_one(parent, template->gpio, flags,
-+					    template->name);
-+		if (ret < 0)
-+			return ret;
-+
-+		led_dat->gpiod = gpio_to_desc(template->gpio);
-+		if (IS_ERR(led_dat->gpiod))
-+			return PTR_ERR(led_dat->gpiod);
-+	}
- 
- 	led_dat->cdev.name = template->name;
- 	led_dat->cdev.default_trigger = template->default_trigger;
--	led_dat->gpio = template->gpio;
--	led_dat->can_sleep = gpio_cansleep(template->gpio);
--	led_dat->active_low = template->active_low;
-+	led_dat->can_sleep = gpiod_cansleep(led_dat->gpiod);
- 	led_dat->blinking = 0;
- 	if (blink_set) {
- 		led_dat->platform_gpio_blink_set = blink_set;
-@@ -122,30 +131,24 @@ static int create_gpio_led(const struct gpio_led *template,
- 	}
- 	led_dat->cdev.brightness_set = gpio_led_set;
- 	if (template->default_state == LEDS_GPIO_DEFSTATE_KEEP)
--		state = !!gpio_get_value_cansleep(led_dat->gpio) ^ led_dat->active_low;
-+		state = !!gpiod_get_value_cansleep(led_dat->gpiod);
- 	else
- 		state = (template->default_state == LEDS_GPIO_DEFSTATE_ON);
- 	led_dat->cdev.brightness = state ? LED_FULL : LED_OFF;
- 	if (!template->retain_state_suspended)
- 		led_dat->cdev.flags |= LED_CORE_SUSPENDRESUME;
- 
--	ret = gpio_direction_output(led_dat->gpio, led_dat->active_low ^ state);
-+	ret = gpiod_direction_output(led_dat->gpiod, state);
- 	if (ret < 0)
- 		return ret;
- 
- 	INIT_WORK(&led_dat->work, gpio_led_work);
- 
--	ret = led_classdev_register(parent, &led_dat->cdev);
--	if (ret < 0)
--		return ret;
--
--	return 0;
-+	return led_classdev_register(parent, &led_dat->cdev);
- }
- 
- static void delete_gpio_led(struct gpio_led_data *led)
- {
--	if (!gpio_is_valid(led->gpio))
--		return;
- 	led_classdev_unregister(&led->cdev);
- 	cancel_work_sync(&led->work);
- }
-@@ -161,40 +164,37 @@ static inline int sizeof_gpio_leds_priv(int num_leds)
- 		(sizeof(struct gpio_led_data) * num_leds);
- }
- 
--/* Code to create from OpenFirmware platform devices */
--#ifdef CONFIG_OF_GPIO
--static struct gpio_leds_priv *gpio_leds_create_of(struct platform_device *pdev)
-+static struct gpio_leds_priv *gpio_leds_create(struct platform_device *pdev)
- {
--	struct device_node *np = pdev->dev.of_node, *child;
-+	struct device *dev = &pdev->dev;
-+	struct fwnode_handle *child;
- 	struct gpio_leds_priv *priv;
- 	int count, ret;
- 
--	/* count LEDs in this device, so we know how much to allocate */
--	count = of_get_available_child_count(np);
-+	count = device_get_child_node_count(dev);
- 	if (!count)
- 		return ERR_PTR(-ENODEV);
- 
--	for_each_available_child_of_node(np, child)
--		if (of_get_gpio(child, 0) == -EPROBE_DEFER)
--			return ERR_PTR(-EPROBE_DEFER);
--
--	priv = devm_kzalloc(&pdev->dev, sizeof_gpio_leds_priv(count),
--			GFP_KERNEL);
-+	priv = devm_kzalloc(dev, sizeof_gpio_leds_priv(count), GFP_KERNEL);
- 	if (!priv)
- 		return ERR_PTR(-ENOMEM);
- 
--	for_each_available_child_of_node(np, child) {
-+	device_for_each_child_node(dev, child) {
- 		struct gpio_led led = {};
--		enum of_gpio_flags flags;
--		const char *state;
--
--		led.gpio = of_get_gpio_flags(child, 0, &flags);
--		led.active_low = flags & OF_GPIO_ACTIVE_LOW;
--		led.name = of_get_property(child, "label", NULL) ? : child->name;
--		led.default_trigger =
--			of_get_property(child, "linux,default-trigger", NULL);
--		state = of_get_property(child, "default-state", NULL);
--		if (state) {
-+		const char *state = NULL;
-+
-+		led.gpiod = devm_get_gpiod_from_child(dev, child);
-+		if (IS_ERR(led.gpiod)) {
-+			fwnode_handle_put(child);
-+			goto err;
-+		}
-+
-+		fwnode_property_read_string(child, "label", &led.name);
-+		fwnode_property_read_string(child, "linux,default-trigger",
-+					    &led.default_trigger);
-+
-+		if (!fwnode_property_read_string(child, "linux,default_state",
-+						 &state)) {
- 			if (!strcmp(state, "keep"))
- 				led.default_state = LEDS_GPIO_DEFSTATE_KEEP;
- 			else if (!strcmp(state, "on"))
-@@ -203,13 +203,13 @@ static struct gpio_leds_priv *gpio_leds_create_of(struct platform_device *pdev)
- 				led.default_state = LEDS_GPIO_DEFSTATE_OFF;
- 		}
- 
--		if (of_get_property(child, "retain-state-suspended", NULL))
-+		if (fwnode_property_present(child, "retain-state-suspended"))
- 			led.retain_state_suspended = 1;
- 
- 		ret = create_gpio_led(&led, &priv->leds[priv->num_leds++],
--				      &pdev->dev, NULL);
-+				      dev, NULL);
- 		if (ret < 0) {
--			of_node_put(child);
-+			fwnode_handle_put(child);
- 			goto err;
- 		}
- 	}
-@@ -228,12 +228,6 @@ static const struct of_device_id of_gpio_leds_match[] = {
- };
- 
- MODULE_DEVICE_TABLE(of, of_gpio_leds_match);
--#else /* CONFIG_OF_GPIO */
--static struct gpio_leds_priv *gpio_leds_create_of(struct platform_device *pdev)
--{
--	return ERR_PTR(-ENODEV);
--}
--#endif /* CONFIG_OF_GPIO */
- 
- static int gpio_led_probe(struct platform_device *pdev)
- {
-@@ -261,7 +255,7 @@ static int gpio_led_probe(struct platform_device *pdev)
- 			}
- 		}
- 	} else {
--		priv = gpio_leds_create_of(pdev);
-+		priv = gpio_leds_create(pdev);
- 		if (IS_ERR(priv))
- 			return PTR_ERR(priv);
- 	}
-@@ -288,7 +282,7 @@ static struct platform_driver gpio_led_driver = {
+@@ -291,6 +291,7 @@ static struct platform_driver gpio_led_driver = {
+ 	.remove		= gpio_led_remove,
  	.driver		= {
  		.name	= "leds-gpio",
- 		.owner	= THIS_MODULE,
--		.of_match_table = of_match_ptr(of_gpio_leds_match),
-+		.of_match_table = of_gpio_leds_match,
++		.owner	= THIS_MODULE,
+ 		.of_match_table = of_gpio_leds_match,
  	},
  };
- 
-diff --git a/drivers/misc/eeprom/at25.c b/drivers/misc/eeprom/at25.c
-index 634f729..0a1af93 100644
---- a/drivers/misc/eeprom/at25.c
-+++ b/drivers/misc/eeprom/at25.c
-@@ -18,7 +18,7 @@
- 
- #include <linux/spi/spi.h>
- #include <linux/spi/eeprom.h>
--#include <linux/of.h>
-+#include <linux/property.h>
- 
- /*
-  * NOTE: this is an *EEPROM* driver.  The vagaries of product naming
-@@ -301,35 +301,33 @@ static ssize_t at25_mem_write(struct memory_accessor *mem, const char *buf,
- 
- /*-------------------------------------------------------------------------*/
- 
--static int at25_np_to_chip(struct device *dev,
--			   struct device_node *np,
--			   struct spi_eeprom *chip)
-+static int at25_fw_to_chip(struct device *dev, struct spi_eeprom *chip)
- {
- 	u32 val;
- 
- 	memset(chip, 0, sizeof(*chip));
--	strncpy(chip->name, np->name, sizeof(chip->name));
-+	strncpy(chip->name, "at25", sizeof(chip->name));
- 
--	if (of_property_read_u32(np, "size", &val) == 0 ||
--	    of_property_read_u32(np, "at25,byte-len", &val) == 0) {
-+	if (device_property_read_u32(dev, "size", &val) == 0 ||
-+	    device_property_read_u32(dev, "at25,byte-len", &val) == 0) {
- 		chip->byte_len = val;
- 	} else {
- 		dev_err(dev, "Error: missing \"size\" property\n");
- 		return -ENODEV;
- 	}
- 
--	if (of_property_read_u32(np, "pagesize", &val) == 0 ||
--	    of_property_read_u32(np, "at25,page-size", &val) == 0) {
-+	if (device_property_read_u32(dev, "pagesize", &val) == 0 ||
-+	    device_property_read_u32(dev, "at25,page-size", &val) == 0) {
- 		chip->page_size = (u16)val;
- 	} else {
- 		dev_err(dev, "Error: missing \"pagesize\" property\n");
- 		return -ENODEV;
- 	}
- 
--	if (of_property_read_u32(np, "at25,addr-mode", &val) == 0) {
-+	if (device_property_read_u32(dev, "at25,addr-mode", &val) == 0) {
- 		chip->flags = (u16)val;
- 	} else {
--		if (of_property_read_u32(np, "address-width", &val)) {
-+		if (device_property_read_u32(dev, "address-width", &val)) {
- 			dev_err(dev,
- 				"Error: missing \"address-width\" property\n");
- 			return -ENODEV;
-@@ -350,7 +348,7 @@ static int at25_np_to_chip(struct device *dev,
- 				val);
- 			return -ENODEV;
- 		}
--		if (of_find_property(np, "read-only", NULL))
-+		if (device_property_present(dev, "read-only"))
- 			chip->flags |= EE_READONLY;
- 	}
- 	return 0;
-@@ -360,21 +358,15 @@ static int at25_probe(struct spi_device *spi)
- {
- 	struct at25_data	*at25 = NULL;
- 	struct spi_eeprom	chip;
--	struct device_node	*np = spi->dev.of_node;
- 	int			err;
- 	int			sr;
- 	int			addrlen;
- 
- 	/* Chip description */
- 	if (!spi->dev.platform_data) {
--		if (np) {
--			err = at25_np_to_chip(&spi->dev, np, &chip);
--			if (err)
--				return err;
--		} else {
--			dev_err(&spi->dev, "Error: no chip description\n");
--			return -ENODEV;
--		}
-+		err = at25_fw_to_chip(&spi->dev, &chip);
-+		if (err)
-+			return err;
- 	} else
- 		chip = *(struct spi_eeprom *)spi->dev.platform_data;
- 
-diff --git a/drivers/net/ethernet/amd/Kconfig b/drivers/net/ethernet/amd/Kconfig
-index 8319c99..6feb6ef3 100644
---- a/drivers/net/ethernet/amd/Kconfig
-+++ b/drivers/net/ethernet/amd/Kconfig
-@@ -179,7 +179,7 @@ config SUNLANCE
- 
- config AMD_XGBE
- 	tristate "AMD 10GbE Ethernet driver"
--	depends on OF_NET
-+	depends on OF_NET || ACPI
- 	select PHYLIB
- 	select AMD_XGBE_PHY
- 	select BITREVERSE
 diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-dev.c b/drivers/net/ethernet/amd/xgbe/xgbe-dev.c
-index 9da3a03..a34cad2 100644
+index 53f5f66..3957e63 100644
 --- a/drivers/net/ethernet/amd/xgbe/xgbe-dev.c
 +++ b/drivers/net/ethernet/amd/xgbe/xgbe-dev.c
 @@ -130,7 +130,7 @@ static unsigned int xgbe_usec_to_riwt(struct xgbe_prv_data *pdata,
@@ -9389,7 +3544,7 @@ index 9da3a03..a34cad2 100644
  
  	/*
  	 * Convert the input watchdog timer value to the usec value. Each
-@@ -695,6 +695,18 @@ static int xgbe_read_mmd_regs(struct xgbe_prv_data *pdata, int prtad,
+@@ -854,6 +854,18 @@ static int xgbe_read_mmd_regs(struct xgbe_prv_data *pdata, int prtad,
  	else
  		mmd_address = (pdata->mdio_mmd << 16) | (mmd_reg & 0xffff);
  
@@ -9408,22 +3563,8 @@ index 9da3a03..a34cad2 100644
  	/* The PCS registers are accessed using mmio. The underlying APB3
  	 * management interface uses indirect addressing to access the MMD
  	 * register sets. This requires accessing of the PCS register in two
-diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c
-index 2349ea9..a04b18b 100644
---- a/drivers/net/ethernet/amd/xgbe/xgbe-drv.c
-+++ b/drivers/net/ethernet/amd/xgbe/xgbe-drv.c
-@@ -425,6 +425,9 @@ void xgbe_get_all_hw_features(struct xgbe_prv_data *pdata)
- 	hw_feat->rx_ch_cnt++;
- 	hw_feat->tx_ch_cnt++;
- 
-+	/* A0 does not support NUMTC, hardcode it for now */
-+	hw_feat->tc_cnt = XGBE_TC_CNT;
-+
- 	DBGPR("<--xgbe_get_all_hw_features\n");
- }
- 
 diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-main.c b/drivers/net/ethernet/amd/xgbe/xgbe-main.c
-index f5a8fa0..338c0ed 100644
+index dbd3850..74be78e 100644
 --- a/drivers/net/ethernet/amd/xgbe/xgbe-main.c
 +++ b/drivers/net/ethernet/amd/xgbe/xgbe-main.c
 @@ -124,6 +124,7 @@
@@ -9434,7 +3575,7 @@ index f5a8fa0..338c0ed 100644
  
  #include "xgbe.h"
  #include "xgbe-common.h"
-@@ -215,6 +216,205 @@ static void xgbe_init_all_fptrs(struct xgbe_prv_data *pdata)
+@@ -161,6 +162,205 @@ static void xgbe_init_all_fptrs(struct xgbe_prv_data *pdata)
  	xgbe_init_function_ptrs_desc(&pdata->desc_if);
  }
  
@@ -9640,16 +3781,7 @@ index f5a8fa0..338c0ed 100644
  static int xgbe_probe(struct platform_device *pdev)
  {
  	struct xgbe_prv_data *pdata;
-@@ -222,8 +422,6 @@ static int xgbe_probe(struct platform_device *pdev)
- 	struct xgbe_desc_if *desc_if;
- 	struct net_device *netdev;
- 	struct device *dev = &pdev->dev;
--	struct resource *res;
--	const u8 *mac_addr;
- 	int ret;
- 
- 	DBGPR("--> xgbe_probe\n");
-@@ -239,6 +437,7 @@ static int xgbe_probe(struct platform_device *pdev)
+@@ -186,6 +386,7 @@ static int xgbe_probe(struct platform_device *pdev)
  	pdata = netdev_priv(netdev);
  	pdata->netdev = netdev;
  	pdata->pdev = pdev;
@@ -9657,7 +3789,7 @@ index f5a8fa0..338c0ed 100644
  	pdata->dev = dev;
  	platform_set_drvdata(pdev, netdev);
  
-@@ -264,40 +463,13 @@ static int xgbe_probe(struct platform_device *pdev)
+@@ -212,40 +413,13 @@ static int xgbe_probe(struct platform_device *pdev)
  		goto err_io;
  	}
  
@@ -9704,34 +3836,20 @@ index f5a8fa0..338c0ed 100644
  
  	/* Set the DMA mask */
  	if (!dev->dma_mask)
-@@ -308,23 +480,16 @@ static int xgbe_probe(struct platform_device *pdev)
- 		goto err_io;
- 	}
- 
--	if (of_property_read_bool(dev->of_node, "dma-coherent")) {
--		pdata->axdomain = XGBE_DMA_OS_AXDOMAIN;
--		pdata->arcache = XGBE_DMA_OS_ARCACHE;
--		pdata->awcache = XGBE_DMA_OS_AWCACHE;
--	} else {
--		pdata->axdomain = XGBE_DMA_SYS_AXDOMAIN;
--		pdata->arcache = XGBE_DMA_SYS_ARCACHE;
--		pdata->awcache = XGBE_DMA_SYS_AWCACHE;
--	}
--
-+	/* Get the device interrupt */
- 	ret = platform_get_irq(pdev, 0);
- 	if (ret < 0) {
- 		dev_err(dev, "platform_get_irq failed\n");
+@@ -275,10 +449,12 @@ static int xgbe_probe(struct platform_device *pdev)
+ 		dev_err(dev, "platform_get_irq 0 failed\n");
  		goto err_io;
  	}
 +
- 	netdev->irq = ret;
+ 	pdata->dev_irq = ret;
+ 
+ 	netdev->irq = pdata->dev_irq;
  	netdev->base_addr = (unsigned long)pdata->xgmac_regs;
 +	memcpy(netdev->dev_addr, pdata->mac_addr, netdev->addr_len);
  
  	/* Set all the function pointers */
  	xgbe_init_all_fptrs(pdata);
-@@ -337,23 +502,6 @@ static int xgbe_probe(struct platform_device *pdev)
+@@ -291,23 +467,6 @@ static int xgbe_probe(struct platform_device *pdev)
  	/* Populate the hardware features */
  	xgbe_get_all_hw_features(pdata);
  
@@ -9755,7 +3873,7 @@ index f5a8fa0..338c0ed 100644
  	/* Set default configuration data */
  	xgbe_default_config(pdata);
  
-@@ -531,10 +679,22 @@ static int xgbe_resume(struct device *dev)
+@@ -491,10 +650,22 @@ static int xgbe_resume(struct device *dev)
  }
  #endif /* CONFIG_PM */
  
@@ -9778,7 +3896,7 @@ index f5a8fa0..338c0ed 100644
  
  MODULE_DEVICE_TABLE(of, xgbe_of_match);
  static SIMPLE_DEV_PM_OPS(xgbe_pm_ops, xgbe_suspend, xgbe_resume);
-@@ -542,7 +702,12 @@ static SIMPLE_DEV_PM_OPS(xgbe_pm_ops, xgbe_suspend, xgbe_resume);
+@@ -502,7 +673,12 @@ static SIMPLE_DEV_PM_OPS(xgbe_pm_ops, xgbe_suspend, xgbe_resume);
  static struct platform_driver xgbe_driver = {
  	.driver = {
  		.name = "amd-xgbe",
@@ -9885,12 +4003,12 @@ index a1bf9d1c..fa67203 100644
  	/* Setup the timecounter */
  	cc->read = xgbe_cc_read;
 diff --git a/drivers/net/ethernet/amd/xgbe/xgbe.h b/drivers/net/ethernet/amd/xgbe/xgbe.h
-index 789957d..59498eb 100644
+index f9ec762..6f3a39e 100644
 --- a/drivers/net/ethernet/amd/xgbe/xgbe.h
 +++ b/drivers/net/ethernet/amd/xgbe/xgbe.h
-@@ -172,6 +172,12 @@
- #define XGBE_DMA_CLOCK		"dma_clk"
+@@ -187,6 +187,12 @@
  #define XGBE_PTP_CLOCK		"ptp_clk"
+ #define XGBE_DMA_IRQS		"amd,per-channel-interrupt"
  
 +/* ACPI property names */
 +#define XGBE_ACPI_MAC_ADDR	"mac-address"
@@ -9901,7 +4019,7 @@ index 789957d..59498eb 100644
  /* Timestamp support - values based on 50MHz PTP clock
   *   50MHz => 20 nsec
   */
-@@ -186,8 +192,11 @@
+@@ -201,8 +207,11 @@
  #define XGBE_FIFO_SIZE_B(x)	(x)
  #define XGBE_FIFO_SIZE_KB(x)	(x * 1024)
  
@@ -9913,7 +4031,7 @@ index 789957d..59498eb 100644
  /* Helper macro for descriptor handling
   *  Always use XGBE_GET_DESC_DATA to access the descriptor data
   *  since the index is free-running and needs to be and-ed
-@@ -569,6 +578,7 @@ struct xgbe_hw_features {
+@@ -650,6 +659,7 @@ struct xgbe_hw_features {
  struct xgbe_prv_data {
  	struct net_device *netdev;
  	struct platform_device *pdev;
@@ -9921,7 +4039,7 @@ index 789957d..59498eb 100644
  	struct device *dev;
  
  	/* XGMAC/XPCS related mmio registers */
-@@ -649,6 +659,7 @@ struct xgbe_prv_data {
+@@ -739,6 +749,7 @@ struct xgbe_prv_data {
  	unsigned int phy_rx_pause;
  
  	/* Netdev related settings */
@@ -9929,7 +4047,7 @@ index 789957d..59498eb 100644
  	netdev_features_t netdev_features;
  	struct napi_struct napi;
  	struct xgbe_mmc_stats mmc_stats;
-@@ -658,7 +669,9 @@ struct xgbe_prv_data {
+@@ -748,7 +759,9 @@ struct xgbe_prv_data {
  
  	/* Device clocks */
  	struct clk *sysclk;
@@ -10047,7 +4165,7 @@ index 7ba83ff..29aad5e 100644
  		netdev_err(ndev, "Failed to register MDIO bus\n");
  		mdiobus_free(mdio_bus);
 diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_main.c b/drivers/net/ethernet/apm/xgene/xgene_enet_main.c
-index 1236696..f66598a 100644
+index 83a5028..f66598a 100644
 --- a/drivers/net/ethernet/apm/xgene/xgene_enet_main.c
 +++ b/drivers/net/ethernet/apm/xgene/xgene_enet_main.c
 @@ -746,6 +746,42 @@ static const struct net_device_ops xgene_ndev_ops = {
@@ -10093,34 +4211,46 @@ index 1236696..f66598a 100644
  static int xgene_enet_get_resources(struct xgene_enet_pdata *pdata)
  {
  	struct platform_device *pdev;
-@@ -761,6 +797,8 @@ static int xgene_enet_get_resources(struct xgene_enet_pdata *pdata)
+@@ -761,6 +797,12 @@ static int xgene_enet_get_resources(struct xgene_enet_pdata *pdata)
  	ndev = pdata->ndev;
  
  	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "enet_csr");
 +	if (!res)
 +		res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
- 	if (!res) {
- 		dev_err(dev, "Resource enet_csr not defined\n");
- 		return -ENODEV;
-@@ -772,6 +810,8 @@ static int xgene_enet_get_resources(struct xgene_enet_pdata *pdata)
++	if (!res) {
++		dev_err(dev, "Resource enet_csr not defined\n");
++		return -ENODEV;
++	}
+ 	pdata->base_addr = devm_ioremap_resource(dev, res);
+ 	if (IS_ERR(pdata->base_addr)) {
+ 		dev_err(dev, "Unable to retrieve ENET Port CSR region\n");
+@@ -768,6 +810,12 @@ static int xgene_enet_get_resources(struct xgene_enet_pdata *pdata)
  	}
  
  	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "ring_csr");
 +	if (!res)
 +		res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
- 	if (!res) {
- 		dev_err(dev, "Resource ring_csr not defined\n");
- 		return -ENODEV;
-@@ -783,6 +823,8 @@ static int xgene_enet_get_resources(struct xgene_enet_pdata *pdata)
++	if (!res) {
++		dev_err(dev, "Resource ring_csr not defined\n");
++		return -ENODEV;
++	}
+ 	pdata->ring_csr_addr = devm_ioremap_resource(dev, res);
+ 	if (IS_ERR(pdata->ring_csr_addr)) {
+ 		dev_err(dev, "Unable to retrieve ENET Ring CSR region\n");
+@@ -775,6 +823,12 @@ static int xgene_enet_get_resources(struct xgene_enet_pdata *pdata)
  	}
  
  	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "ring_cmd");
 +	if (!res)
 +		res = platform_get_resource(pdev, IORESOURCE_MEM, 2);
- 	if (!res) {
- 		dev_err(dev, "Resource ring_cmd not defined\n");
- 		return -ENODEV;
-@@ -804,11 +846,13 @@ static int xgene_enet_get_resources(struct xgene_enet_pdata *pdata)
++	if (!res) {
++		dev_err(dev, "Resource ring_cmd not defined\n");
++		return -ENODEV;
++	}
+ 	pdata->ring_cmd_addr = devm_ioremap_resource(dev, res);
+ 	if (IS_ERR(pdata->ring_cmd_addr)) {
+ 		dev_err(dev, "Unable to retrieve ENET Ring command region\n");
+@@ -792,11 +846,13 @@ static int xgene_enet_get_resources(struct xgene_enet_pdata *pdata)
  	mac = of_get_mac_address(dev->of_node);
  	if (mac)
  		memcpy(ndev->dev_addr, mac, ndev->addr_len);
@@ -10135,7 +4265,7 @@ index 1236696..f66598a 100644
  	if (pdata->phy_mode < 0) {
  		dev_err(dev, "Unable to get phy-connection-type\n");
  		return pdata->phy_mode;
-@@ -821,11 +865,12 @@ static int xgene_enet_get_resources(struct xgene_enet_pdata *pdata)
+@@ -809,11 +865,12 @@ static int xgene_enet_get_resources(struct xgene_enet_pdata *pdata)
  	}
  
  	pdata->clk = devm_clk_get(&pdev->dev, NULL);
@@ -10152,7 +4282,7 @@ index 1236696..f66598a 100644
  	}
  
  	base_addr = pdata->base_addr;
-@@ -875,7 +920,7 @@ static int xgene_enet_init_hw(struct xgene_enet_pdata *pdata)
+@@ -863,7 +920,7 @@ static int xgene_enet_init_hw(struct xgene_enet_pdata *pdata)
  	pdata->port_ops->cle_bypass(pdata, dst_ring_num, buf_pool->id);
  	pdata->mac_ops->init(pdata);
  
@@ -10161,7 +4291,7 @@ index 1236696..f66598a 100644
  }
  
  static void xgene_enet_setup_ops(struct xgene_enet_pdata *pdata)
-@@ -936,7 +981,7 @@ static int xgene_enet_probe(struct platform_device *pdev)
+@@ -924,7 +981,7 @@ static int xgene_enet_probe(struct platform_device *pdev)
  		goto err;
  	}
  
@@ -10170,7 +4300,7 @@ index 1236696..f66598a 100644
  	if (ret) {
  		netdev_err(ndev, "No usable DMA configuration\n");
  		goto err;
-@@ -984,6 +1029,14 @@ static int xgene_enet_remove(struct platform_device *pdev)
+@@ -972,6 +1029,14 @@ static int xgene_enet_remove(struct platform_device *pdev)
  	return 0;
  }
  
@@ -10185,7 +4315,7 @@ index 1236696..f66598a 100644
  static struct of_device_id xgene_enet_match[] = {
  	{.compatible = "apm,xgene-enet",},
  	{},
-@@ -995,6 +1048,7 @@ static struct platform_driver xgene_enet_driver = {
+@@ -983,6 +1048,7 @@ static struct platform_driver xgene_enet_driver = {
  	.driver = {
  		   .name = "xgene-enet",
  		   .of_match_table = xgene_enet_match,
@@ -10206,7 +4336,7 @@ index f9958fa..0e06cad 100644
  
  #define XGENE_DRV_VERSION	"v1.0"
 diff --git a/drivers/net/ethernet/smsc/smc91x.c b/drivers/net/ethernet/smsc/smc91x.c
-index 6cc3cf6..91c36a2 100644
+index 88a55f9..944b177 100644
 --- a/drivers/net/ethernet/smsc/smc91x.c
 +++ b/drivers/net/ethernet/smsc/smc91x.c
 @@ -82,6 +82,7 @@ static const char version[] =
@@ -10232,29 +4362,16 @@ index 6cc3cf6..91c36a2 100644
  static struct platform_driver smc_driver = {
  	.probe		= smc_drv_probe,
  	.remove		= smc_drv_remove,
-@@ -2475,6 +2484,7 @@ static struct platform_driver smc_driver = {
- 		.owner	= THIS_MODULE,
+@@ -2474,6 +2483,7 @@ static struct platform_driver smc_driver = {
+ 		.name	= CARDNAME,
  		.pm	= &smc_drv_pm_ops,
  		.of_match_table = of_match_ptr(smc91x_match),
 +		.acpi_match_table = ACPI_PTR(smc91x_acpi_match),
  	},
  };
  
-diff --git a/drivers/net/phy/Kconfig b/drivers/net/phy/Kconfig
-index 75472cf7..bacafe2 100644
---- a/drivers/net/phy/Kconfig
-+++ b/drivers/net/phy/Kconfig
-@@ -26,7 +26,7 @@ config AMD_PHY
- 
- config AMD_XGBE_PHY
- 	tristate "Driver for the AMD 10GbE (amd-xgbe) PHYs"
--	depends on OF
-+	depends on OF || ACPI
- 	---help---
- 	  Currently supports the AMD 10GbE PHY
- 
 diff --git a/drivers/net/phy/amd-xgbe-phy.c b/drivers/net/phy/amd-xgbe-phy.c
-index c456559..d852c6e 100644
+index 903dc3d..fcc4fc7 100644
 --- a/drivers/net/phy/amd-xgbe-phy.c
 +++ b/drivers/net/phy/amd-xgbe-phy.c
 @@ -74,15 +74,19 @@
@@ -10962,7 +5079,7 @@ index c456559..d852c6e 100644
  			netdev_info(phydev->attached_dev, "%s successful\n",
  				    an_supported ? "Auto negotiation"
  						 : "Parallel detection");
-@@ -1069,6 +1010,7 @@ static int amd_xgbe_phy_config_aneg(struct phy_device *phydev)
+@@ -1070,6 +1011,7 @@ static int amd_xgbe_phy_config_aneg(struct phy_device *phydev)
  {
  	struct amd_xgbe_phy_priv *priv = phydev->priv;
  	u32 mmd_mask = phydev->c45_ids.devices_in_package;
@@ -10970,7 +5087,7 @@ index c456559..d852c6e 100644
  
  	if (phydev->autoneg != AUTONEG_ENABLE)
  		return amd_xgbe_phy_setup_forced(phydev);
-@@ -1077,6 +1019,11 @@ static int amd_xgbe_phy_config_aneg(struct phy_device *phydev)
+@@ -1078,6 +1020,11 @@ static int amd_xgbe_phy_config_aneg(struct phy_device *phydev)
  	if (!(mmd_mask & MDIO_DEVS_AN))
  		return -EINVAL;
  
@@ -10982,7 +5099,7 @@ index c456559..d852c6e 100644
  	/* Start/Restart the auto-negotiation state machine */
  	mutex_lock(&priv->an_mutex);
  	priv->an_result = AMD_XGBE_AN_READY;
-@@ -1166,14 +1113,18 @@ static int amd_xgbe_phy_read_status(struct phy_device *phydev)
+@@ -1167,14 +1114,18 @@ static int amd_xgbe_phy_read_status(struct phy_device *phydev)
  {
  	struct amd_xgbe_phy_priv *priv = phydev->priv;
  	u32 mmd_mask = phydev->c45_ids.devices_in_package;
@@ -11004,7 +5121,7 @@ index c456559..d852c6e 100644
  		if (!(mmd_mask & MDIO_DEVS_AN))
  			return -EINVAL;
  
-@@ -1204,39 +1155,40 @@ static int amd_xgbe_phy_read_status(struct phy_device *phydev)
+@@ -1205,39 +1156,40 @@ static int amd_xgbe_phy_read_status(struct phy_device *phydev)
  		ad_ret &= lp_ret;
  		if (ad_ret & 0x80) {
  			phydev->speed = SPEED_10000;
@@ -11065,7 +5182,7 @@ index c456559..d852c6e 100644
  		}
  		phydev->duplex = DUPLEX_FULL;
  		phydev->pause = 0;
-@@ -1288,29 +1240,188 @@ unlock:
+@@ -1289,29 +1241,188 @@ unlock:
  	return ret;
  }
  
@@ -11266,7 +5383,7 @@ index c456559..d852c6e 100644
  
  	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
  	if (!priv) {
-@@ -1318,86 +1429,54 @@ static int amd_xgbe_phy_probe(struct phy_device *phydev)
+@@ -1319,86 +1430,54 @@ static int amd_xgbe_phy_probe(struct phy_device *phydev)
  		goto err_name;
  	}
  
@@ -11375,7 +5492,7 @@ index c456559..d852c6e 100644
  
  err_priv:
  	devm_kfree(dev, priv);
-@@ -1405,9 +1484,6 @@ err_priv:
+@@ -1406,9 +1485,6 @@ err_priv:
  err_name:
  	kfree(wq_name);
  
@@ -11385,7 +5502,7 @@ index c456559..d852c6e 100644
  	return ret;
  }
  
-@@ -1424,18 +1500,7 @@ static void amd_xgbe_phy_remove(struct phy_device *phydev)
+@@ -1425,18 +1501,7 @@ static void amd_xgbe_phy_remove(struct phy_device *phydev)
  	flush_workqueue(priv->an_workqueue);
  	destroy_workqueue(priv->an_workqueue);
  
@@ -11405,52 +5522,8 @@ index c456559..d852c6e 100644
  
  	devm_kfree(dev, priv);
  }
-diff --git a/drivers/of/base.c b/drivers/of/base.c
-index 3823edf..4c2ccde 100644
---- a/drivers/of/base.c
-+++ b/drivers/of/base.c
-@@ -1250,6 +1250,39 @@ int of_property_read_u64(const struct device_node *np, const char *propname,
- EXPORT_SYMBOL_GPL(of_property_read_u64);
- 
- /**
-+ * of_property_read_u64_array - Find and read an array of 64 bit integers
-+ * from a property.
-+ *
-+ * @np:		device node from which the property value is to be read.
-+ * @propname:	name of the property to be searched.
-+ * @out_values:	pointer to return value, modified only if return value is 0.
-+ * @sz:		number of array elements to read
-+ *
-+ * Search for a property in a device node and read 64-bit value(s) from
-+ * it. Returns 0 on success, -EINVAL if the property does not exist,
-+ * -ENODATA if property does not have a value, and -EOVERFLOW if the
-+ * property data isn't large enough.
-+ *
-+ * The out_values is modified only if a valid u64 value can be decoded.
-+ */
-+int of_property_read_u64_array(const struct device_node *np,
-+			       const char *propname, u64 *out_values,
-+			       size_t sz)
-+{
-+	const __be32 *val = of_find_property_value_of_size(np, propname,
-+						(sz * sizeof(*out_values)));
-+
-+	if (IS_ERR(val))
-+		return PTR_ERR(val);
-+
-+	while (sz--) {
-+		*out_values++ = of_read_number(val, 2);
-+		val += 2;
-+	}
-+	return 0;
-+}
-+
-+/**
-  * of_property_read_string - Find and read a string from a property
-  * @np:		device node from which the property value is to be read.
-  * @propname:	name of the property to be searched.
 diff --git a/drivers/pci/host/pci-xgene.c b/drivers/pci/host/pci-xgene.c
-index 2988fe1..9029d59c 100644
+index b1d0596..06b8f97 100644
 --- a/drivers/pci/host/pci-xgene.c
 +++ b/drivers/pci/host/pci-xgene.c
 @@ -29,6 +29,7 @@
@@ -12052,10 +6125,10 @@ index 0000000..0f44624
 +
 +MODULE_LICENSE("GPL v2");
 diff --git a/drivers/tty/serial/8250/8250_dw.c b/drivers/tty/serial/8250/8250_dw.c
-index beea6ca..7038a2d 100644
+index 555de07..3991aa0 100644
 --- a/drivers/tty/serial/8250/8250_dw.c
 +++ b/drivers/tty/serial/8250/8250_dw.c
-@@ -310,10 +310,18 @@ static int dw8250_probe_of(struct uart_port *p,
+@@ -351,10 +351,18 @@ static int dw8250_probe_of(struct uart_port *p,
  static int dw8250_probe_acpi(struct uart_8250_port *up,
  			     struct dw8250_data *data)
  {
@@ -12074,7 +6147,7 @@ index beea6ca..7038a2d 100644
  	p->iotype = UPIO_MEM32;
  	p->serial_in = dw8250_serial_in32;
  	p->serial_out = dw8250_serial_out32;
-@@ -536,6 +544,7 @@ static const struct acpi_device_id dw8250_acpi_match[] = {
+@@ -577,6 +585,7 @@ static const struct acpi_device_id dw8250_acpi_match[] = {
  	{ "INT3435", 0 },
  	{ "80860F0A", 0 },
  	{ "8086228A", 0 },
@@ -12083,7 +6156,7 @@ index beea6ca..7038a2d 100644
  };
  MODULE_DEVICE_TABLE(acpi, dw8250_acpi_match);
 diff --git a/drivers/virtio/virtio_mmio.c b/drivers/virtio/virtio_mmio.c
-index ef9a165..9f1939c 100644
+index 00d115b..cd9b974 100644
 --- a/drivers/virtio/virtio_mmio.c
 +++ b/drivers/virtio/virtio_mmio.c
 @@ -100,8 +100,7 @@
@@ -12096,7 +6169,7 @@ index ef9a165..9f1939c 100644
  
  /* The alignment to use between consumer and producer parts of vring.
   * Currently hardcoded to the page size. */
-@@ -634,6 +633,14 @@ static struct of_device_id virtio_mmio_match[] = {
+@@ -635,12 +634,21 @@ static struct of_device_id virtio_mmio_match[] = {
  };
  MODULE_DEVICE_TABLE(of, virtio_mmio_match);
  
@@ -12111,39 +6184,18 @@ index ef9a165..9f1939c 100644
  static struct platform_driver virtio_mmio_driver = {
  	.probe		= virtio_mmio_probe,
  	.remove		= virtio_mmio_remove,
-@@ -641,6 +648,7 @@ static struct platform_driver virtio_mmio_driver = {
+ 	.driver		= {
  		.name	= "virtio-mmio",
- 		.owner	= THIS_MODULE,
  		.of_match_table	= virtio_mmio_match,
 +		.acpi_match_table = ACPI_PTR(virtio_mmio_acpi_match),
  	},
  };
  
-diff --git a/drivers/xen/efi.c b/drivers/xen/efi.c
-index 1f850c9..f745db2 100644
---- a/drivers/xen/efi.c
-+++ b/drivers/xen/efi.c
-@@ -294,6 +294,7 @@ static const struct efi efi_xen __initconst = {
- 	.acpi                     = EFI_INVALID_TABLE_ADDR,
- 	.acpi20                   = EFI_INVALID_TABLE_ADDR,
- 	.smbios                   = EFI_INVALID_TABLE_ADDR,
-+	.smbios3                  = EFI_INVALID_TABLE_ADDR,
- 	.sal_systab               = EFI_INVALID_TABLE_ADDR,
- 	.boot_info                = EFI_INVALID_TABLE_ADDR,
- 	.hcdp                     = EFI_INVALID_TABLE_ADDR,
 diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h
-index f34a083..04d02fc 100644
+index 61e32ec..1fec6f5 100644
 --- a/include/acpi/acpi_bus.h
 +++ b/include/acpi/acpi_bus.h
-@@ -27,6 +27,7 @@
- #define __ACPI_BUS_H__
- 
- #include <linux/device.h>
-+#include <linux/property.h>
- 
- /* TBD: Make dynamic */
- #define ACPI_MAX_HANDLES	10
-@@ -68,6 +69,8 @@ bool acpi_check_dsm(acpi_handle handle, const u8 *uuid, int rev, u64 funcs);
+@@ -69,6 +69,8 @@ bool acpi_check_dsm(acpi_handle handle, const u8 *uuid, int rev, u64 funcs);
  union acpi_object *acpi_evaluate_dsm(acpi_handle handle, const u8 *uuid,
  			int rev, int func, union acpi_object *argv4);
  
@@ -12152,61 +6204,6 @@ index f34a083..04d02fc 100644
  static inline union acpi_object *
  acpi_evaluate_dsm_typed(acpi_handle handle, const u8 *uuid, int rev, int func,
  			union acpi_object *argv4, acpi_object_type type)
-@@ -337,10 +340,20 @@ struct acpi_device_physical_node {
- 	bool put_online:1;
- };
- 
-+/* ACPI Device Specific Data (_DSD) */
-+struct acpi_device_data {
-+	const union acpi_object *pointer;
-+	const union acpi_object *properties;
-+	const union acpi_object *of_compatible;
-+};
-+
-+struct acpi_gpio_mapping;
-+
- /* Device */
- struct acpi_device {
- 	int device_type;
- 	acpi_handle handle;		/* no handle for fixed hardware */
-+	struct fwnode_handle fwnode;
- 	struct acpi_device *parent;
- 	struct list_head children;
- 	struct list_head node;
-@@ -353,9 +366,11 @@ struct acpi_device {
- 	struct acpi_device_wakeup wakeup;
- 	struct acpi_device_perf performance;
- 	struct acpi_device_dir dir;
-+	struct acpi_device_data data;
- 	struct acpi_scan_handler *handler;
- 	struct acpi_hotplug_context *hp;
- 	struct acpi_driver *driver;
-+	const struct acpi_gpio_mapping *driver_gpios;
- 	void *driver_data;
- 	struct device dev;
- 	unsigned int physical_node_count;
-@@ -364,6 +379,21 @@ struct acpi_device {
- 	void (*remove)(struct acpi_device *);
- };
- 
-+static inline bool is_acpi_node(struct fwnode_handle *fwnode)
-+{
-+	return fwnode && fwnode->type == FWNODE_ACPI;
-+}
-+
-+static inline struct acpi_device *acpi_node(struct fwnode_handle *fwnode)
-+{
-+	return fwnode ? container_of(fwnode, struct acpi_device, fwnode) : NULL;
-+}
-+
-+static inline struct fwnode_handle *acpi_fwnode_handle(struct acpi_device *adev)
-+{
-+	return &adev->fwnode;
-+}
-+
- static inline void *acpi_driver_data(struct acpi_device *d)
- {
- 	return d->driver_data;
 diff --git a/include/acpi/acpi_io.h b/include/acpi/acpi_io.h
 index 444671e..9d573db 100644
 --- a/include/acpi/acpi_io.h
@@ -12230,10 +6227,10 @@ index 444671e..9d573db 100644
  }
  
 diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
-index aa70cbd..1261fef 100644
+index bee5d68..140d514 100644
 --- a/include/asm-generic/vmlinux.lds.h
 +++ b/include/asm-generic/vmlinux.lds.h
-@@ -275,6 +275,13 @@
+@@ -276,6 +276,13 @@
  		VMLINUX_SYMBOL(__end_pci_fixups_suspend_late) = .;	\
  	}								\
  									\
@@ -12248,12 +6245,12 @@ index aa70cbd..1261fef 100644
  	.builtin_fw        : AT(ADDR(.builtin_fw) - LOAD_OFFSET) {	\
  		VMLINUX_SYMBOL(__start_builtin_fw) = .;			\
 diff --git a/include/kvm/arm_vgic.h b/include/kvm/arm_vgic.h
-index 206dcc3..660dbfc 100644
+index ac4888d..d68268d 100644
 --- a/include/kvm/arm_vgic.h
 +++ b/include/kvm/arm_vgic.h
-@@ -289,17 +289,19 @@ bool vgic_handle_mmio(struct kvm_vcpu *vcpu, struct kvm_run *run,
- #define irqchip_in_kernel(k)	(!!((k)->arch.vgic.in_kernel))
- #define vgic_initialized(k)	((k)->arch.vgic.ready)
+@@ -290,17 +290,19 @@ bool vgic_handle_mmio(struct kvm_vcpu *vcpu, struct kvm_run *run,
+ #define vgic_initialized(k)	(!!((k)->arch.vgic.nr_cpus))
+ #define vgic_ready(k)		((k)->arch.vgic.ready)
  
 -int vgic_v2_probe(struct device_node *vgic_node,
 -		  const struct vgic_ops **ops,
@@ -12281,18 +6278,10 @@ index 206dcc3..660dbfc 100644
  	return -ENODEV;
  }
 diff --git a/include/linux/acpi.h b/include/linux/acpi.h
-index 407a12f..de81de3 100644
+index 856d381..13e6200 100644
 --- a/include/linux/acpi.h
 +++ b/include/linux/acpi.h
-@@ -28,6 +28,7 @@
- #include <linux/errno.h>
- #include <linux/ioport.h>	/* for struct resource */
- #include <linux/device.h>
-+#include <linux/property.h>
- 
- #ifndef _LINUX
- #define _LINUX
-@@ -71,6 +72,7 @@ enum acpi_irq_model_id {
+@@ -72,6 +72,7 @@ enum acpi_irq_model_id {
  	ACPI_IRQ_MODEL_IOAPIC,
  	ACPI_IRQ_MODEL_IOSAPIC,
  	ACPI_IRQ_MODEL_PLATFORM,
@@ -12300,171 +6289,6 @@ index 407a12f..de81de3 100644
  	ACPI_IRQ_MODEL_COUNT
  };
  
-@@ -123,6 +125,10 @@ int acpi_numa_init (void);
- 
- int acpi_table_init (void);
- int acpi_table_parse(char *id, acpi_tbl_table_handler handler);
-+int __init acpi_parse_entries(unsigned long table_size,
-+			      acpi_tbl_entry_handler handler,
-+			      struct acpi_table_header *table_header,
-+			      int entry_id, unsigned int max_entries);
- int __init acpi_table_parse_entries(char *id, unsigned long table_size,
- 				    int entry_id,
- 				    acpi_tbl_entry_handler handler,
-@@ -423,12 +429,8 @@ extern int acpi_nvs_for_each_region(int (*func)(__u64, __u64, void *),
- const struct acpi_device_id *acpi_match_device(const struct acpi_device_id *ids,
- 					       const struct device *dev);
- 
--static inline bool acpi_driver_match_device(struct device *dev,
--					    const struct device_driver *drv)
--{
--	return !!acpi_match_device(drv->acpi_match_table, dev);
--}
--
-+extern bool acpi_driver_match_device(struct device *dev,
-+				     const struct device_driver *drv);
- int acpi_device_uevent_modalias(struct device *, struct kobj_uevent_env *);
- int acpi_device_modalias(struct device *, char *, int);
- 
-@@ -443,6 +445,23 @@ struct platform_device *acpi_create_platform_device(struct acpi_device *);
- #define ACPI_COMPANION_SET(dev, adev)	do { } while (0)
- #define ACPI_HANDLE(dev)		(NULL)
- 
-+struct fwnode_handle;
-+
-+static inline bool is_acpi_node(struct fwnode_handle *fwnode)
-+{
-+	return false;
-+}
-+
-+static inline struct acpi_device *acpi_node(struct fwnode_handle *fwnode)
-+{
-+	return NULL;
-+}
-+
-+static inline struct fwnode_handle *acpi_fwnode_handle(struct acpi_device *adev)
-+{
-+	return NULL;
-+}
-+
- static inline const char *acpi_dev_name(struct acpi_device *adev)
- {
- 	return NULL;
-@@ -659,4 +678,114 @@ do {									\
- #endif
- #endif
- 
-+struct acpi_gpio_params {
-+	unsigned int crs_entry_index;
-+	unsigned int line_index;
-+	bool active_low;
-+};
-+
-+struct acpi_gpio_mapping {
-+	const char *name;
-+	const struct acpi_gpio_params *data;
-+	unsigned int size;
-+};
-+
-+#if defined(CONFIG_ACPI) && defined(CONFIG_GPIOLIB)
-+int acpi_dev_add_driver_gpios(struct acpi_device *adev,
-+			      const struct acpi_gpio_mapping *gpios);
-+
-+static inline void acpi_dev_remove_driver_gpios(struct acpi_device *adev)
-+{
-+	if (adev)
-+		adev->driver_gpios = NULL;
-+}
-+#else
-+static inline int acpi_dev_add_driver_gpios(struct acpi_device *adev,
-+			      const struct acpi_gpio_mapping *gpios)
-+{
-+	return -ENXIO;
-+}
-+static inline void acpi_dev_remove_driver_gpios(struct acpi_device *adev) {}
-+#endif
-+
-+/* Device properties */
-+
-+#define MAX_ACPI_REFERENCE_ARGS	8
-+struct acpi_reference_args {
-+	struct acpi_device *adev;
-+	size_t nargs;
-+	u64 args[MAX_ACPI_REFERENCE_ARGS];
-+};
-+
-+#ifdef CONFIG_ACPI
-+int acpi_dev_get_property(struct acpi_device *adev, const char *name,
-+			  acpi_object_type type, const union acpi_object **obj);
-+int acpi_dev_get_property_array(struct acpi_device *adev, const char *name,
-+				acpi_object_type type,
-+				const union acpi_object **obj);
-+int acpi_dev_get_property_reference(struct acpi_device *adev,
-+				    const char *name, size_t index,
-+				    struct acpi_reference_args *args);
-+
-+int acpi_dev_prop_get(struct acpi_device *adev, const char *propname,
-+		      void **valptr);
-+int acpi_dev_prop_read_single(struct acpi_device *adev, const char *propname,
-+			      enum dev_prop_type proptype, void *val);
-+int acpi_dev_prop_read(struct acpi_device *adev, const char *propname,
-+		       enum dev_prop_type proptype, void *val, size_t nval);
-+
-+struct acpi_device *acpi_get_next_child(struct device *dev,
-+					struct acpi_device *child);
-+#else
-+static inline int acpi_dev_get_property(struct acpi_device *adev,
-+					const char *name, acpi_object_type type,
-+					const union acpi_object **obj)
-+{
-+	return -ENXIO;
-+}
-+static inline int acpi_dev_get_property_array(struct acpi_device *adev,
-+					      const char *name,
-+					      acpi_object_type type,
-+					      const union acpi_object **obj)
-+{
-+	return -ENXIO;
-+}
-+static inline int acpi_dev_get_property_reference(struct acpi_device *adev,
-+				const char *name, const char *cells_name,
-+				size_t index, struct acpi_reference_args *args)
-+{
-+	return -ENXIO;
-+}
-+
-+static inline int acpi_dev_prop_get(struct acpi_device *adev,
-+				    const char *propname,
-+				    void **valptr)
-+{
-+	return -ENXIO;
-+}
-+
-+static inline int acpi_dev_prop_read_single(struct acpi_device *adev,
-+					    const char *propname,
-+					    enum dev_prop_type proptype,
-+					    void *val)
-+{
-+	return -ENXIO;
-+}
-+
-+static inline int acpi_dev_prop_read(struct acpi_device *adev,
-+				     const char *propname,
-+				     enum dev_prop_type proptype,
-+				     void *val, size_t nval)
-+{
-+	return -ENXIO;
-+}
-+
-+static inline struct acpi_device *acpi_get_next_child(struct device *dev,
-+						      struct acpi_device *child)
-+{
-+	return NULL;
-+}
-+
-+#endif
-+
- #endif	/*_LINUX_ACPI_H*/
 diff --git a/include/linux/clocksource.h b/include/linux/clocksource.h
 index abcafaa..4f5caa1 100644
 --- a/include/linux/clocksource.h
@@ -12480,76 +6304,6 @@ index abcafaa..4f5caa1 100644
 +#endif
 +
  #endif /* _LINUX_CLOCKSOURCE_H */
-diff --git a/include/linux/efi.h b/include/linux/efi.h
-index 0949f9c..0238d61 100644
---- a/include/linux/efi.h
-+++ b/include/linux/efi.h
-@@ -547,6 +547,9 @@ void efi_native_runtime_setup(void);
- #define SMBIOS_TABLE_GUID    \
-     EFI_GUID(  0xeb9d2d31, 0x2d88, 0x11d3, 0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d )
- 
-+#define SMBIOS3_TABLE_GUID    \
-+    EFI_GUID(  0xf2fd1544, 0x9794, 0x4a2c, 0x99, 0x2e, 0xe5, 0xbb, 0xcf, 0x20, 0xe3, 0x94 )
-+
- #define SAL_SYSTEM_TABLE_GUID    \
-     EFI_GUID(  0xeb9d2d32, 0x2d88, 0x11d3, 0x9a, 0x16, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d )
- 
-@@ -810,7 +813,8 @@ extern struct efi {
- 	unsigned long mps;		/* MPS table */
- 	unsigned long acpi;		/* ACPI table  (IA64 ext 0.71) */
- 	unsigned long acpi20;		/* ACPI table  (ACPI 2.0) */
--	unsigned long smbios;		/* SM BIOS table */
-+	unsigned long smbios;		/* SMBIOS table (32 bit entry point) */
-+	unsigned long smbios3;		/* SMBIOS table (64 bit entry point) */
- 	unsigned long sal_systab;	/* SAL system table */
- 	unsigned long boot_info;	/* boot info table */
- 	unsigned long hcdp;		/* HCDP table */
-diff --git a/include/linux/gpio/consumer.h b/include/linux/gpio/consumer.h
-index 12f146f..00b1b70 100644
---- a/include/linux/gpio/consumer.h
-+++ b/include/linux/gpio/consumer.h
-@@ -94,6 +94,13 @@ int gpiod_to_irq(const struct gpio_desc *desc);
- struct gpio_desc *gpio_to_desc(unsigned gpio);
- int desc_to_gpio(const struct gpio_desc *desc);
- 
-+/* Child properties interface */
-+struct fwnode_handle;
-+
-+struct gpio_desc *fwnode_get_named_gpiod(struct fwnode_handle *fwnode,
-+					 const char *propname);
-+struct gpio_desc *devm_get_gpiod_from_child(struct device *dev,
-+					    struct fwnode_handle *child);
- #else /* CONFIG_GPIOLIB */
- 
- static inline struct gpio_desc *__must_check __gpiod_get(struct device *dev,
-diff --git a/include/linux/gpio_keys.h b/include/linux/gpio_keys.h
-index 8b62246..ee2d8c6 100644
---- a/include/linux/gpio_keys.h
-+++ b/include/linux/gpio_keys.h
-@@ -2,6 +2,7 @@
- #define _GPIO_KEYS_H
- 
- struct device;
-+struct gpio_desc;
- 
- /**
-  * struct gpio_keys_button - configuration parameters
-@@ -17,6 +18,7 @@ struct device;
-  *			disable button via sysfs
-  * @value:		axis value for %EV_ABS
-  * @irq:		Irq number in case of interrupt keys
-+ * @gpiod:		GPIO descriptor
-  */
- struct gpio_keys_button {
- 	unsigned int code;
-@@ -29,6 +31,7 @@ struct gpio_keys_button {
- 	bool can_disable;
- 	int value;
- 	unsigned int irq;
-+	struct gpio_desc *gpiod;
- };
- 
- /**
 diff --git a/include/linux/irqchip/arm-gic-acpi.h b/include/linux/irqchip/arm-gic-acpi.h
 new file mode 100644
 index 0000000..ad5b577
@@ -12588,7 +6342,7 @@ index 0000000..ad5b577
 +
 +#endif /* ARM_GIC_ACPI_H_ */
 diff --git a/include/linux/irqchip/arm-gic.h b/include/linux/irqchip/arm-gic.h
-index 13eed92..dc9cb5f 100644
+index 71d706d..5c55f37 100644
 --- a/include/linux/irqchip/arm-gic.h
 +++ b/include/linux/irqchip/arm-gic.h
 @@ -55,6 +55,8 @@
@@ -12600,131 +6354,11 @@ index 13eed92..dc9cb5f 100644
  #define GICH_HCR			0x0
  #define GICH_VTR			0x4
  #define GICH_VMCR			0x8
-diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h
-index a6059bd..e4d8f70 100644
---- a/include/linux/kvm_host.h
-+++ b/include/linux/kvm_host.h
-@@ -43,6 +43,7 @@
-  * include/linux/kvm_h.
-  */
- #define KVM_MEMSLOT_INVALID	(1UL << 16)
-+#define KVM_MEMSLOT_INCOHERENT	(1UL << 17)
- 
- /* Two fragments for cross MMIO pages. */
- #define KVM_MAX_MMIO_FRAGMENTS	2
-diff --git a/include/linux/leds.h b/include/linux/leds.h
-index a57611d..361101f 100644
---- a/include/linux/leds.h
-+++ b/include/linux/leds.h
-@@ -261,6 +261,7 @@ struct gpio_led {
- 	unsigned	retain_state_suspended : 1;
- 	unsigned	default_state : 2;
- 	/* default_state should be one of LEDS_GPIO_DEFSTATE_(ON|OFF|KEEP) */
-+	struct gpio_desc *gpiod;
- };
- #define LEDS_GPIO_DEFSTATE_OFF		0
- #define LEDS_GPIO_DEFSTATE_ON		1
-@@ -273,7 +274,7 @@ struct gpio_led_platform_data {
- #define GPIO_LED_NO_BLINK_LOW	0	/* No blink GPIO state low */
- #define GPIO_LED_NO_BLINK_HIGH	1	/* No blink GPIO state high */
- #define GPIO_LED_BLINK		2	/* Please, blink */
--	int		(*gpio_blink_set)(unsigned gpio, int state,
-+	int		(*gpio_blink_set)(struct gpio_desc *desc, int state,
- 					unsigned long *delay_on,
- 					unsigned long *delay_off);
- };
-diff --git a/include/linux/of.h b/include/linux/of.h
-index 29f0adc..cf79be1 100644
---- a/include/linux/of.h
-+++ b/include/linux/of.h
-@@ -23,6 +23,7 @@
- #include <linux/spinlock.h>
- #include <linux/topology.h>
- #include <linux/notifier.h>
-+#include <linux/property.h>
- 
- #include <asm/byteorder.h>
- #include <asm/errno.h>
-@@ -49,6 +50,7 @@ struct device_node {
- 	const char *type;
- 	phandle phandle;
- 	const char *full_name;
-+	struct fwnode_handle fwnode;
- 
- 	struct	property *properties;
- 	struct	property *deadprops;	/* removed properties */
-@@ -79,6 +81,7 @@ extern struct kobj_type of_node_ktype;
- static inline void of_node_init(struct device_node *node)
- {
- 	kobject_init(&node->kobj, &of_node_ktype);
-+	node->fwnode.type = FWNODE_OF;
- }
- 
- /* true when node is initialized */
-@@ -114,6 +117,16 @@ extern struct device_node *of_aliases;
- extern struct device_node *of_stdout;
- extern raw_spinlock_t devtree_lock;
- 
-+static inline bool is_of_node(struct fwnode_handle *fwnode)
-+{
-+	return fwnode && fwnode->type == FWNODE_OF;
-+}
-+
-+static inline struct device_node *of_node(struct fwnode_handle *fwnode)
-+{
-+	return fwnode ? container_of(fwnode, struct device_node, fwnode) : NULL;
-+}
-+
- static inline bool of_have_populated_dt(void)
- {
- 	return of_allnodes != NULL;
-@@ -263,6 +276,10 @@ extern int of_property_read_u32_array(const struct device_node *np,
- 				      size_t sz);
- extern int of_property_read_u64(const struct device_node *np,
- 				const char *propname, u64 *out_value);
-+extern int of_property_read_u64_array(const struct device_node *np,
-+				      const char *propname,
-+				      u64 *out_values,
-+				      size_t sz);
- 
- extern int of_property_read_string(struct device_node *np,
- 				   const char *propname,
-@@ -355,6 +372,16 @@ bool of_console_check(struct device_node *dn, char *name, int index);
- 
- #else /* CONFIG_OF */
- 
-+static inline bool is_of_node(struct fwnode_handle *fwnode)
-+{
-+	return false;
-+}
-+
-+static inline struct device_node *of_node(struct fwnode_handle *fwnode)
-+{
-+	return NULL;
-+}
-+
- static inline const char* of_node_full_name(const struct device_node *np)
- {
- 	return "<no-node>";
-@@ -477,6 +504,13 @@ static inline int of_property_read_u32_array(const struct device_node *np,
- 	return -ENOSYS;
- }
- 
-+static inline int of_property_read_u64_array(const struct device_node *np,
-+					     const char *propname,
-+					     u64 *out_values, size_t sz)
-+{
-+	return -ENOSYS;
-+}
-+
- static inline int of_property_read_string(struct device_node *np,
- 					  const char *propname,
- 					  const char **out_string)
 diff --git a/include/linux/pci.h b/include/linux/pci.h
-index 4c8ac5f..ea663d8 100644
+index 360a966..1476a66 100644
 --- a/include/linux/pci.h
 +++ b/include/linux/pci.h
-@@ -563,15 +563,6 @@ struct pci_ops {
+@@ -564,15 +564,6 @@ struct pci_ops {
  	int (*write)(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 val);
  };
  
@@ -12740,7 +6374,7 @@ index 4c8ac5f..ea663d8 100644
  struct pci_bus_region {
  	dma_addr_t start;
  	dma_addr_t end;
-@@ -1326,6 +1317,16 @@ typedef int (*arch_set_vga_state_t)(struct pci_dev *pdev, bool decode,
+@@ -1329,6 +1320,16 @@ typedef int (*arch_set_vga_state_t)(struct pci_dev *pdev, bool decode,
  		      unsigned int command_bits, u32 flags);
  void pci_register_set_vga_state(arch_set_vga_state_t func);
  
@@ -12757,7 +6391,7 @@ index 4c8ac5f..ea663d8 100644
  #else /* CONFIG_PCI is not enabled */
  
  /*
-@@ -1427,6 +1428,23 @@ static inline struct pci_dev *pci_get_bus_and_slot(unsigned int bus,
+@@ -1430,6 +1431,23 @@ static inline struct pci_dev *pci_get_bus_and_slot(unsigned int bus,
  						unsigned int devfn)
  { return NULL; }
  
@@ -12781,7 +6415,7 @@ index 4c8ac5f..ea663d8 100644
  static inline int pci_domain_nr(struct pci_bus *bus) { return 0; }
  static inline struct pci_dev *pci_dev_get(struct pci_dev *dev) { return NULL; }
  static inline int pci_get_new_domain_nr(void) { return -ENOSYS; }
-@@ -1636,7 +1654,6 @@ int pcibios_set_pcie_reset_state(struct pci_dev *dev,
+@@ -1639,7 +1657,6 @@ int pcibios_set_pcie_reset_state(struct pci_dev *dev,
  				 enum pcie_reset_state state);
  int pcibios_add_device(struct pci_dev *dev);
  void pcibios_release_device(struct pci_dev *dev);
@@ -12789,214 +6423,8 @@ index 4c8ac5f..ea663d8 100644
  
  #ifdef CONFIG_HIBERNATE_CALLBACKS
  extern struct dev_pm_ops pcibios_pm_ops;
-diff --git a/include/linux/property.h b/include/linux/property.h
-new file mode 100644
-index 0000000..a6a3d98
---- /dev/null
-+++ b/include/linux/property.h
-@@ -0,0 +1,143 @@
-+/*
-+ * property.h - Unified device property interface.
-+ *
-+ * Copyright (C) 2014, Intel Corporation
-+ * Authors: Rafael J. Wysocki <rafael.j.wysocki at intel.com>
-+ *          Mika Westerberg <mika.westerberg at linux.intel.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ */
-+
-+#ifndef _LINUX_PROPERTY_H_
-+#define _LINUX_PROPERTY_H_
-+
-+#include <linux/types.h>
-+
-+struct device;
-+
-+enum dev_prop_type {
-+	DEV_PROP_U8,
-+	DEV_PROP_U16,
-+	DEV_PROP_U32,
-+	DEV_PROP_U64,
-+	DEV_PROP_STRING,
-+	DEV_PROP_MAX,
-+};
-+
-+bool device_property_present(struct device *dev, const char *propname);
-+int device_property_read_u8_array(struct device *dev, const char *propname,
-+				  u8 *val, size_t nval);
-+int device_property_read_u16_array(struct device *dev, const char *propname,
-+				   u16 *val, size_t nval);
-+int device_property_read_u32_array(struct device *dev, const char *propname,
-+				   u32 *val, size_t nval);
-+int device_property_read_u64_array(struct device *dev, const char *propname,
-+				   u64 *val, size_t nval);
-+int device_property_read_string_array(struct device *dev, const char *propname,
-+				      const char **val, size_t nval);
-+int device_property_read_string(struct device *dev, const char *propname,
-+				const char **val);
-+
-+enum fwnode_type {
-+	FWNODE_INVALID = 0,
-+	FWNODE_OF,
-+	FWNODE_ACPI,
-+};
-+
-+struct fwnode_handle {
-+	enum fwnode_type type;
-+};
-+
-+bool fwnode_property_present(struct fwnode_handle *fwnode, const char *propname);
-+int fwnode_property_read_u8_array(struct fwnode_handle *fwnode,
-+				  const char *propname, u8 *val,
-+				  size_t nval);
-+int fwnode_property_read_u16_array(struct fwnode_handle *fwnode,
-+				   const char *propname, u16 *val,
-+				   size_t nval);
-+int fwnode_property_read_u32_array(struct fwnode_handle *fwnode,
-+				   const char *propname, u32 *val,
-+				   size_t nval);
-+int fwnode_property_read_u64_array(struct fwnode_handle *fwnode,
-+				   const char *propname, u64 *val,
-+				   size_t nval);
-+int fwnode_property_read_string_array(struct fwnode_handle *fwnode,
-+				      const char *propname, const char **val,
-+				      size_t nval);
-+int fwnode_property_read_string(struct fwnode_handle *fwnode,
-+				const char *propname, const char **val);
-+
-+struct fwnode_handle *device_get_next_child_node(struct device *dev,
-+						 struct fwnode_handle *child);
-+
-+#define device_for_each_child_node(dev, child) \
-+	for (child = device_get_next_child_node(dev, NULL); child; \
-+	     child = device_get_next_child_node(dev, child))
-+
-+void fwnode_handle_put(struct fwnode_handle *fwnode);
-+
-+unsigned int device_get_child_node_count(struct device *dev);
-+
-+static inline bool device_property_read_bool(struct device *dev,
-+					     const char *propname)
-+{
-+	return device_property_present(dev, propname);
-+}
-+
-+static inline int device_property_read_u8(struct device *dev,
-+					  const char *propname, u8 *val)
-+{
-+	return device_property_read_u8_array(dev, propname, val, 1);
-+}
-+
-+static inline int device_property_read_u16(struct device *dev,
-+					   const char *propname, u16 *val)
-+{
-+	return device_property_read_u16_array(dev, propname, val, 1);
-+}
-+
-+static inline int device_property_read_u32(struct device *dev,
-+					   const char *propname, u32 *val)
-+{
-+	return device_property_read_u32_array(dev, propname, val, 1);
-+}
-+
-+static inline int device_property_read_u64(struct device *dev,
-+					   const char *propname, u64 *val)
-+{
-+	return device_property_read_u64_array(dev, propname, val, 1);
-+}
-+
-+static inline bool fwnode_property_read_bool(struct fwnode_handle *fwnode,
-+					     const char *propname)
-+{
-+	return fwnode_property_present(fwnode, propname);
-+}
-+
-+static inline int fwnode_property_read_u8(struct fwnode_handle *fwnode,
-+					  const char *propname, u8 *val)
-+{
-+	return fwnode_property_read_u8_array(fwnode, propname, val, 1);
-+}
-+
-+static inline int fwnode_property_read_u16(struct fwnode_handle *fwnode,
-+					   const char *propname, u16 *val)
-+{
-+	return fwnode_property_read_u16_array(fwnode, propname, val, 1);
-+}
-+
-+static inline int fwnode_property_read_u32(struct fwnode_handle *fwnode,
-+					   const char *propname, u32 *val)
-+{
-+	return fwnode_property_read_u32_array(fwnode, propname, val, 1);
-+}
-+
-+static inline int fwnode_property_read_u64(struct fwnode_handle *fwnode,
-+					   const char *propname, u64 *val)
-+{
-+	return fwnode_property_read_u64_array(fwnode, propname, val, 1);
-+}
-+
-+#endif /* _LINUX_PROPERTY_H_ */
-diff --git a/net/rfkill/rfkill-gpio.c b/net/rfkill/rfkill-gpio.c
-index 0f62326..2a47179 100644
---- a/net/rfkill/rfkill-gpio.c
-+++ b/net/rfkill/rfkill-gpio.c
-@@ -63,6 +63,15 @@ static const struct rfkill_ops rfkill_gpio_ops = {
- 	.set_block = rfkill_gpio_set_power,
- };
- 
-+static const struct acpi_gpio_params reset_gpios = { 0, 0, false };
-+static const struct acpi_gpio_params shutdown_gpios = { 1, 0, false };
-+
-+static const struct acpi_gpio_mapping acpi_rfkill_default_gpios[] = {
-+	{ "reset-gpios", &reset_gpios, 1 },
-+	{ "shutdown-gpios", &shutdown_gpios, 1 },
-+	{ },
-+};
-+
- static int rfkill_gpio_acpi_probe(struct device *dev,
- 				  struct rfkill_gpio_data *rfkill)
- {
-@@ -75,7 +84,8 @@ static int rfkill_gpio_acpi_probe(struct device *dev,
- 	rfkill->name = dev_name(dev);
- 	rfkill->type = (unsigned)id->driver_data;
- 
--	return 0;
-+	return acpi_dev_add_driver_gpios(ACPI_COMPANION(dev),
-+					 acpi_rfkill_default_gpios);
- }
- 
- static int rfkill_gpio_probe(struct platform_device *pdev)
-@@ -102,7 +112,7 @@ static int rfkill_gpio_probe(struct platform_device *pdev)
- 
- 	rfkill->clk = devm_clk_get(&pdev->dev, NULL);
- 
--	gpio = devm_gpiod_get_index(&pdev->dev, "reset", 0);
-+	gpio = devm_gpiod_get(&pdev->dev, "reset");
- 	if (!IS_ERR(gpio)) {
- 		ret = gpiod_direction_output(gpio, 0);
- 		if (ret)
-@@ -110,7 +120,7 @@ static int rfkill_gpio_probe(struct platform_device *pdev)
- 		rfkill->reset_gpio = gpio;
- 	}
- 
--	gpio = devm_gpiod_get_index(&pdev->dev, "shutdown", 1);
-+	gpio = devm_gpiod_get(&pdev->dev, "shutdown");
- 	if (!IS_ERR(gpio)) {
- 		ret = gpiod_direction_output(gpio, 0);
- 		if (ret)
-@@ -150,6 +160,8 @@ static int rfkill_gpio_remove(struct platform_device *pdev)
- 	rfkill_unregister(rfkill->rfkill_dev);
- 	rfkill_destroy(rfkill->rfkill_dev);
- 
-+	acpi_dev_remove_driver_gpios(ACPI_COMPANION(&pdev->dev));
-+
- 	return 0;
- }
- 
 diff --git a/virt/kvm/arm/arch_timer.c b/virt/kvm/arm/arch_timer.c
-index 22fa819..642dad4 100644
+index 1c0772b..b9d11aa 100644
 --- a/virt/kvm/arm/arch_timer.c
 +++ b/virt/kvm/arm/arch_timer.c
 @@ -21,9 +21,11 @@
@@ -13011,7 +6439,7 @@ index 22fa819..642dad4 100644
  
  #include <kvm/arm_vgic.h>
  #include <kvm/arm_arch_timer.h>
-@@ -244,60 +246,91 @@ static const struct of_device_id arch_timer_of_match[] = {
+@@ -246,60 +248,91 @@ static const struct of_device_id arch_timer_of_match[] = {
  	{},
  };
  
@@ -13301,7 +6729,7 @@ index 1c2c8ee..8b56920 100644
  	int ret = 0;
  	u32 gicv_idx;
 diff --git a/virt/kvm/arm/vgic.c b/virt/kvm/arm/vgic.c
-index aacdb59..d972d63 100644
+index 03affc7..cdd4c64 100644
 --- a/virt/kvm/arm/vgic.c
 +++ b/virt/kvm/arm/vgic.c
 @@ -25,9 +25,11 @@
@@ -13316,7 +6744,7 @@ index aacdb59..d972d63 100644
  #include <asm/kvm_emulate.h>
  #include <asm/kvm_arm.h>
  #include <asm/kvm_mmu.h>
-@@ -2427,8 +2429,8 @@ static struct notifier_block vgic_cpu_nb = {
+@@ -2431,8 +2433,8 @@ static struct notifier_block vgic_cpu_nb = {
  };
  
  static const struct of_device_id vgic_ids[] = {
@@ -13327,7 +6755,7 @@ index aacdb59..d972d63 100644
  	{},
  };
  
-@@ -2438,20 +2440,26 @@ int kvm_vgic_hyp_init(void)
+@@ -2442,20 +2444,26 @@ int kvm_vgic_hyp_init(void)
  	const int (*vgic_probe)(struct device_node *,const struct vgic_ops **,
  				const struct vgic_params **);
  	struct device_node *vgic_node;
diff --git a/kernel.spec b/kernel.spec
index 0fb7794..47de8e0 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -68,13 +68,13 @@ Summary: The Linux kernel
 # base_sublevel is the kernel version we're starting with and patching
 # on top of -- for example, 3.1-rc7-git1 starts with a 3.0 base,
 # which yields a base_sublevel of 0.
-%define base_sublevel 18
+%define base_sublevel 19
 
 ## If this is a released kernel ##
 %if 0%{?released_kernel}
 
 # Do we have a -stable update to apply?
-%define stable_update 9
+%define stable_update 3
 # Is it a -stable RC?
 %define stable_rc 0
 # Set rpm version accordingly
@@ -670,7 +670,8 @@ Patch1019: Add-sysrq-option-to-disable-secure-boot-mode.patch
 
 # nouveau + drm fixes
 # intel drm is all merged upstream
-Patch1826: drm-i915-tame-the-chattermouth-v2.patch
+Patch1825: drm-i915-tame-the-chattermouth-v2.patch
+Patch1826: drm-i915-hush-check-crtc-state.patch
 Patch1827: drm-i915-Disable-verbose-state-checks.patch
 
 # Quiet boot fixes
@@ -702,7 +703,11 @@ Patch21025: arm-dts-am335x-bone-common-add-uart2_pins-uart4_pins.patch
 Patch21026: pinctrl-pinctrl-single-must-be-initialized-early.patch
 
 Patch21028: arm-i.MX6-Utilite-device-dtb.patch
-Patch21029: arm-dts-sun7i-bananapi.patch
+
+# IOMMU crash fixes - https://lists.linuxfoundation.org/pipermail/iommu/2015-February/012329.html
+Patch21030: iommu-omap-Play-nice-in-multi-platform-builds.patch
+Patch21031: iommu-exynos-Play-nice-in-multi-platform-builds.patch
+Patch21032: iommu-rockchip-Play-nice-in-multi-platform-builds.patch
 
 Patch21100: arm-highbank-l2-reverts.patch
 
@@ -717,52 +722,21 @@ Patch21247: ath9k-rx-dma-stop-check.patch
 
 Patch22000: weird-root-dentry-name-debug.patch
 
-# Patch series from Hans for various backlight and platform driver fixes
-Patch26002: samsung-laptop-Add-broken-acpi-video-quirk-for-NC210.patch
-
-#rhbz 1135338
-Patch26090: HID-add-support-for-MS-Surface-Pro-3-Type-Cover.patch
-
-#rhbz 1173806
-Patch26101: powerpc-powernv-force-all-CPUs-to-be-bootable.patch
-
-#rhbz 1163927
-Patch26121: Set-UID-in-sess_auth_rawntlmssp_authenticate-too.patch
-
-#rhbz 1124119
-Patch26126: uas-Do-not-blacklist-ASM1153-disk-enclosures.patch
-Patch26127: uas-Add-US_FL_NO_ATA_1X-for-2-more-Seagate-disk-encl.patch
-
-#rhbz 1163574
-Patch26130: acpi-video-Add-disable_native_backlight-quirk-for-De.patch
-
 #rhbz 1094948
 Patch26131: acpi-video-Add-disable_native_backlight-quirk-for-Sa.patch
 
-# git clone ssh://git.fedorahosted.org/git/kernel-arm64.git, git diff master...devel
-Patch30000: kernel-arm64.patch
-
-# Fix for big-endian arches, already upstream
-Patch30001: mpssd-x86-only.patch
-
 #rhbz 1186097
-Patch30004: acpi-video-add-disable_native_backlight_quirk_for_samsung_510r.patch
+Patch26135: acpi-video-add-disable_native_backlight_quirk_for_samsung_510r.patch
 
 #CVE-XXXX-XXXX rhbz 1189864 1192079
 Patch26136: vhost-scsi-potential-memory-corruption.patch
 
-#rhbz 1185519
-Patch26142: NFS-fix-clp-cl_revoked-list-deletion-causing-softloc.patch
-
 #CVE-2015-0275 rhbz 1193907 1195178
 Patch26138: ext4-Allocate-entire-range-in-zero-range.patch
 
 #rhbz 1190947
 Patch26141: Bluetooth-ath3k-Add-support-Atheros-AR5B195-combo-Mi.patch
 
-#CVE-2015-2042 rhbz 1195355 1199365
-Patch26143: net-rds-use-correct-size-for-max-unacked-packets-and.patch
-
 #rhbz 1200777 1200778
 Patch26150: Input-synaptics-split-synaptics_resolution-query-fir.patch
 Patch26151: Input-synaptics-log-queried-and-quirked-dimension-va.patch
@@ -779,12 +753,6 @@ Patch26161: Input-synaptics-re-route-tracksticks-buttons-on-the-.patch
 Patch26162: Input-synaptics-remove-X1-Carbon-3rd-gen-from-the-to.patch
 Patch26163: Input-synaptics-remove-X250-from-the-topbuttonpad-li.patch
 
-#CVE-2015-2150 rhbz 1196266 1200397
-Patch26165: xen-pciback-limit-guest-control-of-command-register.patch
-
-#rhbz 1069027
-Patch26166: drm-radeon-dp-Set-EDP_CONFIGURATION_SET-for-bridge-c.patch
-
 #CVE-2014-8159 rhbz 1181166 1200950
 Patch26167: IB-core-Prevent-integer-overflow-in-ib_umem_get-addr.patch
 
@@ -798,8 +766,11 @@ Patch26171: acpi-video-Add-force-native-backlight-quirk-for-Leno.patch
 #CVE-2015-2666 rhbz 1204724 1204722
 Patch26172: x86-microcode-intel-Guard-against-stack-overflow-in-.patch
 
-#CVE-2015-2672 rhbz 1204724 1204729
-Patch26173: x86-fpu-xsaves-Fix-improper-uses-of-__ex_table.patch
+# git clone ssh://git.fedorahosted.org/git/kernel-arm64.git, git diff master...devel
+Patch30000: kernel-arm64.patch
+
+#rhbz 1204512
+Patch26174: tun-return-proper-error-code-from-tun_do_read.patch
 
 # END OF PATCH DEFINITIONS
 
@@ -1362,7 +1333,10 @@ ApplyPatch arm-dts-am335x-bone-common-add-uart2_pins-uart4_pins.patch
 ApplyPatch pinctrl-pinctrl-single-must-be-initialized-early.patch
 
 ApplyPatch arm-i.MX6-Utilite-device-dtb.patch
-ApplyPatch arm-dts-sun7i-bananapi.patch
+
+ApplyPatch iommu-omap-Play-nice-in-multi-platform-builds.patch
+ApplyPatch iommu-exynos-Play-nice-in-multi-platform-builds.patch
+ApplyPatch iommu-rockchip-Play-nice-in-multi-platform-builds.patch
 
 ApplyPatch arm-highbank-l2-reverts.patch
 
@@ -1458,7 +1432,8 @@ ApplyPatch Add-sysrq-option-to-disable-secure-boot-mode.patch
 
 # Intel DRM
 ApplyPatch drm-i915-tame-the-chattermouth-v2.patch
-ApplyPatch drm-i915-Disable-verbose-state-checks.patch 
+ApplyPatch drm-i915-hush-check-crtc-state.patch
+ApplyPatch drm-i915-Disable-verbose-state-checks.patch
 
 # Radeon DRM
 
@@ -1484,31 +1459,9 @@ ApplyPatch criu-no-expert.patch
 #rhbz 892811
 ApplyPatch ath9k-rx-dma-stop-check.patch
 
-# Patch series from Hans for various backlight and platform driver fixes
-ApplyPatch samsung-laptop-Add-broken-acpi-video-quirk-for-NC210.patch
-
-#rhbz 1135338
-ApplyPatch HID-add-support-for-MS-Surface-Pro-3-Type-Cover.patch
-
-#rhbz 1173806
-ApplyPatch powerpc-powernv-force-all-CPUs-to-be-bootable.patch
-
-#rhbz 1163927
-ApplyPatch Set-UID-in-sess_auth_rawntlmssp_authenticate-too.patch
-
-#rhbz 1124119
-ApplyPatch uas-Do-not-blacklist-ASM1153-disk-enclosures.patch
-ApplyPatch uas-Add-US_FL_NO_ATA_1X-for-2-more-Seagate-disk-encl.patch
-
-#rhbz 1163574
-ApplyPatch acpi-video-Add-disable_native_backlight-quirk-for-De.patch
-
 #rhbz 1094948
 ApplyPatch acpi-video-Add-disable_native_backlight-quirk-for-Sa.patch
 
-# Fix for big-endian arches, already upstream
-ApplyPatch mpssd-x86-only.patch
-
 #rhbz 1186097
 ApplyPatch acpi-video-add-disable_native_backlight_quirk_for_samsung_510r.patch
 
@@ -1521,12 +1474,6 @@ ApplyPatch ext4-Allocate-entire-range-in-zero-range.patch
 #rhbz 1190947
 ApplyPatch Bluetooth-ath3k-Add-support-Atheros-AR5B195-combo-Mi.patch
 
-#rhbz 1185519
-ApplyPatch NFS-fix-clp-cl_revoked-list-deletion-causing-softloc.patch
-
-#CVE-2015-2042 rhbz 1195355 1199365
-ApplyPatch net-rds-use-correct-size-for-max-unacked-packets-and.patch
-
 #rhbz 1200777 1200778
 ApplyPatch Input-synaptics-split-synaptics_resolution-query-fir.patch
 ApplyPatch Input-synaptics-log-queried-and-quirked-dimension-va.patch
@@ -1543,12 +1490,6 @@ ApplyPatch Input-synaptics-re-route-tracksticks-buttons-on-the-.patch
 ApplyPatch Input-synaptics-remove-X1-Carbon-3rd-gen-from-the-to.patch
 ApplyPatch Input-synaptics-remove-X250-from-the-topbuttonpad-li.patch
 
-#CVE-2015-2150 rhbz 1196266 1200397
-ApplyPatch xen-pciback-limit-guest-control-of-command-register.patch
-
-#rhbz 1069027
-ApplyPatch drm-radeon-dp-Set-EDP_CONFIGURATION_SET-for-bridge-c.patch
-
 #CVE-2014-8159 rhbz 1181166 1200950
 ApplyPatch IB-core-Prevent-integer-overflow-in-ib_umem_get-addr.patch
 
@@ -1562,9 +1503,6 @@ ApplyPatch acpi-video-Add-force-native-backlight-quirk-for-Leno.patch
 #CVE-2015-2666 rhbz 1204724 1204722
 ApplyPatch x86-microcode-intel-Guard-against-stack-overflow-in-.patch
 
-#CVE-2015-2672 rhbz 1204724 1204729
-ApplyPatch x86-fpu-xsaves-Fix-improper-uses-of-__ex_table.patch
-
 %if 0%{?aarch64patches}
 ApplyPatch kernel-arm64.patch
 %ifnarch aarch64 # this is stupid, but i want to notice before secondary koji does.
@@ -1572,6 +1510,9 @@ ApplyPatch kernel-arm64.patch -R
 %endif
 %endif
 
+#rhbz 1204512
+ApplyPatch tun-return-proper-error-code-from-tun_do_read.patch
+
 # END OF PATCH APPLICATIONS
 
 %endif
@@ -2383,6 +2324,9 @@ fi
 #                 ||----w |
 #                 ||     ||
 %changelog
+* Fri Mar 27 2015 Justin M. Forbes <jforbes at fedoraproject.org> - 3.19.3-100
+- Linux v3.19.3 rebase (rhbz 1205088)
+
 * Mon Mar 23 2015 Josh Boyer <jwboyer at fedoraproject.org>
 - CVE-2015-2672 unprivileged DoS du to mis-protected xsave/xstor instructions (rhbz 1204724 1204729)
 - CVE-2015-2666 execution in the early microcode loader (rhbz 1204724 1204722)
diff --git a/mpssd-x86-only.patch b/mpssd-x86-only.patch
deleted file mode 100644
index 862603d..0000000
--- a/mpssd-x86-only.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-commit d47fb4ec7e101a63754939fa49d75fd7e81e94f8
-Author: Ashutosh Dixit <ashutosh.dixit at intel.com>
-Date:   Thu Dec 4 13:27:29 2014 -0800
-
-    Documentation: Build mic/mpssd only for x86_64
-    
-    mic/mpssd along with MIC drivers are currently only usable on
-    x86_64. So build mic/mpssd only for x86_64 to avoid build breaks on
-    big-endian systems.
-    
-    Reported-by: Daniel Borkmann <dborkman at redhat.com>
-    Reported-by: Dan Streetman <ddstreet at gmail.com>
-    Suggested-by: Peter Foley <pefoley2 at pefoley.com>
-    Signed-off-by: Ashutosh Dixit <ashutosh.dixit at intel.com>
-    Signed-off-by: Jonathan Corbet <corbet at lwn.net>
-
-diff --git a/Documentation/mic/mpssd/Makefile b/Documentation/mic/mpssd/Makefile
-index 0f31568..f47fe6b 100644
---- a/Documentation/mic/mpssd/Makefile
-+++ b/Documentation/mic/mpssd/Makefile
-@@ -1,5 +1,5 @@
- # List of programs to build
--hostprogs-y := mpssd
-+hostprogs-$(CONFIG_X86_64) := mpssd
-
- mpssd-objs := mpssd.o sysfs.o
-
diff --git a/net-rds-use-correct-size-for-max-unacked-packets-and.patch b/net-rds-use-correct-size-for-max-unacked-packets-and.patch
deleted file mode 100644
index 3cf4a90..0000000
--- a/net-rds-use-correct-size-for-max-unacked-packets-and.patch
+++ /dev/null
@@ -1,40 +0,0 @@
-From: Sasha Levin <sasha.levin at oracle.com>
-Date: Tue, 3 Feb 2015 08:55:58 -0500
-Subject: [PATCH] net: rds: use correct size for max unacked packets and bytes
-
-Max unacked packets/bytes is an int while sizeof(long) was used in the
-sysctl table.
-
-This means that when they were getting read we'd also leak kernel memory
-to userspace along with the timeout values.
-
-Signed-off-by: Sasha Levin <sasha.levin at oracle.com>
-Signed-off-by: David S. Miller <davem at davemloft.net>
----
- net/rds/sysctl.c | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/net/rds/sysctl.c b/net/rds/sysctl.c
-index c3b0cd43eb56..c173f69e1479 100644
---- a/net/rds/sysctl.c
-+++ b/net/rds/sysctl.c
-@@ -71,14 +71,14 @@ static struct ctl_table rds_sysctl_rds_table[] = {
- 	{
- 		.procname	= "max_unacked_packets",
- 		.data		= &rds_sysctl_max_unacked_packets,
--		.maxlen         = sizeof(unsigned long),
-+		.maxlen         = sizeof(int),
- 		.mode           = 0644,
- 		.proc_handler   = proc_dointvec,
- 	},
- 	{
- 		.procname	= "max_unacked_bytes",
- 		.data		= &rds_sysctl_max_unacked_bytes,
--		.maxlen         = sizeof(unsigned long),
-+		.maxlen         = sizeof(int),
- 		.mode           = 0644,
- 		.proc_handler   = proc_dointvec,
- 	},
--- 
-2.1.0
-
diff --git a/powerpc-powernv-force-all-CPUs-to-be-bootable.patch b/powerpc-powernv-force-all-CPUs-to-be-bootable.patch
deleted file mode 100644
index 1c0b623..0000000
--- a/powerpc-powernv-force-all-CPUs-to-be-bootable.patch
+++ /dev/null
@@ -1,46 +0,0 @@
-From: Greg Kurz <gkurz at linux.vnet.ibm.com>
-Date: Fri, 12 Dec 2014 12:37:40 +0100
-Subject: [PATCH] powerpc/powernv: force all CPUs to be bootable
-
-The subcore logic needs all the CPUs declared in the DT to be bootable,
-otherwise the kernel hangs at boot time. Since subcore support starts
-with POWER8, we can keep the current behaviour for older CPUs.
-
-Signed-off-by: Greg Kurz <gkurz at linux.vnet.ibm.com>
----
- arch/powerpc/platforms/powernv/smp.c | 13 ++++++++++++-
- 1 file changed, 12 insertions(+), 1 deletion(-)
-
-diff --git a/arch/powerpc/platforms/powernv/smp.c b/arch/powerpc/platforms/powernv/smp.c
-index 5fcfcf44e3a9..52552e60df36 100644
---- a/arch/powerpc/platforms/powernv/smp.c
-+++ b/arch/powerpc/platforms/powernv/smp.c
-@@ -185,13 +185,24 @@ static void pnv_smp_cpu_kill_self(void)
- 
- #endif /* CONFIG_HOTPLUG_CPU */
- 
-+static int pnv_cpu_bootable(unsigned int nr)
-+{
-+	/* Starting with POWER8, all CPUs need to be booted to avoid hangs
-+	 * during subcore init.
-+	 */
-+	if (cpu_has_feature(CPU_FTR_ARCH_207S))
-+		return 1;
-+
-+	return smp_generic_cpu_bootable(nr);
-+}
-+
- static struct smp_ops_t pnv_smp_ops = {
- 	.message_pass	= smp_muxed_ipi_message_pass,
- 	.cause_ipi	= NULL,	/* Filled at runtime by xics_smp_probe() */
- 	.probe		= xics_smp_probe,
- 	.kick_cpu	= pnv_smp_kick_cpu,
- 	.setup_cpu	= pnv_smp_setup_cpu,
--	.cpu_bootable	= smp_generic_cpu_bootable,
-+	.cpu_bootable	= pnv_cpu_bootable,
- #ifdef CONFIG_HOTPLUG_CPU
- 	.cpu_disable	= pnv_smp_cpu_disable,
- 	.cpu_die	= generic_cpu_die,
--- 
-2.1.0
-
diff --git a/samsung-laptop-Add-broken-acpi-video-quirk-for-NC210.patch b/samsung-laptop-Add-broken-acpi-video-quirk-for-NC210.patch
deleted file mode 100644
index 93c4073..0000000
--- a/samsung-laptop-Add-broken-acpi-video-quirk-for-NC210.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-Bugzilla: 861573
-Upstream-status: Waiting for feedback from reporter
-
-From 2fa2078cdd4198b49c02cb03087158d398476463 Mon Sep 17 00:00:00 2001
-From: Hans de Goede <hdegoede at redhat.com>
-Date: Mon, 2 Jun 2014 17:40:59 +0200
-Subject: [PATCH 02/14] samsung-laptop: Add broken-acpi-video quirk for
- NC210/NC110
-
-Reported (and tested) here:
-https://bugzilla.redhat.com/show_bug.cgi?id=861573
-
-Signed-off-by: Hans de Goede <hdegoede at redhat.com>
----
- drivers/platform/x86/samsung-laptop.c | 10 ++++++++++
- 1 file changed, 10 insertions(+)
-
-
-diff --git a/drivers/platform/x86/samsung-laptop.c b/drivers/platform/x86/samsung-laptop.c
-index 5a5966512277..0d7954e0fc74 100644
---- a/drivers/platform/x86/samsung-laptop.c
-+++ b/drivers/platform/x86/samsung-laptop.c
-@@ -1568,6 +1568,16 @@ static struct dmi_system_id __initdata samsung_dmi_table[] = {
- 		},
- 	 .driver_data = &samsung_np740u3e,
- 	},
-+	{
-+	 .callback = samsung_dmi_matched,
-+	 .ident = "NC210",
-+	 .matches = {
-+		DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
-+		DMI_MATCH(DMI_PRODUCT_NAME, "NC210/NC110"),
-+		DMI_MATCH(DMI_BOARD_NAME, "NC210/NC110"),
-+		},
-+	 .driver_data = &samsung_broken_acpi_video,
-+	},
- 	{ },
- };
- MODULE_DEVICE_TABLE(dmi, samsung_dmi_table);
diff --git a/silence-fbcon-logo.patch b/silence-fbcon-logo.patch
index 45ab733..baeb94e 100644
--- a/silence-fbcon-logo.patch
+++ b/silence-fbcon-logo.patch
@@ -1,8 +1,18 @@
+From: "kernel-team at fedoraproject.org" <kernel-team at fedoraproject.org>
+Date: Thu, 29 Jul 2010 16:46:31 -0700
+Subject: [PATCH] silence fbcon logo
+
+Bugzilla: N/A
+Upstream-status: Fedora mustard
+---
+ drivers/video/console/fbcon.c | 24 +++++++++++++++++-------
+ 1 file changed, 17 insertions(+), 7 deletions(-)
+
 diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c
-index 1657b96..4c5c2be 100644
+index ea437245562e..eefa9c45d2e1 100644
 --- a/drivers/video/console/fbcon.c
 +++ b/drivers/video/console/fbcon.c
-@@ -631,13 +631,15 @@ static void fbcon_prepare_logo(struct vc_data *vc, struct fb_info *info,
+@@ -637,13 +637,15 @@ static void fbcon_prepare_logo(struct vc_data *vc, struct fb_info *info,
  		kfree(save);
  	}
  
@@ -25,7 +35,7 @@ index 1657b96..4c5c2be 100644
  	}
  }
  #endif /* MODULE */
-@@ -3489,6 +3491,14 @@ static int __init fb_console_init(void)
+@@ -3624,6 +3626,14 @@ static int __init fb_console_init(void)
  	return 0;
  }
  
@@ -37,6 +47,9 @@ index 1657b96..4c5c2be 100644
 +
 +early_param("quiet", quiet_logo);
 +
- module_init(fb_console_init);
+ fs_initcall(fb_console_init);
  
  #ifdef MODULE
+-- 
+2.1.0
+
diff --git a/sources b/sources
index 94123c7..137f1ac 100644
--- a/sources
+++ b/sources
@@ -1,3 +1,3 @@
-9e854df51ca3fef8bfe566dbd7b89241  linux-3.18.tar.xz
-813ccb96f0b379d656e57442c2587ca3  perf-man-3.18.tar.gz
-41077062d4b7beefd88d4df6e598e376  patch-3.18.9.xz
+d3fc8316d4d4d04b65cbc2d70799e763  linux-3.19.tar.xz
+15d8d2f97ce056488451a5bfb2944603  perf-man-3.19.tar.gz
+1fec75551b2f55fced43df8394b1fd9a  patch-3.19.3.xz
diff --git a/tun-return-proper-error-code-from-tun_do_read.patch b/tun-return-proper-error-code-from-tun_do_read.patch
new file mode 100644
index 0000000..5f65f32
--- /dev/null
+++ b/tun-return-proper-error-code-from-tun_do_read.patch
@@ -0,0 +1,29 @@
+From: Alex Gartrell <agartrell at fb.com>
+Date: Thu, 25 Dec 2014 23:22:49 -0800
+Subject: [PATCH] tun: return proper error code from tun_do_read
+
+Instead of -1 with EAGAIN, read on a O_NONBLOCK tun fd will return 0.  This
+fixes this by properly returning the error code from __skb_recv_datagram.
+
+Signed-off-by: Alex Gartrell <agartrell at fb.com>
+Signed-off-by: David S. Miller <davem at davemloft.net>
+---
+ drivers/net/tun.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/net/tun.c b/drivers/net/tun.c
+index 10f9e4021b5a..9a409a8f3b19 100644
+--- a/drivers/net/tun.c
++++ b/drivers/net/tun.c
+@@ -1368,7 +1368,7 @@ static ssize_t tun_do_read(struct tun_struct *tun, struct tun_file *tfile,
+ 	skb = __skb_recv_datagram(tfile->socket.sk, noblock ? MSG_DONTWAIT : 0,
+ 				  &peeked, &off, &err);
+ 	if (!skb)
+-		return 0;
++		return err;
+ 
+ 	ret = tun_put_user(tun, tfile, skb, to);
+ 	if (unlikely(ret < 0))
+-- 
+2.1.0
+
diff --git a/uas-Add-US_FL_NO_ATA_1X-for-2-more-Seagate-disk-encl.patch b/uas-Add-US_FL_NO_ATA_1X-for-2-more-Seagate-disk-encl.patch
deleted file mode 100644
index 60e5b26..0000000
--- a/uas-Add-US_FL_NO_ATA_1X-for-2-more-Seagate-disk-encl.patch
+++ /dev/null
@@ -1,48 +0,0 @@
-From: Hans de Goede <hdegoede at redhat.com>
-Date: Thu, 8 Jan 2015 14:54:03 +0100
-Subject: [PATCH] uas: Add US_FL_NO_ATA_1X for 2 more Seagate disk enclosures
-
-Just like all previous UAS capable Seagate disk enclosures, these need the
-US_FL_NO_ATA_1X to not crash when udev probes them.
-
-Cc: stable at vger.kernel.org # 3.16
-Signed-off-by: Hans de Goede <hdegoede at redhat.com>
----
- drivers/usb/storage/unusual_uas.h | 14 ++++++++++++++
- 1 file changed, 14 insertions(+)
-
-diff --git a/drivers/usb/storage/unusual_uas.h b/drivers/usb/storage/unusual_uas.h
-index f8492c1fd0e8..9ec4561f6c2c 100644
---- a/drivers/usb/storage/unusual_uas.h
-+++ b/drivers/usb/storage/unusual_uas.h
-@@ -75,6 +75,13 @@ UNUSUAL_DEV(0x0bc2, 0xa013, 0x0000, 0x9999,
- 		USB_SC_DEVICE, USB_PR_DEVICE, NULL,
- 		US_FL_NO_ATA_1X),
- 
-+/* Reported-by: Hans de Goede <hdegoede at redhat.com> */
-+UNUSUAL_DEV(0x0bc2, 0xa0a4, 0x0000, 0x9999,
-+		"Seagate",
-+		"Backup Plus Desk",
-+		USB_SC_DEVICE, USB_PR_DEVICE, NULL,
-+		US_FL_NO_ATA_1X),
-+
- /* https://bbs.archlinux.org/viewtopic.php?id=183190 */
- UNUSUAL_DEV(0x0bc2, 0xab20, 0x0000, 0x9999,
- 		"Seagate",
-@@ -89,6 +96,13 @@ UNUSUAL_DEV(0x0bc2, 0xab21, 0x0000, 0x9999,
- 		USB_SC_DEVICE, USB_PR_DEVICE, NULL,
- 		US_FL_NO_ATA_1X),
- 
-+/* Reported-by: G. Richard Bellamy <rbellamy at pteradigm.com> */
-+UNUSUAL_DEV(0x0bc2, 0xab2a, 0x0000, 0x9999,
-+		"Seagate",
-+		"BUP Fast HDD",
-+		USB_SC_DEVICE, USB_PR_DEVICE, NULL,
-+		US_FL_NO_ATA_1X),
-+
- /* Reported-by: Claudio Bizzarri <claudio.bizzarri at gmail.com> */
- UNUSUAL_DEV(0x152d, 0x0567, 0x0000, 0x9999,
- 		"JMicron",
--- 
-2.1.0
-
diff --git a/uas-Do-not-blacklist-ASM1153-disk-enclosures.patch b/uas-Do-not-blacklist-ASM1153-disk-enclosures.patch
deleted file mode 100644
index 5b67025..0000000
--- a/uas-Do-not-blacklist-ASM1153-disk-enclosures.patch
+++ /dev/null
@@ -1,94 +0,0 @@
-From: Hans de Goede <hdegoede at redhat.com>
-Date: Thu, 8 Jan 2015 14:42:01 +0100
-Subject: [PATCH] uas: Do not blacklist ASM1153 disk enclosures
-
-Our detection logic to avoid doing UAS on ASM1051 bridge chips causes problems
-with newer ASM1153 disk enclosures in 2 ways:
-
-1) Some ASM1153 disk enclosures re-use the ASM1051 device-id of 5106, which
-   we assume is always an ASM1051, so remove the quirk for 5106, and instead
-   use the same detection logic as we already use for device-id 55aa, which is
-   used for all of ASM1051, ASM1053 and ASM1153 devices <sigh>.
-
-2) Our detection logic to differentiate between ASM1051 and ASM1053 sees
-   ASM1153 devices as ASM1051 because they have 32 streams like ASM1051 devs.
-   Luckily the ASM1153 descriptors are not 100% identical, unlike the previous
-   models the ASM1153 has bMaxPower == 0, so use that to differentiate it.
-
-Signed-off-by: Hans de Goede <hdegoede at redhat.com>
----
- drivers/usb/storage/uas-detect.h  | 33 ++++++++++++++++++++++++++++-----
- drivers/usb/storage/unusual_uas.h |  8 --------
- 2 files changed, 28 insertions(+), 13 deletions(-)
-
-diff --git a/drivers/usb/storage/uas-detect.h b/drivers/usb/storage/uas-detect.h
-index 8a6f371ed6e7..9893d696fc97 100644
---- a/drivers/usb/storage/uas-detect.h
-+++ b/drivers/usb/storage/uas-detect.h
-@@ -69,16 +69,39 @@ static int uas_use_uas_driver(struct usb_interface *intf,
- 		return 0;
- 
- 	/*
--	 * ASM1051 and older ASM1053 devices have the same usb-id, and UAS is
--	 * broken on the ASM1051, use the number of streams to differentiate.
--	 * New ASM1053-s also support 32 streams, but have a different prod-id.
-+	 * ASMedia has a number of usb3 to sata bridge chips, at the time of
-+	 * this writing the following versions exist:
-+	 * ASM1051 - no uas support version
-+	 * ASM1051 - with broken (*) uas support
-+	 * ASM1053 - with working uas support
-+	 * ASM1153 - with working uas support
-+	 *
-+	 * Devices with these chips re-use a number of device-ids over the
-+	 * entire line, so the device-id is useless to determine if we're
-+	 * dealing with an ASM1051 (which we want to avoid).
-+	 *
-+	 * The ASM1153 can be identified by config.MaxPower == 0,
-+	 * where as the ASM105x models have config.MaxPower == 36.
-+	 *
-+	 * Differentiating between the ASM1053 and ASM1051 is trickier, when
-+	 * connected over USB-3 we can look at the number of streams supported,
-+	 * ASM1051 supports 32 streams, where as early ASM1053 versions support
-+	 * 16 streams, newer ASM1053-s also support 32 streams, but have a
-+	 * different prod-id.
-+	 *
-+	 * (*) ASM1051 chips do work with UAS with some disks (with the
-+	 *     US_FL_NO_REPORT_OPCODES quirk), but are broken with other disks
- 	 */
- 	if (le16_to_cpu(udev->descriptor.idVendor) == 0x174c &&
--			le16_to_cpu(udev->descriptor.idProduct) == 0x55aa) {
--		if (udev->speed < USB_SPEED_SUPER) {
-+			(le16_to_cpu(udev->descriptor.idProduct) == 0x5106 ||
-+			 le16_to_cpu(udev->descriptor.idProduct) == 0x55aa)) {
-+		if (udev->actconfig->desc.bMaxPower == 0) {
-+			/* ASM1153, do nothing */
-+		} else if (udev->speed < USB_SPEED_SUPER) {
- 			/* No streams info, assume ASM1051 */
- 			flags |= US_FL_IGNORE_UAS;
- 		} else if (usb_ss_max_streams(&eps[1]->ss_ep_comp) == 32) {
-+			/* Possibly an ASM1051, disable uas */
- 			flags |= US_FL_IGNORE_UAS;
- 		}
- 	}
-diff --git a/drivers/usb/storage/unusual_uas.h b/drivers/usb/storage/unusual_uas.h
-index 2f0a3d35269a..f8492c1fd0e8 100644
---- a/drivers/usb/storage/unusual_uas.h
-+++ b/drivers/usb/storage/unusual_uas.h
-@@ -96,14 +96,6 @@ UNUSUAL_DEV(0x152d, 0x0567, 0x0000, 0x9999,
- 		USB_SC_DEVICE, USB_PR_DEVICE, NULL,
- 		US_FL_NO_REPORT_OPCODES),
- 
--/* Most ASM1051 based devices have issues with uas, blacklist them all */
--/* Reported-by: Hans de Goede <hdegoede at redhat.com> */
--UNUSUAL_DEV(0x174c, 0x5106, 0x0000, 0x9999,
--		"ASMedia",
--		"ASM1051",
--		USB_SC_DEVICE, USB_PR_DEVICE, NULL,
--		US_FL_IGNORE_UAS),
--
- /* Reported-by: Hans de Goede <hdegoede at redhat.com> */
- UNUSUAL_DEV(0x2109, 0x0711, 0x0000, 0x9999,
- 		"VIA",
--- 
-2.1.0
-
diff --git a/x86-fpu-xsaves-Fix-improper-uses-of-__ex_table.patch b/x86-fpu-xsaves-Fix-improper-uses-of-__ex_table.patch
deleted file mode 100644
index 4ed5747..0000000
--- a/x86-fpu-xsaves-Fix-improper-uses-of-__ex_table.patch
+++ /dev/null
@@ -1,114 +0,0 @@
-From 06c8173eb92bbfc03a0fe8bb64315857d0badd06 Mon Sep 17 00:00:00 2001
-From: Quentin Casasnovas <quentin.casasnovas at oracle.com>
-Date: Thu, 5 Mar 2015 13:19:22 +0100
-Subject: [PATCH] x86/fpu/xsaves: Fix improper uses of __ex_table
-
-Commit:
-
-  f31a9f7c7169 ("x86/xsaves: Use xsaves/xrstors to save and restore xsave area")
-
-introduced alternative instructions for XSAVES/XRSTORS and commit:
-
-  adb9d526e982 ("x86/xsaves: Add xsaves and xrstors support for booting time")
-
-added support for the XSAVES/XRSTORS instructions at boot time.
-
-Unfortunately both failed to properly protect them against faulting:
-
-The 'xstate_fault' macro will use the closest label named '1'
-backward and that ends up in the .altinstr_replacement section
-rather than in .text. This means that the kernel will never find
-in the __ex_table the .text address where this instruction might
-fault, leading to serious problems if userspace manages to
-trigger the fault.
-
-Signed-off-by: Quentin Casasnovas <quentin.casasnovas at oracle.com>
-Signed-off-by: Jamie Iles <jamie.iles at oracle.com>
-[ Improved the changelog, fixed some whitespace noise. ]
-Acked-by: Borislav Petkov <bp at alien8.de>
-Acked-by: Linus Torvalds <torvalds at linux-foundation.org>
-Cc: <stable at vger.kernel.org>
-Cc: Allan Xavier <mr.a.xavier at gmail.com>
-Cc: H. Peter Anvin <hpa at zytor.com>
-Cc: Thomas Gleixner <tglx at linutronix.de>
-Fixes: adb9d526e982 ("x86/xsaves: Add xsaves and xrstors support for booting time")
-Fixes: f31a9f7c7169 ("x86/xsaves: Use xsaves/xrstors to save and restore xsave area")
-Signed-off-by: Ingo Molnar <mingo at kernel.org>
----
- arch/x86/include/asm/xsave.h | 28 +++++++++++-----------------
- 1 file changed, 11 insertions(+), 17 deletions(-)
-
-diff --git a/arch/x86/include/asm/xsave.h b/arch/x86/include/asm/xsave.h
-index 5fa9770035dc..c9a6d68b8d62 100644
---- a/arch/x86/include/asm/xsave.h
-+++ b/arch/x86/include/asm/xsave.h
-@@ -82,18 +82,15 @@ static inline int xsave_state_booting(struct xsave_struct *fx, u64 mask)
- 	if (boot_cpu_has(X86_FEATURE_XSAVES))
- 		asm volatile("1:"XSAVES"\n\t"
- 			"2:\n\t"
--			: : "D" (fx), "m" (*fx), "a" (lmask), "d" (hmask)
-+			     xstate_fault
-+			: "D" (fx), "m" (*fx), "a" (lmask), "d" (hmask)
- 			:   "memory");
- 	else
- 		asm volatile("1:"XSAVE"\n\t"
- 			"2:\n\t"
--			: : "D" (fx), "m" (*fx), "a" (lmask), "d" (hmask)
-+			     xstate_fault
-+			: "D" (fx), "m" (*fx), "a" (lmask), "d" (hmask)
- 			:   "memory");
--
--	asm volatile(xstate_fault
--		     : "0" (0)
--		     : "memory");
--
- 	return err;
- }
- 
-@@ -112,18 +109,15 @@ static inline int xrstor_state_booting(struct xsave_struct *fx, u64 mask)
- 	if (boot_cpu_has(X86_FEATURE_XSAVES))
- 		asm volatile("1:"XRSTORS"\n\t"
- 			"2:\n\t"
--			: : "D" (fx), "m" (*fx), "a" (lmask), "d" (hmask)
-+			     xstate_fault
-+			: "D" (fx), "m" (*fx), "a" (lmask), "d" (hmask)
- 			:   "memory");
- 	else
- 		asm volatile("1:"XRSTOR"\n\t"
- 			"2:\n\t"
--			: : "D" (fx), "m" (*fx), "a" (lmask), "d" (hmask)
-+			     xstate_fault
-+			: "D" (fx), "m" (*fx), "a" (lmask), "d" (hmask)
- 			:   "memory");
--
--	asm volatile(xstate_fault
--		     : "0" (0)
--		     : "memory");
--
- 	return err;
- }
- 
-@@ -149,9 +143,9 @@ static inline int xsave_state(struct xsave_struct *fx, u64 mask)
- 	 */
- 	alternative_input_2(
- 		"1:"XSAVE,
--		"1:"XSAVEOPT,
-+		XSAVEOPT,
- 		X86_FEATURE_XSAVEOPT,
--		"1:"XSAVES,
-+		XSAVES,
- 		X86_FEATURE_XSAVES,
- 		[fx] "D" (fx), "a" (lmask), "d" (hmask) :
- 		"memory");
-@@ -178,7 +172,7 @@ static inline int xrstor_state(struct xsave_struct *fx, u64 mask)
- 	 */
- 	alternative_input(
- 		"1: " XRSTOR,
--		"1: " XRSTORS,
-+		XRSTORS,
- 		X86_FEATURE_XSAVES,
- 		"D" (fx), "m" (*fx), "a" (lmask), "d" (hmask)
- 		: "memory");
--- 
-2.1.0
-
diff --git a/xen-pciback-limit-guest-control-of-command-register.patch b/xen-pciback-limit-guest-control-of-command-register.patch
deleted file mode 100644
index 8760046..0000000
--- a/xen-pciback-limit-guest-control-of-command-register.patch
+++ /dev/null
@@ -1,156 +0,0 @@
-From: Jan Beulich <JBeulich at suse.com>
-Date: Wed, 11 Mar 2015 13:51:17 +0000
-Subject: [PATCH] xen-pciback: limit guest control of command register
-
-Otherwise the guest can abuse that control to cause e.g. PCIe
-Unsupported Request responses (by disabling memory and/or I/O decoding
-and subsequently causing [CPU side] accesses to the respective address
-ranges), which (depending on system configuration) may be fatal to the
-host.
-
-Note that to alter any of the bits collected together as
-PCI_COMMAND_GUEST permissive mode is now required to be enabled
-globally or on the specific device.
-
-This is CVE-2015-2150 / XSA-120.
-
-Signed-off-by: Jan Beulich <jbeulich at suse.com>
-Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk at oracle.com>
----
- drivers/xen/xen-pciback/conf_space.c        |  2 +-
- drivers/xen/xen-pciback/conf_space.h        |  2 +
- drivers/xen/xen-pciback/conf_space_header.c | 61 +++++++++++++++++++++++------
- 3 files changed, 51 insertions(+), 14 deletions(-)
-
-diff --git a/drivers/xen/xen-pciback/conf_space.c b/drivers/xen/xen-pciback/conf_space.c
-index 46ae0f9f02ad..75fe3d466515 100644
---- a/drivers/xen/xen-pciback/conf_space.c
-+++ b/drivers/xen/xen-pciback/conf_space.c
-@@ -16,7 +16,7 @@
- #include "conf_space.h"
- #include "conf_space_quirks.h"
- 
--static bool permissive;
-+bool permissive;
- module_param(permissive, bool, 0644);
- 
- /* This is where xen_pcibk_read_config_byte, xen_pcibk_read_config_word,
-diff --git a/drivers/xen/xen-pciback/conf_space.h b/drivers/xen/xen-pciback/conf_space.h
-index e56c934ad137..2e1d73d1d5d0 100644
---- a/drivers/xen/xen-pciback/conf_space.h
-+++ b/drivers/xen/xen-pciback/conf_space.h
-@@ -64,6 +64,8 @@ struct config_field_entry {
- 	void *data;
- };
- 
-+extern bool permissive;
-+
- #define OFFSET(cfg_entry) ((cfg_entry)->base_offset+(cfg_entry)->field->offset)
- 
- /* Add fields to a device - the add_fields macro expects to get a pointer to
-diff --git a/drivers/xen/xen-pciback/conf_space_header.c b/drivers/xen/xen-pciback/conf_space_header.c
-index c5ee82587e8c..2d7369391472 100644
---- a/drivers/xen/xen-pciback/conf_space_header.c
-+++ b/drivers/xen/xen-pciback/conf_space_header.c
-@@ -11,6 +11,10 @@
- #include "pciback.h"
- #include "conf_space.h"
- 
-+struct pci_cmd_info {
-+	u16 val;
-+};
-+
- struct pci_bar_info {
- 	u32 val;
- 	u32 len_val;
-@@ -20,22 +24,36 @@ struct pci_bar_info {
- #define is_enable_cmd(value) ((value)&(PCI_COMMAND_MEMORY|PCI_COMMAND_IO))
- #define is_master_cmd(value) ((value)&PCI_COMMAND_MASTER)
- 
--static int command_read(struct pci_dev *dev, int offset, u16 *value, void *data)
-+/* Bits guests are allowed to control in permissive mode. */
-+#define PCI_COMMAND_GUEST (PCI_COMMAND_MASTER|PCI_COMMAND_SPECIAL| \
-+			   PCI_COMMAND_INVALIDATE|PCI_COMMAND_VGA_PALETTE| \
-+			   PCI_COMMAND_WAIT|PCI_COMMAND_FAST_BACK)
-+
-+static void *command_init(struct pci_dev *dev, int offset)
- {
--	int i;
--	int ret;
--
--	ret = xen_pcibk_read_config_word(dev, offset, value, data);
--	if (!pci_is_enabled(dev))
--		return ret;
--
--	for (i = 0; i < PCI_ROM_RESOURCE; i++) {
--		if (dev->resource[i].flags & IORESOURCE_IO)
--			*value |= PCI_COMMAND_IO;
--		if (dev->resource[i].flags & IORESOURCE_MEM)
--			*value |= PCI_COMMAND_MEMORY;
-+	struct pci_cmd_info *cmd = kmalloc(sizeof(*cmd), GFP_KERNEL);
-+	int err;
-+
-+	if (!cmd)
-+		return ERR_PTR(-ENOMEM);
-+
-+	err = pci_read_config_word(dev, PCI_COMMAND, &cmd->val);
-+	if (err) {
-+		kfree(cmd);
-+		return ERR_PTR(err);
- 	}
- 
-+	return cmd;
-+}
-+
-+static int command_read(struct pci_dev *dev, int offset, u16 *value, void *data)
-+{
-+	int ret = pci_read_config_word(dev, offset, value);
-+	const struct pci_cmd_info *cmd = data;
-+
-+	*value &= PCI_COMMAND_GUEST;
-+	*value |= cmd->val & ~PCI_COMMAND_GUEST;
-+
- 	return ret;
- }
- 
-@@ -43,6 +61,8 @@ static int command_write(struct pci_dev *dev, int offset, u16 value, void *data)
- {
- 	struct xen_pcibk_dev_data *dev_data;
- 	int err;
-+	u16 val;
-+	struct pci_cmd_info *cmd = data;
- 
- 	dev_data = pci_get_drvdata(dev);
- 	if (!pci_is_enabled(dev) && is_enable_cmd(value)) {
-@@ -83,6 +103,19 @@ static int command_write(struct pci_dev *dev, int offset, u16 value, void *data)
- 		}
- 	}
- 
-+	cmd->val = value;
-+
-+	if (!permissive && (!dev_data || !dev_data->permissive))
-+		return 0;
-+
-+	/* Only allow the guest to control certain bits. */
-+	err = pci_read_config_word(dev, offset, &val);
-+	if (err || val == value)
-+		return err;
-+
-+	value &= PCI_COMMAND_GUEST;
-+	value |= val & ~PCI_COMMAND_GUEST;
-+
- 	return pci_write_config_word(dev, offset, value);
- }
- 
-@@ -282,6 +315,8 @@ static const struct config_field header_common[] = {
- 	{
- 	 .offset    = PCI_COMMAND,
- 	 .size      = 2,
-+	 .init      = command_init,
-+	 .release   = bar_release,
- 	 .u.w.read  = command_read,
- 	 .u.w.write = command_write,
- 	},
--- 
-2.1.0
-
-- 
cgit v0.10.2


	http://pkgs.fedoraproject.org/cgit/kernel.git/commit/?h=f20&id=fa02ba3c8d618a327939db8ae3dc8f3282a89351


More information about the scm-commits mailing list