[PATCH] drm/i915: Reserve powerctx for chv from the stolen allocator
Chris Wilson
chris at chris-wilson.co.uk
Sat Nov 4 21:00:18 UTC 2017
Ensure that we do not overwrite the cherryview power context by
reserving its range in the stolen allocator; exactly like how we handle
the same reservation for valleyview.
Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
Cc: Mika Kuoppala <mika.kuoppala at linux.intel.com>
---
drivers/gpu/drm/i915/i915_drv.h | 3 +--
drivers/gpu/drm/i915/intel_pm.c | 50 ++++++++++++++++++-----------------------
2 files changed, 23 insertions(+), 30 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 72bb5b51035a..d6462388c3a6 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -1377,6 +1377,7 @@ struct intel_rps {
};
struct intel_rc6 {
+ struct drm_i915_gem_object *pctx;
bool enabled;
};
@@ -2464,8 +2465,6 @@ struct drm_i915_private {
struct i915_gpu_error gpu_error;
- struct drm_i915_gem_object *vlv_pctx;
-
/* list of fbdev register on this device */
struct intel_fbdev *fbdev;
struct work_struct fbdev_suspend_work;
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 07118c0b69d3..ad81bc16a390 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -7034,7 +7034,7 @@ static void valleyview_check_pctx(struct drm_i915_private *dev_priv)
unsigned long pctx_addr = I915_READ(VLV_PCBR) & ~4095;
WARN_ON(pctx_addr != dev_priv->mm.stolen_base +
- dev_priv->vlv_pctx->stolen->start);
+ dev_priv->gt_pm.rc6.pctx->stolen->start);
}
@@ -7049,21 +7049,26 @@ static void cherryview_check_pctx(struct drm_i915_private *dev_priv)
static void cherryview_setup_pctx(struct drm_i915_private *dev_priv)
{
struct i915_ggtt *ggtt = &dev_priv->ggtt;
- unsigned long pctx_paddr, paddr;
- u32 pcbr;
- int pctx_size = 32*1024;
+ const int pctx_size = 32*1024;
+ u32 pcbr, addr, end;
pcbr = I915_READ(VLV_PCBR);
- if ((pcbr >> VLV_PCBR_ADDR_SHIFT) == 0) {
+ addr = pcbr >> VLV_PCBR_ADDR_SHIFT << VLV_PCBR_ADDR_SHIFT;
+ if (addr == 0) {
DRM_DEBUG_DRIVER("BIOS didn't set up PCBR, fixing up\n");
- paddr = (dev_priv->mm.stolen_base +
- (ggtt->stolen_size - pctx_size));
-
- pctx_paddr = (paddr & (~4095));
- I915_WRITE(VLV_PCBR, pctx_paddr);
+ addr = dev_priv->mm.stolen_base +
+ (ggtt->stolen_size - pctx_size);
+ I915_WRITE(VLV_PCBR, addr & -4096);
}
-
DRM_DEBUG_DRIVER("PCBR: 0x%08x\n", I915_READ(VLV_PCBR));
+
+ end = round_up(addr + pctx_size, 4096);
+ addr = round_down(addr, 4096);
+ dev_priv->gt_pm.rc6.pctx =
+ i915_gem_object_create_stolen_for_preallocated(dev_priv,
+ addr - dev_priv->mm.stolen_base,
+ I915_GTT_OFFSET_NONE,
+ end - addr);
}
static void valleyview_setup_pctx(struct drm_i915_private *dev_priv)
@@ -7107,16 +7112,7 @@ static void valleyview_setup_pctx(struct drm_i915_private *dev_priv)
out:
DRM_DEBUG_DRIVER("PCBR: 0x%08x\n", I915_READ(VLV_PCBR));
- dev_priv->vlv_pctx = pctx;
-}
-
-static void valleyview_cleanup_pctx(struct drm_i915_private *dev_priv)
-{
- if (WARN_ON(!dev_priv->vlv_pctx))
- return;
-
- i915_gem_object_put(dev_priv->vlv_pctx);
- dev_priv->vlv_pctx = NULL;
+ dev_priv->gt_pm.rc6.pctx = pctx;
}
static void vlv_init_gpll_ref_freq(struct drm_i915_private *dev_priv)
@@ -7225,11 +7221,6 @@ static void cherryview_init_gt_powersave(struct drm_i915_private *dev_priv)
"Odd GPU freq values\n");
}
-static void valleyview_cleanup_gt_powersave(struct drm_i915_private *dev_priv)
-{
- valleyview_cleanup_pctx(dev_priv);
-}
-
static void cherryview_enable_rc6(struct drm_i915_private *dev_priv)
{
struct intel_engine_cs *engine;
@@ -7949,8 +7940,11 @@ void intel_init_gt_powersave(struct drm_i915_private *dev_priv)
void intel_cleanup_gt_powersave(struct drm_i915_private *dev_priv)
{
- if (IS_VALLEYVIEW(dev_priv))
- valleyview_cleanup_gt_powersave(dev_priv);
+ struct drm_i915_gem_object *pctx;
+
+ pctx = fetch_and_zero(&dev_priv->gt_pm.rc6.pctx);
+ if (pctx)
+ i915_gem_object_put(pctx);
if (!i915_modparams.enable_rc6)
intel_runtime_pm_put(dev_priv);
--
2.15.0
More information about the Intel-gfx-trybot
mailing list