1c349dbc7Sjsg /* 2c349dbc7Sjsg * Copyright © 2008 Intel Corporation 3c349dbc7Sjsg * 4c349dbc7Sjsg * Permission is hereby granted, free of charge, to any person obtaining a 5c349dbc7Sjsg * copy of this software and associated documentation files (the "Software"), 6c349dbc7Sjsg * to deal in the Software without restriction, including without limitation 7c349dbc7Sjsg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8c349dbc7Sjsg * and/or sell copies of the Software, and to permit persons to whom the 9c349dbc7Sjsg * Software is furnished to do so, subject to the following conditions: 10c349dbc7Sjsg * 11c349dbc7Sjsg * The above copyright notice and this permission notice (including the next 12c349dbc7Sjsg * paragraph) shall be included in all copies or substantial portions of the 13c349dbc7Sjsg * Software. 14c349dbc7Sjsg * 15c349dbc7Sjsg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16c349dbc7Sjsg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17c349dbc7Sjsg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18c349dbc7Sjsg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19c349dbc7Sjsg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20c349dbc7Sjsg * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21c349dbc7Sjsg * IN THE SOFTWARE. 22c349dbc7Sjsg * 23c349dbc7Sjsg * Authors: 24c349dbc7Sjsg * Keith Packard <keithp@keithp.com> 25c349dbc7Sjsg * 26c349dbc7Sjsg */ 27c349dbc7Sjsg 28c349dbc7Sjsg #include <linux/export.h> 29c349dbc7Sjsg #include <linux/i2c.h> 30c349dbc7Sjsg #include <linux/notifier.h> 31c349dbc7Sjsg #include <linux/slab.h> 321bb76ff1Sjsg #include <linux/string_helpers.h> 335ca02815Sjsg #include <linux/timekeeping.h> 34c349dbc7Sjsg #include <linux/types.h> 35c349dbc7Sjsg 36c349dbc7Sjsg #include <asm/byteorder.h> 37c349dbc7Sjsg 381bb76ff1Sjsg #include <drm/display/drm_dp_helper.h> 391bb76ff1Sjsg #include <drm/display/drm_dsc_helper.h> 401bb76ff1Sjsg #include <drm/display/drm_hdmi_helper.h> 41c349dbc7Sjsg #include <drm/drm_atomic_helper.h> 42c349dbc7Sjsg #include <drm/drm_crtc.h> 43c349dbc7Sjsg #include <drm/drm_edid.h> 44c349dbc7Sjsg #include <drm/drm_probe_helper.h> 45c349dbc7Sjsg 465ca02815Sjsg #include "g4x_dp.h" 47c349dbc7Sjsg #include "i915_drv.h" 48f005ef32Sjsg #include "i915_irq.h" 49f005ef32Sjsg #include "i915_reg.h" 50c349dbc7Sjsg #include "intel_atomic.h" 51c349dbc7Sjsg #include "intel_audio.h" 52b35a56d4Sjsg #include "intel_backlight.h" 531bb76ff1Sjsg #include "intel_combo_phy_regs.h" 54c349dbc7Sjsg #include "intel_connector.h" 551bb76ff1Sjsg #include "intel_crtc.h" 56f005ef32Sjsg #include "intel_cx0_phy.h" 57c349dbc7Sjsg #include "intel_ddi.h" 585ca02815Sjsg #include "intel_de.h" 59c349dbc7Sjsg #include "intel_display_types.h" 60c349dbc7Sjsg #include "intel_dp.h" 615ca02815Sjsg #include "intel_dp_aux.h" 625ca02815Sjsg #include "intel_dp_hdcp.h" 63c349dbc7Sjsg #include "intel_dp_link_training.h" 64c349dbc7Sjsg #include "intel_dp_mst.h" 65c349dbc7Sjsg #include "intel_dpio_phy.h" 665ca02815Sjsg #include "intel_dpll.h" 67c349dbc7Sjsg #include "intel_fifo_underrun.h" 68c349dbc7Sjsg #include "intel_hdcp.h" 69c349dbc7Sjsg #include "intel_hdmi.h" 70c349dbc7Sjsg #include "intel_hotplug.h" 71f005ef32Sjsg #include "intel_hotplug_irq.h" 72c349dbc7Sjsg #include "intel_lspcon.h" 73c349dbc7Sjsg #include "intel_lvds.h" 74c349dbc7Sjsg #include "intel_panel.h" 751bb76ff1Sjsg #include "intel_pch_display.h" 765ca02815Sjsg #include "intel_pps.h" 77c349dbc7Sjsg #include "intel_psr.h" 78c349dbc7Sjsg #include "intel_tc.h" 79c349dbc7Sjsg #include "intel_vdsc.h" 805ca02815Sjsg #include "intel_vrr.h" 81f005ef32Sjsg #include "intel_crtc_state_dump.h" 82c349dbc7Sjsg 83c349dbc7Sjsg /* DP DSC throughput values used for slice count calculations KPixels/s */ 84c349dbc7Sjsg #define DP_DSC_PEAK_PIXEL_RATE 2720000 85c349dbc7Sjsg #define DP_DSC_MAX_ENC_THROUGHPUT_0 340000 86c349dbc7Sjsg #define DP_DSC_MAX_ENC_THROUGHPUT_1 400000 87c349dbc7Sjsg 88c349dbc7Sjsg /* DP DSC FEC Overhead factor = 1/(0.972261) */ 89c349dbc7Sjsg #define DP_DSC_FEC_OVERHEAD_FACTOR 972261 90c349dbc7Sjsg 91c349dbc7Sjsg /* Compliance test status bits */ 92c349dbc7Sjsg #define INTEL_DP_RESOLUTION_SHIFT_MASK 0 93c349dbc7Sjsg #define INTEL_DP_RESOLUTION_PREFERRED (1 << INTEL_DP_RESOLUTION_SHIFT_MASK) 94c349dbc7Sjsg #define INTEL_DP_RESOLUTION_STANDARD (2 << INTEL_DP_RESOLUTION_SHIFT_MASK) 95c349dbc7Sjsg #define INTEL_DP_RESOLUTION_FAILSAFE (3 << INTEL_DP_RESOLUTION_SHIFT_MASK) 96c349dbc7Sjsg 97c349dbc7Sjsg 98c349dbc7Sjsg /* Constants for DP DSC configurations */ 99c349dbc7Sjsg static const u8 valid_dsc_bpp[] = {6, 8, 10, 12, 15}; 100c349dbc7Sjsg 101c349dbc7Sjsg /* With Single pipe configuration, HW is capable of supporting maximum 102c349dbc7Sjsg * of 4 slices per line. 103c349dbc7Sjsg */ 104c349dbc7Sjsg static const u8 valid_dsc_slicecount[] = {1, 2, 4}; 105c349dbc7Sjsg 106c349dbc7Sjsg /** 107c349dbc7Sjsg * intel_dp_is_edp - is the given port attached to an eDP panel (either CPU or PCH) 108c349dbc7Sjsg * @intel_dp: DP struct 109c349dbc7Sjsg * 110c349dbc7Sjsg * If a CPU or PCH DP output is attached to an eDP panel, this function 111c349dbc7Sjsg * will return true, and false otherwise. 1121bb76ff1Sjsg * 1131bb76ff1Sjsg * This function is not safe to use prior to encoder type being set. 114c349dbc7Sjsg */ 115c349dbc7Sjsg bool intel_dp_is_edp(struct intel_dp *intel_dp) 116c349dbc7Sjsg { 117ad8b1aafSjsg struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); 118c349dbc7Sjsg 119ad8b1aafSjsg return dig_port->base.type == INTEL_OUTPUT_EDP; 120c349dbc7Sjsg } 121c349dbc7Sjsg 122c349dbc7Sjsg static void intel_dp_unset_edid(struct intel_dp *intel_dp); 123c349dbc7Sjsg 1241bb76ff1Sjsg /* Is link rate UHBR and thus 128b/132b? */ 1251bb76ff1Sjsg bool intel_dp_is_uhbr(const struct intel_crtc_state *crtc_state) 1261bb76ff1Sjsg { 1271bb76ff1Sjsg return crtc_state->port_clock >= 1000000; 1281bb76ff1Sjsg } 1291bb76ff1Sjsg 13090d1a473Sjsg static void intel_dp_set_default_sink_rates(struct intel_dp *intel_dp) 13190d1a473Sjsg { 13290d1a473Sjsg intel_dp->sink_rates[0] = 162000; 13390d1a473Sjsg intel_dp->num_sink_rates = 1; 13490d1a473Sjsg } 13590d1a473Sjsg 136c349dbc7Sjsg /* update sink rates from dpcd */ 1371bb76ff1Sjsg static void intel_dp_set_dpcd_sink_rates(struct intel_dp *intel_dp) 138c349dbc7Sjsg { 139c349dbc7Sjsg static const int dp_rates[] = { 140c349dbc7Sjsg 162000, 270000, 540000, 810000 141c349dbc7Sjsg }; 142c349dbc7Sjsg int i, max_rate; 1435ca02815Sjsg int max_lttpr_rate; 144c349dbc7Sjsg 1455ca02815Sjsg if (drm_dp_has_quirk(&intel_dp->desc, DP_DPCD_QUIRK_CAN_DO_MAX_LINK_RATE_3_24_GBPS)) { 146ad8b1aafSjsg /* Needed, e.g., for Apple MBP 2017, 15 inch eDP Retina panel */ 147ad8b1aafSjsg static const int quirk_rates[] = { 162000, 270000, 324000 }; 148ad8b1aafSjsg 149ad8b1aafSjsg memcpy(intel_dp->sink_rates, quirk_rates, sizeof(quirk_rates)); 150ad8b1aafSjsg intel_dp->num_sink_rates = ARRAY_SIZE(quirk_rates); 151ad8b1aafSjsg 152ad8b1aafSjsg return; 153ad8b1aafSjsg } 154ad8b1aafSjsg 1551bb76ff1Sjsg /* 1561bb76ff1Sjsg * Sink rates for 8b/10b. 1571bb76ff1Sjsg */ 158c349dbc7Sjsg max_rate = drm_dp_bw_code_to_link_rate(intel_dp->dpcd[DP_MAX_LINK_RATE]); 1595ca02815Sjsg max_lttpr_rate = drm_dp_lttpr_max_link_rate(intel_dp->lttpr_common_caps); 1605ca02815Sjsg if (max_lttpr_rate) 1615ca02815Sjsg max_rate = min(max_rate, max_lttpr_rate); 162c349dbc7Sjsg 163c349dbc7Sjsg for (i = 0; i < ARRAY_SIZE(dp_rates); i++) { 164c349dbc7Sjsg if (dp_rates[i] > max_rate) 165c349dbc7Sjsg break; 166c349dbc7Sjsg intel_dp->sink_rates[i] = dp_rates[i]; 167c349dbc7Sjsg } 168c349dbc7Sjsg 1691bb76ff1Sjsg /* 1701bb76ff1Sjsg * Sink rates for 128b/132b. If set, sink should support all 8b/10b 1711bb76ff1Sjsg * rates and 10 Gbps. 1721bb76ff1Sjsg */ 1731bb76ff1Sjsg if (intel_dp->dpcd[DP_MAIN_LINK_CHANNEL_CODING] & DP_CAP_ANSI_128B132B) { 1741bb76ff1Sjsg u8 uhbr_rates = 0; 1751bb76ff1Sjsg 1761bb76ff1Sjsg BUILD_BUG_ON(ARRAY_SIZE(intel_dp->sink_rates) < ARRAY_SIZE(dp_rates) + 3); 1771bb76ff1Sjsg 1781bb76ff1Sjsg drm_dp_dpcd_readb(&intel_dp->aux, 1791bb76ff1Sjsg DP_128B132B_SUPPORTED_LINK_RATES, &uhbr_rates); 1801bb76ff1Sjsg 1811bb76ff1Sjsg if (drm_dp_lttpr_count(intel_dp->lttpr_common_caps)) { 1821bb76ff1Sjsg /* We have a repeater */ 1831bb76ff1Sjsg if (intel_dp->lttpr_common_caps[0] >= 0x20 && 1841bb76ff1Sjsg intel_dp->lttpr_common_caps[DP_MAIN_LINK_CHANNEL_CODING_PHY_REPEATER - 1851bb76ff1Sjsg DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV] & 1861bb76ff1Sjsg DP_PHY_REPEATER_128B132B_SUPPORTED) { 1871bb76ff1Sjsg /* Repeater supports 128b/132b, valid UHBR rates */ 1881bb76ff1Sjsg uhbr_rates &= intel_dp->lttpr_common_caps[DP_PHY_REPEATER_128B132B_RATES - 1891bb76ff1Sjsg DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV]; 1901bb76ff1Sjsg } else { 1911bb76ff1Sjsg /* Does not support 128b/132b */ 1921bb76ff1Sjsg uhbr_rates = 0; 1931bb76ff1Sjsg } 1941bb76ff1Sjsg } 1951bb76ff1Sjsg 1961bb76ff1Sjsg if (uhbr_rates & DP_UHBR10) 1971bb76ff1Sjsg intel_dp->sink_rates[i++] = 1000000; 1981bb76ff1Sjsg if (uhbr_rates & DP_UHBR13_5) 1991bb76ff1Sjsg intel_dp->sink_rates[i++] = 1350000; 2001bb76ff1Sjsg if (uhbr_rates & DP_UHBR20) 2011bb76ff1Sjsg intel_dp->sink_rates[i++] = 2000000; 2021bb76ff1Sjsg } 2031bb76ff1Sjsg 204c349dbc7Sjsg intel_dp->num_sink_rates = i; 205c349dbc7Sjsg } 206c349dbc7Sjsg 2071bb76ff1Sjsg static void intel_dp_set_sink_rates(struct intel_dp *intel_dp) 2081bb76ff1Sjsg { 2091bb76ff1Sjsg struct intel_connector *connector = intel_dp->attached_connector; 2101bb76ff1Sjsg struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); 2111bb76ff1Sjsg struct intel_encoder *encoder = &intel_dig_port->base; 2121bb76ff1Sjsg 2131bb76ff1Sjsg intel_dp_set_dpcd_sink_rates(intel_dp); 2141bb76ff1Sjsg 2151bb76ff1Sjsg if (intel_dp->num_sink_rates) 2161bb76ff1Sjsg return; 2171bb76ff1Sjsg 2181bb76ff1Sjsg drm_err(&dp_to_i915(intel_dp)->drm, 2191bb76ff1Sjsg "[CONNECTOR:%d:%s][ENCODER:%d:%s] Invalid DPCD with no link rates, using defaults\n", 2201bb76ff1Sjsg connector->base.base.id, connector->base.name, 2211bb76ff1Sjsg encoder->base.base.id, encoder->base.name); 2221bb76ff1Sjsg 2231bb76ff1Sjsg intel_dp_set_default_sink_rates(intel_dp); 2241bb76ff1Sjsg } 2251bb76ff1Sjsg 2261bb76ff1Sjsg static void intel_dp_set_default_max_sink_lane_count(struct intel_dp *intel_dp) 2271bb76ff1Sjsg { 2281bb76ff1Sjsg intel_dp->max_sink_lane_count = 1; 2291bb76ff1Sjsg } 2301bb76ff1Sjsg 2311bb76ff1Sjsg static void intel_dp_set_max_sink_lane_count(struct intel_dp *intel_dp) 2321bb76ff1Sjsg { 2331bb76ff1Sjsg struct intel_connector *connector = intel_dp->attached_connector; 2341bb76ff1Sjsg struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); 2351bb76ff1Sjsg struct intel_encoder *encoder = &intel_dig_port->base; 2361bb76ff1Sjsg 2371bb76ff1Sjsg intel_dp->max_sink_lane_count = drm_dp_max_lane_count(intel_dp->dpcd); 2381bb76ff1Sjsg 2391bb76ff1Sjsg switch (intel_dp->max_sink_lane_count) { 2401bb76ff1Sjsg case 1: 2411bb76ff1Sjsg case 2: 2421bb76ff1Sjsg case 4: 2431bb76ff1Sjsg return; 2441bb76ff1Sjsg } 2451bb76ff1Sjsg 2461bb76ff1Sjsg drm_err(&dp_to_i915(intel_dp)->drm, 2471bb76ff1Sjsg "[CONNECTOR:%d:%s][ENCODER:%d:%s] Invalid DPCD max lane count (%d), using default\n", 2481bb76ff1Sjsg connector->base.base.id, connector->base.name, 2491bb76ff1Sjsg encoder->base.base.id, encoder->base.name, 2501bb76ff1Sjsg intel_dp->max_sink_lane_count); 2511bb76ff1Sjsg 2521bb76ff1Sjsg intel_dp_set_default_max_sink_lane_count(intel_dp); 2531bb76ff1Sjsg } 2541bb76ff1Sjsg 255c349dbc7Sjsg /* Get length of rates array potentially limited by max_rate. */ 256c349dbc7Sjsg static int intel_dp_rate_limit_len(const int *rates, int len, int max_rate) 257c349dbc7Sjsg { 258c349dbc7Sjsg int i; 259c349dbc7Sjsg 260c349dbc7Sjsg /* Limit results by potentially reduced max rate */ 261c349dbc7Sjsg for (i = 0; i < len; i++) { 262c349dbc7Sjsg if (rates[len - i - 1] <= max_rate) 263c349dbc7Sjsg return len - i; 264c349dbc7Sjsg } 265c349dbc7Sjsg 266c349dbc7Sjsg return 0; 267c349dbc7Sjsg } 268c349dbc7Sjsg 269c349dbc7Sjsg /* Get length of common rates array potentially limited by max_rate. */ 270c349dbc7Sjsg static int intel_dp_common_len_rate_limit(const struct intel_dp *intel_dp, 271c349dbc7Sjsg int max_rate) 272c349dbc7Sjsg { 273c349dbc7Sjsg return intel_dp_rate_limit_len(intel_dp->common_rates, 274c349dbc7Sjsg intel_dp->num_common_rates, max_rate); 275c349dbc7Sjsg } 276c349dbc7Sjsg 2771bb76ff1Sjsg static int intel_dp_common_rate(struct intel_dp *intel_dp, int index) 2781bb76ff1Sjsg { 2791bb76ff1Sjsg if (drm_WARN_ON(&dp_to_i915(intel_dp)->drm, 2801bb76ff1Sjsg index < 0 || index >= intel_dp->num_common_rates)) 2811bb76ff1Sjsg return 162000; 2821bb76ff1Sjsg 2831bb76ff1Sjsg return intel_dp->common_rates[index]; 2841bb76ff1Sjsg } 2851bb76ff1Sjsg 286c349dbc7Sjsg /* Theoretical max between source and sink */ 287c349dbc7Sjsg static int intel_dp_max_common_rate(struct intel_dp *intel_dp) 288c349dbc7Sjsg { 2891bb76ff1Sjsg return intel_dp_common_rate(intel_dp, intel_dp->num_common_rates - 1); 2901bb76ff1Sjsg } 2911bb76ff1Sjsg 2921bb76ff1Sjsg static int intel_dp_max_source_lane_count(struct intel_digital_port *dig_port) 2931bb76ff1Sjsg { 294f005ef32Sjsg int vbt_max_lanes = intel_bios_dp_max_lane_count(dig_port->base.devdata); 2951bb76ff1Sjsg int max_lanes = dig_port->max_lanes; 2961bb76ff1Sjsg 2971bb76ff1Sjsg if (vbt_max_lanes) 2981bb76ff1Sjsg max_lanes = min(max_lanes, vbt_max_lanes); 2991bb76ff1Sjsg 3001bb76ff1Sjsg return max_lanes; 301c349dbc7Sjsg } 302c349dbc7Sjsg 303c349dbc7Sjsg /* Theoretical max between source and sink */ 304c349dbc7Sjsg static int intel_dp_max_common_lane_count(struct intel_dp *intel_dp) 305c349dbc7Sjsg { 306ad8b1aafSjsg struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); 3071bb76ff1Sjsg int source_max = intel_dp_max_source_lane_count(dig_port); 3081bb76ff1Sjsg int sink_max = intel_dp->max_sink_lane_count; 309ad8b1aafSjsg int fia_max = intel_tc_port_fia_max_lane_count(dig_port); 3105ca02815Sjsg int lttpr_max = drm_dp_lttpr_max_lane_count(intel_dp->lttpr_common_caps); 3115ca02815Sjsg 3125ca02815Sjsg if (lttpr_max) 3135ca02815Sjsg sink_max = min(sink_max, lttpr_max); 314c349dbc7Sjsg 315c349dbc7Sjsg return min3(source_max, sink_max, fia_max); 316c349dbc7Sjsg } 317c349dbc7Sjsg 318c349dbc7Sjsg int intel_dp_max_lane_count(struct intel_dp *intel_dp) 319c349dbc7Sjsg { 3201bb76ff1Sjsg switch (intel_dp->max_link_lane_count) { 3211bb76ff1Sjsg case 1: 3221bb76ff1Sjsg case 2: 3231bb76ff1Sjsg case 4: 324c349dbc7Sjsg return intel_dp->max_link_lane_count; 3251bb76ff1Sjsg default: 3261bb76ff1Sjsg MISSING_CASE(intel_dp->max_link_lane_count); 3271bb76ff1Sjsg return 1; 3281bb76ff1Sjsg } 329c349dbc7Sjsg } 330c349dbc7Sjsg 3311bb76ff1Sjsg /* 3321bb76ff1Sjsg * The required data bandwidth for a mode with given pixel clock and bpp. This 3331bb76ff1Sjsg * is the required net bandwidth independent of the data bandwidth efficiency. 3341bb76ff1Sjsg */ 335c349dbc7Sjsg int 336c349dbc7Sjsg intel_dp_link_required(int pixel_clock, int bpp) 337c349dbc7Sjsg { 338c349dbc7Sjsg /* pixel_clock is in kHz, divide bpp by 8 for bit to Byte conversion */ 339c349dbc7Sjsg return DIV_ROUND_UP(pixel_clock * bpp, 8); 340c349dbc7Sjsg } 341c349dbc7Sjsg 3421bb76ff1Sjsg /* 3431bb76ff1Sjsg * Given a link rate and lanes, get the data bandwidth. 3441bb76ff1Sjsg * 3451bb76ff1Sjsg * Data bandwidth is the actual payload rate, which depends on the data 3461bb76ff1Sjsg * bandwidth efficiency and the link rate. 3471bb76ff1Sjsg * 3481bb76ff1Sjsg * For 8b/10b channel encoding, SST and non-FEC, the data bandwidth efficiency 3491bb76ff1Sjsg * is 80%. For example, for a 1.62 Gbps link, 1.62*10^9 bps * 0.80 * (1/8) = 3501bb76ff1Sjsg * 162000 kBps. With 8-bit symbols, we have 162000 kHz symbol clock. Just by 3511bb76ff1Sjsg * coincidence, the port clock in kHz matches the data bandwidth in kBps, and 3521bb76ff1Sjsg * they equal the link bit rate in Gbps multiplied by 100000. (Note that this no 3531bb76ff1Sjsg * longer holds for data bandwidth as soon as FEC or MST is taken into account!) 3541bb76ff1Sjsg * 3551bb76ff1Sjsg * For 128b/132b channel encoding, the data bandwidth efficiency is 96.71%. For 3561bb76ff1Sjsg * example, for a 10 Gbps link, 10*10^9 bps * 0.9671 * (1/8) = 1208875 3571bb76ff1Sjsg * kBps. With 32-bit symbols, we have 312500 kHz symbol clock. The value 1000000 3581bb76ff1Sjsg * does not match the symbol clock, the port clock (not even if you think in 3591bb76ff1Sjsg * terms of a byte clock), nor the data bandwidth. It only matches the link bit 3601bb76ff1Sjsg * rate in units of 10000 bps. 3611bb76ff1Sjsg */ 362c349dbc7Sjsg int 3631bb76ff1Sjsg intel_dp_max_data_rate(int max_link_rate, int max_lanes) 364c349dbc7Sjsg { 3651bb76ff1Sjsg if (max_link_rate >= 1000000) { 3661bb76ff1Sjsg /* 3671bb76ff1Sjsg * UHBR rates always use 128b/132b channel encoding, and have 3681bb76ff1Sjsg * 97.71% data bandwidth efficiency. Consider max_link_rate the 3691bb76ff1Sjsg * link bit rate in units of 10000 bps. 3701bb76ff1Sjsg */ 3711bb76ff1Sjsg int max_link_rate_kbps = max_link_rate * 10; 3721bb76ff1Sjsg 3731bb76ff1Sjsg max_link_rate_kbps = DIV_ROUND_CLOSEST_ULL(mul_u32_u32(max_link_rate_kbps, 9671), 10000); 3741bb76ff1Sjsg max_link_rate = max_link_rate_kbps / 8; 3751bb76ff1Sjsg } 3761bb76ff1Sjsg 3771bb76ff1Sjsg /* 3781bb76ff1Sjsg * Lower than UHBR rates always use 8b/10b channel encoding, and have 3791bb76ff1Sjsg * 80% data bandwidth efficiency for SST non-FEC. However, this turns 3801bb76ff1Sjsg * out to be a nop by coincidence, and can be skipped: 3811bb76ff1Sjsg * 3821bb76ff1Sjsg * int max_link_rate_kbps = max_link_rate * 10; 3831bb76ff1Sjsg * max_link_rate_kbps = DIV_ROUND_CLOSEST_ULL(max_link_rate_kbps * 8, 10); 3841bb76ff1Sjsg * max_link_rate = max_link_rate_kbps / 8; 385c349dbc7Sjsg */ 386c349dbc7Sjsg 3871bb76ff1Sjsg return max_link_rate * max_lanes; 388c349dbc7Sjsg } 389c349dbc7Sjsg 3905ca02815Sjsg bool intel_dp_can_bigjoiner(struct intel_dp *intel_dp) 391c349dbc7Sjsg { 3925ca02815Sjsg struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp); 3935ca02815Sjsg struct intel_encoder *encoder = &intel_dig_port->base; 3945ca02815Sjsg struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 395c349dbc7Sjsg 3963eae31a5Sjsg /* eDP MSO is not compatible with joiner */ 3973eae31a5Sjsg if (intel_dp->mso_link_count) 3983eae31a5Sjsg return false; 3993eae31a5Sjsg 4005ca02815Sjsg return DISPLAY_VER(dev_priv) >= 12 || 4015ca02815Sjsg (DISPLAY_VER(dev_priv) == 11 && 4025ca02815Sjsg encoder->port != PORT_A); 403c349dbc7Sjsg } 404c349dbc7Sjsg 4051bb76ff1Sjsg static int dg2_max_source_rate(struct intel_dp *intel_dp) 4061bb76ff1Sjsg { 4071bb76ff1Sjsg return intel_dp_is_edp(intel_dp) ? 810000 : 1350000; 4081bb76ff1Sjsg } 4091bb76ff1Sjsg 410c349dbc7Sjsg static int icl_max_source_rate(struct intel_dp *intel_dp) 411c349dbc7Sjsg { 412c349dbc7Sjsg struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); 413c349dbc7Sjsg struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev); 414c349dbc7Sjsg enum phy phy = intel_port_to_phy(dev_priv, dig_port->base.port); 415c349dbc7Sjsg 4161bb76ff1Sjsg if (intel_phy_is_combo(dev_priv, phy) && !intel_dp_is_edp(intel_dp)) 417c349dbc7Sjsg return 540000; 418c349dbc7Sjsg 419c349dbc7Sjsg return 810000; 420c349dbc7Sjsg } 421c349dbc7Sjsg 4225ca02815Sjsg static int ehl_max_source_rate(struct intel_dp *intel_dp) 4235ca02815Sjsg { 4245ca02815Sjsg if (intel_dp_is_edp(intel_dp)) 4255ca02815Sjsg return 540000; 4265ca02815Sjsg 4275ca02815Sjsg return 810000; 4285ca02815Sjsg } 4295ca02815Sjsg 430f005ef32Sjsg static int mtl_max_source_rate(struct intel_dp *intel_dp) 431f005ef32Sjsg { 432f005ef32Sjsg struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); 433f005ef32Sjsg struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); 434f005ef32Sjsg enum phy phy = intel_port_to_phy(i915, dig_port->base.port); 435f005ef32Sjsg 436f005ef32Sjsg if (intel_is_c10phy(i915, phy)) 437f005ef32Sjsg return 810000; 438f005ef32Sjsg 439f005ef32Sjsg return 2000000; 440f005ef32Sjsg } 441f005ef32Sjsg 4421bb76ff1Sjsg static int vbt_max_link_rate(struct intel_dp *intel_dp) 4431bb76ff1Sjsg { 4441bb76ff1Sjsg struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; 4451bb76ff1Sjsg int max_rate; 4461bb76ff1Sjsg 447f005ef32Sjsg max_rate = intel_bios_dp_max_link_rate(encoder->devdata); 4481bb76ff1Sjsg 4491bb76ff1Sjsg if (intel_dp_is_edp(intel_dp)) { 4501bb76ff1Sjsg struct intel_connector *connector = intel_dp->attached_connector; 4511bb76ff1Sjsg int edp_max_rate = connector->panel.vbt.edp.max_link_rate; 4521bb76ff1Sjsg 4531bb76ff1Sjsg if (max_rate && edp_max_rate) 4541bb76ff1Sjsg max_rate = min(max_rate, edp_max_rate); 4551bb76ff1Sjsg else if (edp_max_rate) 4561bb76ff1Sjsg max_rate = edp_max_rate; 4571bb76ff1Sjsg } 4581bb76ff1Sjsg 4591bb76ff1Sjsg return max_rate; 4601bb76ff1Sjsg } 4611bb76ff1Sjsg 462c349dbc7Sjsg static void 463c349dbc7Sjsg intel_dp_set_source_rates(struct intel_dp *intel_dp) 464c349dbc7Sjsg { 465c349dbc7Sjsg /* The values must be in increasing order */ 466f005ef32Sjsg static const int mtl_rates[] = { 467f005ef32Sjsg 162000, 216000, 243000, 270000, 324000, 432000, 540000, 675000, 468f005ef32Sjsg 810000, 1000000, 1350000, 2000000, 469f005ef32Sjsg }; 4705ca02815Sjsg static const int icl_rates[] = { 4711bb76ff1Sjsg 162000, 216000, 270000, 324000, 432000, 540000, 648000, 810000, 4721bb76ff1Sjsg 1000000, 1350000, 473c349dbc7Sjsg }; 474c349dbc7Sjsg static const int bxt_rates[] = { 475c349dbc7Sjsg 162000, 216000, 243000, 270000, 324000, 432000, 540000 476c349dbc7Sjsg }; 477c349dbc7Sjsg static const int skl_rates[] = { 478c349dbc7Sjsg 162000, 216000, 270000, 324000, 432000, 540000 479c349dbc7Sjsg }; 480c349dbc7Sjsg static const int hsw_rates[] = { 481c349dbc7Sjsg 162000, 270000, 540000 482c349dbc7Sjsg }; 483c349dbc7Sjsg static const int g4x_rates[] = { 484c349dbc7Sjsg 162000, 270000 485c349dbc7Sjsg }; 486c349dbc7Sjsg struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); 487c349dbc7Sjsg struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev); 488c349dbc7Sjsg const int *source_rates; 489c349dbc7Sjsg int size, max_rate = 0, vbt_max_rate; 490c349dbc7Sjsg 491c349dbc7Sjsg /* This should only be done once */ 492c349dbc7Sjsg drm_WARN_ON(&dev_priv->drm, 493c349dbc7Sjsg intel_dp->source_rates || intel_dp->num_source_rates); 494c349dbc7Sjsg 495f005ef32Sjsg if (DISPLAY_VER(dev_priv) >= 14) { 496f005ef32Sjsg source_rates = mtl_rates; 497f005ef32Sjsg size = ARRAY_SIZE(mtl_rates); 498f005ef32Sjsg max_rate = mtl_max_source_rate(intel_dp); 499f005ef32Sjsg } else if (DISPLAY_VER(dev_priv) >= 11) { 5005ca02815Sjsg source_rates = icl_rates; 5015ca02815Sjsg size = ARRAY_SIZE(icl_rates); 5021bb76ff1Sjsg if (IS_DG2(dev_priv)) 5031bb76ff1Sjsg max_rate = dg2_max_source_rate(intel_dp); 5041bb76ff1Sjsg else if (IS_ALDERLAKE_P(dev_priv) || IS_ALDERLAKE_S(dev_priv) || 5051bb76ff1Sjsg IS_DG1(dev_priv) || IS_ROCKETLAKE(dev_priv)) 5061bb76ff1Sjsg max_rate = 810000; 507f005ef32Sjsg else if (IS_JASPERLAKE(dev_priv) || IS_ELKHARTLAKE(dev_priv)) 5085ca02815Sjsg max_rate = ehl_max_source_rate(intel_dp); 509c349dbc7Sjsg else 510c349dbc7Sjsg max_rate = icl_max_source_rate(intel_dp); 5115ca02815Sjsg } else if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv)) { 512c349dbc7Sjsg source_rates = bxt_rates; 513c349dbc7Sjsg size = ARRAY_SIZE(bxt_rates); 5145ca02815Sjsg } else if (DISPLAY_VER(dev_priv) == 9) { 515c349dbc7Sjsg source_rates = skl_rates; 516c349dbc7Sjsg size = ARRAY_SIZE(skl_rates); 517f005ef32Sjsg } else if ((IS_HASWELL(dev_priv) && !IS_HASWELL_ULX(dev_priv)) || 518c349dbc7Sjsg IS_BROADWELL(dev_priv)) { 519c349dbc7Sjsg source_rates = hsw_rates; 520c349dbc7Sjsg size = ARRAY_SIZE(hsw_rates); 521c349dbc7Sjsg } else { 522c349dbc7Sjsg source_rates = g4x_rates; 523c349dbc7Sjsg size = ARRAY_SIZE(g4x_rates); 524c349dbc7Sjsg } 525c349dbc7Sjsg 5261bb76ff1Sjsg vbt_max_rate = vbt_max_link_rate(intel_dp); 527c349dbc7Sjsg if (max_rate && vbt_max_rate) 528c349dbc7Sjsg max_rate = min(max_rate, vbt_max_rate); 529c349dbc7Sjsg else if (vbt_max_rate) 530c349dbc7Sjsg max_rate = vbt_max_rate; 531c349dbc7Sjsg 532c349dbc7Sjsg if (max_rate) 533c349dbc7Sjsg size = intel_dp_rate_limit_len(source_rates, size, max_rate); 534c349dbc7Sjsg 535c349dbc7Sjsg intel_dp->source_rates = source_rates; 536c349dbc7Sjsg intel_dp->num_source_rates = size; 537c349dbc7Sjsg } 538c349dbc7Sjsg 539c349dbc7Sjsg static int intersect_rates(const int *source_rates, int source_len, 540c349dbc7Sjsg const int *sink_rates, int sink_len, 541c349dbc7Sjsg int *common_rates) 542c349dbc7Sjsg { 543c349dbc7Sjsg int i = 0, j = 0, k = 0; 544c349dbc7Sjsg 545c349dbc7Sjsg while (i < source_len && j < sink_len) { 546c349dbc7Sjsg if (source_rates[i] == sink_rates[j]) { 547c349dbc7Sjsg if (WARN_ON(k >= DP_MAX_SUPPORTED_RATES)) 548c349dbc7Sjsg return k; 549c349dbc7Sjsg common_rates[k] = source_rates[i]; 550c349dbc7Sjsg ++k; 551c349dbc7Sjsg ++i; 552c349dbc7Sjsg ++j; 553c349dbc7Sjsg } else if (source_rates[i] < sink_rates[j]) { 554c349dbc7Sjsg ++i; 555c349dbc7Sjsg } else { 556c349dbc7Sjsg ++j; 557c349dbc7Sjsg } 558c349dbc7Sjsg } 559c349dbc7Sjsg return k; 560c349dbc7Sjsg } 561c349dbc7Sjsg 562c349dbc7Sjsg /* return index of rate in rates array, or -1 if not found */ 563c349dbc7Sjsg static int intel_dp_rate_index(const int *rates, int len, int rate) 564c349dbc7Sjsg { 565c349dbc7Sjsg int i; 566c349dbc7Sjsg 567c349dbc7Sjsg for (i = 0; i < len; i++) 568c349dbc7Sjsg if (rate == rates[i]) 569c349dbc7Sjsg return i; 570c349dbc7Sjsg 571c349dbc7Sjsg return -1; 572c349dbc7Sjsg } 573c349dbc7Sjsg 574c349dbc7Sjsg static void intel_dp_set_common_rates(struct intel_dp *intel_dp) 575c349dbc7Sjsg { 576ad8b1aafSjsg struct drm_i915_private *i915 = dp_to_i915(intel_dp); 577ad8b1aafSjsg 578ad8b1aafSjsg drm_WARN_ON(&i915->drm, 579ad8b1aafSjsg !intel_dp->num_source_rates || !intel_dp->num_sink_rates); 580c349dbc7Sjsg 581c349dbc7Sjsg intel_dp->num_common_rates = intersect_rates(intel_dp->source_rates, 582c349dbc7Sjsg intel_dp->num_source_rates, 583c349dbc7Sjsg intel_dp->sink_rates, 584c349dbc7Sjsg intel_dp->num_sink_rates, 585c349dbc7Sjsg intel_dp->common_rates); 586c349dbc7Sjsg 587c349dbc7Sjsg /* Paranoia, there should always be something in common. */ 588ad8b1aafSjsg if (drm_WARN_ON(&i915->drm, intel_dp->num_common_rates == 0)) { 589c349dbc7Sjsg intel_dp->common_rates[0] = 162000; 590c349dbc7Sjsg intel_dp->num_common_rates = 1; 591c349dbc7Sjsg } 592c349dbc7Sjsg } 593c349dbc7Sjsg 594c349dbc7Sjsg static bool intel_dp_link_params_valid(struct intel_dp *intel_dp, int link_rate, 595c349dbc7Sjsg u8 lane_count) 596c349dbc7Sjsg { 597c349dbc7Sjsg /* 598c349dbc7Sjsg * FIXME: we need to synchronize the current link parameters with 599c349dbc7Sjsg * hardware readout. Currently fast link training doesn't work on 600c349dbc7Sjsg * boot-up. 601c349dbc7Sjsg */ 602c349dbc7Sjsg if (link_rate == 0 || 603c349dbc7Sjsg link_rate > intel_dp->max_link_rate) 604c349dbc7Sjsg return false; 605c349dbc7Sjsg 606c349dbc7Sjsg if (lane_count == 0 || 607c349dbc7Sjsg lane_count > intel_dp_max_lane_count(intel_dp)) 608c349dbc7Sjsg return false; 609c349dbc7Sjsg 610c349dbc7Sjsg return true; 611c349dbc7Sjsg } 612c349dbc7Sjsg 613c349dbc7Sjsg static bool intel_dp_can_link_train_fallback_for_edp(struct intel_dp *intel_dp, 614c349dbc7Sjsg int link_rate, 615c349dbc7Sjsg u8 lane_count) 616c349dbc7Sjsg { 6171bb76ff1Sjsg /* FIXME figure out what we actually want here */ 618c349dbc7Sjsg const struct drm_display_mode *fixed_mode = 6191bb76ff1Sjsg intel_panel_preferred_fixed_mode(intel_dp->attached_connector); 620c349dbc7Sjsg int mode_rate, max_rate; 621c349dbc7Sjsg 622c349dbc7Sjsg mode_rate = intel_dp_link_required(fixed_mode->clock, 18); 623c349dbc7Sjsg max_rate = intel_dp_max_data_rate(link_rate, lane_count); 624c349dbc7Sjsg if (mode_rate > max_rate) 625c349dbc7Sjsg return false; 626c349dbc7Sjsg 627c349dbc7Sjsg return true; 628c349dbc7Sjsg } 629c349dbc7Sjsg 630c349dbc7Sjsg int intel_dp_get_link_train_fallback_values(struct intel_dp *intel_dp, 631c349dbc7Sjsg int link_rate, u8 lane_count) 632c349dbc7Sjsg { 633ad8b1aafSjsg struct drm_i915_private *i915 = dp_to_i915(intel_dp); 634c349dbc7Sjsg int index; 635c349dbc7Sjsg 636ad8b1aafSjsg /* 637ad8b1aafSjsg * TODO: Enable fallback on MST links once MST link compute can handle 638ad8b1aafSjsg * the fallback params. 639ad8b1aafSjsg */ 640ad8b1aafSjsg if (intel_dp->is_mst) { 641ad8b1aafSjsg drm_err(&i915->drm, "Link Training Unsuccessful\n"); 642ad8b1aafSjsg return -1; 643ad8b1aafSjsg } 644ad8b1aafSjsg 6455ca02815Sjsg if (intel_dp_is_edp(intel_dp) && !intel_dp->use_max_params) { 6465ca02815Sjsg drm_dbg_kms(&i915->drm, 6475ca02815Sjsg "Retrying Link training for eDP with max parameters\n"); 6485ca02815Sjsg intel_dp->use_max_params = true; 6495ca02815Sjsg return 0; 6505ca02815Sjsg } 6515ca02815Sjsg 652c349dbc7Sjsg index = intel_dp_rate_index(intel_dp->common_rates, 653c349dbc7Sjsg intel_dp->num_common_rates, 654c349dbc7Sjsg link_rate); 655c349dbc7Sjsg if (index > 0) { 656c349dbc7Sjsg if (intel_dp_is_edp(intel_dp) && 657c349dbc7Sjsg !intel_dp_can_link_train_fallback_for_edp(intel_dp, 6581bb76ff1Sjsg intel_dp_common_rate(intel_dp, index - 1), 659c349dbc7Sjsg lane_count)) { 660ad8b1aafSjsg drm_dbg_kms(&i915->drm, 661ad8b1aafSjsg "Retrying Link training for eDP with same parameters\n"); 662c349dbc7Sjsg return 0; 663c349dbc7Sjsg } 6641bb76ff1Sjsg intel_dp->max_link_rate = intel_dp_common_rate(intel_dp, index - 1); 665c349dbc7Sjsg intel_dp->max_link_lane_count = lane_count; 666c349dbc7Sjsg } else if (lane_count > 1) { 667c349dbc7Sjsg if (intel_dp_is_edp(intel_dp) && 668c349dbc7Sjsg !intel_dp_can_link_train_fallback_for_edp(intel_dp, 669c349dbc7Sjsg intel_dp_max_common_rate(intel_dp), 670c349dbc7Sjsg lane_count >> 1)) { 671ad8b1aafSjsg drm_dbg_kms(&i915->drm, 672ad8b1aafSjsg "Retrying Link training for eDP with same parameters\n"); 673c349dbc7Sjsg return 0; 674c349dbc7Sjsg } 675c349dbc7Sjsg intel_dp->max_link_rate = intel_dp_max_common_rate(intel_dp); 676c349dbc7Sjsg intel_dp->max_link_lane_count = lane_count >> 1; 677c349dbc7Sjsg } else { 678ad8b1aafSjsg drm_err(&i915->drm, "Link Training Unsuccessful\n"); 679c349dbc7Sjsg return -1; 680c349dbc7Sjsg } 681c349dbc7Sjsg 682c349dbc7Sjsg return 0; 683c349dbc7Sjsg } 684c349dbc7Sjsg 685c349dbc7Sjsg u32 intel_dp_mode_to_fec_clock(u32 mode_clock) 686c349dbc7Sjsg { 687c349dbc7Sjsg return div_u64(mul_u32_u32(mode_clock, 1000000U), 688c349dbc7Sjsg DP_DSC_FEC_OVERHEAD_FACTOR); 689c349dbc7Sjsg } 690c349dbc7Sjsg 691c349dbc7Sjsg static int 692c349dbc7Sjsg small_joiner_ram_size_bits(struct drm_i915_private *i915) 693c349dbc7Sjsg { 6941bb76ff1Sjsg if (DISPLAY_VER(i915) >= 13) 6951bb76ff1Sjsg return 17280 * 8; 6961bb76ff1Sjsg else if (DISPLAY_VER(i915) >= 11) 697c349dbc7Sjsg return 7680 * 8; 698c349dbc7Sjsg else 699c349dbc7Sjsg return 6144 * 8; 700c349dbc7Sjsg } 701c349dbc7Sjsg 702f005ef32Sjsg u32 intel_dp_dsc_nearest_valid_bpp(struct drm_i915_private *i915, u32 bpp, u32 pipe_bpp) 703f005ef32Sjsg { 704f005ef32Sjsg u32 bits_per_pixel = bpp; 705f005ef32Sjsg int i; 706f005ef32Sjsg 707f005ef32Sjsg /* Error out if the max bpp is less than smallest allowed valid bpp */ 708f005ef32Sjsg if (bits_per_pixel < valid_dsc_bpp[0]) { 709f005ef32Sjsg drm_dbg_kms(&i915->drm, "Unsupported BPP %u, min %u\n", 710f005ef32Sjsg bits_per_pixel, valid_dsc_bpp[0]); 711f005ef32Sjsg return 0; 712f005ef32Sjsg } 713f005ef32Sjsg 714f005ef32Sjsg /* From XE_LPD onwards we support from bpc upto uncompressed bpp-1 BPPs */ 715f005ef32Sjsg if (DISPLAY_VER(i915) >= 13) { 716f005ef32Sjsg bits_per_pixel = min(bits_per_pixel, pipe_bpp - 1); 717f005ef32Sjsg 718f005ef32Sjsg /* 719f005ef32Sjsg * According to BSpec, 27 is the max DSC output bpp, 720f005ef32Sjsg * 8 is the min DSC output bpp. 721f005ef32Sjsg * While we can still clamp higher bpp values to 27, saving bandwidth, 722f005ef32Sjsg * if it is required to oompress up to bpp < 8, means we can't do 723f005ef32Sjsg * that and probably means we can't fit the required mode, even with 724f005ef32Sjsg * DSC enabled. 725f005ef32Sjsg */ 726f005ef32Sjsg if (bits_per_pixel < 8) { 727f005ef32Sjsg drm_dbg_kms(&i915->drm, "Unsupported BPP %u, min 8\n", 728f005ef32Sjsg bits_per_pixel); 729f005ef32Sjsg return 0; 730f005ef32Sjsg } 731f005ef32Sjsg bits_per_pixel = min_t(u32, bits_per_pixel, 27); 732f005ef32Sjsg } else { 733f005ef32Sjsg /* Find the nearest match in the array of known BPPs from VESA */ 734f005ef32Sjsg for (i = 0; i < ARRAY_SIZE(valid_dsc_bpp) - 1; i++) { 735f005ef32Sjsg if (bits_per_pixel < valid_dsc_bpp[i + 1]) 736f005ef32Sjsg break; 737f005ef32Sjsg } 738f005ef32Sjsg drm_dbg_kms(&i915->drm, "Set dsc bpp from %d to VESA %d\n", 739f005ef32Sjsg bits_per_pixel, valid_dsc_bpp[i]); 740f005ef32Sjsg 741f005ef32Sjsg bits_per_pixel = valid_dsc_bpp[i]; 742f005ef32Sjsg } 743f005ef32Sjsg 744f005ef32Sjsg return bits_per_pixel; 745f005ef32Sjsg } 746f005ef32Sjsg 747f005ef32Sjsg u16 intel_dp_dsc_get_output_bpp(struct drm_i915_private *i915, 748c349dbc7Sjsg u32 link_clock, u32 lane_count, 7495ca02815Sjsg u32 mode_clock, u32 mode_hdisplay, 7505ca02815Sjsg bool bigjoiner, 751f005ef32Sjsg u32 pipe_bpp, 752f005ef32Sjsg u32 timeslots) 753c349dbc7Sjsg { 754c349dbc7Sjsg u32 bits_per_pixel, max_bpp_small_joiner_ram; 755c349dbc7Sjsg 756c349dbc7Sjsg /* 757c349dbc7Sjsg * Available Link Bandwidth(Kbits/sec) = (NumberOfLanes)* 758f005ef32Sjsg * (LinkSymbolClock)* 8 * (TimeSlots / 64) 759f005ef32Sjsg * for SST -> TimeSlots is 64(i.e all TimeSlots that are available) 760f005ef32Sjsg * for MST -> TimeSlots has to be calculated, based on mode requirements 761f005ef32Sjsg * 762f005ef32Sjsg * Due to FEC overhead, the available bw is reduced to 97.2261%. 763f005ef32Sjsg * To support the given mode: 764f005ef32Sjsg * Bandwidth required should be <= Available link Bandwidth * FEC Overhead 765f005ef32Sjsg * =>ModeClock * bits_per_pixel <= Available Link Bandwidth * FEC Overhead 766f005ef32Sjsg * =>bits_per_pixel <= Available link Bandwidth * FEC Overhead / ModeClock 767f005ef32Sjsg * =>bits_per_pixel <= (NumberOfLanes * LinkSymbolClock) * 8 (TimeSlots / 64) / 768f005ef32Sjsg * (ModeClock / FEC Overhead) 769f005ef32Sjsg * =>bits_per_pixel <= (NumberOfLanes * LinkSymbolClock * TimeSlots) / 770f005ef32Sjsg * (ModeClock / FEC Overhead * 8) 771c349dbc7Sjsg */ 772f005ef32Sjsg bits_per_pixel = ((link_clock * lane_count) * timeslots) / 773f005ef32Sjsg (intel_dp_mode_to_fec_clock(mode_clock) * 8); 774f005ef32Sjsg 775f005ef32Sjsg drm_dbg_kms(&i915->drm, "Max link bpp is %u for %u timeslots " 776f005ef32Sjsg "total bw %u pixel clock %u\n", 777f005ef32Sjsg bits_per_pixel, timeslots, 778f005ef32Sjsg (link_clock * lane_count * 8), 779f005ef32Sjsg intel_dp_mode_to_fec_clock(mode_clock)); 780c349dbc7Sjsg 781c349dbc7Sjsg /* Small Joiner Check: output bpp <= joiner RAM (bits) / Horiz. width */ 782c349dbc7Sjsg max_bpp_small_joiner_ram = small_joiner_ram_size_bits(i915) / 783c349dbc7Sjsg mode_hdisplay; 7845ca02815Sjsg 7855ca02815Sjsg if (bigjoiner) 7865ca02815Sjsg max_bpp_small_joiner_ram *= 2; 7875ca02815Sjsg 788c349dbc7Sjsg /* 789c349dbc7Sjsg * Greatest allowed DSC BPP = MIN (output BPP from available Link BW 790c349dbc7Sjsg * check, output bpp from small joiner RAM check) 791c349dbc7Sjsg */ 792c349dbc7Sjsg bits_per_pixel = min(bits_per_pixel, max_bpp_small_joiner_ram); 793c349dbc7Sjsg 7945ca02815Sjsg if (bigjoiner) { 7955ca02815Sjsg u32 max_bpp_bigjoiner = 7961bb76ff1Sjsg i915->display.cdclk.max_cdclk_freq * 48 / 7975ca02815Sjsg intel_dp_mode_to_fec_clock(mode_clock); 7985ca02815Sjsg 7995ca02815Sjsg bits_per_pixel = min(bits_per_pixel, max_bpp_bigjoiner); 8005ca02815Sjsg } 8015ca02815Sjsg 802f005ef32Sjsg bits_per_pixel = intel_dp_dsc_nearest_valid_bpp(i915, bits_per_pixel, pipe_bpp); 803c349dbc7Sjsg 804c349dbc7Sjsg /* 805c349dbc7Sjsg * Compressed BPP in U6.4 format so multiply by 16, for Gen 11, 806c349dbc7Sjsg * fractional part is 0 807c349dbc7Sjsg */ 808c349dbc7Sjsg return bits_per_pixel << 4; 809c349dbc7Sjsg } 810c349dbc7Sjsg 811f005ef32Sjsg u8 intel_dp_dsc_get_slice_count(struct intel_dp *intel_dp, 8125ca02815Sjsg int mode_clock, int mode_hdisplay, 8135ca02815Sjsg bool bigjoiner) 814c349dbc7Sjsg { 815ad8b1aafSjsg struct drm_i915_private *i915 = dp_to_i915(intel_dp); 816c349dbc7Sjsg u8 min_slice_count, i; 817c349dbc7Sjsg int max_slice_width; 818c349dbc7Sjsg 819c349dbc7Sjsg if (mode_clock <= DP_DSC_PEAK_PIXEL_RATE) 820c349dbc7Sjsg min_slice_count = DIV_ROUND_UP(mode_clock, 821c349dbc7Sjsg DP_DSC_MAX_ENC_THROUGHPUT_0); 822c349dbc7Sjsg else 823c349dbc7Sjsg min_slice_count = DIV_ROUND_UP(mode_clock, 824c349dbc7Sjsg DP_DSC_MAX_ENC_THROUGHPUT_1); 825c349dbc7Sjsg 826f005ef32Sjsg /* 827f005ef32Sjsg * Due to some DSC engine BW limitations, we need to enable second 828f005ef32Sjsg * slice and VDSC engine, whenever we approach close enough to max CDCLK 829f005ef32Sjsg */ 830f005ef32Sjsg if (mode_clock >= ((i915->display.cdclk.max_cdclk_freq * 85) / 100)) 831f005ef32Sjsg min_slice_count = max_t(u8, min_slice_count, 2); 832f005ef32Sjsg 833c349dbc7Sjsg max_slice_width = drm_dp_dsc_sink_max_slice_width(intel_dp->dsc_dpcd); 834c349dbc7Sjsg if (max_slice_width < DP_DSC_MIN_SLICE_WIDTH_VALUE) { 835ad8b1aafSjsg drm_dbg_kms(&i915->drm, 836ad8b1aafSjsg "Unsupported slice width %d by DP DSC Sink device\n", 837c349dbc7Sjsg max_slice_width); 838c349dbc7Sjsg return 0; 839c349dbc7Sjsg } 840c349dbc7Sjsg /* Also take into account max slice width */ 841ad8b1aafSjsg min_slice_count = max_t(u8, min_slice_count, 842c349dbc7Sjsg DIV_ROUND_UP(mode_hdisplay, 843c349dbc7Sjsg max_slice_width)); 844c349dbc7Sjsg 845c349dbc7Sjsg /* Find the closest match to the valid slice count values */ 846c349dbc7Sjsg for (i = 0; i < ARRAY_SIZE(valid_dsc_slicecount); i++) { 8475ca02815Sjsg u8 test_slice_count = valid_dsc_slicecount[i] << bigjoiner; 8485ca02815Sjsg 8495ca02815Sjsg if (test_slice_count > 8505ca02815Sjsg drm_dp_dsc_sink_max_slice_count(intel_dp->dsc_dpcd, false)) 851c349dbc7Sjsg break; 8525ca02815Sjsg 8535ca02815Sjsg /* big joiner needs small joiner to be enabled */ 8545ca02815Sjsg if (bigjoiner && test_slice_count < 4) 8555ca02815Sjsg continue; 8565ca02815Sjsg 8575ca02815Sjsg if (min_slice_count <= test_slice_count) 8585ca02815Sjsg return test_slice_count; 859c349dbc7Sjsg } 860c349dbc7Sjsg 861ad8b1aafSjsg drm_dbg_kms(&i915->drm, "Unsupported Slice Count %d\n", 862ad8b1aafSjsg min_slice_count); 863c349dbc7Sjsg return 0; 864c349dbc7Sjsg } 865c349dbc7Sjsg 866f005ef32Sjsg static bool source_can_output(struct intel_dp *intel_dp, 867f005ef32Sjsg enum intel_output_format format) 868f005ef32Sjsg { 869f005ef32Sjsg struct drm_i915_private *i915 = dp_to_i915(intel_dp); 870f005ef32Sjsg 871f005ef32Sjsg switch (format) { 872f005ef32Sjsg case INTEL_OUTPUT_FORMAT_RGB: 873f005ef32Sjsg return true; 874f005ef32Sjsg 875f005ef32Sjsg case INTEL_OUTPUT_FORMAT_YCBCR444: 876f005ef32Sjsg /* 877f005ef32Sjsg * No YCbCr output support on gmch platforms. 878f005ef32Sjsg * Also, ILK doesn't seem capable of DP YCbCr output. 879f005ef32Sjsg * The displayed image is severly corrupted. SNB+ is fine. 880f005ef32Sjsg */ 881f005ef32Sjsg return !HAS_GMCH(i915) && !IS_IRONLAKE(i915); 882f005ef32Sjsg 883f005ef32Sjsg case INTEL_OUTPUT_FORMAT_YCBCR420: 884f005ef32Sjsg /* Platform < Gen 11 cannot output YCbCr420 format */ 885f005ef32Sjsg return DISPLAY_VER(i915) >= 11; 886f005ef32Sjsg 887f005ef32Sjsg default: 888f005ef32Sjsg MISSING_CASE(format); 889f005ef32Sjsg return false; 890f005ef32Sjsg } 891f005ef32Sjsg } 892f005ef32Sjsg 893f005ef32Sjsg static bool 894f005ef32Sjsg dfp_can_convert_from_rgb(struct intel_dp *intel_dp, 895f005ef32Sjsg enum intel_output_format sink_format) 896f005ef32Sjsg { 897f005ef32Sjsg if (!drm_dp_is_branch(intel_dp->dpcd)) 898f005ef32Sjsg return false; 899f005ef32Sjsg 900f005ef32Sjsg if (sink_format == INTEL_OUTPUT_FORMAT_YCBCR444) 901f005ef32Sjsg return intel_dp->dfp.rgb_to_ycbcr; 902f005ef32Sjsg 903f005ef32Sjsg if (sink_format == INTEL_OUTPUT_FORMAT_YCBCR420) 904f005ef32Sjsg return intel_dp->dfp.rgb_to_ycbcr && 905f005ef32Sjsg intel_dp->dfp.ycbcr_444_to_420; 906f005ef32Sjsg 907f005ef32Sjsg return false; 908f005ef32Sjsg } 909f005ef32Sjsg 910f005ef32Sjsg static bool 911f005ef32Sjsg dfp_can_convert_from_ycbcr444(struct intel_dp *intel_dp, 912f005ef32Sjsg enum intel_output_format sink_format) 913f005ef32Sjsg { 914f005ef32Sjsg if (!drm_dp_is_branch(intel_dp->dpcd)) 915f005ef32Sjsg return false; 916f005ef32Sjsg 917f005ef32Sjsg if (sink_format == INTEL_OUTPUT_FORMAT_YCBCR420) 918f005ef32Sjsg return intel_dp->dfp.ycbcr_444_to_420; 919f005ef32Sjsg 920f005ef32Sjsg return false; 921f005ef32Sjsg } 922f005ef32Sjsg 9235ca02815Sjsg static enum intel_output_format 9241bb76ff1Sjsg intel_dp_output_format(struct intel_connector *connector, 925f005ef32Sjsg enum intel_output_format sink_format) 9265ca02815Sjsg { 9271bb76ff1Sjsg struct intel_dp *intel_dp = intel_attached_dp(connector); 928f005ef32Sjsg struct drm_i915_private *i915 = dp_to_i915(intel_dp); 929f005ef32Sjsg enum intel_output_format output_format; 9305ca02815Sjsg 931f005ef32Sjsg if (intel_dp->force_dsc_output_format) 932f005ef32Sjsg return intel_dp->force_dsc_output_format; 9335ca02815Sjsg 934f005ef32Sjsg if (sink_format == INTEL_OUTPUT_FORMAT_RGB || 935f005ef32Sjsg dfp_can_convert_from_rgb(intel_dp, sink_format)) 936f005ef32Sjsg output_format = INTEL_OUTPUT_FORMAT_RGB; 9375ca02815Sjsg 938f005ef32Sjsg else if (sink_format == INTEL_OUTPUT_FORMAT_YCBCR444 || 939f005ef32Sjsg dfp_can_convert_from_ycbcr444(intel_dp, sink_format)) 940f005ef32Sjsg output_format = INTEL_OUTPUT_FORMAT_YCBCR444; 941f005ef32Sjsg 9425ca02815Sjsg else 943f005ef32Sjsg output_format = INTEL_OUTPUT_FORMAT_YCBCR420; 944f005ef32Sjsg 945f005ef32Sjsg drm_WARN_ON(&i915->drm, !source_can_output(intel_dp, output_format)); 946f005ef32Sjsg 947f005ef32Sjsg return output_format; 9485ca02815Sjsg } 9495ca02815Sjsg 9505ca02815Sjsg int intel_dp_min_bpp(enum intel_output_format output_format) 9515ca02815Sjsg { 9525ca02815Sjsg if (output_format == INTEL_OUTPUT_FORMAT_RGB) 9535ca02815Sjsg return 6 * 3; 9545ca02815Sjsg else 9555ca02815Sjsg return 8 * 3; 9565ca02815Sjsg } 9575ca02815Sjsg 9585ca02815Sjsg static int intel_dp_output_bpp(enum intel_output_format output_format, int bpp) 9595ca02815Sjsg { 9605ca02815Sjsg /* 9615ca02815Sjsg * bpp value was assumed to RGB format. And YCbCr 4:2:0 output 9625ca02815Sjsg * format of the number of bytes per pixel will be half the number 9635ca02815Sjsg * of bytes of RGB pixel. 9645ca02815Sjsg */ 9655ca02815Sjsg if (output_format == INTEL_OUTPUT_FORMAT_YCBCR420) 9665ca02815Sjsg bpp /= 2; 9675ca02815Sjsg 9685ca02815Sjsg return bpp; 9695ca02815Sjsg } 9705ca02815Sjsg 971f005ef32Sjsg static enum intel_output_format 972f005ef32Sjsg intel_dp_sink_format(struct intel_connector *connector, 973f005ef32Sjsg const struct drm_display_mode *mode) 974f005ef32Sjsg { 975f005ef32Sjsg const struct drm_display_info *info = &connector->base.display_info; 976f005ef32Sjsg 977f005ef32Sjsg if (drm_mode_is_420_only(info, mode)) 978f005ef32Sjsg return INTEL_OUTPUT_FORMAT_YCBCR420; 979f005ef32Sjsg 980f005ef32Sjsg return INTEL_OUTPUT_FORMAT_RGB; 981f005ef32Sjsg } 982f005ef32Sjsg 9835ca02815Sjsg static int 9841bb76ff1Sjsg intel_dp_mode_min_output_bpp(struct intel_connector *connector, 9855ca02815Sjsg const struct drm_display_mode *mode) 9865ca02815Sjsg { 987f005ef32Sjsg enum intel_output_format output_format, sink_format; 988f005ef32Sjsg 989f005ef32Sjsg sink_format = intel_dp_sink_format(connector, mode); 990f005ef32Sjsg 991f005ef32Sjsg output_format = intel_dp_output_format(connector, sink_format); 9925ca02815Sjsg 9935ca02815Sjsg return intel_dp_output_bpp(output_format, intel_dp_min_bpp(output_format)); 9945ca02815Sjsg } 9955ca02815Sjsg 996c349dbc7Sjsg static bool intel_dp_hdisplay_bad(struct drm_i915_private *dev_priv, 997c349dbc7Sjsg int hdisplay) 998c349dbc7Sjsg { 999c349dbc7Sjsg /* 1000c349dbc7Sjsg * Older platforms don't like hdisplay==4096 with DP. 1001c349dbc7Sjsg * 1002c349dbc7Sjsg * On ILK/SNB/IVB the pipe seems to be somewhat running (scanline 1003c349dbc7Sjsg * and frame counter increment), but we don't get vblank interrupts, 1004c349dbc7Sjsg * and the pipe underruns immediately. The link also doesn't seem 1005c349dbc7Sjsg * to get trained properly. 1006c349dbc7Sjsg * 1007c349dbc7Sjsg * On CHV the vblank interrupts don't seem to disappear but 1008c349dbc7Sjsg * otherwise the symptoms are similar. 1009c349dbc7Sjsg * 1010c349dbc7Sjsg * TODO: confirm the behaviour on HSW+ 1011c349dbc7Sjsg */ 1012c349dbc7Sjsg return hdisplay == 4096 && !HAS_DDI(dev_priv); 1013c349dbc7Sjsg } 1014c349dbc7Sjsg 10151bb76ff1Sjsg static int intel_dp_max_tmds_clock(struct intel_dp *intel_dp) 10161bb76ff1Sjsg { 10171bb76ff1Sjsg struct intel_connector *connector = intel_dp->attached_connector; 10181bb76ff1Sjsg const struct drm_display_info *info = &connector->base.display_info; 10191bb76ff1Sjsg int max_tmds_clock = intel_dp->dfp.max_tmds_clock; 10201bb76ff1Sjsg 10211bb76ff1Sjsg /* Only consider the sink's max TMDS clock if we know this is a HDMI DFP */ 10221bb76ff1Sjsg if (max_tmds_clock && info->max_tmds_clock) 10231bb76ff1Sjsg max_tmds_clock = min(max_tmds_clock, info->max_tmds_clock); 10241bb76ff1Sjsg 10251bb76ff1Sjsg return max_tmds_clock; 10261bb76ff1Sjsg } 10271bb76ff1Sjsg 10281bb76ff1Sjsg static enum drm_mode_status 10291bb76ff1Sjsg intel_dp_tmds_clock_valid(struct intel_dp *intel_dp, 1030f005ef32Sjsg int clock, int bpc, 1031f005ef32Sjsg enum intel_output_format sink_format, 10321bb76ff1Sjsg bool respect_downstream_limits) 10331bb76ff1Sjsg { 10341bb76ff1Sjsg int tmds_clock, min_tmds_clock, max_tmds_clock; 10351bb76ff1Sjsg 10361bb76ff1Sjsg if (!respect_downstream_limits) 10371bb76ff1Sjsg return MODE_OK; 10381bb76ff1Sjsg 1039f005ef32Sjsg tmds_clock = intel_hdmi_tmds_clock(clock, bpc, sink_format); 10401bb76ff1Sjsg 10411bb76ff1Sjsg min_tmds_clock = intel_dp->dfp.min_tmds_clock; 10421bb76ff1Sjsg max_tmds_clock = intel_dp_max_tmds_clock(intel_dp); 10431bb76ff1Sjsg 10441bb76ff1Sjsg if (min_tmds_clock && tmds_clock < min_tmds_clock) 10451bb76ff1Sjsg return MODE_CLOCK_LOW; 10461bb76ff1Sjsg 10471bb76ff1Sjsg if (max_tmds_clock && tmds_clock > max_tmds_clock) 10481bb76ff1Sjsg return MODE_CLOCK_HIGH; 10491bb76ff1Sjsg 10501bb76ff1Sjsg return MODE_OK; 10511bb76ff1Sjsg } 10521bb76ff1Sjsg 1053c349dbc7Sjsg static enum drm_mode_status 1054ad8b1aafSjsg intel_dp_mode_valid_downstream(struct intel_connector *connector, 1055ad8b1aafSjsg const struct drm_display_mode *mode, 1056ad8b1aafSjsg int target_clock) 1057ad8b1aafSjsg { 1058ad8b1aafSjsg struct intel_dp *intel_dp = intel_attached_dp(connector); 1059ad8b1aafSjsg const struct drm_display_info *info = &connector->base.display_info; 10601bb76ff1Sjsg enum drm_mode_status status; 1061f005ef32Sjsg enum intel_output_format sink_format; 1062ad8b1aafSjsg 10635ca02815Sjsg /* If PCON supports FRL MODE, check FRL bandwidth constraints */ 10645ca02815Sjsg if (intel_dp->dfp.pcon_max_frl_bw) { 10655ca02815Sjsg int target_bw; 10665ca02815Sjsg int max_frl_bw; 10671bb76ff1Sjsg int bpp = intel_dp_mode_min_output_bpp(connector, mode); 10685ca02815Sjsg 10695ca02815Sjsg target_bw = bpp * target_clock; 10705ca02815Sjsg 10715ca02815Sjsg max_frl_bw = intel_dp->dfp.pcon_max_frl_bw; 10725ca02815Sjsg 10735ca02815Sjsg /* converting bw from Gbps to Kbps*/ 10745ca02815Sjsg max_frl_bw = max_frl_bw * 1000000; 10755ca02815Sjsg 10765ca02815Sjsg if (target_bw > max_frl_bw) 10775ca02815Sjsg return MODE_CLOCK_HIGH; 10785ca02815Sjsg 10795ca02815Sjsg return MODE_OK; 10805ca02815Sjsg } 10815ca02815Sjsg 1082ad8b1aafSjsg if (intel_dp->dfp.max_dotclock && 1083ad8b1aafSjsg target_clock > intel_dp->dfp.max_dotclock) 1084ad8b1aafSjsg return MODE_CLOCK_HIGH; 1085ad8b1aafSjsg 1086f005ef32Sjsg sink_format = intel_dp_sink_format(connector, mode); 1087ad8b1aafSjsg 10881bb76ff1Sjsg /* Assume 8bpc for the DP++/HDMI/DVI TMDS clock check */ 10891bb76ff1Sjsg status = intel_dp_tmds_clock_valid(intel_dp, target_clock, 1090f005ef32Sjsg 8, sink_format, true); 10911bb76ff1Sjsg 10921bb76ff1Sjsg if (status != MODE_OK) { 1093f005ef32Sjsg if (sink_format == INTEL_OUTPUT_FORMAT_YCBCR420 || 10941bb76ff1Sjsg !connector->base.ycbcr_420_allowed || 10951bb76ff1Sjsg !drm_mode_is_420_also(info, mode)) 10961bb76ff1Sjsg return status; 1097f005ef32Sjsg sink_format = INTEL_OUTPUT_FORMAT_YCBCR420; 10981bb76ff1Sjsg status = intel_dp_tmds_clock_valid(intel_dp, target_clock, 1099f005ef32Sjsg 8, sink_format, true); 11001bb76ff1Sjsg if (status != MODE_OK) 11011bb76ff1Sjsg return status; 11021bb76ff1Sjsg } 1103ad8b1aafSjsg 1104ad8b1aafSjsg return MODE_OK; 1105ad8b1aafSjsg } 1106ad8b1aafSjsg 1107f005ef32Sjsg bool intel_dp_need_bigjoiner(struct intel_dp *intel_dp, 11081bb76ff1Sjsg int hdisplay, int clock) 11091bb76ff1Sjsg { 11101bb76ff1Sjsg struct drm_i915_private *i915 = dp_to_i915(intel_dp); 11111bb76ff1Sjsg 11121bb76ff1Sjsg if (!intel_dp_can_bigjoiner(intel_dp)) 11131bb76ff1Sjsg return false; 11141bb76ff1Sjsg 11151bb76ff1Sjsg return clock > i915->max_dotclk_freq || hdisplay > 5120; 11161bb76ff1Sjsg } 11171bb76ff1Sjsg 1118ad8b1aafSjsg static enum drm_mode_status 11191bb76ff1Sjsg intel_dp_mode_valid(struct drm_connector *_connector, 1120c349dbc7Sjsg struct drm_display_mode *mode) 1121c349dbc7Sjsg { 11221bb76ff1Sjsg struct intel_connector *connector = to_intel_connector(_connector); 11231bb76ff1Sjsg struct intel_dp *intel_dp = intel_attached_dp(connector); 11241bb76ff1Sjsg struct drm_i915_private *dev_priv = to_i915(connector->base.dev); 11251bb76ff1Sjsg const struct drm_display_mode *fixed_mode; 1126c349dbc7Sjsg int target_clock = mode->clock; 1127c349dbc7Sjsg int max_rate, mode_rate, max_lanes, max_link_clock; 1128ad8b1aafSjsg int max_dotclk = dev_priv->max_dotclk_freq; 1129c349dbc7Sjsg u16 dsc_max_output_bpp = 0; 1130c349dbc7Sjsg u8 dsc_slice_count = 0; 1131ad8b1aafSjsg enum drm_mode_status status; 11325ca02815Sjsg bool dsc = false, bigjoiner = false; 1133c349dbc7Sjsg 11342bd53da4Sjsg status = intel_cpu_transcoder_mode_valid(dev_priv, mode); 11352bd53da4Sjsg if (status != MODE_OK) 11362bd53da4Sjsg return status; 11372bd53da4Sjsg 11385ca02815Sjsg if (mode->flags & DRM_MODE_FLAG_DBLCLK) 11395ca02815Sjsg return MODE_H_ILLEGAL; 11405ca02815Sjsg 11411bb76ff1Sjsg fixed_mode = intel_panel_fixed_mode(connector, mode); 1142c349dbc7Sjsg if (intel_dp_is_edp(intel_dp) && fixed_mode) { 11431bb76ff1Sjsg status = intel_panel_mode_valid(connector, mode); 11441bb76ff1Sjsg if (status != MODE_OK) 11451bb76ff1Sjsg return status; 1146c349dbc7Sjsg 1147c349dbc7Sjsg target_clock = fixed_mode->clock; 1148c349dbc7Sjsg } 1149c349dbc7Sjsg 11505ca02815Sjsg if (mode->clock < 10000) 11515ca02815Sjsg return MODE_CLOCK_LOW; 11525ca02815Sjsg 11531bb76ff1Sjsg if (intel_dp_need_bigjoiner(intel_dp, mode->hdisplay, target_clock)) { 11545ca02815Sjsg bigjoiner = true; 11555ca02815Sjsg max_dotclk *= 2; 11565ca02815Sjsg } 11575ca02815Sjsg if (target_clock > max_dotclk) 11585ca02815Sjsg return MODE_CLOCK_HIGH; 11595ca02815Sjsg 1160f005ef32Sjsg if (intel_dp_hdisplay_bad(dev_priv, mode->hdisplay)) 1161f005ef32Sjsg return MODE_H_ILLEGAL; 1162f005ef32Sjsg 1163c349dbc7Sjsg max_link_clock = intel_dp_max_link_rate(intel_dp); 1164c349dbc7Sjsg max_lanes = intel_dp_max_lane_count(intel_dp); 1165c349dbc7Sjsg 1166c349dbc7Sjsg max_rate = intel_dp_max_data_rate(max_link_clock, max_lanes); 11675ca02815Sjsg mode_rate = intel_dp_link_required(target_clock, 11685ca02815Sjsg intel_dp_mode_min_output_bpp(connector, mode)); 1169c349dbc7Sjsg 1170f005ef32Sjsg if (HAS_DSC(dev_priv) && 1171c349dbc7Sjsg drm_dp_sink_supports_dsc(intel_dp->dsc_dpcd)) { 11725ca02815Sjsg /* 11735ca02815Sjsg * TBD pass the connector BPC, 11745ca02815Sjsg * for now U8_MAX so that max BPC on that platform would be picked 11755ca02815Sjsg */ 11765ca02815Sjsg int pipe_bpp = intel_dp_dsc_compute_bpp(intel_dp, U8_MAX); 11775ca02815Sjsg 1178f005ef32Sjsg /* 1179f005ef32Sjsg * Output bpp is stored in 6.4 format so right shift by 4 to get the 1180f005ef32Sjsg * integer value since we support only integer values of bpp. 1181f005ef32Sjsg */ 1182c349dbc7Sjsg if (intel_dp_is_edp(intel_dp)) { 1183c349dbc7Sjsg dsc_max_output_bpp = 1184c349dbc7Sjsg drm_edp_dsc_sink_output_bpp(intel_dp->dsc_dpcd) >> 4; 1185c349dbc7Sjsg dsc_slice_count = 1186c349dbc7Sjsg drm_dp_dsc_sink_max_slice_count(intel_dp->dsc_dpcd, 1187c349dbc7Sjsg true); 1188c349dbc7Sjsg } else if (drm_dp_sink_supports_fec(intel_dp->fec_capable)) { 1189c349dbc7Sjsg dsc_max_output_bpp = 1190c349dbc7Sjsg intel_dp_dsc_get_output_bpp(dev_priv, 1191c349dbc7Sjsg max_link_clock, 1192c349dbc7Sjsg max_lanes, 1193c349dbc7Sjsg target_clock, 11945ca02815Sjsg mode->hdisplay, 11955ca02815Sjsg bigjoiner, 1196f005ef32Sjsg pipe_bpp, 64) >> 4; 1197c349dbc7Sjsg dsc_slice_count = 1198c349dbc7Sjsg intel_dp_dsc_get_slice_count(intel_dp, 1199c349dbc7Sjsg target_clock, 12005ca02815Sjsg mode->hdisplay, 12015ca02815Sjsg bigjoiner); 1202c349dbc7Sjsg } 1203c349dbc7Sjsg 12045ca02815Sjsg dsc = dsc_max_output_bpp && dsc_slice_count; 12055ca02815Sjsg } 12065ca02815Sjsg 12075ca02815Sjsg /* 12085ca02815Sjsg * Big joiner configuration needs DSC for TGL which is not true for 12095ca02815Sjsg * XE_LPD where uncompressed joiner is supported. 12105ca02815Sjsg */ 12115ca02815Sjsg if (DISPLAY_VER(dev_priv) < 13 && bigjoiner && !dsc) 1212c349dbc7Sjsg return MODE_CLOCK_HIGH; 1213c349dbc7Sjsg 12145ca02815Sjsg if (mode_rate > max_rate && !dsc) 12155ca02815Sjsg return MODE_CLOCK_HIGH; 1216c349dbc7Sjsg 12171bb76ff1Sjsg status = intel_dp_mode_valid_downstream(connector, mode, target_clock); 1218ad8b1aafSjsg if (status != MODE_OK) 1219ad8b1aafSjsg return status; 1220ad8b1aafSjsg 12215ca02815Sjsg return intel_mode_valid_max_plane_size(dev_priv, mode, bigjoiner); 1222c349dbc7Sjsg } 1223c349dbc7Sjsg 12241bb76ff1Sjsg bool intel_dp_source_supports_tps3(struct drm_i915_private *i915) 1225c349dbc7Sjsg { 12261bb76ff1Sjsg return DISPLAY_VER(i915) >= 9 || IS_BROADWELL(i915) || IS_HASWELL(i915); 1227c349dbc7Sjsg } 1228c349dbc7Sjsg 12291bb76ff1Sjsg bool intel_dp_source_supports_tps4(struct drm_i915_private *i915) 1230c349dbc7Sjsg { 12311bb76ff1Sjsg return DISPLAY_VER(i915) >= 10; 1232c349dbc7Sjsg } 1233c349dbc7Sjsg 1234c349dbc7Sjsg static void snprintf_int_array(char *str, size_t len, 1235c349dbc7Sjsg const int *array, int nelem) 1236c349dbc7Sjsg { 1237c349dbc7Sjsg int i; 1238c349dbc7Sjsg 1239c349dbc7Sjsg str[0] = '\0'; 1240c349dbc7Sjsg 1241c349dbc7Sjsg for (i = 0; i < nelem; i++) { 1242c349dbc7Sjsg int r = snprintf(str, len, "%s%d", i ? ", " : "", array[i]); 1243c349dbc7Sjsg if (r >= len) 1244c349dbc7Sjsg return; 1245c349dbc7Sjsg str += r; 1246c349dbc7Sjsg len -= r; 1247c349dbc7Sjsg } 1248c349dbc7Sjsg } 1249c349dbc7Sjsg 1250c349dbc7Sjsg static void intel_dp_print_rates(struct intel_dp *intel_dp) 1251c349dbc7Sjsg { 1252ad8b1aafSjsg struct drm_i915_private *i915 = dp_to_i915(intel_dp); 1253c349dbc7Sjsg char str[128]; /* FIXME: too big for stack? */ 1254c349dbc7Sjsg 1255c349dbc7Sjsg if (!drm_debug_enabled(DRM_UT_KMS)) 1256c349dbc7Sjsg return; 1257c349dbc7Sjsg 1258c349dbc7Sjsg snprintf_int_array(str, sizeof(str), 1259c349dbc7Sjsg intel_dp->source_rates, intel_dp->num_source_rates); 1260ad8b1aafSjsg drm_dbg_kms(&i915->drm, "source rates: %s\n", str); 1261c349dbc7Sjsg 1262c349dbc7Sjsg snprintf_int_array(str, sizeof(str), 1263c349dbc7Sjsg intel_dp->sink_rates, intel_dp->num_sink_rates); 1264ad8b1aafSjsg drm_dbg_kms(&i915->drm, "sink rates: %s\n", str); 1265c349dbc7Sjsg 1266c349dbc7Sjsg snprintf_int_array(str, sizeof(str), 1267c349dbc7Sjsg intel_dp->common_rates, intel_dp->num_common_rates); 1268ad8b1aafSjsg drm_dbg_kms(&i915->drm, "common rates: %s\n", str); 1269c349dbc7Sjsg } 1270c349dbc7Sjsg 1271c349dbc7Sjsg int 1272c349dbc7Sjsg intel_dp_max_link_rate(struct intel_dp *intel_dp) 1273c349dbc7Sjsg { 1274c349dbc7Sjsg int len; 1275c349dbc7Sjsg 1276c349dbc7Sjsg len = intel_dp_common_len_rate_limit(intel_dp, intel_dp->max_link_rate); 1277c349dbc7Sjsg 12781bb76ff1Sjsg return intel_dp_common_rate(intel_dp, len - 1); 1279c349dbc7Sjsg } 1280c349dbc7Sjsg 1281c349dbc7Sjsg int intel_dp_rate_select(struct intel_dp *intel_dp, int rate) 1282c349dbc7Sjsg { 1283ad8b1aafSjsg struct drm_i915_private *i915 = dp_to_i915(intel_dp); 1284c349dbc7Sjsg int i = intel_dp_rate_index(intel_dp->sink_rates, 1285c349dbc7Sjsg intel_dp->num_sink_rates, rate); 1286c349dbc7Sjsg 1287ad8b1aafSjsg if (drm_WARN_ON(&i915->drm, i < 0)) 1288c349dbc7Sjsg i = 0; 1289c349dbc7Sjsg 1290c349dbc7Sjsg return i; 1291c349dbc7Sjsg } 1292c349dbc7Sjsg 1293c349dbc7Sjsg void intel_dp_compute_rate(struct intel_dp *intel_dp, int port_clock, 1294c349dbc7Sjsg u8 *link_bw, u8 *rate_select) 1295c349dbc7Sjsg { 1296c349dbc7Sjsg /* eDP 1.4 rate select method. */ 1297c349dbc7Sjsg if (intel_dp->use_rate_select) { 1298c349dbc7Sjsg *link_bw = 0; 1299c349dbc7Sjsg *rate_select = 1300c349dbc7Sjsg intel_dp_rate_select(intel_dp, port_clock); 1301c349dbc7Sjsg } else { 1302c349dbc7Sjsg *link_bw = drm_dp_link_rate_to_bw_code(port_clock); 1303c349dbc7Sjsg *rate_select = 0; 1304c349dbc7Sjsg } 1305c349dbc7Sjsg } 1306c349dbc7Sjsg 1307f005ef32Sjsg bool intel_dp_has_hdmi_sink(struct intel_dp *intel_dp) 1308f005ef32Sjsg { 1309f005ef32Sjsg struct intel_connector *connector = intel_dp->attached_connector; 1310f005ef32Sjsg 1311f005ef32Sjsg return connector->base.display_info.is_hdmi; 1312f005ef32Sjsg } 1313f005ef32Sjsg 1314c349dbc7Sjsg static bool intel_dp_source_supports_fec(struct intel_dp *intel_dp, 1315c349dbc7Sjsg const struct intel_crtc_state *pipe_config) 1316c349dbc7Sjsg { 131712f3d135Sjsg struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; 1318c349dbc7Sjsg struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); 1319c349dbc7Sjsg 13205ca02815Sjsg if (DISPLAY_VER(dev_priv) >= 12) 1321c349dbc7Sjsg return true; 1322c349dbc7Sjsg 1323f5dd68fdSjsg if (DISPLAY_VER(dev_priv) == 11 && encoder->port != PORT_A && 1324f5dd68fdSjsg !intel_crtc_has_type(pipe_config, INTEL_OUTPUT_DP_MST)) 1325c349dbc7Sjsg return true; 1326c349dbc7Sjsg 1327c349dbc7Sjsg return false; 1328c349dbc7Sjsg } 1329c349dbc7Sjsg 1330c349dbc7Sjsg static bool intel_dp_supports_fec(struct intel_dp *intel_dp, 1331c349dbc7Sjsg const struct intel_crtc_state *pipe_config) 1332c349dbc7Sjsg { 1333c349dbc7Sjsg return intel_dp_source_supports_fec(intel_dp, pipe_config) && 1334c349dbc7Sjsg drm_dp_sink_supports_fec(intel_dp->fec_capable); 1335c349dbc7Sjsg } 1336c349dbc7Sjsg 1337c349dbc7Sjsg static bool intel_dp_supports_dsc(struct intel_dp *intel_dp, 1338c349dbc7Sjsg const struct intel_crtc_state *crtc_state) 1339c349dbc7Sjsg { 13405ca02815Sjsg if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DP) && !crtc_state->fec_enable) 1341c349dbc7Sjsg return false; 1342c349dbc7Sjsg 13435ca02815Sjsg return intel_dsc_source_support(crtc_state) && 1344c349dbc7Sjsg drm_dp_sink_supports_dsc(intel_dp->dsc_dpcd); 1345c349dbc7Sjsg } 1346c349dbc7Sjsg 13471bb76ff1Sjsg static int intel_dp_hdmi_compute_bpc(struct intel_dp *intel_dp, 1348ad8b1aafSjsg const struct intel_crtc_state *crtc_state, 13491bb76ff1Sjsg int bpc, bool respect_downstream_limits) 1350ad8b1aafSjsg { 13511bb76ff1Sjsg int clock = crtc_state->hw.adjusted_mode.crtc_clock; 1352ad8b1aafSjsg 13531bb76ff1Sjsg /* 13541bb76ff1Sjsg * Current bpc could already be below 8bpc due to 13551bb76ff1Sjsg * FDI bandwidth constraints or other limits. 13561bb76ff1Sjsg * HDMI minimum is 8bpc however. 13571bb76ff1Sjsg */ 13581bb76ff1Sjsg bpc = max(bpc, 8); 13591bb76ff1Sjsg 13601bb76ff1Sjsg /* 13611bb76ff1Sjsg * We will never exceed downstream TMDS clock limits while 13621bb76ff1Sjsg * attempting deep color. If the user insists on forcing an 13631bb76ff1Sjsg * out of spec mode they will have to be satisfied with 8bpc. 13641bb76ff1Sjsg */ 13651bb76ff1Sjsg if (!respect_downstream_limits) 13661bb76ff1Sjsg bpc = 8; 13671bb76ff1Sjsg 13681bb76ff1Sjsg for (; bpc >= 8; bpc -= 2) { 13691bb76ff1Sjsg if (intel_hdmi_bpc_possible(crtc_state, bpc, 1370f005ef32Sjsg intel_dp_has_hdmi_sink(intel_dp)) && 1371f005ef32Sjsg intel_dp_tmds_clock_valid(intel_dp, clock, bpc, crtc_state->sink_format, 13721bb76ff1Sjsg respect_downstream_limits) == MODE_OK) 13731bb76ff1Sjsg return bpc; 13741bb76ff1Sjsg } 13751bb76ff1Sjsg 13761bb76ff1Sjsg return -EINVAL; 1377ad8b1aafSjsg } 1378ad8b1aafSjsg 1379ad8b1aafSjsg static int intel_dp_max_bpp(struct intel_dp *intel_dp, 13801bb76ff1Sjsg const struct intel_crtc_state *crtc_state, 13811bb76ff1Sjsg bool respect_downstream_limits) 1382c349dbc7Sjsg { 1383c349dbc7Sjsg struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); 1384c349dbc7Sjsg struct intel_connector *intel_connector = intel_dp->attached_connector; 1385c349dbc7Sjsg int bpp, bpc; 1386c349dbc7Sjsg 1387ad8b1aafSjsg bpc = crtc_state->pipe_bpp / 3; 1388c349dbc7Sjsg 1389ad8b1aafSjsg if (intel_dp->dfp.max_bpc) 1390ad8b1aafSjsg bpc = min_t(int, bpc, intel_dp->dfp.max_bpc); 1391c349dbc7Sjsg 1392ad8b1aafSjsg if (intel_dp->dfp.min_tmds_clock) { 13931bb76ff1Sjsg int max_hdmi_bpc; 13941bb76ff1Sjsg 13951bb76ff1Sjsg max_hdmi_bpc = intel_dp_hdmi_compute_bpc(intel_dp, crtc_state, bpc, 13961bb76ff1Sjsg respect_downstream_limits); 13971bb76ff1Sjsg if (max_hdmi_bpc < 0) 13981bb76ff1Sjsg return 0; 13991bb76ff1Sjsg 14001bb76ff1Sjsg bpc = min(bpc, max_hdmi_bpc); 1401ad8b1aafSjsg } 1402ad8b1aafSjsg 1403ad8b1aafSjsg bpp = bpc * 3; 1404c349dbc7Sjsg if (intel_dp_is_edp(intel_dp)) { 1405c349dbc7Sjsg /* Get bpp from vbt only for panels that dont have bpp in edid */ 1406c349dbc7Sjsg if (intel_connector->base.display_info.bpc == 0 && 14071bb76ff1Sjsg intel_connector->panel.vbt.edp.bpp && 14081bb76ff1Sjsg intel_connector->panel.vbt.edp.bpp < bpp) { 1409c349dbc7Sjsg drm_dbg_kms(&dev_priv->drm, 1410c349dbc7Sjsg "clamping bpp for eDP panel to BIOS-provided %i\n", 14111bb76ff1Sjsg intel_connector->panel.vbt.edp.bpp); 14121bb76ff1Sjsg bpp = intel_connector->panel.vbt.edp.bpp; 1413c349dbc7Sjsg } 1414c349dbc7Sjsg } 1415c349dbc7Sjsg 1416c349dbc7Sjsg return bpp; 1417c349dbc7Sjsg } 1418c349dbc7Sjsg 1419c349dbc7Sjsg /* Adjust link config limits based on compliance test requests. */ 1420c349dbc7Sjsg void 1421c349dbc7Sjsg intel_dp_adjust_compliance_config(struct intel_dp *intel_dp, 1422c349dbc7Sjsg struct intel_crtc_state *pipe_config, 1423c349dbc7Sjsg struct link_config_limits *limits) 1424c349dbc7Sjsg { 1425ad8b1aafSjsg struct drm_i915_private *i915 = dp_to_i915(intel_dp); 1426ad8b1aafSjsg 1427c349dbc7Sjsg /* For DP Compliance we override the computed bpp for the pipe */ 1428c349dbc7Sjsg if (intel_dp->compliance.test_data.bpc != 0) { 1429c349dbc7Sjsg int bpp = 3 * intel_dp->compliance.test_data.bpc; 1430c349dbc7Sjsg 1431c349dbc7Sjsg limits->min_bpp = limits->max_bpp = bpp; 1432c349dbc7Sjsg pipe_config->dither_force_disable = bpp == 6 * 3; 1433c349dbc7Sjsg 1434ad8b1aafSjsg drm_dbg_kms(&i915->drm, "Setting pipe_bpp to %d\n", bpp); 1435c349dbc7Sjsg } 1436c349dbc7Sjsg 1437c349dbc7Sjsg /* Use values requested by Compliance Test Request */ 1438c349dbc7Sjsg if (intel_dp->compliance.test_type == DP_TEST_LINK_TRAINING) { 1439c349dbc7Sjsg int index; 1440c349dbc7Sjsg 1441c349dbc7Sjsg /* Validate the compliance test data since max values 1442c349dbc7Sjsg * might have changed due to link train fallback. 1443c349dbc7Sjsg */ 1444c349dbc7Sjsg if (intel_dp_link_params_valid(intel_dp, intel_dp->compliance.test_link_rate, 1445c349dbc7Sjsg intel_dp->compliance.test_lane_count)) { 1446c349dbc7Sjsg index = intel_dp_rate_index(intel_dp->common_rates, 1447c349dbc7Sjsg intel_dp->num_common_rates, 1448c349dbc7Sjsg intel_dp->compliance.test_link_rate); 1449c349dbc7Sjsg if (index >= 0) 14501bb76ff1Sjsg limits->min_rate = limits->max_rate = 14511bb76ff1Sjsg intel_dp->compliance.test_link_rate; 1452c349dbc7Sjsg limits->min_lane_count = limits->max_lane_count = 1453c349dbc7Sjsg intel_dp->compliance.test_lane_count; 1454c349dbc7Sjsg } 1455c349dbc7Sjsg } 1456c349dbc7Sjsg } 1457c349dbc7Sjsg 14581bb76ff1Sjsg static bool has_seamless_m_n(struct intel_connector *connector) 14591bb76ff1Sjsg { 14601bb76ff1Sjsg struct drm_i915_private *i915 = to_i915(connector->base.dev); 14611bb76ff1Sjsg 14621bb76ff1Sjsg /* 14631bb76ff1Sjsg * Seamless M/N reprogramming only implemented 14641bb76ff1Sjsg * for BDW+ double buffered M/N registers so far. 14651bb76ff1Sjsg */ 14661bb76ff1Sjsg return HAS_DOUBLE_BUFFERED_M_N(i915) && 14671bb76ff1Sjsg intel_panel_drrs_type(connector) == DRRS_TYPE_SEAMLESS; 14681bb76ff1Sjsg } 14691bb76ff1Sjsg 14701bb76ff1Sjsg static int intel_dp_mode_clock(const struct intel_crtc_state *crtc_state, 14711bb76ff1Sjsg const struct drm_connector_state *conn_state) 14721bb76ff1Sjsg { 14731bb76ff1Sjsg struct intel_connector *connector = to_intel_connector(conn_state->connector); 14741bb76ff1Sjsg const struct drm_display_mode *adjusted_mode = &crtc_state->hw.adjusted_mode; 14751bb76ff1Sjsg 14761bb76ff1Sjsg /* FIXME a bit of a mess wrt clock vs. crtc_clock */ 14771bb76ff1Sjsg if (has_seamless_m_n(connector)) 14781bb76ff1Sjsg return intel_panel_highest_mode(connector, adjusted_mode)->clock; 14791bb76ff1Sjsg else 14801bb76ff1Sjsg return adjusted_mode->crtc_clock; 14811bb76ff1Sjsg } 14821bb76ff1Sjsg 1483c349dbc7Sjsg /* Optimize link config in order: max bpp, min clock, min lanes */ 1484c349dbc7Sjsg static int 1485c349dbc7Sjsg intel_dp_compute_link_config_wide(struct intel_dp *intel_dp, 1486c349dbc7Sjsg struct intel_crtc_state *pipe_config, 14871bb76ff1Sjsg const struct drm_connector_state *conn_state, 1488c349dbc7Sjsg const struct link_config_limits *limits) 1489c349dbc7Sjsg { 14901bb76ff1Sjsg int bpp, i, lane_count, clock = intel_dp_mode_clock(pipe_config, conn_state); 14911bb76ff1Sjsg int mode_rate, link_rate, link_avail; 1492c349dbc7Sjsg 1493c349dbc7Sjsg for (bpp = limits->max_bpp; bpp >= limits->min_bpp; bpp -= 2 * 3) { 14945ca02815Sjsg int output_bpp = intel_dp_output_bpp(pipe_config->output_format, bpp); 1495c349dbc7Sjsg 14961bb76ff1Sjsg mode_rate = intel_dp_link_required(clock, output_bpp); 1497c349dbc7Sjsg 14981bb76ff1Sjsg for (i = 0; i < intel_dp->num_common_rates; i++) { 14991bb76ff1Sjsg link_rate = intel_dp_common_rate(intel_dp, i); 15001bb76ff1Sjsg if (link_rate < limits->min_rate || 15011bb76ff1Sjsg link_rate > limits->max_rate) 15021bb76ff1Sjsg continue; 15031bb76ff1Sjsg 1504c349dbc7Sjsg for (lane_count = limits->min_lane_count; 1505c349dbc7Sjsg lane_count <= limits->max_lane_count; 1506c349dbc7Sjsg lane_count <<= 1) { 15071bb76ff1Sjsg link_avail = intel_dp_max_data_rate(link_rate, 1508c349dbc7Sjsg lane_count); 1509c349dbc7Sjsg 1510c349dbc7Sjsg if (mode_rate <= link_avail) { 1511c349dbc7Sjsg pipe_config->lane_count = lane_count; 1512c349dbc7Sjsg pipe_config->pipe_bpp = bpp; 15131bb76ff1Sjsg pipe_config->port_clock = link_rate; 1514c349dbc7Sjsg 1515c349dbc7Sjsg return 0; 1516c349dbc7Sjsg } 1517c349dbc7Sjsg } 1518c349dbc7Sjsg } 1519c349dbc7Sjsg } 1520c349dbc7Sjsg 1521c349dbc7Sjsg return -EINVAL; 1522c349dbc7Sjsg } 1523c349dbc7Sjsg 1524f005ef32Sjsg int intel_dp_dsc_compute_bpp(struct intel_dp *intel_dp, u8 max_req_bpc) 1525c349dbc7Sjsg { 15265ca02815Sjsg struct drm_i915_private *i915 = dp_to_i915(intel_dp); 1527c349dbc7Sjsg int i, num_bpc; 1528c349dbc7Sjsg u8 dsc_bpc[3] = {0}; 15295ca02815Sjsg u8 dsc_max_bpc; 15305ca02815Sjsg 15315ca02815Sjsg /* Max DSC Input BPC for ICL is 10 and for TGL+ is 12 */ 15325ca02815Sjsg if (DISPLAY_VER(i915) >= 12) 15335ca02815Sjsg dsc_max_bpc = min_t(u8, 12, max_req_bpc); 15345ca02815Sjsg else 15355ca02815Sjsg dsc_max_bpc = min_t(u8, 10, max_req_bpc); 1536c349dbc7Sjsg 1537c349dbc7Sjsg num_bpc = drm_dp_dsc_sink_supported_input_bpcs(intel_dp->dsc_dpcd, 1538c349dbc7Sjsg dsc_bpc); 1539c349dbc7Sjsg for (i = 0; i < num_bpc; i++) { 1540c349dbc7Sjsg if (dsc_max_bpc >= dsc_bpc[i]) 1541c349dbc7Sjsg return dsc_bpc[i] * 3; 1542c349dbc7Sjsg } 1543c349dbc7Sjsg 1544c349dbc7Sjsg return 0; 1545c349dbc7Sjsg } 1546c349dbc7Sjsg 15471bb76ff1Sjsg static int intel_dp_source_dsc_version_minor(struct intel_dp *intel_dp) 15481bb76ff1Sjsg { 15491bb76ff1Sjsg struct drm_i915_private *i915 = dp_to_i915(intel_dp); 15501bb76ff1Sjsg 15511bb76ff1Sjsg return DISPLAY_VER(i915) >= 14 ? 2 : 1; 15521bb76ff1Sjsg } 15531bb76ff1Sjsg 15541bb76ff1Sjsg static int intel_dp_sink_dsc_version_minor(struct intel_dp *intel_dp) 15551bb76ff1Sjsg { 15561bb76ff1Sjsg return (intel_dp->dsc_dpcd[DP_DSC_REV - DP_DSC_SUPPORT] & DP_DSC_MINOR_MASK) >> 15571bb76ff1Sjsg DP_DSC_MINOR_SHIFT; 15581bb76ff1Sjsg } 1559c349dbc7Sjsg 1560f005ef32Sjsg static int intel_dp_get_slice_height(int vactive) 1561f005ef32Sjsg { 1562f005ef32Sjsg int slice_height; 1563f005ef32Sjsg 1564f005ef32Sjsg /* 1565f005ef32Sjsg * VDSC 1.2a spec in Section 3.8 Options for Slices implies that 108 1566f005ef32Sjsg * lines is an optimal slice height, but any size can be used as long as 1567f005ef32Sjsg * vertical active integer multiple and maximum vertical slice count 1568f005ef32Sjsg * requirements are met. 1569f005ef32Sjsg */ 1570f005ef32Sjsg for (slice_height = 108; slice_height <= vactive; slice_height += 2) 1571f005ef32Sjsg if (vactive % slice_height == 0) 1572f005ef32Sjsg return slice_height; 1573f005ef32Sjsg 1574f005ef32Sjsg /* 1575f005ef32Sjsg * Highly unlikely we reach here as most of the resolutions will end up 1576f005ef32Sjsg * finding appropriate slice_height in above loop but returning 1577f005ef32Sjsg * slice_height as 2 here as it should work with all resolutions. 1578f005ef32Sjsg */ 1579f005ef32Sjsg return 2; 1580f005ef32Sjsg } 1581f005ef32Sjsg 1582c349dbc7Sjsg static int intel_dp_dsc_compute_params(struct intel_encoder *encoder, 1583c349dbc7Sjsg struct intel_crtc_state *crtc_state) 1584c349dbc7Sjsg { 1585ad8b1aafSjsg struct drm_i915_private *i915 = to_i915(encoder->base.dev); 1586c349dbc7Sjsg struct intel_dp *intel_dp = enc_to_intel_dp(encoder); 1587c349dbc7Sjsg struct drm_dsc_config *vdsc_cfg = &crtc_state->dsc.config; 1588c349dbc7Sjsg u8 line_buf_depth; 1589c349dbc7Sjsg int ret; 1590c349dbc7Sjsg 15915ca02815Sjsg /* 15925ca02815Sjsg * RC_MODEL_SIZE is currently a constant across all configurations. 15935ca02815Sjsg * 15945ca02815Sjsg * FIXME: Look into using sink defined DPCD DP_DSC_RC_BUF_BLK_SIZE and 15955ca02815Sjsg * DP_DSC_RC_BUF_SIZE for this. 15965ca02815Sjsg */ 15975ca02815Sjsg vdsc_cfg->rc_model_size = DSC_RC_MODEL_SIZE_CONST; 15981bb76ff1Sjsg vdsc_cfg->pic_height = crtc_state->hw.adjusted_mode.crtc_vdisplay; 1599c349dbc7Sjsg 1600f005ef32Sjsg vdsc_cfg->slice_height = intel_dp_get_slice_height(vdsc_cfg->pic_height); 1601c349dbc7Sjsg 16021bb76ff1Sjsg ret = intel_dsc_compute_params(crtc_state); 16035ca02815Sjsg if (ret) 16045ca02815Sjsg return ret; 16055ca02815Sjsg 1606c349dbc7Sjsg vdsc_cfg->dsc_version_major = 1607c349dbc7Sjsg (intel_dp->dsc_dpcd[DP_DSC_REV - DP_DSC_SUPPORT] & 1608c349dbc7Sjsg DP_DSC_MAJOR_MASK) >> DP_DSC_MAJOR_SHIFT; 1609c349dbc7Sjsg vdsc_cfg->dsc_version_minor = 16101bb76ff1Sjsg min(intel_dp_source_dsc_version_minor(intel_dp), 16111bb76ff1Sjsg intel_dp_sink_dsc_version_minor(intel_dp)); 1612f005ef32Sjsg if (vdsc_cfg->convert_rgb) 1613f005ef32Sjsg vdsc_cfg->convert_rgb = 1614f005ef32Sjsg intel_dp->dsc_dpcd[DP_DSC_DEC_COLOR_FORMAT_CAP - DP_DSC_SUPPORT] & 1615c349dbc7Sjsg DP_DSC_RGB; 1616c349dbc7Sjsg 1617c349dbc7Sjsg line_buf_depth = drm_dp_dsc_sink_line_buf_depth(intel_dp->dsc_dpcd); 1618c349dbc7Sjsg if (!line_buf_depth) { 1619ad8b1aafSjsg drm_dbg_kms(&i915->drm, 1620ad8b1aafSjsg "DSC Sink Line Buffer Depth invalid\n"); 1621c349dbc7Sjsg return -EINVAL; 1622c349dbc7Sjsg } 1623c349dbc7Sjsg 1624c349dbc7Sjsg if (vdsc_cfg->dsc_version_minor == 2) 1625c349dbc7Sjsg vdsc_cfg->line_buf_depth = (line_buf_depth == DSC_1_2_MAX_LINEBUF_DEPTH_BITS) ? 1626c349dbc7Sjsg DSC_1_2_MAX_LINEBUF_DEPTH_VAL : line_buf_depth; 1627c349dbc7Sjsg else 1628c349dbc7Sjsg vdsc_cfg->line_buf_depth = (line_buf_depth > DSC_1_1_MAX_LINEBUF_DEPTH_BITS) ? 1629c349dbc7Sjsg DSC_1_1_MAX_LINEBUF_DEPTH_BITS : line_buf_depth; 1630c349dbc7Sjsg 1631c349dbc7Sjsg vdsc_cfg->block_pred_enable = 1632c349dbc7Sjsg intel_dp->dsc_dpcd[DP_DSC_BLK_PREDICTION_SUPPORT - DP_DSC_SUPPORT] & 1633c349dbc7Sjsg DP_DSC_BLK_PREDICTION_IS_SUPPORTED; 1634c349dbc7Sjsg 1635c349dbc7Sjsg return drm_dsc_compute_rc_parameters(vdsc_cfg); 1636c349dbc7Sjsg } 1637c349dbc7Sjsg 1638f005ef32Sjsg static bool intel_dp_dsc_supports_format(struct intel_dp *intel_dp, 1639f005ef32Sjsg enum intel_output_format output_format) 1640f005ef32Sjsg { 1641f005ef32Sjsg u8 sink_dsc_format; 1642f005ef32Sjsg 1643f005ef32Sjsg switch (output_format) { 1644f005ef32Sjsg case INTEL_OUTPUT_FORMAT_RGB: 1645f005ef32Sjsg sink_dsc_format = DP_DSC_RGB; 1646f005ef32Sjsg break; 1647f005ef32Sjsg case INTEL_OUTPUT_FORMAT_YCBCR444: 1648f005ef32Sjsg sink_dsc_format = DP_DSC_YCbCr444; 1649f005ef32Sjsg break; 1650f005ef32Sjsg case INTEL_OUTPUT_FORMAT_YCBCR420: 1651f005ef32Sjsg if (min(intel_dp_source_dsc_version_minor(intel_dp), 1652f005ef32Sjsg intel_dp_sink_dsc_version_minor(intel_dp)) < 2) 1653f005ef32Sjsg return false; 1654f005ef32Sjsg sink_dsc_format = DP_DSC_YCbCr420_Native; 1655f005ef32Sjsg break; 1656f005ef32Sjsg default: 1657f005ef32Sjsg return false; 1658f005ef32Sjsg } 1659f005ef32Sjsg 1660f005ef32Sjsg return drm_dp_dsc_sink_supports_format(intel_dp->dsc_dpcd, sink_dsc_format); 1661f005ef32Sjsg } 1662f005ef32Sjsg 1663f005ef32Sjsg int intel_dp_dsc_compute_config(struct intel_dp *intel_dp, 1664c349dbc7Sjsg struct intel_crtc_state *pipe_config, 1665c349dbc7Sjsg struct drm_connector_state *conn_state, 1666f005ef32Sjsg struct link_config_limits *limits, 1667f005ef32Sjsg int timeslots, 1668f005ef32Sjsg bool compute_pipe_bpp) 1669c349dbc7Sjsg { 1670c349dbc7Sjsg struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); 1671c349dbc7Sjsg struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev); 1672ad8b1aafSjsg const struct drm_display_mode *adjusted_mode = 1673ad8b1aafSjsg &pipe_config->hw.adjusted_mode; 1674c349dbc7Sjsg int pipe_bpp; 1675c349dbc7Sjsg int ret; 1676c349dbc7Sjsg 1677c349dbc7Sjsg pipe_config->fec_enable = !intel_dp_is_edp(intel_dp) && 1678c349dbc7Sjsg intel_dp_supports_fec(intel_dp, pipe_config); 1679c349dbc7Sjsg 1680c349dbc7Sjsg if (!intel_dp_supports_dsc(intel_dp, pipe_config)) 1681c349dbc7Sjsg return -EINVAL; 1682c349dbc7Sjsg 1683f005ef32Sjsg if (!intel_dp_dsc_supports_format(intel_dp, pipe_config->output_format)) 1684f005ef32Sjsg return -EINVAL; 1685f005ef32Sjsg 1686f005ef32Sjsg if (compute_pipe_bpp) 16875ca02815Sjsg pipe_bpp = intel_dp_dsc_compute_bpp(intel_dp, conn_state->max_requested_bpc); 1688f005ef32Sjsg else 1689f005ef32Sjsg pipe_bpp = pipe_config->pipe_bpp; 1690c349dbc7Sjsg 16911bb76ff1Sjsg if (intel_dp->force_dsc_bpc) { 16921bb76ff1Sjsg pipe_bpp = intel_dp->force_dsc_bpc * 3; 16931bb76ff1Sjsg drm_dbg_kms(&dev_priv->drm, "Input DSC BPP forced to %d", pipe_bpp); 16941bb76ff1Sjsg } 16951bb76ff1Sjsg 1696c349dbc7Sjsg /* Min Input BPC for ICL+ is 8 */ 1697c349dbc7Sjsg if (pipe_bpp < 8 * 3) { 1698c349dbc7Sjsg drm_dbg_kms(&dev_priv->drm, 1699c349dbc7Sjsg "No DSC support for less than 8bpc\n"); 1700c349dbc7Sjsg return -EINVAL; 1701c349dbc7Sjsg } 1702c349dbc7Sjsg 1703c349dbc7Sjsg /* 1704c349dbc7Sjsg * For now enable DSC for max bpp, max link rate, max lane count. 1705c349dbc7Sjsg * Optimize this later for the minimum possible link rate/lane count 1706c349dbc7Sjsg * with DSC enabled for the requested mode. 1707c349dbc7Sjsg */ 1708c349dbc7Sjsg pipe_config->pipe_bpp = pipe_bpp; 17091bb76ff1Sjsg pipe_config->port_clock = limits->max_rate; 1710c349dbc7Sjsg pipe_config->lane_count = limits->max_lane_count; 1711c349dbc7Sjsg 1712c349dbc7Sjsg if (intel_dp_is_edp(intel_dp)) { 1713c349dbc7Sjsg pipe_config->dsc.compressed_bpp = 1714c349dbc7Sjsg min_t(u16, drm_edp_dsc_sink_output_bpp(intel_dp->dsc_dpcd) >> 4, 1715c349dbc7Sjsg pipe_config->pipe_bpp); 1716c349dbc7Sjsg pipe_config->dsc.slice_count = 1717c349dbc7Sjsg drm_dp_dsc_sink_max_slice_count(intel_dp->dsc_dpcd, 1718c349dbc7Sjsg true); 1719c57bd45dSjsg if (!pipe_config->dsc.slice_count) { 1720c57bd45dSjsg drm_dbg_kms(&dev_priv->drm, "Unsupported Slice Count %d\n", 1721c57bd45dSjsg pipe_config->dsc.slice_count); 1722c57bd45dSjsg return -EINVAL; 1723c57bd45dSjsg } 1724c349dbc7Sjsg } else { 1725f005ef32Sjsg u16 dsc_max_output_bpp = 0; 1726c349dbc7Sjsg u8 dsc_dp_slice_count; 1727c349dbc7Sjsg 1728f005ef32Sjsg if (compute_pipe_bpp) { 1729c349dbc7Sjsg dsc_max_output_bpp = 1730c349dbc7Sjsg intel_dp_dsc_get_output_bpp(dev_priv, 1731c349dbc7Sjsg pipe_config->port_clock, 1732c349dbc7Sjsg pipe_config->lane_count, 1733c349dbc7Sjsg adjusted_mode->crtc_clock, 17345ca02815Sjsg adjusted_mode->crtc_hdisplay, 17351bb76ff1Sjsg pipe_config->bigjoiner_pipes, 1736f005ef32Sjsg pipe_bpp, 1737f005ef32Sjsg timeslots); 1738f005ef32Sjsg /* 1739f005ef32Sjsg * According to DSC 1.2a Section 4.1.1 Table 4.1 the maximum 1740f005ef32Sjsg * supported PPS value can be 63.9375 and with the further 1741f005ef32Sjsg * mention that bpp should be programmed double the target bpp 1742f005ef32Sjsg * restricting our target bpp to be 31.9375 at max 1743f005ef32Sjsg */ 1744f005ef32Sjsg if (pipe_config->output_format == INTEL_OUTPUT_FORMAT_YCBCR420) 1745f005ef32Sjsg dsc_max_output_bpp = min_t(u16, dsc_max_output_bpp, 31 << 4); 1746f005ef32Sjsg 1747f005ef32Sjsg if (!dsc_max_output_bpp) { 1748f005ef32Sjsg drm_dbg_kms(&dev_priv->drm, 1749f005ef32Sjsg "Compressed BPP not supported\n"); 1750f005ef32Sjsg return -EINVAL; 1751f005ef32Sjsg } 1752f005ef32Sjsg } 1753c349dbc7Sjsg dsc_dp_slice_count = 1754c349dbc7Sjsg intel_dp_dsc_get_slice_count(intel_dp, 1755c349dbc7Sjsg adjusted_mode->crtc_clock, 17565ca02815Sjsg adjusted_mode->crtc_hdisplay, 17571bb76ff1Sjsg pipe_config->bigjoiner_pipes); 1758f005ef32Sjsg if (!dsc_dp_slice_count) { 1759c349dbc7Sjsg drm_dbg_kms(&dev_priv->drm, 1760f005ef32Sjsg "Compressed Slice Count not supported\n"); 1761c349dbc7Sjsg return -EINVAL; 1762c349dbc7Sjsg } 1763f005ef32Sjsg 1764f005ef32Sjsg /* 1765f005ef32Sjsg * compute pipe bpp is set to false for DP MST DSC case 1766f005ef32Sjsg * and compressed_bpp is calculated same time once 1767f005ef32Sjsg * vpci timeslots are allocated, because overall bpp 1768f005ef32Sjsg * calculation procedure is bit different for MST case. 1769f005ef32Sjsg */ 1770f005ef32Sjsg if (compute_pipe_bpp) { 1771c349dbc7Sjsg pipe_config->dsc.compressed_bpp = min_t(u16, 1772c349dbc7Sjsg dsc_max_output_bpp >> 4, 1773c349dbc7Sjsg pipe_config->pipe_bpp); 1774c349dbc7Sjsg } 1775f005ef32Sjsg pipe_config->dsc.slice_count = dsc_dp_slice_count; 1776f005ef32Sjsg drm_dbg_kms(&dev_priv->drm, "DSC: compressed bpp %d slice count %d\n", 1777f005ef32Sjsg pipe_config->dsc.compressed_bpp, 1778f005ef32Sjsg pipe_config->dsc.slice_count); 1779f005ef32Sjsg } 1780c349dbc7Sjsg /* 1781c349dbc7Sjsg * VDSC engine operates at 1 Pixel per clock, so if peak pixel rate 1782c349dbc7Sjsg * is greater than the maximum Cdclock and if slice count is even 1783c349dbc7Sjsg * then we need to use 2 VDSC instances. 1784c349dbc7Sjsg */ 1785f005ef32Sjsg if (pipe_config->bigjoiner_pipes || pipe_config->dsc.slice_count > 1) 17865ca02815Sjsg pipe_config->dsc.dsc_split = true; 1787c349dbc7Sjsg 1788c349dbc7Sjsg ret = intel_dp_dsc_compute_params(&dig_port->base, pipe_config); 1789c349dbc7Sjsg if (ret < 0) { 1790c349dbc7Sjsg drm_dbg_kms(&dev_priv->drm, 1791c349dbc7Sjsg "Cannot compute valid DSC parameters for Input Bpp = %d " 1792c349dbc7Sjsg "Compressed BPP = %d\n", 1793c349dbc7Sjsg pipe_config->pipe_bpp, 1794c349dbc7Sjsg pipe_config->dsc.compressed_bpp); 1795c349dbc7Sjsg return ret; 1796c349dbc7Sjsg } 1797c349dbc7Sjsg 1798c349dbc7Sjsg pipe_config->dsc.compression_enable = true; 1799c349dbc7Sjsg drm_dbg_kms(&dev_priv->drm, "DP DSC computed with Input Bpp = %d " 1800c349dbc7Sjsg "Compressed Bpp = %d Slice Count = %d\n", 1801c349dbc7Sjsg pipe_config->pipe_bpp, 1802c349dbc7Sjsg pipe_config->dsc.compressed_bpp, 1803c349dbc7Sjsg pipe_config->dsc.slice_count); 1804c349dbc7Sjsg 1805c349dbc7Sjsg return 0; 1806c349dbc7Sjsg } 1807c349dbc7Sjsg 1808c349dbc7Sjsg static int 1809c349dbc7Sjsg intel_dp_compute_link_config(struct intel_encoder *encoder, 1810c349dbc7Sjsg struct intel_crtc_state *pipe_config, 18111bb76ff1Sjsg struct drm_connector_state *conn_state, 18121bb76ff1Sjsg bool respect_downstream_limits) 1813c349dbc7Sjsg { 1814ad8b1aafSjsg struct drm_i915_private *i915 = to_i915(encoder->base.dev); 18151bb76ff1Sjsg struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc); 1816ad8b1aafSjsg const struct drm_display_mode *adjusted_mode = 1817ad8b1aafSjsg &pipe_config->hw.adjusted_mode; 1818c349dbc7Sjsg struct intel_dp *intel_dp = enc_to_intel_dp(encoder); 1819c349dbc7Sjsg struct link_config_limits limits; 18201bb76ff1Sjsg bool joiner_needs_dsc = false; 1821c349dbc7Sjsg int ret; 1822c349dbc7Sjsg 18231bb76ff1Sjsg limits.min_rate = intel_dp_common_rate(intel_dp, 0); 18241bb76ff1Sjsg limits.max_rate = intel_dp_max_link_rate(intel_dp); 1825c349dbc7Sjsg 1826c349dbc7Sjsg limits.min_lane_count = 1; 1827c349dbc7Sjsg limits.max_lane_count = intel_dp_max_lane_count(intel_dp); 1828c349dbc7Sjsg 18295ca02815Sjsg limits.min_bpp = intel_dp_min_bpp(pipe_config->output_format); 18301bb76ff1Sjsg limits.max_bpp = intel_dp_max_bpp(intel_dp, pipe_config, respect_downstream_limits); 1831c349dbc7Sjsg 18325ca02815Sjsg if (intel_dp->use_max_params) { 1833c349dbc7Sjsg /* 1834c349dbc7Sjsg * Use the maximum clock and number of lanes the eDP panel 18355ca02815Sjsg * advertizes being capable of in case the initial fast 18365ca02815Sjsg * optimal params failed us. The panels are generally 1837c349dbc7Sjsg * designed to support only a single clock and lane 18385ca02815Sjsg * configuration, and typically on older panels these 18395ca02815Sjsg * values correspond to the native resolution of the panel. 1840c349dbc7Sjsg */ 1841c349dbc7Sjsg limits.min_lane_count = limits.max_lane_count; 18421bb76ff1Sjsg limits.min_rate = limits.max_rate; 1843c349dbc7Sjsg } 1844c349dbc7Sjsg 1845c349dbc7Sjsg intel_dp_adjust_compliance_config(intel_dp, pipe_config, &limits); 1846c349dbc7Sjsg 1847ad8b1aafSjsg drm_dbg_kms(&i915->drm, "DP link computation with max lane count %i " 1848c349dbc7Sjsg "max rate %d max bpp %d pixel clock %iKHz\n", 18491bb76ff1Sjsg limits.max_lane_count, limits.max_rate, 1850c349dbc7Sjsg limits.max_bpp, adjusted_mode->crtc_clock); 1851c349dbc7Sjsg 18521bb76ff1Sjsg if (intel_dp_need_bigjoiner(intel_dp, adjusted_mode->crtc_hdisplay, 18531bb76ff1Sjsg adjusted_mode->crtc_clock)) 18541bb76ff1Sjsg pipe_config->bigjoiner_pipes = GENMASK(crtc->pipe + 1, crtc->pipe); 18551bb76ff1Sjsg 18561bb76ff1Sjsg /* 18571bb76ff1Sjsg * Pipe joiner needs compression up to display 12 due to bandwidth 18581bb76ff1Sjsg * limitation. DG2 onwards pipe joiner can be enabled without 18591bb76ff1Sjsg * compression. 18601bb76ff1Sjsg */ 18611bb76ff1Sjsg joiner_needs_dsc = DISPLAY_VER(i915) < 13 && pipe_config->bigjoiner_pipes; 18625ca02815Sjsg 1863c349dbc7Sjsg /* 18645ca02815Sjsg * Optimize for slow and wide for everything, because there are some 18655ca02815Sjsg * eDP 1.3 and 1.4 panels don't work well with fast and narrow. 1866c349dbc7Sjsg */ 18671bb76ff1Sjsg ret = intel_dp_compute_link_config_wide(intel_dp, pipe_config, conn_state, &limits); 1868c349dbc7Sjsg 18691bb76ff1Sjsg if (ret || joiner_needs_dsc || intel_dp->force_dsc_en) { 18701bb76ff1Sjsg drm_dbg_kms(&i915->drm, "Try DSC (fallback=%s, joiner=%s, force=%s)\n", 18711bb76ff1Sjsg str_yes_no(ret), str_yes_no(joiner_needs_dsc), 18721bb76ff1Sjsg str_yes_no(intel_dp->force_dsc_en)); 1873c349dbc7Sjsg ret = intel_dp_dsc_compute_config(intel_dp, pipe_config, 1874f005ef32Sjsg conn_state, &limits, 64, true); 1875c349dbc7Sjsg if (ret < 0) 1876c349dbc7Sjsg return ret; 1877c349dbc7Sjsg } 1878c349dbc7Sjsg 1879c349dbc7Sjsg if (pipe_config->dsc.compression_enable) { 1880ad8b1aafSjsg drm_dbg_kms(&i915->drm, 1881ad8b1aafSjsg "DP lane count %d clock %d Input bpp %d Compressed bpp %d\n", 1882c349dbc7Sjsg pipe_config->lane_count, pipe_config->port_clock, 1883c349dbc7Sjsg pipe_config->pipe_bpp, 1884c349dbc7Sjsg pipe_config->dsc.compressed_bpp); 1885c349dbc7Sjsg 1886ad8b1aafSjsg drm_dbg_kms(&i915->drm, 1887ad8b1aafSjsg "DP link rate required %i available %i\n", 1888c349dbc7Sjsg intel_dp_link_required(adjusted_mode->crtc_clock, 1889c349dbc7Sjsg pipe_config->dsc.compressed_bpp), 1890c349dbc7Sjsg intel_dp_max_data_rate(pipe_config->port_clock, 1891c349dbc7Sjsg pipe_config->lane_count)); 1892c349dbc7Sjsg } else { 1893ad8b1aafSjsg drm_dbg_kms(&i915->drm, "DP lane count %d clock %d bpp %d\n", 1894c349dbc7Sjsg pipe_config->lane_count, pipe_config->port_clock, 1895c349dbc7Sjsg pipe_config->pipe_bpp); 1896c349dbc7Sjsg 1897ad8b1aafSjsg drm_dbg_kms(&i915->drm, 1898ad8b1aafSjsg "DP link rate required %i available %i\n", 1899c349dbc7Sjsg intel_dp_link_required(adjusted_mode->crtc_clock, 1900c349dbc7Sjsg pipe_config->pipe_bpp), 1901c349dbc7Sjsg intel_dp_max_data_rate(pipe_config->port_clock, 1902c349dbc7Sjsg pipe_config->lane_count)); 1903c349dbc7Sjsg } 1904c349dbc7Sjsg return 0; 1905c349dbc7Sjsg } 1906c349dbc7Sjsg 1907c349dbc7Sjsg bool intel_dp_limited_color_range(const struct intel_crtc_state *crtc_state, 1908c349dbc7Sjsg const struct drm_connector_state *conn_state) 1909c349dbc7Sjsg { 1910c349dbc7Sjsg const struct intel_digital_connector_state *intel_conn_state = 1911c349dbc7Sjsg to_intel_digital_connector_state(conn_state); 1912c349dbc7Sjsg const struct drm_display_mode *adjusted_mode = 1913c349dbc7Sjsg &crtc_state->hw.adjusted_mode; 1914c349dbc7Sjsg 1915c349dbc7Sjsg /* 1916c349dbc7Sjsg * Our YCbCr output is always limited range. 1917c349dbc7Sjsg * crtc_state->limited_color_range only applies to RGB, 1918c349dbc7Sjsg * and it must never be set for YCbCr or we risk setting 1919f005ef32Sjsg * some conflicting bits in TRANSCONF which will mess up 1920c349dbc7Sjsg * the colors on the monitor. 1921c349dbc7Sjsg */ 1922c349dbc7Sjsg if (crtc_state->output_format != INTEL_OUTPUT_FORMAT_RGB) 1923c349dbc7Sjsg return false; 1924c349dbc7Sjsg 1925c349dbc7Sjsg if (intel_conn_state->broadcast_rgb == INTEL_BROADCAST_RGB_AUTO) { 1926c349dbc7Sjsg /* 1927c349dbc7Sjsg * See: 1928c349dbc7Sjsg * CEA-861-E - 5.1 Default Encoding Parameters 1929c349dbc7Sjsg * VESA DisplayPort Ver.1.2a - 5.1.1.1 Video Colorimetry 1930c349dbc7Sjsg */ 1931c349dbc7Sjsg return crtc_state->pipe_bpp != 18 && 1932c349dbc7Sjsg drm_default_rgb_quant_range(adjusted_mode) == 1933c349dbc7Sjsg HDMI_QUANTIZATION_RANGE_LIMITED; 1934c349dbc7Sjsg } else { 1935c349dbc7Sjsg return intel_conn_state->broadcast_rgb == 1936c349dbc7Sjsg INTEL_BROADCAST_RGB_LIMITED; 1937c349dbc7Sjsg } 1938c349dbc7Sjsg } 1939c349dbc7Sjsg 1940c349dbc7Sjsg static bool intel_dp_port_has_audio(struct drm_i915_private *dev_priv, 1941c349dbc7Sjsg enum port port) 1942c349dbc7Sjsg { 1943c349dbc7Sjsg if (IS_G4X(dev_priv)) 1944c349dbc7Sjsg return false; 19455ca02815Sjsg if (DISPLAY_VER(dev_priv) < 12 && port == PORT_A) 1946c349dbc7Sjsg return false; 1947c349dbc7Sjsg 1948c349dbc7Sjsg return true; 1949c349dbc7Sjsg } 1950c349dbc7Sjsg 1951ad8b1aafSjsg static void intel_dp_compute_vsc_colorimetry(const struct intel_crtc_state *crtc_state, 1952ad8b1aafSjsg const struct drm_connector_state *conn_state, 1953ad8b1aafSjsg struct drm_dp_vsc_sdp *vsc) 1954ad8b1aafSjsg { 1955ad8b1aafSjsg struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); 1956ad8b1aafSjsg struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 1957ad8b1aafSjsg 1958ad8b1aafSjsg /* 1959ad8b1aafSjsg * Prepare VSC Header for SU as per DP 1.4 spec, Table 2-118 1960ad8b1aafSjsg * VSC SDP supporting 3D stereo, PSR2, and Pixel Encoding/ 1961ad8b1aafSjsg * Colorimetry Format indication. 1962ad8b1aafSjsg */ 1963ad8b1aafSjsg vsc->revision = 0x5; 1964ad8b1aafSjsg vsc->length = 0x13; 1965ad8b1aafSjsg 1966ad8b1aafSjsg /* DP 1.4a spec, Table 2-120 */ 1967ad8b1aafSjsg switch (crtc_state->output_format) { 1968ad8b1aafSjsg case INTEL_OUTPUT_FORMAT_YCBCR444: 1969ad8b1aafSjsg vsc->pixelformat = DP_PIXELFORMAT_YUV444; 1970ad8b1aafSjsg break; 1971ad8b1aafSjsg case INTEL_OUTPUT_FORMAT_YCBCR420: 1972ad8b1aafSjsg vsc->pixelformat = DP_PIXELFORMAT_YUV420; 1973ad8b1aafSjsg break; 1974ad8b1aafSjsg case INTEL_OUTPUT_FORMAT_RGB: 1975ad8b1aafSjsg default: 1976ad8b1aafSjsg vsc->pixelformat = DP_PIXELFORMAT_RGB; 1977ad8b1aafSjsg } 1978ad8b1aafSjsg 1979ad8b1aafSjsg switch (conn_state->colorspace) { 1980ad8b1aafSjsg case DRM_MODE_COLORIMETRY_BT709_YCC: 1981ad8b1aafSjsg vsc->colorimetry = DP_COLORIMETRY_BT709_YCC; 1982ad8b1aafSjsg break; 1983ad8b1aafSjsg case DRM_MODE_COLORIMETRY_XVYCC_601: 1984ad8b1aafSjsg vsc->colorimetry = DP_COLORIMETRY_XVYCC_601; 1985ad8b1aafSjsg break; 1986ad8b1aafSjsg case DRM_MODE_COLORIMETRY_XVYCC_709: 1987ad8b1aafSjsg vsc->colorimetry = DP_COLORIMETRY_XVYCC_709; 1988ad8b1aafSjsg break; 1989ad8b1aafSjsg case DRM_MODE_COLORIMETRY_SYCC_601: 1990ad8b1aafSjsg vsc->colorimetry = DP_COLORIMETRY_SYCC_601; 1991ad8b1aafSjsg break; 1992ad8b1aafSjsg case DRM_MODE_COLORIMETRY_OPYCC_601: 1993ad8b1aafSjsg vsc->colorimetry = DP_COLORIMETRY_OPYCC_601; 1994ad8b1aafSjsg break; 1995ad8b1aafSjsg case DRM_MODE_COLORIMETRY_BT2020_CYCC: 1996ad8b1aafSjsg vsc->colorimetry = DP_COLORIMETRY_BT2020_CYCC; 1997ad8b1aafSjsg break; 1998ad8b1aafSjsg case DRM_MODE_COLORIMETRY_BT2020_RGB: 1999ad8b1aafSjsg vsc->colorimetry = DP_COLORIMETRY_BT2020_RGB; 2000ad8b1aafSjsg break; 2001ad8b1aafSjsg case DRM_MODE_COLORIMETRY_BT2020_YCC: 2002ad8b1aafSjsg vsc->colorimetry = DP_COLORIMETRY_BT2020_YCC; 2003ad8b1aafSjsg break; 2004ad8b1aafSjsg case DRM_MODE_COLORIMETRY_DCI_P3_RGB_D65: 2005ad8b1aafSjsg case DRM_MODE_COLORIMETRY_DCI_P3_RGB_THEATER: 2006ad8b1aafSjsg vsc->colorimetry = DP_COLORIMETRY_DCI_P3_RGB; 2007ad8b1aafSjsg break; 2008ad8b1aafSjsg default: 2009ad8b1aafSjsg /* 2010ad8b1aafSjsg * RGB->YCBCR color conversion uses the BT.709 2011ad8b1aafSjsg * color space. 2012ad8b1aafSjsg */ 2013ad8b1aafSjsg if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420) 2014ad8b1aafSjsg vsc->colorimetry = DP_COLORIMETRY_BT709_YCC; 2015ad8b1aafSjsg else 2016ad8b1aafSjsg vsc->colorimetry = DP_COLORIMETRY_DEFAULT; 2017ad8b1aafSjsg break; 2018ad8b1aafSjsg } 2019ad8b1aafSjsg 2020ad8b1aafSjsg vsc->bpc = crtc_state->pipe_bpp / 3; 2021ad8b1aafSjsg 2022ad8b1aafSjsg /* only RGB pixelformat supports 6 bpc */ 2023ad8b1aafSjsg drm_WARN_ON(&dev_priv->drm, 2024ad8b1aafSjsg vsc->bpc == 6 && vsc->pixelformat != DP_PIXELFORMAT_RGB); 2025ad8b1aafSjsg 2026ad8b1aafSjsg /* all YCbCr are always limited range */ 2027ad8b1aafSjsg vsc->dynamic_range = DP_DYNAMIC_RANGE_CTA; 2028ad8b1aafSjsg vsc->content_type = DP_CONTENT_TYPE_NOT_DEFINED; 2029ad8b1aafSjsg } 2030ad8b1aafSjsg 2031ad8b1aafSjsg static void intel_dp_compute_vsc_sdp(struct intel_dp *intel_dp, 2032ad8b1aafSjsg struct intel_crtc_state *crtc_state, 2033ad8b1aafSjsg const struct drm_connector_state *conn_state) 2034ad8b1aafSjsg { 2035ad8b1aafSjsg struct drm_dp_vsc_sdp *vsc = &crtc_state->infoframes.vsc; 2036ad8b1aafSjsg 2037ad8b1aafSjsg /* When a crtc state has PSR, VSC SDP will be handled by PSR routine */ 2038ad8b1aafSjsg if (crtc_state->has_psr) 2039ad8b1aafSjsg return; 2040ad8b1aafSjsg 2041ad8b1aafSjsg if (!intel_dp_needs_vsc_sdp(crtc_state, conn_state)) 2042ad8b1aafSjsg return; 2043ad8b1aafSjsg 2044ad8b1aafSjsg crtc_state->infoframes.enable |= intel_hdmi_infoframe_enable(DP_SDP_VSC); 2045ad8b1aafSjsg vsc->sdp_type = DP_SDP_VSC; 2046ad8b1aafSjsg intel_dp_compute_vsc_colorimetry(crtc_state, conn_state, 2047ad8b1aafSjsg &crtc_state->infoframes.vsc); 2048ad8b1aafSjsg } 2049ad8b1aafSjsg 2050ad8b1aafSjsg void intel_dp_compute_psr_vsc_sdp(struct intel_dp *intel_dp, 2051ad8b1aafSjsg const struct intel_crtc_state *crtc_state, 2052ad8b1aafSjsg const struct drm_connector_state *conn_state, 2053ad8b1aafSjsg struct drm_dp_vsc_sdp *vsc) 2054ad8b1aafSjsg { 2055ad8b1aafSjsg vsc->sdp_type = DP_SDP_VSC; 2056ad8b1aafSjsg 20571bb76ff1Sjsg if (crtc_state->has_psr2) { 20585ca02815Sjsg if (intel_dp->psr.colorimetry_support && 2059ad8b1aafSjsg intel_dp_needs_vsc_sdp(crtc_state, conn_state)) { 2060ad8b1aafSjsg /* [PSR2, +Colorimetry] */ 2061ad8b1aafSjsg intel_dp_compute_vsc_colorimetry(crtc_state, conn_state, 2062ad8b1aafSjsg vsc); 2063ad8b1aafSjsg } else { 2064ad8b1aafSjsg /* 2065ad8b1aafSjsg * [PSR2, -Colorimetry] 2066ad8b1aafSjsg * Prepare VSC Header for SU as per eDP 1.4 spec, Table 6-11 2067ad8b1aafSjsg * 3D stereo + PSR/PSR2 + Y-coordinate. 2068ad8b1aafSjsg */ 2069ad8b1aafSjsg vsc->revision = 0x4; 2070ad8b1aafSjsg vsc->length = 0xe; 2071ad8b1aafSjsg } 2072ad8b1aafSjsg } else { 2073ad8b1aafSjsg /* 2074ad8b1aafSjsg * [PSR1] 2075ad8b1aafSjsg * Prepare VSC Header for SU as per DP 1.4 spec, Table 2-118 2076ad8b1aafSjsg * VSC SDP supporting 3D stereo + PSR (applies to eDP v1.3 or 2077ad8b1aafSjsg * higher). 2078ad8b1aafSjsg */ 2079ad8b1aafSjsg vsc->revision = 0x2; 2080ad8b1aafSjsg vsc->length = 0x8; 2081ad8b1aafSjsg } 2082ad8b1aafSjsg } 2083ad8b1aafSjsg 2084ad8b1aafSjsg static void 2085ad8b1aafSjsg intel_dp_compute_hdr_metadata_infoframe_sdp(struct intel_dp *intel_dp, 2086ad8b1aafSjsg struct intel_crtc_state *crtc_state, 2087ad8b1aafSjsg const struct drm_connector_state *conn_state) 2088ad8b1aafSjsg { 2089ad8b1aafSjsg int ret; 2090ad8b1aafSjsg struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); 2091ad8b1aafSjsg struct hdmi_drm_infoframe *drm_infoframe = &crtc_state->infoframes.drm.drm; 2092ad8b1aafSjsg 2093ad8b1aafSjsg if (!conn_state->hdr_output_metadata) 2094ad8b1aafSjsg return; 2095ad8b1aafSjsg 2096ad8b1aafSjsg ret = drm_hdmi_infoframe_set_hdr_metadata(drm_infoframe, conn_state); 2097ad8b1aafSjsg 2098ad8b1aafSjsg if (ret) { 2099ad8b1aafSjsg drm_dbg_kms(&dev_priv->drm, "couldn't set HDR metadata in infoframe\n"); 2100ad8b1aafSjsg return; 2101ad8b1aafSjsg } 2102ad8b1aafSjsg 2103ad8b1aafSjsg crtc_state->infoframes.enable |= 2104ad8b1aafSjsg intel_hdmi_infoframe_enable(HDMI_PACKET_TYPE_GAMUT_METADATA); 2105ad8b1aafSjsg } 2106ad8b1aafSjsg 21071bb76ff1Sjsg static bool cpu_transcoder_has_drrs(struct drm_i915_private *i915, 21081bb76ff1Sjsg enum transcoder cpu_transcoder) 21091bb76ff1Sjsg { 21101bb76ff1Sjsg if (HAS_DOUBLE_BUFFERED_M_N(i915)) 21111bb76ff1Sjsg return true; 21121bb76ff1Sjsg 21131bb76ff1Sjsg return intel_cpu_transcoder_has_m2_n2(i915, cpu_transcoder); 21141bb76ff1Sjsg } 21151bb76ff1Sjsg 21161bb76ff1Sjsg static bool can_enable_drrs(struct intel_connector *connector, 21171bb76ff1Sjsg const struct intel_crtc_state *pipe_config, 21181bb76ff1Sjsg const struct drm_display_mode *downclock_mode) 21191bb76ff1Sjsg { 21201bb76ff1Sjsg struct drm_i915_private *i915 = to_i915(connector->base.dev); 21211bb76ff1Sjsg 21221bb76ff1Sjsg if (pipe_config->vrr.enable) 21231bb76ff1Sjsg return false; 21241bb76ff1Sjsg 21251bb76ff1Sjsg /* 21261bb76ff1Sjsg * DRRS and PSR can't be enable together, so giving preference to PSR 21271bb76ff1Sjsg * as it allows more power-savings by complete shutting down display, 21281bb76ff1Sjsg * so to guarantee this, intel_drrs_compute_config() must be called 21291bb76ff1Sjsg * after intel_psr_compute_config(). 21301bb76ff1Sjsg */ 21311bb76ff1Sjsg if (pipe_config->has_psr) 21321bb76ff1Sjsg return false; 21331bb76ff1Sjsg 21341bb76ff1Sjsg /* FIXME missing FDI M2/N2 etc. */ 21351bb76ff1Sjsg if (pipe_config->has_pch_encoder) 21361bb76ff1Sjsg return false; 21371bb76ff1Sjsg 21381bb76ff1Sjsg if (!cpu_transcoder_has_drrs(i915, pipe_config->cpu_transcoder)) 21391bb76ff1Sjsg return false; 21401bb76ff1Sjsg 21411bb76ff1Sjsg return downclock_mode && 21421bb76ff1Sjsg intel_panel_drrs_type(connector) == DRRS_TYPE_SEAMLESS; 21431bb76ff1Sjsg } 21441bb76ff1Sjsg 21451bb76ff1Sjsg static void 21461bb76ff1Sjsg intel_dp_drrs_compute_config(struct intel_connector *connector, 21471bb76ff1Sjsg struct intel_crtc_state *pipe_config, 21481bb76ff1Sjsg int output_bpp) 21491bb76ff1Sjsg { 21501bb76ff1Sjsg struct drm_i915_private *i915 = to_i915(connector->base.dev); 21511bb76ff1Sjsg const struct drm_display_mode *downclock_mode = 21521bb76ff1Sjsg intel_panel_downclock_mode(connector, &pipe_config->hw.adjusted_mode); 21531bb76ff1Sjsg int pixel_clock; 21541bb76ff1Sjsg 2155da099fe5Sjsg /* 2156da099fe5Sjsg * FIXME all joined pipes share the same transcoder. 2157da099fe5Sjsg * Need to account for that when updating M/N live. 2158da099fe5Sjsg */ 2159da099fe5Sjsg if (has_seamless_m_n(connector) && !pipe_config->bigjoiner_pipes) 21601b89dd6fSjsg pipe_config->update_m_n = true; 21611bb76ff1Sjsg 21621bb76ff1Sjsg if (!can_enable_drrs(connector, pipe_config, downclock_mode)) { 21631bb76ff1Sjsg if (intel_cpu_transcoder_has_m2_n2(i915, pipe_config->cpu_transcoder)) 21641bb76ff1Sjsg intel_zero_m_n(&pipe_config->dp_m2_n2); 21651bb76ff1Sjsg return; 21661bb76ff1Sjsg } 21671bb76ff1Sjsg 21681bb76ff1Sjsg if (IS_IRONLAKE(i915) || IS_SANDYBRIDGE(i915) || IS_IVYBRIDGE(i915)) 21691bb76ff1Sjsg pipe_config->msa_timing_delay = connector->panel.vbt.edp.drrs_msa_timing_delay; 21701bb76ff1Sjsg 21711bb76ff1Sjsg pipe_config->has_drrs = true; 21721bb76ff1Sjsg 21731bb76ff1Sjsg pixel_clock = downclock_mode->clock; 21741bb76ff1Sjsg if (pipe_config->splitter.enable) 21751bb76ff1Sjsg pixel_clock /= pipe_config->splitter.link_count; 21761bb76ff1Sjsg 21771bb76ff1Sjsg intel_link_compute_m_n(output_bpp, pipe_config->lane_count, pixel_clock, 21781bb76ff1Sjsg pipe_config->port_clock, &pipe_config->dp_m2_n2, 21791bb76ff1Sjsg pipe_config->fec_enable); 21801bb76ff1Sjsg 21811bb76ff1Sjsg /* FIXME: abstract this better */ 21821bb76ff1Sjsg if (pipe_config->splitter.enable) 21831bb76ff1Sjsg pipe_config->dp_m2_n2.data_m *= pipe_config->splitter.link_count; 21841bb76ff1Sjsg } 21851bb76ff1Sjsg 21861bb76ff1Sjsg static bool intel_dp_has_audio(struct intel_encoder *encoder, 21871bb76ff1Sjsg const struct drm_connector_state *conn_state) 21881bb76ff1Sjsg { 21891bb76ff1Sjsg struct drm_i915_private *i915 = to_i915(encoder->base.dev); 21901bb76ff1Sjsg struct intel_dp *intel_dp = enc_to_intel_dp(encoder); 2191f005ef32Sjsg struct intel_connector *connector = intel_dp->attached_connector; 21921bb76ff1Sjsg const struct intel_digital_connector_state *intel_conn_state = 21931bb76ff1Sjsg to_intel_digital_connector_state(conn_state); 21941bb76ff1Sjsg 21951bb76ff1Sjsg if (!intel_dp_port_has_audio(i915, encoder->port)) 21961bb76ff1Sjsg return false; 21971bb76ff1Sjsg 21981bb76ff1Sjsg if (intel_conn_state->force_audio == HDMI_AUDIO_AUTO) 2199f005ef32Sjsg return connector->base.display_info.has_audio; 22001bb76ff1Sjsg else 22011bb76ff1Sjsg return intel_conn_state->force_audio == HDMI_AUDIO_ON; 22021bb76ff1Sjsg } 22031bb76ff1Sjsg 22041bb76ff1Sjsg static int 22051bb76ff1Sjsg intel_dp_compute_output_format(struct intel_encoder *encoder, 22061bb76ff1Sjsg struct intel_crtc_state *crtc_state, 22071bb76ff1Sjsg struct drm_connector_state *conn_state, 22081bb76ff1Sjsg bool respect_downstream_limits) 22091bb76ff1Sjsg { 22101bb76ff1Sjsg struct drm_i915_private *i915 = to_i915(encoder->base.dev); 22111bb76ff1Sjsg struct intel_dp *intel_dp = enc_to_intel_dp(encoder); 22121bb76ff1Sjsg struct intel_connector *connector = intel_dp->attached_connector; 22131bb76ff1Sjsg const struct drm_display_info *info = &connector->base.display_info; 22141bb76ff1Sjsg const struct drm_display_mode *adjusted_mode = &crtc_state->hw.adjusted_mode; 22151bb76ff1Sjsg bool ycbcr_420_only; 22161bb76ff1Sjsg int ret; 22171bb76ff1Sjsg 22181bb76ff1Sjsg ycbcr_420_only = drm_mode_is_420_only(info, adjusted_mode); 22191bb76ff1Sjsg 2220f005ef32Sjsg if (ycbcr_420_only && !connector->base.ycbcr_420_allowed) { 22211bb76ff1Sjsg drm_dbg_kms(&i915->drm, 22221bb76ff1Sjsg "YCbCr 4:2:0 mode but YCbCr 4:2:0 output not possible. Falling back to RGB.\n"); 2223f005ef32Sjsg crtc_state->sink_format = INTEL_OUTPUT_FORMAT_RGB; 2224f005ef32Sjsg } else { 2225f005ef32Sjsg crtc_state->sink_format = intel_dp_sink_format(connector, adjusted_mode); 22261bb76ff1Sjsg } 22271bb76ff1Sjsg 2228f005ef32Sjsg crtc_state->output_format = intel_dp_output_format(connector, crtc_state->sink_format); 2229f005ef32Sjsg 22301bb76ff1Sjsg ret = intel_dp_compute_link_config(encoder, crtc_state, conn_state, 22311bb76ff1Sjsg respect_downstream_limits); 22321bb76ff1Sjsg if (ret) { 2233f005ef32Sjsg if (crtc_state->sink_format == INTEL_OUTPUT_FORMAT_YCBCR420 || 22341bb76ff1Sjsg !connector->base.ycbcr_420_allowed || 22351bb76ff1Sjsg !drm_mode_is_420_also(info, adjusted_mode)) 22361bb76ff1Sjsg return ret; 22371bb76ff1Sjsg 2238f005ef32Sjsg crtc_state->sink_format = INTEL_OUTPUT_FORMAT_YCBCR420; 2239f005ef32Sjsg crtc_state->output_format = intel_dp_output_format(connector, 2240f005ef32Sjsg crtc_state->sink_format); 22411bb76ff1Sjsg ret = intel_dp_compute_link_config(encoder, crtc_state, conn_state, 22421bb76ff1Sjsg respect_downstream_limits); 22431bb76ff1Sjsg } 22441bb76ff1Sjsg 22451bb76ff1Sjsg return ret; 22461bb76ff1Sjsg } 22471bb76ff1Sjsg 2248f005ef32Sjsg static void 2249f005ef32Sjsg intel_dp_audio_compute_config(struct intel_encoder *encoder, 2250f005ef32Sjsg struct intel_crtc_state *pipe_config, 2251f005ef32Sjsg struct drm_connector_state *conn_state) 2252f005ef32Sjsg { 2253f005ef32Sjsg struct drm_i915_private *i915 = to_i915(encoder->base.dev); 2254f005ef32Sjsg struct drm_connector *connector = conn_state->connector; 2255f005ef32Sjsg 2256f005ef32Sjsg pipe_config->sdp_split_enable = 2257f005ef32Sjsg intel_dp_has_audio(encoder, conn_state) && 2258f005ef32Sjsg intel_dp_is_uhbr(pipe_config); 2259f005ef32Sjsg 2260f005ef32Sjsg drm_dbg_kms(&i915->drm, "[CONNECTOR:%d:%s] SDP split enable: %s\n", 2261f005ef32Sjsg connector->base.id, connector->name, 2262f005ef32Sjsg str_yes_no(pipe_config->sdp_split_enable)); 2263f005ef32Sjsg } 2264f005ef32Sjsg 2265c349dbc7Sjsg int 2266c349dbc7Sjsg intel_dp_compute_config(struct intel_encoder *encoder, 2267c349dbc7Sjsg struct intel_crtc_state *pipe_config, 2268c349dbc7Sjsg struct drm_connector_state *conn_state) 2269c349dbc7Sjsg { 2270c349dbc7Sjsg struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 2271c349dbc7Sjsg struct drm_display_mode *adjusted_mode = &pipe_config->hw.adjusted_mode; 2272c349dbc7Sjsg struct intel_dp *intel_dp = enc_to_intel_dp(encoder); 22731bb76ff1Sjsg const struct drm_display_mode *fixed_mode; 22741bb76ff1Sjsg struct intel_connector *connector = intel_dp->attached_connector; 2275c349dbc7Sjsg int ret = 0, output_bpp; 2276c349dbc7Sjsg 22771bb76ff1Sjsg if (HAS_PCH_SPLIT(dev_priv) && !HAS_DDI(dev_priv) && encoder->port != PORT_A) 2278c349dbc7Sjsg pipe_config->has_pch_encoder = true; 2279c349dbc7Sjsg 2280f005ef32Sjsg pipe_config->has_audio = 2281f005ef32Sjsg intel_dp_has_audio(encoder, conn_state) && 2282f005ef32Sjsg intel_audio_compute_config(encoder, pipe_config, conn_state); 2283c349dbc7Sjsg 22841bb76ff1Sjsg fixed_mode = intel_panel_fixed_mode(connector, adjusted_mode); 22851bb76ff1Sjsg if (intel_dp_is_edp(intel_dp) && fixed_mode) { 22861bb76ff1Sjsg ret = intel_panel_compute_config(connector, adjusted_mode); 2287c349dbc7Sjsg if (ret) 2288c349dbc7Sjsg return ret; 2289c349dbc7Sjsg } 2290c349dbc7Sjsg 2291c349dbc7Sjsg if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN) 2292c349dbc7Sjsg return -EINVAL; 2293c349dbc7Sjsg 2294f005ef32Sjsg if (!connector->base.interlace_allowed && 2295c349dbc7Sjsg adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE) 2296c349dbc7Sjsg return -EINVAL; 2297c349dbc7Sjsg 2298c349dbc7Sjsg if (adjusted_mode->flags & DRM_MODE_FLAG_DBLCLK) 2299c349dbc7Sjsg return -EINVAL; 2300c349dbc7Sjsg 2301c349dbc7Sjsg if (intel_dp_hdisplay_bad(dev_priv, adjusted_mode->crtc_hdisplay)) 2302c349dbc7Sjsg return -EINVAL; 2303c349dbc7Sjsg 23041bb76ff1Sjsg /* 23051bb76ff1Sjsg * Try to respect downstream TMDS clock limits first, if 23061bb76ff1Sjsg * that fails assume the user might know something we don't. 23071bb76ff1Sjsg */ 23081bb76ff1Sjsg ret = intel_dp_compute_output_format(encoder, pipe_config, conn_state, true); 23091bb76ff1Sjsg if (ret) 23101bb76ff1Sjsg ret = intel_dp_compute_output_format(encoder, pipe_config, conn_state, false); 23111bb76ff1Sjsg if (ret) 2312c349dbc7Sjsg return ret; 2313c349dbc7Sjsg 23141bb76ff1Sjsg if ((intel_dp_is_edp(intel_dp) && fixed_mode) || 23151bb76ff1Sjsg pipe_config->output_format == INTEL_OUTPUT_FORMAT_YCBCR420) { 23161bb76ff1Sjsg ret = intel_panel_fitting(pipe_config, conn_state); 23171bb76ff1Sjsg if (ret) 23181bb76ff1Sjsg return ret; 23191bb76ff1Sjsg } 23201bb76ff1Sjsg 2321c349dbc7Sjsg pipe_config->limited_color_range = 2322c349dbc7Sjsg intel_dp_limited_color_range(pipe_config, conn_state); 2323c349dbc7Sjsg 2324f005ef32Sjsg pipe_config->enhanced_framing = 2325f005ef32Sjsg drm_dp_enhanced_frame_cap(intel_dp->dpcd); 2326f005ef32Sjsg 2327c349dbc7Sjsg if (pipe_config->dsc.compression_enable) 2328c349dbc7Sjsg output_bpp = pipe_config->dsc.compressed_bpp; 2329c349dbc7Sjsg else 23305ca02815Sjsg output_bpp = intel_dp_output_bpp(pipe_config->output_format, 23315ca02815Sjsg pipe_config->pipe_bpp); 23325ca02815Sjsg 23335ca02815Sjsg if (intel_dp->mso_link_count) { 23345ca02815Sjsg int n = intel_dp->mso_link_count; 23355ca02815Sjsg int overlap = intel_dp->mso_pixel_overlap; 23365ca02815Sjsg 23375ca02815Sjsg pipe_config->splitter.enable = true; 23385ca02815Sjsg pipe_config->splitter.link_count = n; 23395ca02815Sjsg pipe_config->splitter.pixel_overlap = overlap; 23405ca02815Sjsg 23415ca02815Sjsg drm_dbg_kms(&dev_priv->drm, "MSO link count %d, pixel overlap %d\n", 23425ca02815Sjsg n, overlap); 23435ca02815Sjsg 23445ca02815Sjsg adjusted_mode->crtc_hdisplay = adjusted_mode->crtc_hdisplay / n + overlap; 23455ca02815Sjsg adjusted_mode->crtc_hblank_start = adjusted_mode->crtc_hblank_start / n + overlap; 23465ca02815Sjsg adjusted_mode->crtc_hblank_end = adjusted_mode->crtc_hblank_end / n + overlap; 23475ca02815Sjsg adjusted_mode->crtc_hsync_start = adjusted_mode->crtc_hsync_start / n + overlap; 23485ca02815Sjsg adjusted_mode->crtc_hsync_end = adjusted_mode->crtc_hsync_end / n + overlap; 23495ca02815Sjsg adjusted_mode->crtc_htotal = adjusted_mode->crtc_htotal / n + overlap; 23505ca02815Sjsg adjusted_mode->crtc_clock /= n; 23515ca02815Sjsg } 2352c349dbc7Sjsg 2353f005ef32Sjsg intel_dp_audio_compute_config(encoder, pipe_config, conn_state); 2354f005ef32Sjsg 2355c349dbc7Sjsg intel_link_compute_m_n(output_bpp, 2356c349dbc7Sjsg pipe_config->lane_count, 2357c349dbc7Sjsg adjusted_mode->crtc_clock, 2358c349dbc7Sjsg pipe_config->port_clock, 2359c349dbc7Sjsg &pipe_config->dp_m_n, 23601bb76ff1Sjsg pipe_config->fec_enable); 2361c349dbc7Sjsg 23625ca02815Sjsg /* FIXME: abstract this better */ 23635ca02815Sjsg if (pipe_config->splitter.enable) 23641bb76ff1Sjsg pipe_config->dp_m_n.data_m *= pipe_config->splitter.link_count; 2365c349dbc7Sjsg 23665ca02815Sjsg if (!HAS_DDI(dev_priv)) 23675ca02815Sjsg g4x_dp_set_clock(encoder, pipe_config); 23685ca02815Sjsg 23695ca02815Sjsg intel_vrr_compute_config(pipe_config, conn_state); 23701bb76ff1Sjsg intel_psr_compute_config(intel_dp, pipe_config, conn_state); 23711bb76ff1Sjsg intel_dp_drrs_compute_config(connector, pipe_config, output_bpp); 2372ad8b1aafSjsg intel_dp_compute_vsc_sdp(intel_dp, pipe_config, conn_state); 2373ad8b1aafSjsg intel_dp_compute_hdr_metadata_infoframe_sdp(intel_dp, pipe_config, conn_state); 2374c349dbc7Sjsg 2375c349dbc7Sjsg return 0; 2376c349dbc7Sjsg } 2377c349dbc7Sjsg 2378c349dbc7Sjsg void intel_dp_set_link_params(struct intel_dp *intel_dp, 23795ca02815Sjsg int link_rate, int lane_count) 2380c349dbc7Sjsg { 23811bb76ff1Sjsg memset(intel_dp->train_set, 0, sizeof(intel_dp->train_set)); 2382c349dbc7Sjsg intel_dp->link_trained = false; 2383c349dbc7Sjsg intel_dp->link_rate = link_rate; 2384c349dbc7Sjsg intel_dp->lane_count = lane_count; 2385c349dbc7Sjsg } 2386c349dbc7Sjsg 23875ca02815Sjsg static void intel_dp_reset_max_link_params(struct intel_dp *intel_dp) 2388c349dbc7Sjsg { 23895ca02815Sjsg intel_dp->max_link_lane_count = intel_dp_max_common_lane_count(intel_dp); 23905ca02815Sjsg intel_dp->max_link_rate = intel_dp_max_common_rate(intel_dp); 2391c349dbc7Sjsg } 2392c349dbc7Sjsg 2393c349dbc7Sjsg /* Enable backlight PWM and backlight PP control. */ 2394c349dbc7Sjsg void intel_edp_backlight_on(const struct intel_crtc_state *crtc_state, 2395c349dbc7Sjsg const struct drm_connector_state *conn_state) 2396c349dbc7Sjsg { 2397c349dbc7Sjsg struct intel_dp *intel_dp = enc_to_intel_dp(to_intel_encoder(conn_state->best_encoder)); 2398ad8b1aafSjsg struct drm_i915_private *i915 = dp_to_i915(intel_dp); 2399c349dbc7Sjsg 2400c349dbc7Sjsg if (!intel_dp_is_edp(intel_dp)) 2401c349dbc7Sjsg return; 2402c349dbc7Sjsg 2403ad8b1aafSjsg drm_dbg_kms(&i915->drm, "\n"); 2404c349dbc7Sjsg 24051bb76ff1Sjsg intel_backlight_enable(crtc_state, conn_state); 24065ca02815Sjsg intel_pps_backlight_on(intel_dp); 2407c349dbc7Sjsg } 2408c349dbc7Sjsg 2409c349dbc7Sjsg /* Disable backlight PP control and backlight PWM. */ 2410c349dbc7Sjsg void intel_edp_backlight_off(const struct drm_connector_state *old_conn_state) 2411c349dbc7Sjsg { 2412c349dbc7Sjsg struct intel_dp *intel_dp = enc_to_intel_dp(to_intel_encoder(old_conn_state->best_encoder)); 2413ad8b1aafSjsg struct drm_i915_private *i915 = dp_to_i915(intel_dp); 2414c349dbc7Sjsg 2415c349dbc7Sjsg if (!intel_dp_is_edp(intel_dp)) 2416c349dbc7Sjsg return; 2417c349dbc7Sjsg 2418ad8b1aafSjsg drm_dbg_kms(&i915->drm, "\n"); 2419c349dbc7Sjsg 24205ca02815Sjsg intel_pps_backlight_off(intel_dp); 24211bb76ff1Sjsg intel_backlight_disable(old_conn_state); 2422c349dbc7Sjsg } 2423c349dbc7Sjsg 2424c349dbc7Sjsg static bool downstream_hpd_needs_d0(struct intel_dp *intel_dp) 2425c349dbc7Sjsg { 2426c349dbc7Sjsg /* 2427c349dbc7Sjsg * DPCD 1.2+ should support BRANCH_DEVICE_CTRL, and thus 2428c349dbc7Sjsg * be capable of signalling downstream hpd with a long pulse. 2429c349dbc7Sjsg * Whether or not that means D3 is safe to use is not clear, 2430c349dbc7Sjsg * but let's assume so until proven otherwise. 2431c349dbc7Sjsg * 2432c349dbc7Sjsg * FIXME should really check all downstream ports... 2433c349dbc7Sjsg */ 2434c349dbc7Sjsg return intel_dp->dpcd[DP_DPCD_REV] == 0x11 && 2435c349dbc7Sjsg drm_dp_is_branch(intel_dp->dpcd) && 2436c349dbc7Sjsg intel_dp->downstream_ports[0] & DP_DS_PORT_HPD; 2437c349dbc7Sjsg } 2438c349dbc7Sjsg 2439c349dbc7Sjsg void intel_dp_sink_set_decompression_state(struct intel_dp *intel_dp, 2440c349dbc7Sjsg const struct intel_crtc_state *crtc_state, 2441c349dbc7Sjsg bool enable) 2442c349dbc7Sjsg { 2443ad8b1aafSjsg struct drm_i915_private *i915 = dp_to_i915(intel_dp); 2444c349dbc7Sjsg int ret; 2445c349dbc7Sjsg 2446c349dbc7Sjsg if (!crtc_state->dsc.compression_enable) 2447c349dbc7Sjsg return; 2448c349dbc7Sjsg 2449c349dbc7Sjsg ret = drm_dp_dpcd_writeb(&intel_dp->aux, DP_DSC_ENABLE, 2450c349dbc7Sjsg enable ? DP_DECOMPRESSION_EN : 0); 2451c349dbc7Sjsg if (ret < 0) 2452ad8b1aafSjsg drm_dbg_kms(&i915->drm, 2453ad8b1aafSjsg "Failed to %s sink decompression state\n", 24541bb76ff1Sjsg str_enable_disable(enable)); 24555ca02815Sjsg } 24565ca02815Sjsg 24575ca02815Sjsg static void 24585ca02815Sjsg intel_edp_init_source_oui(struct intel_dp *intel_dp, bool careful) 24595ca02815Sjsg { 24605ca02815Sjsg struct drm_i915_private *i915 = dp_to_i915(intel_dp); 24615ca02815Sjsg u8 oui[] = { 0x00, 0xaa, 0x01 }; 24625ca02815Sjsg u8 buf[3] = { 0 }; 24635ca02815Sjsg 24645ca02815Sjsg /* 24655ca02815Sjsg * During driver init, we want to be careful and avoid changing the source OUI if it's 24665ca02815Sjsg * already set to what we want, so as to avoid clearing any state by accident 24675ca02815Sjsg */ 24685ca02815Sjsg if (careful) { 24695ca02815Sjsg if (drm_dp_dpcd_read(&intel_dp->aux, DP_SOURCE_OUI, buf, sizeof(buf)) < 0) 24705ca02815Sjsg drm_err(&i915->drm, "Failed to read source OUI\n"); 24715ca02815Sjsg 24725ca02815Sjsg if (memcmp(oui, buf, sizeof(oui)) == 0) 24735ca02815Sjsg return; 24745ca02815Sjsg } 24755ca02815Sjsg 24765ca02815Sjsg if (drm_dp_dpcd_write(&intel_dp->aux, DP_SOURCE_OUI, oui, sizeof(oui)) < 0) 24775ca02815Sjsg drm_err(&i915->drm, "Failed to write source OUI\n"); 24785ca02815Sjsg 24795ca02815Sjsg intel_dp->last_oui_write = jiffies; 24805ca02815Sjsg } 24815ca02815Sjsg 24825ca02815Sjsg void intel_dp_wait_source_oui(struct intel_dp *intel_dp) 24835ca02815Sjsg { 2484f005ef32Sjsg struct intel_connector *connector = intel_dp->attached_connector; 24855ca02815Sjsg struct drm_i915_private *i915 = dp_to_i915(intel_dp); 24865ca02815Sjsg 2487f005ef32Sjsg drm_dbg_kms(&i915->drm, "[CONNECTOR:%d:%s] Performing OUI wait (%u ms)\n", 2488f005ef32Sjsg connector->base.base.id, connector->base.name, 2489f005ef32Sjsg connector->panel.vbt.backlight.hdr_dpcd_refresh_timeout); 2490f005ef32Sjsg 2491f005ef32Sjsg wait_remaining_ms_from_jiffies(intel_dp->last_oui_write, 2492f005ef32Sjsg connector->panel.vbt.backlight.hdr_dpcd_refresh_timeout); 2493c349dbc7Sjsg } 2494c349dbc7Sjsg 2495ad8b1aafSjsg /* If the device supports it, try to set the power state appropriately */ 2496ad8b1aafSjsg void intel_dp_set_power(struct intel_dp *intel_dp, u8 mode) 2497c349dbc7Sjsg { 2498ad8b1aafSjsg struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; 2499ad8b1aafSjsg struct drm_i915_private *i915 = to_i915(encoder->base.dev); 2500c349dbc7Sjsg int ret, i; 2501c349dbc7Sjsg 2502c349dbc7Sjsg /* Should have a valid DPCD by this point */ 2503c349dbc7Sjsg if (intel_dp->dpcd[DP_DPCD_REV] < 0x11) 2504c349dbc7Sjsg return; 2505c349dbc7Sjsg 2506ad8b1aafSjsg if (mode != DP_SET_POWER_D0) { 2507c349dbc7Sjsg if (downstream_hpd_needs_d0(intel_dp)) 2508c349dbc7Sjsg return; 2509c349dbc7Sjsg 2510ad8b1aafSjsg ret = drm_dp_dpcd_writeb(&intel_dp->aux, DP_SET_POWER, mode); 2511c349dbc7Sjsg } else { 2512c349dbc7Sjsg struct intel_lspcon *lspcon = dp_to_lspcon(intel_dp); 2513c349dbc7Sjsg 25145ca02815Sjsg lspcon_resume(dp_to_dig_port(intel_dp)); 25155ca02815Sjsg 25165ca02815Sjsg /* Write the source OUI as early as possible */ 25175ca02815Sjsg if (intel_dp_is_edp(intel_dp)) 25185ca02815Sjsg intel_edp_init_source_oui(intel_dp, false); 25195ca02815Sjsg 2520c349dbc7Sjsg /* 2521c349dbc7Sjsg * When turning on, we need to retry for 1ms to give the sink 2522c349dbc7Sjsg * time to wake up. 2523c349dbc7Sjsg */ 2524c349dbc7Sjsg for (i = 0; i < 3; i++) { 2525ad8b1aafSjsg ret = drm_dp_dpcd_writeb(&intel_dp->aux, DP_SET_POWER, mode); 2526c349dbc7Sjsg if (ret == 1) 2527c349dbc7Sjsg break; 2528c349dbc7Sjsg drm_msleep(1); 2529c349dbc7Sjsg } 2530c349dbc7Sjsg 2531c349dbc7Sjsg if (ret == 1 && lspcon->active) 2532c349dbc7Sjsg lspcon_wait_pcon_mode(lspcon); 2533c349dbc7Sjsg } 2534c349dbc7Sjsg 2535c349dbc7Sjsg if (ret != 1) 2536ad8b1aafSjsg drm_dbg_kms(&i915->drm, "[ENCODER:%d:%s] Set power to %s failed\n", 2537ad8b1aafSjsg encoder->base.base.id, encoder->base.name, 2538ad8b1aafSjsg mode == DP_SET_POWER_D0 ? "D0" : "D3"); 2539c349dbc7Sjsg } 2540c349dbc7Sjsg 25415ca02815Sjsg static bool 25425ca02815Sjsg intel_dp_get_dpcd(struct intel_dp *intel_dp); 25435ca02815Sjsg 25445ca02815Sjsg /** 25455ca02815Sjsg * intel_dp_sync_state - sync the encoder state during init/resume 25465ca02815Sjsg * @encoder: intel encoder to sync 25475ca02815Sjsg * @crtc_state: state for the CRTC connected to the encoder 25485ca02815Sjsg * 25495ca02815Sjsg * Sync any state stored in the encoder wrt. HW state during driver init 25505ca02815Sjsg * and system resume. 25515ca02815Sjsg */ 25525ca02815Sjsg void intel_dp_sync_state(struct intel_encoder *encoder, 25535ca02815Sjsg const struct intel_crtc_state *crtc_state) 2554c349dbc7Sjsg { 25555ca02815Sjsg struct intel_dp *intel_dp = enc_to_intel_dp(encoder); 2556c349dbc7Sjsg 25575ca02815Sjsg if (!crtc_state) 25585ca02815Sjsg return; 2559c349dbc7Sjsg 25605ca02815Sjsg /* 25615ca02815Sjsg * Don't clobber DPCD if it's been already read out during output 25625ca02815Sjsg * setup (eDP) or detect. 25635ca02815Sjsg */ 25645ca02815Sjsg if (intel_dp->dpcd[DP_DPCD_REV] == 0) 25655ca02815Sjsg intel_dp_get_dpcd(intel_dp); 25665ca02815Sjsg 25675ca02815Sjsg intel_dp_reset_max_link_params(intel_dp); 25685ca02815Sjsg } 25695ca02815Sjsg 25705ca02815Sjsg bool intel_dp_initial_fastset_check(struct intel_encoder *encoder, 25715ca02815Sjsg struct intel_crtc_state *crtc_state) 25725ca02815Sjsg { 25735ca02815Sjsg struct drm_i915_private *i915 = to_i915(encoder->base.dev); 25745ca02815Sjsg struct intel_dp *intel_dp = enc_to_intel_dp(encoder); 2575f005ef32Sjsg bool fastset = true; 25765ca02815Sjsg 25775ca02815Sjsg /* 25785ca02815Sjsg * If BIOS has set an unsupported or non-standard link rate for some 25795ca02815Sjsg * reason force an encoder recompute and full modeset. 25805ca02815Sjsg */ 25815ca02815Sjsg if (intel_dp_rate_index(intel_dp->source_rates, intel_dp->num_source_rates, 25825ca02815Sjsg crtc_state->port_clock) < 0) { 2583f005ef32Sjsg drm_dbg_kms(&i915->drm, "[ENCODER:%d:%s] Forcing full modeset due to unsupported link rate\n", 2584f005ef32Sjsg encoder->base.base.id, encoder->base.name); 25855ca02815Sjsg crtc_state->uapi.connectors_changed = true; 2586f005ef32Sjsg fastset = false; 25875ca02815Sjsg } 25885ca02815Sjsg 25895ca02815Sjsg /* 25905ca02815Sjsg * FIXME hack to force full modeset when DSC is being used. 25915ca02815Sjsg * 25925ca02815Sjsg * As long as we do not have full state readout and config comparison 25935ca02815Sjsg * of crtc_state->dsc, we have no way to ensure reliable fastset. 25945ca02815Sjsg * Remove once we have readout for DSC. 25955ca02815Sjsg */ 25965ca02815Sjsg if (crtc_state->dsc.compression_enable) { 2597f005ef32Sjsg drm_dbg_kms(&i915->drm, "[ENCODER:%d:%s] Forcing full modeset due to DSC being enabled\n", 2598f005ef32Sjsg encoder->base.base.id, encoder->base.name); 25995ca02815Sjsg crtc_state->uapi.mode_changed = true; 2600f005ef32Sjsg fastset = false; 26015ca02815Sjsg } 26025ca02815Sjsg 26035ca02815Sjsg if (CAN_PSR(intel_dp)) { 2604f005ef32Sjsg drm_dbg_kms(&i915->drm, "[ENCODER:%d:%s] Forcing full modeset to compute PSR state\n", 2605f005ef32Sjsg encoder->base.base.id, encoder->base.name); 26065ca02815Sjsg crtc_state->uapi.mode_changed = true; 2607f005ef32Sjsg fastset = false; 26085ca02815Sjsg } 26095ca02815Sjsg 2610f005ef32Sjsg return fastset; 2611c349dbc7Sjsg } 26125ca02815Sjsg 26135ca02815Sjsg static void intel_dp_get_pcon_dsc_cap(struct intel_dp *intel_dp) 26145ca02815Sjsg { 26155ca02815Sjsg struct drm_i915_private *i915 = dp_to_i915(intel_dp); 26165ca02815Sjsg 26175ca02815Sjsg /* Clear the cached register set to avoid using stale values */ 26185ca02815Sjsg 26195ca02815Sjsg memset(intel_dp->pcon_dsc_dpcd, 0, sizeof(intel_dp->pcon_dsc_dpcd)); 26205ca02815Sjsg 26215ca02815Sjsg if (drm_dp_dpcd_read(&intel_dp->aux, DP_PCON_DSC_ENCODER, 26225ca02815Sjsg intel_dp->pcon_dsc_dpcd, 26235ca02815Sjsg sizeof(intel_dp->pcon_dsc_dpcd)) < 0) 26245ca02815Sjsg drm_err(&i915->drm, "Failed to read DPCD register 0x%x\n", 26255ca02815Sjsg DP_PCON_DSC_ENCODER); 26265ca02815Sjsg 26275ca02815Sjsg drm_dbg_kms(&i915->drm, "PCON ENCODER DSC DPCD: %*ph\n", 26285ca02815Sjsg (int)sizeof(intel_dp->pcon_dsc_dpcd), intel_dp->pcon_dsc_dpcd); 2629c349dbc7Sjsg } 2630c349dbc7Sjsg 26315ca02815Sjsg static int intel_dp_pcon_get_frl_mask(u8 frl_bw_mask) 26325ca02815Sjsg { 26335ca02815Sjsg int bw_gbps[] = {9, 18, 24, 32, 40, 48}; 26345ca02815Sjsg int i; 2635c349dbc7Sjsg 26365ca02815Sjsg for (i = ARRAY_SIZE(bw_gbps) - 1; i >= 0; i--) { 26375ca02815Sjsg if (frl_bw_mask & (1 << i)) 26385ca02815Sjsg return bw_gbps[i]; 26395ca02815Sjsg } 26405ca02815Sjsg return 0; 26415ca02815Sjsg } 26425ca02815Sjsg 26435ca02815Sjsg static int intel_dp_pcon_set_frl_mask(int max_frl) 26445ca02815Sjsg { 26455ca02815Sjsg switch (max_frl) { 26465ca02815Sjsg case 48: 26475ca02815Sjsg return DP_PCON_FRL_BW_MASK_48GBPS; 26485ca02815Sjsg case 40: 26495ca02815Sjsg return DP_PCON_FRL_BW_MASK_40GBPS; 26505ca02815Sjsg case 32: 26515ca02815Sjsg return DP_PCON_FRL_BW_MASK_32GBPS; 26525ca02815Sjsg case 24: 26535ca02815Sjsg return DP_PCON_FRL_BW_MASK_24GBPS; 26545ca02815Sjsg case 18: 26555ca02815Sjsg return DP_PCON_FRL_BW_MASK_18GBPS; 26565ca02815Sjsg case 9: 26575ca02815Sjsg return DP_PCON_FRL_BW_MASK_9GBPS; 26585ca02815Sjsg } 26595ca02815Sjsg 26605ca02815Sjsg return 0; 26615ca02815Sjsg } 26625ca02815Sjsg 26635ca02815Sjsg static int intel_dp_hdmi_sink_max_frl(struct intel_dp *intel_dp) 26645ca02815Sjsg { 26655ca02815Sjsg struct intel_connector *intel_connector = intel_dp->attached_connector; 26665ca02815Sjsg struct drm_connector *connector = &intel_connector->base; 26675ca02815Sjsg int max_frl_rate; 26685ca02815Sjsg int max_lanes, rate_per_lane; 26695ca02815Sjsg int max_dsc_lanes, dsc_rate_per_lane; 26705ca02815Sjsg 26715ca02815Sjsg max_lanes = connector->display_info.hdmi.max_lanes; 26725ca02815Sjsg rate_per_lane = connector->display_info.hdmi.max_frl_rate_per_lane; 26735ca02815Sjsg max_frl_rate = max_lanes * rate_per_lane; 26745ca02815Sjsg 26755ca02815Sjsg if (connector->display_info.hdmi.dsc_cap.v_1p2) { 26765ca02815Sjsg max_dsc_lanes = connector->display_info.hdmi.dsc_cap.max_lanes; 26775ca02815Sjsg dsc_rate_per_lane = connector->display_info.hdmi.dsc_cap.max_frl_rate_per_lane; 26785ca02815Sjsg if (max_dsc_lanes && dsc_rate_per_lane) 26795ca02815Sjsg max_frl_rate = min(max_frl_rate, max_dsc_lanes * dsc_rate_per_lane); 26805ca02815Sjsg } 26815ca02815Sjsg 26825ca02815Sjsg return max_frl_rate; 26835ca02815Sjsg } 26845ca02815Sjsg 26851bb76ff1Sjsg static bool 26861bb76ff1Sjsg intel_dp_pcon_is_frl_trained(struct intel_dp *intel_dp, 26871bb76ff1Sjsg u8 max_frl_bw_mask, u8 *frl_trained_mask) 26881bb76ff1Sjsg { 26891bb76ff1Sjsg if (drm_dp_pcon_hdmi_link_active(&intel_dp->aux) && 26901bb76ff1Sjsg drm_dp_pcon_hdmi_link_mode(&intel_dp->aux, frl_trained_mask) == DP_PCON_HDMI_MODE_FRL && 26911bb76ff1Sjsg *frl_trained_mask >= max_frl_bw_mask) 26921bb76ff1Sjsg return true; 26931bb76ff1Sjsg 26941bb76ff1Sjsg return false; 26951bb76ff1Sjsg } 26961bb76ff1Sjsg 26975ca02815Sjsg static int intel_dp_pcon_start_frl_training(struct intel_dp *intel_dp) 26985ca02815Sjsg { 26995ca02815Sjsg #define TIMEOUT_FRL_READY_MS 500 27005ca02815Sjsg #define TIMEOUT_HDMI_LINK_ACTIVE_MS 1000 27015ca02815Sjsg 27025ca02815Sjsg struct drm_i915_private *i915 = dp_to_i915(intel_dp); 27035ca02815Sjsg int max_frl_bw, max_pcon_frl_bw, max_edid_frl_bw, ret; 27045ca02815Sjsg u8 max_frl_bw_mask = 0, frl_trained_mask; 27055ca02815Sjsg bool is_active; 27065ca02815Sjsg 27075ca02815Sjsg max_pcon_frl_bw = intel_dp->dfp.pcon_max_frl_bw; 27085ca02815Sjsg drm_dbg(&i915->drm, "PCON max rate = %d Gbps\n", max_pcon_frl_bw); 27095ca02815Sjsg 27105ca02815Sjsg max_edid_frl_bw = intel_dp_hdmi_sink_max_frl(intel_dp); 27115ca02815Sjsg drm_dbg(&i915->drm, "Sink max rate from EDID = %d Gbps\n", max_edid_frl_bw); 27125ca02815Sjsg 27135ca02815Sjsg max_frl_bw = min(max_edid_frl_bw, max_pcon_frl_bw); 27145ca02815Sjsg 27155ca02815Sjsg if (max_frl_bw <= 0) 27165ca02815Sjsg return -EINVAL; 27175ca02815Sjsg 27181bb76ff1Sjsg max_frl_bw_mask = intel_dp_pcon_set_frl_mask(max_frl_bw); 27191bb76ff1Sjsg drm_dbg(&i915->drm, "MAX_FRL_BW_MASK = %u\n", max_frl_bw_mask); 27201bb76ff1Sjsg 27211bb76ff1Sjsg if (intel_dp_pcon_is_frl_trained(intel_dp, max_frl_bw_mask, &frl_trained_mask)) 27221bb76ff1Sjsg goto frl_trained; 27231bb76ff1Sjsg 27245ca02815Sjsg ret = drm_dp_pcon_frl_prepare(&intel_dp->aux, false); 27255ca02815Sjsg if (ret < 0) 27265ca02815Sjsg return ret; 27275ca02815Sjsg /* Wait for PCON to be FRL Ready */ 27285ca02815Sjsg wait_for(is_active = drm_dp_pcon_is_frl_ready(&intel_dp->aux) == true, TIMEOUT_FRL_READY_MS); 27295ca02815Sjsg 27305ca02815Sjsg if (!is_active) 27315ca02815Sjsg return -ETIMEDOUT; 27325ca02815Sjsg 27335ca02815Sjsg ret = drm_dp_pcon_frl_configure_1(&intel_dp->aux, max_frl_bw, 27345ca02815Sjsg DP_PCON_ENABLE_SEQUENTIAL_LINK); 27355ca02815Sjsg if (ret < 0) 27365ca02815Sjsg return ret; 27375ca02815Sjsg ret = drm_dp_pcon_frl_configure_2(&intel_dp->aux, max_frl_bw_mask, 27385ca02815Sjsg DP_PCON_FRL_LINK_TRAIN_NORMAL); 27395ca02815Sjsg if (ret < 0) 27405ca02815Sjsg return ret; 27415ca02815Sjsg ret = drm_dp_pcon_frl_enable(&intel_dp->aux); 27425ca02815Sjsg if (ret < 0) 27435ca02815Sjsg return ret; 27445ca02815Sjsg /* 27455ca02815Sjsg * Wait for FRL to be completed 27465ca02815Sjsg * Check if the HDMI Link is up and active. 27475ca02815Sjsg */ 27481bb76ff1Sjsg wait_for(is_active = 27491bb76ff1Sjsg intel_dp_pcon_is_frl_trained(intel_dp, max_frl_bw_mask, &frl_trained_mask), 27501bb76ff1Sjsg TIMEOUT_HDMI_LINK_ACTIVE_MS); 27515ca02815Sjsg 27525ca02815Sjsg if (!is_active) 27535ca02815Sjsg return -ETIMEDOUT; 27545ca02815Sjsg 27551bb76ff1Sjsg frl_trained: 27561bb76ff1Sjsg drm_dbg(&i915->drm, "FRL_TRAINED_MASK = %u\n", frl_trained_mask); 27575ca02815Sjsg intel_dp->frl.trained_rate_gbps = intel_dp_pcon_get_frl_mask(frl_trained_mask); 27585ca02815Sjsg intel_dp->frl.is_trained = true; 27595ca02815Sjsg drm_dbg(&i915->drm, "FRL trained with : %d Gbps\n", intel_dp->frl.trained_rate_gbps); 27605ca02815Sjsg 27615ca02815Sjsg return 0; 27625ca02815Sjsg } 27635ca02815Sjsg 27645ca02815Sjsg static bool intel_dp_is_hdmi_2_1_sink(struct intel_dp *intel_dp) 27655ca02815Sjsg { 27665ca02815Sjsg if (drm_dp_is_branch(intel_dp->dpcd) && 2767f005ef32Sjsg intel_dp_has_hdmi_sink(intel_dp) && 27685ca02815Sjsg intel_dp_hdmi_sink_max_frl(intel_dp) > 0) 27695ca02815Sjsg return true; 2770c349dbc7Sjsg 2771c349dbc7Sjsg return false; 2772c349dbc7Sjsg } 2773c349dbc7Sjsg 27741bb76ff1Sjsg static 27751bb76ff1Sjsg int intel_dp_pcon_set_tmds_mode(struct intel_dp *intel_dp) 27761bb76ff1Sjsg { 27771bb76ff1Sjsg int ret; 27781bb76ff1Sjsg u8 buf = 0; 27791bb76ff1Sjsg 27801bb76ff1Sjsg /* Set PCON source control mode */ 27811bb76ff1Sjsg buf |= DP_PCON_ENABLE_SOURCE_CTL_MODE; 27821bb76ff1Sjsg 27831bb76ff1Sjsg ret = drm_dp_dpcd_writeb(&intel_dp->aux, DP_PCON_HDMI_LINK_CONFIG_1, buf); 27841bb76ff1Sjsg if (ret < 0) 27851bb76ff1Sjsg return ret; 27861bb76ff1Sjsg 27871bb76ff1Sjsg /* Set HDMI LINK ENABLE */ 27881bb76ff1Sjsg buf |= DP_PCON_ENABLE_HDMI_LINK; 27891bb76ff1Sjsg ret = drm_dp_dpcd_writeb(&intel_dp->aux, DP_PCON_HDMI_LINK_CONFIG_1, buf); 27901bb76ff1Sjsg if (ret < 0) 27911bb76ff1Sjsg return ret; 27921bb76ff1Sjsg 27931bb76ff1Sjsg return 0; 27941bb76ff1Sjsg } 27951bb76ff1Sjsg 27965ca02815Sjsg void intel_dp_check_frl_training(struct intel_dp *intel_dp) 2797c349dbc7Sjsg { 27985ca02815Sjsg struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); 2799c349dbc7Sjsg 28005ca02815Sjsg /* 28015ca02815Sjsg * Always go for FRL training if: 28025ca02815Sjsg * -PCON supports SRC_CTL_MODE (VESA DP2.0-HDMI2.1 PCON Spec Draft-1 Sec-7) 28035ca02815Sjsg * -sink is HDMI2.1 28045ca02815Sjsg */ 28055ca02815Sjsg if (!(intel_dp->downstream_ports[2] & DP_PCON_SOURCE_CTL_MODE) || 28065ca02815Sjsg !intel_dp_is_hdmi_2_1_sink(intel_dp) || 28075ca02815Sjsg intel_dp->frl.is_trained) 28085ca02815Sjsg return; 2809c349dbc7Sjsg 28105ca02815Sjsg if (intel_dp_pcon_start_frl_training(intel_dp) < 0) { 28115ca02815Sjsg int ret, mode; 2812c349dbc7Sjsg 28135ca02815Sjsg drm_dbg(&dev_priv->drm, "Couldn't set FRL mode, continuing with TMDS mode\n"); 28141bb76ff1Sjsg ret = intel_dp_pcon_set_tmds_mode(intel_dp); 28155ca02815Sjsg mode = drm_dp_pcon_hdmi_link_mode(&intel_dp->aux, NULL); 2816c349dbc7Sjsg 28175ca02815Sjsg if (ret < 0 || mode != DP_PCON_HDMI_MODE_TMDS) 28185ca02815Sjsg drm_dbg(&dev_priv->drm, "Issue with PCON, cannot set TMDS mode\n"); 2819c349dbc7Sjsg } else { 28205ca02815Sjsg drm_dbg(&dev_priv->drm, "FRL training Completed\n"); 2821c349dbc7Sjsg } 2822c349dbc7Sjsg } 2823c349dbc7Sjsg 28245ca02815Sjsg static int 28255ca02815Sjsg intel_dp_pcon_dsc_enc_slice_height(const struct intel_crtc_state *crtc_state) 2826c349dbc7Sjsg { 28275ca02815Sjsg int vactive = crtc_state->hw.adjusted_mode.vdisplay; 2828c349dbc7Sjsg 28295ca02815Sjsg return intel_hdmi_dsc_get_slice_height(vactive); 2830c349dbc7Sjsg } 2831c349dbc7Sjsg 28325ca02815Sjsg static int 28335ca02815Sjsg intel_dp_pcon_dsc_enc_slices(struct intel_dp *intel_dp, 28345ca02815Sjsg const struct intel_crtc_state *crtc_state) 2835c349dbc7Sjsg { 28365ca02815Sjsg struct intel_connector *intel_connector = intel_dp->attached_connector; 28375ca02815Sjsg struct drm_connector *connector = &intel_connector->base; 28385ca02815Sjsg int hdmi_throughput = connector->display_info.hdmi.dsc_cap.clk_per_slice; 28395ca02815Sjsg int hdmi_max_slices = connector->display_info.hdmi.dsc_cap.max_slices; 28405ca02815Sjsg int pcon_max_slices = drm_dp_pcon_dsc_max_slices(intel_dp->pcon_dsc_dpcd); 28415ca02815Sjsg int pcon_max_slice_width = drm_dp_pcon_dsc_max_slice_width(intel_dp->pcon_dsc_dpcd); 28425ca02815Sjsg 28435ca02815Sjsg return intel_hdmi_dsc_get_num_slices(crtc_state, pcon_max_slices, 28445ca02815Sjsg pcon_max_slice_width, 28455ca02815Sjsg hdmi_max_slices, hdmi_throughput); 2846c349dbc7Sjsg } 2847c349dbc7Sjsg 28485ca02815Sjsg static int 28495ca02815Sjsg intel_dp_pcon_dsc_enc_bpp(struct intel_dp *intel_dp, 28505ca02815Sjsg const struct intel_crtc_state *crtc_state, 28515ca02815Sjsg int num_slices, int slice_width) 2852c349dbc7Sjsg { 28535ca02815Sjsg struct intel_connector *intel_connector = intel_dp->attached_connector; 28545ca02815Sjsg struct drm_connector *connector = &intel_connector->base; 28555ca02815Sjsg int output_format = crtc_state->output_format; 28565ca02815Sjsg bool hdmi_all_bpp = connector->display_info.hdmi.dsc_cap.all_bpp; 28575ca02815Sjsg int pcon_fractional_bpp = drm_dp_pcon_dsc_bpp_incr(intel_dp->pcon_dsc_dpcd); 28585ca02815Sjsg int hdmi_max_chunk_bytes = 28595ca02815Sjsg connector->display_info.hdmi.dsc_cap.total_chunk_kbytes * 1024; 28605ca02815Sjsg 28615ca02815Sjsg return intel_hdmi_dsc_get_bpp(pcon_fractional_bpp, slice_width, 28625ca02815Sjsg num_slices, output_format, hdmi_all_bpp, 28635ca02815Sjsg hdmi_max_chunk_bytes); 2864c349dbc7Sjsg } 2865c349dbc7Sjsg 28665ca02815Sjsg void 28675ca02815Sjsg intel_dp_pcon_dsc_configure(struct intel_dp *intel_dp, 28685ca02815Sjsg const struct intel_crtc_state *crtc_state) 2869c349dbc7Sjsg { 28705ca02815Sjsg u8 pps_param[6]; 28715ca02815Sjsg int slice_height; 28725ca02815Sjsg int slice_width; 28735ca02815Sjsg int num_slices; 28745ca02815Sjsg int bits_per_pixel; 28755ca02815Sjsg int ret; 28765ca02815Sjsg struct intel_connector *intel_connector = intel_dp->attached_connector; 28775ca02815Sjsg struct drm_i915_private *i915 = dp_to_i915(intel_dp); 28785ca02815Sjsg struct drm_connector *connector; 28795ca02815Sjsg bool hdmi_is_dsc_1_2; 2880c349dbc7Sjsg 28815ca02815Sjsg if (!intel_dp_is_hdmi_2_1_sink(intel_dp)) 28825ca02815Sjsg return; 2883c349dbc7Sjsg 28845ca02815Sjsg if (!intel_connector) 28855ca02815Sjsg return; 28865ca02815Sjsg connector = &intel_connector->base; 28875ca02815Sjsg hdmi_is_dsc_1_2 = connector->display_info.hdmi.dsc_cap.v_1p2; 2888c349dbc7Sjsg 28895ca02815Sjsg if (!drm_dp_pcon_enc_is_dsc_1_2(intel_dp->pcon_dsc_dpcd) || 28905ca02815Sjsg !hdmi_is_dsc_1_2) 28915ca02815Sjsg return; 2892c349dbc7Sjsg 28935ca02815Sjsg slice_height = intel_dp_pcon_dsc_enc_slice_height(crtc_state); 28945ca02815Sjsg if (!slice_height) 28955ca02815Sjsg return; 2896c349dbc7Sjsg 28975ca02815Sjsg num_slices = intel_dp_pcon_dsc_enc_slices(intel_dp, crtc_state); 28985ca02815Sjsg if (!num_slices) 28995ca02815Sjsg return; 2900c349dbc7Sjsg 29015ca02815Sjsg slice_width = DIV_ROUND_UP(crtc_state->hw.adjusted_mode.hdisplay, 29025ca02815Sjsg num_slices); 2903c349dbc7Sjsg 29045ca02815Sjsg bits_per_pixel = intel_dp_pcon_dsc_enc_bpp(intel_dp, crtc_state, 29055ca02815Sjsg num_slices, slice_width); 29065ca02815Sjsg if (!bits_per_pixel) 29075ca02815Sjsg return; 2908c349dbc7Sjsg 29095ca02815Sjsg pps_param[0] = slice_height & 0xFF; 29105ca02815Sjsg pps_param[1] = slice_height >> 8; 29115ca02815Sjsg pps_param[2] = slice_width & 0xFF; 29125ca02815Sjsg pps_param[3] = slice_width >> 8; 29135ca02815Sjsg pps_param[4] = bits_per_pixel & 0xFF; 29145ca02815Sjsg pps_param[5] = (bits_per_pixel >> 8) & 0x3; 2915c349dbc7Sjsg 29165ca02815Sjsg ret = drm_dp_pcon_pps_override_param(&intel_dp->aux, pps_param); 29175ca02815Sjsg if (ret < 0) 29185ca02815Sjsg drm_dbg_kms(&i915->drm, "Failed to set pcon DSC\n"); 2919c349dbc7Sjsg } 2920c349dbc7Sjsg 2921ad8b1aafSjsg void intel_dp_configure_protocol_converter(struct intel_dp *intel_dp, 2922ad8b1aafSjsg const struct intel_crtc_state *crtc_state) 2923ad8b1aafSjsg { 2924ad8b1aafSjsg struct drm_i915_private *i915 = dp_to_i915(intel_dp); 2925f005ef32Sjsg bool ycbcr444_to_420 = false; 2926f005ef32Sjsg bool rgb_to_ycbcr = false; 2927ad8b1aafSjsg u8 tmp; 2928ad8b1aafSjsg 2929ad8b1aafSjsg if (intel_dp->dpcd[DP_DPCD_REV] < 0x13) 2930ad8b1aafSjsg return; 2931ad8b1aafSjsg 2932ad8b1aafSjsg if (!drm_dp_is_branch(intel_dp->dpcd)) 2933ad8b1aafSjsg return; 2934ad8b1aafSjsg 2935f005ef32Sjsg tmp = intel_dp_has_hdmi_sink(intel_dp) ? DP_HDMI_DVI_OUTPUT_CONFIG : 0; 2936ad8b1aafSjsg 2937ad8b1aafSjsg if (drm_dp_dpcd_writeb(&intel_dp->aux, 2938ad8b1aafSjsg DP_PROTOCOL_CONVERTER_CONTROL_0, tmp) != 1) 29395ca02815Sjsg drm_dbg_kms(&i915->drm, "Failed to %s protocol converter HDMI mode\n", 2940f005ef32Sjsg str_enable_disable(intel_dp_has_hdmi_sink(intel_dp))); 2941ad8b1aafSjsg 2942f005ef32Sjsg if (crtc_state->sink_format == INTEL_OUTPUT_FORMAT_YCBCR420) { 2943f005ef32Sjsg switch (crtc_state->output_format) { 2944f005ef32Sjsg case INTEL_OUTPUT_FORMAT_YCBCR420: 2945f005ef32Sjsg break; 2946f005ef32Sjsg case INTEL_OUTPUT_FORMAT_YCBCR444: 2947f005ef32Sjsg ycbcr444_to_420 = true; 2948f005ef32Sjsg break; 2949f005ef32Sjsg case INTEL_OUTPUT_FORMAT_RGB: 2950f005ef32Sjsg rgb_to_ycbcr = true; 2951f005ef32Sjsg ycbcr444_to_420 = true; 2952f005ef32Sjsg break; 2953f005ef32Sjsg default: 2954f005ef32Sjsg MISSING_CASE(crtc_state->output_format); 2955f005ef32Sjsg break; 2956f005ef32Sjsg } 2957f005ef32Sjsg } else if (crtc_state->sink_format == INTEL_OUTPUT_FORMAT_YCBCR444) { 2958f005ef32Sjsg switch (crtc_state->output_format) { 2959f005ef32Sjsg case INTEL_OUTPUT_FORMAT_YCBCR444: 2960f005ef32Sjsg break; 2961f005ef32Sjsg case INTEL_OUTPUT_FORMAT_RGB: 2962f005ef32Sjsg rgb_to_ycbcr = true; 2963f005ef32Sjsg break; 2964f005ef32Sjsg default: 2965f005ef32Sjsg MISSING_CASE(crtc_state->output_format); 2966f005ef32Sjsg break; 2967f005ef32Sjsg } 2968f005ef32Sjsg } 2969f005ef32Sjsg 2970f005ef32Sjsg tmp = ycbcr444_to_420 ? DP_CONVERSION_TO_YCBCR420_ENABLE : 0; 2971ad8b1aafSjsg 2972ad8b1aafSjsg if (drm_dp_dpcd_writeb(&intel_dp->aux, 2973ad8b1aafSjsg DP_PROTOCOL_CONVERTER_CONTROL_1, tmp) != 1) 2974ad8b1aafSjsg drm_dbg_kms(&i915->drm, 29755ca02815Sjsg "Failed to %s protocol converter YCbCr 4:2:0 conversion mode\n", 29761bb76ff1Sjsg str_enable_disable(intel_dp->dfp.ycbcr_444_to_420)); 2977ad8b1aafSjsg 2978f005ef32Sjsg tmp = rgb_to_ycbcr ? DP_CONVERSION_BT709_RGB_YCBCR_ENABLE : 0; 29795ca02815Sjsg 29805ca02815Sjsg if (drm_dp_pcon_convert_rgb_to_ycbcr(&intel_dp->aux, tmp) < 0) 2981ad8b1aafSjsg drm_dbg_kms(&i915->drm, 29825ca02815Sjsg "Failed to %s protocol converter RGB->YCbCr conversion mode\n", 29831bb76ff1Sjsg str_enable_disable(tmp)); 2984ad8b1aafSjsg } 2985ad8b1aafSjsg 2986c349dbc7Sjsg bool intel_dp_get_colorimetry_status(struct intel_dp *intel_dp) 2987c349dbc7Sjsg { 2988c349dbc7Sjsg u8 dprx = 0; 2989c349dbc7Sjsg 2990c349dbc7Sjsg if (drm_dp_dpcd_readb(&intel_dp->aux, DP_DPRX_FEATURE_ENUMERATION_LIST, 2991c349dbc7Sjsg &dprx) != 1) 2992c349dbc7Sjsg return false; 2993c349dbc7Sjsg return dprx & DP_VSC_SDP_EXT_FOR_COLORIMETRY_SUPPORTED; 2994c349dbc7Sjsg } 2995c349dbc7Sjsg 2996c349dbc7Sjsg static void intel_dp_get_dsc_sink_cap(struct intel_dp *intel_dp) 2997c349dbc7Sjsg { 2998ad8b1aafSjsg struct drm_i915_private *i915 = dp_to_i915(intel_dp); 2999ad8b1aafSjsg 3000c349dbc7Sjsg /* 3001c349dbc7Sjsg * Clear the cached register set to avoid using stale values 3002c349dbc7Sjsg * for the sinks that do not support DSC. 3003c349dbc7Sjsg */ 3004c349dbc7Sjsg memset(intel_dp->dsc_dpcd, 0, sizeof(intel_dp->dsc_dpcd)); 3005c349dbc7Sjsg 3006c349dbc7Sjsg /* Clear fec_capable to avoid using stale values */ 3007c349dbc7Sjsg intel_dp->fec_capable = 0; 3008c349dbc7Sjsg 3009c349dbc7Sjsg /* Cache the DSC DPCD if eDP or DP rev >= 1.4 */ 3010c349dbc7Sjsg if (intel_dp->dpcd[DP_DPCD_REV] >= 0x14 || 3011c349dbc7Sjsg intel_dp->edp_dpcd[0] >= DP_EDP_14) { 3012c349dbc7Sjsg if (drm_dp_dpcd_read(&intel_dp->aux, DP_DSC_SUPPORT, 3013c349dbc7Sjsg intel_dp->dsc_dpcd, 3014c349dbc7Sjsg sizeof(intel_dp->dsc_dpcd)) < 0) 3015ad8b1aafSjsg drm_err(&i915->drm, 3016ad8b1aafSjsg "Failed to read DPCD register 0x%x\n", 3017c349dbc7Sjsg DP_DSC_SUPPORT); 3018c349dbc7Sjsg 3019ad8b1aafSjsg drm_dbg_kms(&i915->drm, "DSC DPCD: %*ph\n", 3020c349dbc7Sjsg (int)sizeof(intel_dp->dsc_dpcd), 3021c349dbc7Sjsg intel_dp->dsc_dpcd); 3022c349dbc7Sjsg 3023c349dbc7Sjsg /* FEC is supported only on DP 1.4 */ 3024c349dbc7Sjsg if (!intel_dp_is_edp(intel_dp) && 3025c349dbc7Sjsg drm_dp_dpcd_readb(&intel_dp->aux, DP_FEC_CAPABILITY, 3026c349dbc7Sjsg &intel_dp->fec_capable) < 0) 3027ad8b1aafSjsg drm_err(&i915->drm, 3028ad8b1aafSjsg "Failed to read FEC DPCD register\n"); 3029c349dbc7Sjsg 3030ad8b1aafSjsg drm_dbg_kms(&i915->drm, "FEC CAPABILITY: %x\n", 3031ad8b1aafSjsg intel_dp->fec_capable); 3032c349dbc7Sjsg } 3033c349dbc7Sjsg } 3034c349dbc7Sjsg 30355ca02815Sjsg static void intel_edp_mso_mode_fixup(struct intel_connector *connector, 30365ca02815Sjsg struct drm_display_mode *mode) 30375ca02815Sjsg { 30385ca02815Sjsg struct intel_dp *intel_dp = intel_attached_dp(connector); 30395ca02815Sjsg struct drm_i915_private *i915 = to_i915(connector->base.dev); 30405ca02815Sjsg int n = intel_dp->mso_link_count; 30415ca02815Sjsg int overlap = intel_dp->mso_pixel_overlap; 30425ca02815Sjsg 30435ca02815Sjsg if (!mode || !n) 30445ca02815Sjsg return; 30455ca02815Sjsg 30465ca02815Sjsg mode->hdisplay = (mode->hdisplay - overlap) * n; 30475ca02815Sjsg mode->hsync_start = (mode->hsync_start - overlap) * n; 30485ca02815Sjsg mode->hsync_end = (mode->hsync_end - overlap) * n; 30495ca02815Sjsg mode->htotal = (mode->htotal - overlap) * n; 30505ca02815Sjsg mode->clock *= n; 30515ca02815Sjsg 30525ca02815Sjsg drm_mode_set_name(mode); 30535ca02815Sjsg 30545ca02815Sjsg drm_dbg_kms(&i915->drm, 30551bb76ff1Sjsg "[CONNECTOR:%d:%s] using generated MSO mode: " DRM_MODE_FMT "\n", 30561bb76ff1Sjsg connector->base.base.id, connector->base.name, 30571bb76ff1Sjsg DRM_MODE_ARG(mode)); 30581bb76ff1Sjsg } 30591bb76ff1Sjsg 30601bb76ff1Sjsg void intel_edp_fixup_vbt_bpp(struct intel_encoder *encoder, int pipe_bpp) 30611bb76ff1Sjsg { 30621bb76ff1Sjsg struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 30631bb76ff1Sjsg struct intel_dp *intel_dp = enc_to_intel_dp(encoder); 30641bb76ff1Sjsg struct intel_connector *connector = intel_dp->attached_connector; 30651bb76ff1Sjsg 30661bb76ff1Sjsg if (connector->panel.vbt.edp.bpp && pipe_bpp > connector->panel.vbt.edp.bpp) { 30671bb76ff1Sjsg /* 30681bb76ff1Sjsg * This is a big fat ugly hack. 30691bb76ff1Sjsg * 30701bb76ff1Sjsg * Some machines in UEFI boot mode provide us a VBT that has 18 30711bb76ff1Sjsg * bpp and 1.62 GHz link bandwidth for eDP, which for reasons 30721bb76ff1Sjsg * unknown we fail to light up. Yet the same BIOS boots up with 30731bb76ff1Sjsg * 24 bpp and 2.7 GHz link. Use the same bpp as the BIOS uses as 30741bb76ff1Sjsg * max, not what it tells us to use. 30751bb76ff1Sjsg * 30761bb76ff1Sjsg * Note: This will still be broken if the eDP panel is not lit 30771bb76ff1Sjsg * up by the BIOS, and thus we can't get the mode at module 30781bb76ff1Sjsg * load. 30791bb76ff1Sjsg */ 30801bb76ff1Sjsg drm_dbg_kms(&dev_priv->drm, 30811bb76ff1Sjsg "pipe has %d bpp for eDP panel, overriding BIOS-provided max %d bpp\n", 30821bb76ff1Sjsg pipe_bpp, connector->panel.vbt.edp.bpp); 30831bb76ff1Sjsg connector->panel.vbt.edp.bpp = pipe_bpp; 30841bb76ff1Sjsg } 30855ca02815Sjsg } 30865ca02815Sjsg 30875ca02815Sjsg static void intel_edp_mso_init(struct intel_dp *intel_dp) 30885ca02815Sjsg { 30895ca02815Sjsg struct drm_i915_private *i915 = dp_to_i915(intel_dp); 30901bb76ff1Sjsg struct intel_connector *connector = intel_dp->attached_connector; 30911bb76ff1Sjsg struct drm_display_info *info = &connector->base.display_info; 30925ca02815Sjsg u8 mso; 30935ca02815Sjsg 30945ca02815Sjsg if (intel_dp->edp_dpcd[0] < DP_EDP_14) 30955ca02815Sjsg return; 30965ca02815Sjsg 30975ca02815Sjsg if (drm_dp_dpcd_readb(&intel_dp->aux, DP_EDP_MSO_LINK_CAPABILITIES, &mso) != 1) { 30985ca02815Sjsg drm_err(&i915->drm, "Failed to read MSO cap\n"); 30995ca02815Sjsg return; 31005ca02815Sjsg } 31015ca02815Sjsg 31025ca02815Sjsg /* Valid configurations are SST or MSO 2x1, 2x2, 4x1 */ 31035ca02815Sjsg mso &= DP_EDP_MSO_NUMBER_OF_LINKS_MASK; 31045ca02815Sjsg if (mso % 2 || mso > drm_dp_max_lane_count(intel_dp->dpcd)) { 31055ca02815Sjsg drm_err(&i915->drm, "Invalid MSO link count cap %u\n", mso); 31065ca02815Sjsg mso = 0; 31075ca02815Sjsg } 31085ca02815Sjsg 31095ca02815Sjsg if (mso) { 31101bb76ff1Sjsg drm_dbg_kms(&i915->drm, "Sink MSO %ux%u configuration, pixel overlap %u\n", 31111bb76ff1Sjsg mso, drm_dp_max_lane_count(intel_dp->dpcd) / mso, 31121bb76ff1Sjsg info->mso_pixel_overlap); 31135ca02815Sjsg if (!HAS_MSO(i915)) { 31145ca02815Sjsg drm_err(&i915->drm, "No source MSO support, disabling\n"); 31155ca02815Sjsg mso = 0; 31165ca02815Sjsg } 31175ca02815Sjsg } 31185ca02815Sjsg 31195ca02815Sjsg intel_dp->mso_link_count = mso; 31201bb76ff1Sjsg intel_dp->mso_pixel_overlap = mso ? info->mso_pixel_overlap : 0; 31215ca02815Sjsg } 31225ca02815Sjsg 3123c349dbc7Sjsg static bool 3124c349dbc7Sjsg intel_edp_init_dpcd(struct intel_dp *intel_dp) 3125c349dbc7Sjsg { 3126c349dbc7Sjsg struct drm_i915_private *dev_priv = 3127c349dbc7Sjsg to_i915(dp_to_dig_port(intel_dp)->base.base.dev); 3128c349dbc7Sjsg 3129c349dbc7Sjsg /* this function is meant to be called only once */ 3130c349dbc7Sjsg drm_WARN_ON(&dev_priv->drm, intel_dp->dpcd[DP_DPCD_REV] != 0); 3131c349dbc7Sjsg 3132ad8b1aafSjsg if (drm_dp_read_dpcd_caps(&intel_dp->aux, intel_dp->dpcd) != 0) 3133c349dbc7Sjsg return false; 3134c349dbc7Sjsg 3135c349dbc7Sjsg drm_dp_read_desc(&intel_dp->aux, &intel_dp->desc, 3136c349dbc7Sjsg drm_dp_is_branch(intel_dp->dpcd)); 3137c349dbc7Sjsg 3138c349dbc7Sjsg /* 3139c349dbc7Sjsg * Read the eDP display control registers. 3140c349dbc7Sjsg * 3141c349dbc7Sjsg * Do this independent of DP_DPCD_DISPLAY_CONTROL_CAPABLE bit in 3142c349dbc7Sjsg * DP_EDP_CONFIGURATION_CAP, because some buggy displays do not have it 3143c349dbc7Sjsg * set, but require eDP 1.4+ detection (e.g. for supported link rates 3144c349dbc7Sjsg * method). The display control registers should read zero if they're 3145c349dbc7Sjsg * not supported anyway. 3146c349dbc7Sjsg */ 3147c349dbc7Sjsg if (drm_dp_dpcd_read(&intel_dp->aux, DP_EDP_DPCD_REV, 3148c349dbc7Sjsg intel_dp->edp_dpcd, sizeof(intel_dp->edp_dpcd)) == 31495ca02815Sjsg sizeof(intel_dp->edp_dpcd)) { 3150c349dbc7Sjsg drm_dbg_kms(&dev_priv->drm, "eDP DPCD: %*ph\n", 3151c349dbc7Sjsg (int)sizeof(intel_dp->edp_dpcd), 3152c349dbc7Sjsg intel_dp->edp_dpcd); 3153c349dbc7Sjsg 31545ca02815Sjsg intel_dp->use_max_params = intel_dp->edp_dpcd[0] < DP_EDP_14; 31555ca02815Sjsg } 31565ca02815Sjsg 3157c349dbc7Sjsg /* 3158c349dbc7Sjsg * This has to be called after intel_dp->edp_dpcd is filled, PSR checks 3159c349dbc7Sjsg * for SET_POWER_CAPABLE bit in intel_dp->edp_dpcd[1] 3160c349dbc7Sjsg */ 3161c349dbc7Sjsg intel_psr_init_dpcd(intel_dp); 3162c349dbc7Sjsg 316390d1a473Sjsg /* Clear the default sink rates */ 316490d1a473Sjsg intel_dp->num_sink_rates = 0; 316590d1a473Sjsg 3166c349dbc7Sjsg /* Read the eDP 1.4+ supported link rates. */ 3167c349dbc7Sjsg if (intel_dp->edp_dpcd[0] >= DP_EDP_14) { 3168c349dbc7Sjsg __le16 sink_rates[DP_MAX_SUPPORTED_RATES]; 3169c349dbc7Sjsg int i; 3170c349dbc7Sjsg 3171c349dbc7Sjsg drm_dp_dpcd_read(&intel_dp->aux, DP_SUPPORTED_LINK_RATES, 3172c349dbc7Sjsg sink_rates, sizeof(sink_rates)); 3173c349dbc7Sjsg 3174c349dbc7Sjsg for (i = 0; i < ARRAY_SIZE(sink_rates); i++) { 3175c349dbc7Sjsg int val = le16_to_cpu(sink_rates[i]); 3176c349dbc7Sjsg 3177c349dbc7Sjsg if (val == 0) 3178c349dbc7Sjsg break; 3179c349dbc7Sjsg 3180c349dbc7Sjsg /* Value read multiplied by 200kHz gives the per-lane 3181c349dbc7Sjsg * link rate in kHz. The source rates are, however, 3182c349dbc7Sjsg * stored in terms of LS_Clk kHz. The full conversion 3183c349dbc7Sjsg * back to symbols is 3184c349dbc7Sjsg * (val * 200kHz)*(8/10 ch. encoding)*(1/8 bit to Byte) 3185c349dbc7Sjsg */ 3186c349dbc7Sjsg intel_dp->sink_rates[i] = (val * 200) / 10; 3187c349dbc7Sjsg } 3188c349dbc7Sjsg intel_dp->num_sink_rates = i; 3189c349dbc7Sjsg } 3190c349dbc7Sjsg 3191c349dbc7Sjsg /* 3192c349dbc7Sjsg * Use DP_LINK_RATE_SET if DP_SUPPORTED_LINK_RATES are available, 3193c349dbc7Sjsg * default to DP_MAX_LINK_RATE and DP_LINK_BW_SET otherwise. 3194c349dbc7Sjsg */ 3195c349dbc7Sjsg if (intel_dp->num_sink_rates) 3196c349dbc7Sjsg intel_dp->use_rate_select = true; 3197c349dbc7Sjsg else 3198c349dbc7Sjsg intel_dp_set_sink_rates(intel_dp); 31991bb76ff1Sjsg intel_dp_set_max_sink_lane_count(intel_dp); 3200c349dbc7Sjsg 3201c349dbc7Sjsg /* Read the eDP DSC DPCD registers */ 3202f005ef32Sjsg if (HAS_DSC(dev_priv)) 3203c349dbc7Sjsg intel_dp_get_dsc_sink_cap(intel_dp); 3204c349dbc7Sjsg 32055ca02815Sjsg /* 32065ca02815Sjsg * If needed, program our source OUI so we can make various Intel-specific AUX services 32075ca02815Sjsg * available (such as HDR backlight controls) 32085ca02815Sjsg */ 32095ca02815Sjsg intel_edp_init_source_oui(intel_dp, true); 32105ca02815Sjsg 3211c349dbc7Sjsg return true; 3212c349dbc7Sjsg } 3213c349dbc7Sjsg 3214ad8b1aafSjsg static bool 3215ad8b1aafSjsg intel_dp_has_sink_count(struct intel_dp *intel_dp) 3216ad8b1aafSjsg { 3217ad8b1aafSjsg if (!intel_dp->attached_connector) 3218ad8b1aafSjsg return false; 3219ad8b1aafSjsg 3220ad8b1aafSjsg return drm_dp_read_sink_count_cap(&intel_dp->attached_connector->base, 3221ad8b1aafSjsg intel_dp->dpcd, 3222ad8b1aafSjsg &intel_dp->desc); 3223ad8b1aafSjsg } 3224c349dbc7Sjsg 3225c349dbc7Sjsg static bool 3226c349dbc7Sjsg intel_dp_get_dpcd(struct intel_dp *intel_dp) 3227c349dbc7Sjsg { 3228ad8b1aafSjsg int ret; 3229ad8b1aafSjsg 32305ca02815Sjsg if (intel_dp_init_lttpr_and_dprx_caps(intel_dp) < 0) 3231c349dbc7Sjsg return false; 3232c349dbc7Sjsg 3233c349dbc7Sjsg /* 3234c349dbc7Sjsg * Don't clobber cached eDP rates. Also skip re-reading 3235c349dbc7Sjsg * the OUI/ID since we know it won't change. 3236c349dbc7Sjsg */ 3237c349dbc7Sjsg if (!intel_dp_is_edp(intel_dp)) { 3238c349dbc7Sjsg drm_dp_read_desc(&intel_dp->aux, &intel_dp->desc, 3239c349dbc7Sjsg drm_dp_is_branch(intel_dp->dpcd)); 3240c349dbc7Sjsg 3241c349dbc7Sjsg intel_dp_set_sink_rates(intel_dp); 32421bb76ff1Sjsg intel_dp_set_max_sink_lane_count(intel_dp); 3243c349dbc7Sjsg intel_dp_set_common_rates(intel_dp); 3244c349dbc7Sjsg } 3245c349dbc7Sjsg 3246ad8b1aafSjsg if (intel_dp_has_sink_count(intel_dp)) { 3247ad8b1aafSjsg ret = drm_dp_read_sink_count(&intel_dp->aux); 3248ad8b1aafSjsg if (ret < 0) 3249c349dbc7Sjsg return false; 3250c349dbc7Sjsg 3251c349dbc7Sjsg /* 3252c349dbc7Sjsg * Sink count can change between short pulse hpd hence 3253c349dbc7Sjsg * a member variable in intel_dp will track any changes 3254c349dbc7Sjsg * between short pulse interrupts. 3255c349dbc7Sjsg */ 3256ad8b1aafSjsg intel_dp->sink_count = ret; 3257c349dbc7Sjsg 3258c349dbc7Sjsg /* 3259c349dbc7Sjsg * SINK_COUNT == 0 and DOWNSTREAM_PORT_PRESENT == 1 implies that 3260c349dbc7Sjsg * a dongle is present but no display. Unless we require to know 3261c349dbc7Sjsg * if a dongle is present or not, we don't need to update 3262c349dbc7Sjsg * downstream port information. So, an early return here saves 3263c349dbc7Sjsg * time from performing other operations which are not required. 3264c349dbc7Sjsg */ 3265c349dbc7Sjsg if (!intel_dp->sink_count) 3266c349dbc7Sjsg return false; 3267c349dbc7Sjsg } 3268c349dbc7Sjsg 3269ad8b1aafSjsg return drm_dp_read_downstream_info(&intel_dp->aux, intel_dp->dpcd, 3270ad8b1aafSjsg intel_dp->downstream_ports) == 0; 3271c349dbc7Sjsg } 3272c349dbc7Sjsg 3273c349dbc7Sjsg static bool 3274c349dbc7Sjsg intel_dp_can_mst(struct intel_dp *intel_dp) 3275c349dbc7Sjsg { 3276ad8b1aafSjsg struct drm_i915_private *i915 = dp_to_i915(intel_dp); 3277ad8b1aafSjsg 3278ad8b1aafSjsg return i915->params.enable_dp_mst && 32791bb76ff1Sjsg intel_dp_mst_source_support(intel_dp) && 3280ad8b1aafSjsg drm_dp_read_mst_cap(&intel_dp->aux, intel_dp->dpcd); 3281c349dbc7Sjsg } 3282c349dbc7Sjsg 3283c349dbc7Sjsg static void 3284c349dbc7Sjsg intel_dp_configure_mst(struct intel_dp *intel_dp) 3285c349dbc7Sjsg { 3286ad8b1aafSjsg struct drm_i915_private *i915 = dp_to_i915(intel_dp); 3287c349dbc7Sjsg struct intel_encoder *encoder = 3288c349dbc7Sjsg &dp_to_dig_port(intel_dp)->base; 3289ad8b1aafSjsg bool sink_can_mst = drm_dp_read_mst_cap(&intel_dp->aux, intel_dp->dpcd); 3290c349dbc7Sjsg 3291ad8b1aafSjsg drm_dbg_kms(&i915->drm, 3292ad8b1aafSjsg "[ENCODER:%d:%s] MST support: port: %s, sink: %s, modparam: %s\n", 3293c349dbc7Sjsg encoder->base.base.id, encoder->base.name, 32941bb76ff1Sjsg str_yes_no(intel_dp_mst_source_support(intel_dp)), 32951bb76ff1Sjsg str_yes_no(sink_can_mst), 32961bb76ff1Sjsg str_yes_no(i915->params.enable_dp_mst)); 3297c349dbc7Sjsg 32981bb76ff1Sjsg if (!intel_dp_mst_source_support(intel_dp)) 3299c349dbc7Sjsg return; 3300c349dbc7Sjsg 3301c349dbc7Sjsg intel_dp->is_mst = sink_can_mst && 3302ad8b1aafSjsg i915->params.enable_dp_mst; 3303c349dbc7Sjsg 3304c349dbc7Sjsg drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst_mgr, 3305c349dbc7Sjsg intel_dp->is_mst); 3306c349dbc7Sjsg } 3307c349dbc7Sjsg 3308c349dbc7Sjsg static bool 33091bb76ff1Sjsg intel_dp_get_sink_irq_esi(struct intel_dp *intel_dp, u8 *esi) 3310c349dbc7Sjsg { 33111bb76ff1Sjsg return drm_dp_dpcd_read(&intel_dp->aux, DP_SINK_COUNT_ESI, esi, 4) == 4; 33121bb76ff1Sjsg } 33131bb76ff1Sjsg 33141bb76ff1Sjsg static bool intel_dp_ack_sink_irq_esi(struct intel_dp *intel_dp, u8 esi[4]) 33151bb76ff1Sjsg { 33161bb76ff1Sjsg int retry; 33171bb76ff1Sjsg 33181bb76ff1Sjsg for (retry = 0; retry < 3; retry++) { 33191bb76ff1Sjsg if (drm_dp_dpcd_write(&intel_dp->aux, DP_SINK_COUNT_ESI + 1, 33201bb76ff1Sjsg &esi[1], 3) == 3) 33211bb76ff1Sjsg return true; 33221bb76ff1Sjsg } 33231bb76ff1Sjsg 33241bb76ff1Sjsg return false; 3325c349dbc7Sjsg } 3326c349dbc7Sjsg 3327c349dbc7Sjsg bool 3328c349dbc7Sjsg intel_dp_needs_vsc_sdp(const struct intel_crtc_state *crtc_state, 3329c349dbc7Sjsg const struct drm_connector_state *conn_state) 3330c349dbc7Sjsg { 3331c349dbc7Sjsg /* 3332c349dbc7Sjsg * As per DP 1.4a spec section 2.2.4.3 [MSA Field for Indication 3333c349dbc7Sjsg * of Color Encoding Format and Content Color Gamut], in order to 3334c349dbc7Sjsg * sending YCBCR 420 or HDR BT.2020 signals we should use DP VSC SDP. 3335c349dbc7Sjsg */ 3336c349dbc7Sjsg if (crtc_state->output_format == INTEL_OUTPUT_FORMAT_YCBCR420) 3337c349dbc7Sjsg return true; 3338c349dbc7Sjsg 3339c349dbc7Sjsg switch (conn_state->colorspace) { 3340c349dbc7Sjsg case DRM_MODE_COLORIMETRY_SYCC_601: 3341c349dbc7Sjsg case DRM_MODE_COLORIMETRY_OPYCC_601: 3342c349dbc7Sjsg case DRM_MODE_COLORIMETRY_BT2020_YCC: 3343c349dbc7Sjsg case DRM_MODE_COLORIMETRY_BT2020_RGB: 3344c349dbc7Sjsg case DRM_MODE_COLORIMETRY_BT2020_CYCC: 3345c349dbc7Sjsg return true; 3346c349dbc7Sjsg default: 3347c349dbc7Sjsg break; 3348c349dbc7Sjsg } 3349c349dbc7Sjsg 3350c349dbc7Sjsg return false; 3351c349dbc7Sjsg } 3352c349dbc7Sjsg 3353ad8b1aafSjsg static ssize_t intel_dp_vsc_sdp_pack(const struct drm_dp_vsc_sdp *vsc, 3354ad8b1aafSjsg struct dp_sdp *sdp, size_t size) 3355c349dbc7Sjsg { 3356ad8b1aafSjsg size_t length = sizeof(struct dp_sdp); 3357c349dbc7Sjsg 3358ad8b1aafSjsg if (size < length) 3359ad8b1aafSjsg return -ENOSPC; 3360ad8b1aafSjsg 3361ad8b1aafSjsg memset(sdp, 0, size); 3362c349dbc7Sjsg 3363c349dbc7Sjsg /* 3364ad8b1aafSjsg * Prepare VSC Header for SU as per DP 1.4a spec, Table 2-119 3365ad8b1aafSjsg * VSC SDP Header Bytes 3366c349dbc7Sjsg */ 3367ad8b1aafSjsg sdp->sdp_header.HB0 = 0; /* Secondary-Data Packet ID = 0 */ 3368ad8b1aafSjsg sdp->sdp_header.HB1 = vsc->sdp_type; /* Secondary-data Packet Type */ 3369ad8b1aafSjsg sdp->sdp_header.HB2 = vsc->revision; /* Revision Number */ 3370ad8b1aafSjsg sdp->sdp_header.HB3 = vsc->length; /* Number of Valid Data Bytes */ 3371c349dbc7Sjsg 3372c349dbc7Sjsg /* 3373ad8b1aafSjsg * Only revision 0x5 supports Pixel Encoding/Colorimetry Format as 3374ad8b1aafSjsg * per DP 1.4a spec. 3375c349dbc7Sjsg */ 3376ad8b1aafSjsg if (vsc->revision != 0x5) 3377ad8b1aafSjsg goto out; 3378c349dbc7Sjsg 3379ad8b1aafSjsg /* VSC SDP Payload for DB16 through DB18 */ 3380ad8b1aafSjsg /* Pixel Encoding and Colorimetry Formats */ 3381ad8b1aafSjsg sdp->db[16] = (vsc->pixelformat & 0xf) << 4; /* DB16[7:4] */ 3382ad8b1aafSjsg sdp->db[16] |= vsc->colorimetry & 0xf; /* DB16[3:0] */ 3383c349dbc7Sjsg 3384ad8b1aafSjsg switch (vsc->bpc) { 3385ad8b1aafSjsg case 6: 3386ad8b1aafSjsg /* 6bpc: 0x0 */ 3387c349dbc7Sjsg break; 3388ad8b1aafSjsg case 8: 3389ad8b1aafSjsg sdp->db[17] = 0x1; /* DB17[3:0] */ 3390c349dbc7Sjsg break; 3391ad8b1aafSjsg case 10: 3392ad8b1aafSjsg sdp->db[17] = 0x2; 3393c349dbc7Sjsg break; 3394ad8b1aafSjsg case 12: 3395ad8b1aafSjsg sdp->db[17] = 0x3; 3396c349dbc7Sjsg break; 3397ad8b1aafSjsg case 16: 3398ad8b1aafSjsg sdp->db[17] = 0x4; 3399c349dbc7Sjsg break; 3400c349dbc7Sjsg default: 3401ad8b1aafSjsg MISSING_CASE(vsc->bpc); 3402c349dbc7Sjsg break; 3403c349dbc7Sjsg } 3404ad8b1aafSjsg /* Dynamic Range and Component Bit Depth */ 3405ad8b1aafSjsg if (vsc->dynamic_range == DP_DYNAMIC_RANGE_CTA) 3406ad8b1aafSjsg sdp->db[17] |= 0x80; /* DB17[7] */ 3407c349dbc7Sjsg 3408ad8b1aafSjsg /* Content Type */ 3409ad8b1aafSjsg sdp->db[18] = vsc->content_type & 0x7; 3410ad8b1aafSjsg 3411ad8b1aafSjsg out: 3412ad8b1aafSjsg return length; 3413c349dbc7Sjsg } 3414c349dbc7Sjsg 3415ad8b1aafSjsg static ssize_t 34161bb76ff1Sjsg intel_dp_hdr_metadata_infoframe_sdp_pack(struct drm_i915_private *i915, 34171bb76ff1Sjsg const struct hdmi_drm_infoframe *drm_infoframe, 3418ad8b1aafSjsg struct dp_sdp *sdp, 3419ad8b1aafSjsg size_t size) 3420c349dbc7Sjsg { 3421ad8b1aafSjsg size_t length = sizeof(struct dp_sdp); 3422c349dbc7Sjsg const int infoframe_size = HDMI_INFOFRAME_HEADER_SIZE + HDMI_DRM_INFOFRAME_SIZE; 3423c349dbc7Sjsg unsigned char buf[HDMI_INFOFRAME_HEADER_SIZE + HDMI_DRM_INFOFRAME_SIZE]; 3424c349dbc7Sjsg ssize_t len; 3425c349dbc7Sjsg 3426ad8b1aafSjsg if (size < length) 3427ad8b1aafSjsg return -ENOSPC; 3428c349dbc7Sjsg 3429ad8b1aafSjsg memset(sdp, 0, size); 3430ad8b1aafSjsg 3431ad8b1aafSjsg len = hdmi_drm_infoframe_pack_only(drm_infoframe, buf, sizeof(buf)); 3432c349dbc7Sjsg if (len < 0) { 34331bb76ff1Sjsg drm_dbg_kms(&i915->drm, "buffer size is smaller than hdr metadata infoframe\n"); 3434ad8b1aafSjsg return -ENOSPC; 3435c349dbc7Sjsg } 3436c349dbc7Sjsg 3437c349dbc7Sjsg if (len != infoframe_size) { 34381bb76ff1Sjsg drm_dbg_kms(&i915->drm, "wrong static hdr metadata size\n"); 3439ad8b1aafSjsg return -ENOSPC; 3440c349dbc7Sjsg } 3441c349dbc7Sjsg 3442c349dbc7Sjsg /* 3443c349dbc7Sjsg * Set up the infoframe sdp packet for HDR static metadata. 3444c349dbc7Sjsg * Prepare VSC Header for SU as per DP 1.4a spec, 3445c349dbc7Sjsg * Table 2-100 and Table 2-101 3446c349dbc7Sjsg */ 3447c349dbc7Sjsg 3448ad8b1aafSjsg /* Secondary-Data Packet ID, 00h for non-Audio INFOFRAME */ 3449ad8b1aafSjsg sdp->sdp_header.HB0 = 0; 3450c349dbc7Sjsg /* 3451c349dbc7Sjsg * Packet Type 80h + Non-audio INFOFRAME Type value 3452ad8b1aafSjsg * HDMI_INFOFRAME_TYPE_DRM: 0x87 3453ad8b1aafSjsg * - 80h + Non-audio INFOFRAME Type value 3454ad8b1aafSjsg * - InfoFrame Type: 0x07 3455ad8b1aafSjsg * [CTA-861-G Table-42 Dynamic Range and Mastering InfoFrame] 3456c349dbc7Sjsg */ 3457ad8b1aafSjsg sdp->sdp_header.HB1 = drm_infoframe->type; 3458c349dbc7Sjsg /* 3459c349dbc7Sjsg * Least Significant Eight Bits of (Data Byte Count – 1) 3460ad8b1aafSjsg * infoframe_size - 1 3461c349dbc7Sjsg */ 3462ad8b1aafSjsg sdp->sdp_header.HB2 = 0x1D; 3463c349dbc7Sjsg /* INFOFRAME SDP Version Number */ 3464ad8b1aafSjsg sdp->sdp_header.HB3 = (0x13 << 2); 3465c349dbc7Sjsg /* CTA Header Byte 2 (INFOFRAME Version Number) */ 3466ad8b1aafSjsg sdp->db[0] = drm_infoframe->version; 3467c349dbc7Sjsg /* CTA Header Byte 3 (Length of INFOFRAME): HDMI_DRM_INFOFRAME_SIZE */ 3468ad8b1aafSjsg sdp->db[1] = drm_infoframe->length; 3469c349dbc7Sjsg /* 3470c349dbc7Sjsg * Copy HDMI_DRM_INFOFRAME_SIZE size from a buffer after 3471c349dbc7Sjsg * HDMI_INFOFRAME_HEADER_SIZE 3472c349dbc7Sjsg */ 3473ad8b1aafSjsg BUILD_BUG_ON(sizeof(sdp->db) < HDMI_DRM_INFOFRAME_SIZE + 2); 3474ad8b1aafSjsg memcpy(&sdp->db[2], &buf[HDMI_INFOFRAME_HEADER_SIZE], 3475c349dbc7Sjsg HDMI_DRM_INFOFRAME_SIZE); 3476c349dbc7Sjsg 3477c349dbc7Sjsg /* 3478ad8b1aafSjsg * Size of DP infoframe sdp packet for HDR static metadata consists of 3479c349dbc7Sjsg * - DP SDP Header(struct dp_sdp_header): 4 bytes 3480c349dbc7Sjsg * - Two Data Blocks: 2 bytes 3481c349dbc7Sjsg * CTA Header Byte2 (INFOFRAME Version Number) 3482c349dbc7Sjsg * CTA Header Byte3 (Length of INFOFRAME) 3483c349dbc7Sjsg * - HDMI_DRM_INFOFRAME_SIZE: 26 bytes 3484c349dbc7Sjsg * 3485c349dbc7Sjsg * Prior to GEN11's GMP register size is identical to DP HDR static metadata 3486c349dbc7Sjsg * infoframe size. But GEN11+ has larger than that size, write_infoframe 3487c349dbc7Sjsg * will pad rest of the size. 3488c349dbc7Sjsg */ 3489ad8b1aafSjsg return sizeof(struct dp_sdp_header) + 2 + HDMI_DRM_INFOFRAME_SIZE; 3490c349dbc7Sjsg } 3491c349dbc7Sjsg 3492ad8b1aafSjsg static void intel_write_dp_sdp(struct intel_encoder *encoder, 3493ad8b1aafSjsg const struct intel_crtc_state *crtc_state, 3494ad8b1aafSjsg unsigned int type) 3495ad8b1aafSjsg { 3496ad8b1aafSjsg struct intel_digital_port *dig_port = enc_to_dig_port(encoder); 3497ad8b1aafSjsg struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 3498ad8b1aafSjsg struct dp_sdp sdp = {}; 3499ad8b1aafSjsg ssize_t len; 3500ad8b1aafSjsg 3501ad8b1aafSjsg if ((crtc_state->infoframes.enable & 3502ad8b1aafSjsg intel_hdmi_infoframe_enable(type)) == 0) 3503ad8b1aafSjsg return; 3504ad8b1aafSjsg 3505ad8b1aafSjsg switch (type) { 3506ad8b1aafSjsg case DP_SDP_VSC: 3507ad8b1aafSjsg len = intel_dp_vsc_sdp_pack(&crtc_state->infoframes.vsc, &sdp, 3508ad8b1aafSjsg sizeof(sdp)); 3509ad8b1aafSjsg break; 3510ad8b1aafSjsg case HDMI_PACKET_TYPE_GAMUT_METADATA: 35111bb76ff1Sjsg len = intel_dp_hdr_metadata_infoframe_sdp_pack(dev_priv, 35121bb76ff1Sjsg &crtc_state->infoframes.drm.drm, 3513ad8b1aafSjsg &sdp, sizeof(sdp)); 3514ad8b1aafSjsg break; 3515ad8b1aafSjsg default: 3516ad8b1aafSjsg MISSING_CASE(type); 3517ad8b1aafSjsg return; 3518ad8b1aafSjsg } 3519ad8b1aafSjsg 3520ad8b1aafSjsg if (drm_WARN_ON(&dev_priv->drm, len < 0)) 3521ad8b1aafSjsg return; 3522ad8b1aafSjsg 3523ad8b1aafSjsg dig_port->write_infoframe(encoder, crtc_state, type, &sdp, len); 3524ad8b1aafSjsg } 3525ad8b1aafSjsg 3526ad8b1aafSjsg void intel_write_dp_vsc_sdp(struct intel_encoder *encoder, 3527ad8b1aafSjsg const struct intel_crtc_state *crtc_state, 35281bb76ff1Sjsg const struct drm_dp_vsc_sdp *vsc) 3529ad8b1aafSjsg { 3530ad8b1aafSjsg struct intel_digital_port *dig_port = enc_to_dig_port(encoder); 3531ad8b1aafSjsg struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 3532ad8b1aafSjsg struct dp_sdp sdp = {}; 3533ad8b1aafSjsg ssize_t len; 3534ad8b1aafSjsg 3535ad8b1aafSjsg len = intel_dp_vsc_sdp_pack(vsc, &sdp, sizeof(sdp)); 3536ad8b1aafSjsg 3537ad8b1aafSjsg if (drm_WARN_ON(&dev_priv->drm, len < 0)) 3538ad8b1aafSjsg return; 3539ad8b1aafSjsg 3540ad8b1aafSjsg dig_port->write_infoframe(encoder, crtc_state, DP_SDP_VSC, 3541ad8b1aafSjsg &sdp, len); 3542ad8b1aafSjsg } 3543ad8b1aafSjsg 3544ad8b1aafSjsg void intel_dp_set_infoframes(struct intel_encoder *encoder, 3545ad8b1aafSjsg bool enable, 3546c349dbc7Sjsg const struct intel_crtc_state *crtc_state, 3547c349dbc7Sjsg const struct drm_connector_state *conn_state) 3548c349dbc7Sjsg { 3549ad8b1aafSjsg struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 3550ad8b1aafSjsg i915_reg_t reg = HSW_TVIDEO_DIP_CTL(crtc_state->cpu_transcoder); 3551ad8b1aafSjsg u32 dip_enable = VIDEO_DIP_ENABLE_AVI_HSW | VIDEO_DIP_ENABLE_GCP_HSW | 3552ad8b1aafSjsg VIDEO_DIP_ENABLE_VS_HSW | VIDEO_DIP_ENABLE_GMP_HSW | 3553ad8b1aafSjsg VIDEO_DIP_ENABLE_SPD_HSW | VIDEO_DIP_ENABLE_DRM_GLK; 35545ca02815Sjsg u32 val = intel_de_read(dev_priv, reg) & ~dip_enable; 3555c349dbc7Sjsg 3556ad8b1aafSjsg /* TODO: Add DSC case (DIP_ENABLE_PPS) */ 3557ad8b1aafSjsg /* When PSR is enabled, this routine doesn't disable VSC DIP */ 35585ca02815Sjsg if (!crtc_state->has_psr) 35595ca02815Sjsg val &= ~VIDEO_DIP_ENABLE_VSC_HSW; 3560ad8b1aafSjsg 3561ad8b1aafSjsg intel_de_write(dev_priv, reg, val); 3562ad8b1aafSjsg intel_de_posting_read(dev_priv, reg); 35635ca02815Sjsg 35645ca02815Sjsg if (!enable) 3565ad8b1aafSjsg return; 3566ad8b1aafSjsg 3567ad8b1aafSjsg /* When PSR is enabled, VSC SDP is handled by PSR routine */ 35685ca02815Sjsg if (!crtc_state->has_psr) 3569ad8b1aafSjsg intel_write_dp_sdp(encoder, crtc_state, DP_SDP_VSC); 3570ad8b1aafSjsg 3571ad8b1aafSjsg intel_write_dp_sdp(encoder, crtc_state, HDMI_PACKET_TYPE_GAMUT_METADATA); 3572ad8b1aafSjsg } 3573ad8b1aafSjsg 3574ad8b1aafSjsg static int intel_dp_vsc_sdp_unpack(struct drm_dp_vsc_sdp *vsc, 3575ad8b1aafSjsg const void *buffer, size_t size) 3576c349dbc7Sjsg { 3577ad8b1aafSjsg const struct dp_sdp *sdp = buffer; 3578ad8b1aafSjsg 3579ad8b1aafSjsg if (size < sizeof(struct dp_sdp)) 3580ad8b1aafSjsg return -EINVAL; 3581ad8b1aafSjsg 35820abc5c1fSjsg memset(vsc, 0, sizeof(*vsc)); 3583ad8b1aafSjsg 3584ad8b1aafSjsg if (sdp->sdp_header.HB0 != 0) 3585ad8b1aafSjsg return -EINVAL; 3586ad8b1aafSjsg 3587ad8b1aafSjsg if (sdp->sdp_header.HB1 != DP_SDP_VSC) 3588ad8b1aafSjsg return -EINVAL; 3589ad8b1aafSjsg 3590ad8b1aafSjsg vsc->sdp_type = sdp->sdp_header.HB1; 3591ad8b1aafSjsg vsc->revision = sdp->sdp_header.HB2; 3592ad8b1aafSjsg vsc->length = sdp->sdp_header.HB3; 3593ad8b1aafSjsg 3594ad8b1aafSjsg if ((sdp->sdp_header.HB2 == 0x2 && sdp->sdp_header.HB3 == 0x8) || 3595ad8b1aafSjsg (sdp->sdp_header.HB2 == 0x4 && sdp->sdp_header.HB3 == 0xe)) { 3596ad8b1aafSjsg /* 3597ad8b1aafSjsg * - HB2 = 0x2, HB3 = 0x8 3598ad8b1aafSjsg * VSC SDP supporting 3D stereo + PSR 3599ad8b1aafSjsg * - HB2 = 0x4, HB3 = 0xe 3600ad8b1aafSjsg * VSC SDP supporting 3D stereo + PSR2 with Y-coordinate of 3601ad8b1aafSjsg * first scan line of the SU region (applies to eDP v1.4b 3602ad8b1aafSjsg * and higher). 3603ad8b1aafSjsg */ 3604ad8b1aafSjsg return 0; 3605ad8b1aafSjsg } else if (sdp->sdp_header.HB2 == 0x5 && sdp->sdp_header.HB3 == 0x13) { 3606ad8b1aafSjsg /* 3607ad8b1aafSjsg * - HB2 = 0x5, HB3 = 0x13 3608ad8b1aafSjsg * VSC SDP supporting 3D stereo + PSR2 + Pixel Encoding/Colorimetry 3609ad8b1aafSjsg * Format. 3610ad8b1aafSjsg */ 3611ad8b1aafSjsg vsc->pixelformat = (sdp->db[16] >> 4) & 0xf; 3612ad8b1aafSjsg vsc->colorimetry = sdp->db[16] & 0xf; 3613ad8b1aafSjsg vsc->dynamic_range = (sdp->db[17] >> 7) & 0x1; 3614ad8b1aafSjsg 3615ad8b1aafSjsg switch (sdp->db[17] & 0x7) { 3616ad8b1aafSjsg case 0x0: 3617ad8b1aafSjsg vsc->bpc = 6; 3618ad8b1aafSjsg break; 3619ad8b1aafSjsg case 0x1: 3620ad8b1aafSjsg vsc->bpc = 8; 3621ad8b1aafSjsg break; 3622ad8b1aafSjsg case 0x2: 3623ad8b1aafSjsg vsc->bpc = 10; 3624ad8b1aafSjsg break; 3625ad8b1aafSjsg case 0x3: 3626ad8b1aafSjsg vsc->bpc = 12; 3627ad8b1aafSjsg break; 3628ad8b1aafSjsg case 0x4: 3629ad8b1aafSjsg vsc->bpc = 16; 3630ad8b1aafSjsg break; 3631ad8b1aafSjsg default: 3632ad8b1aafSjsg MISSING_CASE(sdp->db[17] & 0x7); 3633ad8b1aafSjsg return -EINVAL; 3634ad8b1aafSjsg } 3635ad8b1aafSjsg 3636ad8b1aafSjsg vsc->content_type = sdp->db[18] & 0x7; 3637ad8b1aafSjsg } else { 3638ad8b1aafSjsg return -EINVAL; 3639ad8b1aafSjsg } 3640ad8b1aafSjsg 3641ad8b1aafSjsg return 0; 3642ad8b1aafSjsg } 3643ad8b1aafSjsg 3644ad8b1aafSjsg static int 3645ad8b1aafSjsg intel_dp_hdr_metadata_infoframe_sdp_unpack(struct hdmi_drm_infoframe *drm_infoframe, 3646ad8b1aafSjsg const void *buffer, size_t size) 3647ad8b1aafSjsg { 3648ad8b1aafSjsg int ret; 3649ad8b1aafSjsg 3650ad8b1aafSjsg const struct dp_sdp *sdp = buffer; 3651ad8b1aafSjsg 3652ad8b1aafSjsg if (size < sizeof(struct dp_sdp)) 3653ad8b1aafSjsg return -EINVAL; 3654ad8b1aafSjsg 3655ad8b1aafSjsg if (sdp->sdp_header.HB0 != 0) 3656ad8b1aafSjsg return -EINVAL; 3657ad8b1aafSjsg 3658ad8b1aafSjsg if (sdp->sdp_header.HB1 != HDMI_INFOFRAME_TYPE_DRM) 3659ad8b1aafSjsg return -EINVAL; 3660ad8b1aafSjsg 3661ad8b1aafSjsg /* 3662ad8b1aafSjsg * Least Significant Eight Bits of (Data Byte Count – 1) 3663ad8b1aafSjsg * 1Dh (i.e., Data Byte Count = 30 bytes). 3664ad8b1aafSjsg */ 3665ad8b1aafSjsg if (sdp->sdp_header.HB2 != 0x1D) 3666ad8b1aafSjsg return -EINVAL; 3667ad8b1aafSjsg 3668ad8b1aafSjsg /* Most Significant Two Bits of (Data Byte Count – 1), Clear to 00b. */ 3669ad8b1aafSjsg if ((sdp->sdp_header.HB3 & 0x3) != 0) 3670ad8b1aafSjsg return -EINVAL; 3671ad8b1aafSjsg 3672ad8b1aafSjsg /* INFOFRAME SDP Version Number */ 3673ad8b1aafSjsg if (((sdp->sdp_header.HB3 >> 2) & 0x3f) != 0x13) 3674ad8b1aafSjsg return -EINVAL; 3675ad8b1aafSjsg 3676ad8b1aafSjsg /* CTA Header Byte 2 (INFOFRAME Version Number) */ 3677ad8b1aafSjsg if (sdp->db[0] != 1) 3678ad8b1aafSjsg return -EINVAL; 3679ad8b1aafSjsg 3680ad8b1aafSjsg /* CTA Header Byte 3 (Length of INFOFRAME): HDMI_DRM_INFOFRAME_SIZE */ 3681ad8b1aafSjsg if (sdp->db[1] != HDMI_DRM_INFOFRAME_SIZE) 3682ad8b1aafSjsg return -EINVAL; 3683ad8b1aafSjsg 3684ad8b1aafSjsg ret = hdmi_drm_infoframe_unpack_only(drm_infoframe, &sdp->db[2], 3685ad8b1aafSjsg HDMI_DRM_INFOFRAME_SIZE); 3686ad8b1aafSjsg 3687ad8b1aafSjsg return ret; 3688ad8b1aafSjsg } 3689ad8b1aafSjsg 3690ad8b1aafSjsg static void intel_read_dp_vsc_sdp(struct intel_encoder *encoder, 3691ad8b1aafSjsg struct intel_crtc_state *crtc_state, 3692ad8b1aafSjsg struct drm_dp_vsc_sdp *vsc) 3693ad8b1aafSjsg { 3694ad8b1aafSjsg struct intel_digital_port *dig_port = enc_to_dig_port(encoder); 3695ad8b1aafSjsg struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 3696ad8b1aafSjsg unsigned int type = DP_SDP_VSC; 3697ad8b1aafSjsg struct dp_sdp sdp = {}; 3698ad8b1aafSjsg int ret; 3699ad8b1aafSjsg 3700ad8b1aafSjsg /* When PSR is enabled, VSC SDP is handled by PSR routine */ 37015ca02815Sjsg if (crtc_state->has_psr) 3702c349dbc7Sjsg return; 3703c349dbc7Sjsg 3704ad8b1aafSjsg if ((crtc_state->infoframes.enable & 3705ad8b1aafSjsg intel_hdmi_infoframe_enable(type)) == 0) 3706ad8b1aafSjsg return; 3707ad8b1aafSjsg 3708ad8b1aafSjsg dig_port->read_infoframe(encoder, crtc_state, type, &sdp, sizeof(sdp)); 3709ad8b1aafSjsg 3710ad8b1aafSjsg ret = intel_dp_vsc_sdp_unpack(vsc, &sdp, sizeof(sdp)); 3711ad8b1aafSjsg 3712ad8b1aafSjsg if (ret) 3713ad8b1aafSjsg drm_dbg_kms(&dev_priv->drm, "Failed to unpack DP VSC SDP\n"); 3714ad8b1aafSjsg } 3715ad8b1aafSjsg 3716ad8b1aafSjsg static void intel_read_dp_hdr_metadata_infoframe_sdp(struct intel_encoder *encoder, 3717ad8b1aafSjsg struct intel_crtc_state *crtc_state, 3718ad8b1aafSjsg struct hdmi_drm_infoframe *drm_infoframe) 3719ad8b1aafSjsg { 3720ad8b1aafSjsg struct intel_digital_port *dig_port = enc_to_dig_port(encoder); 3721ad8b1aafSjsg struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 3722ad8b1aafSjsg unsigned int type = HDMI_PACKET_TYPE_GAMUT_METADATA; 3723ad8b1aafSjsg struct dp_sdp sdp = {}; 3724ad8b1aafSjsg int ret; 3725ad8b1aafSjsg 3726ad8b1aafSjsg if ((crtc_state->infoframes.enable & 3727ad8b1aafSjsg intel_hdmi_infoframe_enable(type)) == 0) 3728ad8b1aafSjsg return; 3729ad8b1aafSjsg 3730ad8b1aafSjsg dig_port->read_infoframe(encoder, crtc_state, type, &sdp, 3731ad8b1aafSjsg sizeof(sdp)); 3732ad8b1aafSjsg 3733ad8b1aafSjsg ret = intel_dp_hdr_metadata_infoframe_sdp_unpack(drm_infoframe, &sdp, 3734ad8b1aafSjsg sizeof(sdp)); 3735ad8b1aafSjsg 3736ad8b1aafSjsg if (ret) 3737ad8b1aafSjsg drm_dbg_kms(&dev_priv->drm, 3738ad8b1aafSjsg "Failed to unpack DP HDR Metadata Infoframe SDP\n"); 3739ad8b1aafSjsg } 3740ad8b1aafSjsg 3741ad8b1aafSjsg void intel_read_dp_sdp(struct intel_encoder *encoder, 3742ad8b1aafSjsg struct intel_crtc_state *crtc_state, 3743ad8b1aafSjsg unsigned int type) 3744ad8b1aafSjsg { 3745ad8b1aafSjsg switch (type) { 3746ad8b1aafSjsg case DP_SDP_VSC: 3747ad8b1aafSjsg intel_read_dp_vsc_sdp(encoder, crtc_state, 3748ad8b1aafSjsg &crtc_state->infoframes.vsc); 3749ad8b1aafSjsg break; 3750ad8b1aafSjsg case HDMI_PACKET_TYPE_GAMUT_METADATA: 3751ad8b1aafSjsg intel_read_dp_hdr_metadata_infoframe_sdp(encoder, crtc_state, 3752ad8b1aafSjsg &crtc_state->infoframes.drm.drm); 3753ad8b1aafSjsg break; 3754ad8b1aafSjsg default: 3755ad8b1aafSjsg MISSING_CASE(type); 3756ad8b1aafSjsg break; 3757ad8b1aafSjsg } 3758c349dbc7Sjsg } 3759c349dbc7Sjsg 3760c349dbc7Sjsg static u8 intel_dp_autotest_link_training(struct intel_dp *intel_dp) 3761c349dbc7Sjsg { 3762ad8b1aafSjsg struct drm_i915_private *i915 = dp_to_i915(intel_dp); 3763c349dbc7Sjsg int status = 0; 3764c349dbc7Sjsg int test_link_rate; 3765c349dbc7Sjsg u8 test_lane_count, test_link_bw; 3766c349dbc7Sjsg /* (DP CTS 1.2) 3767c349dbc7Sjsg * 4.3.1.11 3768c349dbc7Sjsg */ 3769c349dbc7Sjsg /* Read the TEST_LANE_COUNT and TEST_LINK_RTAE fields (DP CTS 3.1.4) */ 3770c349dbc7Sjsg status = drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_LANE_COUNT, 3771c349dbc7Sjsg &test_lane_count); 3772c349dbc7Sjsg 3773c349dbc7Sjsg if (status <= 0) { 3774ad8b1aafSjsg drm_dbg_kms(&i915->drm, "Lane count read failed\n"); 3775c349dbc7Sjsg return DP_TEST_NAK; 3776c349dbc7Sjsg } 3777c349dbc7Sjsg test_lane_count &= DP_MAX_LANE_COUNT_MASK; 3778c349dbc7Sjsg 3779c349dbc7Sjsg status = drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_LINK_RATE, 3780c349dbc7Sjsg &test_link_bw); 3781c349dbc7Sjsg if (status <= 0) { 3782ad8b1aafSjsg drm_dbg_kms(&i915->drm, "Link Rate read failed\n"); 3783c349dbc7Sjsg return DP_TEST_NAK; 3784c349dbc7Sjsg } 3785c349dbc7Sjsg test_link_rate = drm_dp_bw_code_to_link_rate(test_link_bw); 3786c349dbc7Sjsg 3787c349dbc7Sjsg /* Validate the requested link rate and lane count */ 3788c349dbc7Sjsg if (!intel_dp_link_params_valid(intel_dp, test_link_rate, 3789c349dbc7Sjsg test_lane_count)) 3790c349dbc7Sjsg return DP_TEST_NAK; 3791c349dbc7Sjsg 3792c349dbc7Sjsg intel_dp->compliance.test_lane_count = test_lane_count; 3793c349dbc7Sjsg intel_dp->compliance.test_link_rate = test_link_rate; 3794c349dbc7Sjsg 3795c349dbc7Sjsg return DP_TEST_ACK; 3796c349dbc7Sjsg } 3797c349dbc7Sjsg 3798c349dbc7Sjsg static u8 intel_dp_autotest_video_pattern(struct intel_dp *intel_dp) 3799c349dbc7Sjsg { 3800ad8b1aafSjsg struct drm_i915_private *i915 = dp_to_i915(intel_dp); 3801c349dbc7Sjsg u8 test_pattern; 3802c349dbc7Sjsg u8 test_misc; 3803c349dbc7Sjsg __be16 h_width, v_height; 3804c349dbc7Sjsg int status = 0; 3805c349dbc7Sjsg 3806c349dbc7Sjsg /* Read the TEST_PATTERN (DP CTS 3.1.5) */ 3807c349dbc7Sjsg status = drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_PATTERN, 3808c349dbc7Sjsg &test_pattern); 3809c349dbc7Sjsg if (status <= 0) { 3810ad8b1aafSjsg drm_dbg_kms(&i915->drm, "Test pattern read failed\n"); 3811c349dbc7Sjsg return DP_TEST_NAK; 3812c349dbc7Sjsg } 3813c349dbc7Sjsg if (test_pattern != DP_COLOR_RAMP) 3814c349dbc7Sjsg return DP_TEST_NAK; 3815c349dbc7Sjsg 3816c349dbc7Sjsg status = drm_dp_dpcd_read(&intel_dp->aux, DP_TEST_H_WIDTH_HI, 3817c349dbc7Sjsg &h_width, 2); 3818c349dbc7Sjsg if (status <= 0) { 3819ad8b1aafSjsg drm_dbg_kms(&i915->drm, "H Width read failed\n"); 3820c349dbc7Sjsg return DP_TEST_NAK; 3821c349dbc7Sjsg } 3822c349dbc7Sjsg 3823c349dbc7Sjsg status = drm_dp_dpcd_read(&intel_dp->aux, DP_TEST_V_HEIGHT_HI, 3824c349dbc7Sjsg &v_height, 2); 3825c349dbc7Sjsg if (status <= 0) { 3826ad8b1aafSjsg drm_dbg_kms(&i915->drm, "V Height read failed\n"); 3827c349dbc7Sjsg return DP_TEST_NAK; 3828c349dbc7Sjsg } 3829c349dbc7Sjsg 3830c349dbc7Sjsg status = drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_MISC0, 3831c349dbc7Sjsg &test_misc); 3832c349dbc7Sjsg if (status <= 0) { 3833ad8b1aafSjsg drm_dbg_kms(&i915->drm, "TEST MISC read failed\n"); 3834c349dbc7Sjsg return DP_TEST_NAK; 3835c349dbc7Sjsg } 3836c349dbc7Sjsg if ((test_misc & DP_TEST_COLOR_FORMAT_MASK) != DP_COLOR_FORMAT_RGB) 3837c349dbc7Sjsg return DP_TEST_NAK; 3838c349dbc7Sjsg if (test_misc & DP_TEST_DYNAMIC_RANGE_CEA) 3839c349dbc7Sjsg return DP_TEST_NAK; 3840c349dbc7Sjsg switch (test_misc & DP_TEST_BIT_DEPTH_MASK) { 3841c349dbc7Sjsg case DP_TEST_BIT_DEPTH_6: 3842c349dbc7Sjsg intel_dp->compliance.test_data.bpc = 6; 3843c349dbc7Sjsg break; 3844c349dbc7Sjsg case DP_TEST_BIT_DEPTH_8: 3845c349dbc7Sjsg intel_dp->compliance.test_data.bpc = 8; 3846c349dbc7Sjsg break; 3847c349dbc7Sjsg default: 3848c349dbc7Sjsg return DP_TEST_NAK; 3849c349dbc7Sjsg } 3850c349dbc7Sjsg 3851c349dbc7Sjsg intel_dp->compliance.test_data.video_pattern = test_pattern; 3852c349dbc7Sjsg intel_dp->compliance.test_data.hdisplay = be16_to_cpu(h_width); 3853c349dbc7Sjsg intel_dp->compliance.test_data.vdisplay = be16_to_cpu(v_height); 3854c349dbc7Sjsg /* Set test active flag here so userspace doesn't interrupt things */ 3855c349dbc7Sjsg intel_dp->compliance.test_active = true; 3856c349dbc7Sjsg 3857c349dbc7Sjsg return DP_TEST_ACK; 3858c349dbc7Sjsg } 3859c349dbc7Sjsg 3860c349dbc7Sjsg static u8 intel_dp_autotest_edid(struct intel_dp *intel_dp) 3861c349dbc7Sjsg { 3862ad8b1aafSjsg struct drm_i915_private *i915 = dp_to_i915(intel_dp); 3863c349dbc7Sjsg u8 test_result = DP_TEST_ACK; 3864c349dbc7Sjsg struct intel_connector *intel_connector = intel_dp->attached_connector; 3865c349dbc7Sjsg struct drm_connector *connector = &intel_connector->base; 3866c349dbc7Sjsg 3867c349dbc7Sjsg if (intel_connector->detect_edid == NULL || 3868c349dbc7Sjsg connector->edid_corrupt || 3869c349dbc7Sjsg intel_dp->aux.i2c_defer_count > 6) { 3870c349dbc7Sjsg /* Check EDID read for NACKs, DEFERs and corruption 3871c349dbc7Sjsg * (DP CTS 1.2 Core r1.1) 3872c349dbc7Sjsg * 4.2.2.4 : Failed EDID read, I2C_NAK 3873c349dbc7Sjsg * 4.2.2.5 : Failed EDID read, I2C_DEFER 3874c349dbc7Sjsg * 4.2.2.6 : EDID corruption detected 3875c349dbc7Sjsg * Use failsafe mode for all cases 3876c349dbc7Sjsg */ 3877c349dbc7Sjsg if (intel_dp->aux.i2c_nack_count > 0 || 3878c349dbc7Sjsg intel_dp->aux.i2c_defer_count > 0) 3879ad8b1aafSjsg drm_dbg_kms(&i915->drm, 3880ad8b1aafSjsg "EDID read had %d NACKs, %d DEFERs\n", 3881c349dbc7Sjsg intel_dp->aux.i2c_nack_count, 3882c349dbc7Sjsg intel_dp->aux.i2c_defer_count); 3883c349dbc7Sjsg intel_dp->compliance.test_data.edid = INTEL_DP_RESOLUTION_FAILSAFE; 3884c349dbc7Sjsg } else { 3885f005ef32Sjsg /* FIXME: Get rid of drm_edid_raw() */ 3886f005ef32Sjsg const struct edid *block = drm_edid_raw(intel_connector->detect_edid); 3887c349dbc7Sjsg 3888f005ef32Sjsg /* We have to write the checksum of the last block read */ 3889f005ef32Sjsg block += block->extensions; 3890c349dbc7Sjsg 3891c349dbc7Sjsg if (drm_dp_dpcd_writeb(&intel_dp->aux, DP_TEST_EDID_CHECKSUM, 3892c349dbc7Sjsg block->checksum) <= 0) 3893ad8b1aafSjsg drm_dbg_kms(&i915->drm, 3894ad8b1aafSjsg "Failed to write EDID checksum\n"); 3895c349dbc7Sjsg 3896c349dbc7Sjsg test_result = DP_TEST_ACK | DP_TEST_EDID_CHECKSUM_WRITE; 3897c349dbc7Sjsg intel_dp->compliance.test_data.edid = INTEL_DP_RESOLUTION_PREFERRED; 3898c349dbc7Sjsg } 3899c349dbc7Sjsg 3900c349dbc7Sjsg /* Set test active flag here so userspace doesn't interrupt things */ 3901c349dbc7Sjsg intel_dp->compliance.test_active = true; 3902c349dbc7Sjsg 3903c349dbc7Sjsg return test_result; 3904c349dbc7Sjsg } 3905c349dbc7Sjsg 39065ca02815Sjsg static void intel_dp_phy_pattern_update(struct intel_dp *intel_dp, 39075ca02815Sjsg const struct intel_crtc_state *crtc_state) 3908ad8b1aafSjsg { 3909ad8b1aafSjsg struct drm_i915_private *dev_priv = 3910ad8b1aafSjsg to_i915(dp_to_dig_port(intel_dp)->base.base.dev); 3911ad8b1aafSjsg struct drm_dp_phy_test_params *data = 3912ad8b1aafSjsg &intel_dp->compliance.test_data.phytest; 39135ca02815Sjsg struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); 3914ad8b1aafSjsg enum pipe pipe = crtc->pipe; 3915ad8b1aafSjsg u32 pattern_val; 3916ad8b1aafSjsg 3917ad8b1aafSjsg switch (data->phy_pattern) { 3918ad8b1aafSjsg case DP_PHY_TEST_PATTERN_NONE: 39191bb76ff1Sjsg drm_dbg_kms(&dev_priv->drm, "Disable Phy Test Pattern\n"); 3920ad8b1aafSjsg intel_de_write(dev_priv, DDI_DP_COMP_CTL(pipe), 0x0); 3921ad8b1aafSjsg break; 3922ad8b1aafSjsg case DP_PHY_TEST_PATTERN_D10_2: 39231bb76ff1Sjsg drm_dbg_kms(&dev_priv->drm, "Set D10.2 Phy Test Pattern\n"); 3924ad8b1aafSjsg intel_de_write(dev_priv, DDI_DP_COMP_CTL(pipe), 3925ad8b1aafSjsg DDI_DP_COMP_CTL_ENABLE | DDI_DP_COMP_CTL_D10_2); 3926ad8b1aafSjsg break; 3927ad8b1aafSjsg case DP_PHY_TEST_PATTERN_ERROR_COUNT: 39281bb76ff1Sjsg drm_dbg_kms(&dev_priv->drm, "Set Error Count Phy Test Pattern\n"); 3929ad8b1aafSjsg intel_de_write(dev_priv, DDI_DP_COMP_CTL(pipe), 3930ad8b1aafSjsg DDI_DP_COMP_CTL_ENABLE | 3931ad8b1aafSjsg DDI_DP_COMP_CTL_SCRAMBLED_0); 3932ad8b1aafSjsg break; 3933ad8b1aafSjsg case DP_PHY_TEST_PATTERN_PRBS7: 39341bb76ff1Sjsg drm_dbg_kms(&dev_priv->drm, "Set PRBS7 Phy Test Pattern\n"); 3935ad8b1aafSjsg intel_de_write(dev_priv, DDI_DP_COMP_CTL(pipe), 3936ad8b1aafSjsg DDI_DP_COMP_CTL_ENABLE | DDI_DP_COMP_CTL_PRBS7); 3937ad8b1aafSjsg break; 3938ad8b1aafSjsg case DP_PHY_TEST_PATTERN_80BIT_CUSTOM: 3939ad8b1aafSjsg /* 3940ad8b1aafSjsg * FIXME: Ideally pattern should come from DPCD 0x250. As 3941ad8b1aafSjsg * current firmware of DPR-100 could not set it, so hardcoding 3942ad8b1aafSjsg * now for complaince test. 3943ad8b1aafSjsg */ 39441bb76ff1Sjsg drm_dbg_kms(&dev_priv->drm, 39451bb76ff1Sjsg "Set 80Bit Custom Phy Test Pattern 0x3e0f83e0 0x0f83e0f8 0x0000f83e\n"); 3946ad8b1aafSjsg pattern_val = 0x3e0f83e0; 3947ad8b1aafSjsg intel_de_write(dev_priv, DDI_DP_COMP_PAT(pipe, 0), pattern_val); 3948ad8b1aafSjsg pattern_val = 0x0f83e0f8; 3949ad8b1aafSjsg intel_de_write(dev_priv, DDI_DP_COMP_PAT(pipe, 1), pattern_val); 3950ad8b1aafSjsg pattern_val = 0x0000f83e; 3951ad8b1aafSjsg intel_de_write(dev_priv, DDI_DP_COMP_PAT(pipe, 2), pattern_val); 3952ad8b1aafSjsg intel_de_write(dev_priv, DDI_DP_COMP_CTL(pipe), 3953ad8b1aafSjsg DDI_DP_COMP_CTL_ENABLE | 3954ad8b1aafSjsg DDI_DP_COMP_CTL_CUSTOM80); 3955ad8b1aafSjsg break; 3956ad8b1aafSjsg case DP_PHY_TEST_PATTERN_CP2520: 3957ad8b1aafSjsg /* 3958ad8b1aafSjsg * FIXME: Ideally pattern should come from DPCD 0x24A. As 3959ad8b1aafSjsg * current firmware of DPR-100 could not set it, so hardcoding 3960ad8b1aafSjsg * now for complaince test. 3961ad8b1aafSjsg */ 39621bb76ff1Sjsg drm_dbg_kms(&dev_priv->drm, "Set HBR2 compliance Phy Test Pattern\n"); 3963ad8b1aafSjsg pattern_val = 0xFB; 3964ad8b1aafSjsg intel_de_write(dev_priv, DDI_DP_COMP_CTL(pipe), 3965ad8b1aafSjsg DDI_DP_COMP_CTL_ENABLE | DDI_DP_COMP_CTL_HBR2 | 3966ad8b1aafSjsg pattern_val); 3967ad8b1aafSjsg break; 3968ad8b1aafSjsg default: 3969ad8b1aafSjsg WARN(1, "Invalid Phy Test Pattern\n"); 3970ad8b1aafSjsg } 3971ad8b1aafSjsg } 3972ad8b1aafSjsg 39735ca02815Sjsg static void intel_dp_process_phy_request(struct intel_dp *intel_dp, 39745ca02815Sjsg const struct intel_crtc_state *crtc_state) 3975ad8b1aafSjsg { 39761bb76ff1Sjsg struct drm_i915_private *i915 = dp_to_i915(intel_dp); 3977ad8b1aafSjsg struct drm_dp_phy_test_params *data = 3978ad8b1aafSjsg &intel_dp->compliance.test_data.phytest; 3979ad8b1aafSjsg u8 link_status[DP_LINK_STATUS_SIZE]; 3980ad8b1aafSjsg 39815ca02815Sjsg if (drm_dp_dpcd_read_phy_link_status(&intel_dp->aux, DP_PHY_DPRX, 39825ca02815Sjsg link_status) < 0) { 39831bb76ff1Sjsg drm_dbg_kms(&i915->drm, "failed to get link status\n"); 3984ad8b1aafSjsg return; 3985ad8b1aafSjsg } 3986ad8b1aafSjsg 3987ad8b1aafSjsg /* retrieve vswing & pre-emphasis setting */ 39885ca02815Sjsg intel_dp_get_adjust_train(intel_dp, crtc_state, DP_PHY_DPRX, 39895ca02815Sjsg link_status); 3990ad8b1aafSjsg 39915ca02815Sjsg intel_dp_set_signal_levels(intel_dp, crtc_state, DP_PHY_DPRX); 3992ad8b1aafSjsg 39935ca02815Sjsg intel_dp_phy_pattern_update(intel_dp, crtc_state); 3994ad8b1aafSjsg 39955ca02815Sjsg drm_dp_dpcd_write(&intel_dp->aux, DP_TRAINING_LANE0_SET, 39965ca02815Sjsg intel_dp->train_set, crtc_state->lane_count); 3997ad8b1aafSjsg 3998ad8b1aafSjsg drm_dp_set_phy_test_pattern(&intel_dp->aux, data, 3999f005ef32Sjsg intel_dp->dpcd[DP_DPCD_REV]); 4000ad8b1aafSjsg } 4001ad8b1aafSjsg 4002c349dbc7Sjsg static u8 intel_dp_autotest_phy_pattern(struct intel_dp *intel_dp) 4003c349dbc7Sjsg { 40041bb76ff1Sjsg struct drm_i915_private *i915 = dp_to_i915(intel_dp); 40055ca02815Sjsg struct drm_dp_phy_test_params *data = 40065ca02815Sjsg &intel_dp->compliance.test_data.phytest; 4007ad8b1aafSjsg 40085ca02815Sjsg if (drm_dp_get_phy_test_pattern(&intel_dp->aux, data)) { 40091bb76ff1Sjsg drm_dbg_kms(&i915->drm, "DP Phy Test pattern AUX read failure\n"); 40105ca02815Sjsg return DP_TEST_NAK; 40115ca02815Sjsg } 4012ad8b1aafSjsg 40135ca02815Sjsg /* Set test active flag here so userspace doesn't interrupt things */ 40145ca02815Sjsg intel_dp->compliance.test_active = true; 4015ad8b1aafSjsg 40165ca02815Sjsg return DP_TEST_ACK; 4017c349dbc7Sjsg } 4018c349dbc7Sjsg 4019c349dbc7Sjsg static void intel_dp_handle_test_request(struct intel_dp *intel_dp) 4020c349dbc7Sjsg { 4021ad8b1aafSjsg struct drm_i915_private *i915 = dp_to_i915(intel_dp); 4022c349dbc7Sjsg u8 response = DP_TEST_NAK; 4023c349dbc7Sjsg u8 request = 0; 4024c349dbc7Sjsg int status; 4025c349dbc7Sjsg 4026c349dbc7Sjsg status = drm_dp_dpcd_readb(&intel_dp->aux, DP_TEST_REQUEST, &request); 4027c349dbc7Sjsg if (status <= 0) { 4028ad8b1aafSjsg drm_dbg_kms(&i915->drm, 4029ad8b1aafSjsg "Could not read test request from sink\n"); 4030c349dbc7Sjsg goto update_status; 4031c349dbc7Sjsg } 4032c349dbc7Sjsg 4033c349dbc7Sjsg switch (request) { 4034c349dbc7Sjsg case DP_TEST_LINK_TRAINING: 4035ad8b1aafSjsg drm_dbg_kms(&i915->drm, "LINK_TRAINING test requested\n"); 4036c349dbc7Sjsg response = intel_dp_autotest_link_training(intel_dp); 4037c349dbc7Sjsg break; 4038c349dbc7Sjsg case DP_TEST_LINK_VIDEO_PATTERN: 4039ad8b1aafSjsg drm_dbg_kms(&i915->drm, "TEST_PATTERN test requested\n"); 4040c349dbc7Sjsg response = intel_dp_autotest_video_pattern(intel_dp); 4041c349dbc7Sjsg break; 4042c349dbc7Sjsg case DP_TEST_LINK_EDID_READ: 4043ad8b1aafSjsg drm_dbg_kms(&i915->drm, "EDID test requested\n"); 4044c349dbc7Sjsg response = intel_dp_autotest_edid(intel_dp); 4045c349dbc7Sjsg break; 4046c349dbc7Sjsg case DP_TEST_LINK_PHY_TEST_PATTERN: 4047ad8b1aafSjsg drm_dbg_kms(&i915->drm, "PHY_PATTERN test requested\n"); 4048c349dbc7Sjsg response = intel_dp_autotest_phy_pattern(intel_dp); 4049c349dbc7Sjsg break; 4050c349dbc7Sjsg default: 4051ad8b1aafSjsg drm_dbg_kms(&i915->drm, "Invalid test request '%02x'\n", 4052ad8b1aafSjsg request); 4053c349dbc7Sjsg break; 4054c349dbc7Sjsg } 4055c349dbc7Sjsg 4056c349dbc7Sjsg if (response & DP_TEST_ACK) 4057c349dbc7Sjsg intel_dp->compliance.test_type = request; 4058c349dbc7Sjsg 4059c349dbc7Sjsg update_status: 4060c349dbc7Sjsg status = drm_dp_dpcd_writeb(&intel_dp->aux, DP_TEST_RESPONSE, response); 4061c349dbc7Sjsg if (status <= 0) 4062ad8b1aafSjsg drm_dbg_kms(&i915->drm, 4063ad8b1aafSjsg "Could not write test response to sink\n"); 4064c349dbc7Sjsg } 4065c349dbc7Sjsg 40661bb76ff1Sjsg static bool intel_dp_link_ok(struct intel_dp *intel_dp, 40671bb76ff1Sjsg u8 link_status[DP_LINK_STATUS_SIZE]) 40685ca02815Sjsg { 40691bb76ff1Sjsg struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; 40701bb76ff1Sjsg struct drm_i915_private *i915 = to_i915(encoder->base.dev); 40711bb76ff1Sjsg bool uhbr = intel_dp->link_rate >= 1000000; 40721bb76ff1Sjsg bool ok; 40731bb76ff1Sjsg 40741bb76ff1Sjsg if (uhbr) 40751bb76ff1Sjsg ok = drm_dp_128b132b_lane_channel_eq_done(link_status, 40761bb76ff1Sjsg intel_dp->lane_count); 40771bb76ff1Sjsg else 40781bb76ff1Sjsg ok = drm_dp_channel_eq_ok(link_status, intel_dp->lane_count); 40791bb76ff1Sjsg 40801bb76ff1Sjsg if (ok) 40811bb76ff1Sjsg return true; 40821bb76ff1Sjsg 40831bb76ff1Sjsg intel_dp_dump_link_status(intel_dp, DP_PHY_DPRX, link_status); 40841bb76ff1Sjsg drm_dbg_kms(&i915->drm, 40851bb76ff1Sjsg "[ENCODER:%d:%s] %s link not ok, retraining\n", 40861bb76ff1Sjsg encoder->base.base.id, encoder->base.name, 40871bb76ff1Sjsg uhbr ? "128b/132b" : "8b/10b"); 40881bb76ff1Sjsg 40891bb76ff1Sjsg return false; 40901bb76ff1Sjsg } 40911bb76ff1Sjsg 40921bb76ff1Sjsg static void 40931bb76ff1Sjsg intel_dp_mst_hpd_irq(struct intel_dp *intel_dp, u8 *esi, u8 *ack) 40941bb76ff1Sjsg { 40951bb76ff1Sjsg bool handled = false; 40961bb76ff1Sjsg 409783f201fbSjsg drm_dp_mst_hpd_irq_handle_event(&intel_dp->mst_mgr, esi, ack, &handled); 40985ca02815Sjsg 40995ca02815Sjsg if (esi[1] & DP_CP_IRQ) { 41005ca02815Sjsg intel_hdcp_handle_cp_irq(intel_dp->attached_connector); 41011bb76ff1Sjsg ack[1] |= DP_CP_IRQ; 41025ca02815Sjsg } 41035ca02815Sjsg } 41045ca02815Sjsg 41051bb76ff1Sjsg static bool intel_dp_mst_link_status(struct intel_dp *intel_dp) 41061bb76ff1Sjsg { 41071bb76ff1Sjsg struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; 41081bb76ff1Sjsg struct drm_i915_private *i915 = to_i915(encoder->base.dev); 41091bb76ff1Sjsg u8 link_status[DP_LINK_STATUS_SIZE] = {}; 41101bb76ff1Sjsg const size_t esi_link_status_size = DP_LINK_STATUS_SIZE - 2; 41111bb76ff1Sjsg 41121bb76ff1Sjsg if (drm_dp_dpcd_read(&intel_dp->aux, DP_LANE0_1_STATUS_ESI, link_status, 41131bb76ff1Sjsg esi_link_status_size) != esi_link_status_size) { 41141bb76ff1Sjsg drm_err(&i915->drm, 41151bb76ff1Sjsg "[ENCODER:%d:%s] Failed to read link status\n", 41161bb76ff1Sjsg encoder->base.base.id, encoder->base.name); 41171bb76ff1Sjsg return false; 41181bb76ff1Sjsg } 41191bb76ff1Sjsg 41201bb76ff1Sjsg return intel_dp_link_ok(intel_dp, link_status); 41211bb76ff1Sjsg } 41221bb76ff1Sjsg 4123ad8b1aafSjsg /** 4124ad8b1aafSjsg * intel_dp_check_mst_status - service any pending MST interrupts, check link status 4125ad8b1aafSjsg * @intel_dp: Intel DP struct 4126ad8b1aafSjsg * 4127ad8b1aafSjsg * Read any pending MST interrupts, call MST core to handle these and ack the 4128ad8b1aafSjsg * interrupts. Check if the main and AUX link state is ok. 4129ad8b1aafSjsg * 4130ad8b1aafSjsg * Returns: 4131ad8b1aafSjsg * - %true if pending interrupts were serviced (or no interrupts were 4132ad8b1aafSjsg * pending) w/o detecting an error condition. 4133ad8b1aafSjsg * - %false if an error condition - like AUX failure or a loss of link - is 4134ad8b1aafSjsg * detected, which needs servicing from the hotplug work. 4135ad8b1aafSjsg */ 4136ad8b1aafSjsg static bool 4137c349dbc7Sjsg intel_dp_check_mst_status(struct intel_dp *intel_dp) 4138c349dbc7Sjsg { 4139ad8b1aafSjsg struct drm_i915_private *i915 = dp_to_i915(intel_dp); 4140ad8b1aafSjsg bool link_ok = true; 4141c349dbc7Sjsg 4142ad8b1aafSjsg drm_WARN_ON_ONCE(&i915->drm, intel_dp->active_mst_links < 0); 4143ad8b1aafSjsg 4144ad8b1aafSjsg for (;;) { 41451bb76ff1Sjsg u8 esi[4] = {}; 41461bb76ff1Sjsg u8 ack[4] = {}; 4147c349dbc7Sjsg 4148ad8b1aafSjsg if (!intel_dp_get_sink_irq_esi(intel_dp, esi)) { 4149ad8b1aafSjsg drm_dbg_kms(&i915->drm, 4150ad8b1aafSjsg "failed to get ESI - device may have failed\n"); 4151ad8b1aafSjsg link_ok = false; 4152c349dbc7Sjsg 4153ad8b1aafSjsg break; 4154c349dbc7Sjsg } 4155c349dbc7Sjsg 41561bb76ff1Sjsg drm_dbg_kms(&i915->drm, "DPRX ESI: %4ph\n", esi); 41571bb76ff1Sjsg 4158ad8b1aafSjsg if (intel_dp->active_mst_links > 0 && link_ok && 41591bb76ff1Sjsg esi[3] & LINK_STATUS_CHANGED) { 41601bb76ff1Sjsg if (!intel_dp_mst_link_status(intel_dp)) 4161ad8b1aafSjsg link_ok = false; 41621bb76ff1Sjsg ack[3] |= LINK_STATUS_CHANGED; 4163ad8b1aafSjsg } 4164c349dbc7Sjsg 41651bb76ff1Sjsg intel_dp_mst_hpd_irq(intel_dp, esi, ack); 4166ad8b1aafSjsg 41671bb76ff1Sjsg if (!memchr_inv(ack, 0, sizeof(ack))) 4168ad8b1aafSjsg break; 4169ad8b1aafSjsg 41701bb76ff1Sjsg if (!intel_dp_ack_sink_irq_esi(intel_dp, ack)) 41711bb76ff1Sjsg drm_dbg_kms(&i915->drm, "Failed to ack ESI\n"); 417283f201fbSjsg 417383f201fbSjsg if (ack[1] & (DP_DOWN_REP_MSG_RDY | DP_UP_REQ_MSG_RDY)) 417483f201fbSjsg drm_dp_mst_hpd_irq_send_new_request(&intel_dp->mst_mgr); 4175c349dbc7Sjsg } 4176c349dbc7Sjsg 4177ad8b1aafSjsg return link_ok; 4178c349dbc7Sjsg } 4179c349dbc7Sjsg 41805ca02815Sjsg static void 41815ca02815Sjsg intel_dp_handle_hdmi_link_status_change(struct intel_dp *intel_dp) 41825ca02815Sjsg { 41835ca02815Sjsg bool is_active; 41845ca02815Sjsg u8 buf = 0; 41855ca02815Sjsg 41865ca02815Sjsg is_active = drm_dp_pcon_hdmi_link_active(&intel_dp->aux); 41875ca02815Sjsg if (intel_dp->frl.is_trained && !is_active) { 41885ca02815Sjsg if (drm_dp_dpcd_readb(&intel_dp->aux, DP_PCON_HDMI_LINK_CONFIG_1, &buf) < 0) 41895ca02815Sjsg return; 41905ca02815Sjsg 41915ca02815Sjsg buf &= ~DP_PCON_ENABLE_HDMI_LINK; 41925ca02815Sjsg if (drm_dp_dpcd_writeb(&intel_dp->aux, DP_PCON_HDMI_LINK_CONFIG_1, buf) < 0) 41935ca02815Sjsg return; 41945ca02815Sjsg 41955ca02815Sjsg drm_dp_pcon_hdmi_frl_link_error_count(&intel_dp->aux, &intel_dp->attached_connector->base); 41965ca02815Sjsg 41971bb76ff1Sjsg intel_dp->frl.is_trained = false; 41981bb76ff1Sjsg 41995ca02815Sjsg /* Restart FRL training or fall back to TMDS mode */ 42005ca02815Sjsg intel_dp_check_frl_training(intel_dp); 42015ca02815Sjsg } 42025ca02815Sjsg } 42035ca02815Sjsg 4204c349dbc7Sjsg static bool 4205c349dbc7Sjsg intel_dp_needs_link_retrain(struct intel_dp *intel_dp) 4206c349dbc7Sjsg { 4207c349dbc7Sjsg u8 link_status[DP_LINK_STATUS_SIZE]; 4208c349dbc7Sjsg 4209c349dbc7Sjsg if (!intel_dp->link_trained) 4210c349dbc7Sjsg return false; 4211c349dbc7Sjsg 4212c349dbc7Sjsg /* 4213c349dbc7Sjsg * While PSR source HW is enabled, it will control main-link sending 4214c349dbc7Sjsg * frames, enabling and disabling it so trying to do a retrain will fail 4215c349dbc7Sjsg * as the link would or not be on or it could mix training patterns 4216c349dbc7Sjsg * and frame data at the same time causing retrain to fail. 4217c349dbc7Sjsg * Also when exiting PSR, HW will retrain the link anyways fixing 4218c349dbc7Sjsg * any link status error. 4219c349dbc7Sjsg */ 4220c349dbc7Sjsg if (intel_psr_enabled(intel_dp)) 4221c349dbc7Sjsg return false; 4222c349dbc7Sjsg 42235ca02815Sjsg if (drm_dp_dpcd_read_phy_link_status(&intel_dp->aux, DP_PHY_DPRX, 42245ca02815Sjsg link_status) < 0) 4225c349dbc7Sjsg return false; 4226c349dbc7Sjsg 4227c349dbc7Sjsg /* 4228c349dbc7Sjsg * Validate the cached values of intel_dp->link_rate and 4229c349dbc7Sjsg * intel_dp->lane_count before attempting to retrain. 42305ca02815Sjsg * 42315ca02815Sjsg * FIXME would be nice to user the crtc state here, but since 42325ca02815Sjsg * we need to call this from the short HPD handler that seems 42335ca02815Sjsg * a bit hard. 4234c349dbc7Sjsg */ 4235c349dbc7Sjsg if (!intel_dp_link_params_valid(intel_dp, intel_dp->link_rate, 4236c349dbc7Sjsg intel_dp->lane_count)) 4237c349dbc7Sjsg return false; 4238c349dbc7Sjsg 42391bb76ff1Sjsg /* Retrain if link not ok */ 42401bb76ff1Sjsg return !intel_dp_link_ok(intel_dp, link_status); 4241c349dbc7Sjsg } 4242c349dbc7Sjsg 4243ad8b1aafSjsg static bool intel_dp_has_connector(struct intel_dp *intel_dp, 4244ad8b1aafSjsg const struct drm_connector_state *conn_state) 4245ad8b1aafSjsg { 4246ad8b1aafSjsg struct drm_i915_private *i915 = dp_to_i915(intel_dp); 4247ad8b1aafSjsg struct intel_encoder *encoder; 4248ad8b1aafSjsg enum pipe pipe; 4249ad8b1aafSjsg 4250ad8b1aafSjsg if (!conn_state->best_encoder) 4251ad8b1aafSjsg return false; 4252ad8b1aafSjsg 4253ad8b1aafSjsg /* SST */ 4254ad8b1aafSjsg encoder = &dp_to_dig_port(intel_dp)->base; 4255ad8b1aafSjsg if (conn_state->best_encoder == &encoder->base) 4256ad8b1aafSjsg return true; 4257ad8b1aafSjsg 4258ad8b1aafSjsg /* MST */ 4259ad8b1aafSjsg for_each_pipe(i915, pipe) { 4260ad8b1aafSjsg encoder = &intel_dp->mst_encoders[pipe]->base; 4261ad8b1aafSjsg if (conn_state->best_encoder == &encoder->base) 4262ad8b1aafSjsg return true; 4263ad8b1aafSjsg } 4264ad8b1aafSjsg 4265ad8b1aafSjsg return false; 4266ad8b1aafSjsg } 4267ad8b1aafSjsg 4268f005ef32Sjsg int intel_dp_get_active_pipes(struct intel_dp *intel_dp, 4269ad8b1aafSjsg struct drm_modeset_acquire_ctx *ctx, 42701bb76ff1Sjsg u8 *pipe_mask) 4271ad8b1aafSjsg { 4272ad8b1aafSjsg struct drm_i915_private *i915 = dp_to_i915(intel_dp); 4273ad8b1aafSjsg struct drm_connector_list_iter conn_iter; 4274ad8b1aafSjsg struct intel_connector *connector; 4275ad8b1aafSjsg int ret = 0; 4276ad8b1aafSjsg 42771bb76ff1Sjsg *pipe_mask = 0; 4278ad8b1aafSjsg 4279ad8b1aafSjsg drm_connector_list_iter_begin(&i915->drm, &conn_iter); 4280ad8b1aafSjsg for_each_intel_connector_iter(connector, &conn_iter) { 4281ad8b1aafSjsg struct drm_connector_state *conn_state = 4282ad8b1aafSjsg connector->base.state; 4283ad8b1aafSjsg struct intel_crtc_state *crtc_state; 4284ad8b1aafSjsg struct intel_crtc *crtc; 4285ad8b1aafSjsg 4286ad8b1aafSjsg if (!intel_dp_has_connector(intel_dp, conn_state)) 4287ad8b1aafSjsg continue; 4288ad8b1aafSjsg 4289ad8b1aafSjsg crtc = to_intel_crtc(conn_state->crtc); 4290ad8b1aafSjsg if (!crtc) 4291ad8b1aafSjsg continue; 4292ad8b1aafSjsg 4293ad8b1aafSjsg ret = drm_modeset_lock(&crtc->base.mutex, ctx); 4294ad8b1aafSjsg if (ret) 4295ad8b1aafSjsg break; 4296ad8b1aafSjsg 4297ad8b1aafSjsg crtc_state = to_intel_crtc_state(crtc->base.state); 4298ad8b1aafSjsg 4299ad8b1aafSjsg drm_WARN_ON(&i915->drm, !intel_crtc_has_dp_encoder(crtc_state)); 4300ad8b1aafSjsg 4301ad8b1aafSjsg if (!crtc_state->hw.active) 4302ad8b1aafSjsg continue; 4303ad8b1aafSjsg 4304ad8b1aafSjsg if (conn_state->commit && 4305ad8b1aafSjsg !try_wait_for_completion(&conn_state->commit->hw_done)) 4306ad8b1aafSjsg continue; 4307ad8b1aafSjsg 43081bb76ff1Sjsg *pipe_mask |= BIT(crtc->pipe); 4309ad8b1aafSjsg } 4310ad8b1aafSjsg drm_connector_list_iter_end(&conn_iter); 4311ad8b1aafSjsg 4312ad8b1aafSjsg return ret; 4313ad8b1aafSjsg } 4314ad8b1aafSjsg 4315ad8b1aafSjsg static bool intel_dp_is_connected(struct intel_dp *intel_dp) 4316ad8b1aafSjsg { 4317ad8b1aafSjsg struct intel_connector *connector = intel_dp->attached_connector; 4318ad8b1aafSjsg 4319ad8b1aafSjsg return connector->base.status == connector_status_connected || 4320ad8b1aafSjsg intel_dp->is_mst; 4321ad8b1aafSjsg } 4322ad8b1aafSjsg 4323c349dbc7Sjsg int intel_dp_retrain_link(struct intel_encoder *encoder, 4324c349dbc7Sjsg struct drm_modeset_acquire_ctx *ctx) 4325c349dbc7Sjsg { 4326c349dbc7Sjsg struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 4327c349dbc7Sjsg struct intel_dp *intel_dp = enc_to_intel_dp(encoder); 4328c349dbc7Sjsg struct intel_crtc *crtc; 43291bb76ff1Sjsg u8 pipe_mask; 4330c349dbc7Sjsg int ret; 4331c349dbc7Sjsg 4332ad8b1aafSjsg if (!intel_dp_is_connected(intel_dp)) 4333c349dbc7Sjsg return 0; 4334c349dbc7Sjsg 4335c349dbc7Sjsg ret = drm_modeset_lock(&dev_priv->drm.mode_config.connection_mutex, 4336c349dbc7Sjsg ctx); 4337c349dbc7Sjsg if (ret) 4338c349dbc7Sjsg return ret; 4339c349dbc7Sjsg 4340f005ef32Sjsg if (!intel_dp_needs_link_retrain(intel_dp)) 4341f005ef32Sjsg return 0; 4342f005ef32Sjsg 4343f005ef32Sjsg ret = intel_dp_get_active_pipes(intel_dp, ctx, &pipe_mask); 4344c349dbc7Sjsg if (ret) 4345c349dbc7Sjsg return ret; 4346c349dbc7Sjsg 43471bb76ff1Sjsg if (pipe_mask == 0) 4348c349dbc7Sjsg return 0; 4349c349dbc7Sjsg 4350f005ef32Sjsg if (!intel_dp_needs_link_retrain(intel_dp)) 4351f005ef32Sjsg return 0; 4352f005ef32Sjsg 4353ad8b1aafSjsg drm_dbg_kms(&dev_priv->drm, "[ENCODER:%d:%s] retraining link\n", 4354ad8b1aafSjsg encoder->base.base.id, encoder->base.name); 4355c349dbc7Sjsg 43561bb76ff1Sjsg for_each_intel_crtc_in_pipe_mask(&dev_priv->drm, crtc, pipe_mask) { 4357ad8b1aafSjsg const struct intel_crtc_state *crtc_state = 4358ad8b1aafSjsg to_intel_crtc_state(crtc->base.state); 4359c349dbc7Sjsg 4360c349dbc7Sjsg /* Suppress underruns caused by re-training */ 4361c349dbc7Sjsg intel_set_cpu_fifo_underrun_reporting(dev_priv, crtc->pipe, false); 4362c349dbc7Sjsg if (crtc_state->has_pch_encoder) 4363c349dbc7Sjsg intel_set_pch_fifo_underrun_reporting(dev_priv, 4364c349dbc7Sjsg intel_crtc_pch_transcoder(crtc), false); 4365ad8b1aafSjsg } 4366c349dbc7Sjsg 43671bb76ff1Sjsg for_each_intel_crtc_in_pipe_mask(&dev_priv->drm, crtc, pipe_mask) { 43685ca02815Sjsg const struct intel_crtc_state *crtc_state = 43695ca02815Sjsg to_intel_crtc_state(crtc->base.state); 43705ca02815Sjsg 43715ca02815Sjsg /* retrain on the MST master transcoder */ 43725ca02815Sjsg if (DISPLAY_VER(dev_priv) >= 12 && 43735ca02815Sjsg intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DP_MST) && 43745ca02815Sjsg !intel_dp_mst_is_master_trans(crtc_state)) 43755ca02815Sjsg continue; 43765ca02815Sjsg 4377*aa0c546bSjsg intel_dp->link_trained = false; 4378*aa0c546bSjsg 43795ca02815Sjsg intel_dp_check_frl_training(intel_dp); 43805ca02815Sjsg intel_dp_pcon_dsc_configure(intel_dp, crtc_state); 43815ca02815Sjsg intel_dp_start_link_train(intel_dp, crtc_state); 43825ca02815Sjsg intel_dp_stop_link_train(intel_dp, crtc_state); 43835ca02815Sjsg break; 43845ca02815Sjsg } 4385c349dbc7Sjsg 43861bb76ff1Sjsg for_each_intel_crtc_in_pipe_mask(&dev_priv->drm, crtc, pipe_mask) { 4387ad8b1aafSjsg const struct intel_crtc_state *crtc_state = 4388ad8b1aafSjsg to_intel_crtc_state(crtc->base.state); 4389ad8b1aafSjsg 4390c349dbc7Sjsg /* Keep underrun reporting disabled until things are stable */ 43911bb76ff1Sjsg intel_crtc_wait_for_next_vblank(crtc); 4392c349dbc7Sjsg 4393c349dbc7Sjsg intel_set_cpu_fifo_underrun_reporting(dev_priv, crtc->pipe, true); 4394c349dbc7Sjsg if (crtc_state->has_pch_encoder) 4395c349dbc7Sjsg intel_set_pch_fifo_underrun_reporting(dev_priv, 4396c349dbc7Sjsg intel_crtc_pch_transcoder(crtc), true); 4397ad8b1aafSjsg } 4398c349dbc7Sjsg 4399c349dbc7Sjsg return 0; 4400c349dbc7Sjsg } 4401c349dbc7Sjsg 44025ca02815Sjsg static int intel_dp_prep_phy_test(struct intel_dp *intel_dp, 44035ca02815Sjsg struct drm_modeset_acquire_ctx *ctx, 44041bb76ff1Sjsg u8 *pipe_mask) 4405c349dbc7Sjsg { 44065ca02815Sjsg struct drm_i915_private *i915 = dp_to_i915(intel_dp); 44075ca02815Sjsg struct drm_connector_list_iter conn_iter; 44085ca02815Sjsg struct intel_connector *connector; 44095ca02815Sjsg int ret = 0; 44105ca02815Sjsg 44111bb76ff1Sjsg *pipe_mask = 0; 44125ca02815Sjsg 44135ca02815Sjsg drm_connector_list_iter_begin(&i915->drm, &conn_iter); 44145ca02815Sjsg for_each_intel_connector_iter(connector, &conn_iter) { 44155ca02815Sjsg struct drm_connector_state *conn_state = 44165ca02815Sjsg connector->base.state; 44175ca02815Sjsg struct intel_crtc_state *crtc_state; 44185ca02815Sjsg struct intel_crtc *crtc; 44195ca02815Sjsg 44205ca02815Sjsg if (!intel_dp_has_connector(intel_dp, conn_state)) 44215ca02815Sjsg continue; 44225ca02815Sjsg 44235ca02815Sjsg crtc = to_intel_crtc(conn_state->crtc); 44245ca02815Sjsg if (!crtc) 44255ca02815Sjsg continue; 44265ca02815Sjsg 44275ca02815Sjsg ret = drm_modeset_lock(&crtc->base.mutex, ctx); 44285ca02815Sjsg if (ret) 44295ca02815Sjsg break; 44305ca02815Sjsg 44315ca02815Sjsg crtc_state = to_intel_crtc_state(crtc->base.state); 44325ca02815Sjsg 44335ca02815Sjsg drm_WARN_ON(&i915->drm, !intel_crtc_has_dp_encoder(crtc_state)); 44345ca02815Sjsg 44355ca02815Sjsg if (!crtc_state->hw.active) 44365ca02815Sjsg continue; 44375ca02815Sjsg 44385ca02815Sjsg if (conn_state->commit && 44395ca02815Sjsg !try_wait_for_completion(&conn_state->commit->hw_done)) 44405ca02815Sjsg continue; 44415ca02815Sjsg 44421bb76ff1Sjsg *pipe_mask |= BIT(crtc->pipe); 44435ca02815Sjsg } 44445ca02815Sjsg drm_connector_list_iter_end(&conn_iter); 44455ca02815Sjsg 44465ca02815Sjsg return ret; 44475ca02815Sjsg } 44485ca02815Sjsg 44495ca02815Sjsg static int intel_dp_do_phy_test(struct intel_encoder *encoder, 44505ca02815Sjsg struct drm_modeset_acquire_ctx *ctx) 44515ca02815Sjsg { 44525ca02815Sjsg struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 44535ca02815Sjsg struct intel_dp *intel_dp = enc_to_intel_dp(encoder); 44545ca02815Sjsg struct intel_crtc *crtc; 44551bb76ff1Sjsg u8 pipe_mask; 4456c349dbc7Sjsg int ret; 4457c349dbc7Sjsg 44585ca02815Sjsg ret = drm_modeset_lock(&dev_priv->drm.mode_config.connection_mutex, 44595ca02815Sjsg ctx); 44605ca02815Sjsg if (ret) 44615ca02815Sjsg return ret; 44625ca02815Sjsg 44631bb76ff1Sjsg ret = intel_dp_prep_phy_test(intel_dp, ctx, &pipe_mask); 44645ca02815Sjsg if (ret) 44655ca02815Sjsg return ret; 44665ca02815Sjsg 44671bb76ff1Sjsg if (pipe_mask == 0) 44685ca02815Sjsg return 0; 44695ca02815Sjsg 44705ca02815Sjsg drm_dbg_kms(&dev_priv->drm, "[ENCODER:%d:%s] PHY test\n", 44715ca02815Sjsg encoder->base.base.id, encoder->base.name); 44725ca02815Sjsg 44731bb76ff1Sjsg for_each_intel_crtc_in_pipe_mask(&dev_priv->drm, crtc, pipe_mask) { 44745ca02815Sjsg const struct intel_crtc_state *crtc_state = 44755ca02815Sjsg to_intel_crtc_state(crtc->base.state); 44765ca02815Sjsg 44775ca02815Sjsg /* test on the MST master transcoder */ 44785ca02815Sjsg if (DISPLAY_VER(dev_priv) >= 12 && 44795ca02815Sjsg intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DP_MST) && 44805ca02815Sjsg !intel_dp_mst_is_master_trans(crtc_state)) 44815ca02815Sjsg continue; 44825ca02815Sjsg 44835ca02815Sjsg intel_dp_process_phy_request(intel_dp, crtc_state); 44845ca02815Sjsg break; 44855ca02815Sjsg } 44865ca02815Sjsg 44875ca02815Sjsg return 0; 44885ca02815Sjsg } 44895ca02815Sjsg 44905ca02815Sjsg void intel_dp_phy_test(struct intel_encoder *encoder) 44915ca02815Sjsg { 44925ca02815Sjsg struct drm_modeset_acquire_ctx ctx; 44935ca02815Sjsg int ret; 4494c349dbc7Sjsg 4495c349dbc7Sjsg drm_modeset_acquire_init(&ctx, 0); 4496c349dbc7Sjsg 4497c349dbc7Sjsg for (;;) { 44985ca02815Sjsg ret = intel_dp_do_phy_test(encoder, &ctx); 4499c349dbc7Sjsg 4500c349dbc7Sjsg if (ret == -EDEADLK) { 4501c349dbc7Sjsg drm_modeset_backoff(&ctx); 4502c349dbc7Sjsg continue; 4503c349dbc7Sjsg } 4504c349dbc7Sjsg 4505c349dbc7Sjsg break; 4506c349dbc7Sjsg } 4507c349dbc7Sjsg 4508c349dbc7Sjsg drm_modeset_drop_locks(&ctx); 4509c349dbc7Sjsg drm_modeset_acquire_fini(&ctx); 4510c349dbc7Sjsg drm_WARN(encoder->base.dev, ret, 4511c349dbc7Sjsg "Acquiring modeset locks failed with %i\n", ret); 4512c349dbc7Sjsg } 4513c349dbc7Sjsg 45145ca02815Sjsg static void intel_dp_check_device_service_irq(struct intel_dp *intel_dp) 4515c349dbc7Sjsg { 4516ad8b1aafSjsg struct drm_i915_private *i915 = dp_to_i915(intel_dp); 4517c349dbc7Sjsg u8 val; 4518c349dbc7Sjsg 4519c349dbc7Sjsg if (intel_dp->dpcd[DP_DPCD_REV] < 0x11) 4520c349dbc7Sjsg return; 4521c349dbc7Sjsg 4522c349dbc7Sjsg if (drm_dp_dpcd_readb(&intel_dp->aux, 4523c349dbc7Sjsg DP_DEVICE_SERVICE_IRQ_VECTOR, &val) != 1 || !val) 4524c349dbc7Sjsg return; 4525c349dbc7Sjsg 4526c349dbc7Sjsg drm_dp_dpcd_writeb(&intel_dp->aux, DP_DEVICE_SERVICE_IRQ_VECTOR, val); 4527c349dbc7Sjsg 4528c349dbc7Sjsg if (val & DP_AUTOMATED_TEST_REQUEST) 4529c349dbc7Sjsg intel_dp_handle_test_request(intel_dp); 4530c349dbc7Sjsg 4531c349dbc7Sjsg if (val & DP_CP_IRQ) 4532c349dbc7Sjsg intel_hdcp_handle_cp_irq(intel_dp->attached_connector); 4533c349dbc7Sjsg 4534c349dbc7Sjsg if (val & DP_SINK_SPECIFIC_IRQ) 4535ad8b1aafSjsg drm_dbg_kms(&i915->drm, "Sink specific irq unhandled\n"); 4536c349dbc7Sjsg } 4537c349dbc7Sjsg 45385ca02815Sjsg static void intel_dp_check_link_service_irq(struct intel_dp *intel_dp) 45395ca02815Sjsg { 45405ca02815Sjsg u8 val; 45415ca02815Sjsg 45425ca02815Sjsg if (intel_dp->dpcd[DP_DPCD_REV] < 0x11) 45435ca02815Sjsg return; 45445ca02815Sjsg 45455ca02815Sjsg if (drm_dp_dpcd_readb(&intel_dp->aux, 45465ca02815Sjsg DP_LINK_SERVICE_IRQ_VECTOR_ESI0, &val) != 1 || !val) 45475ca02815Sjsg return; 45485ca02815Sjsg 45495ca02815Sjsg if (drm_dp_dpcd_writeb(&intel_dp->aux, 45505ca02815Sjsg DP_LINK_SERVICE_IRQ_VECTOR_ESI0, val) != 1) 45515ca02815Sjsg return; 45525ca02815Sjsg 45535ca02815Sjsg if (val & HDMI_LINK_STATUS_CHANGED) 45545ca02815Sjsg intel_dp_handle_hdmi_link_status_change(intel_dp); 45555ca02815Sjsg } 45565ca02815Sjsg 4557c349dbc7Sjsg /* 4558c349dbc7Sjsg * According to DP spec 4559c349dbc7Sjsg * 5.1.2: 4560c349dbc7Sjsg * 1. Read DPCD 4561c349dbc7Sjsg * 2. Configure link according to Receiver Capabilities 4562c349dbc7Sjsg * 3. Use Link Training from 2.5.3.3 and 3.5.1.3 4563c349dbc7Sjsg * 4. Check link status on receipt of hot-plug interrupt 4564c349dbc7Sjsg * 4565c349dbc7Sjsg * intel_dp_short_pulse - handles short pulse interrupts 4566c349dbc7Sjsg * when full detection is not required. 4567c349dbc7Sjsg * Returns %true if short pulse is handled and full detection 4568c349dbc7Sjsg * is NOT required and %false otherwise. 4569c349dbc7Sjsg */ 4570c349dbc7Sjsg static bool 4571c349dbc7Sjsg intel_dp_short_pulse(struct intel_dp *intel_dp) 4572c349dbc7Sjsg { 4573c349dbc7Sjsg struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); 4574c349dbc7Sjsg u8 old_sink_count = intel_dp->sink_count; 4575c349dbc7Sjsg bool ret; 4576c349dbc7Sjsg 4577c349dbc7Sjsg /* 4578c349dbc7Sjsg * Clearing compliance test variables to allow capturing 4579c349dbc7Sjsg * of values for next automated test request. 4580c349dbc7Sjsg */ 4581c349dbc7Sjsg memset(&intel_dp->compliance, 0, sizeof(intel_dp->compliance)); 4582c349dbc7Sjsg 4583c349dbc7Sjsg /* 4584c349dbc7Sjsg * Now read the DPCD to see if it's actually running 4585c349dbc7Sjsg * If the current value of sink count doesn't match with 4586c349dbc7Sjsg * the value that was stored earlier or dpcd read failed 4587c349dbc7Sjsg * we need to do full detection 4588c349dbc7Sjsg */ 4589c349dbc7Sjsg ret = intel_dp_get_dpcd(intel_dp); 4590c349dbc7Sjsg 4591c349dbc7Sjsg if ((old_sink_count != intel_dp->sink_count) || !ret) { 4592c349dbc7Sjsg /* No need to proceed if we are going to do full detect */ 4593c349dbc7Sjsg return false; 4594c349dbc7Sjsg } 4595c349dbc7Sjsg 45965ca02815Sjsg intel_dp_check_device_service_irq(intel_dp); 45975ca02815Sjsg intel_dp_check_link_service_irq(intel_dp); 4598c349dbc7Sjsg 4599c349dbc7Sjsg /* Handle CEC interrupts, if any */ 4600c349dbc7Sjsg drm_dp_cec_irq(&intel_dp->aux); 4601c349dbc7Sjsg 4602c349dbc7Sjsg /* defer to the hotplug work for link retraining if needed */ 4603c349dbc7Sjsg if (intel_dp_needs_link_retrain(intel_dp)) 4604c349dbc7Sjsg return false; 4605c349dbc7Sjsg 4606c349dbc7Sjsg intel_psr_short_pulse(intel_dp); 4607c349dbc7Sjsg 46085ca02815Sjsg switch (intel_dp->compliance.test_type) { 46095ca02815Sjsg case DP_TEST_LINK_TRAINING: 4610c349dbc7Sjsg drm_dbg_kms(&dev_priv->drm, 4611c349dbc7Sjsg "Link Training Compliance Test requested\n"); 4612c349dbc7Sjsg /* Send a Hotplug Uevent to userspace to start modeset */ 4613c349dbc7Sjsg drm_kms_helper_hotplug_event(&dev_priv->drm); 46145ca02815Sjsg break; 46155ca02815Sjsg case DP_TEST_LINK_PHY_TEST_PATTERN: 46165ca02815Sjsg drm_dbg_kms(&dev_priv->drm, 46175ca02815Sjsg "PHY test pattern Compliance Test requested\n"); 46185ca02815Sjsg /* 46195ca02815Sjsg * Schedule long hpd to do the test 46205ca02815Sjsg * 46215ca02815Sjsg * FIXME get rid of the ad-hoc phy test modeset code 46225ca02815Sjsg * and properly incorporate it into the normal modeset. 46235ca02815Sjsg */ 46245ca02815Sjsg return false; 4625c349dbc7Sjsg } 4626c349dbc7Sjsg 4627c349dbc7Sjsg return true; 4628c349dbc7Sjsg } 4629c349dbc7Sjsg 4630c349dbc7Sjsg /* XXX this is probably wrong for multiple downstream ports */ 4631c349dbc7Sjsg static enum drm_connector_status 4632c349dbc7Sjsg intel_dp_detect_dpcd(struct intel_dp *intel_dp) 4633c349dbc7Sjsg { 4634ad8b1aafSjsg struct drm_i915_private *i915 = dp_to_i915(intel_dp); 46355ca02815Sjsg struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); 4636c349dbc7Sjsg u8 *dpcd = intel_dp->dpcd; 4637c349dbc7Sjsg u8 type; 4638c349dbc7Sjsg 4639ad8b1aafSjsg if (drm_WARN_ON(&i915->drm, intel_dp_is_edp(intel_dp))) 4640c349dbc7Sjsg return connector_status_connected; 4641c349dbc7Sjsg 46425ca02815Sjsg lspcon_resume(dig_port); 4643c349dbc7Sjsg 4644c349dbc7Sjsg if (!intel_dp_get_dpcd(intel_dp)) 4645c349dbc7Sjsg return connector_status_disconnected; 4646c349dbc7Sjsg 4647c349dbc7Sjsg /* if there's no downstream port, we're done */ 4648c349dbc7Sjsg if (!drm_dp_is_branch(dpcd)) 4649c349dbc7Sjsg return connector_status_connected; 4650c349dbc7Sjsg 4651c349dbc7Sjsg /* If we're HPD-aware, SINK_COUNT changes dynamically */ 4652ad8b1aafSjsg if (intel_dp_has_sink_count(intel_dp) && 4653c349dbc7Sjsg intel_dp->downstream_ports[0] & DP_DS_PORT_HPD) { 4654c349dbc7Sjsg return intel_dp->sink_count ? 4655c349dbc7Sjsg connector_status_connected : connector_status_disconnected; 4656c349dbc7Sjsg } 4657c349dbc7Sjsg 4658c349dbc7Sjsg if (intel_dp_can_mst(intel_dp)) 4659c349dbc7Sjsg return connector_status_connected; 4660c349dbc7Sjsg 4661c349dbc7Sjsg /* If no HPD, poke DDC gently */ 4662c349dbc7Sjsg if (drm_probe_ddc(&intel_dp->aux.ddc)) 4663c349dbc7Sjsg return connector_status_connected; 4664c349dbc7Sjsg 4665c349dbc7Sjsg /* Well we tried, say unknown for unreliable port types */ 4666c349dbc7Sjsg if (intel_dp->dpcd[DP_DPCD_REV] >= 0x11) { 4667c349dbc7Sjsg type = intel_dp->downstream_ports[0] & DP_DS_PORT_TYPE_MASK; 4668c349dbc7Sjsg if (type == DP_DS_PORT_TYPE_VGA || 4669c349dbc7Sjsg type == DP_DS_PORT_TYPE_NON_EDID) 4670c349dbc7Sjsg return connector_status_unknown; 4671c349dbc7Sjsg } else { 4672c349dbc7Sjsg type = intel_dp->dpcd[DP_DOWNSTREAMPORT_PRESENT] & 4673c349dbc7Sjsg DP_DWN_STRM_PORT_TYPE_MASK; 4674c349dbc7Sjsg if (type == DP_DWN_STRM_PORT_TYPE_ANALOG || 4675c349dbc7Sjsg type == DP_DWN_STRM_PORT_TYPE_OTHER) 4676c349dbc7Sjsg return connector_status_unknown; 4677c349dbc7Sjsg } 4678c349dbc7Sjsg 4679c349dbc7Sjsg /* Anything else is out of spec, warn and ignore */ 4680ad8b1aafSjsg drm_dbg_kms(&i915->drm, "Broken DP branch device, ignoring\n"); 4681c349dbc7Sjsg return connector_status_disconnected; 4682c349dbc7Sjsg } 4683c349dbc7Sjsg 4684c349dbc7Sjsg static enum drm_connector_status 4685c349dbc7Sjsg edp_detect(struct intel_dp *intel_dp) 4686c349dbc7Sjsg { 4687c349dbc7Sjsg return connector_status_connected; 4688c349dbc7Sjsg } 4689c349dbc7Sjsg 4690c349dbc7Sjsg /* 4691c349dbc7Sjsg * intel_digital_port_connected - is the specified port connected? 4692c349dbc7Sjsg * @encoder: intel_encoder 4693c349dbc7Sjsg * 4694c349dbc7Sjsg * In cases where there's a connector physically connected but it can't be used 4695c349dbc7Sjsg * by our hardware we also return false, since the rest of the driver should 4696c349dbc7Sjsg * pretty much treat the port as disconnected. This is relevant for type-C 4697c349dbc7Sjsg * (starting on ICL) where there's ownership involved. 4698c349dbc7Sjsg * 4699c349dbc7Sjsg * Return %true if port is connected, %false otherwise. 4700c349dbc7Sjsg */ 4701c349dbc7Sjsg bool intel_digital_port_connected(struct intel_encoder *encoder) 4702c349dbc7Sjsg { 4703c349dbc7Sjsg struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 4704ad8b1aafSjsg struct intel_digital_port *dig_port = enc_to_dig_port(encoder); 4705c349dbc7Sjsg bool is_connected = false; 4706c349dbc7Sjsg intel_wakeref_t wakeref; 4707c349dbc7Sjsg 4708c349dbc7Sjsg with_intel_display_power(dev_priv, POWER_DOMAIN_DISPLAY_CORE, wakeref) 4709ad8b1aafSjsg is_connected = dig_port->connected(encoder); 4710c349dbc7Sjsg 4711c349dbc7Sjsg return is_connected; 4712c349dbc7Sjsg } 4713c349dbc7Sjsg 4714f005ef32Sjsg static const struct drm_edid * 4715c349dbc7Sjsg intel_dp_get_edid(struct intel_dp *intel_dp) 4716c349dbc7Sjsg { 4717f005ef32Sjsg struct intel_connector *connector = intel_dp->attached_connector; 4718f005ef32Sjsg const struct drm_edid *fixed_edid = connector->panel.fixed_edid; 4719c349dbc7Sjsg 4720f005ef32Sjsg /* Use panel fixed edid if we have one */ 4721f005ef32Sjsg if (fixed_edid) { 4722c349dbc7Sjsg /* invalid edid */ 4723f005ef32Sjsg if (IS_ERR(fixed_edid)) 4724c349dbc7Sjsg return NULL; 4725c349dbc7Sjsg 4726f005ef32Sjsg return drm_edid_dup(fixed_edid); 4727f005ef32Sjsg } 4728f005ef32Sjsg 4729f005ef32Sjsg return drm_edid_read_ddc(&connector->base, &intel_dp->aux.ddc); 4730c349dbc7Sjsg } 4731c349dbc7Sjsg 4732c349dbc7Sjsg static void 4733ad8b1aafSjsg intel_dp_update_dfp(struct intel_dp *intel_dp, 4734f005ef32Sjsg const struct drm_edid *drm_edid) 4735ad8b1aafSjsg { 4736ad8b1aafSjsg struct drm_i915_private *i915 = dp_to_i915(intel_dp); 4737ad8b1aafSjsg struct intel_connector *connector = intel_dp->attached_connector; 4738f005ef32Sjsg const struct edid *edid; 4739f005ef32Sjsg 4740f005ef32Sjsg /* FIXME: Get rid of drm_edid_raw() */ 4741f005ef32Sjsg edid = drm_edid_raw(drm_edid); 4742ad8b1aafSjsg 4743ad8b1aafSjsg intel_dp->dfp.max_bpc = 4744ad8b1aafSjsg drm_dp_downstream_max_bpc(intel_dp->dpcd, 4745ad8b1aafSjsg intel_dp->downstream_ports, edid); 4746ad8b1aafSjsg 4747ad8b1aafSjsg intel_dp->dfp.max_dotclock = 4748ad8b1aafSjsg drm_dp_downstream_max_dotclock(intel_dp->dpcd, 4749ad8b1aafSjsg intel_dp->downstream_ports); 4750ad8b1aafSjsg 4751ad8b1aafSjsg intel_dp->dfp.min_tmds_clock = 4752ad8b1aafSjsg drm_dp_downstream_min_tmds_clock(intel_dp->dpcd, 4753ad8b1aafSjsg intel_dp->downstream_ports, 4754ad8b1aafSjsg edid); 4755ad8b1aafSjsg intel_dp->dfp.max_tmds_clock = 4756ad8b1aafSjsg drm_dp_downstream_max_tmds_clock(intel_dp->dpcd, 4757ad8b1aafSjsg intel_dp->downstream_ports, 4758ad8b1aafSjsg edid); 4759ad8b1aafSjsg 47605ca02815Sjsg intel_dp->dfp.pcon_max_frl_bw = 47615ca02815Sjsg drm_dp_get_pcon_max_frl_bw(intel_dp->dpcd, 47625ca02815Sjsg intel_dp->downstream_ports); 47635ca02815Sjsg 4764ad8b1aafSjsg drm_dbg_kms(&i915->drm, 47655ca02815Sjsg "[CONNECTOR:%d:%s] DFP max bpc %d, max dotclock %d, TMDS clock %d-%d, PCON Max FRL BW %dGbps\n", 4766ad8b1aafSjsg connector->base.base.id, connector->base.name, 4767ad8b1aafSjsg intel_dp->dfp.max_bpc, 4768ad8b1aafSjsg intel_dp->dfp.max_dotclock, 4769ad8b1aafSjsg intel_dp->dfp.min_tmds_clock, 47705ca02815Sjsg intel_dp->dfp.max_tmds_clock, 47715ca02815Sjsg intel_dp->dfp.pcon_max_frl_bw); 47725ca02815Sjsg 47735ca02815Sjsg intel_dp_get_pcon_dsc_cap(intel_dp); 4774ad8b1aafSjsg } 4775ad8b1aafSjsg 4776f005ef32Sjsg static bool 4777f005ef32Sjsg intel_dp_can_ycbcr420(struct intel_dp *intel_dp) 4778f005ef32Sjsg { 4779f005ef32Sjsg if (source_can_output(intel_dp, INTEL_OUTPUT_FORMAT_YCBCR420) && 4780f005ef32Sjsg (!drm_dp_is_branch(intel_dp->dpcd) || intel_dp->dfp.ycbcr420_passthrough)) 4781f005ef32Sjsg return true; 4782f005ef32Sjsg 4783f005ef32Sjsg if (source_can_output(intel_dp, INTEL_OUTPUT_FORMAT_RGB) && 4784f005ef32Sjsg dfp_can_convert_from_rgb(intel_dp, INTEL_OUTPUT_FORMAT_YCBCR420)) 4785f005ef32Sjsg return true; 4786f005ef32Sjsg 4787f005ef32Sjsg if (source_can_output(intel_dp, INTEL_OUTPUT_FORMAT_YCBCR444) && 4788f005ef32Sjsg dfp_can_convert_from_ycbcr444(intel_dp, INTEL_OUTPUT_FORMAT_YCBCR420)) 4789f005ef32Sjsg return true; 4790f005ef32Sjsg 4791f005ef32Sjsg return false; 4792f005ef32Sjsg } 4793f005ef32Sjsg 4794ad8b1aafSjsg static void 4795ad8b1aafSjsg intel_dp_update_420(struct intel_dp *intel_dp) 4796ad8b1aafSjsg { 4797ad8b1aafSjsg struct drm_i915_private *i915 = dp_to_i915(intel_dp); 4798ad8b1aafSjsg struct intel_connector *connector = intel_dp->attached_connector; 4799ad8b1aafSjsg 4800f005ef32Sjsg intel_dp->dfp.ycbcr420_passthrough = 4801ad8b1aafSjsg drm_dp_downstream_420_passthrough(intel_dp->dpcd, 4802ad8b1aafSjsg intel_dp->downstream_ports); 48035ca02815Sjsg /* on-board LSPCON always assumed to support 4:4:4->4:2:0 conversion */ 4804f005ef32Sjsg intel_dp->dfp.ycbcr_444_to_420 = 48055ca02815Sjsg dp_to_dig_port(intel_dp)->lspcon.active || 4806ad8b1aafSjsg drm_dp_downstream_444_to_420_conversion(intel_dp->dpcd, 4807ad8b1aafSjsg intel_dp->downstream_ports); 4808f005ef32Sjsg intel_dp->dfp.rgb_to_ycbcr = 4809f005ef32Sjsg drm_dp_downstream_rgb_to_ycbcr_conversion(intel_dp->dpcd, 48105ca02815Sjsg intel_dp->downstream_ports, 48111bb76ff1Sjsg DP_DS_HDMI_BT709_RGB_YCBCR_CONV); 4812ad8b1aafSjsg 4813f005ef32Sjsg connector->base.ycbcr_420_allowed = intel_dp_can_ycbcr420(intel_dp); 4814ad8b1aafSjsg 4815ad8b1aafSjsg drm_dbg_kms(&i915->drm, 48165ca02815Sjsg "[CONNECTOR:%d:%s] RGB->YcbCr conversion? %s, YCbCr 4:2:0 allowed? %s, YCbCr 4:4:4->4:2:0 conversion? %s\n", 4817ad8b1aafSjsg connector->base.base.id, connector->base.name, 48181bb76ff1Sjsg str_yes_no(intel_dp->dfp.rgb_to_ycbcr), 48191bb76ff1Sjsg str_yes_no(connector->base.ycbcr_420_allowed), 48201bb76ff1Sjsg str_yes_no(intel_dp->dfp.ycbcr_444_to_420)); 4821ad8b1aafSjsg } 4822ad8b1aafSjsg 4823ad8b1aafSjsg static void 4824c349dbc7Sjsg intel_dp_set_edid(struct intel_dp *intel_dp) 4825c349dbc7Sjsg { 48261bb76ff1Sjsg struct drm_i915_private *i915 = dp_to_i915(intel_dp); 4827ad8b1aafSjsg struct intel_connector *connector = intel_dp->attached_connector; 4828f005ef32Sjsg const struct drm_edid *drm_edid; 4829f005ef32Sjsg const struct edid *edid; 48301bb76ff1Sjsg bool vrr_capable; 4831c349dbc7Sjsg 4832c349dbc7Sjsg intel_dp_unset_edid(intel_dp); 4833f005ef32Sjsg drm_edid = intel_dp_get_edid(intel_dp); 4834f005ef32Sjsg connector->detect_edid = drm_edid; 4835f005ef32Sjsg 4836f005ef32Sjsg /* Below we depend on display info having been updated */ 4837f005ef32Sjsg drm_edid_connector_update(&connector->base, drm_edid); 4838c349dbc7Sjsg 48391bb76ff1Sjsg vrr_capable = intel_vrr_is_capable(connector); 48401bb76ff1Sjsg drm_dbg_kms(&i915->drm, "[CONNECTOR:%d:%s] VRR capable: %s\n", 48411bb76ff1Sjsg connector->base.base.id, connector->base.name, str_yes_no(vrr_capable)); 48421bb76ff1Sjsg drm_connector_set_vrr_capable_property(&connector->base, vrr_capable); 48431bb76ff1Sjsg 4844f005ef32Sjsg intel_dp_update_dfp(intel_dp, drm_edid); 4845ad8b1aafSjsg intel_dp_update_420(intel_dp); 4846ad8b1aafSjsg 4847f005ef32Sjsg /* FIXME: Get rid of drm_edid_raw() */ 4848f005ef32Sjsg edid = drm_edid_raw(drm_edid); 4849ad8b1aafSjsg 4850c349dbc7Sjsg drm_dp_cec_set_edid(&intel_dp->aux, edid); 4851c349dbc7Sjsg } 4852c349dbc7Sjsg 4853c349dbc7Sjsg static void 4854c349dbc7Sjsg intel_dp_unset_edid(struct intel_dp *intel_dp) 4855c349dbc7Sjsg { 4856ad8b1aafSjsg struct intel_connector *connector = intel_dp->attached_connector; 4857c349dbc7Sjsg 4858c349dbc7Sjsg drm_dp_cec_unset_edid(&intel_dp->aux); 4859f005ef32Sjsg drm_edid_free(connector->detect_edid); 4860ad8b1aafSjsg connector->detect_edid = NULL; 4861c349dbc7Sjsg 4862ad8b1aafSjsg intel_dp->dfp.max_bpc = 0; 4863ad8b1aafSjsg intel_dp->dfp.max_dotclock = 0; 4864ad8b1aafSjsg intel_dp->dfp.min_tmds_clock = 0; 4865ad8b1aafSjsg intel_dp->dfp.max_tmds_clock = 0; 4866ad8b1aafSjsg 48675ca02815Sjsg intel_dp->dfp.pcon_max_frl_bw = 0; 48685ca02815Sjsg 4869ad8b1aafSjsg intel_dp->dfp.ycbcr_444_to_420 = false; 4870ad8b1aafSjsg connector->base.ycbcr_420_allowed = false; 48711bb76ff1Sjsg 48721bb76ff1Sjsg drm_connector_set_vrr_capable_property(&connector->base, 48731bb76ff1Sjsg false); 4874c349dbc7Sjsg } 4875c349dbc7Sjsg 4876c349dbc7Sjsg static int 4877c349dbc7Sjsg intel_dp_detect(struct drm_connector *connector, 4878c349dbc7Sjsg struct drm_modeset_acquire_ctx *ctx, 4879c349dbc7Sjsg bool force) 4880c349dbc7Sjsg { 4881c349dbc7Sjsg struct drm_i915_private *dev_priv = to_i915(connector->dev); 4882c349dbc7Sjsg struct intel_dp *intel_dp = intel_attached_dp(to_intel_connector(connector)); 4883c349dbc7Sjsg struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); 4884c349dbc7Sjsg struct intel_encoder *encoder = &dig_port->base; 4885c349dbc7Sjsg enum drm_connector_status status; 4886c349dbc7Sjsg 4887c349dbc7Sjsg drm_dbg_kms(&dev_priv->drm, "[CONNECTOR:%d:%s]\n", 4888c349dbc7Sjsg connector->base.id, connector->name); 4889c349dbc7Sjsg drm_WARN_ON(&dev_priv->drm, 4890c349dbc7Sjsg !drm_modeset_is_locked(&dev_priv->drm.mode_config.connection_mutex)); 4891c349dbc7Sjsg 4892ad8b1aafSjsg if (!INTEL_DISPLAY_ENABLED(dev_priv)) 4893ad8b1aafSjsg return connector_status_disconnected; 4894ad8b1aafSjsg 4895c349dbc7Sjsg /* Can't disconnect eDP */ 4896c349dbc7Sjsg if (intel_dp_is_edp(intel_dp)) 4897c349dbc7Sjsg status = edp_detect(intel_dp); 4898c349dbc7Sjsg else if (intel_digital_port_connected(encoder)) 4899c349dbc7Sjsg status = intel_dp_detect_dpcd(intel_dp); 4900c349dbc7Sjsg else 4901c349dbc7Sjsg status = connector_status_disconnected; 4902c349dbc7Sjsg 4903c349dbc7Sjsg if (status == connector_status_disconnected) { 4904c349dbc7Sjsg memset(&intel_dp->compliance, 0, sizeof(intel_dp->compliance)); 4905c349dbc7Sjsg memset(intel_dp->dsc_dpcd, 0, sizeof(intel_dp->dsc_dpcd)); 4906c349dbc7Sjsg 4907c349dbc7Sjsg if (intel_dp->is_mst) { 4908c349dbc7Sjsg drm_dbg_kms(&dev_priv->drm, 4909c349dbc7Sjsg "MST device may have disappeared %d vs %d\n", 4910c349dbc7Sjsg intel_dp->is_mst, 4911c349dbc7Sjsg intel_dp->mst_mgr.mst_state); 4912c349dbc7Sjsg intel_dp->is_mst = false; 4913c349dbc7Sjsg drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst_mgr, 4914c349dbc7Sjsg intel_dp->is_mst); 4915c349dbc7Sjsg } 4916c349dbc7Sjsg 4917c349dbc7Sjsg goto out; 4918c349dbc7Sjsg } 4919c349dbc7Sjsg 4920ad8b1aafSjsg /* Read DP Sink DSC Cap DPCD regs for DP v1.4 */ 4921f005ef32Sjsg if (HAS_DSC(dev_priv)) 4922ad8b1aafSjsg intel_dp_get_dsc_sink_cap(intel_dp); 4923ad8b1aafSjsg 4924ad8b1aafSjsg intel_dp_configure_mst(intel_dp); 4925ad8b1aafSjsg 4926ad8b1aafSjsg /* 4927ad8b1aafSjsg * TODO: Reset link params when switching to MST mode, until MST 4928ad8b1aafSjsg * supports link training fallback params. 4929ad8b1aafSjsg */ 4930ad8b1aafSjsg if (intel_dp->reset_link_params || intel_dp->is_mst) { 49315ca02815Sjsg intel_dp_reset_max_link_params(intel_dp); 4932c349dbc7Sjsg intel_dp->reset_link_params = false; 4933c349dbc7Sjsg } 4934c349dbc7Sjsg 4935c349dbc7Sjsg intel_dp_print_rates(intel_dp); 4936c349dbc7Sjsg 4937c349dbc7Sjsg if (intel_dp->is_mst) { 4938c349dbc7Sjsg /* 4939c349dbc7Sjsg * If we are in MST mode then this connector 4940c349dbc7Sjsg * won't appear connected or have anything 4941c349dbc7Sjsg * with EDID on it 4942c349dbc7Sjsg */ 4943c349dbc7Sjsg status = connector_status_disconnected; 4944c349dbc7Sjsg goto out; 4945c349dbc7Sjsg } 4946c349dbc7Sjsg 4947c349dbc7Sjsg /* 4948c349dbc7Sjsg * Some external monitors do not signal loss of link synchronization 4949c349dbc7Sjsg * with an IRQ_HPD, so force a link status check. 4950c349dbc7Sjsg */ 4951c349dbc7Sjsg if (!intel_dp_is_edp(intel_dp)) { 4952c349dbc7Sjsg int ret; 4953c349dbc7Sjsg 4954c349dbc7Sjsg ret = intel_dp_retrain_link(encoder, ctx); 4955c349dbc7Sjsg if (ret) 4956c349dbc7Sjsg return ret; 4957c349dbc7Sjsg } 4958c349dbc7Sjsg 4959c349dbc7Sjsg /* 4960c349dbc7Sjsg * Clearing NACK and defer counts to get their exact values 4961c349dbc7Sjsg * while reading EDID which are required by Compliance tests 4962c349dbc7Sjsg * 4.2.2.4 and 4.2.2.5 4963c349dbc7Sjsg */ 4964c349dbc7Sjsg intel_dp->aux.i2c_nack_count = 0; 4965c349dbc7Sjsg intel_dp->aux.i2c_defer_count = 0; 4966c349dbc7Sjsg 4967c349dbc7Sjsg intel_dp_set_edid(intel_dp); 4968c349dbc7Sjsg if (intel_dp_is_edp(intel_dp) || 4969c349dbc7Sjsg to_intel_connector(connector)->detect_edid) 4970c349dbc7Sjsg status = connector_status_connected; 4971c349dbc7Sjsg 49725ca02815Sjsg intel_dp_check_device_service_irq(intel_dp); 4973c349dbc7Sjsg 4974c349dbc7Sjsg out: 4975c349dbc7Sjsg if (status != connector_status_connected && !intel_dp->is_mst) 4976c349dbc7Sjsg intel_dp_unset_edid(intel_dp); 4977c349dbc7Sjsg 4978c349dbc7Sjsg /* 4979c349dbc7Sjsg * Make sure the refs for power wells enabled during detect are 4980c349dbc7Sjsg * dropped to avoid a new detect cycle triggered by HPD polling. 4981c349dbc7Sjsg */ 4982c349dbc7Sjsg intel_display_power_flush_work(dev_priv); 4983c349dbc7Sjsg 4984ad8b1aafSjsg if (!intel_dp_is_edp(intel_dp)) 4985ad8b1aafSjsg drm_dp_set_subconnector_property(connector, 4986ad8b1aafSjsg status, 4987ad8b1aafSjsg intel_dp->dpcd, 4988ad8b1aafSjsg intel_dp->downstream_ports); 4989c349dbc7Sjsg return status; 4990c349dbc7Sjsg } 4991c349dbc7Sjsg 4992c349dbc7Sjsg static void 4993c349dbc7Sjsg intel_dp_force(struct drm_connector *connector) 4994c349dbc7Sjsg { 4995c349dbc7Sjsg struct intel_dp *intel_dp = intel_attached_dp(to_intel_connector(connector)); 4996c349dbc7Sjsg struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); 4997c349dbc7Sjsg struct intel_encoder *intel_encoder = &dig_port->base; 4998c349dbc7Sjsg struct drm_i915_private *dev_priv = to_i915(intel_encoder->base.dev); 4999c349dbc7Sjsg enum intel_display_power_domain aux_domain = 5000c349dbc7Sjsg intel_aux_power_domain(dig_port); 5001c349dbc7Sjsg intel_wakeref_t wakeref; 5002c349dbc7Sjsg 5003c349dbc7Sjsg drm_dbg_kms(&dev_priv->drm, "[CONNECTOR:%d:%s]\n", 5004c349dbc7Sjsg connector->base.id, connector->name); 5005c349dbc7Sjsg intel_dp_unset_edid(intel_dp); 5006c349dbc7Sjsg 5007c349dbc7Sjsg if (connector->status != connector_status_connected) 5008c349dbc7Sjsg return; 5009c349dbc7Sjsg 5010c349dbc7Sjsg wakeref = intel_display_power_get(dev_priv, aux_domain); 5011c349dbc7Sjsg 5012c349dbc7Sjsg intel_dp_set_edid(intel_dp); 5013c349dbc7Sjsg 5014c349dbc7Sjsg intel_display_power_put(dev_priv, aux_domain, wakeref); 5015c349dbc7Sjsg } 5016c349dbc7Sjsg 5017c349dbc7Sjsg static int intel_dp_get_modes(struct drm_connector *connector) 5018c349dbc7Sjsg { 5019c349dbc7Sjsg struct intel_connector *intel_connector = to_intel_connector(connector); 5020f005ef32Sjsg int num_modes; 5021c349dbc7Sjsg 5022f005ef32Sjsg /* drm_edid_connector_update() done in ->detect() or ->force() */ 5023f005ef32Sjsg num_modes = drm_edid_connector_add_modes(connector); 50245ca02815Sjsg 50255ca02815Sjsg /* Also add fixed mode, which may or may not be present in EDID */ 50261bb76ff1Sjsg if (intel_dp_is_edp(intel_attached_dp(intel_connector))) 50271bb76ff1Sjsg num_modes += intel_panel_get_modes(intel_connector); 5028c349dbc7Sjsg 50295ca02815Sjsg if (num_modes) 50305ca02815Sjsg return num_modes; 50315ca02815Sjsg 5032f005ef32Sjsg if (!intel_connector->detect_edid) { 5033ad8b1aafSjsg struct intel_dp *intel_dp = intel_attached_dp(intel_connector); 5034ad8b1aafSjsg struct drm_display_mode *mode; 5035ad8b1aafSjsg 5036ad8b1aafSjsg mode = drm_dp_downstream_mode(connector->dev, 5037ad8b1aafSjsg intel_dp->dpcd, 5038ad8b1aafSjsg intel_dp->downstream_ports); 5039ad8b1aafSjsg if (mode) { 5040ad8b1aafSjsg drm_mode_probed_add(connector, mode); 50415ca02815Sjsg num_modes++; 5042ad8b1aafSjsg } 5043ad8b1aafSjsg } 5044ad8b1aafSjsg 50455ca02815Sjsg return num_modes; 5046c349dbc7Sjsg } 5047c349dbc7Sjsg 5048c349dbc7Sjsg static int 5049c349dbc7Sjsg intel_dp_connector_register(struct drm_connector *connector) 5050c349dbc7Sjsg { 5051ad8b1aafSjsg struct drm_i915_private *i915 = to_i915(connector->dev); 5052c349dbc7Sjsg struct intel_dp *intel_dp = intel_attached_dp(to_intel_connector(connector)); 50535ca02815Sjsg struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); 50545ca02815Sjsg struct intel_lspcon *lspcon = &dig_port->lspcon; 5055c349dbc7Sjsg int ret; 5056c349dbc7Sjsg 5057c349dbc7Sjsg ret = intel_connector_register(connector); 5058c349dbc7Sjsg if (ret) 5059c349dbc7Sjsg return ret; 5060c349dbc7Sjsg 5061c349dbc7Sjsg #ifdef notyet 5062ad8b1aafSjsg drm_dbg_kms(&i915->drm, "registering %s bus for %s\n", 5063c349dbc7Sjsg intel_dp->aux.name, connector->kdev->kobj.name); 5064c349dbc7Sjsg #endif 5065c349dbc7Sjsg 5066c349dbc7Sjsg intel_dp->aux.dev = connector->kdev; 5067c349dbc7Sjsg ret = drm_dp_aux_register(&intel_dp->aux); 5068c349dbc7Sjsg if (!ret) 5069c349dbc7Sjsg drm_dp_cec_register_connector(&intel_dp->aux, connector); 50705ca02815Sjsg 5071f005ef32Sjsg if (!intel_bios_encoder_is_lspcon(dig_port->base.devdata)) 50725ca02815Sjsg return ret; 50735ca02815Sjsg 50745ca02815Sjsg /* 50755ca02815Sjsg * ToDo: Clean this up to handle lspcon init and resume more 50765ca02815Sjsg * efficiently and streamlined. 50775ca02815Sjsg */ 50785ca02815Sjsg if (lspcon_init(dig_port)) { 50795ca02815Sjsg lspcon_detect_hdr_capability(lspcon); 50805ca02815Sjsg if (lspcon->hdr_supported) 50811bb76ff1Sjsg drm_connector_attach_hdr_output_metadata_property(connector); 50825ca02815Sjsg } 50835ca02815Sjsg 5084c349dbc7Sjsg return ret; 5085c349dbc7Sjsg } 5086c349dbc7Sjsg 5087c349dbc7Sjsg static void 5088c349dbc7Sjsg intel_dp_connector_unregister(struct drm_connector *connector) 5089c349dbc7Sjsg { 5090c349dbc7Sjsg struct intel_dp *intel_dp = intel_attached_dp(to_intel_connector(connector)); 5091c349dbc7Sjsg 5092c349dbc7Sjsg drm_dp_cec_unregister_connector(&intel_dp->aux); 5093c349dbc7Sjsg drm_dp_aux_unregister(&intel_dp->aux); 5094c349dbc7Sjsg intel_connector_unregister(connector); 5095c349dbc7Sjsg } 5096c349dbc7Sjsg 5097c349dbc7Sjsg void intel_dp_encoder_flush_work(struct drm_encoder *encoder) 5098c349dbc7Sjsg { 5099ad8b1aafSjsg struct intel_digital_port *dig_port = enc_to_dig_port(to_intel_encoder(encoder)); 5100ad8b1aafSjsg struct intel_dp *intel_dp = &dig_port->dp; 5101c349dbc7Sjsg 5102ad8b1aafSjsg intel_dp_mst_encoder_cleanup(dig_port); 5103c349dbc7Sjsg 51045ca02815Sjsg intel_pps_vdd_off_sync(intel_dp); 5105c349dbc7Sjsg 5106f005ef32Sjsg /* 5107f005ef32Sjsg * Ensure power off delay is respected on module remove, so that we can 5108f005ef32Sjsg * reduce delays at driver probe. See pps_init_timestamps(). 5109f005ef32Sjsg */ 5110f005ef32Sjsg intel_pps_wait_power_cycle(intel_dp); 5111f005ef32Sjsg 5112c349dbc7Sjsg intel_dp_aux_fini(intel_dp); 5113c349dbc7Sjsg } 5114c349dbc7Sjsg 5115c349dbc7Sjsg void intel_dp_encoder_suspend(struct intel_encoder *intel_encoder) 5116c349dbc7Sjsg { 5117c349dbc7Sjsg struct intel_dp *intel_dp = enc_to_intel_dp(intel_encoder); 5118c349dbc7Sjsg 51195ca02815Sjsg intel_pps_vdd_off_sync(intel_dp); 5120c349dbc7Sjsg } 5121c349dbc7Sjsg 51225ca02815Sjsg void intel_dp_encoder_shutdown(struct intel_encoder *intel_encoder) 5123c349dbc7Sjsg { 51245ca02815Sjsg struct intel_dp *intel_dp = enc_to_intel_dp(intel_encoder); 5125c349dbc7Sjsg 51265ca02815Sjsg intel_pps_wait_power_cycle(intel_dp); 5127c349dbc7Sjsg } 5128c349dbc7Sjsg 5129c349dbc7Sjsg static int intel_modeset_tile_group(struct intel_atomic_state *state, 5130c349dbc7Sjsg int tile_group_id) 5131c349dbc7Sjsg { 5132c349dbc7Sjsg struct drm_i915_private *dev_priv = to_i915(state->base.dev); 5133c349dbc7Sjsg struct drm_connector_list_iter conn_iter; 5134c349dbc7Sjsg struct drm_connector *connector; 5135c349dbc7Sjsg int ret = 0; 5136c349dbc7Sjsg 5137c349dbc7Sjsg drm_connector_list_iter_begin(&dev_priv->drm, &conn_iter); 5138c349dbc7Sjsg drm_for_each_connector_iter(connector, &conn_iter) { 5139c349dbc7Sjsg struct drm_connector_state *conn_state; 5140c349dbc7Sjsg struct intel_crtc_state *crtc_state; 5141c349dbc7Sjsg struct intel_crtc *crtc; 5142c349dbc7Sjsg 5143c349dbc7Sjsg if (!connector->has_tile || 5144c349dbc7Sjsg connector->tile_group->id != tile_group_id) 5145c349dbc7Sjsg continue; 5146c349dbc7Sjsg 5147c349dbc7Sjsg conn_state = drm_atomic_get_connector_state(&state->base, 5148c349dbc7Sjsg connector); 5149c349dbc7Sjsg if (IS_ERR(conn_state)) { 5150c349dbc7Sjsg ret = PTR_ERR(conn_state); 5151c349dbc7Sjsg break; 5152c349dbc7Sjsg } 5153c349dbc7Sjsg 5154c349dbc7Sjsg crtc = to_intel_crtc(conn_state->crtc); 5155c349dbc7Sjsg 5156c349dbc7Sjsg if (!crtc) 5157c349dbc7Sjsg continue; 5158c349dbc7Sjsg 5159c349dbc7Sjsg crtc_state = intel_atomic_get_new_crtc_state(state, crtc); 5160c349dbc7Sjsg crtc_state->uapi.mode_changed = true; 5161c349dbc7Sjsg 5162c349dbc7Sjsg ret = drm_atomic_add_affected_planes(&state->base, &crtc->base); 5163c349dbc7Sjsg if (ret) 5164c349dbc7Sjsg break; 5165c349dbc7Sjsg } 5166c349dbc7Sjsg drm_connector_list_iter_end(&conn_iter); 5167c349dbc7Sjsg 5168c349dbc7Sjsg return ret; 5169c349dbc7Sjsg } 5170c349dbc7Sjsg 5171c349dbc7Sjsg static int intel_modeset_affected_transcoders(struct intel_atomic_state *state, u8 transcoders) 5172c349dbc7Sjsg { 5173c349dbc7Sjsg struct drm_i915_private *dev_priv = to_i915(state->base.dev); 5174c349dbc7Sjsg struct intel_crtc *crtc; 5175c349dbc7Sjsg 5176c349dbc7Sjsg if (transcoders == 0) 5177c349dbc7Sjsg return 0; 5178c349dbc7Sjsg 5179c349dbc7Sjsg for_each_intel_crtc(&dev_priv->drm, crtc) { 5180c349dbc7Sjsg struct intel_crtc_state *crtc_state; 5181c349dbc7Sjsg int ret; 5182c349dbc7Sjsg 5183c349dbc7Sjsg crtc_state = intel_atomic_get_crtc_state(&state->base, crtc); 5184c349dbc7Sjsg if (IS_ERR(crtc_state)) 5185c349dbc7Sjsg return PTR_ERR(crtc_state); 5186c349dbc7Sjsg 5187c349dbc7Sjsg if (!crtc_state->hw.enable) 5188c349dbc7Sjsg continue; 5189c349dbc7Sjsg 5190c349dbc7Sjsg if (!(transcoders & BIT(crtc_state->cpu_transcoder))) 5191c349dbc7Sjsg continue; 5192c349dbc7Sjsg 5193c349dbc7Sjsg crtc_state->uapi.mode_changed = true; 5194c349dbc7Sjsg 5195c349dbc7Sjsg ret = drm_atomic_add_affected_connectors(&state->base, &crtc->base); 5196c349dbc7Sjsg if (ret) 5197c349dbc7Sjsg return ret; 5198c349dbc7Sjsg 5199c349dbc7Sjsg ret = drm_atomic_add_affected_planes(&state->base, &crtc->base); 5200c349dbc7Sjsg if (ret) 5201c349dbc7Sjsg return ret; 5202c349dbc7Sjsg 5203c349dbc7Sjsg transcoders &= ~BIT(crtc_state->cpu_transcoder); 5204c349dbc7Sjsg } 5205c349dbc7Sjsg 5206c349dbc7Sjsg drm_WARN_ON(&dev_priv->drm, transcoders != 0); 5207c349dbc7Sjsg 5208c349dbc7Sjsg return 0; 5209c349dbc7Sjsg } 5210c349dbc7Sjsg 5211c349dbc7Sjsg static int intel_modeset_synced_crtcs(struct intel_atomic_state *state, 5212c349dbc7Sjsg struct drm_connector *connector) 5213c349dbc7Sjsg { 5214c349dbc7Sjsg const struct drm_connector_state *old_conn_state = 5215c349dbc7Sjsg drm_atomic_get_old_connector_state(&state->base, connector); 5216c349dbc7Sjsg const struct intel_crtc_state *old_crtc_state; 5217c349dbc7Sjsg struct intel_crtc *crtc; 5218c349dbc7Sjsg u8 transcoders; 5219c349dbc7Sjsg 5220c349dbc7Sjsg crtc = to_intel_crtc(old_conn_state->crtc); 5221c349dbc7Sjsg if (!crtc) 5222c349dbc7Sjsg return 0; 5223c349dbc7Sjsg 5224c349dbc7Sjsg old_crtc_state = intel_atomic_get_old_crtc_state(state, crtc); 5225c349dbc7Sjsg 5226c349dbc7Sjsg if (!old_crtc_state->hw.active) 5227c349dbc7Sjsg return 0; 5228c349dbc7Sjsg 5229c349dbc7Sjsg transcoders = old_crtc_state->sync_mode_slaves_mask; 5230c349dbc7Sjsg if (old_crtc_state->master_transcoder != INVALID_TRANSCODER) 5231c349dbc7Sjsg transcoders |= BIT(old_crtc_state->master_transcoder); 5232c349dbc7Sjsg 5233c349dbc7Sjsg return intel_modeset_affected_transcoders(state, 5234c349dbc7Sjsg transcoders); 5235c349dbc7Sjsg } 5236c349dbc7Sjsg 5237c349dbc7Sjsg static int intel_dp_connector_atomic_check(struct drm_connector *conn, 5238c349dbc7Sjsg struct drm_atomic_state *_state) 5239c349dbc7Sjsg { 5240c349dbc7Sjsg struct drm_i915_private *dev_priv = to_i915(conn->dev); 5241c349dbc7Sjsg struct intel_atomic_state *state = to_intel_atomic_state(_state); 52421bb76ff1Sjsg struct drm_connector_state *conn_state = drm_atomic_get_new_connector_state(_state, conn); 52431bb76ff1Sjsg struct intel_connector *intel_conn = to_intel_connector(conn); 52441bb76ff1Sjsg struct intel_dp *intel_dp = enc_to_intel_dp(intel_conn->encoder); 5245c349dbc7Sjsg int ret; 5246c349dbc7Sjsg 5247c349dbc7Sjsg ret = intel_digital_connector_atomic_check(conn, &state->base); 5248c349dbc7Sjsg if (ret) 5249c349dbc7Sjsg return ret; 5250c349dbc7Sjsg 52511bb76ff1Sjsg if (intel_dp_mst_source_support(intel_dp)) { 52521bb76ff1Sjsg ret = drm_dp_mst_root_conn_atomic_check(conn_state, &intel_dp->mst_mgr); 52531bb76ff1Sjsg if (ret) 52541bb76ff1Sjsg return ret; 52551bb76ff1Sjsg } 52561bb76ff1Sjsg 5257ad8b1aafSjsg /* 5258ad8b1aafSjsg * We don't enable port sync on BDW due to missing w/as and 5259ad8b1aafSjsg * due to not having adjusted the modeset sequence appropriately. 5260ad8b1aafSjsg */ 52615ca02815Sjsg if (DISPLAY_VER(dev_priv) < 9) 5262c349dbc7Sjsg return 0; 5263c349dbc7Sjsg 5264c349dbc7Sjsg if (!intel_connector_needs_modeset(state, conn)) 5265c349dbc7Sjsg return 0; 5266c349dbc7Sjsg 5267c349dbc7Sjsg if (conn->has_tile) { 5268c349dbc7Sjsg ret = intel_modeset_tile_group(state, conn->tile_group->id); 5269c349dbc7Sjsg if (ret) 5270c349dbc7Sjsg return ret; 5271c349dbc7Sjsg } 5272c349dbc7Sjsg 5273c349dbc7Sjsg return intel_modeset_synced_crtcs(state, conn); 5274c349dbc7Sjsg } 5275c349dbc7Sjsg 52761bb76ff1Sjsg static void intel_dp_oob_hotplug_event(struct drm_connector *connector) 52771bb76ff1Sjsg { 52781bb76ff1Sjsg struct intel_encoder *encoder = intel_attached_encoder(to_intel_connector(connector)); 52791bb76ff1Sjsg struct drm_i915_private *i915 = to_i915(connector->dev); 52801bb76ff1Sjsg 52811bb76ff1Sjsg spin_lock_irq(&i915->irq_lock); 52821bb76ff1Sjsg i915->display.hotplug.event_bits |= BIT(encoder->hpd_pin); 52831bb76ff1Sjsg spin_unlock_irq(&i915->irq_lock); 5284f005ef32Sjsg queue_delayed_work(i915->unordered_wq, &i915->display.hotplug.hotplug_work, 0); 52851bb76ff1Sjsg } 52861bb76ff1Sjsg 5287c349dbc7Sjsg static const struct drm_connector_funcs intel_dp_connector_funcs = { 5288c349dbc7Sjsg .force = intel_dp_force, 5289c349dbc7Sjsg .fill_modes = drm_helper_probe_single_connector_modes, 5290c349dbc7Sjsg .atomic_get_property = intel_digital_connector_atomic_get_property, 5291c349dbc7Sjsg .atomic_set_property = intel_digital_connector_atomic_set_property, 5292c349dbc7Sjsg .late_register = intel_dp_connector_register, 5293c349dbc7Sjsg .early_unregister = intel_dp_connector_unregister, 5294c349dbc7Sjsg .destroy = intel_connector_destroy, 5295c349dbc7Sjsg .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, 5296c349dbc7Sjsg .atomic_duplicate_state = intel_digital_connector_duplicate_state, 52971bb76ff1Sjsg .oob_hotplug_event = intel_dp_oob_hotplug_event, 5298c349dbc7Sjsg }; 5299c349dbc7Sjsg 5300c349dbc7Sjsg static const struct drm_connector_helper_funcs intel_dp_connector_helper_funcs = { 5301c349dbc7Sjsg .detect_ctx = intel_dp_detect, 5302c349dbc7Sjsg .get_modes = intel_dp_get_modes, 5303c349dbc7Sjsg .mode_valid = intel_dp_mode_valid, 5304c349dbc7Sjsg .atomic_check = intel_dp_connector_atomic_check, 5305c349dbc7Sjsg }; 5306c349dbc7Sjsg 5307ad8b1aafSjsg enum irqreturn 5308ad8b1aafSjsg intel_dp_hpd_pulse(struct intel_digital_port *dig_port, bool long_hpd) 5309ad8b1aafSjsg { 5310ad8b1aafSjsg struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); 5311ad8b1aafSjsg struct intel_dp *intel_dp = &dig_port->dp; 5312ad8b1aafSjsg 5313ad8b1aafSjsg if (dig_port->base.type == INTEL_OUTPUT_EDP && 53149572d05fSjsg (long_hpd || !intel_pps_have_panel_power_or_vdd(intel_dp))) { 5315c349dbc7Sjsg /* 5316ad8b1aafSjsg * vdd off can generate a long/short pulse on eDP which 5317c349dbc7Sjsg * would require vdd on to handle it, and thus we 5318c349dbc7Sjsg * would end up in an endless cycle of 5319ad8b1aafSjsg * "vdd off -> long/short hpd -> vdd on -> detect -> vdd off -> ..." 5320c349dbc7Sjsg */ 5321ad8b1aafSjsg drm_dbg_kms(&i915->drm, 5322ad8b1aafSjsg "ignoring %s hpd on eDP [ENCODER:%d:%s]\n", 5323ad8b1aafSjsg long_hpd ? "long" : "short", 5324ad8b1aafSjsg dig_port->base.base.base.id, 5325ad8b1aafSjsg dig_port->base.base.name); 5326c349dbc7Sjsg return IRQ_HANDLED; 5327c349dbc7Sjsg } 5328c349dbc7Sjsg 5329ad8b1aafSjsg drm_dbg_kms(&i915->drm, "got hpd irq on [ENCODER:%d:%s] - %s\n", 5330ad8b1aafSjsg dig_port->base.base.base.id, 5331ad8b1aafSjsg dig_port->base.base.name, 5332c349dbc7Sjsg long_hpd ? "long" : "short"); 5333c349dbc7Sjsg 5334c349dbc7Sjsg if (long_hpd) { 5335c349dbc7Sjsg intel_dp->reset_link_params = true; 5336c349dbc7Sjsg return IRQ_NONE; 5337c349dbc7Sjsg } 5338c349dbc7Sjsg 5339c349dbc7Sjsg if (intel_dp->is_mst) { 5340ad8b1aafSjsg if (!intel_dp_check_mst_status(intel_dp)) 5341c349dbc7Sjsg return IRQ_NONE; 5342ad8b1aafSjsg } else if (!intel_dp_short_pulse(intel_dp)) { 5343c349dbc7Sjsg return IRQ_NONE; 5344c349dbc7Sjsg } 5345c349dbc7Sjsg 5346c349dbc7Sjsg return IRQ_HANDLED; 5347c349dbc7Sjsg } 5348c349dbc7Sjsg 5349f005ef32Sjsg static bool _intel_dp_is_port_edp(struct drm_i915_private *dev_priv, 5350f005ef32Sjsg const struct intel_bios_encoder_data *devdata, 5351f005ef32Sjsg enum port port) 5352c349dbc7Sjsg { 5353c349dbc7Sjsg /* 5354c349dbc7Sjsg * eDP not supported on g4x. so bail out early just 5355c349dbc7Sjsg * for a bit extra safety in case the VBT is bonkers. 5356c349dbc7Sjsg */ 53575ca02815Sjsg if (DISPLAY_VER(dev_priv) < 5) 5358c349dbc7Sjsg return false; 5359c349dbc7Sjsg 53605ca02815Sjsg if (DISPLAY_VER(dev_priv) < 9 && port == PORT_A) 5361c349dbc7Sjsg return true; 5362c349dbc7Sjsg 5363f005ef32Sjsg return devdata && intel_bios_encoder_supports_edp(devdata); 5364f005ef32Sjsg } 5365f005ef32Sjsg 5366f005ef32Sjsg bool intel_dp_is_port_edp(struct drm_i915_private *i915, enum port port) 5367f005ef32Sjsg { 5368f005ef32Sjsg const struct intel_bios_encoder_data *devdata = 5369f005ef32Sjsg intel_bios_encoder_data_lookup(i915, port); 5370f005ef32Sjsg 5371f005ef32Sjsg return _intel_dp_is_port_edp(i915, devdata, port); 5372c349dbc7Sjsg } 5373c349dbc7Sjsg 53741bb76ff1Sjsg static bool 5375f005ef32Sjsg has_gamut_metadata_dip(struct intel_encoder *encoder) 53761bb76ff1Sjsg { 5377f005ef32Sjsg struct drm_i915_private *i915 = to_i915(encoder->base.dev); 5378f005ef32Sjsg enum port port = encoder->port; 5379f005ef32Sjsg 5380f005ef32Sjsg if (intel_bios_encoder_is_lspcon(encoder->devdata)) 53811bb76ff1Sjsg return false; 53821bb76ff1Sjsg 53831bb76ff1Sjsg if (DISPLAY_VER(i915) >= 11) 53841bb76ff1Sjsg return true; 53851bb76ff1Sjsg 53861bb76ff1Sjsg if (port == PORT_A) 53871bb76ff1Sjsg return false; 53881bb76ff1Sjsg 53891bb76ff1Sjsg if (IS_HASWELL(i915) || IS_BROADWELL(i915) || 53901bb76ff1Sjsg DISPLAY_VER(i915) >= 9) 53911bb76ff1Sjsg return true; 53921bb76ff1Sjsg 53931bb76ff1Sjsg return false; 53941bb76ff1Sjsg } 53951bb76ff1Sjsg 5396c349dbc7Sjsg static void 5397c349dbc7Sjsg intel_dp_add_properties(struct intel_dp *intel_dp, struct drm_connector *connector) 5398c349dbc7Sjsg { 5399c349dbc7Sjsg struct drm_i915_private *dev_priv = to_i915(connector->dev); 5400c349dbc7Sjsg enum port port = dp_to_dig_port(intel_dp)->base.port; 5401c349dbc7Sjsg 5402ad8b1aafSjsg if (!intel_dp_is_edp(intel_dp)) 5403ad8b1aafSjsg drm_connector_attach_dp_subconnector_property(connector); 5404ad8b1aafSjsg 5405c349dbc7Sjsg if (!IS_G4X(dev_priv) && port != PORT_A) 5406c349dbc7Sjsg intel_attach_force_audio_property(connector); 5407c349dbc7Sjsg 5408c349dbc7Sjsg intel_attach_broadcast_rgb_property(connector); 5409c349dbc7Sjsg if (HAS_GMCH(dev_priv)) 5410c349dbc7Sjsg drm_connector_attach_max_bpc_property(connector, 6, 10); 54115ca02815Sjsg else if (DISPLAY_VER(dev_priv) >= 5) 5412c349dbc7Sjsg drm_connector_attach_max_bpc_property(connector, 6, 12); 5413c349dbc7Sjsg 54145ca02815Sjsg /* Register HDMI colorspace for case of lspcon */ 5415f005ef32Sjsg if (intel_bios_encoder_is_lspcon(dp_to_dig_port(intel_dp)->base.devdata)) { 54165ca02815Sjsg drm_connector_attach_content_type_property(connector); 54175ca02815Sjsg intel_attach_hdmi_colorspace_property(connector); 54185ca02815Sjsg } else { 54195ca02815Sjsg intel_attach_dp_colorspace_property(connector); 54205ca02815Sjsg } 5421c349dbc7Sjsg 5422f005ef32Sjsg if (has_gamut_metadata_dip(&dp_to_dig_port(intel_dp)->base)) 54231bb76ff1Sjsg drm_connector_attach_hdr_output_metadata_property(connector); 5424c349dbc7Sjsg 54255ca02815Sjsg if (HAS_VRR(dev_priv)) 54265ca02815Sjsg drm_connector_attach_vrr_capable_property(connector); 5427c349dbc7Sjsg } 5428c349dbc7Sjsg 54291bb76ff1Sjsg static void 54301bb76ff1Sjsg intel_edp_add_properties(struct intel_dp *intel_dp) 54311bb76ff1Sjsg { 54321bb76ff1Sjsg struct intel_connector *connector = intel_dp->attached_connector; 54331bb76ff1Sjsg struct drm_i915_private *i915 = to_i915(connector->base.dev); 54341bb76ff1Sjsg const struct drm_display_mode *fixed_mode = 54351bb76ff1Sjsg intel_panel_preferred_fixed_mode(connector); 54361bb76ff1Sjsg 5437f005ef32Sjsg intel_attach_scaling_mode_property(&connector->base); 54381bb76ff1Sjsg 54391bb76ff1Sjsg drm_connector_set_panel_orientation_with_quirk(&connector->base, 54401bb76ff1Sjsg i915->display.vbt.orientation, 54411bb76ff1Sjsg fixed_mode->hdisplay, 54421bb76ff1Sjsg fixed_mode->vdisplay); 54431bb76ff1Sjsg } 54441bb76ff1Sjsg 5445f005ef32Sjsg static void intel_edp_backlight_setup(struct intel_dp *intel_dp, 5446f005ef32Sjsg struct intel_connector *connector) 5447f005ef32Sjsg { 5448f005ef32Sjsg struct drm_i915_private *i915 = dp_to_i915(intel_dp); 5449f005ef32Sjsg enum pipe pipe = INVALID_PIPE; 5450f005ef32Sjsg 5451f005ef32Sjsg if (IS_VALLEYVIEW(i915) || IS_CHERRYVIEW(i915)) { 5452f005ef32Sjsg /* 5453f005ef32Sjsg * Figure out the current pipe for the initial backlight setup. 5454f005ef32Sjsg * If the current pipe isn't valid, try the PPS pipe, and if that 5455f005ef32Sjsg * fails just assume pipe A. 5456f005ef32Sjsg */ 5457f005ef32Sjsg pipe = vlv_active_pipe(intel_dp); 5458f005ef32Sjsg 5459f005ef32Sjsg if (pipe != PIPE_A && pipe != PIPE_B) 5460f005ef32Sjsg pipe = intel_dp->pps.pps_pipe; 5461f005ef32Sjsg 5462f005ef32Sjsg if (pipe != PIPE_A && pipe != PIPE_B) 5463f005ef32Sjsg pipe = PIPE_A; 5464f005ef32Sjsg } 5465f005ef32Sjsg 5466f005ef32Sjsg intel_backlight_setup(connector, pipe); 5467f005ef32Sjsg } 5468f005ef32Sjsg 5469c349dbc7Sjsg static bool intel_edp_init_connector(struct intel_dp *intel_dp, 5470c349dbc7Sjsg struct intel_connector *intel_connector) 5471c349dbc7Sjsg { 5472c349dbc7Sjsg struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); 5473c349dbc7Sjsg struct drm_connector *connector = &intel_connector->base; 54741bb76ff1Sjsg struct drm_display_mode *fixed_mode; 54751bb76ff1Sjsg struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; 5476c349dbc7Sjsg bool has_dpcd; 5477f005ef32Sjsg const struct drm_edid *drm_edid; 5478c349dbc7Sjsg 5479c349dbc7Sjsg if (!intel_dp_is_edp(intel_dp)) 5480c349dbc7Sjsg return true; 5481c349dbc7Sjsg 5482c349dbc7Sjsg /* 5483c349dbc7Sjsg * On IBX/CPT we may get here with LVDS already registered. Since the 5484c349dbc7Sjsg * driver uses the only internal power sequencer available for both 5485c349dbc7Sjsg * eDP and LVDS bail out early in this case to prevent interfering 5486c349dbc7Sjsg * with an already powered-on LVDS power sequencer. 5487c349dbc7Sjsg */ 5488c349dbc7Sjsg if (intel_get_lvds_encoder(dev_priv)) { 5489f005ef32Sjsg drm_WARN_ON(&dev_priv->drm, 5490c349dbc7Sjsg !(HAS_PCH_IBX(dev_priv) || HAS_PCH_CPT(dev_priv))); 5491c349dbc7Sjsg drm_info(&dev_priv->drm, 5492c349dbc7Sjsg "LVDS was detected, not registering eDP\n"); 5493c349dbc7Sjsg 5494c349dbc7Sjsg return false; 5495c349dbc7Sjsg } 5496c349dbc7Sjsg 549726d05183Sjsg intel_bios_init_panel_early(dev_priv, &intel_connector->panel, 549826d05183Sjsg encoder->devdata); 549926d05183Sjsg 5500f005ef32Sjsg if (!intel_pps_init(intel_dp)) { 5501f005ef32Sjsg drm_info(&dev_priv->drm, 5502f005ef32Sjsg "[ENCODER:%d:%s] unusable PPS, disabling eDP\n", 5503f005ef32Sjsg encoder->base.base.id, encoder->base.name); 5504f005ef32Sjsg /* 5505f005ef32Sjsg * The BIOS may have still enabled VDD on the PPS even 5506f005ef32Sjsg * though it's unusable. Make sure we turn it back off 5507f005ef32Sjsg * and to release the power domain references/etc. 5508f005ef32Sjsg */ 5509f005ef32Sjsg goto out_vdd_off; 5510f005ef32Sjsg } 5511f005ef32Sjsg 5512f005ef32Sjsg /* 5513f005ef32Sjsg * Enable HPD sense for live status check. 5514f005ef32Sjsg * intel_hpd_irq_setup() will turn it off again 5515f005ef32Sjsg * if it's no longer needed later. 5516f005ef32Sjsg * 5517f005ef32Sjsg * The DPCD probe below will make sure VDD is on. 5518f005ef32Sjsg */ 5519f005ef32Sjsg intel_hpd_enable_detection(encoder); 5520c349dbc7Sjsg 5521c349dbc7Sjsg /* Cache DPCD and EDID for edp. */ 5522c349dbc7Sjsg has_dpcd = intel_edp_init_dpcd(intel_dp); 5523c349dbc7Sjsg 5524c349dbc7Sjsg if (!has_dpcd) { 5525c349dbc7Sjsg /* if this fails, presume the device is a ghost */ 5526c349dbc7Sjsg drm_info(&dev_priv->drm, 5527f005ef32Sjsg "[ENCODER:%d:%s] failed to retrieve link info, disabling eDP\n", 5528f005ef32Sjsg encoder->base.base.id, encoder->base.name); 5529c349dbc7Sjsg goto out_vdd_off; 5530c349dbc7Sjsg } 5531c349dbc7Sjsg 5532f005ef32Sjsg /* 5533f005ef32Sjsg * VBT and straps are liars. Also check HPD as that seems 5534f005ef32Sjsg * to be the most reliable piece of information available. 5535f005ef32Sjsg * 5536f005ef32Sjsg * ... expect on devices that forgot to hook HPD up for eDP 5537f005ef32Sjsg * (eg. Acer Chromebook C710), so we'll check it only if multiple 5538f005ef32Sjsg * ports are attempting to use the same AUX CH, according to VBT. 5539f005ef32Sjsg */ 5540f005ef32Sjsg if (intel_bios_dp_has_shared_aux_ch(encoder->devdata)) { 5541f005ef32Sjsg /* 5542f005ef32Sjsg * If this fails, presume the DPCD answer came 5543f005ef32Sjsg * from some other port using the same AUX CH. 5544f005ef32Sjsg * 5545f005ef32Sjsg * FIXME maybe cleaner to check this before the 5546f005ef32Sjsg * DPCD read? Would need sort out the VDD handling... 5547f005ef32Sjsg */ 5548f005ef32Sjsg if (!intel_digital_port_connected(encoder)) { 5549f005ef32Sjsg drm_info(&dev_priv->drm, 5550f005ef32Sjsg "[ENCODER:%d:%s] HPD is down, disabling eDP\n", 5551f005ef32Sjsg encoder->base.base.id, encoder->base.name); 5552f005ef32Sjsg goto out_vdd_off; 5553f005ef32Sjsg } 5554f005ef32Sjsg 5555f005ef32Sjsg /* 5556f005ef32Sjsg * Unfortunately even the HPD based detection fails on 5557f005ef32Sjsg * eg. Asus B360M-A (CFL+CNP), so as a last resort fall 5558f005ef32Sjsg * back to checking for a VGA branch device. Only do this 5559f005ef32Sjsg * on known affected platforms to minimize false positives. 5560f005ef32Sjsg */ 5561f005ef32Sjsg if (DISPLAY_VER(dev_priv) == 9 && drm_dp_is_branch(intel_dp->dpcd) && 5562f005ef32Sjsg (intel_dp->dpcd[DP_DOWNSTREAMPORT_PRESENT] & DP_DWN_STRM_PORT_TYPE_MASK) == 5563f005ef32Sjsg DP_DWN_STRM_PORT_TYPE_ANALOG) { 5564f005ef32Sjsg drm_info(&dev_priv->drm, 5565f005ef32Sjsg "[ENCODER:%d:%s] VGA converter detected, disabling eDP\n", 5566f005ef32Sjsg encoder->base.base.id, encoder->base.name); 5567f005ef32Sjsg goto out_vdd_off; 5568f005ef32Sjsg } 5569f005ef32Sjsg } 5570f005ef32Sjsg 5571f005ef32Sjsg mutex_lock(&dev_priv->drm.mode_config.mutex); 5572f005ef32Sjsg drm_edid = drm_edid_read_ddc(connector, &intel_dp->aux.ddc); 5573f005ef32Sjsg if (!drm_edid) { 55741bb76ff1Sjsg /* Fallback to EDID from ACPI OpRegion, if any */ 5575f005ef32Sjsg drm_edid = intel_opregion_get_edid(intel_connector); 5576f005ef32Sjsg if (drm_edid) 55771bb76ff1Sjsg drm_dbg_kms(&dev_priv->drm, 55781bb76ff1Sjsg "[CONNECTOR:%d:%s] Using OpRegion EDID\n", 55791bb76ff1Sjsg connector->base.id, connector->name); 55801bb76ff1Sjsg } 5581f005ef32Sjsg if (drm_edid) { 5582f005ef32Sjsg if (drm_edid_connector_update(connector, drm_edid) || 5583f005ef32Sjsg !drm_edid_connector_add_modes(connector)) { 5584f005ef32Sjsg drm_edid_connector_update(connector, NULL); 5585f005ef32Sjsg drm_edid_free(drm_edid); 5586f005ef32Sjsg drm_edid = ERR_PTR(-EINVAL); 5587c349dbc7Sjsg } 5588c349dbc7Sjsg } else { 5589f005ef32Sjsg drm_edid = ERR_PTR(-ENOENT); 5590c349dbc7Sjsg } 5591c349dbc7Sjsg 5592f005ef32Sjsg intel_bios_init_panel_late(dev_priv, &intel_connector->panel, encoder->devdata, 5593f005ef32Sjsg IS_ERR(drm_edid) ? NULL : drm_edid); 55941bb76ff1Sjsg 559513315407Sjsg intel_panel_add_edid_fixed_modes(intel_connector, true); 55961bb76ff1Sjsg 55971bb76ff1Sjsg /* MSO requires information from the EDID */ 55981bb76ff1Sjsg intel_edp_mso_init(intel_dp); 5599c349dbc7Sjsg 56005ca02815Sjsg /* multiply the mode clock and horizontal timings for MSO */ 56011bb76ff1Sjsg list_for_each_entry(fixed_mode, &intel_connector->panel.fixed_modes, head) 56025ca02815Sjsg intel_edp_mso_mode_fixup(intel_connector, fixed_mode); 56035ca02815Sjsg 5604c349dbc7Sjsg /* fallback to VBT if available for eDP */ 56051bb76ff1Sjsg if (!intel_panel_preferred_fixed_mode(intel_connector)) 56061bb76ff1Sjsg intel_panel_add_vbt_lfp_fixed_mode(intel_connector); 56071bb76ff1Sjsg 5608f005ef32Sjsg mutex_unlock(&dev_priv->drm.mode_config.mutex); 5609c349dbc7Sjsg 5610f005ef32Sjsg if (!intel_panel_preferred_fixed_mode(intel_connector)) { 5611f005ef32Sjsg drm_info(&dev_priv->drm, 5612f005ef32Sjsg "[ENCODER:%d:%s] failed to find fixed mode for the panel, disabling eDP\n", 5613f005ef32Sjsg encoder->base.base.id, encoder->base.name); 5614f005ef32Sjsg goto out_vdd_off; 5615c349dbc7Sjsg } 5616c349dbc7Sjsg 5617f005ef32Sjsg intel_panel_init(intel_connector, drm_edid); 5618c349dbc7Sjsg 5619f005ef32Sjsg intel_edp_backlight_setup(intel_dp, intel_connector); 56201bb76ff1Sjsg 56211bb76ff1Sjsg intel_edp_add_properties(intel_dp); 56221bb76ff1Sjsg 56231bb76ff1Sjsg intel_pps_init_late(intel_dp); 5624c349dbc7Sjsg 5625c349dbc7Sjsg return true; 5626c349dbc7Sjsg 5627c349dbc7Sjsg out_vdd_off: 56285ca02815Sjsg intel_pps_vdd_off_sync(intel_dp); 5629c349dbc7Sjsg 5630c349dbc7Sjsg return false; 5631c349dbc7Sjsg } 5632c349dbc7Sjsg 5633c349dbc7Sjsg static void intel_dp_modeset_retry_work_fn(struct work_struct *work) 5634c349dbc7Sjsg { 5635c349dbc7Sjsg struct intel_connector *intel_connector; 5636c349dbc7Sjsg struct drm_connector *connector; 5637c349dbc7Sjsg 5638c349dbc7Sjsg intel_connector = container_of(work, typeof(*intel_connector), 5639c349dbc7Sjsg modeset_retry_work); 5640c349dbc7Sjsg connector = &intel_connector->base; 56411bb76ff1Sjsg drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s]\n", connector->base.id, 5642c349dbc7Sjsg connector->name); 5643c349dbc7Sjsg 5644c349dbc7Sjsg /* Grab the locks before changing connector property*/ 5645c349dbc7Sjsg mutex_lock(&connector->dev->mode_config.mutex); 5646c349dbc7Sjsg /* Set connector link status to BAD and send a Uevent to notify 5647c349dbc7Sjsg * userspace to do a modeset. 5648c349dbc7Sjsg */ 5649c349dbc7Sjsg drm_connector_set_link_status_property(connector, 5650c349dbc7Sjsg DRM_MODE_LINK_STATUS_BAD); 5651c349dbc7Sjsg mutex_unlock(&connector->dev->mode_config.mutex); 5652c349dbc7Sjsg /* Send Hotplug uevent so userspace can reprobe */ 56531bb76ff1Sjsg drm_kms_helper_connector_hotplug_event(connector); 5654c349dbc7Sjsg } 5655c349dbc7Sjsg 5656c349dbc7Sjsg bool 5657ad8b1aafSjsg intel_dp_init_connector(struct intel_digital_port *dig_port, 5658c349dbc7Sjsg struct intel_connector *intel_connector) 5659c349dbc7Sjsg { 5660c349dbc7Sjsg struct drm_connector *connector = &intel_connector->base; 5661ad8b1aafSjsg struct intel_dp *intel_dp = &dig_port->dp; 5662ad8b1aafSjsg struct intel_encoder *intel_encoder = &dig_port->base; 5663c349dbc7Sjsg struct drm_device *dev = intel_encoder->base.dev; 5664c349dbc7Sjsg struct drm_i915_private *dev_priv = to_i915(dev); 5665c349dbc7Sjsg enum port port = intel_encoder->port; 5666c349dbc7Sjsg enum phy phy = intel_port_to_phy(dev_priv, port); 5667c349dbc7Sjsg int type; 5668c349dbc7Sjsg 5669c349dbc7Sjsg /* Initialize the work for modeset in case of link train failure */ 5670c349dbc7Sjsg INIT_WORK(&intel_connector->modeset_retry_work, 5671c349dbc7Sjsg intel_dp_modeset_retry_work_fn); 5672c349dbc7Sjsg 5673ad8b1aafSjsg if (drm_WARN(dev, dig_port->max_lanes < 1, 5674c349dbc7Sjsg "Not enough lanes (%d) for DP on [ENCODER:%d:%s]\n", 5675ad8b1aafSjsg dig_port->max_lanes, intel_encoder->base.base.id, 5676c349dbc7Sjsg intel_encoder->base.name)) 5677c349dbc7Sjsg return false; 5678c349dbc7Sjsg 5679c349dbc7Sjsg intel_dp->reset_link_params = true; 56805ca02815Sjsg intel_dp->pps.pps_pipe = INVALID_PIPE; 56815ca02815Sjsg intel_dp->pps.active_pipe = INVALID_PIPE; 5682c349dbc7Sjsg 5683c349dbc7Sjsg /* Preserve the current hw state. */ 5684c349dbc7Sjsg intel_dp->DP = intel_de_read(dev_priv, intel_dp->output_reg); 5685c349dbc7Sjsg intel_dp->attached_connector = intel_connector; 5686c349dbc7Sjsg 5687f005ef32Sjsg if (_intel_dp_is_port_edp(dev_priv, intel_encoder->devdata, port)) { 5688c349dbc7Sjsg /* 5689c349dbc7Sjsg * Currently we don't support eDP on TypeC ports, although in 5690c349dbc7Sjsg * theory it could work on TypeC legacy ports. 5691c349dbc7Sjsg */ 5692c349dbc7Sjsg drm_WARN_ON(dev, intel_phy_is_tc(dev_priv, phy)); 5693c349dbc7Sjsg type = DRM_MODE_CONNECTOR_eDP; 5694c349dbc7Sjsg intel_encoder->type = INTEL_OUTPUT_EDP; 5695c349dbc7Sjsg 5696c349dbc7Sjsg /* eDP only on port B and/or C on vlv/chv */ 5697c349dbc7Sjsg if (drm_WARN_ON(dev, (IS_VALLEYVIEW(dev_priv) || 5698c349dbc7Sjsg IS_CHERRYVIEW(dev_priv)) && 5699c349dbc7Sjsg port != PORT_B && port != PORT_C)) 5700c349dbc7Sjsg return false; 57011bb76ff1Sjsg } else { 57021bb76ff1Sjsg type = DRM_MODE_CONNECTOR_DisplayPort; 57031bb76ff1Sjsg } 57041bb76ff1Sjsg 57051bb76ff1Sjsg intel_dp_set_default_sink_rates(intel_dp); 57061bb76ff1Sjsg intel_dp_set_default_max_sink_lane_count(intel_dp); 57071bb76ff1Sjsg 57081bb76ff1Sjsg if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) 57091bb76ff1Sjsg intel_dp->pps.active_pipe = vlv_active_pipe(intel_dp); 5710c349dbc7Sjsg 5711c349dbc7Sjsg drm_dbg_kms(&dev_priv->drm, 5712c349dbc7Sjsg "Adding %s connector on [ENCODER:%d:%s]\n", 5713c349dbc7Sjsg type == DRM_MODE_CONNECTOR_eDP ? "eDP" : "DP", 5714c349dbc7Sjsg intel_encoder->base.base.id, intel_encoder->base.name); 5715c349dbc7Sjsg 5716c349dbc7Sjsg drm_connector_init(dev, connector, &intel_dp_connector_funcs, type); 5717c349dbc7Sjsg drm_connector_helper_add(connector, &intel_dp_connector_helper_funcs); 5718c349dbc7Sjsg 5719f005ef32Sjsg if (!HAS_GMCH(dev_priv) && DISPLAY_VER(dev_priv) < 12) 5720c349dbc7Sjsg connector->interlace_allowed = true; 5721c349dbc7Sjsg 5722c349dbc7Sjsg intel_connector->polled = DRM_CONNECTOR_POLL_HPD; 5723c349dbc7Sjsg 5724c349dbc7Sjsg intel_dp_aux_init(intel_dp); 5725c349dbc7Sjsg 5726c349dbc7Sjsg intel_connector_attach_encoder(intel_connector, intel_encoder); 5727c349dbc7Sjsg 5728c349dbc7Sjsg if (HAS_DDI(dev_priv)) 5729c349dbc7Sjsg intel_connector->get_hw_state = intel_ddi_connector_get_hw_state; 5730c349dbc7Sjsg else 5731c349dbc7Sjsg intel_connector->get_hw_state = intel_connector_get_hw_state; 5732c349dbc7Sjsg 57331bb76ff1Sjsg if (!intel_edp_init_connector(intel_dp, intel_connector)) { 57341bb76ff1Sjsg intel_dp_aux_fini(intel_dp); 57351bb76ff1Sjsg goto fail; 57361bb76ff1Sjsg } 57371bb76ff1Sjsg 57381bb76ff1Sjsg intel_dp_set_source_rates(intel_dp); 57391bb76ff1Sjsg intel_dp_set_common_rates(intel_dp); 57401bb76ff1Sjsg intel_dp_reset_max_link_params(intel_dp); 57411bb76ff1Sjsg 5742c349dbc7Sjsg /* init MST on ports that can support it */ 5743ad8b1aafSjsg intel_dp_mst_encoder_init(dig_port, 5744c349dbc7Sjsg intel_connector->base.base.id); 5745c349dbc7Sjsg 5746c349dbc7Sjsg intel_dp_add_properties(intel_dp, connector); 5747c349dbc7Sjsg 5748c349dbc7Sjsg if (is_hdcp_supported(dev_priv, port) && !intel_dp_is_edp(intel_dp)) { 57495ca02815Sjsg int ret = intel_dp_hdcp_init(dig_port, intel_connector); 5750c349dbc7Sjsg if (ret) 5751c349dbc7Sjsg drm_dbg_kms(&dev_priv->drm, 5752c349dbc7Sjsg "HDCP init failed, skipping.\n"); 5753c349dbc7Sjsg } 5754c349dbc7Sjsg 5755c349dbc7Sjsg /* For G4X desktop chip, PEG_BAND_GAP_DATA 3:0 must first be written 5756c349dbc7Sjsg * 0xd. Failure to do so will result in spurious interrupts being 5757c349dbc7Sjsg * generated on the port when a cable is not attached. 5758c349dbc7Sjsg */ 5759c349dbc7Sjsg if (IS_G45(dev_priv)) { 5760c349dbc7Sjsg u32 temp = intel_de_read(dev_priv, PEG_BAND_GAP_DATA); 5761c349dbc7Sjsg intel_de_write(dev_priv, PEG_BAND_GAP_DATA, 5762c349dbc7Sjsg (temp & ~0xf) | 0xd); 5763c349dbc7Sjsg } 5764c349dbc7Sjsg 57655ca02815Sjsg intel_dp->frl.is_trained = false; 57665ca02815Sjsg intel_dp->frl.trained_rate_gbps = 0; 57675ca02815Sjsg 57685ca02815Sjsg intel_psr_init(intel_dp); 57695ca02815Sjsg 5770c349dbc7Sjsg return true; 5771c349dbc7Sjsg 5772c349dbc7Sjsg fail: 5773f005ef32Sjsg intel_display_power_flush_work(dev_priv); 5774c349dbc7Sjsg drm_connector_cleanup(connector); 5775c349dbc7Sjsg 5776c349dbc7Sjsg return false; 5777c349dbc7Sjsg } 5778c349dbc7Sjsg 5779c349dbc7Sjsg void intel_dp_mst_suspend(struct drm_i915_private *dev_priv) 5780c349dbc7Sjsg { 5781c349dbc7Sjsg struct intel_encoder *encoder; 5782c349dbc7Sjsg 57835ca02815Sjsg if (!HAS_DISPLAY(dev_priv)) 57845ca02815Sjsg return; 57855ca02815Sjsg 5786c349dbc7Sjsg for_each_intel_encoder(&dev_priv->drm, encoder) { 5787c349dbc7Sjsg struct intel_dp *intel_dp; 5788c349dbc7Sjsg 5789c349dbc7Sjsg if (encoder->type != INTEL_OUTPUT_DDI) 5790c349dbc7Sjsg continue; 5791c349dbc7Sjsg 5792c349dbc7Sjsg intel_dp = enc_to_intel_dp(encoder); 5793c349dbc7Sjsg 57941bb76ff1Sjsg if (!intel_dp_mst_source_support(intel_dp)) 5795c349dbc7Sjsg continue; 5796c349dbc7Sjsg 5797c349dbc7Sjsg if (intel_dp->is_mst) 5798c349dbc7Sjsg drm_dp_mst_topology_mgr_suspend(&intel_dp->mst_mgr); 5799c349dbc7Sjsg } 5800c349dbc7Sjsg } 5801c349dbc7Sjsg 5802c349dbc7Sjsg void intel_dp_mst_resume(struct drm_i915_private *dev_priv) 5803c349dbc7Sjsg { 5804c349dbc7Sjsg struct intel_encoder *encoder; 5805c349dbc7Sjsg 58065ca02815Sjsg if (!HAS_DISPLAY(dev_priv)) 58075ca02815Sjsg return; 58085ca02815Sjsg 5809c349dbc7Sjsg for_each_intel_encoder(&dev_priv->drm, encoder) { 5810c349dbc7Sjsg struct intel_dp *intel_dp; 5811c349dbc7Sjsg int ret; 5812c349dbc7Sjsg 5813c349dbc7Sjsg if (encoder->type != INTEL_OUTPUT_DDI) 5814c349dbc7Sjsg continue; 5815c349dbc7Sjsg 5816c349dbc7Sjsg intel_dp = enc_to_intel_dp(encoder); 5817c349dbc7Sjsg 58181bb76ff1Sjsg if (!intel_dp_mst_source_support(intel_dp)) 5819c349dbc7Sjsg continue; 5820c349dbc7Sjsg 5821c349dbc7Sjsg ret = drm_dp_mst_topology_mgr_resume(&intel_dp->mst_mgr, 5822c349dbc7Sjsg true); 5823c349dbc7Sjsg if (ret) { 5824c349dbc7Sjsg intel_dp->is_mst = false; 5825c349dbc7Sjsg drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst_mgr, 5826c349dbc7Sjsg false); 5827c349dbc7Sjsg } 5828c349dbc7Sjsg } 5829c349dbc7Sjsg } 5830