diff options
author | Paulo Zanoni <paulo.r.zanoni@intel.com> | 2014-04-01 14:37:11 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2014-04-01 17:06:10 -0400 |
commit | 5c50244253937479481ed87ff58863d7c3e91ee3 (patch) | |
tree | 9a4dd900d9409f82f7f5d47caf1c4c1e9c240c67 /drivers/gpu/drm/i915/i915_irq.c | |
parent | 0bda1cf739e657ebfdde41b723e8a3a21efed6a3 (diff) |
drm/i915: use GEN8_IRQ_INIT on GEN5
And rename it to GEN5_IRQ_INIT.
We have discussed doing equivalent changes on July 2013, and I even
sent a patch series for this: "[PATCH 00/15] Unify interrupt register
init/reset". Now that the BDW code was merged, I have one more
argument in favor of these changes.
Here's what really changes with the Gen 5 IRQ init code:
- We now clear the IIR registers at preinstall (they are also
cleared at postinstall, but we will change that later).
- We have an additional POSTING_READ at the IMR register.
v2: - Fix typo in commit message.
- Add POSTING_READ calls to the macros (Ben, Daniel, Jani).
Reviewed-by: Ben Widawsky <ben@bwidawsk.net> (v1)
Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/i915_irq.c')
-rw-r--r-- | drivers/gpu/drm/i915/i915_irq.c | 46 |
1 files changed, 19 insertions, 27 deletions
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index af1d43c81348..bc7e2303cd4f 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
@@ -80,10 +80,25 @@ static const u32 hpd_status_i915[] = { /* i915 and valleyview are the same */ | |||
80 | [HPD_PORT_D] = PORTD_HOTPLUG_INT_STATUS | 80 | [HPD_PORT_D] = PORTD_HOTPLUG_INT_STATUS |
81 | }; | 81 | }; |
82 | 82 | ||
83 | /* IIR can theoretically queue up two events. Be paranoid. */ | ||
84 | #define GEN8_IRQ_INIT_NDX(type, which) do { \ | ||
85 | I915_WRITE(GEN8_##type##_IMR(which), 0xffffffff); \ | ||
86 | POSTING_READ(GEN8_##type##_IMR(which)); \ | ||
87 | I915_WRITE(GEN8_##type##_IER(which), 0); \ | ||
88 | I915_WRITE(GEN8_##type##_IIR(which), 0xffffffff); \ | ||
89 | POSTING_READ(GEN8_##type##_IIR(which)); \ | ||
90 | I915_WRITE(GEN8_##type##_IIR(which), 0xffffffff); \ | ||
91 | POSTING_READ(GEN8_##type##_IIR(which)); \ | ||
92 | } while (0) | ||
93 | |||
83 | #define GEN5_IRQ_INIT(type) do { \ | 94 | #define GEN5_IRQ_INIT(type) do { \ |
84 | I915_WRITE(type##IMR, 0xffffffff); \ | 95 | I915_WRITE(type##IMR, 0xffffffff); \ |
96 | POSTING_READ(type##IMR); \ | ||
85 | I915_WRITE(type##IER, 0); \ | 97 | I915_WRITE(type##IER, 0); \ |
86 | POSTING_READ(type##IER); \ | 98 | I915_WRITE(type##IIR, 0xffffffff); \ |
99 | POSTING_READ(type##IIR); \ | ||
100 | I915_WRITE(type##IIR, 0xffffffff); \ | ||
101 | POSTING_READ(type##IIR); \ | ||
87 | } while (0) | 102 | } while (0) |
88 | 103 | ||
89 | /* For display hotplug interrupt */ | 104 | /* For display hotplug interrupt */ |
@@ -2899,25 +2914,6 @@ static void gen8_irq_preinstall(struct drm_device *dev) | |||
2899 | I915_WRITE(GEN8_MASTER_IRQ, 0); | 2914 | I915_WRITE(GEN8_MASTER_IRQ, 0); |
2900 | POSTING_READ(GEN8_MASTER_IRQ); | 2915 | POSTING_READ(GEN8_MASTER_IRQ); |
2901 | 2916 | ||
2902 | /* IIR can theoretically queue up two events. Be paranoid */ | ||
2903 | #define GEN8_IRQ_INIT_NDX(type, which) do { \ | ||
2904 | I915_WRITE(GEN8_##type##_IMR(which), 0xffffffff); \ | ||
2905 | POSTING_READ(GEN8_##type##_IMR(which)); \ | ||
2906 | I915_WRITE(GEN8_##type##_IER(which), 0); \ | ||
2907 | I915_WRITE(GEN8_##type##_IIR(which), 0xffffffff); \ | ||
2908 | POSTING_READ(GEN8_##type##_IIR(which)); \ | ||
2909 | I915_WRITE(GEN8_##type##_IIR(which), 0xffffffff); \ | ||
2910 | } while (0) | ||
2911 | |||
2912 | #define GEN8_IRQ_INIT(type) do { \ | ||
2913 | I915_WRITE(GEN8_##type##_IMR, 0xffffffff); \ | ||
2914 | POSTING_READ(GEN8_##type##_IMR); \ | ||
2915 | I915_WRITE(GEN8_##type##_IER, 0); \ | ||
2916 | I915_WRITE(GEN8_##type##_IIR, 0xffffffff); \ | ||
2917 | POSTING_READ(GEN8_##type##_IIR); \ | ||
2918 | I915_WRITE(GEN8_##type##_IIR, 0xffffffff); \ | ||
2919 | } while (0) | ||
2920 | |||
2921 | GEN8_IRQ_INIT_NDX(GT, 0); | 2917 | GEN8_IRQ_INIT_NDX(GT, 0); |
2922 | GEN8_IRQ_INIT_NDX(GT, 1); | 2918 | GEN8_IRQ_INIT_NDX(GT, 1); |
2923 | GEN8_IRQ_INIT_NDX(GT, 2); | 2919 | GEN8_IRQ_INIT_NDX(GT, 2); |
@@ -2927,13 +2923,9 @@ static void gen8_irq_preinstall(struct drm_device *dev) | |||
2927 | GEN8_IRQ_INIT_NDX(DE_PIPE, pipe); | 2923 | GEN8_IRQ_INIT_NDX(DE_PIPE, pipe); |
2928 | } | 2924 | } |
2929 | 2925 | ||
2930 | GEN8_IRQ_INIT(DE_PORT); | 2926 | GEN5_IRQ_INIT(GEN8_DE_PORT_); |
2931 | GEN8_IRQ_INIT(DE_MISC); | 2927 | GEN5_IRQ_INIT(GEN8_DE_MISC_); |
2932 | GEN8_IRQ_INIT(PCU); | 2928 | GEN5_IRQ_INIT(GEN8_PCU_); |
2933 | #undef GEN8_IRQ_INIT | ||
2934 | #undef GEN8_IRQ_INIT_NDX | ||
2935 | |||
2936 | POSTING_READ(GEN8_PCU_IIR); | ||
2937 | 2929 | ||
2938 | ibx_irq_preinstall(dev); | 2930 | ibx_irq_preinstall(dev); |
2939 | } | 2931 | } |