diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3630-drm-amd-display-Add-passive-dongle-support-for-HPD-R.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3630-drm-amd-display-Add-passive-dongle-support-for-HPD-R.patch | 234 |
1 files changed, 234 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3630-drm-amd-display-Add-passive-dongle-support-for-HPD-R.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3630-drm-amd-display-Add-passive-dongle-support-for-HPD-R.patch new file mode 100644 index 00000000..3ca8a516 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3630-drm-amd-display-Add-passive-dongle-support-for-HPD-R.patch @@ -0,0 +1,234 @@ +From df731cf1a1a240a5ab3c44d0ea53112c8eff9e70 Mon Sep 17 00:00:00 2001 +From: John Barberiz <jbarberi@amd.com> +Date: Fri, 9 Feb 2018 17:48:18 -0500 +Subject: [PATCH 3630/4131] drm/amd/display: Add passive dongle support for HPD + Rearch + +Add HPD delay timer support to +1. Single/dual link DVI. +2. DP to HDMI passive dongle +3. DP to DVI passive dongle. + +Change-Id: I07abda93e8a8fb98da82a7701f59387f22392a8e +Signed-off-by: John Barberiz <jbarberi@amd.com> +Reviewed-by: Tony Cheng <Tony.Cheng@amd.com> +Acked-by: Harry Wentland <harry.wentland@amd.com> +Signed-off-by: Kalyan Alle <kalyan.alle@amd.com> +--- + drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h | 4 +- + .../drm/amd/display/amdgpu_dm/amdgpu_dm_color.c | 92 +++++++++++++++++----- + drivers/gpu/drm/amd/display/dc/core/dc_link.c | 7 +- + drivers/gpu/drm/amd/display/dc/dc_link.h | 2 +- + 4 files changed, 80 insertions(+), 25 deletions(-) + +diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h +index 5b5fa80..b4c48c5 100644 +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h +@@ -269,7 +269,9 @@ void amdgpu_dm_crtc_handle_crc_irq(struct drm_crtc *crtc); + #define amdgpu_dm_crtc_handle_crc_irq(x) + #endif + +-#define MAX_COLOR_LUT_ENTRIES 256 ++#define MAX_COLOR_LUT_ENTRIES 4096 ++/* Legacy gamm LUT users such as X doesn't like large LUT sizes */ ++#define MAX_COLOR_LEGACY_LUT_ENTRIES 256 + + void amdgpu_dm_init_color_mod(void); + int amdgpu_dm_set_degamma_lut(struct drm_crtc_state *crtc_state, +diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c +index eeaf392..e845c51 100644 +--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c ++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c +@@ -27,26 +27,40 @@ + #include "amdgpu_dm.h" + #include "modules/color/color_gamma.h" + ++#define MAX_DRM_LUT_VALUE 0xFFFF ++ ++/* ++ * Initialize the color module. ++ * ++ * We're not using the full color module, only certain components. ++ * Only call setup functions for components that we need. ++ */ ++void amdgpu_dm_init_color_mod(void) ++{ ++ setup_x_points_distribution(); ++} ++ ++ + /* + * Return true if the given lut is a linear mapping of values, i.e. it acts + * like a bypass LUT. + * + * It is considered linear if the lut represents: +- * f(a) = (0xFF00/MAX_LUT_ENTRIES-1)a; for integer a in [0, MAX_LUT_ENTRIES) ++ * f(a) = (0xFF00/MAX_COLOR_LUT_ENTRIES-1)a; for integer a in ++ * [0, MAX_COLOR_LUT_ENTRIES) + */ +-static bool __is_lut_linear(struct drm_color_lut *lut) ++static bool __is_lut_linear(struct drm_color_lut *lut, uint32_t size) + { + int i; +- uint32_t max_os = 0xFF00; + uint32_t expected; + int delta; + +- for (i = 0; i < MAX_COLOR_LUT_ENTRIES; i++) { ++ for (i = 0; i < size; i++) { + /* All color values should equal */ + if ((lut[i].red != lut[i].green) || (lut[i].green != lut[i].blue)) + return false; + +- expected = i * max_os / (MAX_COLOR_LUT_ENTRIES-1); ++ expected = i * MAX_DRM_LUT_VALUE / (size-1); + + /* Allow a +/-1 error. */ + delta = lut[i].red - expected; +@@ -57,6 +71,42 @@ static bool __is_lut_linear(struct drm_color_lut *lut) + } + + /** ++ * Convert the drm_color_lut to dc_gamma. The conversion depends on the size ++ * of the lut - whether or not it's legacy. ++ */ ++static void __drm_lut_to_dc_gamma(struct drm_color_lut *lut, ++ struct dc_gamma *gamma, ++ bool is_legacy) ++{ ++ uint32_t r, g, b; ++ int i; ++ ++ if (is_legacy) { ++ for (i = 0; i < MAX_COLOR_LEGACY_LUT_ENTRIES; i++) { ++ r = drm_color_lut_extract(lut[i].red, 16); ++ g = drm_color_lut_extract(lut[i].green, 16); ++ b = drm_color_lut_extract(lut[i].blue, 16); ++ ++ gamma->entries.red[i] = dal_fixed31_32_from_int(r); ++ gamma->entries.green[i] = dal_fixed31_32_from_int(g); ++ gamma->entries.blue[i] = dal_fixed31_32_from_int(b); ++ } ++ return; ++ } ++ ++ /* else */ ++ for (i = 0; i < MAX_COLOR_LUT_ENTRIES; i++) { ++ r = drm_color_lut_extract(lut[i].red, 16); ++ g = drm_color_lut_extract(lut[i].green, 16); ++ b = drm_color_lut_extract(lut[i].blue, 16); ++ ++ gamma->entries.red[i] = dal_fixed31_32_from_fraction(r, MAX_DRM_LUT_VALUE); ++ gamma->entries.green[i] = dal_fixed31_32_from_fraction(g, MAX_DRM_LUT_VALUE); ++ gamma->entries.blue[i] = dal_fixed31_32_from_fraction(b, MAX_DRM_LUT_VALUE); ++ } ++} ++ ++/** + * amdgpu_dm_set_regamma_lut: Set regamma lut for the given CRTC. + * @crtc: amdgpu_dm crtc state + * +@@ -72,11 +122,10 @@ int amdgpu_dm_set_regamma_lut(struct dm_crtc_state *crtc) + struct drm_property_blob *blob = crtc->base.gamma_lut; + struct dc_stream_state *stream = crtc->stream; + struct drm_color_lut *lut; ++ uint32_t lut_size; + struct dc_gamma *gamma; + enum dc_transfer_func_type old_type = stream->out_transfer_func->type; + +- uint32_t r, g, b; +- int i; + bool ret; + + if (!blob) { +@@ -87,8 +136,9 @@ int amdgpu_dm_set_regamma_lut(struct dm_crtc_state *crtc) + } + + lut = (struct drm_color_lut *)blob->data; ++ lut_size = blob->length / sizeof(struct drm_color_lut); + +- if (__is_lut_linear(lut)) { ++ if (__is_lut_linear(lut, lut_size)) { + /* Set to bypass if lut is set to linear */ + stream->out_transfer_func->type = TF_TYPE_BYPASS; + stream->out_transfer_func->tf = TRANSFER_FUNCTION_LINEAR; +@@ -99,20 +149,20 @@ int amdgpu_dm_set_regamma_lut(struct dm_crtc_state *crtc) + if (!gamma) + return -ENOMEM; + +- gamma->num_entries = MAX_LUT_ENTRIES; +- gamma->type = GAMMA_RGB_256; +- +- /* Truncate, and store in dc_gamma for output tf calculation */ +- for (i = 0; i < gamma->num_entries; i++) { +- r = drm_color_lut_extract(lut[i].red, 16); +- g = drm_color_lut_extract(lut[i].green, 16); +- b = drm_color_lut_extract(lut[i].blue, 16); +- +- gamma->entries.red[i] = dal_fixed31_32_from_int(r); +- gamma->entries.green[i] = dal_fixed31_32_from_int(g); +- gamma->entries.blue[i] = dal_fixed31_32_from_int(b); ++ gamma->num_entries = lut_size; ++ if (gamma->num_entries == MAX_COLOR_LEGACY_LUT_ENTRIES) ++ gamma->type = GAMMA_RGB_256; ++ else if (gamma->num_entries == MAX_COLOR_LUT_ENTRIES) ++ gamma->type = GAMMA_CS_TFM_1D; ++ else { ++ /* Invalid lut size */ ++ dc_gamma_release(&gamma); ++ return -EINVAL; + } + ++ /* Convert drm_lut into dc_gamma */ ++ __drm_lut_to_dc_gamma(lut, gamma, gamma->type == GAMMA_RGB_256); ++ + /* Call color module to translate into something DC understands. Namely + * a transfer function. + */ +@@ -199,7 +249,7 @@ int amdgpu_dm_set_degamma_lut(struct drm_crtc_state *crtc_state, + } + + lut = (struct drm_color_lut *)blob->data; +- if (__is_lut_linear(lut)) { ++ if (__is_lut_linear(lut, MAX_COLOR_LUT_ENTRIES)) { + dc_plane_state->in_transfer_func->type = TF_TYPE_BYPASS; + dc_plane_state->in_transfer_func->tf = TRANSFER_FUNCTION_LINEAR; + return 0; +diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c b/drivers/gpu/drm/amd/display/dc/core/dc_link.c +index f40c9c7..556b155 100644 +--- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c ++++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c +@@ -2358,11 +2358,14 @@ void core_link_set_avmute(struct pipe_ctx *pipe_ctx, bool enable) + core_dc->hwss.set_avmute(pipe_ctx, enable); + } + +-void dc_link_disable_hpd_filter(struct dc_link *link) ++void dc_link_enable_hpd_filter(struct dc_link *link, bool enable) + { + struct gpio *hpd; + +- if (!link->is_hpd_filter_disabled) { ++ if (enable) { ++ link->is_hpd_filter_disabled = false; ++ program_hpd_filter(link); ++ } else { + link->is_hpd_filter_disabled = true; + /* Obtain HPD handle */ + hpd = get_hpd_gpio(link->ctx->dc_bios, link->link_id, link->ctx->gpio_service); +diff --git a/drivers/gpu/drm/amd/display/dc/dc_link.h b/drivers/gpu/drm/amd/display/dc/dc_link.h +index ac0f617..fb4d9ea 100644 +--- a/drivers/gpu/drm/amd/display/dc/dc_link.h ++++ b/drivers/gpu/drm/amd/display/dc/dc_link.h +@@ -197,7 +197,7 @@ bool dc_link_dp_set_test_pattern( + const unsigned char *p_custom_pattern, + unsigned int cust_pattern_size); + +-void dc_link_disable_hpd_filter(struct dc_link *link); ++void dc_link_enable_hpd_filter(struct dc_link *link, bool enable); + + /* + * DPCD access interfaces +-- +2.7.4 + |