From patchwork Fri Jan 17 21:16:57 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jesse Barnes X-Patchwork-Id: 3507521 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.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 547839F2E9 for ; Fri, 17 Jan 2014 21:23:59 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 478362017D for ; Fri, 17 Jan 2014 21:23:58 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id 5B6B12017B for ; Fri, 17 Jan 2014 21:23:57 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id C854DFBEBF; Fri, 17 Jan 2014 13:23:54 -0800 (PST) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org X-Greylist: delayed 396 seconds by postgrey-1.32 at gabe; Fri, 17 Jan 2014 13:23:52 PST Received: from oproxy13-pub.mail.unifiedlayer.com (oproxy13-pub.mail.unifiedlayer.com [69.89.16.30]) by gabe.freedesktop.org (Postfix) with SMTP id F2ECFFC64E for ; Fri, 17 Jan 2014 13:23:52 -0800 (PST) Received: (qmail 29472 invoked by uid 0); 18 Jan 2014 04:17:11 -0000 Received: from unknown (HELO box514.bluehost.com) (74.220.219.114) by oproxy13.mail.unifiedlayer.com with SMTP; 18 Jan 2014 04:17:11 -0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=virtuousgeek.org; s=default; h=References:In-Reply-To:Message-Id:Date:Subject:To:From; bh=sIBu5F704e4WffOMJAuGengskFdt0Iz0CaPDX5w1ZKw=; b=iT/eJL9U0J4DosNhuM2ijB6DRWyr4dqN5bYvXWsqKFkw3sMQzqp89UZWZR9P2K3LVnDYCX7QAC32Yz45e2c+3Vvab5Rm08EAt+ho/ckYMwkTDvrZUsSF0ajTs6ERqHRQ; Received: from [67.161.37.189] (port=48332 helo=localhost.localdomain) by box514.bluehost.com with esmtpsa (UNKNOWN:CAMELLIA256-SHA:256) (Exim 4.80) (envelope-from ) id 1W4Gmu-0001QH-G0 for intel-gfx@lists.freedesktop.org; Fri, 17 Jan 2014 14:17:12 -0700 From: Jesse Barnes To: intel-gfx@lists.freedesktop.org Date: Fri, 17 Jan 2014 13:16:57 -0800 Message-Id: <1389993418-2133-2-git-send-email-jbarnes@virtuousgeek.org> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1389993418-2133-1-git-send-email-jbarnes@virtuousgeek.org> References: <1389993418-2133-1-git-send-email-jbarnes@virtuousgeek.org> X-Identified-User: {10642:box514.bluehost.com:virtuous:virtuousgeek.org} {sentby:smtp auth 67.161.37.189 authed with jbarnes@virtuousgeek.org} Subject: [Intel-gfx] [PATCH 2/3] drm/i915: clock readout support for DDI X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: intel-gfx-bounces@lists.freedesktop.org Errors-To: intel-gfx-bounces@lists.freedesktop.org X-Spam-Status: No, score=-3.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_BL_SPAMCOP_NET, RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD, T_DKIM_INVALID, UNPARSEABLE_RELAY autolearn=ham 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 Read out and calculate the port and pixel clocks on DDI configs as well. This means we have to grab the DP divider values and look at the port mapping to figure out which clock select reg to read out. Signed-off-by: Jesse Barnes --- drivers/gpu/drm/i915/i915_reg.h | 6 ++++ drivers/gpu/drm/i915/intel_ddi.c | 2 +- drivers/gpu/drm/i915/intel_display.c | 69 +++++++++++++++++++++++++++++++++++- drivers/gpu/drm/i915/intel_drv.h | 1 + 4 files changed, 76 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index a699efd..644e4f9 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h @@ -5318,8 +5318,13 @@ #define WRPLL_PLL_SELECT_LCPLL_2700 (0x03<<28) /* WRPLL divider programming */ #define WRPLL_DIVIDER_REFERENCE(x) ((x)<<0) +#define WRPLL_DIVIDER_REF_MASK (0xff) #define WRPLL_DIVIDER_POST(x) ((x)<<8) +#define WRPLL_DIVIDER_POST_MASK (0x3f<<8) +#define WRPLL_DIVIDER_POST_SHIFT 8 #define WRPLL_DIVIDER_FEEDBACK(x) ((x)<<16) +#define WRPLL_DIVIDER_FB_SHIFT 16 +#define WRPLL_DIVIDER_FB_MASK (0xff<<16) /* Port clock selection */ #define PORT_CLK_SEL_A 0x46100 @@ -5332,6 +5337,7 @@ #define PORT_CLK_SEL_WRPLL1 (4<<29) #define PORT_CLK_SEL_WRPLL2 (5<<29) #define PORT_CLK_SEL_NONE (7<<29) +#define PORT_CLK_SEL_MASK (7<<29) /* Transcoder clock selection */ #define TRANS_CLK_SEL_A 0x46140 diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c index 1488b28..f3d7b42 100644 --- a/drivers/gpu/drm/i915/intel_ddi.c +++ b/drivers/gpu/drm/i915/intel_ddi.c @@ -413,7 +413,7 @@ static void intel_ddi_mode_set(struct intel_encoder *encoder) } } -static struct intel_encoder * +struct intel_encoder * intel_ddi_get_crtc_encoder(struct drm_crtc *crtc) { struct drm_device *dev = crtc->dev; diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 92f46ad..7a9ff57 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c @@ -48,6 +48,8 @@ static void i9xx_crtc_clock_get(struct intel_crtc *crtc, struct intel_crtc_config *pipe_config); static void ironlake_pch_clock_get(struct intel_crtc *crtc, struct intel_crtc_config *pipe_config); +static void haswell_ddi_clock_get(struct intel_crtc *crtc, + struct intel_crtc_config *pipe_config); static int intel_set_mode(struct drm_crtc *crtc, struct drm_display_mode *mode, int x, int y, struct drm_framebuffer *old_fb); @@ -6994,10 +6996,13 @@ static bool haswell_get_pipe_config(struct intel_crtc *crtc, tmp = I915_READ(FDI_RX_CTL(PIPE_A)); pipe_config->fdi_lanes = ((FDI_DP_PORT_WIDTH_MASK & tmp) >> FDI_DP_PORT_WIDTH_SHIFT) + 1; - ironlake_get_fdi_m_n_config(crtc, pipe_config); } + intel_cpu_transcoder_get_m_n(crtc, pipe_config->cpu_transcoder, + &pipe_config->dp_m_n); + haswell_ddi_clock_get(crtc, pipe_config); + intel_get_pipe_timings(crtc, pipe_config); pfit_domain = POWER_DOMAIN_PIPE_PANEL_FITTER(crtc->pipe); @@ -8034,6 +8039,68 @@ static void ironlake_pch_clock_get(struct intel_crtc *crtc, &pipe_config->fdi_m_n); } +#define LC_FREQ 2700 + +static int intel_ddi_calc_wrpll_link(u32 wrpll) +{ + int n, p, r; + + r = wrpll & WRPLL_DIVIDER_REF_MASK; + p = (wrpll & WRPLL_DIVIDER_POST_MASK) >> WRPLL_DIVIDER_POST_SHIFT; + n = (wrpll & WRPLL_DIVIDER_FB_MASK) >> WRPLL_DIVIDER_FB_SHIFT; + + return (LC_FREQ * n) / (p * r); +} + +static void haswell_ddi_clock_get(struct intel_crtc *crtc, + struct intel_crtc_config *pipe_config) +{ + struct intel_encoder *intel_encoder = + intel_ddi_get_crtc_encoder(&crtc->base); + struct drm_i915_private *dev_priv = crtc->base.dev->dev_private; + enum port port = intel_ddi_get_encoder_port(intel_encoder); + int link_clock; + u32 val, pll; + + val = I915_READ(PORT_CLK_SEL(port)); + switch (val & PORT_CLK_SEL_MASK) { + case PORT_CLK_SEL_LCPLL_810: + link_clock = 81000; + break; + case PORT_CLK_SEL_LCPLL_1350: + link_clock = 135000; + break; + case PORT_CLK_SEL_LCPLL_2700: + link_clock = 270000; + break; + case PORT_CLK_SEL_WRPLL1: + pll = I915_READ(WRPLL_CTL1); + link_clock = intel_ddi_calc_wrpll_link(pll); + break; + case PORT_CLK_SEL_WRPLL2: + pll = I915_READ(WRPLL_CTL2); + link_clock = intel_ddi_calc_wrpll_link(pll); + break; + case PORT_CLK_SEL_SPLL: + link_clock = 135000; + break; + default: + WARN(1, "bad port clock sel\n"); + return; + } + + if (crtc->config.has_pch_encoder) + pipe_config->adjusted_mode.crtc_clock = + intel_dotclock_calculate(link_clock, &pipe_config->fdi_m_n); + else + pipe_config->adjusted_mode.crtc_clock = + intel_dotclock_calculate(link_clock, &pipe_config->dp_m_n); + + pipe_config->port_clock = link_clock * 2; + pipe_config->adjusted_mode.crtc_clock *= 2; + +} + /** Returns the currently programmed mode of the given pipe. */ struct drm_display_mode *intel_crtc_mode_get(struct drm_device *dev, struct drm_crtc *crtc) diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index 46aea6c..7bfc19a 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h @@ -604,6 +604,7 @@ void intel_prepare_ddi(struct drm_device *dev); void hsw_fdi_link_train(struct drm_crtc *crtc); void intel_ddi_init(struct drm_device *dev, enum port port); enum port intel_ddi_get_encoder_port(struct intel_encoder *intel_encoder); +struct intel_encoder *intel_ddi_get_crtc_encoder(struct drm_crtc *crtc); bool intel_ddi_get_hw_state(struct intel_encoder *encoder, enum pipe *pipe); int intel_ddi_get_cdclk_freq(struct drm_i915_private *dev_priv); void intel_ddi_pll_init(struct drm_device *dev);