From: "Ville Syrjälä" <ville.syrjala@linux.intel.com>
To: Imre Deak <imre.deak@intel.com>
Cc: intel-gfx@lists.freedesktop.org
Subject: Re: [PATCH 15/18] drm/i915/hsw+: Add has_fuses power well attribute
Date: Tue, 11 Jul 2017 20:05:39 +0300 [thread overview]
Message-ID: <20170711170539.GC12629@intel.com> (raw)
In-Reply-To: <1499352040-8819-16-git-send-email-imre.deak@intel.com>
On Thu, Jul 06, 2017 at 05:40:37PM +0300, Imre Deak wrote:
> The pattern of a power well backing a set of fuses whose initialization
> we need to wait for during power well enabling is common to all GEN9+
> platforms. Adding support for this to the HSW power well enable helper
> allows us to use the HSW/BDW power well code for GEN9+ as well in a
> follow-up patch.
>
> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---
> drivers/gpu/drm/i915/gvt/display.c | 6 +++---
> drivers/gpu/drm/i915/i915_drv.h | 1 +
> drivers/gpu/drm/i915/i915_reg.h | 8 ++++----
> drivers/gpu/drm/i915/intel_runtime_pm.c | 34 ++++++++++++++++++++++++++-------
> 4 files changed, 35 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/gvt/display.c b/drivers/gpu/drm/i915/gvt/display.c
> index 2deb05f..13599bb 100644
> --- a/drivers/gpu/drm/i915/gvt/display.c
> +++ b/drivers/gpu/drm/i915/gvt/display.c
> @@ -178,9 +178,9 @@ static void emulate_monitor_status_change(struct intel_vgpu *vgpu)
> SDE_PORTE_HOTPLUG_SPT);
> vgpu_vreg(vgpu, SKL_FUSE_STATUS) |=
> SKL_FUSE_DOWNLOAD_STATUS |
> - SKL_FUSE_PG0_DIST_STATUS |
> - SKL_FUSE_PG1_DIST_STATUS |
> - SKL_FUSE_PG2_DIST_STATUS;
> + SKL_FUSE_PG_DIST_STATUS(0) |
> + SKL_FUSE_PG_DIST_STATUS(1) |
> + SKL_FUSE_PG_DIST_STATUS(2);
> vgpu_vreg(vgpu, LCPLL1_CTL) |=
> LCPLL_PLL_ENABLE |
> LCPLL_PLL_LOCK;
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index dc5ca5a..9e97536 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -1396,6 +1396,7 @@ struct i915_power_well {
> u32 irq_pipe_mask;
> /* The pw is backing the VGA functionality */
> bool has_vga:1;
> + bool has_fuses:1;
> } hsw;
> };
> const struct i915_power_well_ops *ops;
> diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
> index 845f50c..794d65c 100644
> --- a/drivers/gpu/drm/i915/i915_reg.h
> +++ b/drivers/gpu/drm/i915/i915_reg.h
> @@ -8023,10 +8023,10 @@ enum {
>
> /* SKL Fuse Status */
> #define SKL_FUSE_STATUS _MMIO(0x42000)
> -#define SKL_FUSE_DOWNLOAD_STATUS (1<<31)
> -#define SKL_FUSE_PG0_DIST_STATUS (1<<27)
> -#define SKL_FUSE_PG1_DIST_STATUS (1<<26)
> -#define SKL_FUSE_PG2_DIST_STATUS (1<<25)
> +#define SKL_FUSE_DOWNLOAD_STATUS (1<<31)
> +/* PG0 (HW control->no power well ID), PG1..PG2 (SKL_DISP_PW1..SKL_DISP_PW2) */
> +#define SKL_PW_TO_PG(pw) ((pw) - SKL_DISP_PW_1 + 1)
> +#define SKL_FUSE_PG_DIST_STATUS(pg) (1 << (27 - (pg)))
>
> /* Per-pipe DDI Function Control */
> #define _TRANS_DDI_FUNC_CTL_A 0x60400
> diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c
> index 14d4ff4..c204be0 100644
> --- a/drivers/gpu/drm/i915/intel_runtime_pm.c
> +++ b/drivers/gpu/drm/i915/intel_runtime_pm.c
> @@ -400,16 +400,36 @@ static void hsw_wait_for_power_well_disable(struct drm_i915_private *dev_priv,
> !!(reqs & 1), !!(reqs & 2), !!(reqs & 4), !!(reqs & 8));
> }
>
> +static void gen9_wait_for_power_well_fuses(struct drm_i915_private *dev_priv,
> + int pg)
> +{
> + /* Timeout 5us for PG#0, for other PGs 1us */
> + WARN_ON(intel_wait_for_register(dev_priv, SKL_FUSE_STATUS,
> + SKL_FUSE_PG_DIST_STATUS(pg),
> + SKL_FUSE_PG_DIST_STATUS(pg), 1));
> +}
> +
> static void hsw_power_well_enable(struct drm_i915_private *dev_priv,
> struct i915_power_well *power_well)
> {
> enum i915_power_well_id id = power_well->id;
> + bool wait_fuses = power_well->hsw.has_fuses;
> + int pg;
> u32 val;
>
> + if (wait_fuses) {
> + pg = SKL_PW_TO_PG(id);
> + if (pg == 1)
> + gen9_wait_for_power_well_fuses(dev_priv, pg - 1);
> + }
This part looks magicy. The macro adds 1, but here you have to subtract
1 when feeding it the value, which seems odd. And apparently 1 is somehow
special, but I can't tell why.
> +
> val = I915_READ(HSW_PWR_WELL_DRIVER);
> I915_WRITE(HSW_PWR_WELL_DRIVER, val | HSW_PWR_WELL_CTL_REQ(id));
> hsw_wait_for_power_well_enable(dev_priv, power_well);
>
> + if (wait_fuses)
> + gen9_wait_for_power_well_fuses(dev_priv, pg);
> +
> hsw_power_well_post_enable(dev_priv, power_well->hsw.irq_pipe_mask,
> power_well->hsw.has_vga);
> }
> @@ -810,15 +830,15 @@ static void skl_set_power_well(struct drm_i915_private *dev_priv,
> case SKL_DISP_PW_1:
> if (intel_wait_for_register(dev_priv,
> SKL_FUSE_STATUS,
> - SKL_FUSE_PG0_DIST_STATUS,
> - SKL_FUSE_PG0_DIST_STATUS,
> + SKL_FUSE_PG_DIST_STATUS(0),
> + SKL_FUSE_PG_DIST_STATUS(0),
> 1)) {
> DRM_ERROR("PG0 not enabled\n");
> return;
> }
> break;
> case SKL_DISP_PW_2:
> - if (!(fuse_status & SKL_FUSE_PG1_DIST_STATUS)) {
> + if (!(fuse_status & SKL_FUSE_PG_DIST_STATUS(1))) {
> DRM_ERROR("PG1 in disabled state\n");
> return;
> }
> @@ -863,15 +883,15 @@ static void skl_set_power_well(struct drm_i915_private *dev_priv,
> if (power_well->id == SKL_DISP_PW_1) {
> if (intel_wait_for_register(dev_priv,
> SKL_FUSE_STATUS,
> - SKL_FUSE_PG1_DIST_STATUS,
> - SKL_FUSE_PG1_DIST_STATUS,
> + SKL_FUSE_PG_DIST_STATUS(1),
> + SKL_FUSE_PG_DIST_STATUS(1),
> 1))
> DRM_ERROR("PG1 distributing status timeout\n");
> } else if (power_well->id == SKL_DISP_PW_2) {
> if (intel_wait_for_register(dev_priv,
> SKL_FUSE_STATUS,
> - SKL_FUSE_PG2_DIST_STATUS,
> - SKL_FUSE_PG2_DIST_STATUS,
> + SKL_FUSE_PG_DIST_STATUS(2),
> + SKL_FUSE_PG_DIST_STATUS(2),
> 1))
> DRM_ERROR("PG2 distributing status timeout\n");
> }
> --
> 2.7.4
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
--
Ville Syrjälä
Intel OTC
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
next prev parent reply other threads:[~2017-07-11 17:05 UTC|newest]
Thread overview: 64+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-07-06 14:40 [PATCH 00/23] drm/i915: Unify the HSW/BDW and GEN9+ power well code Imre Deak
2017-07-06 14:40 ` [PATCH 01/18] drm/i915/chv: Add unique power well ID for the pipe A power well Imre Deak
2017-07-11 16:31 ` Rodrigo Vivi
2017-07-06 14:40 ` [PATCH 02/18] drm/i915: Unify power well ID enums Imre Deak
2017-07-11 16:43 ` Rodrigo Vivi
2017-07-11 17:21 ` Rodrigo Vivi
2017-07-11 17:36 ` Imre Deak
2017-07-11 20:42 ` [PATCH v2 " Imre Deak
2017-07-06 14:40 ` [PATCH 03/18] drm/i915: Assign everywhere the always-on power well ID Imre Deak
2017-07-11 16:45 ` Rodrigo Vivi
2017-07-06 14:40 ` [PATCH 04/18] drm/i915/gen2: Add an ID for the display pipes power well Imre Deak
2017-07-11 16:50 ` Rodrigo Vivi
2017-07-11 17:01 ` Ville Syrjälä
2017-07-11 20:42 ` [PATCH v2 " Imre Deak
2017-07-06 14:40 ` [PATCH 05/18] drm/i915/hsw, bdw: Add an ID for the global display " Imre Deak
2017-07-11 17:08 ` Rodrigo Vivi
2017-07-11 20:42 ` [PATCH v2 " Imre Deak
2017-07-06 14:40 ` [PATCH 06/18] drm/i915: Check for duplicated power well IDs Imre Deak
2017-07-07 14:39 ` [PATCH v2 " Imre Deak
2017-07-11 17:08 ` Ville Syrjälä
2017-07-11 20:42 ` [PATCH v3 " Imre Deak
2017-07-20 13:08 ` Arkadiusz Hiler
2017-07-06 14:40 ` [PATCH 07/18] drm/i915/bxt, glk: Give a proper name to the power well struct phy field Imre Deak
2017-07-20 13:11 ` Arkadiusz Hiler
2017-07-06 14:40 ` [PATCH 08/18] drm/i915/gen9+: Remove redundant power well state assert during enabling Imre Deak
2017-07-21 10:53 ` Arkadiusz Hiler
2017-07-06 14:40 ` [PATCH 09/18] drm/i915/gen9+: Remove redundant state check during power well toggling Imre Deak
2017-07-21 11:14 ` Arkadiusz Hiler
2017-07-21 11:25 ` Imre Deak
2017-07-21 11:32 ` Arkadiusz Hiler
2017-07-21 13:24 ` Arkadiusz Hiler
2017-07-06 14:40 ` [PATCH 10/18] drm/i915/hsw, bdw: " Imre Deak
2017-07-21 11:39 ` Arkadiusz Hiler
2017-07-06 14:40 ` [PATCH 11/18] drm/i915/hsw, bdw: Split power well set to enable/disable helpers Imre Deak
2017-07-21 11:51 ` Arkadiusz Hiler
2017-07-06 14:40 ` [PATCH 12/18] drm/i915/hsw+: Unify the hsw/bdw and gen9+ power well req/state macros Imre Deak
2017-07-21 12:39 ` Arkadiusz Hiler
2017-07-06 14:40 ` [PATCH 13/18] drm/i915/hsw, bdw: Add irq_pipe_mask, has_vga power well attributes Imre Deak
2017-07-11 17:02 ` Ville Syrjälä
2017-07-11 20:42 ` [PATCH v2 " Imre Deak
2017-07-12 15:54 ` [PATCH v3 " Imre Deak
2017-07-21 12:50 ` Arkadiusz Hiler
2017-07-06 14:40 ` [PATCH 14/18] drm/i915/hsw, bdw: Wait for the power well disabled state Imre Deak
2017-07-21 13:00 ` Arkadiusz Hiler
2017-07-06 14:40 ` [PATCH 15/18] drm/i915/hsw+: Add has_fuses power well attribute Imre Deak
2017-07-11 17:05 ` Ville Syrjälä [this message]
2017-07-11 17:22 ` Imre Deak
2017-07-11 17:37 ` Ville Syrjälä
2017-07-11 17:49 ` Imre Deak
2017-07-11 20:42 ` [PATCH v2 " Imre Deak
2017-07-21 13:10 ` Arkadiusz Hiler
2017-07-06 14:40 ` [PATCH 16/18] drm/i915/gen9+: Unify the HSW/BDW and GEN9+ power well helpers Imre Deak
2017-07-11 20:42 ` [PATCH v2 " Imre Deak
2017-07-21 13:22 ` Arkadiusz Hiler
2017-07-06 14:40 ` [PATCH 17/18] drm/i915: Move hsw_power_well_enable() next to the rest of HSW helpers Imre Deak
2017-07-21 13:29 ` Arkadiusz Hiler
2017-07-06 14:40 ` [PATCH 18/18] drm/i915: Gather all the power well->domain mappings to one place Imre Deak
2017-07-21 13:39 ` Arkadiusz Hiler
2017-07-06 15:51 ` ✓ Fi.CI.BAT: success for drm/i915: Unify the HSW/BDW and GEN9+ power well code Patchwork
2017-07-07 14:59 ` ✓ Fi.CI.BAT: success for drm/i915: Unify the HSW/BDW and GEN9+ power well code (rev2) Patchwork
2017-07-11 21:01 ` ✗ Fi.CI.BAT: warning for drm/i915: Unify the HSW/BDW and GEN9+ power well code (rev8) Patchwork
2017-07-12 16:17 ` ✗ Fi.CI.BAT: failure for drm/i915: Unify the HSW/BDW and GEN9+ power well code (rev9) Patchwork
2017-07-12 17:17 ` Imre Deak
2017-07-24 14:32 ` Imre Deak
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170711170539.GC12629@intel.com \
--to=ville.syrjala@linux.intel.com \
--cc=imre.deak@intel.com \
--cc=intel-gfx@lists.freedesktop.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.