mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-25 00:11:13 +00:00
228e0e1039
Removed upstreamed: 01. backport-5.15/424-v6.4-0001-mtd-core-provide-unique-name-for-nvmem-device-take-t.patch 02. backport-5.15/424-v6.4-0002-mtd-core-fix-nvmem-error-reporting.patch 03. generic-backport/424-v6.4-0003-mtd-core-fix-error-path-for-nvmem-provider.patch 04. generic-backport/828-v6.4-0001-of-Fix-modalias-string-generation.patch 05. bcm4908/patches-5.15/031-v5.17-0002-arm64-dts-broadcom-bcm4908-add-DT-for-Netgear-RAXE50.patch 06. bcm4908/patches-5.15/033-v6.0-0001-arm64-dts-Add-DTS-files-for-bcmbca-SoC-BCM63158.patchgit 07. bcm4908/patches-5.15/033-v6.0-0002-arm64-dts-Add-DTS-files-for-bcmbca-SoC-BCM4912.patchgita 08. bcm4908/patches-5.15/033-v6.0-0010-arm64-dts-Add-base-DTS-file-for-bcmbca-device-Asus-G.patchgit 09. bcm4908/patches-5.15/034-v6.1-0005-arm64-dts-Move-BCM4908-dts-to-bcmbca-folder.patch 10. bcm4908/patches-5.15/036-v6.4-0002-arm64-dts-broadcom-bcmbca-bcm4908-fix-NAND-interrupt.patch 11. bcm4908/patches-5.15/036-v6.4-0004-arm64-dts-broadcom-bcmbca-bcm4908-fix-procmon-nodena.patch 12. ipq806x/patches-5.15/104-v6.0-06-ARM-dts-qcom-ipq8064-reduce-pci-IO-size-to-64K.patch Manually rebased: bcm27xx/patches-5.15/950-0078-BCM2708-Add-core-Device-Tree-support.patch bcm27xx/patches-5.15/950-0547-ARM-dts-Add-Pi-Zero-2-support.patch bcm4908/patches-5.15/033-v6.0-0001-arm64-dts-Add-DTS-files-for-bcmbca-SoC-BCM63158.patchgit bcm4908/patches-5.15/033-v6.0-0002-arm64-dts-Add-DTS-files-for-bcmbca-SoC-BCM4912.patchgit bcm4908/patches-5.15/030-v5.16-0001-arm64-dts-broadcom-bcm4908-Fix-NAND-node-name.patch bcm4908/patches-5.15/032-v5.18-0002-arm64-dts-broadcom-bcm4908-add-pinctrl-binding.patch bcm4908/patches-5.15/032-v5.18-0003-arm64-dts-broadcom-bcm4908-add-watchdog-block.patch bcm4908/patches-5.15/032-v5.18-0004-arm64-dts-broadcom-bcm4908-add-I2C-block.patch bcm4908/patches-5.15/033-v6.0-0003-ARM64-dts-Add-DTS-files-for-bcmbca-SoC-BCM6858.patchgit bcm4908/patches-5.15/033-v6.0-0008-arm64-dts-broadcom-bcm4908-Fix-timer-node-for-BCM490.patchgit bcm4908/patches-5.15/034-v6.1-0001-arm64-dts-broadcom-bcm4908-add-remaining-LED-pins.patch bcm4908/patches-5.15/034-v6.1-0002-arm64-dts-broadcom-bcm4908-add-LEDs-controller-block.patch bcm4908/patches-5.15/034-v6.1-0003-arm64-dts-broadcom-bcm4908-add-Asus-GT-AC5300-LEDs.patch bcm4908/patches-5.15/034-v6.1-0004-arm64-dts-bcmbca-update-BCM4908-board-dts-files.patch All other patches automatically rebased. Build system: x86_64 Build-tested: bcm2711/RPi4B, ramips/tplink_archer-a6-v3, filogic/xiaomi_redmi-router-ax6000-ubootmod Run-tested: bcm2711/RPi4B, ramips/tplink_archer-a6-v3, filogic/xiaomi_redmi-router-ax6000-ubootmod 01. https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v5.15.111&id=77112d23a671697f0f70695ab901f807e15d2093 02. https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v5.15.111&id=fe07b3b5af01f42b291f5da0da09d047f50b33a6 03. https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v5.15.111&id=273be36e420924237f6c9d43cdad96718c13dd52 04. https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v5.15.111&id=fe8ab85ed4958e58e991bba0aa0a655b552b0273 05. https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v5.15.111&id=6ae67829fa5e9e71f458f69db42f0e216225616a 06. https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v5.15.111&id=1994284cb9226b65ca3a6744ce3320218b584f26 07. https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v5.15.111&id=a46878476c5549a4fde15a31922ce80a50b23492 08. https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v5.15.111&id=112ff0f2530549d50510f116474924f9c4fad590 09. https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v5.15.111&id=7c253e98685e6d884d12e2618ef4d2ad90b4fbd7 10. https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v5.15.111&id=8444b46e163aa9559a0af0381a1d230ec4146eb2 11. https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v5.15.111&id=6d1af517817a760d7af3dee0fc4603645485495c 12. https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?h=v5.15.111&id=cc4f0e168a5630ad0491ac5328f1a89f3cf3d04e Signed-off-by: John Audia <therealgraysky@proton.me>
202 lines
6.9 KiB
Diff
202 lines
6.9 KiB
Diff
From 22ce134cee72bd9ef4b02c8769f868309f2ab8fd Mon Sep 17 00:00:00 2001
|
|
From: Maxime Ripard <maxime@cerno.tech>
|
|
Date: Thu, 19 Aug 2021 14:37:04 +0200
|
|
Subject: [PATCH] drm/probe-helper: Create a HPD IRQ event helper for a
|
|
single connector
|
|
|
|
The drm_helper_hpd_irq_event() function is iterating over all the
|
|
connectors when an hotplug event is detected.
|
|
|
|
During that iteration, it will call each connector detect function and
|
|
figure out if its status changed.
|
|
|
|
Finally, if any connector changed, it will notify the user-space and the
|
|
clients that something changed on the DRM device.
|
|
|
|
This is supposed to be used for drivers that don't have a hotplug
|
|
interrupt for individual connectors. However, drivers that can use an
|
|
interrupt for a single connector are left in the dust and can either
|
|
reimplement the logic used during the iteration for each connector or
|
|
use that helper and iterate over all connectors all the time.
|
|
|
|
Since both are suboptimal, let's create a helper that will only perform
|
|
the status detection on a single connector.
|
|
|
|
Signed-off-by: Maxime Ripard <maxime@cerno.tech>
|
|
|
|
---
|
|
|
|
Changes from v1:
|
|
- Rename the shared function
|
|
- Move the hotplug event notification out of the shared function
|
|
- Added missing locks
|
|
- Improve the documentation
|
|
- Switched to drm_dbg_kms
|
|
---
|
|
drivers/gpu/drm/drm_probe_helper.c | 120 ++++++++++++++++++++---------
|
|
include/drm/drm_probe_helper.h | 1 +
|
|
2 files changed, 86 insertions(+), 35 deletions(-)
|
|
|
|
--- a/drivers/gpu/drm/drm_probe_helper.c
|
|
+++ b/drivers/gpu/drm/drm_probe_helper.c
|
|
@@ -796,6 +796,86 @@ void drm_kms_helper_poll_fini(struct drm
|
|
}
|
|
EXPORT_SYMBOL(drm_kms_helper_poll_fini);
|
|
|
|
+static bool check_connector_changed(struct drm_connector *connector)
|
|
+{
|
|
+ struct drm_device *dev = connector->dev;
|
|
+ enum drm_connector_status old_status;
|
|
+ u64 old_epoch_counter;
|
|
+ bool changed = false;
|
|
+
|
|
+ /* Only handle HPD capable connectors. */
|
|
+ drm_WARN_ON(dev, !(connector->polled & DRM_CONNECTOR_POLL_HPD));
|
|
+
|
|
+ drm_WARN_ON(dev, !mutex_is_locked(&dev->mode_config.mutex));
|
|
+
|
|
+ old_status = connector->status;
|
|
+ old_epoch_counter = connector->epoch_counter;
|
|
+
|
|
+ drm_dbg_kms(dev, "[CONNECTOR:%d:%s] Old epoch counter %llu\n",
|
|
+ connector->base.id,
|
|
+ connector->name,
|
|
+ old_epoch_counter);
|
|
+
|
|
+ connector->status = drm_helper_probe_detect(connector, NULL, false);
|
|
+ drm_dbg_kms(dev, "[CONNECTOR:%d:%s] status updated from %s to %s\n",
|
|
+ connector->base.id,
|
|
+ connector->name,
|
|
+ drm_get_connector_status_name(old_status),
|
|
+ drm_get_connector_status_name(connector->status));
|
|
+
|
|
+ drm_dbg_kms(dev, "[CONNECTOR:%d:%s] New epoch counter %llu\n",
|
|
+ connector->base.id,
|
|
+ connector->name,
|
|
+ connector->epoch_counter);
|
|
+
|
|
+ /*
|
|
+ * Check if epoch counter had changed, meaning that we need
|
|
+ * to send a uevent.
|
|
+ */
|
|
+ if (old_epoch_counter != connector->epoch_counter)
|
|
+ changed = true;
|
|
+
|
|
+ return changed;
|
|
+}
|
|
+
|
|
+/**
|
|
+ * drm_connector_helper_hpd_irq_event - hotplug processing
|
|
+ * @connector: drm_connector
|
|
+ *
|
|
+ * Drivers can use this helper function to run a detect cycle on a connector
|
|
+ * which has the DRM_CONNECTOR_POLL_HPD flag set in its &polled member.
|
|
+ *
|
|
+ * This helper function is useful for drivers which can track hotplug
|
|
+ * interrupts for a single connector. Drivers that want to send a
|
|
+ * hotplug event for all connectors or can't track hotplug interrupts
|
|
+ * per connector need to use drm_helper_hpd_irq_event().
|
|
+ *
|
|
+ * This function must be called from process context with no mode
|
|
+ * setting locks held.
|
|
+ *
|
|
+ * Note that a connector can be both polled and probed from the hotplug
|
|
+ * handler, in case the hotplug interrupt is known to be unreliable.
|
|
+ */
|
|
+bool drm_connector_helper_hpd_irq_event(struct drm_connector *connector)
|
|
+{
|
|
+ struct drm_device *dev = connector->dev;
|
|
+ bool changed;
|
|
+
|
|
+ mutex_lock(&dev->mode_config.mutex);
|
|
+ changed = check_connector_changed(connector);
|
|
+ mutex_unlock(&dev->mode_config.mutex);
|
|
+
|
|
+ if (changed) {
|
|
+ drm_kms_helper_hotplug_event(dev);
|
|
+ drm_dbg_kms(dev, "[CONNECTOR:%d:%s] Sent hotplug event\n",
|
|
+ connector->base.id,
|
|
+ connector->name);
|
|
+ }
|
|
+
|
|
+ return changed;
|
|
+}
|
|
+EXPORT_SYMBOL(drm_connector_helper_hpd_irq_event);
|
|
+
|
|
/**
|
|
* drm_helper_hpd_irq_event - hotplug processing
|
|
* @dev: drm_device
|
|
@@ -809,9 +889,10 @@ EXPORT_SYMBOL(drm_kms_helper_poll_fini);
|
|
* interrupts for each connector.
|
|
*
|
|
* Drivers which support hotplug interrupts for each connector individually and
|
|
- * which have a more fine-grained detect logic should bypass this code and
|
|
- * directly call drm_kms_helper_hotplug_event() in case the connector state
|
|
- * changed.
|
|
+ * which have a more fine-grained detect logic can use
|
|
+ * drm_connector_helper_hpd_irq_event(). Alternatively, they should bypass this
|
|
+ * code and directly call drm_kms_helper_hotplug_event() in case the connector
|
|
+ * state changed.
|
|
*
|
|
* This function must be called from process context with no mode
|
|
* setting locks held.
|
|
@@ -823,9 +904,7 @@ bool drm_helper_hpd_irq_event(struct drm
|
|
{
|
|
struct drm_connector *connector;
|
|
struct drm_connector_list_iter conn_iter;
|
|
- enum drm_connector_status old_status;
|
|
bool changed = false;
|
|
- u64 old_epoch_counter;
|
|
|
|
if (!dev->mode_config.poll_enabled)
|
|
return false;
|
|
@@ -833,37 +912,8 @@ bool drm_helper_hpd_irq_event(struct drm
|
|
mutex_lock(&dev->mode_config.mutex);
|
|
drm_connector_list_iter_begin(dev, &conn_iter);
|
|
drm_for_each_connector_iter(connector, &conn_iter) {
|
|
- /* Only handle HPD capable connectors. */
|
|
- if (!(connector->polled & DRM_CONNECTOR_POLL_HPD))
|
|
- continue;
|
|
-
|
|
- old_status = connector->status;
|
|
-
|
|
- old_epoch_counter = connector->epoch_counter;
|
|
-
|
|
- DRM_DEBUG_KMS("[CONNECTOR:%d:%s] Old epoch counter %llu\n", connector->base.id,
|
|
- connector->name,
|
|
- old_epoch_counter);
|
|
-
|
|
- connector->status = drm_helper_probe_detect(connector, NULL, false);
|
|
- DRM_DEBUG_KMS("[CONNECTOR:%d:%s] status updated from %s to %s\n",
|
|
- connector->base.id,
|
|
- connector->name,
|
|
- drm_get_connector_status_name(old_status),
|
|
- drm_get_connector_status_name(connector->status));
|
|
-
|
|
- DRM_DEBUG_KMS("[CONNECTOR:%d:%s] New epoch counter %llu\n",
|
|
- connector->base.id,
|
|
- connector->name,
|
|
- connector->epoch_counter);
|
|
-
|
|
- /*
|
|
- * Check if epoch counter had changed, meaning that we need
|
|
- * to send a uevent.
|
|
- */
|
|
- if (old_epoch_counter != connector->epoch_counter)
|
|
+ if (check_connector_changed(connector))
|
|
changed = true;
|
|
-
|
|
}
|
|
drm_connector_list_iter_end(&conn_iter);
|
|
mutex_unlock(&dev->mode_config.mutex);
|
|
--- a/include/drm/drm_probe_helper.h
|
|
+++ b/include/drm/drm_probe_helper.h
|
|
@@ -18,6 +18,7 @@ int drm_helper_probe_detect(struct drm_c
|
|
void drm_kms_helper_poll_init(struct drm_device *dev);
|
|
void drm_kms_helper_poll_fini(struct drm_device *dev);
|
|
bool drm_helper_hpd_irq_event(struct drm_device *dev);
|
|
+bool drm_connector_helper_hpd_irq_event(struct drm_connector *connector);
|
|
void drm_kms_helper_hotplug_event(struct drm_device *dev);
|
|
|
|
void drm_kms_helper_poll_disable(struct drm_device *dev);
|