|
@@ -30,7 +30,8 @@
|
|
#include "i915_trace.h"
|
|
#include "i915_trace.h"
|
|
#include "intel_drv.h"
|
|
#include "intel_drv.h"
|
|
|
|
|
|
-static void gen8_setup_private_ppat(struct drm_i915_private *dev_priv);
|
|
|
|
|
|
+static void bdw_setup_private_ppat(struct drm_i915_private *dev_priv);
|
|
|
|
+static void chv_setup_private_ppat(struct drm_i915_private *dev_priv);
|
|
|
|
|
|
bool intel_enable_ppgtt(struct drm_device *dev, bool full)
|
|
bool intel_enable_ppgtt(struct drm_device *dev, bool full)
|
|
{
|
|
{
|
|
@@ -1325,7 +1326,11 @@ void i915_gem_restore_gtt_mappings(struct drm_device *dev)
|
|
|
|
|
|
|
|
|
|
if (INTEL_INFO(dev)->gen >= 8) {
|
|
if (INTEL_INFO(dev)->gen >= 8) {
|
|
- gen8_setup_private_ppat(dev_priv);
|
|
|
|
|
|
+ if (IS_CHERRYVIEW(dev))
|
|
|
|
+ chv_setup_private_ppat(dev_priv);
|
|
|
|
+ else
|
|
|
|
+ bdw_setup_private_ppat(dev_priv);
|
|
|
|
+
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1797,7 +1802,7 @@ static int ggtt_probe_common(struct drm_device *dev,
|
|
/* The GGTT and PPGTT need a private PPAT setup in order to handle cacheability
|
|
/* The GGTT and PPGTT need a private PPAT setup in order to handle cacheability
|
|
* bits. When using advanced contexts each context stores its own PAT, but
|
|
* bits. When using advanced contexts each context stores its own PAT, but
|
|
* writing this data shouldn't be harmful even in those cases. */
|
|
* writing this data shouldn't be harmful even in those cases. */
|
|
-static void gen8_setup_private_ppat(struct drm_i915_private *dev_priv)
|
|
|
|
|
|
+static void bdw_setup_private_ppat(struct drm_i915_private *dev_priv)
|
|
{
|
|
{
|
|
uint64_t pat;
|
|
uint64_t pat;
|
|
|
|
|
|
@@ -1816,6 +1821,33 @@ static void gen8_setup_private_ppat(struct drm_i915_private *dev_priv)
|
|
I915_WRITE(GEN8_PRIVATE_PAT + 4, pat >> 32);
|
|
I915_WRITE(GEN8_PRIVATE_PAT + 4, pat >> 32);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static void chv_setup_private_ppat(struct drm_i915_private *dev_priv)
|
|
|
|
+{
|
|
|
|
+ uint64_t pat;
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Map WB on BDW to snooped on CHV.
|
|
|
|
+ *
|
|
|
|
+ * Only the snoop bit has meaning for CHV, the rest is
|
|
|
|
+ * ignored.
|
|
|
|
+ *
|
|
|
|
+ * Note that the harware enforces snooping for all page
|
|
|
|
+ * table accesses. The snoop bit is actually ignored for
|
|
|
|
+ * PDEs.
|
|
|
|
+ */
|
|
|
|
+ pat = GEN8_PPAT(0, CHV_PPAT_SNOOP) |
|
|
|
|
+ GEN8_PPAT(1, 0) |
|
|
|
|
+ GEN8_PPAT(2, 0) |
|
|
|
|
+ GEN8_PPAT(3, 0) |
|
|
|
|
+ GEN8_PPAT(4, CHV_PPAT_SNOOP) |
|
|
|
|
+ GEN8_PPAT(5, CHV_PPAT_SNOOP) |
|
|
|
|
+ GEN8_PPAT(6, CHV_PPAT_SNOOP) |
|
|
|
|
+ GEN8_PPAT(7, CHV_PPAT_SNOOP);
|
|
|
|
+
|
|
|
|
+ I915_WRITE(GEN8_PRIVATE_PAT, pat);
|
|
|
|
+ I915_WRITE(GEN8_PRIVATE_PAT + 4, pat >> 32);
|
|
|
|
+}
|
|
|
|
+
|
|
static int gen8_gmch_probe(struct drm_device *dev,
|
|
static int gen8_gmch_probe(struct drm_device *dev,
|
|
size_t *gtt_total,
|
|
size_t *gtt_total,
|
|
size_t *stolen,
|
|
size_t *stolen,
|
|
@@ -1841,7 +1873,10 @@ static int gen8_gmch_probe(struct drm_device *dev,
|
|
gtt_size = gen8_get_total_gtt_size(snb_gmch_ctl);
|
|
gtt_size = gen8_get_total_gtt_size(snb_gmch_ctl);
|
|
*gtt_total = (gtt_size / sizeof(gen8_gtt_pte_t)) << PAGE_SHIFT;
|
|
*gtt_total = (gtt_size / sizeof(gen8_gtt_pte_t)) << PAGE_SHIFT;
|
|
|
|
|
|
- gen8_setup_private_ppat(dev_priv);
|
|
|
|
|
|
+ if (IS_CHERRYVIEW(dev))
|
|
|
|
+ chv_setup_private_ppat(dev_priv);
|
|
|
|
+ else
|
|
|
|
+ bdw_setup_private_ppat(dev_priv);
|
|
|
|
|
|
ret = ggtt_probe_common(dev, gtt_size);
|
|
ret = ggtt_probe_common(dev, gtt_size);
|
|
|
|
|