3 radeon fixes, I have some exynos fixes to push later but I'll queue them separately once I've looked them over a bit. * 'drm-fixes' of git://people.freedesktop.org/~airlied/linux: drm/radeon/kms: fix MSI re-arm on rv370+ drm/radeon/kms/atom: bios scratch reg handling updates drm/radeon/kms: drop lock in return path of radeon_fence_count_emitted.
Unified · Split
| @@ -789,9 +789,7 @@ int r100_irq_process(struct radeon_device *rdev) · 788 unmodified lines | ||
| 789 | 789 | WREG32(RADEON_AIC_CNTL, msi_rearm | RS400_MSI_REARM); |
| 790 | 790 | break; |
| 791 | 791 | default: |
| 792 | − msi_rearm = RREG32(RADEON_MSI_REARM_EN) & ~RV370_MSI_REARM_EN; | |
| 793 | − WREG32(RADEON_MSI_REARM_EN, msi_rearm); | |
| 794 | − WREG32(RADEON_MSI_REARM_EN, msi_rearm | RV370_MSI_REARM_EN); | |
| 792 | + WREG32(RADEON_MSI_REARM_EN, RV370_MSI_REARM_EN); | |
| 795 | 793 | break; |
| 796 | 794 | } |
| 797 | 795 | } |
| @@ -2931,6 +2931,20 @@ radeon_atombios_connected_scratch_regs(struct drm_connector *connector, · 2930 unmodified lines | ||
| 2931 | 2931 | bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP5; |
| 2932 | 2932 | } |
| 2933 | 2933 | } |
| 2934 | + if ((radeon_encoder->devices & ATOM_DEVICE_DFP6_SUPPORT) && | |
| 2935 | + (radeon_connector->devices & ATOM_DEVICE_DFP6_SUPPORT)) { | |
| 2936 | + if (connected) { | |
| 2937 | + DRM_DEBUG_KMS("DFP6 connected\n"); | |
| 2938 | + bios_0_scratch |= ATOM_S0_DFP6; | |
| 2939 | + bios_3_scratch |= ATOM_S3_DFP6_ACTIVE; | |
| 2940 | + bios_6_scratch |= ATOM_S6_ACC_REQ_DFP6; | |
| 2941 | + } else { | |
| 2942 | + DRM_DEBUG_KMS("DFP6 disconnected\n"); | |
| 2943 | + bios_0_scratch &= ~ATOM_S0_DFP6; | |
| 2944 | + bios_3_scratch &= ~ATOM_S3_DFP6_ACTIVE; | |
| 2945 | + bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP6; | |
| 2946 | + } | |
| 2947 | + } | |
| 2934 | 2948 | |
| 2935 | 2949 | if (rdev->family >= CHIP_R600) { |
| 2936 | 2950 | WREG32(R600_BIOS_0_SCRATCH, bios_0_scratch); |
| @@ -2951,6 +2965,9 @@ radeon_atombios_encoder_crtc_scratch_regs(struct drm_encoder *encoder, int crtc) · 14 unmodified lines | ||
| 2951 | 2965 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
| 2952 | 2966 | uint32_t bios_3_scratch; |
| 2953 | 2967 | |
| 2968 | + if (ASIC_IS_DCE4(rdev)) | |
| 2969 | + return; | |
| 2970 | + | |
| 2954 | 2971 | if (rdev->family >= CHIP_R600) |
| 2955 | 2972 | bios_3_scratch = RREG32(R600_BIOS_3_SCRATCH); |
| 2956 | 2973 | else |
| @@ -364,8 +364,10 @@ int radeon_fence_count_emitted(struct radeon_device *rdev, int ring) · 363 unmodified lines | ||
| 364 | 364 | int not_processed = 0; |
| 365 | 365 | |
| 366 | 366 | read_lock_irqsave(&rdev->fence_lock, irq_flags); |
| 367 | − if (!rdev->fence_drv[ring].initialized) | |
| 367 | + if (!rdev->fence_drv[ring].initialized) { | |
| 368 | + read_unlock_irqrestore(&rdev->fence_lock, irq_flags); | |
| 368 | 369 | return 0; |
| 370 | + } | |
| 369 | 371 | |
| 370 | 372 | if (!list_empty(&rdev->fence_drv[ring].emitted)) { |
| 371 | 373 | struct list_head *ptr; |
| @@ -684,9 +684,7 @@ int rs600_irq_process(struct radeon_device *rdev) · 683 unmodified lines | ||
| 684 | 684 | WREG32(RADEON_BUS_CNTL, msi_rearm | RS600_MSI_REARM); |
| 685 | 685 | break; |
| 686 | 686 | default: |
| 687 | − msi_rearm = RREG32(RADEON_MSI_REARM_EN) & ~RV370_MSI_REARM_EN; | |
| 688 | − WREG32(RADEON_MSI_REARM_EN, msi_rearm); | |
| 689 | − WREG32(RADEON_MSI_REARM_EN, msi_rearm | RV370_MSI_REARM_EN); | |
| 687 | + WREG32(RADEON_MSI_REARM_EN, RV370_MSI_REARM_EN); | |
| 690 | 688 | break; |
| 691 | 689 | } |
| 692 | 690 | } |