diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_perf.c')
-rw-r--r-- | drivers/gpu/drm/i915/i915_perf.c | 95 |
1 files changed, 70 insertions, 25 deletions
diff --git a/drivers/gpu/drm/i915/i915_perf.c b/drivers/gpu/drm/i915/i915_perf.c index 59ee808f8fd9..00be015e01df 100644 --- a/drivers/gpu/drm/i915/i915_perf.c +++ b/drivers/gpu/drm/i915/i915_perf.c | |||
@@ -207,6 +207,8 @@ | |||
207 | #include "i915_oa_kblgt3.h" | 207 | #include "i915_oa_kblgt3.h" |
208 | #include "i915_oa_glk.h" | 208 | #include "i915_oa_glk.h" |
209 | #include "i915_oa_cflgt2.h" | 209 | #include "i915_oa_cflgt2.h" |
210 | #include "i915_oa_cflgt3.h" | ||
211 | #include "i915_oa_cnl.h" | ||
210 | 212 | ||
211 | /* HW requires this to be a power of two, between 128k and 16M, though driver | 213 | /* HW requires this to be a power of two, between 128k and 16M, though driver |
212 | * is currently generally designed assuming the largest 16M size is used such | 214 | * is currently generally designed assuming the largest 16M size is used such |
@@ -1851,7 +1853,7 @@ static int gen8_enable_metric_set(struct drm_i915_private *dev_priv, | |||
1851 | * be read back from automatically triggered reports, as part of the | 1853 | * be read back from automatically triggered reports, as part of the |
1852 | * RPT_ID field. | 1854 | * RPT_ID field. |
1853 | */ | 1855 | */ |
1854 | if (IS_GEN9(dev_priv)) { | 1856 | if (IS_GEN9(dev_priv) || IS_GEN10(dev_priv)) { |
1855 | I915_WRITE(GEN8_OA_DEBUG, | 1857 | I915_WRITE(GEN8_OA_DEBUG, |
1856 | _MASKED_BIT_ENABLE(GEN9_OA_DEBUG_DISABLE_CLK_RATIO_REPORTS | | 1858 | _MASKED_BIT_ENABLE(GEN9_OA_DEBUG_DISABLE_CLK_RATIO_REPORTS | |
1857 | GEN9_OA_DEBUG_INCLUDE_CLK_RATIO)); | 1859 | GEN9_OA_DEBUG_INCLUDE_CLK_RATIO)); |
@@ -1884,6 +1886,16 @@ static void gen8_disable_metric_set(struct drm_i915_private *dev_priv) | |||
1884 | 1886 | ||
1885 | } | 1887 | } |
1886 | 1888 | ||
1889 | static void gen10_disable_metric_set(struct drm_i915_private *dev_priv) | ||
1890 | { | ||
1891 | /* Reset all contexts' slices/subslices configurations. */ | ||
1892 | gen8_configure_all_contexts(dev_priv, NULL, false); | ||
1893 | |||
1894 | /* Make sure we disable noa to save power. */ | ||
1895 | I915_WRITE(RPM_CONFIG1, | ||
1896 | I915_READ(RPM_CONFIG1) & ~GEN10_GT_NOA_ENABLE); | ||
1897 | } | ||
1898 | |||
1887 | static void gen7_oa_enable(struct drm_i915_private *dev_priv) | 1899 | static void gen7_oa_enable(struct drm_i915_private *dev_priv) |
1888 | { | 1900 | { |
1889 | /* | 1901 | /* |
@@ -2934,6 +2946,10 @@ void i915_perf_register(struct drm_i915_private *dev_priv) | |||
2934 | } else if (IS_COFFEELAKE(dev_priv)) { | 2946 | } else if (IS_COFFEELAKE(dev_priv)) { |
2935 | if (IS_CFL_GT2(dev_priv)) | 2947 | if (IS_CFL_GT2(dev_priv)) |
2936 | i915_perf_load_test_config_cflgt2(dev_priv); | 2948 | i915_perf_load_test_config_cflgt2(dev_priv); |
2949 | if (IS_CFL_GT3(dev_priv)) | ||
2950 | i915_perf_load_test_config_cflgt3(dev_priv); | ||
2951 | } else if (IS_CANNONLAKE(dev_priv)) { | ||
2952 | i915_perf_load_test_config_cnl(dev_priv); | ||
2937 | } | 2953 | } |
2938 | 2954 | ||
2939 | if (dev_priv->perf.oa.test_config.id == 0) | 2955 | if (dev_priv->perf.oa.test_config.id == 0) |
@@ -3019,11 +3035,18 @@ static bool gen8_is_valid_mux_addr(struct drm_i915_private *dev_priv, u32 addr) | |||
3019 | (addr >= RPM_CONFIG0.reg && addr <= NOA_CONFIG(8).reg); | 3035 | (addr >= RPM_CONFIG0.reg && addr <= NOA_CONFIG(8).reg); |
3020 | } | 3036 | } |
3021 | 3037 | ||
3038 | static bool gen10_is_valid_mux_addr(struct drm_i915_private *dev_priv, u32 addr) | ||
3039 | { | ||
3040 | return gen8_is_valid_mux_addr(dev_priv, addr) || | ||
3041 | (addr >= OA_PERFCNT3_LO.reg && addr <= OA_PERFCNT4_HI.reg); | ||
3042 | } | ||
3043 | |||
3022 | static bool hsw_is_valid_mux_addr(struct drm_i915_private *dev_priv, u32 addr) | 3044 | static bool hsw_is_valid_mux_addr(struct drm_i915_private *dev_priv, u32 addr) |
3023 | { | 3045 | { |
3024 | return gen7_is_valid_mux_addr(dev_priv, addr) || | 3046 | return gen7_is_valid_mux_addr(dev_priv, addr) || |
3025 | (addr >= 0x25100 && addr <= 0x2FF90) || | 3047 | (addr >= 0x25100 && addr <= 0x2FF90) || |
3026 | addr == 0x9ec0; | 3048 | (addr >= HSW_MBVID2_NOA0.reg && addr <= HSW_MBVID2_NOA9.reg) || |
3049 | addr == HSW_MBVID2_MISR0.reg; | ||
3027 | } | 3050 | } |
3028 | 3051 | ||
3029 | static bool chv_is_valid_mux_addr(struct drm_i915_private *dev_priv, u32 addr) | 3052 | static bool chv_is_valid_mux_addr(struct drm_i915_private *dev_priv, u32 addr) |
@@ -3419,41 +3442,46 @@ void i915_perf_init(struct drm_i915_private *dev_priv) | |||
3419 | * worth the complexity to maintain now that BDW+ enable | 3442 | * worth the complexity to maintain now that BDW+ enable |
3420 | * execlist mode by default. | 3443 | * execlist mode by default. |
3421 | */ | 3444 | */ |
3422 | dev_priv->perf.oa.ops.is_valid_b_counter_reg = | 3445 | dev_priv->perf.oa.oa_formats = gen8_plus_oa_formats; |
3423 | gen7_is_valid_b_counter_addr; | ||
3424 | dev_priv->perf.oa.ops.is_valid_mux_reg = | ||
3425 | gen8_is_valid_mux_addr; | ||
3426 | dev_priv->perf.oa.ops.is_valid_flex_reg = | ||
3427 | gen8_is_valid_flex_addr; | ||
3428 | 3446 | ||
3429 | dev_priv->perf.oa.ops.init_oa_buffer = gen8_init_oa_buffer; | 3447 | dev_priv->perf.oa.ops.init_oa_buffer = gen8_init_oa_buffer; |
3430 | dev_priv->perf.oa.ops.enable_metric_set = gen8_enable_metric_set; | ||
3431 | dev_priv->perf.oa.ops.disable_metric_set = gen8_disable_metric_set; | ||
3432 | dev_priv->perf.oa.ops.oa_enable = gen8_oa_enable; | 3448 | dev_priv->perf.oa.ops.oa_enable = gen8_oa_enable; |
3433 | dev_priv->perf.oa.ops.oa_disable = gen8_oa_disable; | 3449 | dev_priv->perf.oa.ops.oa_disable = gen8_oa_disable; |
3434 | dev_priv->perf.oa.ops.read = gen8_oa_read; | 3450 | dev_priv->perf.oa.ops.read = gen8_oa_read; |
3435 | dev_priv->perf.oa.ops.oa_hw_tail_read = gen8_oa_hw_tail_read; | 3451 | dev_priv->perf.oa.ops.oa_hw_tail_read = gen8_oa_hw_tail_read; |
3436 | 3452 | ||
3437 | dev_priv->perf.oa.oa_formats = gen8_plus_oa_formats; | 3453 | if (IS_GEN8(dev_priv) || IS_GEN9(dev_priv)) { |
3438 | 3454 | dev_priv->perf.oa.ops.is_valid_b_counter_reg = | |
3439 | if (IS_GEN8(dev_priv)) { | 3455 | gen7_is_valid_b_counter_addr; |
3440 | dev_priv->perf.oa.ctx_oactxctrl_offset = 0x120; | 3456 | dev_priv->perf.oa.ops.is_valid_mux_reg = |
3441 | dev_priv->perf.oa.ctx_flexeu0_offset = 0x2ce; | 3457 | gen8_is_valid_mux_addr; |
3442 | 3458 | dev_priv->perf.oa.ops.is_valid_flex_reg = | |
3443 | dev_priv->perf.oa.timestamp_frequency = 12500000; | 3459 | gen8_is_valid_flex_addr; |
3444 | 3460 | ||
3445 | dev_priv->perf.oa.gen8_valid_ctx_bit = (1<<25); | ||
3446 | if (IS_CHERRYVIEW(dev_priv)) { | 3461 | if (IS_CHERRYVIEW(dev_priv)) { |
3447 | dev_priv->perf.oa.ops.is_valid_mux_reg = | 3462 | dev_priv->perf.oa.ops.is_valid_mux_reg = |
3448 | chv_is_valid_mux_addr; | 3463 | chv_is_valid_mux_addr; |
3449 | } | 3464 | } |
3450 | } else if (IS_GEN9(dev_priv)) { | ||
3451 | dev_priv->perf.oa.ctx_oactxctrl_offset = 0x128; | ||
3452 | dev_priv->perf.oa.ctx_flexeu0_offset = 0x3de; | ||
3453 | 3465 | ||
3454 | dev_priv->perf.oa.gen8_valid_ctx_bit = (1<<16); | 3466 | dev_priv->perf.oa.ops.enable_metric_set = gen8_enable_metric_set; |
3467 | dev_priv->perf.oa.ops.disable_metric_set = gen8_disable_metric_set; | ||
3468 | |||
3469 | if (IS_GEN8(dev_priv)) { | ||
3470 | dev_priv->perf.oa.ctx_oactxctrl_offset = 0x120; | ||
3471 | dev_priv->perf.oa.ctx_flexeu0_offset = 0x2ce; | ||
3472 | |||
3473 | dev_priv->perf.oa.gen8_valid_ctx_bit = (1<<25); | ||
3474 | } else { | ||
3475 | dev_priv->perf.oa.ctx_oactxctrl_offset = 0x128; | ||
3476 | dev_priv->perf.oa.ctx_flexeu0_offset = 0x3de; | ||
3477 | |||
3478 | dev_priv->perf.oa.gen8_valid_ctx_bit = (1<<16); | ||
3479 | } | ||
3455 | 3480 | ||
3456 | switch (dev_priv->info.platform) { | 3481 | switch (dev_priv->info.platform) { |
3482 | case INTEL_BROADWELL: | ||
3483 | dev_priv->perf.oa.timestamp_frequency = 12500000; | ||
3484 | break; | ||
3457 | case INTEL_BROXTON: | 3485 | case INTEL_BROXTON: |
3458 | case INTEL_GEMINILAKE: | 3486 | case INTEL_GEMINILAKE: |
3459 | dev_priv->perf.oa.timestamp_frequency = 19200000; | 3487 | dev_priv->perf.oa.timestamp_frequency = 19200000; |
@@ -3464,11 +3492,28 @@ void i915_perf_init(struct drm_i915_private *dev_priv) | |||
3464 | dev_priv->perf.oa.timestamp_frequency = 12000000; | 3492 | dev_priv->perf.oa.timestamp_frequency = 12000000; |
3465 | break; | 3493 | break; |
3466 | default: | 3494 | default: |
3467 | /* Leave timestamp_frequency to 0 so we can | ||
3468 | * detect unsupported platforms. | ||
3469 | */ | ||
3470 | break; | 3495 | break; |
3471 | } | 3496 | } |
3497 | } else if (IS_GEN10(dev_priv)) { | ||
3498 | dev_priv->perf.oa.ops.is_valid_b_counter_reg = | ||
3499 | gen7_is_valid_b_counter_addr; | ||
3500 | dev_priv->perf.oa.ops.is_valid_mux_reg = | ||
3501 | gen10_is_valid_mux_addr; | ||
3502 | dev_priv->perf.oa.ops.is_valid_flex_reg = | ||
3503 | gen8_is_valid_flex_addr; | ||
3504 | |||
3505 | dev_priv->perf.oa.ops.enable_metric_set = gen8_enable_metric_set; | ||
3506 | dev_priv->perf.oa.ops.disable_metric_set = gen10_disable_metric_set; | ||
3507 | |||
3508 | dev_priv->perf.oa.ctx_oactxctrl_offset = 0x128; | ||
3509 | dev_priv->perf.oa.ctx_flexeu0_offset = 0x3de; | ||
3510 | |||
3511 | dev_priv->perf.oa.gen8_valid_ctx_bit = (1<<16); | ||
3512 | |||
3513 | /* Default frequency, although we need to read it from | ||
3514 | * the register as it might vary between parts. | ||
3515 | */ | ||
3516 | dev_priv->perf.oa.timestamp_frequency = 12000000; | ||
3472 | } | 3517 | } |
3473 | } | 3518 | } |
3474 | 3519 | ||