diff options
author | Alex Deucher <alexander.deucher@amd.com> | 2011-11-17 20:13:28 -0500 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2011-12-20 14:52:03 -0500 |
commit | 1b37078b7ddf35cab12ac6544187e3636d50c0dc (patch) | |
tree | f1a3621a98ab8ae5ffef14ae34a5b3454f14dcf9 | |
parent | b40e7e1608c332767e6b94bed7af84b30418e739 (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>
-rw-r--r-- | drivers/gpu/drm/radeon/evergreen.c | 58 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/ni.c | 9 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/nid.h | 9 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/r100.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/r600.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon.h | 30 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_fence.c | 8 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_irq_kms.c | 24 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/rs600.c | 2 |
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 @@ | |||
40 | static void evergreen_gpu_init(struct radeon_device *rdev); | 40 | static void evergreen_gpu_init(struct radeon_device *rdev); |
41 | void evergreen_fini(struct radeon_device *rdev); | 41 | void evergreen_fini(struct radeon_device *rdev); |
42 | void evergreen_pcie_gen2_enable(struct radeon_device *rdev); | 42 | void evergreen_pcie_gen2_enable(struct radeon_device *rdev); |
43 | extern void cayman_cp_int_cntl_setup(struct radeon_device *rdev, | ||
44 | int ring, u32 cp_int_cntl); | ||
43 | 45 | ||
44 | void evergreen_fix_pci_max_read_req_size(struct radeon_device *rdev) | 46 | void 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) | |||
2519 | int evergreen_irq_set(struct radeon_device *rdev) | 2527 | int 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 | ||
1009 | void 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 | ||
465 | struct radeon_irq { | 476 | struct 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 | ||
483 | int radeon_irq_kms_init(struct radeon_device *rdev); | 494 | int radeon_irq_kms_init(struct radeon_device *rdev); |
484 | void radeon_irq_kms_fini(struct radeon_device *rdev); | 495 | void radeon_irq_kms_fini(struct radeon_device *rdev); |
485 | void radeon_irq_kms_sw_irq_get(struct radeon_device *rdev); | 496 | void radeon_irq_kms_sw_irq_get(struct radeon_device *rdev, int ring); |
486 | void radeon_irq_kms_sw_irq_put(struct radeon_device *rdev); | 497 | void radeon_irq_kms_sw_irq_put(struct radeon_device *rdev, int ring); |
487 | void radeon_irq_kms_pflip_irq_get(struct radeon_device *rdev, int crtc); | 498 | void radeon_irq_kms_pflip_irq_get(struct radeon_device *rdev, int crtc); |
488 | void radeon_irq_kms_pflip_irq_put(struct radeon_device *rdev, int crtc); | 499 | void 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 | |||
505 | struct radeon_ib { | 505 | struct 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) | |||
81 | int radeon_driver_irq_postinstall_kms(struct drm_device *dev) | 82 | int 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 | ||
197 | void radeon_irq_kms_sw_irq_get(struct radeon_device *rdev) | 201 | void 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 | ||
209 | void radeon_irq_kms_sw_irq_put(struct radeon_device *rdev) | 213 | void 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) { |