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.c95
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
1889static 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
1887static void gen7_oa_enable(struct drm_i915_private *dev_priv) 1899static 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
3038static 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
3022static bool hsw_is_valid_mux_addr(struct drm_i915_private *dev_priv, u32 addr) 3044static 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
3029static bool chv_is_valid_mux_addr(struct drm_i915_private *dev_priv, u32 addr) 3052static 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