aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/files/0983-drm-amd-dal-Implement-connectivity-log-output.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/files/0983-drm-amd-dal-Implement-connectivity-log-output.patch')
-rw-r--r--common/recipes-kernel/linux/files/0983-drm-amd-dal-Implement-connectivity-log-output.patch459
1 files changed, 459 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0983-drm-amd-dal-Implement-connectivity-log-output.patch b/common/recipes-kernel/linux/files/0983-drm-amd-dal-Implement-connectivity-log-output.patch
new file mode 100644
index 00000000..0edfde37
--- /dev/null
+++ b/common/recipes-kernel/linux/files/0983-drm-amd-dal-Implement-connectivity-log-output.patch
@@ -0,0 +1,459 @@
+From 4f6313afbf2678adc26831f856b68bbf6dfc3546 Mon Sep 17 00:00:00 2001
+From: Yongqiang Sun <yongqiang.sun@amd.com>
+Date: Wed, 16 Mar 2016 11:11:52 -0400
+Subject: [PATCH 0983/1110] drm/amd/dal: Implement connectivity log output.
+
+message format:
+[time stamp] [drm] [Major_minor] [connector name] message......
+eg:
+[ 26.590965] [drm] [Conn_LKTN] [DP-1] HBRx4 pass VS=0, PE=0^
+[ 26.881060] [drm] [Conn_Mode] [DP-1] {2560x1080, 2784x1111@185580Khz}^
+
+Signed-off-by: Yongqiang Sun <yongqiang.sun@amd.com>
+Acked-by: Harry Wentland <harry.wentland@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ .../gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_helpers.c | 51 ++++++++++++++++++
+ drivers/gpu/drm/amd/dal/dc/basics/logger.c | 11 +++-
+ drivers/gpu/drm/amd/dal/dc/basics/logger.h | 6 ++-
+ drivers/gpu/drm/amd/dal/dc/core/dc.c | 10 ++++
+ drivers/gpu/drm/amd/dal/dc/core/dc_link.c | 6 +++
+ drivers/gpu/drm/amd/dal/dc/core/dc_link_ddc.c | 61 +++++++++++-----------
+ drivers/gpu/drm/amd/dal/dc/core/dc_link_dp.c | 35 ++++++++-----
+ drivers/gpu/drm/amd/dal/dc/dm_helpers.h | 39 ++++++++++++++
+ drivers/gpu/drm/amd/dal/include/logger_types.h | 13 +++++
+ 9 files changed, 186 insertions(+), 46 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_helpers.c b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_helpers.c
+index 8688ca2..c6d6267 100644
+--- a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_helpers.c
++++ b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_helpers.c
+@@ -42,6 +42,12 @@
+
+ #include "dm_helpers.h"
+
++/* Maximum line char number for connectivity log,
++ * in case of output EDID, needs at least 256x3 bytes plus some other
++ * message, so set line size to 896.
++ */
++#define CONN_MAX_LINE_SIZE 896
++
+ /* dm_helpers_parse_edid_caps
+ *
+ * Parse edid caps
+@@ -513,3 +519,48 @@ bool dm_helpers_submit_i2c(
+ return result;
+ }
+
++void dm_helper_conn_log(struct dc_context *ctx,
++ const struct dc_link *link,
++ uint8_t *hex_data,
++ int hex_data_count,
++ enum conn_event event,
++ const char *msg,
++ ...)
++{
++ struct amdgpu_device *adev = ctx->driver_context;
++ struct drm_device *dev = adev->ddev;
++ struct amdgpu_connector *aconnector = get_connector_for_link(dev, link);
++ char buffer[CONN_MAX_LINE_SIZE] = { 0 };
++ va_list args;
++ int size;
++ enum log_minor minor = event;
++
++ va_start(args, msg);
++
++ sprintf(buffer, "[%s] ", aconnector->base.name);
++
++ size = strlen(buffer);
++
++ size += dm_log_to_buffer(
++ &buffer[size], CONN_MAX_LINE_SIZE, msg, args);
++
++ if (buffer[strlen(buffer) - 1] == '\n') {
++ buffer[strlen(buffer) - 1] = '\0';
++ size--;
++ }
++
++ if (hex_data) {
++ int i;
++
++ for (i = 0; i < hex_data_count; i++)
++ sprintf(&buffer[size + i * 3], "%2.2X ", hex_data[i]);
++ }
++
++ strcat(buffer, "^\n");
++
++ dal_logger_write(ctx->logger,
++ LOG_MAJOR_CONNECTIVITY,
++ minor,
++ buffer);
++ va_end(args);
++}
+diff --git a/drivers/gpu/drm/amd/dal/dc/basics/logger.c b/drivers/gpu/drm/amd/dal/dc/basics/logger.c
+index f637c3f..93d4185 100644
+--- a/drivers/gpu/drm/amd/dal/dc/basics/logger.c
++++ b/drivers/gpu/drm/amd/dal/dc/basics/logger.c
+@@ -207,6 +207,14 @@ static const struct log_minor_info ds_minor_info_tbl[] = {
+ {LOG_MINOR_DS_MODE_SETTING, "Mode_Setting"},
+ };
+
++static const struct log_minor_info connectivity_minor_info_tbl[] = {
++ {LOG_MINOR_CONNECTIVITY_MODE_SET, "Mode"},
++ {LOG_MINOR_CONNECTIVITY_DETECTION, "Detect"},
++ {LOG_MINOR_CONNECTIVITY_LINK_TRAINING, "LKTN"},
++ {LOG_MINOR_CONNECTIVITY_LINK_LOSS, "LinkLoss"},
++ {LOG_MINOR_CONNECTIVITY_UNDERFLOW, "Underflow"},
++};
++
+ struct log_major_mask_info {
+ struct log_major_info major_info;
+ uint32_t default_mask;
+@@ -270,6 +278,7 @@ static const struct log_major_mask_info log_major_mask_info_tbl[] = {
+ {{LOG_MAJOR_DISPLAY_SERVICE, "DS" }, LG_ALL_MSK, ds_minor_info_tbl, NUM_ELEMENTS(ds_minor_info_tbl)},
+ {{LOG_MAJOR_FEATURE_OVERRIDE, "FeatureOverride" }, LG_ALL_MSK, override_feature_minor_info_tbl, NUM_ELEMENTS(override_feature_minor_info_tbl)},
+ {{LOG_MAJOR_DETECTION, "Detection" }, LG_ALL_MSK, detection_minor_info_tbl, NUM_ELEMENTS(detection_minor_info_tbl)},
++ {{LOG_MAJOR_CONNECTIVITY, "Conn" }, LG_ALL_MSK, connectivity_minor_info_tbl, NUM_ELEMENTS(connectivity_minor_info_tbl)},
+ };
+
+ /* ----------- Object init and destruction ----------- */
+@@ -511,7 +520,7 @@ static void log_to_internal_buffer(struct log_entry *entry)
+
+ static void log_timestamp(struct log_entry *entry)
+ {
+- dal_logger_append(entry, "00:00:00 ");
++/* dal_logger_append(entry, "00:00:00 ");*/
+ }
+
+ static void log_major_minor(struct log_entry *entry)
+diff --git a/drivers/gpu/drm/amd/dal/dc/basics/logger.h b/drivers/gpu/drm/amd/dal/dc/basics/logger.h
+index c2aea53..12d8ae6 100644
+--- a/drivers/gpu/drm/amd/dal/dc/basics/logger.h
++++ b/drivers/gpu/drm/amd/dal/dc/basics/logger.h
+@@ -29,7 +29,11 @@
+ /* Structure for keeping track of offsets, buffer, etc */
+
+ #define DAL_LOGGER_BUFFER_MAX_SIZE 2048
+-#define DAL_LOGGER_BUFFER_MAX_LOG_LINE_SIZE 256
++
++/*Connectivity log needs to output EDID, which needs at lease 256x3 bytes,
++ * change log line size to 896 to meet the request.
++ */
++#define DAL_LOGGER_BUFFER_MAX_LOG_LINE_SIZE 896
+
+ #include "include/logger_types.h"
+
+diff --git a/drivers/gpu/drm/amd/dal/dc/core/dc.c b/drivers/gpu/drm/amd/dal/dc/core/dc.c
+index f3a59aa..da50d25 100644
+--- a/drivers/gpu/drm/amd/dal/dc/core/dc.c
++++ b/drivers/gpu/drm/amd/dal/dc/core/dc.c
+@@ -46,6 +46,7 @@
+ #include "link_encoder.h"
+
+ #include "dc_link_ddc.h"
++#include "dm_helpers.h"
+
+ /*******************************************************************************
+ * Private structures
+@@ -747,8 +748,17 @@ bool dc_commit_targets(
+
+ for (i = 0; i < context->target_count; i++) {
+ struct dc_target *dc_target = &context->targets[i]->public;
++ struct core_sink *sink = DC_SINK_TO_CORE(dc_target->streams[0]->sink);
++
+ if (context->target_status[i].surface_count > 0)
+ target_enable_memory_requests(dc_target, &core_dc->current_context.res_ctx);
++
++ CONN_MSG_MODE(sink->link, "{%dx%d, %dx%d@%dKhz}",
++ dc_target->streams[0]->timing.h_addressable,
++ dc_target->streams[0]->timing.v_addressable,
++ dc_target->streams[0]->timing.h_total,
++ dc_target->streams[0]->timing.v_total,
++ dc_target->streams[0]->timing.pix_clk_khz);
+ }
+
+ program_timing_sync(core_dc, context);
+diff --git a/drivers/gpu/drm/amd/dal/dc/core/dc_link.c b/drivers/gpu/drm/amd/dal/dc/core/dc_link.c
+index 97d6f93..06c8fa6 100644
+--- a/drivers/gpu/drm/amd/dal/dc/core/dc_link.c
++++ b/drivers/gpu/drm/amd/dal/dc/core/dc_link.c
+@@ -679,6 +679,12 @@ bool dc_link_detect(const struct dc_link *dc_link, bool boot)
+ break;
+ }
+
++ /* Connectivity log: detection */
++ CONN_DATA_DETECT(link, sink->public.dc_edid.raw_edid,
++ sink->public.dc_edid.length,
++ "%s: ",
++ sink->public.edid_caps.display_name);
++
+ dal_logger_write(link->ctx->logger,
+ LOG_MAJOR_DETECTION,
+ LOG_MINOR_DETECTION_EDID_PARSER,
+diff --git a/drivers/gpu/drm/amd/dal/dc/core/dc_link_ddc.c b/drivers/gpu/drm/amd/dal/dc/core/dc_link_ddc.c
+index 698a34e..c38e60e 100644
+--- a/drivers/gpu/drm/amd/dal/dc/core/dc_link_ddc.c
++++ b/drivers/gpu/drm/amd/dal/dc/core/dc_link_ddc.c
+@@ -768,12 +768,12 @@ void dal_ddc_service_i2c_query_dp_dual_mode_adaptor(
+ DP_HDMI_DONGLE_ADDRESS,
+ type2_dongle_buf,
+ sizeof(type2_dongle_buf))) {
+- dal_logger_write(ddc->ctx->logger,
+- LOG_MAJOR_DCS,
+- LOG_MINOR_DCS_DONGLE_DETECTION,
+- "Detected DP-DVI dongle.\n");
+ *dongle = DISPLAY_DONGLE_DP_DVI_DONGLE;
+ sink_cap->max_hdmi_pixel_clock = DP_ADAPTOR_DVI_MAX_TMDS_CLK;
++
++ CONN_DATA_DETECT(ddc->link, type2_dongle_buf, sizeof(type2_dongle_buf),
++ "DP-DVI passive dongle %dMhz: ",
++ DP_ADAPTOR_DVI_MAX_TMDS_CLK / 1000);
+ return;
+ }
+
+@@ -815,29 +815,28 @@ void dal_ddc_service_i2c_query_dp_dual_mode_adaptor(
+ if (0 == max_tmds_clk ||
+ max_tmds_clk < DP_ADAPTOR_TYPE2_MIN_TMDS_CLK ||
+ max_tmds_clk > DP_ADAPTOR_TYPE2_MAX_TMDS_CLK) {
+- dal_logger_write(ddc->ctx->logger,
+- LOG_MAJOR_DCS,
+- LOG_MINOR_DCS_DONGLE_DETECTION,
+- "Invalid Maximum TMDS clock");
+ *dongle = DISPLAY_DONGLE_DP_DVI_DONGLE;
++
++ CONN_DATA_DETECT(ddc->link, type2_dongle_buf,
++ sizeof(type2_dongle_buf),
++ "DP-DVI passive dongle %dMhz: ",
++ DP_ADAPTOR_DVI_MAX_TMDS_CLK / 1000);
+ } else {
+ if (is_valid_hdmi_signature == true) {
+ *dongle = DISPLAY_DONGLE_DP_HDMI_DONGLE;
+- dal_logger_write(ddc->ctx->logger,
+- LOG_MAJOR_DCS,
+- LOG_MINOR_DCS_DONGLE_DETECTION,
+- "Detected Type 2 DP-HDMI Maximum TMDS "
+- "clock, max TMDS clock: %d MHz",
+- max_tmds_clk);
++
++ CONN_DATA_DETECT(ddc->link, type2_dongle_buf,
++ sizeof(type2_dongle_buf),
++ "Type 2 DP-HDMI passive dongle %dMhz: ",
++ max_tmds_clk);
+ } else {
+ *dongle = DISPLAY_DONGLE_DP_HDMI_MISMATCHED_DONGLE;
+- dal_logger_write(ddc->ctx->logger,
+- LOG_MAJOR_DCS,
+- LOG_MINOR_DCS_DONGLE_DETECTION,
+- "Detected Type 2 DP-HDMI (no valid HDMI"
+- " signature) Maximum TMDS clock, max "
+- "TMDS clock: %d MHz",
+- max_tmds_clk);
++
++ CONN_DATA_DETECT(ddc->link, type2_dongle_buf,
++ sizeof(type2_dongle_buf),
++ "Type 2 DP-HDMI passive dongle (no signature) %dMhz: ",
++ max_tmds_clk);
++
+ }
+
+ /* Multiply by 1000 to convert to kHz. */
+@@ -847,19 +846,19 @@ void dal_ddc_service_i2c_query_dp_dual_mode_adaptor(
+
+ } else {
+ if (is_valid_hdmi_signature == true) {
+- dal_logger_write(ddc->ctx->logger,
+- LOG_MAJOR_DCS,
+- LOG_MINOR_DCS_DONGLE_DETECTION,
+- "Detected Type 1 DP-HDMI dongle.\n");
+ *dongle = DISPLAY_DONGLE_DP_HDMI_DONGLE;
+- } else {
+- dal_logger_write(ddc->ctx->logger,
+- LOG_MAJOR_DCS,
+- LOG_MINOR_DCS_DONGLE_DETECTION,
+- "Detected Type 1 DP-HDMI dongle (no valid HDMI "
+- "signature).\n");
+
++ CONN_DATA_DETECT(ddc->link, type2_dongle_buf,
++ sizeof(type2_dongle_buf),
++ "Type 1 DP-HDMI passive dongle %dMhz: ",
++ sink_cap->max_hdmi_pixel_clock / 1000);
++ } else {
+ *dongle = DISPLAY_DONGLE_DP_HDMI_MISMATCHED_DONGLE;
++
++ CONN_DATA_DETECT(ddc->link, type2_dongle_buf,
++ sizeof(type2_dongle_buf),
++ "Type 1 DP-HDMI passive dongle (no signature) %dMhz: ",
++ sink_cap->max_hdmi_pixel_clock / 1000);
+ }
+ }
+
+diff --git a/drivers/gpu/drm/amd/dal/dc/core/dc_link_dp.c b/drivers/gpu/drm/amd/dal/dc/core/dc_link_dp.c
+index 8fe0314..c83a754 100644
+--- a/drivers/gpu/drm/amd/dal/dc/core/dc_link_dp.c
++++ b/drivers/gpu/drm/amd/dal/dc/core/dc_link_dp.c
+@@ -1009,33 +1009,31 @@ bool perform_link_training(
+ switch (lt_settings.link_settings.link_rate) {
+
+ case LINK_RATE_LOW:
+- link_rate = "Low";
++ link_rate = "RBR";
+ break;
+ case LINK_RATE_HIGH:
+- link_rate = "High";
++ link_rate = "HBR";
+ break;
+ case LINK_RATE_HIGH2:
+- link_rate = "High2";
++ link_rate = "HBR2";
+ break;
+ case LINK_RATE_RBR2:
+ link_rate = "RBR2";
+ break;
+ case LINK_RATE_HIGH3:
+- link_rate = "High3";
++ link_rate = "HBR3";
+ break;
+ default:
+ break;
+ }
+
+- dal_logger_write(link->ctx->logger,
+- LOG_MAJOR_MST,
+- LOG_MINOR_MST_PROGRAMMING,
+- "Link training for %d lanes at %s rate %s with PE %d, VS %d\n",
+- lt_settings.link_settings.lane_count,
+- link_rate,
+- status ? "succeeded" : "failed",
+- lt_settings.lane_settings[0].PRE_EMPHASIS,
+- lt_settings.lane_settings[0].VOLTAGE_SWING);
++ /* Connectivity log: link training */
++ CONN_MSG_LT(link, "%sx%d %s VS=%d, PE=%d",
++ link_rate,
++ lt_settings.link_settings.lane_count,
++ status ? "pass" : "fail",
++ lt_settings.lane_settings[0].VOLTAGE_SWING,
++ lt_settings.lane_settings[0].PRE_EMPHASIS);
+
+ return status;
+ }
+@@ -1540,8 +1538,15 @@ bool dc_link_handle_hpd_rx_irq(const struct dc_link *dc_link)
+ if (hpd_rx_irq_check_link_loss_status(
+ link,
+ &hpd_irq_dpcd_data)) {
++ /* Connectivity log: link loss */
++ CONN_DATA_LINK_LOSS(link,
++ hpd_irq_dpcd_data.raw,
++ sizeof(hpd_irq_dpcd_data),
++ "Status: ");
++
+ perform_link_training_with_retries(link,
+ &link->public.cur_link_settings, true, 3);
++
+ status = false;
+ }
+
+@@ -1794,6 +1799,10 @@ static void retrieve_link_cap(struct core_link *link)
+ (uint8_t *)(&link->edp_revision),
+ sizeof(link->edp_revision));
+ }
++
++ /* Connectivity log: detection */
++ CONN_DATA_DETECT(link, dpcd_data, sizeof(dpcd_data), "Rx Caps: ");
++
+ /* TODO: Confirm if need retrieve_psr_link_cap */
+ }
+
+diff --git a/drivers/gpu/drm/amd/dal/dc/dm_helpers.h b/drivers/gpu/drm/amd/dal/dc/dm_helpers.h
+index 350dd11..151c1ef 100644
+--- a/drivers/gpu/drm/amd/dal/dc/dm_helpers.h
++++ b/drivers/gpu/drm/amd/dal/dc/dm_helpers.h
+@@ -35,11 +35,42 @@
+
+ struct dp_mst_stream_allocation_table;
+
++enum conn_event {
++ CONN_EVENT_MODE_SET,
++ CONN_EVENT_DETECTION,
++ CONN_EVENT_LINK_TRAINING,
++ CONN_EVENT_LINK_LOSS,
++ CONN_EVENT_UNDERFLOW,
++};
++
+ enum dc_edid_status dm_helpers_parse_edid_caps(
+ struct dc_context *ctx,
+ const struct dc_edid *edid,
+ struct dc_edid_caps *edid_caps);
+
++
++/* Connectivity log format:
++ * [time stamp] [drm] [Major_minor] [connector name] message.....
++ * eg:
++ * [ 26.590965] [drm] [Conn_LKTN] [DP-1] HBRx4 pass VS=0, PE=0^
++ * [ 26.881060] [drm] [Conn_Mode] [DP-1] {2560x1080, 2784x1111@185580Khz}^
++ */
++
++#define CONN_DATA_DETECT(link, hex_data, hex_len, ...) \
++ dm_helper_conn_log(link->ctx, &link->public, hex_data, hex_len, \
++ CONN_EVENT_DETECTION, ##__VA_ARGS__)
++
++#define CONN_DATA_LINK_LOSS(link, hex_data, hex_len, ...) \
++ dm_helper_conn_log(link->ctx, &link->public, hex_data, hex_len, \
++ CONN_EVENT_LINK_LOSS, ##__VA_ARGS__)
++
++#define CONN_MSG_LT(link, ...) \
++ dm_helper_conn_log(link->ctx, &link->public, NULL, 0, \
++ CONN_EVENT_LINK_TRAINING, ##__VA_ARGS__)
++
++#define CONN_MSG_MODE(link, ...) \
++ dm_helper_conn_log(link->ctx, &link->public, NULL, 0, \
++ CONN_EVENT_MODE_SET, ##__VA_ARGS__)
+ /*
+ * Writes payload allocation table in immediate downstream device.
+ */
+@@ -100,4 +131,12 @@ bool dm_helpers_submit_i2c(
+ const struct dc_link *link,
+ struct i2c_command *cmd);
+
++void dm_helper_conn_log(struct dc_context *ctx,
++ const struct dc_link *link,
++ uint8_t *hex_data,
++ int hex_data_count,
++ enum conn_event event,
++ const char *msg,
++ ...);
++
+ #endif /* __DM_HELPERS__ */
+diff --git a/drivers/gpu/drm/amd/dal/include/logger_types.h b/drivers/gpu/drm/amd/dal/include/logger_types.h
+index 759542a..26960e8 100644
+--- a/drivers/gpu/drm/amd/dal/include/logger_types.h
++++ b/drivers/gpu/drm/amd/dal/include/logger_types.h
+@@ -65,6 +65,7 @@ enum log_major {
+ /*23*/ LOG_MAJOR_DISPLAY_SERVICE, /*< related to Display Service*/
+ /*24*/ LOG_MAJOR_FEATURE_OVERRIDE, /*< related to features*/
+ /*25*/ LOG_MAJOR_DETECTION, /*< related to detection*/
++/*26*/ LOG_MAJOR_CONNECTIVITY, /*< related to connectivity*/
+ LOG_MAJOR_COUNT, /*< count of the Major categories*/
+ };
+
+@@ -311,6 +312,18 @@ enum log_minor {
+ */
+ LOG_MINOR_DETECTION_EDID_PARSER = 0,
+ LOG_MINOR_DETECTION_DP_CAPS,
++
++/**
++* @brief defines minor category for LOG_MAJOR_CONNECTIVITY
++*
++* @note define sub functionality related to connectivity
++*/
++ LOG_MINOR_CONNECTIVITY_MODE_SET = 0,
++ LOG_MINOR_CONNECTIVITY_DETECTION,
++ LOG_MINOR_CONNECTIVITY_LINK_TRAINING,
++ LOG_MINOR_CONNECTIVITY_LINK_LOSS,
++ LOG_MINOR_CONNECTIVITY_UNDERFLOW,
++
+ };
+
+ union logger_flags {
+--
+2.7.4
+