| From 76889de98ca867d2bb10c1296e802290889658fd Mon Sep 17 00:00:00 2001 |
| From: Kenneth Graunke <kenneth@whitecape.org> |
| Date: Mon, 22 Apr 2013 00:53:51 -0700 |
| Subject: drm/i915: Split out Haswell code from gen6_pte_encode. |
| |
| Now that we have function pointers, it's cleaner to just create a new |
| per-platform PTE encoding function. |
| |
| This should be identical in behavior to the previous code. |
| |
| v2: Drop accidental inline keyword on hsw_pte_encode. |
| |
| Signed-off-by: Kenneth Graunke <kenneth@whitecape.org> |
| Reviewed-by: Jani Nikula <jani.nikula@intel.com> |
| Tested-by: Daniel Leung <daniel.leung@linux.intel.com> [v1] |
| Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> |
| (cherry picked from commit 9119708cd484923bbc45fa60740bff58b358b848) |
| Signed-off-by: Darren Hart <dvhart@linux.intel.com> |
| --- |
| drivers/gpu/drm/i915/i915_gem_gtt.c | 32 +++++++++++++++++++++----------- |
| 1 file changed, 21 insertions(+), 11 deletions(-) |
| |
| diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c |
| index 4241c9697fe3..de6e7c54ea56 100644 |
| --- a/drivers/gpu/drm/i915/i915_gem_gtt.c |
| +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c |
| @@ -51,20 +51,13 @@ static gen6_gtt_pte_t gen6_pte_encode(struct drm_device *dev, |
| |
| switch (level) { |
| case I915_CACHE_LLC_MLC: |
| - /* Haswell doesn't set L3 this way */ |
| - if (IS_HASWELL(dev)) |
| - pte |= GEN6_PTE_CACHE_LLC; |
| - else |
| - pte |= GEN6_PTE_CACHE_LLC_MLC; |
| + pte |= GEN6_PTE_CACHE_LLC_MLC; |
| break; |
| case I915_CACHE_LLC: |
| pte |= GEN6_PTE_CACHE_LLC; |
| break; |
| case I915_CACHE_NONE: |
| - if (IS_HASWELL(dev)) |
| - pte |= HSW_PTE_UNCACHED; |
| - else |
| - pte |= GEN6_PTE_UNCACHED; |
| + pte |= GEN6_PTE_UNCACHED; |
| break; |
| default: |
| BUG(); |
| @@ -94,6 +87,19 @@ static gen6_gtt_pte_t byt_pte_encode(struct drm_device *dev, |
| return pte; |
| } |
| |
| +static gen6_gtt_pte_t hsw_pte_encode(struct drm_device *dev, |
| + dma_addr_t addr, |
| + enum i915_cache_level level) |
| +{ |
| + gen6_gtt_pte_t pte = GEN6_PTE_VALID; |
| + pte |= GEN6_PTE_ADDR_ENCODE(addr); |
| + |
| + if (level != I915_CACHE_NONE) |
| + pte |= GEN6_PTE_CACHE_LLC; |
| + |
| + return pte; |
| +} |
| + |
| static int gen6_ppgtt_enable(struct drm_device *dev) |
| { |
| drm_i915_private_t *dev_priv = dev->dev_private; |
| @@ -254,7 +260,9 @@ static int gen6_ppgtt_init(struct i915_hw_ppgtt *ppgtt) |
| * now. */ |
| first_pd_entry_in_global_pt = gtt_total_entries(dev_priv->gtt); |
| |
| - if (IS_VALLEYVIEW(dev)) { |
| + if (IS_HASWELL(dev)) { |
| + ppgtt->pte_encode = hsw_pte_encode; |
| + } else if (IS_VALLEYVIEW(dev)) { |
| ppgtt->pte_encode = byt_pte_encode; |
| } else { |
| ppgtt->pte_encode = gen6_pte_encode; |
| @@ -835,7 +843,9 @@ int i915_gem_gtt_init(struct drm_device *dev) |
| } else { |
| dev_priv->gtt.gtt_probe = gen6_gmch_probe; |
| dev_priv->gtt.gtt_remove = gen6_gmch_remove; |
| - if (IS_VALLEYVIEW(dev)) { |
| + if (IS_HASWELL(dev)) { |
| + dev_priv->gtt.pte_encode = hsw_pte_encode; |
| + } else if (IS_VALLEYVIEW(dev)) { |
| dev_priv->gtt.pte_encode = byt_pte_encode; |
| } else { |
| dev_priv->gtt.pte_encode = gen6_pte_encode; |
| -- |
| 1.8.5.rc3 |
| |