aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm
diff options
context:
space:
mode:
authorAlex Deucher <alexander.deucher@amd.com>2011-11-17 20:13:28 -0500
committerDave Airlie <airlied@redhat.com>2011-12-20 14:52:03 -0500
commit1b37078b7ddf35cab12ac6544187e3636d50c0dc (patch)
treef1a3621a98ab8ae5ffef14ae34a5b3454f14dcf9 /drivers/gpu/drm
parentb40e7e1608c332767e6b94bed7af84b30418e739 (diff)
drm/radeon/kms: add support for per-ring fence interrupts
Signed-off-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Christian König <deathsimple@vodafone.de> Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r--drivers/gpu/drm/radeon/evergreen.c58
-rw-r--r--drivers/gpu/drm/radeon/ni.c9
-rw-r--r--drivers/gpu/drm/radeon/nid.h9
-rw-r--r--drivers/gpu/drm/radeon/r100.c2
-rw-r--r--drivers/gpu/drm/radeon/r600.c2
-rw-r--r--drivers/gpu/drm/radeon/radeon.h30
-rw-r--r--drivers/gpu/drm/radeon/radeon_fence.c8
-rw-r--r--drivers/gpu/drm/radeon/radeon_irq_kms.c24
-rw-r--r--drivers/gpu/drm/radeon/rs600.c2
9 files changed, 105 insertions, 39 deletions
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c
index 6ff1180c7321..266d411c6d2b 100644
--- a/drivers/gpu/drm/radeon/evergreen.c
+++ b/drivers/gpu/drm/radeon/evergreen.c
@@ -40,6 +40,8 @@
40static void evergreen_gpu_init(struct radeon_device *rdev); 40static void evergreen_gpu_init(struct radeon_device *rdev);
41void evergreen_fini(struct radeon_device *rdev); 41void evergreen_fini(struct radeon_device *rdev);
42void evergreen_pcie_gen2_enable(struct radeon_device *rdev); 42void evergreen_pcie_gen2_enable(struct radeon_device *rdev);
43extern void cayman_cp_int_cntl_setup(struct radeon_device *rdev,
44 int ring, u32 cp_int_cntl);
43 45
44void evergreen_fix_pci_max_read_req_size(struct radeon_device *rdev) 46void evergreen_fix_pci_max_read_req_size(struct radeon_device *rdev)
45{ 47{
@@ -2474,7 +2476,13 @@ void evergreen_disable_interrupt_state(struct radeon_device *rdev)
2474{ 2476{
2475 u32 tmp; 2477 u32 tmp;
2476 2478
2477 WREG32(CP_INT_CNTL, CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE); 2479 if (rdev->family >= CHIP_CAYMAN) {
2480 cayman_cp_int_cntl_setup(rdev, 0,
2481 CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
2482 cayman_cp_int_cntl_setup(rdev, 1, 0);
2483 cayman_cp_int_cntl_setup(rdev, 2, 0);
2484 } else
2485 WREG32(CP_INT_CNTL, CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE);
2478 WREG32(GRBM_INT_CNTL, 0); 2486 WREG32(GRBM_INT_CNTL, 0);
2479 WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0); 2487 WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0);
2480 WREG32(INT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0); 2488 WREG32(INT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0);
@@ -2519,6 +2527,7 @@ void evergreen_disable_interrupt_state(struct radeon_device *rdev)
2519int evergreen_irq_set(struct radeon_device *rdev) 2527int evergreen_irq_set(struct radeon_device *rdev)
2520{ 2528{
2521 u32 cp_int_cntl = CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE; 2529 u32 cp_int_cntl = CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE;
2530 u32 cp_int_cntl1 = 0, cp_int_cntl2 = 0;
2522 u32 crtc1 = 0, crtc2 = 0, crtc3 = 0, crtc4 = 0, crtc5 = 0, crtc6 = 0; 2531 u32 crtc1 = 0, crtc2 = 0, crtc3 = 0, crtc4 = 0, crtc5 = 0, crtc6 = 0;
2523 u32 hpd1, hpd2, hpd3, hpd4, hpd5, hpd6; 2532 u32 hpd1, hpd2, hpd3, hpd4, hpd5, hpd6;
2524 u32 grbm_int_cntl = 0; 2533 u32 grbm_int_cntl = 0;
@@ -2543,11 +2552,28 @@ int evergreen_irq_set(struct radeon_device *rdev)
2543 hpd5 = RREG32(DC_HPD5_INT_CONTROL) & ~DC_HPDx_INT_EN; 2552 hpd5 = RREG32(DC_HPD5_INT_CONTROL) & ~DC_HPDx_INT_EN;
2544 hpd6 = RREG32(DC_HPD6_INT_CONTROL) & ~DC_HPDx_INT_EN; 2553 hpd6 = RREG32(DC_HPD6_INT_CONTROL) & ~DC_HPDx_INT_EN;
2545 2554
2546 if (rdev->irq.sw_int) { 2555 if (rdev->family >= CHIP_CAYMAN) {
2547 DRM_DEBUG("evergreen_irq_set: sw int\n"); 2556 /* enable CP interrupts on all rings */
2548 cp_int_cntl |= RB_INT_ENABLE; 2557 if (rdev->irq.sw_int[RADEON_RING_TYPE_GFX_INDEX]) {
2549 cp_int_cntl |= TIME_STAMP_INT_ENABLE; 2558 DRM_DEBUG("evergreen_irq_set: sw int gfx\n");
2559 cp_int_cntl |= TIME_STAMP_INT_ENABLE;
2560 }
2561 if (rdev->irq.sw_int[CAYMAN_RING_TYPE_CP1_INDEX]) {
2562 DRM_DEBUG("evergreen_irq_set: sw int cp1\n");
2563 cp_int_cntl1 |= TIME_STAMP_INT_ENABLE;
2564 }
2565 if (rdev->irq.sw_int[CAYMAN_RING_TYPE_CP2_INDEX]) {
2566 DRM_DEBUG("evergreen_irq_set: sw int cp2\n");
2567 cp_int_cntl2 |= TIME_STAMP_INT_ENABLE;
2568 }
2569 } else {
2570 if (rdev->irq.sw_int[RADEON_RING_TYPE_GFX_INDEX]) {
2571 DRM_DEBUG("evergreen_irq_set: sw int gfx\n");
2572 cp_int_cntl |= RB_INT_ENABLE;
2573 cp_int_cntl |= TIME_STAMP_INT_ENABLE;
2574 }
2550 } 2575 }
2576
2551 if (rdev->irq.crtc_vblank_int[0] || 2577 if (rdev->irq.crtc_vblank_int[0] ||
2552 rdev->irq.pflip[0]) { 2578 rdev->irq.pflip[0]) {
2553 DRM_DEBUG("evergreen_irq_set: vblank 0\n"); 2579 DRM_DEBUG("evergreen_irq_set: vblank 0\n");
@@ -2607,7 +2633,12 @@ int evergreen_irq_set(struct radeon_device *rdev)
2607 grbm_int_cntl |= GUI_IDLE_INT_ENABLE; 2633 grbm_int_cntl |= GUI_IDLE_INT_ENABLE;
2608 } 2634 }
2609 2635
2610 WREG32(CP_INT_CNTL, cp_int_cntl); 2636 if (rdev->family >= CHIP_CAYMAN) {
2637 cayman_cp_int_cntl_setup(rdev, 0, cp_int_cntl);
2638 cayman_cp_int_cntl_setup(rdev, 1, cp_int_cntl1);
2639 cayman_cp_int_cntl_setup(rdev, 2, cp_int_cntl2);
2640 } else
2641 WREG32(CP_INT_CNTL, cp_int_cntl);
2611 WREG32(GRBM_INT_CNTL, grbm_int_cntl); 2642 WREG32(GRBM_INT_CNTL, grbm_int_cntl);
2612 2643
2613 WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, crtc1); 2644 WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, crtc1);
@@ -3026,7 +3057,20 @@ restart_ih:
3026 break; 3057 break;
3027 case 181: /* CP EOP event */ 3058 case 181: /* CP EOP event */
3028 DRM_DEBUG("IH: CP EOP\n"); 3059 DRM_DEBUG("IH: CP EOP\n");
3029 radeon_fence_process(rdev, RADEON_RING_TYPE_GFX_INDEX); 3060 if (rdev->family >= CHIP_CAYMAN) {
3061 switch (src_data) {
3062 case 0:
3063 radeon_fence_process(rdev, RADEON_RING_TYPE_GFX_INDEX);
3064 break;
3065 case 1:
3066 radeon_fence_process(rdev, CAYMAN_RING_TYPE_CP1_INDEX);
3067 break;
3068 case 2:
3069 radeon_fence_process(rdev, CAYMAN_RING_TYPE_CP2_INDEX);
3070 break;
3071 }
3072 } else
3073 radeon_fence_process(rdev, RADEON_RING_TYPE_GFX_INDEX);
3030 break; 3074 break;
3031 case 233: /* GUI IDLE */ 3075 case 233: /* GUI IDLE */
3032 DRM_DEBUG("IH: GUI idle\n"); 3076 DRM_DEBUG("IH: GUI idle\n");
diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c
index 26d066442934..30562622b94a 100644
--- a/drivers/gpu/drm/radeon/ni.c
+++ b/drivers/gpu/drm/radeon/ni.c
@@ -1006,6 +1006,15 @@ void cayman_pcie_gart_fini(struct radeon_device *rdev)
1006 radeon_gart_fini(rdev); 1006 radeon_gart_fini(rdev);
1007} 1007}
1008 1008
1009void cayman_cp_int_cntl_setup(struct radeon_device *rdev,
1010 int ring, u32 cp_int_cntl)
1011{
1012 u32 srbm_gfx_cntl = RREG32(SRBM_GFX_CNTL) & ~3;
1013
1014 WREG32(SRBM_GFX_CNTL, srbm_gfx_cntl | (ring & 3));
1015 WREG32(CP_INT_CNTL, cp_int_cntl);
1016}
1017
1009/* 1018/*
1010 * CP. 1019 * CP.
1011 */ 1020 */
diff --git a/drivers/gpu/drm/radeon/nid.h b/drivers/gpu/drm/radeon/nid.h
index e8d8124834b3..0d3f52cff2f6 100644
--- a/drivers/gpu/drm/radeon/nid.h
+++ b/drivers/gpu/drm/radeon/nid.h
@@ -42,6 +42,9 @@
42#define CAYMAN_MAX_TCC_MASK 0xFF 42#define CAYMAN_MAX_TCC_MASK 0xFF
43 43
44#define DMIF_ADDR_CONFIG 0xBD4 44#define DMIF_ADDR_CONFIG 0xBD4
45#define SRBM_GFX_CNTL 0x0E44
46#define RINGID(x) (((x) & 0x3) << 0)
47#define VMID(x) (((x) & 0x7) << 0)
45#define SRBM_STATUS 0x0E50 48#define SRBM_STATUS 0x0E50
46 49
47#define VM_CONTEXT0_REQUEST_RESPONSE 0x1470 50#define VM_CONTEXT0_REQUEST_RESPONSE 0x1470
@@ -394,6 +397,12 @@
394#define CP_RB0_RPTR_ADDR 0xC10C 397#define CP_RB0_RPTR_ADDR 0xC10C
395#define CP_RB0_RPTR_ADDR_HI 0xC110 398#define CP_RB0_RPTR_ADDR_HI 0xC110
396#define CP_RB0_WPTR 0xC114 399#define CP_RB0_WPTR 0xC114
400
401#define CP_INT_CNTL 0xC124
402# define CNTX_BUSY_INT_ENABLE (1 << 19)
403# define CNTX_EMPTY_INT_ENABLE (1 << 20)
404# define TIME_STAMP_INT_ENABLE (1 << 26)
405
397#define CP_RB1_BASE 0xC180 406#define CP_RB1_BASE 0xC180
398#define CP_RB1_CNTL 0xC184 407#define CP_RB1_CNTL 0xC184
399#define CP_RB1_RPTR_ADDR 0xC188 408#define CP_RB1_RPTR_ADDR 0xC188
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c
index 3ef2c58b8407..d7fd5aa47053 100644
--- a/drivers/gpu/drm/radeon/r100.c
+++ b/drivers/gpu/drm/radeon/r100.c
@@ -667,7 +667,7 @@ int r100_irq_set(struct radeon_device *rdev)
667 WREG32(R_000040_GEN_INT_CNTL, 0); 667 WREG32(R_000040_GEN_INT_CNTL, 0);
668 return -EINVAL; 668 return -EINVAL;
669 } 669 }
670 if (rdev->irq.sw_int) { 670 if (rdev->irq.sw_int[RADEON_RING_TYPE_GFX_INDEX]) {
671 tmp |= RADEON_SW_INT_ENABLE; 671 tmp |= RADEON_SW_INT_ENABLE;
672 } 672 }
673 if (rdev->irq.gui_idle) { 673 if (rdev->irq.gui_idle) {
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
index 48bd8202b5c9..0f39cc661a7e 100644
--- a/drivers/gpu/drm/radeon/r600.c
+++ b/drivers/gpu/drm/radeon/r600.c
@@ -3098,7 +3098,7 @@ int r600_irq_set(struct radeon_device *rdev)
3098 hpd3 = RREG32(DC_HOT_PLUG_DETECT3_INT_CONTROL) & ~DC_HPDx_INT_EN; 3098 hpd3 = RREG32(DC_HOT_PLUG_DETECT3_INT_CONTROL) & ~DC_HPDx_INT_EN;
3099 } 3099 }
3100 3100
3101 if (rdev->irq.sw_int) { 3101 if (rdev->irq.sw_int[RADEON_RING_TYPE_GFX_INDEX]) {
3102 DRM_DEBUG("r600_irq_set: sw int\n"); 3102 DRM_DEBUG("r600_irq_set: sw int\n");
3103 cp_int_cntl |= RB_INT_ENABLE; 3103 cp_int_cntl |= RB_INT_ENABLE;
3104 cp_int_cntl |= TIME_STAMP_INT_ENABLE; 3104 cp_int_cntl |= TIME_STAMP_INT_ENABLE;
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index e5d5271d7a9c..b4c2d0fe34e3 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -107,6 +107,17 @@ extern int radeon_msi;
107#define RADEONFB_CONN_LIMIT 4 107#define RADEONFB_CONN_LIMIT 4
108#define RADEON_BIOS_NUM_SCRATCH 8 108#define RADEON_BIOS_NUM_SCRATCH 8
109 109
110/* max number of rings */
111#define RADEON_NUM_RINGS 3
112
113/* internal ring indices */
114/* r1xx+ has gfx CP ring */
115#define RADEON_RING_TYPE_GFX_INDEX 0
116
117/* cayman has 2 compute CP rings */
118#define CAYMAN_RING_TYPE_CP1_INDEX 1
119#define CAYMAN_RING_TYPE_CP2_INDEX 2
120
110/* 121/*
111 * Errata workarounds. 122 * Errata workarounds.
112 */ 123 */
@@ -464,7 +475,7 @@ union radeon_irq_stat_regs {
464 475
465struct radeon_irq { 476struct radeon_irq {
466 bool installed; 477 bool installed;
467 bool sw_int; 478 bool sw_int[RADEON_NUM_RINGS];
468 bool crtc_vblank_int[RADEON_MAX_CRTCS]; 479 bool crtc_vblank_int[RADEON_MAX_CRTCS];
469 bool pflip[RADEON_MAX_CRTCS]; 480 bool pflip[RADEON_MAX_CRTCS];
470 wait_queue_head_t vblank_queue; 481 wait_queue_head_t vblank_queue;
@@ -474,7 +485,7 @@ struct radeon_irq {
474 wait_queue_head_t idle_queue; 485 wait_queue_head_t idle_queue;
475 bool hdmi[RADEON_MAX_HDMI_BLOCKS]; 486 bool hdmi[RADEON_MAX_HDMI_BLOCKS];
476 spinlock_t sw_lock; 487 spinlock_t sw_lock;
477 int sw_refcount; 488 int sw_refcount[RADEON_NUM_RINGS];
478 union radeon_irq_stat_regs stat_regs; 489 union radeon_irq_stat_regs stat_regs;
479 spinlock_t pflip_lock[RADEON_MAX_CRTCS]; 490 spinlock_t pflip_lock[RADEON_MAX_CRTCS];
480 int pflip_refcount[RADEON_MAX_CRTCS]; 491 int pflip_refcount[RADEON_MAX_CRTCS];
@@ -482,8 +493,8 @@ struct radeon_irq {
482 493
483int radeon_irq_kms_init(struct radeon_device *rdev); 494int radeon_irq_kms_init(struct radeon_device *rdev);
484void radeon_irq_kms_fini(struct radeon_device *rdev); 495void radeon_irq_kms_fini(struct radeon_device *rdev);
485void radeon_irq_kms_sw_irq_get(struct radeon_device *rdev); 496void radeon_irq_kms_sw_irq_get(struct radeon_device *rdev, int ring);
486void radeon_irq_kms_sw_irq_put(struct radeon_device *rdev); 497void radeon_irq_kms_sw_irq_put(struct radeon_device *rdev, int ring);
487void radeon_irq_kms_pflip_irq_get(struct radeon_device *rdev, int crtc); 498void radeon_irq_kms_pflip_irq_get(struct radeon_device *rdev, int crtc);
488void radeon_irq_kms_pflip_irq_put(struct radeon_device *rdev, int crtc); 499void radeon_irq_kms_pflip_irq_put(struct radeon_device *rdev, int crtc);
489 500
@@ -491,17 +502,6 @@ void radeon_irq_kms_pflip_irq_put(struct radeon_device *rdev, int crtc);
491 * CP & rings. 502 * CP & rings.
492 */ 503 */
493 504
494/* max number of rings */
495#define RADEON_NUM_RINGS 3
496
497/* internal ring indices */
498/* r1xx+ has gfx CP ring */
499#define RADEON_RING_TYPE_GFX_INDEX 0
500
501/* cayman has 2 compute CP rings */
502#define CAYMAN_RING_TYPE_CP1_INDEX 1
503#define CAYMAN_RING_TYPE_CP2_INDEX 2
504
505struct radeon_ib { 505struct radeon_ib {
506 struct list_head list; 506 struct list_head list;
507 unsigned idx; 507 unsigned idx;
diff --git a/drivers/gpu/drm/radeon/radeon_fence.c b/drivers/gpu/drm/radeon/radeon_fence.c
index 8d626baaa064..ae9e3da594a1 100644
--- a/drivers/gpu/drm/radeon/radeon_fence.c
+++ b/drivers/gpu/drm/radeon/radeon_fence.c
@@ -230,18 +230,18 @@ retry:
230 seq = rdev->fence_drv[fence->ring].last_seq; 230 seq = rdev->fence_drv[fence->ring].last_seq;
231 trace_radeon_fence_wait_begin(rdev->ddev, seq); 231 trace_radeon_fence_wait_begin(rdev->ddev, seq);
232 if (intr) { 232 if (intr) {
233 radeon_irq_kms_sw_irq_get(rdev); 233 radeon_irq_kms_sw_irq_get(rdev, fence->ring);
234 r = wait_event_interruptible_timeout(rdev->fence_drv[fence->ring].queue, 234 r = wait_event_interruptible_timeout(rdev->fence_drv[fence->ring].queue,
235 radeon_fence_signaled(fence), timeout); 235 radeon_fence_signaled(fence), timeout);
236 radeon_irq_kms_sw_irq_put(rdev); 236 radeon_irq_kms_sw_irq_put(rdev, fence->ring);
237 if (unlikely(r < 0)) { 237 if (unlikely(r < 0)) {
238 return r; 238 return r;
239 } 239 }
240 } else { 240 } else {
241 radeon_irq_kms_sw_irq_get(rdev); 241 radeon_irq_kms_sw_irq_get(rdev, fence->ring);
242 r = wait_event_timeout(rdev->fence_drv[fence->ring].queue, 242 r = wait_event_timeout(rdev->fence_drv[fence->ring].queue,
243 radeon_fence_signaled(fence), timeout); 243 radeon_fence_signaled(fence), timeout);
244 radeon_irq_kms_sw_irq_put(rdev); 244 radeon_irq_kms_sw_irq_put(rdev, fence->ring);
245 } 245 }
246 trace_radeon_fence_wait_end(rdev->ddev, seq); 246 trace_radeon_fence_wait_end(rdev->ddev, seq);
247 if (unlikely(!radeon_fence_signaled(fence))) { 247 if (unlikely(!radeon_fence_signaled(fence))) {
diff --git a/drivers/gpu/drm/radeon/radeon_irq_kms.c b/drivers/gpu/drm/radeon/radeon_irq_kms.c
index 8f86aeb26693..be38921bf761 100644
--- a/drivers/gpu/drm/radeon/radeon_irq_kms.c
+++ b/drivers/gpu/drm/radeon/radeon_irq_kms.c
@@ -65,7 +65,8 @@ void radeon_driver_irq_preinstall_kms(struct drm_device *dev)
65 unsigned i; 65 unsigned i;
66 66
67 /* Disable *all* interrupts */ 67 /* Disable *all* interrupts */
68 rdev->irq.sw_int = false; 68 for (i = 0; i < RADEON_NUM_RINGS; i++)
69 rdev->irq.sw_int[i] = false;
69 rdev->irq.gui_idle = false; 70 rdev->irq.gui_idle = false;
70 for (i = 0; i < RADEON_MAX_HPD_PINS; i++) 71 for (i = 0; i < RADEON_MAX_HPD_PINS; i++)
71 rdev->irq.hpd[i] = false; 72 rdev->irq.hpd[i] = false;
@@ -81,9 +82,11 @@ void radeon_driver_irq_preinstall_kms(struct drm_device *dev)
81int radeon_driver_irq_postinstall_kms(struct drm_device *dev) 82int radeon_driver_irq_postinstall_kms(struct drm_device *dev)
82{ 83{
83 struct radeon_device *rdev = dev->dev_private; 84 struct radeon_device *rdev = dev->dev_private;
85 unsigned i;
84 86
85 dev->max_vblank_count = 0x001fffff; 87 dev->max_vblank_count = 0x001fffff;
86 rdev->irq.sw_int = true; 88 for (i = 0; i < RADEON_NUM_RINGS; i++)
89 rdev->irq.sw_int[i] = true;
87 radeon_irq_set(rdev); 90 radeon_irq_set(rdev);
88 return 0; 91 return 0;
89} 92}
@@ -97,7 +100,8 @@ void radeon_driver_irq_uninstall_kms(struct drm_device *dev)
97 return; 100 return;
98 } 101 }
99 /* Disable *all* interrupts */ 102 /* Disable *all* interrupts */
100 rdev->irq.sw_int = false; 103 for (i = 0; i < RADEON_NUM_RINGS; i++)
104 rdev->irq.sw_int[i] = false;
101 rdev->irq.gui_idle = false; 105 rdev->irq.gui_idle = false;
102 for (i = 0; i < RADEON_MAX_HPD_PINS; i++) 106 for (i = 0; i < RADEON_MAX_HPD_PINS; i++)
103 rdev->irq.hpd[i] = false; 107 rdev->irq.hpd[i] = false;
@@ -194,26 +198,26 @@ void radeon_irq_kms_fini(struct radeon_device *rdev)
194 flush_work_sync(&rdev->hotplug_work); 198 flush_work_sync(&rdev->hotplug_work);
195} 199}
196 200
197void radeon_irq_kms_sw_irq_get(struct radeon_device *rdev) 201void radeon_irq_kms_sw_irq_get(struct radeon_device *rdev, int ring)
198{ 202{
199 unsigned long irqflags; 203 unsigned long irqflags;
200 204
201 spin_lock_irqsave(&rdev->irq.sw_lock, irqflags); 205 spin_lock_irqsave(&rdev->irq.sw_lock, irqflags);
202 if (rdev->ddev->irq_enabled && (++rdev->irq.sw_refcount == 1)) { 206 if (rdev->ddev->irq_enabled && (++rdev->irq.sw_refcount[ring] == 1)) {
203 rdev->irq.sw_int = true; 207 rdev->irq.sw_int[ring] = true;
204 radeon_irq_set(rdev); 208 radeon_irq_set(rdev);
205 } 209 }
206 spin_unlock_irqrestore(&rdev->irq.sw_lock, irqflags); 210 spin_unlock_irqrestore(&rdev->irq.sw_lock, irqflags);
207} 211}
208 212
209void radeon_irq_kms_sw_irq_put(struct radeon_device *rdev) 213void radeon_irq_kms_sw_irq_put(struct radeon_device *rdev, int ring)
210{ 214{
211 unsigned long irqflags; 215 unsigned long irqflags;
212 216
213 spin_lock_irqsave(&rdev->irq.sw_lock, irqflags); 217 spin_lock_irqsave(&rdev->irq.sw_lock, irqflags);
214 BUG_ON(rdev->ddev->irq_enabled && rdev->irq.sw_refcount <= 0); 218 BUG_ON(rdev->ddev->irq_enabled && rdev->irq.sw_refcount[ring] <= 0);
215 if (rdev->ddev->irq_enabled && (--rdev->irq.sw_refcount == 0)) { 219 if (rdev->ddev->irq_enabled && (--rdev->irq.sw_refcount[ring] == 0)) {
216 rdev->irq.sw_int = false; 220 rdev->irq.sw_int[ring] = false;
217 radeon_irq_set(rdev); 221 radeon_irq_set(rdev);
218 } 222 }
219 spin_unlock_irqrestore(&rdev->irq.sw_lock, irqflags); 223 spin_unlock_irqrestore(&rdev->irq.sw_lock, irqflags);
diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c
index 3fe384741fc0..8a52cf007ff0 100644
--- a/drivers/gpu/drm/radeon/rs600.c
+++ b/drivers/gpu/drm/radeon/rs600.c
@@ -549,7 +549,7 @@ int rs600_irq_set(struct radeon_device *rdev)
549 WREG32(R_000040_GEN_INT_CNTL, 0); 549 WREG32(R_000040_GEN_INT_CNTL, 0);
550 return -EINVAL; 550 return -EINVAL;
551 } 551 }
552 if (rdev->irq.sw_int) { 552 if (rdev->irq.sw_int[RADEON_RING_TYPE_GFX_INDEX]) {
553 tmp |= S_000040_SW_INT_EN(1); 553 tmp |= S_000040_SW_INT_EN(1);
554 } 554 }
555 if (rdev->irq.gui_idle) { 555 if (rdev->irq.gui_idle) {