From 98a08a40e07de02d0797788d0dbf1fc33e14c2dd Mon Sep 17 00:00:00 2001 From: Justin M. Forbes Date: Mar 16 2015 17:35:05 +0000 Subject: Linux v3.19.1 --- diff --git a/Add-sysrq-option-to-disable-secure-boot-mode.patch b/Add-sysrq-option-to-disable-secure-boot-mode.patch index b9d220c..bbd41f2 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 bc31a43b31a0..5f80d12a55cb 100644 +index b40d6174242f..0ee7749bad74 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c @@ -70,6 +70,11 @@ @@ -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 6ffdc96059a0..2f8f814ae94c 100644 +index 7b40c5f07dce..8a60477b96e1 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 cace4bd04956..a33be993df25 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 diff --git a/Bluetooth-ath3k-Add-support-Atheros-AR5B195-combo-Mi.patch b/Bluetooth-ath3k-Add-support-Atheros-AR5B195-combo-Mi.patch index d09756e..38afde1 100644 --- a/Bluetooth-ath3k-Add-support-Atheros-AR5B195-combo-Mi.patch +++ b/Bluetooth-ath3k-Add-support-Atheros-AR5B195-combo-Mi.patch @@ -43,7 +43,7 @@ Cc: stable@vger.kernel.org 2 files changed, 2 insertions(+) diff --git a/drivers/bluetooth/ath3k.c b/drivers/bluetooth/ath3k.c -index fe1678c4ff89..99e9d879a460 100644 +index 086240cd29c3..b2c68213696a 100644 --- a/drivers/bluetooth/ath3k.c +++ b/drivers/bluetooth/ath3k.c @@ -65,6 +65,7 @@ static const struct usb_device_id ath3k_table[] = { @@ -55,10 +55,10 @@ index fe1678c4ff89..99e9d879a460 100644 { USB_DEVICE(0x0CF3, 0x3002) }, { USB_DEVICE(0x0CF3, 0xE019) }, diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c -index f0e2f721c8ce..d8b5b37aa1bd 100644 +index 091c813df8e9..79e344f9e681 100644 --- a/drivers/bluetooth/btusb.c +++ b/drivers/bluetooth/btusb.c -@@ -150,6 +150,7 @@ static const struct usb_device_id blacklist_table[] = { +@@ -142,6 +142,7 @@ static const struct usb_device_id blacklist_table[] = { /* Atheros 3011 with sflash firmware */ { USB_DEVICE(0x0489, 0xe027), .driver_info = BTUSB_IGNORE }, { USB_DEVICE(0x0489, 0xe03d), .driver_info = BTUSB_IGNORE }, 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 fc12f13..0000000 --- a/HID-add-support-for-MS-Surface-Pro-3-Type-Cover.patch +++ /dev/null @@ -1,84 +0,0 @@ -From: Alan Wu -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 -Signed-off-by: Jiri Kosina ---- - 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 dfaccfca0688..84e15038b2f9 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) -@@ -1863,6 +1868,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 0e28190480d7..4b7e06fc35c5 100644 ---- a/drivers/hid/hid-ids.h -+++ b/drivers/hid/hid-ids.h -@@ -651,6 +651,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 4477eb7457de..b27b3d33ebab 100644 ---- a/drivers/hid/usbhid/hid-quirks.c -+++ b/drivers/hid/usbhid/hid-quirks.c -@@ -79,6 +79,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 }, --- -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 -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 -Signed-off-by: Steve French ---- - 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 5cdaa8c..0000000 --- a/acpi-video-Add-disable_native_backlight-quirk-for-De.patch +++ /dev/null @@ -1,37 +0,0 @@ -From: Hans de Goede -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 ---- - drivers/acpi/video.c | 9 +++++++++ - 1 file changed, 9 insertions(+) - -diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c -index 8a61e5dd397b..25863442b6ae 100644 ---- a/drivers/acpi/video.c -+++ b/drivers/acpi/video.c -@@ -522,6 +522,15 @@ static struct dmi_system_id video_dmi_table[] __initdata = { - DMI_MATCH(DMI_PRODUCT_NAME, "370R4E/370R4V/370R5E/3570RE/370R5V"), - }, - }, -+ { -+ /* 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 52b0197..0000000 --- a/arm-dts-sun7i-bananapi.patch +++ /dev/null @@ -1,213 +0,0 @@ -From: Hans de Goede -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 ---- - 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 38c89cafa1ab..63422bde3a46 100644 ---- a/arch/arm/boot/dts/Makefile -+++ b/arch/arm/boot/dts/Makefile -@@ -435,6 +435,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-hummingbird.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 -+ * -+ * 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@01c00000 { -+ mmc0: mmc@01c0f000 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&mmc0_pins_a>, <&mmc0_cd_pin_bananapi>; -+ vmmc-supply = <®_vcc3v3>; -+ bus-width = <4>; -+ cd-gpios = <&pio 7 10 0>; /* PH10 */ -+ cd-inverted; -+ status = "okay"; -+ }; -+ -+ usbphy: phy@01c13400 { -+ usb1_vbus-supply = <®_usb1_vbus>; -+ usb2_vbus-supply = <®_usb2_vbus>; -+ status = "okay"; -+ }; -+ -+ ehci0: usb@01c14000 { -+ status = "okay"; -+ }; -+ -+ ohci0: usb@01c14400 { -+ status = "okay"; -+ }; -+ -+ ahci: sata@01c18000 { -+ status = "okay"; -+ }; -+ -+ ehci1: usb@01c1c000 { -+ status = "okay"; -+ }; -+ -+ ohci1: usb@01c1c400 { -+ status = "okay"; -+ }; -+ -+ pinctrl@01c20800 { -+ uart3_pins_bananapi: uart3_pin@0 { -+ allwinner,pins = "PH0", "PH1"; -+ allwinner,function = "uart3"; -+ allwinner,drive = <0>; -+ allwinner,pull = <0>; -+ }; -+ -+ mmc0_cd_pin_bananapi: mmc0_cd_pin@0 { -+ allwinner,pins = "PH10"; -+ allwinner,function = "gpio_in"; -+ allwinner,drive = <0>; -+ allwinner,pull = <1>; -+ }; -+ -+ gmac_power_pin_bananapi: gmac_power_pin@0 { -+ allwinner,pins = "PH23"; -+ allwinner,function = "gpio_out"; -+ allwinner,drive = <0>; -+ allwinner,pull = <0>; -+ }; -+ -+ led_pins_bananapi: led_pins@0 { -+ allwinner,pins = "PH24"; -+ allwinner,function = "gpio_out"; -+ allwinner,drive = <0>; -+ allwinner,pull = <0>; -+ }; -+ }; -+ -+ ir0: ir@01c21800 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&ir0_pins_a>; -+ status = "okay"; -+ }; -+ -+ uart0: serial@01c28000 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&uart0_pins_a>; -+ status = "okay"; -+ }; -+ -+ uart3: serial@01c28c00 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&uart3_pins_bananapi>; -+ status = "okay"; -+ }; -+ -+ uart7: serial@01c29c00 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&uart7_pins_a>; -+ status = "okay"; -+ }; -+ -+ i2c0: i2c@01c2ac00 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&i2c0_pins_a>; -+ status = "okay"; -+ -+ axp209: pmic@34 { -+ compatible = "x-powers,axp209"; -+ reg = <0x34>; -+ interrupt-parent = <&nmi_intc>; -+ interrupts = <0 8>; -+ -+ interrupt-controller; -+ #interrupt-cells = <1>; -+ }; -+ }; -+ -+ i2c2: i2c@01c2b400 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&i2c2_pins_a>; -+ status = "okay"; -+ }; -+ -+ gmac: ethernet@01c50000 { -+ pinctrl-names = "default"; -+ pinctrl-0 = <&gmac_pins_rgmii_a>; -+ phy = <&phy1>; -+ phy-mode = "rgmii"; -+ phy-supply = <®_gmac_3v3>; -+ status = "okay"; -+ -+ phy1: ethernet-phy@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>; -+ }; -+}; --- -2.1.0 - diff --git a/arm64-fix-ooo-descriptor-read.patch b/arm64-fix-ooo-descriptor-read.patch deleted file mode 100644 index dd65c0b..0000000 --- a/arm64-fix-ooo-descriptor-read.patch +++ /dev/null @@ -1,64 +0,0 @@ -commit ecf6ba83d76e0c78e89401750dc527008e14faa2 -Author: Iyappan Subramanian -Date: Thu Jan 29 14:38:23 2015 -0800 - - drivers: net: xgene: fix: Out of order descriptor bytes read - - This patch fixes the following kernel crash, - - WARNING: CPU: 2 PID: 0 at net/ipv4/tcp_input.c:3079 tcp_clean_rtx_queue+0x658/0x80c() - Call trace: - [] dump_backtrace+0x0/0x184 - [] show_stack+0x10/0x1c - [] dump_stack+0x74/0x98 - [] warn_slowpath_common+0x88/0xb0 - [] warn_slowpath_null+0x14/0x20 - [] tcp_clean_rtx_queue+0x654/0x80c - [] tcp_ack+0x454/0x688 - [] tcp_rcv_established+0x4a4/0x62c - [] tcp_v4_do_rcv+0x16c/0x350 - [] tcp_v4_rcv+0x8e8/0x904 - [] ip_local_deliver_finish+0x100/0x26c - [] ip_local_deliver+0xac/0xc4 - [] ip_rcv_finish+0xe8/0x328 - [] ip_rcv+0x24c/0x38c - [] __netif_receive_skb_core+0x29c/0x7c8 - [] __netif_receive_skb+0x28/0x7c - [] netif_receive_skb_internal+0x5c/0xe0 - [] napi_gro_receive+0xb4/0x110 - [] xgene_enet_process_ring+0x144/0x338 - [] xgene_enet_napi+0x1c/0x50 - [] net_rx_action+0x154/0x228 - [] __do_softirq+0x110/0x28c - [] irq_exit+0x8c/0xc0 - [] handle_IRQ+0x44/0xa8 - [] gic_handle_irq+0x38/0x7c - [...] - - Software writes poison data into the descriptor bytes[15:8] and upon - receiving the interrupt, if those bytes are overwritten by the hardware with - the valid data, software also reads bytes[7:0] and executes receive/tx - completion logic. - - If the CPU executes the above two reads in out of order fashion, then the - bytes[7:0] will have older data and causing the kernel panic. We have to - force the order of the reads and thus this patch introduces read memory - barrier between these reads. - - Signed-off-by: Iyappan Subramanian - Signed-off-by: Keyur Chudgar - Signed-off-by: David S. Miller - -diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_main.c b/drivers/net/ethernet/apm/xgene/xgene_enet_main.c -index 83a5028..793f3b7 100644 ---- a/drivers/net/ethernet/apm/xgene/xgene_enet_main.c -+++ b/drivers/net/ethernet/apm/xgene/xgene_enet_main.c -@@ -369,6 +369,8 @@ static int xgene_enet_process_ring(struct xgene_enet_desc_ring *ring, - if (unlikely(xgene_enet_is_desc_slot_empty(raw_desc))) - break; - -+ /* read fpqnum field after dataaddr field */ -+ dmb(oshld); - if (is_rx_desc(raw_desc)) - ret = xgene_enet_rx_frame(ring, raw_desc); - else diff --git a/arm64-revert-tlb-rcu_table_free.patch b/arm64-revert-tlb-rcu_table_free.patch deleted file mode 100644 index 1de4723..0000000 --- a/arm64-revert-tlb-rcu_table_free.patch +++ /dev/null @@ -1,151 +0,0 @@ -diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig -index 9532f8d..2c9530e 100644 ---- a/arch/arm64/Kconfig -+++ b/arch/arm64/Kconfig -@@ -58,7 +58,6 @@ config ARM64 - select HAVE_PERF_EVENTS - select HAVE_PERF_REGS - select HAVE_PERF_USER_STACK_DUMP -- select HAVE_RCU_TABLE_FREE - select HAVE_SYSCALL_TRACEPOINTS - select IRQ_DOMAIN - select MODULES_USE_ELF_RELA -@@ -112,9 +111,6 @@ config GENERIC_CALIBRATE_DELAY - config ZONE_DMA - def_bool y - --config HAVE_GENERIC_RCU_GUP -- def_bool y -- - config ARCH_DMA_ADDR_T_64BIT - def_bool y - -diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h -index 41a43bf..39f3ad6 100644 ---- a/arch/arm64/include/asm/pgtable.h -+++ b/arch/arm64/include/asm/pgtable.h -@@ -244,16 +244,6 @@ static inline void set_pte_at(struct mm_struct *mm, unsigned long addr, - - #define __HAVE_ARCH_PTE_SPECIAL - --static inline pte_t pud_pte(pud_t pud) --{ -- return __pte(pud_val(pud)); --} -- --static inline pmd_t pud_pmd(pud_t pud) --{ -- return __pmd(pud_val(pud)); --} -- - static inline pte_t pmd_pte(pmd_t pmd) - { - return __pte(pmd_val(pmd)); -@@ -271,13 +261,7 @@ static inline pmd_t pte_pmd(pte_t pte) - #ifdef CONFIG_TRANSPARENT_HUGEPAGE - #define pmd_trans_huge(pmd) (pmd_val(pmd) && !(pmd_val(pmd) & PMD_TABLE_BIT)) - #define pmd_trans_splitting(pmd) pte_special(pmd_pte(pmd)) --#ifdef CONFIG_HAVE_RCU_TABLE_FREE --#define __HAVE_ARCH_PMDP_SPLITTING_FLUSH --struct vm_area_struct; --void pmdp_splitting_flush(struct vm_area_struct *vma, unsigned long address, -- pmd_t *pmdp); --#endif /* CONFIG_HAVE_RCU_TABLE_FREE */ --#endif /* CONFIG_TRANSPARENT_HUGEPAGE */ -+#endif - - #define pmd_young(pmd) pte_young(pmd_pte(pmd)) - #define pmd_wrprotect(pmd) pte_pmd(pte_wrprotect(pmd_pte(pmd))) -@@ -298,7 +282,6 @@ void pmdp_splitting_flush(struct vm_area_struct *vma, unsigned long address, - #define mk_pmd(page,prot) pfn_pmd(page_to_pfn(page),prot) - - #define pmd_page(pmd) pfn_to_page(__phys_to_pfn(pmd_val(pmd) & PHYS_MASK)) --#define pud_write(pud) pte_write(pud_pte(pud)) - #define pud_pfn(pud) (((pud_val(pud) & PUD_MASK) & PHYS_MASK) >> PAGE_SHIFT) - - #define set_pmd_at(mm, addr, pmdp, pmd) set_pte_at(mm, addr, (pte_t *)pmdp, pmd_pte(pmd)) -@@ -400,8 +383,6 @@ static inline pmd_t *pmd_offset(pud_t *pud, unsigned long addr) - return (pmd_t *)pud_page_vaddr(*pud) + pmd_index(addr); - } - --#define pud_page(pud) pmd_page(pud_pmd(pud)) -- - #endif /* CONFIG_ARM64_PGTABLE_LEVELS > 2 */ - - #if CONFIG_ARM64_PGTABLE_LEVELS > 3 -diff --git a/arch/arm64/include/asm/tlb.h b/arch/arm64/include/asm/tlb.h -index a82c0c5..62731ef 100644 ---- a/arch/arm64/include/asm/tlb.h -+++ b/arch/arm64/include/asm/tlb.h -@@ -23,20 +23,6 @@ - - #include - --#include --#include -- --#ifdef CONFIG_HAVE_RCU_TABLE_FREE -- --#define tlb_remove_entry(tlb, entry) tlb_remove_table(tlb, entry) --static inline void __tlb_remove_table(void *_table) --{ -- free_page_and_swap_cache((struct page *)_table); --} --#else --#define tlb_remove_entry(tlb, entry) tlb_remove_page(tlb, entry) --#endif /* CONFIG_HAVE_RCU_TABLE_FREE */ -- - /* - * There's three ways the TLB shootdown code is used: - * 1. Unmapping a range of vmas. See zap_page_range(), unmap_region(). -@@ -102,7 +88,7 @@ static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte, - { - pgtable_page_dtor(pte); - tlb_add_flush(tlb, addr); -- tlb_remove_entry(tlb, pte); -+ tlb_remove_page(tlb, pte); - } - - #if CONFIG_ARM64_PGTABLE_LEVELS > 2 -@@ -110,7 +96,7 @@ static inline void __pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmdp, - unsigned long addr) - { - tlb_add_flush(tlb, addr); -- tlb_remove_entry(tlb, virt_to_page(pmdp)); -+ tlb_remove_page(tlb, virt_to_page(pmdp)); - } - #endif - -@@ -119,7 +105,7 @@ static inline void __pud_free_tlb(struct mmu_gather *tlb, pud_t *pudp, - unsigned long addr) - { - tlb_add_flush(tlb, addr); -- tlb_remove_entry(tlb, virt_to_page(pudp)); -+ tlb_remove_page(tlb, virt_to_page(pudp)); - } - #endif - -diff --git a/arch/arm64/mm/flush.c b/arch/arm64/mm/flush.c -index b6f14e8..0d64089 100644 ---- a/arch/arm64/mm/flush.c -+++ b/arch/arm64/mm/flush.c -@@ -104,19 +104,3 @@ EXPORT_SYMBOL(flush_dcache_page); - */ - EXPORT_SYMBOL(flush_cache_all); - EXPORT_SYMBOL(flush_icache_range); -- --#ifdef CONFIG_TRANSPARENT_HUGEPAGE --#ifdef CONFIG_HAVE_RCU_TABLE_FREE --void pmdp_splitting_flush(struct vm_area_struct *vma, unsigned long address, -- pmd_t *pmdp) --{ -- pmd_t pmd = pmd_mksplitting(*pmdp); -- -- VM_BUG_ON(address & ~PMD_MASK); -- set_pmd_at(vma->vm_mm, address, pmdp, pmd); -- -- /* dummy IPI to serialise against fast_gup */ -- kick_all_cpus_sync(); --} --#endif /* CONFIG_HAVE_RCU_TABLE_FREE */ --#endif /* CONFIG_TRANSPARENT_HUGEPAGE */ 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..f071dd9 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 @@ -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 @@ -544,7 +531,7 @@ CONFIG_INPUT_AB8500_PONKEY=m CONFIG_REGULATOR_AB8500=y CONFIG_AB8500_USB=m CONFIG_USB_MUSB_UX500=m -# CONFIG_USB_UX500_DMA is not set +CONFIG_USB_UX500_DMA=y CONFIG_RTC_DRV_AB8500=m CONFIG_PWM_AB8500=m CONFIG_SND_SOC_UX500=m @@ -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..5be7d4b 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 @@ -387,12 +410,12 @@ CONFIG_USB_OTG=y CONFIG_USB_GADGET=m CONFIG_USB_GADGET_VBUS_DRAW=100 CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=2 -# Use PIO on musb as upstream doesn't support multiple DMA engines yet :-/ -CONFIG_MUSB_PIO_ONLY=y # CONFIG_USB_GADGET_XILINX is not set 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 +429,22 @@ 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_MUSB_PIO_ONLY 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 +599,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 +677,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 +723,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 +736,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 +784,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 +806,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 +814,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 +850,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..3be461d 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,6 +3561,7 @@ 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 @@ -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 @@ -5004,6 +5124,7 @@ CONFIG_STAGING=y # CONFIG_ANDROID is not set CONFIG_STAGING_MEDIA=y # CONFIG_DVB_AS102 is not set +# CONFIG_ET131X is not set # CONFIG_SLICOSS is not set # CONFIG_VIDEO_DT3155 is not set # CONFIG_TI_ST is not set @@ -5062,6 +5183,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 c9bc2ee..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 @@ -176,8 +180,8 @@ CONFIG_CXL=m # CONFIG_PPC_ICSWX_PID is not set # CONFIG_PPC_ICSWX_USE_SIGILL is not set # CONFIG_PCIEPORTBUS is not set +# CONFIG_PPC_TRANSACTIONAL_MEM is not set # CONFIG_SND_HDA_INTEL is not set CONFIG_BLK_DEV_RSXX=m -CONFIG_PPC_TRANSACTIONAL_MEM=y # CONFIG_CARL9170 is not set diff --git a/config-powerpc64p7 b/config-powerpc64p7 index dfff59c..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 @@ -168,4 +172,3 @@ CONFIG_CXL=m # CONFIG_PCIEPORTBUS is not set # CONFIG_SND_HDA_INTEL is not set CONFIG_BLK_DEV_RSXX=m -CONFIG_PPC_TRANSACTIONAL_MEM=y 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 f3700a2..a473db3 100644 --- a/config-x86-generic +++ b/config-x86-generic @@ -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-Disable-verbose-state-checks.patch b/drm-i915-Disable-verbose-state-checks.patch deleted file mode 100644 index 08e9888..0000000 --- a/drm-i915-Disable-verbose-state-checks.patch +++ /dev/null @@ -1,31 +0,0 @@ -From: Josh Boyer -Date: Thu, 29 Jan 2015 14:03:17 -0500 -Subject: [PATCH] drm/i915: Disable verbose state checks - -For stable releases, we disable the verbose state checks in the i915 driver. -They are mostly for development purposes and they fill the retrace server -to the point of uselessness. We leave these enabled in rawhide kernels, -where they are both more likely to get attention from upstream and more -likely to be fixable. - -Signed-off-by: Josh Boyer ---- - drivers/gpu/drm/i915/i915_params.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/drivers/gpu/drm/i915/i915_params.c b/drivers/gpu/drm/i915/i915_params.c -index db07153b693f..c049fe3fbdff 100644 ---- a/drivers/gpu/drm/i915/i915_params.c -+++ b/drivers/gpu/drm/i915/i915_params.c -@@ -51,7 +51,7 @@ struct i915_params i915 __read_mostly = { - .disable_vtd_wa = 0, - .use_mmio_flip = 0, - .mmio_debug = 0, -- .verbose_state_checks = 1, -+ .verbose_state_checks = 0, - }; - - module_param_named(modeset, i915.modeset, int, 0400); --- -2.1.0 - diff --git a/drm-i915-hush-check-crtc-state.patch b/drm-i915-hush-check-crtc-state.patch new file mode 100644 index 0000000..6e25762 --- /dev/null +++ b/drm-i915-hush-check-crtc-state.patch @@ -0,0 +1,31 @@ +From: Adam Jackson +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 76cd2205bc9c..b1285eec32ba 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..125a738 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 Acked-by: Jani Nikula Signed-off-by: Daniel Vetter -Backported-by: Josh Boyer --- 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 9d7a7155bf02..d04ed2b2728e 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 { +@@ -2309,6 +2338,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 e7a16f119a29..76cd2205bc9c 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 5cecc20efa71..841e3d0b223d 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/hibernate-Disable-in-a-signed-modules-environment.patch b/hibernate-Disable-in-a-signed-modules-environment.patch index fa1d53a..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 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c -index 1f35a3478f3c..5e2472fc3dda 100644 +index 2329daae5255..48a8e82c7e2e 100644 --- a/kernel/power/hibernate.c +++ b/kernel/power/hibernate.c -@@ -28,6 +28,7 @@ - #include +@@ -29,6 +29,7 @@ #include #include + #include +#include #include #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) { diff --git a/i8042-Add-notimeout-quirk-for-Fujitsu-Lifebook-A544-.patch b/i8042-Add-notimeout-quirk-for-Fujitsu-Lifebook-A544-.patch new file mode 100644 index 0000000..d6c4f1b --- /dev/null +++ b/i8042-Add-notimeout-quirk-for-Fujitsu-Lifebook-A544-.patch @@ -0,0 +1,45 @@ +From: Hans de Goede +Date: Fri, 24 Oct 2014 11:30:19 +0200 +Subject: [PATCH] i8042: Add notimeout quirk for Fujitsu Lifebook A544 and + Lifebook AH544 + +These models need i8042.notimeout, otherwise the touchpad will not work. + +BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=69731 +BugLink: https://bugzilla.redhat.com/show_bug.cgi?id=1111138 +Cc: stable@vger.kernel.org +Signed-off-by: Hans de Goede +--- + drivers/input/serio/i8042-x86ia64io.h | 16 ++++++++++++++++ + 1 file changed, 16 insertions(+) + +diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h +index a0bcbb64d06d..aa9b299f4e26 100644 +--- a/drivers/input/serio/i8042-x86ia64io.h ++++ b/drivers/input/serio/i8042-x86ia64io.h +@@ -364,6 +364,22 @@ static const struct dmi_system_id __initconst i8042_dmi_notimeout_table[] = { + }, + }, + { ++ /* Fujitsu A544 laptop */ ++ /* https://bugzilla.redhat.com/show_bug.cgi?id=1111138 */ ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), ++ DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK A544"), ++ }, ++ }, ++ { ++ /* Fujitsu AH544 laptop */ ++ /* https://bugzilla.kernel.org/show_bug.cgi?id=69731 */ ++ .matches = { ++ DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"), ++ DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK AH544"), ++ }, ++ }, ++ { + /* Fujitsu U574 laptop */ + /* https://bugzilla.kernel.org/show_bug.cgi?id=69731 */ + .matches = { +-- +1.9.3 + diff --git a/kernel-arm64.patch b/kernel-arm64.patch index e675c7b..df9c19d 100644 --- a/kernel-arm64.patch +++ b/kernel-arm64.patch @@ -1,1920 +1,59 @@ -commit 0335b5034b998e978bf9343da77246bcbad33981 -Author: Mark Salter -Date: Wed Nov 19 10:32:11 2014 -0500 - - arm64: explicitly set noncoherent ops for _CCA handling - - Signed-off-by: Mark Salter - -commit 4a2d43442e20a24b78594d12914706deddc119de -Author: Mark Salter -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 - -commit b93f804830d9ef6d572dd6be9734108199141b87 -Author: Mark Salter -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 - -commit 2d76cb937a6c0010d1de181d0142f0822df5071d -Author: Mark Salter -Date: Mon Nov 10 17:30:25 2014 -0500 - - arm64/pci/acpi: initial support for ACPI probing of PCI - - Signed-off-by: Mark Salter - -commit a438ff7be0140738b1224d5ade6345a9febad279 -Author: Mark Salter -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 - -commit 814b22167d35b18fc3de745277a2190ff0841585 -Author: Mark Salter -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 - -commit b90d000000801b473ed4c69757d3be9e433b6c5e -Author: Mark Salter -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 - -commit 243e5c1dc198958ce862e39d33efc798a47b339a -Author: Mark Salter -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 - -commit 612eea3ae291b28f7ed50ccf50bd1685a2a7f753 -Author: Mark Salter -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 - -commit 3d509a508c6fd70eb0fb2f0e82d08d92cc96568c -Author: Mark Salter -Date: Sat Nov 22 12:08:53 2014 -0500 - - DO NOT UPSTREAM - arm64: kvm: Change vgic resource size error to info - - From: Donald Dutile - - 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 - -commit 2b5dd4609e947b418afbbeae95da7f34594bc048 -Author: Wei Huang -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 - [combined with subsequent patch to use acpi_disabled] - Signed-off-by: Mark Salter - -commit 756fc31666a4a3094727da5274fc0705a05f13a3 -Author: Wei Huang -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 - [combined with subsequent patch to use acpi_disabled] - Signed-off-by: Mark Salter - -commit b189108603f6db4a11e0c30050e840e8bb36f098 -Author: Ard Biesheuvel -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 - - 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 - -commit 8ab19d68b49c2f6a9f0e6226c51bf9b2fe553022 -Author: Laszlo Ersek -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 - - 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 - Signed-off-by: Ard Biesheuvel - - 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 - -commit 1ac87393dff5d6fb10edfba84dfff89f57a7224a -Author: Ard Biesheuvel -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 - Signed-off-by: Laszlo Ersek - -commit 2a0a5cbf98c94e2906d9a357a63fbbb153488e1c -Author: Tom Lendacky -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 - -commit 807e95abb96e7868e1c8e863a92298937a69d437 -Author: Mark Salter -Date: Tue Oct 7 12:54:08 2014 -0400 - - xgene acpi network - first cut - -commit bdecd2af5d4234ed50042ab28a21736edcec6d41 -Author: Geert Uytterhoeven -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 - Reviewed-by: Mika Westerberg - Signed-off-by: Rafael J. Wysocki - -commit 42b0d1b64cdf1c8d37e69ff7cff45852f7a16f65 -Author: Rafael J. Wysocki -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 - Acked-by: Grant Likely - Acked-by: Mika Westerberg - Tested-by: Mika Westerberg - Signed-off-by: Rafael J. Wysocki - -commit c3f29cda7420da6a721d40d116f369cfc1533d38 -Author: Mika Westerberg -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 - Signed-off-by: Mika Westerberg - Acked-by: Andrew Lunn - Reviewed-by: Linus Walleij - Acked-by: Alexandre Courbot - Signed-off-by: Rafael J. Wysocki - -commit 4117b39d39f59d2497ceac1091ec54aa3056cb4f -Author: Rafael J. Wysocki -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 - Reviewed-by: Mika Westerberg - -commit d9345c86ad290bb4ca98b37520f94fc8075b2b94 -Author: Mika Westerberg -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 - Reviewed-by: Johannes Berg - Acked-by: John W. Linville - Acked-by: Linus Walleij - Signed-off-by: Rafael J. Wysocki - -commit 22cb8c44e198b7e3f3299324edbcaa1389016d52 -Author: Rafael J. Wysocki -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 - Reviewed-by: Linus Walleij - Signed-off-by: Rafael J. Wysocki - -commit c70e2807a8bacbdfed992b58ca24eb152a778a01 -Author: Aaron Lu -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 - Signed-off-by: Mika Westerberg - Acked-by: Dmitry Torokhov - Acked-by: Grant Likely - Signed-off-by: Rafael J. Wysocki - -commit 29257e751014d0d43f78bcfecd9a56a603096c95 -Author: Rafael J. Wysocki -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 - Acked-by: Bryan Wu - Acked-by: Grant Likely - Signed-off-by: Rafael J. Wysocki - -commit 08ddbc9678ce8465f17acc8e1b1b67442593d1b5 -Author: Mika Westerberg -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 - Acked-by: Alexandre Courbot - Acked-by: Grant Likely - Signed-off-by: Rafael J. Wysocki - -commit 880614f83402ae8b408f33cb252505da0760f3e5 -Author: Rafael J. Wysocki -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 - Acked-by: Greg Kroah-Hartman - Acked-by: Grant Likely - Signed-off-by: Rafael J. Wysocki - -commit b5923f9dc379c1861a70d8836c7d9976d9521390 -Author: Aaron Lu -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 - Signed-off-by: Mika Westerberg - Acked-by: Alexandre Courbot - Reviewed-by: Linus Walleij - Acked-by: Dmitry Torokhov - Acked-by: Grant Likely - Signed-off-by: Rafael J. Wysocki - -commit 5c3c4fe36a05672113646f8fb839e4c91256ef5d -Author: Mika Westerberg -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 - Acked-by: Alexandre Courbot - Acked-by: Bryan Wu - Acked-by: Arnd Bergmann - Acked-by: Grant Likely - Signed-off-by: Rafael J. Wysocki - -commit 8105c03352f32060c765837cbb7d619e075289d9 -Author: Mika Westerberg -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 - Acked-by: Linus Walleij - Acked-by: Grant Likely - Signed-off-by: Rafael J. Wysocki - -commit ce0e2672808ce2805d0aadfd12d94e2dd6be5ab9 -Author: Mika Westerberg -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 - Acked-by: Linus Walleij - Acked-by: Grant Likely - Signed-off-by: Rafael J. Wysocki - -commit e072a051ef3a5d612949dc22ca71e40dbe978ed1 -Author: Mika Westerberg -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 - Acked-by: Grant Likely - Signed-off-by: Rafael J. Wysocki - -commit e176d66bf1a8e613e501dae1fc6798e1a42b7062 -Author: Mika Westerberg -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 - Acked-by: Grant Likely - Signed-off-by: Rafael J. Wysocki - -commit e30b98eab5645fa42d372cc1be44e22db5f5e9b8 -Author: Rafael J. Wysocki -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 - Signed-off-by: Mika Westerberg - Acked-by: Greg Kroah-Hartman - Acked-by: Grant Likely - Signed-off-by: Rafael J. Wysocki - -commit a8762c178234b62dce5e55df8de8528857a47bb7 -Author: Mika Westerberg -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", }, - Package () {"name2", }, - ... - } - }) - - 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 - Reviewed-by: Josh Triplett - Reviewed-by: Grant Likely - Signed-off-by: Darren Hart - Signed-off-by: Rafael J. Wysocki - Signed-off-by: Mika Westerberg - Signed-off-by: Rafael J. Wysocki - -commit a9240791b83abd372e4efb77f20444c27a56ebae -Author: Mark Salter -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 - -commit 6fee3b2bd2ad6349e7bb3082393bf6355e01ce6f -Author: Tom Lendacky -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 - -commit 0a0eea6d358d51ab381e2945c0e9db2f6cc06157 -Author: Tom Lendacky -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 - -commit ff93b53f3ca8748529855d421bf79329086544cd -Author: Graeme Gregory -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 - -commit 5315cb5a532e900612ac1202507551761e8bd13c -Author: Graeme Gregory -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 - -commit 640f607f1fa10c7c0cd6025dde8883d02fc9b411 -Author: Mark Salter -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 -Date: Mon Aug 11 13:46:43 2014 -0400 - - xgene: add support for ACPI-probed serial port - -commit 3d0ad3e452a81a32842d85dbb88078b74582efb5 -Author: Mark Salter -Date: Sat Aug 9 12:01:20 2014 -0400 - - sata/xgene: support acpi probing - - Signed-off-by: Mark Salter - -commit a42353df5a2f741e8d2e356c3f053aac8d3eff0e -Author: Mark Salter -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 - -commit d81f088880b9d763a7006e40dff6bb526c534255 -Author: Mark Salter -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 - -commit 475b6ce1555e1146761b53c550f2ac019311739f -Author: Hanjun Guo -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 - [fixed up for 3.17-rc] - Signed-off-by: Mark Salter - -commit cb6ebe40936adc5c3154abbec6f89ccb8a0536b7 -Author: Al Stone -Date: Thu Aug 28 13:14:16 2014 -0400 - - Fix arm64 compilation error in PNP code - - Signed-off-by: Mark Salter - -commit b7fc0378e13207a53a3e8466ba6329cfbcaa0526 -Author: Suravee Suthikulpanit -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 - -commit c5b655e6af273a61e7ec3653deb3550ae4f7abf1 -Author: Mark Salter -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 - -commit 6bee52af3d281d91b871f6876138fa51a41f0472 -Author: Graeme Gregory -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 - -commit a66f13e7c17cf7283b9987da2349c0a5c204fa4b -Author: Mark Salter -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 - -commit b00f36975b651c0afbddee49e84109694e610f43 -Author: Graeme Gregory -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 - Signed-off-by: Graeme Gregory - -commit 4f6ca522fc13d8c13c844a2c2f9eafe091a336a9 -Author: Mark Salter -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 - -commit 91eaa3c5387ebcf698b070a4c21e39e5240699ba -Author: Graeme Gregory -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 - Signed-off-by: Al Stone - Signed-off-by: Hanjun Guo - -commit ef17919599275fd58edb255ecf69807653cdd763 -Author: Graeme Gregory -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 - Signed-off-by: Graeme Gregory - Signed-off-by: Al Stone - Signed-off-by: Hanjun Guo - -commit 7d78ff059af78cc5a80576314c38584834557fc1 -Author: Al Stone -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 - Signed-off-by: Al Stone - Signed-off-by: Hanjun Guo - -commit 8a387ea5071c9d8bdaf5305320130022ec1d4f7d -Author: Hanjun Guo -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 - Signed-off-by: Hanjun Guo - -commit 7523c8b3b0d23629781c4581272c0647fa543af5 -Author: Tomasz Nowicki -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 - Signed-off-by: Hanjun Guo - -commit 743691994f2fb03bc05f539a42ba6ccccb5d18b8 -Author: Hanjun Guo -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 - Signed-off-by: Hanjun Guo - -commit 0c4d9983cb7b50351aad0aa32e8b6134adaabb0d -Author: Hanjun Guo -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 - -commit cb6b980abe388e25e357f73c5780aa1cf1b2e337 -Author: Hanjun Guo -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 - Signed-off-by: Tomasz Nowicki - -commit 74a72e003ae388f460294a0910a536aced8ce93c -Author: Hanjun Guo -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 - Signed-off-by: Tomasz Nowicki - -commit 059facbd0f0664aaaf6d732ce02b2f56ea6ad98f -Author: Hanjun Guo -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 - Signed-off-by: Graeme Gregory - Signed-off-by: Tomasz Nowicki - -commit 7ec63267bb1630c62e5f7fd2eb75a9a31131c89a -Author: Hanjun Guo -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 - -commit 2f1dd91e7866f2b617af29e9973b88b2cc2e00d6 -Author: Graeme Gregory -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 - Signed-off-by: Hanjun Guo - -commit 6941a3cced9ca3d29e6e9c8b0f43917526b74789 -Author: Al Stone -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 - Signed-off-by: Graeme Gregory - Signed-off-by: Hanjun Guo - -commit 8764d6bd07827a2a29eaaa382fc397527ad1ba19 -Author: Graeme Gregory -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 - Signed-off-by: Tomasz Nowicki - Signed-off-by: Hanjun Guo - -commit 37144fd61ca68e9d542e875187739c982c8d3662 -Author: Al Stone -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 - Signed-off-by: Graeme Gregory - Signed-off-by: Tomasz Nowicki - Signed-off-by: Hanjun Guo - -commit a4f035d2876b41b6f224321da6b6278de577d4c5 -Author: Tomasz Nowicki -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 - Signed-off-by: Tomasz Nowicki - Signed-off-by: Hanjun Guo - -commit b3055f38d52f5be0103b436a1b04fbf3947aaa39 -Author: Ashwin Chaugule -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 - Signed-off-by: Ashwin Chaugule - Signed-off-by: Tomasz Nowicki - Signed-off-by: Hanjun Guo - -commit fff62dfc1d7ab6ad3d528b008413fd116d208150 -Author: Mark Salter -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 - -commit 997a0488adb3f525aedb678b584f2733f43e248e -Author: Mark Salter -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 - -commit 5b823d4bf52286f97dc76683b533ae5c08763897 -Author: Mark Salter -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 - -commit f866806e1ca75a0efc62cda59559286faa7c9926 -Author: Kyle McMartin -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@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 - Signed-off-by: Donald Dutile - -commit a68d368ceb495cabafe82cdd0b83ec1e271a7f9d -Author: Ard Biesheuvel -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 - Acked-by: Christoffer Dall - Signed-off-by: Ard Biesheuvel - Signed-off-by: Will Deacon - -commit 246a31b3a8f065e831a6d8d9fd96f3a8e17dbdb9 -Author: Ard Biesheuvel -Date: Fri Nov 7 14:12:33 2014 +0000 - - arm64: ftrace: eliminate literal pool entries - - Replace ldr xN, = with adrp/add or adrp/ldr [as appropriate] - in the implementation of _mcount(), which may be called very often. - - Signed-off-by: Ard Biesheuvel - Signed-off-by: Will Deacon - -commit ecd0f8e21514e8ac758ed16a188faaa4c5ef75c7 -Author: Mark Rutland -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 - Acked-by: Catalin Marinas - Acked-by: Lorenzo Pieralisis - Signed-off-by: Mark Rutland - Signed-off-by: Will Deacon - -commit 2899d6ea451eb0037427bbf430069f73cb76becc -Author: Ard Biesheuvel -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 - Acked-by: Steve Capper - Signed-off-by: Ard Biesheuvel - Signed-off-by: Will Deacon - -commit 67b1122c25f0c7a9a126ebabcd2085ef99640c13 -Author: Geoff Levand -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 - Signed-off-by: Geoff Levand - Signed-off-by: Will Deacon - -commit 6a3c07e9aa03b7fbec14ab8bc21fce8590f12d83 -Author: Ard Biesheuvel -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 - Signed-off-by: Will Deacon - -commit 7c0569a739d0f1dd8ffd709cf37c53bb42143687 -Author: Steve Capper -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 - Signed-off-by: Will Deacon - -commit 7acf53bfb80c2823d233c14d33cfd2d119713b89 -Author: Joonwoo Park -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 - Reviewed-by: Trilok Soni - Signed-off-by: Joonwoo Park - Signed-off-by: Will Deacon - -commit 1971c19fb2a38a1d94cedada404760a917c36cd4 -Author: Mark Rutland -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 - Acked-by: Leif Lindholm - Acked-by: Ard Biesheuvel - Acked-by: Roy Franz - Acked-by: Matt Fleming - Signed-off-by: Ard Biesheuvel - -commit 7652016ff98e614ed2e3abac19b996af02434293 -Author: Ard Biesheuvel -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 - Acked-by: Leif Lindholm - Signed-off-by: Ard Biesheuvel - -commit 2586f232bd388d2223f3c7bcba446b2bd25d8e3d -Author: Yi Li -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 - Tested-by: Suravee Suthikulpanit - Tested-by: Leif Lindholm - Signed-off-by: Ard Biesheuvel - -commit 16b52b24f3d7a4f1555e4233398172b32306c1e4 -Author: Ard Biesheuvel -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 - Acked-by: Leif Lindholm - Tested-by: Leif Lindholm - Cc: Andrew Morton - Cc: Tony Luck - Acked-by: Matt Fleming - Signed-off-by: Ard Biesheuvel - -commit 016f4b4f5cee9ddd8c243a36c220a65bdfb82dc8 -Author: Ard Biesheuvel -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 - Acked-by: Leif Lindholm - Acked-by: Matt Fleming - Signed-off-by: Ard Biesheuvel - -commit ac627ea950e853f0a3f91607fb16cb9477f434d7 -Author: Ard Biesheuvel -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 - Signed-off-by: Ard Biesheuvel - -commit 850ba08a3f4756a8340edadd4fdeccd881813ba5 -Author: Ard Biesheuvel -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 - Signed-off-by: Ard Biesheuvel - -commit 2787807ca4f5f7df82a5c54312753b157e8c052e -Author: Ard Biesheuvel -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 - Acked-by: Roy Franz - Signed-off-by: Ard Biesheuvel - -commit 7bd0585d9ab62d9787c389d3b62141b76319e5f7 -Author: Ard Biesheuvel -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 - Acked-by: Mark Rutland - Signed-off-by: Ard Biesheuvel - -commit 5a0edb2dbdf9327322ae57e8e16d162c2a371318 -Author: Ard Biesheuvel -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 - Acked-by: Roy Franz - Signed-off-by: Ard Biesheuvel - - 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 - #include - #include -+ -+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 - #include - -+#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 - #include - -+#include "aes-ce-setkey.h" -+ - MODULE_DESCRIPTION("Synchronous AES cipher using ARMv8 Crypto Extensions"); - MODULE_AUTHOR("Ard Biesheuvel "); - 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 ++ * Author: Graeme Gregory ++ * ++ * 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 - #include - -+#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 -+ * Author: Graeme Gregory -+ * -+ * 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 -+#include - - #include - -@@ -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@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 -+#include -+ -+/* -+ * 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 - #include - - /* 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 - #include - #include - #include -@@ -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 #include -@@ -59,6 +60,7 @@ +@@ -61,6 +62,7 @@ #include #include #include @@ -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)", of_flat_dt_get_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(); /* -@@ -397,20 +397,28 @@ 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 -+ * Darren Hart -+ * Rafael J. Wysocki ++ * Copyright (C) 2013-2014, Linaro Ltd. ++ * Author: Graeme Gregory + * -+ * 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 -+#include -+#include -+ -+#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 -+ * -+ * 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 -+ -+/* -+ * 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 - #include - #include -+#ifdef CONFIG_ATA_ACPI -+#include -+#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 - #include - #include -+#include - #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 -+ * Mika Westerberg -+ * -+ * 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 -+#include -+#include -+#include -+ -+/** -+ * 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 - #include - #include -+#include - - #include - #include -@@ -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 - --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 + #include + #include ++#ifdef CONFIG_ATA_ACPI ++#include ++#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 + #include + #include ++#include + #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 + #include + #include ++#include -- offset = RGIO + gpio_num / 8; -- bit = gpio_num % 8; -+ spin_lock(&sch->lock); + #include + #include +@@ -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 - #include - #include -+#include - #include --#include --#include --#include -+#include - - #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 - #include -+#include - #include - #include - #include --#include --#include --#include - #include -+#include - #include - #include - - 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 - #include --#include -+#include - - /* - * 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 -+#include - - /* 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 - #include /* for struct resource */ - #include -+#include - - #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 - #include - #include -+#include - - #include - #include -@@ -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 ""; -@@ -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 -+ * Mika Westerberg -+ * -+ * 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 -+ -+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 #include -@@ -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 #include #include -@@ -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 ccf51ad..41b6c42 100644 --- a/kernel.spec +++ b/kernel.spec @@ -48,13 +48,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 1 # Set rpm version accordingly %if 0%{?stable_update} %define stablerev %{stable_update} @@ -386,6 +386,9 @@ BuildRequires: sparse %if %{with_perf} BuildRequires: elfutils-devel zlib-devel binutils-devel newt-devel python-devel perl(ExtUtils::Embed) bison flex BuildRequires: audit-libs-devel +%ifnarch s390 s390x %{arm} +BuildRequires: numactl-devel +%endif %endif %if %{with_tools} BuildRequires: pciutils-devel gettext ncurses-devel @@ -553,8 +556,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 -Patch1827: drm-i915-Disable-verbose-state-checks.patch +Patch1825: drm-i915-tame-the-chattermouth-v2.patch +Patch1826: drm-i915-hush-check-crtc-state.patch # Quiet boot fixes @@ -585,7 +588,6 @@ 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 Patch21100: arm-highbank-l2-reverts.patch @@ -600,33 +602,14 @@ 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 1089731 Patch26058: asus-nb-wmi-Add-wapf4-quirk-for-the-X550VB.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 1111138 +Patch26059: i8042-Add-notimeout-quirk-for-Fujitsu-Lifebook-A544-.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 -# Fix for big-endian arches, already upstream -Patch26134: mpssd-x86-only.patch - #rhbz 1186097 Patch26135: acpi-video-add-disable_native_backlight_quirk_for_samsung_510r.patch @@ -642,9 +625,6 @@ 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 @@ -673,10 +653,9 @@ Patch26167: IB-core-Prevent-integer-overflow-in-ib_umem_get-addr.patch #rhbz 1201532 Patch26168: HID-multitouch-add-support-of-clickpads.patch + # git clone ssh://git.fedorahosted.org/git/kernel-arm64.git, git diff master...devel Patch30000: kernel-arm64.patch -Patch30001: arm64-revert-tlb-rcu_table_free.patch -Patch30002: arm64-fix-ooo-descriptor-read.patch # END OF PATCH DEFINITIONS @@ -1264,7 +1243,6 @@ 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 arm-highbank-l2-reverts.patch @@ -1360,7 +1338,7 @@ 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 # Radeon DRM @@ -1386,33 +1364,14 @@ 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 1089731 ApplyPatch asus-nb-wmi-Add-wapf4-quirk-for-the-X550VB.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 1111138 +ApplyPatch i8042-Add-notimeout-quirk-for-Fujitsu-Lifebook-A544-.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 @@ -1428,9 +1387,6 @@ 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 @@ -1461,11 +1417,8 @@ ApplyPatch HID-multitouch-add-support-of-clickpads.patch %if 0%{?aarch64patches} ApplyPatch kernel-arm64.patch -ApplyPatch arm64-revert-tlb-rcu_table_free.patch -ApplyPatch arm64-fix-ooo-descriptor-read.patch %ifnarch aarch64 # this is stupid, but i want to notice before secondary koji does. ApplyPatch kernel-arm64.patch -R -ApplyPatch arm64-revert-tlb-rcu_table_free.patch -R %endif %endif @@ -2330,6 +2283,9 @@ fi # ||----w | # || || %changelog +* Mon Mar 16 2015 Justin M. Forbes - 3.19.1-200 +- Linux v3.19.1 + * Fri Mar 13 2015 Kyle McMartin - arm64-revert-tlb-rcu_table_free.patch: revert 5e5f6dc1 which causes lockups on arm64 machines. 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 -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 - Reported-by: Dan Streetman - Suggested-by: Peter Foley - Signed-off-by: Ashutosh Dixit - Signed-off-by: Jonathan Corbet - -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 -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 -Signed-off-by: David S. Miller ---- - 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/nfs-don-t-call-blocking-operations-while-TASK_RUNNIN.patch b/nfs-don-t-call-blocking-operations-while-TASK_RUNNIN.patch new file mode 100644 index 0000000..34a60b2 --- /dev/null +++ b/nfs-don-t-call-blocking-operations-while-TASK_RUNNIN.patch @@ -0,0 +1,91 @@ +From: Jeff Layton +Date: Wed, 14 Jan 2015 13:08:57 -0500 +Subject: [PATCH] nfs: don't call blocking operations while !TASK_RUNNING + +Bruce reported seeing this warning pop when mounting using v4.1: + + ------------[ cut here ]------------ + WARNING: CPU: 1 PID: 1121 at kernel/sched/core.c:7300 __might_sleep+0xbd/0xd0() + do not call blocking ops when !TASK_RUNNING; state=1 set at [] prepare_to_wait+0x2f/0x90 + Modules linked in: rpcsec_gss_krb5 auth_rpcgss nfsv4 dns_resolver nfs lockd grace sunrpc fscache ip6t_rpfilter ip6t_REJECT nf_reject_ipv6 xt_conntrack ebtable_nat ebtable_broute bridge stp llc ebtable_filter ebtables ip6table_nat nf_conntrack_ipv6 nf_defrag_ipv6 nf_nat_ipv6 ip6table_mangle ip6table_security ip6table_raw ip6table_filter ip6_tables iptable_nat nf_conntrack_ipv4 nf_defrag_ipv4 nf_nat_ipv4 nf_nat nf_conntrack iptable_mangle iptable_security iptable_raw snd_hda_codec_generic snd_hda_intel snd_hda_controller snd_hda_codec snd_hwdep snd_pcm snd_timer ppdev joydev snd virtio_console virtio_balloon pcspkr serio_raw parport_pc parport pvpanic floppy soundcore i2c_piix4 virtio_blk virtio_net qxl drm_kms_helper ttm drm virtio_pci virtio_ring ata_generic virtio pata_acpi + CPU: 1 PID: 1121 Comm: nfsv4.1-svc Not tainted 3.19.0-rc4+ #25 + Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.7.5-20140709_153950- 04/01/2014 + 0000000000000000 000000004e5e3f73 ffff8800b998fb48 ffffffff8186ac78 + 0000000000000000 ffff8800b998fba0 ffff8800b998fb88 ffffffff810ac9da + ffff8800b998fb68 ffffffff81c923e7 00000000000004d9 0000000000000000 + Call Trace: + [] dump_stack+0x4c/0x65 + [] warn_slowpath_common+0x8a/0xc0 + [] warn_slowpath_fmt+0x55/0x70 + [] ? prepare_to_wait+0x2f/0x90 + [] ? prepare_to_wait+0x2f/0x90 + [] __might_sleep+0xbd/0xd0 + [] kmem_cache_alloc_trace+0x243/0x430 + [] ? groups_alloc+0x3e/0x130 + [] groups_alloc+0x3e/0x130 + [] svcauth_unix_accept+0x16e/0x290 [sunrpc] + [] svc_authenticate+0xe1/0xf0 [sunrpc] + [] svc_process_common+0x244/0x6a0 [sunrpc] + [] bc_svc_process+0x1c4/0x260 [sunrpc] + [] nfs41_callback_svc+0x128/0x1f0 [nfsv4] + [] ? wait_woken+0xc0/0xc0 + [] ? nfs4_callback_svc+0x60/0x60 [nfsv4] + [] kthread+0x11f/0x140 + [] ? local_clock+0x15/0x30 + [] ? kthread_create_on_node+0x250/0x250 + [] ret_from_fork+0x7c/0xb0 + [] ? kthread_create_on_node+0x250/0x250 + ---[ end trace 675220a11e30f4f2 ]--- + +nfs41_callback_svc does most of its work while in TASK_INTERRUPTIBLE, +which is just wrong. Fix that by finishing the wait immediately if we've +found that the list has something on it. + +Also, we don't expect this kthread to accept signals, so we should be +using a TASK_UNINTERRUPTIBLE sleep instead. That however, opens us up +hung task warnings from the watchdog, so have the schedule_timeout +wake up every 60s if there's no callback activity. + +Reported-by: "J. Bruce Fields" +Signed-off-by: Jeff Layton +Cc: stable@vger.kernel.org +Signed-off-by: Trond Myklebust +--- + fs/nfs/callback.c | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +diff --git a/fs/nfs/callback.c b/fs/nfs/callback.c +index b8fb3a4ef649..351be9205bf8 100644 +--- a/fs/nfs/callback.c ++++ b/fs/nfs/callback.c +@@ -128,22 +128,24 @@ nfs41_callback_svc(void *vrqstp) + if (try_to_freeze()) + continue; + +- prepare_to_wait(&serv->sv_cb_waitq, &wq, TASK_INTERRUPTIBLE); ++ prepare_to_wait(&serv->sv_cb_waitq, &wq, TASK_UNINTERRUPTIBLE); + spin_lock_bh(&serv->sv_cb_lock); + if (!list_empty(&serv->sv_cb_list)) { + req = list_first_entry(&serv->sv_cb_list, + struct rpc_rqst, rq_bc_list); + list_del(&req->rq_bc_list); + spin_unlock_bh(&serv->sv_cb_lock); ++ finish_wait(&serv->sv_cb_waitq, &wq); + dprintk("Invoking bc_svc_process()\n"); + error = bc_svc_process(serv, req, rqstp); + dprintk("bc_svc_process() returned w/ error code= %d\n", + error); + } else { + spin_unlock_bh(&serv->sv_cb_lock); +- schedule(); ++ /* schedule_timeout to game the hung task watchdog */ ++ schedule_timeout(60 * HZ); ++ finish_wait(&serv->sv_cb_waitq, &wq); + } +- finish_wait(&serv->sv_cb_waitq, &wq); + } + return 0; + } +-- +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 f98ac87..0000000 --- a/powerpc-powernv-force-all-CPUs-to-be-bootable.patch +++ /dev/null @@ -1,46 +0,0 @@ -From: Greg Kurz -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 ---- - 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 4753958cd509..44ecd0925f56 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 fdf8f44..0000000 --- a/samsung-laptop-Add-broken-acpi-video-quirk-for-NC210.patch +++ /dev/null @@ -1,39 +0,0 @@ -From: Hans de Goede -Date: Mon, 2 Jun 2014 17:40:59 +0200 -Subject: [PATCH] samsung-laptop: Add broken-acpi-video quirk for NC210/NC110 - -Reported (and tested) here: -https://bugzilla.redhat.com/show_bug.cgi?id=861573 - -Bugzilla: 861573 -Upstream-status: Waiting for feedback from reporter - -Signed-off-by: Hans de Goede ---- - 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 ce364a41842a..477de0a9e1ee 100644 ---- a/drivers/platform/x86/samsung-laptop.c -+++ b/drivers/platform/x86/samsung-laptop.c -@@ -1583,6 +1583,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); --- -2.1.0 - diff --git a/silence-fbcon-logo.patch b/silence-fbcon-logo.patch index 654927e..baeb94e 100644 --- a/silence-fbcon-logo.patch +++ b/silence-fbcon-logo.patch @@ -9,7 +9,7 @@ Upstream-status: Fedora mustard 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c -index eb976ee3a02f..275f20a643f4 100644 +index ea437245562e..eefa9c45d2e1 100644 --- a/drivers/video/console/fbcon.c +++ b/drivers/video/console/fbcon.c @@ -637,13 +637,15 @@ static void fbcon_prepare_logo(struct vc_data *vc, struct fb_info *info, @@ -47,7 +47,7 @@ index eb976ee3a02f..275f20a643f4 100644 + +early_param("quiet", quiet_logo); + - module_init(fb_console_init); + fs_initcall(fb_console_init); #ifdef MODULE -- diff --git a/sources b/sources index 94123c7..e2bd94e 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 +2f2822cf2d84a8ec3a8b044e732cf45b patch-3.19.1.xz 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 -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@vger.kernel.org # 3.16 -Signed-off-by: Hans de Goede ---- - 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 */ -+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 */ -+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 */ - 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 b8fc76f..0000000 --- a/uas-Do-not-blacklist-ASM1153-disk-enclosures.patch +++ /dev/null @@ -1,94 +0,0 @@ -From: Hans de Goede -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 . - -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 ---- - 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 2706a434fdbb..da3d98c72db1 100644 ---- a/drivers/usb/storage/unusual_uas.h -+++ b/drivers/usb/storage/unusual_uas.h -@@ -110,14 +110,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 */ --UNUSUAL_DEV(0x174c, 0x5106, 0x0000, 0x9999, -- "ASMedia", -- "ASM1051", -- USB_SC_DEVICE, USB_PR_DEVICE, NULL, -- US_FL_IGNORE_UAS), -- - /* Reported-by: Hans de Goede */ - UNUSUAL_DEV(0x2109, 0x0711, 0x0000, 0x9999, - "VIA", --- -2.1.0 -