Commit e8536806 authored by Jimmy Kizito's avatar Jimmy Kizito Committed by Alex Deucher

drm/amd/display: Read USB4 DP tunneling data from DPCD.

[Why]
We requires information from DPCD in order to identify USB4 DP
tunneling targets.

[How]
Add USB4 DP tunneling fields to DPCD struct and populate these fields
during sink detection.
Reviewed-by: default avatarJun Lei <Jun.Lei@amd.com>
Acked-by: default avatarWayne Lin <Wayne.Lin@amd.com>
Acked-by: default avatarNicholas Kazlauskas <nicholas.kazlauskas@amd.com>
Acked-by: default avatarHarry Wentland <harry.wentland@amd.com>
Signed-off-by: default avatarJimmy Kizito <Jimmy.Kizito@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 71af9d46
...@@ -34,14 +34,40 @@ ...@@ -34,14 +34,40 @@
#include "inc/link_dpcd.h" #include "inc/link_dpcd.h"
#include "dm_helpers.h" #include "dm_helpers.h"
#include "dmub/inc/dmub_cmd.h" #include "dmub/inc/dmub_cmd.h"
#include "inc/link_dpcd.h"
#define DC_LOGGER \ #define DC_LOGGER \
link->ctx->logger link->ctx->logger
enum dc_status dpcd_get_tunneling_device_data(struct dc_link *link) enum dc_status dpcd_get_tunneling_device_data(struct dc_link *link)
{ {
/** @todo Read corresponding DPCD region and update link caps. */ enum dc_status status = DC_OK;
return DC_OK; uint8_t dpcd_dp_tun_data[3] = {0};
uint8_t dpcd_topology_data[DPCD_USB4_TOPOLOGY_ID_LEN] = {0};
uint8_t i = 0;
status = core_link_read_dpcd(link,
DP_TUNNELING_CAPABILITIES_SUPPORT,
dpcd_dp_tun_data,
sizeof(dpcd_dp_tun_data));
status = core_link_read_dpcd(link,
DP_USB4_ROUTER_TOPOLOGY_ID,
dpcd_topology_data,
sizeof(dpcd_topology_data));
link->dpcd_caps.usb4_dp_tun_info.dp_tun_cap.raw =
dpcd_dp_tun_data[DP_TUNNELING_CAPABILITIES_SUPPORT -
DP_TUNNELING_CAPABILITIES_SUPPORT];
link->dpcd_caps.usb4_dp_tun_info.dpia_info.raw =
dpcd_dp_tun_data[DP_IN_ADAPTER_INFO - DP_TUNNELING_CAPABILITIES_SUPPORT];
link->dpcd_caps.usb4_dp_tun_info.usb4_driver_id =
dpcd_dp_tun_data[DP_USB4_DRIVER_ID - DP_TUNNELING_CAPABILITIES_SUPPORT];
for (i = 0; i < DPCD_USB4_TOPOLOGY_ID_LEN; i++)
link->dpcd_caps.usb4_dp_tun_info.usb4_topology_id[i] = dpcd_topology_data[i];
return status;
} }
/* Configure link as prescribed in link_setting; set LTTPR mode; and /* Configure link as prescribed in link_setting; set LTTPR mode; and
......
...@@ -1186,6 +1186,7 @@ struct dpcd_caps { ...@@ -1186,6 +1186,7 @@ struct dpcd_caps {
struct dpcd_dsc_capabilities dsc_caps; struct dpcd_dsc_capabilities dsc_caps;
struct dc_lttpr_caps lttpr_caps; struct dc_lttpr_caps lttpr_caps;
struct psr_caps psr_caps; struct psr_caps psr_caps;
struct dpcd_usb4_dp_tunneling_info usb4_dp_tun_info;
#if defined(CONFIG_DRM_AMD_DC_DCN) #if defined(CONFIG_DRM_AMD_DC_DCN)
union dp_128b_132b_supported_link_rates dp_128b_132b_supported_link_rates; union dp_128b_132b_supported_link_rates dp_128b_132b_supported_link_rates;
......
...@@ -859,6 +859,37 @@ struct psr_caps { ...@@ -859,6 +859,37 @@ struct psr_caps {
bool psr_exit_link_training_required; bool psr_exit_link_training_required;
}; };
/* Length of router topology ID read from DPCD in bytes. */
#define DPCD_USB4_TOPOLOGY_ID_LEN 5
/* DPCD[0xE000D] DP_TUNNELING_CAPABILITIES SUPPORT register. */
union dp_tun_cap_support {
struct {
uint8_t dp_tunneling :1;
uint8_t rsvd :5;
uint8_t panel_replay_tun_opt :1;
uint8_t dpia_bw_alloc :1;
} bits;
uint8_t raw;
};
/* DPCD[0xE000E] DP_IN_ADAPTER_INFO register. */
union dpia_info {
struct {
uint8_t dpia_num :5;
uint8_t rsvd :3;
} bits;
uint8_t raw;
};
/* DP Tunneling over USB4 */
struct dpcd_usb4_dp_tunneling_info {
union dp_tun_cap_support dp_tun_cap;
union dpia_info dpia_info;
uint8_t usb4_driver_id;
uint8_t usb4_topology_id[DPCD_USB4_TOPOLOGY_ID_LEN];
};
#if defined(CONFIG_DRM_AMD_DC_DCN) #if defined(CONFIG_DRM_AMD_DC_DCN)
#ifndef DP_MAIN_LINK_CHANNEL_CODING_CAP #ifndef DP_MAIN_LINK_CHANNEL_CODING_CAP
#define DP_MAIN_LINK_CHANNEL_CODING_CAP 0x006 #define DP_MAIN_LINK_CHANNEL_CODING_CAP 0x006
......
...@@ -35,6 +35,13 @@ struct dc_link_settings; ...@@ -35,6 +35,13 @@ struct dc_link_settings;
/* The approximate time (us) it takes to transmit 9 USB4 DP clock sync packets. */ /* The approximate time (us) it takes to transmit 9 USB4 DP clock sync packets. */
#define DPIA_CLK_SYNC_DELAY 16000 #define DPIA_CLK_SYNC_DELAY 16000
/** @note Can remove once DP tunneling registers in upstream include/drm/drm_dp_helper.h */
/* DPCD DP Tunneling over USB4 */
#define DP_TUNNELING_CAPABILITIES_SUPPORT 0xe000d
#define DP_IN_ADAPTER_INFO 0xe000e
#define DP_USB4_DRIVER_ID 0xe000f
#define DP_USB4_ROUTER_TOPOLOGY_ID 0xe001b
/* SET_CONFIG message types sent by driver. */ /* SET_CONFIG message types sent by driver. */
enum dpia_set_config_type { enum dpia_set_config_type {
DPIA_SET_CFG_SET_LINK = 0x01, DPIA_SET_CFG_SET_LINK = 0x01,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment