diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/gpu/drm/radeon/atombios_dp.c | 7 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/atombios_encoders.c | 21 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/cik.c | 8 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/cikd.h | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/evergreen.c | 7 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/evergreend.h | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/ni.c | 10 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/nid.h | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/r600_dpm.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_cs.c | 16 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_encoders.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_pm.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/si.c | 22 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/sid.h | 4 |
14 files changed, 98 insertions, 20 deletions
diff --git a/drivers/gpu/drm/radeon/atombios_dp.c b/drivers/gpu/drm/radeon/atombios_dp.c index 5bf825dfaa09..8d74de82456e 100644 --- a/drivers/gpu/drm/radeon/atombios_dp.c +++ b/drivers/gpu/drm/radeon/atombios_dp.c | |||
| @@ -178,6 +178,13 @@ radeon_dp_aux_transfer(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg) | |||
| 178 | switch (msg->request & ~DP_AUX_I2C_MOT) { | 178 | switch (msg->request & ~DP_AUX_I2C_MOT) { |
| 179 | case DP_AUX_NATIVE_WRITE: | 179 | case DP_AUX_NATIVE_WRITE: |
| 180 | case DP_AUX_I2C_WRITE: | 180 | case DP_AUX_I2C_WRITE: |
| 181 | /* The atom implementation only supports writes with a max payload of | ||
| 182 | * 12 bytes since it uses 4 bits for the total count (header + payload) | ||
| 183 | * in the parameter space. The atom interface supports 16 byte | ||
| 184 | * payloads for reads. The hw itself supports up to 16 bytes of payload. | ||
| 185 | */ | ||
| 186 | if (WARN_ON_ONCE(msg->size > 12)) | ||
| 187 | return -E2BIG; | ||
| 181 | /* tx_size needs to be 4 even for bare address packets since the atom | 188 | /* tx_size needs to be 4 even for bare address packets since the atom |
| 182 | * table needs the info in tx_buf[3]. | 189 | * table needs the info in tx_buf[3]. |
| 183 | */ | 190 | */ |
diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c index 7c9df1eac065..7fe7b749e182 100644 --- a/drivers/gpu/drm/radeon/atombios_encoders.c +++ b/drivers/gpu/drm/radeon/atombios_encoders.c | |||
| @@ -731,7 +731,9 @@ atombios_get_encoder_mode(struct drm_encoder *encoder) | |||
| 731 | dig_connector = radeon_connector->con_priv; | 731 | dig_connector = radeon_connector->con_priv; |
| 732 | if ((dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) || | 732 | if ((dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) || |
| 733 | (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) { | 733 | (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) { |
| 734 | if (radeon_audio != 0 && ASIC_IS_DCE4(rdev) && !ASIC_IS_DCE5(rdev)) | 734 | if (radeon_audio != 0 && |
| 735 | drm_detect_monitor_audio(radeon_connector_edid(connector)) && | ||
| 736 | ASIC_IS_DCE4(rdev) && !ASIC_IS_DCE5(rdev)) | ||
| 735 | return ATOM_ENCODER_MODE_DP_AUDIO; | 737 | return ATOM_ENCODER_MODE_DP_AUDIO; |
| 736 | return ATOM_ENCODER_MODE_DP; | 738 | return ATOM_ENCODER_MODE_DP; |
| 737 | } else if (radeon_audio != 0) { | 739 | } else if (radeon_audio != 0) { |
| @@ -747,7 +749,9 @@ atombios_get_encoder_mode(struct drm_encoder *encoder) | |||
| 747 | } | 749 | } |
| 748 | break; | 750 | break; |
| 749 | case DRM_MODE_CONNECTOR_eDP: | 751 | case DRM_MODE_CONNECTOR_eDP: |
| 750 | if (radeon_audio != 0 && ASIC_IS_DCE4(rdev) && !ASIC_IS_DCE5(rdev)) | 752 | if (radeon_audio != 0 && |
| 753 | drm_detect_monitor_audio(radeon_connector_edid(connector)) && | ||
| 754 | ASIC_IS_DCE4(rdev) && !ASIC_IS_DCE5(rdev)) | ||
| 751 | return ATOM_ENCODER_MODE_DP_AUDIO; | 755 | return ATOM_ENCODER_MODE_DP_AUDIO; |
| 752 | return ATOM_ENCODER_MODE_DP; | 756 | return ATOM_ENCODER_MODE_DP; |
| 753 | case DRM_MODE_CONNECTOR_DVIA: | 757 | case DRM_MODE_CONNECTOR_DVIA: |
| @@ -1720,8 +1724,10 @@ radeon_atom_encoder_dpms_dig(struct drm_encoder *encoder, int mode) | |||
| 1720 | } | 1724 | } |
| 1721 | 1725 | ||
| 1722 | encoder_mode = atombios_get_encoder_mode(encoder); | 1726 | encoder_mode = atombios_get_encoder_mode(encoder); |
| 1723 | if (radeon_audio != 0 && | 1727 | if (connector && (radeon_audio != 0) && |
| 1724 | (encoder_mode == ATOM_ENCODER_MODE_HDMI || ENCODER_MODE_IS_DP(encoder_mode))) | 1728 | ((encoder_mode == ATOM_ENCODER_MODE_HDMI) || |
| 1729 | (ENCODER_MODE_IS_DP(encoder_mode) && | ||
| 1730 | drm_detect_monitor_audio(radeon_connector_edid(connector))))) | ||
| 1725 | radeon_audio_dpms(encoder, mode); | 1731 | radeon_audio_dpms(encoder, mode); |
| 1726 | } | 1732 | } |
| 1727 | 1733 | ||
| @@ -2136,6 +2142,7 @@ radeon_atom_encoder_mode_set(struct drm_encoder *encoder, | |||
| 2136 | struct drm_device *dev = encoder->dev; | 2142 | struct drm_device *dev = encoder->dev; |
| 2137 | struct radeon_device *rdev = dev->dev_private; | 2143 | struct radeon_device *rdev = dev->dev_private; |
| 2138 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | 2144 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
| 2145 | struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); | ||
| 2139 | int encoder_mode; | 2146 | int encoder_mode; |
| 2140 | 2147 | ||
| 2141 | radeon_encoder->pixel_clock = adjusted_mode->clock; | 2148 | radeon_encoder->pixel_clock = adjusted_mode->clock; |
| @@ -2164,8 +2171,10 @@ radeon_atom_encoder_mode_set(struct drm_encoder *encoder, | |||
| 2164 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: | 2171 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: |
| 2165 | /* handled in dpms */ | 2172 | /* handled in dpms */ |
| 2166 | encoder_mode = atombios_get_encoder_mode(encoder); | 2173 | encoder_mode = atombios_get_encoder_mode(encoder); |
| 2167 | if (radeon_audio != 0 && | 2174 | if (connector && (radeon_audio != 0) && |
| 2168 | (encoder_mode == ATOM_ENCODER_MODE_HDMI || ENCODER_MODE_IS_DP(encoder_mode))) | 2175 | ((encoder_mode == ATOM_ENCODER_MODE_HDMI) || |
| 2176 | (ENCODER_MODE_IS_DP(encoder_mode) && | ||
| 2177 | drm_detect_monitor_audio(radeon_connector_edid(connector))))) | ||
| 2169 | radeon_audio_mode_set(encoder, adjusted_mode); | 2178 | radeon_audio_mode_set(encoder, adjusted_mode); |
| 2170 | break; | 2179 | break; |
| 2171 | case ENCODER_OBJECT_ID_INTERNAL_DDI: | 2180 | case ENCODER_OBJECT_ID_INTERNAL_DDI: |
diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c index e6a4ba236c70..0c993da9c8fb 100644 --- a/drivers/gpu/drm/radeon/cik.c +++ b/drivers/gpu/drm/radeon/cik.c | |||
| @@ -3613,6 +3613,8 @@ static void cik_gpu_init(struct radeon_device *rdev) | |||
| 3613 | } | 3613 | } |
| 3614 | 3614 | ||
| 3615 | WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff)); | 3615 | WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff)); |
| 3616 | WREG32(SRBM_INT_CNTL, 0x1); | ||
| 3617 | WREG32(SRBM_INT_ACK, 0x1); | ||
| 3616 | 3618 | ||
| 3617 | WREG32(BIF_FB_EN, FB_READ_EN | FB_WRITE_EN); | 3619 | WREG32(BIF_FB_EN, FB_READ_EN | FB_WRITE_EN); |
| 3618 | 3620 | ||
| @@ -7230,6 +7232,8 @@ static void cik_disable_interrupt_state(struct radeon_device *rdev) | |||
| 7230 | WREG32(CP_ME2_PIPE3_INT_CNTL, 0); | 7232 | WREG32(CP_ME2_PIPE3_INT_CNTL, 0); |
| 7231 | /* grbm */ | 7233 | /* grbm */ |
| 7232 | WREG32(GRBM_INT_CNTL, 0); | 7234 | WREG32(GRBM_INT_CNTL, 0); |
| 7235 | /* SRBM */ | ||
| 7236 | WREG32(SRBM_INT_CNTL, 0); | ||
| 7233 | /* vline/vblank, etc. */ | 7237 | /* vline/vblank, etc. */ |
| 7234 | WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0); | 7238 | WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0); |
| 7235 | WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0); | 7239 | WREG32(LB_INTERRUPT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0); |
| @@ -8046,6 +8050,10 @@ restart_ih: | |||
| 8046 | break; | 8050 | break; |
| 8047 | } | 8051 | } |
| 8048 | break; | 8052 | break; |
| 8053 | case 96: | ||
| 8054 | DRM_ERROR("SRBM_READ_ERROR: 0x%x\n", RREG32(SRBM_READ_ERROR)); | ||
| 8055 | WREG32(SRBM_INT_ACK, 0x1); | ||
| 8056 | break; | ||
| 8049 | case 124: /* UVD */ | 8057 | case 124: /* UVD */ |
| 8050 | DRM_DEBUG("IH: UVD int: 0x%08x\n", src_data); | 8058 | DRM_DEBUG("IH: UVD int: 0x%08x\n", src_data); |
| 8051 | radeon_fence_process(rdev, R600_RING_TYPE_UVD_INDEX); | 8059 | radeon_fence_process(rdev, R600_RING_TYPE_UVD_INDEX); |
diff --git a/drivers/gpu/drm/radeon/cikd.h b/drivers/gpu/drm/radeon/cikd.h index 03003f8a6de6..c648e1996dab 100644 --- a/drivers/gpu/drm/radeon/cikd.h +++ b/drivers/gpu/drm/radeon/cikd.h | |||
| @@ -482,6 +482,10 @@ | |||
| 482 | #define SOFT_RESET_ORB (1 << 23) | 482 | #define SOFT_RESET_ORB (1 << 23) |
| 483 | #define SOFT_RESET_VCE (1 << 24) | 483 | #define SOFT_RESET_VCE (1 << 24) |
| 484 | 484 | ||
| 485 | #define SRBM_READ_ERROR 0xE98 | ||
| 486 | #define SRBM_INT_CNTL 0xEA0 | ||
| 487 | #define SRBM_INT_ACK 0xEA8 | ||
| 488 | |||
| 485 | #define VM_L2_CNTL 0x1400 | 489 | #define VM_L2_CNTL 0x1400 |
| 486 | #define ENABLE_L2_CACHE (1 << 0) | 490 | #define ENABLE_L2_CACHE (1 << 0) |
| 487 | #define ENABLE_L2_FRAGMENT_PROCESSING (1 << 1) | 491 | #define ENABLE_L2_FRAGMENT_PROCESSING (1 << 1) |
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index 78600f534c80..4c0e24b3bb90 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c | |||
| @@ -3253,6 +3253,8 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | |||
| 3253 | } | 3253 | } |
| 3254 | 3254 | ||
| 3255 | WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff)); | 3255 | WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff)); |
| 3256 | WREG32(SRBM_INT_CNTL, 0x1); | ||
| 3257 | WREG32(SRBM_INT_ACK, 0x1); | ||
| 3256 | 3258 | ||
| 3257 | evergreen_fix_pci_max_read_req_size(rdev); | 3259 | evergreen_fix_pci_max_read_req_size(rdev); |
| 3258 | 3260 | ||
| @@ -4324,6 +4326,7 @@ void evergreen_disable_interrupt_state(struct radeon_device *rdev) | |||
| 4324 | tmp = RREG32(DMA_CNTL) & ~TRAP_ENABLE; | 4326 | tmp = RREG32(DMA_CNTL) & ~TRAP_ENABLE; |
| 4325 | WREG32(DMA_CNTL, tmp); | 4327 | WREG32(DMA_CNTL, tmp); |
| 4326 | WREG32(GRBM_INT_CNTL, 0); | 4328 | WREG32(GRBM_INT_CNTL, 0); |
| 4329 | WREG32(SRBM_INT_CNTL, 0); | ||
| 4327 | WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0); | 4330 | WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0); |
| 4328 | WREG32(INT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0); | 4331 | WREG32(INT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0); |
| 4329 | if (rdev->num_crtc >= 4) { | 4332 | if (rdev->num_crtc >= 4) { |
| @@ -5066,6 +5069,10 @@ restart_ih: | |||
| 5066 | DRM_ERROR("Unhandled interrupt: %d %d\n", src_id, src_data); | 5069 | DRM_ERROR("Unhandled interrupt: %d %d\n", src_id, src_data); |
| 5067 | break; | 5070 | break; |
| 5068 | } | 5071 | } |
| 5072 | case 96: | ||
| 5073 | DRM_ERROR("SRBM_READ_ERROR: 0x%x\n", RREG32(SRBM_READ_ERROR)); | ||
| 5074 | WREG32(SRBM_INT_ACK, 0x1); | ||
| 5075 | break; | ||
| 5069 | case 124: /* UVD */ | 5076 | case 124: /* UVD */ |
| 5070 | DRM_DEBUG("IH: UVD int: 0x%08x\n", src_data); | 5077 | DRM_DEBUG("IH: UVD int: 0x%08x\n", src_data); |
| 5071 | radeon_fence_process(rdev, R600_RING_TYPE_UVD_INDEX); | 5078 | radeon_fence_process(rdev, R600_RING_TYPE_UVD_INDEX); |
diff --git a/drivers/gpu/drm/radeon/evergreend.h b/drivers/gpu/drm/radeon/evergreend.h index ee83d2a88750..a8d1d5240fcb 100644 --- a/drivers/gpu/drm/radeon/evergreend.h +++ b/drivers/gpu/drm/radeon/evergreend.h | |||
| @@ -1191,6 +1191,10 @@ | |||
| 1191 | #define SOFT_RESET_REGBB (1 << 22) | 1191 | #define SOFT_RESET_REGBB (1 << 22) |
| 1192 | #define SOFT_RESET_ORB (1 << 23) | 1192 | #define SOFT_RESET_ORB (1 << 23) |
| 1193 | 1193 | ||
| 1194 | #define SRBM_READ_ERROR 0xE98 | ||
| 1195 | #define SRBM_INT_CNTL 0xEA0 | ||
| 1196 | #define SRBM_INT_ACK 0xEA8 | ||
| 1197 | |||
| 1194 | /* display watermarks */ | 1198 | /* display watermarks */ |
| 1195 | #define DC_LB_MEMORY_SPLIT 0x6b0c | 1199 | #define DC_LB_MEMORY_SPLIT 0x6b0c |
| 1196 | #define PRIORITY_A_CNT 0x6b18 | 1200 | #define PRIORITY_A_CNT 0x6b18 |
diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c index 24242a7f0ac3..dab00812abaa 100644 --- a/drivers/gpu/drm/radeon/ni.c +++ b/drivers/gpu/drm/radeon/ni.c | |||
| @@ -962,6 +962,8 @@ static void cayman_gpu_init(struct radeon_device *rdev) | |||
| 962 | } | 962 | } |
| 963 | 963 | ||
| 964 | WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff)); | 964 | WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff)); |
| 965 | WREG32(SRBM_INT_CNTL, 0x1); | ||
| 966 | WREG32(SRBM_INT_ACK, 0x1); | ||
| 965 | 967 | ||
| 966 | evergreen_fix_pci_max_read_req_size(rdev); | 968 | evergreen_fix_pci_max_read_req_size(rdev); |
| 967 | 969 | ||
| @@ -1086,12 +1088,12 @@ static void cayman_gpu_init(struct radeon_device *rdev) | |||
| 1086 | 1088 | ||
| 1087 | if ((rdev->config.cayman.max_backends_per_se == 1) && | 1089 | if ((rdev->config.cayman.max_backends_per_se == 1) && |
| 1088 | (rdev->flags & RADEON_IS_IGP)) { | 1090 | (rdev->flags & RADEON_IS_IGP)) { |
| 1089 | if ((disabled_rb_mask & 3) == 1) { | 1091 | if ((disabled_rb_mask & 3) == 2) { |
| 1090 | /* RB0 disabled, RB1 enabled */ | ||
| 1091 | tmp = 0x11111111; | ||
| 1092 | } else { | ||
| 1093 | /* RB1 disabled, RB0 enabled */ | 1092 | /* RB1 disabled, RB0 enabled */ |
| 1094 | tmp = 0x00000000; | 1093 | tmp = 0x00000000; |
| 1094 | } else { | ||
| 1095 | /* RB0 disabled, RB1 enabled */ | ||
| 1096 | tmp = 0x11111111; | ||
| 1095 | } | 1097 | } |
| 1096 | } else { | 1098 | } else { |
| 1097 | tmp = gb_addr_config & NUM_PIPES_MASK; | 1099 | tmp = gb_addr_config & NUM_PIPES_MASK; |
diff --git a/drivers/gpu/drm/radeon/nid.h b/drivers/gpu/drm/radeon/nid.h index ad7125486894..6b44580440d0 100644 --- a/drivers/gpu/drm/radeon/nid.h +++ b/drivers/gpu/drm/radeon/nid.h | |||
| @@ -82,6 +82,10 @@ | |||
| 82 | #define SOFT_RESET_REGBB (1 << 22) | 82 | #define SOFT_RESET_REGBB (1 << 22) |
| 83 | #define SOFT_RESET_ORB (1 << 23) | 83 | #define SOFT_RESET_ORB (1 << 23) |
| 84 | 84 | ||
| 85 | #define SRBM_READ_ERROR 0xE98 | ||
| 86 | #define SRBM_INT_CNTL 0xEA0 | ||
| 87 | #define SRBM_INT_ACK 0xEA8 | ||
| 88 | |||
| 85 | #define SRBM_STATUS2 0x0EC4 | 89 | #define SRBM_STATUS2 0x0EC4 |
| 86 | #define DMA_BUSY (1 << 5) | 90 | #define DMA_BUSY (1 << 5) |
| 87 | #define DMA1_BUSY (1 << 6) | 91 | #define DMA1_BUSY (1 << 6) |
diff --git a/drivers/gpu/drm/radeon/r600_dpm.c b/drivers/gpu/drm/radeon/r600_dpm.c index 843b65f46ece..fa2154493cf1 100644 --- a/drivers/gpu/drm/radeon/r600_dpm.c +++ b/drivers/gpu/drm/radeon/r600_dpm.c | |||
| @@ -188,7 +188,7 @@ u32 r600_dpm_get_vrefresh(struct radeon_device *rdev) | |||
| 188 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { | 188 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { |
| 189 | radeon_crtc = to_radeon_crtc(crtc); | 189 | radeon_crtc = to_radeon_crtc(crtc); |
| 190 | if (crtc->enabled && radeon_crtc->enabled && radeon_crtc->hw_mode.clock) { | 190 | if (crtc->enabled && radeon_crtc->enabled && radeon_crtc->hw_mode.clock) { |
| 191 | vrefresh = radeon_crtc->hw_mode.vrefresh; | 191 | vrefresh = drm_mode_vrefresh(&radeon_crtc->hw_mode); |
| 192 | break; | 192 | break; |
| 193 | } | 193 | } |
| 194 | } | 194 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c index c830863bc98a..a579ed379f20 100644 --- a/drivers/gpu/drm/radeon/radeon_cs.c +++ b/drivers/gpu/drm/radeon/radeon_cs.c | |||
| @@ -715,6 +715,7 @@ int radeon_cs_packet_parse(struct radeon_cs_parser *p, | |||
| 715 | struct radeon_cs_chunk *ib_chunk = p->chunk_ib; | 715 | struct radeon_cs_chunk *ib_chunk = p->chunk_ib; |
| 716 | struct radeon_device *rdev = p->rdev; | 716 | struct radeon_device *rdev = p->rdev; |
| 717 | uint32_t header; | 717 | uint32_t header; |
| 718 | int ret = 0, i; | ||
| 718 | 719 | ||
| 719 | if (idx >= ib_chunk->length_dw) { | 720 | if (idx >= ib_chunk->length_dw) { |
| 720 | DRM_ERROR("Can not parse packet at %d after CS end %d !\n", | 721 | DRM_ERROR("Can not parse packet at %d after CS end %d !\n", |
| @@ -743,14 +744,25 @@ int radeon_cs_packet_parse(struct radeon_cs_parser *p, | |||
| 743 | break; | 744 | break; |
| 744 | default: | 745 | default: |
| 745 | DRM_ERROR("Unknown packet type %d at %d !\n", pkt->type, idx); | 746 | DRM_ERROR("Unknown packet type %d at %d !\n", pkt->type, idx); |
| 746 | return -EINVAL; | 747 | ret = -EINVAL; |
| 748 | goto dump_ib; | ||
| 747 | } | 749 | } |
| 748 | if ((pkt->count + 1 + pkt->idx) >= ib_chunk->length_dw) { | 750 | if ((pkt->count + 1 + pkt->idx) >= ib_chunk->length_dw) { |
| 749 | DRM_ERROR("Packet (%d:%d:%d) end after CS buffer (%d) !\n", | 751 | DRM_ERROR("Packet (%d:%d:%d) end after CS buffer (%d) !\n", |
| 750 | pkt->idx, pkt->type, pkt->count, ib_chunk->length_dw); | 752 | pkt->idx, pkt->type, pkt->count, ib_chunk->length_dw); |
| 751 | return -EINVAL; | 753 | ret = -EINVAL; |
| 754 | goto dump_ib; | ||
| 752 | } | 755 | } |
| 753 | return 0; | 756 | return 0; |
| 757 | |||
| 758 | dump_ib: | ||
| 759 | for (i = 0; i < ib_chunk->length_dw; i++) { | ||
| 760 | if (i == idx) | ||
| 761 | printk("\t0x%08x <---\n", radeon_get_ib_value(p, i)); | ||
| 762 | else | ||
| 763 | printk("\t0x%08x\n", radeon_get_ib_value(p, i)); | ||
| 764 | } | ||
| 765 | return ret; | ||
| 754 | } | 766 | } |
| 755 | 767 | ||
| 756 | /** | 768 | /** |
diff --git a/drivers/gpu/drm/radeon/radeon_encoders.c b/drivers/gpu/drm/radeon/radeon_encoders.c index 6b670b0bc47b..3a297037cc17 100644 --- a/drivers/gpu/drm/radeon/radeon_encoders.c +++ b/drivers/gpu/drm/radeon/radeon_encoders.c | |||
| @@ -179,9 +179,12 @@ static void radeon_encoder_add_backlight(struct radeon_encoder *radeon_encoder, | |||
| 179 | (rdev->pdev->subsystem_vendor == 0x1734) && | 179 | (rdev->pdev->subsystem_vendor == 0x1734) && |
| 180 | (rdev->pdev->subsystem_device == 0x1107)) | 180 | (rdev->pdev->subsystem_device == 0x1107)) |
| 181 | use_bl = false; | 181 | use_bl = false; |
| 182 | /* Older PPC macs use on-GPU backlight controller */ | ||
| 183 | #ifndef CONFIG_PPC_PMAC | ||
| 182 | /* disable native backlight control on older asics */ | 184 | /* disable native backlight control on older asics */ |
| 183 | else if (rdev->family < CHIP_R600) | 185 | else if (rdev->family < CHIP_R600) |
| 184 | use_bl = false; | 186 | use_bl = false; |
| 187 | #endif | ||
| 185 | else | 188 | else |
| 186 | use_bl = true; | 189 | use_bl = true; |
| 187 | } | 190 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c index 9f758d39420d..33cf4108386d 100644 --- a/drivers/gpu/drm/radeon/radeon_pm.c +++ b/drivers/gpu/drm/radeon/radeon_pm.c | |||
| @@ -852,6 +852,12 @@ static struct radeon_ps *radeon_dpm_pick_power_state(struct radeon_device *rdev, | |||
| 852 | single_display = false; | 852 | single_display = false; |
| 853 | } | 853 | } |
| 854 | 854 | ||
| 855 | /* 120hz tends to be problematic even if they are under the | ||
| 856 | * vblank limit. | ||
| 857 | */ | ||
| 858 | if (single_display && (r600_dpm_get_vrefresh(rdev) >= 120)) | ||
| 859 | single_display = false; | ||
| 860 | |||
| 855 | /* certain older asics have a separare 3D performance state, | 861 | /* certain older asics have a separare 3D performance state, |
| 856 | * so try that first if the user selected performance | 862 | * so try that first if the user selected performance |
| 857 | */ | 863 | */ |
diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c index 73107fe9e46f..bcf516a8a2f1 100644 --- a/drivers/gpu/drm/radeon/si.c +++ b/drivers/gpu/drm/radeon/si.c | |||
| @@ -3162,6 +3162,8 @@ static void si_gpu_init(struct radeon_device *rdev) | |||
| 3162 | } | 3162 | } |
| 3163 | 3163 | ||
| 3164 | WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff)); | 3164 | WREG32(GRBM_CNTL, GRBM_READ_TIMEOUT(0xff)); |
| 3165 | WREG32(SRBM_INT_CNTL, 1); | ||
| 3166 | WREG32(SRBM_INT_ACK, 1); | ||
| 3165 | 3167 | ||
| 3166 | evergreen_fix_pci_max_read_req_size(rdev); | 3168 | evergreen_fix_pci_max_read_req_size(rdev); |
| 3167 | 3169 | ||
| @@ -4699,12 +4701,6 @@ int si_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib) | |||
| 4699 | switch (pkt.type) { | 4701 | switch (pkt.type) { |
| 4700 | case RADEON_PACKET_TYPE0: | 4702 | case RADEON_PACKET_TYPE0: |
| 4701 | dev_err(rdev->dev, "Packet0 not allowed!\n"); | 4703 | dev_err(rdev->dev, "Packet0 not allowed!\n"); |
| 4702 | for (i = 0; i < ib->length_dw; i++) { | ||
| 4703 | if (i == idx) | ||
| 4704 | printk("\t0x%08x <---\n", ib->ptr[i]); | ||
| 4705 | else | ||
| 4706 | printk("\t0x%08x\n", ib->ptr[i]); | ||
| 4707 | } | ||
| 4708 | ret = -EINVAL; | 4704 | ret = -EINVAL; |
| 4709 | break; | 4705 | break; |
| 4710 | case RADEON_PACKET_TYPE2: | 4706 | case RADEON_PACKET_TYPE2: |
| @@ -4736,8 +4732,15 @@ int si_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib) | |||
| 4736 | ret = -EINVAL; | 4732 | ret = -EINVAL; |
| 4737 | break; | 4733 | break; |
| 4738 | } | 4734 | } |
| 4739 | if (ret) | 4735 | if (ret) { |
| 4736 | for (i = 0; i < ib->length_dw; i++) { | ||
| 4737 | if (i == idx) | ||
| 4738 | printk("\t0x%08x <---\n", ib->ptr[i]); | ||
| 4739 | else | ||
| 4740 | printk("\t0x%08x\n", ib->ptr[i]); | ||
| 4741 | } | ||
| 4740 | break; | 4742 | break; |
| 4743 | } | ||
| 4741 | } while (idx < ib->length_dw); | 4744 | } while (idx < ib->length_dw); |
| 4742 | 4745 | ||
| 4743 | return ret; | 4746 | return ret; |
| @@ -5910,6 +5913,7 @@ static void si_disable_interrupt_state(struct radeon_device *rdev) | |||
| 5910 | tmp = RREG32(DMA_CNTL + DMA1_REGISTER_OFFSET) & ~TRAP_ENABLE; | 5913 | tmp = RREG32(DMA_CNTL + DMA1_REGISTER_OFFSET) & ~TRAP_ENABLE; |
| 5911 | WREG32(DMA_CNTL + DMA1_REGISTER_OFFSET, tmp); | 5914 | WREG32(DMA_CNTL + DMA1_REGISTER_OFFSET, tmp); |
| 5912 | WREG32(GRBM_INT_CNTL, 0); | 5915 | WREG32(GRBM_INT_CNTL, 0); |
| 5916 | WREG32(SRBM_INT_CNTL, 0); | ||
| 5913 | if (rdev->num_crtc >= 2) { | 5917 | if (rdev->num_crtc >= 2) { |
| 5914 | WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0); | 5918 | WREG32(INT_MASK + EVERGREEN_CRTC0_REGISTER_OFFSET, 0); |
| 5915 | WREG32(INT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0); | 5919 | WREG32(INT_MASK + EVERGREEN_CRTC1_REGISTER_OFFSET, 0); |
| @@ -6609,6 +6613,10 @@ restart_ih: | |||
| 6609 | break; | 6613 | break; |
| 6610 | } | 6614 | } |
| 6611 | break; | 6615 | break; |
| 6616 | case 96: | ||
| 6617 | DRM_ERROR("SRBM_READ_ERROR: 0x%x\n", RREG32(SRBM_READ_ERROR)); | ||
| 6618 | WREG32(SRBM_INT_ACK, 0x1); | ||
| 6619 | break; | ||
| 6612 | case 124: /* UVD */ | 6620 | case 124: /* UVD */ |
| 6613 | DRM_DEBUG("IH: UVD int: 0x%08x\n", src_data); | 6621 | DRM_DEBUG("IH: UVD int: 0x%08x\n", src_data); |
| 6614 | radeon_fence_process(rdev, R600_RING_TYPE_UVD_INDEX); | 6622 | radeon_fence_process(rdev, R600_RING_TYPE_UVD_INDEX); |
diff --git a/drivers/gpu/drm/radeon/sid.h b/drivers/gpu/drm/radeon/sid.h index cbd91d226f3c..c27118cab16a 100644 --- a/drivers/gpu/drm/radeon/sid.h +++ b/drivers/gpu/drm/radeon/sid.h | |||
| @@ -358,6 +358,10 @@ | |||
| 358 | #define CC_SYS_RB_BACKEND_DISABLE 0xe80 | 358 | #define CC_SYS_RB_BACKEND_DISABLE 0xe80 |
| 359 | #define GC_USER_SYS_RB_BACKEND_DISABLE 0xe84 | 359 | #define GC_USER_SYS_RB_BACKEND_DISABLE 0xe84 |
| 360 | 360 | ||
| 361 | #define SRBM_READ_ERROR 0xE98 | ||
| 362 | #define SRBM_INT_CNTL 0xEA0 | ||
| 363 | #define SRBM_INT_ACK 0xEA8 | ||
| 364 | |||
| 361 | #define SRBM_STATUS2 0x0EC4 | 365 | #define SRBM_STATUS2 0x0EC4 |
| 362 | #define DMA_BUSY (1 << 5) | 366 | #define DMA_BUSY (1 << 5) |
| 363 | #define DMA1_BUSY (1 << 6) | 367 | #define DMA1_BUSY (1 << 6) |
