* [PATCH v5 0/5] Enable lspcon support for GEN9 devices
@ 2016-10-14 9:24 Shashank Sharma
2016-10-14 9:24 ` [PATCH v5 1/5] drm: Helper for lspcon in drm_dp_dual_mode Shashank Sharma
` (5 more replies)
0 siblings, 6 replies; 11+ messages in thread
From: Shashank Sharma @ 2016-10-14 9:24 UTC (permalink / raw)
To: imre.deak; +Cc: daniel.vetter, intel-gfx
LSPCON is essentially a dp++->hdmi adapter with dual mode of operation.
These modes are:
- Level Shifter mode: In LS mode, this device works as a type2 dp->hdmi
passive dongle, which steps up DP++ output to appropriate HDMI 1.4 signal.
This mode doesn't do any conversion at the protocol level.
- Protocol Converter mode: In PCON mode, this device acts as an
active DP++->HDMI 2.0 dongle, which converts the DP++ output to
compatible HDMI 2.0 output. In PCON mode, lspcon can support 4k@60
outputs, using DP HBR2 mode.
Many of Intel GEN9 devices come with in-built lspcon card
in motherboartd down mode. This patch series adds support for
lspcon devices in I915 driver.
While unit-testing this code, I was able to see a 4k@60 modeset with:
- BXT-T board
- Single HDMI 4k@60 display (ACER S)
- Ubuntu 14.04 desktop
V2: Worked on review comments from Ville
- In general, Ville suggested not to use the dual personality of
DDI to drive lspcon, so this patch set drives it just as DP++ display.
There is no separate detection for lspcon (hpd_pulse is good enough), and
its being driven as a DP display with special initialization and EDID
read sequence. To be able to do this, we driving lspcon in PCON mode only,
where it can serve both HDMI1.3/HDMI1.4 sinks as well as 4k@60 capable
HDMI 2.0 sinks. So compared to previous series, there is one patch less,
as we have dropped lspcon detection patch.
V3: Addressed review comments from Rodrigo
Details available with respective patch.
V4: Addressed review comments from Ville
Details available with respective patch.
V5: Rebase, added a new patch for suspend/resume
Shashank Sharma (5):
drm: Helper for lspcon in drm_dp_dual_mode
drm/i915: Add lspcon support for I915 driver
drm/i915: Parse VBT data for lspcon
drm/i915: Enable lspcon initialization
drm/i915: Add lspcon resume function
drivers/gpu/drm/drm_dp_dual_mode_helper.c | 103 +++++++++++++++++++
drivers/gpu/drm/i915/Makefile | 1 +
drivers/gpu/drm/i915/i915_drv.c | 2 +
drivers/gpu/drm/i915/i915_drv.h | 5 +
drivers/gpu/drm/i915/intel_bios.c | 49 +++++++++
drivers/gpu/drm/i915/intel_ddi.c | 29 +++++-
drivers/gpu/drm/i915/intel_drv.h | 10 ++
drivers/gpu/drm/i915/intel_lspcon.c | 165 ++++++++++++++++++++++++++++++
include/drm/drm_dp_dual_mode_helper.h | 26 +++++
9 files changed, 389 insertions(+), 1 deletion(-)
create mode 100644 drivers/gpu/drm/i915/intel_lspcon.c
--
1.9.1
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH v5 1/5] drm: Helper for lspcon in drm_dp_dual_mode
2016-10-14 9:24 [PATCH v5 0/5] Enable lspcon support for GEN9 devices Shashank Sharma
@ 2016-10-14 9:24 ` Shashank Sharma
2016-10-14 9:24 ` [PATCH v5 2/5] drm/i915: Add lspcon support for I915 driver Shashank Sharma
` (4 subsequent siblings)
5 siblings, 0 replies; 11+ messages in thread
From: Shashank Sharma @ 2016-10-14 9:24 UTC (permalink / raw)
To: imre.deak; +Cc: daniel.vetter, intel-gfx
This patch adds lspcon support in dp_dual_mode helper.
lspcon is essentially a dp->hdmi dongle with dual personality.
LS mode: It works as a passive dongle, by level shifting DP++
signals to HDMI signals, in LS mode.
PCON mode: It works as a protocol converter active dongle
in pcon mode, by converting DP++ outputs to HDMI 2.0 outputs.
This patch adds support for lspcon detection and mode set
switch operations, as a dp dual mode dongle.
v2: Addressed review comments from Ville
- add adaptor id for lspcon devices (0x08), use it to identify lspcon
- change function names
old: drm_lspcon_get_current_mode/drm_lspcon_change_mode
new: drm_lspcon_get_mode/drm_lspcon_set_mode
- change drm_lspcon_get_mode type to int, to match
drm_dp_dual_mode_get_tmds_output
- change 'err' to 'ret' to match the rest of the functions
- remove pointless typecasting during call to dual_mode_read
- fix the but while setting value of data, while writing lspcon mode
- fix indentation
- change mdelay(10) -> msleep(10)
- return ETIMEDOUT instead of EFAULT, when lspcon mode change times out
- Add an empty line to separate std regs macros and lspcon regs macros
Indent bit definition
v3: Addressed review comments from Rodrigo
- change macro name from DP_DUAL_MODE_TYPE_LSPCON to
DP_DUAL_MODE_TYPE_HAS_DPCD for better readability
- change macro name from DP_DUAL_MODE_LSPCON_MODE_PCON to
DP_DUAL_MODE_LSPCON_MODE_PCON for better readability
- add comment for MCA specific offsets like 0x40 and 0x41
- remove DP_DUAL_MODE_REV_TYPE2 check while checking lspcon adapter id
v4: Addressed review comments from Ville
- Fixed indentation at few places
- s/current_mode/mode
- s/reqd_mode/mode
- remove unnecessary void* cast
- remove drm_edid.h from includes
- Add a comment for _HAS_DPCD
- Fix enum description, for lspcon_mode.
v5: Rebase
Signed-off-by: Shashank Sharma <shashank.sharma@intel.com>
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
drivers/gpu/drm/drm_dp_dual_mode_helper.c | 103 ++++++++++++++++++++++++++++++
include/drm/drm_dp_dual_mode_helper.h | 26 ++++++++
2 files changed, 129 insertions(+)
diff --git a/drivers/gpu/drm/drm_dp_dual_mode_helper.c b/drivers/gpu/drm/drm_dp_dual_mode_helper.c
index a7b2a75..a7aeb1e 100644
--- a/drivers/gpu/drm/drm_dp_dual_mode_helper.c
+++ b/drivers/gpu/drm/drm_dp_dual_mode_helper.c
@@ -148,6 +148,14 @@ static bool is_type2_adaptor(uint8_t adaptor_id)
DP_DUAL_MODE_REV_TYPE2);
}
+bool is_lspcon_adaptor(const char hdmi_id[DP_DUAL_MODE_HDMI_ID_LEN],
+ const uint8_t adaptor_id)
+{
+ return is_hdmi_adaptor(hdmi_id) &&
+ (adaptor_id == (DP_DUAL_MODE_TYPE_TYPE2 |
+ DP_DUAL_MODE_TYPE_HAS_DPCD));
+}
+
/**
* drm_dp_dual_mode_detect - Identify the DP dual mode adaptor
* @adapter: I2C adapter for the DDC bus
@@ -203,6 +211,8 @@ enum drm_dp_dual_mode_type drm_dp_dual_mode_detect(struct i2c_adapter *adapter)
ret = drm_dp_dual_mode_read(adapter, DP_DUAL_MODE_ADAPTOR_ID,
&adaptor_id, sizeof(adaptor_id));
if (ret == 0) {
+ if (is_lspcon_adaptor(hdmi_id, adaptor_id))
+ return DRM_DP_DUAL_MODE_LSPCON;
if (is_type2_adaptor(adaptor_id)) {
if (is_hdmi_adaptor(hdmi_id))
return DRM_DP_DUAL_MODE_TYPE2_HDMI;
@@ -364,3 +374,96 @@ const char *drm_dp_get_dual_mode_type_name(enum drm_dp_dual_mode_type type)
}
}
EXPORT_SYMBOL(drm_dp_get_dual_mode_type_name);
+
+/**
+ * drm_lspcon_get_mode: Get LSPCON's current mode of operation by
+ * by reading offset (0x80, 0x41)
+ * @i2c_adapter: I2C-over-aux adapter
+ * @current_mode: out vaiable, current lspcon mode of operation
+ *
+ * Returns:
+ * 0 on success, sets the current_mode value to appropriate mode
+ * -error on failure
+ */
+int drm_lspcon_get_mode(struct i2c_adapter *adapter,
+ enum drm_lspcon_mode *mode)
+{
+ u8 data;
+ int ret = 0;
+
+ if (!mode) {
+ DRM_ERROR("NULL input\n");
+ return -EINVAL;
+ }
+
+ /* Read Status: i2c over aux */
+ ret = drm_dp_dual_mode_read(adapter, DP_DUAL_MODE_LSPCON_CURRENT_MODE,
+ &data, sizeof(data));
+ if (ret < 0) {
+ DRM_ERROR("LSPCON read(0x80, 0x41) failed\n");
+ return -EFAULT;
+ }
+
+ if (data & DP_DUAL_MODE_LSPCON_MODE_PCON)
+ *mode = DRM_LSPCON_MODE_PCON;
+ else
+ *mode = DRM_LSPCON_MODE_LS;
+ return 0;
+}
+EXPORT_SYMBOL(drm_lspcon_get_mode);
+
+/**
+ * drm_lspcon_change_mode: Change LSPCON's mode of operation by
+ * by writing offset (0x80, 0x40)
+ * @i2c_adapter: I2C-over-aux adapter
+ * @reqd_mode: required mode of operation
+ *
+ * Returns:
+ * 0 on success, -error on failure/timeout
+ */
+int drm_lspcon_set_mode(struct i2c_adapter *adapter,
+ enum drm_lspcon_mode mode)
+{
+ u8 data = 0;
+ int ret;
+ int time_out = 200;
+ enum drm_lspcon_mode current_mode;
+
+ if (mode == DRM_LSPCON_MODE_PCON)
+ data = DP_DUAL_MODE_LSPCON_MODE_PCON;
+
+ /* Change mode */
+ ret = drm_dp_dual_mode_write(adapter, DP_DUAL_MODE_LSPCON_MODE_CHANGE,
+ &data, sizeof(data));
+ if (ret < 0) {
+ DRM_ERROR("LSPCON mode change failed\n");
+ return ret;
+ }
+
+ /*
+ * Confirm mode change by reading the status bit.
+ * Sometimes, it takes a while to change the mode,
+ * so wait and retry until time out or done.
+ */
+ do {
+ ret = drm_lspcon_get_mode(adapter, ¤t_mode);
+ if (ret) {
+ DRM_ERROR("can't confirm LSPCON mode change\n");
+ return ret;
+ } else {
+ if (current_mode != mode) {
+ msleep(10);
+ time_out -= 10;
+ } else {
+ DRM_DEBUG_KMS("LSPCON mode changed to %s\n",
+ mode == DRM_LSPCON_MODE_LS ?
+ "LS" : "PCON");
+ return 0;
+ }
+ }
+ } while (time_out);
+
+ DRM_ERROR("LSPCON mode change timed out\n");
+ return -ETIMEDOUT;
+}
+EXPORT_SYMBOL(drm_lspcon_set_mode);
diff --git a/include/drm/drm_dp_dual_mode_helper.h b/include/drm/drm_dp_dual_mode_helper.h
index e8a9dfd..5567770 100644
--- a/include/drm/drm_dp_dual_mode_helper.h
+++ b/include/drm/drm_dp_dual_mode_helper.h
@@ -40,6 +40,8 @@
#define DP_DUAL_MODE_REV_TYPE2 0x00
#define DP_DUAL_MODE_TYPE_MASK 0xf0
#define DP_DUAL_MODE_TYPE_TYPE2 0xa0
+/* This field is marked reserved in dual mode spec, used in LSPCON */
+#define DP_DUAL_MODE_TYPE_HAS_DPCD 0x08
#define DP_DUAL_MODE_IEEE_OUI 0x11 /* 11-13*/
#define DP_DUAL_IEEE_OUI_LEN 3
#define DP_DUAL_DEVICE_ID 0x14 /* 14-19 */
@@ -55,6 +57,11 @@
#define DP_DUAL_MODE_CEC_ENABLE 0x01
#define DP_DUAL_MODE_I2C_SPEED_CTRL 0x22
+/* LSPCON specific registers, defined by MCA */
+#define DP_DUAL_MODE_LSPCON_MODE_CHANGE 0x40
+#define DP_DUAL_MODE_LSPCON_CURRENT_MODE 0x41
+#define DP_DUAL_MODE_LSPCON_MODE_PCON 0x1
+
struct i2c_adapter;
ssize_t drm_dp_dual_mode_read(struct i2c_adapter *adapter,
@@ -63,6 +70,19 @@ ssize_t drm_dp_dual_mode_write(struct i2c_adapter *adapter,
u8 offset, const void *buffer, size_t size);
/**
+* enum drm_lspcon_mode
+* @lspcon_mode_ls: Level shifter mode of LSPCON
+* which drives DP++ to HDMI 1.4 conversion.
+* @lspcon_mode_pcon: Protocol converter mode of LSPCON
+* which drives DP++ to HDMI 2.0 active conversion.
+*/
+enum drm_lspcon_mode {
+ DRM_LSPCON_MODE_INVALID,
+ DRM_LSPCON_MODE_LS,
+ DRM_LSPCON_MODE_PCON,
+};
+
+/**
* enum drm_dp_dual_mode_type - Type of the DP dual mode adaptor
* @DRM_DP_DUAL_MODE_NONE: No DP dual mode adaptor
* @DRM_DP_DUAL_MODE_UNKNOWN: Could be either none or type 1 DVI adaptor
@@ -70,6 +90,7 @@ ssize_t drm_dp_dual_mode_write(struct i2c_adapter *adapter,
* @DRM_DP_DUAL_MODE_TYPE1_HDMI: Type 1 HDMI adaptor
* @DRM_DP_DUAL_MODE_TYPE2_DVI: Type 2 DVI adaptor
* @DRM_DP_DUAL_MODE_TYPE2_HDMI: Type 2 HDMI adaptor
+ * @DRM_DP_DUAL_MODE_TYPE2_LSPCON: Level shifter /protocol converter
*/
enum drm_dp_dual_mode_type {
DRM_DP_DUAL_MODE_NONE,
@@ -78,6 +99,7 @@ enum drm_dp_dual_mode_type {
DRM_DP_DUAL_MODE_TYPE1_HDMI,
DRM_DP_DUAL_MODE_TYPE2_DVI,
DRM_DP_DUAL_MODE_TYPE2_HDMI,
+ DRM_DP_DUAL_MODE_LSPCON,
};
enum drm_dp_dual_mode_type drm_dp_dual_mode_detect(struct i2c_adapter *adapter);
@@ -89,4 +111,8 @@ int drm_dp_dual_mode_set_tmds_output(enum drm_dp_dual_mode_type type,
struct i2c_adapter *adapter, bool enable);
const char *drm_dp_get_dual_mode_type_name(enum drm_dp_dual_mode_type type);
+int drm_lspcon_get_mode(struct i2c_adapter *adapter,
+ enum drm_lspcon_mode *current_mode);
+int drm_lspcon_set_mode(struct i2c_adapter *adapter,
+ enum drm_lspcon_mode reqd_mode);
#endif
--
1.9.1
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v5 2/5] drm/i915: Add lspcon support for I915 driver
2016-10-14 9:24 [PATCH v5 0/5] Enable lspcon support for GEN9 devices Shashank Sharma
2016-10-14 9:24 ` [PATCH v5 1/5] drm: Helper for lspcon in drm_dp_dual_mode Shashank Sharma
@ 2016-10-14 9:24 ` Shashank Sharma
2016-10-14 9:24 ` [PATCH v5 3/5] drm/i915: Parse VBT data for lspcon Shashank Sharma
` (3 subsequent siblings)
5 siblings, 0 replies; 11+ messages in thread
From: Shashank Sharma @ 2016-10-14 9:24 UTC (permalink / raw)
To: imre.deak; +Cc: daniel.vetter, intel-gfx
This patch adds a new file, to accommodate lspcon support
for I915 driver. These functions probe, detect, initialize
and configure an on-board lspcon device during the driver
init time.
Also, this patch adds a small structure for lspcon device,
which will provide the runtime status of the device.
V2: addressed ville's review comments
- Clean the leftover macros from previous patch set
V3: Rebase
V4: addressed ville's review comments
- make internal functions static
- remove lspcon_detect_identifier, make it inline with lspcon_probe
- remove is_lspcon_active function
- remove force check while setting a lspcon mode
V5: Rebase
Signed-off-by: Shashank Sharma <shashank.sharma@intel.com>
Signed-off-by: Akashdeep Sharma <akashdeep.sharma@intel.com>
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
drivers/gpu/drm/i915/Makefile | 1 +
drivers/gpu/drm/i915/intel_drv.h | 9 +++
drivers/gpu/drm/i915/intel_lspcon.c | 127 ++++++++++++++++++++++++++++++++++++
3 files changed, 137 insertions(+)
create mode 100644 drivers/gpu/drm/i915/intel_lspcon.c
diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
index 8790ae4..6123400 100644
--- a/drivers/gpu/drm/i915/Makefile
+++ b/drivers/gpu/drm/i915/Makefile
@@ -101,6 +101,7 @@ i915-y += dvo_ch7017.o \
intel_dvo.o \
intel_hdmi.o \
intel_i2c.o \
+ intel_lspcon.o \
intel_lvds.o \
intel_panel.o \
intel_sdvo.o \
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 07b93f2..27837b0 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -953,12 +953,19 @@ struct intel_dp {
bool compliance_test_active;
};
+struct intel_lspcon {
+ bool active;
+ enum drm_lspcon_mode mode;
+ struct drm_dp_aux *aux;
+};
+
struct intel_digital_port {
struct intel_encoder base;
enum port port;
u32 saved_port_bits;
struct intel_dp dp;
struct intel_hdmi hdmi;
+ struct intel_lspcon lspcon;
enum irqreturn (*hpd_pulse)(struct intel_digital_port *, bool);
bool release_cl2_override;
uint8_t max_lanes;
@@ -1841,4 +1848,6 @@ int intel_color_check(struct drm_crtc *crtc, struct drm_crtc_state *state);
void intel_color_set_csc(struct drm_crtc_state *crtc_state);
void intel_color_load_luts(struct drm_crtc_state *crtc_state);
+/* intel_lspcon.c */
+bool lspcon_init(struct intel_digital_port *intel_dig_port);
#endif /* __INTEL_DRV_H__ */
diff --git a/drivers/gpu/drm/i915/intel_lspcon.c b/drivers/gpu/drm/i915/intel_lspcon.c
new file mode 100644
index 0000000..aa74b1f
--- /dev/null
+++ b/drivers/gpu/drm/i915/intel_lspcon.c
@@ -0,0 +1,127 @@
+/*
+ * Copyright © 2016 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ *
+ */
+#include <drm/drm_edid.h>
+#include <drm/drm_atomic_helper.h>
+#include <drm/drm_dp_dual_mode_helper.h>
+#include "intel_drv.h"
+
+enum drm_lspcon_mode lspcon_get_current_mode(struct intel_lspcon *lspcon)
+{
+ enum drm_lspcon_mode current_mode = DRM_LSPCON_MODE_INVALID;
+ struct i2c_adapter *adapter = &lspcon->aux->ddc;
+
+ if (drm_lspcon_get_mode(adapter, ¤t_mode))
+ DRM_ERROR("Error reading LSPCON mode\n");
+ else
+ DRM_DEBUG_KMS("Current LSPCON mode %s\n",
+ current_mode == DRM_LSPCON_MODE_PCON ? "PCON" : "LS");
+ return current_mode;
+}
+
+static int lspcon_change_mode(struct intel_lspcon *lspcon,
+ enum drm_lspcon_mode mode, bool force)
+{
+ int err;
+ enum drm_lspcon_mode current_mode;
+ struct i2c_adapter *adapter = &lspcon->aux->ddc;
+
+ err = drm_lspcon_get_mode(adapter, ¤t_mode);
+ if (err) {
+ DRM_ERROR("Error reading LSPCON mode\n");
+ return err;
+ }
+
+ if (current_mode == mode) {
+ DRM_DEBUG_KMS("Current mode = desired LSPCON mode\n");
+ return 0;
+ }
+
+ err = drm_lspcon_set_mode(adapter, mode);
+ if (err < 0) {
+ DRM_ERROR("LSPCON mode change failed\n");
+ return err;
+ }
+
+ lspcon->mode = mode;
+ DRM_DEBUG_KMS("LSPCON mode changed done\n");
+ return 0;
+}
+
+static bool lspcon_probe(struct intel_lspcon *lspcon)
+{
+ enum drm_dp_dual_mode_type adaptor_type;
+ struct i2c_adapter *adapter = &lspcon->aux->ddc;
+
+ /* Lets probe the adaptor and check its type */
+ adaptor_type = drm_dp_dual_mode_detect(adapter);
+ if (adaptor_type != DRM_DP_DUAL_MODE_LSPCON) {
+ DRM_DEBUG_KMS("No LSPCON detected, found %s\n",
+ drm_dp_get_dual_mode_type_name(adaptor_type));
+ return false;
+ }
+
+ /* Yay ... got a LSPCON device */
+ DRM_DEBUG_KMS("LSPCON detected\n");
+ lspcon->mode = lspcon_get_current_mode(lspcon);
+ lspcon->active = true;
+ return true;
+}
+
+bool lspcon_init(struct intel_digital_port *intel_dig_port)
+{
+ struct intel_dp *dp = &intel_dig_port->dp;
+ struct intel_lspcon *lspcon = &intel_dig_port->lspcon;
+ struct drm_device *dev = intel_dig_port->base.base.dev;
+
+ if (!IS_GEN9(dev)) {
+ DRM_ERROR("LSPCON is supported on GEN9 only\n");
+ return false;
+ }
+
+ lspcon->active = false;
+ lspcon->mode = DRM_LSPCON_MODE_INVALID;
+ lspcon->aux = &dp->aux;
+
+ if (!lspcon_probe(lspcon)) {
+ DRM_ERROR("Failed to probe lspcon\n");
+ return false;
+ }
+
+ /*
+ * In the SW state machine, lets Put LSPCON in PCON mode only.
+ * In this way, it will work with both HDMI 1.4 sinks as well as HDMI
+ * 2.0 sinks.
+ */
+ if (lspcon->active && lspcon->mode != DRM_LSPCON_MODE_PCON) {
+ if (lspcon_change_mode(lspcon, DRM_LSPCON_MODE_PCON,
+ true) < 0) {
+ DRM_ERROR("LSPCON mode change to PCON failed\n");
+ return false;
+ }
+ }
+
+ DRM_DEBUG_KMS("Success: LSPCON init\n");
+ return true;
+}
--
1.9.1
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v5 3/5] drm/i915: Parse VBT data for lspcon
2016-10-14 9:24 [PATCH v5 0/5] Enable lspcon support for GEN9 devices Shashank Sharma
2016-10-14 9:24 ` [PATCH v5 1/5] drm: Helper for lspcon in drm_dp_dual_mode Shashank Sharma
2016-10-14 9:24 ` [PATCH v5 2/5] drm/i915: Add lspcon support for I915 driver Shashank Sharma
@ 2016-10-14 9:24 ` Shashank Sharma
2016-10-14 9:24 ` [PATCH v5 4/5] drm/i915: Enable lspcon initialization Shashank Sharma
` (2 subsequent siblings)
5 siblings, 0 replies; 11+ messages in thread
From: Shashank Sharma @ 2016-10-14 9:24 UTC (permalink / raw)
To: imre.deak; +Cc: daniel.vetter, intel-gfx
Many GEN9 boards come with on-board lspcon cards.
Fot these boards, VBT configuration should properly point out
if a particular port contains lspcon device, so that driver can
initialize it properly.
This patch adds a utility function, which checks the VBT flag
for lspcon bit, and tells us if a port is configured to have a
lspcon device or not.
V2: Fixed review comments from Ville
- Do not forget PORT_D while checking lspcon for GEN9
V3: Addressed review comments from Rodrigo
- Create a HAS_LSPCON() macro for better use case handling.
- Do not dump warnings for non-gen-9 platforms, it will be noise.
V4: Rebase
V5: Rebase
Signed-off-by: Shashank Sharma <shashank.sharma@intel.com>
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
drivers/gpu/drm/i915/i915_drv.h | 5 ++++
drivers/gpu/drm/i915/intel_bios.c | 49 +++++++++++++++++++++++++++++++++++++++
2 files changed, 54 insertions(+)
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 6360e80..ef79389 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -2867,6 +2867,8 @@ struct drm_i915_cmd_table {
#define HAS_GMCH_DISPLAY(dev) (INTEL_INFO(dev)->has_gmch_display)
+#define HAS_LSPCON(dev) (IS_GEN9(dev))
+
/* DPF == dynamic parity feature */
#define HAS_L3_DPF(dev) (INTEL_INFO(dev)->has_l3_dpf)
#define NUM_L3_SLICES(dev) (IS_HSW_GT3(dev) ? 2 : HAS_L3_DPF(dev))
@@ -3633,6 +3635,9 @@ bool intel_bios_is_port_dp_dual_mode(struct drm_i915_private *dev_priv, enum por
bool intel_bios_is_dsi_present(struct drm_i915_private *dev_priv, enum port *port);
bool intel_bios_is_port_hpd_inverted(struct drm_i915_private *dev_priv,
enum port port);
+bool intel_bios_is_lspcon_present(struct drm_i915_private *dev_priv,
+ enum port port);
+
/* intel_opregion.c */
#ifdef CONFIG_ACPI
diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c
index 83667e8..32e1def 100644
--- a/drivers/gpu/drm/i915/intel_bios.c
+++ b/drivers/gpu/drm/i915/intel_bios.c
@@ -1763,3 +1763,52 @@ intel_bios_is_port_hpd_inverted(struct drm_i915_private *dev_priv,
return false;
}
+
+/**
+ * intel_bios_is_lspcon_present - if LSPCON is attached on %port
+ * @dev_priv: i915 device instance
+ * @port: port to check
+ *
+ * Return true if LSPCON is present on this port
+ */
+bool
+intel_bios_is_lspcon_present(struct drm_i915_private *dev_priv,
+ enum port port)
+{
+ int i;
+
+ if (!HAS_LSPCON(dev_priv))
+ return false;
+
+ for (i = 0; i < dev_priv->vbt.child_dev_num; i++) {
+ if (!dev_priv->vbt.child_dev[i].common.lspcon)
+ continue;
+
+ switch (dev_priv->vbt.child_dev[i].common.dvo_port) {
+ case DVO_PORT_DPA:
+ case DVO_PORT_HDMIA:
+ if (port == PORT_A)
+ return true;
+ break;
+ case DVO_PORT_DPB:
+ case DVO_PORT_HDMIB:
+ if (port == PORT_B)
+ return true;
+ break;
+ case DVO_PORT_DPC:
+ case DVO_PORT_HDMIC:
+ if (port == PORT_C)
+ return true;
+ break;
+ case DVO_PORT_DPD:
+ case DVO_PORT_HDMID:
+ if (port == PORT_D)
+ return true;
+ break;
+ default:
+ break;
+ }
+ }
+
+ return false;
+}
--
1.9.1
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v5 4/5] drm/i915: Enable lspcon initialization
2016-10-14 9:24 [PATCH v5 0/5] Enable lspcon support for GEN9 devices Shashank Sharma
` (2 preceding siblings ...)
2016-10-14 9:24 ` [PATCH v5 3/5] drm/i915: Parse VBT data for lspcon Shashank Sharma
@ 2016-10-14 9:24 ` Shashank Sharma
2016-10-14 9:24 ` [PATCH v5 5/5] drm/i915: Add lspcon resume function Shashank Sharma
2016-10-14 12:31 ` ✗ Fi.CI.BAT: failure for Enable lspcon support for GEN9 devices (rev5) Patchwork
5 siblings, 0 replies; 11+ messages in thread
From: Shashank Sharma @ 2016-10-14 9:24 UTC (permalink / raw)
To: imre.deak; +Cc: daniel.vetter, intel-gfx
This patch adds initialization code for lspcon.
What we are doing here is:
- Check if lspcon is configured in VBT for this port
- If lspcon is configured, initialize it and configure it
as DP port.
V2: Addressed Ville's review comments:
- Not adding AVI IF functions for LSPCON display now.
This part will be added once the dig_port level AVI-IF series
gets merged.
V3: Rebase
V4: Rebase
V5: Rebase
Signed-off-by: Shashank Sharma <shashank.sharma@intel.com>
Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
---
drivers/gpu/drm/i915/intel_ddi.c | 29 ++++++++++++++++++++++++++++-
1 file changed, 28 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
index 35f0b7c..921df39 100644
--- a/drivers/gpu/drm/i915/intel_ddi.c
+++ b/drivers/gpu/drm/i915/intel_ddi.c
@@ -2438,7 +2438,7 @@ void intel_ddi_init(struct drm_device *dev, enum port port)
struct intel_digital_port *intel_dig_port;
struct intel_encoder *intel_encoder;
struct drm_encoder *encoder;
- bool init_hdmi, init_dp;
+ bool init_hdmi, init_dp, init_lspcon = false;
int max_lanes;
if (I915_READ(DDI_BUF_CTL(PORT_A)) & DDI_A_4_LANES) {
@@ -2470,6 +2470,19 @@ void intel_ddi_init(struct drm_device *dev, enum port port)
init_hdmi = (dev_priv->vbt.ddi_port_info[port].supports_dvi ||
dev_priv->vbt.ddi_port_info[port].supports_hdmi);
init_dp = dev_priv->vbt.ddi_port_info[port].supports_dp;
+
+ if (intel_bios_is_lspcon_present(dev_priv, port)) {
+ /*
+ * Lspcon device needs to be driven with DP connector
+ * with special detection sequence. So make sure DP
+ * is initialized before lspcon.
+ */
+ init_dp = true;
+ init_lspcon = true;
+ init_hdmi = false;
+ DRM_DEBUG_KMS("VBT says port %c has lspcon\n", port_name(port));
+ }
+
if (!init_dp && !init_hdmi) {
DRM_DEBUG_KMS("VBT says port %c is not DVI/HDMI/DP compatible, respect it\n",
port_name(port));
@@ -2546,6 +2559,20 @@ void intel_ddi_init(struct drm_device *dev, enum port port)
goto err;
}
+ if (init_lspcon) {
+ if (lspcon_init(intel_dig_port))
+ /* TODO: handle hdmi info frame part */
+ DRM_DEBUG_KMS("LSPCON init success on port %c\n",
+ port_name(port));
+ else
+ /*
+ * LSPCON init faied, but DP init was success, so
+ * lets try to drive as DP++ port.
+ */
+ DRM_ERROR("LSPCON init failed on port %c\n",
+ port_name(port));
+ }
+
return;
err:
--
1.9.1
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v5 5/5] drm/i915: Add lspcon resume function
2016-10-14 9:24 [PATCH v5 0/5] Enable lspcon support for GEN9 devices Shashank Sharma
` (3 preceding siblings ...)
2016-10-14 9:24 ` [PATCH v5 4/5] drm/i915: Enable lspcon initialization Shashank Sharma
@ 2016-10-14 9:24 ` Shashank Sharma
2016-10-14 9:26 ` Imre Deak
2016-10-14 12:31 ` ✗ Fi.CI.BAT: failure for Enable lspcon support for GEN9 devices (rev5) Patchwork
5 siblings, 1 reply; 11+ messages in thread
From: Shashank Sharma @ 2016-10-14 9:24 UTC (permalink / raw)
To: imre.deak; +Cc: daniel.vetter, intel-gfx
As per the software design, we are driving lspcon in
PCON mode. But while resuming from suspend, lspcon can go
in LS mode (which is its default operating mode on power on)
This patch adds a resume function for lspcon, which makes sure
its operating in PCON mode, post resume.
Signed-off-by: Shashank Sharma <shashank.sharma@intel.com>
---
drivers/gpu/drm/i915/i915_drv.c | 2 ++
drivers/gpu/drm/i915/intel_drv.h | 1 +
drivers/gpu/drm/i915/intel_lspcon.c | 38 +++++++++++++++++++++++++++++++++++++
3 files changed, 41 insertions(+)
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index e9b3bfc..d87281d 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -1574,6 +1574,8 @@ static int i915_drm_resume(struct drm_device *dev)
dev_priv->display.hpd_irq_setup(dev_priv);
spin_unlock_irq(&dev_priv->irq_lock);
+ lspcon_resume(dev);
+
intel_dp_mst_resume(dev);
intel_display_resume(dev);
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 27837b0..e8760a4 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -1850,4 +1850,5 @@ void intel_color_load_luts(struct drm_crtc_state *crtc_state);
/* intel_lspcon.c */
bool lspcon_init(struct intel_digital_port *intel_dig_port);
+void lspcon_resume(struct drm_device *dev);
#endif /* __INTEL_DRV_H__ */
diff --git a/drivers/gpu/drm/i915/intel_lspcon.c b/drivers/gpu/drm/i915/intel_lspcon.c
index aa74b1f..ba660ecb 100644
--- a/drivers/gpu/drm/i915/intel_lspcon.c
+++ b/drivers/gpu/drm/i915/intel_lspcon.c
@@ -27,6 +27,29 @@
#include <drm/drm_dp_dual_mode_helper.h>
#include "intel_drv.h"
+/*
+ * This function assumes only one LSPCON port on the device,
+ * and returns the first active LSPCON port.
+ */
+static struct intel_lspcon *find_active_lspcon(struct drm_device *dev)
+{
+ struct intel_lspcon *lspcon = NULL;
+ struct intel_encoder *intel_encoder;
+
+ for_each_intel_encoder(dev, intel_encoder) {
+ struct intel_digital_port *intel_dig_port;
+
+ intel_dig_port = enc_to_dig_port(&intel_encoder->base);
+ lspcon = &intel_dig_port->lspcon;
+ if (lspcon->active) {
+ DRM_DEBUG_KMS("LSPCON active : port %c\n",
+ port_name(intel_dig_port->port));
+ break;
+ }
+ }
+ return lspcon;
+}
+
enum drm_lspcon_mode lspcon_get_current_mode(struct intel_lspcon *lspcon)
{
enum drm_lspcon_mode current_mode = DRM_LSPCON_MODE_INVALID;
@@ -89,6 +112,21 @@ static bool lspcon_probe(struct intel_lspcon *lspcon)
return true;
}
+void lspcon_resume(struct drm_device *dev)
+{
+ if (IS_GEN9(dev)) {
+ struct intel_lspcon *lspcon = find_active_lspcon(dev);
+
+ if (lspcon) {
+ if (lspcon_change_mode(lspcon, DRM_LSPCON_MODE_PCON,
+ true))
+ DRM_ERROR("LSPCON resume failed\n");
+ else
+ DRM_DEBUG_KMS("LSPCON resume success\n");
+ }
+ }
+}
+
bool lspcon_init(struct intel_digital_port *intel_dig_port)
{
struct intel_dp *dp = &intel_dig_port->dp;
--
1.9.1
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH v5 5/5] drm/i915: Add lspcon resume function
2016-10-14 9:24 ` [PATCH v5 5/5] drm/i915: Add lspcon resume function Shashank Sharma
@ 2016-10-14 9:26 ` Imre Deak
2016-10-14 12:35 ` Sharma, Shashank
0 siblings, 1 reply; 11+ messages in thread
From: Imre Deak @ 2016-10-14 9:26 UTC (permalink / raw)
To: Shashank Sharma; +Cc: daniel.vetter, intel-gfx
On pe, 2016-10-14 at 14:54 +0530, Shashank Sharma wrote:
> As per the software design, we are driving lspcon in
> PCON mode. But while resuming from suspend, lspcon can go
> in LS mode (which is its default operating mode on power on)
>
> This patch adds a resume function for lspcon, which makes sure
> its operating in PCON mode, post resume.
>
> Signed-off-by: Shashank Sharma <shashank.sharma@intel.com>
> ---
> drivers/gpu/drm/i915/i915_drv.c | 2 ++
> drivers/gpu/drm/i915/intel_drv.h | 1 +
> drivers/gpu/drm/i915/intel_lspcon.c | 38 +++++++++++++++++++++++++++++++++++++
> 3 files changed, 41 insertions(+)
>
> diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
> index e9b3bfc..d87281d 100644
> --- a/drivers/gpu/drm/i915/i915_drv.c
> +++ b/drivers/gpu/drm/i915/i915_drv.c
> @@ -1574,6 +1574,8 @@ static int i915_drm_resume(struct drm_device *dev)
> dev_priv->display.hpd_irq_setup(dev_priv);
> spin_unlock_irq(&dev_priv->irq_lock);
>
> + lspcon_resume(dev);
> +
This should go to the encoder reset hook.
> intel_dp_mst_resume(dev);
>
> intel_display_resume(dev);
> diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
> index 27837b0..e8760a4 100644
> --- a/drivers/gpu/drm/i915/intel_drv.h
> +++ b/drivers/gpu/drm/i915/intel_drv.h
> @@ -1850,4 +1850,5 @@ void intel_color_load_luts(struct drm_crtc_state *crtc_state);
>
> /* intel_lspcon.c */
> bool lspcon_init(struct intel_digital_port *intel_dig_port);
> +void lspcon_resume(struct drm_device *dev);
> #endif /* __INTEL_DRV_H__ */
> diff --git a/drivers/gpu/drm/i915/intel_lspcon.c b/drivers/gpu/drm/i915/intel_lspcon.c
> index aa74b1f..ba660ecb 100644
> --- a/drivers/gpu/drm/i915/intel_lspcon.c
> +++ b/drivers/gpu/drm/i915/intel_lspcon.c
> @@ -27,6 +27,29 @@
> #include
> #include "intel_drv.h"
>
> +/*
> + * This function assumes only one LSPCON port on the device,
> + * and returns the first active LSPCON port.
> + */
> +static struct intel_lspcon *find_active_lspcon(struct drm_device *dev)
> +{
> + struct intel_lspcon *lspcon = NULL;
> + struct intel_encoder *intel_encoder;
> +
> + for_each_intel_encoder(dev, intel_encoder) {
> + struct intel_digital_port *intel_dig_port;
> +
> + intel_dig_port = enc_to_dig_port(&intel_encoder->base);
> + lspcon = &intel_dig_port->lspcon;
> + if (lspcon->active) {
> + DRM_DEBUG_KMS("LSPCON active : port %c\n",
> + port_name(intel_dig_port->port));
> + break;
> + }
> + }
> + return lspcon;
> +}
> +
> enum drm_lspcon_mode lspcon_get_current_mode(struct intel_lspcon *lspcon)
> {
> enum drm_lspcon_mode current_mode = DRM_LSPCON_MODE_INVALID;
> @@ -89,6 +112,21 @@ static bool lspcon_probe(struct intel_lspcon *lspcon)
> return true;
> }
>
> +void lspcon_resume(struct drm_device *dev)
> +{
> + if (IS_GEN9(dev)) {
> + struct intel_lspcon *lspcon = find_active_lspcon(dev);
> +
> + if (lspcon) {
> + if (lspcon_change_mode(lspcon, DRM_LSPCON_MODE_PCON,
> + true))
> + DRM_ERROR("LSPCON resume failed\n");
> + else
> + DRM_DEBUG_KMS("LSPCON resume success\n");
> + }
> + }
> +}
Nitpick: you could reduce indentation above by using early returns.
> +
> bool lspcon_init(struct intel_digital_port *intel_dig_port)
> {
> struct intel_dp *dp = &intel_dig_port->dp;
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 11+ messages in thread
* ✗ Fi.CI.BAT: failure for Enable lspcon support for GEN9 devices (rev5)
2016-10-14 9:24 [PATCH v5 0/5] Enable lspcon support for GEN9 devices Shashank Sharma
` (4 preceding siblings ...)
2016-10-14 9:24 ` [PATCH v5 5/5] drm/i915: Add lspcon resume function Shashank Sharma
@ 2016-10-14 12:31 ` Patchwork
2016-10-14 13:39 ` Jani Nikula
5 siblings, 1 reply; 11+ messages in thread
From: Patchwork @ 2016-10-14 12:31 UTC (permalink / raw)
To: Shashank Sharma; +Cc: intel-gfx
== Series Details ==
Series: Enable lspcon support for GEN9 devices (rev5)
URL : https://patchwork.freedesktop.org/series/8024/
State : failure
== Summary ==
LD drivers/thermal/built-in.o
LD drivers/iommu/built-in.o
LD [M] drivers/net/ethernet/intel/e1000e/e1000e.o
In file included from drivers/gpu/drm/i915/intel_drv.h:32:0,
from drivers/gpu/drm/i915/intel_lspcon.c:28:
drivers/gpu/drm/i915/intel_lspcon.c: In function ‘lspcon_resume’:
drivers/gpu/drm/i915/i915_drv.h:2748:41: error: ‘struct drm_device’ has no member named ‘info’
#define IS_GEN9(dev_priv) (!!((dev_priv)->info.gen_mask & BIT(8)))
^
drivers/gpu/drm/i915/intel_lspcon.c:117:6: note: in expansion of macro ‘IS_GEN9’
if (IS_GEN9(dev)) {
^
drivers/gpu/drm/i915/intel_lspcon.c: In function ‘lspcon_init’:
drivers/gpu/drm/i915/i915_drv.h:2748:41: error: ‘struct drm_device’ has no member named ‘info’
#define IS_GEN9(dev_priv) (!!((dev_priv)->info.gen_mask & BIT(8)))
^
drivers/gpu/drm/i915/intel_lspcon.c:136:7: note: in expansion of macro ‘IS_GEN9’
if (!IS_GEN9(dev)) {
^
scripts/Makefile.build:289: recipe for target 'drivers/gpu/drm/i915/intel_lspcon.o' failed
make[4]: *** [drivers/gpu/drm/i915/intel_lspcon.o] Error 1
make[4]: *** Waiting for unfinished jobs....
LD [M] drivers/net/ethernet/intel/igb/igb.o
LD [M] drivers/net/ethernet/broadcom/genet/genet.o
LD fs/btrfs/built-in.o
LD drivers/tty/serial/8250/built-in.o
LD drivers/tty/serial/built-in.o
LD drivers/scsi/built-in.o
LD drivers/tty/vt/built-in.o
LD drivers/video/fbdev/core/fb.o
LD drivers/tty/built-in.o
LD drivers/video/fbdev/core/built-in.o
LD drivers/video/fbdev/built-in.o
LD drivers/video/built-in.o
LD fs/ext4/ext4.o
LD drivers/usb/core/usbcore.o
LD drivers/usb/core/built-in.o
LD net/core/built-in.o
LD fs/ext4/built-in.o
LD fs/built-in.o
AR lib/lib.a
CC arch/x86/kernel/cpu/capflags.o
LD arch/x86/kernel/cpu/built-in.o
LD arch/x86/kernel/built-in.o
LD arch/x86/built-in.o
LD drivers/usb/host/xhci-hcd.o
LD drivers/usb/host/built-in.o
LD drivers/usb/built-in.o
LD net/ipv4/built-in.o
LD net/built-in.o
LD drivers/net/ethernet/built-in.o
LD drivers/net/built-in.o
scripts/Makefile.build:440: recipe for target 'drivers/gpu/drm/i915' failed
make[3]: *** [drivers/gpu/drm/i915] Error 2
scripts/Makefile.build:440: recipe for target 'drivers/gpu/drm' failed
make[2]: *** [drivers/gpu/drm] Error 2
scripts/Makefile.build:440: recipe for target 'drivers/gpu' failed
make[1]: *** [drivers/gpu] Error 2
Makefile:968: recipe for target 'drivers' failed
make: *** [drivers] Error 2
Full logs at /archive/deploy/logs/Patchwork_2717
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v5 5/5] drm/i915: Add lspcon resume function
2016-10-14 9:26 ` Imre Deak
@ 2016-10-14 12:35 ` Sharma, Shashank
0 siblings, 0 replies; 11+ messages in thread
From: Sharma, Shashank @ 2016-10-14 12:35 UTC (permalink / raw)
To: imre.deak; +Cc: daniel.vetter, intel-gfx
Regards
Shashak
On 10/14/2016 2:56 PM, Imre Deak wrote:
> On pe, 2016-10-14 at 14:54 +0530, Shashank Sharma wrote:
>> As per the software design, we are driving lspcon in
>> PCON mode. But while resuming from suspend, lspcon can go
>> in LS mode (which is its default operating mode on power on)
>>
>> This patch adds a resume function for lspcon, which makes sure
>> its operating in PCON mode, post resume.
>>
>> Signed-off-by: Shashank Sharma <shashank.sharma@intel.com>
>> ---
>> drivers/gpu/drm/i915/i915_drv.c | 2 ++
>> drivers/gpu/drm/i915/intel_drv.h | 1 +
>> drivers/gpu/drm/i915/intel_lspcon.c | 38 +++++++++++++++++++++++++++++++++++++
>> 3 files changed, 41 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
>> index e9b3bfc..d87281d 100644
>> --- a/drivers/gpu/drm/i915/i915_drv.c
>> +++ b/drivers/gpu/drm/i915/i915_drv.c
>> @@ -1574,6 +1574,8 @@ static int i915_drm_resume(struct drm_device *dev)
>> dev_priv->display.hpd_irq_setup(dev_priv);
>> spin_unlock_irq(&dev_priv->irq_lock);
>>
>> + lspcon_resume(dev);
>> +
> This should go to the encoder reset hook.
Oh, sorry, I forgot about this suggestion.
Will move it.
>> intel_dp_mst_resume(dev);
>>
>> intel_display_resume(dev);
>> diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
>> index 27837b0..e8760a4 100644
>> --- a/drivers/gpu/drm/i915/intel_drv.h
>> +++ b/drivers/gpu/drm/i915/intel_drv.h
>> @@ -1850,4 +1850,5 @@ void intel_color_load_luts(struct drm_crtc_state *crtc_state);
>>
>> /* intel_lspcon.c */
>> bool lspcon_init(struct intel_digital_port *intel_dig_port);
>> +void lspcon_resume(struct drm_device *dev);
>> #endif /* __INTEL_DRV_H__ */
>> diff --git a/drivers/gpu/drm/i915/intel_lspcon.c b/drivers/gpu/drm/i915/intel_lspcon.c
>> index aa74b1f..ba660ecb 100644
>> --- a/drivers/gpu/drm/i915/intel_lspcon.c
>> +++ b/drivers/gpu/drm/i915/intel_lspcon.c
>> @@ -27,6 +27,29 @@
>> #include
>> #include "intel_drv.h"
>>
>> +/*
>> + * This function assumes only one LSPCON port on the device,
>> + * and returns the first active LSPCON port.
>> + */
>> +static struct intel_lspcon *find_active_lspcon(struct drm_device *dev)
>> +{
>> + struct intel_lspcon *lspcon = NULL;
>> + struct intel_encoder *intel_encoder;
>> +
>> + for_each_intel_encoder(dev, intel_encoder) {
>> + struct intel_digital_port *intel_dig_port;
>> +
>> + intel_dig_port = enc_to_dig_port(&intel_encoder->base);
>> + lspcon = &intel_dig_port->lspcon;
>> + if (lspcon->active) {
>> + DRM_DEBUG_KMS("LSPCON active : port %c\n",
>> + port_name(intel_dig_port->port));
>> + break;
>> + }
>> + }
>> + return lspcon;
>> +}
>> +
>> enum drm_lspcon_mode lspcon_get_current_mode(struct intel_lspcon *lspcon)
>> {
>> enum drm_lspcon_mode current_mode = DRM_LSPCON_MODE_INVALID;
>> @@ -89,6 +112,21 @@ static bool lspcon_probe(struct intel_lspcon *lspcon)
>> return true;
>> }
>>
>> +void lspcon_resume(struct drm_device *dev)
>> +{
>> + if (IS_GEN9(dev)) {
>> + struct intel_lspcon *lspcon = find_active_lspcon(dev);
>> +
>> + if (lspcon) {
>> + if (lspcon_change_mode(lspcon, DRM_LSPCON_MODE_PCON,
>> + true))
>> + DRM_ERROR("LSPCON resume failed\n");
>> + else
>> + DRM_DEBUG_KMS("LSPCON resume success\n");
>> + }
>> + }
>> +}
> Nitpick: you could reduce indentation above by using early returns.
Sure.
- Shashank
>
>
>> +
>> bool lspcon_init(struct intel_digital_port *intel_dig_port)
>> {
>> struct intel_dp *dp = &intel_dig_port->dp;
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: ✗ Fi.CI.BAT: failure for Enable lspcon support for GEN9 devices (rev5)
2016-10-14 12:31 ` ✗ Fi.CI.BAT: failure for Enable lspcon support for GEN9 devices (rev5) Patchwork
@ 2016-10-14 13:39 ` Jani Nikula
2016-10-14 13:41 ` Sharma, Shashank
0 siblings, 1 reply; 11+ messages in thread
From: Jani Nikula @ 2016-10-14 13:39 UTC (permalink / raw)
To: Patchwork, Shashank Sharma; +Cc: intel-gfx
On Fri, 14 Oct 2016, Patchwork <patchwork@emeril.freedesktop.org> wrote:
> == Series Details ==
>
> Series: Enable lspcon support for GEN9 devices (rev5)
> URL : https://patchwork.freedesktop.org/series/8024/
> State : failure
>
> == Summary ==
>
> LD drivers/thermal/built-in.o
> LD drivers/iommu/built-in.o
> LD [M] drivers/net/ethernet/intel/e1000e/e1000e.o
> In file included from drivers/gpu/drm/i915/intel_drv.h:32:0,
> from drivers/gpu/drm/i915/intel_lspcon.c:28:
> drivers/gpu/drm/i915/intel_lspcon.c: In function ‘lspcon_resume’:
> drivers/gpu/drm/i915/i915_drv.h:2748:41: error: ‘struct drm_device’ has no member named ‘info’
> #define IS_GEN9(dev_priv) (!!((dev_priv)->info.gen_mask & BIT(8)))
> ^
> drivers/gpu/drm/i915/intel_lspcon.c:117:6: note: in expansion of macro ‘IS_GEN9’
> if (IS_GEN9(dev)) {
> ^
> drivers/gpu/drm/i915/intel_lspcon.c: In function ‘lspcon_init’:
> drivers/gpu/drm/i915/i915_drv.h:2748:41: error: ‘struct drm_device’ has no member named ‘info’
> #define IS_GEN9(dev_priv) (!!((dev_priv)->info.gen_mask & BIT(8)))
> ^
> drivers/gpu/drm/i915/intel_lspcon.c:136:7: note: in expansion of macro ‘IS_GEN9’
> if (!IS_GEN9(dev)) {
> ^
This conflicts with Tvrtko's recent changes to only accept dev_priv
pointers in various macros.
I hope we can apply patch 3/5 first to add debug logging. I posted the
rebased version of that [1].
BR,
Jani.
[1] http://patchwork.freedesktop.org/patch/msgid/1476452135-31763-1-git-send-email-jani.nikula@intel.com
> scripts/Makefile.build:289: recipe for target 'drivers/gpu/drm/i915/intel_lspcon.o' failed
> make[4]: *** [drivers/gpu/drm/i915/intel_lspcon.o] Error 1
> make[4]: *** Waiting for unfinished jobs....
> LD [M] drivers/net/ethernet/intel/igb/igb.o
> LD [M] drivers/net/ethernet/broadcom/genet/genet.o
> LD fs/btrfs/built-in.o
> LD drivers/tty/serial/8250/built-in.o
> LD drivers/tty/serial/built-in.o
> LD drivers/scsi/built-in.o
> LD drivers/tty/vt/built-in.o
> LD drivers/video/fbdev/core/fb.o
> LD drivers/tty/built-in.o
> LD drivers/video/fbdev/core/built-in.o
> LD drivers/video/fbdev/built-in.o
> LD drivers/video/built-in.o
> LD fs/ext4/ext4.o
> LD drivers/usb/core/usbcore.o
> LD drivers/usb/core/built-in.o
> LD net/core/built-in.o
> LD fs/ext4/built-in.o
> LD fs/built-in.o
> AR lib/lib.a
> CC arch/x86/kernel/cpu/capflags.o
> LD arch/x86/kernel/cpu/built-in.o
> LD arch/x86/kernel/built-in.o
> LD arch/x86/built-in.o
> LD drivers/usb/host/xhci-hcd.o
> LD drivers/usb/host/built-in.o
> LD drivers/usb/built-in.o
> LD net/ipv4/built-in.o
> LD net/built-in.o
> LD drivers/net/ethernet/built-in.o
> LD drivers/net/built-in.o
> scripts/Makefile.build:440: recipe for target 'drivers/gpu/drm/i915' failed
> make[3]: *** [drivers/gpu/drm/i915] Error 2
> scripts/Makefile.build:440: recipe for target 'drivers/gpu/drm' failed
> make[2]: *** [drivers/gpu/drm] Error 2
> scripts/Makefile.build:440: recipe for target 'drivers/gpu' failed
> make[1]: *** [drivers/gpu] Error 2
> Makefile:968: recipe for target 'drivers' failed
> make: *** [drivers] Error 2
>
> Full logs at /archive/deploy/logs/Patchwork_2717
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
--
Jani Nikula, Intel Open Source Technology Center
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: ✗ Fi.CI.BAT: failure for Enable lspcon support for GEN9 devices (rev5)
2016-10-14 13:39 ` Jani Nikula
@ 2016-10-14 13:41 ` Sharma, Shashank
0 siblings, 0 replies; 11+ messages in thread
From: Sharma, Shashank @ 2016-10-14 13:41 UTC (permalink / raw)
To: Jani Nikula, Patchwork; +Cc: intel-gfx@lists.freedesktop.org
I was about to send another series to address Imre's patches.
There I have addressed this problems.
Please wait for some time, I will re-sync and send V6 for all patches.
Even though I am not sure why it dint apply on nightly, as I did a git-pull few hours ago.
Regards
Shashank
-----Original Message-----
From: Jani Nikula [mailto:jani.nikula@linux.intel.com]
Sent: Friday, October 14, 2016 7:10 PM
To: Patchwork <patchwork@emeril.freedesktop.org>; Sharma, Shashank <shashank.sharma@intel.com>
Cc: intel-gfx@lists.freedesktop.org
Subject: Re: [Intel-gfx] ✗ Fi.CI.BAT: failure for Enable lspcon support for GEN9 devices (rev5)
On Fri, 14 Oct 2016, Patchwork <patchwork@emeril.freedesktop.org> wrote:
> == Series Details ==
>
> Series: Enable lspcon support for GEN9 devices (rev5)
> URL : https://patchwork.freedesktop.org/series/8024/
> State : failure
>
> == Summary ==
>
> LD drivers/thermal/built-in.o
> LD drivers/iommu/built-in.o
> LD [M] drivers/net/ethernet/intel/e1000e/e1000e.o
> In file included from drivers/gpu/drm/i915/intel_drv.h:32:0,
> from drivers/gpu/drm/i915/intel_lspcon.c:28:
> drivers/gpu/drm/i915/intel_lspcon.c: In function ‘lspcon_resume’:
> drivers/gpu/drm/i915/i915_drv.h:2748:41: error: ‘struct drm_device’ has no member named ‘info’
> #define IS_GEN9(dev_priv) (!!((dev_priv)->info.gen_mask & BIT(8)))
> ^
> drivers/gpu/drm/i915/intel_lspcon.c:117:6: note: in expansion of macro ‘IS_GEN9’
> if (IS_GEN9(dev)) {
> ^
> drivers/gpu/drm/i915/intel_lspcon.c: In function ‘lspcon_init’:
> drivers/gpu/drm/i915/i915_drv.h:2748:41: error: ‘struct drm_device’ has no member named ‘info’
> #define IS_GEN9(dev_priv) (!!((dev_priv)->info.gen_mask & BIT(8)))
> ^
> drivers/gpu/drm/i915/intel_lspcon.c:136:7: note: in expansion of macro ‘IS_GEN9’
> if (!IS_GEN9(dev)) {
> ^
This conflicts with Tvrtko's recent changes to only accept dev_priv pointers in various macros.
I hope we can apply patch 3/5 first to add debug logging. I posted the rebased version of that [1].
BR,
Jani.
[1] http://patchwork.freedesktop.org/patch/msgid/1476452135-31763-1-git-send-email-jani.nikula@intel.com
> scripts/Makefile.build:289: recipe for target
> 'drivers/gpu/drm/i915/intel_lspcon.o' failed
> make[4]: *** [drivers/gpu/drm/i915/intel_lspcon.o] Error 1
> make[4]: *** Waiting for unfinished jobs....
> LD [M] drivers/net/ethernet/intel/igb/igb.o
> LD [M] drivers/net/ethernet/broadcom/genet/genet.o
> LD fs/btrfs/built-in.o
> LD drivers/tty/serial/8250/built-in.o
> LD drivers/tty/serial/built-in.o
> LD drivers/scsi/built-in.o
> LD drivers/tty/vt/built-in.o
> LD drivers/video/fbdev/core/fb.o
> LD drivers/tty/built-in.o
> LD drivers/video/fbdev/core/built-in.o
> LD drivers/video/fbdev/built-in.o
> LD drivers/video/built-in.o
> LD fs/ext4/ext4.o
> LD drivers/usb/core/usbcore.o
> LD drivers/usb/core/built-in.o
> LD net/core/built-in.o
> LD fs/ext4/built-in.o
> LD fs/built-in.o
> AR lib/lib.a
> CC arch/x86/kernel/cpu/capflags.o
> LD arch/x86/kernel/cpu/built-in.o
> LD arch/x86/kernel/built-in.o
> LD arch/x86/built-in.o
> LD drivers/usb/host/xhci-hcd.o
> LD drivers/usb/host/built-in.o
> LD drivers/usb/built-in.o
> LD net/ipv4/built-in.o
> LD net/built-in.o
> LD drivers/net/ethernet/built-in.o
> LD drivers/net/built-in.o
> scripts/Makefile.build:440: recipe for target 'drivers/gpu/drm/i915'
> failed
> make[3]: *** [drivers/gpu/drm/i915] Error 2
> scripts/Makefile.build:440: recipe for target 'drivers/gpu/drm' failed
> make[2]: *** [drivers/gpu/drm] Error 2
> scripts/Makefile.build:440: recipe for target 'drivers/gpu' failed
> make[1]: *** [drivers/gpu] Error 2
> Makefile:968: recipe for target 'drivers' failed
> make: *** [drivers] Error 2
>
> Full logs at /archive/deploy/logs/Patchwork_2717
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
--
Jani Nikula, Intel Open Source Technology Center
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2016-10-14 13:41 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-10-14 9:24 [PATCH v5 0/5] Enable lspcon support for GEN9 devices Shashank Sharma
2016-10-14 9:24 ` [PATCH v5 1/5] drm: Helper for lspcon in drm_dp_dual_mode Shashank Sharma
2016-10-14 9:24 ` [PATCH v5 2/5] drm/i915: Add lspcon support for I915 driver Shashank Sharma
2016-10-14 9:24 ` [PATCH v5 3/5] drm/i915: Parse VBT data for lspcon Shashank Sharma
2016-10-14 9:24 ` [PATCH v5 4/5] drm/i915: Enable lspcon initialization Shashank Sharma
2016-10-14 9:24 ` [PATCH v5 5/5] drm/i915: Add lspcon resume function Shashank Sharma
2016-10-14 9:26 ` Imre Deak
2016-10-14 12:35 ` Sharma, Shashank
2016-10-14 12:31 ` ✗ Fi.CI.BAT: failure for Enable lspcon support for GEN9 devices (rev5) Patchwork
2016-10-14 13:39 ` Jani Nikula
2016-10-14 13:41 ` Sharma, Shashank
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox