aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/i915_perf.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/i915/i915_perf.c')
-rw-r--r--drivers/gpu/drm/i915/i915_perf.c49
1 files changed, 26 insertions, 23 deletions
diff --git a/drivers/gpu/drm/i915/i915_perf.c b/drivers/gpu/drm/i915/i915_perf.c
index 664b96bb65a3..4529edfdcfc8 100644
--- a/drivers/gpu/drm/i915/i915_perf.c
+++ b/drivers/gpu/drm/i915/i915_perf.c
@@ -890,8 +890,8 @@ static int gen8_oa_read(struct i915_perf_stream *stream,
890 DRM_DEBUG("OA buffer overflow (exponent = %d): force restart\n", 890 DRM_DEBUG("OA buffer overflow (exponent = %d): force restart\n",
891 dev_priv->perf.oa.period_exponent); 891 dev_priv->perf.oa.period_exponent);
892 892
893 dev_priv->perf.oa.ops.oa_disable(dev_priv); 893 dev_priv->perf.oa.ops.oa_disable(stream);
894 dev_priv->perf.oa.ops.oa_enable(dev_priv); 894 dev_priv->perf.oa.ops.oa_enable(stream);
895 895
896 /* 896 /*
897 * Note: .oa_enable() is expected to re-init the oabuffer and 897 * Note: .oa_enable() is expected to re-init the oabuffer and
@@ -1114,8 +1114,8 @@ static int gen7_oa_read(struct i915_perf_stream *stream,
1114 DRM_DEBUG("OA buffer overflow (exponent = %d): force restart\n", 1114 DRM_DEBUG("OA buffer overflow (exponent = %d): force restart\n",
1115 dev_priv->perf.oa.period_exponent); 1115 dev_priv->perf.oa.period_exponent);
1116 1116
1117 dev_priv->perf.oa.ops.oa_disable(dev_priv); 1117 dev_priv->perf.oa.ops.oa_disable(stream);
1118 dev_priv->perf.oa.ops.oa_enable(dev_priv); 1118 dev_priv->perf.oa.ops.oa_enable(stream);
1119 1119
1120 oastatus1 = I915_READ(GEN7_OASTATUS1); 1120 oastatus1 = I915_READ(GEN7_OASTATUS1);
1121 } 1121 }
@@ -1528,8 +1528,6 @@ static int alloc_oa_buffer(struct drm_i915_private *dev_priv)
1528 goto err_unpin; 1528 goto err_unpin;
1529 } 1529 }
1530 1530
1531 dev_priv->perf.oa.ops.init_oa_buffer(dev_priv);
1532
1533 DRM_DEBUG_DRIVER("OA Buffer initialized, gtt offset = 0x%x, vaddr = %p\n", 1531 DRM_DEBUG_DRIVER("OA Buffer initialized, gtt offset = 0x%x, vaddr = %p\n",
1534 i915_ggtt_offset(dev_priv->perf.oa.oa_buffer.vma), 1532 i915_ggtt_offset(dev_priv->perf.oa.oa_buffer.vma),
1535 dev_priv->perf.oa.oa_buffer.vaddr); 1533 dev_priv->perf.oa.oa_buffer.vaddr);
@@ -1563,9 +1561,11 @@ static void config_oa_regs(struct drm_i915_private *dev_priv,
1563 } 1561 }
1564} 1562}
1565 1563
1566static int hsw_enable_metric_set(struct drm_i915_private *dev_priv, 1564static int hsw_enable_metric_set(struct i915_perf_stream *stream)
1567 const struct i915_oa_config *oa_config)
1568{ 1565{
1566 struct drm_i915_private *dev_priv = stream->dev_priv;
1567 const struct i915_oa_config *oa_config = stream->oa_config;
1568
1569 /* PRM: 1569 /* PRM:
1570 * 1570 *
1571 * OA unit is using “crclk” for its functionality. When trunk 1571 * OA unit is using “crclk” for its functionality. When trunk
@@ -1767,9 +1767,10 @@ static int gen8_configure_all_contexts(struct drm_i915_private *dev_priv,
1767 return 0; 1767 return 0;
1768} 1768}
1769 1769
1770static int gen8_enable_metric_set(struct drm_i915_private *dev_priv, 1770static int gen8_enable_metric_set(struct i915_perf_stream *stream)
1771 const struct i915_oa_config *oa_config)
1772{ 1771{
1772 struct drm_i915_private *dev_priv = stream->dev_priv;
1773 const struct i915_oa_config *oa_config = stream->oa_config;
1773 int ret; 1774 int ret;
1774 1775
1775 /* 1776 /*
@@ -1837,10 +1838,10 @@ static void gen10_disable_metric_set(struct drm_i915_private *dev_priv)
1837 I915_READ(RPM_CONFIG1) & ~GEN10_GT_NOA_ENABLE); 1838 I915_READ(RPM_CONFIG1) & ~GEN10_GT_NOA_ENABLE);
1838} 1839}
1839 1840
1840static void gen7_oa_enable(struct drm_i915_private *dev_priv) 1841static void gen7_oa_enable(struct i915_perf_stream *stream)
1841{ 1842{
1842 struct i915_gem_context *ctx = 1843 struct drm_i915_private *dev_priv = stream->dev_priv;
1843 dev_priv->perf.oa.exclusive_stream->ctx; 1844 struct i915_gem_context *ctx = stream->ctx;
1844 u32 ctx_id = dev_priv->perf.oa.specific_ctx_id; 1845 u32 ctx_id = dev_priv->perf.oa.specific_ctx_id;
1845 bool periodic = dev_priv->perf.oa.periodic; 1846 bool periodic = dev_priv->perf.oa.periodic;
1846 u32 period_exponent = dev_priv->perf.oa.period_exponent; 1847 u32 period_exponent = dev_priv->perf.oa.period_exponent;
@@ -1867,8 +1868,9 @@ static void gen7_oa_enable(struct drm_i915_private *dev_priv)
1867 GEN7_OACONTROL_ENABLE); 1868 GEN7_OACONTROL_ENABLE);
1868} 1869}
1869 1870
1870static void gen8_oa_enable(struct drm_i915_private *dev_priv) 1871static void gen8_oa_enable(struct i915_perf_stream *stream)
1871{ 1872{
1873 struct drm_i915_private *dev_priv = stream->dev_priv;
1872 u32 report_format = dev_priv->perf.oa.oa_buffer.format; 1874 u32 report_format = dev_priv->perf.oa.oa_buffer.format;
1873 1875
1874 /* 1876 /*
@@ -1905,7 +1907,7 @@ static void i915_oa_stream_enable(struct i915_perf_stream *stream)
1905{ 1907{
1906 struct drm_i915_private *dev_priv = stream->dev_priv; 1908 struct drm_i915_private *dev_priv = stream->dev_priv;
1907 1909
1908 dev_priv->perf.oa.ops.oa_enable(dev_priv); 1910 dev_priv->perf.oa.ops.oa_enable(stream);
1909 1911
1910 if (dev_priv->perf.oa.periodic) 1912 if (dev_priv->perf.oa.periodic)
1911 hrtimer_start(&dev_priv->perf.oa.poll_check_timer, 1913 hrtimer_start(&dev_priv->perf.oa.poll_check_timer,
@@ -1913,8 +1915,10 @@ static void i915_oa_stream_enable(struct i915_perf_stream *stream)
1913 HRTIMER_MODE_REL_PINNED); 1915 HRTIMER_MODE_REL_PINNED);
1914} 1916}
1915 1917
1916static void gen7_oa_disable(struct drm_i915_private *dev_priv) 1918static void gen7_oa_disable(struct i915_perf_stream *stream)
1917{ 1919{
1920 struct drm_i915_private *dev_priv = stream->dev_priv;
1921
1918 I915_WRITE(GEN7_OACONTROL, 0); 1922 I915_WRITE(GEN7_OACONTROL, 0);
1919 if (intel_wait_for_register(dev_priv, 1923 if (intel_wait_for_register(dev_priv,
1920 GEN7_OACONTROL, GEN7_OACONTROL_ENABLE, 0, 1924 GEN7_OACONTROL, GEN7_OACONTROL_ENABLE, 0,
@@ -1922,8 +1926,10 @@ static void gen7_oa_disable(struct drm_i915_private *dev_priv)
1922 DRM_ERROR("wait for OA to be disabled timed out\n"); 1926 DRM_ERROR("wait for OA to be disabled timed out\n");
1923} 1927}
1924 1928
1925static void gen8_oa_disable(struct drm_i915_private *dev_priv) 1929static void gen8_oa_disable(struct i915_perf_stream *stream)
1926{ 1930{
1931 struct drm_i915_private *dev_priv = stream->dev_priv;
1932
1927 I915_WRITE(GEN8_OACONTROL, 0); 1933 I915_WRITE(GEN8_OACONTROL, 0);
1928 if (intel_wait_for_register(dev_priv, 1934 if (intel_wait_for_register(dev_priv,
1929 GEN8_OACONTROL, GEN8_OA_COUNTER_ENABLE, 0, 1935 GEN8_OACONTROL, GEN8_OA_COUNTER_ENABLE, 0,
@@ -1943,7 +1949,7 @@ static void i915_oa_stream_disable(struct i915_perf_stream *stream)
1943{ 1949{
1944 struct drm_i915_private *dev_priv = stream->dev_priv; 1950 struct drm_i915_private *dev_priv = stream->dev_priv;
1945 1951
1946 dev_priv->perf.oa.ops.oa_disable(dev_priv); 1952 dev_priv->perf.oa.ops.oa_disable(stream);
1947 1953
1948 if (dev_priv->perf.oa.periodic) 1954 if (dev_priv->perf.oa.periodic)
1949 hrtimer_cancel(&dev_priv->perf.oa.poll_check_timer); 1955 hrtimer_cancel(&dev_priv->perf.oa.poll_check_timer);
@@ -1998,7 +2004,7 @@ static int i915_oa_stream_init(struct i915_perf_stream *stream,
1998 return -EINVAL; 2004 return -EINVAL;
1999 } 2005 }
2000 2006
2001 if (!dev_priv->perf.oa.ops.init_oa_buffer) { 2007 if (!dev_priv->perf.oa.ops.enable_metric_set) {
2002 DRM_DEBUG("OA unit not supported\n"); 2008 DRM_DEBUG("OA unit not supported\n");
2003 return -ENODEV; 2009 return -ENODEV;
2004 } 2010 }
@@ -2092,8 +2098,7 @@ static int i915_oa_stream_init(struct i915_perf_stream *stream,
2092 if (ret) 2098 if (ret)
2093 goto err_lock; 2099 goto err_lock;
2094 2100
2095 ret = dev_priv->perf.oa.ops.enable_metric_set(dev_priv, 2101 ret = dev_priv->perf.oa.ops.enable_metric_set(stream);
2096 stream->oa_config);
2097 if (ret) { 2102 if (ret) {
2098 DRM_DEBUG("Unable to enable metric set\n"); 2103 DRM_DEBUG("Unable to enable metric set\n");
2099 goto err_enable; 2104 goto err_enable;
@@ -3387,7 +3392,6 @@ void i915_perf_init(struct drm_i915_private *dev_priv)
3387 dev_priv->perf.oa.ops.is_valid_mux_reg = 3392 dev_priv->perf.oa.ops.is_valid_mux_reg =
3388 hsw_is_valid_mux_addr; 3393 hsw_is_valid_mux_addr;
3389 dev_priv->perf.oa.ops.is_valid_flex_reg = NULL; 3394 dev_priv->perf.oa.ops.is_valid_flex_reg = NULL;
3390 dev_priv->perf.oa.ops.init_oa_buffer = gen7_init_oa_buffer;
3391 dev_priv->perf.oa.ops.enable_metric_set = hsw_enable_metric_set; 3395 dev_priv->perf.oa.ops.enable_metric_set = hsw_enable_metric_set;
3392 dev_priv->perf.oa.ops.disable_metric_set = hsw_disable_metric_set; 3396 dev_priv->perf.oa.ops.disable_metric_set = hsw_disable_metric_set;
3393 dev_priv->perf.oa.ops.oa_enable = gen7_oa_enable; 3397 dev_priv->perf.oa.ops.oa_enable = gen7_oa_enable;
@@ -3406,7 +3410,6 @@ void i915_perf_init(struct drm_i915_private *dev_priv)
3406 */ 3410 */
3407 dev_priv->perf.oa.oa_formats = gen8_plus_oa_formats; 3411 dev_priv->perf.oa.oa_formats = gen8_plus_oa_formats;
3408 3412
3409 dev_priv->perf.oa.ops.init_oa_buffer = gen8_init_oa_buffer;
3410 dev_priv->perf.oa.ops.oa_enable = gen8_oa_enable; 3413 dev_priv->perf.oa.ops.oa_enable = gen8_oa_enable;
3411 dev_priv->perf.oa.ops.oa_disable = gen8_oa_disable; 3414 dev_priv->perf.oa.ops.oa_disable = gen8_oa_disable;
3412 dev_priv->perf.oa.ops.read = gen8_oa_read; 3415 dev_priv->perf.oa.ops.read = gen8_oa_read;