aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLionel Landwerlin <lionel.g.landwerlin@intel.com>2017-06-13 07:23:01 -0400
committerBen Widawsky <ben@bwidawsk.net>2017-06-14 15:31:57 -0400
commit3f488d99858d22f584e1734f317bfcff9dbdf4fd (patch)
tree012635a952e9eee7acf2ccb2e47509e04de869fc
parentf532023381df49ac00cb2d1e70df607cf534720d (diff)
drm/i915/perf: rework mux configurations queries
Gen8+ might have mux configurations per slices/subslices. Depending on whether slices/subslices have been fused off, only part of the configuration needs to be applied. This change reworks the mux configurations query mechanism to allow more than one set of registers to be programmed. v2: s/n_mux_regs/n_mux_configs/ (Matthew) Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Reviewed-by: Matthew Auld <matthew.auld@intel.com> Signed-off-by: Ben Widawsky <ben@bwidawsk.net>
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h6
-rw-r--r--drivers/gpu/drm/i915/i915_oa_hsw.c215
-rw-r--r--drivers/gpu/drm/i915/i915_oa_hsw.h4
-rw-r--r--drivers/gpu/drm/i915/i915_perf.c7
4 files changed, 151 insertions, 81 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 467786d25348..f04449f9b1d5 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -2417,8 +2417,10 @@ struct drm_i915_private {
2417 2417
2418 int metrics_set; 2418 int metrics_set;
2419 2419
2420 const struct i915_oa_reg *mux_regs; 2420 const struct i915_oa_reg *mux_regs[1];
2421 int mux_regs_len; 2421 int mux_regs_lens[1];
2422 int n_mux_configs;
2423
2422 const struct i915_oa_reg *b_counter_regs; 2424 const struct i915_oa_reg *b_counter_regs;
2423 int b_counter_regs_len; 2425 int b_counter_regs_len;
2424 2426
diff --git a/drivers/gpu/drm/i915/i915_oa_hsw.c b/drivers/gpu/drm/i915/i915_oa_hsw.c
index 4ddf756add31..8c13e0880e53 100644
--- a/drivers/gpu/drm/i915/i915_oa_hsw.c
+++ b/drivers/gpu/drm/i915/i915_oa_hsw.c
@@ -1,5 +1,7 @@
1/* 1/*
2 * Autogenerated file, DO NOT EDIT manually! 2 * Autogenerated file by GPU Top : https://github.com/rib/gputop
3 * DO NOT EDIT manually!
4 *
3 * 5 *
4 * Copyright (c) 2015 Intel Corporation 6 * Copyright (c) 2015 Intel Corporation
5 * 7 *
@@ -109,12 +111,21 @@ static const struct i915_oa_reg mux_config_render_basic[] = {
109 { _MMIO(0x25428), 0x00042049 }, 111 { _MMIO(0x25428), 0x00042049 },
110}; 112};
111 113
112static const struct i915_oa_reg * 114static int
113get_render_basic_mux_config(struct drm_i915_private *dev_priv, 115get_render_basic_mux_config(struct drm_i915_private *dev_priv,
114 int *len) 116 const struct i915_oa_reg **regs,
117 int *lens)
115{ 118{
116 *len = ARRAY_SIZE(mux_config_render_basic); 119 int n = 0;
117 return mux_config_render_basic; 120
121 BUILD_BUG_ON(ARRAY_SIZE(dev_priv->perf.oa.mux_regs) < 1);
122 BUILD_BUG_ON(ARRAY_SIZE(dev_priv->perf.oa.mux_regs_lens) < 1);
123
124 regs[n] = mux_config_render_basic;
125 lens[n] = ARRAY_SIZE(mux_config_render_basic);
126 n++;
127
128 return n;
118} 129}
119 130
120static const struct i915_oa_reg b_counter_config_compute_basic[] = { 131static const struct i915_oa_reg b_counter_config_compute_basic[] = {
@@ -172,12 +183,21 @@ static const struct i915_oa_reg mux_config_compute_basic[] = {
172 { _MMIO(0x25428), 0x00000c03 }, 183 { _MMIO(0x25428), 0x00000c03 },
173}; 184};
174 185
175static const struct i915_oa_reg * 186static int
176get_compute_basic_mux_config(struct drm_i915_private *dev_priv, 187get_compute_basic_mux_config(struct drm_i915_private *dev_priv,
177 int *len) 188 const struct i915_oa_reg **regs,
189 int *lens)
178{ 190{
179 *len = ARRAY_SIZE(mux_config_compute_basic); 191 int n = 0;
180 return mux_config_compute_basic; 192
193 BUILD_BUG_ON(ARRAY_SIZE(dev_priv->perf.oa.mux_regs) < 1);
194 BUILD_BUG_ON(ARRAY_SIZE(dev_priv->perf.oa.mux_regs_lens) < 1);
195
196 regs[n] = mux_config_compute_basic;
197 lens[n] = ARRAY_SIZE(mux_config_compute_basic);
198 n++;
199
200 return n;
181} 201}
182 202
183static const struct i915_oa_reg b_counter_config_compute_extended[] = { 203static const struct i915_oa_reg b_counter_config_compute_extended[] = {
@@ -221,12 +241,21 @@ static const struct i915_oa_reg mux_config_compute_extended[] = {
221 { _MMIO(0x25428), 0x00000000 }, 241 { _MMIO(0x25428), 0x00000000 },
222}; 242};
223 243
224static const struct i915_oa_reg * 244static int
225get_compute_extended_mux_config(struct drm_i915_private *dev_priv, 245get_compute_extended_mux_config(struct drm_i915_private *dev_priv,
226 int *len) 246 const struct i915_oa_reg **regs,
247 int *lens)
227{ 248{
228 *len = ARRAY_SIZE(mux_config_compute_extended); 249 int n = 0;
229 return mux_config_compute_extended; 250
251 BUILD_BUG_ON(ARRAY_SIZE(dev_priv->perf.oa.mux_regs) < 1);
252 BUILD_BUG_ON(ARRAY_SIZE(dev_priv->perf.oa.mux_regs_lens) < 1);
253
254 regs[n] = mux_config_compute_extended;
255 lens[n] = ARRAY_SIZE(mux_config_compute_extended);
256 n++;
257
258 return n;
230} 259}
231 260
232static const struct i915_oa_reg b_counter_config_memory_reads[] = { 261static const struct i915_oa_reg b_counter_config_memory_reads[] = {
@@ -281,12 +310,21 @@ static const struct i915_oa_reg mux_config_memory_reads[] = {
281 { _MMIO(0x25428), 0x00000000 }, 310 { _MMIO(0x25428), 0x00000000 },
282}; 311};
283 312
284static const struct i915_oa_reg * 313static int
285get_memory_reads_mux_config(struct drm_i915_private *dev_priv, 314get_memory_reads_mux_config(struct drm_i915_private *dev_priv,
286 int *len) 315 const struct i915_oa_reg **regs,
316 int *lens)
287{ 317{
288 *len = ARRAY_SIZE(mux_config_memory_reads); 318 int n = 0;
289 return mux_config_memory_reads; 319
320 BUILD_BUG_ON(ARRAY_SIZE(dev_priv->perf.oa.mux_regs) < 1);
321 BUILD_BUG_ON(ARRAY_SIZE(dev_priv->perf.oa.mux_regs_lens) < 1);
322
323 regs[n] = mux_config_memory_reads;
324 lens[n] = ARRAY_SIZE(mux_config_memory_reads);
325 n++;
326
327 return n;
290} 328}
291 329
292static const struct i915_oa_reg b_counter_config_memory_writes[] = { 330static const struct i915_oa_reg b_counter_config_memory_writes[] = {
@@ -341,12 +379,21 @@ static const struct i915_oa_reg mux_config_memory_writes[] = {
341 { _MMIO(0x25428), 0x00000000 }, 379 { _MMIO(0x25428), 0x00000000 },
342}; 380};
343 381
344static const struct i915_oa_reg * 382static int
345get_memory_writes_mux_config(struct drm_i915_private *dev_priv, 383get_memory_writes_mux_config(struct drm_i915_private *dev_priv,
346 int *len) 384 const struct i915_oa_reg **regs,
385 int *lens)
347{ 386{
348 *len = ARRAY_SIZE(mux_config_memory_writes); 387 int n = 0;
349 return mux_config_memory_writes; 388
389 BUILD_BUG_ON(ARRAY_SIZE(dev_priv->perf.oa.mux_regs) < 1);
390 BUILD_BUG_ON(ARRAY_SIZE(dev_priv->perf.oa.mux_regs_lens) < 1);
391
392 regs[n] = mux_config_memory_writes;
393 lens[n] = ARRAY_SIZE(mux_config_memory_writes);
394 n++;
395
396 return n;
350} 397}
351 398
352static const struct i915_oa_reg b_counter_config_sampler_balance[] = { 399static const struct i915_oa_reg b_counter_config_sampler_balance[] = {
@@ -401,31 +448,40 @@ static const struct i915_oa_reg mux_config_sampler_balance[] = {
401 { _MMIO(0x25428), 0x0004a54a }, 448 { _MMIO(0x25428), 0x0004a54a },
402}; 449};
403 450
404static const struct i915_oa_reg * 451static int
405get_sampler_balance_mux_config(struct drm_i915_private *dev_priv, 452get_sampler_balance_mux_config(struct drm_i915_private *dev_priv,
406 int *len) 453 const struct i915_oa_reg **regs,
454 int *lens)
407{ 455{
408 *len = ARRAY_SIZE(mux_config_sampler_balance); 456 int n = 0;
409 return mux_config_sampler_balance; 457
458 BUILD_BUG_ON(ARRAY_SIZE(dev_priv->perf.oa.mux_regs) < 1);
459 BUILD_BUG_ON(ARRAY_SIZE(dev_priv->perf.oa.mux_regs_lens) < 1);
460
461 regs[n] = mux_config_sampler_balance;
462 lens[n] = ARRAY_SIZE(mux_config_sampler_balance);
463 n++;
464
465 return n;
410} 466}
411 467
412int i915_oa_select_metric_set_hsw(struct drm_i915_private *dev_priv) 468int i915_oa_select_metric_set_hsw(struct drm_i915_private *dev_priv)
413{ 469{
414 dev_priv->perf.oa.mux_regs = NULL; 470 dev_priv->perf.oa.n_mux_configs = 0;
415 dev_priv->perf.oa.mux_regs_len = 0;
416 dev_priv->perf.oa.b_counter_regs = NULL; 471 dev_priv->perf.oa.b_counter_regs = NULL;
417 dev_priv->perf.oa.b_counter_regs_len = 0; 472 dev_priv->perf.oa.b_counter_regs_len = 0;
418 473
419 switch (dev_priv->perf.oa.metrics_set) { 474 switch (dev_priv->perf.oa.metrics_set) {
420 case METRIC_SET_ID_RENDER_BASIC: 475 case METRIC_SET_ID_RENDER_BASIC:
421 dev_priv->perf.oa.mux_regs = 476 dev_priv->perf.oa.n_mux_configs =
422 get_render_basic_mux_config(dev_priv, 477 get_render_basic_mux_config(dev_priv,
423 &dev_priv->perf.oa.mux_regs_len); 478 dev_priv->perf.oa.mux_regs,
424 if (!dev_priv->perf.oa.mux_regs) { 479 dev_priv->perf.oa.mux_regs_lens);
425 DRM_DEBUG_DRIVER("No suitable MUX config for \"RENDER_BASIC\" metric set"); 480 if (dev_priv->perf.oa.n_mux_configs == 0) {
481 DRM_DEBUG_DRIVER("No suitable MUX config for \"RENDER_BASIC\" metric set\n");
426 482
427 /* EINVAL because *_register_sysfs already checked this 483 /* EINVAL because *_register_sysfs already checked this
428 * and so it wouldn't have been advertised so userspace and 484 * and so it wouldn't have been advertised to userspace and
429 * so shouldn't have been requested 485 * so shouldn't have been requested
430 */ 486 */
431 return -EINVAL; 487 return -EINVAL;
@@ -438,14 +494,15 @@ int i915_oa_select_metric_set_hsw(struct drm_i915_private *dev_priv)
438 494
439 return 0; 495 return 0;
440 case METRIC_SET_ID_COMPUTE_BASIC: 496 case METRIC_SET_ID_COMPUTE_BASIC:
441 dev_priv->perf.oa.mux_regs = 497 dev_priv->perf.oa.n_mux_configs =
442 get_compute_basic_mux_config(dev_priv, 498 get_compute_basic_mux_config(dev_priv,
443 &dev_priv->perf.oa.mux_regs_len); 499 dev_priv->perf.oa.mux_regs,
444 if (!dev_priv->perf.oa.mux_regs) { 500 dev_priv->perf.oa.mux_regs_lens);
445 DRM_DEBUG_DRIVER("No suitable MUX config for \"COMPUTE_BASIC\" metric set"); 501 if (dev_priv->perf.oa.n_mux_configs == 0) {
502 DRM_DEBUG_DRIVER("No suitable MUX config for \"COMPUTE_BASIC\" metric set\n");
446 503
447 /* EINVAL because *_register_sysfs already checked this 504 /* EINVAL because *_register_sysfs already checked this
448 * and so it wouldn't have been advertised so userspace and 505 * and so it wouldn't have been advertised to userspace and
449 * so shouldn't have been requested 506 * so shouldn't have been requested
450 */ 507 */
451 return -EINVAL; 508 return -EINVAL;
@@ -458,14 +515,15 @@ int i915_oa_select_metric_set_hsw(struct drm_i915_private *dev_priv)
458 515
459 return 0; 516 return 0;
460 case METRIC_SET_ID_COMPUTE_EXTENDED: 517 case METRIC_SET_ID_COMPUTE_EXTENDED:
461 dev_priv->perf.oa.mux_regs = 518 dev_priv->perf.oa.n_mux_configs =
462 get_compute_extended_mux_config(dev_priv, 519 get_compute_extended_mux_config(dev_priv,
463 &dev_priv->perf.oa.mux_regs_len); 520 dev_priv->perf.oa.mux_regs,
464 if (!dev_priv->perf.oa.mux_regs) { 521 dev_priv->perf.oa.mux_regs_lens);
465 DRM_DEBUG_DRIVER("No suitable MUX config for \"COMPUTE_EXTENDED\" metric set"); 522 if (dev_priv->perf.oa.n_mux_configs == 0) {
523 DRM_DEBUG_DRIVER("No suitable MUX config for \"COMPUTE_EXTENDED\" metric set\n");
466 524
467 /* EINVAL because *_register_sysfs already checked this 525 /* EINVAL because *_register_sysfs already checked this
468 * and so it wouldn't have been advertised so userspace and 526 * and so it wouldn't have been advertised to userspace and
469 * so shouldn't have been requested 527 * so shouldn't have been requested
470 */ 528 */
471 return -EINVAL; 529 return -EINVAL;
@@ -478,14 +536,15 @@ int i915_oa_select_metric_set_hsw(struct drm_i915_private *dev_priv)
478 536
479 return 0; 537 return 0;
480 case METRIC_SET_ID_MEMORY_READS: 538 case METRIC_SET_ID_MEMORY_READS:
481 dev_priv->perf.oa.mux_regs = 539 dev_priv->perf.oa.n_mux_configs =
482 get_memory_reads_mux_config(dev_priv, 540 get_memory_reads_mux_config(dev_priv,
483 &dev_priv->perf.oa.mux_regs_len); 541 dev_priv->perf.oa.mux_regs,
484 if (!dev_priv->perf.oa.mux_regs) { 542 dev_priv->perf.oa.mux_regs_lens);
485 DRM_DEBUG_DRIVER("No suitable MUX config for \"MEMORY_READS\" metric set"); 543 if (dev_priv->perf.oa.n_mux_configs == 0) {
544 DRM_DEBUG_DRIVER("No suitable MUX config for \"MEMORY_READS\" metric set\n");
486 545
487 /* EINVAL because *_register_sysfs already checked this 546 /* EINVAL because *_register_sysfs already checked this
488 * and so it wouldn't have been advertised so userspace and 547 * and so it wouldn't have been advertised to userspace and
489 * so shouldn't have been requested 548 * so shouldn't have been requested
490 */ 549 */
491 return -EINVAL; 550 return -EINVAL;
@@ -498,14 +557,15 @@ int i915_oa_select_metric_set_hsw(struct drm_i915_private *dev_priv)
498 557
499 return 0; 558 return 0;
500 case METRIC_SET_ID_MEMORY_WRITES: 559 case METRIC_SET_ID_MEMORY_WRITES:
501 dev_priv->perf.oa.mux_regs = 560 dev_priv->perf.oa.n_mux_configs =
502 get_memory_writes_mux_config(dev_priv, 561 get_memory_writes_mux_config(dev_priv,
503 &dev_priv->perf.oa.mux_regs_len); 562 dev_priv->perf.oa.mux_regs,
504 if (!dev_priv->perf.oa.mux_regs) { 563 dev_priv->perf.oa.mux_regs_lens);
505 DRM_DEBUG_DRIVER("No suitable MUX config for \"MEMORY_WRITES\" metric set"); 564 if (dev_priv->perf.oa.n_mux_configs == 0) {
565 DRM_DEBUG_DRIVER("No suitable MUX config for \"MEMORY_WRITES\" metric set\n");
506 566
507 /* EINVAL because *_register_sysfs already checked this 567 /* EINVAL because *_register_sysfs already checked this
508 * and so it wouldn't have been advertised so userspace and 568 * and so it wouldn't have been advertised to userspace and
509 * so shouldn't have been requested 569 * so shouldn't have been requested
510 */ 570 */
511 return -EINVAL; 571 return -EINVAL;
@@ -518,14 +578,15 @@ int i915_oa_select_metric_set_hsw(struct drm_i915_private *dev_priv)
518 578
519 return 0; 579 return 0;
520 case METRIC_SET_ID_SAMPLER_BALANCE: 580 case METRIC_SET_ID_SAMPLER_BALANCE:
521 dev_priv->perf.oa.mux_regs = 581 dev_priv->perf.oa.n_mux_configs =
522 get_sampler_balance_mux_config(dev_priv, 582 get_sampler_balance_mux_config(dev_priv,
523 &dev_priv->perf.oa.mux_regs_len); 583 dev_priv->perf.oa.mux_regs,
524 if (!dev_priv->perf.oa.mux_regs) { 584 dev_priv->perf.oa.mux_regs_lens);
525 DRM_DEBUG_DRIVER("No suitable MUX config for \"SAMPLER_BALANCE\" metric set"); 585 if (dev_priv->perf.oa.n_mux_configs == 0) {
586 DRM_DEBUG_DRIVER("No suitable MUX config for \"SAMPLER_BALANCE\" metric set\n");
526 587
527 /* EINVAL because *_register_sysfs already checked this 588 /* EINVAL because *_register_sysfs already checked this
528 * and so it wouldn't have been advertised so userspace and 589 * and so it wouldn't have been advertised to userspace and
529 * so shouldn't have been requested 590 * so shouldn't have been requested
530 */ 591 */
531 return -EINVAL; 592 return -EINVAL;
@@ -677,35 +738,36 @@ static struct attribute_group group_sampler_balance = {
677int 738int
678i915_perf_register_sysfs_hsw(struct drm_i915_private *dev_priv) 739i915_perf_register_sysfs_hsw(struct drm_i915_private *dev_priv)
679{ 740{
680 int mux_len; 741 const struct i915_oa_reg *mux_regs[ARRAY_SIZE(dev_priv->perf.oa.mux_regs)];
742 int mux_lens[ARRAY_SIZE(dev_priv->perf.oa.mux_regs_lens)];
681 int ret = 0; 743 int ret = 0;
682 744
683 if (get_render_basic_mux_config(dev_priv, &mux_len)) { 745 if (get_render_basic_mux_config(dev_priv, mux_regs, mux_lens)) {
684 ret = sysfs_create_group(dev_priv->perf.metrics_kobj, &group_render_basic); 746 ret = sysfs_create_group(dev_priv->perf.metrics_kobj, &group_render_basic);
685 if (ret) 747 if (ret)
686 goto error_render_basic; 748 goto error_render_basic;
687 } 749 }
688 if (get_compute_basic_mux_config(dev_priv, &mux_len)) { 750 if (get_compute_basic_mux_config(dev_priv, mux_regs, mux_lens)) {
689 ret = sysfs_create_group(dev_priv->perf.metrics_kobj, &group_compute_basic); 751 ret = sysfs_create_group(dev_priv->perf.metrics_kobj, &group_compute_basic);
690 if (ret) 752 if (ret)
691 goto error_compute_basic; 753 goto error_compute_basic;
692 } 754 }
693 if (get_compute_extended_mux_config(dev_priv, &mux_len)) { 755 if (get_compute_extended_mux_config(dev_priv, mux_regs, mux_lens)) {
694 ret = sysfs_create_group(dev_priv->perf.metrics_kobj, &group_compute_extended); 756 ret = sysfs_create_group(dev_priv->perf.metrics_kobj, &group_compute_extended);
695 if (ret) 757 if (ret)
696 goto error_compute_extended; 758 goto error_compute_extended;
697 } 759 }
698 if (get_memory_reads_mux_config(dev_priv, &mux_len)) { 760 if (get_memory_reads_mux_config(dev_priv, mux_regs, mux_lens)) {
699 ret = sysfs_create_group(dev_priv->perf.metrics_kobj, &group_memory_reads); 761 ret = sysfs_create_group(dev_priv->perf.metrics_kobj, &group_memory_reads);
700 if (ret) 762 if (ret)
701 goto error_memory_reads; 763 goto error_memory_reads;
702 } 764 }
703 if (get_memory_writes_mux_config(dev_priv, &mux_len)) { 765 if (get_memory_writes_mux_config(dev_priv, mux_regs, mux_lens)) {
704 ret = sysfs_create_group(dev_priv->perf.metrics_kobj, &group_memory_writes); 766 ret = sysfs_create_group(dev_priv->perf.metrics_kobj, &group_memory_writes);
705 if (ret) 767 if (ret)
706 goto error_memory_writes; 768 goto error_memory_writes;
707 } 769 }
708 if (get_sampler_balance_mux_config(dev_priv, &mux_len)) { 770 if (get_sampler_balance_mux_config(dev_priv, mux_regs, mux_lens)) {
709 ret = sysfs_create_group(dev_priv->perf.metrics_kobj, &group_sampler_balance); 771 ret = sysfs_create_group(dev_priv->perf.metrics_kobj, &group_sampler_balance);
710 if (ret) 772 if (ret)
711 goto error_sampler_balance; 773 goto error_sampler_balance;
@@ -714,19 +776,19 @@ i915_perf_register_sysfs_hsw(struct drm_i915_private *dev_priv)
714 return 0; 776 return 0;
715 777
716error_sampler_balance: 778error_sampler_balance:
717 if (get_sampler_balance_mux_config(dev_priv, &mux_len)) 779 if (get_memory_writes_mux_config(dev_priv, mux_regs, mux_lens))
718 sysfs_remove_group(dev_priv->perf.metrics_kobj, &group_memory_writes); 780 sysfs_remove_group(dev_priv->perf.metrics_kobj, &group_memory_writes);
719error_memory_writes: 781error_memory_writes:
720 if (get_sampler_balance_mux_config(dev_priv, &mux_len)) 782 if (get_memory_reads_mux_config(dev_priv, mux_regs, mux_lens))
721 sysfs_remove_group(dev_priv->perf.metrics_kobj, &group_memory_reads); 783 sysfs_remove_group(dev_priv->perf.metrics_kobj, &group_memory_reads);
722error_memory_reads: 784error_memory_reads:
723 if (get_sampler_balance_mux_config(dev_priv, &mux_len)) 785 if (get_compute_extended_mux_config(dev_priv, mux_regs, mux_lens))
724 sysfs_remove_group(dev_priv->perf.metrics_kobj, &group_compute_extended); 786 sysfs_remove_group(dev_priv->perf.metrics_kobj, &group_compute_extended);
725error_compute_extended: 787error_compute_extended:
726 if (get_sampler_balance_mux_config(dev_priv, &mux_len)) 788 if (get_compute_basic_mux_config(dev_priv, mux_regs, mux_lens))
727 sysfs_remove_group(dev_priv->perf.metrics_kobj, &group_compute_basic); 789 sysfs_remove_group(dev_priv->perf.metrics_kobj, &group_compute_basic);
728error_compute_basic: 790error_compute_basic:
729 if (get_sampler_balance_mux_config(dev_priv, &mux_len)) 791 if (get_render_basic_mux_config(dev_priv, mux_regs, mux_lens))
730 sysfs_remove_group(dev_priv->perf.metrics_kobj, &group_render_basic); 792 sysfs_remove_group(dev_priv->perf.metrics_kobj, &group_render_basic);
731error_render_basic: 793error_render_basic:
732 return ret; 794 return ret;
@@ -735,18 +797,19 @@ error_render_basic:
735void 797void
736i915_perf_unregister_sysfs_hsw(struct drm_i915_private *dev_priv) 798i915_perf_unregister_sysfs_hsw(struct drm_i915_private *dev_priv)
737{ 799{
738 int mux_len; 800 const struct i915_oa_reg *mux_regs[ARRAY_SIZE(dev_priv->perf.oa.mux_regs)];
801 int mux_lens[ARRAY_SIZE(dev_priv->perf.oa.mux_regs_lens)];
739 802
740 if (get_render_basic_mux_config(dev_priv, &mux_len)) 803 if (get_render_basic_mux_config(dev_priv, mux_regs, mux_lens))
741 sysfs_remove_group(dev_priv->perf.metrics_kobj, &group_render_basic); 804 sysfs_remove_group(dev_priv->perf.metrics_kobj, &group_render_basic);
742 if (get_compute_basic_mux_config(dev_priv, &mux_len)) 805 if (get_compute_basic_mux_config(dev_priv, mux_regs, mux_lens))
743 sysfs_remove_group(dev_priv->perf.metrics_kobj, &group_compute_basic); 806 sysfs_remove_group(dev_priv->perf.metrics_kobj, &group_compute_basic);
744 if (get_compute_extended_mux_config(dev_priv, &mux_len)) 807 if (get_compute_extended_mux_config(dev_priv, mux_regs, mux_lens))
745 sysfs_remove_group(dev_priv->perf.metrics_kobj, &group_compute_extended); 808 sysfs_remove_group(dev_priv->perf.metrics_kobj, &group_compute_extended);
746 if (get_memory_reads_mux_config(dev_priv, &mux_len)) 809 if (get_memory_reads_mux_config(dev_priv, mux_regs, mux_lens))
747 sysfs_remove_group(dev_priv->perf.metrics_kobj, &group_memory_reads); 810 sysfs_remove_group(dev_priv->perf.metrics_kobj, &group_memory_reads);
748 if (get_memory_writes_mux_config(dev_priv, &mux_len)) 811 if (get_memory_writes_mux_config(dev_priv, mux_regs, mux_lens))
749 sysfs_remove_group(dev_priv->perf.metrics_kobj, &group_memory_writes); 812 sysfs_remove_group(dev_priv->perf.metrics_kobj, &group_memory_writes);
750 if (get_sampler_balance_mux_config(dev_priv, &mux_len)) 813 if (get_sampler_balance_mux_config(dev_priv, mux_regs, mux_lens))
751 sysfs_remove_group(dev_priv->perf.metrics_kobj, &group_sampler_balance); 814 sysfs_remove_group(dev_priv->perf.metrics_kobj, &group_sampler_balance);
752} 815}
diff --git a/drivers/gpu/drm/i915/i915_oa_hsw.h b/drivers/gpu/drm/i915/i915_oa_hsw.h
index 429a229b5158..6fe7e0690ef3 100644
--- a/drivers/gpu/drm/i915/i915_oa_hsw.h
+++ b/drivers/gpu/drm/i915/i915_oa_hsw.h
@@ -1,5 +1,7 @@
1/* 1/*
2 * Autogenerated file, DO NOT EDIT manually! 2 * Autogenerated file by GPU Top : https://github.com/rib/gputop
3 * DO NOT EDIT manually!
4 *
3 * 5 *
4 * Copyright (c) 2015 Intel Corporation 6 * Copyright (c) 2015 Intel Corporation
5 * 7 *
diff --git a/drivers/gpu/drm/i915/i915_perf.c b/drivers/gpu/drm/i915/i915_perf.c
index 85269bcc8372..7e56b895fd34 100644
--- a/drivers/gpu/drm/i915/i915_perf.c
+++ b/drivers/gpu/drm/i915/i915_perf.c
@@ -1047,6 +1047,7 @@ static void config_oa_regs(struct drm_i915_private *dev_priv,
1047static int hsw_enable_metric_set(struct drm_i915_private *dev_priv) 1047static int hsw_enable_metric_set(struct drm_i915_private *dev_priv)
1048{ 1048{
1049 int ret = i915_oa_select_metric_set_hsw(dev_priv); 1049 int ret = i915_oa_select_metric_set_hsw(dev_priv);
1050 int i;
1050 1051
1051 if (ret) 1052 if (ret)
1052 return ret; 1053 return ret;
@@ -1068,8 +1069,10 @@ static int hsw_enable_metric_set(struct drm_i915_private *dev_priv)
1068 I915_WRITE(GEN6_UCGCTL1, (I915_READ(GEN6_UCGCTL1) | 1069 I915_WRITE(GEN6_UCGCTL1, (I915_READ(GEN6_UCGCTL1) |
1069 GEN6_CSUNIT_CLOCK_GATE_DISABLE)); 1070 GEN6_CSUNIT_CLOCK_GATE_DISABLE));
1070 1071
1071 config_oa_regs(dev_priv, dev_priv->perf.oa.mux_regs, 1072 for (i = 0; i < dev_priv->perf.oa.n_mux_configs; i++) {
1072 dev_priv->perf.oa.mux_regs_len); 1073 config_oa_regs(dev_priv, dev_priv->perf.oa.mux_regs[i],
1074 dev_priv->perf.oa.mux_regs_lens[i]);
1075 }
1073 1076
1074 /* It apparently takes a fairly long time for a new MUX 1077 /* It apparently takes a fairly long time for a new MUX
1075 * configuration to be be applied after these register writes. 1078 * configuration to be be applied after these register writes.