aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoonas Lahtinen <joonas.lahtinen@linux.intel.com>2018-11-16 08:55:09 -0500
committerJoonas Lahtinen <joonas.lahtinen@linux.intel.com>2018-11-19 06:07:29 -0500
commitfe841686470d383e33b606d0704ef4295141c582 (patch)
tree54d22fd51061de86da9357799b1ed21d9498fc48
parent9e180d9991dc4d9c6b18ffede928841e6b0e35f4 (diff)
Revert "drm/i915/perf: add a parameter to control the size of OA buffer"
Userspace portion is still missing. This reverts commit cd956bfcd0f58d20485ac0a785415f7d9327a95f. Cc: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Cc: Matthew Auld <matthew.auld@intel.com> Signed-off-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Acked-by: Matthew Auld <matthew.auld@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20181116135510.13807-1-joonas.lahtinen@linux.intel.com
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h1
-rw-r--r--drivers/gpu/drm/i915/i915_perf.c99
-rw-r--r--drivers/gpu/drm/i915/i915_reg.h2
-rw-r--r--include/uapi/drm/i915_drm.h7
4 files changed, 33 insertions, 76 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index d69b71d368d3..017f851a586a 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -2004,7 +2004,6 @@ struct drm_i915_private {
2004 u32 last_ctx_id; 2004 u32 last_ctx_id;
2005 int format; 2005 int format;
2006 int format_size; 2006 int format_size;
2007 int size_exponent;
2008 2007
2009 /** 2008 /**
2010 * Locks reads and writes to all head/tail state 2009 * Locks reads and writes to all head/tail state
diff --git a/drivers/gpu/drm/i915/i915_perf.c b/drivers/gpu/drm/i915/i915_perf.c
index 2c2b63be7a6c..c762418d3b01 100644
--- a/drivers/gpu/drm/i915/i915_perf.c
+++ b/drivers/gpu/drm/i915/i915_perf.c
@@ -212,7 +212,13 @@
212#include "i915_oa_icl.h" 212#include "i915_oa_icl.h"
213#include "intel_lrc_reg.h" 213#include "intel_lrc_reg.h"
214 214
215#define OA_TAKEN(tail, head) (((tail) - (head)) & (dev_priv->perf.oa.oa_buffer.vma->size - 1)) 215/* HW requires this to be a power of two, between 128k and 16M, though driver
216 * is currently generally designed assuming the largest 16M size is used such
217 * that the overflow cases are unlikely in normal operation.
218 */
219#define OA_BUFFER_SIZE SZ_16M
220
221#define OA_TAKEN(tail, head) ((tail - head) & (OA_BUFFER_SIZE - 1))
216 222
217/** 223/**
218 * DOC: OA Tail Pointer Race 224 * DOC: OA Tail Pointer Race
@@ -356,7 +362,6 @@ struct perf_open_properties {
356 int oa_format; 362 int oa_format;
357 bool oa_periodic; 363 bool oa_periodic;
358 int oa_period_exponent; 364 int oa_period_exponent;
359 u32 oa_buffer_size_exponent;
360}; 365};
361 366
362static void free_oa_config(struct drm_i915_private *dev_priv, 367static void free_oa_config(struct drm_i915_private *dev_priv,
@@ -519,7 +524,7 @@ static bool oa_buffer_check_unlocked(struct drm_i915_private *dev_priv)
519 * could put the tail out of bounds... 524 * could put the tail out of bounds...
520 */ 525 */
521 if (hw_tail >= gtt_offset && 526 if (hw_tail >= gtt_offset &&
522 hw_tail < (gtt_offset + dev_priv->perf.oa.oa_buffer.vma->size)) { 527 hw_tail < (gtt_offset + OA_BUFFER_SIZE)) {
523 dev_priv->perf.oa.oa_buffer.tails[!aged_idx].offset = 528 dev_priv->perf.oa.oa_buffer.tails[!aged_idx].offset =
524 aging_tail = hw_tail; 529 aging_tail = hw_tail;
525 dev_priv->perf.oa.oa_buffer.aging_timestamp = now; 530 dev_priv->perf.oa.oa_buffer.aging_timestamp = now;
@@ -648,7 +653,7 @@ static int gen8_append_oa_reports(struct i915_perf_stream *stream,
648 int report_size = dev_priv->perf.oa.oa_buffer.format_size; 653 int report_size = dev_priv->perf.oa.oa_buffer.format_size;
649 u8 *oa_buf_base = dev_priv->perf.oa.oa_buffer.vaddr; 654 u8 *oa_buf_base = dev_priv->perf.oa.oa_buffer.vaddr;
650 u32 gtt_offset = i915_ggtt_offset(dev_priv->perf.oa.oa_buffer.vma); 655 u32 gtt_offset = i915_ggtt_offset(dev_priv->perf.oa.oa_buffer.vma);
651 u32 mask = (dev_priv->perf.oa.oa_buffer.vma->size - 1); 656 u32 mask = (OA_BUFFER_SIZE - 1);
652 size_t start_offset = *offset; 657 size_t start_offset = *offset;
653 unsigned long flags; 658 unsigned long flags;
654 unsigned int aged_tail_idx; 659 unsigned int aged_tail_idx;
@@ -688,8 +693,8 @@ static int gen8_append_oa_reports(struct i915_perf_stream *stream,
688 * only be incremented by multiples of the report size (notably also 693 * only be incremented by multiples of the report size (notably also
689 * all a power of two). 694 * all a power of two).
690 */ 695 */
691 if (WARN_ONCE(head > dev_priv->perf.oa.oa_buffer.vma->size || head % report_size || 696 if (WARN_ONCE(head > OA_BUFFER_SIZE || head % report_size ||
692 tail > dev_priv->perf.oa.oa_buffer.vma->size || tail % report_size, 697 tail > OA_BUFFER_SIZE || tail % report_size,
693 "Inconsistent OA buffer pointers: head = %u, tail = %u\n", 698 "Inconsistent OA buffer pointers: head = %u, tail = %u\n",
694 head, tail)) 699 head, tail))
695 return -EIO; 700 return -EIO;
@@ -712,7 +717,7 @@ static int gen8_append_oa_reports(struct i915_perf_stream *stream,
712 * here would imply a driver bug that would result 717 * here would imply a driver bug that would result
713 * in an overrun. 718 * in an overrun.
714 */ 719 */
715 if (WARN_ON((dev_priv->perf.oa.oa_buffer.vma->size - head) < report_size)) { 720 if (WARN_ON((OA_BUFFER_SIZE - head) < report_size)) {
716 DRM_ERROR("Spurious OA head ptr: non-integral report offset\n"); 721 DRM_ERROR("Spurious OA head ptr: non-integral report offset\n");
717 break; 722 break;
718 } 723 }
@@ -871,6 +876,11 @@ static int gen8_oa_read(struct i915_perf_stream *stream,
871 * automatically triggered reports in this condition and so we 876 * automatically triggered reports in this condition and so we
872 * have to assume that old reports are now being trampled 877 * have to assume that old reports are now being trampled
873 * over. 878 * over.
879 *
880 * Considering how we don't currently give userspace control
881 * over the OA buffer size and always configure a large 16MB
882 * buffer, then a buffer overflow does anyway likely indicate
883 * that something has gone quite badly wrong.
874 */ 884 */
875 if (oastatus & GEN8_OASTATUS_OABUFFER_OVERFLOW) { 885 if (oastatus & GEN8_OASTATUS_OABUFFER_OVERFLOW) {
876 ret = append_oa_status(stream, buf, count, offset, 886 ret = append_oa_status(stream, buf, count, offset,
@@ -932,7 +942,7 @@ static int gen7_append_oa_reports(struct i915_perf_stream *stream,
932 int report_size = dev_priv->perf.oa.oa_buffer.format_size; 942 int report_size = dev_priv->perf.oa.oa_buffer.format_size;
933 u8 *oa_buf_base = dev_priv->perf.oa.oa_buffer.vaddr; 943 u8 *oa_buf_base = dev_priv->perf.oa.oa_buffer.vaddr;
934 u32 gtt_offset = i915_ggtt_offset(dev_priv->perf.oa.oa_buffer.vma); 944 u32 gtt_offset = i915_ggtt_offset(dev_priv->perf.oa.oa_buffer.vma);
935 u32 mask = (dev_priv->perf.oa.oa_buffer.vma->size - 1); 945 u32 mask = (OA_BUFFER_SIZE - 1);
936 size_t start_offset = *offset; 946 size_t start_offset = *offset;
937 unsigned long flags; 947 unsigned long flags;
938 unsigned int aged_tail_idx; 948 unsigned int aged_tail_idx;
@@ -969,8 +979,8 @@ static int gen7_append_oa_reports(struct i915_perf_stream *stream,
969 * only be incremented by multiples of the report size (notably also 979 * only be incremented by multiples of the report size (notably also
970 * all a power of two). 980 * all a power of two).
971 */ 981 */
972 if (WARN_ONCE(head > dev_priv->perf.oa.oa_buffer.vma->size || head % report_size || 982 if (WARN_ONCE(head > OA_BUFFER_SIZE || head % report_size ||
973 tail > dev_priv->perf.oa.oa_buffer.vma->size || tail % report_size, 983 tail > OA_BUFFER_SIZE || tail % report_size,
974 "Inconsistent OA buffer pointers: head = %u, tail = %u\n", 984 "Inconsistent OA buffer pointers: head = %u, tail = %u\n",
975 head, tail)) 985 head, tail))
976 return -EIO; 986 return -EIO;
@@ -990,7 +1000,7 @@ static int gen7_append_oa_reports(struct i915_perf_stream *stream,
990 * here would imply a driver bug that would result 1000 * here would imply a driver bug that would result
991 * in an overrun. 1001 * in an overrun.
992 */ 1002 */
993 if (WARN_ON((dev_priv->perf.oa.oa_buffer.vma->size - head) < report_size)) { 1003 if (WARN_ON((OA_BUFFER_SIZE - head) < report_size)) {
994 DRM_ERROR("Spurious OA head ptr: non-integral report offset\n"); 1004 DRM_ERROR("Spurious OA head ptr: non-integral report offset\n");
995 break; 1005 break;
996 } 1006 }
@@ -1385,9 +1395,7 @@ static void gen7_init_oa_buffer(struct drm_i915_private *dev_priv)
1385 1395
1386 I915_WRITE(GEN7_OABUFFER, gtt_offset); 1396 I915_WRITE(GEN7_OABUFFER, gtt_offset);
1387 1397
1388 I915_WRITE(GEN7_OASTATUS1, gtt_offset | 1398 I915_WRITE(GEN7_OASTATUS1, gtt_offset | OABUFFER_SIZE_16M); /* tail */
1389 ((dev_priv->perf.oa.oa_buffer.size_exponent - 17) <<
1390 GEN7_OASTATUS1_BUFFER_SIZE_SHIFT)); /* tail */
1391 1399
1392 /* Mark that we need updated tail pointers to read from... */ 1400 /* Mark that we need updated tail pointers to read from... */
1393 dev_priv->perf.oa.oa_buffer.tails[0].offset = INVALID_TAIL_PTR; 1401 dev_priv->perf.oa.oa_buffer.tails[0].offset = INVALID_TAIL_PTR;
@@ -1412,8 +1420,7 @@ static void gen7_init_oa_buffer(struct drm_i915_private *dev_priv)
1412 * the assumption that new reports are being written to zeroed 1420 * the assumption that new reports are being written to zeroed
1413 * memory... 1421 * memory...
1414 */ 1422 */
1415 memset(dev_priv->perf.oa.oa_buffer.vaddr, 0, 1423 memset(dev_priv->perf.oa.oa_buffer.vaddr, 0, OA_BUFFER_SIZE);
1416 dev_priv->perf.oa.oa_buffer.vma->size);
1417 1424
1418 /* Maybe make ->pollin per-stream state if we support multiple 1425 /* Maybe make ->pollin per-stream state if we support multiple
1419 * concurrent streams in the future. 1426 * concurrent streams in the future.
@@ -1443,9 +1450,7 @@ static void gen8_init_oa_buffer(struct drm_i915_private *dev_priv)
1443 * bit." 1450 * bit."
1444 */ 1451 */
1445 I915_WRITE(GEN8_OABUFFER, gtt_offset | 1452 I915_WRITE(GEN8_OABUFFER, gtt_offset |
1446 ((dev_priv->perf.oa.oa_buffer.size_exponent - 17) << 1453 OABUFFER_SIZE_16M | GEN8_OABUFFER_MEM_SELECT_GGTT);
1447 GEN8_OABUFFER_BUFFER_SIZE_SHIFT) |
1448 GEN8_OABUFFER_MEM_SELECT_GGTT);
1449 I915_WRITE(GEN8_OATAILPTR, gtt_offset & GEN8_OATAILPTR_MASK); 1454 I915_WRITE(GEN8_OATAILPTR, gtt_offset & GEN8_OATAILPTR_MASK);
1450 1455
1451 /* Mark that we need updated tail pointers to read from... */ 1456 /* Mark that we need updated tail pointers to read from... */
@@ -1473,8 +1478,7 @@ static void gen8_init_oa_buffer(struct drm_i915_private *dev_priv)
1473 * the assumption that new reports are being written to zeroed 1478 * the assumption that new reports are being written to zeroed
1474 * memory... 1479 * memory...
1475 */ 1480 */
1476 memset(dev_priv->perf.oa.oa_buffer.vaddr, 0, 1481 memset(dev_priv->perf.oa.oa_buffer.vaddr, 0, OA_BUFFER_SIZE);
1477 dev_priv->perf.oa.oa_buffer.vma->size);
1478 1482
1479 /* 1483 /*
1480 * Maybe make ->pollin per-stream state if we support multiple 1484 * Maybe make ->pollin per-stream state if we support multiple
@@ -1483,24 +1487,23 @@ static void gen8_init_oa_buffer(struct drm_i915_private *dev_priv)
1483 dev_priv->perf.oa.pollin = false; 1487 dev_priv->perf.oa.pollin = false;
1484} 1488}
1485 1489
1486static int alloc_oa_buffer(struct drm_i915_private *dev_priv, int size_exponent) 1490static int alloc_oa_buffer(struct drm_i915_private *dev_priv)
1487{ 1491{
1488 struct drm_i915_gem_object *bo; 1492 struct drm_i915_gem_object *bo;
1489 struct i915_vma *vma; 1493 struct i915_vma *vma;
1490 size_t size = 1U << size_exponent;
1491 int ret; 1494 int ret;
1492 1495
1493 if (WARN_ON(dev_priv->perf.oa.oa_buffer.vma)) 1496 if (WARN_ON(dev_priv->perf.oa.oa_buffer.vma))
1494 return -ENODEV; 1497 return -ENODEV;
1495 1498
1496 if (WARN_ON(size < SZ_128K || size > SZ_16M))
1497 return -EINVAL;
1498
1499 ret = i915_mutex_lock_interruptible(&dev_priv->drm); 1499 ret = i915_mutex_lock_interruptible(&dev_priv->drm);
1500 if (ret) 1500 if (ret)
1501 return ret; 1501 return ret;
1502 1502
1503 bo = i915_gem_object_create(dev_priv, size); 1503 BUILD_BUG_ON_NOT_POWER_OF_2(OA_BUFFER_SIZE);
1504 BUILD_BUG_ON(OA_BUFFER_SIZE < SZ_128K || OA_BUFFER_SIZE > SZ_16M);
1505
1506 bo = i915_gem_object_create(dev_priv, OA_BUFFER_SIZE);
1504 if (IS_ERR(bo)) { 1507 if (IS_ERR(bo)) {
1505 DRM_ERROR("Failed to allocate OA buffer\n"); 1508 DRM_ERROR("Failed to allocate OA buffer\n");
1506 ret = PTR_ERR(bo); 1509 ret = PTR_ERR(bo);
@@ -1518,7 +1521,6 @@ static int alloc_oa_buffer(struct drm_i915_private *dev_priv, int size_exponent)
1518 goto err_unref; 1521 goto err_unref;
1519 } 1522 }
1520 dev_priv->perf.oa.oa_buffer.vma = vma; 1523 dev_priv->perf.oa.oa_buffer.vma = vma;
1521 dev_priv->perf.oa.oa_buffer.size_exponent = size_exponent;
1522 1524
1523 dev_priv->perf.oa.oa_buffer.vaddr = 1525 dev_priv->perf.oa.oa_buffer.vaddr =
1524 i915_gem_object_pin_map(bo, I915_MAP_WB); 1526 i915_gem_object_pin_map(bo, I915_MAP_WB);
@@ -1527,10 +1529,9 @@ static int alloc_oa_buffer(struct drm_i915_private *dev_priv, int size_exponent)
1527 goto err_unpin; 1529 goto err_unpin;
1528 } 1530 }
1529 1531
1530 DRM_DEBUG_DRIVER("OA Buffer initialized, gtt offset = 0x%x, vaddr = %p, size = %llu\n", 1532 DRM_DEBUG_DRIVER("OA Buffer initialized, gtt offset = 0x%x, vaddr = %p\n",
1531 i915_ggtt_offset(dev_priv->perf.oa.oa_buffer.vma), 1533 i915_ggtt_offset(dev_priv->perf.oa.oa_buffer.vma),
1532 dev_priv->perf.oa.oa_buffer.vaddr, 1534 dev_priv->perf.oa.oa_buffer.vaddr);
1533 dev_priv->perf.oa.oa_buffer.vma->size);
1534 1535
1535 goto unlock; 1536 goto unlock;
1536 1537
@@ -2090,7 +2091,7 @@ static int i915_oa_stream_init(struct i915_perf_stream *stream,
2090 intel_runtime_pm_get(dev_priv); 2091 intel_runtime_pm_get(dev_priv);
2091 intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL); 2092 intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL);
2092 2093
2093 ret = alloc_oa_buffer(dev_priv, props->oa_buffer_size_exponent); 2094 ret = alloc_oa_buffer(dev_priv);
2094 if (ret) 2095 if (ret)
2095 goto err_oa_buf_alloc; 2096 goto err_oa_buf_alloc;
2096 2097
@@ -2649,26 +2650,6 @@ static u64 oa_exponent_to_ns(struct drm_i915_private *dev_priv, int exponent)
2649 1000ULL * INTEL_INFO(dev_priv)->cs_timestamp_frequency_khz); 2650 1000ULL * INTEL_INFO(dev_priv)->cs_timestamp_frequency_khz);
2650} 2651}
2651 2652
2652static int
2653select_oa_buffer_exponent(struct drm_i915_private *i915,
2654 u64 requested_size)
2655{
2656 int order;
2657
2658 /*
2659 * When no size is specified, use the largest size supported by all
2660 * generations.
2661 */
2662 if (!requested_size)
2663 return order_base_2(SZ_16M);
2664
2665 order = order_base_2(clamp_t(u64, requested_size, SZ_128K, SZ_16M));
2666 if (requested_size != (1UL << order))
2667 return -EINVAL;
2668
2669 return order;
2670}
2671
2672/** 2653/**
2673 * read_properties_unlocked - validate + copy userspace stream open properties 2654 * read_properties_unlocked - validate + copy userspace stream open properties
2674 * @dev_priv: i915 device instance 2655 * @dev_priv: i915 device instance
@@ -2796,14 +2777,6 @@ static int read_properties_unlocked(struct drm_i915_private *dev_priv,
2796 props->oa_periodic = true; 2777 props->oa_periodic = true;
2797 props->oa_period_exponent = value; 2778 props->oa_period_exponent = value;
2798 break; 2779 break;
2799 case DRM_I915_PERF_PROP_OA_BUFFER_SIZE:
2800 ret = select_oa_buffer_exponent(dev_priv, value);
2801 if (ret < 0) {
2802 DRM_DEBUG("OA buffer size invalid %llu\n", value);
2803 return ret;
2804 }
2805 props->oa_buffer_size_exponent = ret;
2806 break;
2807 case DRM_I915_PERF_PROP_MAX: 2780 case DRM_I915_PERF_PROP_MAX:
2808 MISSING_CASE(id); 2781 MISSING_CASE(id);
2809 return -EINVAL; 2782 return -EINVAL;
@@ -2812,12 +2785,6 @@ static int read_properties_unlocked(struct drm_i915_private *dev_priv,
2812 uprop += 2; 2785 uprop += 2;
2813 } 2786 }
2814 2787
2815 /* If no buffer size was requested, select the default one. */
2816 if (!props->oa_buffer_size_exponent) {
2817 props->oa_buffer_size_exponent =
2818 select_oa_buffer_exponent(dev_priv, 0);
2819 }
2820
2821 return 0; 2788 return 0;
2822} 2789}
2823 2790
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 94ba86018a4f..edb58af1e903 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -586,14 +586,12 @@ static inline bool i915_mmio_reg_valid(i915_reg_t reg)
586#define GEN8_OABUFFER_UDW _MMIO(0x23b4) 586#define GEN8_OABUFFER_UDW _MMIO(0x23b4)
587#define GEN8_OABUFFER _MMIO(0x2b14) 587#define GEN8_OABUFFER _MMIO(0x2b14)
588#define GEN8_OABUFFER_MEM_SELECT_GGTT (1 << 0) /* 0: PPGTT, 1: GGTT */ 588#define GEN8_OABUFFER_MEM_SELECT_GGTT (1 << 0) /* 0: PPGTT, 1: GGTT */
589#define GEN8_OABUFFER_BUFFER_SIZE_SHIFT 3
590 589
591#define GEN7_OASTATUS1 _MMIO(0x2364) 590#define GEN7_OASTATUS1 _MMIO(0x2364)
592#define GEN7_OASTATUS1_TAIL_MASK 0xffffffc0 591#define GEN7_OASTATUS1_TAIL_MASK 0xffffffc0
593#define GEN7_OASTATUS1_COUNTER_OVERFLOW (1 << 2) 592#define GEN7_OASTATUS1_COUNTER_OVERFLOW (1 << 2)
594#define GEN7_OASTATUS1_OABUFFER_OVERFLOW (1 << 1) 593#define GEN7_OASTATUS1_OABUFFER_OVERFLOW (1 << 1)
595#define GEN7_OASTATUS1_REPORT_LOST (1 << 0) 594#define GEN7_OASTATUS1_REPORT_LOST (1 << 0)
596#define GEN7_OASTATUS1_BUFFER_SIZE_SHIFT 3
597 595
598#define GEN7_OASTATUS2 _MMIO(0x2368) 596#define GEN7_OASTATUS2 _MMIO(0x2368)
599#define GEN7_OASTATUS2_HEAD_MASK 0xffffffc0 597#define GEN7_OASTATUS2_HEAD_MASK 0xffffffc0
diff --git a/include/uapi/drm/i915_drm.h b/include/uapi/drm/i915_drm.h
index e477ef8c644e..298b2e197744 100644
--- a/include/uapi/drm/i915_drm.h
+++ b/include/uapi/drm/i915_drm.h
@@ -1540,13 +1540,6 @@ enum drm_i915_perf_property_id {
1540 */ 1540 */
1541 DRM_I915_PERF_PROP_OA_EXPONENT, 1541 DRM_I915_PERF_PROP_OA_EXPONENT,
1542 1542
1543 /**
1544 * Specify a global OA buffer size to be allocated in bytes. The size
1545 * specified must be supported by HW (currently supported sizes are
1546 * powers of 2 ranging from 128Kb to 16Mb).
1547 */
1548 DRM_I915_PERF_PROP_OA_BUFFER_SIZE,
1549
1550 DRM_I915_PERF_PROP_MAX /* non-ABI */ 1543 DRM_I915_PERF_PROP_MAX /* non-ABI */
1551}; 1544};
1552 1545