diff --git a/packages/graphics/bcm2835-driver/package.mk b/packages/graphics/bcm2835-driver/package.mk index 7099e42c56..0726780888 100644 --- a/packages/graphics/bcm2835-driver/package.mk +++ b/packages/graphics/bcm2835-driver/package.mk @@ -17,8 +17,8 @@ ################################################################################ PKG_NAME="bcm2835-driver" -PKG_VERSION="008700b" -PKG_SHA256="840f94f383f1c252f840906a190b58ad2fb174716f2cfed5f83b4ad47a4c1f74" +PKG_VERSION="5e55ff0" +PKG_SHA256="05b2d417e79e0629003d349d280a4b28f79aa6a312a0d53b05ec5b868b1e405b" PKG_ARCH="any" PKG_LICENSE="nonfree" PKG_SITE="http://www.broadcom.com" diff --git a/packages/linux-firmware/iwlwifi-firmware/package.mk b/packages/linux-firmware/iwlwifi-firmware/package.mk index 57e407903c..2ee3a02e39 100644 --- a/packages/linux-firmware/iwlwifi-firmware/package.mk +++ b/packages/linux-firmware/iwlwifi-firmware/package.mk @@ -17,8 +17,8 @@ ################################################################################ PKG_NAME="iwlwifi-firmware" -PKG_VERSION="78b9e19" -PKG_SHA256="1cd3ec0f2133f56760bc8946344e426833ac887a0a09f8750e6f0f51b7c994de" +PKG_VERSION="b594d28" +PKG_SHA256="9516d53f4805b5253a5e0a0cd8bc3b3f547f6d48d84b88fa8cc160c05cea9921" PKG_ARCH="any" PKG_LICENSE="Free-to-use" PKG_SITE="https://github.com/LibreELEC/iwlwifi-firmware" diff --git a/packages/linux-firmware/kernel-firmware/package.mk b/packages/linux-firmware/kernel-firmware/package.mk index 3f258ef4d0..d20e0273fc 100644 --- a/packages/linux-firmware/kernel-firmware/package.mk +++ b/packages/linux-firmware/kernel-firmware/package.mk @@ -61,4 +61,5 @@ makeinstall_target() { # The following file is installed by brcmfmac_sdio-firmware-rpi rm -fr $FW_TARGET_DIR/brcm/brcmfmac43430*-sdio.bin + rm -fr $FW_TARGET_DIR/brcm/brcmfmac43455*-sdio.bin } diff --git a/packages/linux-firmware/wlan-firmware/package.mk b/packages/linux-firmware/wlan-firmware/package.mk index fcdcc9fa79..4bbc1bd235 100644 --- a/packages/linux-firmware/wlan-firmware/package.mk +++ b/packages/linux-firmware/wlan-firmware/package.mk @@ -17,8 +17,8 @@ ################################################################################ PKG_NAME="wlan-firmware" -PKG_VERSION="34a47d9" -PKG_SHA256="91dc9af5689cd7275723d6b825e5c3d800b7b8149e031a24e48556e030f63af8" +PKG_VERSION="cfc1842" +PKG_SHA256="52d56658d7f426cf8b99637179cbca39058b781d3720599f838764571151fc64" PKG_ARCH="any" PKG_LICENSE="Free-to-use" PKG_SITE="https://github.com/LibreELEC/wlan-firmware" diff --git a/packages/linux/package.mk b/packages/linux/package.mk index ee840c868d..0b5900575d 100644 --- a/packages/linux/package.mk +++ b/packages/linux/package.mk @@ -47,8 +47,8 @@ case "$LINUX" in PKG_DEPENDS_TARGET="$PKG_DEPENDS_TARGET aml-dtbtools:host" ;; *) - PKG_VERSION="4.14.10" - PKG_SHA256="86baf1374ca003bdd9a43cae7f59cec02b455a6c38c3705aa46b2b68d91ed110" + PKG_VERSION="4.14.15" + PKG_SHA256="ffc393a0c66f80375eacd3fb177b92e5c9daa07de0dcf947e925e049352e6142" PKG_URL="https://www.kernel.org/pub/linux/kernel/v4.x/$PKG_NAME-$PKG_VERSION.tar.xz" PKG_PATCH_DIRS="default" ;; diff --git a/packages/linux/patches/default/linux-051-ouya_controller_support.patch b/packages/linux/patches/default/linux-051-ouya_controller_support.patch new file mode 100644 index 0000000000..5fab089682 --- /dev/null +++ b/packages/linux/patches/default/linux-051-ouya_controller_support.patch @@ -0,0 +1,327 @@ +commit 58c5e239ba0402207cfecef8ea1bf52edea092e4 +Author: Lukas Rusak +Date: Mon Jan 15 09:50:43 2018 -0800 + + drivers/hid: add ouya controller driver + +diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig +index 779c5ae47..02f79b0a4 100644 +--- a/drivers/hid/Kconfig ++++ b/drivers/hid/Kconfig +@@ -633,6 +633,12 @@ config HID_ORTEK + - Ortek WKB-2000 + - Skycable wireless presenter + ++config HID_OUYA ++ tristate "OUYA Game Controller" ++ depends on USB_HID ++ ---help--- ++ Support for OUYA Game Controller. ++ + config HID_PANTHERLORD + tristate "Pantherlord/GreenAsia game controller" + depends on HID +diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile +index 235bd2a7b..d3431f77b 100644 +--- a/drivers/hid/Makefile ++++ b/drivers/hid/Makefile +@@ -68,6 +68,7 @@ obj-$(CONFIG_HID_MULTITOUCH) += hid-multitouch.o + obj-$(CONFIG_HID_NTI) += hid-nti.o + obj-$(CONFIG_HID_NTRIG) += hid-ntrig.o + obj-$(CONFIG_HID_ORTEK) += hid-ortek.o ++obj-$(CONFIG_HID_OUYA) += hid-ouya.o + obj-$(CONFIG_HID_PRODIKEYS) += hid-prodikeys.o + obj-$(CONFIG_HID_PANTHERLORD) += hid-pl.o + obj-$(CONFIG_HID_PENMOUNT) += hid-penmount.o +diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c +index 0c3f60813..cd64cafe5 100644 +--- a/drivers/hid/hid-core.c ++++ b/drivers/hid/hid-core.c +@@ -1884,6 +1884,7 @@ static const struct hid_device_id hid_have_special_driver[] = { + { HID_USB_DEVICE(USB_VENDOR_ID_ELO, USB_DEVICE_ID_ELO_ACCUTOUCH_2216) }, + #endif + #if IS_ENABLED(CONFIG_HID_ACRUX) ++ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_OUYA, USB_DEVICE_ID_OUYA_CONTROLLER) }, + { HID_USB_DEVICE(USB_VENDOR_ID_ACRUX, 0x0802) }, + { HID_USB_DEVICE(USB_VENDOR_ID_ACRUX, 0xf705) }, + #endif +diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h +index 5da3d6256..b6bb209ed 100644 +--- a/drivers/hid/hid-ids.h ++++ b/drivers/hid/hid-ids.h +@@ -843,6 +843,9 @@ + #define USB_DEVICE_ID_ORTEK_WKB2000 0x2000 + #define USB_DEVICE_ID_ORTEK_IHOME_IMAC_A210S 0x8003 + ++#define USB_VENDOR_ID_OUYA 0x2836 ++#define USB_DEVICE_ID_OUYA_CONTROLLER 0x0001 ++ + #define USB_VENDOR_ID_PLANTRONICS 0x047f + + #define USB_VENDOR_ID_PANASONIC 0x04da +diff --git a/drivers/hid/hid-ouya.c b/drivers/hid/hid-ouya.c +new file mode 100644 +index 000000000..7792c23ba +--- /dev/null ++++ b/drivers/hid/hid-ouya.c +@@ -0,0 +1,260 @@ ++/* ++ * HID driver for OUYA Game Controller(s) ++ * ++ * Copyright (c) 2013 OUYA ++ */ ++ ++#include ++#include ++#include ++#include ++ ++#include "hid-ids.h" ++ ++#define OUYA_TOUCHPAD_FIXUP (1 << 0) ++ ++struct ouya_sc { ++ unsigned long quirks; ++}; ++ ++/* Fixed report descriptor */ ++static __u8 ouya_rdesc_fixed[] = { ++ ++ 0x05, 0x01, /* Usage Page (Desktop), */ ++ 0x09, 0x05, /* Usage (Game Pad), */ ++ ++ 0xA1, 0x01, /* Collection (Application), */ ++ 0x85, 0x07, /* Report ID (7), */ ++ ++ 0xA1, 0x00, /* Collection (Physical), */ ++ 0x09, 0x30, /* Usage (X), */ ++ 0x09, 0x31, /* Usage (Y), */ ++ 0x15, 0x00, /* Logical Minimum (0), */ ++ 0x26, 0xFF, 0x00, /* Logical Maximum (255), */ ++ 0x35, 0x00, /* Physical Minimum (0), */ ++ 0x46, 0xFF, 0x00, /* Physical Maximum (255), */ ++ 0x95, 0x02, /* Report Count (2), */ ++ 0x75, 0x08, /* Report Size (8), */ ++ 0x81, 0x02, /* Input (Variable), */ ++ 0xC0, /* End Collection, */ ++ ++ 0xA1, 0x00, /* Collection (Physical), */ ++ 0x09, 0x33, /* Usage (Rx), */ ++ 0x09, 0x34, /* Usage (Ry), */ ++ 0x15, 0x00, /* Logical Minimum (0), */ ++ 0x26, 0xFF, 0x00, /* Logical Maximum (255), */ ++ 0x35, 0x00, /* Physical Minimum (0), */ ++ 0x46, 0xFF, 0x00, /* Physical Maximum (255), */ ++ 0x95, 0x02, /* Report Count (2), */ ++ 0x75, 0x08, /* Report Size (8), */ ++ 0x81, 0x02, /* Input (Variable), */ ++ 0xC0, /* End Collection, */ ++ ++ 0xA1, 0x00, /* Collection (Physical), */ ++ 0x09, 0x32, /* Usage (Z), */ ++ 0x15, 0x00, /* Logical Minimum (0), */ ++ 0x26, 0xFF, 0x00, /* Logical Maximum (255), */ ++ 0x35, 0x00, /* Physical Minimum (0), */ ++ 0x46, 0xFF, 0x00, /* Physical Maximum (255), */ ++ 0x95, 0x01, /* Report Count (1), */ ++ 0x75, 0x08, /* Report Size (8), */ ++ 0x81, 0x02, /* Input (Variable), */ ++ 0xC0, /* End Collection, */ ++ ++ 0xA1, 0x00, /* Collection (Physical), */ ++ 0x09, 0x35, /* Usage (Rz), */ ++ 0x15, 0x00, /* Logical Minimum (0), */ ++ 0x26, 0xFF, 0x00, /* Logical Maximum (255), */ ++ 0x35, 0x00, /* Physical Minimum (0), */ ++ 0x46, 0xFF, 0x00, /* Physical Maximum (255), */ ++ 0x95, 0x01, /* Report Count (1), */ ++ 0x75, 0x08, /* Report Size (8), */ ++ 0x81, 0x02, /* Input (Variable), */ ++ 0xC0, /* End Collection, */ ++ ++ 0x05, 0x09, /* Usage Page (Button), */ ++ 0x19, 0x01, /* Usage Minimum (01h), */ ++ 0x29, 0x10, /* Usage Maximum (10h), */ ++ 0x95, 0x10, /* Report Count (16), */ ++ 0x75, 0x01, /* Report Size (1), */ ++ 0x81, 0x02, /* Input (Variable), */ ++ ++ /* ORIGINAL REPORT DESCRIPTOR FOR TOUCHPAD INPUT */ ++ /* 06 00 ff a1 02 09 02 15 00 26 ff 00 35 00 46 ff 00 95 03 75 08 81 02 c0 */ ++ ++ 0x06, 0x00, 0xFF, /* Usage Page (Custom), */ ++ 0x09, 0x02, /* Usage (Mouse), */ ++ 0x09, 0x01, /* Usage (Pointer), */ ++ 0xA1, 0x00, /* Collection (Physical), */ ++ 0x05, 0x09, /* Usage Page (Button), */ ++ 0x19, 0x01, /* Usage Minimum (01h), */ ++ 0x29, 0x03, /* Usage Maximum (03h), */ ++ 0x15, 0x00, /* Logical Minimum (0), */ ++ 0x25, 0x01, /* Logical Maximum (1), */ ++ 0x95, 0x03, /* Report Count (3), */ ++ 0x75, 0x01, /* Report Size (1), */ ++ 0x81, 0x02, /* Input (Variable), */ ++ 0x95, 0x01, /* Report Count (1), */ ++ 0x75, 0x05, /* Report Size (5), */ ++ 0x81, 0x01, /* Input (Constant), */ ++ 0x05, 0x01, /* Usage Page (Desktop), */ ++ 0x09, 0x30, /* Usage (X), */ ++ 0x09, 0x31, /* Usage (Y), */ ++ 0x15, 0x81, /* Logical Minimum (-127), */ ++ 0x25, 0x7f, /* Logical Maximum (127), */ ++ 0x95, 0x02, /* Report Count (2), */ ++ 0x75, 0x08, /* Report Size (8), */ ++ 0x81, 0x06, /* Input (Relative), */ ++ 0xC0, /* End Collection, */ ++ ++ 0x06, 0x00, 0xFF, /* Usage Page (Custom), */ ++ 0xA1, 0x02, /* Collection (Logical), */ ++ 0x75, 0x08, /* Report Size (8), */ ++ 0x95, 0x07, /* Report Count (7), */ ++ 0x46, 0xFF, 0x00, /* Physical Maximum (255), */ ++ 0x26, 0xFF, 0x00, /* Logical Maximum (255), */ ++ 0x09, 0x01, /* Usage (Pointer), */ ++ 0x91, 0x02, /* Output (Variable), */ ++ 0xC0, /* End Collection, */ ++ ++ 0xC0, /* End Collection */ ++ ++ ++ 0x06, 0x00, 0xFF, /* Usage Page (Custom), */ ++ 0x05, 0x0C, /* Usage Page (Consumer), */ ++ 0x09, 0x01, /* Usage (Consumer Control), */ ++ ++ 0xA1, 0x01, /* Collection (Application), */ ++ 0x85, 0x03, /* Report ID (3), */ ++ 0x05, 0x01, /* Usage Page (Desktop), */ ++ 0x09, 0x06, /* Usage (Keyboard), */ ++ 0xA1, 0x02, /* Collection (Logical), */ ++ 0x05, 0x06, /* Usage Page (Generic), */ ++ 0x09, 0x20, /* Usage (Battery Strgth), */ ++ 0x15, 0x00, /* Logical Minimum (0), */ ++ 0x26, 0xFF, 0x00, /* Logical Maximum (255), */ ++ 0x75, 0x08, /* Report Size (8), */ ++ 0x95, 0x01, /* Report Count (1), */ ++ 0x81, 0x02, /* Input (Variable), */ ++ 0x06, 0xBC, 0xFF, /* Usage Page (Custom), */ ++ ++ 0x0A, 0xAD, 0xBD, /* UNKNOWN */ ++ ++ 0x75, 0x08, /* Report Size (8), */ ++ 0x95, 0x06, /* Report Count (6), */ ++ 0x81, 0x02, /* Input (Variable), */ ++ 0xC0, /* End Collection, */ ++ ++ 0xC0, /* End Collection */ ++ ++ 0x00 ++}; ++ ++static __u8 *ouya_report_fixup(struct hid_device *hdev, __u8 *rdesc, ++ unsigned int *rsize) ++{ ++ struct ouya_sc *sc = hid_get_drvdata(hdev); ++ ++ if (sc->quirks & OUYA_TOUCHPAD_FIXUP) { ++ rdesc = ouya_rdesc_fixed; ++ *rsize = sizeof(ouya_rdesc_fixed); ++ } ++ return rdesc; ++} ++ ++static int ouya_input_mapping(struct hid_device *hdev, struct hid_input *hi, ++ struct hid_field *field, struct hid_usage *usage, ++ unsigned long **bit, int *max) ++{ ++ struct ouya_sc *sc = hid_get_drvdata(hdev); ++ ++ if (!(sc->quirks & OUYA_TOUCHPAD_FIXUP)) { ++ return 0; ++ } ++ ++ if ((usage->hid & 0x90000) == 0x90000 && ++ (field->physical & 0xff000000) == 0xff000000 && ++ usage->collection_index == 5 && ++ field->report_count == 3) { ++ ++ hid_map_usage(hi, usage, bit, max, EV_KEY, BTN_MOUSE + (usage->hid - 0x90001)); ++ ++ return 1; ++ } ++ ++ return 0; ++} ++ ++static int ouya_probe(struct hid_device *hdev, const struct hid_device_id *id) ++{ ++ int ret; ++ struct ouya_sc *sc; ++ ++ sc = kzalloc(sizeof(*sc), GFP_KERNEL); ++ if (sc == NULL) { ++ hid_err(hdev, "can't alloc ouya descriptor\n"); ++ return -ENOMEM; ++ } ++ ++ if(((hdev->version & 0xff00) == 0x0100 && (hdev->version & 0xff) >= 0x04) || ++ ((hdev->version & 0xff00) == 0xe100 && (hdev->version & 0xff) >= 0x3a)) { ++ hid_info(hdev, "ouya controller - new version\n"); ++ sc->quirks = OUYA_TOUCHPAD_FIXUP; ++ } else { ++ sc->quirks = 0; ++ } ++ hid_set_drvdata(hdev, sc); ++ ++ ret = hid_parse(hdev); ++ if (ret) { ++ hid_err(hdev, "parse failed\n"); ++ goto err_free; ++ } ++ ++ ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT | ++ HID_CONNECT_HIDDEV_FORCE); ++ if (ret) { ++ hid_err(hdev, "hw start failed\n"); ++ goto err_free; ++ } ++ ++ return 0; ++ ++err_free: ++ kfree(sc); ++ return ret; ++} ++ ++static void ouya_remove(struct hid_device *hdev) ++{ ++ hid_hw_stop(hdev); ++ kfree(hid_get_drvdata(hdev)); ++} ++ ++static const struct hid_device_id ouya_devices[] = { ++ { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_OUYA, USB_DEVICE_ID_OUYA_CONTROLLER) }, ++ { } ++}; ++MODULE_DEVICE_TABLE(hid, ouya_devices); ++ ++static struct hid_driver ouya_driver = { ++ .name = "ouya", ++ .id_table = ouya_devices, ++ .probe = ouya_probe, ++ .remove = ouya_remove, ++ .input_mapping = ouya_input_mapping, ++ .report_fixup = ouya_report_fixup ++}; ++ ++static int __init ouya_init(void) ++{ ++ return hid_register_driver(&ouya_driver); ++} ++ ++static void __exit ouya_exit(void) ++{ ++ hid_unregister_driver(&ouya_driver); ++} ++ ++module_init(ouya_init); ++module_exit(ouya_exit); diff --git a/packages/linux/patches/default/linux-999-disable_lan78xx_wol.patch b/packages/linux/patches/default/linux-999-disable_lan78xx_wol.patch new file mode 100644 index 0000000000..d86d01dd7d --- /dev/null +++ b/packages/linux/patches/default/linux-999-disable_lan78xx_wol.patch @@ -0,0 +1,14 @@ +diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c +index b99a7fb..89d496c 100644 +--- a/drivers/net/usb/lan78xx.c ++++ b/drivers/net/usb/lan78xx.c +@@ -1602,7 +1602,7 @@ static const struct ethtool_ops lan78xx_ethtool_ops = { + .get_sset_count = lan78xx_get_sset_count, + .get_strings = lan78xx_get_strings, + .get_wol = lan78xx_get_wol, +- .set_wol = lan78xx_set_wol, ++// .set_wol = lan78xx_set_wol, + .get_eee = lan78xx_get_eee, + .set_eee = lan78xx_set_eee, + .get_pauseparam = lan78xx_get_pause, + diff --git a/packages/linux/patches/default/linux-999.20-i915-pm-Be-less-agressive-with-clockfreq-changes-on-Bay-Trail.patch b/packages/linux/patches/default/linux-999.20-i915-pm-Be-less-agressive-with-clockfreq-changes-on-Bay-Trail.patch new file mode 100644 index 0000000000..0a68a040d8 --- /dev/null +++ b/packages/linux/patches/default/linux-999.20-i915-pm-Be-less-agressive-with-clockfreq-changes-on-Bay-Trail.patch @@ -0,0 +1,89 @@ +From 28ad70a06fb84fe63cd036970db2561b2fd1562b Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Sun, 5 Nov 2017 16:51:23 +0100 +Subject: [PATCH v3 1/2] i915: pm: Be less agressive with clockfreq changes on + Bay Trail + +Bay Trail devices are known to hang when changing the frequency often, +this is discussed in great length in: +https://bugzilla.kernel.org/show_bug.cgi?id=109051 + +Commit 6067a27d1f01 ("drm/i915: Avoid tweaking evaluation thresholds +on Baytrail v3") is an attempt to workaround this. Several users in +bko109051 report that an earlier version of this patch, v1: +https://bugzilla.kernel.org/attachment.cgi?id=251471 + +Works better for them and they still see hangs with the merged v3. + +Comparing the 2 versions shows that they are indeed not equivalent, +v1 not only skips writing the GEN6_RP* registers from valleyview_set_rps, +as v3 does. It also contained these modifications to i915_irq.c: + + if (pm_iir & GEN6_PM_RP_DOWN_EI_EXPIRED) { + if (!vlv_c0_above(dev_priv, + &dev_priv->rps.down_ei, &now, +- dev_priv->rps.down_threshold)) ++ VLV_RP_DOWN_EI_THRESHOLD)) + events |= GEN6_PM_RP_DOWN_THRESHOLD; + dev_priv->rps.down_ei = now; + } + + if (pm_iir & GEN6_PM_RP_UP_EI_EXPIRED) { + if (vlv_c0_above(dev_priv, + &dev_priv->rps.up_ei, &now, +- dev_priv->rps.up_threshold)) ++ VLV_RP_UP_EI_THRESHOLD)) + events |= GEN6_PM_RP_UP_THRESHOLD; + dev_priv->rps.up_ei = now; + } + +Which use less aggressive up/down thresholds, which results in less +GEN6_PM_RP_*_THRESHOLD events and thus in less calls to intel_set_rps() -> +valleyview_set_rps() -> vlv_punit_write(PUNIT_REG_GPU_FREQ_REQ). +With the last call being the likely cause of the hang. + +This commit hardcodes the threshold_up and _down values for Bay Trail to +less aggressive values, reducing the amount of clock frequency changes, +thus avoiding the hangs some people are still seeing with the merged fix. + +Buglink: https://bugzilla.kernel.org/show_bug.cgi?id=109051 +Signed-off-by: Hans de Goede +--- + drivers/gpu/drm/i915/i915_reg.h | 3 +++ + drivers/gpu/drm/i915/intel_pm.c | 5 ++++- + 2 files changed, 7 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h +index 68a58cce6ab1..2561af075ebb 100644 +--- a/drivers/gpu/drm/i915/i915_reg.h ++++ b/drivers/gpu/drm/i915/i915_reg.h +@@ -1355,6 +1355,9 @@ enum i915_power_well_id { + #define VLV_BIAS_CPU_125_SOC_875 (6 << 2) + #define CHV_BIAS_CPU_50_SOC_50 (3 << 2) + ++#define VLV_RP_UP_EI_THRESHOLD 90 ++#define VLV_RP_DOWN_EI_THRESHOLD 70 ++ + /* vlv2 north clock has */ + #define CCK_FUSE_REG 0x8 + #define CCK_FUSE_HPLL_FREQ_MASK 0x3 +diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c +index 01966b89be14..177b6caa0a38 100644 +--- a/drivers/gpu/drm/i915/intel_pm.c ++++ b/drivers/gpu/drm/i915/intel_pm.c +@@ -6096,8 +6096,11 @@ static void gen6_set_rps_thresholds(struct drm_i915_private *dev_priv, u8 val) + /* When byt can survive without system hang with dynamic + * sw freq adjustments, this restriction can be lifted. + */ +- if (IS_VALLEYVIEW(dev_priv)) ++ if (IS_VALLEYVIEW(dev_priv)) { ++ threshold_up = VLV_RP_UP_EI_THRESHOLD; ++ threshold_down = VLV_RP_DOWN_EI_THRESHOLD; + goto skip_hw_write; ++ } + + I915_WRITE(GEN6_RP_UP_EI, + GT_INTERVAL_FROM_US(dev_priv, ei_up)); +-- +2.14.3 + diff --git a/packages/linux/patches/default/linux-999.21-intel_idle:-Disable-C6N-and-C6S-on-Bay-Trail.patch b/packages/linux/patches/default/linux-999.21-intel_idle:-Disable-C6N-and-C6S-on-Bay-Trail.patch new file mode 100644 index 0000000000..8b820cdc82 --- /dev/null +++ b/packages/linux/patches/default/linux-999.21-intel_idle:-Disable-C6N-and-C6S-on-Bay-Trail.patch @@ -0,0 +1,53 @@ +From 945d0eb39d8920854c72ecb743c07d54b738cf7f Mon Sep 17 00:00:00 2001 +From: Hans de Goede +Date: Thu, 9 Nov 2017 14:21:24 +0100 +Subject: [PATCH v3 2/2] intel_idle: Disable C6N and C6S on Bay Trail + +It seems that Bay Trail SoCs sometimes have issues waking from C6, +a lot of users even report Bay Trail devices only being stable +when passing intel_idle.max_cstate=1 to the kernel. + +This commits disables the C6 states while leaving the C7 states +available so that the cores can still reach deep sleep states. + +There are several indicators that this is part of the solution for +all the users who need to pass intel_idle.max_cstate=1: + +1) The "VLP52 EOI Transactions May Not be Sent if Software + Enters Core C6 During an Interrupt Service Routine" errata. + +2) Several users who need intel_idle.max_cstate=1 indicate in bko109051 + (which has over 800 comments!) that using a shell script which + disables C6N and C6S through sysfs allows them to remove + intel_idle.max_cstate=1 and still have a stable system which does + use the C7 states for power-saving. + +BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=109051 +Signed-off-by: Hans de Goede +--- + drivers/idle/intel_idle.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/idle/intel_idle.c b/drivers/idle/intel_idle.c +index 5dc7ea4b6bc4..fe05984c9e81 100644 +--- a/drivers/idle/intel_idle.c ++++ b/drivers/idle/intel_idle.c +@@ -221,6 +221,7 @@ static struct cpuidle_state byt_cstates[] = { + .flags = MWAIT2flg(0x58) | CPUIDLE_FLAG_TLB_FLUSHED, + .exit_latency = 300, + .target_residency = 275, ++ .disabled = true, + .enter = &intel_idle, + .enter_s2idle = intel_idle_s2idle, }, + { +@@ -229,6 +230,7 @@ static struct cpuidle_state byt_cstates[] = { + .flags = MWAIT2flg(0x52) | CPUIDLE_FLAG_TLB_FLUSHED, + .exit_latency = 500, + .target_residency = 560, ++ .disabled = true, + .enter = &intel_idle, + .enter_s2idle = intel_idle_s2idle, }, + { +-- +2.14.3 + diff --git a/packages/tools/bcm2835-bootloader/package.mk b/packages/tools/bcm2835-bootloader/package.mk index 7398679dfe..a785ed288c 100644 --- a/packages/tools/bcm2835-bootloader/package.mk +++ b/packages/tools/bcm2835-bootloader/package.mk @@ -17,8 +17,8 @@ ################################################################################ PKG_NAME="bcm2835-bootloader" -PKG_VERSION="008700b" -PKG_SHA256="f96620ad3e1d682ff0a15b12f7f0f0bda0e0b8d3802eb948ee7e8202355edb46" +PKG_VERSION="5e55ff0" +PKG_SHA256="2ab04a21a4aaa64a4e2f7d5b02cf20a4633b7a765f79423070a2c47402092f11" PKG_ARCH="arm" PKG_LICENSE="nonfree" PKG_SITE="http://www.broadcom.com" diff --git a/projects/Generic/linux/linux.x86_64.conf b/projects/Generic/linux/linux.x86_64.conf index c210fad0ae..c0db7ebb5e 100644 --- a/projects/Generic/linux/linux.x86_64.conf +++ b/projects/Generic/linux/linux.x86_64.conf @@ -1,6 +1,6 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/x86_64 4.14.9 Kernel Configuration +# Linux/x86_64 4.14.14 Kernel Configuration # CONFIG_64BIT=y CONFIG_X86_64=y @@ -407,7 +407,8 @@ CONFIG_DEFAULT_CFQ=y CONFIG_DEFAULT_IOSCHED="cfq" CONFIG_MQ_IOSCHED_DEADLINE=y CONFIG_MQ_IOSCHED_KYBER=y -# CONFIG_IOSCHED_BFQ is not set +CONFIG_IOSCHED_BFQ=y +# CONFIG_BFQ_GROUP_IOSCHED is not set CONFIG_INLINE_SPIN_UNLOCK_IRQ=y CONFIG_INLINE_READ_UNLOCK=y CONFIG_INLINE_READ_UNLOCK_IRQ=y @@ -433,6 +434,7 @@ CONFIG_X86_FAST_FEATURE_TESTS=y # CONFIG_X86_X2APIC is not set CONFIG_X86_MPPARSE=y # CONFIG_GOLDFISH is not set +CONFIG_RETPOLINE=y # CONFIG_INTEL_RDT is not set # CONFIG_X86_EXTENDED_PLATFORM is not set CONFIG_X86_INTEL_LPSS=y @@ -1310,6 +1312,7 @@ CONFIG_WANT_DEV_COREDUMP=y # CONFIG_SYS_HYPERVISOR is not set # CONFIG_GENERIC_CPU_DEVICES is not set CONFIG_GENERIC_CPU_AUTOPROBE=y +CONFIG_GENERIC_CPU_VULNERABILITIES=y CONFIG_REGMAP=y CONFIG_REGMAP_I2C=y CONFIG_DMA_SHARED_BUFFER=y @@ -3974,6 +3977,7 @@ CONFIG_HID_MULTITOUCH=m # CONFIG_HID_NTI is not set # CONFIG_HID_NTRIG is not set CONFIG_HID_ORTEK=y +CONFIG_HID_OUYA=y CONFIG_HID_PANTHERLORD=y CONFIG_PANTHERLORD_FF=y CONFIG_HID_PENMOUNT=y @@ -5217,6 +5221,7 @@ CONFIG_KEYS_COMPAT=y # CONFIG_SECURITY_DMESG_RESTRICT is not set # CONFIG_SECURITY is not set # CONFIG_SECURITYFS is not set +CONFIG_PAGE_TABLE_ISOLATION=y CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y # CONFIG_HARDENED_USERCOPY is not set # CONFIG_FORTIFY_SOURCE is not set diff --git a/projects/RPi/devices/RPi/linux/linux.arm.conf b/projects/RPi/devices/RPi/linux/linux.arm.conf index 9e6a99bfce..53e2dcf685 100644 --- a/projects/RPi/devices/RPi/linux/linux.arm.conf +++ b/projects/RPi/devices/RPi/linux/linux.arm.conf @@ -1,6 +1,6 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/arm 4.14.6 Kernel Configuration +# Linux/arm 4.14.15 Kernel Configuration # CONFIG_ARM=y CONFIG_ARM_HAS_SG_CHAIN=y @@ -335,7 +335,8 @@ CONFIG_DEFAULT_NOOP=y CONFIG_DEFAULT_IOSCHED="noop" CONFIG_MQ_IOSCHED_DEADLINE=y CONFIG_MQ_IOSCHED_KYBER=y -# CONFIG_IOSCHED_BFQ is not set +CONFIG_IOSCHED_BFQ=y +# CONFIG_BFQ_GROUP_IOSCHED is not set CONFIG_INLINE_SPIN_UNLOCK_IRQ=y CONFIG_INLINE_READ_UNLOCK=y CONFIG_INLINE_READ_UNLOCK_IRQ=y @@ -1620,6 +1621,7 @@ CONFIG_TOUCHSCREEN_ADS7846=m # CONFIG_TOUCHSCREEN_EETI is not set CONFIG_TOUCHSCREEN_EGALAX=m # CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set +# CONFIG_TOUCHSCREEN_EXC3000 is not set # CONFIG_TOUCHSCREEN_FUJITSU is not set # CONFIG_TOUCHSCREEN_GOODIX is not set # CONFIG_TOUCHSCREEN_ILI210X is not set @@ -3259,6 +3261,7 @@ CONFIG_HID_MULTITOUCH=m # CONFIG_HID_NTI is not set # CONFIG_HID_NTRIG is not set CONFIG_HID_ORTEK=y +CONFIG_HID_OUYA=y CONFIG_HID_PANTHERLORD=y CONFIG_PANTHERLORD_FF=y CONFIG_HID_PENMOUNT=y diff --git a/projects/RPi/devices/RPi2/linux/linux.arm.conf b/projects/RPi/devices/RPi2/linux/linux.arm.conf index a72a0d8b9e..f3f993adb3 100644 --- a/projects/RPi/devices/RPi2/linux/linux.arm.conf +++ b/projects/RPi/devices/RPi2/linux/linux.arm.conf @@ -1,6 +1,6 @@ # # Automatically generated file; DO NOT EDIT. -# Linux/arm 4.14.6 Kernel Configuration +# Linux/arm 4.14.15 Kernel Configuration # CONFIG_ARM=y CONFIG_ARM_HAS_SG_CHAIN=y @@ -342,7 +342,8 @@ CONFIG_DEFAULT_NOOP=y CONFIG_DEFAULT_IOSCHED="noop" CONFIG_MQ_IOSCHED_DEADLINE=y CONFIG_MQ_IOSCHED_KYBER=y -# CONFIG_IOSCHED_BFQ is not set +CONFIG_IOSCHED_BFQ=y +# CONFIG_BFQ_GROUP_IOSCHED is not set CONFIG_INLINE_SPIN_UNLOCK_IRQ=y CONFIG_INLINE_READ_UNLOCK=y CONFIG_INLINE_READ_UNLOCK_IRQ=y @@ -1713,6 +1714,7 @@ CONFIG_TOUCHSCREEN_ADS7846=m # CONFIG_TOUCHSCREEN_EETI is not set CONFIG_TOUCHSCREEN_EGALAX=m # CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set +# CONFIG_TOUCHSCREEN_EXC3000 is not set # CONFIG_TOUCHSCREEN_FUJITSU is not set # CONFIG_TOUCHSCREEN_GOODIX is not set # CONFIG_TOUCHSCREEN_ILI210X is not set @@ -3357,6 +3359,7 @@ CONFIG_HID_MULTITOUCH=m # CONFIG_HID_NTI is not set # CONFIG_HID_NTRIG is not set CONFIG_HID_ORTEK=y +CONFIG_HID_OUYA=y CONFIG_HID_PANTHERLORD=y CONFIG_PANTHERLORD_FF=y CONFIG_HID_PENMOUNT=y diff --git a/projects/RPi/patches/linux/linux-01-RPi_support.patch b/projects/RPi/patches/linux/linux-01-RPi_support.patch index 506a216f63..5422b8a160 100644 --- a/projects/RPi/patches/linux/linux-01-RPi_support.patch +++ b/projects/RPi/patches/linux/linux-01-RPi_support.patch @@ -1,7 +1,7 @@ -From f6106f96f8e3005e7c046fb5e5fa45616d53921c Mon Sep 17 00:00:00 2001 +From d9d890a9458fdeeabcb02d232934069e3ad35487 Mon Sep 17 00:00:00 2001 From: Dan Pasanen Date: Thu, 21 Sep 2017 09:55:42 -0500 -Subject: [PATCH 001/156] arm: partially revert +Subject: [PATCH 001/201] arm: partially revert 702b94bff3c50542a6e4ab9a4f4cef093262fe65 * Re-expose some dmi APIs for use in VCSM @@ -106,10 +106,10 @@ index 054b491ff7649ca067ff821770aec80a4da42102..70e8b7d3443467ae9595924f1a9d043b EXPORT_SYMBOL(cpu_cache); #endif -From 33fb31a3eb713d3c4f1ea57bf4a747bd640df22a Mon Sep 17 00:00:00 2001 +From cec6171e90f1c71191086277abd50033794eba37 Mon Sep 17 00:00:00 2001 From: Steve Glendinning Date: Thu, 19 Feb 2015 18:47:12 +0000 -Subject: [PATCH 002/156] smsx95xx: fix crimes against truesize +Subject: [PATCH 002/201] smsx95xx: fix crimes against truesize smsc95xx is adjusting truesize when it shouldn't, and following a recent patch from Eric this is now triggering warnings. @@ -156,10 +156,10 @@ index 309b88acd3d0b6ca1528dde7b27a23926f9be952..25e37195ceb00cfc0ced7638e8b571a1 usbnet_skb_return(dev, ax_skb); } -From 57b933b304a1a741ed667e7816d6f4f8de306e41 Mon Sep 17 00:00:00 2001 +From d8bf9e4d39f94900628fc3f3a8aec339bb3eca95 Mon Sep 17 00:00:00 2001 From: Sam Nazarko Date: Fri, 1 Apr 2016 17:27:21 +0100 -Subject: [PATCH 003/156] smsc95xx: Experimental: Enable turbo_mode and +Subject: [PATCH 003/201] smsc95xx: Experimental: Enable turbo_mode and packetsize=2560 by default See: http://forum.kodi.tv/showthread.php?tid=285288 @@ -202,10 +202,10 @@ index 25e37195ceb00cfc0ced7638e8b571a1b0b8e6f1..09c7d4a07299e70b1cdc9df2c2c4cb39 netif_dbg(dev, ifup, dev->net, "rx_urb_size=%ld\n", -From fb14f1dfe72306e448cafb604d3f4ae0b59afe1c Mon Sep 17 00:00:00 2001 +From 5f0e62912300acf4b2556537cf27d3defadad59c Mon Sep 17 00:00:00 2001 From: popcornmix Date: Tue, 26 Mar 2013 17:26:38 +0000 -Subject: [PATCH 004/156] Allow mac address to be set in smsc95xx +Subject: [PATCH 004/201] Allow mac address to be set in smsc95xx Signed-off-by: popcornmix --- @@ -301,10 +301,10 @@ index 09c7d4a07299e70b1cdc9df2c2c4cb39d2207c37..4d9704d0b184df9bd7ddbe6769e40a75 eth_hw_addr_random(dev->net); netif_dbg(dev, ifup, dev->net, "MAC address set to eth_random_addr\n"); -From d589b8d9a4c83f9021131e186f2d39187ba95a2b Mon Sep 17 00:00:00 2001 +From abdd56722683d3086033efbb9648fd6843c6151a Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Fri, 13 Mar 2015 12:43:36 +0000 -Subject: [PATCH 005/156] Protect __release_resource against resources without +Subject: [PATCH 005/201] Protect __release_resource against resources without parents Without this patch, removing a device tree overlay can crash here. @@ -332,10 +332,10 @@ index 9b5f04404152c296af3a96132f27cfc80ffa9af9..f8a9af6e6b915812be2ba2c1c2b40106 for (;;) { tmp = *p; -From 9f5dfb791d347832f0d6dcb1eede81834d5fa4dd Mon Sep 17 00:00:00 2001 +From 230d8059390dd3268c00ea36b0ceed0fc2abc084 Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Fri, 4 Dec 2015 17:41:50 +0000 -Subject: [PATCH 006/156] irq-bcm2836: Prevent spurious interrupts, and trap +Subject: [PATCH 006/201] irq-bcm2836: Prevent spurious interrupts, and trap them early The old arch-specific IRQ macros included a dsb to ensure the @@ -362,10 +362,10 @@ index dc8c1e3eafe794a3af83dd987a6d6362d14dd5ee..e8204d9af58f1b893505c06902a83390 #endif } else if (stat) { -From 295ad02d69edd298c158feca5318463c56f8e17e Mon Sep 17 00:00:00 2001 +From 69bc65e0bda33413d94e83615091686d55195077 Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Thu, 9 Feb 2017 14:33:30 +0000 -Subject: [PATCH 007/156] irq-bcm2836: Avoid "Invalid trigger warning" +Subject: [PATCH 007/201] irq-bcm2836: Avoid "Invalid trigger warning" Initialise the level for each IRQ to avoid a warning from the arm arch timer code. @@ -389,10 +389,10 @@ index e8204d9af58f1b893505c06902a83390c2ea8509..6e3fab9587b782e026c01fa6b6e40338 static void -From 1ca4541a4f155941247fc8064801badca1ec3d95 Mon Sep 17 00:00:00 2001 +From 60974c9110c3b85e69dc50fd9833e58eee719781 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= Date: Fri, 12 Jun 2015 19:01:05 +0200 -Subject: [PATCH 008/156] irqchip: bcm2835: Add FIQ support +Subject: [PATCH 008/201] irqchip: bcm2835: Add FIQ support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @@ -521,10 +521,10 @@ index d2da8a1e6b1b71381e382d034e7a94e865a6c3da..c4903360eabc2bef04f8e745782cea26 } -From 341d7af24f36dd806066927dfa8aa41c7104ecc0 Mon Sep 17 00:00:00 2001 +From bd439dae74abfa099cbfecfeac07596746687108 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= Date: Fri, 23 Oct 2015 16:26:55 +0200 -Subject: [PATCH 009/156] irqchip: irq-bcm2835: Add 2836 FIQ support +Subject: [PATCH 009/201] irqchip: irq-bcm2835: Add 2836 FIQ support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @@ -623,10 +623,10 @@ index c4903360eabc2bef04f8e745782cea268fb22897..13356d3b7bcd508f058c6a9e3c4b0b38 for (b = 0; b < NR_BANKS; b++) { for (i = 0; i < bank_irqs[b]; i++) { -From f45e4f1cbd34474fc09ba45348c59a97114f928f Mon Sep 17 00:00:00 2001 +From 92b23200bc99602ba036ef25c996f79789f2b19b Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Mon, 8 May 2017 16:43:40 +0100 -Subject: [PATCH 010/156] irq_bcm2836: Send event when onlining sleeping cores +Subject: [PATCH 010/201] irq_bcm2836: Send event when onlining sleeping cores In order to reduce power consumption and bus traffic, it is sensible for secondary cores to enter a low-power idle state when waiting to @@ -662,10 +662,10 @@ index 6e3fab9587b782e026c01fa6b6e40338ef0c8d0a..86b357ae027bf8ba1ac32cd150a8cf21 } -From 9011636a14f5a61855bd0d098b120466bc56d633 Mon Sep 17 00:00:00 2001 +From 8ae97fa3b5643f0247135586cdd983900e8fa479 Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Tue, 14 Jul 2015 10:26:09 +0100 -Subject: [PATCH 011/156] spidev: Add "spidev" compatible string to silence +Subject: [PATCH 011/201] spidev: Add "spidev" compatible string to silence warning See: https://github.com/raspberrypi/linux/issues/1054 @@ -686,10 +686,10 @@ index cda10719d1d1b21b32866d2b79363faa461ab8e1..4f3779d3aa0960640506725bde918075 }; MODULE_DEVICE_TABLE(of, spidev_dt_ids); -From 1e84fd366314c3ffca613df252c699b31ee02e10 Mon Sep 17 00:00:00 2001 +From ff5155a91c3a801a49e7debfec3da1d545a8bb4c Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Wed, 24 Jun 2015 14:10:44 +0100 -Subject: [PATCH 012/156] spi-bcm2835: Support pin groups other than 7-11 +Subject: [PATCH 012/201] spi-bcm2835: Support pin groups other than 7-11 The spi-bcm2835 driver automatically uses GPIO chip-selects due to some unreliability of the native ones. In doing so it chooses the @@ -770,10 +770,10 @@ index f35cc10772f6670397ea923ad30158270dd68578..5dfe20ffc2866fa6789825016c585175 /* and set up the "mode" and level */ dev_info(&spi->dev, "setting up native-CS%i as GPIO %i\n", -From 07f32122f8536814a2ef16dda041459c2f7b4af6 Mon Sep 17 00:00:00 2001 +From 37b23d0421c1277c5cdebb5d382689aaa7b07de6 Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Fri, 1 Jul 2016 22:09:24 +0100 -Subject: [PATCH 013/156] spi-bcm2835: Disable forced software CS +Subject: [PATCH 013/201] spi-bcm2835: Disable forced software CS Select software CS in bcm2708_common.dtsi, and disable the automatic conversion in the driver to allow hardware CS to be re-enabled with an @@ -807,10 +807,10 @@ index 5dfe20ffc2866fa6789825016c585175a29705b6..8493474d286f7a1ac6454a22c61c8c2c return 0; } -From 23b3acdbba4f2130d43465d12d3a076756a94c0c Mon Sep 17 00:00:00 2001 +From f668e0f1f82524ddc1f5a91acdc6d070d1cd8a72 Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Tue, 8 Nov 2016 21:35:38 +0000 -Subject: [PATCH 014/156] spi-bcm2835: Remove unused code +Subject: [PATCH 014/201] spi-bcm2835: Remove unused code --- drivers/spi/spi-bcm2835.c | 61 ----------------------------------------------- @@ -898,10 +898,10 @@ index 8493474d286f7a1ac6454a22c61c8c2cef9121bf..33d75ad38a7f77d085321ace9101900a } -From 7bfd695dfb10eaee080ed145a73861452f9983ff Mon Sep 17 00:00:00 2001 +From 461fe630a09b9f287781e4c8822405228c965c2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= Date: Wed, 3 Jun 2015 12:26:13 +0200 -Subject: [PATCH 015/156] ARM: bcm2835: Set Serial number and Revision +Subject: [PATCH 015/201] ARM: bcm2835: Set Serial number and Revision MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @@ -954,10 +954,10 @@ index 0c1edfc98696da0e0bb7f4a18cdfbcdd27a9795d..8f152266ba9b470df2eaaed9ebcf158e static const char * const bcm2835_compat[] = { -From 4459e2d28a831d0668c7b9b476df320dbd735a62 Mon Sep 17 00:00:00 2001 +From b0dbc25891a5d62e2f9a8a2b9e7da6515752cf46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= Date: Sat, 3 Oct 2015 22:22:55 +0200 -Subject: [PATCH 016/156] dmaengine: bcm2835: Load driver early and support +Subject: [PATCH 016/201] dmaengine: bcm2835: Load driver early and support legacy API MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 @@ -1060,10 +1060,10 @@ index 6204cc32d09c5096df8aec304c3c37b3bcb6be44..599c218dc8a73172dd4bd4a058fc8f95 MODULE_ALIAS("platform:bcm2835-dma"); MODULE_DESCRIPTION("BCM2835 DMA engine driver"); -From 1bf1b175436e707b2fc6d31e100b4956c0cd8c46 Mon Sep 17 00:00:00 2001 +From a25e1d451917d6d9372d59d2ffc46255e5faf067 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Mon, 25 Jan 2016 17:25:12 +0000 -Subject: [PATCH 017/156] firmware: Updated mailbox header +Subject: [PATCH 017/201] firmware: Updated mailbox header --- include/soc/bcm2835/raspberrypi-firmware.h | 21 +++++++++++++++++++++ @@ -1149,10 +1149,10 @@ index cb979ad90401e299344dd5fae38d09c489d8bd58..cbd1674570433fc591df89f68c892b33 #endif /* __SOC_RASPBERRY_FIRMWARE_H__ */ -From a20624bc88e37ed706364207cd9a5338bac74f52 Mon Sep 17 00:00:00 2001 +From de50c1891fef0e317188b005821ab47e420da894 Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Wed, 15 Jun 2016 16:48:41 +0100 -Subject: [PATCH 018/156] rtc: Add SPI alias for pcf2123 driver +Subject: [PATCH 018/201] rtc: Add SPI alias for pcf2123 driver Without this alias, Device Tree won't cause the driver to be loaded. @@ -1172,10 +1172,10 @@ index 8895f77726e8da5444afcd602dceff8f25a9b3fd..1833b8853ceb0e6147cceb93a00e558c MODULE_LICENSE("GPL"); +MODULE_ALIAS("spi:rtc-pcf2123"); -From 2dbe0076815d6084a9576adecd67e58632972567 Mon Sep 17 00:00:00 2001 +From f4dc338d40d1c667547bcac494133da94ab3bfde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= Date: Fri, 7 Oct 2016 16:50:59 +0200 -Subject: [PATCH 019/156] watchdog: bcm2835: Support setting reboot partition +Subject: [PATCH 019/201] watchdog: bcm2835: Support setting reboot partition MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @@ -1277,10 +1277,10 @@ index b339e0e67b4c1275fd4992fea4f1e24c0575b783..26b7177573fac2af1cd4ab5488d2686f static int bcm2835_wdt_probe(struct platform_device *pdev) -From 29d1a79a9e57322275076f1f1890edcb81d49f35 Mon Sep 17 00:00:00 2001 +From 6ab5b331736e3aa5f2ec8aa3a8b6e5036a944313 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Tue, 5 Apr 2016 19:40:12 +0100 -Subject: [PATCH 020/156] reboot: Use power off rather than busy spinning when +Subject: [PATCH 020/201] reboot: Use power off rather than busy spinning when halt is requested --- @@ -1303,10 +1303,10 @@ index 3b2aa9a9fe268d45335f781c4aa22cf573753a1b..0180d89a34af45c56243fe0f17fbe209 /* -From 9d23bac22f192d704a01e9b033cde91c480ce23e Mon Sep 17 00:00:00 2001 +From b723479ea0e9c2fc8eaca22845e2246579c96ef8 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Wed, 9 Nov 2016 13:02:52 +0000 -Subject: [PATCH 021/156] bcm: Make RASPBERRYPI_POWER depend on PM +Subject: [PATCH 021/201] bcm: Make RASPBERRYPI_POWER depend on PM --- drivers/soc/bcm/Kconfig | 1 + @@ -1325,10 +1325,10 @@ index 49f1e2a75d614bc21db152327c7b425ae2504f8d..dccd2374ed00631abd441e3e9d78ee74 help This enables support for the RPi power domains which can be enabled -From 321264163a4d87e7ab1a31c87f369c8ba7b23599 Mon Sep 17 00:00:00 2001 +From 05f5ca04b1e42ae95641ec892d136baa4c78eac9 Mon Sep 17 00:00:00 2001 From: Martin Sperl Date: Fri, 2 Sep 2016 16:45:27 +0100 -Subject: [PATCH 022/156] Register the clocks early during the boot process, so +Subject: [PATCH 022/201] Register the clocks early during the boot process, so that special/critical clocks can get enabled early on in the boot process avoiding the risk of disabling a clock, pll_divider or pll when a claiming driver fails to install propperly - maybe it needs to defer. @@ -1373,10 +1373,10 @@ index 58ce6af8452db9ca8b4d3c380a06e448919f6a8d..11d89d106026f15719ea25047d6f357b MODULE_AUTHOR("Eric Anholt "); MODULE_DESCRIPTION("BCM2835 clock driver"); -From a4effe7b54bd5d37d33237050e8dfdc3a006fd19 Mon Sep 17 00:00:00 2001 +From 0c1125f5ba05c664abf23cb90f4a1d8cc4d5ef66 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Tue, 6 Dec 2016 17:05:39 +0000 -Subject: [PATCH 023/156] bcm2835-rng: Avoid initialising if already enabled +Subject: [PATCH 023/201] bcm2835-rng: Avoid initialising if already enabled Avoids the 0x40000 cycles of warmup again if firmware has already used it --- @@ -1402,10 +1402,10 @@ index 574211a495491d9d6021dcaefe4274a63ed02055..e66c0fca8c6090e32f72796c0877a1cf err = hwrng_register(&bcm2835_rng_ops); if (err) { -From 68f2f4badc48c65d4a79f98558f57998b04c9ae5 Mon Sep 17 00:00:00 2001 +From 7ba06e2550f7252889243435c63ae440d89a65ef Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Wed, 24 Aug 2016 16:28:44 +0100 -Subject: [PATCH 024/156] kbuild: Ignore dtco targets when filtering symbols +Subject: [PATCH 024/201] kbuild: Ignore dtco targets when filtering symbols --- scripts/Kbuild.include | 2 +- @@ -1425,10 +1425,10 @@ index 9ffd3dda3889c56a7a72229bed21ff5c49d62856..00da6c9bacbf33334233e22ca5209ade esac | tr ";" "\n" | sed -rn 's/^.*=== __KSYM_(.*) ===.*$$/KSYM_\1/p' -From 8640ab81e01ce41ade97b335eebddb83d727940e Mon Sep 17 00:00:00 2001 +From f1d516520ca16f69f1fb8bb5fa64f2b98c332c0f Mon Sep 17 00:00:00 2001 From: Robert Tiemann Date: Mon, 20 Jul 2015 11:01:25 +0200 -Subject: [PATCH 025/156] BCM2835_DT: Fix I2S register map +Subject: [PATCH 025/201] BCM2835_DT: Fix I2S register map --- Documentation/devicetree/bindings/dma/brcm,bcm2835-dma.txt | 4 ++-- @@ -1466,10 +1466,10 @@ index 65783de0aedf3da79adc36fd077b7a89954ddb6b..a89fe4220fdc3f26f75ee66daf187554 dmas = <&dma 2>, <&dma 3>; -From 56eeb37400267ca0d36efb6458d5a38b9178995a Mon Sep 17 00:00:00 2001 +From 3cda44c973dbe59dcbb822df068487e09488064f Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Mon, 13 Feb 2017 17:20:08 +0000 -Subject: [PATCH 026/156] clk-bcm2835: Mark used PLLs and dividers CRITICAL +Subject: [PATCH 026/201] clk-bcm2835: Mark used PLLs and dividers CRITICAL The VPU configures and relies on several PLLs and dividers. Mark all enabled dividers and their PLLs as CRITICAL to prevent the kernel from @@ -1497,10 +1497,10 @@ index 11d89d106026f15719ea25047d6f357b4bfcb2c5..fe8f5d65f2749cb3ddc878df61664826 divider->data = data; -From cbc388323525cd53dfd51a5d932d7319d2bceeab Mon Sep 17 00:00:00 2001 +From 72e2aca50328a807fffe452fd6e0389a30759e75 Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Mon, 13 Feb 2017 17:20:08 +0000 -Subject: [PATCH 027/156] clk-bcm2835: Add claim-clocks property +Subject: [PATCH 027/201] clk-bcm2835: Add claim-clocks property The claim-clocks property can be used to prevent PLLs and dividers from being marked as critical. It contains a vector of clock IDs, @@ -1602,10 +1602,10 @@ index fe8f5d65f2749cb3ddc878df616648267441e0ee..92b5e0f5145b32d3bfc3592fe381e8be sizeof(cprman_parent_names)); of_clk_parent_fill(dev->of_node, cprman->real_parent_names, -From f73acf735e77f6128c689734618e969f79dd1885 Mon Sep 17 00:00:00 2001 +From 80ec4f24ef1e1bfd25efc5b7143724ac37d838f5 Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Mon, 6 Mar 2017 09:06:18 +0000 -Subject: [PATCH 028/156] clk-bcm2835: Read max core clock from firmware +Subject: [PATCH 028/201] clk-bcm2835: Read max core clock from firmware The VPU is responsible for managing the core clock, usually under direction from the bcm2835-cpufreq driver but not via the clk-bcm2835 @@ -1720,10 +1720,10 @@ index 92b5e0f5145b32d3bfc3592fe381e8be3cd90c72..336f8c9c44325d0a94e591a8557f7af2 for (i = 0; !of_property_read_u32_index(pdev->dev.of_node, "claim-clocks", -From 195917b2219c284543d57dc4b15d5f1eb87f0c7e Mon Sep 17 00:00:00 2001 +From af5d91fbc2094ac6f1c68b1e03ee6f389d16e964 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Mon, 9 May 2016 17:28:18 -0700 -Subject: [PATCH 029/156] clk: bcm2835: Mark GPIO clocks enabled at boot as +Subject: [PATCH 029/201] clk: bcm2835: Mark GPIO clocks enabled at boot as critical. These divide off of PLLD_PER and are used for the ethernet and wifi @@ -1761,10 +1761,10 @@ index 336f8c9c44325d0a94e591a8557f7af246adc857..caa05e5ad0b7b5cd683e04fb3591a3df * Pass the CLK_SET_RATE_PARENT flag if we are allowed to propagate * rate changes on at least of the parents. -From c71c0ebb1d61fc99cfd09cd8a91715d7b39ef14c Mon Sep 17 00:00:00 2001 +From 2a474d35b1673521d5d0d5c51eeaf5b893351c4e Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Thu, 9 Feb 2017 14:36:44 +0000 -Subject: [PATCH 030/156] sound: Demote deferral errors to INFO level +Subject: [PATCH 030/201] sound: Demote deferral errors to INFO level At present there is no mechanism to specify driver load order, which can lead to deferrals and repeated retries until successful. @@ -1799,10 +1799,10 @@ index fee4b0ef5566cf9e8de0bf5c568706da9cab2ea2..c728a4148903e983d61b6ae65765ba11 goto _err_defer; } -From c569310d249d1e970501449d500e986a45ecfc5e Mon Sep 17 00:00:00 2001 +From 5e5c88d4c4f445e6e7f7bf106d4c767566958af4 Mon Sep 17 00:00:00 2001 From: Claggy3 Date: Sat, 11 Feb 2017 14:00:30 +0000 -Subject: [PATCH 031/156] Update vfpmodule.c +Subject: [PATCH 031/201] Update vfpmodule.c Christopher Alexander Tobias Schulze - May 2, 2015, 11:57 a.m. This patch fixes a problem with VFP state save and restore related @@ -1939,10 +1939,10 @@ index a71a48e71fffa8626fe90106815376c44bbe679b..d6c0a5a0a5ae3510db3ace5e3f5d3410 /* * Save the userland NEON/VFP state. Under UP, -From 1810300a6150e3fda9025d354b93b06e791e60ee Mon Sep 17 00:00:00 2001 +From e5fa3bdb7debe74d8b271492139549df6a46ac2a Mon Sep 17 00:00:00 2001 From: Matt Flax Date: Wed, 8 Mar 2017 21:13:24 +1100 -Subject: [PATCH 032/156] ASoC: bcm2835_i2s.c: relax the ch2 register setting +Subject: [PATCH 032/201] ASoC: bcm2835_i2s.c: relax the ch2 register setting for 8 channels This patch allows ch2 registers to be set for 8 channels of audio. @@ -1963,10 +1963,10 @@ index 6ba20498202ed36906b52096893a88867a79269f..56df7d8a43d0aac055a91b0d24aca8e1 format |= BCM2835_I2S_CH1(BCM2835_I2S_CHPOS(ch1pos)); format |= BCM2835_I2S_CH2(BCM2835_I2S_CHPOS(ch2pos)); -From 14414793647862240b41d92e060bf544da028869 Mon Sep 17 00:00:00 2001 +From 0afa18284f78a743187b12aacc72b0f395e86be5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= Date: Tue, 1 Nov 2016 15:15:41 +0100 -Subject: [PATCH 033/156] i2c: bcm2835: Add debug support +Subject: [PATCH 033/201] i2c: bcm2835: Add debug support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @@ -2155,10 +2155,10 @@ index cd07a69e2e9355540442785f95e90823b05c9d10..47167f403cc8329bd811b47c7011c299 if (i2c_dev->msg_err & BCM2835_I2C_S_ERR) return -EREMOTEIO; -From 928822666a337539431f52f3c9f1e891824406c5 Mon Sep 17 00:00:00 2001 +From 70d56c42092cd38ab02deec1f607f1d4c4079bb9 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Thu, 18 Dec 2014 16:07:15 -0800 -Subject: [PATCH 034/156] mm: Remove the PFN busy warning +Subject: [PATCH 034/201] mm: Remove the PFN busy warning See commit dae803e165a11bc88ca8dbc07a11077caf97bbcb -- the warning is expected sometimes when using CMA. However, that commit still spams @@ -2183,10 +2183,10 @@ index d51c2087c498c63f3f515d2931e42b5110efb62f..fd094c36e26c712d7537b16aa547d3e8 goto done; } -From a2df686515eff3783a9f093ecdec65f4de7f3717 Mon Sep 17 00:00:00 2001 +From d47099cc6511b448b6a389f335619c925ffec7d1 Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Thu, 23 Mar 2017 10:06:56 +0000 -Subject: [PATCH 035/156] ASoC: Add prompt for ICS43432 codec +Subject: [PATCH 035/201] ASoC: Add prompt for ICS43432 codec Without a prompt string, a config setting can't be included in a defconfig. Give CONFIG_SND_SOC_ICS43432 a prompt so that Pi soundcards @@ -2211,10 +2211,10 @@ index c367d11079bc90feec2ad0fa748d7ffc3035faba..91d5b531b69b49db97f7febbc60d33a2 config SND_SOC_INNO_RK3036 tristate "Inno codec driver for RK3036 SoC" -From e5c0d06f8dda015729b4677f262de672a7e56253 Mon Sep 17 00:00:00 2001 +From d01c920bd5578d11a04a09ba1a772d32aebbc824 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Sun, 12 May 2013 12:24:19 +0100 -Subject: [PATCH 036/156] Main bcm2708/bcm2709 linux port +Subject: [PATCH 036/201] Main bcm2708/bcm2709 linux port MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @@ -2402,10 +2402,10 @@ index cfb4b4496dd9f61362dea012176c146120fada07..d9c6c217c4d6a2408abe2665bf7f2700 MODULE_AUTHOR("Lubomir Rintel "); MODULE_DESCRIPTION("BCM2835 mailbox IPC driver"); -From 6b811eb961fc8ee4b32c9d4b0ce1895262865ea3 Mon Sep 17 00:00:00 2001 +From 9ab2fcac834f0aae94d9266b5741b8ec16f7226e Mon Sep 17 00:00:00 2001 From: popcornmix Date: Wed, 1 May 2013 19:46:17 +0100 -Subject: [PATCH 037/156] Add dwc_otg driver +Subject: [PATCH 037/201] Add dwc_otg driver MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @@ -63702,10 +63702,10 @@ index 0000000000000000000000000000000000000000..cdc9963176e5a4a0d5250613b61e26c5 +test_main(); +0; -From 62e8030e639ca93fdd156434fa4b9c4d87df49b5 Mon Sep 17 00:00:00 2001 +From 83d0db162af7cf072e14f65ef6bca9ce9db1ffdb Mon Sep 17 00:00:00 2001 From: popcornmix Date: Wed, 17 Jun 2015 17:06:34 +0100 -Subject: [PATCH 038/156] bcm2708 framebuffer driver +Subject: [PATCH 038/201] bcm2708 framebuffer driver MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @@ -67164,10 +67164,10 @@ index 3c14e43b82fefe1d32f591d1b2f61d2cd28d0fa8..7626beb6a5bb8df601ddf0f6e6909d1f +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 -From 1f1fb9db16b2469b6f85c838411c6c82294ddd6a Mon Sep 17 00:00:00 2001 +From bfb014341e3d1640eec981e14419b139b9352ecf Mon Sep 17 00:00:00 2001 From: Florian Meier Date: Fri, 22 Nov 2013 14:22:53 +0100 -Subject: [PATCH 039/156] dmaengine: Add support for BCM2708 +Subject: [PATCH 039/201] dmaengine: Add support for BCM2708 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @@ -67798,10 +67798,10 @@ index 0000000000000000000000000000000000000000..c5bfff2765be4606077e6c8af73040ec + +#endif /* _PLAT_BCM2708_DMA_H */ -From c5978cf87ec8a54135cf156d30660230e5c20b3a Mon Sep 17 00:00:00 2001 +From 81346c04c8aacb9c0c6baacb4d2a1d6738607f76 Mon Sep 17 00:00:00 2001 From: gellert Date: Fri, 15 Aug 2014 16:35:06 +0100 -Subject: [PATCH 040/156] MMC: added alternative MMC driver +Subject: [PATCH 040/201] MMC: added alternative MMC driver MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @@ -69681,10 +69681,10 @@ index 279b39008a33bb68745d9ea55ea5dd7ed522fd1c..49bdea5791a289251019a89419804dde unsigned int erase_size; /* erase size in sectors */ -From 39c43fc145cae70882e3e3488290c84b87dcaeae Mon Sep 17 00:00:00 2001 +From 8c6d308d7d0d54ccadc799b92d878f8444acd11b Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Wed, 25 Mar 2015 17:49:47 +0000 -Subject: [PATCH 041/156] Adding bcm2835-sdhost driver, and an overlay to +Subject: [PATCH 041/201] Adding bcm2835-sdhost driver, and an overlay to enable it BCM2835 has two SD card interfaces. This driver uses the other one. @@ -72090,10 +72090,10 @@ index 0000000000000000000000000000000000000000..9c6f199a7830959f31012d86bc1f8b1a +MODULE_LICENSE("GPL v2"); +MODULE_AUTHOR("Phil Elwell"); -From 5a859b5d42cd44e7188dbf6acac2223db98f0314 Mon Sep 17 00:00:00 2001 +From a9311a4fe71c12bc49e4bc3eefc343f00712697e Mon Sep 17 00:00:00 2001 From: popcornmix Date: Fri, 28 Oct 2016 15:36:43 +0100 -Subject: [PATCH 042/156] vc_mem: Add vc_mem driver for querying firmware +Subject: [PATCH 042/201] vc_mem: Add vc_mem driver for querying firmware memory addresses MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 @@ -72618,10 +72618,10 @@ index 0000000000000000000000000000000000000000..20a475377eb3078ea1ecaef2b24efc35 + +#endif /* _VC_MEM_H */ -From 9532a0d9fa463fd619def308b7bf42242f7aed94 Mon Sep 17 00:00:00 2001 +From 88e3a68b24ac9fd54392cea9d36e0723fbc112cc Mon Sep 17 00:00:00 2001 From: Tim Gover Date: Tue, 22 Jul 2014 15:41:04 +0100 -Subject: [PATCH 043/156] vcsm: VideoCore shared memory service for BCM2835 +Subject: [PATCH 043/201] vcsm: VideoCore shared memory service for BCM2835 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @@ -77499,10 +77499,10 @@ index 0000000000000000000000000000000000000000..b75729d762f25aace133f7a008633b40 + +#endif /* __VMCS_SM_IOCTL_H__INCLUDED__ */ -From 2353792af28878cabd4dd7bfb6e88a479625f1a7 Mon Sep 17 00:00:00 2001 +From bb42462e0201a474a567bb7c61c9e56484465d57 Mon Sep 17 00:00:00 2001 From: Luke Wren Date: Fri, 21 Aug 2015 23:14:48 +0100 -Subject: [PATCH 044/156] Add /dev/gpiomem device for rootless user GPIO access +Subject: [PATCH 044/201] Add /dev/gpiomem device for rootless user GPIO access Signed-off-by: Luke Wren @@ -77810,10 +77810,10 @@ index 0000000000000000000000000000000000000000..f5e7f1ba8fb6f18dee77fad06a17480c +MODULE_DESCRIPTION("gpiomem driver for accessing GPIO from userspace"); +MODULE_AUTHOR("Luke Wren "); -From 1df83a13e38a1e11488f14149e090adc34b29f18 Mon Sep 17 00:00:00 2001 +From 9fdee10fc9d1f51522b63457f6df2d08d04beff4 Mon Sep 17 00:00:00 2001 From: Luke Wren Date: Sat, 5 Sep 2015 01:14:45 +0100 -Subject: [PATCH 045/156] Add SMI driver +Subject: [PATCH 045/201] Add SMI driver Signed-off-by: Luke Wren --- @@ -79764,10 +79764,10 @@ index 0000000000000000000000000000000000000000..ee3a75edfc033eeb0d90a687ffb68b10 + +#endif /* BCM2835_SMI_H */ -From 1d94ec2cc547bb401165d21361065a72146bda2f Mon Sep 17 00:00:00 2001 +From 843921cd0abe0ae194adc94e5d88abad280566b1 Mon Sep 17 00:00:00 2001 From: Martin Sperl Date: Tue, 26 Apr 2016 14:59:21 +0000 -Subject: [PATCH 046/156] MISC: bcm2835: smi: use clock manager and fix reload +Subject: [PATCH 046/201] MISC: bcm2835: smi: use clock manager and fix reload issues Use clock manager instead of self-made clockmanager. @@ -79936,10 +79936,10 @@ index 63a4ea08b9930a3a31a985f0a1d969b488ed49ec..1261540703127d1d63b9f3c87042c6e5 return 0; } -From b8a743e8eee44e5b30592abd0d54a3d0c5afc753 Mon Sep 17 00:00:00 2001 +From 3cff724912c5a622d0e444089b4eb2fb8597e061 Mon Sep 17 00:00:00 2001 From: Luke Wren Date: Sat, 5 Sep 2015 01:16:10 +0100 -Subject: [PATCH 047/156] Add SMI NAND driver +Subject: [PATCH 047/201] Add SMI NAND driver Signed-off-by: Luke Wren --- @@ -80304,10 +80304,10 @@ index 0000000000000000000000000000000000000000..c4826ea1c2bae555ce780e61f1076ddd + ("Driver for NAND chips using Broadcom Secondary Memory Interface"); +MODULE_AUTHOR("Luke Wren "); -From cbda011089d3714435c827b48e4e5dded33a8cb3 Mon Sep 17 00:00:00 2001 +From 9cc8682c6ea521697547539d4f0eda6b7036493c Mon Sep 17 00:00:00 2001 From: Aron Szabo Date: Sat, 16 Jun 2012 12:15:55 +0200 -Subject: [PATCH 048/156] lirc: added support for RaspberryPi GPIO +Subject: [PATCH 048/201] lirc: added support for RaspberryPi GPIO lirc_rpi: Use read_current_timer to determine transmitter delay. Thanks to jjmz and others See: https://github.com/raspberrypi/linux/issues/525 @@ -81167,10 +81167,10 @@ index 0000000000000000000000000000000000000000..fb69624ccef00ddbdccf8256d6baf1b1 + +#endif -From 15fd797651ad28da87939f23a37a00abcee720b7 Mon Sep 17 00:00:00 2001 +From 0b49632fca26af6d22ede4aadd77ac2917bafe97 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Wed, 3 Jul 2013 00:49:20 +0100 -Subject: [PATCH 049/156] Add cpufreq driver +Subject: [PATCH 049/201] Add cpufreq driver Signed-off-by: popcornmix @@ -81434,10 +81434,10 @@ index 0000000000000000000000000000000000000000..99345969b0e4d651fd9033d67de2febb +module_init(bcm2835_cpufreq_module_init); +module_exit(bcm2835_cpufreq_module_exit); -From dcaf9efdeae0aabc2dca9d7c8e8fb2ab480cbbd3 Mon Sep 17 00:00:00 2001 +From 2c3706c50ace661bb5cfda64528213ab8dcdc0c7 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Wed, 17 Jun 2015 15:44:08 +0100 -Subject: [PATCH 050/156] Add Chris Boot's i2c driver +Subject: [PATCH 050/201] Add Chris Boot's i2c driver MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @@ -82102,10 +82102,10 @@ index 0000000000000000000000000000000000000000..962f2e5c7455d91bf32925d785f5f16b +MODULE_LICENSE("GPL v2"); +MODULE_ALIAS("platform:" DRV_NAME); -From 5619cefc11e86117c3b5e9bf9ba648c732423ab0 Mon Sep 17 00:00:00 2001 +From 09fc2eafc792b97cbc5d484a6d75145dce655ee2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= Date: Fri, 26 Jun 2015 14:27:06 +0200 -Subject: [PATCH 051/156] char: broadcom: Add vcio module +Subject: [PATCH 051/201] char: broadcom: Add vcio module MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @@ -82330,10 +82330,10 @@ index 0000000000000000000000000000000000000000..c19bc2075c77879563ef5e59038b5a14 +MODULE_DESCRIPTION("Mailbox userspace access"); +MODULE_LICENSE("GPL"); -From d9ef0aadf1aab86a823f99de4722ecb80ff1bda4 Mon Sep 17 00:00:00 2001 +From a8e4611ec9bfeb2b09c234c168cd2add721fe4c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= Date: Fri, 26 Jun 2015 14:25:01 +0200 -Subject: [PATCH 052/156] firmware: bcm2835: Support ARCH_BCM270x +Subject: [PATCH 052/201] firmware: bcm2835: Support ARCH_BCM270x MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @@ -82416,10 +82416,10 @@ index dd506cd3a5b874f9e1acd07efb8cd151bb6145d1..3f070bd38a91511c986e3fb114b15bd4 MODULE_AUTHOR("Eric Anholt "); MODULE_DESCRIPTION("Raspberry Pi firmware driver"); -From 479b55d64371c5ddcdeb1af08f3ecb3aa40ef58f Mon Sep 17 00:00:00 2001 +From f19de1ec3b4eb3d5736f17cb4fdd3960eb47b25c Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Mon, 11 May 2015 09:00:42 +0100 -Subject: [PATCH 053/156] scripts: Add mkknlimg and knlinfo scripts from tools +Subject: [PATCH 053/201] scripts: Add mkknlimg and knlinfo scripts from tools repo The Raspberry Pi firmware looks for a trailer on the kernel image to @@ -82946,10 +82946,10 @@ index 0000000000000000000000000000000000000000..84be2593ec1de8f97b0167ff06b3e05d + return $trailer; +} -From e10f56a0f5b9c959f3d46b261aebc913f4c9eee6 Mon Sep 17 00:00:00 2001 +From 77f7f50decefc1ecd1b321562730334dab66b2d7 Mon Sep 17 00:00:00 2001 From: notro Date: Wed, 9 Jul 2014 14:46:08 +0200 -Subject: [PATCH 054/156] BCM2708: Add core Device Tree support +Subject: [PATCH 054/201] BCM2708: Add core Device Tree support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @@ -95414,10 +95414,10 @@ index 04b5633df1cfafa316f9086c4bf98a9ecf9d0939..d523d1e14220a369c4c766ca3a01208e # Bzip2 -From eb15bc53f15bf549a158519e8798817f47597964 Mon Sep 17 00:00:00 2001 +From 6083ccfc6c46f4e2fe5340f9c335a5b99b532c07 Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Fri, 6 Feb 2015 13:50:57 +0000 -Subject: [PATCH 055/156] BCM270x_DT: Add pwr_led, and the required "input" +Subject: [PATCH 055/201] BCM270x_DT: Add pwr_led, and the required "input" trigger The "input" trigger makes the associated GPIO an input. This is to support @@ -95592,10 +95592,10 @@ index bf6db4fe895bcd67e04ee65e8f76ea104af6299f..8741dca6dba65e2d72fbdbc1702139c2 /* set_brightness_work / blink_timer flags, atomic, private. */ unsigned long work_flags; -From ca45404307f86dcf0bbe702bfc9435ac16d4ef67 Mon Sep 17 00:00:00 2001 +From 28fe46f6859d440d44323192a4f5c09b57b76e88 Mon Sep 17 00:00:00 2001 From: Siarhei Siamashka Date: Mon, 17 Jun 2013 13:32:11 +0300 -Subject: [PATCH 056/156] fbdev: add FBIOCOPYAREA ioctl +Subject: [PATCH 056/201] fbdev: add FBIOCOPYAREA ioctl Based on the patch authored by Ali Gholami Rudi at https://lkml.org/lkml/2009/7/13/153 @@ -95863,10 +95863,10 @@ index 6cd9b198b7c64eb94821f2e3f2c5201e6c6d25eb..f36c92c2da7487437c33f7a4e2c6e09e __u32 dx; /* screen-relative */ __u32 dy; -From a19e8f68eaed63a6297a697f31aeea2d262ac8b2 Mon Sep 17 00:00:00 2001 +From 4fca9e95594935ddd4f44ee00be80fc7e5e76ef7 Mon Sep 17 00:00:00 2001 From: Harm Hanemaaijer Date: Thu, 20 Jun 2013 20:21:39 +0200 -Subject: [PATCH 057/156] Speed up console framebuffer imageblit function +Subject: [PATCH 057/201] Speed up console framebuffer imageblit function Especially on platforms with a slower CPU but a relatively high framebuffer fill bandwidth, like current ARM devices, the existing @@ -96075,10 +96075,10 @@ index a2bb276a8b2463eee98eb237c4647bc00cd93601..436494fba15abecb400ef28688466faf start_index, pitch_index); } else -From a104e8132c806ca65c5306f6086e461bd7b06bd1 Mon Sep 17 00:00:00 2001 +From 08c58d5cc44f9c2e5be98bab47462d5e18d341dc Mon Sep 17 00:00:00 2001 From: popcornmix Date: Wed, 8 May 2013 11:46:50 +0100 -Subject: [PATCH 058/156] enabling the realtime clock 1-wire chip DS1307 and +Subject: [PATCH 058/201] enabling the realtime clock 1-wire chip DS1307 and 1-wire on GPIO4 (as a module) 1-wire: Add support for configuring pin for w1-gpio kernel module @@ -96328,10 +96328,10 @@ index 5b2972946dda5f9ad415f1eaeaab67743a5cc0f0..b3558b7c9efb2484b40e31312aee197b u8, w1_slave_found_callback); }; -From 6e0a7d053aadba60d84d57d922118b1721f48db9 Mon Sep 17 00:00:00 2001 +From 44a5520215fa3a30003def45a5cb570d5006c0f5 Mon Sep 17 00:00:00 2001 From: Gordon Hollingworth Date: Tue, 12 May 2015 14:47:56 +0100 -Subject: [PATCH 059/156] rpi-ft5406: Add touchscreen driver for pi LCD display +Subject: [PATCH 059/201] rpi-ft5406: Add touchscreen driver for pi LCD display Fix driver detection failure Check that the buffer response is non-zero meaning the touchscreen was detected @@ -96676,10 +96676,10 @@ index 0000000000000000000000000000000000000000..9d7d05482355d168c5c0c42508cd9789 +MODULE_DESCRIPTION("Touchscreen driver for memory based FT5406"); +MODULE_LICENSE("GPL"); -From ce8e1e6beb5a0ff2a19c4401e212f1ac630edb2a Mon Sep 17 00:00:00 2001 +From a61af86414ae71b36f5446f4bb68c68528a225db Mon Sep 17 00:00:00 2001 From: popcornmix Date: Mon, 28 Nov 2016 16:50:04 +0000 -Subject: [PATCH 060/156] Improve __copy_to_user and __copy_from_user +Subject: [PATCH 060/201] Improve __copy_to_user and __copy_from_user performance Provide a __copy_from_user that uses memcpy. On BCM2708, use @@ -98259,10 +98259,10 @@ index 971bc298f63eeeed418131b7b7200ac91b0d73f1..78e9f6e8c6fdebdb754cb703095d1726 bool "Broadcom BCM63xx DSL SoC" depends on ARCH_MULTI_V7 -From d9d3b795cd9df97f3af02a26b871bb2a60333329 Mon Sep 17 00:00:00 2001 +From 5c7376c9bef9a2e162b0b7b74b3bafe145481a03 Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Thu, 25 Jun 2015 12:16:11 +0100 -Subject: [PATCH 061/156] gpio-poweroff: Allow it to work on Raspberry Pi +Subject: [PATCH 061/201] gpio-poweroff: Allow it to work on Raspberry Pi The Raspberry Pi firmware manages the power-down and reboot process. To do this it installs a pm_power_off handler, causing @@ -98297,10 +98297,10 @@ index be3d81ff51cc3f510d85e4eed7a52960e51e7bc1..a030ae9fb1fca325061c093696e82186 "%s: pm_power_off function already registered", __func__); -From 014aa3731d98f27689a839e7a906254a2429b2e9 Mon Sep 17 00:00:00 2001 +From f49abedc49c2d7a682d72a38d18cd9a79c2dfce1 Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Tue, 14 Jul 2015 14:32:47 +0100 -Subject: [PATCH 062/156] mfd: Add Raspberry Pi Sense HAT core driver +Subject: [PATCH 062/201] mfd: Add Raspberry Pi Sense HAT core driver --- drivers/input/joystick/Kconfig | 8 + @@ -99165,10 +99165,10 @@ index 0000000000000000000000000000000000000000..56196dc2af10e464a1e3f98b028dca1c + +#endif -From 5ef2bfd587ebc15bfdebf367952c4b2b2433239b Mon Sep 17 00:00:00 2001 +From 73828fa4aa7d900e7f290f8ba1613400ee8e5781 Mon Sep 17 00:00:00 2001 From: Florian Meier Date: Fri, 22 Nov 2013 19:19:08 +0100 -Subject: [PATCH 063/156] ASoC: Add support for HifiBerry DAC +Subject: [PATCH 063/201] ASoC: Add support for HifiBerry DAC This adds a machine driver for the HifiBerry DAC. It is a sound card that can @@ -99343,10 +99343,10 @@ index 0000000000000000000000000000000000000000..ee9f133953544629282631e5ef3f73fe +MODULE_DESCRIPTION("ASoC Driver for HifiBerry DAC"); +MODULE_LICENSE("GPL v2"); -From f26ccc628d4257c0fde732a1bb91597914cc08d6 Mon Sep 17 00:00:00 2001 +From a37d8f21cf2adfbfb17b1d1ff4a702b0fe3c569b Mon Sep 17 00:00:00 2001 From: Florian Meier Date: Mon, 25 Jan 2016 15:48:59 +0000 -Subject: [PATCH 064/156] ASoC: Add support for Rpi-DAC +Subject: [PATCH 064/201] ASoC: Add support for Rpi-DAC --- sound/soc/bcm/Kconfig | 7 +++ @@ -99630,10 +99630,10 @@ index 0000000000000000000000000000000000000000..afe1b419582aa40c4b2729d242bb13cd +MODULE_AUTHOR("Florian Meier "); +MODULE_LICENSE("GPL v2"); -From 7f689c35cb67718bf21b9ebf2b1169979b272b20 Mon Sep 17 00:00:00 2001 +From 2dd94c9757d562e5e5e92bbedc2c536715b2a090 Mon Sep 17 00:00:00 2001 From: Daniel Matuschek Date: Wed, 15 Jan 2014 21:41:23 +0100 -Subject: [PATCH 065/156] ASoC: wm8804: Implement MCLK configuration options, +Subject: [PATCH 065/201] ASoC: wm8804: Implement MCLK configuration options, add 32bit support WM8804 can run with PLL frequencies of 256xfs and 128xfs for most sample rates. At 192kHz only 128xfs is supported. The existing driver selects 128xfs automatically for some lower samples rates. By using an @@ -99682,10 +99682,10 @@ index fc69b87443d80489382b97332de6d5ad12a58ec8..d8fdce81b297dcf02e144bdead0c6193 .component_driver = { .dapm_widgets = wm8804_dapm_widgets, -From ae0816c5184a8ed1e31ce7c6ac9112f255c545e8 Mon Sep 17 00:00:00 2001 +From 8d266bd0d2ae39d6819f064424d9672b73140e93 Mon Sep 17 00:00:00 2001 From: Daniel Matuschek Date: Wed, 15 Jan 2014 21:42:08 +0100 -Subject: [PATCH 066/156] ASoC: BCM:Add support for HiFiBerry Digi. Driver is +Subject: [PATCH 066/201] ASoC: BCM:Add support for HiFiBerry Digi. Driver is based on the patched WM8804 driver. Signed-off-by: Daniel Matuschek @@ -100029,10 +100029,10 @@ index 0000000000000000000000000000000000000000..7620dd02de40b6d644ff038b445d375d +MODULE_DESCRIPTION("ASoC Driver for HifiBerry Digi"); +MODULE_LICENSE("GPL v2"); -From 91650de23667a3c5058dd1b3a50bed8def9b1ba7 Mon Sep 17 00:00:00 2001 +From 71a5adf7d16ee42d871f3dd3ed19b46d59228fe5 Mon Sep 17 00:00:00 2001 From: Gordon Garrity Date: Sat, 8 Mar 2014 16:56:57 +0000 -Subject: [PATCH 067/156] Add IQaudIO Sound Card support for Raspberry Pi +Subject: [PATCH 067/201] Add IQaudIO Sound Card support for Raspberry Pi Set a limit of 0dB on Digital Volume Control @@ -100367,10 +100367,10 @@ index 0000000000000000000000000000000000000000..1ee4097c846376666775272ed692ca33 +MODULE_DESCRIPTION("ASoC Driver for IQAudio DAC"); +MODULE_LICENSE("GPL v2"); -From aef9437e237b2ba638eb0c3ee7de7688329dc576 Mon Sep 17 00:00:00 2001 +From 5c97aa9f802672182b386451525422a21cf09723 Mon Sep 17 00:00:00 2001 From: Daniel Matuschek Date: Mon, 4 Aug 2014 10:06:56 +0200 -Subject: [PATCH 068/156] Added support for HiFiBerry DAC+ +Subject: [PATCH 068/201] Added support for HiFiBerry DAC+ The driver is based on the HiFiBerry DAC driver. However HiFiBerry DAC+ uses a different codec chip (PCM5122), therefore a new driver is necessary. @@ -101005,10 +101005,10 @@ index 68feae262476492ae3a0b30855dbb09e96fa187e..f7b0977017ed5a6c02eafa0147d49d66 dev_err(dev, "No LRCLK?\n"); return -EINVAL; -From b8ae2020ecedc5af5af10543f0fcdeb5b0d486f3 Mon Sep 17 00:00:00 2001 +From 2dfa22a719286eebced75b397d400fc5d4299da6 Mon Sep 17 00:00:00 2001 From: Daniel Matuschek Date: Mon, 4 Aug 2014 11:09:58 +0200 -Subject: [PATCH 069/156] Added driver for HiFiBerry Amp amplifier add-on board +Subject: [PATCH 069/201] Added driver for HiFiBerry Amp amplifier add-on board The driver contains a low-level hardware driver for the TAS5713 and the drivers for the Raspberry Pi I2S subsystem. @@ -101843,10 +101843,10 @@ index 0000000000000000000000000000000000000000..8f019e04898754d2f87e9630137be9e8 + +#endif /* _TAS5713_H */ -From a39c9be5bfad358e4e1e0a1f86aa0a48ca43d539 Mon Sep 17 00:00:00 2001 +From bf841bf59d5c6e71f5a5cc17c3f0fe805d629cbc Mon Sep 17 00:00:00 2001 From: Waldemar Brodkorb Date: Wed, 25 Mar 2015 09:26:17 +0100 -Subject: [PATCH 070/156] Add driver for rpi-proto +Subject: [PATCH 070/201] Add driver for rpi-proto Forward port of 3.10.x driver from https://github.com/koalo We are using a custom board and would like to use rpi 3.18.x @@ -102061,10 +102061,10 @@ index 0000000000000000000000000000000000000000..fadbfade100228aaafabb0d3bdf35c01 +MODULE_DESCRIPTION("ASoC Driver for Raspberry Pi connected to PROTO board (WM8731)"); +MODULE_LICENSE("GPL"); -From 49816e6ebdd4c90c8e740d15d093870923d5337f Mon Sep 17 00:00:00 2001 +From 4806283a8513f5c2dcea3628766759324ed01ea6 Mon Sep 17 00:00:00 2001 From: Jan Grulich Date: Mon, 24 Aug 2015 16:03:47 +0100 -Subject: [PATCH 071/156] RaspiDAC3 support +Subject: [PATCH 071/201] RaspiDAC3 support Signed-off-by: Jan Grulich @@ -102307,10 +102307,10 @@ index 0000000000000000000000000000000000000000..ad2b5b89bc8213dc2e277306ef50d6e3 +MODULE_DESCRIPTION("ASoC Driver for RaspiDAC Rev.3x"); +MODULE_LICENSE("GPL v2"); -From a7568a9d0bceb2678d3c2d63ac9ce04ec87a263a Mon Sep 17 00:00:00 2001 +From 8f4a3638c3f9a55f5e068a8de27851a86e6a61f6 Mon Sep 17 00:00:00 2001 From: Aaron Shaw Date: Thu, 7 Apr 2016 21:26:21 +0100 -Subject: [PATCH 072/156] Add Support for JustBoom Audio boards +Subject: [PATCH 072/201] Add Support for JustBoom Audio boards justboom-dac: Adjust for ALSA API change @@ -102766,10 +102766,10 @@ index 0000000000000000000000000000000000000000..909cf8928f2f4313982316f9c5b8a709 +MODULE_DESCRIPTION("ASoC Driver for JustBoom PI Digi HAT Sound Card"); +MODULE_LICENSE("GPL v2"); -From 82b0d9cab0d9154a5e937deed6794a4c66e92fc2 Mon Sep 17 00:00:00 2001 +From 0d14a00822d7c833ea25e35c7dbb3a2549aa456d Mon Sep 17 00:00:00 2001 From: Andrey Grodzovsky Date: Tue, 3 May 2016 22:10:59 -0400 -Subject: [PATCH 073/156] ARM: adau1977-adc: Add basic machine driver for +Subject: [PATCH 073/201] ARM: adau1977-adc: Add basic machine driver for adau1977 codec driver. This commit adds basic support for the codec usage including: Device tree overlay, @@ -102951,10 +102951,10 @@ index 0000000000000000000000000000000000000000..f3d7e5db7bb912e1d7ca6f8e8d42df5f +MODULE_DESCRIPTION("ASoC Driver for ADAU1977 ADC"); +MODULE_LICENSE("GPL v2"); -From 07827fd83575405414813d0b7595ab7cb5148f25 Mon Sep 17 00:00:00 2001 +From 4aede67713f17375f69ef485fc38568f04da4786 Mon Sep 17 00:00:00 2001 From: Matt Flax Date: Mon, 16 May 2016 21:36:31 +1000 -Subject: [PATCH 074/156] New AudioInjector.net Pi soundcard with low jitter +Subject: [PATCH 074/201] New AudioInjector.net Pi soundcard with low jitter audio in and out. Contains the sound/soc/bcm ALSA machine driver and necessary alterations to the Kconfig and Makefile. @@ -103205,10 +103205,10 @@ index 0000000000000000000000000000000000000000..491906bbf446826e55dd843f28e4860f +MODULE_ALIAS("platform:audioinjector-pi-soundcard"); + -From b0f43bb8166292b77d188e1cb4a28c8d1c239750 Mon Sep 17 00:00:00 2001 +From eb0d6a4cbd4ba49c7fc41f72384416842ebedb06 Mon Sep 17 00:00:00 2001 From: DigitalDreamtime Date: Thu, 30 Jun 2016 18:38:42 +0100 -Subject: [PATCH 075/156] Add IQAudIO Digi WM8804 board support +Subject: [PATCH 075/201] Add IQAudIO Digi WM8804 board support Support IQAudIO Digi board with iqaudio_digi machine driver and iqaudio-digi-wm8804-audio overlay. @@ -103508,10 +103508,10 @@ index 0000000000000000000000000000000000000000..33aa2be8a43a12a12cfb5d844dd9732c +MODULE_DESCRIPTION("ASoC Driver for IQAudIO WM8804 Digi"); +MODULE_LICENSE("GPL v2"); -From f600a240390d60342025f77bac6f4846224f6418 Mon Sep 17 00:00:00 2001 +From 832ee6ce6d016338f2ef4b893f5abdd50f4cf107 Mon Sep 17 00:00:00 2001 From: escalator2015 Date: Tue, 24 May 2016 16:20:09 +0100 -Subject: [PATCH 076/156] New driver for RRA DigiDAC1 soundcard using WM8741 + +Subject: [PATCH 076/201] New driver for RRA DigiDAC1 soundcard using WM8741 + WM8804 --- @@ -103984,10 +103984,10 @@ index 0000000000000000000000000000000000000000..f200688bb4ae32b90a0ced555aed94b0 +MODULE_DESCRIPTION("ASoC Driver for RRA DigiDAC1"); +MODULE_LICENSE("GPL v2"); -From 4a39d2612bfa2f22e6b527873d74be3aadae1da3 Mon Sep 17 00:00:00 2001 +From 21253b2ff4668f7fd77fb038e2c9d1b88e977716 Mon Sep 17 00:00:00 2001 From: DigitalDreamtime Date: Sat, 2 Jul 2016 16:26:19 +0100 -Subject: [PATCH 077/156] Add support for Dion Audio LOCO DAC-AMP HAT +Subject: [PATCH 077/201] Add support for Dion Audio LOCO DAC-AMP HAT Using dedicated machine driver and pcm5102a codec driver. @@ -104160,10 +104160,10 @@ index 0000000000000000000000000000000000000000..65e03741d349a2dc5bd91f69855ea952 +MODULE_DESCRIPTION("ASoC Driver for DionAudio LOCO"); +MODULE_LICENSE("GPL v2"); -From d82a4fdba1eb6ad36e1b4cb4b1c527c2a2a00cf7 Mon Sep 17 00:00:00 2001 +From 5825a5350a42b057e95d6ce7f735ffa45c79c87a Mon Sep 17 00:00:00 2001 From: Clive Messer Date: Mon, 19 Sep 2016 14:01:04 +0100 -Subject: [PATCH 078/156] Allo Piano DAC boards: Initial 2 channel (stereo) +Subject: [PATCH 078/201] Allo Piano DAC boards: Initial 2 channel (stereo) support (#1645) Add initial 2 channel (stereo) support for Allo Piano DAC (2.0/2.1) boards, @@ -104370,10 +104370,10 @@ index 0000000000000000000000000000000000000000..eaf50fb6dbca1970ae1c6f8662088b0f +MODULE_DESCRIPTION("ALSA ASoC Machine Driver for Allo Piano DAC"); +MODULE_LICENSE("GPL v2"); -From 16373e16929ecc019c13e839dc504bdabf30c036 Mon Sep 17 00:00:00 2001 +From b96f8bd4daf402dfb2229f921a3bd393228d19a4 Mon Sep 17 00:00:00 2001 From: Raashid Muhammed Date: Mon, 27 Mar 2017 12:35:00 +0530 -Subject: [PATCH 079/156] Add support for Allo Piano DAC 2.1 plus add-on board +Subject: [PATCH 079/201] Add support for Allo Piano DAC 2.1 plus add-on board for Raspberry Pi. The Piano DAC 2.1 has support for 4 channels with subwoofer. @@ -105461,10 +105461,10 @@ index 0000000000000000000000000000000000000000..1800f5e4d414e2d83a9487a89a2800a3 +MODULE_DESCRIPTION("ALSA ASoC Machine Driver for Allo Piano DAC Plus"); +MODULE_LICENSE("GPL v2"); -From 6e95e8cf3d25d294b0a89271df885815ee496593 Mon Sep 17 00:00:00 2001 +From f2bc536db1fb37c95c546b4e0bb1f31f53acf964 Mon Sep 17 00:00:00 2001 From: BabuSubashChandar Date: Tue, 28 Mar 2017 20:04:42 +0530 -Subject: [PATCH 080/156] Add support for Allo Boss DAC add-on board for +Subject: [PATCH 080/201] Add support for Allo Boss DAC add-on board for Raspberry Pi. (#1924) Signed-off-by: Baswaraj K @@ -106167,10 +106167,10 @@ index 0000000000000000000000000000000000000000..203ab76c7045b081578e23bda1099dd1 +MODULE_DESCRIPTION("ALSA ASoC Machine Driver for Allo Boss DAC"); +MODULE_LICENSE("GPL v2"); -From f0beba8bdc0015e5ca11de807b64eb4772a7e545 Mon Sep 17 00:00:00 2001 +From 0386ef65c56f46a4a17e5704f61c9cebc31f2510 Mon Sep 17 00:00:00 2001 From: gtrainavicius Date: Sun, 23 Oct 2016 12:06:53 +0300 -Subject: [PATCH 081/156] Support for Blokas Labs pisound board +Subject: [PATCH 081/201] Support for Blokas Labs pisound board Pisound dynamic overlay (#1760) @@ -107369,10 +107369,10 @@ index 0000000000000000000000000000000000000000..06ff1e53dc9d860946965b6303577762 +MODULE_DESCRIPTION("ASoC Driver for pisound, http://blokas.io/pisound"); +MODULE_LICENSE("GPL v2"); -From 44930a806da8dbd18056135fc3c3abce7af8d861 Mon Sep 17 00:00:00 2001 +From 9ccd97c57a4b4672888e0fd45f7af20574d89594 Mon Sep 17 00:00:00 2001 From: Matthias Reichl Date: Sun, 22 Jan 2017 12:49:37 +0100 -Subject: [PATCH 082/156] ASoC: Add driver for Cirrus Logic Audio Card +Subject: [PATCH 082/201] ASoC: Add driver for Cirrus Logic Audio Card Note: due to problems with deferred probing of regulators the following softdep should be added to a modprobe.d file @@ -108437,10 +108437,10 @@ index 0000000000000000000000000000000000000000..ac8651ddff7bd3701dffe22c7fb88352 +MODULE_DESCRIPTION("ASoC driver for Cirrus Logic Audio Card"); +MODULE_LICENSE("GPL"); -From 09500541b1bafdd82d6755d4f92ec9a1d3a009d5 Mon Sep 17 00:00:00 2001 +From dd7f58d21cd5f1773492dc4af7380c6178f290b0 Mon Sep 17 00:00:00 2001 From: Miquel Date: Fri, 24 Feb 2017 20:51:06 +0100 -Subject: [PATCH 083/156] sound: Support for Dion Audio LOCO-V2 DAC-AMP HAT +Subject: [PATCH 083/201] sound: Support for Dion Audio LOCO-V2 DAC-AMP HAT Signed-off-by: Miquel Blauw --- @@ -108635,10 +108635,10 @@ index 0000000000000000000000000000000000000000..a009c49477972a9832175d86f201b035 +MODULE_DESCRIPTION("ASoC Driver for DionAudio LOCO-V2"); +MODULE_LICENSE("GPL v2"); -From 069348585476a8336e604ac3d95d088c989363f1 Mon Sep 17 00:00:00 2001 +From 26bc4d704fbd8993c8b4b4307d2534a8dad45976 Mon Sep 17 00:00:00 2001 From: Fe-Pi Date: Wed, 1 Mar 2017 04:42:43 -0700 -Subject: [PATCH 084/156] Add support for Fe-Pi audio sound card. (#1867) +Subject: [PATCH 084/201] Add support for Fe-Pi audio sound card. (#1867) Fe-Pi Audio Sound Card is based on NXP SGTL5000 codec. Mechanical specification of the board is the same the Raspberry Pi Zero. @@ -108852,10 +108852,10 @@ index 0000000000000000000000000000000000000000..015b56fd73cc36be5b5eecd17548fd03 +MODULE_DESCRIPTION("ASoC Driver for Fe-Pi Audio"); +MODULE_LICENSE("GPL v2"); -From 499c5e2918e1bb1ec400694d87b06791c1bb20ef Mon Sep 17 00:00:00 2001 +From fae32964c6caa28cd73bb837a7d3bb433829fd0b Mon Sep 17 00:00:00 2001 From: Matt Flax Date: Wed, 8 Mar 2017 20:04:13 +1100 -Subject: [PATCH 085/156] Add support for the AudioInjector.net Octo sound card +Subject: [PATCH 085/201] Add support for the AudioInjector.net Octo sound card AudioInjector Octo: sample rates, regulators, reset @@ -109264,10 +109264,10 @@ index 0000000000000000000000000000000000000000..5e79f4eff93a21ed3495c77a90f73525 +MODULE_LICENSE("GPL v2"); +MODULE_ALIAS("platform:audioinjector-octo-soundcard"); -From fe48405b4cc8003578e5dfc9b9a15fa1bb519ac4 Mon Sep 17 00:00:00 2001 +From 6de76c4af630d9dd2baadb4c98e0c029b76bfd17 Mon Sep 17 00:00:00 2001 From: Peter Malkin Date: Mon, 27 Mar 2017 16:38:21 -0700 -Subject: [PATCH 086/156] Driver support for Google voiceHAT soundcard. +Subject: [PATCH 086/201] Driver support for Google voiceHAT soundcard. --- sound/soc/bcm/Kconfig | 7 ++ @@ -109658,10 +109658,10 @@ index 0000000000000000000000000000000000000000..225854b8e5298b3c3018f59a49404354 +MODULE_DESCRIPTION("ASoC Driver for Google voiceHAT SoundCard"); +MODULE_LICENSE("GPL v2"); -From b210cfdea11900e15789c98ea13d46336f463ec7 Mon Sep 17 00:00:00 2001 +From acee6c0272988ea5b9c4d3886ab951d82da0d4a5 Mon Sep 17 00:00:00 2001 From: sandeepal Date: Fri, 2 Jun 2017 18:59:46 +0530 -Subject: [PATCH 087/156] Allo Digione Driver (#2048) +Subject: [PATCH 087/201] Allo Digione Driver (#2048) Driver for the Allo Digione soundcard @@ -109984,10 +109984,10 @@ index 0000000000000000000000000000000000000000..9387b055875fdf92a13dc4a9d2727f95 +MODULE_DESCRIPTION("ASoC Driver for Allo DigiOne"); +MODULE_LICENSE("GPL v2"); -From 6113ead5b49f159bf453e0a86d925dfe1ddf35f5 Mon Sep 17 00:00:00 2001 +From 5dd049eb26f293f80cd10cfcd8221f5eaef2f1cf Mon Sep 17 00:00:00 2001 From: P33M Date: Wed, 21 Oct 2015 14:55:21 +0100 -Subject: [PATCH 088/156] rpi_display: add backlight driver and overlay +Subject: [PATCH 088/201] rpi_display: add backlight driver and overlay Add a mailbox-driven backlight controller for the Raspberry Pi DSI touchscreen display. Requires updated GPU firmware to recognise the @@ -110156,10 +110156,10 @@ index 0000000000000000000000000000000000000000..14a0d9b037395497c1fdae2961feccd5 +MODULE_DESCRIPTION("Raspberry Pi mailbox based Backlight Driver"); +MODULE_LICENSE("GPL"); -From e2fb27c47d95c61ade6dda988c396dbb17e45569 Mon Sep 17 00:00:00 2001 +From 57f8491f1dc5698da9a8eaedca787e1492d859ab Mon Sep 17 00:00:00 2001 From: popcornmix Date: Tue, 23 Feb 2016 19:56:04 +0000 -Subject: [PATCH 089/156] bcm2835-virtgpio: Virtual GPIO driver +Subject: [PATCH 089/201] bcm2835-virtgpio: Virtual GPIO driver Add a virtual GPIO driver that uses the firmware mailbox interface to request that the VPU toggles LEDs. @@ -110420,10 +110420,10 @@ index 0000000000000000000000000000000000000000..c3725546def9d4a6264fbb1f6b9814d0 +MODULE_DESCRIPTION("brcmvirt GPIO driver"); +MODULE_ALIAS("platform:brcmvirt-gpio"); -From b24bf7884dc36cb13e5fcc8ac6041fa0bbdf9f12 Mon Sep 17 00:00:00 2001 +From 32eabba2b09847f1781f0a7ed0b86e3e958b4fe2 Mon Sep 17 00:00:00 2001 From: Dave Stevenson Date: Mon, 20 Feb 2017 17:01:21 +0000 -Subject: [PATCH 090/156] bcm2835-gpio-exp: Driver for GPIO expander via +Subject: [PATCH 090/201] bcm2835-gpio-exp: Driver for GPIO expander via mailbox service Pi3 and Compute Module 3 have a GPIO expander that the @@ -110732,10 +110732,10 @@ index 0000000000000000000000000000000000000000..d68adafaee4ad406f45f4ff0d6b7c1ad +MODULE_DESCRIPTION("brcm-exp GPIO driver"); +MODULE_ALIAS("platform:brcmexp-gpio"); -From 8c825b2fb64f1fb5b740391d0cc43e5066e84240 Mon Sep 17 00:00:00 2001 +From 7bddac2fb5e08383a4ca4d290a0d39d0fc2c2622 Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Tue, 23 Feb 2016 17:26:48 +0000 -Subject: [PATCH 091/156] amba_pl011: Don't use DT aliases for numbering +Subject: [PATCH 091/201] amba_pl011: Don't use DT aliases for numbering The pl011 driver looks for DT aliases of the form "serial", and if found uses as the device ID. This can cause @@ -110764,10 +110764,10 @@ index 111e6a95077978c2c30bfe2a2de4a0d095e8d76e..584471add0962c0e26eb814fc0ef43ee uap->old_cr = 0; uap->port.dev = dev; -From 0cae01eacc85085e805d67783397770a915618ce Mon Sep 17 00:00:00 2001 +From 83aaa369ae050bf58fa63fbeb1df51cfd234fe43 Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Wed, 1 Mar 2017 16:07:39 +0000 -Subject: [PATCH 092/156] amba_pl011: Round input clock up +Subject: [PATCH 092/201] amba_pl011: Round input clock up The UART clock is initialised to be as close to the requested frequency as possible without exceeding it. Now that there is a @@ -110853,10 +110853,10 @@ index 584471add0962c0e26eb814fc0ef43eea99b2d29..bfbc845d7be9ef804468d0a82da18d9b /* unregisters the driver also if no more ports are left */ static void pl011_unregister_port(struct uart_amba_port *uap) -From 58c109fde8bd6c10eba2d06170be70bbb850608f Mon Sep 17 00:00:00 2001 +From 765600d5387d1864fd9c0fdd52fa982503a547ca Mon Sep 17 00:00:00 2001 From: Pantelis Antoniou Date: Wed, 3 Dec 2014 13:23:28 +0200 -Subject: [PATCH 093/156] OF: DT-Overlay configfs interface +Subject: [PATCH 093/201] OF: DT-Overlay configfs interface This is a port of Pantelis Antoniou's v3 port that makes use of the new upstreamed configfs support for binary attributes. @@ -111289,10 +111289,10 @@ index 0000000000000000000000000000000000000000..0037e6868a6cda8706c88194c6a4454b +} +late_initcall(of_cfs_init); -From 491abb48ce9479c3e6c13ac6d4455bc10af832a5 Mon Sep 17 00:00:00 2001 +From 1f21e752ab29bcfe93c0ab8a4ecd284bc48dbff6 Mon Sep 17 00:00:00 2001 From: Cheong2K Date: Fri, 26 Feb 2016 18:20:10 +0800 -Subject: [PATCH 094/156] brcm: adds support for BCM43341 wifi +Subject: [PATCH 094/201] brcm: adds support for BCM43341 wifi brcmfmac: Disable power management @@ -111424,10 +111424,10 @@ index b3fa8ae804650f7ea838ff59ca84dfb6ca24da90..c1e86df297edf2fa7f641e36ccbfc733 BRCMF_FW_NVRAM_ENTRY(BRCM_CC_43362_CHIP_ID, 0xFFFFFFFE, 43362), BRCMF_FW_NVRAM_ENTRY(BRCM_CC_4339_CHIP_ID, 0xFFFFFFFF, 4339), -From 3100c83ffbdcf00b740a194677eec30f852f11d2 Mon Sep 17 00:00:00 2001 +From 80d869dc18127aef8b73d817d8af4aa70c02b92d Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Fri, 17 Feb 2017 15:26:13 +0000 -Subject: [PATCH 095/156] brcmfmac: Mute expected startup 'errors' +Subject: [PATCH 095/201] brcmfmac: Mute expected startup 'errors' The brcmfmac WiFi driver always complains about the '00' country code. Modify the driver to ignore '00' silently. @@ -111451,10 +111451,10 @@ index 2d3b5e2a3ef7cd6186487b48665b401249380d18..e417454f5d6ec136cda29e65af5449f2 req->alpha2[0], req->alpha2[1]); return; -From 90beb38bf6d1347e07868024894576de8de2c6c4 Mon Sep 17 00:00:00 2001 +From bb160a8a88809cbcf1e12760480f05fbd983bb0b Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Thu, 17 Dec 2015 13:37:07 +0000 -Subject: [PATCH 096/156] hci_h5: Don't send conf_req when ACTIVE +Subject: [PATCH 096/201] hci_h5: Don't send conf_req when ACTIVE Without this patch, a modem and kernel can continuously bombard each other with conf_req and conf_rsp messages, in a demented game of tag. @@ -111477,10 +111477,10 @@ index c0e4e26dc30d7c3c6a771b7b86df88c8cf763646..7308287259eedcaf229f8a496a0e3826 if (H5_HDR_LEN(hdr) > 2) h5->tx_win = (data[2] & 0x07); -From 470aee76e0fe145b6f40f8fd1541344823af32a0 Mon Sep 17 00:00:00 2001 +From 87b2ac98e2b817f2e3177981c0904b3f5971192a Mon Sep 17 00:00:00 2001 From: popcornmix Date: Mon, 13 Apr 2015 17:16:29 +0100 -Subject: [PATCH 097/156] config: Add default configs +Subject: [PATCH 097/201] config: Add default configs --- arch/arm/configs/bcm2709_defconfig | 1339 +++++++++++++++++++++++++++++++++++ @@ -114185,10 +114185,10 @@ index 0000000000000000000000000000000000000000..c1da808d40bc8e867b41d3566bd60a75 +CONFIG_CRC_ITU_T=y +CONFIG_LIBCRC32C=y -From e61e26039df463fdd354f24877075bd38f97f9b8 Mon Sep 17 00:00:00 2001 +From fb372e7424fe03700ef6252bdbe08a6efa2213c5 Mon Sep 17 00:00:00 2001 From: Michael Zoran Date: Wed, 24 Aug 2016 03:35:56 -0700 -Subject: [PATCH 098/156] Add arm64 configuration and device tree differences. +Subject: [PATCH 098/201] Add arm64 configuration and device tree differences. Disable MMC_BCM2835_SDHOST and MMC_BCM2835 since these drivers are crashing at the moment. @@ -115602,10 +115602,10 @@ index 0000000000000000000000000000000000000000..e6b09fafa27eed2b762e3d53b55041f7 +CONFIG_LIBCRC32C=y +CONFIG_BCM2835_VCHIQ=n -From fd72f89ad8fd95ecf834c089d0484f6e57f348d2 Mon Sep 17 00:00:00 2001 +From 40a01ca28d17e8a8c0a931072f9997364d0d8dba Mon Sep 17 00:00:00 2001 From: Electron752 Date: Thu, 12 Jan 2017 07:07:08 -0800 -Subject: [PATCH 099/156] ARM64: Make it work again on 4.9 (#1790) +Subject: [PATCH 099/201] ARM64: Make it work again on 4.9 (#1790) * Invoke the dtc compiler with the same options used in arm mode. * ARM64 now uses the bcm2835 platform just like ARM32. @@ -116016,10 +116016,10 @@ index e6b09fafa27eed2b762e3d53b55041f793683d27..c7e891d72969a388d9b135a36dbfc9c9 CONFIG_LIBCRC32C=y -CONFIG_BCM2835_VCHIQ=n -From bde5ef54989937f9c0637186b2d3b88c2d4222b6 Mon Sep 17 00:00:00 2001 +From a064a768337f38644bea1b0a8e0947a10816cad7 Mon Sep 17 00:00:00 2001 From: Michael Zoran Date: Thu, 12 Jan 2017 19:10:07 -0800 -Subject: [PATCH 100/156] ARM64: Enable HDMI audio and vc04_services in +Subject: [PATCH 100/201] ARM64: Enable HDMI audio and vc04_services in bcmrpi3_defconfig Signed-off-by: Michael Zoran @@ -116048,10 +116048,10 @@ index c7e891d72969a388d9b135a36dbfc9c9cb609bf8..4b90f9b64abe9f089ba56b13d5a00de3 CONFIG_BCM2835_MBOX=y # CONFIG_IOMMU_SUPPORT is not set -From b356db8cc8a1158020502d5d602b1d8a3ed781e5 Mon Sep 17 00:00:00 2001 +From 27b4b6484d40985addac88b98b9c27b8a83cc5be Mon Sep 17 00:00:00 2001 From: Michael Zoran Date: Thu, 12 Jan 2017 19:14:03 -0800 -Subject: [PATCH 101/156] ARM64: Run bcmrpi3_defconfig through savedefconfig. +Subject: [PATCH 101/201] ARM64: Run bcmrpi3_defconfig through savedefconfig. Signed-off-by: Michael Zoran --- @@ -116096,10 +116096,10 @@ index 4b90f9b64abe9f089ba56b13d5a00de33343bfb9..dac962ca1634662ce7d966f1ffb53b5b CONFIG_FB_TFT_AGM1264K_FL=m CONFIG_FB_TFT_BD663474=m -From b1b97d16f0c098451d2716033d6095ade5ba05de Mon Sep 17 00:00:00 2001 +From 82d703e843a501bc16d57835ec8e01bd4c012750 Mon Sep 17 00:00:00 2001 From: Electron752 Date: Sat, 14 Jan 2017 02:54:26 -0800 -Subject: [PATCH 102/156] ARM64: Enable Kernel Address Space Randomization +Subject: [PATCH 102/201] ARM64: Enable Kernel Address Space Randomization (#1792) Randomization allows the mapping between virtual addresses and physical @@ -116131,10 +116131,10 @@ index dac962ca1634662ce7d966f1ffb53b5bfa27c506..aae33b4b3c3e736ea7cd3ca242158ad6 CONFIG_BINFMT_MISC=y CONFIG_COMPAT=y -From 3b19ee8423411688908b4b5996f667f9c2248828 Mon Sep 17 00:00:00 2001 +From 779d30101ea76a4e982933ef6f0012938ba26eec Mon Sep 17 00:00:00 2001 From: Michael Zoran Date: Sun, 15 Jan 2017 07:31:59 -0800 -Subject: [PATCH 103/156] ARM64: Enable RTL8187/RTL8192CU wifi in build config +Subject: [PATCH 103/201] ARM64: Enable RTL8187/RTL8192CU wifi in build config These drivers build now, so they can be enabled back in the build configuration just like they are for @@ -116159,10 +116159,10 @@ index aae33b4b3c3e736ea7cd3ca242158ad6ba558aff..b7d762df19b85e369a32cd823dfd0621 CONFIG_ZD1211RW=m CONFIG_MAC80211_HWSIM=m -From c7cc24b2d32fad6c665c4d084c801483acb9b982 Mon Sep 17 00:00:00 2001 +From 2053933ca50d38e8a8274d5e1e1d3c5dd539717a Mon Sep 17 00:00:00 2001 From: Michael Zoran Date: Sat, 14 Jan 2017 21:33:51 -0800 -Subject: [PATCH 104/156] ARM64/DWC_OTG: Port dwc_otg driver to ARM64 +Subject: [PATCH 104/201] ARM64/DWC_OTG: Port dwc_otg driver to ARM64 In ARM64, the FIQ mechanism used by this driver is not current implemented. As a workaround, reqular IRQ is used instead @@ -116505,10 +116505,10 @@ index 6b2c7d0c93f36a63863ff4b0ecc1f3eab77e058b..d7b700ff17821ad1944e36721fe6b2db /** The OS page size */ #define DWC_OS_PAGE_SIZE PAGE_SIZE -From 59994acd0c5ee2690597b92d2c943bbb9c686812 Mon Sep 17 00:00:00 2001 +From 58d0226d71b7b474d0e80bf6b29520831ca09011 Mon Sep 17 00:00:00 2001 From: Michael Zoran Date: Sat, 14 Jan 2017 21:43:57 -0800 -Subject: [PATCH 105/156] ARM64: Round-Robin dispatch IRQs between CPUs. +Subject: [PATCH 105/201] ARM64: Round-Robin dispatch IRQs between CPUs. IRQ-CPU mapping is round robined on ARM64 to increase concurrency and allow multiple interrupts to be serviced @@ -116582,10 +116582,10 @@ index 86b357ae027bf8ba1ac32cd150a8cf21e36597e2..05b17ca993f405c4c8e61a782ec58149 .name = "bcm2836-gpu", .irq_mask = bcm2836_arm_irqchip_mask_gpu_irq, -From 6599dc008b0a0c2e8f944b5f400c6f2ff2d99d07 Mon Sep 17 00:00:00 2001 +From 18aa1ee4fddad6538a390cce55fcddf5f476450b Mon Sep 17 00:00:00 2001 From: Michael Zoran Date: Sat, 14 Jan 2017 21:45:03 -0800 -Subject: [PATCH 106/156] ARM64: Enable DWC_OTG Driver In ARM64 Build +Subject: [PATCH 106/201] ARM64: Enable DWC_OTG Driver In ARM64 Build Config(bcmrpi3_defconfig) Signed-off-by: Michael Zoran @@ -116606,10 +116606,10 @@ index b7d762df19b85e369a32cd823dfd062145bdefa7..4d85c231c5ea0244e1b05fb4a5e3c8fd CONFIG_USB_STORAGE=y CONFIG_USB_STORAGE_REALTEK=m -From 505a6f0d7fa2ca0ed200e742f74976b46ad850ea Mon Sep 17 00:00:00 2001 +From 1dac622c1459cf531e02e4862d2edc7041bf7f7d Mon Sep 17 00:00:00 2001 From: Michael Zoran Date: Sat, 11 Feb 2017 01:18:31 -0800 -Subject: [PATCH 107/156] ARM64: Force hardware emulation of deprecated +Subject: [PATCH 107/201] ARM64: Force hardware emulation of deprecated instructions. --- @@ -116637,10 +116637,10 @@ index d06fbe4cd38d7423c900aff64b0e728f995478d3..877b7c90f9555203d5d55d739359a256 case INSN_OBSOLETE: insn->current_mode = INSN_UNDEF; -From efaa6d619eb4ce1691a89154e5b5e4a305764e98 Mon Sep 17 00:00:00 2001 +From 064e0d7f2de4aade1bc42e2dd5df416876797c36 Mon Sep 17 00:00:00 2001 From: Khem Raj Date: Fri, 10 Feb 2017 17:57:08 -0800 -Subject: [PATCH 108/156] build/arm64: Add rules for .dtbo files for dts +Subject: [PATCH 108/201] build/arm64: Add rules for .dtbo files for dts overlays We now create overlays as .dtbo files. @@ -116665,10 +116665,10 @@ index 7318165cfc90b5b4e36048fbafd9287a1cf3516f..f6f5df3f262b0baf1338bea188d78883 dtbs: prepare scripts -From 348ca83c2f655e80e913aac4e52f58f15237b032 Mon Sep 17 00:00:00 2001 +From a355fc8c95ab5c87537f0d2cc9187e4a73f8610f Mon Sep 17 00:00:00 2001 From: Bilal Amarni Date: Wed, 24 May 2017 10:52:50 +0200 -Subject: [PATCH 109/156] enable drivers for GPIO expander and vcio +Subject: [PATCH 109/201] enable drivers for GPIO expander and vcio --- arch/arm64/configs/bcmrpi3_defconfig | 3 +++ @@ -116696,10 +116696,10 @@ index 4d85c231c5ea0244e1b05fb4a5e3c8fd3e651ddf..9dcb58a519d041fadae99c81a7bda621 CONFIG_GPIO_ARIZONA=m CONFIG_GPIO_STMPE=y -From cc63d5bf3ea73206058fcf93da6e434381988c3a Mon Sep 17 00:00:00 2001 +From 4d30c995c00ff35e79a9ab4a721ab1b507cb57c8 Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Thu, 23 Mar 2017 16:34:46 +0000 -Subject: [PATCH 110/156] bcm2835-aux: Add aux interrupt controller +Subject: [PATCH 110/201] bcm2835-aux: Add aux interrupt controller The AUX block has a shared interrupt line with a register indicating which devices have active IRQs. Expose this as a nested interrupt @@ -116863,10 +116863,10 @@ index bd750cf2238d61489811e7d7bd3b5f9950ed53c8..41e0702fae4692221980b0d02aed1ba6 BCM2835_AUX_CLOCK_COUNT, GFP_KERNEL); if (!onecell) -From afd78fe5da78e4f0f681fefb1f252d89ef9f11e1 Mon Sep 17 00:00:00 2001 +From 3a238f69f13c69be212b13b54122eacb61eda3dd Mon Sep 17 00:00:00 2001 From: Yasunari Takiguchi Date: Fri, 14 Apr 2017 10:43:57 +0100 -Subject: [PATCH 111/156] This is the driver for Sony CXD2880 DVB-T2/T tuner + +Subject: [PATCH 111/201] This is the driver for Sony CXD2880 DVB-T2/T tuner + demodulator. It includes the CXD2880 driver and the CXD2880 SPI adapter. The current CXD2880 driver version is 1.4.1 - 1.0.1 released on April 13, 2017. @@ -132998,10 +132998,10 @@ index 0000000000000000000000000000000000000000..82e122349055be817eb74ed5bbcd7560 +MODULE_AUTHOR("Sony Semiconductor Solutions Corporation"); +MODULE_LICENSE("GPL v2"); -From 5dbe955ec48ef44648e94451318750bb6df81ab7 Mon Sep 17 00:00:00 2001 +From 4d555d47a7be37bb1e0dbf5669d515853157fa3d Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Wed, 14 Sep 2016 09:16:19 +0100 -Subject: [PATCH 112/156] raspberrypi-firmware: Export the general transaction +Subject: [PATCH 112/201] raspberrypi-firmware: Export the general transaction function. The vc4-firmware-kms module is going to be doing the MBOX FB call. @@ -133033,10 +133033,10 @@ index 3f070bd38a91511c986e3fb114b15bd4ac32634c..f261b64d1657c02290904d841e1f087c /** * rpi_firmware_property_list - Submit firmware property list -From c3937409b87dfca100acf60068a4c56059ab4721 Mon Sep 17 00:00:00 2001 +From f06a63c1d072ef13e13b9ead3c388e97121c7a95 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Wed, 14 Sep 2016 08:39:33 +0100 -Subject: [PATCH 113/156] drm/vc4: Add a mode for using the closed firmware for +Subject: [PATCH 113/201] drm/vc4: Add a mode for using the closed firmware for display. Signed-off-by: Eric Anholt @@ -133807,10 +133807,10 @@ index 0000000000000000000000000000000000000000..78c34305935501248b1ca548a1ee0175 + }, +}; -From 19f8ac2c5d3ef969dafd1a40b332b9d62bf972f6 Mon Sep 17 00:00:00 2001 +From ac9ee694a00ccda27bec826f211901dca9bab73f Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Wed, 1 Feb 2017 17:09:18 -0800 -Subject: [PATCH 114/156] drm/vc4: Name the primary and cursor planes in fkms. +Subject: [PATCH 114/201] drm/vc4: Name the primary and cursor planes in fkms. This makes debugging nicer, compared to trying to remember what the IDs are. @@ -133834,10 +133834,10 @@ index 78c34305935501248b1ca548a1ee01753b8fa099..d9a5551d01a2155e3df1bbbd78a1ee2b if (type == DRM_PLANE_TYPE_PRIMARY) { vc4_plane->fbinfo = -From 9db72b7db374334f1dde969128cf93c20bafe392 Mon Sep 17 00:00:00 2001 +From 1e85c926b2b8cb35c9f322b07465dca4a11fe1ce Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Wed, 1 Feb 2017 17:10:09 -0800 -Subject: [PATCH 115/156] drm/vc4: Add DRM_DEBUG_ATOMIC for the insides of +Subject: [PATCH 115/201] drm/vc4: Add DRM_DEBUG_ATOMIC for the insides of fkms. Trying to debug weston on fkms involved figuring out what calls I was @@ -133907,10 +133907,10 @@ index d9a5551d01a2155e3df1bbbd78a1ee2b961be946..e372666af0119b1876bad5167e6d0ff8 RPI_FIRMWARE_SET_CURSOR_STATE, &packet_state, -From d4b7579168512d1f3388492ab6b38524d30b7f61 Mon Sep 17 00:00:00 2001 +From 5de11ee749f69e722b31e0e52dfa29a7f9f70abd Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Thu, 2 Feb 2017 09:42:18 -0800 -Subject: [PATCH 116/156] drm/vc4: Fix sending of page flip completion events +Subject: [PATCH 116/201] drm/vc4: Fix sending of page flip completion events in FKMS mode. In the rewrite of vc4_crtc.c for fkms, I dropped the part of the @@ -133952,10 +133952,10 @@ index e372666af0119b1876bad5167e6d0ff8945d1b80..4d7b7f218cbbc9e7abcaa37743978060 static void vc4_crtc_handle_page_flip(struct vc4_crtc *vc4_crtc) -From 95d3f4df4cb6e31ece205afb16c159a23dea0276 Mon Sep 17 00:00:00 2001 +From 84415afa888f814f918ca74ea98063fb98f700a2 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Tue, 18 Apr 2017 21:43:46 +0100 -Subject: [PATCH 117/156] vc4_fkms: Apply firmware overscan offset to hardware +Subject: [PATCH 117/201] vc4_fkms: Apply firmware overscan offset to hardware cursor --- @@ -134012,10 +134012,10 @@ index 4d7b7f218cbbc9e7abcaa37743978060b73fbdd1..d170775ccc985637ff018804f510a500 return 0; -From 71d68a2a2dd549fdc5887f05226490e4e87b57ca Mon Sep 17 00:00:00 2001 +From 29ea5d7340d272815a5f24681b7b70f8c67d7637 Mon Sep 17 00:00:00 2001 From: Matthias Reichl Date: Sun, 7 May 2017 11:34:26 +0200 -Subject: [PATCH 118/156] ASoC: bcm2835: Add support for TDM modes +Subject: [PATCH 118/201] ASoC: bcm2835: Add support for TDM modes bcm2835 supports arbitrary positioning of channel data within a frame and thus is capable of supporting TDM modes. Since @@ -134417,10 +134417,10 @@ index 56df7d8a43d0aac055a91b0d24aca8e1b4e308e4..dcacf7f83c9371df539a788ea33fedcf dev->dev = &pdev->dev; dev_set_drvdata(&pdev->dev, dev); -From 7bb2e3cc51efdd7f5e3916296635d3ca2786668a Mon Sep 17 00:00:00 2001 +From b15e6fe5b00b9094cf747e5366318b26e3a6b9e3 Mon Sep 17 00:00:00 2001 From: Matthias Reichl Date: Sun, 7 May 2017 15:30:50 +0200 -Subject: [PATCH 119/156] ASoC: bcm2835: Support left/right justified and DSP +Subject: [PATCH 119/201] ASoC: bcm2835: Support left/right justified and DSP modes DSP modes and left/right justified modes can be supported @@ -134666,10 +134666,10 @@ index dcacf7f83c9371df539a788ea33fedcf97d64690..3a706fda4f39e42efbe12f19d87af9b1 } -From 228d120aa69bc4d61a03809e719f227b7761ba58 Mon Sep 17 00:00:00 2001 +From 79ca2adff8412b9ece850bcb10e312536672f3a1 Mon Sep 17 00:00:00 2001 From: Matthias Reichl Date: Sun, 7 May 2017 16:19:54 +0200 -Subject: [PATCH 120/156] ASoC: bcm2835: Support additional samplerates up to +Subject: [PATCH 120/201] ASoC: bcm2835: Support additional samplerates up to 384kHz Sample rates are only restricted by the capabilities of the @@ -134712,10 +134712,10 @@ index 3a706fda4f39e42efbe12f19d87af9b100a348a5..43f5715a0d5dda851731ecf7ff27e76c | SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE -From 8e8081ac8312b0391d415346b72e1509b6dc1b3a Mon Sep 17 00:00:00 2001 +From d7ffa37856e4058803d9c2e9987782b93654c1c4 Mon Sep 17 00:00:00 2001 From: Matthias Reichl Date: Sun, 7 May 2017 16:24:57 +0200 -Subject: [PATCH 121/156] ASoC: bcm2835: Enforce full symmetry +Subject: [PATCH 121/201] ASoC: bcm2835: Enforce full symmetry bcm2835's configuration registers can't be changed when a stream is running, which means asymmetric configurations aren't supported. @@ -134751,10 +134751,10 @@ index 43f5715a0d5dda851731ecf7ff27e76c48fb6e57..2e449d7173fcecbcd647f90a26bd58b6 static bool bcm2835_i2s_volatile_reg(struct device *dev, unsigned int reg) -From 9ebc779b64bc4bbbdc9c19f3787d31fd3b9cf103 Mon Sep 17 00:00:00 2001 +From df47ba69cd31dfce715c53e70191f46345874dc9 Mon Sep 17 00:00:00 2001 From: Andrei Gherzan Date: Mon, 5 Jun 2017 16:40:38 +0100 -Subject: [PATCH 122/156] dma-bcm2708: Fix module compilation of +Subject: [PATCH 122/201] dma-bcm2708: Fix module compilation of CONFIG_DMA_BCM2708 bcm2708-dmaengine.c defines functions like bcm_dma_start which are @@ -134797,10 +134797,10 @@ index c5bfff2765be4606077e6c8af73040ec13ee8974..6ca874d332a8bc666b1c9576ac51f479 #endif /* _PLAT_BCM2708_DMA_H */ -From 2a6bf09a2232c1588f4b8a0712fc86df947c9c68 Mon Sep 17 00:00:00 2001 +From f9bf10ac70d1a44db0bb1ea8a63ba3fe807c09a4 Mon Sep 17 00:00:00 2001 From: popcornmix Date: Fri, 25 Aug 2017 19:18:13 +0100 -Subject: [PATCH 123/156] cache: export clean and invalidate +Subject: [PATCH 123/201] cache: export clean and invalidate --- arch/arm/mm/cache-v6.S | 4 ++-- @@ -134852,10 +134852,10 @@ index de78109d002db1a5e7c94a6c1bc8bb94161d07b8..4c850aa3af2b2439fced4e130441329a sub r3, r2, #1 bic r0, r0, r3 -From 0f6ee1e7341758bbde9a4e2b19b5ce1638d77955 Mon Sep 17 00:00:00 2001 +From 14e9ed95082a4b33d763f5aba63aaa90b8328e2b Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Fri, 29 Sep 2017 10:32:19 +0100 -Subject: [PATCH 124/156] amba_pl011: Insert mb() for correct FIFO handling +Subject: [PATCH 124/201] amba_pl011: Insert mb() for correct FIFO handling The pl011 register accessor functions use the _relaxed versions of the standard readl() and writel() functions, meaning that there are no @@ -134882,10 +134882,10 @@ index bfbc845d7be9ef804468d0a82da18d9b67857216..424bdc500864a86e5d431763ba416b52 return true; -From aad20fc7926f677e910a370ac660003fe8f3241f Mon Sep 17 00:00:00 2001 +From 63e79edcb34d67fb406964c288f1f1eb71163853 Mon Sep 17 00:00:00 2001 From: Chung-Hsien Hsu Date: Sun, 14 May 2017 20:11:05 -0500 -Subject: [PATCH 125/156] brcmfmac: add CLM download support +Subject: [PATCH 125/201] brcmfmac: add CLM download support Future firmwares will be provided with minimal built-in CLM - the NULL region (#n/0) becomes the initial country. It cannot be changed @@ -135313,10 +135313,10 @@ index 11ffaa01599eb4b343b7f675dc275fc8572d127e..b27170c12482de0ca4115b4bc9484c21 static int brcmf_usb_bus_setup(struct brcmf_usbdev_info *devinfo) -From 44c8dcbd1a4cc0c4a4797794237be24e2cb658bd Mon Sep 17 00:00:00 2001 +From c08aa9459c59ff139ab358c7a60de482ce5ff7d8 Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Fri, 6 Oct 2017 13:23:32 +0100 -Subject: [PATCH 126/156] brcmfmac: request_firmware_direct is quieter +Subject: [PATCH 126/201] brcmfmac: request_firmware_direct is quieter Since we don't have any CLM-capable firmware yet, silence the warning of its absence by using request_firmware_direct, which should also @@ -135341,10 +135341,10 @@ index f0309e039592ba6e388084a13f052c03f99cf1ef..b5889360da96096775db6425337a7215 if (err == -ENOENT) return 0; -From 03ac58aaac6152c4a81295521371ea1572254c2d Mon Sep 17 00:00:00 2001 +From a21640def9db02b0914bf81fe8a4c64480dc5f1c Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Fri, 29 Sep 2017 10:32:19 +0100 -Subject: [PATCH 127/156] amba_pl011: Add cts-event-workaround DT property +Subject: [PATCH 127/201] amba_pl011: Add cts-event-workaround DT property The BCM2835 PL011 implementation seems to have a bug that can lead to a transmission lockup if CTS changes frequently. A workaround was added to @@ -135393,10 +135393,10 @@ index 424bdc500864a86e5d431763ba416b5298c777dc..b224306633f62c398ef904734a903d4e uap->vendor = vendor; uap->fifosize = vendor->get_fifosize(dev); -From 9530f6a5885ef00c32dc20522e77aacc8d413c02 Mon Sep 17 00:00:00 2001 +From b636216f39ae4d8f4c5c310f5058ec2283ee3955 Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Wed, 11 Oct 2017 13:48:04 +0100 -Subject: [PATCH 128/156] amba-pl011: Report AUTOCTS capability to framework +Subject: [PATCH 128/201] amba-pl011: Report AUTOCTS capability to framework The PL011 has full hardware RTS/CTS support which is enabled by the driver when flow control is requested. However, it doesn't @@ -135439,10 +135439,10 @@ index b224306633f62c398ef904734a903d4e75df65c3..3b743cf8a94c279ff8d0b747f98062d0 if (uap->vendor->oversampling) { -From c4d190af43e28a3395d5a4a24e09c03e60ec1227 Mon Sep 17 00:00:00 2001 +From dfaa9137abedd793201a9caedd7d273dc20e154c Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Wed, 25 Oct 2017 09:20:56 +0100 -Subject: [PATCH 129/156] scripts: Update mkknlimg, just in case +Subject: [PATCH 129/201] scripts: Update mkknlimg, just in case With the removal of the vc_cma driver, mkknlimg lost an indication that the user had built a downstream kernel. Update the script, adding a few @@ -135485,10 +135485,10 @@ index 84be2593ec1de8f97b0167ff06b3e05d231c4ba0..d72e15224232d5164374e93be48949bf my $res = try_extract($kernel_file, $tmpfile1); -From 70673bcc7449d767000171b2166278414386f3f1 Mon Sep 17 00:00:00 2001 +From a17d314e09f1eeff1d0ac803b5469c307f63e9ca Mon Sep 17 00:00:00 2001 From: James Hughes Date: Tue, 14 Nov 2017 15:13:15 +0000 -Subject: [PATCH 130/156] AXI performance monitor driver (#2222) +Subject: [PATCH 130/201] AXI performance monitor driver (#2222) Uses the debugfs I/F to provide access to the AXI bus performance monitors. @@ -136174,10 +136174,10 @@ index 0000000000000000000000000000000000000000..bafe03b6c000060e78404d65a0aa96d8 +MODULE_LICENSE("GPL"); + -From d85feabb73680e9c78a34c78551a19685fd57351 Mon Sep 17 00:00:00 2001 +From be4310b6541e57ae2377e20468401a6f35035560 Mon Sep 17 00:00:00 2001 From: James Hughes Date: Fri, 21 Jul 2017 09:55:12 +0100 -Subject: [PATCH 131/156] Sets the BCDC priority to constant 0 +Subject: [PATCH 131/201] Sets the BCDC priority to constant 0 This is to workaround for a possible issue in the wireless chip firmware where some packets with @@ -136203,10 +136203,10 @@ index 9f2d0b0cf6e5c452ad85a3caef58cf16a8cdad46..b009f3083490c2bc2733424f08f81b9f h->data_offset = offset; BCDC_SET_IF_IDX(h, ifidx); -From 4deb646df815e8fde6af12cdc4aef28e36adf000 Mon Sep 17 00:00:00 2001 +From 7be728d7550cb9632cc0e44680e8009cbc540214 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Tue, 26 Apr 2016 13:46:13 -0700 -Subject: [PATCH 132/156] drm/panel: Add support for the Raspberry Pi 7" +Subject: [PATCH 132/201] drm/panel: Add support for the Raspberry Pi 7" Touchscreen. This driver communicates with the Atmel microcontroller for sequencing @@ -136787,10 +136787,10 @@ index 0000000000000000000000000000000000000000..1a536fe4d040f5fafe324baee110a622 +MODULE_DESCRIPTION("Raspberry Pi 7-inch touchscreen driver"); +MODULE_LICENSE("GPL v2"); -From dc92e8e5c8ef7358b372e9a4c40bff3b633f8233 Mon Sep 17 00:00:00 2001 +From 4cf15c95ccae8990c915adc0f7b35e8808ff7284 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Wed, 12 Apr 2017 17:52:56 -0700 -Subject: [PATCH 133/156] panel-raspberrypi-touchscreen: Fix NULL deref if +Subject: [PATCH 133/201] panel-raspberrypi-touchscreen: Fix NULL deref if probe order goes wrong. If the i2c driver hadn't pobed before the panel driver probes, then @@ -136817,10 +136817,10 @@ index 1a536fe4d040f5fafe324baee110a6225dd0be08..5d6bfd81b07a11a0cb407f4301d22931 } -From 158eda085c7617a38a8a5c7f3a42731a0fe5a74e Mon Sep 17 00:00:00 2001 +From 4f9f1e26ba498259410e7c69a47ce73f74881505 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Mon, 6 Mar 2017 12:17:16 -0800 -Subject: [PATCH 134/156] panel-raspberrypi-touchscreen: Round up clk rate to +Subject: [PATCH 134/201] panel-raspberrypi-touchscreen: Round up clk rate to fix DSI panel. Commit 488f9bc8e3def93e0baef53cee2026c2cb0d8956 slightly increased the @@ -136855,10 +136855,10 @@ index 5d6bfd81b07a11a0cb407f4301d22931705fb8b1..b57b7ad9aa4c5048186e98553af59ec9 .hsync_start = HACT + HFP, .hsync_end = HACT + HFP + HSW, -From c3a47a768b4ed30fd3b5999150600196c4d22bfc Mon Sep 17 00:00:00 2001 +From 9cd5dce6a01a330a307a4e9c7a1914d8ec698386 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Thu, 2 Jun 2016 12:29:45 -0700 -Subject: [PATCH 135/156] BCM270X: Add the DSI panel to the defconfig. +Subject: [PATCH 135/201] BCM270X: Add the DSI panel to the defconfig. Signed-off-by: Eric Anholt --- @@ -136879,10 +136879,10 @@ index 9dcb58a519d041fadae99c81a7bda621b2a49f12..003209bf2362c2a136ab987b2f20065e CONFIG_DRM_VC4=m CONFIG_FB=y -From 6dead55502acbb495dc2374ba6bfe24009924cf2 Mon Sep 17 00:00:00 2001 +From 6ef35341d1f82a0f8d2bc8558a02108cc0a8caba Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Thu, 6 Jul 2017 11:45:48 -0700 -Subject: [PATCH 136/156] drm/vc4: Add support for setting DPMS in firmwarekms. +Subject: [PATCH 136/201] drm/vc4: Add support for setting DPMS in firmwarekms. This ensures that the screen goes blank during DPMS (screensaver), including the cursor. Planes don't necessarily get disabled during @@ -136985,10 +136985,10 @@ index d170775ccc985637ff018804f510a5003933c9ec..766f700417f7194d6b01fa1bc18dad40 if (!vc4_encoder) return -ENOMEM; -From 02d392a5e011d75ed2256949f4490b6a4181090d Mon Sep 17 00:00:00 2001 +From eadb4d326f8aa01fe252b17e9a413063bcda97ba Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Fri, 14 Jul 2017 17:33:08 -0700 -Subject: [PATCH 137/156] drm/vc4: Fix pitch setup for T-format scanout. +Subject: [PATCH 137/201] drm/vc4: Fix pitch setup for T-format scanout. The documentation said to use src_w here, and I didn't consider that we actually needed to be using pitch somewhere in our setup. Fixes @@ -137036,10 +137036,10 @@ index 2968b3ebb895714cb8c8faeaf40dff1c996f2259..4ad0b9fcae99f74fb89d09dd52d9ffe5 DRM_DEBUG_KMS("Unsupported FB tiling flag 0x%16llx", (long long)fb->modifier); -From 82ce9961759e6f26e5623e604a20b3320485220d Mon Sep 17 00:00:00 2001 +From 5564baaa1d51b5513d76762fe6b8bcca10536734 Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Thu, 24 Aug 2017 16:16:16 +0100 -Subject: [PATCH 138/156] brcmfmac: Disable ARP offloading when promiscuous +Subject: [PATCH 138/201] brcmfmac: Disable ARP offloading when promiscuous This is a test patch for brcmfmac from Franky Lin at Broadcom to disable ARP offloading when in promiscuous mode, re-enabling the ability to @@ -137176,10 +137176,10 @@ index a4dd313140f37dc1fbb6955e1148f48bccf22f44..b9a96cbc70f0865ee8c9cff3c6164144 bool is_p2pdev, const char *name, u8 *mac_addr); void brcmf_remove_interface(struct brcmf_if *ifp, bool rtnl_locked); -From 6bda342d69a5607eb020a0ce5f3c07c5e57b3373 Mon Sep 17 00:00:00 2001 +From c73189c392bfee92f88c7b3eeaf2e491f40079ca Mon Sep 17 00:00:00 2001 From: Kevin Cernekee Date: Sat, 16 Sep 2017 21:08:22 -0700 -Subject: [PATCH 139/156] brcmfmac: Avoid possible out-of-bounds read +Subject: [PATCH 139/201] brcmfmac: Avoid possible out-of-bounds read In brcmf_p2p_notify_rx_mgmt_p2p_probereq(), chanspec is assigned before the length of rxframe is validated. This could lead to uninitialized @@ -137217,10 +137217,10 @@ index 2ce675ab40ef867cf6a86ca5257a6db7ef76e80a..1c450c0727cb577f7dae25a1ce82b2db return 0; } -From f8aed552b1faa6e9252a26daea3b38ab22f92120 Mon Sep 17 00:00:00 2001 +From 2668907312a5346ff64956342b37387091ae8edd Mon Sep 17 00:00:00 2001 From: Kevin Cernekee Date: Sat, 16 Sep 2017 21:08:23 -0700 -Subject: [PATCH 140/156] brcmfmac: Delete redundant length check +Subject: [PATCH 140/201] brcmfmac: Delete redundant length check brcmf_fweh_process_event() sets event->datalen to the endian-swapped value of event_packet->msg.datalen, which is the @@ -137251,10 +137251,10 @@ index ef72baf6dd969c2478a2138ea57b9f691fdf12d8..e7eaa57d11d98f61280bd99013e649aa /* special handling of interface event */ if (event->code == BRCMF_E_IF) { -From c30f1eb84049bff85c4e7107fbb48a3c2165db63 Mon Sep 17 00:00:00 2001 +From 36aaacc4ae6fe43427f75ffdef1d4cb9b321976b Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Tue, 14 Nov 2017 11:03:22 +0000 -Subject: [PATCH 141/156] mcp2515: Use DT-supplied interrupt flags +Subject: [PATCH 141/201] mcp2515: Use DT-supplied interrupt flags The MCP2515 datasheet clearly describes a level-triggered interrupt pin. Therefore the receiving interrupt controller must also be @@ -137290,10 +137290,10 @@ index f3f05fea8e1f8e0ad3a1ebd7461d2019835e1d47..6c2d3aba25918f5536b2d67292334e74 flags | IRQF_ONESHOT, DEVICE_NAME, priv); if (ret) { -From d8b1f87abe7997d0168d088d4411cd63ae61ce8c Mon Sep 17 00:00:00 2001 +From 4cf038b0db7d1283a584c87be64e6eca1da38a09 Mon Sep 17 00:00:00 2001 From: James Hughes Date: Thu, 16 Nov 2017 15:56:17 +0000 -Subject: [PATCH 142/156] Tidy up of the ft5406 driver to use DT (#2189) +Subject: [PATCH 142/201] Tidy up of the ft5406 driver to use DT (#2189) Driver was using a fixed resolution, this commit adds touchscreen size, and coordinate flip and swap @@ -137677,10 +137677,10 @@ index 9d7d05482355d168c5c0c42508cd978979ee5f14..40bbde9ce1bc4c51be50f47fc359c74f } -From c12fd1fd4cef21c82d7acef3e03f81d41cfc1a6b Mon Sep 17 00:00:00 2001 +From 435f4e101e9650940ed7153fdd4285f029bf4c2b Mon Sep 17 00:00:00 2001 From: notro Date: Thu, 10 Jul 2014 13:59:47 +0200 -Subject: [PATCH 143/156] pinctrl-bcm2835: Set base to 0 give expected gpio +Subject: [PATCH 143/201] pinctrl-bcm2835: Set base to 0 give expected gpio numbering Signed-off-by: Noralf Tronnes @@ -137702,10 +137702,10 @@ index ff782445dfb75d1a8af9eed775b8e8f7b275fee3..786efcddb5e56a06baf67cb91ddbbd8e .can_sleep = false, }; -From 3ff0bb2bc2e25a4ba8016aa943a111591491a885 Mon Sep 17 00:00:00 2001 +From 0f89084221947259d549a80e5a46307336a14ef0 Mon Sep 17 00:00:00 2001 From: P33M Date: Fri, 24 Nov 2017 13:49:26 +0000 -Subject: [PATCH 144/156] fiq_fsm: rewind DMA pointer for OUT transactions that +Subject: [PATCH 144/201] fiq_fsm: rewind DMA pointer for OUT transactions that fail (#2288) See: https://github.com/raspberrypi/linux/issues/2140 @@ -137749,10 +137749,10 @@ index e47d5b6de3ada73896ff9a81abd223d345e0de4f..ec804c7cd06d2db897ce6f72fce29733 if (st->nr_errors >= 3) { st->fsm = FIQ_NP_SPLIT_HS_ABORTED; -From 23cb26d966f3a608ee425de9f8bb271aef7682b3 Mon Sep 17 00:00:00 2001 +From 1bb24111305718fdec2a03d394816c80c6d8b746 Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Fri, 21 Jul 2017 11:30:18 +0100 -Subject: [PATCH 145/156] lan78xx: Read MAC address from DT if present +Subject: [PATCH 145/201] lan78xx: Read MAC address from DT if present There is a standard mechanism for locating and using a MAC address from the Device Tree. Use this facility in the lan78xx driver to support @@ -137799,10 +137799,10 @@ index 0161f77641fac8eafc1284a5457a7ccb273efc39..01e72b267de8f2a82fbe1ab4557dcaab (addr[2] << 16) | (addr[3] << 24); addr_hi = addr[4] | (addr[5] << 8); -From 467bf7dc624b0feeff16c8e6535b8c3e906f5a6f Mon Sep 17 00:00:00 2001 +From bae039615a254018c9ae0f19e89cf0cef2071cc0 Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Tue, 28 Nov 2017 12:02:37 +0000 -Subject: [PATCH 146/156] lan78xx: Correctly indicate invalid OTP +Subject: [PATCH 146/201] lan78xx: Correctly indicate invalid OTP lan78xx_read_otp tries to return -EINVAL in the event of invalid OTP content, but the value gets overwritten before it is returned and the @@ -137829,10 +137829,10 @@ index 01e72b267de8f2a82fbe1ab4557dcaab67532da9..126fe75e75b19c1076a7dd4415a90403 return ret; -From fa449b32d938fa8be904fdb37b424cf67040c2bd Mon Sep 17 00:00:00 2001 +From 39649e39f8d29446663857849ad658593fd88e39 Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Tue, 17 Oct 2017 15:04:29 +0100 -Subject: [PATCH 147/156] lan78xx: Enable LEDs and auto-negotiation +Subject: [PATCH 147/201] lan78xx: Enable LEDs and auto-negotiation For applications of the LAN78xx that don't have valid programmed EEPROMs or OTPs, enabling both LEDs and auto-negotiation by default @@ -137880,10 +137880,10 @@ index 126fe75e75b19c1076a7dd4415a904035ba95402..26e04c732df49d09939d470c61a9ab46 ret = lan78xx_read_reg(dev, MAC_TX, &buf); -From 8ed86c94c82b04849f230d355d43b110f8e2becf Mon Sep 17 00:00:00 2001 +From 6b6ce2e5700732f07bf9626ff2f5e1c49eb37a8d Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Mon, 27 Nov 2017 17:14:54 +0000 -Subject: [PATCH 148/156] cgroup: Disable cgroup "memory" by default +Subject: [PATCH 148/201] cgroup: Disable cgroup "memory" by default Some Raspberry Pis have limited RAM and most users won't use the cgroup memory support so it is disabled by default. Enable with: @@ -137898,10 +137898,10 @@ Signed-off-by: Phil Elwell 1 file changed, 30 insertions(+) diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c -index 44857278eb8aa6a2bbf27b7eb12137ef42628170..8f86a3d88d84ccf4b055e6d36835fffaaf345ecc 100644 +index 030e4286f14c715ecb87fc7d2cc93d451bc2e860..c9b7a0cd1e3026b5e8d91fa5d252ddd536b06b7c 100644 --- a/kernel/cgroup/cgroup.c +++ b/kernel/cgroup/cgroup.c -@@ -5139,6 +5139,8 @@ int __init cgroup_init_early(void) +@@ -5137,6 +5137,8 @@ int __init cgroup_init_early(void) } static u16 cgroup_disable_mask __initdata; @@ -137910,7 +137910,7 @@ index 44857278eb8aa6a2bbf27b7eb12137ef42628170..8f86a3d88d84ccf4b055e6d36835fffa /** * cgroup_init - cgroup initialization -@@ -5177,6 +5179,12 @@ int __init cgroup_init(void) +@@ -5175,6 +5177,12 @@ int __init cgroup_init(void) mutex_unlock(&cgroup_mutex); @@ -137923,7 +137923,7 @@ index 44857278eb8aa6a2bbf27b7eb12137ef42628170..8f86a3d88d84ccf4b055e6d36835fffa for_each_subsys(ss, ssid) { if (ss->early_init) { struct cgroup_subsys_state *css = -@@ -5557,6 +5565,28 @@ static int __init cgroup_disable(char *str) +@@ -5555,6 +5563,28 @@ static int __init cgroup_disable(char *str) } __setup("cgroup_disable=", cgroup_disable); @@ -137953,10 +137953,10 @@ index 44857278eb8aa6a2bbf27b7eb12137ef42628170..8f86a3d88d84ccf4b055e6d36835fffa * css_tryget_online_from_dir - get corresponding css from a cgroup dentry * @dentry: directory dentry of interest -From 05accdcc0fd34d6fad79cc9351ed144cef19ad70 Mon Sep 17 00:00:00 2001 +From 859b45291f9ebb645482ac81fbe7ab64cde7ae72 Mon Sep 17 00:00:00 2001 From: Allen Wild Date: Tue, 26 Sep 2017 19:37:44 +0200 -Subject: [PATCH 149/156] thermal: enable broadcom menu for arm64 bcm2835 +Subject: [PATCH 149/201] thermal: enable broadcom menu for arm64 bcm2835 Moving the bcm2835 thermal driver to the broadcom directory prevented it from getting enabled for arm64 builds, since the broadcom directory is only @@ -137987,10 +137987,10 @@ index 07002df4f83acdde2efdf3f51299976ef25d2e1e..e3f0d1fd1720355bc601e766356ac528 endmenu -From 9f2a63187f992954e0719694b5a5f2fc235cbb45 Mon Sep 17 00:00:00 2001 +From 845af8c622940f97ff8dc857600385667fa74344 Mon Sep 17 00:00:00 2001 From: Gottfried Haider Date: Tue, 26 Sep 2017 11:59:51 +0000 -Subject: [PATCH 150/156] pwm: Set class for exported channels in sysfs +Subject: [PATCH 150/201] pwm: Set class for exported channels in sysfs [ Upstream commit 7e5d1fd75c3dde9fc10c4472b9368089d1b81d00 ] @@ -138026,10 +138026,10 @@ index a813239300c3d46bba1320caac77ec7adc8363a8..83f2b0b15712bf5745a0dc3a231c5ed0 export->child.parent = parent; export->child.devt = MKDEV(0, 0); -From 6b05daddf30bfee14f96b8edaed959e170ae6a96 Mon Sep 17 00:00:00 2001 +From d176ddddb0387113e33b8125683061e142eb2024 Mon Sep 17 00:00:00 2001 From: Giedrius Trainavicius Date: Tue, 25 Oct 2016 01:47:20 +0300 -Subject: [PATCH 151/156] Updates for Pisound module code: +Subject: [PATCH 151/201] Updates for Pisound module code: * Merged 'Fix a warning in DEBUG builds' (1c8b82b). * Updating some strings and copyright information. @@ -138454,10 +138454,10 @@ index 06ff1e53dc9d860946965b6303577762f958fae2..09739d51b70b877e24e4f74f6aaadebd +MODULE_DESCRIPTION("ASoC Driver for Pisound, https://blokas.io/pisound"); MODULE_LICENSE("GPL v2"); -From 553c00f4d0c206db850747bdda8e09b032bbcc0a Mon Sep 17 00:00:00 2001 +From 61c2d1de32361236a980f898ea21e0672180c4a5 Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Sat, 9 Dec 2017 21:45:12 +0000 -Subject: [PATCH 152/156] overlays: Add applepi-dac overlay +Subject: [PATCH 152/201] overlays: Add applepi-dac overlay See: https://github.com/raspberrypi/linux/issues/2302 @@ -138562,10 +138562,10 @@ index 0000000000000000000000000000000000000000..fc02b295470efce41d61be241ba55022 + dtc -@ -H epapr -O dtb -o ApplePi-DAC.dtbo -W no-unit_address_vs_reg ApplePi-DAC.dts +*/ -From 833b3504358cdedd79bd4bb2635a77aacb30e858 Mon Sep 17 00:00:00 2001 +From 8bb0b788b913fcb8b1061edf1f7d4a9d8d969ff1 Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Tue, 12 Dec 2017 12:12:46 +0000 -Subject: [PATCH 153/156] staging: vchiq_arm: Make debugfs failure non-fatal +Subject: [PATCH 153/201] staging: vchiq_arm: Make debugfs failure non-fatal It can be useful to be able to open multiple vchiq instances in a single process. This currently fails due to a debugfs collision, @@ -138594,10 +138594,10 @@ index 314ffac50bb8303971ca71a5f702f07fb8ed6639..e4bad872b7e547de268648fae690524f sema_init(&instance->insert_event, 0); sema_init(&instance->remove_event, 0); -From a629763c410ffd15f909fbddef94f35329c088ef Mon Sep 17 00:00:00 2001 +From 46c104d48839d145474d03b4074488ff2589cc9b Mon Sep 17 00:00:00 2001 From: Phil Elwell Date: Sat, 23 Dec 2017 22:10:37 +0000 -Subject: [PATCH 154/156] config: Add PINCTRL_MCP23S08 +Subject: [PATCH 154/201] config: Add PINCTRL_MCP23S08 As of Linux 4.12, the mcp23s08 driver moved from drivers/gpio to drivers/pinctrl. At the same time, the Kconfig symbols changed @@ -138638,10 +138638,10 @@ index c1da808d40bc8e867b41d3566bd60a758d052bdb..4cfd4e6a339009536d6ebaaff36e4007 CONFIG_GPIO_PCF857X=m CONFIG_GPIO_ARIZONA=m -From 1a8c4ce941c8a8d9865bd86546660b6ff68938f5 Mon Sep 17 00:00:00 2001 +From 2af803bb1b10c902c03e6e5cd13cec4ee5fe7171 Mon Sep 17 00:00:00 2001 From: Alex Riesen Date: Thu, 21 Dec 2017 09:29:39 +0100 -Subject: [PATCH 155/156] Add Raspberry Pi firmware driver to the dependencies +Subject: [PATCH 155/201] Add Raspberry Pi firmware driver to the dependencies of backlight driver Otherwise the backlight driver fails to build if the firmware @@ -138665,10 +138665,10 @@ index e345a32945b7ec0712cebd0ac8e62c9e8955e24f..9244f2f7b642c6fe5725f0b3b841cece If you have the Raspberry Pi DSI touchscreen display, say Y to enable the mailbox-controlled backlight driver. -From a02f735a7abbf857a7630e0c7a8723747192a6b1 Mon Sep 17 00:00:00 2001 +From f15d2a7e3e646b9a2c85cc13474ab0b9e3f6ff89 Mon Sep 17 00:00:00 2001 From: Aaron Shaw Date: Sun, 24 Dec 2017 21:57:05 +0000 -Subject: [PATCH 156/156] overlays: Add media center HAT overlay (#2313) +Subject: [PATCH 156/201] overlays: Add media center HAT overlay (#2313) --- arch/arm/boot/dts/overlays/Makefile | 1 + @@ -138862,3 +138862,4407 @@ index 0000000000000000000000000000000000000000..a42b8e2a846c6e614ca807f798bef238 + invert = <&lirc_rpi>,"rpi,invert:0"; + }; +}; + +From fe0a2683a2bbe729ec74cd4d7435e77d9aeb37bf Mon Sep 17 00:00:00 2001 +From: Aaron Shaw +Date: Thu, 28 Dec 2017 17:31:52 +0000 +Subject: [PATCH 157/201] add backlight control to rpi-display overlay + +--- + arch/arm/boot/dts/overlays/README | 1 + + arch/arm/boot/dts/overlays/rpi-display-overlay.dts | 14 ++++++++------ + 2 files changed, 9 insertions(+), 6 deletions(-) + +diff --git a/arch/arm/boot/dts/overlays/README b/arch/arm/boot/dts/overlays/README +index 6e43bbdd4ef26ee93ce45e045e2c7ebafc261ef1..e0f29ec6627a87f2edd1fff9f696713115fa4386 100644 +--- a/arch/arm/boot/dts/overlays/README ++++ b/arch/arm/boot/dts/overlays/README +@@ -1329,6 +1329,7 @@ Params: speed Display SPI bus speed + debug Debug output level {0-7} + xohms Touchpanel sensitivity (X-plate resistance) + swapxy Swap x and y axis ++ backlight Change backlight GPIO pin {e.g. 12, 18} + + + Name: rpi-ft5406 +diff --git a/arch/arm/boot/dts/overlays/rpi-display-overlay.dts b/arch/arm/boot/dts/overlays/rpi-display-overlay.dts +index d7e72eef594e08b309ffbaa04f43c68909c08f36..533b5c140b5447a0bcf426fee0a8b321074edb66 100644 +--- a/arch/arm/boot/dts/overlays/rpi-display-overlay.dts ++++ b/arch/arm/boot/dts/overlays/rpi-display-overlay.dts +@@ -79,11 +79,13 @@ + }; + }; + __overrides__ { +- speed = <&rpidisplay>,"spi-max-frequency:0"; +- rotate = <&rpidisplay>,"rotate:0"; +- fps = <&rpidisplay>,"fps:0"; +- debug = <&rpidisplay>,"debug:0"; +- xohms = <&rpidisplay_ts>,"ti,x-plate-ohms;0"; +- swapxy = <&rpidisplay_ts>,"ti,swap-xy?"; ++ speed = <&rpidisplay>,"spi-max-frequency:0"; ++ rotate = <&rpidisplay>,"rotate:0"; ++ fps = <&rpidisplay>,"fps:0"; ++ debug = <&rpidisplay>,"debug:0"; ++ xohms = <&rpidisplay_ts>,"ti,x-plate-ohms;0"; ++ swapxy = <&rpidisplay_ts>,"ti,swap-xy?"; ++ backlight = <&rpidisplay>,"led-gpios:4", ++ <&rpi_display_pins>,"brcm,pins:0"; + }; + }; + +From 4340e66db1466d98e2955a76a9e9b0a5c70d01d4 Mon Sep 17 00:00:00 2001 +From: Aaron Shaw +Date: Thu, 28 Dec 2017 17:34:54 +0000 +Subject: [PATCH 158/201] add backlight control to media-center overlay + +--- + arch/arm/boot/dts/overlays/README | 1 + + arch/arm/boot/dts/overlays/media-center-overlay.dts | 16 +++++++++------- + 2 files changed, 10 insertions(+), 7 deletions(-) + +diff --git a/arch/arm/boot/dts/overlays/README b/arch/arm/boot/dts/overlays/README +index e0f29ec6627a87f2edd1fff9f696713115fa4386..2024a28e9bbff8ec9c6f56ee45c2def3591b75a2 100644 +--- a/arch/arm/boot/dts/overlays/README ++++ b/arch/arm/boot/dts/overlays/README +@@ -1002,6 +1002,7 @@ Params: speed Display SPI bus speed + fps Delay between frame updates + xohms Touchpanel sensitivity (X-plate resistance) + swapxy Swap x and y axis ++ backlight Change backlight GPIO pin {e.g. 12, 18} + gpio_out_pin GPIO for output (default "17") + gpio_in_pin GPIO for input (default "18") + gpio_in_pull Pull up/down/off on the input pin +diff --git a/arch/arm/boot/dts/overlays/media-center-overlay.dts b/arch/arm/boot/dts/overlays/media-center-overlay.dts +index a42b8e2a846c6e614ca807f798bef238ad002535..ce4db35228e9f68e3f3f40f0f9c02f89912c11d3 100644 +--- a/arch/arm/boot/dts/overlays/media-center-overlay.dts ++++ b/arch/arm/boot/dts/overlays/media-center-overlay.dts +@@ -113,13 +113,15 @@ + }; + + __overrides__ { +- speed = <&rpidisplay>,"spi-max-frequency:0"; +- rotate = <&rpidisplay>,"rotate:0"; +- fps = <&rpidisplay>,"fps:0"; +- debug = <&rpidisplay>,"debug:0", +- <&lirc_rpi>,"rpi,debug:0"; +- xohms = <&rpidisplay_ts>,"ti,x-plate-ohms;0"; +- swapxy = <&rpidisplay_ts>,"ti,swap-xy?"; ++ speed = <&rpidisplay>,"spi-max-frequency:0"; ++ rotate = <&rpidisplay>,"rotate:0"; ++ fps = <&rpidisplay>,"fps:0"; ++ debug = <&rpidisplay>,"debug:0", ++ <&lirc_rpi>,"rpi,debug:0"; ++ xohms = <&rpidisplay_ts>,"ti,x-plate-ohms;0"; ++ swapxy = <&rpidisplay_ts>,"ti,swap-xy?"; ++ backlight = <&rpidisplay>,"led-gpios:4", ++ <&rpi_display_pins>,"brcm,pins:0"; + + gpio_out_pin = <&lirc_pins>,"brcm,pins:0"; + gpio_in_pin = <&lirc_pins>,"brcm,pins:4"; + +From b6aa8f68bb98befe327dac394280cff8ed4cea3b Mon Sep 17 00:00:00 2001 +From: penfold42 +Date: Tue, 2 Jan 2018 00:15:19 +1100 +Subject: [PATCH 159/201] Add overlay for mcp3202 12 bit ADC + +--- + arch/arm/boot/dts/overlays/Makefile | 1 + + arch/arm/boot/dts/overlays/README | 9 ++ + arch/arm/boot/dts/overlays/mcp3202-overlay.dts | 205 +++++++++++++++++++++++++ + 3 files changed, 215 insertions(+) + create mode 100755 arch/arm/boot/dts/overlays/mcp3202-overlay.dts + +diff --git a/arch/arm/boot/dts/overlays/Makefile b/arch/arm/boot/dts/overlays/Makefile +index e07c87e2dcbd4d1b7146cec2e53a762a4b283800..7aa703e938c0bb1d5659052f6899d0a6d3be5a4c 100644 +--- a/arch/arm/boot/dts/overlays/Makefile ++++ b/arch/arm/boot/dts/overlays/Makefile +@@ -61,6 +61,7 @@ dtbo-$(CONFIG_ARCH_BCM2835) += \ + mcp2515-can0.dtbo \ + mcp2515-can1.dtbo \ + mcp3008.dtbo \ ++ mcp3202.dtbo \ + media-center.dtbo \ + midi-uart0.dtbo \ + midi-uart1.dtbo \ +diff --git a/arch/arm/boot/dts/overlays/README b/arch/arm/boot/dts/overlays/README +index 2024a28e9bbff8ec9c6f56ee45c2def3591b75a2..b8a2f3fdf73299346482c9e7d2a1133a73fe93ba 100644 +--- a/arch/arm/boot/dts/overlays/README ++++ b/arch/arm/boot/dts/overlays/README +@@ -994,6 +994,15 @@ Params: spi--present boolean, configure device at spi, cs + spi--speed integer, set the spi bus speed for this device + + ++Name: mcp3202 ++Info: Configures MCP3202 A/D converters ++ For devices on spi1 or spi2, the interfaces should be enabled ++ with one of the spi1-1/2/3cs and/or spi2-1/2/3cs overlays. ++Load: dtoverlay=mcp3202,[=] ++Params: spi--present boolean, configure device at spi, cs ++ spi--speed integer, set the spi bus speed for this device ++ ++ + Name: media-center + Info: Media Center HAT - 2.83" Touch Display + extras by Pi Supply + Load: dtoverlay=media-center,= +diff --git a/arch/arm/boot/dts/overlays/mcp3202-overlay.dts b/arch/arm/boot/dts/overlays/mcp3202-overlay.dts +new file mode 100755 +index 0000000000000000000000000000000000000000..9902c4614ea1f9e5725b3c4a2e62429a1213009a +--- /dev/null ++++ b/arch/arm/boot/dts/overlays/mcp3202-overlay.dts +@@ -0,0 +1,205 @@ ++/* ++ * Device tree overlay for Microchip mcp3202 12-Bit A/D Converters ++ */ ++ ++/dts-v1/; ++/plugin/; ++ ++/ { ++ compatible = "brcm,bcm2835", "brcm,bcm2708", "brcm,bcm2709"; ++ ++ fragment@0 { ++ target = <&spidev0>; ++ __dormant__ { ++ status = "disabled"; ++ }; ++ }; ++ ++ fragment@1 { ++ target = <&spidev1>; ++ __dormant__ { ++ status = "disabled"; ++ }; ++ }; ++ ++ fragment@2 { ++ target-path = "spi1/spidev@0"; ++ __dormant__ { ++ status = "disabled"; ++ }; ++ }; ++ ++ fragment@3 { ++ target-path = "spi1/spidev@1"; ++ __dormant__ { ++ status = "disabled"; ++ }; ++ }; ++ ++ fragment@4 { ++ target-path = "spi1/spidev@2"; ++ __dormant__ { ++ status = "disabled"; ++ }; ++ }; ++ ++ fragment@5 { ++ target-path = "spi2/spidev@0"; ++ __dormant__ { ++ status = "disabled"; ++ }; ++ }; ++ ++ fragment@6 { ++ target-path = "spi2/spidev@1"; ++ __dormant__ { ++ status = "disabled"; ++ }; ++ }; ++ ++ fragment@7 { ++ target-path = "spi2/spidev@2"; ++ __dormant__ { ++ status = "disabled"; ++ }; ++ }; ++ ++ fragment@8 { ++ target = <&spi0>; ++ __dormant__ { ++ status = "okay"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ mcp3202_00: mcp3202@0 { ++ compatible = "mcp3202"; ++ reg = <0>; ++ spi-max-frequency = <1600000>; ++ }; ++ }; ++ }; ++ ++ fragment@9 { ++ target = <&spi0>; ++ __dormant__ { ++ status = "okay"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ mcp3202_01: mcp3202@1 { ++ compatible = "mcp3202"; ++ reg = <1>; ++ spi-max-frequency = <1600000>; ++ }; ++ }; ++ }; ++ ++ fragment@10 { ++ target = <&spi1>; ++ __dormant__ { ++ status = "okay"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ mcp3202_10: mcp3202@0 { ++ compatible = "mcp3202"; ++ reg = <0>; ++ spi-max-frequency = <1600000>; ++ }; ++ }; ++ }; ++ ++ fragment@11 { ++ target = <&spi1>; ++ __dormant__ { ++ status = "okay"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ mcp3202_11: mcp3202@1 { ++ compatible = "mcp3202"; ++ reg = <1>; ++ spi-max-frequency = <1600000>; ++ }; ++ }; ++ }; ++ ++ fragment@12 { ++ target = <&spi1>; ++ __dormant__ { ++ status = "okay"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ mcp3202_12: mcp3202@2 { ++ compatible = "mcp3202"; ++ reg = <2>; ++ spi-max-frequency = <1600000>; ++ }; ++ }; ++ }; ++ ++ fragment@13 { ++ target = <&spi2>; ++ __dormant__ { ++ status = "okay"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ mcp3202_20: mcp3202@0 { ++ compatible = "mcp3202"; ++ reg = <0>; ++ spi-max-frequency = <1600000>; ++ }; ++ }; ++ }; ++ ++ fragment@14 { ++ target = <&spi2>; ++ __dormant__ { ++ status = "okay"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ mcp3202_21: mcp3202@1 { ++ compatible = "mcp3202"; ++ reg = <1>; ++ spi-max-frequency = <1600000>; ++ }; ++ }; ++ }; ++ ++ fragment@15 { ++ target = <&spi2>; ++ __dormant__ { ++ status = "okay"; ++ #address-cells = <1>; ++ #size-cells = <0>; ++ ++ mcp3202_22: mcp3202@2 { ++ compatible = "mcp3202"; ++ reg = <2>; ++ spi-max-frequency = <1600000>; ++ }; ++ }; ++ }; ++ ++ __overrides__ { ++ spi0-0-present = <0>, "+0+8"; ++ spi0-1-present = <0>, "+1+9"; ++ spi1-0-present = <0>, "+2+10"; ++ spi1-1-present = <0>, "+3+11"; ++ spi1-2-present = <0>, "+4+12"; ++ spi2-0-present = <0>, "+5+13"; ++ spi2-1-present = <0>, "+6+14"; ++ spi2-2-present = <0>, "+7+15"; ++ spi0-0-speed = <&mcp3202_00>, "spi-max-frequency:0"; ++ spi0-1-speed = <&mcp3202_01>, "spi-max-frequency:0"; ++ spi1-0-speed = <&mcp3202_10>, "spi-max-frequency:0"; ++ spi1-1-speed = <&mcp3202_11>, "spi-max-frequency:0"; ++ spi1-2-speed = <&mcp3202_12>, "spi-max-frequency:0"; ++ spi2-0-speed = <&mcp3202_20>, "spi-max-frequency:0"; ++ spi2-1-speed = <&mcp3202_21>, "spi-max-frequency:0"; ++ spi2-2-speed = <&mcp3202_22>, "spi-max-frequency:0"; ++ }; ++}; + +From 0a7f7ca113a71789fc5f43717cd7e0dd5c8a1967 Mon Sep 17 00:00:00 2001 +From: Stefan Schake +Date: Sat, 2 Dec 2017 18:40:39 +0100 +Subject: [PATCH 160/201] drm/vc4: Release fence after signalling + +[ Upstream commit babc8110057cb9ca542c3c1666cbda4e8ccf9250 ] + +We were never releasing the initial fence reference that is obtained +through dma_fence_init. + +Link: https://github.com/anholt/linux/issues/122 +Fixes: cdec4d361323 ("drm/vc4: Expose dma-buf fences for V3D rendering.") +Signed-off-by: Stefan Schake +Signed-off-by: Eric Anholt +Reviewed-by: Eric Anholt +Link: https://patchwork.freedesktop.org/patch/msgid/1512236444-301-1-git-send-email-stschake@gmail.com +--- + drivers/gpu/drm/vc4/vc4_gem.c | 4 +++- + drivers/gpu/drm/vc4/vc4_irq.c | 1 + + 2 files changed, 4 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/vc4/vc4_gem.c b/drivers/gpu/drm/vc4/vc4_gem.c +index d0c6bfb68c4ee9d88c2a026e5908915d331733db..e554cbf18a55c30e6dce1ef8bf3a5a60a6b73407 100644 +--- a/drivers/gpu/drm/vc4/vc4_gem.c ++++ b/drivers/gpu/drm/vc4/vc4_gem.c +@@ -829,8 +829,10 @@ vc4_complete_exec(struct drm_device *dev, struct vc4_exec_info *exec) + /* If we got force-completed because of GPU reset rather than + * through our IRQ handler, signal the fence now. + */ +- if (exec->fence) ++ if (exec->fence) { + dma_fence_signal(exec->fence); ++ dma_fence_put(exec->fence); ++ } + + if (exec->bo) { + for (i = 0; i < exec->bo_count; i++) +diff --git a/drivers/gpu/drm/vc4/vc4_irq.c b/drivers/gpu/drm/vc4/vc4_irq.c +index 7d7af3a93d941bb9552afc1140c408c8da86be37..fc1fc43a924dcc0c44a7a13858bfb53ccdf8fe32 100644 +--- a/drivers/gpu/drm/vc4/vc4_irq.c ++++ b/drivers/gpu/drm/vc4/vc4_irq.c +@@ -139,6 +139,7 @@ vc4_irq_finish_render_job(struct drm_device *dev) + list_move_tail(&exec->head, &vc4->job_done_list); + if (exec->fence) { + dma_fence_signal_locked(exec->fence); ++ dma_fence_put(exec->fence); + exec->fence = NULL; + } + vc4_submit_next_render_job(dev); + +From 9a9777684a05f6b427b978d2d9fc0a5ab272aa17 Mon Sep 17 00:00:00 2001 +From: P33M +Date: Tue, 9 Jan 2018 15:16:35 +0000 +Subject: [PATCH 161/201] dwc_otg: don't unconditionally force host mode in + dwc_otg_cil_init() + +Add the ability to disable force_host_mode for those that want to use +dwc_otg in both device and host modes. +--- + drivers/usb/host/dwc_otg/dwc_otg_cil.c | 7 ++++++- + drivers/usb/host/dwc_otg/dwc_otg_driver.c | 7 +++++++ + 2 files changed, 13 insertions(+), 1 deletion(-) + +diff --git a/drivers/usb/host/dwc_otg/dwc_otg_cil.c b/drivers/usb/host/dwc_otg/dwc_otg_cil.c +index 38abd0b1f0341b50a2d7ad7493e2d09b6b8a55a9..14300ad0f2af7bfa89127ea113a36651aae44187 100644 +--- a/drivers/usb/host/dwc_otg/dwc_otg_cil.c ++++ b/drivers/usb/host/dwc_otg/dwc_otg_cil.c +@@ -61,6 +61,8 @@ + #include "dwc_otg_regs.h" + #include "dwc_otg_cil.h" + ++extern bool cil_force_host; ++ + static int dwc_otg_setup_params(dwc_otg_core_if_t * core_if); + + /** +@@ -192,7 +194,10 @@ dwc_otg_core_if_t *dwc_otg_cil_init(const uint32_t * reg_base_addr) + core_if->hptxfsiz.d32 = + DWC_READ_REG32(&core_if->core_global_regs->hptxfsiz); + gusbcfg.d32 = DWC_READ_REG32(&core_if->core_global_regs->gusbcfg); +- gusbcfg.b.force_host_mode = 1; ++ if (cil_force_host) ++ gusbcfg.b.force_host_mode = 1; ++ else ++ gusbcfg.b.force_host_mode = 0; + DWC_WRITE_REG32(&core_if->core_global_regs->gusbcfg, gusbcfg.d32); + dwc_mdelay(100); + } +diff --git a/drivers/usb/host/dwc_otg/dwc_otg_driver.c b/drivers/usb/host/dwc_otg/dwc_otg_driver.c +index af123d01f3ef9f99450c78efdf766ca35e15cbc9..e945900c503cb383d754381b055955b1740e10b5 100644 +--- a/drivers/usb/host/dwc_otg/dwc_otg_driver.c ++++ b/drivers/usb/host/dwc_otg/dwc_otg_driver.c +@@ -247,6 +247,9 @@ bool fiq_fsm_enable = true; + //Bulk split-transaction NAK holdoff in microframes + uint16_t nak_holdoff = 8; + ++//Force host mode during CIL re-init ++bool cil_force_host = true; ++ + unsigned short fiq_fsm_mask = 0x0F; + + unsigned short int_ep_interval_min = 0; +@@ -1403,6 +1406,10 @@ MODULE_PARM_DESC(int_ep_interval_min, "Clamp high-speed Interrupt endpoints to a + "0..1 = Use endpoint default\n" + "2..n = Minimum interval n microframes. Use powers of 2.\n"); + ++module_param(cil_force_host, bool, 0644); ++MODULE_PARM_DESC(cil_force_host, "On a connector-ID status change, " ++ "force Host Mode regardless of OTG state."); ++ + /** @page "Module Parameters" + * + * The following parameters may be specified when starting the module. + +From 6889eaa3913832dfbbd54563b22411b589bec178 Mon Sep 17 00:00:00 2001 +From: Sugizaki Yukimasa +Date: Thu, 4 Jan 2018 23:58:06 +0900 +Subject: [PATCH 162/201] vcsm: Define cache operation constants in user header + +Without this change, users have to use raw values (1, 2, 3) to specify +cache operation. + +Signed-off-by: Sugizaki Yukimasa +--- + drivers/char/broadcom/vc_sm/vc_sm_knl.h | 5 ----- + include/linux/broadcom/vmcs_sm_ioctl.h | 5 +++++ + 2 files changed, 5 insertions(+), 5 deletions(-) + +diff --git a/drivers/char/broadcom/vc_sm/vc_sm_knl.h b/drivers/char/broadcom/vc_sm/vc_sm_knl.h +index 4f120421c2d11f7ae46752c38b073a4dfdf712c6..f7f74750d8358779c61dfcd6fc841aa1789a2c5e 100644 +--- a/drivers/char/broadcom/vc_sm/vc_sm_knl.h ++++ b/drivers/char/broadcom/vc_sm/vc_sm_knl.h +@@ -27,11 +27,6 @@ enum vc_sm_lock_cache_mode { + VC_SM_LOCK_NON_CACHED, + }; + +-/* Cache functions */ +-#define VCSM_CACHE_OP_INV 0x01 +-#define VCSM_CACHE_OP_CLEAN 0x02 +-#define VCSM_CACHE_OP_FLUSH 0x03 +- + /* Allocate a shared memory handle and block. */ + int vc_sm_alloc(struct vc_sm_alloc_t *alloc, int *handle); + +diff --git a/include/linux/broadcom/vmcs_sm_ioctl.h b/include/linux/broadcom/vmcs_sm_ioctl.h +index b75729d762f25aace133f7a008633b4094ae2de2..ddbeebc71ada82e88a1668fbdfd9821a39d7cd22 100644 +--- a/include/linux/broadcom/vmcs_sm_ioctl.h ++++ b/include/linux/broadcom/vmcs_sm_ioctl.h +@@ -79,6 +79,11 @@ enum vmcs_sm_cache_e { + VMCS_SM_CACHE_BOTH, + }; + ++/* Cache functions */ ++#define VCSM_CACHE_OP_INV 0x01 ++#define VCSM_CACHE_OP_CLEAN 0x02 ++#define VCSM_CACHE_OP_FLUSH 0x03 ++ + /* IOCTL Data structures */ + struct vmcs_sm_ioctl_alloc { + /* user -> kernel */ + +From e3343bc0a679929bdb6eb0cde17f3a0d7d7744ac Mon Sep 17 00:00:00 2001 +From: Sugizaki Yukimasa +Date: Fri, 5 Jan 2018 00:01:30 +0900 +Subject: [PATCH 163/201] vcsm: Support for finding user/vc handle in memory + pool + +vmcs_sm_{usr,vc}_handle_from_pid_and_address() were failing to find +handle if specified user pointer is not exactly the one that the memory +locking call returned even if the pointer is in range of map/resource. +So fixed the functions to match the range. + +Signed-off-by: Sugizaki Yukimasa +--- + drivers/char/broadcom/vc_sm/vmcs_sm.c | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +diff --git a/drivers/char/broadcom/vc_sm/vmcs_sm.c b/drivers/char/broadcom/vc_sm/vmcs_sm.c +index 53843054d7617716761b74d8a3d91551b91ffb75..abd770566ed30102b95a01cec6a3825b23afcd9d 100644 +--- a/drivers/char/broadcom/vc_sm/vmcs_sm.c ++++ b/drivers/char/broadcom/vc_sm/vmcs_sm.c +@@ -276,7 +276,10 @@ static unsigned int vmcs_sm_vc_handle_from_pid_and_address(unsigned int pid, + /* Lookup the resource. */ + if (!list_empty(&sm_state->map_list)) { + list_for_each_entry(map, &sm_state->map_list, map_list) { +- if (map->res_pid != pid || map->res_addr != addr) ++ if (map->res_pid != pid) ++ continue; ++ if (!(map->res_addr <= addr && ++ addr < map->res_addr + map->resource->res_size)) + continue; + + pr_debug("[%s]: global map %p (pid %u, addr %lx) -> vc-hdl %x (usr-hdl %x)\n", +@@ -326,7 +329,10 @@ static unsigned int vmcs_sm_usr_handle_from_pid_and_address(unsigned int pid, + /* Lookup the resource. */ + if (!list_empty(&sm_state->map_list)) { + list_for_each_entry(map, &sm_state->map_list, map_list) { +- if (map->res_pid != pid || map->res_addr != addr) ++ if (map->res_pid != pid) ++ continue; ++ if (!(map->res_addr <= addr && ++ addr < map->res_addr + map->resource->res_size)) + continue; + + pr_debug("[%s]: global map %p (pid %u, addr %lx) -> usr-hdl %x (vc-hdl %x)\n", + +From 70863f0684d05d286c54776d566890d6237c6016 Mon Sep 17 00:00:00 2001 +From: Sugizaki Yukimasa +Date: Fri, 5 Jan 2018 00:44:00 +0900 +Subject: [PATCH 164/201] vcsm: Unify cache manipulating functions + +Signed-off-by: Sugizaki Yukimasa +--- + drivers/char/broadcom/vc_sm/vmcs_sm.c | 309 +++++++++++++++------------------- + 1 file changed, 132 insertions(+), 177 deletions(-) + +diff --git a/drivers/char/broadcom/vc_sm/vmcs_sm.c b/drivers/char/broadcom/vc_sm/vmcs_sm.c +index abd770566ed30102b95a01cec6a3825b23afcd9d..b6cdc1934ad2092892898559f6f0d481a7744fa9 100644 +--- a/drivers/char/broadcom/vc_sm/vmcs_sm.c ++++ b/drivers/char/broadcom/vc_sm/vmcs_sm.c +@@ -1256,61 +1256,106 @@ static const struct vm_operations_struct vcsm_vm_ops = { + .fault = vcsm_vma_fault, + }; + +-/* Walks a VMA and clean each valid page from the cache */ +-static void vcsm_vma_cache_clean_page_range(unsigned long addr, +- unsigned long end) ++static int clean_invalid_mem_2d(const void __user *addr, ++ const size_t block_count, const size_t block_size, const size_t stride, ++ const unsigned cache_op) + { +- pgd_t *pgd; +- pud_t *pud; +- pmd_t *pmd; +- pte_t *pte; +- unsigned long pgd_next, pud_next, pmd_next; ++ size_t i; ++ void (*op_fn)(const void*, const void*); + +- if (addr >= end) +- return; ++ if (block_size <= 0) { ++ pr_err("[%s]: size cannot be 0\n", __func__); ++ return -EINVAL; ++ } + +- /* Walk PGD */ +- pgd = pgd_offset(current->mm, addr); +- do { +- pgd_next = pgd_addr_end(addr, end); ++ switch (cache_op) { ++ case VCSM_CACHE_OP_INV: ++ op_fn = dmac_inv_range; ++ break; ++ case VCSM_CACHE_OP_CLEAN: ++ op_fn = dmac_clean_range; ++ break; ++ case VCSM_CACHE_OP_FLUSH: ++ op_fn = dmac_flush_range; ++ break; ++ default: ++ pr_err("[%s]: Invalid cache_op: 0x%08x\n", __func__, cache_op); ++ return -EINVAL; ++ } + +- if (pgd_none(*pgd) || pgd_bad(*pgd)) +- continue; ++ for (i = 0; i < block_count; i ++, addr += stride) ++ op_fn(addr, addr + block_size); + +- /* Walk PUD */ +- pud = pud_offset(pgd, addr); +- do { +- pud_next = pud_addr_end(addr, pgd_next); +- if (pud_none(*pud) || pud_bad(*pud)) +- continue; ++ return 0; ++} ++ ++static int clean_invalid_mem(const void __user *addr, const size_t size, ++ const unsigned cache_op) ++{ ++ return clean_invalid_mem_2d(addr, 1, size, 0, cache_op); ++} ++ ++static int clean_invalid_resource(const void __user *addr, const size_t size, ++ const unsigned cache_op, const int usr_hdl, ++ struct sm_resource_t *resource) ++{ ++ int err; ++ enum sm_stats_t stat_attempt, stat_failure; ++ void __user *res_addr; ++ ++ if (resource == NULL) { ++ pr_err("[%s]: resource is NULL\n", __func__); ++ return -EINVAL; ++ } ++ if (resource->res_cached != VMCS_SM_CACHE_HOST && ++ resource->res_cached != VMCS_SM_CACHE_BOTH) ++ return 0; ++ ++ switch (cache_op) { ++ case VCSM_CACHE_OP_INV: ++ stat_attempt = INVALID; ++ stat_failure = INVALID_FAIL; ++ break; ++ case VCSM_CACHE_OP_CLEAN: ++ /* Like the original VMCS_SM_CMD_CLEAN_INVALID ioctl handler does. */ ++ stat_attempt = FLUSH; ++ stat_failure = FLUSH_FAIL; ++ break; ++ case VCSM_CACHE_OP_FLUSH: ++ stat_attempt = FLUSH; ++ stat_failure = FLUSH_FAIL; ++ break; ++ default: ++ pr_err("[%s]: Invalid cache_op: 0x%08x\n", __func__, cache_op); ++ return -EINVAL; ++ } ++ resource->res_stats[stat_attempt]++; ++ ++ if (size > resource->res_size) { ++ pr_err("[%s]: size (0x%08zu) is larger than res_size (0x%08zu)\n", ++ __func__, size, resource->res_size); ++ return -EFAULT; ++ } ++ res_addr = (void __user*) vmcs_sm_usr_address_from_pid_and_usr_handle( ++ current->tgid, usr_hdl); ++ if (res_addr == NULL) { ++ pr_err("[%s]: Failed to get user address " ++ "from pid (%d) and user handle (%d)\n", __func__, current->tgid, ++ resource->res_handle); ++ return -EINVAL; ++ } ++ if (!(res_addr <= addr && addr + size <= res_addr + resource->res_size)) { ++ pr_err("[%s]: Addr (0x%p-0x%p) out of range (0x%p-0x%p)\n", ++ __func__, addr, addr + size, res_addr, ++ res_addr + resource->res_size); ++ return -EFAULT; ++ } ++ ++ err = clean_invalid_mem(addr, size, cache_op); ++ if (err) ++ resource->res_stats[stat_failure]++; + +- /* Walk PMD */ +- pmd = pmd_offset(pud, addr); +- do { +- pmd_next = pmd_addr_end(addr, pud_next); +- if (pmd_none(*pmd) || pmd_bad(*pmd)) +- continue; +- +- /* Walk PTE */ +- pte = pte_offset_map(pmd, addr); +- do { +- if (pte_none(*pte) +- || !pte_present(*pte)) +- continue; +- +- /* Clean + invalidate */ +- dmac_flush_range((const void *) addr, +- (const void *) +- (addr + PAGE_SIZE)); +- +- } while (pte++, addr += +- PAGE_SIZE, addr != pmd_next); +- pte_unmap(pte); +- +- } while (pmd++, addr = pmd_next, addr != pud_next); +- +- } while (pud++, addr = pud_next, addr != pgd_next); +- } while (pgd++, addr = pgd_next, addr != end); ++ return err; + } + + /* Map an allocated data into something that the user space. */ +@@ -1952,14 +1997,13 @@ static int vc_sm_ioctl_unlock(struct sm_priv_data_t *private, + list_for_each_entry(map, &resource->map_list, + resource_map_list) { + if (map->vma) { +- unsigned long start; +- unsigned long end; +- +- start = map->vma->vm_start; +- end = map->vma->vm_end; ++ const unsigned long start = map->vma->vm_start; ++ const unsigned long end = map->vma->vm_end; + +- vcsm_vma_cache_clean_page_range( +- start, end); ++ ret = clean_invalid_mem((void __user*) start, end - start, ++ VCSM_CACHE_OP_FLUSH); ++ if (ret) ++ goto error; + } + } + up_read(¤t->mm->mmap_sem); +@@ -2833,41 +2877,17 @@ static long vc_sm_ioctl(struct file *file, unsigned int cmd, unsigned long arg) + /* Locate resource from GUID. */ + resource = + vmcs_sm_acquire_resource(file_data, ioparam.handle); +- +- if ((resource != NULL) && resource->res_cached) { +- dma_addr_t phys_addr = 0; +- +- resource->res_stats[FLUSH]++; +- +- phys_addr = +- (dma_addr_t)((uint32_t) +- resource->res_base_mem & +- 0x3FFFFFFF); +- phys_addr += (dma_addr_t)mm_vc_mem_phys_addr; +- +- /* L1 cache flush */ +- down_read(¤t->mm->mmap_sem); +- vcsm_vma_cache_clean_page_range((unsigned long) +- ioparam.addr, +- (unsigned long) +- ioparam.addr + +- ioparam.size); +- up_read(¤t->mm->mmap_sem); +- +- /* L2 cache flush */ +- outer_clean_range(phys_addr, +- phys_addr + +- (size_t) ioparam.size); +- } else if (resource == NULL) { ++ if (resource == NULL) { + ret = -EINVAL; + goto out; + } + +- if (resource) +- vmcs_sm_release_resource(resource, 0); +- +- /* Done. */ +- goto out; ++ ret = clean_invalid_resource((void __user*) ioparam.addr, ++ ioparam.size, VCSM_CACHE_OP_FLUSH, ioparam.handle, ++ resource); ++ vmcs_sm_release_resource(resource, 0); ++ if (ret) ++ goto out; + } + break; + +@@ -2888,41 +2908,16 @@ static long vc_sm_ioctl(struct file *file, unsigned int cmd, unsigned long arg) + /* Locate resource from GUID. */ + resource = + vmcs_sm_acquire_resource(file_data, ioparam.handle); +- +- if ((resource != NULL) && resource->res_cached) { +- dma_addr_t phys_addr = 0; +- +- resource->res_stats[INVALID]++; +- +- phys_addr = +- (dma_addr_t)((uint32_t) +- resource->res_base_mem & +- 0x3FFFFFFF); +- phys_addr += (dma_addr_t)mm_vc_mem_phys_addr; +- +- /* L2 cache invalidate */ +- outer_inv_range(phys_addr, +- phys_addr + +- (size_t) ioparam.size); +- +- /* L1 cache invalidate */ +- down_read(¤t->mm->mmap_sem); +- vcsm_vma_cache_clean_page_range((unsigned long) +- ioparam.addr, +- (unsigned long) +- ioparam.addr + +- ioparam.size); +- up_read(¤t->mm->mmap_sem); +- } else if (resource == NULL) { ++ if (resource == NULL) { + ret = -EINVAL; + goto out; + } + +- if (resource) +- vmcs_sm_release_resource(resource, 0); +- +- /* Done. */ +- goto out; ++ ret = clean_invalid_resource((void __user*) ioparam.addr, ++ ioparam.size, VCSM_CACHE_OP_INV, ioparam.handle, resource); ++ vmcs_sm_release_resource(resource, 0); ++ if (ret) ++ goto out; + } + break; + +@@ -2941,43 +2936,27 @@ static long vc_sm_ioctl(struct file *file, unsigned int cmd, unsigned long arg) + goto out; + } + for (i = 0; i < sizeof(ioparam.s) / sizeof(*ioparam.s); i++) { +- switch (ioparam.s[i].cmd) { +- case VCSM_CACHE_OP_INV: /* L1/L2 invalidate virtual range */ +- case VCSM_CACHE_OP_FLUSH: /* L1/L2 clean physical range */ +- case VCSM_CACHE_OP_CLEAN: /* L1/L2 clean+invalidate all */ +- /* Locate resource from GUID. */ +- resource = +- vmcs_sm_acquire_resource(file_data, ioparam.s[i].handle); +- +- if ((resource != NULL) && resource->res_cached) { +- unsigned long base = ioparam.s[i].addr & ~(PAGE_SIZE - 1); +- unsigned long end = (ioparam.s[i].addr + ioparam.s[i].size + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1); +- +- resource->res_stats[ioparam.s[i].cmd == 1 ? INVALID : FLUSH]++; +- +- /* L1/L2 cache flush */ +- down_read(¤t->mm->mmap_sem); +- vcsm_vma_cache_clean_page_range(base, end); +- up_read(¤t->mm->mmap_sem); +- } else if (resource == NULL) { +- ret = -EINVAL; +- goto out; +- } +- +- if (resource) +- vmcs_sm_release_resource(resource, 0); +- +- break; +- default: +- break; /* NOOP */ ++ /* Locate resource from GUID. */ ++ resource = ++ vmcs_sm_acquire_resource(file_data, ioparam.s[i].handle); ++ if (resource == NULL) { ++ ret = -EINVAL; ++ goto out; + } ++ ++ ret = clean_invalid_resource((void __user*) ioparam.s[i].addr, ++ ioparam.s[i].size, ioparam.s[i].cmd, ++ ioparam.s[i].handle, resource); ++ vmcs_sm_release_resource(resource, 0); ++ if (ret) ++ goto out; + } + } + break; + /* Flush/Invalidate the cache for a given mapping. */ + case VMCS_SM_CMD_CLEAN_INVALID2: + { +- int i, j; ++ int i; + struct vmcs_sm_ioctl_clean_invalid2 ioparam; + struct vmcs_sm_ioctl_clean_invalid_block *block = NULL; + +@@ -3006,36 +2985,12 @@ static long vc_sm_ioctl(struct file *file, unsigned int cmd, unsigned long arg) + + for (i = 0; i < ioparam.op_count; i++) { + const struct vmcs_sm_ioctl_clean_invalid_block * const op = block + i; +- void (*op_fn)(const void *, const void *); +- +- switch(op->invalidate_mode & 3) { +- case VCSM_CACHE_OP_INV: +- op_fn = dmac_inv_range; +- break; +- case VCSM_CACHE_OP_CLEAN: +- op_fn = dmac_clean_range; +- break; +- case VCSM_CACHE_OP_FLUSH: +- op_fn = dmac_flush_range; +- break; +- default: +- op_fn = 0; +- break; +- } +- +- if ((op->invalidate_mode & ~3) != 0) { +- ret = -EINVAL; +- break; +- } +- +- if (op_fn == 0) +- continue; + +- for (j = 0; j < op->block_count; ++j) { +- const char * const base = (const char *)op->start_address + j * op->inter_block_stride; +- const char * const end = base + op->block_size; +- op_fn(base, end); +- } ++ ret = clean_invalid_mem_2d((void __user*) op->start_address, ++ op->block_count, op->block_size, ++ op->inter_block_stride, op->invalidate_mode); ++ if (ret) ++ goto out; + } + kfree(block); + } + +From 7dc83438d7f87a2ff1f91f166dc1bbb38dc03cf4 Mon Sep 17 00:00:00 2001 +From: Sugizaki Yukimasa +Date: Mon, 8 Jan 2018 21:07:17 +0900 +Subject: [PATCH 165/201] vcsm: Fix obscure conditions + +Signed-off-by: Sugizaki Yukimasa +--- + drivers/char/broadcom/vc_sm/vmcs_sm.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/drivers/char/broadcom/vc_sm/vmcs_sm.c b/drivers/char/broadcom/vc_sm/vmcs_sm.c +index b6cdc1934ad2092892898559f6f0d481a7744fa9..95963ffba51afdbdfec26a8c75eec0f5e0c2f4e1 100644 +--- a/drivers/char/broadcom/vc_sm/vmcs_sm.c ++++ b/drivers/char/broadcom/vc_sm/vmcs_sm.c +@@ -278,8 +278,8 @@ static unsigned int vmcs_sm_vc_handle_from_pid_and_address(unsigned int pid, + list_for_each_entry(map, &sm_state->map_list, map_list) { + if (map->res_pid != pid) + continue; +- if (!(map->res_addr <= addr && +- addr < map->res_addr + map->resource->res_size)) ++ if (addr < map->res_addr || ++ addr >= (map->res_addr + map->resource->res_size)) + continue; + + pr_debug("[%s]: global map %p (pid %u, addr %lx) -> vc-hdl %x (usr-hdl %x)\n", +@@ -1263,7 +1263,7 @@ static int clean_invalid_mem_2d(const void __user *addr, + size_t i; + void (*op_fn)(const void*, const void*); + +- if (block_size <= 0) { ++ if (!block_size) { + pr_err("[%s]: size cannot be 0\n", __func__); + return -EINVAL; + } + +From fc3017545e5eeda9213ea5be6ffa22a248a5cf4a Mon Sep 17 00:00:00 2001 +From: Sugizaki Yukimasa +Date: Mon, 8 Jan 2018 21:11:23 +0900 +Subject: [PATCH 166/201] vcsm: Fix memory leaking on clean_invalid2 ioctl + handler + +Signed-off-by: Sugizaki Yukimasa +--- + drivers/char/broadcom/vc_sm/vmcs_sm.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/char/broadcom/vc_sm/vmcs_sm.c b/drivers/char/broadcom/vc_sm/vmcs_sm.c +index 95963ffba51afdbdfec26a8c75eec0f5e0c2f4e1..380437f41cc64902c9576e53d0beaf76ccdc1551 100644 +--- a/drivers/char/broadcom/vc_sm/vmcs_sm.c ++++ b/drivers/char/broadcom/vc_sm/vmcs_sm.c +@@ -2990,7 +2990,7 @@ static long vc_sm_ioctl(struct file *file, unsigned int cmd, unsigned long arg) + op->block_count, op->block_size, + op->inter_block_stride, op->invalidate_mode); + if (ret) +- goto out; ++ break; + } + kfree(block); + } + +From 4639822b5395adf37dfbbc462bdb0c3d40608339 Mon Sep 17 00:00:00 2001 +From: Sugizaki Yukimasa +Date: Mon, 8 Jan 2018 21:15:13 +0900 +Subject: [PATCH 167/201] vcsm: Describe the use of cache operation constants + +Signed-off-by: Sugizaki Yukimasa +--- + include/linux/broadcom/vmcs_sm_ioctl.h | 13 ++++++++----- + 1 file changed, 8 insertions(+), 5 deletions(-) + +diff --git a/include/linux/broadcom/vmcs_sm_ioctl.h b/include/linux/broadcom/vmcs_sm_ioctl.h +index ddbeebc71ada82e88a1668fbdfd9821a39d7cd22..e881fa8ee8e1474cdaa0759b742a5f67c122c9eb 100644 +--- a/include/linux/broadcom/vmcs_sm_ioctl.h ++++ b/include/linux/broadcom/vmcs_sm_ioctl.h +@@ -79,11 +79,6 @@ enum vmcs_sm_cache_e { + VMCS_SM_CACHE_BOTH, + }; + +-/* Cache functions */ +-#define VCSM_CACHE_OP_INV 0x01 +-#define VCSM_CACHE_OP_CLEAN 0x02 +-#define VCSM_CACHE_OP_FLUSH 0x03 +- + /* IOCTL Data structures */ + struct vmcs_sm_ioctl_alloc { + /* user -> kernel */ +@@ -173,6 +168,14 @@ struct vmcs_sm_ioctl_cache { + unsigned int size; + }; + ++/* ++ * Cache functions to be set to struct vmcs_sm_ioctl_clean_invalid cmd and ++ * vmcs_sm_ioctl_clean_invalid2 invalidate_mode. ++ */ ++#define VCSM_CACHE_OP_INV 0x01 ++#define VCSM_CACHE_OP_CLEAN 0x02 ++#define VCSM_CACHE_OP_FLUSH 0x03 ++ + struct vmcs_sm_ioctl_clean_invalid { + /* user -> kernel */ + struct { + +From dc8f13b3910d196183b29cb20f2632b169e40ba8 Mon Sep 17 00:00:00 2001 +From: Sugizaki Yukimasa +Date: Tue, 9 Jan 2018 12:33:24 +0900 +Subject: [PATCH 168/201] vcsm: Fix obscure conditions again + +Signed-off-by: Sugizaki Yukimasa +--- + drivers/char/broadcom/vc_sm/vmcs_sm.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/char/broadcom/vc_sm/vmcs_sm.c b/drivers/char/broadcom/vc_sm/vmcs_sm.c +index 380437f41cc64902c9576e53d0beaf76ccdc1551..0d14c511da2ab8f542d51ad87746be854d5180dc 100644 +--- a/drivers/char/broadcom/vc_sm/vmcs_sm.c ++++ b/drivers/char/broadcom/vc_sm/vmcs_sm.c +@@ -331,8 +331,8 @@ static unsigned int vmcs_sm_usr_handle_from_pid_and_address(unsigned int pid, + list_for_each_entry(map, &sm_state->map_list, map_list) { + if (map->res_pid != pid) + continue; +- if (!(map->res_addr <= addr && +- addr < map->res_addr + map->resource->res_size)) ++ if (addr < map->res_addr || ++ addr >= (map->res_addr + map->resource->res_size)) + continue; + + pr_debug("[%s]: global map %p (pid %u, addr %lx) -> usr-hdl %x (vc-hdl %x)\n", + +From cc8c97c4dcef600ec8c5f720e8c707a9169b5234 Mon Sep 17 00:00:00 2001 +From: Sugizaki Yukimasa +Date: Wed, 10 Jan 2018 04:32:20 +0900 +Subject: [PATCH 169/201] vcsm: Add no-op cache operation constant + +Signed-off-by: Sugizaki Yukimasa +--- + drivers/char/broadcom/vc_sm/vmcs_sm.c | 10 ++++++++++ + include/linux/broadcom/vmcs_sm_ioctl.h | 1 + + 2 files changed, 11 insertions(+) + +diff --git a/drivers/char/broadcom/vc_sm/vmcs_sm.c b/drivers/char/broadcom/vc_sm/vmcs_sm.c +index 0d14c511da2ab8f542d51ad87746be854d5180dc..122ea149790b549aa7550ddb9cff64dc2195fc61 100644 +--- a/drivers/char/broadcom/vc_sm/vmcs_sm.c ++++ b/drivers/char/broadcom/vc_sm/vmcs_sm.c +@@ -1269,6 +1269,8 @@ static int clean_invalid_mem_2d(const void __user *addr, + } + + switch (cache_op) { ++ case VCSM_CACHE_OP_NOP: ++ return 0; + case VCSM_CACHE_OP_INV: + op_fn = dmac_inv_range; + break; +@@ -1312,6 +1314,8 @@ static int clean_invalid_resource(const void __user *addr, const size_t size, + return 0; + + switch (cache_op) { ++ case VCSM_CACHE_OP_NOP: ++ return 0; + case VCSM_CACHE_OP_INV: + stat_attempt = INVALID; + stat_failure = INVALID_FAIL; +@@ -2936,6 +2940,9 @@ static long vc_sm_ioctl(struct file *file, unsigned int cmd, unsigned long arg) + goto out; + } + for (i = 0; i < sizeof(ioparam.s) / sizeof(*ioparam.s); i++) { ++ if (ioparam.s[i].cmd == VCSM_CACHE_OP_NOP) ++ break; ++ + /* Locate resource from GUID. */ + resource = + vmcs_sm_acquire_resource(file_data, ioparam.s[i].handle); +@@ -2989,6 +2996,9 @@ static long vc_sm_ioctl(struct file *file, unsigned int cmd, unsigned long arg) + ret = clean_invalid_mem_2d((void __user*) op->start_address, + op->block_count, op->block_size, + op->inter_block_stride, op->invalidate_mode); ++ if (op->invalidate_mode == VCSM_CACHE_OP_NOP) ++ continue; ++ + if (ret) + break; + } +diff --git a/include/linux/broadcom/vmcs_sm_ioctl.h b/include/linux/broadcom/vmcs_sm_ioctl.h +index e881fa8ee8e1474cdaa0759b742a5f67c122c9eb..a4492b921b48e2c7fdd2745f2d2bad4846a15cdc 100644 +--- a/include/linux/broadcom/vmcs_sm_ioctl.h ++++ b/include/linux/broadcom/vmcs_sm_ioctl.h +@@ -172,6 +172,7 @@ struct vmcs_sm_ioctl_cache { + * Cache functions to be set to struct vmcs_sm_ioctl_clean_invalid cmd and + * vmcs_sm_ioctl_clean_invalid2 invalidate_mode. + */ ++#define VCSM_CACHE_OP_NOP 0x00 + #define VCSM_CACHE_OP_INV 0x01 + #define VCSM_CACHE_OP_CLEAN 0x02 + #define VCSM_CACHE_OP_FLUSH 0x03 + +From a12ca58115215b97d90d315a3132176d5c30c4df Mon Sep 17 00:00:00 2001 +From: Sugizaki Yukimasa +Date: Wed, 10 Jan 2018 06:25:51 +0900 +Subject: [PATCH 170/201] vcsm: Revert to do page-table-walk-based cache + manipulating on some ioctl calls + +On FLUSH, INVALID, CLEAN_INVALID ioctl calls, cache operations based on +page table walk were used in case that the buffer of the cache is not +pinned. So reverted to do page-table-based cache manipulating. + +Signed-off-by: Sugizaki Yukimasa +--- + drivers/char/broadcom/vc_sm/vmcs_sm.c | 141 ++++++++++++++++++++++++++-------- + 1 file changed, 110 insertions(+), 31 deletions(-) + +diff --git a/drivers/char/broadcom/vc_sm/vmcs_sm.c b/drivers/char/broadcom/vc_sm/vmcs_sm.c +index 122ea149790b549aa7550ddb9cff64dc2195fc61..1bc37ee882255c0d05beac58bb3b9e31c62e9e42 100644 +--- a/drivers/char/broadcom/vc_sm/vmcs_sm.c ++++ b/drivers/char/broadcom/vc_sm/vmcs_sm.c +@@ -1256,7 +1256,33 @@ static const struct vm_operations_struct vcsm_vm_ops = { + .fault = vcsm_vma_fault, + }; + +-static int clean_invalid_mem_2d(const void __user *addr, ++/* Converts VCSM_CACHE_OP_* to an operating function. */ ++static void (*cache_op_to_func(const unsigned cache_op)) ++ (const void*, const void*) ++{ ++ switch (cache_op) { ++ case VCSM_CACHE_OP_NOP: ++ return NULL; ++ ++ case VCSM_CACHE_OP_INV: ++ return dmac_inv_range; ++ ++ case VCSM_CACHE_OP_CLEAN: ++ return dmac_clean_range; ++ ++ case VCSM_CACHE_OP_FLUSH: ++ return dmac_flush_range; ++ ++ default: ++ pr_err("[%s]: Invalid cache_op: 0x%08x\n", __func__, cache_op); ++ return NULL; ++ } ++} ++ ++/* ++ * Clean/invalid/flush cache of which buffer is already pinned (i.e. accessed). ++ */ ++static int clean_invalid_contiguous_mem_2d(const void __user *addr, + const size_t block_count, const size_t block_size, const size_t stride, + const unsigned cache_op) + { +@@ -1268,22 +1294,9 @@ static int clean_invalid_mem_2d(const void __user *addr, + return -EINVAL; + } + +- switch (cache_op) { +- case VCSM_CACHE_OP_NOP: +- return 0; +- case VCSM_CACHE_OP_INV: +- op_fn = dmac_inv_range; +- break; +- case VCSM_CACHE_OP_CLEAN: +- op_fn = dmac_clean_range; +- break; +- case VCSM_CACHE_OP_FLUSH: +- op_fn = dmac_flush_range; +- break; +- default: +- pr_err("[%s]: Invalid cache_op: 0x%08x\n", __func__, cache_op); ++ op_fn = cache_op_to_func(cache_op); ++ if (op_fn == NULL) + return -EINVAL; +- } + + for (i = 0; i < block_count; i ++, addr += stride) + op_fn(addr, addr + block_size); +@@ -1291,14 +1304,73 @@ static int clean_invalid_mem_2d(const void __user *addr, + return 0; + } + +-static int clean_invalid_mem(const void __user *addr, const size_t size, ++/* Clean/invalid/flush cache of which buffer may be non-pinned. */ ++/* The caller must lock current->mm->mmap_sem for read. */ ++static int clean_invalid_mem_walk(unsigned long addr, const size_t size, + const unsigned cache_op) + { +- return clean_invalid_mem_2d(addr, 1, size, 0, cache_op); ++ pgd_t *pgd; ++ pud_t *pud; ++ pmd_t *pmd; ++ pte_t *pte; ++ unsigned long pgd_next, pud_next, pmd_next; ++ const unsigned long end = ALIGN(addr + size, PAGE_SIZE); ++ void (*op_fn)(const void*, const void*); ++ ++ addr &= PAGE_MASK; ++ ++ if (addr >= end) ++ return 0; ++ ++ op_fn = cache_op_to_func(cache_op); ++ if (op_fn == NULL) ++ return -EINVAL; ++ ++ /* Walk PGD */ ++ pgd = pgd_offset(current->mm, addr); ++ do { ++ pgd_next = pgd_addr_end(addr, end); ++ ++ if (pgd_none(*pgd) || pgd_bad(*pgd)) ++ continue; ++ ++ /* Walk PUD */ ++ pud = pud_offset(pgd, addr); ++ do { ++ pud_next = pud_addr_end(addr, pgd_next); ++ if (pud_none(*pud) || pud_bad(*pud)) ++ continue; ++ ++ /* Walk PMD */ ++ pmd = pmd_offset(pud, addr); ++ do { ++ pmd_next = pmd_addr_end(addr, pud_next); ++ if (pmd_none(*pmd) || pmd_bad(*pmd)) ++ continue; ++ ++ /* Walk PTE */ ++ pte = pte_offset_map(pmd, addr); ++ do { ++ if (pte_none(*pte) || !pte_present(*pte)) ++ continue; ++ ++ op_fn((const void __user*) addr, ++ (const void __user*) (addr + PAGE_SIZE)); ++ } while (pte++, addr += PAGE_SIZE, addr != pmd_next); ++ pte_unmap(pte); ++ ++ } while (pmd++, addr = pmd_next, addr != pud_next); ++ ++ } while (pud++, addr = pud_next, addr != pgd_next); ++ ++ } while (pgd++, addr = pgd_next, addr != end); ++ ++ return 0; + } + +-static int clean_invalid_resource(const void __user *addr, const size_t size, +- const unsigned cache_op, const int usr_hdl, ++/* Clean/invalid/flush cache of buffer in resource */ ++static int clean_invalid_resource_walk(const void __user *addr, ++ const size_t size, const unsigned cache_op, const int usr_hdl, + struct sm_resource_t *resource) + { + int err; +@@ -1355,7 +1427,10 @@ static int clean_invalid_resource(const void __user *addr, const size_t size, + return -EFAULT; + } + +- err = clean_invalid_mem(addr, size, cache_op); ++ down_read(¤t->mm->mmap_sem); ++ err = clean_invalid_mem_walk((unsigned long) addr, size, cache_op); ++ up_read(¤t->mm->mmap_sem); ++ + if (err) + resource->res_stats[stat_failure]++; + +@@ -2004,7 +2079,7 @@ static int vc_sm_ioctl_unlock(struct sm_priv_data_t *private, + const unsigned long start = map->vma->vm_start; + const unsigned long end = map->vma->vm_end; + +- ret = clean_invalid_mem((void __user*) start, end - start, ++ ret = clean_invalid_mem_walk(start, end - start, + VCSM_CACHE_OP_FLUSH); + if (ret) + goto error; +@@ -2886,7 +2961,7 @@ static long vc_sm_ioctl(struct file *file, unsigned int cmd, unsigned long arg) + goto out; + } + +- ret = clean_invalid_resource((void __user*) ioparam.addr, ++ ret = clean_invalid_resource_walk((void __user*) ioparam.addr, + ioparam.size, VCSM_CACHE_OP_FLUSH, ioparam.handle, + resource); + vmcs_sm_release_resource(resource, 0); +@@ -2917,7 +2992,7 @@ static long vc_sm_ioctl(struct file *file, unsigned int cmd, unsigned long arg) + goto out; + } + +- ret = clean_invalid_resource((void __user*) ioparam.addr, ++ ret = clean_invalid_resource_walk((void __user*) ioparam.addr, + ioparam.size, VCSM_CACHE_OP_INV, ioparam.handle, resource); + vmcs_sm_release_resource(resource, 0); + if (ret) +@@ -2951,16 +3026,19 @@ static long vc_sm_ioctl(struct file *file, unsigned int cmd, unsigned long arg) + goto out; + } + +- ret = clean_invalid_resource((void __user*) ioparam.s[i].addr, +- ioparam.s[i].size, ioparam.s[i].cmd, +- ioparam.s[i].handle, resource); ++ ret = clean_invalid_resource_walk( ++ (void __user*) ioparam.s[i].addr, ioparam.s[i].size, ++ ioparam.s[i].cmd, ioparam.s[i].handle, resource); + vmcs_sm_release_resource(resource, 0); + if (ret) + goto out; + } + } + break; +- /* Flush/Invalidate the cache for a given mapping. */ ++ /* ++ * Flush/Invalidate the cache for a given mapping. ++ * Blocks must be pinned (i.e. accessed) before this call. ++ */ + case VMCS_SM_CMD_CLEAN_INVALID2: + { + int i; +@@ -2993,12 +3071,13 @@ static long vc_sm_ioctl(struct file *file, unsigned int cmd, unsigned long arg) + for (i = 0; i < ioparam.op_count; i++) { + const struct vmcs_sm_ioctl_clean_invalid_block * const op = block + i; + +- ret = clean_invalid_mem_2d((void __user*) op->start_address, +- op->block_count, op->block_size, +- op->inter_block_stride, op->invalidate_mode); + if (op->invalidate_mode == VCSM_CACHE_OP_NOP) + continue; + ++ ret = clean_invalid_contiguous_mem_2d( ++ (void __user*) op->start_address, op->block_count, ++ op->block_size, op->inter_block_stride, ++ op->invalidate_mode); + if (ret) + break; + } + +From ddb358bb53765d3ca2c6a88f5e0afea2e3b670d9 Mon Sep 17 00:00:00 2001 +From: Aaron Shaw +Date: Thu, 4 Jan 2018 15:02:16 +0000 +Subject: [PATCH 171/201] add gpio-key overlay (#2329) + +An overlay that allows a Linux key to be bound to a GPIO. +--- + arch/arm/boot/dts/overlays/Makefile | 1 + + arch/arm/boot/dts/overlays/README | 21 +++++++++++ + arch/arm/boot/dts/overlays/gpio-key-overlay.dts | 48 +++++++++++++++++++++++++ + 3 files changed, 70 insertions(+) + create mode 100644 arch/arm/boot/dts/overlays/gpio-key-overlay.dts + +diff --git a/arch/arm/boot/dts/overlays/Makefile b/arch/arm/boot/dts/overlays/Makefile +index 7aa703e938c0bb1d5659052f6899d0a6d3be5a4c..05661168a7bf9acc9cd02881f3ee51644b3c27da 100644 +--- a/arch/arm/boot/dts/overlays/Makefile ++++ b/arch/arm/boot/dts/overlays/Makefile +@@ -31,6 +31,7 @@ dtbo-$(CONFIG_ARCH_BCM2835) += \ + googlevoicehat-soundcard.dtbo \ + gpio-ir.dtbo \ + gpio-ir-tx.dtbo \ ++ gpio-key.dtbo \ + gpio-poweroff.dtbo \ + gpio-shutdown.dtbo \ + hifiberry-amp.dtbo \ +diff --git a/arch/arm/boot/dts/overlays/README b/arch/arm/boot/dts/overlays/README +index b8a2f3fdf73299346482c9e7d2a1133a73fe93ba..2ad2397348e8fdfc43b8bf9772258e2ff25fefd8 100644 +--- a/arch/arm/boot/dts/overlays/README ++++ b/arch/arm/boot/dts/overlays/README +@@ -515,6 +515,27 @@ Params: gpio_pin Output GPIO (default 18) + Default is "0" (active-high). + + ++Name: gpio-key ++Info: This is a generic overlay for activating GPIO keypresses using ++ the gpio-keys library and this dtoverlay. Multiple keys can be ++ set up using multiple calls to the overlay for configuring ++ additional buttons or joysticks. You can see available keycodes ++ at https://github.com/torvalds/linux/blob/v4.12/include/uapi/ ++ linux/input-event-codes.h#L64 ++Load: dtoverlay=gpio-key,= ++Params: gpio GPIO pin to trigger on (default 3) ++ active_low When this is 1 (active low), a falling ++ edge generates a key down event and a ++ rising edge generates a key up event. ++ When this is 0 (active high), this is ++ reversed. The default is 1 (active low) ++ gpio_pull Desired pull-up/down state (off, down, up) ++ Default is "up". Note that the default pin ++ (GPIO3) has an external pullup ++ label Set a label for the key ++ keycode Set the key code for the button ++ ++ + Name: gpio-poweroff + Info: Drives a GPIO high or low on poweroff (including halt). Enabling this + overlay will prevent the ability to boot by driving GPIO3 low. +diff --git a/arch/arm/boot/dts/overlays/gpio-key-overlay.dts b/arch/arm/boot/dts/overlays/gpio-key-overlay.dts +new file mode 100644 +index 0000000000000000000000000000000000000000..333d016d6f02981f69acedbf683171b4261ed803 +--- /dev/null ++++ b/arch/arm/boot/dts/overlays/gpio-key-overlay.dts +@@ -0,0 +1,48 @@ ++// Definitions for gpio-key module ++/dts-v1/; ++/plugin/; ++ ++/ { ++ compatible = "brcm,bcm2708"; ++ ++ fragment@0 { ++ // Configure the gpio pin controller ++ target = <&gpio>; ++ __overlay__ { ++ pin_state: button_pins@0 { ++ brcm,pins = <3>; // gpio number ++ brcm,function = <0>; // 0 = input, 1 = output ++ brcm,pull = <2>; // 0 = none, 1 = pull down, 2 = pull up ++ }; ++ }; ++ }; ++ fragment@1 { ++ target-path = "/"; ++ __overlay__ { ++ button: button@0 { ++ compatible = "gpio-keys"; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pin_state>; ++ status = "okay"; ++ ++ key: key { ++ linux,code = <116>; ++ gpios = <&gpio 3 1>; ++ label = "KEY_POWER"; ++ }; ++ }; ++ }; ++ }; ++ ++ __overrides__ { ++ gpio = <&key>,"gpios:4", ++ <&button>,"reg:0", ++ <&pin_state>,"brcm,pins:0", ++ <&pin_state>,"reg:0"; ++ label = <&key>,"label"; ++ keycode = <&key>,"linux,code:0"; ++ gpio_pull = <&pin_state>,"brcm,pull:0"; ++ active_low = <&key>,"gpios:8"; ++ }; ++ ++}; + +From c0f292abf10d876de6eab351ae31fbe21c477597 Mon Sep 17 00:00:00 2001 +From: Aaron Shaw +Date: Fri, 5 Jan 2018 15:08:37 +0000 +Subject: [PATCH 172/201] add additional overrides to rotary-encoder overlay + (#2334) + +--- + arch/arm/boot/dts/overlays/README | 23 ++++++++++++++++++++++ + .../boot/dts/overlays/rotary-encoder-overlay.dts | 18 ++++++++++++----- + 2 files changed, 36 insertions(+), 5 deletions(-) + +diff --git a/arch/arm/boot/dts/overlays/README b/arch/arm/boot/dts/overlays/README +index 2ad2397348e8fdfc43b8bf9772258e2ff25fefd8..e90c32066b0e6da981b182d4a14f0cddee5f4af2 100644 +--- a/arch/arm/boot/dts/overlays/README ++++ b/arch/arm/boot/dts/overlays/README +@@ -1331,6 +1331,29 @@ Params: rotary0_pin_a GPIO connected to rotary encoder channel A + (default 4). + rotary0_pin_b GPIO connected to rotary encoder channel B + (default 17). ++ relative_axis register a relative axis rather than an ++ absolute one. Relative axis will only ++ generate +1/-1 events on the input device, ++ hence no steps need to be passed. ++ linux_axis the input subsystem axis to map to this ++ rotary encoder. Defaults to 0 (ABS_X / REL_X) ++ rollover Automatic rollover when the rotary value ++ becomes greater than the specified steps or ++ smaller than 0. For absolute axis only. ++ steps-per-period Number of steps (stable states) per period. ++ The values have the following meaning: ++ 1: Full-period mode (default) ++ 2: Half-period mode ++ 4: Quarter-period mode ++ steps Number of steps in a full turnaround of the ++ encoder. Only relevant for absolute axis. ++ Defaults to 24 which is a typical value for ++ such devices. ++ wakeup Boolean, rotary encoder can wake up the ++ system. ++ encoding String, the method used to encode steps. ++ Supported are "gray" (the default and more ++ common) and "binary". + + + Name: rpi-backlight +diff --git a/arch/arm/boot/dts/overlays/rotary-encoder-overlay.dts b/arch/arm/boot/dts/overlays/rotary-encoder-overlay.dts +index c0c6bccff60cc15d9a9bf59d2c7cba41eb9c1cdc..f88f8a39d9a2f2afbf80edf2d9b328410feebaca 100644 +--- a/arch/arm/boot/dts/overlays/rotary-encoder-overlay.dts ++++ b/arch/arm/boot/dts/overlays/rotary-encoder-overlay.dts +@@ -28,16 +28,24 @@ + gpios = <&gpio 4 0>, <&gpio 17 0>; + linux,axis = <0>; /* REL_X */ + rotary-encoder,encoding = "gray"; +- rotary-encoder,relative-axis; ++ rotary-encoder,steps = <24>; /* 24 default */ ++ rotary-encoder,steps-per-period = <1>; /* corresponds to full period mode. See README */ + }; + }; + + }; + + __overrides__ { +- rotary0_pin_a = <&rotary0>,"gpios:4", +- <&rotary0_pins>,"brcm,pins:0"; +- rotary0_pin_b = <&rotary0>,"gpios:16", +- <&rotary0_pins>,"brcm,pins:4"; ++ rotary0_pin_a = <&rotary0>,"gpios:4", ++ <&rotary0_pins>,"brcm,pins:0"; ++ rotary0_pin_b = <&rotary0>,"gpios:16", ++ <&rotary0_pins>,"brcm,pins:4"; ++ relative_axis = <&rotary0>,"rotary-encoder,relative-axis?"; ++ linux_axis = <&rotary0>,"linux,axis:0"; ++ rollover = <&rotary0>,"rotary-encoder,rollover?"; ++ steps-per-period = <&rotary0>,"rotary-encoder,steps-per-period:0"; ++ steps = <&rotary0>,"rotary-encoder,steps:0"; ++ wakeup = <&rotary0>,"wakeup-source?"; ++ encoding = <&rotary0>,"rotary-encoder,encoding"; + }; + }; + +From 775be202cf30f32b086f9bb64b120ba38c687e2e Mon Sep 17 00:00:00 2001 +From: Phil Elwell +Date: Fri, 12 Jan 2018 09:15:01 +0000 +Subject: [PATCH 173/201] overlays: Add uart0 overlay to change pin usage + +Signed-off-by: Phil Elwell +--- + arch/arm/boot/dts/overlays/Makefile | 1 + + arch/arm/boot/dts/overlays/README | 13 ++++++++++- + arch/arm/boot/dts/overlays/uart0-overlay.dts | 32 ++++++++++++++++++++++++++++ + 3 files changed, 45 insertions(+), 1 deletion(-) + create mode 100755 arch/arm/boot/dts/overlays/uart0-overlay.dts + +diff --git a/arch/arm/boot/dts/overlays/Makefile b/arch/arm/boot/dts/overlays/Makefile +index 05661168a7bf9acc9cd02881f3ee51644b3c27da..36db27e205cc3ff33cb49bb6357af9060be8eb17 100644 +--- a/arch/arm/boot/dts/overlays/Makefile ++++ b/arch/arm/boot/dts/overlays/Makefile +@@ -117,6 +117,7 @@ dtbo-$(CONFIG_ARCH_BCM2835) += \ + spi2-2cs.dtbo \ + spi2-3cs.dtbo \ + tinylcd35.dtbo \ ++ uart0.dtbo \ + uart1.dtbo \ + vc4-fkms-v3d.dtbo \ + vc4-kms-v3d.dtbo \ +diff --git a/arch/arm/boot/dts/overlays/README b/arch/arm/boot/dts/overlays/README +index e90c32066b0e6da981b182d4a14f0cddee5f4af2..f0a49892c57523a899c770b1e776e35b245b3ab2 100644 +--- a/arch/arm/boot/dts/overlays/README ++++ b/arch/arm/boot/dts/overlays/README +@@ -1671,8 +1671,19 @@ Params: speed Display SPI bus speed + dtoverlay=tinylcd35,touch,touchgpio=3 + + ++Name: uart0 ++Info: Change the pin usage of uart0 ++Load: dtoverlay=uart0,= ++Params: txd0_pin GPIO pin for TXD0 (14, 32 or 36 - default 14) ++ ++ rxd0_pin GPIO pin for RXD0 (15, 33 or 37 - default 15) ++ ++ pin_func Alternative pin function - 4(Alt0) for 14&15, ++ 7(Alt3) for 32&33, 6(Alt2) for 36&37 ++ ++ + Name: uart1 +-Info: Enable uart1 in place of uart0 ++Info: Change the pin usage of uart1 + Load: dtoverlay=uart1,= + Params: txd1_pin GPIO pin for TXD1 (14, 32 or 40 - default 14) + +diff --git a/arch/arm/boot/dts/overlays/uart0-overlay.dts b/arch/arm/boot/dts/overlays/uart0-overlay.dts +new file mode 100755 +index 0000000000000000000000000000000000000000..20b2a609c511b017d1231e08c901d165a901d940 +--- /dev/null ++++ b/arch/arm/boot/dts/overlays/uart0-overlay.dts +@@ -0,0 +1,32 @@ ++/dts-v1/; ++/plugin/; ++ ++/{ ++ compatible = "brcm,bcm2708"; ++ ++ fragment@0 { ++ target = <&uart0>; ++ __overlay__ { ++ pinctrl-names = "default"; ++ pinctrl-0 = <&uart0_pins>; ++ status = "okay"; ++ }; ++ }; ++ ++ fragment@1 { ++ target = <&gpio>; ++ __overlay__ { ++ uart0_pins: uart0_pins { ++ brcm,pins = <14 15>; ++ brcm,function = <4>; /* alt0 */ ++ brcm,pull = <0 2>; ++ }; ++ }; ++ }; ++ ++ __overrides__ { ++ txd0_pin = <&uart0_pins>,"brcm,pins:0"; ++ rxd0_pin = <&uart0_pins>,"brcm,pins:4"; ++ pin_func = <&uart0_pins>,"brcm,function:0"; ++ }; ++}; + +From b51e64e9ee6e723cc38a2e0b24751745ed8954b4 Mon Sep 17 00:00:00 2001 +From: popcornmix +Date: Wed, 17 Jan 2018 13:54:41 +0000 +Subject: [PATCH 174/201] Revert "softirq: Let ksoftirqd do its job" + +This reverts commit 4cd13c21b207e80ddb1144c576500098f2d5f882. +--- + kernel/softirq.c | 16 +--------------- + 1 file changed, 1 insertion(+), 15 deletions(-) + +diff --git a/kernel/softirq.c b/kernel/softirq.c +index 4e09821f9d9e8b5815037bd469110e2618abb7f6..58bb6f6359f4ea3fa46008060a1c9cbd12c89e25 100644 +--- a/kernel/softirq.c ++++ b/kernel/softirq.c +@@ -77,17 +77,6 @@ static void wakeup_softirqd(void) + wake_up_process(tsk); + } + +-/* +- * If ksoftirqd is scheduled, we do not want to process pending softirqs +- * right now. Let ksoftirqd handle this at its own rate, to get fairness. +- */ +-static bool ksoftirqd_running(void) +-{ +- struct task_struct *tsk = __this_cpu_read(ksoftirqd); +- +- return tsk && (tsk->state == TASK_RUNNING); +-} +- + /* + * preempt_count and SOFTIRQ_OFFSET usage: + * - preempt_count is changed by SOFTIRQ_OFFSET on entering or leaving +@@ -324,7 +313,7 @@ asmlinkage __visible void do_softirq(void) + + pending = local_softirq_pending(); + +- if (pending && !ksoftirqd_running()) ++ if (pending) + do_softirq_own_stack(); + + local_irq_restore(flags); +@@ -351,9 +340,6 @@ void irq_enter(void) + + static inline void invoke_softirq(void) + { +- if (ksoftirqd_running()) +- return; +- + if (!force_irqthreads) { + #ifdef CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK + /* + +From 36db437449567b828e0e19e460a9f45f8a57fe99 Mon Sep 17 00:00:00 2001 +From: Phil Elwell +Date: Tue, 16 Jan 2018 12:59:17 +0000 +Subject: [PATCH 175/201] overlays: Fix resetgpio and ledgpio for hy28a/b + +Offsets for overlay parameters are specified in bytes, not in access +units. + +See: https://github.com/raspberrypi/linux/issues/2344 + +Signed-off-by: Phil Elwell +--- + arch/arm/boot/dts/overlays/hy28a-overlay.dts | 4 ++-- + arch/arm/boot/dts/overlays/hy28b-overlay.dts | 4 ++-- + 2 files changed, 4 insertions(+), 4 deletions(-) + +diff --git a/arch/arm/boot/dts/overlays/hy28a-overlay.dts b/arch/arm/boot/dts/overlays/hy28a-overlay.dts +index ac0f3c28ea855a620dc6a3385d9d15009f26358d..d7625a6372f512b27976011f4af42337f243b6bb 100644 +--- a/arch/arm/boot/dts/overlays/hy28a-overlay.dts ++++ b/arch/arm/boot/dts/overlays/hy28a-overlay.dts +@@ -86,8 +86,8 @@ + debug = <&hy28a>,"debug:0"; + xohms = <&hy28a_ts>,"ti,x-plate-ohms;0"; + resetgpio = <&hy28a>,"reset-gpios:4", +- <&hy28a_pins>, "brcm,pins:1"; ++ <&hy28a_pins>, "brcm,pins:4"; + ledgpio = <&hy28a>,"led-gpios:4", +- <&hy28a_pins>, "brcm,pins:2"; ++ <&hy28a_pins>, "brcm,pins:8"; + }; + }; +diff --git a/arch/arm/boot/dts/overlays/hy28b-overlay.dts b/arch/arm/boot/dts/overlays/hy28b-overlay.dts +index 8018aebde8e557f45ffd63eb86f6c7a1048fe3cb..70c1118064b64be1811ed2f1bb04efd6b34f0a10 100644 +--- a/arch/arm/boot/dts/overlays/hy28b-overlay.dts ++++ b/arch/arm/boot/dts/overlays/hy28b-overlay.dts +@@ -141,8 +141,8 @@ + debug = <&hy28b>,"debug:0"; + xohms = <&hy28b_ts>,"ti,x-plate-ohms;0"; + resetgpio = <&hy28b>,"reset-gpios:4", +- <&hy28b_pins>, "brcm,pins:1"; ++ <&hy28b_pins>, "brcm,pins:4"; + ledgpio = <&hy28b>,"led-gpios:4", +- <&hy28b_pins>, "brcm,pins:2"; ++ <&hy28b_pins>, "brcm,pins:8"; + }; + }; + +From 803e3c3b090dafdc3b17c3454ebce9ffc329ff61 Mon Sep 17 00:00:00 2001 +From: Matthias Reichl +Date: Thu, 18 Jan 2018 12:36:44 +0100 +Subject: [PATCH 176/201] ASoC: bcm2835: fix hw_params error when device is in + prepared state (#2345) + +commit 8d5737a5f53902a916ee1e1cb248c9b8b883b2ea upstream. + +If bcm2835 is configured as bitclock master calling hw_params() +after prepare() fails with EBUSY. This also makes it impossible to +use bcm2835 in full duplex mode. + +The error is caused by the split clock setup: clk_set_rate +is called in hw_params, clk_prepare_enable in prepare. As hw_params +doesn't check if the clock was already enabled clk_set_rate +fails with EBUSY. + +Fix this by moving clock startup from prepare to hw_params and +let hw_params properly deal with an already set up or enabled +clock. + +Signed-off-by: Matthias Reichl +--- + sound/soc/bcm/bcm2835-i2s.c | 20 ++++++++++++++------ + 1 file changed, 14 insertions(+), 6 deletions(-) + +diff --git a/sound/soc/bcm/bcm2835-i2s.c b/sound/soc/bcm/bcm2835-i2s.c +index 2e449d7173fcecbcd647f90a26bd58b6c421bcde..d5f73a8ab8932768c4df1470e94e78bff98d7787 100644 +--- a/sound/soc/bcm/bcm2835-i2s.c ++++ b/sound/soc/bcm/bcm2835-i2s.c +@@ -130,6 +130,7 @@ struct bcm2835_i2s_dev { + struct regmap *i2s_regmap; + struct clk *clk; + bool clk_prepared; ++ int clk_rate; + }; + + static void bcm2835_i2s_start_clock(struct bcm2835_i2s_dev *dev) +@@ -419,10 +420,19 @@ static int bcm2835_i2s_hw_params(struct snd_pcm_substream *substream, + } + + /* Clock should only be set up here if CPU is clock master */ +- if (bit_clock_master) { +- ret = clk_set_rate(dev->clk, bclk_rate); +- if (ret) +- return ret; ++ if (bit_clock_master && ++ (!dev->clk_prepared || dev->clk_rate != bclk_rate)) { ++ if (dev->clk_prepared) ++ bcm2835_i2s_stop_clock(dev); ++ ++ if (dev->clk_rate != bclk_rate) { ++ ret = clk_set_rate(dev->clk, bclk_rate); ++ if (ret) ++ return ret; ++ dev->clk_rate = bclk_rate; ++ } ++ ++ bcm2835_i2s_start_clock(dev); + } + + /* Setup the frame format */ +@@ -618,8 +628,6 @@ static int bcm2835_i2s_prepare(struct snd_pcm_substream *substream, + struct bcm2835_i2s_dev *dev = snd_soc_dai_get_drvdata(dai); + uint32_t cs_reg; + +- bcm2835_i2s_start_clock(dev); +- + /* + * Clear both FIFOs if the one that should be started + * is not empty at the moment. This should only happen + +From f699a6fbdeb37d160b6ac3acb2f24fd137f8b761 Mon Sep 17 00:00:00 2001 +From: Ahmet Inan +Date: Sat, 14 Oct 2017 10:10:53 -0700 +Subject: [PATCH 177/201] Input: add I2C attached EETI EXC3000 multi touch + driver + +commit 7e577a17f2eefeef32f1106ebf91e7cd143ba654 upstream. +beware: code adapted to use the old timer API. + +The 3000 series have a new protocol which allows to report up to 5 points +in a single 66 byte frame. One must always read in 66 byte frames. +To support up to 10 points, two consecutive frames need to be read: +The first frame says how many points until sync. +The second frame must say zero points or both frames must be discarded. + +To be able to work with the higher 400KHz I2C bus rate, one must +successfully send a special package prior _each_ read or the controller +will refuse to cooperate. + +This is a minimal implementation based on egalax_i2c.c (which can be found +on the internet) and egalax_ts.c but without the vendor interface and no +power management support. + +Signed-off-by: Ahmet Inan +Acked-by: Rob Herring +Signed-off-by: Dmitry Torokhov +--- + .../bindings/input/touchscreen/exc3000.txt | 27 +++ + drivers/input/touchscreen/Kconfig | 10 + + drivers/input/touchscreen/Makefile | 1 + + drivers/input/touchscreen/exc3000.c | 223 +++++++++++++++++++++ + 4 files changed, 261 insertions(+) + create mode 100644 Documentation/devicetree/bindings/input/touchscreen/exc3000.txt + create mode 100644 drivers/input/touchscreen/exc3000.c + +diff --git a/Documentation/devicetree/bindings/input/touchscreen/exc3000.txt b/Documentation/devicetree/bindings/input/touchscreen/exc3000.txt +new file mode 100644 +index 0000000000000000000000000000000000000000..1dcff4a43eaa8dc0091803f46b9c45454dd0660d +--- /dev/null ++++ b/Documentation/devicetree/bindings/input/touchscreen/exc3000.txt +@@ -0,0 +1,27 @@ ++* EETI EXC3000 Multiple Touch Controller ++ ++Required properties: ++- compatible: must be "eeti,exc3000" ++- reg: i2c slave address ++- interrupt-parent: the phandle for the interrupt controller ++- interrupts: touch controller interrupt ++- touchscreen-size-x: See touchscreen.txt ++- touchscreen-size-y: See touchscreen.txt ++ ++Optional properties: ++- touchscreen-inverted-x: See touchscreen.txt ++- touchscreen-inverted-y: See touchscreen.txt ++- touchscreen-swapped-x-y: See touchscreen.txt ++ ++Example: ++ ++ touchscreen@2a { ++ compatible = "eeti,exc3000"; ++ reg = <0x2a>; ++ interrupt-parent = <&gpio1>; ++ interrupts = <9 IRQ_TYPE_LEVEL_LOW>; ++ touchscreen-size-x = <4096>; ++ touchscreen-size-y = <4096>; ++ touchscreen-inverted-x; ++ touchscreen-swapped-x-y; ++ }; +diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig +index c5237087c6024ba5520bf624251473c923fae85a..80c3f6e9fae38c12c2fae4dda55e414b44f16258 100644 +--- a/drivers/input/touchscreen/Kconfig ++++ b/drivers/input/touchscreen/Kconfig +@@ -316,6 +316,16 @@ config TOUCHSCREEN_EGALAX_SERIAL + To compile this driver as a module, choose M here: the + module will be called egalax_ts_serial. + ++config TOUCHSCREEN_EXC3000 ++ tristate "EETI EXC3000 multi-touch panel support" ++ depends on I2C ++ help ++ Say Y here to enable support for I2C connected EETI ++ EXC3000 multi-touch panels. ++ ++ To compile this driver as a module, choose M here: the ++ module will be called exc3000. ++ + config TOUCHSCREEN_FUJITSU + tristate "Fujitsu serial touchscreen" + select SERIO +diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile +index cceb83c867a9da8d9885e8c5dc48831dc21f31c3..12ff1216da2019f694d13c79d6c3e29e1ead0f34 100644 +--- a/drivers/input/touchscreen/Makefile ++++ b/drivers/input/touchscreen/Makefile +@@ -39,6 +39,7 @@ obj-$(CONFIG_TOUCHSCREEN_ELAN) += elants_i2c.o + obj-$(CONFIG_TOUCHSCREEN_ELO) += elo.o + obj-$(CONFIG_TOUCHSCREEN_EGALAX) += egalax_ts.o + obj-$(CONFIG_TOUCHSCREEN_EGALAX_SERIAL) += egalax_ts_serial.o ++obj-$(CONFIG_TOUCHSCREEN_EXC3000) += exc3000.o + obj-$(CONFIG_TOUCHSCREEN_FUJITSU) += fujitsu_ts.o + obj-$(CONFIG_TOUCHSCREEN_GOODIX) += goodix.o + obj-$(CONFIG_TOUCHSCREEN_ILI210X) += ili210x.o +diff --git a/drivers/input/touchscreen/exc3000.c b/drivers/input/touchscreen/exc3000.c +new file mode 100644 +index 0000000000000000000000000000000000000000..bed0db6999050c3ad5adf9c5d02784a000481245 +--- /dev/null ++++ b/drivers/input/touchscreen/exc3000.c +@@ -0,0 +1,223 @@ ++/* ++ * Driver for I2C connected EETI EXC3000 multiple touch controller ++ * ++ * Copyright (C) 2017 Ahmet Inan ++ * ++ * minimal implementation based on egalax_ts.c and egalax_i2c.c ++ * ++ * 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 ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#define EXC3000_NUM_SLOTS 10 ++#define EXC3000_SLOTS_PER_FRAME 5 ++#define EXC3000_LEN_FRAME 66 ++#define EXC3000_LEN_POINT 10 ++#define EXC3000_MT_EVENT 6 ++#define EXC3000_TIMEOUT_MS 100 ++ ++struct exc3000_data { ++ struct i2c_client *client; ++ struct input_dev *input; ++ struct touchscreen_properties prop; ++ struct timer_list timer; ++ u8 buf[2 * EXC3000_LEN_FRAME]; ++}; ++ ++static void exc3000_report_slots(struct input_dev *input, ++ struct touchscreen_properties *prop, ++ const u8 *buf, int num) ++{ ++ for (; num--; buf += EXC3000_LEN_POINT) { ++ if (buf[0] & BIT(0)) { ++ input_mt_slot(input, buf[1]); ++ input_mt_report_slot_state(input, MT_TOOL_FINGER, true); ++ touchscreen_report_pos(input, prop, ++ get_unaligned_le16(buf + 2), ++ get_unaligned_le16(buf + 4), ++ true); ++ } ++ } ++} ++ ++static void exc3000_timer(unsigned long d) ++{ ++ struct exc3000_data *data = (void *)d; ++ ++ input_mt_sync_frame(data->input); ++ input_sync(data->input); ++} ++ ++static int exc3000_read_frame(struct i2c_client *client, u8 *buf) ++{ ++ int ret; ++ ++ ret = i2c_master_send(client, "'", 2); ++ if (ret < 0) ++ return ret; ++ ++ if (ret != 2) ++ return -EIO; ++ ++ ret = i2c_master_recv(client, buf, EXC3000_LEN_FRAME); ++ if (ret < 0) ++ return ret; ++ ++ if (ret != EXC3000_LEN_FRAME) ++ return -EIO; ++ ++ if (get_unaligned_le16(buf) != EXC3000_LEN_FRAME || ++ buf[2] != EXC3000_MT_EVENT) ++ return -EINVAL; ++ ++ return 0; ++} ++ ++static int exc3000_read_data(struct i2c_client *client, ++ u8 *buf, int *n_slots) ++{ ++ int error; ++ ++ error = exc3000_read_frame(client, buf); ++ if (error) ++ return error; ++ ++ *n_slots = buf[3]; ++ if (!*n_slots || *n_slots > EXC3000_NUM_SLOTS) ++ return -EINVAL; ++ ++ if (*n_slots > EXC3000_SLOTS_PER_FRAME) { ++ /* Read 2nd frame to get the rest of the contacts. */ ++ error = exc3000_read_frame(client, buf + EXC3000_LEN_FRAME); ++ if (error) ++ return error; ++ ++ /* 2nd chunk must have number of contacts set to 0. */ ++ if (buf[EXC3000_LEN_FRAME + 3] != 0) ++ return -EINVAL; ++ } ++ ++ return 0; ++} ++ ++static irqreturn_t exc3000_interrupt(int irq, void *dev_id) ++{ ++ struct exc3000_data *data = dev_id; ++ struct input_dev *input = data->input; ++ u8 *buf = data->buf; ++ int slots, total_slots; ++ int error; ++ ++ error = exc3000_read_data(data->client, buf, &total_slots); ++ if (error) { ++ /* Schedule a timer to release "stuck" contacts */ ++ mod_timer(&data->timer, ++ jiffies + msecs_to_jiffies(EXC3000_TIMEOUT_MS)); ++ goto out; ++ } ++ ++ /* ++ * We read full state successfully, no contacts will be "stuck". ++ */ ++ del_timer_sync(&data->timer); ++ ++ while (total_slots > 0) { ++ slots = min(total_slots, EXC3000_SLOTS_PER_FRAME); ++ exc3000_report_slots(input, &data->prop, buf + 4, slots); ++ total_slots -= slots; ++ buf += EXC3000_LEN_FRAME; ++ } ++ ++ input_mt_sync_frame(input); ++ input_sync(input); ++ ++out: ++ return IRQ_HANDLED; ++} ++ ++static int exc3000_probe(struct i2c_client *client, ++ const struct i2c_device_id *id) ++{ ++ struct exc3000_data *data; ++ struct input_dev *input; ++ int error; ++ ++ data = devm_kzalloc(&client->dev, sizeof(*data), GFP_KERNEL); ++ if (!data) ++ return -ENOMEM; ++ ++ data->client = client; ++ setup_timer(&data->timer, exc3000_timer, (unsigned long)data); ++ ++ input = devm_input_allocate_device(&client->dev); ++ if (!input) ++ return -ENOMEM; ++ ++ data->input = input; ++ ++ input->name = "EETI EXC3000 Touch Screen"; ++ input->id.bustype = BUS_I2C; ++ ++ input_set_abs_params(input, ABS_MT_POSITION_X, 0, 4095, 0, 0); ++ input_set_abs_params(input, ABS_MT_POSITION_Y, 0, 4095, 0, 0); ++ touchscreen_parse_properties(input, true, &data->prop); ++ ++ error = input_mt_init_slots(input, EXC3000_NUM_SLOTS, ++ INPUT_MT_DIRECT | INPUT_MT_DROP_UNUSED); ++ if (error) ++ return error; ++ ++ error = input_register_device(input); ++ if (error) ++ return error; ++ ++ error = devm_request_threaded_irq(&client->dev, client->irq, ++ NULL, exc3000_interrupt, IRQF_ONESHOT, ++ client->name, data); ++ if (error) ++ return error; ++ ++ return 0; ++} ++ ++static const struct i2c_device_id exc3000_id[] = { ++ { "exc3000", 0 }, ++ { } ++}; ++MODULE_DEVICE_TABLE(i2c, exc3000_id); ++ ++#ifdef CONFIG_OF ++static const struct of_device_id exc3000_of_match[] = { ++ { .compatible = "eeti,exc3000" }, ++ { } ++}; ++MODULE_DEVICE_TABLE(of, exc3000_of_match); ++#endif ++ ++static struct i2c_driver exc3000_driver = { ++ .driver = { ++ .name = "exc3000", ++ .of_match_table = of_match_ptr(exc3000_of_match), ++ }, ++ .id_table = exc3000_id, ++ .probe = exc3000_probe, ++}; ++ ++module_i2c_driver(exc3000_driver); ++ ++MODULE_AUTHOR("Ahmet Inan "); ++MODULE_DESCRIPTION("I2C connected EETI EXC3000 multiple touch controller driver"); ++MODULE_LICENSE("GPL v2"); + +From 4d372cf956640256e984954fbb0da1de85c7b4c7 Mon Sep 17 00:00:00 2001 +From: Ahmet Inan +Date: Fri, 1 Sep 2017 15:14:23 +0200 +Subject: [PATCH 178/201] config: Add EETI EXC3000 touch controller module + +Signed-off-by: Ahmet Inan +--- + arch/arm/configs/bcm2709_defconfig | 1 + + arch/arm/configs/bcmrpi_defconfig | 1 + + 2 files changed, 2 insertions(+) + +diff --git a/arch/arm/configs/bcm2709_defconfig b/arch/arm/configs/bcm2709_defconfig +index 3cc3a9745c1366ef6fc7d8066462c56039d7a071..f1dcc7d974b674199c4f25e8d561f09b152ffa19 100644 +--- a/arch/arm/configs/bcm2709_defconfig ++++ b/arch/arm/configs/bcm2709_defconfig +@@ -554,6 +554,7 @@ CONFIG_JOYSTICK_RPISENSE=m + CONFIG_INPUT_TOUCHSCREEN=y + CONFIG_TOUCHSCREEN_ADS7846=m + CONFIG_TOUCHSCREEN_EGALAX=m ++CONFIG_TOUCHSCREEN_EXC3000=m + CONFIG_TOUCHSCREEN_GOODIX=m + CONFIG_TOUCHSCREEN_EDT_FT5X06=m + CONFIG_TOUCHSCREEN_RPI_FT5406=m +diff --git a/arch/arm/configs/bcmrpi_defconfig b/arch/arm/configs/bcmrpi_defconfig +index 4cfd4e6a339009536d6ebaaff36e4007573cfe63..f2563f6824b6b16d9f44bc0ee1da818bc3ef5ebd 100644 +--- a/arch/arm/configs/bcmrpi_defconfig ++++ b/arch/arm/configs/bcmrpi_defconfig +@@ -549,6 +549,7 @@ CONFIG_JOYSTICK_RPISENSE=m + CONFIG_INPUT_TOUCHSCREEN=y + CONFIG_TOUCHSCREEN_ADS7846=m + CONFIG_TOUCHSCREEN_EGALAX=m ++CONFIG_TOUCHSCREEN_EXC3000=m + CONFIG_TOUCHSCREEN_GOODIX=m + CONFIG_TOUCHSCREEN_EDT_FT5X06=m + CONFIG_TOUCHSCREEN_RPI_FT5406=m + +From 7ab515ca002cf441672442295ebc17704a46bd49 Mon Sep 17 00:00:00 2001 +From: Ahmet Inan +Date: Fri, 1 Sep 2017 15:18:01 +0200 +Subject: [PATCH 179/201] overlays: Add EETI EXC3000 overlay + +Add support for I2C connected EETI EXC3000 multiple touch controller +using GPIO 4 (pin 7 on GPIO header) for interrupt. + +Signed-off-by: Ahmet Inan +--- + arch/arm/boot/dts/overlays/Makefile | 1 + + arch/arm/boot/dts/overlays/README | 12 +++++++ + arch/arm/boot/dts/overlays/exc3000-overlay.dts | 48 ++++++++++++++++++++++++++ + 3 files changed, 61 insertions(+) + create mode 100644 arch/arm/boot/dts/overlays/exc3000-overlay.dts + +diff --git a/arch/arm/boot/dts/overlays/Makefile b/arch/arm/boot/dts/overlays/Makefile +index 36db27e205cc3ff33cb49bb6357af9060be8eb17..5f6782edadf63eef2c46064a2f42bfbf204cbc14 100644 +--- a/arch/arm/boot/dts/overlays/Makefile ++++ b/arch/arm/boot/dts/overlays/Makefile +@@ -26,6 +26,7 @@ dtbo-$(CONFIG_ARCH_BCM2835) += \ + dwc2.dtbo \ + enc28j60.dtbo \ + enc28j60-spi2.dtbo \ ++ exc3000.dtbo \ + fe-pi-audio.dtbo \ + goodix.dtbo \ + googlevoicehat-soundcard.dtbo \ +diff --git a/arch/arm/boot/dts/overlays/README b/arch/arm/boot/dts/overlays/README +index f0a49892c57523a899c770b1e776e35b245b3ab2..620b3c4beae80ee290cba69b32f1fe23344b456d 100644 +--- a/arch/arm/boot/dts/overlays/README ++++ b/arch/arm/boot/dts/overlays/README +@@ -468,6 +468,18 @@ Params: int_pin GPIO used for INT (default 39) + speed SPI bus speed (default 12000000) + + ++Name: exc3000 ++Info: Enables I2C connected EETI EXC3000 multiple touch controller using ++ GPIO 4 (pin 7 on GPIO header) for interrupt. ++Load: dtoverlay=exc3000,= ++Params: interrupt GPIO used for interrupt (default 4) ++ sizex Touchscreen size x (default 4096) ++ sizey Touchscreen size y (default 4096) ++ invx Touchscreen inverted x axis ++ invy Touchscreen inverted y axis ++ swapxy Touchscreen swapped x y axis ++ ++ + Name: fe-pi-audio + Info: Configures the Fe-Pi Audio Sound Card + Load: dtoverlay=fe-pi-audio +diff --git a/arch/arm/boot/dts/overlays/exc3000-overlay.dts b/arch/arm/boot/dts/overlays/exc3000-overlay.dts +new file mode 100644 +index 0000000000000000000000000000000000000000..c5694033d03f31391b508b89845b029cb03ae5cd +--- /dev/null ++++ b/arch/arm/boot/dts/overlays/exc3000-overlay.dts +@@ -0,0 +1,48 @@ ++// Device tree overlay for I2C connected EETI EXC3000 multiple touch controller ++/dts-v1/; ++/plugin/; ++ ++/ { ++ compatible = "brcm,bcm2708"; ++ ++ fragment@0 { ++ target = <&gpio>; ++ __overlay__ { ++ exc3000_pins: exc3000_pins { ++ brcm,pins = <4>; // interrupt ++ brcm,function = <0>; // in ++ brcm,pull = <2>; // pull-up ++ }; ++ }; ++ }; ++ ++ fragment@1 { ++ target = <&i2c1>; ++ __overlay__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ status = "okay"; ++ ++ exc3000: exc3000@2a { ++ compatible = "eeti,exc3000"; ++ reg = <0x2a>; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&exc3000_pins>; ++ interrupt-parent = <&gpio>; ++ interrupts = <4 8>; // active low level-sensitive ++ touchscreen-size-x = <4096>; ++ touchscreen-size-y = <4096>; ++ }; ++ }; ++ }; ++ ++ __overrides__ { ++ interrupt = <&exc3000_pins>,"brcm,pins:0", ++ <&exc3000>,"interrupts:0"; ++ sizex = <&exc3000>,"touchscreen-size-x:0"; ++ sizey = <&exc3000>,"touchscreen-size-y:0"; ++ invx = <&exc3000>,"touchscreen-inverted-x?"; ++ invy = <&exc3000>,"touchscreen-inverted-y?"; ++ swapxy = <&exc3000>,"touchscreen-swapped-x-y?"; ++ }; ++}; + +From 7c76d487c72038e9b8500c205bd891ca29e5dc2b Mon Sep 17 00:00:00 2001 +From: Yevhen Kyriukha +Date: Sun, 14 Jan 2018 13:36:24 +0200 +Subject: [PATCH 180/201] Added support for mbed AudioCODEC (TLV320AIC23B) + +Signed-off-by: Yevhen Kyriukha +--- + arch/arm/boot/dts/overlays/Makefile | 1 + + arch/arm/boot/dts/overlays/README | 6 +++ + arch/arm/boot/dts/overlays/mbed-dac-overlay.dts | 64 +++++++++++++++++++++++++ + 3 files changed, 71 insertions(+) + create mode 100644 arch/arm/boot/dts/overlays/mbed-dac-overlay.dts + +diff --git a/arch/arm/boot/dts/overlays/Makefile b/arch/arm/boot/dts/overlays/Makefile +index 5f6782edadf63eef2c46064a2f42bfbf204cbc14..3c8222020562d932681bdc4676b9466aac931552 100644 +--- a/arch/arm/boot/dts/overlays/Makefile ++++ b/arch/arm/boot/dts/overlays/Makefile +@@ -58,6 +58,7 @@ dtbo-$(CONFIG_ARCH_BCM2835) += \ + justboom-dac.dtbo \ + justboom-digi.dtbo \ + lirc-rpi.dtbo \ ++ mbed-dac.dtbo \ + mcp23017.dtbo \ + mcp23s17.dtbo \ + mcp2515-can0.dtbo \ +diff --git a/arch/arm/boot/dts/overlays/README b/arch/arm/boot/dts/overlays/README +index 620b3c4beae80ee290cba69b32f1fe23344b456d..88f67db61e9e3c481a9df0b71e5c303b47261682 100644 +--- a/arch/arm/boot/dts/overlays/README ++++ b/arch/arm/boot/dts/overlays/README +@@ -965,6 +965,12 @@ Params: gpio_out_pin GPIO for output (default "17") + (default "off") + + ++Name: mbed-dac ++Info: Configures the mbed AudioCODEC (TLV320AIC23B) ++Load: dtoverlay=mbed-dac ++Params: ++ ++ + Name: mcp23017 + Info: Configures the MCP23017 I2C GPIO expander + Load: dtoverlay=mcp23017,= +diff --git a/arch/arm/boot/dts/overlays/mbed-dac-overlay.dts b/arch/arm/boot/dts/overlays/mbed-dac-overlay.dts +new file mode 100644 +index 0000000000000000000000000000000000000000..313563d6ed47fb1e0db8f8ffa4505b61d5e77108 +--- /dev/null ++++ b/arch/arm/boot/dts/overlays/mbed-dac-overlay.dts +@@ -0,0 +1,64 @@ ++// Definitions for mbed DAC ++/dts-v1/; ++/plugin/; ++ ++/ { ++ compatible = "brcm,bcm2708"; ++ ++ fragment@0 { ++ target = <&i2s>; ++ __overlay__ { ++ status = "okay"; ++ }; ++ }; ++ ++ fragment@1 { ++ target = <&i2c1>; ++ __overlay__ { ++ #address-cells = <1>; ++ #size-cells = <0>; ++ status = "okay"; ++ ++ tlv320aic23: codec@1a { ++ #sound-dai-cells = <0>; ++ reg = <0x1a>; ++ compatible = "ti,tlv320aic23"; ++ status = "okay"; ++ }; ++ }; ++ }; ++ ++ fragment@2 { ++ target = <&sound>; ++ __overlay__ { ++ compatible = "simple-audio-card"; ++ i2s-controller = <&i2s>; ++ status = "okay"; ++ ++ simple-audio-card,name = "mbed-DAC"; ++ ++ simple-audio-card,widgets = ++ "Microphone", "Mic Jack", ++ "Line", "Line In", ++ "Headphone", "Headphone Jack"; ++ ++ simple-audio-card,routing = ++ "Headphone Jack", "LHPOUT", ++ "Headphone Jack", "RHPOUT", ++ "LLINEIN", "Line In", ++ "RLINEIN", "Line In", ++ "MICIN", "Mic Jack"; ++ ++ simple-audio-card,format = "i2s"; ++ ++ simple-audio-card,cpu { ++ sound-dai = <&i2s>; ++ }; ++ ++ sound_master: simple-audio-card,codec { ++ sound-dai = <&tlv320aic23>; ++ system-clock-frequency = <12288000>; ++ }; ++ }; ++ }; ++}; + +From 227a662e6bd5f52888a2df01d497f0811c6c9bad Mon Sep 17 00:00:00 2001 +From: Phil Elwell +Date: Mon, 22 Jan 2018 12:17:27 +0000 +Subject: [PATCH 181/201] mmc: bcm2835-sdhost: Support underclocking + +Support underclocking of the SD bus in two ways: +1. using the max-frequency DT property (which currently has no DT + parameter), and +2. using the exiting sd_overclock parameter. + +The two methods differ slightly - in the former the MMC subsystem is +aware of the underclocking, while in the latter it isn't - but the +end results should be the same. + +See: https://github.com/raspberrypi/linux/issues/2350 + +Signed-off-by: Phil Elwell +--- + drivers/mmc/host/bcm2835-sdhost.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/drivers/mmc/host/bcm2835-sdhost.c b/drivers/mmc/host/bcm2835-sdhost.c +index 9c6f199a7830959f31012d86bc1f8b1a9922185f..6c0dafe6c64b03f91cfb0360861c29dd444b3ca5 100644 +--- a/drivers/mmc/host/bcm2835-sdhost.c ++++ b/drivers/mmc/host/bcm2835-sdhost.c +@@ -1519,8 +1519,7 @@ void bcm2835_sdhost_set_clock(struct bcm2835_host *host, unsigned int clock) + if (host->debug) + pr_info("%s: set_clock(%d)\n", mmc_hostname(host->mmc), clock); + +- if ((host->overclock_50 > 50) && +- (clock == 50*MHZ)) ++ if (host->overclock_50 && (clock == 50*MHZ)) + clock = host->overclock_50 * MHZ + (MHZ - 1); + + /* The SDCDIV register has 11 bits, and holds (div - 2). +@@ -1894,7 +1893,8 @@ int bcm2835_sdhost_add_host(struct bcm2835_host *host) + + mmc = host->mmc; + +- mmc->f_max = host->max_clk; ++ if (!mmc->f_max || mmc->f_max > host->max_clk) ++ mmc->f_max = host->max_clk; + mmc->f_min = host->max_clk / SDCDIV_MAX_CDIV; + + mmc->max_busy_timeout = (~(unsigned int)0)/(mmc->f_max/1000); + +From b1c4b373e17d7da51a18d65ae35ce689daebe422 Mon Sep 17 00:00:00 2001 +From: Phil Elwell +Date: Mon, 22 Jan 2018 12:22:01 +0000 +Subject: [PATCH 182/201] mmc: bcm2835-mmc: Support underclocking + +Support underclocking of the SD bus using the max-frequency DT property +(which currently has no DT parameter). The sd_overclock parameter +already provides another way to achieve the same thing which should be +equivalent in end result, but it is a bug not to support max-frequency +as well. + +See: https://github.com/raspberrypi/linux/issues/2350 + +Signed-off-by: Phil Elwell +--- + drivers/mmc/host/bcm2835-mmc.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/mmc/host/bcm2835-mmc.c b/drivers/mmc/host/bcm2835-mmc.c +index c4a5e992c6fb4a40b933239350ed4bfc8fb40155..b7f5fd96ecb6c59395022e868726f890ad3cd927 100644 +--- a/drivers/mmc/host/bcm2835-mmc.c ++++ b/drivers/mmc/host/bcm2835-mmc.c +@@ -1310,8 +1310,8 @@ static int bcm2835_mmc_add_host(struct bcm2835_host *host) + + host->clk_mul = 0; + +- mmc->f_max = host->max_clk; +- mmc->f_max = host->max_clk; ++ if (!mmc->f_max || mmc->f_max > host->max_clk) ++ mmc->f_max = host->max_clk; + mmc->f_min = host->max_clk / SDHCI_MAX_DIV_SPEC_300; + + /* SDHCI_QUIRK_DATA_TIMEOUT_USES_SDCLK */ + +From bde5bc3d8ea7a2e568ca1b3b04799699bf958644 Mon Sep 17 00:00:00 2001 +From: Phil Elwell +Date: Mon, 22 Jan 2018 17:26:38 +0000 +Subject: [PATCH 183/201] serial: 8250: bcm2835aux - suppress EPROBE_DEFER + +Signed-off-by: Phil Elwell +--- + drivers/tty/serial/8250/8250_bcm2835aux.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/tty/serial/8250/8250_bcm2835aux.c b/drivers/tty/serial/8250/8250_bcm2835aux.c +index a23c7da42ea81342efc26fb35a92a69d535b7cd0..4f8b8c97186879949a313ce185fcd6e089bd7bc0 100644 +--- a/drivers/tty/serial/8250/8250_bcm2835aux.c ++++ b/drivers/tty/serial/8250/8250_bcm2835aux.c +@@ -54,7 +54,8 @@ static int bcm2835aux_serial_probe(struct platform_device *pdev) + data->clk = devm_clk_get(&pdev->dev, NULL); + ret = PTR_ERR_OR_ZERO(data->clk); + if (ret) { +- dev_err(&pdev->dev, "could not get clk: %d\n", ret); ++ if (ret != -EPROBE_DEFER) ++ dev_err(&pdev->dev, "could not get clk: %d\n", ret); + return ret; + } + + +From 60aee17f855f734446ad5abecb5534c39b6a1453 Mon Sep 17 00:00:00 2001 +From: Phil Elwell +Date: Tue, 23 Jan 2018 16:52:45 +0000 +Subject: [PATCH 184/201] irqchip: irq-bcm2836: Remove regmap and syscon use + +The syscon node defines a register range that duplicates that used by +the local_intc node on bcm2836/7. Since irq-bcm2835 and irq-bcm2836 are +built in and always present together (both drivers are enabled by +CONFIG_ARCH_BCM2835), it is possible to replace the syscon usage with a +global variable that simplifies the code. Doing so does lose the +locking provided by regmap, but as only one side is using the regmap +interface (irq-bcm2835 uses readl and write) there is no loss of +atomicity. + +See: https://github.com/raspberrypi/firmware/issues/926 + +Signed-off-by: Phil Elwell +--- + arch/arm/boot/dts/bcm2709.dtsi | 5 ----- + arch/arm/boot/dts/bcm2710.dtsi | 5 ----- + drivers/irqchip/irq-bcm2835.c | 32 ++++++++++++-------------------- + drivers/irqchip/irq-bcm2836.c | 5 +++++ + 4 files changed, 17 insertions(+), 30 deletions(-) + +diff --git a/arch/arm/boot/dts/bcm2709.dtsi b/arch/arm/boot/dts/bcm2709.dtsi +index 343437db94820bb75a9b81e8bc6ecf6f31d9f04c..c3aedc6541ad00c9c4312bd2ac5882c19608b76b 100644 +--- a/arch/arm/boot/dts/bcm2709.dtsi ++++ b/arch/arm/boot/dts/bcm2709.dtsi +@@ -6,11 +6,6 @@ + soc { + ranges = <0x7e000000 0x3f000000 0x01000000>, + <0x40000000 0x40000000 0x00040000>; +- +- syscon@40000000 { +- compatible = "brcm,bcm2836-arm-local", "syscon"; +- reg = <0x40000000 0x100>; +- }; + }; + + __overrides__ { +diff --git a/arch/arm/boot/dts/bcm2710.dtsi b/arch/arm/boot/dts/bcm2710.dtsi +index d5ce5b60fb3b63a76831504c53145f828b089993..2169fbd14844dd907f027a36984f3372074b331c 100644 +--- a/arch/arm/boot/dts/bcm2710.dtsi ++++ b/arch/arm/boot/dts/bcm2710.dtsi +@@ -16,11 +16,6 @@ + interrupt-parent = <&local_intc>; + interrupts = <9>; + }; +- +- syscon@40000000 { +- compatible = "brcm,bcm2836-arm-local", "syscon"; +- reg = <0x40000000 0x100>; +- }; + }; + + __overrides__ { +diff --git a/drivers/irqchip/irq-bcm2835.c b/drivers/irqchip/irq-bcm2835.c +index 2a11c648cb2fdd5b2ddf4afd1b7e4fc20eee4f4a..ecb0147289746249676125a95c440f83a8d27c2b 100644 +--- a/drivers/irqchip/irq-bcm2835.c ++++ b/drivers/irqchip/irq-bcm2835.c +@@ -50,8 +50,6 @@ + #include + #include + #include +-#include +-#include + + #include + #ifndef CONFIG_ARM64 +@@ -103,7 +101,7 @@ struct armctrl_ic { + void __iomem *enable[NR_BANKS]; + void __iomem *disable[NR_BANKS]; + struct irq_domain *domain; +- struct regmap *local_regmap; ++ void __iomem *local_base; + }; + + static struct armctrl_ic intc __read_mostly; +@@ -140,24 +138,20 @@ static void armctrl_unmask_irq(struct irq_data *d) + if (d->hwirq >= NUMBER_IRQS) { + if (num_online_cpus() > 1) { + unsigned int data; +- int ret; + +- if (!intc.local_regmap) { +- pr_err("FIQ is disabled due to missing regmap\n"); ++ if (!intc.local_base) { ++ pr_err("FIQ is disabled due to missing arm_local_intc\n"); + return; + } + +- ret = regmap_read(intc.local_regmap, +- ARM_LOCAL_GPU_INT_ROUTING, &data); +- if (ret) { +- pr_err("Failed to read int routing %d\n", ret); +- return; +- } ++ data = readl_relaxed(intc.local_base + ++ ARM_LOCAL_GPU_INT_ROUTING); + + data &= ~0xc; + data |= (1 << 2); +- regmap_write(intc.local_regmap, +- ARM_LOCAL_GPU_INT_ROUTING, data); ++ writel_relaxed(data, ++ intc.local_base + ++ ARM_LOCAL_GPU_INT_ROUTING); + } + + writel_relaxed(REG_FIQ_ENABLE | hwirq_to_fiq(d->hwirq), +@@ -256,12 +250,10 @@ static int __init armctrl_of_init(struct device_node *node, + } + + if (is_2836) { +- intc.local_regmap = +- syscon_regmap_lookup_by_compatible("brcm,bcm2836-arm-local"); +- if (IS_ERR(intc.local_regmap)) { +- pr_err("Failed to get local register map. FIQ is disabled for cpus > 1\n"); +- intc.local_regmap = NULL; +- } ++ extern void __iomem * __attribute__((weak)) arm_local_intc; ++ intc.local_base = arm_local_intc; ++ if (!intc.local_base) ++ pr_err("Failed to get local intc base. FIQ is disabled for cpus > 1\n"); + } + + /* Make a duplicate irq range which is used to enable FIQ */ +diff --git a/drivers/irqchip/irq-bcm2836.c b/drivers/irqchip/irq-bcm2836.c +index 05b17ca993f405c4c8e61a782ec58149038069c2..963415c919146e66ef36f4da8f157cabc3aba6d1 100644 +--- a/drivers/irqchip/irq-bcm2836.c ++++ b/drivers/irqchip/irq-bcm2836.c +@@ -83,6 +83,9 @@ struct bcm2836_arm_irqchip_intc { + + static struct bcm2836_arm_irqchip_intc intc __read_mostly; + ++void __iomem *arm_local_intc; ++EXPORT_SYMBOL_GPL(arm_local_intc); ++ + static void bcm2836_arm_irqchip_mask_per_cpu_irq(unsigned int reg_offset, + unsigned int bit, + int cpu) +@@ -310,6 +313,8 @@ static int __init bcm2836_arm_irqchip_l1_intc_of_init(struct device_node *node, + panic("%pOF: unable to map local interrupt registers\n", node); + } + ++ arm_local_intc = intc.base; ++ + bcm2835_init_local_timer_frequency(); + + intc.domain = irq_domain_add_linear(node, LAST_IRQ + 1, + +From cea8e4e4a3d5e9442a7bde8296addd1712de5125 Mon Sep 17 00:00:00 2001 +From: Phil Elwell +Date: Wed, 24 Jan 2018 15:19:39 +0000 +Subject: [PATCH 185/201] lan78xx: Avoid spurious kevent 4 "error" + +lan78xx_defer_event generates an error message whenever the work item +is already scheduled. lan78xx_open defers three events - +EVENT_STAT_UPDATE, EVENT_DEV_OPEN and EVENT_LINK_RESET. Being aware +of the likelihood (or certainty) of an error message, the DEV_OPEN +event is added to the set of pending events directly, relying on +the subsequent deferral of the EVENT_LINK_RESET call to schedule the +work. Take the same precaution with EVENT_STAT_UPDATE to avoid a +totally unnecessary error message. + +Signed-off-by: Phil Elwell +--- + drivers/net/usb/lan78xx.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c +index 26e04c732df49d09939d470c61a9ab4638901e81..2fcad3698971efc0587e6352e4b09cd4f5fbea58 100644 +--- a/drivers/net/usb/lan78xx.c ++++ b/drivers/net/usb/lan78xx.c +@@ -2517,7 +2517,7 @@ static void lan78xx_init_stats(struct lan78xx_net *dev) + dev->stats.rollover_max.eee_tx_lpi_transitions = 0xFFFFFFFF; + dev->stats.rollover_max.eee_tx_lpi_time = 0xFFFFFFFF; + +- lan78xx_defer_kevent(dev, EVENT_STAT_UPDATE); ++ set_bit(EVENT_STAT_UPDATE, &dev->flags); + } + + static int lan78xx_open(struct net_device *net) + +From 5721058e77df9a45bf6244cd2d1ee852573aa764 Mon Sep 17 00:00:00 2001 +From: Phil Elwell +Date: Wed, 24 Jan 2018 20:00:48 +0000 +Subject: [PATCH 186/201] overlays: Allow multiple pps-gpio instantiations + +See: https://github.com/raspberrypi/linux/issues/2352 + +Signed-off-by: Phil Elwell +--- + arch/arm/boot/dts/overlays/pps-gpio-overlay.dts | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +diff --git a/arch/arm/boot/dts/overlays/pps-gpio-overlay.dts b/arch/arm/boot/dts/overlays/pps-gpio-overlay.dts +index 50143a4bb215807ba0a0d0562f5827fa29a04de4..9ee4bdfa6167355e82d7f8229613f29478caf4ee 100644 +--- a/arch/arm/boot/dts/overlays/pps-gpio-overlay.dts ++++ b/arch/arm/boot/dts/overlays/pps-gpio-overlay.dts +@@ -6,7 +6,7 @@ + fragment@0 { + target-path = "/"; + __overlay__ { +- pps: pps { ++ pps: pps@12 { + compatible = "pps-gpio"; + pinctrl-names = "default"; + pinctrl-0 = <&pps_pins>; +@@ -19,7 +19,7 @@ + fragment@1 { + target = <&gpio>; + __overlay__ { +- pps_pins: pps_pins { ++ pps_pins: pps_pins@12 { + brcm,pins = <18>; + brcm,function = <0>; // in + brcm,pull = <0>; // off +@@ -29,7 +29,9 @@ + + __overrides__ { + gpiopin = <&pps>,"gpios:4", +- <&pps_pins>,"brcm,pins:0"; ++ <&pps>,"reg:0", ++ <&pps_pins>,"brcm,pins:0", ++ <&pps_pins>,"reg:0"; + assert_falling_edge = <&pps>,"assert-falling-edge?"; + }; + }; + +From e6a75ac365934ba710df58161752ffa644676b17 Mon Sep 17 00:00:00 2001 +From: Thierry Reding +Date: Fri, 1 Sep 2017 16:49:54 +0200 +Subject: [PATCH 187/201] drm/vc4: Use correct path to trace include +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +The header comment in include/trace/define_trace.h specifies that the +TRACE_INCLUDE_PATH needs to be relative to the define_trace.h header +rather than the trace file including it. Most instances get that wrong +and work around it by adding the $(src) directory to the include path. + +While this works, it is preferable to refer to the correct path to the +trace file in the first place and avoid any workaround. + +Acked-by: Christian König +Acked-by: Daniel Vetter +Signed-off-by: Thierry Reding +Link: https://patchwork.freedesktop.org/patch/msgid/20170901144954.19620-6-thierry.reding@gmail.com +(cherry picked from commit ff58a15a502a900c35ff2f20182249b65719d6d7) +--- + drivers/gpu/drm/vc4/Makefile | 2 -- + drivers/gpu/drm/vc4/vc4_trace.h | 2 +- + 2 files changed, 1 insertion(+), 3 deletions(-) + +diff --git a/drivers/gpu/drm/vc4/Makefile b/drivers/gpu/drm/vc4/Makefile +index 69f3bcd22857db92b5570f11634272492ecbd2d1..1eed0e92bd20a870e7e03022c1e652e587682617 100644 +--- a/drivers/gpu/drm/vc4/Makefile ++++ b/drivers/gpu/drm/vc4/Makefile +@@ -26,5 +26,3 @@ vc4-y := \ + vc4-$(CONFIG_DEBUG_FS) += vc4_debugfs.o + + obj-$(CONFIG_DRM_VC4) += vc4.o +- +-CFLAGS_vc4_trace_points.o := -I$(src) +diff --git a/drivers/gpu/drm/vc4/vc4_trace.h b/drivers/gpu/drm/vc4/vc4_trace.h +index ad7b1ea720c288eb587d16e5f8e10eace5de93f3..deafb32923e147f4bb9ad93ce441a6aecf32188c 100644 +--- a/drivers/gpu/drm/vc4/vc4_trace.h ++++ b/drivers/gpu/drm/vc4/vc4_trace.h +@@ -59,5 +59,5 @@ TRACE_EVENT(vc4_wait_for_seqno_end, + + /* This part must be outside protection */ + #undef TRACE_INCLUDE_PATH +-#define TRACE_INCLUDE_PATH . ++#define TRACE_INCLUDE_PATH ../../drivers/gpu/drm/vc4 + #include + +From f81366aba5bccf858a5f802923f47daec3d2cf99 Mon Sep 17 00:00:00 2001 +From: Colin Ian King +Date: Fri, 8 Sep 2017 15:05:04 +0100 +Subject: [PATCH 188/201] drm/vc4: clean up error handling on devm_kzalloc + failure + +The current error handling when devm_kzalloc fails performs a +non-null check on connector which is redundant because connector +is null at that failure point. Once this is removed, make the +failure path into a trivial -ENOMEM return to clean up the +error handling. Also remove need to initialize connector to NULL. + +Detected by CoverityScan CID#1339527 ("Logically dead code") +Signed-off-by: Colin Ian King +Signed-off-by: Eric Anholt +Reviewed-by: Eric Anholt +Link: https://patchwork.freedesktop.org/patch/msgid/20170908140504.1340-1-colin.king@canonical.com +(cherry picked from commit 5663077a56804890506c913b3ca9fee78764f8b3) +--- + drivers/gpu/drm/vc4/vc4_hdmi.c | 15 +++------------ + 1 file changed, 3 insertions(+), 12 deletions(-) + +diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c +index 8f71157a2b063b07a3d3c195ae5049a0ddcac03e..0b2088264039131f05c2f09bc9ba84d2d3793e39 100644 +--- a/drivers/gpu/drm/vc4/vc4_hdmi.c ++++ b/drivers/gpu/drm/vc4/vc4_hdmi.c +@@ -309,16 +309,13 @@ static const struct drm_connector_helper_funcs vc4_hdmi_connector_helper_funcs = + static struct drm_connector *vc4_hdmi_connector_init(struct drm_device *dev, + struct drm_encoder *encoder) + { +- struct drm_connector *connector = NULL; ++ struct drm_connector *connector; + struct vc4_hdmi_connector *hdmi_connector; +- int ret = 0; + + hdmi_connector = devm_kzalloc(dev->dev, sizeof(*hdmi_connector), + GFP_KERNEL); +- if (!hdmi_connector) { +- ret = -ENOMEM; +- goto fail; +- } ++ if (!hdmi_connector) ++ return ERR_PTR(-ENOMEM); + connector = &hdmi_connector->base; + + hdmi_connector->encoder = encoder; +@@ -336,12 +333,6 @@ static struct drm_connector *vc4_hdmi_connector_init(struct drm_device *dev, + drm_mode_connector_attach_encoder(connector, encoder); + + return connector; +- +- fail: +- if (connector) +- vc4_hdmi_connector_destroy(connector); +- +- return ERR_PTR(ret); + } + + static void vc4_hdmi_encoder_destroy(struct drm_encoder *encoder) + +From b580a62d2155d5330c20152315e2679a2646c6a0 Mon Sep 17 00:00:00 2001 +From: Boris Brezillon +Date: Thu, 19 Oct 2017 14:57:48 +0200 +Subject: [PATCH 189/201] drm/vc4: Add the DRM_IOCTL_VC4_GEM_MADVISE ioctl + +This ioctl will allow us to purge inactive userspace buffers when the +system is running out of contiguous memory. + +For now, the purge logic is rather dumb in that it does not try to +release only the amount of BO needed to meet the last CMA alloc request +but instead purges all objects placed in the purgeable pool as soon as +we experience a CMA allocation failure. + +Note that the in-kernel BO cache is always purged before the purgeable +cache because those objects are known to be unused while objects marked +as purgeable by a userspace application/library might have to be +restored when they are marked back as unpurgeable, which can be +expensive. + +Signed-off-by: Boris Brezillon +Signed-off-by: Eric Anholt +Reviewed-by: Eric Anholt +Link: https://patchwork.freedesktop.org/patch/msgid/20171019125748.3152-1-boris.brezillon@free-electrons.com +(cherry picked from commit b9f19259b84dc648f207a46f3581d15eeaedf4b6) +--- + drivers/gpu/drm/vc4/vc4_bo.c | 287 ++++++++++++++++++++++++++++++++++++++-- + drivers/gpu/drm/vc4/vc4_drv.c | 10 +- + drivers/gpu/drm/vc4/vc4_drv.h | 30 +++++ + drivers/gpu/drm/vc4/vc4_gem.c | 156 +++++++++++++++++++++- + drivers/gpu/drm/vc4/vc4_plane.c | 20 +++ + include/uapi/drm/vc4_drm.h | 19 +++ + 6 files changed, 507 insertions(+), 15 deletions(-) + +diff --git a/drivers/gpu/drm/vc4/vc4_bo.c b/drivers/gpu/drm/vc4/vc4_bo.c +index 3afdbf4bc10b37fcc1a21fc62b21aaa974405490..01a53ba304f89769ccedf66f2cba361f809b54c8 100644 +--- a/drivers/gpu/drm/vc4/vc4_bo.c ++++ b/drivers/gpu/drm/vc4/vc4_bo.c +@@ -53,6 +53,17 @@ static void vc4_bo_stats_dump(struct vc4_dev *vc4) + vc4->bo_labels[i].size_allocated / 1024, + vc4->bo_labels[i].num_allocated); + } ++ ++ mutex_lock(&vc4->purgeable.lock); ++ if (vc4->purgeable.num) ++ DRM_INFO("%30s: %6zdkb BOs (%d)\n", "userspace BO cache", ++ vc4->purgeable.size / 1024, vc4->purgeable.num); ++ ++ if (vc4->purgeable.purged_num) ++ DRM_INFO("%30s: %6zdkb BOs (%d)\n", "total purged BO", ++ vc4->purgeable.purged_size / 1024, ++ vc4->purgeable.purged_num); ++ mutex_unlock(&vc4->purgeable.lock); + } + + #ifdef CONFIG_DEBUG_FS +@@ -75,6 +86,17 @@ int vc4_bo_stats_debugfs(struct seq_file *m, void *unused) + } + mutex_unlock(&vc4->bo_lock); + ++ mutex_lock(&vc4->purgeable.lock); ++ if (vc4->purgeable.num) ++ seq_printf(m, "%30s: %6dkb BOs (%d)\n", "userspace BO cache", ++ vc4->purgeable.size / 1024, vc4->purgeable.num); ++ ++ if (vc4->purgeable.purged_num) ++ seq_printf(m, "%30s: %6dkb BOs (%d)\n", "total purged BO", ++ vc4->purgeable.purged_size / 1024, ++ vc4->purgeable.purged_num); ++ mutex_unlock(&vc4->purgeable.lock); ++ + return 0; + } + #endif +@@ -247,6 +269,109 @@ static void vc4_bo_cache_purge(struct drm_device *dev) + mutex_unlock(&vc4->bo_lock); + } + ++void vc4_bo_add_to_purgeable_pool(struct vc4_bo *bo) ++{ ++ struct vc4_dev *vc4 = to_vc4_dev(bo->base.base.dev); ++ ++ mutex_lock(&vc4->purgeable.lock); ++ list_add_tail(&bo->size_head, &vc4->purgeable.list); ++ vc4->purgeable.num++; ++ vc4->purgeable.size += bo->base.base.size; ++ mutex_unlock(&vc4->purgeable.lock); ++} ++ ++static void vc4_bo_remove_from_purgeable_pool_locked(struct vc4_bo *bo) ++{ ++ struct vc4_dev *vc4 = to_vc4_dev(bo->base.base.dev); ++ ++ /* list_del_init() is used here because the caller might release ++ * the purgeable lock in order to acquire the madv one and update the ++ * madv status. ++ * During this short period of time a user might decide to mark ++ * the BO as unpurgeable, and if bo->madv is set to ++ * VC4_MADV_DONTNEED it will try to remove the BO from the ++ * purgeable list which will fail if the ->next/prev fields ++ * are set to LIST_POISON1/LIST_POISON2 (which is what ++ * list_del() does). ++ * Re-initializing the list element guarantees that list_del() ++ * will work correctly even if it's a NOP. ++ */ ++ list_del_init(&bo->size_head); ++ vc4->purgeable.num--; ++ vc4->purgeable.size -= bo->base.base.size; ++} ++ ++void vc4_bo_remove_from_purgeable_pool(struct vc4_bo *bo) ++{ ++ struct vc4_dev *vc4 = to_vc4_dev(bo->base.base.dev); ++ ++ mutex_lock(&vc4->purgeable.lock); ++ vc4_bo_remove_from_purgeable_pool_locked(bo); ++ mutex_unlock(&vc4->purgeable.lock); ++} ++ ++static void vc4_bo_purge(struct drm_gem_object *obj) ++{ ++ struct vc4_bo *bo = to_vc4_bo(obj); ++ struct drm_device *dev = obj->dev; ++ ++ WARN_ON(!mutex_is_locked(&bo->madv_lock)); ++ WARN_ON(bo->madv != VC4_MADV_DONTNEED); ++ ++ drm_vma_node_unmap(&obj->vma_node, dev->anon_inode->i_mapping); ++ ++ dma_free_wc(dev->dev, obj->size, bo->base.vaddr, bo->base.paddr); ++ bo->base.vaddr = NULL; ++ bo->madv = __VC4_MADV_PURGED; ++} ++ ++static void vc4_bo_userspace_cache_purge(struct drm_device *dev) ++{ ++ struct vc4_dev *vc4 = to_vc4_dev(dev); ++ ++ mutex_lock(&vc4->purgeable.lock); ++ while (!list_empty(&vc4->purgeable.list)) { ++ struct vc4_bo *bo = list_first_entry(&vc4->purgeable.list, ++ struct vc4_bo, size_head); ++ struct drm_gem_object *obj = &bo->base.base; ++ size_t purged_size = 0; ++ ++ vc4_bo_remove_from_purgeable_pool_locked(bo); ++ ++ /* Release the purgeable lock while we're purging the BO so ++ * that other people can continue inserting things in the ++ * purgeable pool without having to wait for all BOs to be ++ * purged. ++ */ ++ mutex_unlock(&vc4->purgeable.lock); ++ mutex_lock(&bo->madv_lock); ++ ++ /* Since we released the purgeable pool lock before acquiring ++ * the BO madv one, the user may have marked the BO as WILLNEED ++ * and re-used it in the meantime. ++ * Before purging the BO we need to make sure ++ * - it is still marked as DONTNEED ++ * - it has not been re-inserted in the purgeable list ++ * - it is not used by HW blocks ++ * If one of these conditions is not met, just skip the entry. ++ */ ++ if (bo->madv == VC4_MADV_DONTNEED && ++ list_empty(&bo->size_head) && ++ !refcount_read(&bo->usecnt)) { ++ purged_size = bo->base.base.size; ++ vc4_bo_purge(obj); ++ } ++ mutex_unlock(&bo->madv_lock); ++ mutex_lock(&vc4->purgeable.lock); ++ ++ if (purged_size) { ++ vc4->purgeable.purged_size += purged_size; ++ vc4->purgeable.purged_num++; ++ } ++ } ++ mutex_unlock(&vc4->purgeable.lock); ++} ++ + static struct vc4_bo *vc4_bo_get_from_cache(struct drm_device *dev, + uint32_t size, + enum vc4_kernel_bo_type type) +@@ -293,6 +418,9 @@ struct drm_gem_object *vc4_create_object(struct drm_device *dev, size_t size) + if (!bo) + return ERR_PTR(-ENOMEM); + ++ bo->madv = VC4_MADV_WILLNEED; ++ refcount_set(&bo->usecnt, 0); ++ mutex_init(&bo->madv_lock); + mutex_lock(&vc4->bo_lock); + bo->label = VC4_BO_TYPE_KERNEL; + vc4->bo_labels[VC4_BO_TYPE_KERNEL].num_allocated++; +@@ -330,16 +458,38 @@ struct vc4_bo *vc4_bo_create(struct drm_device *dev, size_t unaligned_size, + * CMA allocations we've got laying around and try again. + */ + vc4_bo_cache_purge(dev); ++ cma_obj = drm_gem_cma_create(dev, size); ++ } + ++ if (IS_ERR(cma_obj)) { ++ /* ++ * Still not enough CMA memory, purge the userspace BO ++ * cache and retry. ++ * This is sub-optimal since we purge the whole userspace ++ * BO cache which forces user that want to re-use the BO to ++ * restore its initial content. ++ * Ideally, we should purge entries one by one and retry ++ * after each to see if CMA allocation succeeds. Or even ++ * better, try to find an entry with at least the same ++ * size. ++ */ ++ vc4_bo_userspace_cache_purge(dev); + cma_obj = drm_gem_cma_create(dev, size); +- if (IS_ERR(cma_obj)) { +- DRM_ERROR("Failed to allocate from CMA:\n"); +- vc4_bo_stats_dump(vc4); +- return ERR_PTR(-ENOMEM); +- } ++ } ++ ++ if (IS_ERR(cma_obj)) { ++ DRM_ERROR("Failed to allocate from CMA:\n"); ++ vc4_bo_stats_dump(vc4); ++ return ERR_PTR(-ENOMEM); + } + bo = to_vc4_bo(&cma_obj->base); + ++ /* By default, BOs do not support the MADV ioctl. This will be enabled ++ * only on BOs that are exposed to userspace (V3D, V3D_SHADER and DUMB ++ * BOs). ++ */ ++ bo->madv = __VC4_MADV_NOTSUPP; ++ + mutex_lock(&vc4->bo_lock); + vc4_bo_set_label(&cma_obj->base, type); + mutex_unlock(&vc4->bo_lock); +@@ -365,6 +515,8 @@ int vc4_dumb_create(struct drm_file *file_priv, + if (IS_ERR(bo)) + return PTR_ERR(bo); + ++ bo->madv = VC4_MADV_WILLNEED; ++ + ret = drm_gem_handle_create(file_priv, &bo->base.base, &args->handle); + drm_gem_object_put_unlocked(&bo->base.base); + +@@ -403,6 +555,12 @@ void vc4_free_object(struct drm_gem_object *gem_bo) + struct vc4_bo *bo = to_vc4_bo(gem_bo); + struct list_head *cache_list; + ++ /* Remove the BO from the purgeable list. */ ++ mutex_lock(&bo->madv_lock); ++ if (bo->madv == VC4_MADV_DONTNEED && !refcount_read(&bo->usecnt)) ++ vc4_bo_remove_from_purgeable_pool(bo); ++ mutex_unlock(&bo->madv_lock); ++ + mutex_lock(&vc4->bo_lock); + /* If the object references someone else's memory, we can't cache it. + */ +@@ -418,7 +576,8 @@ void vc4_free_object(struct drm_gem_object *gem_bo) + } + + /* If this object was partially constructed but CMA allocation +- * had failed, just free it. ++ * had failed, just free it. Can also happen when the BO has been ++ * purged. + */ + if (!bo->base.vaddr) { + vc4_bo_destroy(bo); +@@ -437,6 +596,10 @@ void vc4_free_object(struct drm_gem_object *gem_bo) + bo->validated_shader = NULL; + } + ++ /* Reset madv and usecnt before adding the BO to the cache. */ ++ bo->madv = __VC4_MADV_NOTSUPP; ++ refcount_set(&bo->usecnt, 0); ++ + bo->t_format = false; + bo->free_time = jiffies; + list_add(&bo->size_head, cache_list); +@@ -461,6 +624,56 @@ static void vc4_bo_cache_time_work(struct work_struct *work) + mutex_unlock(&vc4->bo_lock); + } + ++int vc4_bo_inc_usecnt(struct vc4_bo *bo) ++{ ++ int ret; ++ ++ /* Fast path: if the BO is already retained by someone, no need to ++ * check the madv status. ++ */ ++ if (refcount_inc_not_zero(&bo->usecnt)) ++ return 0; ++ ++ mutex_lock(&bo->madv_lock); ++ switch (bo->madv) { ++ case VC4_MADV_WILLNEED: ++ refcount_inc(&bo->usecnt); ++ ret = 0; ++ break; ++ case VC4_MADV_DONTNEED: ++ /* We shouldn't use a BO marked as purgeable if at least ++ * someone else retained its content by incrementing usecnt. ++ * Luckily the BO hasn't been purged yet, but something wrong ++ * is happening here. Just throw an error instead of ++ * authorizing this use case. ++ */ ++ case __VC4_MADV_PURGED: ++ /* We can't use a purged BO. */ ++ default: ++ /* Invalid madv value. */ ++ ret = -EINVAL; ++ break; ++ } ++ mutex_unlock(&bo->madv_lock); ++ ++ return ret; ++} ++ ++void vc4_bo_dec_usecnt(struct vc4_bo *bo) ++{ ++ /* Fast path: if the BO is still retained by someone, no need to test ++ * the madv value. ++ */ ++ if (refcount_dec_not_one(&bo->usecnt)) ++ return; ++ ++ mutex_lock(&bo->madv_lock); ++ if (refcount_dec_and_test(&bo->usecnt) && ++ bo->madv == VC4_MADV_DONTNEED) ++ vc4_bo_add_to_purgeable_pool(bo); ++ mutex_unlock(&bo->madv_lock); ++} ++ + static void vc4_bo_cache_time_timer(unsigned long data) + { + struct drm_device *dev = (struct drm_device *)data; +@@ -480,18 +693,52 @@ struct dma_buf * + vc4_prime_export(struct drm_device *dev, struct drm_gem_object *obj, int flags) + { + struct vc4_bo *bo = to_vc4_bo(obj); ++ struct dma_buf *dmabuf; ++ int ret; + + if (bo->validated_shader) { + DRM_DEBUG("Attempting to export shader BO\n"); + return ERR_PTR(-EINVAL); + } + +- return drm_gem_prime_export(dev, obj, flags); ++ /* Note: as soon as the BO is exported it becomes unpurgeable, because ++ * noone ever decrements the usecnt even if the reference held by the ++ * exported BO is released. This shouldn't be a problem since we don't ++ * expect exported BOs to be marked as purgeable. ++ */ ++ ret = vc4_bo_inc_usecnt(bo); ++ if (ret) { ++ DRM_ERROR("Failed to increment BO usecnt\n"); ++ return ERR_PTR(ret); ++ } ++ ++ dmabuf = drm_gem_prime_export(dev, obj, flags); ++ if (IS_ERR(dmabuf)) ++ vc4_bo_dec_usecnt(bo); ++ ++ return dmabuf; ++} ++ ++int vc4_fault(struct vm_fault *vmf) ++{ ++ struct vm_area_struct *vma = vmf->vma; ++ struct drm_gem_object *obj = vma->vm_private_data; ++ struct vc4_bo *bo = to_vc4_bo(obj); ++ ++ /* The only reason we would end up here is when user-space accesses ++ * BO's memory after it's been purged. ++ */ ++ mutex_lock(&bo->madv_lock); ++ WARN_ON(bo->madv != __VC4_MADV_PURGED); ++ mutex_unlock(&bo->madv_lock); ++ ++ return VM_FAULT_SIGBUS; + } + + int vc4_mmap(struct file *filp, struct vm_area_struct *vma) + { + struct drm_gem_object *gem_obj; ++ unsigned long vm_pgoff; + struct vc4_bo *bo; + int ret; + +@@ -507,16 +754,36 @@ int vc4_mmap(struct file *filp, struct vm_area_struct *vma) + return -EINVAL; + } + ++ if (bo->madv != VC4_MADV_WILLNEED) { ++ DRM_DEBUG("mmaping of %s BO not allowed\n", ++ bo->madv == VC4_MADV_DONTNEED ? ++ "purgeable" : "purged"); ++ return -EINVAL; ++ } ++ + /* + * Clear the VM_PFNMAP flag that was set by drm_gem_mmap(), and set the + * vm_pgoff (used as a fake buffer offset by DRM) to 0 as we want to map + * the whole buffer. + */ + vma->vm_flags &= ~VM_PFNMAP; +- vma->vm_pgoff = 0; + ++ /* This ->vm_pgoff dance is needed to make all parties happy: ++ * - dma_mmap_wc() uses ->vm_pgoff as an offset within the allocated ++ * mem-region, hence the need to set it to zero (the value set by ++ * the DRM core is a virtual offset encoding the GEM object-id) ++ * - the mmap() core logic needs ->vm_pgoff to be restored to its ++ * initial value before returning from this function because it ++ * encodes the offset of this GEM in the dev->anon_inode pseudo-file ++ * and this information will be used when we invalidate userspace ++ * mappings with drm_vma_node_unmap() (called from vc4_gem_purge()). ++ */ ++ vm_pgoff = vma->vm_pgoff; ++ vma->vm_pgoff = 0; + ret = dma_mmap_wc(bo->base.base.dev->dev, vma, bo->base.vaddr, + bo->base.paddr, vma->vm_end - vma->vm_start); ++ vma->vm_pgoff = vm_pgoff; ++ + if (ret) + drm_gem_vm_close(vma); + +@@ -580,6 +847,8 @@ int vc4_create_bo_ioctl(struct drm_device *dev, void *data, + if (IS_ERR(bo)) + return PTR_ERR(bo); + ++ bo->madv = VC4_MADV_WILLNEED; ++ + ret = drm_gem_handle_create(file_priv, &bo->base.base, &args->handle); + drm_gem_object_put_unlocked(&bo->base.base); + +@@ -633,6 +902,8 @@ vc4_create_shader_bo_ioctl(struct drm_device *dev, void *data, + if (IS_ERR(bo)) + return PTR_ERR(bo); + ++ bo->madv = VC4_MADV_WILLNEED; ++ + if (copy_from_user(bo->base.vaddr, + (void __user *)(uintptr_t)args->data, + args->size)) { +diff --git a/drivers/gpu/drm/vc4/vc4_drv.c b/drivers/gpu/drm/vc4/vc4_drv.c +index 8555069607e1f3b735be3132320dacef2e66e8f8..982ec1bb3f01bec7b97dec0d8035163ae2c8625f 100644 +--- a/drivers/gpu/drm/vc4/vc4_drv.c ++++ b/drivers/gpu/drm/vc4/vc4_drv.c +@@ -100,6 +100,7 @@ static int vc4_get_param_ioctl(struct drm_device *dev, void *data, + case DRM_VC4_PARAM_SUPPORTS_ETC1: + case DRM_VC4_PARAM_SUPPORTS_THREADED_FS: + case DRM_VC4_PARAM_SUPPORTS_FIXED_RCL_ORDER: ++ case DRM_VC4_PARAM_SUPPORTS_MADVISE: + args->value = true; + break; + default: +@@ -117,6 +118,12 @@ static void vc4_lastclose(struct drm_device *dev) + drm_fbdev_cma_restore_mode(vc4->fbdev); + } + ++static const struct vm_operations_struct vc4_vm_ops = { ++ .fault = vc4_fault, ++ .open = drm_gem_vm_open, ++ .close = drm_gem_vm_close, ++}; ++ + static const struct file_operations vc4_drm_fops = { + .owner = THIS_MODULE, + .open = drm_open, +@@ -142,6 +149,7 @@ static const struct drm_ioctl_desc vc4_drm_ioctls[] = { + DRM_IOCTL_DEF_DRV(VC4_SET_TILING, vc4_set_tiling_ioctl, DRM_RENDER_ALLOW), + DRM_IOCTL_DEF_DRV(VC4_GET_TILING, vc4_get_tiling_ioctl, DRM_RENDER_ALLOW), + DRM_IOCTL_DEF_DRV(VC4_LABEL_BO, vc4_label_bo_ioctl, DRM_RENDER_ALLOW), ++ DRM_IOCTL_DEF_DRV(VC4_GEM_MADVISE, vc4_gem_madvise_ioctl, DRM_RENDER_ALLOW), + }; + + static struct drm_driver vc4_drm_driver = { +@@ -166,7 +174,7 @@ static struct drm_driver vc4_drm_driver = { + + .gem_create_object = vc4_create_object, + .gem_free_object_unlocked = vc4_free_object, +- .gem_vm_ops = &drm_gem_cma_vm_ops, ++ .gem_vm_ops = &vc4_vm_ops, + + .prime_handle_to_fd = drm_gem_prime_handle_to_fd, + .prime_fd_to_handle = drm_gem_prime_fd_to_handle, +diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h +index 9d5e35ea5a7c9f134ec6e661b0056b47df9719ef..0d71831571ea68526d26310daf874b766832e73e 100644 +--- a/drivers/gpu/drm/vc4/vc4_drv.h ++++ b/drivers/gpu/drm/vc4/vc4_drv.h +@@ -77,6 +77,19 @@ struct vc4_dev { + /* Protects bo_cache and bo_labels. */ + struct mutex bo_lock; + ++ /* Purgeable BO pool. All BOs in this pool can have their memory ++ * reclaimed if the driver is unable to allocate new BOs. We also ++ * keep stats related to the purge mechanism here. ++ */ ++ struct { ++ struct list_head list; ++ unsigned int num; ++ size_t size; ++ unsigned int purged_num; ++ size_t purged_size; ++ struct mutex lock; ++ } purgeable; ++ + uint64_t dma_fence_context; + + /* Sequence number for the last job queued in bin_job_list. +@@ -195,6 +208,16 @@ struct vc4_bo { + * for user-allocated labels. + */ + int label; ++ ++ /* Count the number of active users. This is needed to determine ++ * whether we can move the BO to the purgeable list or not (when the BO ++ * is used by the GPU or the display engine we can't purge it). ++ */ ++ refcount_t usecnt; ++ ++ /* Store purgeable/purged state here */ ++ u32 madv; ++ struct mutex madv_lock; + }; + + static inline struct vc4_bo * +@@ -506,6 +529,7 @@ int vc4_get_hang_state_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv); + int vc4_label_bo_ioctl(struct drm_device *dev, void *data, + struct drm_file *file_priv); ++int vc4_fault(struct vm_fault *vmf); + int vc4_mmap(struct file *filp, struct vm_area_struct *vma); + struct reservation_object *vc4_prime_res_obj(struct drm_gem_object *obj); + int vc4_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma); +@@ -516,6 +540,10 @@ void *vc4_prime_vmap(struct drm_gem_object *obj); + int vc4_bo_cache_init(struct drm_device *dev); + void vc4_bo_cache_destroy(struct drm_device *dev); + int vc4_bo_stats_debugfs(struct seq_file *m, void *arg); ++int vc4_bo_inc_usecnt(struct vc4_bo *bo); ++void vc4_bo_dec_usecnt(struct vc4_bo *bo); ++void vc4_bo_add_to_purgeable_pool(struct vc4_bo *bo); ++void vc4_bo_remove_from_purgeable_pool(struct vc4_bo *bo); + + /* vc4_crtc.c */ + extern struct platform_driver vc4_crtc_driver; +@@ -564,6 +592,8 @@ void vc4_job_handle_completed(struct vc4_dev *vc4); + int vc4_queue_seqno_cb(struct drm_device *dev, + struct vc4_seqno_cb *cb, uint64_t seqno, + void (*func)(struct vc4_seqno_cb *cb)); ++int vc4_gem_madvise_ioctl(struct drm_device *dev, void *data, ++ struct drm_file *file_priv); + + /* vc4_hdmi.c */ + extern struct platform_driver vc4_hdmi_driver; +diff --git a/drivers/gpu/drm/vc4/vc4_gem.c b/drivers/gpu/drm/vc4/vc4_gem.c +index e554cbf18a55c30e6dce1ef8bf3a5a60a6b73407..277707cc97a0d52759a5f6a6feee17445d065789 100644 +--- a/drivers/gpu/drm/vc4/vc4_gem.c ++++ b/drivers/gpu/drm/vc4/vc4_gem.c +@@ -188,11 +188,22 @@ vc4_save_hang_state(struct drm_device *dev) + continue; + + for (j = 0; j < exec[i]->bo_count; j++) { ++ bo = to_vc4_bo(&exec[i]->bo[j]->base); ++ ++ /* Retain BOs just in case they were marked purgeable. ++ * This prevents the BO from being purged before ++ * someone had a chance to dump the hang state. ++ */ ++ WARN_ON(!refcount_read(&bo->usecnt)); ++ refcount_inc(&bo->usecnt); + drm_gem_object_get(&exec[i]->bo[j]->base); + kernel_state->bo[j + prev_idx] = &exec[i]->bo[j]->base; + } + + list_for_each_entry(bo, &exec[i]->unref_list, unref_head) { ++ /* No need to retain BOs coming from the ->unref_list ++ * because they are naturally unpurgeable. ++ */ + drm_gem_object_get(&bo->base.base); + kernel_state->bo[j + prev_idx] = &bo->base.base; + j++; +@@ -233,6 +244,26 @@ vc4_save_hang_state(struct drm_device *dev) + state->fdbgs = V3D_READ(V3D_FDBGS); + state->errstat = V3D_READ(V3D_ERRSTAT); + ++ /* We need to turn purgeable BOs into unpurgeable ones so that ++ * userspace has a chance to dump the hang state before the kernel ++ * decides to purge those BOs. ++ * Note that BO consistency at dump time cannot be guaranteed. For ++ * example, if the owner of these BOs decides to re-use them or mark ++ * them purgeable again there's nothing we can do to prevent it. ++ */ ++ for (i = 0; i < kernel_state->user_state.bo_count; i++) { ++ struct vc4_bo *bo = to_vc4_bo(kernel_state->bo[i]); ++ ++ if (bo->madv == __VC4_MADV_NOTSUPP) ++ continue; ++ ++ mutex_lock(&bo->madv_lock); ++ if (!WARN_ON(bo->madv == __VC4_MADV_PURGED)) ++ bo->madv = VC4_MADV_WILLNEED; ++ refcount_dec(&bo->usecnt); ++ mutex_unlock(&bo->madv_lock); ++ } ++ + spin_lock_irqsave(&vc4->job_lock, irqflags); + if (vc4->hang_state) { + spin_unlock_irqrestore(&vc4->job_lock, irqflags); +@@ -639,9 +670,6 @@ vc4_queue_submit(struct drm_device *dev, struct vc4_exec_info *exec, + * The command validator needs to reference BOs by their index within + * the submitted job's BO list. This does the validation of the job's + * BO list and reference counting for the lifetime of the job. +- * +- * Note that this function doesn't need to unreference the BOs on +- * failure, because that will happen at vc4_complete_exec() time. + */ + static int + vc4_cl_lookup_bos(struct drm_device *dev, +@@ -693,16 +721,47 @@ vc4_cl_lookup_bos(struct drm_device *dev, + DRM_DEBUG("Failed to look up GEM BO %d: %d\n", + i, handles[i]); + ret = -EINVAL; +- spin_unlock(&file_priv->table_lock); +- goto fail; ++ break; + } ++ + drm_gem_object_get(bo); + exec->bo[i] = (struct drm_gem_cma_object *)bo; + } + spin_unlock(&file_priv->table_lock); + ++ if (ret) ++ goto fail_put_bo; ++ ++ for (i = 0; i < exec->bo_count; i++) { ++ ret = vc4_bo_inc_usecnt(to_vc4_bo(&exec->bo[i]->base)); ++ if (ret) ++ goto fail_dec_usecnt; ++ } ++ ++ kvfree(handles); ++ return 0; ++ ++fail_dec_usecnt: ++ /* Decrease usecnt on acquired objects. ++ * We cannot rely on vc4_complete_exec() to release resources here, ++ * because vc4_complete_exec() has no information about which BO has ++ * had its ->usecnt incremented. ++ * To make things easier we just free everything explicitly and set ++ * exec->bo to NULL so that vc4_complete_exec() skips the 'BO release' ++ * step. ++ */ ++ for (i-- ; i >= 0; i--) ++ vc4_bo_dec_usecnt(to_vc4_bo(&exec->bo[i]->base)); ++ ++fail_put_bo: ++ /* Release any reference to acquired objects. */ ++ for (i = 0; i < exec->bo_count && exec->bo[i]; i++) ++ drm_gem_object_put_unlocked(&exec->bo[i]->base); ++ + fail: + kvfree(handles); ++ kvfree(exec->bo); ++ exec->bo = NULL; + return ret; + } + +@@ -835,8 +894,12 @@ vc4_complete_exec(struct drm_device *dev, struct vc4_exec_info *exec) + } + + if (exec->bo) { +- for (i = 0; i < exec->bo_count; i++) ++ for (i = 0; i < exec->bo_count; i++) { ++ struct vc4_bo *bo = to_vc4_bo(&exec->bo[i]->base); ++ ++ vc4_bo_dec_usecnt(bo); + drm_gem_object_put_unlocked(&exec->bo[i]->base); ++ } + kvfree(exec->bo); + } + +@@ -1100,6 +1163,9 @@ vc4_gem_init(struct drm_device *dev) + INIT_WORK(&vc4->job_done_work, vc4_job_done_work); + + mutex_init(&vc4->power_lock); ++ ++ INIT_LIST_HEAD(&vc4->purgeable.list); ++ mutex_init(&vc4->purgeable.lock); + } + + void +@@ -1123,3 +1189,81 @@ vc4_gem_destroy(struct drm_device *dev) + if (vc4->hang_state) + vc4_free_hang_state(dev, vc4->hang_state); + } ++ ++int vc4_gem_madvise_ioctl(struct drm_device *dev, void *data, ++ struct drm_file *file_priv) ++{ ++ struct drm_vc4_gem_madvise *args = data; ++ struct drm_gem_object *gem_obj; ++ struct vc4_bo *bo; ++ int ret; ++ ++ switch (args->madv) { ++ case VC4_MADV_DONTNEED: ++ case VC4_MADV_WILLNEED: ++ break; ++ default: ++ return -EINVAL; ++ } ++ ++ if (args->pad != 0) ++ return -EINVAL; ++ ++ gem_obj = drm_gem_object_lookup(file_priv, args->handle); ++ if (!gem_obj) { ++ DRM_DEBUG("Failed to look up GEM BO %d\n", args->handle); ++ return -ENOENT; ++ } ++ ++ bo = to_vc4_bo(gem_obj); ++ ++ /* Only BOs exposed to userspace can be purged. */ ++ if (bo->madv == __VC4_MADV_NOTSUPP) { ++ DRM_DEBUG("madvise not supported on this BO\n"); ++ ret = -EINVAL; ++ goto out_put_gem; ++ } ++ ++ /* Not sure it's safe to purge imported BOs. Let's just assume it's ++ * not until proven otherwise. ++ */ ++ if (gem_obj->import_attach) { ++ DRM_DEBUG("madvise not supported on imported BOs\n"); ++ ret = -EINVAL; ++ goto out_put_gem; ++ } ++ ++ mutex_lock(&bo->madv_lock); ++ ++ if (args->madv == VC4_MADV_DONTNEED && bo->madv == VC4_MADV_WILLNEED && ++ !refcount_read(&bo->usecnt)) { ++ /* If the BO is about to be marked as purgeable, is not used ++ * and is not already purgeable or purged, add it to the ++ * purgeable list. ++ */ ++ vc4_bo_add_to_purgeable_pool(bo); ++ } else if (args->madv == VC4_MADV_WILLNEED && ++ bo->madv == VC4_MADV_DONTNEED && ++ !refcount_read(&bo->usecnt)) { ++ /* The BO has not been purged yet, just remove it from ++ * the purgeable list. ++ */ ++ vc4_bo_remove_from_purgeable_pool(bo); ++ } ++ ++ /* Save the purged state. */ ++ args->retained = bo->madv != __VC4_MADV_PURGED; ++ ++ /* Update internal madv state only if the bo was not purged. */ ++ if (bo->madv != __VC4_MADV_PURGED) ++ bo->madv = args->madv; ++ ++ mutex_unlock(&bo->madv_lock); ++ ++ ret = 0; ++ ++out_put_gem: ++ drm_gem_object_put_unlocked(gem_obj); ++ ++ return ret; ++} +diff --git a/drivers/gpu/drm/vc4/vc4_plane.c b/drivers/gpu/drm/vc4/vc4_plane.c +index 4ad0b9fcae99f74fb89d09dd52d9ffe5be123e45..e2b3cd6d885b080a3c3077cc160a549bec9b0330 100644 +--- a/drivers/gpu/drm/vc4/vc4_plane.c ++++ b/drivers/gpu/drm/vc4/vc4_plane.c +@@ -23,6 +23,7 @@ + #include + #include + ++#include "uapi/drm/vc4_drm.h" + #include "vc4_drv.h" + #include "vc4_regs.h" + +@@ -774,21 +775,40 @@ static int vc4_prepare_fb(struct drm_plane *plane, + { + struct vc4_bo *bo; + struct dma_fence *fence; ++ int ret; + + if ((plane->state->fb == state->fb) || !state->fb) + return 0; + + bo = to_vc4_bo(&drm_fb_cma_get_gem_obj(state->fb, 0)->base); ++ ++ ret = vc4_bo_inc_usecnt(bo); ++ if (ret) ++ return ret; ++ + fence = reservation_object_get_excl_rcu(bo->resv); + drm_atomic_set_fence_for_plane(state, fence); + + return 0; + } + ++static void vc4_cleanup_fb(struct drm_plane *plane, ++ struct drm_plane_state *state) ++{ ++ struct vc4_bo *bo; ++ ++ if (plane->state->fb == state->fb || !state->fb) ++ return; ++ ++ bo = to_vc4_bo(&drm_fb_cma_get_gem_obj(state->fb, 0)->base); ++ vc4_bo_dec_usecnt(bo); ++} ++ + static const struct drm_plane_helper_funcs vc4_plane_helper_funcs = { + .atomic_check = vc4_plane_atomic_check, + .atomic_update = vc4_plane_atomic_update, + .prepare_fb = vc4_prepare_fb, ++ .cleanup_fb = vc4_cleanup_fb, + }; + + static void vc4_plane_destroy(struct drm_plane *plane) +diff --git a/include/uapi/drm/vc4_drm.h b/include/uapi/drm/vc4_drm.h +index afae870049636e9c5db9a10a03d40dc3beb4c6ee..52263b575bdc4e5d9a6c6e628b12918eba32d918 100644 +--- a/include/uapi/drm/vc4_drm.h ++++ b/include/uapi/drm/vc4_drm.h +@@ -41,6 +41,7 @@ extern "C" { + #define DRM_VC4_SET_TILING 0x08 + #define DRM_VC4_GET_TILING 0x09 + #define DRM_VC4_LABEL_BO 0x0a ++#define DRM_VC4_GEM_MADVISE 0x0b + + #define DRM_IOCTL_VC4_SUBMIT_CL DRM_IOWR(DRM_COMMAND_BASE + DRM_VC4_SUBMIT_CL, struct drm_vc4_submit_cl) + #define DRM_IOCTL_VC4_WAIT_SEQNO DRM_IOWR(DRM_COMMAND_BASE + DRM_VC4_WAIT_SEQNO, struct drm_vc4_wait_seqno) +@@ -53,6 +54,7 @@ extern "C" { + #define DRM_IOCTL_VC4_SET_TILING DRM_IOWR(DRM_COMMAND_BASE + DRM_VC4_SET_TILING, struct drm_vc4_set_tiling) + #define DRM_IOCTL_VC4_GET_TILING DRM_IOWR(DRM_COMMAND_BASE + DRM_VC4_GET_TILING, struct drm_vc4_get_tiling) + #define DRM_IOCTL_VC4_LABEL_BO DRM_IOWR(DRM_COMMAND_BASE + DRM_VC4_LABEL_BO, struct drm_vc4_label_bo) ++#define DRM_IOCTL_VC4_GEM_MADVISE DRM_IOWR(DRM_COMMAND_BASE + DRM_VC4_GEM_MADVISE, struct drm_vc4_gem_madvise) + + struct drm_vc4_submit_rcl_surface { + __u32 hindex; /* Handle index, or ~0 if not present. */ +@@ -305,6 +307,7 @@ struct drm_vc4_get_hang_state { + #define DRM_VC4_PARAM_SUPPORTS_ETC1 4 + #define DRM_VC4_PARAM_SUPPORTS_THREADED_FS 5 + #define DRM_VC4_PARAM_SUPPORTS_FIXED_RCL_ORDER 6 ++#define DRM_VC4_PARAM_SUPPORTS_MADVISE 7 + + struct drm_vc4_get_param { + __u32 param; +@@ -333,6 +336,22 @@ struct drm_vc4_label_bo { + __u64 name; + }; + ++/* ++ * States prefixed with '__' are internal states and cannot be passed to the ++ * DRM_IOCTL_VC4_GEM_MADVISE ioctl. ++ */ ++#define VC4_MADV_WILLNEED 0 ++#define VC4_MADV_DONTNEED 1 ++#define __VC4_MADV_PURGED 2 ++#define __VC4_MADV_NOTSUPP 3 ++ ++struct drm_vc4_gem_madvise { ++ __u32 handle; ++ __u32 madv; ++ __u32 retained; ++ __u32 pad; ++}; ++ + #if defined(__cplusplus) + } + #endif + +From 94bbbc00be9d9f2e26faaf6859244204ad04958a Mon Sep 17 00:00:00 2001 +From: Boris Brezillon +Date: Wed, 22 Nov 2017 21:39:28 +0100 +Subject: [PATCH 190/201] drm/vc4: Fix false positive WARN() backtrace on + refcount_inc() usage + +With CONFIG_REFCOUNT_FULL enabled, refcount_inc() complains when it's +passed a refcount object that has its counter set to 0. In this driver, +this is a valid use case since we want to increment ->usecnt only when +the BO object starts to be used by real HW components and this is +definitely not the case when the BO is created. + +Fix the problem by using refcount_inc_not_zero() instead of +refcount_inc() and fallback to refcount_set(1) when +refcount_inc_not_zero() returns false. Note that this 2-steps operation +is not racy here because the whole section is protected by a mutex +which guarantees that the counter does not change between the +refcount_inc_not_zero() and refcount_set() calls. + +Fixes: b9f19259b84d ("drm/vc4: Add the DRM_IOCTL_VC4_GEM_MADVISE ioctl") +Reported-by: Stefan Wahren +Signed-off-by: Boris Brezillon +Acked-by: Eric Anholt +Link: https://patchwork.freedesktop.org/patch/msgid/20171122203928.28135-1-boris.brezillon@free-electrons.com +(cherry picked from commit 5bfd40139d55790cbc8e56ad1ce4f974f1fa186d) +--- + drivers/gpu/drm/vc4/vc4_bo.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/vc4/vc4_bo.c b/drivers/gpu/drm/vc4/vc4_bo.c +index 01a53ba304f89769ccedf66f2cba361f809b54c8..55f03ad827ed82d967bcdb3c8f060226aac2036d 100644 +--- a/drivers/gpu/drm/vc4/vc4_bo.c ++++ b/drivers/gpu/drm/vc4/vc4_bo.c +@@ -637,7 +637,8 @@ int vc4_bo_inc_usecnt(struct vc4_bo *bo) + mutex_lock(&bo->madv_lock); + switch (bo->madv) { + case VC4_MADV_WILLNEED: +- refcount_inc(&bo->usecnt); ++ if (!refcount_inc_not_zero(&bo->usecnt)) ++ refcount_set(&bo->usecnt, 1); + ret = 0; + break; + case VC4_MADV_DONTNEED: + +From 4eebaa2a9e1d93784ba5f33b048af54969d669db Mon Sep 17 00:00:00 2001 +From: Eric Anholt +Date: Fri, 13 Oct 2017 17:12:55 -0700 +Subject: [PATCH 191/201] drm/vc4: Fix sleeps during the IRQ handler for DSI + transactions. + +VC4's DSI1 has a bug where the AXI connection is broken for 32-bit +writes from the CPU, so we use the DMA engine to DMA 32-bit values +into registers instead. That sleeps, so we can't do it from the top +half. + +As a solution, use an interrupt thread so that all our writes happen +when sleeping is is allowed. + +v2: Use IRQF_ONESHOT (suggested by Boris) +v3: Style nitpicks. + +Signed-off-by: Eric Anholt +Link: https://patchwork.freedesktop.org/patch/msgid/20171014001255.32005-1-eric@anholt.net +Reviewed-by: Boris Brezillon (v2) +(cherry picked from commit af0c8c10564aac5b6d67308129ec09c4ad5db476) +--- + drivers/gpu/drm/vc4/vc4_dsi.c | 32 ++++++++++++++++++++++++++++++-- + 1 file changed, 30 insertions(+), 2 deletions(-) + +diff --git a/drivers/gpu/drm/vc4/vc4_dsi.c b/drivers/gpu/drm/vc4/vc4_dsi.c +index 04796d7d0fdbb441c09ecbd9b4fbce41a7831534..9a1a559ba287c460b274c6a279883e69c62f7bdb 100644 +--- a/drivers/gpu/drm/vc4/vc4_dsi.c ++++ b/drivers/gpu/drm/vc4/vc4_dsi.c +@@ -1383,6 +1383,27 @@ static void dsi_handle_error(struct vc4_dsi *dsi, + *ret = IRQ_HANDLED; + } + ++/* ++ * Initial handler for port 1 where we need the reg_dma workaround. ++ * The register DMA writes sleep, so we can't do it in the top half. ++ * Instead we use IRQF_ONESHOT so that the IRQ gets disabled in the ++ * parent interrupt contrller until our interrupt thread is done. ++ */ ++static irqreturn_t vc4_dsi_irq_defer_to_thread_handler(int irq, void *data) ++{ ++ struct vc4_dsi *dsi = data; ++ u32 stat = DSI_PORT_READ(INT_STAT); ++ ++ if (!stat) ++ return IRQ_NONE; ++ ++ return IRQ_WAKE_THREAD; ++} ++ ++/* ++ * Normal IRQ handler for port 0, or the threaded IRQ handler for port ++ * 1 where we need the reg_dma workaround. ++ */ + static irqreturn_t vc4_dsi_irq_handler(int irq, void *data) + { + struct vc4_dsi *dsi = data; +@@ -1566,8 +1587,15 @@ static int vc4_dsi_bind(struct device *dev, struct device *master, void *data) + /* Clear any existing interrupt state. */ + DSI_PORT_WRITE(INT_STAT, DSI_PORT_READ(INT_STAT)); + +- ret = devm_request_irq(dev, platform_get_irq(pdev, 0), +- vc4_dsi_irq_handler, 0, "vc4 dsi", dsi); ++ if (dsi->reg_dma_mem) ++ ret = devm_request_threaded_irq(dev, platform_get_irq(pdev, 0), ++ vc4_dsi_irq_defer_to_thread_handler, ++ vc4_dsi_irq_handler, ++ IRQF_ONESHOT, ++ "vc4 dsi", dsi); ++ else ++ ret = devm_request_irq(dev, platform_get_irq(pdev, 0), ++ vc4_dsi_irq_handler, 0, "vc4 dsi", dsi); + if (ret) { + if (ret != -EPROBE_DEFER) + dev_err(dev, "Failed to get interrupt: %d\n", ret); + +From 501ce595625354292dddfa3cd32c519ed7f6fd5b Mon Sep 17 00:00:00 2001 +From: Kees Cook +Date: Tue, 24 Oct 2017 08:16:48 -0700 +Subject: [PATCH 192/201] drm/vc4: Convert timers to use timer_setup() + +In preparation for unconditionally passing the struct timer_list pointer to +all timer callbacks, switch to using the new timer_setup() and from_timer() +to pass the timer pointer explicitly. + +Cc: Eric Anholt +Cc: David Airlie +Cc: dri-devel@lists.freedesktop.org +Signed-off-by: Kees Cook +Signed-off-by: Eric Anholt +Link: https://patchwork.freedesktop.org/patch/msgid/20171024151648.GA104538@beast +Reviewed-by: Eric Anholt +(cherry picked from commit 33b54ea1109721dcd07d3f7ee753c07482021eed) +--- + drivers/gpu/drm/vc4/vc4_bo.c | 9 +++------ + drivers/gpu/drm/vc4/vc4_gem.c | 10 ++++------ + 2 files changed, 7 insertions(+), 12 deletions(-) + +diff --git a/drivers/gpu/drm/vc4/vc4_bo.c b/drivers/gpu/drm/vc4/vc4_bo.c +index 55f03ad827ed82d967bcdb3c8f060226aac2036d..2b587e5b4628fc62cbadd7e99466032438d7e5c3 100644 +--- a/drivers/gpu/drm/vc4/vc4_bo.c ++++ b/drivers/gpu/drm/vc4/vc4_bo.c +@@ -675,10 +675,9 @@ void vc4_bo_dec_usecnt(struct vc4_bo *bo) + mutex_unlock(&bo->madv_lock); + } + +-static void vc4_bo_cache_time_timer(unsigned long data) ++static void vc4_bo_cache_time_timer(struct timer_list *t) + { +- struct drm_device *dev = (struct drm_device *)data; +- struct vc4_dev *vc4 = to_vc4_dev(dev); ++ struct vc4_dev *vc4 = from_timer(vc4, t, bo_cache.time_timer); + + schedule_work(&vc4->bo_cache.time_work); + } +@@ -1040,9 +1039,7 @@ int vc4_bo_cache_init(struct drm_device *dev) + INIT_LIST_HEAD(&vc4->bo_cache.time_list); + + INIT_WORK(&vc4->bo_cache.time_work, vc4_bo_cache_time_work); +- setup_timer(&vc4->bo_cache.time_timer, +- vc4_bo_cache_time_timer, +- (unsigned long)dev); ++ timer_setup(&vc4->bo_cache.time_timer, vc4_bo_cache_time_timer, 0); + + return 0; + } +diff --git a/drivers/gpu/drm/vc4/vc4_gem.c b/drivers/gpu/drm/vc4/vc4_gem.c +index 277707cc97a0d52759a5f6a6feee17445d065789..638540943c61a5e095c87be8d2b2bf543ea933b1 100644 +--- a/drivers/gpu/drm/vc4/vc4_gem.c ++++ b/drivers/gpu/drm/vc4/vc4_gem.c +@@ -312,10 +312,10 @@ vc4_reset_work(struct work_struct *work) + } + + static void +-vc4_hangcheck_elapsed(unsigned long data) ++vc4_hangcheck_elapsed(struct timer_list *t) + { +- struct drm_device *dev = (struct drm_device *)data; +- struct vc4_dev *vc4 = to_vc4_dev(dev); ++ struct vc4_dev *vc4 = from_timer(vc4, t, hangcheck.timer); ++ struct drm_device *dev = vc4->dev; + uint32_t ct0ca, ct1ca; + unsigned long irqflags; + struct vc4_exec_info *bin_exec, *render_exec; +@@ -1156,9 +1156,7 @@ vc4_gem_init(struct drm_device *dev) + spin_lock_init(&vc4->job_lock); + + INIT_WORK(&vc4->hangcheck.reset_work, vc4_reset_work); +- setup_timer(&vc4->hangcheck.timer, +- vc4_hangcheck_elapsed, +- (unsigned long)dev); ++ timer_setup(&vc4->hangcheck.timer, vc4_hangcheck_elapsed, 0); + + INIT_WORK(&vc4->job_done_work, vc4_job_done_work); + + +From 4d3059fd708947186445b986b46d8cfdd9a8a782 Mon Sep 17 00:00:00 2001 +From: Stefan Schake +Date: Fri, 10 Nov 2017 02:05:06 +0100 +Subject: [PATCH 193/201] drm/vc4: Account for interrupts in flight + +Synchronously disable the IRQ to make the following cancel_work_sync +invocation effective. + +An interrupt in flight could enqueue further overflow mem work. As we +free the binner BO immediately following vc4_irq_uninstall this caused +a NULL pointer dereference in the work callback vc4_overflow_mem_work. + +Link: https://github.com/anholt/linux/issues/114 +Signed-off-by: Stefan Schake +Fixes: d5b1a78a772f ("drm/vc4: Add support for drawing 3D frames.") +Signed-off-by: Eric Anholt +Reviewed-by: Eric Anholt +Link: https://patchwork.freedesktop.org/patch/msgid/1510275907-993-2-git-send-email-stschake@gmail.com +(cherry picked from commit 253696ccd613fbdaa5aba1de44c461a058e0a114) +--- + drivers/gpu/drm/vc4/vc4_irq.c | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/drivers/gpu/drm/vc4/vc4_irq.c b/drivers/gpu/drm/vc4/vc4_irq.c +index fc1fc43a924dcc0c44a7a13858bfb53ccdf8fe32..26eddbb628936b91f20a000c405bfbc536324e89 100644 +--- a/drivers/gpu/drm/vc4/vc4_irq.c ++++ b/drivers/gpu/drm/vc4/vc4_irq.c +@@ -209,6 +209,9 @@ vc4_irq_postinstall(struct drm_device *dev) + { + struct vc4_dev *vc4 = to_vc4_dev(dev); + ++ /* Undo the effects of a previous vc4_irq_uninstall. */ ++ enable_irq(dev->irq); ++ + /* Enable both the render done and out of memory interrupts. */ + V3D_WRITE(V3D_INTENA, V3D_DRIVER_IRQS); + +@@ -226,6 +229,9 @@ vc4_irq_uninstall(struct drm_device *dev) + /* Clear any pending interrupts we might have left. */ + V3D_WRITE(V3D_INTCTL, V3D_DRIVER_IRQS); + ++ /* Finish any interrupt handler still in flight. */ ++ disable_irq(dev->irq); ++ + cancel_work_sync(&vc4->overflow_mem_work); + } + + +From dabedf91bcfc0b34ea482b4a720d4d0ff2cfebdb Mon Sep 17 00:00:00 2001 +From: Stefan Schake +Date: Fri, 29 Dec 2017 17:05:43 +0100 +Subject: [PATCH 194/201] drm/vc4: Move IRQ enable to PM path + +We were calling enable_irq on bind, where it was already enabled previously +by the IRQ helper. Additionally, dev->irq is not set correctly until after +postinstall and so was always zero here, triggering a warning in 4.15. +Fix both by moving the enable to the power management resume path, where we +know there was a previous disable invocation during suspend. + +Fixes: 253696ccd613 ("drm/vc4: Account for interrupts in flight") +Signed-off-by: Stefan Schake +Signed-off-by: Eric Anholt +Link: https://patchwork.freedesktop.org/patch/msgid/1514563543-32511-1-git-send-email-stschake@gmail.com +Tested-by: Stefan Wahren +Reviewed-by: Eric Anholt +(cherry picked from commit ce9caf2f79a5aa170a4b6456a03db639eed9c988) +--- + drivers/gpu/drm/vc4/vc4_irq.c | 3 --- + drivers/gpu/drm/vc4/vc4_v3d.c | 3 +++ + 2 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/drivers/gpu/drm/vc4/vc4_irq.c b/drivers/gpu/drm/vc4/vc4_irq.c +index 26eddbb628936b91f20a000c405bfbc536324e89..3dd62d75f5319dbffcd9d27ea6f60927d193eb92 100644 +--- a/drivers/gpu/drm/vc4/vc4_irq.c ++++ b/drivers/gpu/drm/vc4/vc4_irq.c +@@ -209,9 +209,6 @@ vc4_irq_postinstall(struct drm_device *dev) + { + struct vc4_dev *vc4 = to_vc4_dev(dev); + +- /* Undo the effects of a previous vc4_irq_uninstall. */ +- enable_irq(dev->irq); +- + /* Enable both the render done and out of memory interrupts. */ + V3D_WRITE(V3D_INTENA, V3D_DRIVER_IRQS); + +diff --git a/drivers/gpu/drm/vc4/vc4_v3d.c b/drivers/gpu/drm/vc4/vc4_v3d.c +index 622cd43840b8c53588396b6d1d82b5d234a69113..493f392b3a0a90e70820d3582c0847ebe3cc0bd7 100644 +--- a/drivers/gpu/drm/vc4/vc4_v3d.c ++++ b/drivers/gpu/drm/vc4/vc4_v3d.c +@@ -327,6 +327,9 @@ static int vc4_v3d_runtime_resume(struct device *dev) + return ret; + + vc4_v3d_init_hw(vc4->dev); ++ ++ /* We disabled the IRQ as part of vc4_irq_uninstall in suspend. */ ++ enable_irq(vc4->dev->irq); + vc4_irq_postinstall(vc4->dev); + + return 0; + +From 02cde8c33b3d6732cb3273cd793d4d82738cedf2 Mon Sep 17 00:00:00 2001 +From: Boris BREZILLON +Date: Wed, 1 Nov 2017 10:57:31 +0100 +Subject: [PATCH 195/201] drm/vc4: Fix wrong printk format in + vc4_bo_stats_debugfs() + +vc4->purgeable.size and vc4->purgeable.purged_size are size_t fields +and should be printed with a %zd specifier. + +Fixes: b9f19259b84d ("drm/vc4: Add the DRM_IOCTL_VC4_GEM_MADVISE ioctl") +Signed-off-by: Boris Brezillon +Reviewed-by: Gustavo Padovan +Reviewed-by: Eric Anholt +Link: https://patchwork.freedesktop.org/patch/msgid/20171101095731.14878-1-boris.brezillon@free-electrons.com +(cherry picked from commit 50f365cde4ffb5ae70c3f02384bbb46698aba65c) +--- + drivers/gpu/drm/vc4/vc4_bo.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/gpu/drm/vc4/vc4_bo.c b/drivers/gpu/drm/vc4/vc4_bo.c +index 2b587e5b4628fc62cbadd7e99466032438d7e5c3..2decc8e2c79f58aad6ea7626a32a0f26665d23eb 100644 +--- a/drivers/gpu/drm/vc4/vc4_bo.c ++++ b/drivers/gpu/drm/vc4/vc4_bo.c +@@ -88,11 +88,11 @@ int vc4_bo_stats_debugfs(struct seq_file *m, void *unused) + + mutex_lock(&vc4->purgeable.lock); + if (vc4->purgeable.num) +- seq_printf(m, "%30s: %6dkb BOs (%d)\n", "userspace BO cache", ++ seq_printf(m, "%30s: %6zdkb BOs (%d)\n", "userspace BO cache", + vc4->purgeable.size / 1024, vc4->purgeable.num); + + if (vc4->purgeable.purged_num) +- seq_printf(m, "%30s: %6dkb BOs (%d)\n", "total purged BO", ++ seq_printf(m, "%30s: %6zdkb BOs (%d)\n", "total purged BO", + vc4->purgeable.purged_size / 1024, + vc4->purgeable.purged_num); + mutex_unlock(&vc4->purgeable.lock); + +From dc229564cf81b042bd786d76a282f5dfc2cadc2c Mon Sep 17 00:00:00 2001 +From: Eric Anholt +Date: Wed, 20 Sep 2017 15:59:34 -0700 +Subject: [PATCH 196/201] drm/vc4: Reject HDMI modes with too high of clocks. + +Peter Robinson reported issues on Fedora with 4k monitors not having +their modes filtered down to 1920x1080 on Raspberry Pi. + +v2: Fix vc5 typo in place of vc4. + +Cc: Peter Robinson +Signed-off-by: Eric Anholt +Link: https://patchwork.freedesktop.org/patch/msgid/20170920225935.14566-1-eric@anholt.net +Acked-by: Daniel Vetter (v1) +(cherry picked from commit 32e823c63e90f7535ea1cc5311d25c0233e1456d) +--- + drivers/gpu/drm/vc4/vc4_hdmi.c | 15 +++++++++++++++ + 1 file changed, 15 insertions(+) + +diff --git a/drivers/gpu/drm/vc4/vc4_hdmi.c b/drivers/gpu/drm/vc4/vc4_hdmi.c +index 0b2088264039131f05c2f09bc9ba84d2d3793e39..8ab20c1e9e69e90b90c7f74640033f932df76ae7 100644 +--- a/drivers/gpu/drm/vc4/vc4_hdmi.c ++++ b/drivers/gpu/drm/vc4/vc4_hdmi.c +@@ -695,7 +695,22 @@ static void vc4_hdmi_encoder_enable(struct drm_encoder *encoder) + } + } + ++static enum drm_mode_status ++vc4_hdmi_encoder_mode_valid(struct drm_encoder *crtc, ++ const struct drm_display_mode *mode) ++{ ++ /* HSM clock must be 108% of the pixel clock. Additionally, ++ * the AXI clock needs to be at least 25% of pixel clock, but ++ * HSM ends up being the limiting factor. ++ */ ++ if (mode->clock > HSM_CLOCK_FREQ / (1000 * 108 / 100)) ++ return MODE_CLOCK_HIGH; ++ ++ return MODE_OK; ++} ++ + static const struct drm_encoder_helper_funcs vc4_hdmi_encoder_helper_funcs = { ++ .mode_valid = vc4_hdmi_encoder_mode_valid, + .disable = vc4_hdmi_encoder_disable, + .enable = vc4_hdmi_encoder_enable, + }; + +From 135bf726b5e10f5c5819eb55053d1992f9baee74 Mon Sep 17 00:00:00 2001 +From: Dave Stevenson +Date: Thu, 16 Nov 2017 14:22:29 +0000 +Subject: [PATCH 197/201] drm/vc4: Add support for DRM_FORMAT_RGB888 and + DRM_FORMAT_BGR888 + +Filling out the list of supported formats based on those the +hardware can support. + +Signed-off-by: Dave Stevenson +Signed-off-by: Eric Anholt +Reviewed-by: Eric Anholt +Link: https://patchwork.freedesktop.org/patch/msgid/b551205d1c33fa49eef2c33ed2d60c5339b2f299.1510841336.git.dave.stevenson@raspberrypi.org +(cherry picked from commit 88f8156fba43d040dc5af42f88db2c53d6c69443) +--- + drivers/gpu/drm/vc4/vc4_plane.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/drivers/gpu/drm/vc4/vc4_plane.c b/drivers/gpu/drm/vc4/vc4_plane.c +index e2b3cd6d885b080a3c3077cc160a549bec9b0330..497cb7d50946c6aa8e4d676982902694ff46e113 100644 +--- a/drivers/gpu/drm/vc4/vc4_plane.c ++++ b/drivers/gpu/drm/vc4/vc4_plane.c +@@ -120,6 +120,14 @@ static const struct hvs_format { + .drm = DRM_FORMAT_XRGB1555, .hvs = HVS_PIXEL_FORMAT_RGBA5551, + .pixel_order = HVS_PIXEL_ORDER_ABGR, .has_alpha = false, + }, ++ { ++ .drm = DRM_FORMAT_RGB888, .hvs = HVS_PIXEL_FORMAT_RGB888, ++ .pixel_order = HVS_PIXEL_ORDER_XRGB, .has_alpha = false, ++ }, ++ { ++ .drm = DRM_FORMAT_BGR888, .hvs = HVS_PIXEL_FORMAT_RGB888, ++ .pixel_order = HVS_PIXEL_ORDER_XBGR, .has_alpha = false, ++ }, + { + .drm = DRM_FORMAT_YUV422, + .hvs = HVS_PIXEL_FORMAT_YCBCR_YUV422_3PLANE, + +From 5e7b8dd6089f196e15c331e66669518dc8504bd3 Mon Sep 17 00:00:00 2001 +From: Dave Stevenson +Date: Thu, 16 Nov 2017 14:22:30 +0000 +Subject: [PATCH 198/201] drm/vc4: Use .pixel_order instead of custom + .flip_cbcr + +The hardware has enums for altering the Cr and Cb order, +so use this instead of having a flag which swaps the +order the pointers are presented to the hardware +(that only worked for 3 plane formats anyway). + +Explicitly sets .pixel_order in each case, rather than +relying on then default XYCBCR order being a value 0. + +Signed-off-by: Dave Stevenson +Signed-off-by: Eric Anholt +Reviewed-by: Eric Anholt +Link: https://patchwork.freedesktop.org/patch/msgid/563872b69c1e5df142cb15ebfca7f20056b8a64c.1510841336.git.dave.stevenson@raspberrypi.org +(cherry picked from commit 090cb0c690183be849e2bfa0427220f1e435fa30) +--- + drivers/gpu/drm/vc4/vc4_plane.c | 20 ++++++++------------ + 1 file changed, 8 insertions(+), 12 deletions(-) + +diff --git a/drivers/gpu/drm/vc4/vc4_plane.c b/drivers/gpu/drm/vc4/vc4_plane.c +index 497cb7d50946c6aa8e4d676982902694ff46e113..5c67090e93f5e574de197735f01c6c4dbbdd0180 100644 +--- a/drivers/gpu/drm/vc4/vc4_plane.c ++++ b/drivers/gpu/drm/vc4/vc4_plane.c +@@ -86,7 +86,6 @@ static const struct hvs_format { + u32 hvs; /* HVS_FORMAT_* */ + u32 pixel_order; + bool has_alpha; +- bool flip_cbcr; + } hvs_formats[] = { + { + .drm = DRM_FORMAT_XRGB8888, .hvs = HVS_PIXEL_FORMAT_RGBA8888, +@@ -131,28 +130,32 @@ static const struct hvs_format { + { + .drm = DRM_FORMAT_YUV422, + .hvs = HVS_PIXEL_FORMAT_YCBCR_YUV422_3PLANE, ++ .pixel_order = HVS_PIXEL_ORDER_XYCBCR, + }, + { + .drm = DRM_FORMAT_YVU422, + .hvs = HVS_PIXEL_FORMAT_YCBCR_YUV422_3PLANE, +- .flip_cbcr = true, ++ .pixel_order = HVS_PIXEL_ORDER_XYCRCB, + }, + { + .drm = DRM_FORMAT_YUV420, + .hvs = HVS_PIXEL_FORMAT_YCBCR_YUV420_3PLANE, ++ .pixel_order = HVS_PIXEL_ORDER_XYCBCR, + }, + { + .drm = DRM_FORMAT_YVU420, + .hvs = HVS_PIXEL_FORMAT_YCBCR_YUV420_3PLANE, +- .flip_cbcr = true, ++ .pixel_order = HVS_PIXEL_ORDER_XYCRCB, + }, + { + .drm = DRM_FORMAT_NV12, + .hvs = HVS_PIXEL_FORMAT_YCBCR_YUV420_2PLANE, ++ .pixel_order = HVS_PIXEL_ORDER_XYCBCR, + }, + { + .drm = DRM_FORMAT_NV16, + .hvs = HVS_PIXEL_FORMAT_YCBCR_YUV422_2PLANE, ++ .pixel_order = HVS_PIXEL_ORDER_XYCBCR, + }, + }; + +@@ -625,15 +628,8 @@ static int vc4_plane_mode_set(struct drm_plane *plane, + * The pointers may be any byte address. + */ + vc4_state->ptr0_offset = vc4_state->dlist_count; +- if (!format->flip_cbcr) { +- for (i = 0; i < num_planes; i++) +- vc4_dlist_write(vc4_state, vc4_state->offsets[i]); +- } else { +- WARN_ON_ONCE(num_planes != 3); +- vc4_dlist_write(vc4_state, vc4_state->offsets[0]); +- vc4_dlist_write(vc4_state, vc4_state->offsets[2]); +- vc4_dlist_write(vc4_state, vc4_state->offsets[1]); +- } ++ for (i = 0; i < num_planes; i++) ++ vc4_dlist_write(vc4_state, vc4_state->offsets[i]); + + /* Pointer Context Word 0/1/2: Written by the HVS */ + for (i = 0; i < num_planes; i++) + +From 4dfeb8e735feaad74b65c9d8cee2bd1bce3750d0 Mon Sep 17 00:00:00 2001 +From: Dave Stevenson +Date: Thu, 16 Nov 2017 14:22:31 +0000 +Subject: [PATCH 199/201] drm/vc4: Add support for NV21 and NV61. + +NV12 (YUV420 2 plane) and NV16 (YUV422 2 plane) were +supported, but NV21 and NV61 (same but with Cb and Cr +swapped) weren't. Add them. + +Signed-off-by: Dave Stevenson +Signed-off-by: Eric Anholt +Reviewed-by: Eric Anholt +Link: https://patchwork.freedesktop.org/patch/msgid/1f50799525e3401551dff2b0b2828b9ab892f75f.1510841336.git.dave.stevenson@raspberrypi.org +(cherry picked from commit cb20dd170d6a7d41e0f347998771b0e0db183438) +--- + drivers/gpu/drm/vc4/vc4_plane.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +diff --git a/drivers/gpu/drm/vc4/vc4_plane.c b/drivers/gpu/drm/vc4/vc4_plane.c +index 5c67090e93f5e574de197735f01c6c4dbbdd0180..44a956cb87c2184e8631868307538b15d2d2d476 100644 +--- a/drivers/gpu/drm/vc4/vc4_plane.c ++++ b/drivers/gpu/drm/vc4/vc4_plane.c +@@ -152,11 +152,21 @@ static const struct hvs_format { + .hvs = HVS_PIXEL_FORMAT_YCBCR_YUV420_2PLANE, + .pixel_order = HVS_PIXEL_ORDER_XYCBCR, + }, ++ { ++ .drm = DRM_FORMAT_NV21, ++ .hvs = HVS_PIXEL_FORMAT_YCBCR_YUV420_2PLANE, ++ .pixel_order = HVS_PIXEL_ORDER_XYCRCB, ++ }, + { + .drm = DRM_FORMAT_NV16, + .hvs = HVS_PIXEL_FORMAT_YCBCR_YUV422_2PLANE, + .pixel_order = HVS_PIXEL_ORDER_XYCBCR, + }, ++ { ++ .drm = DRM_FORMAT_NV61, ++ .hvs = HVS_PIXEL_FORMAT_YCBCR_YUV422_2PLANE, ++ .pixel_order = HVS_PIXEL_ORDER_XYCRCB, ++ }, + }; + + static const struct hvs_format *vc4_get_hvs_format(u32 drm_format) + +From f71c503f85bd910fd15aaafa540d5e02eadd45ce Mon Sep 17 00:00:00 2001 +From: Eric Anholt +Date: Mon, 23 Jan 2017 11:41:54 -0800 +Subject: [PATCH 200/201] BCM270X: Disable VEC unless vc4-kms-v3d is present. + +Signed-off-by: Eric Anholt +(cherry picked from commit dabd52db47d2e799323639734787e3a338c2b2a5) +--- + arch/arm/boot/dts/bcm2708-rpi.dtsi | 4 ++++ + arch/arm/boot/dts/overlays/vc4-kms-v3d-overlay.dts | 7 +++++++ + 2 files changed, 11 insertions(+) + +diff --git a/arch/arm/boot/dts/bcm2708-rpi.dtsi b/arch/arm/boot/dts/bcm2708-rpi.dtsi +index 46a4d33e148438e4ca7c8cc17a328705000b1b3a..36dcd483925590b57c1927d7204be50672040539 100644 +--- a/arch/arm/boot/dts/bcm2708-rpi.dtsi ++++ b/arch/arm/boot/dts/bcm2708-rpi.dtsi +@@ -160,3 +160,7 @@ sdhost_pins: &sdhost_gpio48 { + &cpu_thermal { + /delete-node/ trips; + }; ++ ++&vec { ++ status = "disabled"; ++}; +diff --git a/arch/arm/boot/dts/overlays/vc4-kms-v3d-overlay.dts b/arch/arm/boot/dts/overlays/vc4-kms-v3d-overlay.dts +index 7d0d659b4886147e7e3b7eb3f60d546592cf2853..8baa7f77cd94ca76e9a01346015402321c314f20 100644 +--- a/arch/arm/boot/dts/overlays/vc4-kms-v3d-overlay.dts ++++ b/arch/arm/boot/dts/overlays/vc4-kms-v3d-overlay.dts +@@ -141,6 +141,13 @@ + }; + }; + ++ fragment@17 { ++ target = <&vec>; ++ __overlay__ { ++ status = "okay"; ++ }; ++ }; ++ + __overrides__ { + cma-256 = <0>,"+0-1-2-3-4"; + cma-192 = <0>,"-0+1-2-3-4"; + +From f2dddba6d5b3076bceda86ad3fabcbc1d67c07ef Mon Sep 17 00:00:00 2001 +From: Eric Anholt +Date: Thu, 21 Dec 2017 13:32:09 -0800 +Subject: [PATCH 201/201] drm/vc4: Flush the caches before the render jobs, as + well. + +If the frame samples from a render target that was just written, its +cache flush during the binning step may have occurred before the +previous frame's RCL was completed. Flush the texture caches again +before starting each RCL job to make sure that the sampling of the +previous RCL's output is correct. + +Fixes flickering in the top left of 3DMMES Taiji. + +Signed-off-by: Eric Anholt +Fixes: ca26d28bbaa3 ("drm/vc4: improve throughput by pipelining binning and rendering jobs") +--- + drivers/gpu/drm/vc4/vc4_gem.c | 21 +++++++++++++++++++++ + 1 file changed, 21 insertions(+) + +diff --git a/drivers/gpu/drm/vc4/vc4_gem.c b/drivers/gpu/drm/vc4/vc4_gem.c +index 638540943c61a5e095c87be8d2b2bf543ea933b1..e3e868cdee7943c2ed1c61a294804e11f7eefee0 100644 +--- a/drivers/gpu/drm/vc4/vc4_gem.c ++++ b/drivers/gpu/drm/vc4/vc4_gem.c +@@ -436,6 +436,19 @@ vc4_flush_caches(struct drm_device *dev) + VC4_SET_FIELD(0xf, V3D_SLCACTL_ICC)); + } + ++static void ++vc4_flush_texture_caches(struct drm_device *dev) ++{ ++ struct vc4_dev *vc4 = to_vc4_dev(dev); ++ ++ V3D_WRITE(V3D_L2CACTL, ++ V3D_L2CACTL_L2CCLR); ++ ++ V3D_WRITE(V3D_SLCACTL, ++ VC4_SET_FIELD(0xf, V3D_SLCACTL_T1CC) | ++ VC4_SET_FIELD(0xf, V3D_SLCACTL_T0CC)); ++} ++ + /* Sets the registers for the next job to be actually be executed in + * the hardware. + * +@@ -474,6 +487,14 @@ vc4_submit_next_render_job(struct drm_device *dev) + if (!exec) + return; + ++ /* A previous RCL may have written to one of our textures, and ++ * our full cache flush at bin time may have occurred before ++ * that RCL completed. Flush the texture cache now, but not ++ * the instructions or uniforms (since we don't write those ++ * from an RCL). ++ */ ++ vc4_flush_texture_caches(dev); ++ + submit_cl(dev, 1, exec->ct1ca, exec->ct1ea); + } +