From 4f6313afbf2678adc26831f856b68bbf6dfc3546 Mon Sep 17 00:00:00 2001 From: Yongqiang Sun 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 Acked-by: Harry Wentland Signed-off-by: Alex Deucher --- .../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