|
@@ -379,6 +379,17 @@ u32 intel_ring_get_active_head(struct intel_ring_buffer *ring)
|
|
|
return I915_READ(acthd_reg);
|
|
|
}
|
|
|
|
|
|
+static void ring_setup_phys_status_page(struct intel_ring_buffer *ring)
|
|
|
+{
|
|
|
+ struct drm_i915_private *dev_priv = ring->dev->dev_private;
|
|
|
+ u32 addr;
|
|
|
+
|
|
|
+ addr = dev_priv->status_page_dmah->busaddr;
|
|
|
+ if (INTEL_INFO(ring->dev)->gen >= 4)
|
|
|
+ addr |= (dev_priv->status_page_dmah->busaddr >> 28) & 0xf0;
|
|
|
+ I915_WRITE(HWS_PGA, addr);
|
|
|
+}
|
|
|
+
|
|
|
static int init_ring_common(struct intel_ring_buffer *ring)
|
|
|
{
|
|
|
struct drm_device *dev = ring->dev;
|
|
@@ -390,6 +401,11 @@ static int init_ring_common(struct intel_ring_buffer *ring)
|
|
|
if (HAS_FORCE_WAKE(dev))
|
|
|
gen6_gt_force_wake_get(dev_priv);
|
|
|
|
|
|
+ if (I915_NEED_GFX_HWS(dev))
|
|
|
+ intel_ring_setup_status_page(ring);
|
|
|
+ else
|
|
|
+ ring_setup_phys_status_page(ring);
|
|
|
+
|
|
|
/* Stop the ring if it's running. */
|
|
|
I915_WRITE_CTL(ring, 0);
|
|
|
I915_WRITE_HEAD(ring, 0);
|
|
@@ -1223,7 +1239,6 @@ static int init_status_page(struct intel_ring_buffer *ring)
|
|
|
ring->status_page.obj = obj;
|
|
|
memset(ring->status_page.page_addr, 0, PAGE_SIZE);
|
|
|
|
|
|
- intel_ring_setup_status_page(ring);
|
|
|
DRM_DEBUG_DRIVER("%s hws offset: 0x%08x\n",
|
|
|
ring->name, ring->status_page.gfx_addr);
|
|
|
|
|
@@ -1237,10 +1252,9 @@ err:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-static int init_phys_hws_pga(struct intel_ring_buffer *ring)
|
|
|
+static int init_phys_status_page(struct intel_ring_buffer *ring)
|
|
|
{
|
|
|
struct drm_i915_private *dev_priv = ring->dev->dev_private;
|
|
|
- u32 addr;
|
|
|
|
|
|
if (!dev_priv->status_page_dmah) {
|
|
|
dev_priv->status_page_dmah =
|
|
@@ -1249,11 +1263,6 @@ static int init_phys_hws_pga(struct intel_ring_buffer *ring)
|
|
|
return -ENOMEM;
|
|
|
}
|
|
|
|
|
|
- addr = dev_priv->status_page_dmah->busaddr;
|
|
|
- if (INTEL_INFO(ring->dev)->gen >= 4)
|
|
|
- addr |= (dev_priv->status_page_dmah->busaddr >> 28) & 0xf0;
|
|
|
- I915_WRITE(HWS_PGA, addr);
|
|
|
-
|
|
|
ring->status_page.page_addr = dev_priv->status_page_dmah->vaddr;
|
|
|
memset(ring->status_page.page_addr, 0, PAGE_SIZE);
|
|
|
|
|
@@ -1281,7 +1290,7 @@ static int intel_init_ring_buffer(struct drm_device *dev,
|
|
|
return ret;
|
|
|
} else {
|
|
|
BUG_ON(ring->id != RCS);
|
|
|
- ret = init_phys_hws_pga(ring);
|
|
|
+ ret = init_phys_status_page(ring);
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
}
|
|
@@ -1893,7 +1902,7 @@ int intel_render_ring_init_dri(struct drm_device *dev, u64 start, u32 size)
|
|
|
}
|
|
|
|
|
|
if (!I915_NEED_GFX_HWS(dev)) {
|
|
|
- ret = init_phys_hws_pga(ring);
|
|
|
+ ret = init_phys_status_page(ring);
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
}
|