Re: [PATCH 53/89] drm/i915/skl: Gen9 Forcewake

Mika Kuoppala
2014-09-10T13:44:46Z

Damien Lespiau <damien.lespiau@intel.com> writes:

> From: Zhe Wang <zhe1.wang@intel.com>
>
> Implement common forcewake functions shared by Gen9 features.
>
> Signed-off-by: Zhe Wang <zhe1.wang@intel.com>
> Signed-off-by: Damien Lespiau <damien.lespiau@intel.com>
> ---
> drivers/gpu/drm/i915/i915_drv.h | 5 +-
> drivers/gpu/drm/i915/i915_reg.h | 6 ++
> drivers/gpu/drm/i915/intel_uncore.c | 175 +++++++++++++++++++++++++++++++++++-
> 3 files changed, 184 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index 9b0e398..84defa4 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -535,6 +535,7 @@ struct intel_uncore {
>
> unsigned fw_rendercount;
> unsigned fw_mediacount;
> + unsigned fw_blittercount;
>
> struct timer_list force_wake_timer;
> };
> @@ -2950,7 +2951,9 @@ int vlv_freq_opcode(struct drm_i915_private *dev_priv, int val);
>
> #define FORCEWAKE_RENDER (1 << 0)
> #define FORCEWAKE_MEDIA (1 << 1)
> -#define FORCEWAKE_ALL (FORCEWAKE_RENDER | FORCEWAKE_MEDIA)
> +#define FORCEWAKE_BLITTER (1 << 2)
> +#define FORCEWAKE_ALL (FORCEWAKE_RENDER | FORCEWAKE_MEDIA | \
> + FORCEWAKE_BLITTER)
>
>
> #define I915_READ8(reg) dev_priv->uncore.funcs.mmio_readb(dev_priv, (reg), true)
> diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
> index 414c2a5..417075d 100644
> --- a/drivers/gpu/drm/i915/i915_reg.h
> +++ b/drivers/gpu/drm/i915/i915_reg.h
> @@ -5738,6 +5738,12 @@ enum punit_power_well {
> #define VLV_GTLC_PW_MEDIA_STATUS_MASK (1 << 5)
> #define VLV_GTLC_PW_RENDER_STATUS_MASK (1 << 7)
> #define FORCEWAKE_MT 0xa188 /* multi-threaded */
> +#define FORCEWAKE_MEDIA_GEN9 0xa270
> +#define FORCEWAKE_RENDER_GEN9 0xa278
> +#define FORCEWAKE_BLITTER_GEN9 0xa188
> +#define FORCEWAKE_ACK_MEDIA_GEN9 0x0D88
> +#define FORCEWAKE_ACK_RENDER_GEN9 0x0D84
> +#define FORCEWAKE_ACK_BLITTER_GEN9 0x130044
> #define FORCEWAKE_KERNEL 0x1
> #define FORCEWAKE_USER 0x2
> #define FORCEWAKE_MT_ACK 0x130040
> diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c
> index 3b27fb0..7b7fc9e 100644
> --- a/drivers/gpu/drm/i915/intel_uncore.c
> +++ b/drivers/gpu/drm/i915/intel_uncore.c
> @@ -299,6 +299,154 @@ static void vlv_force_wake_put(struct drm_i915_private *dev_priv, int fw_engine)
> spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
> }
>
> +static void __gen9_gt_force_wake_mt_reset(struct drm_i915_private *dev_priv)
> +{
> + __raw_i915_write32(dev_priv, FORCEWAKE_RENDER_GEN9,
> + _MASKED_BIT_DISABLE(0xffff));
> +
> + __raw_i915_write32(dev_priv, FORCEWAKE_MEDIA_GEN9,
> + _MASKED_BIT_DISABLE(0xffff));
> +
> + __raw_i915_write32(dev_priv, FORCEWAKE_BLITTER_GEN9,
> + _MASKED_BIT_DISABLE(0xffff));
> +}
> +
> +static void __gen9_force_wake_get(struct drm_i915_private *dev_priv,
> + int fw_engine)
> +{
> + /* Check for Render Engine */
> + if (FORCEWAKE_RENDER & fw_engine) {
> + if (wait_for_atomic((__raw_i915_read32(dev_priv,
> + FORCEWAKE_ACK_RENDER_GEN9) &
> + FORCEWAKE_KERNEL) == 0,
> + FORCEWAKE_ACK_TIMEOUT_MS))
> + DRM_ERROR("Timed out: Render forcewake old ack to clear.\n");
> +
> + __raw_i915_write32(dev_priv, FORCEWAKE_RENDER_GEN9,
> + _MASKED_BIT_ENABLE(FORCEWAKE_KERNEL));
> +
> + if (wait_for_atomic((__raw_i915_read32(dev_priv,
> + FORCEWAKE_ACK_RENDER_GEN9) &
> + FORCEWAKE_KERNEL),
> + FORCEWAKE_ACK_TIMEOUT_MS))
> + DRM_ERROR("Timed out: waiting for Render to ack.\n");
> + }
> +
> + /* Check for Media Engine */
> + if (FORCEWAKE_MEDIA & fw_engine) {
> + if (wait_for_atomic((__raw_i915_read32(dev_priv,
> + FORCEWAKE_ACK_MEDIA_GEN9) &
> + FORCEWAKE_KERNEL) == 0,
> + FORCEWAKE_ACK_TIMEOUT_MS))
> + DRM_ERROR("Timed out: Media forcewake old ack to clear.\n");
> +
> + __raw_i915_write32(dev_priv, FORCEWAKE_MEDIA_GEN9,
> + _MASKED_BIT_ENABLE(FORCEWAKE_KERNEL));
> +
> + if (wait_for_atomic((__raw_i915_read32(dev_priv,
> + FORCEWAKE_ACK_MEDIA_GEN9) &
> + FORCEWAKE_KERNEL),
> + FORCEWAKE_ACK_TIMEOUT_MS))
> + DRM_ERROR("Timed out: waiting for Media to ack.\n");
> + }
> +
> + /* Check for Blitter Engine */
> + if (FORCEWAKE_BLITTER & fw_engine) {
> + if (wait_for_atomic((__raw_i915_read32(dev_priv,
> + FORCEWAKE_ACK_BLITTER_GEN9) &
> + FORCEWAKE_KERNEL) == 0,
> + FORCEWAKE_ACK_TIMEOUT_MS))
> + DRM_ERROR("Timed out: Blitter forcewake old ack to clear.\n");
> +
> + __raw_i915_write32(dev_priv, FORCEWAKE_BLITTER_GEN9,
> + _MASKED_BIT_ENABLE(FORCEWAKE_KERNEL));
> +
> + if (wait_for_atomic((__raw_i915_read32(dev_priv,
> + FORCEWAKE_ACK_BLITTER_GEN9) &
> + FORCEWAKE_KERNEL),
> + FORCEWAKE_ACK_TIMEOUT_MS))
> + DRM_ERROR("Timed out: waiting for Blitter to ack.\n");
> + }
> +}
> +
> +static void __gen9_force_wake_put(struct drm_i915_private *dev_priv,
> + int fw_engine)
> +{
> + /* Check for Render Engine */
> + if (FORCEWAKE_RENDER & fw_engine)
> + __raw_i915_write32(dev_priv, FORCEWAKE_RENDER_GEN9,
> + _MASKED_BIT_DISABLE(FORCEWAKE_KERNEL));
> +
> + /* Check for Media Engine */
> + if (FORCEWAKE_MEDIA & fw_engine)
> + __raw_i915_write32(dev_priv, FORCEWAKE_MEDIA_GEN9,
> + _MASKED_BIT_DISABLE(FORCEWAKE_KERNEL));
> +
> + /* Check for Blitter Engine */
> + if (FORCEWAKE_BLITTER & fw_engine)
> + __raw_i915_write32(dev_priv, FORCEWAKE_BLITTER_GEN9,
> + _MASKED_BIT_DISABLE(FORCEWAKE_KERNEL));
> +}
> +
> +void gen9_force_wake_get(struct drm_i915_private *dev_priv,
> + int fw_engine)

