diff options
author | Ben Widawsky <ben@bwidawsk.net> | 2011-10-05 14:44:54 -0400 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2011-11-03 12:19:14 -0400 |
commit | 616fdb5afb12b4d5bb9e36df40d039e86aaaefc2 (patch) | |
tree | 574528a670a1e974bb07371c0c1927c1cbb8c28d /drivers/gpu/drm/i915/i915_debugfs.c | |
parent | ff56b0bc84c01fb2c5d2ec6438becfe0f5f2f78f (diff) |
drm/i915: forcewake warning fixes in debugfs
Some more unsafe debugfs access are fixed with this patch. I tested all reads,
but didn't thoroughly test the writes.
Cc: "Nicolas Kalkhof" <nkalkhof@web.de>
Signed-off-by: Ben Widawsky <ben@bwidawsk.net>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'drivers/gpu/drm/i915/i915_debugfs.c')
-rw-r--r-- | drivers/gpu/drm/i915/i915_debugfs.c | 57 |
1 files changed, 51 insertions, 6 deletions
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index 8e95d66800b0..f2e02075d510 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c | |||
@@ -635,11 +635,16 @@ static int i915_ringbuffer_info(struct seq_file *m, void *data) | |||
635 | struct drm_device *dev = node->minor->dev; | 635 | struct drm_device *dev = node->minor->dev; |
636 | drm_i915_private_t *dev_priv = dev->dev_private; | 636 | drm_i915_private_t *dev_priv = dev->dev_private; |
637 | struct intel_ring_buffer *ring; | 637 | struct intel_ring_buffer *ring; |
638 | int ret; | ||
638 | 639 | ||
639 | ring = &dev_priv->ring[(uintptr_t)node->info_ent->data]; | 640 | ring = &dev_priv->ring[(uintptr_t)node->info_ent->data]; |
640 | if (ring->size == 0) | 641 | if (ring->size == 0) |
641 | return 0; | 642 | return 0; |
642 | 643 | ||
644 | ret = mutex_lock_interruptible(&dev->struct_mutex); | ||
645 | if (ret) | ||
646 | return ret; | ||
647 | |||
643 | seq_printf(m, "Ring %s:\n", ring->name); | 648 | seq_printf(m, "Ring %s:\n", ring->name); |
644 | seq_printf(m, " Head : %08x\n", I915_READ_HEAD(ring) & HEAD_ADDR); | 649 | seq_printf(m, " Head : %08x\n", I915_READ_HEAD(ring) & HEAD_ADDR); |
645 | seq_printf(m, " Tail : %08x\n", I915_READ_TAIL(ring) & TAIL_ADDR); | 650 | seq_printf(m, " Tail : %08x\n", I915_READ_TAIL(ring) & TAIL_ADDR); |
@@ -653,6 +658,8 @@ static int i915_ringbuffer_info(struct seq_file *m, void *data) | |||
653 | seq_printf(m, " Control : %08x\n", I915_READ_CTL(ring)); | 658 | seq_printf(m, " Control : %08x\n", I915_READ_CTL(ring)); |
654 | seq_printf(m, " Start : %08x\n", I915_READ_START(ring)); | 659 | seq_printf(m, " Start : %08x\n", I915_READ_START(ring)); |
655 | 660 | ||
661 | mutex_unlock(&dev->struct_mutex); | ||
662 | |||
656 | return 0; | 663 | return 0; |
657 | } | 664 | } |
658 | 665 | ||
@@ -841,7 +848,16 @@ static int i915_rstdby_delays(struct seq_file *m, void *unused) | |||
841 | struct drm_info_node *node = (struct drm_info_node *) m->private; | 848 | struct drm_info_node *node = (struct drm_info_node *) m->private; |
842 | struct drm_device *dev = node->minor->dev; | 849 | struct drm_device *dev = node->minor->dev; |
843 | drm_i915_private_t *dev_priv = dev->dev_private; | 850 | drm_i915_private_t *dev_priv = dev->dev_private; |
844 | u16 crstanddelay = I915_READ16(CRSTANDVID); | 851 | u16 crstanddelay; |
852 | int ret; | ||
853 | |||
854 | ret = mutex_lock_interruptible(&dev->struct_mutex); | ||
855 | if (ret) | ||
856 | return ret; | ||
857 | |||
858 | crstanddelay = I915_READ16(CRSTANDVID); | ||
859 | |||
860 | mutex_unlock(&dev->struct_mutex); | ||
845 | 861 | ||
846 | seq_printf(m, "w/ctx: %d, w/o ctx: %d\n", (crstanddelay >> 8) & 0x3f, (crstanddelay & 0x3f)); | 862 | seq_printf(m, "w/ctx: %d, w/o ctx: %d\n", (crstanddelay >> 8) & 0x3f, (crstanddelay & 0x3f)); |
847 | 863 | ||
@@ -939,7 +955,11 @@ static int i915_delayfreq_table(struct seq_file *m, void *unused) | |||
939 | struct drm_device *dev = node->minor->dev; | 955 | struct drm_device *dev = node->minor->dev; |
940 | drm_i915_private_t *dev_priv = dev->dev_private; | 956 | drm_i915_private_t *dev_priv = dev->dev_private; |
941 | u32 delayfreq; | 957 | u32 delayfreq; |
942 | int i; | 958 | int ret, i; |
959 | |||
960 | ret = mutex_lock_interruptible(&dev->struct_mutex); | ||
961 | if (ret) | ||
962 | return ret; | ||
943 | 963 | ||
944 | for (i = 0; i < 16; i++) { | 964 | for (i = 0; i < 16; i++) { |
945 | delayfreq = I915_READ(PXVFREQ_BASE + i * 4); | 965 | delayfreq = I915_READ(PXVFREQ_BASE + i * 4); |
@@ -947,6 +967,8 @@ static int i915_delayfreq_table(struct seq_file *m, void *unused) | |||
947 | (delayfreq & PXVFREQ_PX_MASK) >> PXVFREQ_PX_SHIFT); | 967 | (delayfreq & PXVFREQ_PX_MASK) >> PXVFREQ_PX_SHIFT); |
948 | } | 968 | } |
949 | 969 | ||
970 | mutex_unlock(&dev->struct_mutex); | ||
971 | |||
950 | return 0; | 972 | return 0; |
951 | } | 973 | } |
952 | 974 | ||
@@ -961,13 +983,19 @@ static int i915_inttoext_table(struct seq_file *m, void *unused) | |||
961 | struct drm_device *dev = node->minor->dev; | 983 | struct drm_device *dev = node->minor->dev; |
962 | drm_i915_private_t *dev_priv = dev->dev_private; | 984 | drm_i915_private_t *dev_priv = dev->dev_private; |
963 | u32 inttoext; | 985 | u32 inttoext; |
964 | int i; | 986 | int ret, i; |
987 | |||
988 | ret = mutex_lock_interruptible(&dev->struct_mutex); | ||
989 | if (ret) | ||
990 | return ret; | ||
965 | 991 | ||
966 | for (i = 1; i <= 32; i++) { | 992 | for (i = 1; i <= 32; i++) { |
967 | inttoext = I915_READ(INTTOEXT_BASE_ILK + i * 4); | 993 | inttoext = I915_READ(INTTOEXT_BASE_ILK + i * 4); |
968 | seq_printf(m, "INTTOEXT%02d: 0x%08x\n", i, inttoext); | 994 | seq_printf(m, "INTTOEXT%02d: 0x%08x\n", i, inttoext); |
969 | } | 995 | } |
970 | 996 | ||
997 | mutex_unlock(&dev->struct_mutex); | ||
998 | |||
971 | return 0; | 999 | return 0; |
972 | } | 1000 | } |
973 | 1001 | ||
@@ -976,9 +1004,19 @@ static int i915_drpc_info(struct seq_file *m, void *unused) | |||
976 | struct drm_info_node *node = (struct drm_info_node *) m->private; | 1004 | struct drm_info_node *node = (struct drm_info_node *) m->private; |
977 | struct drm_device *dev = node->minor->dev; | 1005 | struct drm_device *dev = node->minor->dev; |
978 | drm_i915_private_t *dev_priv = dev->dev_private; | 1006 | drm_i915_private_t *dev_priv = dev->dev_private; |
979 | u32 rgvmodectl = I915_READ(MEMMODECTL); | 1007 | u32 rgvmodectl, rstdbyctl; |
980 | u32 rstdbyctl = I915_READ(RSTDBYCTL); | 1008 | u16 crstandvid; |
981 | u16 crstandvid = I915_READ16(CRSTANDVID); | 1009 | int ret; |
1010 | |||
1011 | ret = mutex_lock_interruptible(&dev->struct_mutex); | ||
1012 | if (ret) | ||
1013 | return ret; | ||
1014 | |||
1015 | rgvmodectl = I915_READ(MEMMODECTL); | ||
1016 | rstdbyctl = I915_READ(RSTDBYCTL); | ||
1017 | crstandvid = I915_READ16(CRSTANDVID); | ||
1018 | |||
1019 | mutex_unlock(&dev->struct_mutex); | ||
982 | 1020 | ||
983 | seq_printf(m, "HD boost: %s\n", (rgvmodectl & MEMMODE_BOOST_EN) ? | 1021 | seq_printf(m, "HD boost: %s\n", (rgvmodectl & MEMMODE_BOOST_EN) ? |
984 | "yes" : "no"); | 1022 | "yes" : "no"); |
@@ -1166,9 +1204,16 @@ static int i915_gfxec(struct seq_file *m, void *unused) | |||
1166 | struct drm_info_node *node = (struct drm_info_node *) m->private; | 1204 | struct drm_info_node *node = (struct drm_info_node *) m->private; |
1167 | struct drm_device *dev = node->minor->dev; | 1205 | struct drm_device *dev = node->minor->dev; |
1168 | drm_i915_private_t *dev_priv = dev->dev_private; | 1206 | drm_i915_private_t *dev_priv = dev->dev_private; |
1207 | int ret; | ||
1208 | |||
1209 | ret = mutex_lock_interruptible(&dev->struct_mutex); | ||
1210 | if (ret) | ||
1211 | return ret; | ||
1169 | 1212 | ||
1170 | seq_printf(m, "GFXEC: %ld\n", (unsigned long)I915_READ(0x112f4)); | 1213 | seq_printf(m, "GFXEC: %ld\n", (unsigned long)I915_READ(0x112f4)); |
1171 | 1214 | ||
1215 | mutex_unlock(&dev->struct_mutex); | ||
1216 | |||
1172 | return 0; | 1217 | return 0; |
1173 | } | 1218 | } |
1174 | 1219 | ||