summaryrefslogtreecommitdiff
path: root/sys-kernel/linux-image-redcore/files/5.13-Intel-i915-backport-MSO-fixes-to-kernel-5.12.patch
diff options
context:
space:
mode:
authorV3n3RiX <venerix@koprulu.sector>2021-10-08 20:37:05 +0100
committerV3n3RiX <venerix@koprulu.sector>2021-10-08 20:37:05 +0100
commit65d74bbe9f38a8f747f3e82de45768bae5a5ee31 (patch)
tree7c429509e6e1100660fb0b5ff1c5bcea2ae63cd0 /sys-kernel/linux-image-redcore/files/5.13-Intel-i915-backport-MSO-fixes-to-kernel-5.12.patch
parent4f5dbfc7bbff653618d20701c88f94805ba4c2c2 (diff)
sys-kernel/linux-{image,sources}-redcore : drop v5.13
Diffstat (limited to 'sys-kernel/linux-image-redcore/files/5.13-Intel-i915-backport-MSO-fixes-to-kernel-5.12.patch')
-rw-r--r--sys-kernel/linux-image-redcore/files/5.13-Intel-i915-backport-MSO-fixes-to-kernel-5.12.patch461
1 files changed, 0 insertions, 461 deletions
diff --git a/sys-kernel/linux-image-redcore/files/5.13-Intel-i915-backport-MSO-fixes-to-kernel-5.12.patch b/sys-kernel/linux-image-redcore/files/5.13-Intel-i915-backport-MSO-fixes-to-kernel-5.12.patch
deleted file mode 100644
index b0440c04..00000000
--- a/sys-kernel/linux-image-redcore/files/5.13-Intel-i915-backport-MSO-fixes-to-kernel-5.12.patch
+++ /dev/null
@@ -1,461 +0,0 @@
-diff -Naur linux-5.12/drivers/gpu/drm/i915/display/intel_ddi.c linux-5.12-p/drivers/gpu/drm/i915/display/intel_ddi.c
---- linux-5.12/drivers/gpu/drm/i915/display/intel_ddi.c 2021-04-25 22:49:08.000000000 +0200
-+++ linux-5.12-p/drivers/gpu/drm/i915/display/intel_ddi.c 2021-04-29 21:14:27.250013980 +0200
-@@ -3638,6 +3638,73 @@
- }
- }
-
-+static void intel_ddi_mso_get_config(struct intel_encoder *encoder,
-+ struct intel_crtc_state *pipe_config)
-+{
-+ struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc);
-+ struct drm_i915_private *i915 = to_i915(crtc->base.dev);
-+ enum pipe pipe = crtc->pipe;
-+ u32 dss1;
-+
-+ if (!HAS_MSO(i915))
-+ return;
-+
-+ dss1 = intel_de_read(i915, ICL_PIPE_DSS_CTL1(pipe));
-+
-+ pipe_config->splitter.enable = dss1 & SPLITTER_ENABLE;
-+ if (!pipe_config->splitter.enable)
-+ return;
-+
-+ /* Splitter enable is supported for pipe A only. */
-+ if (drm_WARN_ON(&i915->drm, pipe != PIPE_A)) {
-+ pipe_config->splitter.enable = false;
-+ return;
-+ }
-+
-+ switch (dss1 & SPLITTER_CONFIGURATION_MASK) {
-+ default:
-+ drm_WARN(&i915->drm, true,
-+ "Invalid splitter configuration, dss1=0x%08x\n", dss1);
-+ fallthrough;
-+ case SPLITTER_CONFIGURATION_2_SEGMENT:
-+ pipe_config->splitter.link_count = 2;
-+ break;
-+ case SPLITTER_CONFIGURATION_4_SEGMENT:
-+ pipe_config->splitter.link_count = 4;
-+ break;
-+ }
-+
-+ pipe_config->splitter.pixel_overlap = REG_FIELD_GET(OVERLAP_PIXELS_MASK, dss1);
-+}
-+
-+static void intel_ddi_mso_configure(const struct intel_crtc_state *crtc_state)
-+{
-+ struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
-+ struct drm_i915_private *i915 = to_i915(crtc->base.dev);
-+ enum pipe pipe = crtc->pipe;
-+ u32 dss1 = 0;
-+
-+ if (!HAS_MSO(i915))
-+ return;
-+
-+ if (crtc_state->splitter.enable) {
-+ /* Splitter enable is supported for pipe A only. */
-+ if (drm_WARN_ON(&i915->drm, pipe != PIPE_A))
-+ return;
-+
-+ dss1 |= SPLITTER_ENABLE;
-+ dss1 |= OVERLAP_PIXELS(crtc_state->splitter.pixel_overlap);
-+ if (crtc_state->splitter.link_count == 2)
-+ dss1 |= SPLITTER_CONFIGURATION_2_SEGMENT;
-+ else
-+ dss1 |= SPLITTER_CONFIGURATION_4_SEGMENT;
-+ }
-+
-+ intel_de_rmw(i915, ICL_PIPE_DSS_CTL1(pipe),
-+ SPLITTER_ENABLE | SPLITTER_CONFIGURATION_MASK |
-+ OVERLAP_PIXELS_MASK, dss1);
-+}
-+
- static void tgl_ddi_pre_enable_dp(struct intel_atomic_state *state,
- struct intel_encoder *encoder,
- const struct intel_crtc_state *crtc_state,
-@@ -3732,6 +3799,11 @@
- intel_ddi_power_up_lanes(encoder, crtc_state);
-
- /*
-+ * 7.g Program CoG/MSO configuration bits in DSS_CTL1 if selected.
-+ */
-+ intel_ddi_mso_configure(crtc_state);
-+
-+ /*
- * 7.g Configure and enable DDI_BUF_CTL
- * 7.h Wait for DDI_BUF_CTL DDI Idle Status = 0b (Not Idle), timeout
- * after 500 us.
-@@ -4828,6 +4900,8 @@
- intel_ddi_read_func_ctl(encoder, pipe_config);
- }
-
-+ intel_ddi_mso_get_config(encoder, pipe_config);
-+
- pipe_config->has_audio =
- intel_ddi_is_audio_enabled(dev_priv, cpu_transcoder);
-
-@@ -5612,6 +5686,10 @@
- goto err;
-
- dig_port->hpd_pulse = intel_dp_hpd_pulse;
-+
-+ /* Splitter enable for eDP MSO is supported for pipe A only. */
-+ if (dig_port->dp.mso_link_count)
-+ encoder->pipe_mask = BIT(PIPE_A);
- }
-
- /* In theory we don't need the encoder->type check, but leave it just in
-diff -Naur linux-5.12/drivers/gpu/drm/i915/display/intel_display.c linux-5.12-p/drivers/gpu/drm/i915/display/intel_display.c
---- linux-5.12/drivers/gpu/drm/i915/display/intel_display.c 2021-04-25 22:49:08.000000000 +0200
-+++ linux-5.12-p/drivers/gpu/drm/i915/display/intel_display.c 2021-04-29 21:14:27.253013937 +0200
-@@ -6380,8 +6380,30 @@
- pipe_mode->crtc_clock /= 2;
- }
-
-- intel_mode_from_crtc_timings(pipe_mode, pipe_mode);
-- intel_mode_from_crtc_timings(adjusted_mode, adjusted_mode);
-+ if (crtc_state->splitter.enable) {
-+ int n = crtc_state->splitter.link_count;
-+ int overlap = crtc_state->splitter.pixel_overlap;
-+
-+ /*
-+ * eDP MSO uses segment timings from EDID for transcoder
-+ * timings, but full mode for everything else.
-+ *
-+ * h_full = (h_segment - pixel_overlap) * link_count
-+ */
-+ pipe_mode->crtc_hdisplay = (pipe_mode->crtc_hdisplay - overlap) * n;
-+ pipe_mode->crtc_hblank_start = (pipe_mode->crtc_hblank_start - overlap) * n;
-+ pipe_mode->crtc_hblank_end = (pipe_mode->crtc_hblank_end - overlap) * n;
-+ pipe_mode->crtc_hsync_start = (pipe_mode->crtc_hsync_start - overlap) * n;
-+ pipe_mode->crtc_hsync_end = (pipe_mode->crtc_hsync_end - overlap) * n;
-+ pipe_mode->crtc_htotal = (pipe_mode->crtc_htotal - overlap) * n;
-+ pipe_mode->crtc_clock *= n;
-+
-+ intel_mode_from_crtc_timings(pipe_mode, pipe_mode);
-+ intel_mode_from_crtc_timings(adjusted_mode, pipe_mode);
-+ } else {
-+ intel_mode_from_crtc_timings(pipe_mode, pipe_mode);
-+ intel_mode_from_crtc_timings(adjusted_mode, adjusted_mode);
-+ }
-
- intel_crtc_compute_pixel_rate(crtc_state);
-
-@@ -6419,6 +6441,19 @@
- pipe_config->pipe_src_w /= 2;
- }
-
-+ if (pipe_config->splitter.enable) {
-+ int n = pipe_config->splitter.link_count;
-+ int overlap = pipe_config->splitter.pixel_overlap;
-+
-+ pipe_mode->crtc_hdisplay = (pipe_mode->crtc_hdisplay - overlap) * n;
-+ pipe_mode->crtc_hblank_start = (pipe_mode->crtc_hblank_start - overlap) * n;
-+ pipe_mode->crtc_hblank_end = (pipe_mode->crtc_hblank_end - overlap) * n;
-+ pipe_mode->crtc_hsync_start = (pipe_mode->crtc_hsync_start - overlap) * n;
-+ pipe_mode->crtc_hsync_end = (pipe_mode->crtc_hsync_end - overlap) * n;
-+ pipe_mode->crtc_htotal = (pipe_mode->crtc_htotal - overlap) * n;
-+ pipe_mode->crtc_clock *= n;
-+ }
-+
- intel_mode_from_crtc_timings(pipe_mode, pipe_mode);
-
- if (INTEL_GEN(dev_priv) < 4) {
-@@ -10295,6 +10330,11 @@
- pipe_config->bigjoiner_slave ? "slave" :
- pipe_config->bigjoiner ? "master" : "no");
-
-+ drm_dbg_kms(&dev_priv->drm, "splitter: %s, link count %d, overlap %d\n",
-+ enableddisabled(pipe_config->splitter.enable),
-+ pipe_config->splitter.link_count,
-+ pipe_config->splitter.pixel_overlap);
-+
- if (pipe_config->has_pch_encoder)
- intel_dump_m_n_config(pipe_config, "fdi",
- pipe_config->fdi_lanes,
-@@ -11335,6 +11375,10 @@
- PIPE_CONF_CHECK_I(dsc.dsc_split);
- PIPE_CONF_CHECK_I(dsc.compressed_bpp);
-
-+ PIPE_CONF_CHECK_BOOL(splitter.enable);
-+ PIPE_CONF_CHECK_I(splitter.link_count);
-+ PIPE_CONF_CHECK_I(splitter.pixel_overlap);
-+
- PIPE_CONF_CHECK_I(mst_master_transcoder);
-
- PIPE_CONF_CHECK_BOOL(vrr.enable);
-diff -Naur linux-5.12/drivers/gpu/drm/i915/display/intel_display_types.h linux-5.12-p/drivers/gpu/drm/i915/display/intel_display_types.h
---- linux-5.12/drivers/gpu/drm/i915/display/intel_display_types.h 2021-04-25 22:49:08.000000000 +0200
-+++ linux-5.12-p/drivers/gpu/drm/i915/display/intel_display_types.h 2021-04-29 21:14:27.244014066 +0200
-@@ -1159,6 +1159,13 @@
- u8 pipeline_full;
- u16 flipline, vmin, vmax;
- } vrr;
-+
-+ /* Stream Splitter for eDP MSO */
-+ struct {
-+ bool enable;
-+ u8 link_count;
-+ u8 pixel_overlap;
-+ } splitter;
- };
-
- enum intel_pipe_crc_source {
-@@ -1448,6 +1455,8 @@
- int max_link_lane_count;
- /* Max rate for the current link */
- int max_link_rate;
-+ int mso_link_count;
-+ int mso_pixel_overlap;
- /* sink or branch descriptor */
- struct drm_dp_desc desc;
- struct drm_dp_aux aux;
-diff -Naur linux-5.12/drivers/gpu/drm/i915/display/intel_dp.c linux-5.12-p/drivers/gpu/drm/i915/display/intel_dp.c
---- linux-5.12/drivers/gpu/drm/i915/display/intel_dp.c 2021-04-25 22:49:08.000000000 +0200
-+++ linux-5.12-p/drivers/gpu/drm/i915/display/intel_dp.c 2021-04-29 21:14:27.254013923 +0200
-@@ -1724,6 +1724,7 @@
- {
- struct intel_connector *intel_connector = intel_dp->attached_connector;
- struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
-+ int pixel_clock;
-
- if (pipe_config->vrr.enable)
- return;
-@@ -1742,10 +1743,18 @@
- return;
-
- pipe_config->has_drrs = true;
-- intel_link_compute_m_n(output_bpp, pipe_config->lane_count,
-- intel_connector->panel.downclock_mode->clock,
-+
-+ pixel_clock = intel_connector->panel.downclock_mode->clock;
-+ if (pipe_config->splitter.enable)
-+ pixel_clock /= pipe_config->splitter.link_count;
-+
-+ intel_link_compute_m_n(output_bpp, pipe_config->lane_count, pixel_clock,
- pipe_config->port_clock, &pipe_config->dp_m2_n2,
- constant_n, pipe_config->fec_enable);
-+
-+ /* FIXME: abstract this better */
-+ if (pipe_config->splitter.enable)
-+ pipe_config->dp_m2_n2.gmch_m *= pipe_config->splitter.link_count;
- }
-
- int
-@@ -1820,6 +1829,26 @@
- output_bpp = intel_dp_output_bpp(pipe_config->output_format,
- pipe_config->pipe_bpp);
-
-+ if (intel_dp->mso_link_count) {
-+ int n = intel_dp->mso_link_count;
-+ int overlap = intel_dp->mso_pixel_overlap;
-+
-+ pipe_config->splitter.enable = true;
-+ pipe_config->splitter.link_count = n;
-+ pipe_config->splitter.pixel_overlap = overlap;
-+
-+ drm_dbg_kms(&dev_priv->drm, "MSO link count %d, pixel overlap %d\n",
-+ n, overlap);
-+
-+ adjusted_mode->crtc_hdisplay = adjusted_mode->crtc_hdisplay / n + overlap;
-+ adjusted_mode->crtc_hblank_start = adjusted_mode->crtc_hblank_start / n + overlap;
-+ adjusted_mode->crtc_hblank_end = adjusted_mode->crtc_hblank_end / n + overlap;
-+ adjusted_mode->crtc_hsync_start = adjusted_mode->crtc_hsync_start / n + overlap;
-+ adjusted_mode->crtc_hsync_end = adjusted_mode->crtc_hsync_end / n + overlap;
-+ adjusted_mode->crtc_htotal = adjusted_mode->crtc_htotal / n + overlap;
-+ adjusted_mode->crtc_clock /= n;
-+ }
-+
- intel_link_compute_m_n(output_bpp,
- pipe_config->lane_count,
- adjusted_mode->crtc_clock,
-@@ -1827,6 +1856,10 @@
- &pipe_config->dp_m_n,
- constant_n, pipe_config->fec_enable);
-
-+ /* FIXME: abstract this better */
-+ if (pipe_config->splitter.enable)
-+ pipe_config->dp_m_n.gmch_m *= pipe_config->splitter.link_count;
-+
- if (!HAS_DDI(dev_priv))
- intel_dp_set_clock(encoder, pipe_config);
-
-@@ -3517,6 +3550,64 @@
- }
- }
-
-+static void intel_edp_mso_mode_fixup(struct intel_connector *connector,
-+ struct drm_display_mode *mode)
-+{
-+ struct intel_dp *intel_dp = intel_attached_dp(connector);
-+ struct drm_i915_private *i915 = to_i915(connector->base.dev);
-+ int n = intel_dp->mso_link_count;
-+ int overlap = intel_dp->mso_pixel_overlap;
-+
-+ if (!mode || !n)
-+ return;
-+
-+ mode->hdisplay = (mode->hdisplay - overlap) * n;
-+ mode->hsync_start = (mode->hsync_start - overlap) * n;
-+ mode->hsync_end = (mode->hsync_end - overlap) * n;
-+ mode->htotal = (mode->htotal - overlap) * n;
-+ mode->clock *= n;
-+
-+ drm_mode_set_name(mode);
-+
-+ drm_dbg_kms(&i915->drm,
-+ "[CONNECTOR:%d:%s] using generated MSO mode: ",
-+ connector->base.base.id, connector->base.name);
-+ drm_mode_debug_printmodeline(mode);
-+}
-+
-+static void intel_edp_mso_init(struct intel_dp *intel_dp)
-+{
-+ struct drm_i915_private *i915 = dp_to_i915(intel_dp);
-+ u8 mso;
-+
-+ if (intel_dp->edp_dpcd[0] < DP_EDP_14)
-+ return;
-+
-+ if (drm_dp_dpcd_readb(&intel_dp->aux, DP_EDP_MSO_LINK_CAPABILITIES, &mso) != 1) {
-+ drm_err(&i915->drm, "Failed to read MSO cap\n");
-+ return;
-+ }
-+
-+ /* Valid configurations are SST or MSO 2x1, 2x2, 4x1 */
-+ mso &= DP_EDP_MSO_NUMBER_OF_LINKS_MASK;
-+ if (mso % 2 || mso > drm_dp_max_lane_count(intel_dp->dpcd)) {
-+ drm_err(&i915->drm, "Invalid MSO link count cap %u\n", mso);
-+ mso = 0;
-+ }
-+
-+ if (mso) {
-+ drm_dbg_kms(&i915->drm, "Sink MSO %ux%u configuration\n",
-+ mso, drm_dp_max_lane_count(intel_dp->dpcd) / mso);
-+ if (!HAS_MSO(i915)) {
-+ drm_err(&i915->drm, "No source MSO support, disabling\n");
-+ mso = 0;
-+ }
-+ }
-+
-+ intel_dp->mso_link_count = mso;
-+ intel_dp->mso_pixel_overlap = 0; /* FIXME: read from DisplayID v2.0 */
-+}
-+
- static bool
- intel_edp_init_dpcd(struct intel_dp *intel_dp)
- {
-@@ -3600,6 +3691,8 @@
- */
- intel_edp_init_source_oui(intel_dp, true);
-
-+ intel_edp_mso_init(intel_dp);
-+
- return true;
- }
-
-@@ -5546,19 +5639,18 @@
- {
- struct intel_connector *intel_connector = to_intel_connector(connector);
- struct edid *edid;
-+ int num_modes = 0;
-
- edid = intel_connector->detect_edid;
- if (edid) {
-- int ret = intel_connector_update_modes(connector, edid);
-+ num_modes = intel_connector_update_modes(connector, edid);
-
- if (intel_vrr_is_capable(connector))
- drm_connector_set_vrr_capable_property(connector,
- true);
-- if (ret)
-- return ret;
- }
-
-- /* if eDP has no EDID, fall back to fixed mode */
-+ /* Also add fixed mode, which may or may not be present in EDID */
- if (intel_dp_is_edp(intel_attached_dp(intel_connector)) &&
- intel_connector->panel.fixed_mode) {
- struct drm_display_mode *mode;
-@@ -5567,10 +5659,13 @@
- intel_connector->panel.fixed_mode);
- if (mode) {
- drm_mode_probed_add(connector, mode);
-- return 1;
-+ num_modes++;
- }
- }
-
-+ if (num_modes)
-+ return num_modes;
-+
- if (!edid) {
- struct intel_dp *intel_dp = intel_attached_dp(intel_connector);
- struct drm_display_mode *mode;
-@@ -5580,11 +5675,11 @@
- intel_dp->downstream_ports);
- if (mode) {
- drm_mode_probed_add(connector, mode);
-- return 1;
-+ num_modes++;
- }
- }
-
-- return 0;
-+ return num_modes;
- }
-
- static int
-@@ -6457,6 +6552,10 @@
- if (fixed_mode)
- downclock_mode = intel_dp_drrs_init(intel_connector, fixed_mode);
-
-+ /* multiply the mode clock and horizontal timings for MSO */
-+ intel_edp_mso_mode_fixup(intel_connector, fixed_mode);
-+ intel_edp_mso_mode_fixup(intel_connector, downclock_mode);
-+
- /* fallback to VBT if available for eDP */
- if (!fixed_mode)
- fixed_mode = intel_panel_vbt_fixed_mode(intel_connector);
-diff -Naur linux-5.12/drivers/gpu/drm/i915/i915_drv.h linux-5.12-p/drivers/gpu/drm/i915/i915_drv.h
---- linux-5.12/drivers/gpu/drm/i915/i915_drv.h 2021-04-25 22:49:08.000000000 +0200
-+++ linux-5.12-p/drivers/gpu/drm/i915/i915_drv.h 2021-04-29 21:14:27.244014066 +0200
-@@ -1718,6 +1718,8 @@
-
- #define HAS_CSR(dev_priv) (INTEL_INFO(dev_priv)->display.has_csr)
-
-+#define HAS_MSO(i915) (INTEL_GEN(i915) >= 12)
-+
- #define HAS_RUNTIME_PM(dev_priv) (INTEL_INFO(dev_priv)->has_runtime_pm)
- #define HAS_64BIT_RELOC(dev_priv) (INTEL_INFO(dev_priv)->has_64bit_reloc)
-
-diff -Naur linux-5.12/drivers/gpu/drm/i915/i915_reg.h linux-5.12-p/drivers/gpu/drm/i915/i915_reg.h
---- linux-5.12/drivers/gpu/drm/i915/i915_reg.h 2021-04-25 22:49:08.000000000 +0200
-+++ linux-5.12-p/drivers/gpu/drm/i915/i915_reg.h 2021-04-29 21:14:27.239014138 +0200
-@@ -11427,6 +11427,9 @@
- #define BIG_JOINER_ENABLE (1 << 29)
- #define MASTER_BIG_JOINER_ENABLE (1 << 28)
- #define VGA_CENTERING_ENABLE (1 << 27)
-+#define SPLITTER_CONFIGURATION_MASK REG_GENMASK(26, 25)
-+#define SPLITTER_CONFIGURATION_2_SEGMENT REG_FIELD_PREP(SPLITTER_CONFIGURATION_MASK, 0)
-+#define SPLITTER_CONFIGURATION_4_SEGMENT REG_FIELD_PREP(SPLITTER_CONFIGURATION_MASK, 1)
-
- #define _ICL_PIPE_DSS_CTL2_PB 0x78204
- #define _ICL_PIPE_DSS_CTL2_PC 0x78404
-diff -Naur linux-5.12/include/drm/drm_dp_helper.h linux-5.12-p/include/drm/drm_dp_helper.h
---- linux-5.12/include/drm/drm_dp_helper.h 2021-04-25 22:49:08.000000000 +0200
-+++ linux-5.12-p/include/drm/drm_dp_helper.h 2021-04-29 21:14:27.233014224 +0200
-@@ -1016,6 +1016,11 @@
- #define DP_EDP_REGIONAL_BACKLIGHT_BASE 0x740 /* eDP 1.4 */
- #define DP_EDP_REGIONAL_BACKLIGHT_0 0x741 /* eDP 1.4 */
-
-+#define DP_EDP_MSO_LINK_CAPABILITIES 0x7a4 /* eDP 1.4 */
-+# define DP_EDP_MSO_NUMBER_OF_LINKS_MASK (7 << 0)
-+# define DP_EDP_MSO_NUMBER_OF_LINKS_SHIFT 0
-+# define DP_EDP_MSO_INDEPENDENT_LINK_BIT (1 << 3)
-+
- /* Sideband MSG Buffers */
- #define DP_SIDEBAND_MSG_DOWN_REQ_BASE 0x1000 /* 1.2 MST */
- #define DP_SIDEBAND_MSG_UP_REP_BASE 0x1200 /* 1.2 MST */