From patchwork Tue Jan 22 21:12:07 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: "Navare, Manasi" X-Patchwork-Id: 10776277 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id D8483746 for ; Tue, 22 Jan 2019 21:09:58 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C8F412B7E2 for ; Tue, 22 Jan 2019 21:09:58 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id BA0DC2B856; Tue, 22 Jan 2019 21:09:58 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.2 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 1C6502B7E2 for ; Tue, 22 Jan 2019 21:09:58 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 03F2C6EDDD; Tue, 22 Jan 2019 21:09:57 +0000 (UTC) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by gabe.freedesktop.org (Postfix) with ESMTPS id AD6816EDDD for ; Tue, 22 Jan 2019 21:09:56 +0000 (UTC) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 22 Jan 2019 13:09:56 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.56,508,1539673200"; d="scan'208";a="111837477" Received: from labuser-z97x-ud5h.jf.intel.com ([10.54.75.151]) by orsmga008.jf.intel.com with ESMTP; 22 Jan 2019 13:09:56 -0800 From: Manasi Navare To: intel-gfx@lists.freedesktop.org Date: Tue, 22 Jan 2019 13:12:07 -0800 Message-Id: <20190122211207.20055-1-manasi.d.navare@intel.com> X-Mailer: git-send-email 2.19.1 MIME-Version: 1.0 Subject: [Intel-gfx] [RFC] drm/i915/dp: Preliminary support for 2 pipe 1 port mode for 5K@120 X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" X-Virus-Scanned: ClamAV using ClamSMTP On Gen 11 platform, to enable resolutions like 5K@120 where the pixel clock is greater than pipe pixel rate, we need to split it across 2 pipes and enable it using DSC and big joiner. In order to support this dual pipe single port mode, we need to link two crtcs involved in this ganged mode. This patch is a RFC patch that links two crtcs using linked_crtc pointer in intel_crtc_state and slave to indicate if the crtc is a master or slave. Here the HW necessitates the first CRTC to be the master CRTC through which the final output will be driven and the next consecutive CRTC should be slave crtc. This is currently not tested, but I wanted to get some inputs on this approach. The idea is to follow the same approach used in Ganged plane mode for NV12 planes. Suggested-by: Maarten Lankhorst , Matt Roper Cc: Ville Syrjälä Cc: Matt Roper Cc: Maarten Lankhorst Signed-off-by: Manasi Navare --- drivers/gpu/drm/i915/intel_display.c | 63 ++++++++++++++++++++++++++++ drivers/gpu/drm/i915/intel_drv.h | 6 +++ 2 files changed, 69 insertions(+) diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 2fa9f4aec08e..9910dad7371b 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c @@ -10900,6 +10900,63 @@ static bool check_single_encoder_cloning(struct drm_atomic_state *state, return true; } +static bool icl_dual_pipe_mode(struct drm_i915_private *dev_priv, + struct drm_crtc_state *crtc_state) +{ + if (crtc_state->mode.clock <= 2 * dev_priv->max_cdclk_freq) + return false; + + return true; +} + +static int icl_set_linked_crtcs(struct drm_atomic_state *state) +{ + struct drm_i915_private *dev_priv = to_i915(state->dev); + struct drm_crtc *crtc; + struct drm_crtc_state *crtc_state; + struct intel_crtc_state *linked_state = NULL; + struct intel_crtc *slave_crtc = NULL; + int i; + + for_each_new_crtc_in_state(state, crtc, crtc_state, i) { + struct intel_crtc_state *pipe_config = + to_intel_crtc_state(crtc_state); + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + + if (crtc_state->active) + continue; + + if (!icl_dual_pipe_mode(dev_priv, crtc_state)) + continue; + + if (!pipe_config->linked_crtc) { + slave_crtc = intel_get_crtc_for_pipe(dev_priv, + intel_crtc->pipe + 1); + if (!slave_crtc) + return PTR_ERR(slave_crtc); + + linked_state = intel_atomic_get_crtc_state(state, slave_crtc); + if (IS_ERR(linked_state)) + return PTR_ERR(linked_state); + + pipe_config->linked_crtc = slave_crtc; + pipe_config->slave = false; + linked_state->linked_crtc = intel_crtc; + linked_state->slave = true; + // Update the intel_state->active_crtcs if needed + + DRM_DEBUG_KMS("Using [CRTC:%d:%s] as master and [CRTC:%d:%s] as slave\n", + intel_crtc->base.base.id, intel_crtc->base.name, + slave_crtc->base.base.id, slave_crtc->base.name); + + break; + } + } + + return 0; + +} + static int icl_add_linked_planes(struct intel_atomic_state *state) { struct intel_plane *plane, *linked; @@ -12702,6 +12759,12 @@ static int intel_atomic_check(struct drm_device *dev, if (ret) return ret; + if (INTEL_GEN(dev_priv) >= 11) { + ret = icl_set_linked_crtcs(state); + if (ret) + return ret; + } + for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, crtc_state, i) { struct intel_crtc_state *pipe_config = to_intel_crtc_state(crtc_state); diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index 33b733d37706..f8bbed525ec3 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h @@ -959,6 +959,12 @@ struct intel_crtc_state { /* Forward Error correction State */ bool fec_enable; + + /* Pointer to linked crtc in dual pipe mode */ + struct intel_crtc *linked_crtc; + + /* Flag to indicate whether this crtc is master or slave */ + bool slave; }; struct intel_crtc {