From: Jani Nikula <jani.nikula@intel.com>
To: Jani Nikula <jani.nikula@intel.com>,
intel-gfx@lists.freedesktop.org, Peter Wu <peter@lekensteyn.nl>,
Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Subject: [PATCH v3] drm/i915/opregion: update cadl based on actually active outputs
Date: Mon, 13 Jun 2016 13:00:07 +0300 [thread overview]
Message-ID: <1465812007-2353-1-git-send-email-jani.nikula@intel.com> (raw)
In-Reply-To: <a53350490cca15ad1a64f604fed19bd347922011.1465810007.git.jani.nikula@intel.com>
Previously we've just shoved the first eight devices in DIDL to CADL
(list of active outputs). Some of the active outputs may have been left
outside of CADL. The problem is, some BIOS implementations prevent
laptop brightness hotkey propagation if the flat panel is not active.
Now that we have connector to acpi device id mapping covered, we can
update CADL based on which outputs are actually active.
v3: actually git add the dev->dev_priv change.
Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Reviewed-and-tested-by: Peter Wu <peter@lekensteyn.nl>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
drivers/gpu/drm/i915/i915_drv.h | 2 +
drivers/gpu/drm/i915/intel_display.c | 2 +
drivers/gpu/drm/i915/intel_opregion.c | 70 ++++++++++++++++++-----------------
3 files changed, 41 insertions(+), 33 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 53d9e3fab489..148c47ae38f3 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -3646,6 +3646,7 @@ extern int intel_opregion_notify_encoder(struct intel_encoder *intel_encoder,
extern int intel_opregion_notify_adapter(struct drm_i915_private *dev_priv,
pci_power_t state);
extern int intel_opregion_get_panel_type(struct drm_i915_private *dev_priv);
+extern void intel_opregion_update_cadl(struct drm_i915_private *dev_priv);
#else
static inline int intel_opregion_setup(struct drm_i915_private *dev) { return 0; }
static inline void intel_opregion_init(struct drm_i915_private *dev) { }
@@ -3667,6 +3668,7 @@ static inline int intel_opregion_get_panel_type(struct drm_i915_private *dev)
{
return -ENODEV;
}
+static inline void intel_opregion_update_cadl(struct drm_i915_private *dev_priv) { return; }
#endif
/* intel_acpi.c */
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 801e4c17dd8d..c8fd85baf93d 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -13833,6 +13833,8 @@ static int intel_atomic_commit(struct drm_device *dev,
drm_atomic_state_free(state);
+ intel_opregion_update_cadl(dev_priv);
+
/* As one of the primary mmio accessors, KMS has a high likelihood
* of triggering bugs in unclaimed access. After we finish
* modesetting, see if an error has been flagged, and if so
diff --git a/drivers/gpu/drm/i915/intel_opregion.c b/drivers/gpu/drm/i915/intel_opregion.c
index 632f0178c2b0..8b3f7e6ae4bb 100644
--- a/drivers/gpu/drm/i915/intel_opregion.c
+++ b/drivers/gpu/drm/i915/intel_opregion.c
@@ -642,24 +642,6 @@ static struct notifier_block intel_opregion_notifier = {
* (version 3)
*/
-static u32 get_did(struct intel_opregion *opregion, int i)
-{
- u32 did;
-
- if (i < ARRAY_SIZE(opregion->acpi->didl)) {
- did = opregion->acpi->didl[i];
- } else {
- i -= ARRAY_SIZE(opregion->acpi->didl);
-
- if (WARN_ON(i >= ARRAY_SIZE(opregion->acpi->did2)))
- return 0;
-
- did = opregion->acpi->did2[i];
- }
-
- return did;
-}
-
static void set_did(struct intel_opregion *opregion, int i, u32 val)
{
if (i < ARRAY_SIZE(opregion->acpi->didl)) {
@@ -674,6 +656,14 @@ static void set_did(struct intel_opregion *opregion, int i, u32 val)
}
}
+static void set_cad(struct intel_opregion *opregion, int i, u32 val)
+{
+ if (WARN_ON(i >= ARRAY_SIZE(opregion->acpi->cadl)))
+ return;
+
+ opregion->acpi->cadl[i] = val;
+}
+
static u32 acpi_display_type(struct intel_connector *connector)
{
u32 display_type;
@@ -759,22 +749,36 @@ static void intel_didl_outputs(struct drm_i915_private *dev_priv)
set_did(opregion, i, 0);
}
-static void intel_setup_cadls(struct drm_i915_private *dev_priv)
+/* Update CADL to reflect active outputs. */
+void intel_opregion_update_cadl(struct drm_i915_private *dev_priv)
{
struct intel_opregion *opregion = &dev_priv->opregion;
- int i = 0;
- u32 disp_id;
-
- /* Initialize the CADL field by duplicating the DIDL values.
- * Technically, this is not always correct as display outputs may exist,
- * but not active. This initialization is necessary for some Clevo
- * laptops that check this field before processing the brightness and
- * display switching hotkeys. Just like DIDL, CADL is NULL-terminated if
- * there are less than eight devices. */
- do {
- disp_id = get_did(opregion, i);
- opregion->acpi->cadl[i] = disp_id;
- } while (++i < 8 && disp_id != 0);
+ struct intel_crtc *crtc;
+ int i = 0, max_active = ARRAY_SIZE(opregion->acpi->cadl);
+
+ for_each_intel_crtc(dev_priv->dev, crtc) {
+ struct intel_encoder *encoder;
+
+ if (!crtc->active)
+ continue;
+
+ for_each_encoder_on_crtc(dev_priv->dev, &crtc->base, encoder) {
+ struct intel_connector *connector;
+
+ for_each_connector_on_encoder(dev_priv->dev, &encoder->base, connector) {
+ if (i >= max_active) {
+ DRM_DEBUG_KMS("too many outputs active\n");
+ return;
+ }
+
+ set_cad(opregion, i++, connector->acpi_device_id);
+ }
+ }
+ }
+
+ /* If fewer than max active outputs, the list must be null terminated */
+ if (i < max_active)
+ set_cad(opregion, i, 0);
}
void intel_opregion_register(struct drm_i915_private *dev_priv)
@@ -786,7 +790,7 @@ void intel_opregion_register(struct drm_i915_private *dev_priv)
if (opregion->acpi) {
intel_didl_outputs(dev_priv);
- intel_setup_cadls(dev_priv);
+ intel_opregion_update_cadl(dev_priv);
/* Notify BIOS we are ready to handle ACPI video ext notifs.
* Right now, all the events are handled by the ACPI video module.
--
2.1.4
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
next prev parent reply other threads:[~2016-06-13 10:00 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-06-13 9:30 [PATCH v2 0/5] drm/i915/opregion: proper handling of DIDL and CADL Jani Nikula
2016-06-13 9:30 ` [PATCH v2 1/5] drm/i915/opregion: add acpi defines from the spec Jani Nikula
2016-06-13 9:30 ` [PATCH v2 2/5] drm/i915/opregion: abstract acpi display type getter for a connector Jani Nikula
2016-06-13 9:30 ` [PATCH v2 3/5] drm/i915/opregion: handle missing connector types for acpi display types Jani Nikula
2016-06-29 14:53 ` Jani Nikula
2016-06-13 9:30 ` [PATCH v2 4/5] drm/i915: make i915 the source of acpi device ids for _DOD Jani Nikula
2016-06-13 9:30 ` [PATCH v2 5/5] drm/i915/opregion: update cadl based on actually active outputs Jani Nikula
2016-06-13 9:57 ` kbuild test robot
2016-06-13 10:00 ` Jani Nikula [this message]
2016-06-13 10:21 ` [PATCH v3] " Maarten Lankhorst
2016-06-13 10:25 ` [PATCH v2 5/5] " kbuild test robot
2016-06-13 9:43 ` ✗ Ro.CI.BAT: failure for drm/i915/opregion: proper handling of DIDL and CADL (rev2) Patchwork
2016-06-13 10:29 ` ✗ Ro.CI.BAT: failure for drm/i915/opregion: proper handling of DIDL and CADL (rev3) Patchwork
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1465812007-2353-1-git-send-email-jani.nikula@intel.com \
--to=jani.nikula@intel.com \
--cc=intel-gfx@lists.freedesktop.org \
--cc=maarten.lankhorst@linux.intel.com \
--cc=peter@lekensteyn.nl \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox