diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_perf.c')
-rw-r--r-- | drivers/gpu/drm/i915/i915_perf.c | 49 |
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 | ||
1566 | static int hsw_enable_metric_set(struct drm_i915_private *dev_priv, | 1564 | static 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 | ||
1770 | static int gen8_enable_metric_set(struct drm_i915_private *dev_priv, | 1770 | static 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 | ||
1840 | static void gen7_oa_enable(struct drm_i915_private *dev_priv) | 1841 | static 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 | ||
1870 | static void gen8_oa_enable(struct drm_i915_private *dev_priv) | 1871 | static 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 | ||
1916 | static void gen7_oa_disable(struct drm_i915_private *dev_priv) | 1918 | static 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 | ||
1925 | static void gen8_oa_disable(struct drm_i915_private *dev_priv) | 1929 | static 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; |