This is an initial set of patches for enabling VRR support in i915. This series has patches for: 1. adding a drm dpcd helper to read ignore MSA bit in sink's DPCD indicating sink support for VRR 2. Attach and set VRR capable connector prop for Intel DP conn 3. Expose VRR min and max through debugfs
Aditya Swarup (1): drm/i915/dp: Attach and set drm connector VRR property
Bhanuprakash Modem (1): drm/i915/dp: Expose connector VRR monitor range via debugfs
Manasi Navare (1): drm/dp: DRM DP helper for reading Ignore MSA from DPCD
.../drm/i915/display/intel_display_debugfs.c | 20 ++++++++++++++ drivers/gpu/drm/i915/display/intel_dp.c | 27 +++++++++++++++++++ drivers/gpu/drm/i915/display/intel_dp.h | 2 ++ include/drm/drm_dp_helper.h | 8 ++++++ 4 files changed, 57 insertions(+)
DP sink device sets the Ignore MSA bit in its DP_DOWNSTREAM_PORT_COUNT register to indicate its ability to ignore the MSA video timing parameters and its ability to support seamless video timing change over a range of timing exposed by DisplayID and EDID. This is required for the sink to indicate that it is Adaptive sync capable.
v3: * Fi the typo in commit message (Manasi) v2: * Rename to describe what the function does (Jani Nikula)
Cc: Jani Nikula jani.nikula@linux.intel.com Cc: Ville Syrjälä ville.syrjala@linux.intel.com Cc: Harry Wentland harry.wentland@amd.com Cc: Nicholas Kazlauskas Nicholas.Kazlauskas@amd.com Signed-off-by: Manasi Navare manasi.d.navare@intel.com Reviewed-by: Harry Wentland harry.wentland@amd.com --- include/drm/drm_dp_helper.h | 8 ++++++++ 1 file changed, 8 insertions(+)
diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h index 1165ec105638..e47dc22ebf50 100644 --- a/include/drm/drm_dp_helper.h +++ b/include/drm/drm_dp_helper.h @@ -1457,6 +1457,14 @@ drm_dp_alternate_scrambler_reset_cap(const u8 dpcd[DP_RECEIVER_CAP_SIZE]) DP_ALTERNATE_SCRAMBLER_RESET_CAP; }
+/* Ignore MSA timing for Adaptive Sync support on DP 1.4 */ +static inline bool +drm_dp_sink_can_do_video_without_timing_msa(const u8 dpcd[DP_RECEIVER_CAP_SIZE]) +{ + return dpcd[DP_DOWN_STREAM_PORT_COUNT] & + DP_MSA_TIMING_PAR_IGNORED; +} + /* * DisplayPort AUX channel */
@Jani N, could you give an ACK on this if this looks okay, addressed your review comments regarding the name of the function. Else I have a r-b functionality wise so good to get merged?
Regards Manasi
On Fri, Jun 12, 2020 at 04:04:42PM -0700, Manasi Navare wrote:
DP sink device sets the Ignore MSA bit in its DP_DOWNSTREAM_PORT_COUNT register to indicate its ability to ignore the MSA video timing parameters and its ability to support seamless video timing change over a range of timing exposed by DisplayID and EDID. This is required for the sink to indicate that it is Adaptive sync capable.
v3:
- Fi the typo in commit message (Manasi)
v2:
- Rename to describe what the function does (Jani Nikula)
Cc: Jani Nikula jani.nikula@linux.intel.com Cc: Ville Syrjälä ville.syrjala@linux.intel.com Cc: Harry Wentland harry.wentland@amd.com Cc: Nicholas Kazlauskas Nicholas.Kazlauskas@amd.com Signed-off-by: Manasi Navare manasi.d.navare@intel.com Reviewed-by: Harry Wentland harry.wentland@amd.com
include/drm/drm_dp_helper.h | 8 ++++++++ 1 file changed, 8 insertions(+)
diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h index 1165ec105638..e47dc22ebf50 100644 --- a/include/drm/drm_dp_helper.h +++ b/include/drm/drm_dp_helper.h @@ -1457,6 +1457,14 @@ drm_dp_alternate_scrambler_reset_cap(const u8 dpcd[DP_RECEIVER_CAP_SIZE]) DP_ALTERNATE_SCRAMBLER_RESET_CAP; }
+/* Ignore MSA timing for Adaptive Sync support on DP 1.4 */ +static inline bool +drm_dp_sink_can_do_video_without_timing_msa(const u8 dpcd[DP_RECEIVER_CAP_SIZE]) +{
- return dpcd[DP_DOWN_STREAM_PORT_COUNT] &
DP_MSA_TIMING_PAR_IGNORED;
+}
/*
- DisplayPort AUX channel
*/
2.19.1
From: Aditya Swarup aditya.swarup@intel.com
This function sets the VRR property for connector based on the platform support, EDID monitor range and DP sink DPCD capability of outputing video without msa timing information.
v5: * Fix the vrr prop not being set in kernel (Manasi) * Unset the prop on connector disconnect (Manasi) v4: * Rebase (Mansi) v3: * intel_dp_is_vrr_capable can be used for debugfs, make it non static (Manasi) v2: * Just set this in intel_dp_get_modes instead of new hook (Jani)
Cc: Ville Syrjälä ville.syrjala@linux.intel.com Cc: Jani Nikula jani.nikula@linux.intel.com Signed-off-by: Aditya Swarup aditya.swarup@intel.com Signed-off-by: Manasi Navare manasi.d.navare@intel.com --- drivers/gpu/drm/i915/display/intel_dp.c | 27 +++++++++++++++++++++++++ drivers/gpu/drm/i915/display/intel_dp.h | 2 ++ 2 files changed, 29 insertions(+)
diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c index 42589cae766d..d0dba81cfb07 100644 --- a/drivers/gpu/drm/i915/display/intel_dp.c +++ b/drivers/gpu/drm/i915/display/intel_dp.c @@ -6149,6 +6149,9 @@ intel_dp_detect(struct drm_connector *connector, if (status == connector_status_disconnected) { memset(&intel_dp->compliance, 0, sizeof(intel_dp->compliance)); memset(intel_dp->dsc_dpcd, 0, sizeof(intel_dp->dsc_dpcd)); + /*Reset the immutable VRR Capable property */ + drm_connector_set_vrr_capable_property(connector, + false);
if (intel_dp->is_mst) { drm_dbg_kms(&dev_priv->drm, @@ -6256,6 +6259,23 @@ intel_dp_force(struct drm_connector *connector) intel_display_power_put(dev_priv, aux_domain, wakeref); }
+bool intel_dp_is_vrr_capable(struct drm_connector *connector) +{ + struct intel_dp *intel_dp = intel_attached_dp(to_intel_connector(connector)); + const struct drm_display_info *info = &connector->display_info; + struct drm_i915_private *dev_priv = to_i915(connector->dev); + + /* + * DP Sink is capable of Variable refresh video timings if + * Ignore MSA bit is set in DPCD. + * EDID monitor range also should be atleast 10 for reasonable + * Adaptive sync/ VRR end user experience. + */ + return INTEL_GEN(dev_priv) >= 12 && + drm_dp_sink_can_do_video_without_timing_msa(intel_dp->dpcd) && + info->monitor_range.max_vfreq - info->monitor_range.min_vfreq > 10; +} + static int intel_dp_get_modes(struct drm_connector *connector) { struct intel_connector *intel_connector = to_intel_connector(connector); @@ -6264,6 +6284,10 @@ static int intel_dp_get_modes(struct drm_connector *connector) edid = intel_connector->detect_edid; if (edid) { int ret = intel_connector_update_modes(connector, edid); + + if (intel_dp_is_vrr_capable(connector)) + drm_connector_set_vrr_capable_property(connector, + true); if (ret) return ret; } @@ -7325,6 +7349,9 @@ intel_dp_add_properties(struct intel_dp *intel_dp, struct drm_connector *connect connector->state->scaling_mode = DRM_MODE_SCALE_ASPECT;
} + + if (INTEL_GEN(dev_priv) >= 12) + drm_connector_attach_vrr_capable_property(connector); }
static void intel_dp_init_panel_power_timestamps(struct intel_dp *intel_dp) diff --git a/drivers/gpu/drm/i915/display/intel_dp.h b/drivers/gpu/drm/i915/display/intel_dp.h index 0a8950f744f6..db895a3cd93f 100644 --- a/drivers/gpu/drm/i915/display/intel_dp.h +++ b/drivers/gpu/drm/i915/display/intel_dp.h @@ -14,6 +14,7 @@ enum pipe; enum port; struct drm_connector_state; struct drm_encoder; +struct drm_connector; struct drm_i915_private; struct drm_modeset_acquire_ctx; struct drm_dp_vsc_sdp; @@ -120,6 +121,7 @@ void intel_read_dp_sdp(struct intel_encoder *encoder, unsigned int type); bool intel_digital_port_connected(struct intel_encoder *encoder); void intel_dp_process_phy_request(struct intel_dp *intel_dp); +bool intel_dp_is_vrr_capable(struct drm_connector *connector);
static inline unsigned int intel_dp_unused_lane_mask(int lane_count) {
From: Bhanuprakash Modem bhanuprakash.modem@intel.com
[Why] It's useful to know the min and max vrr range for IGT testing.
[How] Expose the min and max vfreq for the connector via a debugfs file on the connector, "vrr_range".
Example usage: cat /sys/kernel/debug/dri/0/DP-1/vrr_range
v6: * Rebase (manasi) v5: * Rename to vrr_range to match AMD debugfs v4: * Rebase v3: * Remove the unnecessary debug print (Manasi) v2: * Fix the typo in max_vfreq (Manasi) * Change the name of node to i915_vrr_info so we can add other vrr info for more debug info (Manasi) * Change the VRR capable to display Yes or No (Manasi) * Fix indentation checkpatch errors (Manasi)
Signed-off-by: Bhanuprakash Modem bhanuprakash.modem@intel.com Signed-off-by: Manasi Navare manasi.d.navare@intel.com Cc: Jani Nikula jani.nikula@linux.intel.com Cc: Ville Syrjälä ville.syrjala@linux.intel.com Tested-by: Manasi Navare manasi.d.navare@intel.com --- .../drm/i915/display/intel_display_debugfs.c | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+)
diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c b/drivers/gpu/drm/i915/display/intel_display_debugfs.c index 28dd717e943a..fc05d3468a7b 100644 --- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c +++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c @@ -2185,6 +2185,21 @@ static const struct file_operations i915_dsc_fec_support_fops = { .write = i915_dsc_fec_support_write };
+static int vrr_range_show(struct seq_file *m, void *data) +{ + struct drm_connector *connector = m->private; + + if (connector->status != connector_status_connected) + return -ENODEV; + + seq_printf(m, "Vrr_capable: %s\n", yesno(intel_dp_is_vrr_capable(connector))); + seq_printf(m, "Min: %u\n", (u8)connector->display_info.monitor_range.min_vfreq); + seq_printf(m, "Max: %u\n", (u8)connector->display_info.monitor_range.max_vfreq); + + return 0; +} +DEFINE_SHOW_ATTRIBUTE(vrr_range); + /** * intel_connector_debugfs_add - add i915 specific connector debugfs files * @connector: pointer to a registered drm_connector @@ -2224,6 +2239,11 @@ int intel_connector_debugfs_add(struct drm_connector *connector) debugfs_create_file("i915_dsc_fec_support", S_IRUGO, root, connector, &i915_dsc_fec_support_fops);
+ if (INTEL_GEN(dev_priv) >= 12) + debugfs_create_file("vrr_range", S_IRUGO, + root, connector, &vrr_range_fops); + } + /* Legacy panels doesn't lpsp on any platform */ if ((INTEL_GEN(dev_priv) >= 9 || IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) &&
From: Bhanuprakash Modem bhanuprakash.modem@intel.com
[Why] It's useful to know the min and max vrr range for IGT testing.
[How] Expose the min and max vfreq for the connector via a debugfs file on the connector, "vrr_range".
Example usage: cat /sys/kernel/debug/dri/0/DP-1/vrr_range
v7: * Fix cmpilation due to rebase v6: * Rebase (manasi) v5: * Rename to vrr_range to match AMD debugfs v4: * Rebase v3: * Remove the unnecessary debug print (Manasi) v2: * Fix the typo in max_vfreq (Manasi) * Change the name of node to i915_vrr_info so we can add other vrr info for more debug info (Manasi) * Change the VRR capable to display Yes or No (Manasi) * Fix indentation checkpatch errors (Manasi)
Signed-off-by: Bhanuprakash Modem bhanuprakash.modem@intel.com Signed-off-by: Manasi Navare manasi.d.navare@intel.com Cc: Jani Nikula jani.nikula@linux.intel.com Cc: Ville Syrjälä ville.syrjala@linux.intel.com Tested-by: Manasi Navare manasi.d.navare@intel.com --- .../drm/i915/display/intel_display_debugfs.c | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c b/drivers/gpu/drm/i915/display/intel_display_debugfs.c index 28dd717e943a..2921f7d2a26e 100644 --- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c +++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c @@ -2185,6 +2185,21 @@ static const struct file_operations i915_dsc_fec_support_fops = { .write = i915_dsc_fec_support_write };
+static int vrr_range_show(struct seq_file *m, void *data) +{ + struct drm_connector *connector = m->private; + + if (connector->status != connector_status_connected) + return -ENODEV; + + seq_printf(m, "Vrr_capable: %s\n", yesno(intel_dp_is_vrr_capable(connector))); + seq_printf(m, "Min: %u\n", (u8)connector->display_info.monitor_range.min_vfreq); + seq_printf(m, "Max: %u\n", (u8)connector->display_info.monitor_range.max_vfreq); + + return 0; +} +DEFINE_SHOW_ATTRIBUTE(vrr_range); + /** * intel_connector_debugfs_add - add i915 specific connector debugfs files * @connector: pointer to a registered drm_connector @@ -2220,10 +2235,15 @@ int intel_connector_debugfs_add(struct drm_connector *connector) if (INTEL_GEN(dev_priv) >= 10 && ((connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort && !to_intel_connector(connector)->mst_port) || - connector->connector_type == DRM_MODE_CONNECTOR_eDP)) + connector->connector_type == DRM_MODE_CONNECTOR_eDP)) { debugfs_create_file("i915_dsc_fec_support", S_IRUGO, root, connector, &i915_dsc_fec_support_fops);
+ if (INTEL_GEN(dev_priv) >= 12) + debugfs_create_file("vrr_range", S_IRUGO, + root, connector, &vrr_range_fops); + } + /* Legacy panels doesn't lpsp on any platform */ if ((INTEL_GEN(dev_priv) >= 9 || IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) &&
Hi Manasi,
On Sat, 13 Jun 2020 at 00:55, Manasi Navare manasi.d.navare@intel.com wrote:
From: Bhanuprakash Modem bhanuprakash.modem@intel.com
[Why] It's useful to know the min and max vrr range for IGT testing.
[How] Expose the min and max vfreq for the connector via a debugfs file on the connector, "vrr_range".
Example usage: cat /sys/kernel/debug/dri/0/DP-1/vrr_range
v7:
- Fix cmpilation due to rebase
v6:
- Rebase (manasi)
v5:
- Rename to vrr_range to match AMD debugfs
v4:
- Rebase
v3:
- Remove the unnecessary debug print (Manasi)
v2:
- Fix the typo in max_vfreq (Manasi)
- Change the name of node to i915_vrr_info so we can add
other vrr info for more debug info (Manasi)
- Change the VRR capable to display Yes or No (Manasi)
- Fix indentation checkpatch errors (Manasi)
Nit: generally revision log is listed in v2 -> v6 order.
Signed-off-by: Bhanuprakash Modem bhanuprakash.modem@intel.com Signed-off-by: Manasi Navare manasi.d.navare@intel.com Cc: Jani Nikula jani.nikula@linux.intel.com Cc: Ville Syrjälä ville.syrjala@linux.intel.com Tested-by: Manasi Navare manasi.d.navare@intel.com
.../drm/i915/display/intel_display_debugfs.c | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c b/drivers/gpu/drm/i915/display/intel_display_debugfs.c index 28dd717e943a..2921f7d2a26e 100644 --- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c +++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c @@ -2185,6 +2185,21 @@ static const struct file_operations i915_dsc_fec_support_fops = { .write = i915_dsc_fec_support_write };
+static int vrr_range_show(struct seq_file *m, void *data) +{
struct drm_connector *connector = m->private;
if (connector->status != connector_status_connected)
return -ENODEV;
seq_printf(m, "Vrr_capable: %s\n", yesno(intel_dp_is_vrr_capable(connector)));
seq_printf(m, "Min: %u\n", (u8)connector->display_info.monitor_range.min_vfreq);
seq_printf(m, "Max: %u\n", (u8)connector->display_info.monitor_range.max_vfreq);
return 0;
+} +DEFINE_SHOW_ATTRIBUTE(vrr_range);
/**
- intel_connector_debugfs_add - add i915 specific connector debugfs files
- @connector: pointer to a registered drm_connector
@@ -2220,10 +2235,15 @@ int intel_connector_debugfs_add(struct drm_connector *connector) if (INTEL_GEN(dev_priv) >= 10 && ((connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort && !to_intel_connector(connector)->mst_port) ||
connector->connector_type == DRM_MODE_CONNECTOR_eDP))
connector->connector_type == DRM_MODE_CONNECTOR_eDP)) { debugfs_create_file("i915_dsc_fec_support", S_IRUGO, root, connector, &i915_dsc_fec_support_fops);
if (INTEL_GEN(dev_priv) >= 12)
debugfs_create_file("vrr_range", S_IRUGO,
root, connector, &vrr_range_fops);
}
I think this should be added by core drm. Ideally drm will add it automatically for each connector that the driver has called drm_connector_attach_vrr_capable_property() upon.
-Emil
On Mon, Jun 15, 2020 at 10:36:28PM +0100, Emil Velikov wrote:
Hi Manasi,
On Sat, 13 Jun 2020 at 00:55, Manasi Navare manasi.d.navare@intel.com wrote:
From: Bhanuprakash Modem bhanuprakash.modem@intel.com
[Why] It's useful to know the min and max vrr range for IGT testing.
[How] Expose the min and max vfreq for the connector via a debugfs file on the connector, "vrr_range".
Example usage: cat /sys/kernel/debug/dri/0/DP-1/vrr_range
v7:
- Fix cmpilation due to rebase
v6:
- Rebase (manasi)
v5:
- Rename to vrr_range to match AMD debugfs
v4:
- Rebase
v3:
- Remove the unnecessary debug print (Manasi)
v2:
- Fix the typo in max_vfreq (Manasi)
- Change the name of node to i915_vrr_info so we can add
other vrr info for more debug info (Manasi)
- Change the VRR capable to display Yes or No (Manasi)
- Fix indentation checkpatch errors (Manasi)
Nit: generally revision log is listed in v2 -> v6 order.
Okay point noted. Will update this in the next rev
Signed-off-by: Bhanuprakash Modem bhanuprakash.modem@intel.com Signed-off-by: Manasi Navare manasi.d.navare@intel.com Cc: Jani Nikula jani.nikula@linux.intel.com Cc: Ville Syrjälä ville.syrjala@linux.intel.com Tested-by: Manasi Navare manasi.d.navare@intel.com
.../drm/i915/display/intel_display_debugfs.c | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c b/drivers/gpu/drm/i915/display/intel_display_debugfs.c index 28dd717e943a..2921f7d2a26e 100644 --- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c +++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c @@ -2185,6 +2185,21 @@ static const struct file_operations i915_dsc_fec_support_fops = { .write = i915_dsc_fec_support_write };
+static int vrr_range_show(struct seq_file *m, void *data) +{
struct drm_connector *connector = m->private;
if (connector->status != connector_status_connected)
return -ENODEV;
seq_printf(m, "Vrr_capable: %s\n", yesno(intel_dp_is_vrr_capable(connector)));
seq_printf(m, "Min: %u\n", (u8)connector->display_info.monitor_range.min_vfreq);
seq_printf(m, "Max: %u\n", (u8)connector->display_info.monitor_range.max_vfreq);
return 0;
+} +DEFINE_SHOW_ATTRIBUTE(vrr_range);
/**
- intel_connector_debugfs_add - add i915 specific connector debugfs files
- @connector: pointer to a registered drm_connector
@@ -2220,10 +2235,15 @@ int intel_connector_debugfs_add(struct drm_connector *connector) if (INTEL_GEN(dev_priv) >= 10 && ((connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort && !to_intel_connector(connector)->mst_port) ||
connector->connector_type == DRM_MODE_CONNECTOR_eDP))
connector->connector_type == DRM_MODE_CONNECTOR_eDP)) { debugfs_create_file("i915_dsc_fec_support", S_IRUGO, root, connector, &i915_dsc_fec_support_fops);
if (INTEL_GEN(dev_priv) >= 12)
debugfs_create_file("vrr_range", S_IRUGO,
root, connector, &vrr_range_fops);
}
I think this should be added by core drm. Ideally drm will add it automatically for each connector that the driver has called drm_connector_attach_vrr_capable_property() upon.
But in this case drm_connector_attach_vrr_capable_property() is called by individual driver since its an optional connector property. So we call this inside i915. Also currently AMD sets this debugfs inside AMD IMO, so setting this here for now. But I agree that can be moved to drm core may be when drm_display_info gets populated with min and max, thats where drm can add this?
Manasi
-Emil
On Mon, 15 Jun 2020 at 22:47, Manasi Navare manasi.d.navare@intel.com wrote:
On Mon, Jun 15, 2020 at 10:36:28PM +0100, Emil Velikov wrote:
Hi Manasi,
On Sat, 13 Jun 2020 at 00:55, Manasi Navare manasi.d.navare@intel.com wrote:
From: Bhanuprakash Modem bhanuprakash.modem@intel.com
[Why] It's useful to know the min and max vrr range for IGT testing.
[How] Expose the min and max vfreq for the connector via a debugfs file on the connector, "vrr_range".
Example usage: cat /sys/kernel/debug/dri/0/DP-1/vrr_range
v7:
- Fix cmpilation due to rebase
v6:
- Rebase (manasi)
v5:
- Rename to vrr_range to match AMD debugfs
v4:
- Rebase
v3:
- Remove the unnecessary debug print (Manasi)
v2:
- Fix the typo in max_vfreq (Manasi)
- Change the name of node to i915_vrr_info so we can add
other vrr info for more debug info (Manasi)
- Change the VRR capable to display Yes or No (Manasi)
- Fix indentation checkpatch errors (Manasi)
Nit: generally revision log is listed in v2 -> v6 order.
Okay point noted. Will update this in the next rev
Signed-off-by: Bhanuprakash Modem bhanuprakash.modem@intel.com Signed-off-by: Manasi Navare manasi.d.navare@intel.com Cc: Jani Nikula jani.nikula@linux.intel.com Cc: Ville Syrjälä ville.syrjala@linux.intel.com Tested-by: Manasi Navare manasi.d.navare@intel.com
.../drm/i915/display/intel_display_debugfs.c | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c b/drivers/gpu/drm/i915/display/intel_display_debugfs.c index 28dd717e943a..2921f7d2a26e 100644 --- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c +++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c @@ -2185,6 +2185,21 @@ static const struct file_operations i915_dsc_fec_support_fops = { .write = i915_dsc_fec_support_write };
+static int vrr_range_show(struct seq_file *m, void *data) +{
struct drm_connector *connector = m->private;
if (connector->status != connector_status_connected)
return -ENODEV;
seq_printf(m, "Vrr_capable: %s\n", yesno(intel_dp_is_vrr_capable(connector)));
seq_printf(m, "Min: %u\n", (u8)connector->display_info.monitor_range.min_vfreq);
seq_printf(m, "Max: %u\n", (u8)connector->display_info.monitor_range.max_vfreq);
return 0;
+} +DEFINE_SHOW_ATTRIBUTE(vrr_range);
/**
- intel_connector_debugfs_add - add i915 specific connector debugfs files
- @connector: pointer to a registered drm_connector
@@ -2220,10 +2235,15 @@ int intel_connector_debugfs_add(struct drm_connector *connector) if (INTEL_GEN(dev_priv) >= 10 && ((connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort && !to_intel_connector(connector)->mst_port) ||
connector->connector_type == DRM_MODE_CONNECTOR_eDP))
connector->connector_type == DRM_MODE_CONNECTOR_eDP)) { debugfs_create_file("i915_dsc_fec_support", S_IRUGO, root, connector, &i915_dsc_fec_support_fops);
if (INTEL_GEN(dev_priv) >= 12)
debugfs_create_file("vrr_range", S_IRUGO,
root, connector, &vrr_range_fops);
}
I think this should be added by core drm. Ideally drm will add it automatically for each connector that the driver has called drm_connector_attach_vrr_capable_property() upon.
But in this case drm_connector_attach_vrr_capable_property() is called by individual driver since its an optional connector property. So we call this inside i915.
I'm _not_ suggesting that one moves the drm_connector_attach_vrr_capable_property() call. Simply create the debugfs file in drm itself.
Also currently AMD sets this debugfs inside AMD IMO, so setting this here for now.
Let's do the better thing of a) make drm create the file, and b) remove the AMDGPU specific one.
We're talking about 20-30 lines worth of a patch. Postponing it sounds silly.
But I agree that can be moved to drm core may be when drm_display_info gets populated with min and max, thats where drm can add this?
Both min and max are already part of drm_display_info. On the question of how - check the existing properties (edid_override, force) for examples.
-Emil
On Tue, Jun 16, 2020 at 04:34:07PM +0100, Emil Velikov wrote:
On Mon, 15 Jun 2020 at 22:47, Manasi Navare manasi.d.navare@intel.com wrote:
On Mon, Jun 15, 2020 at 10:36:28PM +0100, Emil Velikov wrote:
Hi Manasi,
On Sat, 13 Jun 2020 at 00:55, Manasi Navare manasi.d.navare@intel.com wrote:
From: Bhanuprakash Modem bhanuprakash.modem@intel.com
[Why] It's useful to know the min and max vrr range for IGT testing.
[How] Expose the min and max vfreq for the connector via a debugfs file on the connector, "vrr_range".
Example usage: cat /sys/kernel/debug/dri/0/DP-1/vrr_range
v7:
- Fix cmpilation due to rebase
v6:
- Rebase (manasi)
v5:
- Rename to vrr_range to match AMD debugfs
v4:
- Rebase
v3:
- Remove the unnecessary debug print (Manasi)
v2:
- Fix the typo in max_vfreq (Manasi)
- Change the name of node to i915_vrr_info so we can add
other vrr info for more debug info (Manasi)
- Change the VRR capable to display Yes or No (Manasi)
- Fix indentation checkpatch errors (Manasi)
Nit: generally revision log is listed in v2 -> v6 order.
Okay point noted. Will update this in the next rev
Signed-off-by: Bhanuprakash Modem bhanuprakash.modem@intel.com Signed-off-by: Manasi Navare manasi.d.navare@intel.com Cc: Jani Nikula jani.nikula@linux.intel.com Cc: Ville Syrjälä ville.syrjala@linux.intel.com Tested-by: Manasi Navare manasi.d.navare@intel.com
.../drm/i915/display/intel_display_debugfs.c | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/i915/display/intel_display_debugfs.c b/drivers/gpu/drm/i915/display/intel_display_debugfs.c index 28dd717e943a..2921f7d2a26e 100644 --- a/drivers/gpu/drm/i915/display/intel_display_debugfs.c +++ b/drivers/gpu/drm/i915/display/intel_display_debugfs.c @@ -2185,6 +2185,21 @@ static const struct file_operations i915_dsc_fec_support_fops = { .write = i915_dsc_fec_support_write };
+static int vrr_range_show(struct seq_file *m, void *data) +{
struct drm_connector *connector = m->private;
if (connector->status != connector_status_connected)
return -ENODEV;
seq_printf(m, "Vrr_capable: %s\n", yesno(intel_dp_is_vrr_capable(connector)));
seq_printf(m, "Min: %u\n", (u8)connector->display_info.monitor_range.min_vfreq);
seq_printf(m, "Max: %u\n", (u8)connector->display_info.monitor_range.max_vfreq);
return 0;
+} +DEFINE_SHOW_ATTRIBUTE(vrr_range);
/**
- intel_connector_debugfs_add - add i915 specific connector debugfs files
- @connector: pointer to a registered drm_connector
@@ -2220,10 +2235,15 @@ int intel_connector_debugfs_add(struct drm_connector *connector) if (INTEL_GEN(dev_priv) >= 10 && ((connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort && !to_intel_connector(connector)->mst_port) ||
connector->connector_type == DRM_MODE_CONNECTOR_eDP))
connector->connector_type == DRM_MODE_CONNECTOR_eDP)) { debugfs_create_file("i915_dsc_fec_support", S_IRUGO, root, connector, &i915_dsc_fec_support_fops);
if (INTEL_GEN(dev_priv) >= 12)
debugfs_create_file("vrr_range", S_IRUGO,
root, connector, &vrr_range_fops);
}
I think this should be added by core drm. Ideally drm will add it automatically for each connector that the driver has called drm_connector_attach_vrr_capable_property() upon.
But in this case drm_connector_attach_vrr_capable_property() is called by individual driver since its an optional connector property. So we call this inside i915.
I'm _not_ suggesting that one moves the drm_connector_attach_vrr_capable_property() call. Simply create the debugfs file in drm itself.
Also currently AMD sets this debugfs inside AMD IMO, so setting this here for now.
Let's do the better thing of a) make drm create the file, and b) remove the AMDGPU specific one.
We're talking about 20-30 lines worth of a patch. Postponing it sounds silly.
But I agree that can be moved to drm core may be when drm_display_info gets populated with min and max, thats where drm can add this?
Both min and max are already part of drm_display_info. On the question of how - check the existing properties (edid_override, force) for examples.
Okay makes sense. Will move the vrr_range to drm debugfs node. Thanks for your feedback.
Regards Manasi
-Emil
Hi Manasi,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on drm-intel/for-linux-next] [also build test ERROR on drm-tip/drm-tip drm-exynos/exynos-drm-next linus/master next-20200612] [cannot apply to tegra-drm/drm/tegra/for-next drm/drm-next v5.7] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system. BTW, we also suggest to use '--base' option to specify the base tree in git format-patch, please see https://stackoverflow.com/a/37406982]
url: https://github.com/0day-ci/linux/commits/Manasi-Navare/VRR-capable-attach-pr... base: git://anongit.freedesktop.org/drm-intel for-linux-next config: x86_64-rhel (attached as .config) compiler: gcc-9 (Debian 9.3.0-13) 9.3.0 reproduce (this is a W=1 build): # save the attached .config to linux build tree make W=1 ARCH=x86_64
If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot lkp@intel.com
All error/warnings (new ones prefixed by >>, old ones prefixed by <<):
drivers/gpu/drm/i915/display/intel_display_debugfs.c: In function 'intel_connector_debugfs_add':
drivers/gpu/drm/i915/display/intel_display_debugfs.c:2235:2: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
2235 | if (INTEL_GEN(dev_priv) >= 10 && | ^~ drivers/gpu/drm/i915/display/intel_display_debugfs.c:2241:3: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if' 2241 | if (INTEL_GEN(dev_priv) >= 12) | ^~ drivers/gpu/drm/i915/display/intel_display_debugfs.c: At top level:
drivers/gpu/drm/i915/display/intel_display_debugfs.c:2247:2: error: expected identifier or '(' before 'if'
2247 | if ((INTEL_GEN(dev_priv) >= 9 || IS_HASWELL(dev_priv) || | ^~
drivers/gpu/drm/i915/display/intel_display_debugfs.c:2257:2: error: expected identifier or '(' before 'return'
2257 | return 0; | ^~~~~~
drivers/gpu/drm/i915/display/intel_display_debugfs.c:2258:1: error: expected identifier or '(' before '}' token
2258 | } | ^ drivers/gpu/drm/i915/display/intel_display_debugfs.c: In function 'intel_connector_debugfs_add':
drivers/gpu/drm/i915/display/intel_display_debugfs.c:2244:2: warning: control reaches end of non-void function [-Wreturn-type]
2244 | } | ^ In file included from include/drm/drm_debugfs.h:36, from drivers/gpu/drm/i915/display/intel_display_debugfs.c:6: At top level: drivers/gpu/drm/i915/display/intel_display_debugfs.c:2081:23: warning: 'i915_lpsp_capability_fops' defined but not used [-Wunused-const-variable=] 2081 | DEFINE_SHOW_ATTRIBUTE(i915_lpsp_capability); | ^~~~~~~~~~~~~~~~~~~~ include/linux/seq_file.h:154:37: note: in definition of macro 'DEFINE_SHOW_ATTRIBUTE' 154 | static const struct file_operations __name ## _fops = { | ^~~~~~
vim +2247 drivers/gpu/drm/i915/display/intel_display_debugfs.c
670af3cf7a3a36 Bhanuprakash Modem 2020-06-12 2202 926b005cd8c4e3 Jani Nikula 2020-02-11 2203 /** 926b005cd8c4e3 Jani Nikula 2020-02-11 2204 * intel_connector_debugfs_add - add i915 specific connector debugfs files 926b005cd8c4e3 Jani Nikula 2020-02-11 2205 * @connector: pointer to a registered drm_connector 926b005cd8c4e3 Jani Nikula 2020-02-11 2206 * 926b005cd8c4e3 Jani Nikula 2020-02-11 2207 * Cleanup will be done by drm_connector_unregister() through a call to 926b005cd8c4e3 Jani Nikula 2020-02-11 2208 * drm_debugfs_connector_remove(). 926b005cd8c4e3 Jani Nikula 2020-02-11 2209 * 926b005cd8c4e3 Jani Nikula 2020-02-11 2210 * Returns 0 on success, negative error codes on error. 926b005cd8c4e3 Jani Nikula 2020-02-11 2211 */ 926b005cd8c4e3 Jani Nikula 2020-02-11 2212 int intel_connector_debugfs_add(struct drm_connector *connector) 926b005cd8c4e3 Jani Nikula 2020-02-11 2213 { 926b005cd8c4e3 Jani Nikula 2020-02-11 2214 struct dentry *root = connector->debugfs_entry; 926b005cd8c4e3 Jani Nikula 2020-02-11 2215 struct drm_i915_private *dev_priv = to_i915(connector->dev); 926b005cd8c4e3 Jani Nikula 2020-02-11 2216 926b005cd8c4e3 Jani Nikula 2020-02-11 2217 /* The connector must have been registered beforehands. */ 926b005cd8c4e3 Jani Nikula 2020-02-11 2218 if (!root) 926b005cd8c4e3 Jani Nikula 2020-02-11 2219 return -ENODEV; 926b005cd8c4e3 Jani Nikula 2020-02-11 2220 926b005cd8c4e3 Jani Nikula 2020-02-11 2221 if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) { 926b005cd8c4e3 Jani Nikula 2020-02-11 2222 debugfs_create_file("i915_panel_timings", S_IRUGO, root, 926b005cd8c4e3 Jani Nikula 2020-02-11 2223 connector, &i915_panel_fops); 926b005cd8c4e3 Jani Nikula 2020-02-11 2224 debugfs_create_file("i915_psr_sink_status", S_IRUGO, root, 926b005cd8c4e3 Jani Nikula 2020-02-11 2225 connector, &i915_psr_sink_status_fops); 926b005cd8c4e3 Jani Nikula 2020-02-11 2226 } 926b005cd8c4e3 Jani Nikula 2020-02-11 2227 926b005cd8c4e3 Jani Nikula 2020-02-11 2228 if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort || 926b005cd8c4e3 Jani Nikula 2020-02-11 2229 connector->connector_type == DRM_MODE_CONNECTOR_HDMIA || 926b005cd8c4e3 Jani Nikula 2020-02-11 2230 connector->connector_type == DRM_MODE_CONNECTOR_HDMIB) { 926b005cd8c4e3 Jani Nikula 2020-02-11 2231 debugfs_create_file("i915_hdcp_sink_capability", S_IRUGO, root, 926b005cd8c4e3 Jani Nikula 2020-02-11 2232 connector, &i915_hdcp_sink_capability_fops); 926b005cd8c4e3 Jani Nikula 2020-02-11 2233 } 926b005cd8c4e3 Jani Nikula 2020-02-11 2234 926b005cd8c4e3 Jani Nikula 2020-02-11 @2235 if (INTEL_GEN(dev_priv) >= 10 && 926b005cd8c4e3 Jani Nikula 2020-02-11 2236 (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort || 926b005cd8c4e3 Jani Nikula 2020-02-11 2237 connector->connector_type == DRM_MODE_CONNECTOR_eDP)) 926b005cd8c4e3 Jani Nikula 2020-02-11 2238 debugfs_create_file("i915_dsc_fec_support", S_IRUGO, root, 926b005cd8c4e3 Jani Nikula 2020-02-11 2239 connector, &i915_dsc_fec_support_fops); 926b005cd8c4e3 Jani Nikula 2020-02-11 2240 670af3cf7a3a36 Bhanuprakash Modem 2020-06-12 @2241 if (INTEL_GEN(dev_priv) >= 12) 670af3cf7a3a36 Bhanuprakash Modem 2020-06-12 2242 debugfs_create_file("vrr_range", S_IRUGO, 670af3cf7a3a36 Bhanuprakash Modem 2020-06-12 2243 root, connector, &vrr_range_fops); 670af3cf7a3a36 Bhanuprakash Modem 2020-06-12 @2244 } 670af3cf7a3a36 Bhanuprakash Modem 2020-06-12 2245 8806211fe7b306 Anshuman Gupta 2020-04-15 2246 /* Legacy panels doesn't lpsp on any platform */ 8806211fe7b306 Anshuman Gupta 2020-04-15 @2247 if ((INTEL_GEN(dev_priv) >= 9 || IS_HASWELL(dev_priv) || 8806211fe7b306 Anshuman Gupta 2020-04-15 2248 IS_BROADWELL(dev_priv)) && 8806211fe7b306 Anshuman Gupta 2020-04-15 2249 (connector->connector_type == DRM_MODE_CONNECTOR_DSI || 8806211fe7b306 Anshuman Gupta 2020-04-15 2250 connector->connector_type == DRM_MODE_CONNECTOR_eDP || 8806211fe7b306 Anshuman Gupta 2020-04-15 2251 connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort || 8806211fe7b306 Anshuman Gupta 2020-04-15 2252 connector->connector_type == DRM_MODE_CONNECTOR_HDMIA || 8806211fe7b306 Anshuman Gupta 2020-04-15 2253 connector->connector_type == DRM_MODE_CONNECTOR_HDMIB)) 8806211fe7b306 Anshuman Gupta 2020-04-15 2254 debugfs_create_file("i915_lpsp_capability", 0444, root, 8806211fe7b306 Anshuman Gupta 2020-04-15 2255 connector, &i915_lpsp_capability_fops); 8806211fe7b306 Anshuman Gupta 2020-04-15 2256 926b005cd8c4e3 Jani Nikula 2020-02-11 @2257 return 0; 926b005cd8c4e3 Jani Nikula 2020-02-11 @2258 }
:::::: The code at line 2247 was first introduced by commit :::::: 8806211fe7b30696c1fcae54b73c94abfdf55893 drm/i915: Add i915_lpsp_capability debugfs
:::::: TO: Anshuman Gupta anshuman.gupta@intel.com :::::: CC: Uma Shankar uma.shankar@intel.com
--- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
Hi Manasi,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on drm-intel/for-linux-next] [also build test ERROR on drm-tip/drm-tip drm-exynos/exynos-drm-next linus/master next-20200612] [cannot apply to tegra-drm/drm/tegra/for-next drm/drm-next v5.7] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system. BTW, we also suggest to use '--base' option to specify the base tree in git format-patch, please see https://stackoverflow.com/a/37406982]
url: https://github.com/0day-ci/linux/commits/Manasi-Navare/VRR-capable-attach-pr... base: git://anongit.freedesktop.org/drm-intel for-linux-next config: x86_64-randconfig-a014-20200613 (attached as .config) compiler: gcc-7 (Ubuntu 7.5.0-6ubuntu2) 7.5.0 reproduce (this is a W=1 build): # save the attached .config to linux build tree make W=1 ARCH=x86_64
If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot lkp@intel.com
All errors (new ones prefixed by >>, old ones prefixed by <<):
drivers/gpu/drm/i915/display/intel_display_debugfs.c: In function 'intel_connector_debugfs_add':
drivers/gpu/drm/i915/display/intel_display_debugfs.c:2235:2: error: this 'if' clause does not guard... [-Werror=misleading-indentation]
if (INTEL_GEN(dev_priv) >= 10 && ^~ drivers/gpu/drm/i915/display/intel_display_debugfs.c:2241:3: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if' if (INTEL_GEN(dev_priv) >= 12) ^~ drivers/gpu/drm/i915/display/intel_display_debugfs.c: At top level: drivers/gpu/drm/i915/display/intel_display_debugfs.c:2247:2: error: expected identifier or '(' before 'if' if ((INTEL_GEN(dev_priv) >= 9 || IS_HASWELL(dev_priv) || ^~ drivers/gpu/drm/i915/display/intel_display_debugfs.c:2257:2: error: expected identifier or '(' before 'return' return 0; ^~~~~~ drivers/gpu/drm/i915/display/intel_display_debugfs.c:2258:1: error: expected identifier or '(' before '}' token } ^ drivers/gpu/drm/i915/display/intel_display_debugfs.c: In function 'intel_connector_debugfs_add': drivers/gpu/drm/i915/display/intel_display_debugfs.c:2244:2: error: control reaches end of non-void function [-Werror=return-type] } ^ In file included from include/drm/drm_debugfs.h:36:0, from drivers/gpu/drm/i915/display/intel_display_debugfs.c:6: At top level:
drivers/gpu/drm/i915/display/intel_display_debugfs.c:2081:23: error: 'i915_lpsp_capability_fops' defined but not used [-Werror=unused-const-variable=]
DEFINE_SHOW_ATTRIBUTE(i915_lpsp_capability); ^ include/linux/seq_file.h:154:37: note: in definition of macro 'DEFINE_SHOW_ATTRIBUTE' static const struct file_operations __name ## _fops = { ^~~~~~ cc1: all warnings being treated as errors
vim +/if +2235 drivers/gpu/drm/i915/display/intel_display_debugfs.c
926b005cd8c4e3 Jani Nikula 2020-02-11 2040 8806211fe7b306 Anshuman Gupta 2020-04-15 2041 #define LPSP_CAPABLE(COND) (COND ? seq_puts(m, "LPSP: capable\n") : \ 8806211fe7b306 Anshuman Gupta 2020-04-15 2042 seq_puts(m, "LPSP: incapable\n")) 8806211fe7b306 Anshuman Gupta 2020-04-15 2043 8806211fe7b306 Anshuman Gupta 2020-04-15 2044 static int i915_lpsp_capability_show(struct seq_file *m, void *data) 8806211fe7b306 Anshuman Gupta 2020-04-15 2045 { 8806211fe7b306 Anshuman Gupta 2020-04-15 2046 struct drm_connector *connector = m->private; 8806211fe7b306 Anshuman Gupta 2020-04-15 2047 struct intel_encoder *encoder = 8806211fe7b306 Anshuman Gupta 2020-04-15 2048 intel_attached_encoder(to_intel_connector(connector)); 8806211fe7b306 Anshuman Gupta 2020-04-15 2049 struct drm_i915_private *i915 = to_i915(connector->dev); 8806211fe7b306 Anshuman Gupta 2020-04-15 2050 8806211fe7b306 Anshuman Gupta 2020-04-15 2051 if (connector->status != connector_status_connected) 8806211fe7b306 Anshuman Gupta 2020-04-15 2052 return -ENODEV; 8806211fe7b306 Anshuman Gupta 2020-04-15 2053 8806211fe7b306 Anshuman Gupta 2020-04-15 2054 switch (INTEL_GEN(i915)) { 8806211fe7b306 Anshuman Gupta 2020-04-15 2055 case 12: 8806211fe7b306 Anshuman Gupta 2020-04-15 2056 /* 8806211fe7b306 Anshuman Gupta 2020-04-15 2057 * Actually TGL can drive LPSP on port till DDI_C 8806211fe7b306 Anshuman Gupta 2020-04-15 2058 * but there is no physical connected DDI_C on TGL sku's, 8806211fe7b306 Anshuman Gupta 2020-04-15 2059 * even driver is not initilizing DDI_C port for gen12. 8806211fe7b306 Anshuman Gupta 2020-04-15 2060 */ 8806211fe7b306 Anshuman Gupta 2020-04-15 2061 LPSP_CAPABLE(encoder->port <= PORT_B); 8806211fe7b306 Anshuman Gupta 2020-04-15 2062 break; 8806211fe7b306 Anshuman Gupta 2020-04-15 2063 case 11: 8806211fe7b306 Anshuman Gupta 2020-04-15 2064 LPSP_CAPABLE(connector->connector_type == DRM_MODE_CONNECTOR_DSI || 8806211fe7b306 Anshuman Gupta 2020-04-15 2065 connector->connector_type == DRM_MODE_CONNECTOR_eDP); 8806211fe7b306 Anshuman Gupta 2020-04-15 2066 break; 8806211fe7b306 Anshuman Gupta 2020-04-15 2067 case 10: 8806211fe7b306 Anshuman Gupta 2020-04-15 2068 case 9: 8806211fe7b306 Anshuman Gupta 2020-04-15 2069 LPSP_CAPABLE(encoder->port == PORT_A && 8806211fe7b306 Anshuman Gupta 2020-04-15 2070 (connector->connector_type == DRM_MODE_CONNECTOR_DSI || 8806211fe7b306 Anshuman Gupta 2020-04-15 2071 connector->connector_type == DRM_MODE_CONNECTOR_eDP || 8806211fe7b306 Anshuman Gupta 2020-04-15 2072 connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort)); 8806211fe7b306 Anshuman Gupta 2020-04-15 2073 break; 8806211fe7b306 Anshuman Gupta 2020-04-15 2074 default: 8806211fe7b306 Anshuman Gupta 2020-04-15 2075 if (IS_HASWELL(i915) || IS_BROADWELL(i915)) 8806211fe7b306 Anshuman Gupta 2020-04-15 2076 LPSP_CAPABLE(connector->connector_type == DRM_MODE_CONNECTOR_eDP); 8806211fe7b306 Anshuman Gupta 2020-04-15 2077 } 8806211fe7b306 Anshuman Gupta 2020-04-15 2078 8806211fe7b306 Anshuman Gupta 2020-04-15 2079 return 0; 8806211fe7b306 Anshuman Gupta 2020-04-15 2080 } 8806211fe7b306 Anshuman Gupta 2020-04-15 @2081 DEFINE_SHOW_ATTRIBUTE(i915_lpsp_capability); 8806211fe7b306 Anshuman Gupta 2020-04-15 2082 926b005cd8c4e3 Jani Nikula 2020-02-11 2083 static int i915_dsc_fec_support_show(struct seq_file *m, void *data) 926b005cd8c4e3 Jani Nikula 2020-02-11 2084 { 926b005cd8c4e3 Jani Nikula 2020-02-11 2085 struct drm_connector *connector = m->private; 926b005cd8c4e3 Jani Nikula 2020-02-11 2086 struct drm_device *dev = connector->dev; 926b005cd8c4e3 Jani Nikula 2020-02-11 2087 struct drm_crtc *crtc; 926b005cd8c4e3 Jani Nikula 2020-02-11 2088 struct intel_dp *intel_dp; 926b005cd8c4e3 Jani Nikula 2020-02-11 2089 struct drm_modeset_acquire_ctx ctx; 926b005cd8c4e3 Jani Nikula 2020-02-11 2090 struct intel_crtc_state *crtc_state = NULL; 926b005cd8c4e3 Jani Nikula 2020-02-11 2091 int ret = 0; 926b005cd8c4e3 Jani Nikula 2020-02-11 2092 bool try_again = false; 926b005cd8c4e3 Jani Nikula 2020-02-11 2093 926b005cd8c4e3 Jani Nikula 2020-02-11 2094 drm_modeset_acquire_init(&ctx, DRM_MODESET_ACQUIRE_INTERRUPTIBLE); 926b005cd8c4e3 Jani Nikula 2020-02-11 2095 926b005cd8c4e3 Jani Nikula 2020-02-11 2096 do { 926b005cd8c4e3 Jani Nikula 2020-02-11 2097 try_again = false; 926b005cd8c4e3 Jani Nikula 2020-02-11 2098 ret = drm_modeset_lock(&dev->mode_config.connection_mutex, 926b005cd8c4e3 Jani Nikula 2020-02-11 2099 &ctx); 926b005cd8c4e3 Jani Nikula 2020-02-11 2100 if (ret) { 926b005cd8c4e3 Jani Nikula 2020-02-11 2101 if (ret == -EDEADLK && !drm_modeset_backoff(&ctx)) { 926b005cd8c4e3 Jani Nikula 2020-02-11 2102 try_again = true; 926b005cd8c4e3 Jani Nikula 2020-02-11 2103 continue; 926b005cd8c4e3 Jani Nikula 2020-02-11 2104 } 926b005cd8c4e3 Jani Nikula 2020-02-11 2105 break; 926b005cd8c4e3 Jani Nikula 2020-02-11 2106 } 926b005cd8c4e3 Jani Nikula 2020-02-11 2107 crtc = connector->state->crtc; 926b005cd8c4e3 Jani Nikula 2020-02-11 2108 if (connector->status != connector_status_connected || !crtc) { 926b005cd8c4e3 Jani Nikula 2020-02-11 2109 ret = -ENODEV; 926b005cd8c4e3 Jani Nikula 2020-02-11 2110 break; 926b005cd8c4e3 Jani Nikula 2020-02-11 2111 } 926b005cd8c4e3 Jani Nikula 2020-02-11 2112 ret = drm_modeset_lock(&crtc->mutex, &ctx); 926b005cd8c4e3 Jani Nikula 2020-02-11 2113 if (ret == -EDEADLK) { 926b005cd8c4e3 Jani Nikula 2020-02-11 2114 ret = drm_modeset_backoff(&ctx); 926b005cd8c4e3 Jani Nikula 2020-02-11 2115 if (!ret) { 926b005cd8c4e3 Jani Nikula 2020-02-11 2116 try_again = true; 926b005cd8c4e3 Jani Nikula 2020-02-11 2117 continue; 926b005cd8c4e3 Jani Nikula 2020-02-11 2118 } 926b005cd8c4e3 Jani Nikula 2020-02-11 2119 break; 926b005cd8c4e3 Jani Nikula 2020-02-11 2120 } else if (ret) { 926b005cd8c4e3 Jani Nikula 2020-02-11 2121 break; 926b005cd8c4e3 Jani Nikula 2020-02-11 2122 } 926b005cd8c4e3 Jani Nikula 2020-02-11 2123 intel_dp = intel_attached_dp(to_intel_connector(connector)); 926b005cd8c4e3 Jani Nikula 2020-02-11 2124 crtc_state = to_intel_crtc_state(crtc->state); 926b005cd8c4e3 Jani Nikula 2020-02-11 2125 seq_printf(m, "DSC_Enabled: %s\n", 926b005cd8c4e3 Jani Nikula 2020-02-11 2126 yesno(crtc_state->dsc.compression_enable)); 926b005cd8c4e3 Jani Nikula 2020-02-11 2127 seq_printf(m, "DSC_Sink_Support: %s\n", 926b005cd8c4e3 Jani Nikula 2020-02-11 2128 yesno(drm_dp_sink_supports_dsc(intel_dp->dsc_dpcd))); 926b005cd8c4e3 Jani Nikula 2020-02-11 2129 seq_printf(m, "Force_DSC_Enable: %s\n", 926b005cd8c4e3 Jani Nikula 2020-02-11 2130 yesno(intel_dp->force_dsc_en)); 926b005cd8c4e3 Jani Nikula 2020-02-11 2131 if (!intel_dp_is_edp(intel_dp)) 926b005cd8c4e3 Jani Nikula 2020-02-11 2132 seq_printf(m, "FEC_Sink_Support: %s\n", 926b005cd8c4e3 Jani Nikula 2020-02-11 2133 yesno(drm_dp_sink_supports_fec(intel_dp->fec_capable))); 926b005cd8c4e3 Jani Nikula 2020-02-11 2134 } while (try_again); 926b005cd8c4e3 Jani Nikula 2020-02-11 2135 926b005cd8c4e3 Jani Nikula 2020-02-11 2136 drm_modeset_drop_locks(&ctx); 926b005cd8c4e3 Jani Nikula 2020-02-11 2137 drm_modeset_acquire_fini(&ctx); 926b005cd8c4e3 Jani Nikula 2020-02-11 2138 926b005cd8c4e3 Jani Nikula 2020-02-11 2139 return ret; 926b005cd8c4e3 Jani Nikula 2020-02-11 2140 } 926b005cd8c4e3 Jani Nikula 2020-02-11 2141 926b005cd8c4e3 Jani Nikula 2020-02-11 2142 static ssize_t i915_dsc_fec_support_write(struct file *file, 926b005cd8c4e3 Jani Nikula 2020-02-11 2143 const char __user *ubuf, 926b005cd8c4e3 Jani Nikula 2020-02-11 2144 size_t len, loff_t *offp) 926b005cd8c4e3 Jani Nikula 2020-02-11 2145 { 926b005cd8c4e3 Jani Nikula 2020-02-11 2146 bool dsc_enable = false; 926b005cd8c4e3 Jani Nikula 2020-02-11 2147 int ret; 926b005cd8c4e3 Jani Nikula 2020-02-11 2148 struct drm_connector *connector = 926b005cd8c4e3 Jani Nikula 2020-02-11 2149 ((struct seq_file *)file->private_data)->private; 926b005cd8c4e3 Jani Nikula 2020-02-11 2150 struct intel_encoder *encoder = intel_attached_encoder(to_intel_connector(connector)); 926b005cd8c4e3 Jani Nikula 2020-02-11 2151 struct drm_i915_private *i915 = to_i915(encoder->base.dev); 926b005cd8c4e3 Jani Nikula 2020-02-11 2152 struct intel_dp *intel_dp = enc_to_intel_dp(encoder); 926b005cd8c4e3 Jani Nikula 2020-02-11 2153 926b005cd8c4e3 Jani Nikula 2020-02-11 2154 if (len == 0) 926b005cd8c4e3 Jani Nikula 2020-02-11 2155 return 0; 926b005cd8c4e3 Jani Nikula 2020-02-11 2156 926b005cd8c4e3 Jani Nikula 2020-02-11 2157 drm_dbg(&i915->drm, 926b005cd8c4e3 Jani Nikula 2020-02-11 2158 "Copied %zu bytes from user to force DSC\n", len); 926b005cd8c4e3 Jani Nikula 2020-02-11 2159 926b005cd8c4e3 Jani Nikula 2020-02-11 2160 ret = kstrtobool_from_user(ubuf, len, &dsc_enable); 926b005cd8c4e3 Jani Nikula 2020-02-11 2161 if (ret < 0) 926b005cd8c4e3 Jani Nikula 2020-02-11 2162 return ret; 926b005cd8c4e3 Jani Nikula 2020-02-11 2163 926b005cd8c4e3 Jani Nikula 2020-02-11 2164 drm_dbg(&i915->drm, "Got %s for DSC Enable\n", 926b005cd8c4e3 Jani Nikula 2020-02-11 2165 (dsc_enable) ? "true" : "false"); 926b005cd8c4e3 Jani Nikula 2020-02-11 2166 intel_dp->force_dsc_en = dsc_enable; 926b005cd8c4e3 Jani Nikula 2020-02-11 2167 926b005cd8c4e3 Jani Nikula 2020-02-11 2168 *offp += len; 926b005cd8c4e3 Jani Nikula 2020-02-11 2169 return len; 926b005cd8c4e3 Jani Nikula 2020-02-11 2170 } 926b005cd8c4e3 Jani Nikula 2020-02-11 2171 926b005cd8c4e3 Jani Nikula 2020-02-11 2172 static int i915_dsc_fec_support_open(struct inode *inode, 926b005cd8c4e3 Jani Nikula 2020-02-11 2173 struct file *file) 926b005cd8c4e3 Jani Nikula 2020-02-11 2174 { 926b005cd8c4e3 Jani Nikula 2020-02-11 2175 return single_open(file, i915_dsc_fec_support_show, 926b005cd8c4e3 Jani Nikula 2020-02-11 2176 inode->i_private); 926b005cd8c4e3 Jani Nikula 2020-02-11 2177 } 926b005cd8c4e3 Jani Nikula 2020-02-11 2178 926b005cd8c4e3 Jani Nikula 2020-02-11 2179 static const struct file_operations i915_dsc_fec_support_fops = { 926b005cd8c4e3 Jani Nikula 2020-02-11 2180 .owner = THIS_MODULE, 926b005cd8c4e3 Jani Nikula 2020-02-11 2181 .open = i915_dsc_fec_support_open, 926b005cd8c4e3 Jani Nikula 2020-02-11 2182 .read = seq_read, 926b005cd8c4e3 Jani Nikula 2020-02-11 2183 .llseek = seq_lseek, 926b005cd8c4e3 Jani Nikula 2020-02-11 2184 .release = single_release, 926b005cd8c4e3 Jani Nikula 2020-02-11 2185 .write = i915_dsc_fec_support_write 926b005cd8c4e3 Jani Nikula 2020-02-11 2186 }; 926b005cd8c4e3 Jani Nikula 2020-02-11 2187 670af3cf7a3a36 Bhanuprakash Modem 2020-06-12 2188 static int vrr_range_show(struct seq_file *m, void *data) 670af3cf7a3a36 Bhanuprakash Modem 2020-06-12 2189 { 670af3cf7a3a36 Bhanuprakash Modem 2020-06-12 2190 struct drm_connector *connector = m->private; 670af3cf7a3a36 Bhanuprakash Modem 2020-06-12 2191 670af3cf7a3a36 Bhanuprakash Modem 2020-06-12 2192 if (connector->status != connector_status_connected) 670af3cf7a3a36 Bhanuprakash Modem 2020-06-12 2193 return -ENODEV; 670af3cf7a3a36 Bhanuprakash Modem 2020-06-12 2194 670af3cf7a3a36 Bhanuprakash Modem 2020-06-12 2195 seq_printf(m, "Vrr_capable: %s\n", yesno(intel_dp_is_vrr_capable(connector))); 670af3cf7a3a36 Bhanuprakash Modem 2020-06-12 2196 seq_printf(m, "Min: %u\n", (u8)connector->display_info.monitor_range.min_vfreq); 670af3cf7a3a36 Bhanuprakash Modem 2020-06-12 2197 seq_printf(m, "Max: %u\n", (u8)connector->display_info.monitor_range.max_vfreq); 670af3cf7a3a36 Bhanuprakash Modem 2020-06-12 2198 670af3cf7a3a36 Bhanuprakash Modem 2020-06-12 2199 return 0; 670af3cf7a3a36 Bhanuprakash Modem 2020-06-12 2200 } 670af3cf7a3a36 Bhanuprakash Modem 2020-06-12 2201 DEFINE_SHOW_ATTRIBUTE(vrr_range); 670af3cf7a3a36 Bhanuprakash Modem 2020-06-12 2202 926b005cd8c4e3 Jani Nikula 2020-02-11 2203 /** 926b005cd8c4e3 Jani Nikula 2020-02-11 2204 * intel_connector_debugfs_add - add i915 specific connector debugfs files 926b005cd8c4e3 Jani Nikula 2020-02-11 2205 * @connector: pointer to a registered drm_connector 926b005cd8c4e3 Jani Nikula 2020-02-11 2206 * 926b005cd8c4e3 Jani Nikula 2020-02-11 2207 * Cleanup will be done by drm_connector_unregister() through a call to 926b005cd8c4e3 Jani Nikula 2020-02-11 2208 * drm_debugfs_connector_remove(). 926b005cd8c4e3 Jani Nikula 2020-02-11 2209 * 926b005cd8c4e3 Jani Nikula 2020-02-11 2210 * Returns 0 on success, negative error codes on error. 926b005cd8c4e3 Jani Nikula 2020-02-11 2211 */ 926b005cd8c4e3 Jani Nikula 2020-02-11 2212 int intel_connector_debugfs_add(struct drm_connector *connector) 926b005cd8c4e3 Jani Nikula 2020-02-11 2213 { 926b005cd8c4e3 Jani Nikula 2020-02-11 2214 struct dentry *root = connector->debugfs_entry; 926b005cd8c4e3 Jani Nikula 2020-02-11 2215 struct drm_i915_private *dev_priv = to_i915(connector->dev); 926b005cd8c4e3 Jani Nikula 2020-02-11 2216 926b005cd8c4e3 Jani Nikula 2020-02-11 2217 /* The connector must have been registered beforehands. */ 926b005cd8c4e3 Jani Nikula 2020-02-11 2218 if (!root) 926b005cd8c4e3 Jani Nikula 2020-02-11 2219 return -ENODEV; 926b005cd8c4e3 Jani Nikula 2020-02-11 2220 926b005cd8c4e3 Jani Nikula 2020-02-11 2221 if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) { 926b005cd8c4e3 Jani Nikula 2020-02-11 2222 debugfs_create_file("i915_panel_timings", S_IRUGO, root, 926b005cd8c4e3 Jani Nikula 2020-02-11 2223 connector, &i915_panel_fops); 926b005cd8c4e3 Jani Nikula 2020-02-11 2224 debugfs_create_file("i915_psr_sink_status", S_IRUGO, root, 926b005cd8c4e3 Jani Nikula 2020-02-11 2225 connector, &i915_psr_sink_status_fops); 926b005cd8c4e3 Jani Nikula 2020-02-11 2226 } 926b005cd8c4e3 Jani Nikula 2020-02-11 2227 926b005cd8c4e3 Jani Nikula 2020-02-11 2228 if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort || 926b005cd8c4e3 Jani Nikula 2020-02-11 2229 connector->connector_type == DRM_MODE_CONNECTOR_HDMIA || 926b005cd8c4e3 Jani Nikula 2020-02-11 2230 connector->connector_type == DRM_MODE_CONNECTOR_HDMIB) { 926b005cd8c4e3 Jani Nikula 2020-02-11 2231 debugfs_create_file("i915_hdcp_sink_capability", S_IRUGO, root, 926b005cd8c4e3 Jani Nikula 2020-02-11 2232 connector, &i915_hdcp_sink_capability_fops); 926b005cd8c4e3 Jani Nikula 2020-02-11 2233 } 926b005cd8c4e3 Jani Nikula 2020-02-11 2234 926b005cd8c4e3 Jani Nikula 2020-02-11 @2235 if (INTEL_GEN(dev_priv) >= 10 &&
:::::: The code at line 2235 was first introduced by commit :::::: 926b005cd8c4e325ab918edea0fbdd1d25d1ba28 drm/i915: split out display debugfs to a separate file
:::::: TO: Jani Nikula jani.nikula@intel.com :::::: CC: Jani Nikula jani.nikula@intel.com
--- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
Hi Manasi,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on drm-intel/for-linux-next] [also build test WARNING on drm-tip/drm-tip drm-exynos/exynos-drm-next linus/master next-20200613] [cannot apply to tegra-drm/drm/tegra/for-next drm/drm-next v5.7] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system. BTW, we also suggest to use '--base' option to specify the base tree in git format-patch, please see https://stackoverflow.com/a/37406982]
url: https://github.com/0day-ci/linux/commits/Manasi-Navare/VRR-capable-attach-pr... base: git://anongit.freedesktop.org/drm-intel for-linux-next :::::: branch date: 2 days ago :::::: commit date: 2 days ago compiler: gcc-9 (Debian 9.3.0-13) 9.3.0
If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot lkp@intel.com
cppcheck warnings: (new ones prefixed by >>)
drivers/gpu/drm/i915/display/intel_display_debugfs.c:2258:0: warning: Invalid number of character '{' when no macros are defined. [syntaxError]
^
drivers/gpu/drm/i915/display/intel_display_debugfs.c:2258:0: warning: Invalid number of character '{' when these macros are defined: 'CONFIG_DEBUG_FS'. [syntaxError]
^
drivers/gpu/drm/i915/display/intel_display_debugfs.c:2258:0: warning: Invalid number of character '{' when these macros are defined: 'CONFIG_DRM_FBDEV_EMULATION'. [syntaxError]
^
# https://github.com/0day-ci/linux/commit/670af3cf7a3a36bb87776fbfd7f913cd3368... git remote add linux-review https://github.com/0day-ci/linux git remote update linux-review git checkout 670af3cf7a3a36bb87776fbfd7f913cd33681bbc vim +2258 drivers/gpu/drm/i915/display/intel_display_debugfs.c
670af3cf7a3a36 Bhanuprakash Modem 2020-06-12 2202 926b005cd8c4e3 Jani Nikula 2020-02-11 2203 /** 926b005cd8c4e3 Jani Nikula 2020-02-11 2204 * intel_connector_debugfs_add - add i915 specific connector debugfs files 926b005cd8c4e3 Jani Nikula 2020-02-11 2205 * @connector: pointer to a registered drm_connector 926b005cd8c4e3 Jani Nikula 2020-02-11 2206 * 926b005cd8c4e3 Jani Nikula 2020-02-11 2207 * Cleanup will be done by drm_connector_unregister() through a call to 926b005cd8c4e3 Jani Nikula 2020-02-11 2208 * drm_debugfs_connector_remove(). 926b005cd8c4e3 Jani Nikula 2020-02-11 2209 * 926b005cd8c4e3 Jani Nikula 2020-02-11 2210 * Returns 0 on success, negative error codes on error. 926b005cd8c4e3 Jani Nikula 2020-02-11 2211 */ 926b005cd8c4e3 Jani Nikula 2020-02-11 2212 int intel_connector_debugfs_add(struct drm_connector *connector) 926b005cd8c4e3 Jani Nikula 2020-02-11 2213 { 926b005cd8c4e3 Jani Nikula 2020-02-11 2214 struct dentry *root = connector->debugfs_entry; 926b005cd8c4e3 Jani Nikula 2020-02-11 2215 struct drm_i915_private *dev_priv = to_i915(connector->dev); 926b005cd8c4e3 Jani Nikula 2020-02-11 2216 926b005cd8c4e3 Jani Nikula 2020-02-11 2217 /* The connector must have been registered beforehands. */ 926b005cd8c4e3 Jani Nikula 2020-02-11 2218 if (!root) 926b005cd8c4e3 Jani Nikula 2020-02-11 2219 return -ENODEV; 926b005cd8c4e3 Jani Nikula 2020-02-11 2220 926b005cd8c4e3 Jani Nikula 2020-02-11 2221 if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) { 926b005cd8c4e3 Jani Nikula 2020-02-11 2222 debugfs_create_file("i915_panel_timings", S_IRUGO, root, 926b005cd8c4e3 Jani Nikula 2020-02-11 2223 connector, &i915_panel_fops); 926b005cd8c4e3 Jani Nikula 2020-02-11 2224 debugfs_create_file("i915_psr_sink_status", S_IRUGO, root, 926b005cd8c4e3 Jani Nikula 2020-02-11 2225 connector, &i915_psr_sink_status_fops); 926b005cd8c4e3 Jani Nikula 2020-02-11 2226 } 926b005cd8c4e3 Jani Nikula 2020-02-11 2227 926b005cd8c4e3 Jani Nikula 2020-02-11 2228 if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort || 926b005cd8c4e3 Jani Nikula 2020-02-11 2229 connector->connector_type == DRM_MODE_CONNECTOR_HDMIA || 926b005cd8c4e3 Jani Nikula 2020-02-11 2230 connector->connector_type == DRM_MODE_CONNECTOR_HDMIB) { 926b005cd8c4e3 Jani Nikula 2020-02-11 2231 debugfs_create_file("i915_hdcp_sink_capability", S_IRUGO, root, 926b005cd8c4e3 Jani Nikula 2020-02-11 2232 connector, &i915_hdcp_sink_capability_fops); 926b005cd8c4e3 Jani Nikula 2020-02-11 2233 } 926b005cd8c4e3 Jani Nikula 2020-02-11 2234 926b005cd8c4e3 Jani Nikula 2020-02-11 2235 if (INTEL_GEN(dev_priv) >= 10 && 926b005cd8c4e3 Jani Nikula 2020-02-11 2236 (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort || 926b005cd8c4e3 Jani Nikula 2020-02-11 2237 connector->connector_type == DRM_MODE_CONNECTOR_eDP)) 926b005cd8c4e3 Jani Nikula 2020-02-11 2238 debugfs_create_file("i915_dsc_fec_support", S_IRUGO, root, 926b005cd8c4e3 Jani Nikula 2020-02-11 2239 connector, &i915_dsc_fec_support_fops); 926b005cd8c4e3 Jani Nikula 2020-02-11 2240 670af3cf7a3a36 Bhanuprakash Modem 2020-06-12 2241 if (INTEL_GEN(dev_priv) >= 12) 670af3cf7a3a36 Bhanuprakash Modem 2020-06-12 2242 debugfs_create_file("vrr_range", S_IRUGO, 670af3cf7a3a36 Bhanuprakash Modem 2020-06-12 2243 root, connector, &vrr_range_fops); 670af3cf7a3a36 Bhanuprakash Modem 2020-06-12 2244 } 670af3cf7a3a36 Bhanuprakash Modem 2020-06-12 2245 8806211fe7b306 Anshuman Gupta 2020-04-15 2246 /* Legacy panels doesn't lpsp on any platform */ 8806211fe7b306 Anshuman Gupta 2020-04-15 2247 if ((INTEL_GEN(dev_priv) >= 9 || IS_HASWELL(dev_priv) || 8806211fe7b306 Anshuman Gupta 2020-04-15 2248 IS_BROADWELL(dev_priv)) && 8806211fe7b306 Anshuman Gupta 2020-04-15 2249 (connector->connector_type == DRM_MODE_CONNECTOR_DSI || 8806211fe7b306 Anshuman Gupta 2020-04-15 2250 connector->connector_type == DRM_MODE_CONNECTOR_eDP || 8806211fe7b306 Anshuman Gupta 2020-04-15 2251 connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort || 8806211fe7b306 Anshuman Gupta 2020-04-15 2252 connector->connector_type == DRM_MODE_CONNECTOR_HDMIA || 8806211fe7b306 Anshuman Gupta 2020-04-15 2253 connector->connector_type == DRM_MODE_CONNECTOR_HDMIB)) 8806211fe7b306 Anshuman Gupta 2020-04-15 2254 debugfs_create_file("i915_lpsp_capability", 0444, root, 8806211fe7b306 Anshuman Gupta 2020-04-15 2255 connector, &i915_lpsp_capability_fops); 8806211fe7b306 Anshuman Gupta 2020-04-15 2256 926b005cd8c4e3 Jani Nikula 2020-02-11 2257 return 0; 926b005cd8c4e3 Jani Nikula 2020-02-11 @2258 }
:::::: The code at line 2258 was first introduced by commit :::::: 926b005cd8c4e325ab918edea0fbdd1d25d1ba28 drm/i915: split out display debugfs to a separate file
:::::: TO: Jani Nikula jani.nikula@intel.com :::::: CC: Jani Nikula jani.nikula@intel.com
--- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
This is an initial set of patches for enabling VRR support in i915. This series has patches for: 1. adding a drm dpcd helper to read ignore MSA bit in sink's DPCD indicating sink support for VRR 2. Attach and set VRR capable connector prop for Intel DP conn 3. Expose VRR min and max through debugfs
Aditya Swarup (1): drm/i915/dp: Attach and set drm connector VRR property
Bhanuprakash Modem (1): drm/debug: Expose connector VRR monitor range via debugfs
Manasi Navare (1): drm/dp: DRM DP helper for reading Ignore MSA from DPCD
.../amd/display/amdgpu_dm/amdgpu_dm_debugfs.c | 20 -------------- drivers/gpu/drm/drm_debugfs.c | 22 +++++++++++++++ drivers/gpu/drm/i915/display/intel_dp.c | 27 +++++++++++++++++++ drivers/gpu/drm/i915/display/intel_dp.h | 2 ++ include/drm/drm_dp_helper.h | 8 ++++++ 5 files changed, 59 insertions(+), 20 deletions(-)
From: Manasi Navare manasi.d.navare@intel.com
DP sink device sets the Ignore MSA bit in its DP_DOWNSTREAM_PORT_COUNT register to indicate its ability to ignore the MSA video timing parameters and its ability to support seamless video timing change over a range of timing exposed by DisplayID and EDID. This is required for the sink to indicate that it is Adaptive sync capable.
v3: * Fi the typo in commit message (Manasi) v2: * Rename to describe what the function does (Jani Nikula)
Cc: Jani Nikula jani.nikula@linux.intel.com Cc: Ville Syrjälä ville.syrjala@linux.intel.com Cc: Harry Wentland harry.wentland@amd.com Cc: Nicholas Kazlauskas Nicholas.Kazlauskas@amd.com Signed-off-by: Manasi Navare manasi.d.navare@intel.com Reviewed-by: Harry Wentland harry.wentland@amd.com --- include/drm/drm_dp_helper.h | 8 ++++++++ 1 file changed, 8 insertions(+)
diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h index 1165ec105638..e47dc22ebf50 100644 --- a/include/drm/drm_dp_helper.h +++ b/include/drm/drm_dp_helper.h @@ -1457,6 +1457,14 @@ drm_dp_alternate_scrambler_reset_cap(const u8 dpcd[DP_RECEIVER_CAP_SIZE]) DP_ALTERNATE_SCRAMBLER_RESET_CAP; }
+/* Ignore MSA timing for Adaptive Sync support on DP 1.4 */ +static inline bool +drm_dp_sink_can_do_video_without_timing_msa(const u8 dpcd[DP_RECEIVER_CAP_SIZE]) +{ + return dpcd[DP_DOWN_STREAM_PORT_COUNT] & + DP_MSA_TIMING_PAR_IGNORED; +} + /* * DisplayPort AUX channel */
From: Aditya Swarup aditya.swarup@intel.com
This function sets the VRR property for connector based on the platform support, EDID monitor range and DP sink DPCD capability of outputing video without msa timing information.
v5: * Fix the vrr prop not being set in kernel (Manasi) * Unset the prop on connector disconnect (Manasi) v4: * Rebase (Mansi) v3: * intel_dp_is_vrr_capable can be used for debugfs, make it non static (Manasi) v2: * Just set this in intel_dp_get_modes instead of new hook (Jani)
Cc: Ville Syrjälä ville.syrjala@linux.intel.com Cc: Jani Nikula jani.nikula@linux.intel.com Signed-off-by: Aditya Swarup aditya.swarup@intel.com Signed-off-by: Manasi Navare manasi.d.navare@intel.com --- drivers/gpu/drm/i915/display/intel_dp.c | 27 +++++++++++++++++++++++++ drivers/gpu/drm/i915/display/intel_dp.h | 2 ++ 2 files changed, 29 insertions(+)
diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c index 42589cae766d..d0dba81cfb07 100644 --- a/drivers/gpu/drm/i915/display/intel_dp.c +++ b/drivers/gpu/drm/i915/display/intel_dp.c @@ -6149,6 +6149,9 @@ intel_dp_detect(struct drm_connector *connector, if (status == connector_status_disconnected) { memset(&intel_dp->compliance, 0, sizeof(intel_dp->compliance)); memset(intel_dp->dsc_dpcd, 0, sizeof(intel_dp->dsc_dpcd)); + /*Reset the immutable VRR Capable property */ + drm_connector_set_vrr_capable_property(connector, + false);
if (intel_dp->is_mst) { drm_dbg_kms(&dev_priv->drm, @@ -6256,6 +6259,23 @@ intel_dp_force(struct drm_connector *connector) intel_display_power_put(dev_priv, aux_domain, wakeref); }
+bool intel_dp_is_vrr_capable(struct drm_connector *connector) +{ + struct intel_dp *intel_dp = intel_attached_dp(to_intel_connector(connector)); + const struct drm_display_info *info = &connector->display_info; + struct drm_i915_private *dev_priv = to_i915(connector->dev); + + /* + * DP Sink is capable of Variable refresh video timings if + * Ignore MSA bit is set in DPCD. + * EDID monitor range also should be atleast 10 for reasonable + * Adaptive sync/ VRR end user experience. + */ + return INTEL_GEN(dev_priv) >= 12 && + drm_dp_sink_can_do_video_without_timing_msa(intel_dp->dpcd) && + info->monitor_range.max_vfreq - info->monitor_range.min_vfreq > 10; +} + static int intel_dp_get_modes(struct drm_connector *connector) { struct intel_connector *intel_connector = to_intel_connector(connector); @@ -6264,6 +6284,10 @@ static int intel_dp_get_modes(struct drm_connector *connector) edid = intel_connector->detect_edid; if (edid) { int ret = intel_connector_update_modes(connector, edid); + + if (intel_dp_is_vrr_capable(connector)) + drm_connector_set_vrr_capable_property(connector, + true); if (ret) return ret; } @@ -7325,6 +7349,9 @@ intel_dp_add_properties(struct intel_dp *intel_dp, struct drm_connector *connect connector->state->scaling_mode = DRM_MODE_SCALE_ASPECT;
} + + if (INTEL_GEN(dev_priv) >= 12) + drm_connector_attach_vrr_capable_property(connector); }
static void intel_dp_init_panel_power_timestamps(struct intel_dp *intel_dp) diff --git a/drivers/gpu/drm/i915/display/intel_dp.h b/drivers/gpu/drm/i915/display/intel_dp.h index 0a8950f744f6..db895a3cd93f 100644 --- a/drivers/gpu/drm/i915/display/intel_dp.h +++ b/drivers/gpu/drm/i915/display/intel_dp.h @@ -14,6 +14,7 @@ enum pipe; enum port; struct drm_connector_state; struct drm_encoder; +struct drm_connector; struct drm_i915_private; struct drm_modeset_acquire_ctx; struct drm_dp_vsc_sdp; @@ -120,6 +121,7 @@ void intel_read_dp_sdp(struct intel_encoder *encoder, unsigned int type); bool intel_digital_port_connected(struct intel_encoder *encoder); void intel_dp_process_phy_request(struct intel_dp *intel_dp); +bool intel_dp_is_vrr_capable(struct drm_connector *connector);
static inline unsigned int intel_dp_unused_lane_mask(int lane_count) {
[Why] It's useful to know the min and max vrr range for IGT testing.
[How] Expose the min and max vfreq for the connector via a debugfs file on the connector, "vrr_range".
Example usage: cat /sys/kernel/debug/dri/0/DP-1/vrr_range
v2: * Fix the typo in max_vfreq (Manasi) * Change the name of node to i915_vrr_info so we can add other vrr info for more debug info (Manasi) * Change the VRR capable to display Yes or No (Manasi) * Fix indentation checkpatch errors (Manasi) v3: * Remove the unnecessary debug print (Manasi) v4: * Rebase v5: * Rename to vrr_range to match AMD debugfs v6: * Rebase (manasi) v7: * Fix cmpilation due to rebase v8: * Move debugfs node creation logic to DRM * Remove AMD specific logic
Signed-off-by: Bhanuprakash Modem bhanuprakash.modem@intel.com Signed-off-by: Manasi Navare manasi.d.navare@intel.com Cc: Jani Nikula jani.nikula@linux.intel.com Cc: Ville Syrjälä ville.syrjala@linux.intel.com Cc: Harry Wentland harry.wentland@amd.com --- .../amd/display/amdgpu_dm/amdgpu_dm_debugfs.c | 20 ----------------- drivers/gpu/drm/drm_debugfs.c | 22 +++++++++++++++++++ 2 files changed, 22 insertions(+), 20 deletions(-)
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c index 076af267b488..71387d2af2ed 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c @@ -820,24 +820,6 @@ static int output_bpc_show(struct seq_file *m, void *data) return res; }
-/* - * Returns the min and max vrr vfreq through the connector's debugfs file. - * Example usage: cat /sys/kernel/debug/dri/0/DP-1/vrr_range - */ -static int vrr_range_show(struct seq_file *m, void *data) -{ - struct drm_connector *connector = m->private; - struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector); - - if (connector->status != connector_status_connected) - return -ENODEV; - - seq_printf(m, "Min: %u\n", (unsigned int)aconnector->min_vfreq); - seq_printf(m, "Max: %u\n", (unsigned int)aconnector->max_vfreq); - - return 0; -} - #ifdef CONFIG_DRM_AMD_DC_HDCP /* * Returns the HDCP capability of the Display (1.4 for now). @@ -1001,7 +983,6 @@ static ssize_t dp_dpcd_data_read(struct file *f, char __user *buf, DEFINE_SHOW_ATTRIBUTE(dmub_fw_state); DEFINE_SHOW_ATTRIBUTE(dmub_tracebuffer); DEFINE_SHOW_ATTRIBUTE(output_bpc); -DEFINE_SHOW_ATTRIBUTE(vrr_range); #ifdef CONFIG_DRM_AMD_DC_HDCP DEFINE_SHOW_ATTRIBUTE(hdcp_sink_capability); #endif @@ -1059,7 +1040,6 @@ static const struct { {"phy_settings", &dp_phy_settings_debugfs_fop}, {"test_pattern", &dp_phy_test_pattern_fops}, {"output_bpc", &output_bpc_fops}, - {"vrr_range", &vrr_range_fops}, #ifdef CONFIG_DRM_AMD_DC_HDCP {"hdcp_sink_capability", &hdcp_sink_capability_fops}, #endif diff --git a/drivers/gpu/drm/drm_debugfs.c b/drivers/gpu/drm/drm_debugfs.c index bfe4602f206b..3d7182001004 100644 --- a/drivers/gpu/drm/drm_debugfs.c +++ b/drivers/gpu/drm/drm_debugfs.c @@ -376,6 +376,24 @@ static ssize_t edid_write(struct file *file, const char __user *ubuf, return (ret) ? ret : len; }
+/* + * Returns the min and max vrr vfreq through the connector's debugfs file. + * Example usage: cat /sys/kernel/debug/dri/0/DP-1/vrr_range + */ +static int vrr_range_show(struct seq_file *m, void *data) +{ + struct drm_connector *connector = m->private; + + if (connector->status != connector_status_connected) + return -ENODEV; + + seq_printf(m, "Min: %u\n", (u8)connector->display_info.monitor_range.min_vfreq); + seq_printf(m, "Max: %u\n", (u8)connector->display_info.monitor_range.max_vfreq); + + return 0; +} +DEFINE_SHOW_ATTRIBUTE(vrr_range); + static const struct file_operations drm_edid_fops = { .owner = THIS_MODULE, .open = edid_open, @@ -413,6 +431,10 @@ void drm_debugfs_connector_add(struct drm_connector *connector) /* edid */ debugfs_create_file("edid_override", S_IRUGO | S_IWUSR, root, connector, &drm_edid_fops); + + /* vrr range */ + debugfs_create_file("vrr_range", S_IRUGO, root, connector, + &vrr_range_fops); }
void drm_debugfs_connector_remove(struct drm_connector *connector)
dri-devel@lists.freedesktop.org