static missing

> +{
> + unsigned long irqflags;
> +
> + spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
> +
> + if (FORCEWAKE_RENDER & fw_engine) {
> + if (dev_priv->uncore.fw_rendercount++ == 0)
> + dev_priv->uncore.funcs.force_wake_get(dev_priv,
> + FORCEWAKE_RENDER);
> + }
> +
> + if (FORCEWAKE_MEDIA & fw_engine) {
> + if (dev_priv->uncore.fw_mediacount++ == 0)
> + dev_priv->uncore.funcs.force_wake_get(dev_priv,
> + FORCEWAKE_MEDIA);
> + }
> +
> + if (FORCEWAKE_BLITTER & fw_engine) {
> + if (dev_priv->uncore.fw_blittercount++ == 0)
> + dev_priv->uncore.funcs.force_wake_get(dev_priv,
> + FORCEWAKE_BLITTER);
> + }
> +
> + spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
> +}
> +
> +void gen9_force_wake_put(struct drm_i915_private *dev_priv,
> + int fw_engine)

static missing

above statics added it is:

Reviewed-by: Mika Kuoppala <mika.kuoppala@intel.com>

> +{
> + unsigned long irqflags;
> +
> + spin_lock_irqsave(&dev_priv->uncore.lock, irqflags);
> +
> + if (FORCEWAKE_RENDER & fw_engine) {
> + WARN_ON(dev_priv->uncore.fw_rendercount == 0);
> + if (--dev_priv->uncore.fw_rendercount == 0)
> + dev_priv->uncore.funcs.force_wake_put(dev_priv,
> + FORCEWAKE_RENDER);
> + }
> +
> + if (FORCEWAKE_MEDIA & fw_engine) {
> + WARN_ON(dev_priv->uncore.fw_mediacount == 0);
> + if (--dev_priv->uncore.fw_mediacount == 0)
> + dev_priv->uncore.funcs.force_wake_put(dev_priv,
> + FORCEWAKE_MEDIA);
> + }
> +
> + if (FORCEWAKE_BLITTER & fw_engine) {
> + WARN_ON(dev_priv->uncore.fw_blittercount == 0);
> + if (--dev_priv->uncore.fw_blittercount == 0)
> + dev_priv->uncore.funcs.force_wake_put(dev_priv,
> + FORCEWAKE_BLITTER);
> + }
> +
> + spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);
> +}
> +
> static void gen6_force_wake_timer(unsigned long arg)
> {
> struct drm_i915_private *dev_priv = (void *)arg;
> @@ -337,6 +485,9 @@ void intel_uncore_forcewake_reset(struct drm_device *dev, bool restore)
> if (IS_IVYBRIDGE(dev) || IS_HASWELL(dev) || IS_BROADWELL(dev))
> __gen7_gt_force_wake_mt_reset(dev_priv);
>
> + if (IS_GEN9(dev))
> + __gen9_gt_force_wake_mt_reset(dev_priv);
> +
> if (restore) { /* If reset with a user forcewake, try to restore */
> unsigned fw = 0;
>
> @@ -346,6 +497,15 @@ void intel_uncore_forcewake_reset(struct drm_device *dev, bool restore)
>
> if (dev_priv->uncore.fw_mediacount)
> fw |= FORCEWAKE_MEDIA;
> + } else if (IS_GEN9(dev)) {
> + if (dev_priv->uncore.fw_rendercount)
> + fw |= FORCEWAKE_RENDER;
> +
> + if (dev_priv->uncore.fw_mediacount)
> + fw |= FORCEWAKE_MEDIA;
> +
> + if (dev_priv->uncore.fw_blittercount)
> + fw |= FORCEWAKE_BLITTER;
> } else {
> if (dev_priv->uncore.forcewake_count)
> fw = FORCEWAKE_ALL;
> @@ -410,6 +570,10 @@ void gen6_gt_force_wake_get(struct drm_i915_private *dev_priv, int fw_engine)
>
> intel_runtime_pm_get(dev_priv);
>
> + /* Redirect to Gen9 specific routine */
> + if (IS_GEN9(dev_priv->dev))
> + return gen9_force_wake_get(dev_priv, fw_engine);
> +
> /* Redirect to VLV specific routine */
> if (IS_VALLEYVIEW(dev_priv->dev))
> return vlv_force_wake_get(dev_priv, fw_engine);
> @@ -431,6 +595,12 @@ void gen6_gt_force_wake_put(struct drm_i915_private *dev_priv, int fw_engine)
> if (!dev_priv->uncore.funcs.force_wake_put)
> return;
>
> + /* Redirect to Gen9 specific routine */
> + if (IS_GEN9(dev_priv->dev)) {
> + gen9_force_wake_put(dev_priv, fw_engine);
> + goto out;
> + }
> +
> /* Redirect to VLV specific routine */
> if (IS_VALLEYVIEW(dev_priv->dev)) {
> vlv_force_wake_put(dev_priv, fw_engine);
> @@ -835,7 +1005,10 @@ void intel_uncore_init(struct drm_device *dev)
>
> intel_uncore_early_sanitize(dev, false);
>
> - if (IS_VALLEYVIEW(dev)) {
> + if (IS_GEN9(dev)) {
> + dev_priv->uncore.funcs.force_wake_get = __gen9_force_wake_get;
> + dev_priv->uncore.funcs.force_wake_put = __gen9_force_wake_put;
> + } else if (IS_VALLEYVIEW(dev)) {
> dev_priv->uncore.funcs.force_wake_get = __vlv_force_wake_get;
> dev_priv->uncore.funcs.force_wake_put = __vlv_force_wake_put;
> } else if (IS_HASWELL(dev) || IS_BROADWELL(dev)) {
> --
> 1.8.3.1
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx