Prep work for DP branch device handling
This series of patches reads DPCD register 0x80h for receiver capabilities for DP branch devices. The branch device types are converters for the following standards
- DP to VGA - DP to DVI - DP to HDMI - DP++ dual mode - Wireless WiGig
DPCD register defines max pixel rate for VGA dongles. This check is carried out during mode validation.
What's new in the series: - Readout of branch device ID, HW, and SW revisions from DPCD register
v2: DPCD register read outs moved to drm (Ville, Daniel) v3: Max pixel rate computation moved to drm (Daniel) v4: Use of drm_dp_helper routines to collect data (Ville)
Mika Kahola (11): drm: Add missing DP downstream port types drm: Read DP downstream port capabilities drm: Helper to read DP branch device type drm: Helper to read max clock rate drm: Helper to read max bits per component drm: Read DP branch device id drm: Read DP branch device HW revision drm: Read DP branch device SW revision drm/i915: Check pixel rate for DP to VGA dongle drm/i915: Update bits per component for display info drm/i915: Add DP branch device info on debugfs
drivers/gpu/drm/drm_dp_helper.c | 155 ++++++++++++++++++++++++++++++++++++ drivers/gpu/drm/i915/i915_debugfs.c | 66 +++++++++++++++ drivers/gpu/drm/i915/intel_dp.c | 29 +++++++ include/drm/drm_dp_helper.h | 23 +++++- 4 files changed, 272 insertions(+), 1 deletion(-)
Add missing DisplayPort downstream port types. The introduced new port types are DP++ and Wireless.
Signed-off-by: Mika Kahola mika.kahola@intel.com --- include/drm/drm_dp_helper.h | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h index 5a848e7..e384c7f 100644 --- a/include/drm/drm_dp_helper.h +++ b/include/drm/drm_dp_helper.h @@ -211,6 +211,8 @@ # define DP_DS_PORT_TYPE_DVI 2 # define DP_DS_PORT_TYPE_HDMI 3 # define DP_DS_PORT_TYPE_NON_EDID 4 +# define DP_DS_PORT_TYPE_DP_DUALMODE 5 +# define DP_DS_PORT_TYPE_WIRELESS 6 # define DP_DS_PORT_HPD (1 << 3) /* offset 1 for VGA is maximum megapixels per second / 8 */ /* offset 2 */
Read DisplayPort downstream port capabilities. Depending on the DP port the capabilities are defined in length of 1 byte or 4 bytes depending if the detailed capability information is available.
Signed-off-by: Mika Kahola mika.kahola@intel.com --- drivers/gpu/drm/drm_dp_helper.c | 27 +++++++++++++++++++++++++++ include/drm/drm_dp_helper.h | 3 +++ 2 files changed, 30 insertions(+)
diff --git a/drivers/gpu/drm/drm_dp_helper.c b/drivers/gpu/drm/drm_dp_helper.c index eeaf5a7..c4149fd 100644 --- a/drivers/gpu/drm/drm_dp_helper.c +++ b/drivers/gpu/drm/drm_dp_helper.c @@ -438,6 +438,33 @@ int drm_dp_link_configure(struct drm_dp_aux *aux, struct drm_dp_link *link) } EXPORT_SYMBOL(drm_dp_link_configure);
+/** + * drm_dp_downstream_port_cap() - read downstream port capabilities + * @dpcd: DisplayPort configuration data + * @port_cap: port capabilities + * + * returns size of the port capabilites + */ +int drm_dp_downstream_port_cap(struct drm_dp_aux *aux, + const u8 dpcd[DP_RECEIVER_CAP_SIZE], + u8 port_cap[4]) +{ + int size; + bool detailed_cap_info = dpcd[DP_DOWNSTREAMPORT_PRESENT] & + DP_DETAILED_CAP_INFO_AVAILABLE; + + if (detailed_cap_info) { + size = 4; + drm_dp_dpcd_read(aux, DP_DOWNSTREAM_PORT_0, port_cap, size); + } else { + size = 1; + drm_dp_dpcd_read(aux, DP_DOWNSTREAM_PORT_0, &port_cap[0], size); + } + + return size; +} +EXPORT_SYMBOL(drm_dp_downstream_port_cap); + /* * I2C-over-AUX implementation */ diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h index e384c7f..db8d3d47 100644 --- a/include/drm/drm_dp_helper.h +++ b/include/drm/drm_dp_helper.h @@ -806,6 +806,9 @@ int drm_dp_link_probe(struct drm_dp_aux *aux, struct drm_dp_link *link); int drm_dp_link_power_up(struct drm_dp_aux *aux, struct drm_dp_link *link); int drm_dp_link_power_down(struct drm_dp_aux *aux, struct drm_dp_link *link); int drm_dp_link_configure(struct drm_dp_aux *aux, struct drm_dp_link *link); +int drm_dp_downstream_port_cap(struct drm_dp_aux *aux, + const u8 dpcd[DP_RECEIVER_CAP_SIZE], + u8 port_cap[4]);
int drm_dp_aux_register(struct drm_dp_aux *aux); void drm_dp_aux_unregister(struct drm_dp_aux *aux);
Hi,
[auto build test WARNING on drm/drm-next] [also build test WARNING on v4.7-rc2 next-20160606] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Mika-Kahola/drm-i915-DP-branch-devi... base: git://people.freedesktop.org/~airlied/linux.git drm-next reproduce: make htmldocs
All warnings (new ones prefixed by >>):
drivers/gpu/drm/i915/i915_irq.c:606: warning: No description found for parameter 'dev_priv' drivers/gpu/drm/i915/i915_irq.c:606: warning: Excess function parameter 'dev' description in 'i915_enable_asle_pipestat' drivers/gpu/drm/i915/i915_irq.c:2538: warning: No description found for parameter 'dev_priv' drivers/gpu/drm/i915/i915_irq.c:2538: warning: Excess function parameter 'dev' description in 'i915_reset_and_wakeup' drivers/gpu/drm/i915/i915_irq.c:2700: warning: No description found for parameter 'dev_priv' drivers/gpu/drm/i915/i915_irq.c:2700: warning: No description found for parameter 'fmt' drivers/gpu/drm/i915/i915_irq.c:2700: warning: Excess function parameter 'dev' description in 'i915_handle_error' include/drm/drm_crtc.h:374: warning: No description found for parameter 'mode_blob' include/drm/drm_crtc.h:789: warning: No description found for parameter 'name' include/drm/drm_crtc.h:1248: warning: No description found for parameter 'connector_id' include/drm/drm_crtc.h:1248: warning: No description found for parameter 'tile_blob_ptr' include/drm/drm_crtc.h:1287: warning: No description found for parameter 'rotation' include/drm/drm_crtc.h:1549: warning: No description found for parameter 'name' include/drm/drm_crtc.h:1549: warning: No description found for parameter 'mutex' include/drm/drm_crtc.h:1549: warning: No description found for parameter 'helper_private' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'tile_idr' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'connector_ida' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'delayed_event' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'edid_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'dpms_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'path_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'tile_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'plane_type_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'rotation_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'prop_src_x' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'prop_src_y' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'prop_src_w' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'prop_src_h' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'prop_crtc_x' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'prop_crtc_y' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'prop_crtc_w' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'prop_crtc_h' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'prop_fb_id' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'prop_crtc_id' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'prop_active' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'prop_mode_id' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'dvi_i_subconnector_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'dvi_i_select_subconnector_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'tv_subconnector_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'tv_select_subconnector_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'tv_mode_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'tv_left_margin_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'tv_right_margin_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'tv_top_margin_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'tv_bottom_margin_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'tv_brightness_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'tv_contrast_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'tv_flicker_reduction_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'tv_overscan_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'tv_saturation_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'tv_hue_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'scaling_mode_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'aspect_ratio_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'dirty_info_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'suggested_x_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'suggested_y_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'allow_fb_modifiers' drivers/gpu/drm/drm_atomic_helper.c:1150: warning: No description found for parameter 'nonblock' drivers/gpu/drm/drm_atomic_helper.c:1150: warning: Excess function parameter 'nonblocking' description in 'drm_atomic_helper_commit' drivers/gpu/drm/drm_atomic_helper.c:2946: warning: No description found for parameter 'start' drivers/gpu/drm/drm_atomic_helper.c:1150: warning: No description found for parameter 'nonblock' drivers/gpu/drm/drm_atomic_helper.c:1150: warning: Excess function parameter 'nonblocking' description in 'drm_atomic_helper_commit' drivers/gpu/drm/drm_atomic_helper.c:2946: warning: No description found for parameter 'start' drivers/gpu/drm/drm_atomic_helper.c:1: warning: no structured comments found Was looking for 'implementing async commit'. drivers/gpu/drm/drm_atomic_helper.c:1150: warning: No description found for parameter 'nonblock' drivers/gpu/drm/drm_atomic_helper.c:1150: warning: Excess function parameter 'nonblocking' description in 'drm_atomic_helper_commit' drivers/gpu/drm/drm_atomic_helper.c:2946: warning: No description found for parameter 'start' drivers/gpu/drm/drm_atomic_helper.c:1150: warning: No description found for parameter 'nonblock' drivers/gpu/drm/drm_atomic_helper.c:1150: warning: Excess function parameter 'nonblocking' description in 'drm_atomic_helper_commit' drivers/gpu/drm/drm_atomic_helper.c:2946: warning: No description found for parameter 'start' drivers/gpu/drm/drm_fb_cma_helper.c:173: warning: No description found for parameter 'dev' drivers/gpu/drm/drm_fb_cma_helper.c:173: warning: No description found for parameter 'file_priv' drivers/gpu/drm/drm_fb_cma_helper.c:173: warning: No description found for parameter 'mode_cmd' drivers/gpu/drm/drm_fb_cma_helper.c:173: warning: No description found for parameter 'funcs' drivers/gpu/drm/drm_fb_cma_helper.c:233: warning: No description found for parameter 'dev' drivers/gpu/drm/drm_fb_cma_helper.c:233: warning: No description found for parameter 'file_priv' drivers/gpu/drm/drm_fb_cma_helper.c:233: warning: No description found for parameter 'mode_cmd' drivers/gpu/drm/drm_fb_cma_helper.c:285: warning: No description found for parameter 'm' drivers/gpu/drm/drm_fb_cma_helper.c:285: warning: No description found for parameter 'arg' drivers/gpu/drm/drm_fb_cma_helper.c:173: warning: No description found for parameter 'dev' drivers/gpu/drm/drm_fb_cma_helper.c:173: warning: No description found for parameter 'file_priv' drivers/gpu/drm/drm_fb_cma_helper.c:173: warning: No description found for parameter 'mode_cmd' drivers/gpu/drm/drm_fb_cma_helper.c:173: warning: No description found for parameter 'funcs' drivers/gpu/drm/drm_fb_cma_helper.c:233: warning: No description found for parameter 'dev' drivers/gpu/drm/drm_fb_cma_helper.c:233: warning: No description found for parameter 'file_priv' drivers/gpu/drm/drm_fb_cma_helper.c:233: warning: No description found for parameter 'mode_cmd' drivers/gpu/drm/drm_fb_cma_helper.c:285: warning: No description found for parameter 'm' drivers/gpu/drm/drm_fb_cma_helper.c:285: warning: No description found for parameter 'arg'
drivers/gpu/drm/drm_dp_helper.c:451: warning: No description found for parameter 'aux'
include/drm/drm_dp_helper.h:753: warning: No description found for parameter 'i2c_nack_count' include/drm/drm_dp_helper.h:753: warning: No description found for parameter 'i2c_defer_count'
drivers/gpu/drm/drm_dp_helper.c:451: warning: No description found for parameter 'aux'
drivers/gpu/drm/drm_dp_mst_topology.c:2383: warning: No description found for parameter 'connector' include/drm/drm_dp_mst_helper.h:92: warning: No description found for parameter 'cached_edid' include/drm/drm_dp_mst_helper.h:92: warning: No description found for parameter 'has_audio' include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'max_dpcd_transaction_bytes' include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'sink_count' include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'total_slots' include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'avail_slots' include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'total_pbn' include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'qlock' include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'tx_msg_downq' include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'tx_down_in_progress' include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'payload_lock' include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'proposed_vcpis' include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'payloads' include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'payload_mask' include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'vcpi_mask' include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'tx_waitq' include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'work' include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'tx_work' include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'destroy_connector_list' include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'destroy_connector_lock' include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'destroy_connector_work' drivers/gpu/drm/drm_dp_mst_topology.c:2383: warning: No description found for parameter 'connector' drivers/gpu/drm/drm_irq.c:158: warning: No description found for parameter 'flags' include/drm/drmP.h:169: warning: No description found for parameter 'fmt' include/drm/drmP.h:185: warning: No description found for parameter 'fmt' include/drm/drmP.h:203: warning: No description found for parameter 'fmt' include/drm/drmP.h:248: warning: No description found for parameter 'dev' include/drm/drmP.h:248: warning: No description found for parameter 'data' include/drm/drmP.h:248: warning: No description found for parameter 'file_priv' include/drm/drmP.h:281: warning: No description found for parameter 'ioctl' include/drm/drmP.h:281: warning: No description found for parameter '_func' include/drm/drmP.h:281: warning: No description found for parameter '_flags' include/drm/drmP.h:363: warning: cannot understand function prototype: 'struct drm_lock_data ' include/drm/drmP.h:411: warning: cannot understand function prototype: 'struct drm_driver ' include/drm/drmP.h:677: warning: cannot understand function prototype: 'struct drm_info_list ' include/drm/drmP.h:687: warning: cannot understand function prototype: 'struct drm_info_node ' include/drm/drmP.h:697: warning: cannot understand function prototype: 'struct drm_minor ' include/drm/drmP.h:745: warning: cannot understand function prototype: 'struct drm_device ' drivers/gpu/drm/i915/intel_runtime_pm.c:2416: warning: No description found for parameter 'resume' drivers/gpu/drm/i915/intel_runtime_pm.c:2416: warning: No description found for parameter 'resume' drivers/gpu/drm/i915/i915_irq.c:606: warning: No description found for parameter 'dev_priv' drivers/gpu/drm/i915/i915_irq.c:606: warning: Excess function parameter 'dev' description in 'i915_enable_asle_pipestat' drivers/gpu/drm/i915/i915_irq.c:2538: warning: No description found for parameter 'dev_priv' drivers/gpu/drm/i915/i915_irq.c:2538: warning: Excess function parameter 'dev' description in 'i915_reset_and_wakeup' drivers/gpu/drm/i915/i915_irq.c:2700: warning: No description found for parameter 'dev_priv' drivers/gpu/drm/i915/i915_irq.c:2700: warning: No description found for parameter 'fmt' drivers/gpu/drm/i915/i915_irq.c:2700: warning: Excess function parameter 'dev' description in 'i915_handle_error' drivers/gpu/drm/i915/i915_irq.c:606: warning: No description found for parameter 'dev_priv' drivers/gpu/drm/i915/i915_irq.c:606: warning: Excess function parameter 'dev' description in 'i915_enable_asle_pipestat' drivers/gpu/drm/i915/i915_irq.c:2538: warning: No description found for parameter 'dev_priv' drivers/gpu/drm/i915/i915_irq.c:2538: warning: Excess function parameter 'dev' description in 'i915_reset_and_wakeup' drivers/gpu/drm/i915/i915_irq.c:2700: warning: No description found for parameter 'dev_priv' drivers/gpu/drm/i915/i915_irq.c:2700: warning: No description found for parameter 'fmt' drivers/gpu/drm/i915/i915_irq.c:2700: warning: Excess function parameter 'dev' description in 'i915_handle_error' drivers/gpu/drm/i915/i915_irq.c:606: warning: No description found for parameter 'dev_priv' drivers/gpu/drm/i915/i915_irq.c:606: warning: Excess function parameter 'dev' description in 'i915_enable_asle_pipestat' drivers/gpu/drm/i915/i915_irq.c:2538: warning: No description found for parameter 'dev_priv' drivers/gpu/drm/i915/i915_irq.c:2538: warning: Excess function parameter 'dev' description in 'i915_reset_and_wakeup' drivers/gpu/drm/i915/i915_irq.c:2700: warning: No description found for parameter 'dev_priv' drivers/gpu/drm/i915/i915_irq.c:2700: warning: No description found for parameter 'fmt' drivers/gpu/drm/i915/i915_irq.c:2700: warning: Excess function parameter 'dev' description in 'i915_handle_error' drivers/gpu/drm/i915/i915_irq.c:606: warning: No description found for parameter 'dev_priv' drivers/gpu/drm/i915/i915_irq.c:606: warning: Excess function parameter 'dev' description in 'i915_enable_asle_pipestat' drivers/gpu/drm/i915/i915_irq.c:2538: warning: No description found for parameter 'dev_priv' drivers/gpu/drm/i915/i915_irq.c:2538: warning: Excess function parameter 'dev' description in 'i915_reset_and_wakeup' drivers/gpu/drm/i915/i915_irq.c:2700: warning: No description found for parameter 'dev_priv' drivers/gpu/drm/i915/i915_irq.c:2700: warning: No description found for parameter 'fmt' drivers/gpu/drm/i915/i915_irq.c:2700: warning: Excess function parameter 'dev' description in 'i915_handle_error' drivers/gpu/drm/i915/i915_vgpu.c:62: warning: No description found for parameter 'dev_priv' drivers/gpu/drm/i915/i915_vgpu.c:62: warning: Excess function parameter 'dev' description in 'i915_check_vgpu' drivers/gpu/drm/i915/i915_vgpu.c:181: warning: No description found for parameter 'dev' drivers/gpu/drm/i915/i915_vgpu.c:181: warning: Excess function parameter 'dev_priv' description in 'intel_vgt_balloon' drivers/gpu/drm/i915/i915_vgpu.c:62: warning: No description found for parameter 'dev_priv' drivers/gpu/drm/i915/i915_vgpu.c:62: warning: Excess function parameter 'dev' description in 'i915_check_vgpu' drivers/gpu/drm/i915/i915_vgpu.c:181: warning: No description found for parameter 'dev' drivers/gpu/drm/i915/i915_vgpu.c:181: warning: Excess function parameter 'dev_priv' description in 'intel_vgt_balloon' drivers/gpu/drm/i915/i915_gem.c:416: warning: No description found for parameter 'dev' drivers/gpu/drm/i915/i915_gem.c:416: warning: No description found for parameter 'data' drivers/gpu/drm/i915/i915_gem.c:416: warning: No description found for parameter 'file' drivers/gpu/drm/i915/i915_gem.c:681: warning: No description found for parameter 'dev' drivers/gpu/drm/i915/i915_gem.c:681: warning: No description found for parameter 'data' drivers/gpu/drm/i915/i915_gem.c:681: warning: No description found for parameter 'file' drivers/gpu/drm/i915/i915_gem.c:762: warning: No description found for parameter 'dev' drivers/gpu/drm/i915/i915_gem.c:762: warning: No description found for parameter 'obj' drivers/gpu/drm/i915/i915_gem.c:762: warning: No description found for parameter 'args' drivers/gpu/drm/i915/i915_gem.c:762: warning: No description found for parameter 'file' drivers/gpu/drm/i915/i915_gem.c:1025: warning: No description found for parameter 'dev' drivers/gpu/drm/i915/i915_gem.c:1025: warning: No description found for parameter 'data' drivers/gpu/drm/i915/i915_gem.c:1025: warning: No description found for parameter 'file' drivers/gpu/drm/i915/i915_gem.c:1231: warning: No description found for parameter 'rps' drivers/gpu/drm/i915/i915_gem.c:1452: warning: No description found for parameter 'req' drivers/gpu/drm/i915/i915_gem.c:1479: warning: No description found for parameter 'obj' drivers/gpu/drm/i915/i915_gem.c:1479: warning: No description found for parameter 'readonly' drivers/gpu/drm/i915/i915_gem.c:1596: warning: No description found for parameter 'dev' drivers/gpu/drm/i915/i915_gem.c:1596: warning: No description found for parameter 'data' drivers/gpu/drm/i915/i915_gem.c:1596: warning: No description found for parameter 'file' drivers/gpu/drm/i915/i915_gem.c:1659: warning: No description found for parameter 'dev' drivers/gpu/drm/i915/i915_gem.c:1659: warning: No description found for parameter 'data' drivers/gpu/drm/i915/i915_gem.c:1659: warning: No description found for parameter 'file'
vim +/aux +451 drivers/gpu/drm/drm_dp_helper.c
435 return err; 436 437 return 0; 438 } 439 EXPORT_SYMBOL(drm_dp_link_configure); 440 441 /** 442 * drm_dp_downstream_port_cap() - read downstream port capabilities 443 * @dpcd: DisplayPort configuration data 444 * @port_cap: port capabilities 445 * 446 * returns size of the port capabilites 447 */ 448 int drm_dp_downstream_port_cap(struct drm_dp_aux *aux, 449 const u8 dpcd[DP_RECEIVER_CAP_SIZE], 450 u8 port_cap[4])
451 {
452 int size; 453 bool detailed_cap_info = dpcd[DP_DOWNSTREAMPORT_PRESENT] & 454 DP_DETAILED_CAP_INFO_AVAILABLE; 455 456 if (detailed_cap_info) { 457 size = 4; 458 drm_dp_dpcd_read(aux, DP_DOWNSTREAM_PORT_0, port_cap, size); 459 } else {
--- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation
On Mon, Jun 06, 2016 at 04:29:04PM +0300, Mika Kahola wrote:
Read DisplayPort downstream port capabilities. Depending on the DP port the capabilities are defined in length of 1 byte or 4 bytes depending if the detailed capability information is available.
Signed-off-by: Mika Kahola mika.kahola@intel.com
drivers/gpu/drm/drm_dp_helper.c | 27 +++++++++++++++++++++++++++ include/drm/drm_dp_helper.h | 3 +++ 2 files changed, 30 insertions(+)
diff --git a/drivers/gpu/drm/drm_dp_helper.c b/drivers/gpu/drm/drm_dp_helper.c index eeaf5a7..c4149fd 100644 --- a/drivers/gpu/drm/drm_dp_helper.c +++ b/drivers/gpu/drm/drm_dp_helper.c @@ -438,6 +438,33 @@ int drm_dp_link_configure(struct drm_dp_aux *aux, struct drm_dp_link *link) } EXPORT_SYMBOL(drm_dp_link_configure);
+/**
- drm_dp_downstream_port_cap() - read downstream port capabilities
- @dpcd: DisplayPort configuration data
- @port_cap: port capabilities
- returns size of the port capabilites
- */
+int drm_dp_downstream_port_cap(struct drm_dp_aux *aux,
const u8 dpcd[DP_RECEIVER_CAP_SIZE],
u8 port_cap[4])
+{
- int size;
- bool detailed_cap_info = dpcd[DP_DOWNSTREAMPORT_PRESENT] &
DP_DETAILED_CAP_INFO_AVAILABLE;
- if (detailed_cap_info) {
size = 4;
drm_dp_dpcd_read(aux, DP_DOWNSTREAM_PORT_0, port_cap, size);
- } else {
size = 1;
drm_dp_dpcd_read(aux, DP_DOWNSTREAM_PORT_0, &port_cap[0], size);
- }
Could avoid a bit of duplicatetion. Eg.: if (dpcd[DP_DOWNSTREAMPORT_PRESENT] & DP_DETAILED_CAP_INFO_AVAILABLE) size = 4; else size = 1;
return drm_dp_dpcd_read(...);
Though perhaps we should just read out the entire 4/16 bytes to get the caps for all the ports?
- return size;
+} +EXPORT_SYMBOL(drm_dp_downstream_port_cap);
/*
- I2C-over-AUX implementation
*/ diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h index e384c7f..db8d3d47 100644 --- a/include/drm/drm_dp_helper.h +++ b/include/drm/drm_dp_helper.h @@ -806,6 +806,9 @@ int drm_dp_link_probe(struct drm_dp_aux *aux, struct drm_dp_link *link); int drm_dp_link_power_up(struct drm_dp_aux *aux, struct drm_dp_link *link); int drm_dp_link_power_down(struct drm_dp_aux *aux, struct drm_dp_link *link); int drm_dp_link_configure(struct drm_dp_aux *aux, struct drm_dp_link *link); +int drm_dp_downstream_port_cap(struct drm_dp_aux *aux,
const u8 dpcd[DP_RECEIVER_CAP_SIZE],
u8 port_cap[4]);
int drm_dp_aux_register(struct drm_dp_aux *aux); void drm_dp_aux_unregister(struct drm_dp_aux *aux); -- 1.9.1
Helper routine to read out DisplayPort branch device type. The spec defines these type as following
0 DisplayPort 1 Analog VGA 2 DVI 3 HDMI 4 Others without EDID support 5 DP++ 6 Wireless 7 Reserved
Signed-off-by: Mika Kahola mika.kahola@intel.com --- drivers/gpu/drm/drm_dp_helper.c | 14 ++++++++++++++ include/drm/drm_dp_helper.h | 1 + 2 files changed, 15 insertions(+)
diff --git a/drivers/gpu/drm/drm_dp_helper.c b/drivers/gpu/drm/drm_dp_helper.c index c4149fd..7d3b245 100644 --- a/drivers/gpu/drm/drm_dp_helper.c +++ b/drivers/gpu/drm/drm_dp_helper.c @@ -465,6 +465,20 @@ int drm_dp_downstream_port_cap(struct drm_dp_aux *aux, } EXPORT_SYMBOL(drm_dp_downstream_port_cap);
+/** + * drm_dp_downstream_type() - extract downstream port type + * @dpcd: DisplayPort configuration data + * @port_cap: port capabilities + * + * Returns type in success or negative error code on failure + */ +int drm_dp_downstream_type(const u8 dpcd[DP_RECEIVER_CAP_SIZE], + const u8 port_cap[4]) +{ + return port_cap[0] & DP_DS_PORT_TYPE_MASK; +} +EXPORT_SYMBOL(drm_dp_downstream_type); + /* * I2C-over-AUX implementation */ diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h index db8d3d47..f290829 100644 --- a/include/drm/drm_dp_helper.h +++ b/include/drm/drm_dp_helper.h @@ -809,6 +809,7 @@ int drm_dp_link_configure(struct drm_dp_aux *aux, struct drm_dp_link *link); int drm_dp_downstream_port_cap(struct drm_dp_aux *aux, const u8 dpcd[DP_RECEIVER_CAP_SIZE], u8 port_cap[4]); +int drm_dp_downstream_type(const u8 dpcd[DP_RECEIVER_CAP_SIZE], const u8 port_cap[4]);
int drm_dp_aux_register(struct drm_dp_aux *aux); void drm_dp_aux_unregister(struct drm_dp_aux *aux);
On Mon, Jun 06, 2016 at 04:29:05PM +0300, Mika Kahola wrote:
Helper routine to read out DisplayPort branch device type. The spec defines these type as following
0 DisplayPort 1 Analog VGA 2 DVI 3 HDMI 4 Others without EDID support 5 DP++ 6 Wireless 7 Reserved
Signed-off-by: Mika Kahola mika.kahola@intel.com
drivers/gpu/drm/drm_dp_helper.c | 14 ++++++++++++++ include/drm/drm_dp_helper.h | 1 + 2 files changed, 15 insertions(+)
diff --git a/drivers/gpu/drm/drm_dp_helper.c b/drivers/gpu/drm/drm_dp_helper.c index c4149fd..7d3b245 100644 --- a/drivers/gpu/drm/drm_dp_helper.c +++ b/drivers/gpu/drm/drm_dp_helper.c @@ -465,6 +465,20 @@ int drm_dp_downstream_port_cap(struct drm_dp_aux *aux, } EXPORT_SYMBOL(drm_dp_downstream_port_cap);
+/**
- drm_dp_downstream_type() - extract downstream port type
- @dpcd: DisplayPort configuration data
- @port_cap: port capabilities
- Returns type in success or negative error code on failure
- */
+int drm_dp_downstream_type(const u8 dpcd[DP_RECEIVER_CAP_SIZE],
const u8 port_cap[4])
+{
- return port_cap[0] & DP_DS_PORT_TYPE_MASK;
+} +EXPORT_SYMBOL(drm_dp_downstream_type);
Seems rather pointless to me.
/*
- I2C-over-AUX implementation
*/ diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h index db8d3d47..f290829 100644 --- a/include/drm/drm_dp_helper.h +++ b/include/drm/drm_dp_helper.h @@ -809,6 +809,7 @@ int drm_dp_link_configure(struct drm_dp_aux *aux, struct drm_dp_link *link); int drm_dp_downstream_port_cap(struct drm_dp_aux *aux, const u8 dpcd[DP_RECEIVER_CAP_SIZE], u8 port_cap[4]); +int drm_dp_downstream_type(const u8 dpcd[DP_RECEIVER_CAP_SIZE], const u8 port_cap[4]);
int drm_dp_aux_register(struct drm_dp_aux *aux); void drm_dp_aux_unregister(struct drm_dp_aux *aux); -- 1.9.1
Helper routine to read out maximum supported pixel rate for DisplayPort legay VGA converter or TMDS clock rate for other digital legacy converters. The helper returns clock rate in kHz.
Signed-off-by: Mika Kahola mika.kahola@intel.com --- drivers/gpu/drm/drm_dp_helper.c | 28 ++++++++++++++++++++++++++++ include/drm/drm_dp_helper.h | 2 ++ 2 files changed, 30 insertions(+)
diff --git a/drivers/gpu/drm/drm_dp_helper.c b/drivers/gpu/drm/drm_dp_helper.c index 7d3b245..18b72eb 100644 --- a/drivers/gpu/drm/drm_dp_helper.c +++ b/drivers/gpu/drm/drm_dp_helper.c @@ -479,6 +479,34 @@ int drm_dp_downstream_type(const u8 dpcd[DP_RECEIVER_CAP_SIZE], } EXPORT_SYMBOL(drm_dp_downstream_type);
+/** + * drm_dp_downstream_max_clock() - extract branch device max + * pixel rate for legacy VGA + * converter or max TMDS clock + * rate for others + * @dpcd: DisplayPort configuration data + * @port_cap: port capabilities + * + * Returns max clock in kHz on success or negative error code on failure + */ +int drm_dp_downstream_max_clock(const u8 dpcd[DP_RECEIVER_CAP_SIZE], + const u8 port_cap[4]) +{ + int type = drm_dp_downstream_type(dpcd, port_cap); + bool detailed_cap_info = dpcd[DP_DOWNSTREAMPORT_PRESENT] & + DP_DETAILED_CAP_INFO_AVAILABLE; + + if (detailed_cap_info) { + if (type == DP_DS_PORT_TYPE_VGA) + return port_cap[1] * 8 * 1000; + else if (type != DP_DS_PORT_TYPE_WIRELESS) + return port_cap[1] * 2500; + } + + return -EINVAL; +} +EXPORT_SYMBOL(drm_dp_downstream_max_clock); + /* * I2C-over-AUX implementation */ diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h index f290829..c3324d3 100644 --- a/include/drm/drm_dp_helper.h +++ b/include/drm/drm_dp_helper.h @@ -810,6 +810,8 @@ int drm_dp_downstream_port_cap(struct drm_dp_aux *aux, const u8 dpcd[DP_RECEIVER_CAP_SIZE], u8 port_cap[4]); int drm_dp_downstream_type(const u8 dpcd[DP_RECEIVER_CAP_SIZE], const u8 port_cap[4]); +int drm_dp_downstream_max_clock(const u8 dpcd[DP_RECEIVER_CAP_SIZE], + const u8 port_cap[4]);
int drm_dp_aux_register(struct drm_dp_aux *aux); void drm_dp_aux_unregister(struct drm_dp_aux *aux);
On Mon, Jun 06, 2016 at 04:29:06PM +0300, Mika Kahola wrote:
Helper routine to read out maximum supported pixel rate for DisplayPort legay VGA converter or TMDS clock rate for other digital legacy converters. The helper returns clock rate in kHz.
Signed-off-by: Mika Kahola mika.kahola@intel.com
drivers/gpu/drm/drm_dp_helper.c | 28 ++++++++++++++++++++++++++++ include/drm/drm_dp_helper.h | 2 ++ 2 files changed, 30 insertions(+)
diff --git a/drivers/gpu/drm/drm_dp_helper.c b/drivers/gpu/drm/drm_dp_helper.c index 7d3b245..18b72eb 100644 --- a/drivers/gpu/drm/drm_dp_helper.c +++ b/drivers/gpu/drm/drm_dp_helper.c @@ -479,6 +479,34 @@ int drm_dp_downstream_type(const u8 dpcd[DP_RECEIVER_CAP_SIZE], } EXPORT_SYMBOL(drm_dp_downstream_type);
+/**
- drm_dp_downstream_max_clock() - extract branch device max
pixel rate for legacy VGA
converter or max TMDS clock
rate for others
- @dpcd: DisplayPort configuration data
- @port_cap: port capabilities
- Returns max clock in kHz on success or negative error code on failure
- */
+int drm_dp_downstream_max_clock(const u8 dpcd[DP_RECEIVER_CAP_SIZE],
const u8 port_cap[4])
+{
- int type = drm_dp_downstream_type(dpcd, port_cap);
- bool detailed_cap_info = dpcd[DP_DOWNSTREAMPORT_PRESENT] &
DP_DETAILED_CAP_INFO_AVAILABLE;
- if (detailed_cap_info) {
Could swap this over to an early return and then we don't have to indent the actual meat of the function.
if (type == DP_DS_PORT_TYPE_VGA)
return port_cap[1] * 8 * 1000;
else if (type != DP_DS_PORT_TYPE_WIRELESS)
return port_cap[1] * 2500;
That's not correct. I suggest a switch() and deal with each type explicitly.
- }
- return -EINVAL;
I think I'd return 0 for the "we don't know" case. That way we can use this directly without worrying about negative values.
+} +EXPORT_SYMBOL(drm_dp_downstream_max_clock);
/*
- I2C-over-AUX implementation
*/ diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h index f290829..c3324d3 100644 --- a/include/drm/drm_dp_helper.h +++ b/include/drm/drm_dp_helper.h @@ -810,6 +810,8 @@ int drm_dp_downstream_port_cap(struct drm_dp_aux *aux, const u8 dpcd[DP_RECEIVER_CAP_SIZE], u8 port_cap[4]); int drm_dp_downstream_type(const u8 dpcd[DP_RECEIVER_CAP_SIZE], const u8 port_cap[4]); +int drm_dp_downstream_max_clock(const u8 dpcd[DP_RECEIVER_CAP_SIZE],
const u8 port_cap[4]);
int drm_dp_aux_register(struct drm_dp_aux *aux); void drm_dp_aux_unregister(struct drm_dp_aux *aux); -- 1.9.1
Helper routine to read out maximum supported bits per component for DisplayPort legay converters.
Signed-off-by: Mika Kahola mika.kahola@intel.com --- drivers/gpu/drm/drm_dp_helper.c | 31 +++++++++++++++++++++++++++++++ include/drm/drm_dp_helper.h | 2 ++ 2 files changed, 33 insertions(+)
diff --git a/drivers/gpu/drm/drm_dp_helper.c b/drivers/gpu/drm/drm_dp_helper.c index 18b72eb..bac0ccc 100644 --- a/drivers/gpu/drm/drm_dp_helper.c +++ b/drivers/gpu/drm/drm_dp_helper.c @@ -507,6 +507,37 @@ int drm_dp_downstream_max_clock(const u8 dpcd[DP_RECEIVER_CAP_SIZE], } EXPORT_SYMBOL(drm_dp_downstream_max_clock);
+/** + * drm_dp_downstream_max_bpc() - extract branch device max + * bits per component + * @dpcd: DisplayPort configuration data + * @port_cap: port capabilities + * + * Returns max bpc on success or negative error code on failure + */ +int drm_dp_downstream_max_bpc(const u8 dpcd[DP_RECEIVER_CAP_SIZE], + const u8 port_cap[4]) +{ + int type = drm_dp_downstream_type(dpcd, port_cap); + bool detailed_cap_info = dpcd[DP_DOWNSTREAMPORT_PRESENT] & + DP_DETAILED_CAP_INFO_AVAILABLE; + + if (detailed_cap_info) { + if (type != DP_DS_PORT_TYPE_WIRELESS) { + int tmp; + tmp = port_cap[2] & DP_DS_VGA_MAX_BPC_MASK; + + if (tmp == 0) + return 8; + else + return 8 + (1<<tmp); + } + } + + return -EINVAL; +} +EXPORT_SYMBOL(drm_dp_downstream_max_bpc); + /* * I2C-over-AUX implementation */ diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h index c3324d3..d4abc38 100644 --- a/include/drm/drm_dp_helper.h +++ b/include/drm/drm_dp_helper.h @@ -812,6 +812,8 @@ int drm_dp_downstream_port_cap(struct drm_dp_aux *aux, int drm_dp_downstream_type(const u8 dpcd[DP_RECEIVER_CAP_SIZE], const u8 port_cap[4]); int drm_dp_downstream_max_clock(const u8 dpcd[DP_RECEIVER_CAP_SIZE], const u8 port_cap[4]); +int drm_dp_downstream_max_bpc(const u8 dpcd[DP_RECEIVER_CAP_SIZE], + const u8 port_cap[4]);
int drm_dp_aux_register(struct drm_dp_aux *aux); void drm_dp_aux_unregister(struct drm_dp_aux *aux);
On Mon, Jun 06, 2016 at 04:29:07PM +0300, Mika Kahola wrote:
Helper routine to read out maximum supported bits per component for DisplayPort legay converters.
Signed-off-by: Mika Kahola mika.kahola@intel.com
drivers/gpu/drm/drm_dp_helper.c | 31 +++++++++++++++++++++++++++++++ include/drm/drm_dp_helper.h | 2 ++ 2 files changed, 33 insertions(+)
diff --git a/drivers/gpu/drm/drm_dp_helper.c b/drivers/gpu/drm/drm_dp_helper.c index 18b72eb..bac0ccc 100644 --- a/drivers/gpu/drm/drm_dp_helper.c +++ b/drivers/gpu/drm/drm_dp_helper.c @@ -507,6 +507,37 @@ int drm_dp_downstream_max_clock(const u8 dpcd[DP_RECEIVER_CAP_SIZE], } EXPORT_SYMBOL(drm_dp_downstream_max_clock);
+/**
- drm_dp_downstream_max_bpc() - extract branch device max
bits per component
- @dpcd: DisplayPort configuration data
- @port_cap: port capabilities
- Returns max bpc on success or negative error code on failure
- */
+int drm_dp_downstream_max_bpc(const u8 dpcd[DP_RECEIVER_CAP_SIZE],
const u8 port_cap[4])
+{
- int type = drm_dp_downstream_type(dpcd, port_cap);
- bool detailed_cap_info = dpcd[DP_DOWNSTREAMPORT_PRESENT] &
DP_DETAILED_CAP_INFO_AVAILABLE;
- if (detailed_cap_info) {
Early return again.
if (type != DP_DS_PORT_TYPE_WIRELESS) {
switch() again.
int tmp;
tmp = port_cap[2] & DP_DS_VGA_MAX_BPC_MASK;
Should drop the "VGA" from that stuff since it applies to more than that.
if (tmp == 0)
return 8;
else
return 8 + (1<<tmp);
switch() with each case would be less magicy.
}
- }
- return -EINVAL;
Again I think I'd just use 0 here.
+} +EXPORT_SYMBOL(drm_dp_downstream_max_bpc);
/*
- I2C-over-AUX implementation
*/ diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h index c3324d3..d4abc38 100644 --- a/include/drm/drm_dp_helper.h +++ b/include/drm/drm_dp_helper.h @@ -812,6 +812,8 @@ int drm_dp_downstream_port_cap(struct drm_dp_aux *aux, int drm_dp_downstream_type(const u8 dpcd[DP_RECEIVER_CAP_SIZE], const u8 port_cap[4]); int drm_dp_downstream_max_clock(const u8 dpcd[DP_RECEIVER_CAP_SIZE], const u8 port_cap[4]); +int drm_dp_downstream_max_bpc(const u8 dpcd[DP_RECEIVER_CAP_SIZE],
const u8 port_cap[4]);
int drm_dp_aux_register(struct drm_dp_aux *aux); void drm_dp_aux_unregister(struct drm_dp_aux *aux); -- 1.9.1
On Thu, 2016-06-09 at 11:02 +0300, Ville Syrjälä wrote:
On Mon, Jun 06, 2016 at 04:29:07PM +0300, Mika Kahola wrote:
Helper routine to read out maximum supported bits per component for DisplayPort legay converters.
Signed-off-by: Mika Kahola mika.kahola@intel.com
drivers/gpu/drm/drm_dp_helper.c | 31 +++++++++++++++++++++++++++++++ include/drm/drm_dp_helper.h | 2 ++ 2 files changed, 33 insertions(+)
diff --git a/drivers/gpu/drm/drm_dp_helper.c b/drivers/gpu/drm/drm_dp_helper.c index 18b72eb..bac0ccc 100644 --- a/drivers/gpu/drm/drm_dp_helper.c +++ b/drivers/gpu/drm/drm_dp_helper.c @@ -507,6 +507,37 @@ int drm_dp_downstream_max_clock(const u8 dpcd[DP_RECEIVER_CAP_SIZE], } EXPORT_SYMBOL(drm_dp_downstream_max_clock);
+/**
- drm_dp_downstream_max_bpc() - extract branch device max
bits per component
- @dpcd: DisplayPort configuration data
- @port_cap: port capabilities
- Returns max bpc on success or negative error code on failure
- */
+int drm_dp_downstream_max_bpc(const u8 dpcd[DP_RECEIVER_CAP_SIZE],
const u8 port_cap[4])
+{
- int type = drm_dp_downstream_type(dpcd, port_cap);
- bool detailed_cap_info = dpcd[DP_DOWNSTREAMPORT_PRESENT] &
DP_DETAILED_CAP_INFO_AVAILABLE;
- if (detailed_cap_info) {
Early return again.
if (type != DP_DS_PORT_TYPE_WIRELESS) {
switch() again.
int tmp;
tmp = port_cap[2] & DP_DS_VGA_MAX_BPC_MASK;
Should drop the "VGA" from that stuff since it applies to more than that.
Agreed. Maybe we could rename it as DP_DS_MAX_BPC_MASK instead.
if (tmp == 0)
return 8;
else
return 8 + (1<<tmp);
switch() with each case would be less magicy.
}
- }
- return -EINVAL;
Again I think I'd just use 0 here.
+} +EXPORT_SYMBOL(drm_dp_downstream_max_bpc);
/*
- I2C-over-AUX implementation
*/ diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h index c3324d3..d4abc38 100644 --- a/include/drm/drm_dp_helper.h +++ b/include/drm/drm_dp_helper.h @@ -812,6 +812,8 @@ int drm_dp_downstream_port_cap(struct drm_dp_aux *aux, int drm_dp_downstream_type(const u8 dpcd[DP_RECEIVER_CAP_SIZE], const u8 port_cap[4]); int drm_dp_downstream_max_clock(const u8 dpcd[DP_RECEIVER_CAP_SIZE], const u8 port_cap[4]); +int drm_dp_downstream_max_bpc(const u8 dpcd[DP_RECEIVER_CAP_SIZE],
const u8 port_cap[4]);
int drm_dp_aux_register(struct drm_dp_aux *aux); void drm_dp_aux_unregister(struct drm_dp_aux *aux); -- 1.9.1
Read DisplayPort branch device id string.
Signed-off-by: Mika Kahola mika.kahola@intel.com --- drivers/gpu/drm/drm_dp_helper.c | 12 ++++++++++++ include/drm/drm_dp_helper.h | 2 ++ 2 files changed, 14 insertions(+)
diff --git a/drivers/gpu/drm/drm_dp_helper.c b/drivers/gpu/drm/drm_dp_helper.c index bac0ccc..c25bed9 100644 --- a/drivers/gpu/drm/drm_dp_helper.c +++ b/drivers/gpu/drm/drm_dp_helper.c @@ -538,6 +538,18 @@ int drm_dp_downstream_max_bpc(const u8 dpcd[DP_RECEIVER_CAP_SIZE], } EXPORT_SYMBOL(drm_dp_downstream_max_bpc);
+/** + * drm_dp_downstream_id() - identify branch device + * @aux: DisplayPort AUX channel + * + * Returns branch device id on success or NULL on failure + */ +int drm_dp_downstream_id(struct drm_dp_aux *aux, char id[6]) +{ + return drm_dp_dpcd_read(aux, DP_BRANCH_ID, id, 6); +} +EXPORT_SYMBOL(drm_dp_downstream_id); + /* * I2C-over-AUX implementation */ diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h index d4abc38..37293a8 100644 --- a/include/drm/drm_dp_helper.h +++ b/include/drm/drm_dp_helper.h @@ -445,6 +445,7 @@ #define DP_SOURCE_OUI 0x300 #define DP_SINK_OUI 0x400 #define DP_BRANCH_OUI 0x500 +#define DP_BRANCH_ID 0x503
#define DP_SET_POWER 0x600 # define DP_SET_POWER_D0 0x1 @@ -814,6 +815,7 @@ int drm_dp_downstream_max_clock(const u8 dpcd[DP_RECEIVER_CAP_SIZE], const u8 port_cap[4]); int drm_dp_downstream_max_bpc(const u8 dpcd[DP_RECEIVER_CAP_SIZE], const u8 port_cap[4]); +int drm_dp_downstream_id(struct drm_dp_aux *aux, char id[6]);
int drm_dp_aux_register(struct drm_dp_aux *aux); void drm_dp_aux_unregister(struct drm_dp_aux *aux);
Hi,
[auto build test WARNING on drm/drm-next] [also build test WARNING on v4.7-rc2 next-20160606] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Mika-Kahola/drm-i915-DP-branch-devi... base: git://people.freedesktop.org/~airlied/linux.git drm-next reproduce: make htmldocs
All warnings (new ones prefixed by >>):
drivers/gpu/drm/i915/i915_irq.c:606: warning: No description found for parameter 'dev_priv' drivers/gpu/drm/i915/i915_irq.c:606: warning: Excess function parameter 'dev' description in 'i915_enable_asle_pipestat' drivers/gpu/drm/i915/i915_irq.c:2538: warning: No description found for parameter 'dev_priv' drivers/gpu/drm/i915/i915_irq.c:2538: warning: Excess function parameter 'dev' description in 'i915_reset_and_wakeup' drivers/gpu/drm/i915/i915_irq.c:2700: warning: No description found for parameter 'dev_priv' drivers/gpu/drm/i915/i915_irq.c:2700: warning: No description found for parameter 'fmt' drivers/gpu/drm/i915/i915_irq.c:2700: warning: Excess function parameter 'dev' description in 'i915_handle_error' include/drm/drm_crtc.h:374: warning: No description found for parameter 'mode_blob' include/drm/drm_crtc.h:789: warning: No description found for parameter 'name' include/drm/drm_crtc.h:1248: warning: No description found for parameter 'connector_id' include/drm/drm_crtc.h:1248: warning: No description found for parameter 'tile_blob_ptr' include/drm/drm_crtc.h:1287: warning: No description found for parameter 'rotation' include/drm/drm_crtc.h:1549: warning: No description found for parameter 'name' include/drm/drm_crtc.h:1549: warning: No description found for parameter 'mutex' include/drm/drm_crtc.h:1549: warning: No description found for parameter 'helper_private' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'tile_idr' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'connector_ida' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'delayed_event' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'edid_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'dpms_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'path_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'tile_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'plane_type_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'rotation_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'prop_src_x' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'prop_src_y' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'prop_src_w' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'prop_src_h' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'prop_crtc_x' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'prop_crtc_y' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'prop_crtc_w' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'prop_crtc_h' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'prop_fb_id' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'prop_crtc_id' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'prop_active' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'prop_mode_id' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'dvi_i_subconnector_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'dvi_i_select_subconnector_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'tv_subconnector_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'tv_select_subconnector_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'tv_mode_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'tv_left_margin_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'tv_right_margin_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'tv_top_margin_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'tv_bottom_margin_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'tv_brightness_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'tv_contrast_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'tv_flicker_reduction_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'tv_overscan_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'tv_saturation_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'tv_hue_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'scaling_mode_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'aspect_ratio_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'dirty_info_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'suggested_x_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'suggested_y_property' include/drm/drm_crtc.h:2185: warning: No description found for parameter 'allow_fb_modifiers' drivers/gpu/drm/drm_atomic_helper.c:1150: warning: No description found for parameter 'nonblock' drivers/gpu/drm/drm_atomic_helper.c:1150: warning: Excess function parameter 'nonblocking' description in 'drm_atomic_helper_commit' drivers/gpu/drm/drm_atomic_helper.c:2946: warning: No description found for parameter 'start' drivers/gpu/drm/drm_atomic_helper.c:1150: warning: No description found for parameter 'nonblock' drivers/gpu/drm/drm_atomic_helper.c:1150: warning: Excess function parameter 'nonblocking' description in 'drm_atomic_helper_commit' drivers/gpu/drm/drm_atomic_helper.c:2946: warning: No description found for parameter 'start' drivers/gpu/drm/drm_atomic_helper.c:1: warning: no structured comments found Was looking for 'implementing async commit'. drivers/gpu/drm/drm_atomic_helper.c:1150: warning: No description found for parameter 'nonblock' drivers/gpu/drm/drm_atomic_helper.c:1150: warning: Excess function parameter 'nonblocking' description in 'drm_atomic_helper_commit' drivers/gpu/drm/drm_atomic_helper.c:2946: warning: No description found for parameter 'start' drivers/gpu/drm/drm_atomic_helper.c:1150: warning: No description found for parameter 'nonblock' drivers/gpu/drm/drm_atomic_helper.c:1150: warning: Excess function parameter 'nonblocking' description in 'drm_atomic_helper_commit' drivers/gpu/drm/drm_atomic_helper.c:2946: warning: No description found for parameter 'start' drivers/gpu/drm/drm_fb_cma_helper.c:173: warning: No description found for parameter 'dev' drivers/gpu/drm/drm_fb_cma_helper.c:173: warning: No description found for parameter 'file_priv' drivers/gpu/drm/drm_fb_cma_helper.c:173: warning: No description found for parameter 'mode_cmd' drivers/gpu/drm/drm_fb_cma_helper.c:173: warning: No description found for parameter 'funcs' drivers/gpu/drm/drm_fb_cma_helper.c:233: warning: No description found for parameter 'dev' drivers/gpu/drm/drm_fb_cma_helper.c:233: warning: No description found for parameter 'file_priv' drivers/gpu/drm/drm_fb_cma_helper.c:233: warning: No description found for parameter 'mode_cmd' drivers/gpu/drm/drm_fb_cma_helper.c:285: warning: No description found for parameter 'm' drivers/gpu/drm/drm_fb_cma_helper.c:285: warning: No description found for parameter 'arg' drivers/gpu/drm/drm_fb_cma_helper.c:173: warning: No description found for parameter 'dev' drivers/gpu/drm/drm_fb_cma_helper.c:173: warning: No description found for parameter 'file_priv' drivers/gpu/drm/drm_fb_cma_helper.c:173: warning: No description found for parameter 'mode_cmd' drivers/gpu/drm/drm_fb_cma_helper.c:173: warning: No description found for parameter 'funcs' drivers/gpu/drm/drm_fb_cma_helper.c:233: warning: No description found for parameter 'dev' drivers/gpu/drm/drm_fb_cma_helper.c:233: warning: No description found for parameter 'file_priv' drivers/gpu/drm/drm_fb_cma_helper.c:233: warning: No description found for parameter 'mode_cmd' drivers/gpu/drm/drm_fb_cma_helper.c:285: warning: No description found for parameter 'm' drivers/gpu/drm/drm_fb_cma_helper.c:285: warning: No description found for parameter 'arg' drivers/gpu/drm/drm_dp_helper.c:451: warning: No description found for parameter 'aux'
drivers/gpu/drm/drm_dp_helper.c:548: warning: No description found for parameter 'id[6]'
include/drm/drm_dp_helper.h:754: warning: No description found for parameter 'i2c_nack_count' include/drm/drm_dp_helper.h:754: warning: No description found for parameter 'i2c_defer_count' drivers/gpu/drm/drm_dp_helper.c:451: warning: No description found for parameter 'aux'
drivers/gpu/drm/drm_dp_helper.c:548: warning: No description found for parameter 'id[6]'
drivers/gpu/drm/drm_dp_mst_topology.c:2383: warning: No description found for parameter 'connector' include/drm/drm_dp_mst_helper.h:92: warning: No description found for parameter 'cached_edid' include/drm/drm_dp_mst_helper.h:92: warning: No description found for parameter 'has_audio' include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'max_dpcd_transaction_bytes' include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'sink_count' include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'total_slots' include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'avail_slots' include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'total_pbn' include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'qlock' include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'tx_msg_downq' include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'tx_down_in_progress' include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'payload_lock' include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'proposed_vcpis' include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'payloads' include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'payload_mask' include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'vcpi_mask' include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'tx_waitq' include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'work' include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'tx_work' include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'destroy_connector_list' include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'destroy_connector_lock' include/drm/drm_dp_mst_helper.h:466: warning: No description found for parameter 'destroy_connector_work' drivers/gpu/drm/drm_dp_mst_topology.c:2383: warning: No description found for parameter 'connector' drivers/gpu/drm/drm_irq.c:158: warning: No description found for parameter 'flags' include/drm/drmP.h:169: warning: No description found for parameter 'fmt' include/drm/drmP.h:185: warning: No description found for parameter 'fmt' include/drm/drmP.h:203: warning: No description found for parameter 'fmt' include/drm/drmP.h:248: warning: No description found for parameter 'dev' include/drm/drmP.h:248: warning: No description found for parameter 'data' include/drm/drmP.h:248: warning: No description found for parameter 'file_priv' include/drm/drmP.h:281: warning: No description found for parameter 'ioctl' include/drm/drmP.h:281: warning: No description found for parameter '_func' include/drm/drmP.h:281: warning: No description found for parameter '_flags' include/drm/drmP.h:363: warning: cannot understand function prototype: 'struct drm_lock_data ' include/drm/drmP.h:411: warning: cannot understand function prototype: 'struct drm_driver ' include/drm/drmP.h:677: warning: cannot understand function prototype: 'struct drm_info_list ' include/drm/drmP.h:687: warning: cannot understand function prototype: 'struct drm_info_node ' include/drm/drmP.h:697: warning: cannot understand function prototype: 'struct drm_minor ' include/drm/drmP.h:745: warning: cannot understand function prototype: 'struct drm_device ' drivers/gpu/drm/i915/intel_runtime_pm.c:2416: warning: No description found for parameter 'resume' drivers/gpu/drm/i915/intel_runtime_pm.c:2416: warning: No description found for parameter 'resume' drivers/gpu/drm/i915/i915_irq.c:606: warning: No description found for parameter 'dev_priv' drivers/gpu/drm/i915/i915_irq.c:606: warning: Excess function parameter 'dev' description in 'i915_enable_asle_pipestat' drivers/gpu/drm/i915/i915_irq.c:2538: warning: No description found for parameter 'dev_priv' drivers/gpu/drm/i915/i915_irq.c:2538: warning: Excess function parameter 'dev' description in 'i915_reset_and_wakeup' drivers/gpu/drm/i915/i915_irq.c:2700: warning: No description found for parameter 'dev_priv' drivers/gpu/drm/i915/i915_irq.c:2700: warning: No description found for parameter 'fmt' drivers/gpu/drm/i915/i915_irq.c:2700: warning: Excess function parameter 'dev' description in 'i915_handle_error' drivers/gpu/drm/i915/i915_irq.c:606: warning: No description found for parameter 'dev_priv' drivers/gpu/drm/i915/i915_irq.c:606: warning: Excess function parameter 'dev' description in 'i915_enable_asle_pipestat' drivers/gpu/drm/i915/i915_irq.c:2538: warning: No description found for parameter 'dev_priv' drivers/gpu/drm/i915/i915_irq.c:2538: warning: Excess function parameter 'dev' description in 'i915_reset_and_wakeup' drivers/gpu/drm/i915/i915_irq.c:2700: warning: No description found for parameter 'dev_priv' drivers/gpu/drm/i915/i915_irq.c:2700: warning: No description found for parameter 'fmt' drivers/gpu/drm/i915/i915_irq.c:2700: warning: Excess function parameter 'dev' description in 'i915_handle_error' drivers/gpu/drm/i915/i915_irq.c:606: warning: No description found for parameter 'dev_priv' drivers/gpu/drm/i915/i915_irq.c:606: warning: Excess function parameter 'dev' description in 'i915_enable_asle_pipestat' drivers/gpu/drm/i915/i915_irq.c:2538: warning: No description found for parameter 'dev_priv' drivers/gpu/drm/i915/i915_irq.c:2538: warning: Excess function parameter 'dev' description in 'i915_reset_and_wakeup' drivers/gpu/drm/i915/i915_irq.c:2700: warning: No description found for parameter 'dev_priv' drivers/gpu/drm/i915/i915_irq.c:2700: warning: No description found for parameter 'fmt' drivers/gpu/drm/i915/i915_irq.c:2700: warning: Excess function parameter 'dev' description in 'i915_handle_error' drivers/gpu/drm/i915/i915_irq.c:606: warning: No description found for parameter 'dev_priv' drivers/gpu/drm/i915/i915_irq.c:606: warning: Excess function parameter 'dev' description in 'i915_enable_asle_pipestat' drivers/gpu/drm/i915/i915_irq.c:2538: warning: No description found for parameter 'dev_priv' drivers/gpu/drm/i915/i915_irq.c:2538: warning: Excess function parameter 'dev' description in 'i915_reset_and_wakeup' drivers/gpu/drm/i915/i915_irq.c:2700: warning: No description found for parameter 'dev_priv' drivers/gpu/drm/i915/i915_irq.c:2700: warning: No description found for parameter 'fmt' drivers/gpu/drm/i915/i915_irq.c:2700: warning: Excess function parameter 'dev' description in 'i915_handle_error' drivers/gpu/drm/i915/i915_vgpu.c:62: warning: No description found for parameter 'dev_priv' drivers/gpu/drm/i915/i915_vgpu.c:62: warning: Excess function parameter 'dev' description in 'i915_check_vgpu' drivers/gpu/drm/i915/i915_vgpu.c:181: warning: No description found for parameter 'dev' drivers/gpu/drm/i915/i915_vgpu.c:181: warning: Excess function parameter 'dev_priv' description in 'intel_vgt_balloon' drivers/gpu/drm/i915/i915_vgpu.c:62: warning: No description found for parameter 'dev_priv' drivers/gpu/drm/i915/i915_vgpu.c:62: warning: Excess function parameter 'dev' description in 'i915_check_vgpu' drivers/gpu/drm/i915/i915_vgpu.c:181: warning: No description found for parameter 'dev' drivers/gpu/drm/i915/i915_vgpu.c:181: warning: Excess function parameter 'dev_priv' description in 'intel_vgt_balloon' drivers/gpu/drm/i915/i915_gem.c:416: warning: No description found for parameter 'dev' drivers/gpu/drm/i915/i915_gem.c:416: warning: No description found for parameter 'data' drivers/gpu/drm/i915/i915_gem.c:416: warning: No description found for parameter 'file' drivers/gpu/drm/i915/i915_gem.c:681: warning: No description found for parameter 'dev' drivers/gpu/drm/i915/i915_gem.c:681: warning: No description found for parameter 'data' drivers/gpu/drm/i915/i915_gem.c:681: warning: No description found for parameter 'file' drivers/gpu/drm/i915/i915_gem.c:762: warning: No description found for parameter 'dev' drivers/gpu/drm/i915/i915_gem.c:762: warning: No description found for parameter 'obj' drivers/gpu/drm/i915/i915_gem.c:762: warning: No description found for parameter 'args' drivers/gpu/drm/i915/i915_gem.c:762: warning: No description found for parameter 'file' drivers/gpu/drm/i915/i915_gem.c:1025: warning: No description found for parameter 'dev' drivers/gpu/drm/i915/i915_gem.c:1025: warning: No description found for parameter 'data' drivers/gpu/drm/i915/i915_gem.c:1025: warning: No description found for parameter 'file' drivers/gpu/drm/i915/i915_gem.c:1231: warning: No description found for parameter 'rps' drivers/gpu/drm/i915/i915_gem.c:1452: warning: No description found for parameter 'req' drivers/gpu/drm/i915/i915_gem.c:1479: warning: No description found for parameter 'obj' drivers/gpu/drm/i915/i915_gem.c:1479: warning: No description found for parameter 'readonly' drivers/gpu/drm/i915/i915_gem.c:1596: warning: No description found for parameter 'dev' drivers/gpu/drm/i915/i915_gem.c:1596: warning: No description found for parameter 'data' drivers/gpu/drm/i915/i915_gem.c:1596: warning: No description found for parameter 'file' drivers/gpu/drm/i915/i915_gem.c:1659: warning: No description found for parameter 'dev' drivers/gpu/drm/i915/i915_gem.c:1659: warning: No description found for parameter 'data' drivers/gpu/drm/i915/i915_gem.c:1659: warning: No description found for parameter 'file'
vim +548 drivers/gpu/drm/drm_dp_helper.c
445 * 446 * returns size of the port capabilites 447 */ 448 int drm_dp_downstream_port_cap(struct drm_dp_aux *aux, 449 const u8 dpcd[DP_RECEIVER_CAP_SIZE], 450 u8 port_cap[4])
451 {
452 int size; 453 bool detailed_cap_info = dpcd[DP_DOWNSTREAMPORT_PRESENT] & 454 DP_DETAILED_CAP_INFO_AVAILABLE; 455 456 if (detailed_cap_info) { 457 size = 4; 458 drm_dp_dpcd_read(aux, DP_DOWNSTREAM_PORT_0, port_cap, size); 459 } else { 460 size = 1; 461 drm_dp_dpcd_read(aux, DP_DOWNSTREAM_PORT_0, &port_cap[0], size); 462 } 463 464 return size; 465 } 466 EXPORT_SYMBOL(drm_dp_downstream_port_cap); 467 468 /** 469 * drm_dp_downstream_type() - extract downstream port type 470 * @dpcd: DisplayPort configuration data 471 * @port_cap: port capabilities 472 * 473 * Returns type in success or negative error code on failure 474 */ 475 int drm_dp_downstream_type(const u8 dpcd[DP_RECEIVER_CAP_SIZE], 476 const u8 port_cap[4]) 477 { 478 return port_cap[0] & DP_DS_PORT_TYPE_MASK; 479 } 480 EXPORT_SYMBOL(drm_dp_downstream_type); 481 482 /** 483 * drm_dp_downstream_max_clock() - extract branch device max 484 * pixel rate for legacy VGA 485 * converter or max TMDS clock 486 * rate for others 487 * @dpcd: DisplayPort configuration data 488 * @port_cap: port capabilities 489 * 490 * Returns max clock in kHz on success or negative error code on failure 491 */ 492 int drm_dp_downstream_max_clock(const u8 dpcd[DP_RECEIVER_CAP_SIZE], 493 const u8 port_cap[4]) 494 { 495 int type = drm_dp_downstream_type(dpcd, port_cap); 496 bool detailed_cap_info = dpcd[DP_DOWNSTREAMPORT_PRESENT] & 497 DP_DETAILED_CAP_INFO_AVAILABLE; 498 499 if (detailed_cap_info) { 500 if (type == DP_DS_PORT_TYPE_VGA) 501 return port_cap[1] * 8 * 1000; 502 else if (type != DP_DS_PORT_TYPE_WIRELESS) 503 return port_cap[1] * 2500; 504 } 505 506 return -EINVAL; 507 } 508 EXPORT_SYMBOL(drm_dp_downstream_max_clock); 509 510 /** 511 * drm_dp_downstream_max_bpc() - extract branch device max 512 * bits per component 513 * @dpcd: DisplayPort configuration data 514 * @port_cap: port capabilities 515 * 516 * Returns max bpc on success or negative error code on failure 517 */ 518 int drm_dp_downstream_max_bpc(const u8 dpcd[DP_RECEIVER_CAP_SIZE], 519 const u8 port_cap[4]) 520 { 521 int type = drm_dp_downstream_type(dpcd, port_cap); 522 bool detailed_cap_info = dpcd[DP_DOWNSTREAMPORT_PRESENT] & 523 DP_DETAILED_CAP_INFO_AVAILABLE; 524 525 if (detailed_cap_info) { 526 if (type != DP_DS_PORT_TYPE_WIRELESS) { 527 int tmp; 528 tmp = port_cap[2] & DP_DS_VGA_MAX_BPC_MASK; 529 530 if (tmp == 0) 531 return 8; 532 else 533 return 8 + (1<<tmp); 534 } 535 } 536 537 return -EINVAL; 538 } 539 EXPORT_SYMBOL(drm_dp_downstream_max_bpc); 540 541 /** 542 * drm_dp_downstream_id() - identify branch device 543 * @aux: DisplayPort AUX channel 544 * 545 * Returns branch device id on success or NULL on failure 546 */ 547 int drm_dp_downstream_id(struct drm_dp_aux *aux, char id[6])
548 {
549 return drm_dp_dpcd_read(aux, DP_BRANCH_ID, id, 6); 550 } 551 EXPORT_SYMBOL(drm_dp_downstream_id);
--- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation
HW revision is mandatory field for DisplayPort branch devices. This is defined in DPCD register field 0x509.
Signed-off-by: Mika Kahola mika.kahola@intel.com --- drivers/gpu/drm/drm_dp_helper.c | 21 +++++++++++++++++++++ include/drm/drm_dp_helper.h | 7 +++++++ 2 files changed, 28 insertions(+)
diff --git a/drivers/gpu/drm/drm_dp_helper.c b/drivers/gpu/drm/drm_dp_helper.c index c25bed9..6dd9ff5 100644 --- a/drivers/gpu/drm/drm_dp_helper.c +++ b/drivers/gpu/drm/drm_dp_helper.c @@ -550,6 +550,27 @@ int drm_dp_downstream_id(struct drm_dp_aux *aux, char id[6]) } EXPORT_SYMBOL(drm_dp_downstream_id);
+/** + * drm_dp_downstream_hw_rev() - read DP branch device HW revision + * @aux: DisplayPort AUX channel + * + * Returns HW revision on succes or negative error code on failure + */ +struct drm_dp_revision drm_dp_downstream_hw_rev(struct drm_dp_aux *aux) +{ + uint8_t tmp; + struct drm_dp_revision rev = { .major = -EINVAL, .minor = -EINVAL }; + + if (drm_dp_dpcd_read(aux, DP_BRANCH_HW_REV, &tmp, 1) != 1) + return rev; + + rev.major = (tmp & 0xf0) >> 4; + rev.minor = tmp & 0xf; + + return rev; +} +EXPORT_SYMBOL(drm_dp_downstream_hw_rev); + /* * I2C-over-AUX implementation */ diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h index 37293a8..08a10b3 100644 --- a/include/drm/drm_dp_helper.h +++ b/include/drm/drm_dp_helper.h @@ -446,6 +446,7 @@ #define DP_SINK_OUI 0x400 #define DP_BRANCH_OUI 0x500 #define DP_BRANCH_ID 0x503 +#define DP_BRANCH_HW_REV 0x509
#define DP_SET_POWER 0x600 # define DP_SET_POWER_D0 0x1 @@ -803,6 +804,11 @@ struct drm_dp_link { unsigned long capabilities; };
+struct drm_dp_revision { + int major; + int minor; +}; + int drm_dp_link_probe(struct drm_dp_aux *aux, struct drm_dp_link *link); int drm_dp_link_power_up(struct drm_dp_aux *aux, struct drm_dp_link *link); int drm_dp_link_power_down(struct drm_dp_aux *aux, struct drm_dp_link *link); @@ -816,6 +822,7 @@ int drm_dp_downstream_max_clock(const u8 dpcd[DP_RECEIVER_CAP_SIZE], int drm_dp_downstream_max_bpc(const u8 dpcd[DP_RECEIVER_CAP_SIZE], const u8 port_cap[4]); int drm_dp_downstream_id(struct drm_dp_aux *aux, char id[6]); +struct drm_dp_revision drm_dp_downstream_hw_rev(struct drm_dp_aux *aux);
int drm_dp_aux_register(struct drm_dp_aux *aux); void drm_dp_aux_unregister(struct drm_dp_aux *aux);
SW revision is mandatory field for DisplayPort branch devices. This is defined in DPCD register field 0x50A.
Signed-off-by: Mika Kahola mika.kahola@intel.com --- drivers/gpu/drm/drm_dp_helper.c | 22 ++++++++++++++++++++++ include/drm/drm_dp_helper.h | 4 +++- 2 files changed, 25 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/drm_dp_helper.c b/drivers/gpu/drm/drm_dp_helper.c index 6dd9ff5..89b3b24 100644 --- a/drivers/gpu/drm/drm_dp_helper.c +++ b/drivers/gpu/drm/drm_dp_helper.c @@ -571,6 +571,28 @@ struct drm_dp_revision drm_dp_downstream_hw_rev(struct drm_dp_aux *aux) } EXPORT_SYMBOL(drm_dp_downstream_hw_rev);
+/** + * drm_dp_downstream_sw_rev() - read DP branch device SW revision + * @aux: DisplayPort AUX channel + * + * Returns SW revision on success or negative error code on failure + */ +struct drm_dp_revision drm_dp_downstream_sw_rev(struct drm_dp_aux *aux) +{ + uint8_t tmp[2]; + struct drm_dp_revision rev = { .major = -EINVAL, .minor = -EINVAL }; + + if (drm_dp_dpcd_read(aux, DP_BRANCH_SW_REV, tmp, 2) != 2) + return rev; + + rev.major = tmp[0]; + rev.minor = tmp[1]; + + return rev; + +} +EXPORT_SYMBOL(drm_dp_downstream_sw_rev); + /* * I2C-over-AUX implementation */ diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h index 08a10b3..1848320 100644 --- a/include/drm/drm_dp_helper.h +++ b/include/drm/drm_dp_helper.h @@ -447,6 +447,7 @@ #define DP_BRANCH_OUI 0x500 #define DP_BRANCH_ID 0x503 #define DP_BRANCH_HW_REV 0x509 +#define DP_BRANCH_SW_REV 0x50A
#define DP_SET_POWER 0x600 # define DP_SET_POWER_D0 0x1 @@ -823,7 +824,8 @@ int drm_dp_downstream_max_bpc(const u8 dpcd[DP_RECEIVER_CAP_SIZE], const u8 port_cap[4]); int drm_dp_downstream_id(struct drm_dp_aux *aux, char id[6]); struct drm_dp_revision drm_dp_downstream_hw_rev(struct drm_dp_aux *aux); - +struct drm_dp_revision drm_dp_downstream_sw_rev(struct drm_dp_aux *aux); + int drm_dp_aux_register(struct drm_dp_aux *aux); void drm_dp_aux_unregister(struct drm_dp_aux *aux);
Filter out a mode that exceeds the max pixel rate setting for DP to VGA dongle. This is defined in DPCD register 0x81 if detailed cap info i.e. info field is 4 bytes long and it is available for DP downstream port.
The register defines the pixel rate divided by 8 in MP/s.
v2: DPCD read outs and computation moved to drm (Ville, Daniel) v3: Sink pixel rate computation moved to drm_dp_max_sink_dotclock() function (Daniel) v4: Use of drm_dp_helper.c routines to compute max pixel clock (Ville)
Signed-off-by: Mika Kahola mika.kahola@intel.com --- drivers/gpu/drm/i915/intel_dp.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 096acbf0..1b94347 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c @@ -200,6 +200,23 @@ intel_dp_mode_valid(struct drm_connector *connector, int target_clock = mode->clock; int max_rate, mode_rate, max_lanes, max_link_clock; int max_dotclk = to_i915(connector->dev)->max_dotclk_freq; + bool is_branch_device; + int max_dp_clk; + int type; + uint8_t port_cap[4]; + + is_branch_device = intel_dp->dpcd[DP_DOWNSTREAMPORT_PRESENT] & + DP_DWN_STRM_PORT_PRESENT; + + if (is_branch_device) { + drm_dp_downstream_port_cap(&intel_dp->aux, intel_dp->dpcd, port_cap); + type = drm_dp_downstream_type(intel_dp->dpcd, port_cap); + max_dp_clk = drm_dp_downstream_max_clock(intel_dp->dpcd, port_cap); + + if ((type == DP_DS_PORT_TYPE_VGA) && (max_dp_clk > 0)) { + max_dotclk = min(max_dotclk, max_dp_clk); + } + }
if (is_edp(intel_dp) && fixed_mode) { if (mode->hdisplay > fixed_mode->hdisplay)
On Mon, Jun 06, 2016 at 04:29:11PM +0300, Mika Kahola wrote:
Filter out a mode that exceeds the max pixel rate setting for DP to VGA dongle. This is defined in DPCD register 0x81 if detailed cap info i.e. info field is 4 bytes long and it is available for DP downstream port.
The register defines the pixel rate divided by 8 in MP/s.
v2: DPCD read outs and computation moved to drm (Ville, Daniel) v3: Sink pixel rate computation moved to drm_dp_max_sink_dotclock() function (Daniel) v4: Use of drm_dp_helper.c routines to compute max pixel clock (Ville)
Signed-off-by: Mika Kahola mika.kahola@intel.com
drivers/gpu/drm/i915/intel_dp.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 096acbf0..1b94347 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c @@ -200,6 +200,23 @@ intel_dp_mode_valid(struct drm_connector *connector, int target_clock = mode->clock; int max_rate, mode_rate, max_lanes, max_link_clock; int max_dotclk = to_i915(connector->dev)->max_dotclk_freq;
- bool is_branch_device;
- int max_dp_clk;
- int type;
- uint8_t port_cap[4];
- is_branch_device = intel_dp->dpcd[DP_DOWNSTREAMPORT_PRESENT] &
DP_DWN_STRM_PORT_PRESENT;
- if (is_branch_device) {
drm_dp_downstream_port_cap(&intel_dp->aux, intel_dp->dpcd, port_cap);
I'm pretty sure we already read out the downstream port caps in fact. Hmm, yeah ->downstream_ports. So no need for this, and I suppose no need for your helper for the readout either. Just always readoing out the full 16 bytes should be fine.
type = drm_dp_downstream_type(intel_dp->dpcd, port_cap);
max_dp_clk = drm_dp_downstream_max_clock(intel_dp->dpcd, port_cap);
if ((type == DP_DS_PORT_TYPE_VGA) && (max_dp_clk > 0)) {
Type check can be skipped if drm_dp_downstream_max_clock() just returns 0 for the "don't know" case.
max_dotclk = min(max_dotclk, max_dp_clk);
}
}
if (is_edp(intel_dp) && fixed_mode) { if (mode->hdisplay > fixed_mode->hdisplay)
-- 1.9.1
-----Original Message----- From: Ville Syrjälä [mailto:ville.syrjala@linux.intel.com] Sent: Thursday, June 9, 2016 11:14 AM To: Kahola, Mika mika.kahola@intel.com Cc: dri-devel@lists.freedesktop.org; intel-gfx@lists.freedesktop.org; jim.bride@linux.intel.com; daniel.vetter@ffwll.ch Subject: Re: [PATCH v4 09/11] drm/i915: Check pixel rate for DP to VGA dongle
On Mon, Jun 06, 2016 at 04:29:11PM +0300, Mika Kahola wrote:
Filter out a mode that exceeds the max pixel rate setting for DP to VGA dongle. This is defined in DPCD register 0x81 if detailed cap info i.e. info field is 4 bytes long and it is available for DP downstream port.
The register defines the pixel rate divided by 8 in MP/s.
v2: DPCD read outs and computation moved to drm (Ville, Daniel) v3: Sink pixel rate computation moved to drm_dp_max_sink_dotclock() function (Daniel) v4: Use of drm_dp_helper.c routines to compute max pixel clock (Ville)
Signed-off-by: Mika Kahola mika.kahola@intel.com
drivers/gpu/drm/i915/intel_dp.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 096acbf0..1b94347 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c @@ -200,6 +200,23 @@ intel_dp_mode_valid(struct drm_connector
*connector,
int target_clock = mode->clock; int max_rate, mode_rate, max_lanes, max_link_clock; int max_dotclk = to_i915(connector->dev)->max_dotclk_freq;
- bool is_branch_device;
- int max_dp_clk;
- int type;
- uint8_t port_cap[4];
- is_branch_device = intel_dp-
dpcd[DP_DOWNSTREAMPORT_PRESENT] &
DP_DWN_STRM_PORT_PRESENT;
- if (is_branch_device) {
drm_dp_downstream_port_cap(&intel_dp->aux, intel_dp-
dpcd, +port_cap);
I'm pretty sure we already read out the downstream port caps in fact. Hmm, yeah ->downstream_ports. So no need for this, and I suppose no need for your helper for the readout either. Just always readoing out the full 16 bytes should be fine.
Right, I missed that one. We do read port caps with ->downstream_ports. I'll skip the helper routines regarding reading out port cap info.
type = drm_dp_downstream_type(intel_dp->dpcd,
port_cap);
max_dp_clk = drm_dp_downstream_max_clock(intel_dp-
dpcd, port_cap);
if ((type == DP_DS_PORT_TYPE_VGA) && (max_dp_clk > 0))
{
Type check can be skipped if drm_dp_downstream_max_clock() just returns 0 for the "don't know" case.
max_dotclk = min(max_dotclk, max_dp_clk);
}
}
if (is_edp(intel_dp) && fixed_mode) { if (mode->hdisplay > fixed_mode->hdisplay)
-- 1.9.1
-- Ville Syrjälä Intel OTC
DisplayPort branch device may define max supported bits per component. Update display info based on this value if bpc is defined.
Signed-off-by: Mika Kahola mika.kahola@intel.com --- drivers/gpu/drm/i915/intel_dp.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 1b94347..ad3ff37 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c @@ -3932,6 +3932,17 @@ intel_dp_detect_dpcd(struct intel_dp *intel_dp) { uint8_t *dpcd = intel_dp->dpcd; uint8_t type; + uint8_t cap[4]; + + if (dpcd[DP_DOWNSTREAMPORT_PRESENT] & DP_DWN_STRM_PORT_PRESENT) { + int bpc; + + drm_dp_downstream_port_cap(&intel_dp->aux, dpcd, cap); + bpc = drm_dp_downstream_max_bpc(dpcd, cap); + + if (bpc > 0) + intel_dp->attached_connector->base.display_info.bpc = bpc; + }
if (!intel_dp_get_dpcd(intel_dp)) return connector_status_disconnected; @@ -3969,6 +3980,7 @@ intel_dp_detect_dpcd(struct intel_dp *intel_dp) return connector_status_unknown; }
+ /* Anything else is out of spec, warn and ignore */ DRM_DEBUG_KMS("Broken DP branch device, ignoring\n"); return connector_status_disconnected;
Read DisplayPort branch device info from through debugfs interface.
v2: use drm_dp_helper routines to collect data
Signed-off-by: Mika Kahola mika.kahola@intel.com --- drivers/gpu/drm/i915/i915_debugfs.c | 66 +++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+)
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index ac7e569..fabfa55 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c @@ -2942,9 +2942,75 @@ static void intel_dp_info(struct seq_file *m, { struct intel_encoder *intel_encoder = intel_connector->encoder; struct intel_dp *intel_dp = enc_to_intel_dp(&intel_encoder->base); + struct drm_dp_revision rev; + bool is_branch_device; + int type; + int clk; + int bpc; + int cap_size; + uint8_t cap[4]; + char id[6];
seq_printf(m, "\tDPCD rev: %x\n", intel_dp->dpcd[DP_DPCD_REV]); seq_printf(m, "\taudio support: %s\n", yesno(intel_dp->has_audio)); + + is_branch_device = intel_dp->dpcd[DP_DOWNSTREAMPORT_PRESENT] & + DP_DWN_STRM_PORT_PRESENT; + seq_printf(m, "\tbranch device: %s\n", yesno(is_branch_device)); + + if (is_branch_device) { + cap_size = drm_dp_downstream_port_cap(&intel_dp->aux, + intel_dp->dpcd, cap); + + type = drm_dp_downstream_type(intel_dp->dpcd, cap); + + switch (type) { + case DP_DS_PORT_TYPE_DP: + seq_printf(m, "\ttype: DisplayPort\n"); + break; + case DP_DS_PORT_TYPE_VGA: + seq_printf(m, "\ttype: VGA\n"); + break; + case DP_DS_PORT_TYPE_DVI: + seq_printf(m, "\ttype: DVI\n"); + break; + case DP_DS_PORT_TYPE_HDMI: + seq_printf(m, "\ttype: HDMI\n"); + break; + case DP_DS_PORT_TYPE_NON_EDID: + seq_printf(m, "\ttype: others without EDID support\n"); + break; + case DP_DS_PORT_TYPE_DP_DUALMODE: + seq_printf(m, "\ttype: DP++\n"); + break; + case DP_DS_PORT_TYPE_WIRELESS: + seq_printf(m, "\ttype: Wireless\n"); + break; + default: + seq_printf(m, "\ttype: N/A\n"); + } + + drm_dp_downstream_id(&intel_dp->aux, id); + seq_printf(m, "\tDevice id: %s\n", id); + + rev = drm_dp_downstream_hw_rev(&intel_dp->aux); + seq_printf(m, "\tHW revision: %.2d.%.2d\n", rev.major, rev.minor); + + rev = drm_dp_downstream_sw_rev(&intel_dp->aux); + seq_printf(m, "\tSW revision: %.2d.%.2d\n", rev.major, rev.minor); + + if (cap_size == 4) { + clk = drm_dp_downstream_max_clock(intel_dp->dpcd, cap); + if (type == DP_DS_PORT_TYPE_VGA) + seq_printf(m, "\tMax dot clock: %d kHz\n", clk); + else + seq_printf(m, "\tMax TMDS clock: %d kHz\n", clk); + + bpc = drm_dp_downstream_max_bpc(intel_dp->dpcd, cap); + seq_printf(m, "\tMax bpc: %d\n", bpc); + } + } + if (intel_encoder->type == INTEL_OUTPUT_EDP) intel_panel_info(m, &intel_connector->panel); }
dri-devel@lists.freedesktop.org