From patchwork Wed Aug 12 09:53:49 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: vikas.korjani@intel.com X-Patchwork-Id: 6998791 Return-Path: X-Original-To: patchwork-intel-gfx@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id C19109F4F5 for ; Wed, 12 Aug 2015 09:26:59 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id CA14220710 for ; Wed, 12 Aug 2015 09:26:58 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id 82F352070D for ; Wed, 12 Aug 2015 09:26:57 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id B412E6E71E; Wed, 12 Aug 2015 02:26:56 -0700 (PDT) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by gabe.freedesktop.org (Postfix) with ESMTP id 22B806E71E for ; Wed, 12 Aug 2015 02:26:56 -0700 (PDT) Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga101.fm.intel.com with ESMTP; 12 Aug 2015 02:26:44 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.15,660,1432623600"; d="scan'208";a="782564779" Received: from vkorjani-desktop.iind.intel.com ([10.223.25.67]) by orsmga002.jf.intel.com with ESMTP; 12 Aug 2015 02:26:43 -0700 From: vikas.korjani@intel.com To: intel-gfx@lists.freedesktop.org Date: Wed, 12 Aug 2015 15:23:49 +0530 Message-Id: <1439373233-8188-5-git-send-email-vikas.korjani@intel.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1439373233-8188-1-git-send-email-vikas.korjani@intel.com> References: <1439373233-8188-1-git-send-email-vikas.korjani@intel.com> Subject: [Intel-gfx] [RFC 4/8] drm/i915/bxt: MIPI DSI Register Programming for DSC X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: vkorjani For compression enabled, the number of bytes in active region cannot be calculated just by multiplying number of pixels and bits per pixel, formula in HLD is ceil((ceil(pixels/num_slice) * bpp) / 8) * num_slice hence modifying txbyteclkhs() to accommodate calculation for DSC Enable/Disable and created a separate function pixel_to_bytes(). Using modified txbyteclkhs to calculate MIPI_HS_TX_TIMEOUT As per HLD for computing MIPI_HS_TX_TIMEOUT per line, 1) calculate number of bytes in active region 2) calculate number of bytes in blanking region Add above two and compute byteclkhs. similarly for MIPI_HX_TX_TIMEOUT per frame, Add bytes in active and blanking region should be calculated separately. Signed-off-by: vkorjani Signed-off-by: Yogesh Mohan Marimuthu --- drivers/gpu/drm/i915/intel_dsi.c | 74 ++++++++++++++++++++++++++++++-------- 1 file changed, 59 insertions(+), 15 deletions(-) diff --git a/drivers/gpu/drm/i915/intel_dsi.c b/drivers/gpu/drm/i915/intel_dsi.c index 36fcb86..e566750 100644 --- a/drivers/gpu/drm/i915/intel_dsi.c +++ b/drivers/gpu/drm/i915/intel_dsi.c @@ -760,12 +760,48 @@ static u16 txclkesc(u32 divider, unsigned int us) } } +static int compute_num_slice(struct drm_encoder *encoder) +{ + struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder); + + return DIV_ROUND_UP(intel_dsi->pps_data.pic_height* + intel_dsi->pps_data.pic_width, + intel_dsi->pps_data.slice_height* + intel_dsi->pps_data.slice_width); +} + +static u32 pixel_to_bytes(struct drm_encoder *encoder, u16 pixels, int bpp) +{ + + struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder); + int num_slice; + + if (intel_dsi->dsc_enable) { + num_slice = compute_num_slice(encoder); + if (num_slice <= 0) + num_slice = 1; + bpp = intel_dsi->pps_data.bits_per_pixel / 16; + return DIV_ROUND_UP((DIV_ROUND_UP(pixels, num_slice)) * bpp, 8) + * num_slice; + } else + return DIV_ROUND_UP((pixels * bpp), 8); +} + + /* return pixels in terms of txbyteclkhs */ -static u16 txbyteclkhs(u16 pixels, int bpp, int lane_count, - u16 burst_mode_ratio) +static u16 txbyteclkhs(struct drm_encoder *encoder, u16 pixels, int bpp, + int lane_count, u16 burst_mode_ratio, bool dsc_calc) { - return DIV_ROUND_UP(DIV_ROUND_UP(pixels * bpp * burst_mode_ratio, - 8 * 100), lane_count); + struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder); + u32 pixel_bytes; + + if (intel_dsi->dsc_enable && dsc_calc) { + pixel_bytes = pixel_to_bytes(encoder, pixels, bpp); + return DIV_ROUND_UP(DIV_ROUND_UP(pixel_bytes * + burst_mode_ratio, 100), lane_count); + } else + return DIV_ROUND_UP(DIV_ROUND_UP(pixels * bpp * + burst_mode_ratio, 8 * 100), lane_count); } static void set_dsi_timings(struct drm_encoder *encoder, @@ -800,12 +836,14 @@ static void set_dsi_timings(struct drm_encoder *encoder, vbp = mode->vtotal - mode->vsync_end; /* horizontal values are in terms of high speed byte clock */ - hactive = txbyteclkhs(hactive, bpp, lane_count, - intel_dsi->burst_mode_ratio); - hfp = txbyteclkhs(hfp, bpp, lane_count, intel_dsi->burst_mode_ratio); - hsync = txbyteclkhs(hsync, bpp, lane_count, - intel_dsi->burst_mode_ratio); - hbp = txbyteclkhs(hbp, bpp, lane_count, intel_dsi->burst_mode_ratio); + hactive = txbyteclkhs(encoder, hactive, bpp, lane_count, + intel_dsi->burst_mode_ratio, true); + hfp = txbyteclkhs(encoder, hfp, bpp, lane_count, + intel_dsi->burst_mode_ratio, true); + hsync = txbyteclkhs(encoder, hsync, bpp, lane_count, + intel_dsi->burst_mode_ratio, true); + hbp = txbyteclkhs(encoder, hbp, bpp, lane_count, + intel_dsi->burst_mode_ratio, true); for_each_dsi_port(port, intel_dsi->ports) { if (IS_BROXTON(dev)) { @@ -851,6 +889,7 @@ static void intel_dsi_prepare(struct intel_encoder *intel_encoder) unsigned int bpp = intel_crtc->config->pipe_bpp; u32 val, tmp; u16 mode_hdisplay; + u32 hactive, hblank; DRM_DEBUG_KMS("pipe %c\n", pipe_name(intel_crtc->pipe)); @@ -943,18 +982,23 @@ static void intel_dsi_prepare(struct intel_encoder *intel_encoder) * said value is recommended. */ + hactive = pixel_to_bytes(encoder, adjusted_mode->hdisplay, bpp); + hblank = pixel_to_bytes(encoder, (adjusted_mode->htotal - + adjusted_mode->hsync_end), bpp); + if (is_vid_mode(intel_dsi) && intel_dsi->video_mode_format == VIDEO_MODE_BURST) { I915_WRITE(MIPI_HS_TX_TIMEOUT(port), - txbyteclkhs(adjusted_mode->htotal, bpp, + txbyteclkhs(encoder, (hactive + hblank), bpp, intel_dsi->lane_count, - intel_dsi->burst_mode_ratio) + 1); + intel_dsi->burst_mode_ratio, true) + 1); } else { I915_WRITE(MIPI_HS_TX_TIMEOUT(port), - txbyteclkhs(adjusted_mode->vtotal * - adjusted_mode->htotal, + txbyteclkhs(encoder, adjusted_mode->vtotal * + (hactive + hblank), bpp, intel_dsi->lane_count, - intel_dsi->burst_mode_ratio) + 1); + intel_dsi->burst_mode_ratio, false) + + 1); } I915_WRITE(MIPI_LP_RX_TIMEOUT(port), intel_dsi->lp_rx_timeout); I915_WRITE(MIPI_TURN_AROUND_TIMEOUT(port),