diff options
| -rw-r--r-- | drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c | 10 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.h | 8 | ||||
| -rw-r--r-- | drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_cik.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/drm_crtc.c | 3 | ||||
| -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 | ||||
| -rw-r--r-- | drivers/gpu/drm/tegra/dc.c | 79 | ||||
| -rw-r--r-- | drivers/gpu/drm/tegra/hdmi.c | 8 |
20 files changed, 159 insertions, 69 deletions
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c index b3589d0e39b9..910ff8ab9c9c 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c | |||
| @@ -62,12 +62,18 @@ enum KFD_MQD_TYPE get_mqd_type_from_queue_type(enum kfd_queue_type type) | |||
| 62 | return KFD_MQD_TYPE_CP; | 62 | return KFD_MQD_TYPE_CP; |
| 63 | } | 63 | } |
| 64 | 64 | ||
| 65 | static inline unsigned int get_first_pipe(struct device_queue_manager *dqm) | 65 | unsigned int get_first_pipe(struct device_queue_manager *dqm) |
| 66 | { | 66 | { |
| 67 | BUG_ON(!dqm); | 67 | BUG_ON(!dqm || !dqm->dev); |
| 68 | return dqm->dev->shared_resources.first_compute_pipe; | 68 | return dqm->dev->shared_resources.first_compute_pipe; |
| 69 | } | 69 | } |
| 70 | 70 | ||
| 71 | unsigned int get_pipes_num(struct device_queue_manager *dqm) | ||
| 72 | { | ||
| 73 | BUG_ON(!dqm || !dqm->dev); | ||
| 74 | return dqm->dev->shared_resources.compute_pipe_count; | ||
| 75 | } | ||
| 76 | |||
| 71 | static inline unsigned int get_pipes_num_cpsch(void) | 77 | static inline unsigned int get_pipes_num_cpsch(void) |
| 72 | { | 78 | { |
| 73 | return PIPE_PER_ME_CP_SCHEDULING; | 79 | return PIPE_PER_ME_CP_SCHEDULING; |
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.h b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.h index d64f86cda34f..488f51d19427 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.h +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.h | |||
| @@ -163,6 +163,8 @@ void program_sh_mem_settings(struct device_queue_manager *dqm, | |||
| 163 | struct qcm_process_device *qpd); | 163 | struct qcm_process_device *qpd); |
| 164 | int init_pipelines(struct device_queue_manager *dqm, | 164 | int init_pipelines(struct device_queue_manager *dqm, |
| 165 | unsigned int pipes_num, unsigned int first_pipe); | 165 | unsigned int pipes_num, unsigned int first_pipe); |
| 166 | unsigned int get_first_pipe(struct device_queue_manager *dqm); | ||
| 167 | unsigned int get_pipes_num(struct device_queue_manager *dqm); | ||
| 166 | 168 | ||
| 167 | extern inline unsigned int get_sh_mem_bases_32(struct kfd_process_device *pdd) | 169 | extern inline unsigned int get_sh_mem_bases_32(struct kfd_process_device *pdd) |
| 168 | { | 170 | { |
| @@ -175,10 +177,4 @@ get_sh_mem_bases_nybble_64(struct kfd_process_device *pdd) | |||
| 175 | return (pdd->lds_base >> 60) & 0x0E; | 177 | return (pdd->lds_base >> 60) & 0x0E; |
| 176 | } | 178 | } |
| 177 | 179 | ||
| 178 | extern inline unsigned int get_pipes_num(struct device_queue_manager *dqm) | ||
| 179 | { | ||
| 180 | BUG_ON(!dqm || !dqm->dev); | ||
| 181 | return dqm->dev->shared_resources.compute_pipe_count; | ||
| 182 | } | ||
| 183 | |||
| 184 | #endif /* KFD_DEVICE_QUEUE_MANAGER_H_ */ | 180 | #endif /* KFD_DEVICE_QUEUE_MANAGER_H_ */ |
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_cik.c b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_cik.c index 6b072466e2a6..5469efe0523e 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_cik.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager_cik.c | |||
| @@ -131,5 +131,5 @@ static int register_process_cik(struct device_queue_manager *dqm, | |||
| 131 | 131 | ||
| 132 | static int initialize_cpsch_cik(struct device_queue_manager *dqm) | 132 | static int initialize_cpsch_cik(struct device_queue_manager *dqm) |
| 133 | { | 133 | { |
| 134 | return init_pipelines(dqm, get_pipes_num(dqm), 0); | 134 | return init_pipelines(dqm, get_pipes_num(dqm), get_first_pipe(dqm)); |
| 135 | } | 135 | } |
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c index 6b00173d1be4..6b6b07ff720b 100644 --- a/drivers/gpu/drm/drm_crtc.c +++ b/drivers/gpu/drm/drm_crtc.c | |||
| @@ -2127,7 +2127,6 @@ int drm_mode_getconnector(struct drm_device *dev, void *data, | |||
| 2127 | DRM_DEBUG_KMS("[CONNECTOR:%d:?]\n", out_resp->connector_id); | 2127 | DRM_DEBUG_KMS("[CONNECTOR:%d:?]\n", out_resp->connector_id); |
| 2128 | 2128 | ||
| 2129 | mutex_lock(&dev->mode_config.mutex); | 2129 | mutex_lock(&dev->mode_config.mutex); |
| 2130 | drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); | ||
| 2131 | 2130 | ||
| 2132 | connector = drm_connector_find(dev, out_resp->connector_id); | 2131 | connector = drm_connector_find(dev, out_resp->connector_id); |
| 2133 | if (!connector) { | 2132 | if (!connector) { |
| @@ -2157,6 +2156,8 @@ int drm_mode_getconnector(struct drm_device *dev, void *data, | |||
| 2157 | out_resp->mm_height = connector->display_info.height_mm; | 2156 | out_resp->mm_height = connector->display_info.height_mm; |
| 2158 | out_resp->subpixel = connector->display_info.subpixel_order; | 2157 | out_resp->subpixel = connector->display_info.subpixel_order; |
| 2159 | out_resp->connection = connector->status; | 2158 | out_resp->connection = connector->status; |
| 2159 | |||
| 2160 | drm_modeset_lock(&dev->mode_config.connection_mutex, NULL); | ||
| 2160 | encoder = drm_connector_get_encoder(connector); | 2161 | encoder = drm_connector_get_encoder(connector); |
| 2161 | if (encoder) | 2162 | if (encoder) |
| 2162 | out_resp->encoder_id = encoder->base.id; | 2163 | out_resp->encoder_id = encoder->base.id; |
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) |
diff --git a/drivers/gpu/drm/tegra/dc.c b/drivers/gpu/drm/tegra/dc.c index 3aaa84ae2681..1a52522f5da7 100644 --- a/drivers/gpu/drm/tegra/dc.c +++ b/drivers/gpu/drm/tegra/dc.c | |||
| @@ -997,8 +997,10 @@ static void tegra_crtc_reset(struct drm_crtc *crtc) | |||
| 997 | crtc->state = NULL; | 997 | crtc->state = NULL; |
| 998 | 998 | ||
| 999 | state = kzalloc(sizeof(*state), GFP_KERNEL); | 999 | state = kzalloc(sizeof(*state), GFP_KERNEL); |
| 1000 | if (state) | 1000 | if (state) { |
| 1001 | crtc->state = &state->base; | 1001 | crtc->state = &state->base; |
| 1002 | crtc->state->crtc = crtc; | ||
| 1003 | } | ||
| 1002 | } | 1004 | } |
| 1003 | 1005 | ||
| 1004 | static struct drm_crtc_state * | 1006 | static struct drm_crtc_state * |
| @@ -1012,6 +1014,7 @@ tegra_crtc_atomic_duplicate_state(struct drm_crtc *crtc) | |||
| 1012 | return NULL; | 1014 | return NULL; |
| 1013 | 1015 | ||
| 1014 | copy->base.mode_changed = false; | 1016 | copy->base.mode_changed = false; |
| 1017 | copy->base.active_changed = false; | ||
| 1015 | copy->base.planes_changed = false; | 1018 | copy->base.planes_changed = false; |
| 1016 | copy->base.event = NULL; | 1019 | copy->base.event = NULL; |
| 1017 | 1020 | ||
| @@ -1227,9 +1230,6 @@ static void tegra_crtc_mode_set_nofb(struct drm_crtc *crtc) | |||
| 1227 | /* program display mode */ | 1230 | /* program display mode */ |
| 1228 | tegra_dc_set_timings(dc, mode); | 1231 | tegra_dc_set_timings(dc, mode); |
| 1229 | 1232 | ||
| 1230 | if (dc->soc->supports_border_color) | ||
| 1231 | tegra_dc_writel(dc, 0, DC_DISP_BORDER_COLOR); | ||
| 1232 | |||
| 1233 | /* interlacing isn't supported yet, so disable it */ | 1233 | /* interlacing isn't supported yet, so disable it */ |
| 1234 | if (dc->soc->supports_interlacing) { | 1234 | if (dc->soc->supports_interlacing) { |
| 1235 | value = tegra_dc_readl(dc, DC_DISP_INTERLACE_CONTROL); | 1235 | value = tegra_dc_readl(dc, DC_DISP_INTERLACE_CONTROL); |
| @@ -1252,42 +1252,7 @@ static void tegra_crtc_mode_set_nofb(struct drm_crtc *crtc) | |||
| 1252 | 1252 | ||
| 1253 | static void tegra_crtc_prepare(struct drm_crtc *crtc) | 1253 | static void tegra_crtc_prepare(struct drm_crtc *crtc) |
| 1254 | { | 1254 | { |
| 1255 | struct tegra_dc *dc = to_tegra_dc(crtc); | ||
| 1256 | unsigned int syncpt; | ||
| 1257 | unsigned long value; | ||
| 1258 | |||
| 1259 | drm_crtc_vblank_off(crtc); | 1255 | drm_crtc_vblank_off(crtc); |
| 1260 | |||
| 1261 | if (dc->pipe) | ||
| 1262 | syncpt = SYNCPT_VBLANK1; | ||
| 1263 | else | ||
| 1264 | syncpt = SYNCPT_VBLANK0; | ||
| 1265 | |||
| 1266 | /* initialize display controller */ | ||
| 1267 | tegra_dc_writel(dc, 0x00000100, DC_CMD_GENERAL_INCR_SYNCPT_CNTRL); | ||
| 1268 | tegra_dc_writel(dc, 0x100 | syncpt, DC_CMD_CONT_SYNCPT_VSYNC); | ||
| 1269 | |||
| 1270 | value = WIN_A_UF_INT | WIN_B_UF_INT | WIN_C_UF_INT | WIN_A_OF_INT; | ||
| 1271 | tegra_dc_writel(dc, value, DC_CMD_INT_TYPE); | ||
| 1272 | |||
| 1273 | value = WIN_A_UF_INT | WIN_B_UF_INT | WIN_C_UF_INT | | ||
| 1274 | WIN_A_OF_INT | WIN_B_OF_INT | WIN_C_OF_INT; | ||
| 1275 | tegra_dc_writel(dc, value, DC_CMD_INT_POLARITY); | ||
| 1276 | |||
| 1277 | /* initialize timer */ | ||
| 1278 | value = CURSOR_THRESHOLD(0) | WINDOW_A_THRESHOLD(0x20) | | ||
| 1279 | WINDOW_B_THRESHOLD(0x20) | WINDOW_C_THRESHOLD(0x20); | ||
| 1280 | tegra_dc_writel(dc, value, DC_DISP_DISP_MEM_HIGH_PRIORITY); | ||
| 1281 | |||
| 1282 | value = CURSOR_THRESHOLD(0) | WINDOW_A_THRESHOLD(1) | | ||
| 1283 | WINDOW_B_THRESHOLD(1) | WINDOW_C_THRESHOLD(1); | ||
| 1284 | tegra_dc_writel(dc, value, DC_DISP_DISP_MEM_HIGH_PRIORITY_TIMER); | ||
| 1285 | |||
| 1286 | value = VBLANK_INT | WIN_A_UF_INT | WIN_B_UF_INT | WIN_C_UF_INT; | ||
| 1287 | tegra_dc_writel(dc, value, DC_CMD_INT_ENABLE); | ||
| 1288 | |||
| 1289 | value = WIN_A_UF_INT | WIN_B_UF_INT | WIN_C_UF_INT; | ||
| 1290 | tegra_dc_writel(dc, value, DC_CMD_INT_MASK); | ||
| 1291 | } | 1256 | } |
| 1292 | 1257 | ||
| 1293 | static void tegra_crtc_commit(struct drm_crtc *crtc) | 1258 | static void tegra_crtc_commit(struct drm_crtc *crtc) |
| @@ -1664,6 +1629,8 @@ static int tegra_dc_init(struct host1x_client *client) | |||
| 1664 | struct tegra_drm *tegra = drm->dev_private; | 1629 | struct tegra_drm *tegra = drm->dev_private; |
| 1665 | struct drm_plane *primary = NULL; | 1630 | struct drm_plane *primary = NULL; |
| 1666 | struct drm_plane *cursor = NULL; | 1631 | struct drm_plane *cursor = NULL; |
| 1632 | unsigned int syncpt; | ||
| 1633 | u32 value; | ||
| 1667 | int err; | 1634 | int err; |
| 1668 | 1635 | ||
| 1669 | if (tegra->domain) { | 1636 | if (tegra->domain) { |
| @@ -1730,6 +1697,40 @@ static int tegra_dc_init(struct host1x_client *client) | |||
| 1730 | goto cleanup; | 1697 | goto cleanup; |
| 1731 | } | 1698 | } |
| 1732 | 1699 | ||
| 1700 | /* initialize display controller */ | ||
| 1701 | if (dc->pipe) | ||
| 1702 | syncpt = SYNCPT_VBLANK1; | ||
| 1703 | else | ||
| 1704 | syncpt = SYNCPT_VBLANK0; | ||
| 1705 | |||
| 1706 | tegra_dc_writel(dc, 0x00000100, DC_CMD_GENERAL_INCR_SYNCPT_CNTRL); | ||
| 1707 | tegra_dc_writel(dc, 0x100 | syncpt, DC_CMD_CONT_SYNCPT_VSYNC); | ||
| 1708 | |||
| 1709 | value = WIN_A_UF_INT | WIN_B_UF_INT | WIN_C_UF_INT | WIN_A_OF_INT; | ||
| 1710 | tegra_dc_writel(dc, value, DC_CMD_INT_TYPE); | ||
| 1711 | |||
| 1712 | value = WIN_A_UF_INT | WIN_B_UF_INT | WIN_C_UF_INT | | ||
| 1713 | WIN_A_OF_INT | WIN_B_OF_INT | WIN_C_OF_INT; | ||
| 1714 | tegra_dc_writel(dc, value, DC_CMD_INT_POLARITY); | ||
| 1715 | |||
| 1716 | /* initialize timer */ | ||
| 1717 | value = CURSOR_THRESHOLD(0) | WINDOW_A_THRESHOLD(0x20) | | ||
| 1718 | WINDOW_B_THRESHOLD(0x20) | WINDOW_C_THRESHOLD(0x20); | ||
| 1719 | tegra_dc_writel(dc, value, DC_DISP_DISP_MEM_HIGH_PRIORITY); | ||
| 1720 | |||
| 1721 | value = CURSOR_THRESHOLD(0) | WINDOW_A_THRESHOLD(1) | | ||
| 1722 | WINDOW_B_THRESHOLD(1) | WINDOW_C_THRESHOLD(1); | ||
| 1723 | tegra_dc_writel(dc, value, DC_DISP_DISP_MEM_HIGH_PRIORITY_TIMER); | ||
| 1724 | |||
| 1725 | value = VBLANK_INT | WIN_A_UF_INT | WIN_B_UF_INT | WIN_C_UF_INT; | ||
| 1726 | tegra_dc_writel(dc, value, DC_CMD_INT_ENABLE); | ||
| 1727 | |||
| 1728 | value = WIN_A_UF_INT | WIN_B_UF_INT | WIN_C_UF_INT; | ||
| 1729 | tegra_dc_writel(dc, value, DC_CMD_INT_MASK); | ||
| 1730 | |||
| 1731 | if (dc->soc->supports_border_color) | ||
| 1732 | tegra_dc_writel(dc, 0, DC_DISP_BORDER_COLOR); | ||
| 1733 | |||
| 1733 | return 0; | 1734 | return 0; |
| 1734 | 1735 | ||
| 1735 | cleanup: | 1736 | cleanup: |
diff --git a/drivers/gpu/drm/tegra/hdmi.c b/drivers/gpu/drm/tegra/hdmi.c index 7e06657ae58b..7eaaee74a039 100644 --- a/drivers/gpu/drm/tegra/hdmi.c +++ b/drivers/gpu/drm/tegra/hdmi.c | |||
| @@ -851,6 +851,14 @@ static void tegra_hdmi_encoder_mode_set(struct drm_encoder *encoder, | |||
| 851 | h_back_porch = mode->htotal - mode->hsync_end; | 851 | h_back_porch = mode->htotal - mode->hsync_end; |
| 852 | h_front_porch = mode->hsync_start - mode->hdisplay; | 852 | h_front_porch = mode->hsync_start - mode->hdisplay; |
| 853 | 853 | ||
| 854 | err = clk_set_rate(hdmi->clk, pclk); | ||
| 855 | if (err < 0) { | ||
| 856 | dev_err(hdmi->dev, "failed to set HDMI clock frequency: %d\n", | ||
| 857 | err); | ||
| 858 | } | ||
| 859 | |||
| 860 | DRM_DEBUG_KMS("HDMI clock rate: %lu Hz\n", clk_get_rate(hdmi->clk)); | ||
| 861 | |||
| 854 | /* power up sequence */ | 862 | /* power up sequence */ |
| 855 | value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_SOR_PLL0); | 863 | value = tegra_hdmi_readl(hdmi, HDMI_NV_PDISP_SOR_PLL0); |
| 856 | value &= ~SOR_PLL_PDBG; | 864 | value &= ~SOR_PLL_PDBG; |
