diff options
Diffstat (limited to 'drivers/gpu/drm/radeon')
31 files changed, 298 insertions, 194 deletions
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c index ed644a4f6f57..86807ee91bd1 100644 --- a/drivers/gpu/drm/radeon/atombios_crtc.c +++ b/drivers/gpu/drm/radeon/atombios_crtc.c | |||
| @@ -1405,6 +1405,9 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc, | |||
| 1405 | (x << 16) | y); | 1405 | (x << 16) | y); |
| 1406 | viewport_w = crtc->mode.hdisplay; | 1406 | viewport_w = crtc->mode.hdisplay; |
| 1407 | viewport_h = (crtc->mode.vdisplay + 1) & ~1; | 1407 | viewport_h = (crtc->mode.vdisplay + 1) & ~1; |
| 1408 | if ((rdev->family >= CHIP_BONAIRE) && | ||
| 1409 | (crtc->mode.flags & DRM_MODE_FLAG_INTERLACE)) | ||
| 1410 | viewport_h *= 2; | ||
| 1408 | WREG32(EVERGREEN_VIEWPORT_SIZE + radeon_crtc->crtc_offset, | 1411 | WREG32(EVERGREEN_VIEWPORT_SIZE + radeon_crtc->crtc_offset, |
| 1409 | (viewport_w << 16) | viewport_h); | 1412 | (viewport_w << 16) | viewport_h); |
| 1410 | 1413 | ||
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..c39c1d0d9d4e 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: |
| @@ -1622,7 +1626,6 @@ radeon_atom_encoder_dpms_dig(struct drm_encoder *encoder, int mode) | |||
| 1622 | struct radeon_connector *radeon_connector = NULL; | 1626 | struct radeon_connector *radeon_connector = NULL; |
| 1623 | struct radeon_connector_atom_dig *radeon_dig_connector = NULL; | 1627 | struct radeon_connector_atom_dig *radeon_dig_connector = NULL; |
| 1624 | bool travis_quirk = false; | 1628 | bool travis_quirk = false; |
| 1625 | int encoder_mode; | ||
| 1626 | 1629 | ||
| 1627 | if (connector) { | 1630 | if (connector) { |
| 1628 | radeon_connector = to_radeon_connector(connector); | 1631 | radeon_connector = to_radeon_connector(connector); |
| @@ -1718,11 +1721,6 @@ radeon_atom_encoder_dpms_dig(struct drm_encoder *encoder, int mode) | |||
| 1718 | } | 1721 | } |
| 1719 | break; | 1722 | break; |
| 1720 | } | 1723 | } |
| 1721 | |||
| 1722 | encoder_mode = atombios_get_encoder_mode(encoder); | ||
| 1723 | if (radeon_audio != 0 && | ||
| 1724 | (encoder_mode == ATOM_ENCODER_MODE_HDMI || ENCODER_MODE_IS_DP(encoder_mode))) | ||
| 1725 | radeon_audio_dpms(encoder, mode); | ||
| 1726 | } | 1724 | } |
| 1727 | 1725 | ||
| 1728 | static void | 1726 | static void |
| @@ -1731,10 +1729,19 @@ radeon_atom_encoder_dpms(struct drm_encoder *encoder, int mode) | |||
| 1731 | struct drm_device *dev = encoder->dev; | 1729 | struct drm_device *dev = encoder->dev; |
| 1732 | struct radeon_device *rdev = dev->dev_private; | 1730 | struct radeon_device *rdev = dev->dev_private; |
| 1733 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | 1731 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
| 1732 | struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); | ||
| 1733 | int encoder_mode = atombios_get_encoder_mode(encoder); | ||
| 1734 | 1734 | ||
| 1735 | DRM_DEBUG_KMS("encoder dpms %d to mode %d, devices %08x, active_devices %08x\n", | 1735 | DRM_DEBUG_KMS("encoder dpms %d to mode %d, devices %08x, active_devices %08x\n", |
| 1736 | radeon_encoder->encoder_id, mode, radeon_encoder->devices, | 1736 | radeon_encoder->encoder_id, mode, radeon_encoder->devices, |
| 1737 | radeon_encoder->active_device); | 1737 | radeon_encoder->active_device); |
| 1738 | |||
| 1739 | if (connector && (radeon_audio != 0) && | ||
| 1740 | ((encoder_mode == ATOM_ENCODER_MODE_HDMI) || | ||
| 1741 | (ENCODER_MODE_IS_DP(encoder_mode) && | ||
| 1742 | drm_detect_monitor_audio(radeon_connector_edid(connector))))) | ||
| 1743 | radeon_audio_dpms(encoder, mode); | ||
| 1744 | |||
| 1738 | switch (radeon_encoder->encoder_id) { | 1745 | switch (radeon_encoder->encoder_id) { |
| 1739 | case ENCODER_OBJECT_ID_INTERNAL_TMDS1: | 1746 | case ENCODER_OBJECT_ID_INTERNAL_TMDS1: |
| 1740 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1: | 1747 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1: |
| @@ -2136,6 +2143,7 @@ radeon_atom_encoder_mode_set(struct drm_encoder *encoder, | |||
| 2136 | struct drm_device *dev = encoder->dev; | 2143 | struct drm_device *dev = encoder->dev; |
| 2137 | struct radeon_device *rdev = dev->dev_private; | 2144 | struct radeon_device *rdev = dev->dev_private; |
| 2138 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | 2145 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
| 2146 | struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); | ||
| 2139 | int encoder_mode; | 2147 | int encoder_mode; |
| 2140 | 2148 | ||
| 2141 | radeon_encoder->pixel_clock = adjusted_mode->clock; | 2149 | radeon_encoder->pixel_clock = adjusted_mode->clock; |
| @@ -2163,10 +2171,6 @@ radeon_atom_encoder_mode_set(struct drm_encoder *encoder, | |||
| 2163 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3: | 2171 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3: |
| 2164 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: | 2172 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: |
| 2165 | /* handled in dpms */ | 2173 | /* handled in dpms */ |
| 2166 | encoder_mode = atombios_get_encoder_mode(encoder); | ||
| 2167 | if (radeon_audio != 0 && | ||
| 2168 | (encoder_mode == ATOM_ENCODER_MODE_HDMI || ENCODER_MODE_IS_DP(encoder_mode))) | ||
| 2169 | radeon_audio_mode_set(encoder, adjusted_mode); | ||
| 2170 | break; | 2174 | break; |
| 2171 | case ENCODER_OBJECT_ID_INTERNAL_DDI: | 2175 | case ENCODER_OBJECT_ID_INTERNAL_DDI: |
| 2172 | case ENCODER_OBJECT_ID_INTERNAL_DVO1: | 2176 | case ENCODER_OBJECT_ID_INTERNAL_DVO1: |
| @@ -2188,6 +2192,13 @@ radeon_atom_encoder_mode_set(struct drm_encoder *encoder, | |||
| 2188 | } | 2192 | } |
| 2189 | 2193 | ||
| 2190 | atombios_apply_encoder_quirks(encoder, adjusted_mode); | 2194 | atombios_apply_encoder_quirks(encoder, adjusted_mode); |
| 2195 | |||
| 2196 | encoder_mode = atombios_get_encoder_mode(encoder); | ||
| 2197 | if (connector && (radeon_audio != 0) && | ||
| 2198 | ((encoder_mode == ATOM_ENCODER_MODE_HDMI) || | ||
| 2199 | (ENCODER_MODE_IS_DP(encoder_mode) && | ||
| 2200 | drm_detect_monitor_audio(radeon_connector_edid(connector))))) | ||
| 2201 | radeon_audio_mode_set(encoder, adjusted_mode); | ||
| 2191 | } | 2202 | } |
| 2192 | 2203 | ||
| 2193 | static bool | 2204 | static bool |
diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c index e6a4ba236c70..3e670d344a20 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); |
| @@ -7551,6 +7555,9 @@ int cik_irq_set(struct radeon_device *rdev) | |||
| 7551 | WREG32(DC_HPD5_INT_CONTROL, hpd5); | 7555 | WREG32(DC_HPD5_INT_CONTROL, hpd5); |
| 7552 | WREG32(DC_HPD6_INT_CONTROL, hpd6); | 7556 | WREG32(DC_HPD6_INT_CONTROL, hpd6); |
| 7553 | 7557 | ||
| 7558 | /* posting read */ | ||
| 7559 | RREG32(SRBM_STATUS); | ||
| 7560 | |||
| 7554 | return 0; | 7561 | return 0; |
| 7555 | } | 7562 | } |
| 7556 | 7563 | ||
| @@ -8046,6 +8053,10 @@ restart_ih: | |||
| 8046 | break; | 8053 | break; |
| 8047 | } | 8054 | } |
| 8048 | break; | 8055 | break; |
| 8056 | case 96: | ||
| 8057 | DRM_ERROR("SRBM_READ_ERROR: 0x%x\n", RREG32(SRBM_READ_ERROR)); | ||
| 8058 | WREG32(SRBM_INT_ACK, 0x1); | ||
| 8059 | break; | ||
| 8049 | case 124: /* UVD */ | 8060 | case 124: /* UVD */ |
| 8050 | DRM_DEBUG("IH: UVD int: 0x%08x\n", src_data); | 8061 | DRM_DEBUG("IH: UVD int: 0x%08x\n", src_data); |
| 8051 | radeon_fence_process(rdev, R600_RING_TYPE_UVD_INDEX); | 8062 | 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..243a36c93b8f 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) |
| @@ -2125,6 +2129,7 @@ | |||
| 2125 | #define VCE_UENC_REG_CLOCK_GATING 0x207c0 | 2129 | #define VCE_UENC_REG_CLOCK_GATING 0x207c0 |
| 2126 | #define VCE_SYS_INT_EN 0x21300 | 2130 | #define VCE_SYS_INT_EN 0x21300 |
| 2127 | # define VCE_SYS_INT_TRAP_INTERRUPT_EN (1 << 3) | 2131 | # define VCE_SYS_INT_TRAP_INTERRUPT_EN (1 << 3) |
| 2132 | #define VCE_LMI_VCPU_CACHE_40BIT_BAR 0x2145c | ||
| 2128 | #define VCE_LMI_CTRL2 0x21474 | 2133 | #define VCE_LMI_CTRL2 0x21474 |
| 2129 | #define VCE_LMI_CTRL 0x21498 | 2134 | #define VCE_LMI_CTRL 0x21498 |
| 2130 | #define VCE_LMI_VM_CTRL 0x214a0 | 2135 | #define VCE_LMI_VM_CTRL 0x214a0 |
diff --git a/drivers/gpu/drm/radeon/dce6_afmt.c b/drivers/gpu/drm/radeon/dce6_afmt.c index 192c80389151..3adc2afe32aa 100644 --- a/drivers/gpu/drm/radeon/dce6_afmt.c +++ b/drivers/gpu/drm/radeon/dce6_afmt.c | |||
| @@ -26,6 +26,9 @@ | |||
| 26 | #include "radeon_audio.h" | 26 | #include "radeon_audio.h" |
| 27 | #include "sid.h" | 27 | #include "sid.h" |
| 28 | 28 | ||
| 29 | #define DCE8_DCCG_AUDIO_DTO1_PHASE 0x05b8 | ||
| 30 | #define DCE8_DCCG_AUDIO_DTO1_MODULE 0x05bc | ||
| 31 | |||
| 29 | u32 dce6_endpoint_rreg(struct radeon_device *rdev, | 32 | u32 dce6_endpoint_rreg(struct radeon_device *rdev, |
| 30 | u32 block_offset, u32 reg) | 33 | u32 block_offset, u32 reg) |
| 31 | { | 34 | { |
| @@ -252,72 +255,67 @@ void dce6_audio_enable(struct radeon_device *rdev, | |||
| 252 | void dce6_hdmi_audio_set_dto(struct radeon_device *rdev, | 255 | void dce6_hdmi_audio_set_dto(struct radeon_device *rdev, |
| 253 | struct radeon_crtc *crtc, unsigned int clock) | 256 | struct radeon_crtc *crtc, unsigned int clock) |
| 254 | { | 257 | { |
| 255 | /* Two dtos; generally use dto0 for HDMI */ | 258 | /* Two dtos; generally use dto0 for HDMI */ |
| 256 | u32 value = 0; | 259 | u32 value = 0; |
| 257 | 260 | ||
| 258 | if (crtc) | 261 | if (crtc) |
| 259 | value |= DCCG_AUDIO_DTO0_SOURCE_SEL(crtc->crtc_id); | 262 | value |= DCCG_AUDIO_DTO0_SOURCE_SEL(crtc->crtc_id); |
| 260 | 263 | ||
| 261 | WREG32(DCCG_AUDIO_DTO_SOURCE, value); | 264 | WREG32(DCCG_AUDIO_DTO_SOURCE, value); |
| 262 | 265 | ||
| 263 | /* Express [24MHz / target pixel clock] as an exact rational | 266 | /* Express [24MHz / target pixel clock] as an exact rational |
| 264 | * number (coefficient of two integer numbers. DCCG_AUDIO_DTOx_PHASE | 267 | * number (coefficient of two integer numbers. DCCG_AUDIO_DTOx_PHASE |
| 265 | * is the numerator, DCCG_AUDIO_DTOx_MODULE is the denominator | 268 | * is the numerator, DCCG_AUDIO_DTOx_MODULE is the denominator |
| 266 | */ | 269 | */ |
| 267 | WREG32(DCCG_AUDIO_DTO0_PHASE, 24000); | 270 | WREG32(DCCG_AUDIO_DTO0_PHASE, 24000); |
| 268 | WREG32(DCCG_AUDIO_DTO0_MODULE, clock); | 271 | WREG32(DCCG_AUDIO_DTO0_MODULE, clock); |
| 269 | } | 272 | } |
| 270 | 273 | ||
| 271 | void dce6_dp_audio_set_dto(struct radeon_device *rdev, | 274 | void dce6_dp_audio_set_dto(struct radeon_device *rdev, |
| 272 | struct radeon_crtc *crtc, unsigned int clock) | 275 | struct radeon_crtc *crtc, unsigned int clock) |
| 273 | { | 276 | { |
| 274 | /* Two dtos; generally use dto1 for DP */ | 277 | /* Two dtos; generally use dto1 for DP */ |
| 275 | u32 value = 0; | 278 | u32 value = 0; |
| 276 | value |= DCCG_AUDIO_DTO_SEL; | 279 | value |= DCCG_AUDIO_DTO_SEL; |
| 277 | 280 | ||
| 278 | if (crtc) | 281 | if (crtc) |
| 279 | value |= DCCG_AUDIO_DTO0_SOURCE_SEL(crtc->crtc_id); | 282 | value |= DCCG_AUDIO_DTO0_SOURCE_SEL(crtc->crtc_id); |
| 280 | 283 | ||
| 281 | WREG32(DCCG_AUDIO_DTO_SOURCE, value); | 284 | WREG32(DCCG_AUDIO_DTO_SOURCE, value); |
| 282 | 285 | ||
| 283 | /* Express [24MHz / target pixel clock] as an exact rational | 286 | /* Express [24MHz / target pixel clock] as an exact rational |
| 284 | * number (coefficient of two integer numbers. DCCG_AUDIO_DTOx_PHASE | 287 | * number (coefficient of two integer numbers. DCCG_AUDIO_DTOx_PHASE |
| 285 | * is the numerator, DCCG_AUDIO_DTOx_MODULE is the denominator | 288 | * is the numerator, DCCG_AUDIO_DTOx_MODULE is the denominator |
| 286 | */ | 289 | */ |
| 287 | WREG32(DCCG_AUDIO_DTO1_PHASE, 24000); | 290 | if (ASIC_IS_DCE8(rdev)) { |
| 288 | WREG32(DCCG_AUDIO_DTO1_MODULE, clock); | 291 | WREG32(DCE8_DCCG_AUDIO_DTO1_PHASE, 24000); |
| 292 | WREG32(DCE8_DCCG_AUDIO_DTO1_MODULE, clock); | ||
| 293 | } else { | ||
| 294 | WREG32(DCCG_AUDIO_DTO1_PHASE, 24000); | ||
| 295 | WREG32(DCCG_AUDIO_DTO1_MODULE, clock); | ||
| 296 | } | ||
| 289 | } | 297 | } |
| 290 | 298 | ||
| 291 | void dce6_enable_dp_audio_packets(struct drm_encoder *encoder, bool enable) | 299 | void dce6_dp_enable(struct drm_encoder *encoder, bool enable) |
| 292 | { | 300 | { |
| 293 | struct drm_device *dev = encoder->dev; | 301 | struct drm_device *dev = encoder->dev; |
| 294 | struct radeon_device *rdev = dev->dev_private; | 302 | struct radeon_device *rdev = dev->dev_private; |
| 295 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | 303 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
| 296 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; | 304 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; |
| 297 | uint32_t offset; | ||
| 298 | 305 | ||
| 299 | if (!dig || !dig->afmt) | 306 | if (!dig || !dig->afmt) |
| 300 | return; | 307 | return; |
| 301 | 308 | ||
| 302 | offset = dig->afmt->offset; | ||
| 303 | |||
| 304 | if (enable) { | 309 | if (enable) { |
| 305 | if (dig->afmt->enabled) | 310 | WREG32(EVERGREEN_DP_SEC_TIMESTAMP + dig->afmt->offset, |
| 306 | return; | 311 | EVERGREEN_DP_SEC_TIMESTAMP_MODE(1)); |
| 307 | 312 | WREG32(EVERGREEN_DP_SEC_CNTL + dig->afmt->offset, | |
| 308 | WREG32(EVERGREEN_DP_SEC_TIMESTAMP + offset, EVERGREEN_DP_SEC_TIMESTAMP_MODE(1)); | 313 | EVERGREEN_DP_SEC_ASP_ENABLE | /* Audio packet transmission */ |
| 309 | WREG32(EVERGREEN_DP_SEC_CNTL + offset, | 314 | EVERGREEN_DP_SEC_ATP_ENABLE | /* Audio timestamp packet transmission */ |
| 310 | EVERGREEN_DP_SEC_ASP_ENABLE | /* Audio packet transmission */ | 315 | EVERGREEN_DP_SEC_AIP_ENABLE | /* Audio infoframe packet transmission */ |
| 311 | EVERGREEN_DP_SEC_ATP_ENABLE | /* Audio timestamp packet transmission */ | 316 | EVERGREEN_DP_SEC_STREAM_ENABLE); /* Master enable for secondary stream engine */ |
| 312 | EVERGREEN_DP_SEC_AIP_ENABLE | /* Audio infoframe packet transmission */ | ||
| 313 | EVERGREEN_DP_SEC_STREAM_ENABLE); /* Master enable for secondary stream engine */ | ||
| 314 | radeon_audio_enable(rdev, dig->afmt->pin, true); | ||
| 315 | } else { | 317 | } else { |
| 316 | if (!dig->afmt->enabled) | 318 | WREG32(EVERGREEN_DP_SEC_CNTL + dig->afmt->offset, 0); |
| 317 | return; | ||
| 318 | |||
| 319 | WREG32(EVERGREEN_DP_SEC_CNTL + offset, 0); | ||
| 320 | radeon_audio_enable(rdev, dig->afmt->pin, false); | ||
| 321 | } | 319 | } |
| 322 | 320 | ||
| 323 | dig->afmt->enabled = enable; | 321 | dig->afmt->enabled = enable; |
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index 78600f534c80..973df064c14f 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) { |
| @@ -4590,6 +4593,9 @@ int evergreen_irq_set(struct radeon_device *rdev) | |||
| 4590 | WREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, afmt5); | 4593 | WREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, afmt5); |
| 4591 | WREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, afmt6); | 4594 | WREG32(AFMT_AUDIO_PACKET_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, afmt6); |
| 4592 | 4595 | ||
| 4596 | /* posting read */ | ||
| 4597 | RREG32(SRBM_STATUS); | ||
| 4598 | |||
| 4593 | return 0; | 4599 | return 0; |
| 4594 | } | 4600 | } |
| 4595 | 4601 | ||
| @@ -5066,6 +5072,10 @@ restart_ih: | |||
| 5066 | DRM_ERROR("Unhandled interrupt: %d %d\n", src_id, src_data); | 5072 | DRM_ERROR("Unhandled interrupt: %d %d\n", src_id, src_data); |
| 5067 | break; | 5073 | break; |
| 5068 | } | 5074 | } |
| 5075 | case 96: | ||
| 5076 | DRM_ERROR("SRBM_READ_ERROR: 0x%x\n", RREG32(SRBM_READ_ERROR)); | ||
| 5077 | WREG32(SRBM_INT_ACK, 0x1); | ||
| 5078 | break; | ||
| 5069 | case 124: /* UVD */ | 5079 | case 124: /* UVD */ |
| 5070 | DRM_DEBUG("IH: UVD int: 0x%08x\n", src_data); | 5080 | DRM_DEBUG("IH: UVD int: 0x%08x\n", src_data); |
| 5071 | radeon_fence_process(rdev, R600_RING_TYPE_UVD_INDEX); | 5081 | radeon_fence_process(rdev, R600_RING_TYPE_UVD_INDEX); |
diff --git a/drivers/gpu/drm/radeon/evergreen_hdmi.c b/drivers/gpu/drm/radeon/evergreen_hdmi.c index 1d9aebc79595..c18d4ecbd95d 100644 --- a/drivers/gpu/drm/radeon/evergreen_hdmi.c +++ b/drivers/gpu/drm/radeon/evergreen_hdmi.c | |||
| @@ -272,7 +272,7 @@ void dce4_hdmi_audio_set_dto(struct radeon_device *rdev, | |||
| 272 | } | 272 | } |
| 273 | 273 | ||
| 274 | void dce4_dp_audio_set_dto(struct radeon_device *rdev, | 274 | void dce4_dp_audio_set_dto(struct radeon_device *rdev, |
| 275 | struct radeon_crtc *crtc, unsigned int clock) | 275 | struct radeon_crtc *crtc, unsigned int clock) |
| 276 | { | 276 | { |
| 277 | u32 value; | 277 | u32 value; |
| 278 | 278 | ||
| @@ -294,7 +294,7 @@ void dce4_dp_audio_set_dto(struct radeon_device *rdev, | |||
| 294 | * is the numerator, DCCG_AUDIO_DTOx_MODULE is the denominator | 294 | * is the numerator, DCCG_AUDIO_DTOx_MODULE is the denominator |
| 295 | */ | 295 | */ |
| 296 | WREG32(DCCG_AUDIO_DTO1_PHASE, 24000); | 296 | WREG32(DCCG_AUDIO_DTO1_PHASE, 24000); |
| 297 | WREG32(DCCG_AUDIO_DTO1_MODULE, rdev->clock.max_pixel_clock * 10); | 297 | WREG32(DCCG_AUDIO_DTO1_MODULE, clock); |
| 298 | } | 298 | } |
| 299 | 299 | ||
| 300 | void dce4_set_vbi_packet(struct drm_encoder *encoder, u32 offset) | 300 | void dce4_set_vbi_packet(struct drm_encoder *encoder, u32 offset) |
| @@ -350,20 +350,9 @@ void dce4_set_audio_packet(struct drm_encoder *encoder, u32 offset) | |||
| 350 | struct drm_device *dev = encoder->dev; | 350 | struct drm_device *dev = encoder->dev; |
| 351 | struct radeon_device *rdev = dev->dev_private; | 351 | struct radeon_device *rdev = dev->dev_private; |
| 352 | 352 | ||
| 353 | WREG32(HDMI_INFOFRAME_CONTROL0 + offset, | ||
| 354 | HDMI_AUDIO_INFO_SEND | /* enable audio info frames (frames won't be set until audio is enabled) */ | ||
| 355 | HDMI_AUDIO_INFO_CONT); /* required for audio info values to be updated */ | ||
| 356 | |||
| 357 | WREG32(AFMT_INFOFRAME_CONTROL0 + offset, | 353 | WREG32(AFMT_INFOFRAME_CONTROL0 + offset, |
| 358 | AFMT_AUDIO_INFO_UPDATE); /* required for audio info values to be updated */ | 354 | AFMT_AUDIO_INFO_UPDATE); /* required for audio info values to be updated */ |
| 359 | 355 | ||
| 360 | WREG32(HDMI_INFOFRAME_CONTROL1 + offset, | ||
| 361 | HDMI_AUDIO_INFO_LINE(2)); /* anything other than 0 */ | ||
| 362 | |||
| 363 | WREG32(HDMI_AUDIO_PACKET_CONTROL + offset, | ||
| 364 | HDMI_AUDIO_DELAY_EN(1) | /* set the default audio delay */ | ||
| 365 | HDMI_AUDIO_PACKETS_PER_LINE(3)); /* should be suffient for all audio modes and small enough for all hblanks */ | ||
| 366 | |||
| 367 | WREG32(AFMT_60958_0 + offset, | 356 | WREG32(AFMT_60958_0 + offset, |
| 368 | AFMT_60958_CS_CHANNEL_NUMBER_L(1)); | 357 | AFMT_60958_CS_CHANNEL_NUMBER_L(1)); |
| 369 | 358 | ||
| @@ -408,15 +397,19 @@ void evergreen_hdmi_enable(struct drm_encoder *encoder, bool enable) | |||
| 408 | if (!dig || !dig->afmt) | 397 | if (!dig || !dig->afmt) |
| 409 | return; | 398 | return; |
| 410 | 399 | ||
| 411 | /* Silent, r600_hdmi_enable will raise WARN for us */ | 400 | if (enable) { |
| 412 | if (enable && dig->afmt->enabled) | 401 | WREG32(HDMI_INFOFRAME_CONTROL1 + dig->afmt->offset, |
| 413 | return; | 402 | HDMI_AUDIO_INFO_LINE(2)); /* anything other than 0 */ |
| 414 | if (!enable && !dig->afmt->enabled) | 403 | |
| 415 | return; | 404 | WREG32(HDMI_AUDIO_PACKET_CONTROL + dig->afmt->offset, |
| 405 | HDMI_AUDIO_DELAY_EN(1) | /* set the default audio delay */ | ||
| 406 | HDMI_AUDIO_PACKETS_PER_LINE(3)); /* should be suffient for all audio modes and small enough for all hblanks */ | ||
| 416 | 407 | ||
| 417 | if (!enable && dig->afmt->pin) { | 408 | WREG32(HDMI_INFOFRAME_CONTROL0 + dig->afmt->offset, |
| 418 | radeon_audio_enable(rdev, dig->afmt->pin, 0); | 409 | HDMI_AUDIO_INFO_SEND | /* enable audio info frames (frames won't be set until audio is enabled) */ |
| 419 | dig->afmt->pin = NULL; | 410 | HDMI_AUDIO_INFO_CONT); /* required for audio info values to be updated */ |
| 411 | } else { | ||
| 412 | WREG32(HDMI_INFOFRAME_CONTROL0 + dig->afmt->offset, 0); | ||
| 420 | } | 413 | } |
| 421 | 414 | ||
| 422 | dig->afmt->enabled = enable; | 415 | dig->afmt->enabled = enable; |
| @@ -425,33 +418,28 @@ void evergreen_hdmi_enable(struct drm_encoder *encoder, bool enable) | |||
| 425 | enable ? "En" : "Dis", dig->afmt->offset, radeon_encoder->encoder_id); | 418 | enable ? "En" : "Dis", dig->afmt->offset, radeon_encoder->encoder_id); |
| 426 | } | 419 | } |
| 427 | 420 | ||
| 428 | void evergreen_enable_dp_audio_packets(struct drm_encoder *encoder, bool enable) | 421 | void evergreen_dp_enable(struct drm_encoder *encoder, bool enable) |
| 429 | { | 422 | { |
| 430 | struct drm_device *dev = encoder->dev; | 423 | struct drm_device *dev = encoder->dev; |
| 431 | struct radeon_device *rdev = dev->dev_private; | 424 | struct radeon_device *rdev = dev->dev_private; |
| 432 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | 425 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
| 433 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; | 426 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; |
| 434 | uint32_t offset; | ||
| 435 | 427 | ||
| 436 | if (!dig || !dig->afmt) | 428 | if (!dig || !dig->afmt) |
| 437 | return; | 429 | return; |
| 438 | 430 | ||
| 439 | offset = dig->afmt->offset; | ||
| 440 | |||
| 441 | if (enable) { | 431 | if (enable) { |
| 442 | struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); | 432 | struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); |
| 443 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); | 433 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
| 444 | struct radeon_connector_atom_dig *dig_connector; | 434 | struct radeon_connector_atom_dig *dig_connector; |
| 445 | uint32_t val; | 435 | uint32_t val; |
| 446 | 436 | ||
| 447 | if (dig->afmt->enabled) | 437 | WREG32(EVERGREEN_DP_SEC_TIMESTAMP + dig->afmt->offset, |
| 448 | return; | 438 | EVERGREEN_DP_SEC_TIMESTAMP_MODE(1)); |
| 449 | |||
| 450 | WREG32(EVERGREEN_DP_SEC_TIMESTAMP + offset, EVERGREEN_DP_SEC_TIMESTAMP_MODE(1)); | ||
| 451 | 439 | ||
| 452 | if (radeon_connector->con_priv) { | 440 | if (radeon_connector->con_priv) { |
| 453 | dig_connector = radeon_connector->con_priv; | 441 | dig_connector = radeon_connector->con_priv; |
| 454 | val = RREG32(EVERGREEN_DP_SEC_AUD_N + offset); | 442 | val = RREG32(EVERGREEN_DP_SEC_AUD_N + dig->afmt->offset); |
| 455 | val &= ~EVERGREEN_DP_SEC_N_BASE_MULTIPLE(0xf); | 443 | val &= ~EVERGREEN_DP_SEC_N_BASE_MULTIPLE(0xf); |
| 456 | 444 | ||
| 457 | if (dig_connector->dp_clock == 162000) | 445 | if (dig_connector->dp_clock == 162000) |
| @@ -459,21 +447,16 @@ void evergreen_enable_dp_audio_packets(struct drm_encoder *encoder, bool enable) | |||
| 459 | else | 447 | else |
| 460 | val |= EVERGREEN_DP_SEC_N_BASE_MULTIPLE(5); | 448 | val |= EVERGREEN_DP_SEC_N_BASE_MULTIPLE(5); |
| 461 | 449 | ||
| 462 | WREG32(EVERGREEN_DP_SEC_AUD_N + offset, val); | 450 | WREG32(EVERGREEN_DP_SEC_AUD_N + dig->afmt->offset, val); |
| 463 | } | 451 | } |
| 464 | 452 | ||
| 465 | WREG32(EVERGREEN_DP_SEC_CNTL + offset, | 453 | WREG32(EVERGREEN_DP_SEC_CNTL + dig->afmt->offset, |
| 466 | EVERGREEN_DP_SEC_ASP_ENABLE | /* Audio packet transmission */ | 454 | EVERGREEN_DP_SEC_ASP_ENABLE | /* Audio packet transmission */ |
| 467 | EVERGREEN_DP_SEC_ATP_ENABLE | /* Audio timestamp packet transmission */ | 455 | EVERGREEN_DP_SEC_ATP_ENABLE | /* Audio timestamp packet transmission */ |
| 468 | EVERGREEN_DP_SEC_AIP_ENABLE | /* Audio infoframe packet transmission */ | 456 | EVERGREEN_DP_SEC_AIP_ENABLE | /* Audio infoframe packet transmission */ |
| 469 | EVERGREEN_DP_SEC_STREAM_ENABLE); /* Master enable for secondary stream engine */ | 457 | EVERGREEN_DP_SEC_STREAM_ENABLE); /* Master enable for secondary stream engine */ |
| 470 | radeon_audio_enable(rdev, dig->afmt->pin, 0xf); | ||
| 471 | } else { | 458 | } else { |
| 472 | if (!dig->afmt->enabled) | 459 | WREG32(EVERGREEN_DP_SEC_CNTL + dig->afmt->offset, 0); |
| 473 | return; | ||
| 474 | |||
| 475 | WREG32(EVERGREEN_DP_SEC_CNTL + offset, 0); | ||
| 476 | radeon_audio_enable(rdev, dig->afmt->pin, 0); | ||
| 477 | } | 460 | } |
| 478 | 461 | ||
| 479 | dig->afmt->enabled = enable; | 462 | dig->afmt->enabled = enable; |
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/r100.c b/drivers/gpu/drm/radeon/r100.c index 279801ca5110..04f2514f7564 100644 --- a/drivers/gpu/drm/radeon/r100.c +++ b/drivers/gpu/drm/radeon/r100.c | |||
| @@ -728,6 +728,10 @@ int r100_irq_set(struct radeon_device *rdev) | |||
| 728 | tmp |= RADEON_FP2_DETECT_MASK; | 728 | tmp |= RADEON_FP2_DETECT_MASK; |
| 729 | } | 729 | } |
| 730 | WREG32(RADEON_GEN_INT_CNTL, tmp); | 730 | WREG32(RADEON_GEN_INT_CNTL, tmp); |
| 731 | |||
| 732 | /* read back to post the write */ | ||
| 733 | RREG32(RADEON_GEN_INT_CNTL); | ||
| 734 | |||
| 731 | return 0; | 735 | return 0; |
| 732 | } | 736 | } |
| 733 | 737 | ||
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index 07a71a2488c9..2fcad344492f 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
| @@ -3784,6 +3784,9 @@ int r600_irq_set(struct radeon_device *rdev) | |||
| 3784 | WREG32(RV770_CG_THERMAL_INT, thermal_int); | 3784 | WREG32(RV770_CG_THERMAL_INT, thermal_int); |
| 3785 | } | 3785 | } |
| 3786 | 3786 | ||
| 3787 | /* posting read */ | ||
| 3788 | RREG32(R_000E50_SRBM_STATUS); | ||
| 3789 | |||
| 3787 | return 0; | 3790 | return 0; |
| 3788 | } | 3791 | } |
| 3789 | 3792 | ||
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/r600_hdmi.c b/drivers/gpu/drm/radeon/r600_hdmi.c index 62c91ed669ce..dd6606b8e23c 100644 --- a/drivers/gpu/drm/radeon/r600_hdmi.c +++ b/drivers/gpu/drm/radeon/r600_hdmi.c | |||
| @@ -476,17 +476,6 @@ void r600_hdmi_enable(struct drm_encoder *encoder, bool enable) | |||
| 476 | if (!dig || !dig->afmt) | 476 | if (!dig || !dig->afmt) |
| 477 | return; | 477 | return; |
| 478 | 478 | ||
| 479 | /* Silent, r600_hdmi_enable will raise WARN for us */ | ||
| 480 | if (enable && dig->afmt->enabled) | ||
| 481 | return; | ||
| 482 | if (!enable && !dig->afmt->enabled) | ||
| 483 | return; | ||
| 484 | |||
| 485 | if (!enable && dig->afmt->pin) { | ||
| 486 | radeon_audio_enable(rdev, dig->afmt->pin, 0); | ||
| 487 | dig->afmt->pin = NULL; | ||
| 488 | } | ||
| 489 | |||
| 490 | /* Older chipsets require setting HDMI and routing manually */ | 479 | /* Older chipsets require setting HDMI and routing manually */ |
| 491 | if (!ASIC_IS_DCE3(rdev)) { | 480 | if (!ASIC_IS_DCE3(rdev)) { |
| 492 | if (enable) | 481 | if (enable) |
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index 5587603b4a89..33d5a4f4eebd 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
| @@ -1565,6 +1565,7 @@ struct radeon_dpm { | |||
| 1565 | int new_active_crtc_count; | 1565 | int new_active_crtc_count; |
| 1566 | u32 current_active_crtcs; | 1566 | u32 current_active_crtcs; |
| 1567 | int current_active_crtc_count; | 1567 | int current_active_crtc_count; |
| 1568 | bool single_display; | ||
| 1568 | struct radeon_dpm_dynamic_state dyn_state; | 1569 | struct radeon_dpm_dynamic_state dyn_state; |
| 1569 | struct radeon_dpm_fan fan; | 1570 | struct radeon_dpm_fan fan; |
| 1570 | u32 tdp_limit; | 1571 | u32 tdp_limit; |
diff --git a/drivers/gpu/drm/radeon/radeon_audio.c b/drivers/gpu/drm/radeon/radeon_audio.c index a3ceef6d9632..b21ef69a34ac 100644 --- a/drivers/gpu/drm/radeon/radeon_audio.c +++ b/drivers/gpu/drm/radeon/radeon_audio.c | |||
| @@ -101,8 +101,8 @@ static void radeon_audio_dp_mode_set(struct drm_encoder *encoder, | |||
| 101 | struct drm_display_mode *mode); | 101 | struct drm_display_mode *mode); |
| 102 | void r600_hdmi_enable(struct drm_encoder *encoder, bool enable); | 102 | void r600_hdmi_enable(struct drm_encoder *encoder, bool enable); |
| 103 | void evergreen_hdmi_enable(struct drm_encoder *encoder, bool enable); | 103 | void evergreen_hdmi_enable(struct drm_encoder *encoder, bool enable); |
| 104 | void evergreen_enable_dp_audio_packets(struct drm_encoder *encoder, bool enable); | 104 | void evergreen_dp_enable(struct drm_encoder *encoder, bool enable); |
| 105 | void dce6_enable_dp_audio_packets(struct drm_encoder *encoder, bool enable); | 105 | void dce6_dp_enable(struct drm_encoder *encoder, bool enable); |
| 106 | 106 | ||
| 107 | static const u32 pin_offsets[7] = | 107 | static const u32 pin_offsets[7] = |
| 108 | { | 108 | { |
| @@ -210,7 +210,7 @@ static struct radeon_audio_funcs dce4_dp_funcs = { | |||
| 210 | .set_avi_packet = evergreen_set_avi_packet, | 210 | .set_avi_packet = evergreen_set_avi_packet, |
| 211 | .set_audio_packet = dce4_set_audio_packet, | 211 | .set_audio_packet = dce4_set_audio_packet, |
| 212 | .mode_set = radeon_audio_dp_mode_set, | 212 | .mode_set = radeon_audio_dp_mode_set, |
| 213 | .dpms = evergreen_enable_dp_audio_packets, | 213 | .dpms = evergreen_dp_enable, |
| 214 | }; | 214 | }; |
| 215 | 215 | ||
| 216 | static struct radeon_audio_funcs dce6_hdmi_funcs = { | 216 | static struct radeon_audio_funcs dce6_hdmi_funcs = { |
| @@ -240,7 +240,7 @@ static struct radeon_audio_funcs dce6_dp_funcs = { | |||
| 240 | .set_avi_packet = evergreen_set_avi_packet, | 240 | .set_avi_packet = evergreen_set_avi_packet, |
| 241 | .set_audio_packet = dce4_set_audio_packet, | 241 | .set_audio_packet = dce4_set_audio_packet, |
| 242 | .mode_set = radeon_audio_dp_mode_set, | 242 | .mode_set = radeon_audio_dp_mode_set, |
| 243 | .dpms = dce6_enable_dp_audio_packets, | 243 | .dpms = dce6_dp_enable, |
| 244 | }; | 244 | }; |
| 245 | 245 | ||
| 246 | static void radeon_audio_interface_init(struct radeon_device *rdev) | 246 | static void radeon_audio_interface_init(struct radeon_device *rdev) |
| @@ -452,7 +452,7 @@ void radeon_audio_enable(struct radeon_device *rdev, | |||
| 452 | } | 452 | } |
| 453 | 453 | ||
| 454 | void radeon_audio_detect(struct drm_connector *connector, | 454 | void radeon_audio_detect(struct drm_connector *connector, |
| 455 | enum drm_connector_status status) | 455 | enum drm_connector_status status) |
| 456 | { | 456 | { |
| 457 | struct radeon_device *rdev; | 457 | struct radeon_device *rdev; |
| 458 | struct radeon_encoder *radeon_encoder; | 458 | struct radeon_encoder *radeon_encoder; |
| @@ -483,14 +483,11 @@ void radeon_audio_detect(struct drm_connector *connector, | |||
| 483 | else | 483 | else |
| 484 | radeon_encoder->audio = rdev->audio.hdmi_funcs; | 484 | radeon_encoder->audio = rdev->audio.hdmi_funcs; |
| 485 | 485 | ||
| 486 | radeon_audio_write_speaker_allocation(connector->encoder); | 486 | dig->afmt->pin = radeon_audio_get_pin(connector->encoder); |
| 487 | radeon_audio_write_sad_regs(connector->encoder); | ||
| 488 | if (connector->encoder->crtc) | ||
| 489 | radeon_audio_write_latency_fields(connector->encoder, | ||
| 490 | &connector->encoder->crtc->mode); | ||
| 491 | radeon_audio_enable(rdev, dig->afmt->pin, 0xf); | 487 | radeon_audio_enable(rdev, dig->afmt->pin, 0xf); |
| 492 | } else { | 488 | } else { |
| 493 | radeon_audio_enable(rdev, dig->afmt->pin, 0); | 489 | radeon_audio_enable(rdev, dig->afmt->pin, 0); |
| 490 | dig->afmt->pin = NULL; | ||
| 494 | } | 491 | } |
| 495 | } | 492 | } |
| 496 | 493 | ||
| @@ -694,23 +691,22 @@ static void radeon_audio_set_mute(struct drm_encoder *encoder, bool mute) | |||
| 694 | * update the info frames with the data from the current display mode | 691 | * update the info frames with the data from the current display mode |
| 695 | */ | 692 | */ |
| 696 | static void radeon_audio_hdmi_mode_set(struct drm_encoder *encoder, | 693 | static void radeon_audio_hdmi_mode_set(struct drm_encoder *encoder, |
| 697 | struct drm_display_mode *mode) | 694 | struct drm_display_mode *mode) |
| 698 | { | 695 | { |
| 699 | struct radeon_device *rdev = encoder->dev->dev_private; | ||
| 700 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | 696 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
| 701 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; | 697 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; |
| 702 | 698 | ||
| 703 | if (!dig || !dig->afmt) | 699 | if (!dig || !dig->afmt) |
| 704 | return; | 700 | return; |
| 705 | 701 | ||
| 706 | /* disable audio prior to setting up hw */ | 702 | radeon_audio_set_mute(encoder, true); |
| 707 | dig->afmt->pin = radeon_audio_get_pin(encoder); | ||
| 708 | radeon_audio_enable(rdev, dig->afmt->pin, 0); | ||
| 709 | 703 | ||
| 704 | radeon_audio_write_speaker_allocation(encoder); | ||
| 705 | radeon_audio_write_sad_regs(encoder); | ||
| 706 | radeon_audio_write_latency_fields(encoder, mode); | ||
| 710 | radeon_audio_set_dto(encoder, mode->clock); | 707 | radeon_audio_set_dto(encoder, mode->clock); |
| 711 | radeon_audio_set_vbi_packet(encoder); | 708 | radeon_audio_set_vbi_packet(encoder); |
| 712 | radeon_hdmi_set_color_depth(encoder); | 709 | radeon_hdmi_set_color_depth(encoder); |
| 713 | radeon_audio_set_mute(encoder, false); | ||
| 714 | radeon_audio_update_acr(encoder, mode->clock); | 710 | radeon_audio_update_acr(encoder, mode->clock); |
| 715 | radeon_audio_set_audio_packet(encoder); | 711 | radeon_audio_set_audio_packet(encoder); |
| 716 | radeon_audio_select_pin(encoder); | 712 | radeon_audio_select_pin(encoder); |
| @@ -718,8 +714,7 @@ static void radeon_audio_hdmi_mode_set(struct drm_encoder *encoder, | |||
| 718 | if (radeon_audio_set_avi_packet(encoder, mode) < 0) | 714 | if (radeon_audio_set_avi_packet(encoder, mode) < 0) |
| 719 | return; | 715 | return; |
| 720 | 716 | ||
| 721 | /* enable audio after to setting up hw */ | 717 | radeon_audio_set_mute(encoder, false); |
| 722 | radeon_audio_enable(rdev, dig->afmt->pin, 0xf); | ||
| 723 | } | 718 | } |
| 724 | 719 | ||
| 725 | static void radeon_audio_dp_mode_set(struct drm_encoder *encoder, | 720 | static void radeon_audio_dp_mode_set(struct drm_encoder *encoder, |
| @@ -729,23 +724,26 @@ static void radeon_audio_dp_mode_set(struct drm_encoder *encoder, | |||
| 729 | struct radeon_device *rdev = dev->dev_private; | 724 | struct radeon_device *rdev = dev->dev_private; |
| 730 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | 725 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
| 731 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; | 726 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; |
| 727 | struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); | ||
| 728 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); | ||
| 729 | struct radeon_connector_atom_dig *dig_connector = | ||
| 730 | radeon_connector->con_priv; | ||
| 732 | 731 | ||
| 733 | if (!dig || !dig->afmt) | 732 | if (!dig || !dig->afmt) |
| 734 | return; | 733 | return; |
| 735 | 734 | ||
| 736 | /* disable audio prior to setting up hw */ | 735 | radeon_audio_write_speaker_allocation(encoder); |
| 737 | dig->afmt->pin = radeon_audio_get_pin(encoder); | 736 | radeon_audio_write_sad_regs(encoder); |
| 738 | radeon_audio_enable(rdev, dig->afmt->pin, 0); | 737 | radeon_audio_write_latency_fields(encoder, mode); |
| 739 | 738 | if (rdev->clock.dp_extclk || ASIC_IS_DCE5(rdev)) | |
| 740 | radeon_audio_set_dto(encoder, rdev->clock.default_dispclk * 10); | 739 | radeon_audio_set_dto(encoder, rdev->clock.default_dispclk * 10); |
| 740 | else | ||
| 741 | radeon_audio_set_dto(encoder, dig_connector->dp_clock); | ||
| 741 | radeon_audio_set_audio_packet(encoder); | 742 | radeon_audio_set_audio_packet(encoder); |
| 742 | radeon_audio_select_pin(encoder); | 743 | radeon_audio_select_pin(encoder); |
| 743 | 744 | ||
| 744 | if (radeon_audio_set_avi_packet(encoder, mode) < 0) | 745 | if (radeon_audio_set_avi_packet(encoder, mode) < 0) |
| 745 | return; | 746 | return; |
| 746 | |||
| 747 | /* enable audio after to setting up hw */ | ||
| 748 | radeon_audio_enable(rdev, dig->afmt->pin, 0xf); | ||
| 749 | } | 747 | } |
| 750 | 748 | ||
| 751 | void radeon_audio_mode_set(struct drm_encoder *encoder, | 749 | void radeon_audio_mode_set(struct drm_encoder *encoder, |
diff --git a/drivers/gpu/drm/radeon/radeon_bios.c b/drivers/gpu/drm/radeon/radeon_bios.c index 63ccb8fa799c..d27e4ccb848c 100644 --- a/drivers/gpu/drm/radeon/radeon_bios.c +++ b/drivers/gpu/drm/radeon/radeon_bios.c | |||
| @@ -76,7 +76,7 @@ static bool igp_read_bios_from_vram(struct radeon_device *rdev) | |||
| 76 | 76 | ||
| 77 | static bool radeon_read_bios(struct radeon_device *rdev) | 77 | static bool radeon_read_bios(struct radeon_device *rdev) |
| 78 | { | 78 | { |
| 79 | uint8_t __iomem *bios; | 79 | uint8_t __iomem *bios, val1, val2; |
| 80 | size_t size; | 80 | size_t size; |
| 81 | 81 | ||
| 82 | rdev->bios = NULL; | 82 | rdev->bios = NULL; |
| @@ -86,15 +86,19 @@ static bool radeon_read_bios(struct radeon_device *rdev) | |||
| 86 | return false; | 86 | return false; |
| 87 | } | 87 | } |
| 88 | 88 | ||
| 89 | if (size == 0 || bios[0] != 0x55 || bios[1] != 0xaa) { | 89 | val1 = readb(&bios[0]); |
| 90 | val2 = readb(&bios[1]); | ||
| 91 | |||
| 92 | if (size == 0 || val1 != 0x55 || val2 != 0xaa) { | ||
| 90 | pci_unmap_rom(rdev->pdev, bios); | 93 | pci_unmap_rom(rdev->pdev, bios); |
| 91 | return false; | 94 | return false; |
| 92 | } | 95 | } |
| 93 | rdev->bios = kmemdup(bios, size, GFP_KERNEL); | 96 | rdev->bios = kzalloc(size, GFP_KERNEL); |
| 94 | if (rdev->bios == NULL) { | 97 | if (rdev->bios == NULL) { |
| 95 | pci_unmap_rom(rdev->pdev, bios); | 98 | pci_unmap_rom(rdev->pdev, bios); |
| 96 | return false; | 99 | return false; |
| 97 | } | 100 | } |
| 101 | memcpy_fromio(rdev->bios, bios, size); | ||
| 98 | pci_unmap_rom(rdev->pdev, bios); | 102 | pci_unmap_rom(rdev->pdev, bios); |
| 99 | return true; | 103 | return true; |
| 100 | } | 104 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c index c830863bc98a..4d0f96cc3da4 100644 --- a/drivers/gpu/drm/radeon/radeon_cs.c +++ b/drivers/gpu/drm/radeon/radeon_cs.c | |||
| @@ -256,11 +256,13 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data) | |||
| 256 | u32 ring = RADEON_CS_RING_GFX; | 256 | u32 ring = RADEON_CS_RING_GFX; |
| 257 | s32 priority = 0; | 257 | s32 priority = 0; |
| 258 | 258 | ||
| 259 | INIT_LIST_HEAD(&p->validated); | ||
| 260 | |||
| 259 | if (!cs->num_chunks) { | 261 | if (!cs->num_chunks) { |
| 260 | return 0; | 262 | return 0; |
| 261 | } | 263 | } |
| 264 | |||
| 262 | /* get chunks */ | 265 | /* get chunks */ |
| 263 | INIT_LIST_HEAD(&p->validated); | ||
| 264 | p->idx = 0; | 266 | p->idx = 0; |
| 265 | p->ib.sa_bo = NULL; | 267 | p->ib.sa_bo = NULL; |
| 266 | p->const_ib.sa_bo = NULL; | 268 | p->const_ib.sa_bo = NULL; |
| @@ -715,6 +717,7 @@ int radeon_cs_packet_parse(struct radeon_cs_parser *p, | |||
| 715 | struct radeon_cs_chunk *ib_chunk = p->chunk_ib; | 717 | struct radeon_cs_chunk *ib_chunk = p->chunk_ib; |
| 716 | struct radeon_device *rdev = p->rdev; | 718 | struct radeon_device *rdev = p->rdev; |
| 717 | uint32_t header; | 719 | uint32_t header; |
| 720 | int ret = 0, i; | ||
| 718 | 721 | ||
| 719 | if (idx >= ib_chunk->length_dw) { | 722 | if (idx >= ib_chunk->length_dw) { |
| 720 | DRM_ERROR("Can not parse packet at %d after CS end %d !\n", | 723 | DRM_ERROR("Can not parse packet at %d after CS end %d !\n", |
| @@ -743,14 +746,25 @@ int radeon_cs_packet_parse(struct radeon_cs_parser *p, | |||
| 743 | break; | 746 | break; |
| 744 | default: | 747 | default: |
| 745 | DRM_ERROR("Unknown packet type %d at %d !\n", pkt->type, idx); | 748 | DRM_ERROR("Unknown packet type %d at %d !\n", pkt->type, idx); |
| 746 | return -EINVAL; | 749 | ret = -EINVAL; |
| 750 | goto dump_ib; | ||
| 747 | } | 751 | } |
| 748 | if ((pkt->count + 1 + pkt->idx) >= ib_chunk->length_dw) { | 752 | if ((pkt->count + 1 + pkt->idx) >= ib_chunk->length_dw) { |
| 749 | DRM_ERROR("Packet (%d:%d:%d) end after CS buffer (%d) !\n", | 753 | DRM_ERROR("Packet (%d:%d:%d) end after CS buffer (%d) !\n", |
| 750 | pkt->idx, pkt->type, pkt->count, ib_chunk->length_dw); | 754 | pkt->idx, pkt->type, pkt->count, ib_chunk->length_dw); |
| 751 | return -EINVAL; | 755 | ret = -EINVAL; |
| 756 | goto dump_ib; | ||
| 752 | } | 757 | } |
| 753 | return 0; | 758 | return 0; |
| 759 | |||
| 760 | dump_ib: | ||
| 761 | for (i = 0; i < ib_chunk->length_dw; i++) { | ||
| 762 | if (i == idx) | ||
| 763 | printk("\t0x%08x <---\n", radeon_get_ib_value(p, i)); | ||
| 764 | else | ||
| 765 | printk("\t0x%08x\n", radeon_get_ib_value(p, i)); | ||
| 766 | } | ||
| 767 | return ret; | ||
| 754 | } | 768 | } |
| 755 | 769 | ||
| 756 | /** | 770 | /** |
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_fence.c b/drivers/gpu/drm/radeon/radeon_fence.c index d13d1b5a859f..df09ca7c4889 100644 --- a/drivers/gpu/drm/radeon/radeon_fence.c +++ b/drivers/gpu/drm/radeon/radeon_fence.c | |||
| @@ -1030,37 +1030,59 @@ static inline bool radeon_test_signaled(struct radeon_fence *fence) | |||
| 1030 | return test_bit(FENCE_FLAG_SIGNALED_BIT, &fence->base.flags); | 1030 | return test_bit(FENCE_FLAG_SIGNALED_BIT, &fence->base.flags); |
| 1031 | } | 1031 | } |
| 1032 | 1032 | ||
| 1033 | struct radeon_wait_cb { | ||
| 1034 | struct fence_cb base; | ||
| 1035 | struct task_struct *task; | ||
| 1036 | }; | ||
| 1037 | |||
| 1038 | static void | ||
| 1039 | radeon_fence_wait_cb(struct fence *fence, struct fence_cb *cb) | ||
| 1040 | { | ||
| 1041 | struct radeon_wait_cb *wait = | ||
| 1042 | container_of(cb, struct radeon_wait_cb, base); | ||
| 1043 | |||
| 1044 | wake_up_process(wait->task); | ||
| 1045 | } | ||
| 1046 | |||
| 1033 | static signed long radeon_fence_default_wait(struct fence *f, bool intr, | 1047 | static signed long radeon_fence_default_wait(struct fence *f, bool intr, |
| 1034 | signed long t) | 1048 | signed long t) |
| 1035 | { | 1049 | { |
| 1036 | struct radeon_fence *fence = to_radeon_fence(f); | 1050 | struct radeon_fence *fence = to_radeon_fence(f); |
| 1037 | struct radeon_device *rdev = fence->rdev; | 1051 | struct radeon_device *rdev = fence->rdev; |
| 1038 | bool signaled; | 1052 | struct radeon_wait_cb cb; |
| 1039 | 1053 | ||
| 1040 | fence_enable_sw_signaling(&fence->base); | 1054 | cb.task = current; |
| 1041 | 1055 | ||
| 1042 | /* | 1056 | if (fence_add_callback(f, &cb.base, radeon_fence_wait_cb)) |
| 1043 | * This function has to return -EDEADLK, but cannot hold | 1057 | return t; |
| 1044 | * exclusive_lock during the wait because some callers | 1058 | |
| 1045 | * may already hold it. This means checking needs_reset without | 1059 | while (t > 0) { |
| 1046 | * lock, and not fiddling with any gpu internals. | 1060 | if (intr) |
| 1047 | * | 1061 | set_current_state(TASK_INTERRUPTIBLE); |
| 1048 | * The callback installed with fence_enable_sw_signaling will | 1062 | else |
| 1049 | * run before our wait_event_*timeout call, so we will see | 1063 | set_current_state(TASK_UNINTERRUPTIBLE); |
| 1050 | * both the signaled fence and the changes to needs_reset. | 1064 | |
| 1051 | */ | 1065 | /* |
| 1066 | * radeon_test_signaled must be called after | ||
| 1067 | * set_current_state to prevent a race with wake_up_process | ||
| 1068 | */ | ||
| 1069 | if (radeon_test_signaled(fence)) | ||
| 1070 | break; | ||
| 1071 | |||
| 1072 | if (rdev->needs_reset) { | ||
| 1073 | t = -EDEADLK; | ||
| 1074 | break; | ||
| 1075 | } | ||
| 1076 | |||
| 1077 | t = schedule_timeout(t); | ||
| 1078 | |||
| 1079 | if (t > 0 && intr && signal_pending(current)) | ||
| 1080 | t = -ERESTARTSYS; | ||
| 1081 | } | ||
| 1082 | |||
| 1083 | __set_current_state(TASK_RUNNING); | ||
| 1084 | fence_remove_callback(f, &cb.base); | ||
| 1052 | 1085 | ||
| 1053 | if (intr) | ||
| 1054 | t = wait_event_interruptible_timeout(rdev->fence_queue, | ||
| 1055 | ((signaled = radeon_test_signaled(fence)) || | ||
| 1056 | rdev->needs_reset), t); | ||
| 1057 | else | ||
| 1058 | t = wait_event_timeout(rdev->fence_queue, | ||
| 1059 | ((signaled = radeon_test_signaled(fence)) || | ||
| 1060 | rdev->needs_reset), t); | ||
| 1061 | |||
| 1062 | if (t > 0 && !signaled) | ||
| 1063 | return -EDEADLK; | ||
| 1064 | return t; | 1086 | return t; |
| 1065 | } | 1087 | } |
| 1066 | 1088 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_kfd.c b/drivers/gpu/drm/radeon/radeon_kfd.c index 061eaa9c19c7..122eb5693ba1 100644 --- a/drivers/gpu/drm/radeon/radeon_kfd.c +++ b/drivers/gpu/drm/radeon/radeon_kfd.c | |||
| @@ -153,7 +153,7 @@ void radeon_kfd_device_init(struct radeon_device *rdev) | |||
| 153 | .compute_vmid_bitmap = 0xFF00, | 153 | .compute_vmid_bitmap = 0xFF00, |
| 154 | 154 | ||
| 155 | .first_compute_pipe = 1, | 155 | .first_compute_pipe = 1, |
| 156 | .compute_pipe_count = 8 - 1, | 156 | .compute_pipe_count = 4 - 1, |
| 157 | }; | 157 | }; |
| 158 | 158 | ||
| 159 | radeon_doorbell_get_kfd_info(rdev, | 159 | radeon_doorbell_get_kfd_info(rdev, |
diff --git a/drivers/gpu/drm/radeon/radeon_mn.c b/drivers/gpu/drm/radeon/radeon_mn.c index a69bd441dd2d..572b4dbec186 100644 --- a/drivers/gpu/drm/radeon/radeon_mn.c +++ b/drivers/gpu/drm/radeon/radeon_mn.c | |||
| @@ -122,7 +122,6 @@ static void radeon_mn_invalidate_range_start(struct mmu_notifier *mn, | |||
| 122 | it = interval_tree_iter_first(&rmn->objects, start, end); | 122 | it = interval_tree_iter_first(&rmn->objects, start, end); |
| 123 | while (it) { | 123 | while (it) { |
| 124 | struct radeon_bo *bo; | 124 | struct radeon_bo *bo; |
| 125 | struct fence *fence; | ||
| 126 | int r; | 125 | int r; |
| 127 | 126 | ||
| 128 | bo = container_of(it, struct radeon_bo, mn_it); | 127 | bo = container_of(it, struct radeon_bo, mn_it); |
| @@ -134,12 +133,10 @@ static void radeon_mn_invalidate_range_start(struct mmu_notifier *mn, | |||
| 134 | continue; | 133 | continue; |
| 135 | } | 134 | } |
| 136 | 135 | ||
| 137 | fence = reservation_object_get_excl(bo->tbo.resv); | 136 | r = reservation_object_wait_timeout_rcu(bo->tbo.resv, true, |
| 138 | if (fence) { | 137 | false, MAX_SCHEDULE_TIMEOUT); |
| 139 | r = radeon_fence_wait((struct radeon_fence *)fence, false); | 138 | if (r) |
| 140 | if (r) | 139 | DRM_ERROR("(%d) failed to wait for user bo\n", r); |
| 141 | DRM_ERROR("(%d) failed to wait for user bo\n", r); | ||
| 142 | } | ||
| 143 | 140 | ||
| 144 | radeon_ttm_placement_from_domain(bo, RADEON_GEM_DOMAIN_CPU); | 141 | radeon_ttm_placement_from_domain(bo, RADEON_GEM_DOMAIN_CPU); |
| 145 | r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false); | 142 | r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false); |
diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c index 43e09942823e..318165d4855c 100644 --- a/drivers/gpu/drm/radeon/radeon_object.c +++ b/drivers/gpu/drm/radeon/radeon_object.c | |||
| @@ -173,17 +173,6 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain) | |||
| 173 | else | 173 | else |
| 174 | rbo->placements[i].lpfn = 0; | 174 | rbo->placements[i].lpfn = 0; |
| 175 | } | 175 | } |
| 176 | |||
| 177 | /* | ||
| 178 | * Use two-ended allocation depending on the buffer size to | ||
| 179 | * improve fragmentation quality. | ||
| 180 | * 512kb was measured as the most optimal number. | ||
| 181 | */ | ||
| 182 | if (rbo->tbo.mem.size > 512 * 1024) { | ||
| 183 | for (i = 0; i < c; i++) { | ||
| 184 | rbo->placements[i].flags |= TTM_PL_FLAG_TOPDOWN; | ||
| 185 | } | ||
| 186 | } | ||
| 187 | } | 176 | } |
| 188 | 177 | ||
| 189 | int radeon_bo_create(struct radeon_device *rdev, | 178 | int radeon_bo_create(struct radeon_device *rdev, |
diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c index 9f758d39420d..c1ba83a8dd8c 100644 --- a/drivers/gpu/drm/radeon/radeon_pm.c +++ b/drivers/gpu/drm/radeon/radeon_pm.c | |||
| @@ -837,12 +837,8 @@ static void radeon_dpm_thermal_work_handler(struct work_struct *work) | |||
| 837 | radeon_pm_compute_clocks(rdev); | 837 | radeon_pm_compute_clocks(rdev); |
| 838 | } | 838 | } |
| 839 | 839 | ||
| 840 | static struct radeon_ps *radeon_dpm_pick_power_state(struct radeon_device *rdev, | 840 | static bool radeon_dpm_single_display(struct radeon_device *rdev) |
| 841 | enum radeon_pm_state_type dpm_state) | ||
| 842 | { | 841 | { |
| 843 | int i; | ||
| 844 | struct radeon_ps *ps; | ||
| 845 | u32 ui_class; | ||
| 846 | bool single_display = (rdev->pm.dpm.new_active_crtc_count < 2) ? | 842 | bool single_display = (rdev->pm.dpm.new_active_crtc_count < 2) ? |
| 847 | true : false; | 843 | true : false; |
| 848 | 844 | ||
| @@ -852,6 +848,23 @@ static struct radeon_ps *radeon_dpm_pick_power_state(struct radeon_device *rdev, | |||
| 852 | single_display = false; | 848 | single_display = false; |
| 853 | } | 849 | } |
| 854 | 850 | ||
| 851 | /* 120hz tends to be problematic even if they are under the | ||
| 852 | * vblank limit. | ||
| 853 | */ | ||
| 854 | if (single_display && (r600_dpm_get_vrefresh(rdev) >= 120)) | ||
| 855 | single_display = false; | ||
| 856 | |||
| 857 | return single_display; | ||
| 858 | } | ||
| 859 | |||
| 860 | static struct radeon_ps *radeon_dpm_pick_power_state(struct radeon_device *rdev, | ||
| 861 | enum radeon_pm_state_type dpm_state) | ||
| 862 | { | ||
| 863 | int i; | ||
| 864 | struct radeon_ps *ps; | ||
| 865 | u32 ui_class; | ||
| 866 | bool single_display = radeon_dpm_single_display(rdev); | ||
| 867 | |||
| 855 | /* certain older asics have a separare 3D performance state, | 868 | /* certain older asics have a separare 3D performance state, |
| 856 | * so try that first if the user selected performance | 869 | * so try that first if the user selected performance |
| 857 | */ | 870 | */ |
| @@ -977,6 +990,7 @@ static void radeon_dpm_change_power_state_locked(struct radeon_device *rdev) | |||
| 977 | struct radeon_ps *ps; | 990 | struct radeon_ps *ps; |
| 978 | enum radeon_pm_state_type dpm_state; | 991 | enum radeon_pm_state_type dpm_state; |
| 979 | int ret; | 992 | int ret; |
| 993 | bool single_display = radeon_dpm_single_display(rdev); | ||
| 980 | 994 | ||
| 981 | /* if dpm init failed */ | 995 | /* if dpm init failed */ |
| 982 | if (!rdev->pm.dpm_enabled) | 996 | if (!rdev->pm.dpm_enabled) |
| @@ -1001,6 +1015,9 @@ static void radeon_dpm_change_power_state_locked(struct radeon_device *rdev) | |||
| 1001 | /* vce just modifies an existing state so force a change */ | 1015 | /* vce just modifies an existing state so force a change */ |
| 1002 | if (ps->vce_active != rdev->pm.dpm.vce_active) | 1016 | if (ps->vce_active != rdev->pm.dpm.vce_active) |
| 1003 | goto force; | 1017 | goto force; |
| 1018 | /* user has made a display change (such as timing) */ | ||
| 1019 | if (rdev->pm.dpm.single_display != single_display) | ||
| 1020 | goto force; | ||
| 1004 | if ((rdev->family < CHIP_BARTS) || (rdev->flags & RADEON_IS_IGP)) { | 1021 | if ((rdev->family < CHIP_BARTS) || (rdev->flags & RADEON_IS_IGP)) { |
| 1005 | /* for pre-BTC and APUs if the num crtcs changed but state is the same, | 1022 | /* for pre-BTC and APUs if the num crtcs changed but state is the same, |
| 1006 | * all we need to do is update the display configuration. | 1023 | * all we need to do is update the display configuration. |
| @@ -1063,6 +1080,7 @@ force: | |||
| 1063 | 1080 | ||
| 1064 | rdev->pm.dpm.current_active_crtcs = rdev->pm.dpm.new_active_crtcs; | 1081 | rdev->pm.dpm.current_active_crtcs = rdev->pm.dpm.new_active_crtcs; |
| 1065 | rdev->pm.dpm.current_active_crtc_count = rdev->pm.dpm.new_active_crtc_count; | 1082 | rdev->pm.dpm.current_active_crtc_count = rdev->pm.dpm.new_active_crtc_count; |
| 1083 | rdev->pm.dpm.single_display = single_display; | ||
| 1066 | 1084 | ||
| 1067 | /* wait for the rings to drain */ | 1085 | /* wait for the rings to drain */ |
| 1068 | for (i = 0; i < RADEON_NUM_RINGS; i++) { | 1086 | for (i = 0; i < RADEON_NUM_RINGS; i++) { |
diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c index 2456f69efd23..8c7872339c2a 100644 --- a/drivers/gpu/drm/radeon/radeon_ring.c +++ b/drivers/gpu/drm/radeon/radeon_ring.c | |||
| @@ -495,7 +495,7 @@ static int radeon_debugfs_ring_info(struct seq_file *m, void *data) | |||
| 495 | seq_printf(m, "%u free dwords in ring\n", ring->ring_free_dw); | 495 | seq_printf(m, "%u free dwords in ring\n", ring->ring_free_dw); |
| 496 | seq_printf(m, "%u dwords in ring\n", count); | 496 | seq_printf(m, "%u dwords in ring\n", count); |
| 497 | 497 | ||
| 498 | if (!ring->ready) | 498 | if (!ring->ring) |
| 499 | return 0; | 499 | return 0; |
| 500 | 500 | ||
| 501 | /* print 8 dw before current rptr as often it's the last executed | 501 | /* print 8 dw before current rptr as often it's the last executed |
diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c index d02aa1d0f588..b292aca0f342 100644 --- a/drivers/gpu/drm/radeon/radeon_ttm.c +++ b/drivers/gpu/drm/radeon/radeon_ttm.c | |||
| @@ -598,6 +598,10 @@ static void radeon_ttm_tt_unpin_userptr(struct ttm_tt *ttm) | |||
| 598 | enum dma_data_direction direction = write ? | 598 | enum dma_data_direction direction = write ? |
| 599 | DMA_BIDIRECTIONAL : DMA_TO_DEVICE; | 599 | DMA_BIDIRECTIONAL : DMA_TO_DEVICE; |
| 600 | 600 | ||
| 601 | /* double check that we don't free the table twice */ | ||
| 602 | if (!ttm->sg->sgl) | ||
| 603 | return; | ||
| 604 | |||
| 601 | /* free the sg table and pages again */ | 605 | /* free the sg table and pages again */ |
| 602 | dma_unmap_sg(rdev->dev, ttm->sg->sgl, ttm->sg->nents, direction); | 606 | dma_unmap_sg(rdev->dev, ttm->sg->sgl, ttm->sg->nents, direction); |
| 603 | 607 | ||
diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c index d81182ad53ec..97a904835759 100644 --- a/drivers/gpu/drm/radeon/rs600.c +++ b/drivers/gpu/drm/radeon/rs600.c | |||
| @@ -694,6 +694,10 @@ int rs600_irq_set(struct radeon_device *rdev) | |||
| 694 | WREG32(R_007D18_DC_HOT_PLUG_DETECT2_INT_CONTROL, hpd2); | 694 | WREG32(R_007D18_DC_HOT_PLUG_DETECT2_INT_CONTROL, hpd2); |
| 695 | if (ASIC_IS_DCE2(rdev)) | 695 | if (ASIC_IS_DCE2(rdev)) |
| 696 | WREG32(R_007408_HDMI0_AUDIO_PACKET_CONTROL, hdmi0); | 696 | WREG32(R_007408_HDMI0_AUDIO_PACKET_CONTROL, hdmi0); |
| 697 | |||
| 698 | /* posting read */ | ||
| 699 | RREG32(R_000040_GEN_INT_CNTL); | ||
| 700 | |||
| 697 | return 0; | 701 | return 0; |
| 698 | } | 702 | } |
| 699 | 703 | ||
diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c index 73107fe9e46f..a7fb2735d4a9 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); |
| @@ -6199,6 +6203,9 @@ int si_irq_set(struct radeon_device *rdev) | |||
| 6199 | 6203 | ||
| 6200 | WREG32(CG_THERMAL_INT, thermal_int); | 6204 | WREG32(CG_THERMAL_INT, thermal_int); |
| 6201 | 6205 | ||
| 6206 | /* posting read */ | ||
| 6207 | RREG32(SRBM_STATUS); | ||
| 6208 | |||
| 6202 | return 0; | 6209 | return 0; |
| 6203 | } | 6210 | } |
| 6204 | 6211 | ||
| @@ -6609,6 +6616,10 @@ restart_ih: | |||
| 6609 | break; | 6616 | break; |
| 6610 | } | 6617 | } |
| 6611 | break; | 6618 | break; |
| 6619 | case 96: | ||
| 6620 | DRM_ERROR("SRBM_READ_ERROR: 0x%x\n", RREG32(SRBM_READ_ERROR)); | ||
| 6621 | WREG32(SRBM_INT_ACK, 0x1); | ||
| 6622 | break; | ||
| 6612 | case 124: /* UVD */ | 6623 | case 124: /* UVD */ |
| 6613 | DRM_DEBUG("IH: UVD int: 0x%08x\n", src_data); | 6624 | DRM_DEBUG("IH: UVD int: 0x%08x\n", src_data); |
| 6614 | radeon_fence_process(rdev, R600_RING_TYPE_UVD_INDEX); | 6625 | radeon_fence_process(rdev, R600_RING_TYPE_UVD_INDEX); |
| @@ -7119,8 +7130,7 @@ int si_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk) | |||
| 7119 | WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_BYPASS_EN_MASK, ~UPLL_BYPASS_EN_MASK); | 7130 | WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_BYPASS_EN_MASK, ~UPLL_BYPASS_EN_MASK); |
| 7120 | 7131 | ||
| 7121 | if (!vclk || !dclk) { | 7132 | if (!vclk || !dclk) { |
| 7122 | /* keep the Bypass mode, put PLL to sleep */ | 7133 | /* keep the Bypass mode */ |
| 7123 | WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_SLEEP_MASK, ~UPLL_SLEEP_MASK); | ||
| 7124 | return 0; | 7134 | return 0; |
| 7125 | } | 7135 | } |
| 7126 | 7136 | ||
| @@ -7136,8 +7146,7 @@ int si_set_uvd_clocks(struct radeon_device *rdev, u32 vclk, u32 dclk) | |||
| 7136 | /* set VCO_MODE to 1 */ | 7146 | /* set VCO_MODE to 1 */ |
| 7137 | WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_VCO_MODE_MASK, ~UPLL_VCO_MODE_MASK); | 7147 | WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_VCO_MODE_MASK, ~UPLL_VCO_MODE_MASK); |
| 7138 | 7148 | ||
| 7139 | /* toggle UPLL_SLEEP to 1 then back to 0 */ | 7149 | /* disable sleep mode */ |
| 7140 | WREG32_P(CG_UPLL_FUNC_CNTL, UPLL_SLEEP_MASK, ~UPLL_SLEEP_MASK); | ||
| 7141 | WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_SLEEP_MASK); | 7150 | WREG32_P(CG_UPLL_FUNC_CNTL, 0, ~UPLL_SLEEP_MASK); |
| 7142 | 7151 | ||
| 7143 | /* deassert UPLL_RESET */ | 7152 | /* deassert UPLL_RESET */ |
diff --git a/drivers/gpu/drm/radeon/sid.h b/drivers/gpu/drm/radeon/sid.h index cbd91d226f3c..99a9835c9f61 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) |
| @@ -908,8 +912,8 @@ | |||
| 908 | 912 | ||
| 909 | #define DCCG_AUDIO_DTO0_PHASE 0x05b0 | 913 | #define DCCG_AUDIO_DTO0_PHASE 0x05b0 |
| 910 | #define DCCG_AUDIO_DTO0_MODULE 0x05b4 | 914 | #define DCCG_AUDIO_DTO0_MODULE 0x05b4 |
| 911 | #define DCCG_AUDIO_DTO1_PHASE 0x05b8 | 915 | #define DCCG_AUDIO_DTO1_PHASE 0x05c0 |
| 912 | #define DCCG_AUDIO_DTO1_MODULE 0x05bc | 916 | #define DCCG_AUDIO_DTO1_MODULE 0x05c4 |
| 913 | 917 | ||
| 914 | #define AFMT_AUDIO_SRC_CONTROL 0x713c | 918 | #define AFMT_AUDIO_SRC_CONTROL 0x713c |
| 915 | #define AFMT_AUDIO_SRC_SELECT(x) (((x) & 7) << 0) | 919 | #define AFMT_AUDIO_SRC_SELECT(x) (((x) & 7) << 0) |
diff --git a/drivers/gpu/drm/radeon/vce_v2_0.c b/drivers/gpu/drm/radeon/vce_v2_0.c index 1ac7bb825a1b..fbbe78fbd087 100644 --- a/drivers/gpu/drm/radeon/vce_v2_0.c +++ b/drivers/gpu/drm/radeon/vce_v2_0.c | |||
| @@ -156,6 +156,9 @@ int vce_v2_0_resume(struct radeon_device *rdev) | |||
| 156 | WREG32(VCE_LMI_SWAP_CNTL1, 0); | 156 | WREG32(VCE_LMI_SWAP_CNTL1, 0); |
| 157 | WREG32(VCE_LMI_VM_CTRL, 0); | 157 | WREG32(VCE_LMI_VM_CTRL, 0); |
| 158 | 158 | ||
| 159 | WREG32(VCE_LMI_VCPU_CACHE_40BIT_BAR, addr >> 8); | ||
| 160 | |||
| 161 | addr &= 0xff; | ||
| 159 | size = RADEON_GPU_PAGE_ALIGN(rdev->vce_fw->size); | 162 | size = RADEON_GPU_PAGE_ALIGN(rdev->vce_fw->size); |
| 160 | WREG32(VCE_VCPU_CACHE_OFFSET0, addr & 0x7fffffff); | 163 | WREG32(VCE_VCPU_CACHE_OFFSET0, addr & 0x7fffffff); |
| 161 | WREG32(VCE_VCPU_CACHE_SIZE0, size); | 164 | WREG32(VCE_VCPU_CACHE_SIZE0, size); |
