diff options
49 files changed, 408 insertions, 452 deletions
diff --git a/drivers/gpu/drm/radeon/Makefile b/drivers/gpu/drm/radeon/Makefile index 7d7aed5357f0..d01b87991422 100644 --- a/drivers/gpu/drm/radeon/Makefile +++ b/drivers/gpu/drm/radeon/Makefile | |||
@@ -72,7 +72,7 @@ radeon-y += radeon_device.o radeon_asic.o radeon_kms.o \ | |||
72 | radeon_cs.o radeon_bios.o radeon_benchmark.o r100.o r300.o r420.o \ | 72 | radeon_cs.o radeon_bios.o radeon_benchmark.o r100.o r300.o r420.o \ |
73 | rs400.o rs600.o rs690.o rv515.o r520.o r600.o rv770.o radeon_test.o \ | 73 | rs400.o rs600.o rs690.o rv515.o r520.o r600.o rv770.o radeon_test.o \ |
74 | r200.o radeon_legacy_tv.o r600_cs.o r600_blit_shaders.o \ | 74 | r200.o radeon_legacy_tv.o r600_cs.o r600_blit_shaders.o \ |
75 | radeon_pm.o atombios_dp.o r600_audio.o r600_hdmi.o dce3_1_afmt.o \ | 75 | radeon_pm.o atombios_dp.o r600_hdmi.o dce3_1_afmt.o \ |
76 | evergreen.o evergreen_cs.o evergreen_blit_shaders.o \ | 76 | evergreen.o evergreen_cs.o evergreen_blit_shaders.o \ |
77 | evergreen_hdmi.o radeon_trace_points.o ni.o cayman_blit_shaders.o \ | 77 | evergreen_hdmi.o radeon_trace_points.o ni.o cayman_blit_shaders.o \ |
78 | atombios_encoders.o radeon_semaphore.o radeon_sa.o atombios_i2c.o si.o \ | 78 | atombios_encoders.o radeon_semaphore.o radeon_sa.o atombios_i2c.o si.o \ |
diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c index a7f2ddf09a9d..b8cd7975f797 100644 --- a/drivers/gpu/drm/radeon/atombios_encoders.c +++ b/drivers/gpu/drm/radeon/atombios_encoders.c | |||
@@ -291,29 +291,6 @@ static void radeon_atom_backlight_exit(struct radeon_encoder *encoder) | |||
291 | bool radeon_atom_get_tv_timings(struct radeon_device *rdev, int index, | 291 | bool radeon_atom_get_tv_timings(struct radeon_device *rdev, int index, |
292 | struct drm_display_mode *mode); | 292 | struct drm_display_mode *mode); |
293 | 293 | ||
294 | |||
295 | static inline bool radeon_encoder_is_digital(struct drm_encoder *encoder) | ||
296 | { | ||
297 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | ||
298 | switch (radeon_encoder->encoder_id) { | ||
299 | case ENCODER_OBJECT_ID_INTERNAL_LVDS: | ||
300 | case ENCODER_OBJECT_ID_INTERNAL_TMDS1: | ||
301 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1: | ||
302 | case ENCODER_OBJECT_ID_INTERNAL_LVTM1: | ||
303 | case ENCODER_OBJECT_ID_INTERNAL_DVO1: | ||
304 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1: | ||
305 | case ENCODER_OBJECT_ID_INTERNAL_DDI: | ||
306 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: | ||
307 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: | ||
308 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: | ||
309 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: | ||
310 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3: | ||
311 | return true; | ||
312 | default: | ||
313 | return false; | ||
314 | } | ||
315 | } | ||
316 | |||
317 | static bool radeon_atom_mode_fixup(struct drm_encoder *encoder, | 294 | static bool radeon_atom_mode_fixup(struct drm_encoder *encoder, |
318 | const struct drm_display_mode *mode, | 295 | const struct drm_display_mode *mode, |
319 | struct drm_display_mode *adjusted_mode) | 296 | struct drm_display_mode *adjusted_mode) |
diff --git a/drivers/gpu/drm/radeon/btc_dpm.c b/drivers/gpu/drm/radeon/btc_dpm.c index f81d7ca134db..300d971187c4 100644 --- a/drivers/gpu/drm/radeon/btc_dpm.c +++ b/drivers/gpu/drm/radeon/btc_dpm.c | |||
@@ -1170,23 +1170,6 @@ static const struct radeon_blacklist_clocks btc_blacklist_clocks[] = | |||
1170 | { 25000, 30000, RADEON_SCLK_UP } | 1170 | { 25000, 30000, RADEON_SCLK_UP } |
1171 | }; | 1171 | }; |
1172 | 1172 | ||
1173 | void btc_get_max_clock_from_voltage_dependency_table(struct radeon_clock_voltage_dependency_table *table, | ||
1174 | u32 *max_clock) | ||
1175 | { | ||
1176 | u32 i, clock = 0; | ||
1177 | |||
1178 | if ((table == NULL) || (table->count == 0)) { | ||
1179 | *max_clock = clock; | ||
1180 | return; | ||
1181 | } | ||
1182 | |||
1183 | for (i = 0; i < table->count; i++) { | ||
1184 | if (clock < table->entries[i].clk) | ||
1185 | clock = table->entries[i].clk; | ||
1186 | } | ||
1187 | *max_clock = clock; | ||
1188 | } | ||
1189 | |||
1190 | void btc_apply_voltage_dependency_rules(struct radeon_clock_voltage_dependency_table *table, | 1173 | void btc_apply_voltage_dependency_rules(struct radeon_clock_voltage_dependency_table *table, |
1191 | u32 clock, u16 max_voltage, u16 *voltage) | 1174 | u32 clock, u16 max_voltage, u16 *voltage) |
1192 | { | 1175 | { |
@@ -2099,7 +2082,6 @@ static void btc_apply_state_adjust_rules(struct radeon_device *rdev, | |||
2099 | bool disable_mclk_switching; | 2082 | bool disable_mclk_switching; |
2100 | u32 mclk, sclk; | 2083 | u32 mclk, sclk; |
2101 | u16 vddc, vddci; | 2084 | u16 vddc, vddci; |
2102 | u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc; | ||
2103 | 2085 | ||
2104 | if ((rdev->pm.dpm.new_active_crtc_count > 1) || | 2086 | if ((rdev->pm.dpm.new_active_crtc_count > 1) || |
2105 | btc_dpm_vblank_too_short(rdev)) | 2087 | btc_dpm_vblank_too_short(rdev)) |
@@ -2141,39 +2123,6 @@ static void btc_apply_state_adjust_rules(struct radeon_device *rdev, | |||
2141 | ps->low.vddci = max_limits->vddci; | 2123 | ps->low.vddci = max_limits->vddci; |
2142 | } | 2124 | } |
2143 | 2125 | ||
2144 | /* limit clocks to max supported clocks based on voltage dependency tables */ | ||
2145 | btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk, | ||
2146 | &max_sclk_vddc); | ||
2147 | btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk, | ||
2148 | &max_mclk_vddci); | ||
2149 | btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk, | ||
2150 | &max_mclk_vddc); | ||
2151 | |||
2152 | if (max_sclk_vddc) { | ||
2153 | if (ps->low.sclk > max_sclk_vddc) | ||
2154 | ps->low.sclk = max_sclk_vddc; | ||
2155 | if (ps->medium.sclk > max_sclk_vddc) | ||
2156 | ps->medium.sclk = max_sclk_vddc; | ||
2157 | if (ps->high.sclk > max_sclk_vddc) | ||
2158 | ps->high.sclk = max_sclk_vddc; | ||
2159 | } | ||
2160 | if (max_mclk_vddci) { | ||
2161 | if (ps->low.mclk > max_mclk_vddci) | ||
2162 | ps->low.mclk = max_mclk_vddci; | ||
2163 | if (ps->medium.mclk > max_mclk_vddci) | ||
2164 | ps->medium.mclk = max_mclk_vddci; | ||
2165 | if (ps->high.mclk > max_mclk_vddci) | ||
2166 | ps->high.mclk = max_mclk_vddci; | ||
2167 | } | ||
2168 | if (max_mclk_vddc) { | ||
2169 | if (ps->low.mclk > max_mclk_vddc) | ||
2170 | ps->low.mclk = max_mclk_vddc; | ||
2171 | if (ps->medium.mclk > max_mclk_vddc) | ||
2172 | ps->medium.mclk = max_mclk_vddc; | ||
2173 | if (ps->high.mclk > max_mclk_vddc) | ||
2174 | ps->high.mclk = max_mclk_vddc; | ||
2175 | } | ||
2176 | |||
2177 | /* XXX validate the min clocks required for display */ | 2126 | /* XXX validate the min clocks required for display */ |
2178 | 2127 | ||
2179 | if (disable_mclk_switching) { | 2128 | if (disable_mclk_switching) { |
diff --git a/drivers/gpu/drm/radeon/btc_dpm.h b/drivers/gpu/drm/radeon/btc_dpm.h index 3b6f12b7760b..1a15e0e41950 100644 --- a/drivers/gpu/drm/radeon/btc_dpm.h +++ b/drivers/gpu/drm/radeon/btc_dpm.h | |||
@@ -46,8 +46,6 @@ void btc_adjust_clock_combinations(struct radeon_device *rdev, | |||
46 | struct rv7xx_pl *pl); | 46 | struct rv7xx_pl *pl); |
47 | void btc_apply_voltage_dependency_rules(struct radeon_clock_voltage_dependency_table *table, | 47 | void btc_apply_voltage_dependency_rules(struct radeon_clock_voltage_dependency_table *table, |
48 | u32 clock, u16 max_voltage, u16 *voltage); | 48 | u32 clock, u16 max_voltage, u16 *voltage); |
49 | void btc_get_max_clock_from_voltage_dependency_table(struct radeon_clock_voltage_dependency_table *table, | ||
50 | u32 *max_clock); | ||
51 | void btc_apply_voltage_delta_rules(struct radeon_device *rdev, | 49 | void btc_apply_voltage_delta_rules(struct radeon_device *rdev, |
52 | u16 max_vddc, u16 max_vddci, | 50 | u16 max_vddc, u16 max_vddci, |
53 | u16 *vddc, u16 *vddci); | 51 | u16 *vddc, u16 *vddci); |
diff --git a/drivers/gpu/drm/radeon/ci_dpm.c b/drivers/gpu/drm/radeon/ci_dpm.c index d416bb2ff48d..f5c8c0445a94 100644 --- a/drivers/gpu/drm/radeon/ci_dpm.c +++ b/drivers/gpu/drm/radeon/ci_dpm.c | |||
@@ -162,8 +162,6 @@ static const struct ci_pt_config_reg didt_config_ci[] = | |||
162 | }; | 162 | }; |
163 | 163 | ||
164 | extern u8 rv770_get_memory_module_index(struct radeon_device *rdev); | 164 | extern u8 rv770_get_memory_module_index(struct radeon_device *rdev); |
165 | extern void btc_get_max_clock_from_voltage_dependency_table(struct radeon_clock_voltage_dependency_table *table, | ||
166 | u32 *max_clock); | ||
167 | extern int ni_copy_and_switch_arb_sets(struct radeon_device *rdev, | 165 | extern int ni_copy_and_switch_arb_sets(struct radeon_device *rdev, |
168 | u32 arb_freq_src, u32 arb_freq_dest); | 166 | u32 arb_freq_src, u32 arb_freq_dest); |
169 | extern u8 si_get_ddr3_mclk_frequency_ratio(u32 memory_clock); | 167 | extern u8 si_get_ddr3_mclk_frequency_ratio(u32 memory_clock); |
@@ -748,7 +746,6 @@ static void ci_apply_state_adjust_rules(struct radeon_device *rdev, | |||
748 | struct radeon_clock_and_voltage_limits *max_limits; | 746 | struct radeon_clock_and_voltage_limits *max_limits; |
749 | bool disable_mclk_switching; | 747 | bool disable_mclk_switching; |
750 | u32 sclk, mclk; | 748 | u32 sclk, mclk; |
751 | u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc; | ||
752 | int i; | 749 | int i; |
753 | 750 | ||
754 | if (rps->vce_active) { | 751 | if (rps->vce_active) { |
@@ -784,29 +781,6 @@ static void ci_apply_state_adjust_rules(struct radeon_device *rdev, | |||
784 | } | 781 | } |
785 | } | 782 | } |
786 | 783 | ||
787 | /* limit clocks to max supported clocks based on voltage dependency tables */ | ||
788 | btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk, | ||
789 | &max_sclk_vddc); | ||
790 | btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk, | ||
791 | &max_mclk_vddci); | ||
792 | btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk, | ||
793 | &max_mclk_vddc); | ||
794 | |||
795 | for (i = 0; i < ps->performance_level_count; i++) { | ||
796 | if (max_sclk_vddc) { | ||
797 | if (ps->performance_levels[i].sclk > max_sclk_vddc) | ||
798 | ps->performance_levels[i].sclk = max_sclk_vddc; | ||
799 | } | ||
800 | if (max_mclk_vddci) { | ||
801 | if (ps->performance_levels[i].mclk > max_mclk_vddci) | ||
802 | ps->performance_levels[i].mclk = max_mclk_vddci; | ||
803 | } | ||
804 | if (max_mclk_vddc) { | ||
805 | if (ps->performance_levels[i].mclk > max_mclk_vddc) | ||
806 | ps->performance_levels[i].mclk = max_mclk_vddc; | ||
807 | } | ||
808 | } | ||
809 | |||
810 | /* XXX validate the min clocks required for display */ | 784 | /* XXX validate the min clocks required for display */ |
811 | 785 | ||
812 | if (disable_mclk_switching) { | 786 | if (disable_mclk_switching) { |
@@ -5293,9 +5267,13 @@ int ci_dpm_init(struct radeon_device *rdev) | |||
5293 | void ci_dpm_debugfs_print_current_performance_level(struct radeon_device *rdev, | 5267 | void ci_dpm_debugfs_print_current_performance_level(struct radeon_device *rdev, |
5294 | struct seq_file *m) | 5268 | struct seq_file *m) |
5295 | { | 5269 | { |
5270 | struct ci_power_info *pi = ci_get_pi(rdev); | ||
5271 | struct radeon_ps *rps = &pi->current_rps; | ||
5296 | u32 sclk = ci_get_average_sclk_freq(rdev); | 5272 | u32 sclk = ci_get_average_sclk_freq(rdev); |
5297 | u32 mclk = ci_get_average_mclk_freq(rdev); | 5273 | u32 mclk = ci_get_average_mclk_freq(rdev); |
5298 | 5274 | ||
5275 | seq_printf(m, "uvd %sabled\n", pi->uvd_enabled ? "en" : "dis"); | ||
5276 | seq_printf(m, "vce %sabled\n", rps->vce_active ? "en" : "dis"); | ||
5299 | seq_printf(m, "power level avg sclk: %u mclk: %u\n", | 5277 | seq_printf(m, "power level avg sclk: %u mclk: %u\n", |
5300 | sclk, mclk); | 5278 | sclk, mclk); |
5301 | } | 5279 | } |
diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c index 0d761f73a7fa..d48a539b038a 100644 --- a/drivers/gpu/drm/radeon/cik.c +++ b/drivers/gpu/drm/radeon/cik.c | |||
@@ -3993,7 +3993,7 @@ struct radeon_fence *cik_copy_cpdma(struct radeon_device *rdev, | |||
3993 | return ERR_PTR(r); | 3993 | return ERR_PTR(r); |
3994 | } | 3994 | } |
3995 | 3995 | ||
3996 | radeon_semaphore_sync_resv(sem, resv, false); | 3996 | radeon_semaphore_sync_resv(rdev, sem, resv, false); |
3997 | radeon_semaphore_sync_rings(rdev, sem, ring->idx); | 3997 | radeon_semaphore_sync_rings(rdev, sem, ring->idx); |
3998 | 3998 | ||
3999 | for (i = 0; i < num_loops; i++) { | 3999 | for (i = 0; i < num_loops; i++) { |
@@ -4235,7 +4235,7 @@ static int cik_cp_gfx_load_microcode(struct radeon_device *rdev) | |||
4235 | WREG32(CP_PFP_UCODE_ADDR, 0); | 4235 | WREG32(CP_PFP_UCODE_ADDR, 0); |
4236 | for (i = 0; i < fw_size; i++) | 4236 | for (i = 0; i < fw_size; i++) |
4237 | WREG32(CP_PFP_UCODE_DATA, le32_to_cpup(fw_data++)); | 4237 | WREG32(CP_PFP_UCODE_DATA, le32_to_cpup(fw_data++)); |
4238 | WREG32(CP_PFP_UCODE_ADDR, 0); | 4238 | WREG32(CP_PFP_UCODE_ADDR, le32_to_cpu(pfp_hdr->header.ucode_version)); |
4239 | 4239 | ||
4240 | /* CE */ | 4240 | /* CE */ |
4241 | fw_data = (const __le32 *) | 4241 | fw_data = (const __le32 *) |
@@ -4244,7 +4244,7 @@ static int cik_cp_gfx_load_microcode(struct radeon_device *rdev) | |||
4244 | WREG32(CP_CE_UCODE_ADDR, 0); | 4244 | WREG32(CP_CE_UCODE_ADDR, 0); |
4245 | for (i = 0; i < fw_size; i++) | 4245 | for (i = 0; i < fw_size; i++) |
4246 | WREG32(CP_CE_UCODE_DATA, le32_to_cpup(fw_data++)); | 4246 | WREG32(CP_CE_UCODE_DATA, le32_to_cpup(fw_data++)); |
4247 | WREG32(CP_CE_UCODE_ADDR, 0); | 4247 | WREG32(CP_CE_UCODE_ADDR, le32_to_cpu(ce_hdr->header.ucode_version)); |
4248 | 4248 | ||
4249 | /* ME */ | 4249 | /* ME */ |
4250 | fw_data = (const __be32 *) | 4250 | fw_data = (const __be32 *) |
@@ -4253,7 +4253,8 @@ static int cik_cp_gfx_load_microcode(struct radeon_device *rdev) | |||
4253 | WREG32(CP_ME_RAM_WADDR, 0); | 4253 | WREG32(CP_ME_RAM_WADDR, 0); |
4254 | for (i = 0; i < fw_size; i++) | 4254 | for (i = 0; i < fw_size; i++) |
4255 | WREG32(CP_ME_RAM_DATA, le32_to_cpup(fw_data++)); | 4255 | WREG32(CP_ME_RAM_DATA, le32_to_cpup(fw_data++)); |
4256 | WREG32(CP_ME_RAM_WADDR, 0); | 4256 | WREG32(CP_ME_RAM_WADDR, le32_to_cpu(me_hdr->header.ucode_version)); |
4257 | WREG32(CP_ME_RAM_RADDR, le32_to_cpu(me_hdr->header.ucode_version)); | ||
4257 | } else { | 4258 | } else { |
4258 | const __be32 *fw_data; | 4259 | const __be32 *fw_data; |
4259 | 4260 | ||
@@ -4279,10 +4280,6 @@ static int cik_cp_gfx_load_microcode(struct radeon_device *rdev) | |||
4279 | WREG32(CP_ME_RAM_WADDR, 0); | 4280 | WREG32(CP_ME_RAM_WADDR, 0); |
4280 | } | 4281 | } |
4281 | 4282 | ||
4282 | WREG32(CP_PFP_UCODE_ADDR, 0); | ||
4283 | WREG32(CP_CE_UCODE_ADDR, 0); | ||
4284 | WREG32(CP_ME_RAM_WADDR, 0); | ||
4285 | WREG32(CP_ME_RAM_RADDR, 0); | ||
4286 | return 0; | 4283 | return 0; |
4287 | } | 4284 | } |
4288 | 4285 | ||
@@ -4564,7 +4561,7 @@ static int cik_cp_compute_load_microcode(struct radeon_device *rdev) | |||
4564 | WREG32(CP_MEC_ME1_UCODE_ADDR, 0); | 4561 | WREG32(CP_MEC_ME1_UCODE_ADDR, 0); |
4565 | for (i = 0; i < fw_size; i++) | 4562 | for (i = 0; i < fw_size; i++) |
4566 | WREG32(CP_MEC_ME1_UCODE_DATA, le32_to_cpup(fw_data++)); | 4563 | WREG32(CP_MEC_ME1_UCODE_DATA, le32_to_cpup(fw_data++)); |
4567 | WREG32(CP_MEC_ME1_UCODE_ADDR, 0); | 4564 | WREG32(CP_MEC_ME1_UCODE_ADDR, le32_to_cpu(mec_hdr->header.ucode_version)); |
4568 | 4565 | ||
4569 | /* MEC2 */ | 4566 | /* MEC2 */ |
4570 | if (rdev->family == CHIP_KAVERI) { | 4567 | if (rdev->family == CHIP_KAVERI) { |
@@ -4578,7 +4575,7 @@ static int cik_cp_compute_load_microcode(struct radeon_device *rdev) | |||
4578 | WREG32(CP_MEC_ME2_UCODE_ADDR, 0); | 4575 | WREG32(CP_MEC_ME2_UCODE_ADDR, 0); |
4579 | for (i = 0; i < fw_size; i++) | 4576 | for (i = 0; i < fw_size; i++) |
4580 | WREG32(CP_MEC_ME2_UCODE_DATA, le32_to_cpup(fw_data++)); | 4577 | WREG32(CP_MEC_ME2_UCODE_DATA, le32_to_cpup(fw_data++)); |
4581 | WREG32(CP_MEC_ME2_UCODE_ADDR, 0); | 4578 | WREG32(CP_MEC_ME2_UCODE_ADDR, le32_to_cpu(mec2_hdr->header.ucode_version)); |
4582 | } | 4579 | } |
4583 | } else { | 4580 | } else { |
4584 | const __be32 *fw_data; | 4581 | const __be32 *fw_data; |
@@ -4690,7 +4687,7 @@ static int cik_mec_init(struct radeon_device *rdev) | |||
4690 | r = radeon_bo_create(rdev, | 4687 | r = radeon_bo_create(rdev, |
4691 | rdev->mec.num_mec *rdev->mec.num_pipe * MEC_HPD_SIZE * 2, | 4688 | rdev->mec.num_mec *rdev->mec.num_pipe * MEC_HPD_SIZE * 2, |
4692 | PAGE_SIZE, true, | 4689 | PAGE_SIZE, true, |
4693 | RADEON_GEM_DOMAIN_GTT, 0, NULL, | 4690 | RADEON_GEM_DOMAIN_GTT, 0, NULL, NULL, |
4694 | &rdev->mec.hpd_eop_obj); | 4691 | &rdev->mec.hpd_eop_obj); |
4695 | if (r) { | 4692 | if (r) { |
4696 | dev_warn(rdev->dev, "(%d) create HDP EOP bo failed\n", r); | 4693 | dev_warn(rdev->dev, "(%d) create HDP EOP bo failed\n", r); |
@@ -4861,7 +4858,7 @@ static int cik_cp_compute_resume(struct radeon_device *rdev) | |||
4861 | sizeof(struct bonaire_mqd), | 4858 | sizeof(struct bonaire_mqd), |
4862 | PAGE_SIZE, true, | 4859 | PAGE_SIZE, true, |
4863 | RADEON_GEM_DOMAIN_GTT, 0, NULL, | 4860 | RADEON_GEM_DOMAIN_GTT, 0, NULL, |
4864 | &rdev->ring[idx].mqd_obj); | 4861 | NULL, &rdev->ring[idx].mqd_obj); |
4865 | if (r) { | 4862 | if (r) { |
4866 | dev_warn(rdev->dev, "(%d) create MQD bo failed\n", r); | 4863 | dev_warn(rdev->dev, "(%d) create MQD bo failed\n", r); |
4867 | return r; | 4864 | return r; |
@@ -6227,7 +6224,7 @@ static int cik_rlc_resume(struct radeon_device *rdev) | |||
6227 | WREG32(RLC_GPM_UCODE_ADDR, 0); | 6224 | WREG32(RLC_GPM_UCODE_ADDR, 0); |
6228 | for (i = 0; i < size; i++) | 6225 | for (i = 0; i < size; i++) |
6229 | WREG32(RLC_GPM_UCODE_DATA, le32_to_cpup(fw_data++)); | 6226 | WREG32(RLC_GPM_UCODE_DATA, le32_to_cpup(fw_data++)); |
6230 | WREG32(RLC_GPM_UCODE_ADDR, 0); | 6227 | WREG32(RLC_GPM_UCODE_ADDR, le32_to_cpu(hdr->header.ucode_version)); |
6231 | } else { | 6228 | } else { |
6232 | const __be32 *fw_data; | 6229 | const __be32 *fw_data; |
6233 | 6230 | ||
diff --git a/drivers/gpu/drm/radeon/cik_sdma.c b/drivers/gpu/drm/radeon/cik_sdma.c index c01a6100c318..c473c9125295 100644 --- a/drivers/gpu/drm/radeon/cik_sdma.c +++ b/drivers/gpu/drm/radeon/cik_sdma.c | |||
@@ -571,7 +571,7 @@ struct radeon_fence *cik_copy_dma(struct radeon_device *rdev, | |||
571 | return ERR_PTR(r); | 571 | return ERR_PTR(r); |
572 | } | 572 | } |
573 | 573 | ||
574 | radeon_semaphore_sync_resv(sem, resv, false); | 574 | radeon_semaphore_sync_resv(rdev, sem, resv, false); |
575 | radeon_semaphore_sync_rings(rdev, sem, ring->idx); | 575 | radeon_semaphore_sync_rings(rdev, sem, ring->idx); |
576 | 576 | ||
577 | for (i = 0; i < num_loops; i++) { | 577 | for (i = 0; i < num_loops; i++) { |
diff --git a/drivers/gpu/drm/radeon/dce3_1_afmt.c b/drivers/gpu/drm/radeon/dce3_1_afmt.c index 51800e340a57..950af153f30e 100644 --- a/drivers/gpu/drm/radeon/dce3_1_afmt.c +++ b/drivers/gpu/drm/radeon/dce3_1_afmt.c | |||
@@ -165,7 +165,7 @@ void dce3_1_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *m | |||
165 | 165 | ||
166 | /* disable audio prior to setting up hw */ | 166 | /* disable audio prior to setting up hw */ |
167 | dig->afmt->pin = r600_audio_get_pin(rdev); | 167 | dig->afmt->pin = r600_audio_get_pin(rdev); |
168 | r600_audio_enable(rdev, dig->afmt->pin, false); | 168 | r600_audio_enable(rdev, dig->afmt->pin, 0); |
169 | 169 | ||
170 | r600_audio_set_dto(encoder, mode->clock); | 170 | r600_audio_set_dto(encoder, mode->clock); |
171 | 171 | ||
@@ -240,5 +240,5 @@ void dce3_1_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *m | |||
240 | r600_hdmi_audio_workaround(encoder); | 240 | r600_hdmi_audio_workaround(encoder); |
241 | 241 | ||
242 | /* enable audio after to setting up hw */ | 242 | /* enable audio after to setting up hw */ |
243 | r600_audio_enable(rdev, dig->afmt->pin, true); | 243 | r600_audio_enable(rdev, dig->afmt->pin, 0xf); |
244 | } | 244 | } |
diff --git a/drivers/gpu/drm/radeon/dce6_afmt.c b/drivers/gpu/drm/radeon/dce6_afmt.c index ab29f953a767..c0bbf68dbc27 100644 --- a/drivers/gpu/drm/radeon/dce6_afmt.c +++ b/drivers/gpu/drm/radeon/dce6_afmt.c | |||
@@ -284,13 +284,13 @@ static int dce6_audio_chipset_supported(struct radeon_device *rdev) | |||
284 | 284 | ||
285 | void dce6_audio_enable(struct radeon_device *rdev, | 285 | void dce6_audio_enable(struct radeon_device *rdev, |
286 | struct r600_audio_pin *pin, | 286 | struct r600_audio_pin *pin, |
287 | bool enable) | 287 | u8 enable_mask) |
288 | { | 288 | { |
289 | if (!pin) | 289 | if (!pin) |
290 | return; | 290 | return; |
291 | 291 | ||
292 | WREG32_ENDPOINT(pin->offset, AZ_F0_CODEC_PIN_CONTROL_HOTPLUG_CONTROL, | 292 | WREG32_ENDPOINT(pin->offset, AZ_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, |
293 | enable ? AUDIO_ENABLED : 0); | 293 | enable_mask ? AUDIO_ENABLED : 0); |
294 | } | 294 | } |
295 | 295 | ||
296 | static const u32 pin_offsets[7] = | 296 | static const u32 pin_offsets[7] = |
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index dbca60c7d097..8fe9f870fb5a 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c | |||
@@ -22,7 +22,6 @@ | |||
22 | * Authors: Alex Deucher | 22 | * Authors: Alex Deucher |
23 | */ | 23 | */ |
24 | #include <linux/firmware.h> | 24 | #include <linux/firmware.h> |
25 | #include <linux/platform_device.h> | ||
26 | #include <linux/slab.h> | 25 | #include <linux/slab.h> |
27 | #include <drm/drmP.h> | 26 | #include <drm/drmP.h> |
28 | #include "radeon.h" | 27 | #include "radeon.h" |
@@ -4023,7 +4022,7 @@ int sumo_rlc_init(struct radeon_device *rdev) | |||
4023 | if (rdev->rlc.save_restore_obj == NULL) { | 4022 | if (rdev->rlc.save_restore_obj == NULL) { |
4024 | r = radeon_bo_create(rdev, dws * 4, PAGE_SIZE, true, | 4023 | r = radeon_bo_create(rdev, dws * 4, PAGE_SIZE, true, |
4025 | RADEON_GEM_DOMAIN_VRAM, 0, NULL, | 4024 | RADEON_GEM_DOMAIN_VRAM, 0, NULL, |
4026 | &rdev->rlc.save_restore_obj); | 4025 | NULL, &rdev->rlc.save_restore_obj); |
4027 | if (r) { | 4026 | if (r) { |
4028 | dev_warn(rdev->dev, "(%d) create RLC sr bo failed\n", r); | 4027 | dev_warn(rdev->dev, "(%d) create RLC sr bo failed\n", r); |
4029 | return r; | 4028 | return r; |
@@ -4102,7 +4101,7 @@ int sumo_rlc_init(struct radeon_device *rdev) | |||
4102 | if (rdev->rlc.clear_state_obj == NULL) { | 4101 | if (rdev->rlc.clear_state_obj == NULL) { |
4103 | r = radeon_bo_create(rdev, dws * 4, PAGE_SIZE, true, | 4102 | r = radeon_bo_create(rdev, dws * 4, PAGE_SIZE, true, |
4104 | RADEON_GEM_DOMAIN_VRAM, 0, NULL, | 4103 | RADEON_GEM_DOMAIN_VRAM, 0, NULL, |
4105 | &rdev->rlc.clear_state_obj); | 4104 | NULL, &rdev->rlc.clear_state_obj); |
4106 | if (r) { | 4105 | if (r) { |
4107 | dev_warn(rdev->dev, "(%d) create RLC c bo failed\n", r); | 4106 | dev_warn(rdev->dev, "(%d) create RLC c bo failed\n", r); |
4108 | sumo_rlc_fini(rdev); | 4107 | sumo_rlc_fini(rdev); |
@@ -4179,7 +4178,7 @@ int sumo_rlc_init(struct radeon_device *rdev) | |||
4179 | r = radeon_bo_create(rdev, rdev->rlc.cp_table_size, | 4178 | r = radeon_bo_create(rdev, rdev->rlc.cp_table_size, |
4180 | PAGE_SIZE, true, | 4179 | PAGE_SIZE, true, |
4181 | RADEON_GEM_DOMAIN_VRAM, 0, NULL, | 4180 | RADEON_GEM_DOMAIN_VRAM, 0, NULL, |
4182 | &rdev->rlc.cp_table_obj); | 4181 | NULL, &rdev->rlc.cp_table_obj); |
4183 | if (r) { | 4182 | if (r) { |
4184 | dev_warn(rdev->dev, "(%d) create RLC cp table bo failed\n", r); | 4183 | dev_warn(rdev->dev, "(%d) create RLC cp table bo failed\n", r); |
4185 | sumo_rlc_fini(rdev); | 4184 | sumo_rlc_fini(rdev); |
diff --git a/drivers/gpu/drm/radeon/evergreen_dma.c b/drivers/gpu/drm/radeon/evergreen_dma.c index 946f37d0b469..66bcfadeedd1 100644 --- a/drivers/gpu/drm/radeon/evergreen_dma.c +++ b/drivers/gpu/drm/radeon/evergreen_dma.c | |||
@@ -133,7 +133,7 @@ struct radeon_fence *evergreen_copy_dma(struct radeon_device *rdev, | |||
133 | return ERR_PTR(r); | 133 | return ERR_PTR(r); |
134 | } | 134 | } |
135 | 135 | ||
136 | radeon_semaphore_sync_resv(sem, resv, false); | 136 | radeon_semaphore_sync_resv(rdev, sem, resv, false); |
137 | radeon_semaphore_sync_rings(rdev, sem, ring->idx); | 137 | radeon_semaphore_sync_rings(rdev, sem, ring->idx); |
138 | 138 | ||
139 | for (i = 0; i < num_loops; i++) { | 139 | for (i = 0; i < num_loops; i++) { |
diff --git a/drivers/gpu/drm/radeon/evergreen_hdmi.c b/drivers/gpu/drm/radeon/evergreen_hdmi.c index 278c7a139d74..2514d659b1ba 100644 --- a/drivers/gpu/drm/radeon/evergreen_hdmi.c +++ b/drivers/gpu/drm/radeon/evergreen_hdmi.c | |||
@@ -38,6 +38,37 @@ extern void dce6_afmt_select_pin(struct drm_encoder *encoder); | |||
38 | extern void dce6_afmt_write_latency_fields(struct drm_encoder *encoder, | 38 | extern void dce6_afmt_write_latency_fields(struct drm_encoder *encoder, |
39 | struct drm_display_mode *mode); | 39 | struct drm_display_mode *mode); |
40 | 40 | ||
41 | /* enable the audio stream */ | ||
42 | static void dce4_audio_enable(struct radeon_device *rdev, | ||
43 | struct r600_audio_pin *pin, | ||
44 | u8 enable_mask) | ||
45 | { | ||
46 | u32 tmp = RREG32(AZ_HOT_PLUG_CONTROL); | ||
47 | |||
48 | if (!pin) | ||
49 | return; | ||
50 | |||
51 | if (enable_mask) { | ||
52 | tmp |= AUDIO_ENABLED; | ||
53 | if (enable_mask & 1) | ||
54 | tmp |= PIN0_AUDIO_ENABLED; | ||
55 | if (enable_mask & 2) | ||
56 | tmp |= PIN1_AUDIO_ENABLED; | ||
57 | if (enable_mask & 4) | ||
58 | tmp |= PIN2_AUDIO_ENABLED; | ||
59 | if (enable_mask & 8) | ||
60 | tmp |= PIN3_AUDIO_ENABLED; | ||
61 | } else { | ||
62 | tmp &= ~(AUDIO_ENABLED | | ||
63 | PIN0_AUDIO_ENABLED | | ||
64 | PIN1_AUDIO_ENABLED | | ||
65 | PIN2_AUDIO_ENABLED | | ||
66 | PIN3_AUDIO_ENABLED); | ||
67 | } | ||
68 | |||
69 | WREG32(AZ_HOT_PLUG_CONTROL, tmp); | ||
70 | } | ||
71 | |||
41 | /* | 72 | /* |
42 | * update the N and CTS parameters for a given pixel clock rate | 73 | * update the N and CTS parameters for a given pixel clock rate |
43 | */ | 74 | */ |
@@ -318,10 +349,10 @@ void evergreen_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode | |||
318 | /* disable audio prior to setting up hw */ | 349 | /* disable audio prior to setting up hw */ |
319 | if (ASIC_IS_DCE6(rdev)) { | 350 | if (ASIC_IS_DCE6(rdev)) { |
320 | dig->afmt->pin = dce6_audio_get_pin(rdev); | 351 | dig->afmt->pin = dce6_audio_get_pin(rdev); |
321 | dce6_audio_enable(rdev, dig->afmt->pin, false); | 352 | dce6_audio_enable(rdev, dig->afmt->pin, 0); |
322 | } else { | 353 | } else { |
323 | dig->afmt->pin = r600_audio_get_pin(rdev); | 354 | dig->afmt->pin = r600_audio_get_pin(rdev); |
324 | r600_audio_enable(rdev, dig->afmt->pin, false); | 355 | dce4_audio_enable(rdev, dig->afmt->pin, 0); |
325 | } | 356 | } |
326 | 357 | ||
327 | evergreen_audio_set_dto(encoder, mode->clock); | 358 | evergreen_audio_set_dto(encoder, mode->clock); |
@@ -463,13 +494,15 @@ void evergreen_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode | |||
463 | 494 | ||
464 | /* enable audio after to setting up hw */ | 495 | /* enable audio after to setting up hw */ |
465 | if (ASIC_IS_DCE6(rdev)) | 496 | if (ASIC_IS_DCE6(rdev)) |
466 | dce6_audio_enable(rdev, dig->afmt->pin, true); | 497 | dce6_audio_enable(rdev, dig->afmt->pin, 1); |
467 | else | 498 | else |
468 | r600_audio_enable(rdev, dig->afmt->pin, true); | 499 | dce4_audio_enable(rdev, dig->afmt->pin, 0xf); |
469 | } | 500 | } |
470 | 501 | ||
471 | void evergreen_hdmi_enable(struct drm_encoder *encoder, bool enable) | 502 | void evergreen_hdmi_enable(struct drm_encoder *encoder, bool enable) |
472 | { | 503 | { |
504 | struct drm_device *dev = encoder->dev; | ||
505 | struct radeon_device *rdev = dev->dev_private; | ||
473 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | 506 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
474 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; | 507 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; |
475 | 508 | ||
@@ -482,6 +515,14 @@ void evergreen_hdmi_enable(struct drm_encoder *encoder, bool enable) | |||
482 | if (!enable && !dig->afmt->enabled) | 515 | if (!enable && !dig->afmt->enabled) |
483 | return; | 516 | return; |
484 | 517 | ||
518 | if (!enable && dig->afmt->pin) { | ||
519 | if (ASIC_IS_DCE6(rdev)) | ||
520 | dce6_audio_enable(rdev, dig->afmt->pin, 0); | ||
521 | else | ||
522 | dce4_audio_enable(rdev, dig->afmt->pin, 0); | ||
523 | dig->afmt->pin = NULL; | ||
524 | } | ||
525 | |||
485 | dig->afmt->enabled = enable; | 526 | dig->afmt->enabled = enable; |
486 | 527 | ||
487 | DRM_DEBUG("%sabling HDMI interface @ 0x%04X for encoder 0x%x\n", | 528 | DRM_DEBUG("%sabling HDMI interface @ 0x%04X for encoder 0x%x\n", |
diff --git a/drivers/gpu/drm/radeon/kv_dpm.c b/drivers/gpu/drm/radeon/kv_dpm.c index 8b58e11b64fa..7b129d2b44be 100644 --- a/drivers/gpu/drm/radeon/kv_dpm.c +++ b/drivers/gpu/drm/radeon/kv_dpm.c | |||
@@ -2773,6 +2773,8 @@ void kv_dpm_debugfs_print_current_performance_level(struct radeon_device *rdev, | |||
2773 | tmp = (RREG32_SMC(SMU_VOLTAGE_STATUS) & SMU_VOLTAGE_CURRENT_LEVEL_MASK) >> | 2773 | tmp = (RREG32_SMC(SMU_VOLTAGE_STATUS) & SMU_VOLTAGE_CURRENT_LEVEL_MASK) >> |
2774 | SMU_VOLTAGE_CURRENT_LEVEL_SHIFT; | 2774 | SMU_VOLTAGE_CURRENT_LEVEL_SHIFT; |
2775 | vddc = kv_convert_8bit_index_to_voltage(rdev, (u16)tmp); | 2775 | vddc = kv_convert_8bit_index_to_voltage(rdev, (u16)tmp); |
2776 | seq_printf(m, "uvd %sabled\n", pi->uvd_power_gated ? "dis" : "en"); | ||
2777 | seq_printf(m, "vce %sabled\n", pi->vce_power_gated ? "dis" : "en"); | ||
2776 | seq_printf(m, "power level %d sclk: %u vddc: %u\n", | 2778 | seq_printf(m, "power level %d sclk: %u vddc: %u\n", |
2777 | current_index, sclk, vddc); | 2779 | current_index, sclk, vddc); |
2778 | } | 2780 | } |
diff --git a/drivers/gpu/drm/radeon/ni_dpm.c b/drivers/gpu/drm/radeon/ni_dpm.c index 01fc4888e6fe..715b181c6243 100644 --- a/drivers/gpu/drm/radeon/ni_dpm.c +++ b/drivers/gpu/drm/radeon/ni_dpm.c | |||
@@ -789,7 +789,6 @@ static void ni_apply_state_adjust_rules(struct radeon_device *rdev, | |||
789 | bool disable_mclk_switching; | 789 | bool disable_mclk_switching; |
790 | u32 mclk; | 790 | u32 mclk; |
791 | u16 vddci; | 791 | u16 vddci; |
792 | u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc; | ||
793 | int i; | 792 | int i; |
794 | 793 | ||
795 | if ((rdev->pm.dpm.new_active_crtc_count > 1) || | 794 | if ((rdev->pm.dpm.new_active_crtc_count > 1) || |
@@ -816,29 +815,6 @@ static void ni_apply_state_adjust_rules(struct radeon_device *rdev, | |||
816 | } | 815 | } |
817 | } | 816 | } |
818 | 817 | ||
819 | /* limit clocks to max supported clocks based on voltage dependency tables */ | ||
820 | btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk, | ||
821 | &max_sclk_vddc); | ||
822 | btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk, | ||
823 | &max_mclk_vddci); | ||
824 | btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk, | ||
825 | &max_mclk_vddc); | ||
826 | |||
827 | for (i = 0; i < ps->performance_level_count; i++) { | ||
828 | if (max_sclk_vddc) { | ||
829 | if (ps->performance_levels[i].sclk > max_sclk_vddc) | ||
830 | ps->performance_levels[i].sclk = max_sclk_vddc; | ||
831 | } | ||
832 | if (max_mclk_vddci) { | ||
833 | if (ps->performance_levels[i].mclk > max_mclk_vddci) | ||
834 | ps->performance_levels[i].mclk = max_mclk_vddci; | ||
835 | } | ||
836 | if (max_mclk_vddc) { | ||
837 | if (ps->performance_levels[i].mclk > max_mclk_vddc) | ||
838 | ps->performance_levels[i].mclk = max_mclk_vddc; | ||
839 | } | ||
840 | } | ||
841 | |||
842 | /* XXX validate the min clocks required for display */ | 818 | /* XXX validate the min clocks required for display */ |
843 | 819 | ||
844 | /* adjust low state */ | 820 | /* adjust low state */ |
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index 25f367ac4637..85414283fccc 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
@@ -1430,7 +1430,7 @@ int r600_vram_scratch_init(struct radeon_device *rdev) | |||
1430 | if (rdev->vram_scratch.robj == NULL) { | 1430 | if (rdev->vram_scratch.robj == NULL) { |
1431 | r = radeon_bo_create(rdev, RADEON_GPU_PAGE_SIZE, | 1431 | r = radeon_bo_create(rdev, RADEON_GPU_PAGE_SIZE, |
1432 | PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM, | 1432 | PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM, |
1433 | 0, NULL, &rdev->vram_scratch.robj); | 1433 | 0, NULL, NULL, &rdev->vram_scratch.robj); |
1434 | if (r) { | 1434 | if (r) { |
1435 | return r; | 1435 | return r; |
1436 | } | 1436 | } |
@@ -2912,7 +2912,7 @@ struct radeon_fence *r600_copy_cpdma(struct radeon_device *rdev, | |||
2912 | return ERR_PTR(r); | 2912 | return ERR_PTR(r); |
2913 | } | 2913 | } |
2914 | 2914 | ||
2915 | radeon_semaphore_sync_resv(sem, resv, false); | 2915 | radeon_semaphore_sync_resv(rdev, sem, resv, false); |
2916 | radeon_semaphore_sync_rings(rdev, sem, ring->idx); | 2916 | radeon_semaphore_sync_rings(rdev, sem, ring->idx); |
2917 | 2917 | ||
2918 | radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1)); | 2918 | radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1)); |
@@ -3368,7 +3368,7 @@ int r600_ih_ring_alloc(struct radeon_device *rdev) | |||
3368 | r = radeon_bo_create(rdev, rdev->ih.ring_size, | 3368 | r = radeon_bo_create(rdev, rdev->ih.ring_size, |
3369 | PAGE_SIZE, true, | 3369 | PAGE_SIZE, true, |
3370 | RADEON_GEM_DOMAIN_GTT, 0, | 3370 | RADEON_GEM_DOMAIN_GTT, 0, |
3371 | NULL, &rdev->ih.ring_obj); | 3371 | NULL, NULL, &rdev->ih.ring_obj); |
3372 | if (r) { | 3372 | if (r) { |
3373 | DRM_ERROR("radeon: failed to create ih ring buffer (%d).\n", r); | 3373 | DRM_ERROR("radeon: failed to create ih ring buffer (%d).\n", r); |
3374 | return r; | 3374 | return r; |
diff --git a/drivers/gpu/drm/radeon/r600_audio.c b/drivers/gpu/drm/radeon/r600_audio.c deleted file mode 100644 index bffac10c4296..000000000000 --- a/drivers/gpu/drm/radeon/r600_audio.c +++ /dev/null | |||
@@ -1,207 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright 2008 Advanced Micro Devices, Inc. | ||
3 | * Copyright 2008 Red Hat Inc. | ||
4 | * Copyright 2009 Christian König. | ||
5 | * | ||
6 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
7 | * copy of this software and associated documentation files (the "Software"), | ||
8 | * to deal in the Software without restriction, including without limitation | ||
9 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
10 | * and/or sell copies of the Software, and to permit persons to whom the | ||
11 | * Software is furnished to do so, subject to the following conditions: | ||
12 | * | ||
13 | * The above copyright notice and this permission notice shall be included in | ||
14 | * all copies or substantial portions of the Software. | ||
15 | * | ||
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
19 | * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
20 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
21 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
22 | * OTHER DEALINGS IN THE SOFTWARE. | ||
23 | * | ||
24 | * Authors: Christian König | ||
25 | */ | ||
26 | #include <drm/drmP.h> | ||
27 | #include "radeon.h" | ||
28 | #include "radeon_reg.h" | ||
29 | #include "radeon_asic.h" | ||
30 | #include "atom.h" | ||
31 | |||
32 | /* | ||
33 | * check if enc_priv stores radeon_encoder_atom_dig | ||
34 | */ | ||
35 | static bool radeon_dig_encoder(struct drm_encoder *encoder) | ||
36 | { | ||
37 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | ||
38 | switch (radeon_encoder->encoder_id) { | ||
39 | case ENCODER_OBJECT_ID_INTERNAL_LVDS: | ||
40 | case ENCODER_OBJECT_ID_INTERNAL_TMDS1: | ||
41 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1: | ||
42 | case ENCODER_OBJECT_ID_INTERNAL_LVTM1: | ||
43 | case ENCODER_OBJECT_ID_INTERNAL_DVO1: | ||
44 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1: | ||
45 | case ENCODER_OBJECT_ID_INTERNAL_DDI: | ||
46 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: | ||
47 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: | ||
48 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: | ||
49 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: | ||
50 | return true; | ||
51 | } | ||
52 | return false; | ||
53 | } | ||
54 | |||
55 | /* | ||
56 | * check if the chipset is supported | ||
57 | */ | ||
58 | static int r600_audio_chipset_supported(struct radeon_device *rdev) | ||
59 | { | ||
60 | return ASIC_IS_DCE2(rdev) && !ASIC_IS_NODCE(rdev); | ||
61 | } | ||
62 | |||
63 | struct r600_audio_pin r600_audio_status(struct radeon_device *rdev) | ||
64 | { | ||
65 | struct r600_audio_pin status; | ||
66 | uint32_t value; | ||
67 | |||
68 | value = RREG32(R600_AUDIO_RATE_BPS_CHANNEL); | ||
69 | |||
70 | /* number of channels */ | ||
71 | status.channels = (value & 0x7) + 1; | ||
72 | |||
73 | /* bits per sample */ | ||
74 | switch ((value & 0xF0) >> 4) { | ||
75 | case 0x0: | ||
76 | status.bits_per_sample = 8; | ||
77 | break; | ||
78 | case 0x1: | ||
79 | status.bits_per_sample = 16; | ||
80 | break; | ||
81 | case 0x2: | ||
82 | status.bits_per_sample = 20; | ||
83 | break; | ||
84 | case 0x3: | ||
85 | status.bits_per_sample = 24; | ||
86 | break; | ||
87 | case 0x4: | ||
88 | status.bits_per_sample = 32; | ||
89 | break; | ||
90 | default: | ||
91 | dev_err(rdev->dev, "Unknown bits per sample 0x%x, using 16\n", | ||
92 | (int)value); | ||
93 | status.bits_per_sample = 16; | ||
94 | } | ||
95 | |||
96 | /* current sampling rate in HZ */ | ||
97 | if (value & 0x4000) | ||
98 | status.rate = 44100; | ||
99 | else | ||
100 | status.rate = 48000; | ||
101 | status.rate *= ((value >> 11) & 0x7) + 1; | ||
102 | status.rate /= ((value >> 8) & 0x7) + 1; | ||
103 | |||
104 | value = RREG32(R600_AUDIO_STATUS_BITS); | ||
105 | |||
106 | /* iec 60958 status bits */ | ||
107 | status.status_bits = value & 0xff; | ||
108 | |||
109 | /* iec 60958 category code */ | ||
110 | status.category_code = (value >> 8) & 0xff; | ||
111 | |||
112 | return status; | ||
113 | } | ||
114 | |||
115 | /* | ||
116 | * update all hdmi interfaces with current audio parameters | ||
117 | */ | ||
118 | void r600_audio_update_hdmi(struct work_struct *work) | ||
119 | { | ||
120 | struct radeon_device *rdev = container_of(work, struct radeon_device, | ||
121 | audio_work); | ||
122 | struct drm_device *dev = rdev->ddev; | ||
123 | struct r600_audio_pin audio_status = r600_audio_status(rdev); | ||
124 | struct drm_encoder *encoder; | ||
125 | bool changed = false; | ||
126 | |||
127 | if (rdev->audio.pin[0].channels != audio_status.channels || | ||
128 | rdev->audio.pin[0].rate != audio_status.rate || | ||
129 | rdev->audio.pin[0].bits_per_sample != audio_status.bits_per_sample || | ||
130 | rdev->audio.pin[0].status_bits != audio_status.status_bits || | ||
131 | rdev->audio.pin[0].category_code != audio_status.category_code) { | ||
132 | rdev->audio.pin[0] = audio_status; | ||
133 | changed = true; | ||
134 | } | ||
135 | |||
136 | list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { | ||
137 | if (!radeon_dig_encoder(encoder)) | ||
138 | continue; | ||
139 | if (changed || r600_hdmi_buffer_status_changed(encoder)) | ||
140 | r600_hdmi_update_audio_settings(encoder); | ||
141 | } | ||
142 | } | ||
143 | |||
144 | /* enable the audio stream */ | ||
145 | void r600_audio_enable(struct radeon_device *rdev, | ||
146 | struct r600_audio_pin *pin, | ||
147 | bool enable) | ||
148 | { | ||
149 | u32 value = 0; | ||
150 | |||
151 | if (!pin) | ||
152 | return; | ||
153 | |||
154 | if (ASIC_IS_DCE4(rdev)) { | ||
155 | if (enable) { | ||
156 | value |= 0x81000000; /* Required to enable audio */ | ||
157 | value |= 0x0e1000f0; /* fglrx sets that too */ | ||
158 | } | ||
159 | WREG32(EVERGREEN_AUDIO_ENABLE, value); | ||
160 | } else { | ||
161 | WREG32_P(R600_AUDIO_ENABLE, | ||
162 | enable ? 0x81000000 : 0x0, ~0x81000000); | ||
163 | } | ||
164 | } | ||
165 | |||
166 | /* | ||
167 | * initialize the audio vars | ||
168 | */ | ||
169 | int r600_audio_init(struct radeon_device *rdev) | ||
170 | { | ||
171 | if (!radeon_audio || !r600_audio_chipset_supported(rdev)) | ||
172 | return 0; | ||
173 | |||
174 | rdev->audio.enabled = true; | ||
175 | |||
176 | rdev->audio.num_pins = 1; | ||
177 | rdev->audio.pin[0].channels = -1; | ||
178 | rdev->audio.pin[0].rate = -1; | ||
179 | rdev->audio.pin[0].bits_per_sample = -1; | ||
180 | rdev->audio.pin[0].status_bits = 0; | ||
181 | rdev->audio.pin[0].category_code = 0; | ||
182 | rdev->audio.pin[0].id = 0; | ||
183 | /* disable audio. it will be set up later */ | ||
184 | r600_audio_enable(rdev, &rdev->audio.pin[0], false); | ||
185 | |||
186 | return 0; | ||
187 | } | ||
188 | |||
189 | /* | ||
190 | * release the audio timer | ||
191 | * TODO: How to do this correctly on SMP systems? | ||
192 | */ | ||
193 | void r600_audio_fini(struct radeon_device *rdev) | ||
194 | { | ||
195 | if (!rdev->audio.enabled) | ||
196 | return; | ||
197 | |||
198 | r600_audio_enable(rdev, &rdev->audio.pin[0], false); | ||
199 | |||
200 | rdev->audio.enabled = false; | ||
201 | } | ||
202 | |||
203 | struct r600_audio_pin *r600_audio_get_pin(struct radeon_device *rdev) | ||
204 | { | ||
205 | /* only one pin on 6xx-NI */ | ||
206 | return &rdev->audio.pin[0]; | ||
207 | } | ||
diff --git a/drivers/gpu/drm/radeon/r600_dma.c b/drivers/gpu/drm/radeon/r600_dma.c index fc54224ce87b..a49db830a47f 100644 --- a/drivers/gpu/drm/radeon/r600_dma.c +++ b/drivers/gpu/drm/radeon/r600_dma.c | |||
@@ -470,7 +470,7 @@ struct radeon_fence *r600_copy_dma(struct radeon_device *rdev, | |||
470 | return ERR_PTR(r); | 470 | return ERR_PTR(r); |
471 | } | 471 | } |
472 | 472 | ||
473 | radeon_semaphore_sync_resv(sem, resv, false); | 473 | radeon_semaphore_sync_resv(rdev, sem, resv, false); |
474 | radeon_semaphore_sync_rings(rdev, sem, ring->idx); | 474 | radeon_semaphore_sync_rings(rdev, sem, ring->idx); |
475 | 475 | ||
476 | for (i = 0; i < num_loops; i++) { | 476 | for (i = 0; i < num_loops; i++) { |
diff --git a/drivers/gpu/drm/radeon/r600_hdmi.c b/drivers/gpu/drm/radeon/r600_hdmi.c index 26ef8ced6f89..b90dc0eb08e6 100644 --- a/drivers/gpu/drm/radeon/r600_hdmi.c +++ b/drivers/gpu/drm/radeon/r600_hdmi.c | |||
@@ -72,6 +72,169 @@ static const struct radeon_hdmi_acr r600_hdmi_predefined_acr[] = { | |||
72 | 72 | ||
73 | 73 | ||
74 | /* | 74 | /* |
75 | * check if the chipset is supported | ||
76 | */ | ||
77 | static int r600_audio_chipset_supported(struct radeon_device *rdev) | ||
78 | { | ||
79 | return ASIC_IS_DCE2(rdev) && !ASIC_IS_NODCE(rdev); | ||
80 | } | ||
81 | |||
82 | static struct r600_audio_pin r600_audio_status(struct radeon_device *rdev) | ||
83 | { | ||
84 | struct r600_audio_pin status; | ||
85 | uint32_t value; | ||
86 | |||
87 | value = RREG32(R600_AUDIO_RATE_BPS_CHANNEL); | ||
88 | |||
89 | /* number of channels */ | ||
90 | status.channels = (value & 0x7) + 1; | ||
91 | |||
92 | /* bits per sample */ | ||
93 | switch ((value & 0xF0) >> 4) { | ||
94 | case 0x0: | ||
95 | status.bits_per_sample = 8; | ||
96 | break; | ||
97 | case 0x1: | ||
98 | status.bits_per_sample = 16; | ||
99 | break; | ||
100 | case 0x2: | ||
101 | status.bits_per_sample = 20; | ||
102 | break; | ||
103 | case 0x3: | ||
104 | status.bits_per_sample = 24; | ||
105 | break; | ||
106 | case 0x4: | ||
107 | status.bits_per_sample = 32; | ||
108 | break; | ||
109 | default: | ||
110 | dev_err(rdev->dev, "Unknown bits per sample 0x%x, using 16\n", | ||
111 | (int)value); | ||
112 | status.bits_per_sample = 16; | ||
113 | } | ||
114 | |||
115 | /* current sampling rate in HZ */ | ||
116 | if (value & 0x4000) | ||
117 | status.rate = 44100; | ||
118 | else | ||
119 | status.rate = 48000; | ||
120 | status.rate *= ((value >> 11) & 0x7) + 1; | ||
121 | status.rate /= ((value >> 8) & 0x7) + 1; | ||
122 | |||
123 | value = RREG32(R600_AUDIO_STATUS_BITS); | ||
124 | |||
125 | /* iec 60958 status bits */ | ||
126 | status.status_bits = value & 0xff; | ||
127 | |||
128 | /* iec 60958 category code */ | ||
129 | status.category_code = (value >> 8) & 0xff; | ||
130 | |||
131 | return status; | ||
132 | } | ||
133 | |||
134 | /* | ||
135 | * update all hdmi interfaces with current audio parameters | ||
136 | */ | ||
137 | void r600_audio_update_hdmi(struct work_struct *work) | ||
138 | { | ||
139 | struct radeon_device *rdev = container_of(work, struct radeon_device, | ||
140 | audio_work); | ||
141 | struct drm_device *dev = rdev->ddev; | ||
142 | struct r600_audio_pin audio_status = r600_audio_status(rdev); | ||
143 | struct drm_encoder *encoder; | ||
144 | bool changed = false; | ||
145 | |||
146 | if (rdev->audio.pin[0].channels != audio_status.channels || | ||
147 | rdev->audio.pin[0].rate != audio_status.rate || | ||
148 | rdev->audio.pin[0].bits_per_sample != audio_status.bits_per_sample || | ||
149 | rdev->audio.pin[0].status_bits != audio_status.status_bits || | ||
150 | rdev->audio.pin[0].category_code != audio_status.category_code) { | ||
151 | rdev->audio.pin[0] = audio_status; | ||
152 | changed = true; | ||
153 | } | ||
154 | |||
155 | list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { | ||
156 | if (!radeon_encoder_is_digital(encoder)) | ||
157 | continue; | ||
158 | if (changed || r600_hdmi_buffer_status_changed(encoder)) | ||
159 | r600_hdmi_update_audio_settings(encoder); | ||
160 | } | ||
161 | } | ||
162 | |||
163 | /* enable the audio stream */ | ||
164 | void r600_audio_enable(struct radeon_device *rdev, | ||
165 | struct r600_audio_pin *pin, | ||
166 | u8 enable_mask) | ||
167 | { | ||
168 | u32 tmp = RREG32(AZ_HOT_PLUG_CONTROL); | ||
169 | |||
170 | if (!pin) | ||
171 | return; | ||
172 | |||
173 | if (enable_mask) { | ||
174 | tmp |= AUDIO_ENABLED; | ||
175 | if (enable_mask & 1) | ||
176 | tmp |= PIN0_AUDIO_ENABLED; | ||
177 | if (enable_mask & 2) | ||
178 | tmp |= PIN1_AUDIO_ENABLED; | ||
179 | if (enable_mask & 4) | ||
180 | tmp |= PIN2_AUDIO_ENABLED; | ||
181 | if (enable_mask & 8) | ||
182 | tmp |= PIN3_AUDIO_ENABLED; | ||
183 | } else { | ||
184 | tmp &= ~(AUDIO_ENABLED | | ||
185 | PIN0_AUDIO_ENABLED | | ||
186 | PIN1_AUDIO_ENABLED | | ||
187 | PIN2_AUDIO_ENABLED | | ||
188 | PIN3_AUDIO_ENABLED); | ||
189 | } | ||
190 | |||
191 | WREG32(AZ_HOT_PLUG_CONTROL, tmp); | ||
192 | } | ||
193 | |||
194 | /* | ||
195 | * initialize the audio vars | ||
196 | */ | ||
197 | int r600_audio_init(struct radeon_device *rdev) | ||
198 | { | ||
199 | if (!radeon_audio || !r600_audio_chipset_supported(rdev)) | ||
200 | return 0; | ||
201 | |||
202 | rdev->audio.enabled = true; | ||
203 | |||
204 | rdev->audio.num_pins = 1; | ||
205 | rdev->audio.pin[0].channels = -1; | ||
206 | rdev->audio.pin[0].rate = -1; | ||
207 | rdev->audio.pin[0].bits_per_sample = -1; | ||
208 | rdev->audio.pin[0].status_bits = 0; | ||
209 | rdev->audio.pin[0].category_code = 0; | ||
210 | rdev->audio.pin[0].id = 0; | ||
211 | /* disable audio. it will be set up later */ | ||
212 | r600_audio_enable(rdev, &rdev->audio.pin[0], 0); | ||
213 | |||
214 | return 0; | ||
215 | } | ||
216 | |||
217 | /* | ||
218 | * release the audio timer | ||
219 | * TODO: How to do this correctly on SMP systems? | ||
220 | */ | ||
221 | void r600_audio_fini(struct radeon_device *rdev) | ||
222 | { | ||
223 | if (!rdev->audio.enabled) | ||
224 | return; | ||
225 | |||
226 | r600_audio_enable(rdev, &rdev->audio.pin[0], 0); | ||
227 | |||
228 | rdev->audio.enabled = false; | ||
229 | } | ||
230 | |||
231 | struct r600_audio_pin *r600_audio_get_pin(struct radeon_device *rdev) | ||
232 | { | ||
233 | /* only one pin on 6xx-NI */ | ||
234 | return &rdev->audio.pin[0]; | ||
235 | } | ||
236 | |||
237 | /* | ||
75 | * calculate CTS and N values if they are not found in the table | 238 | * calculate CTS and N values if they are not found in the table |
76 | */ | 239 | */ |
77 | static void r600_hdmi_calc_cts(uint32_t clock, int *CTS, int *N, int freq) | 240 | static void r600_hdmi_calc_cts(uint32_t clock, int *CTS, int *N, int freq) |
@@ -357,7 +520,7 @@ void r600_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *mod | |||
357 | 520 | ||
358 | /* disable audio prior to setting up hw */ | 521 | /* disable audio prior to setting up hw */ |
359 | dig->afmt->pin = r600_audio_get_pin(rdev); | 522 | dig->afmt->pin = r600_audio_get_pin(rdev); |
360 | r600_audio_enable(rdev, dig->afmt->pin, false); | 523 | r600_audio_enable(rdev, dig->afmt->pin, 0xf); |
361 | 524 | ||
362 | r600_audio_set_dto(encoder, mode->clock); | 525 | r600_audio_set_dto(encoder, mode->clock); |
363 | 526 | ||
@@ -443,7 +606,7 @@ void r600_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *mod | |||
443 | WREG32(HDMI0_RAMP_CONTROL3 + offset, 0x00000001); | 606 | WREG32(HDMI0_RAMP_CONTROL3 + offset, 0x00000001); |
444 | 607 | ||
445 | /* enable audio after to setting up hw */ | 608 | /* enable audio after to setting up hw */ |
446 | r600_audio_enable(rdev, dig->afmt->pin, true); | 609 | r600_audio_enable(rdev, dig->afmt->pin, 0xf); |
447 | } | 610 | } |
448 | 611 | ||
449 | /** | 612 | /** |
@@ -528,6 +691,11 @@ void r600_hdmi_enable(struct drm_encoder *encoder, bool enable) | |||
528 | if (!enable && !dig->afmt->enabled) | 691 | if (!enable && !dig->afmt->enabled) |
529 | return; | 692 | return; |
530 | 693 | ||
694 | if (!enable && dig->afmt->pin) { | ||
695 | r600_audio_enable(rdev, dig->afmt->pin, 0); | ||
696 | dig->afmt->pin = NULL; | ||
697 | } | ||
698 | |||
531 | /* Older chipsets require setting HDMI and routing manually */ | 699 | /* Older chipsets require setting HDMI and routing manually */ |
532 | if (!ASIC_IS_DCE3(rdev)) { | 700 | if (!ASIC_IS_DCE3(rdev)) { |
533 | if (enable) | 701 | if (enable) |
diff --git a/drivers/gpu/drm/radeon/r600d.h b/drivers/gpu/drm/radeon/r600d.h index 671b48032a3d..ebf68fa6d1f1 100644 --- a/drivers/gpu/drm/radeon/r600d.h +++ b/drivers/gpu/drm/radeon/r600d.h | |||
@@ -934,6 +934,23 @@ | |||
934 | # define TARGET_LINK_SPEED_MASK (0xf << 0) | 934 | # define TARGET_LINK_SPEED_MASK (0xf << 0) |
935 | # define SELECTABLE_DEEMPHASIS (1 << 6) | 935 | # define SELECTABLE_DEEMPHASIS (1 << 6) |
936 | 936 | ||
937 | /* Audio */ | ||
938 | #define AZ_HOT_PLUG_CONTROL 0x7300 | ||
939 | # define AZ_FORCE_CODEC_WAKE (1 << 0) | ||
940 | # define JACK_DETECTION_ENABLE (1 << 4) | ||
941 | # define UNSOLICITED_RESPONSE_ENABLE (1 << 8) | ||
942 | # define CODEC_HOT_PLUG_ENABLE (1 << 12) | ||
943 | # define AUDIO_ENABLED (1 << 31) | ||
944 | /* DCE3 adds */ | ||
945 | # define PIN0_JACK_DETECTION_ENABLE (1 << 4) | ||
946 | # define PIN1_JACK_DETECTION_ENABLE (1 << 5) | ||
947 | # define PIN2_JACK_DETECTION_ENABLE (1 << 6) | ||
948 | # define PIN3_JACK_DETECTION_ENABLE (1 << 7) | ||
949 | # define PIN0_AUDIO_ENABLED (1 << 24) | ||
950 | # define PIN1_AUDIO_ENABLED (1 << 25) | ||
951 | # define PIN2_AUDIO_ENABLED (1 << 26) | ||
952 | # define PIN3_AUDIO_ENABLED (1 << 27) | ||
953 | |||
937 | /* Audio clocks DCE 2.0/3.0 */ | 954 | /* Audio clocks DCE 2.0/3.0 */ |
938 | #define AUDIO_DTO 0x7340 | 955 | #define AUDIO_DTO 0x7340 |
939 | # define AUDIO_DTO_PHASE(x) (((x) & 0xffff) << 0) | 956 | # define AUDIO_DTO_PHASE(x) (((x) & 0xffff) << 0) |
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index ef91ebb7c671..e01424fe2848 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
@@ -589,9 +589,10 @@ bool radeon_semaphore_emit_wait(struct radeon_device *rdev, int ring, | |||
589 | struct radeon_semaphore *semaphore); | 589 | struct radeon_semaphore *semaphore); |
590 | void radeon_semaphore_sync_fence(struct radeon_semaphore *semaphore, | 590 | void radeon_semaphore_sync_fence(struct radeon_semaphore *semaphore, |
591 | struct radeon_fence *fence); | 591 | struct radeon_fence *fence); |
592 | void radeon_semaphore_sync_resv(struct radeon_semaphore *semaphore, | 592 | int radeon_semaphore_sync_resv(struct radeon_device *rdev, |
593 | struct reservation_object *resv, | 593 | struct radeon_semaphore *semaphore, |
594 | bool shared); | 594 | struct reservation_object *resv, |
595 | bool shared); | ||
595 | int radeon_semaphore_sync_rings(struct radeon_device *rdev, | 596 | int radeon_semaphore_sync_rings(struct radeon_device *rdev, |
596 | struct radeon_semaphore *semaphore, | 597 | struct radeon_semaphore *semaphore, |
597 | int waiting_ring); | 598 | int waiting_ring); |
@@ -712,7 +713,7 @@ struct radeon_flip_work { | |||
712 | uint64_t base; | 713 | uint64_t base; |
713 | struct drm_pending_vblank_event *event; | 714 | struct drm_pending_vblank_event *event; |
714 | struct radeon_bo *old_rbo; | 715 | struct radeon_bo *old_rbo; |
715 | struct radeon_fence *fence; | 716 | struct fence *fence; |
716 | }; | 717 | }; |
717 | 718 | ||
718 | struct r500_irq_stat_regs { | 719 | struct r500_irq_stat_regs { |
@@ -2977,10 +2978,10 @@ struct r600_audio_pin *r600_audio_get_pin(struct radeon_device *rdev); | |||
2977 | struct r600_audio_pin *dce6_audio_get_pin(struct radeon_device *rdev); | 2978 | struct r600_audio_pin *dce6_audio_get_pin(struct radeon_device *rdev); |
2978 | void r600_audio_enable(struct radeon_device *rdev, | 2979 | void r600_audio_enable(struct radeon_device *rdev, |
2979 | struct r600_audio_pin *pin, | 2980 | struct r600_audio_pin *pin, |
2980 | bool enable); | 2981 | u8 enable_mask); |
2981 | void dce6_audio_enable(struct radeon_device *rdev, | 2982 | void dce6_audio_enable(struct radeon_device *rdev, |
2982 | struct r600_audio_pin *pin, | 2983 | struct r600_audio_pin *pin, |
2983 | bool enable); | 2984 | u8 enable_mask); |
2984 | 2985 | ||
2985 | /* | 2986 | /* |
2986 | * R600 vram scratch functions | 2987 | * R600 vram scratch functions |
diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h index ca01bb8ea217..c41363f4fc1a 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.h +++ b/drivers/gpu/drm/radeon/radeon_asic.h | |||
@@ -392,7 +392,6 @@ void r600_disable_interrupts(struct radeon_device *rdev); | |||
392 | void r600_rlc_stop(struct radeon_device *rdev); | 392 | void r600_rlc_stop(struct radeon_device *rdev); |
393 | /* r600 audio */ | 393 | /* r600 audio */ |
394 | int r600_audio_init(struct radeon_device *rdev); | 394 | int r600_audio_init(struct radeon_device *rdev); |
395 | struct r600_audio_pin r600_audio_status(struct radeon_device *rdev); | ||
396 | void r600_audio_fini(struct radeon_device *rdev); | 395 | void r600_audio_fini(struct radeon_device *rdev); |
397 | void r600_audio_set_dto(struct drm_encoder *encoder, u32 clock); | 396 | void r600_audio_set_dto(struct drm_encoder *encoder, u32 clock); |
398 | void r600_hdmi_update_avi_infoframe(struct drm_encoder *encoder, void *buffer, | 397 | void r600_hdmi_update_avi_infoframe(struct drm_encoder *encoder, void *buffer, |
diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c index e74c7e387dde..df69b92ba164 100644 --- a/drivers/gpu/drm/radeon/radeon_atombios.c +++ b/drivers/gpu/drm/radeon/radeon_atombios.c | |||
@@ -458,7 +458,7 @@ static bool radeon_atom_apply_quirks(struct drm_device *dev, | |||
458 | return true; | 458 | return true; |
459 | } | 459 | } |
460 | 460 | ||
461 | const int supported_devices_connector_convert[] = { | 461 | static const int supported_devices_connector_convert[] = { |
462 | DRM_MODE_CONNECTOR_Unknown, | 462 | DRM_MODE_CONNECTOR_Unknown, |
463 | DRM_MODE_CONNECTOR_VGA, | 463 | DRM_MODE_CONNECTOR_VGA, |
464 | DRM_MODE_CONNECTOR_DVII, | 464 | DRM_MODE_CONNECTOR_DVII, |
@@ -477,7 +477,7 @@ const int supported_devices_connector_convert[] = { | |||
477 | DRM_MODE_CONNECTOR_DisplayPort | 477 | DRM_MODE_CONNECTOR_DisplayPort |
478 | }; | 478 | }; |
479 | 479 | ||
480 | const uint16_t supported_devices_connector_object_id_convert[] = { | 480 | static const uint16_t supported_devices_connector_object_id_convert[] = { |
481 | CONNECTOR_OBJECT_ID_NONE, | 481 | CONNECTOR_OBJECT_ID_NONE, |
482 | CONNECTOR_OBJECT_ID_VGA, | 482 | CONNECTOR_OBJECT_ID_VGA, |
483 | CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I, /* not all boards support DL */ | 483 | CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I, /* not all boards support DL */ |
@@ -494,7 +494,7 @@ const uint16_t supported_devices_connector_object_id_convert[] = { | |||
494 | CONNECTOR_OBJECT_ID_SVIDEO | 494 | CONNECTOR_OBJECT_ID_SVIDEO |
495 | }; | 495 | }; |
496 | 496 | ||
497 | const int object_connector_convert[] = { | 497 | static const int object_connector_convert[] = { |
498 | DRM_MODE_CONNECTOR_Unknown, | 498 | DRM_MODE_CONNECTOR_Unknown, |
499 | DRM_MODE_CONNECTOR_DVII, | 499 | DRM_MODE_CONNECTOR_DVII, |
500 | DRM_MODE_CONNECTOR_DVII, | 500 | DRM_MODE_CONNECTOR_DVII, |
diff --git a/drivers/gpu/drm/radeon/radeon_benchmark.c b/drivers/gpu/drm/radeon/radeon_benchmark.c index 1e8855060fc7..9e7f23dd14bd 100644 --- a/drivers/gpu/drm/radeon/radeon_benchmark.c +++ b/drivers/gpu/drm/radeon/radeon_benchmark.c | |||
@@ -93,7 +93,7 @@ static void radeon_benchmark_move(struct radeon_device *rdev, unsigned size, | |||
93 | int time; | 93 | int time; |
94 | 94 | ||
95 | n = RADEON_BENCHMARK_ITERATIONS; | 95 | n = RADEON_BENCHMARK_ITERATIONS; |
96 | r = radeon_bo_create(rdev, size, PAGE_SIZE, true, sdomain, 0, NULL, &sobj); | 96 | r = radeon_bo_create(rdev, size, PAGE_SIZE, true, sdomain, 0, NULL, NULL, &sobj); |
97 | if (r) { | 97 | if (r) { |
98 | goto out_cleanup; | 98 | goto out_cleanup; |
99 | } | 99 | } |
@@ -105,7 +105,7 @@ static void radeon_benchmark_move(struct radeon_device *rdev, unsigned size, | |||
105 | if (r) { | 105 | if (r) { |
106 | goto out_cleanup; | 106 | goto out_cleanup; |
107 | } | 107 | } |
108 | r = radeon_bo_create(rdev, size, PAGE_SIZE, true, ddomain, 0, NULL, &dobj); | 108 | r = radeon_bo_create(rdev, size, PAGE_SIZE, true, ddomain, 0, NULL, NULL, &dobj); |
109 | if (r) { | 109 | if (r) { |
110 | goto out_cleanup; | 110 | goto out_cleanup; |
111 | } | 111 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c index 6651177110f0..3e5f6b71f3ad 100644 --- a/drivers/gpu/drm/radeon/radeon_combios.c +++ b/drivers/gpu/drm/radeon/radeon_combios.c | |||
@@ -116,7 +116,7 @@ enum radeon_combios_connector { | |||
116 | CONNECTOR_UNSUPPORTED_LEGACY | 116 | CONNECTOR_UNSUPPORTED_LEGACY |
117 | }; | 117 | }; |
118 | 118 | ||
119 | const int legacy_connector_convert[] = { | 119 | static const int legacy_connector_convert[] = { |
120 | DRM_MODE_CONNECTOR_Unknown, | 120 | DRM_MODE_CONNECTOR_Unknown, |
121 | DRM_MODE_CONNECTOR_DVID, | 121 | DRM_MODE_CONNECTOR_DVID, |
122 | DRM_MODE_CONNECTOR_VGA, | 122 | DRM_MODE_CONNECTOR_VGA, |
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c index f662de41ba49..1c893447d7cd 100644 --- a/drivers/gpu/drm/radeon/radeon_cs.c +++ b/drivers/gpu/drm/radeon/radeon_cs.c | |||
@@ -249,9 +249,9 @@ static int radeon_cs_get_ring(struct radeon_cs_parser *p, u32 ring, s32 priority | |||
249 | return 0; | 249 | return 0; |
250 | } | 250 | } |
251 | 251 | ||
252 | static void radeon_cs_sync_rings(struct radeon_cs_parser *p) | 252 | static int radeon_cs_sync_rings(struct radeon_cs_parser *p) |
253 | { | 253 | { |
254 | int i; | 254 | int i, r = 0; |
255 | 255 | ||
256 | for (i = 0; i < p->nrelocs; i++) { | 256 | for (i = 0; i < p->nrelocs; i++) { |
257 | struct reservation_object *resv; | 257 | struct reservation_object *resv; |
@@ -260,9 +260,13 @@ static void radeon_cs_sync_rings(struct radeon_cs_parser *p) | |||
260 | continue; | 260 | continue; |
261 | 261 | ||
262 | resv = p->relocs[i].robj->tbo.resv; | 262 | resv = p->relocs[i].robj->tbo.resv; |
263 | radeon_semaphore_sync_resv(p->ib.semaphore, resv, | 263 | r = radeon_semaphore_sync_resv(p->rdev, p->ib.semaphore, resv, |
264 | p->relocs[i].tv.shared); | 264 | p->relocs[i].tv.shared); |
265 | |||
266 | if (r) | ||
267 | break; | ||
265 | } | 268 | } |
269 | return r; | ||
266 | } | 270 | } |
267 | 271 | ||
268 | /* XXX: note that this is called from the legacy UMS CS ioctl as well */ | 272 | /* XXX: note that this is called from the legacy UMS CS ioctl as well */ |
@@ -472,13 +476,19 @@ static int radeon_cs_ib_chunk(struct radeon_device *rdev, | |||
472 | return r; | 476 | return r; |
473 | } | 477 | } |
474 | 478 | ||
479 | r = radeon_cs_sync_rings(parser); | ||
480 | if (r) { | ||
481 | if (r != -ERESTARTSYS) | ||
482 | DRM_ERROR("Failed to sync rings: %i\n", r); | ||
483 | return r; | ||
484 | } | ||
485 | |||
475 | if (parser->ring == R600_RING_TYPE_UVD_INDEX) | 486 | if (parser->ring == R600_RING_TYPE_UVD_INDEX) |
476 | radeon_uvd_note_usage(rdev); | 487 | radeon_uvd_note_usage(rdev); |
477 | else if ((parser->ring == TN_RING_TYPE_VCE1_INDEX) || | 488 | else if ((parser->ring == TN_RING_TYPE_VCE1_INDEX) || |
478 | (parser->ring == TN_RING_TYPE_VCE2_INDEX)) | 489 | (parser->ring == TN_RING_TYPE_VCE2_INDEX)) |
479 | radeon_vce_note_usage(rdev); | 490 | radeon_vce_note_usage(rdev); |
480 | 491 | ||
481 | radeon_cs_sync_rings(parser); | ||
482 | r = radeon_ib_schedule(rdev, &parser->ib, NULL, true); | 492 | r = radeon_ib_schedule(rdev, &parser->ib, NULL, true); |
483 | if (r) { | 493 | if (r) { |
484 | DRM_ERROR("Failed to schedule IB !\n"); | 494 | DRM_ERROR("Failed to schedule IB !\n"); |
@@ -565,7 +575,13 @@ static int radeon_cs_ib_vm_chunk(struct radeon_device *rdev, | |||
565 | if (r) { | 575 | if (r) { |
566 | goto out; | 576 | goto out; |
567 | } | 577 | } |
568 | radeon_cs_sync_rings(parser); | 578 | |
579 | r = radeon_cs_sync_rings(parser); | ||
580 | if (r) { | ||
581 | if (r != -ERESTARTSYS) | ||
582 | DRM_ERROR("Failed to sync rings: %i\n", r); | ||
583 | goto out; | ||
584 | } | ||
569 | radeon_semaphore_sync_fence(parser->ib.semaphore, vm->fence); | 585 | radeon_semaphore_sync_fence(parser->ib.semaphore, vm->fence); |
570 | 586 | ||
571 | if ((rdev->family >= CHIP_TAHITI) && | 587 | if ((rdev->family >= CHIP_TAHITI) && |
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index e84a76e6656a..6fbab1582112 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
@@ -430,7 +430,7 @@ int radeon_wb_init(struct radeon_device *rdev) | |||
430 | 430 | ||
431 | if (rdev->wb.wb_obj == NULL) { | 431 | if (rdev->wb.wb_obj == NULL) { |
432 | r = radeon_bo_create(rdev, RADEON_GPU_PAGE_SIZE, PAGE_SIZE, true, | 432 | r = radeon_bo_create(rdev, RADEON_GPU_PAGE_SIZE, PAGE_SIZE, true, |
433 | RADEON_GEM_DOMAIN_GTT, 0, NULL, | 433 | RADEON_GEM_DOMAIN_GTT, 0, NULL, NULL, |
434 | &rdev->wb.wb_obj); | 434 | &rdev->wb.wb_obj); |
435 | if (r) { | 435 | if (r) { |
436 | dev_warn(rdev->dev, "(%d) create WB bo failed\n", r); | 436 | dev_warn(rdev->dev, "(%d) create WB bo failed\n", r); |
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c index 4eb37976f879..00ead8c2758a 100644 --- a/drivers/gpu/drm/radeon/radeon_display.c +++ b/drivers/gpu/drm/radeon/radeon_display.c | |||
@@ -402,14 +402,21 @@ static void radeon_flip_work_func(struct work_struct *__work) | |||
402 | 402 | ||
403 | down_read(&rdev->exclusive_lock); | 403 | down_read(&rdev->exclusive_lock); |
404 | if (work->fence) { | 404 | if (work->fence) { |
405 | r = radeon_fence_wait(work->fence, false); | 405 | struct radeon_fence *fence; |
406 | if (r == -EDEADLK) { | 406 | |
407 | up_read(&rdev->exclusive_lock); | 407 | fence = to_radeon_fence(work->fence); |
408 | do { | 408 | if (fence && fence->rdev == rdev) { |
409 | r = radeon_gpu_reset(rdev); | 409 | r = radeon_fence_wait(fence, false); |
410 | } while (r == -EAGAIN); | 410 | if (r == -EDEADLK) { |
411 | down_read(&rdev->exclusive_lock); | 411 | up_read(&rdev->exclusive_lock); |
412 | } | 412 | do { |
413 | r = radeon_gpu_reset(rdev); | ||
414 | } while (r == -EAGAIN); | ||
415 | down_read(&rdev->exclusive_lock); | ||
416 | } | ||
417 | } else | ||
418 | r = fence_wait(work->fence, false); | ||
419 | |||
413 | if (r) | 420 | if (r) |
414 | DRM_ERROR("failed to wait on page flip fence (%d)!\n", r); | 421 | DRM_ERROR("failed to wait on page flip fence (%d)!\n", r); |
415 | 422 | ||
@@ -418,7 +425,8 @@ static void radeon_flip_work_func(struct work_struct *__work) | |||
418 | * confused about which BO the CRTC is scanning out | 425 | * confused about which BO the CRTC is scanning out |
419 | */ | 426 | */ |
420 | 427 | ||
421 | radeon_fence_unref(&work->fence); | 428 | fence_put(work->fence); |
429 | work->fence = NULL; | ||
422 | } | 430 | } |
423 | 431 | ||
424 | /* We borrow the event spin lock for protecting flip_status */ | 432 | /* We borrow the event spin lock for protecting flip_status */ |
@@ -494,7 +502,7 @@ static int radeon_crtc_page_flip(struct drm_crtc *crtc, | |||
494 | DRM_ERROR("failed to pin new rbo buffer before flip\n"); | 502 | DRM_ERROR("failed to pin new rbo buffer before flip\n"); |
495 | goto cleanup; | 503 | goto cleanup; |
496 | } | 504 | } |
497 | work->fence = (struct radeon_fence *)fence_get(reservation_object_get_excl(new_rbo->tbo.resv)); | 505 | work->fence = fence_get(reservation_object_get_excl(new_rbo->tbo.resv)); |
498 | radeon_bo_get_tiling_flags(new_rbo, &tiling_flags, NULL); | 506 | radeon_bo_get_tiling_flags(new_rbo, &tiling_flags, NULL); |
499 | radeon_bo_unreserve(new_rbo); | 507 | radeon_bo_unreserve(new_rbo); |
500 | 508 | ||
@@ -576,7 +584,7 @@ pflip_cleanup: | |||
576 | 584 | ||
577 | cleanup: | 585 | cleanup: |
578 | drm_gem_object_unreference_unlocked(&work->old_rbo->gem_base); | 586 | drm_gem_object_unreference_unlocked(&work->old_rbo->gem_base); |
579 | radeon_fence_unref(&work->fence); | 587 | fence_put(work->fence); |
580 | kfree(work); | 588 | kfree(work); |
581 | return r; | 589 | return r; |
582 | } | 590 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_encoders.c b/drivers/gpu/drm/radeon/radeon_encoders.c index 3c2094c25b53..109843dab5e5 100644 --- a/drivers/gpu/drm/radeon/radeon_encoders.c +++ b/drivers/gpu/drm/radeon/radeon_encoders.c | |||
@@ -382,3 +382,24 @@ bool radeon_dig_monitor_is_duallink(struct drm_encoder *encoder, | |||
382 | } | 382 | } |
383 | } | 383 | } |
384 | 384 | ||
385 | bool radeon_encoder_is_digital(struct drm_encoder *encoder) | ||
386 | { | ||
387 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | ||
388 | switch (radeon_encoder->encoder_id) { | ||
389 | case ENCODER_OBJECT_ID_INTERNAL_LVDS: | ||
390 | case ENCODER_OBJECT_ID_INTERNAL_TMDS1: | ||
391 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1: | ||
392 | case ENCODER_OBJECT_ID_INTERNAL_LVTM1: | ||
393 | case ENCODER_OBJECT_ID_INTERNAL_DVO1: | ||
394 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1: | ||
395 | case ENCODER_OBJECT_ID_INTERNAL_DDI: | ||
396 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: | ||
397 | case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: | ||
398 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: | ||
399 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: | ||
400 | case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3: | ||
401 | return true; | ||
402 | default: | ||
403 | return false; | ||
404 | } | ||
405 | } | ||
diff --git a/drivers/gpu/drm/radeon/radeon_fence.c b/drivers/gpu/drm/radeon/radeon_fence.c index af9f2d6bd7d0..995167025282 100644 --- a/drivers/gpu/drm/radeon/radeon_fence.c +++ b/drivers/gpu/drm/radeon/radeon_fence.c | |||
@@ -541,6 +541,15 @@ int radeon_fence_wait(struct radeon_fence *fence, bool intr) | |||
541 | uint64_t seq[RADEON_NUM_RINGS] = {}; | 541 | uint64_t seq[RADEON_NUM_RINGS] = {}; |
542 | long r; | 542 | long r; |
543 | 543 | ||
544 | /* | ||
545 | * This function should not be called on !radeon fences. | ||
546 | * If this is the case, it would mean this function can | ||
547 | * also be called on radeon fences belonging to another card. | ||
548 | * exclusive_lock is not held in that case. | ||
549 | */ | ||
550 | if (WARN_ON_ONCE(!to_radeon_fence(&fence->base))) | ||
551 | return fence_wait(&fence->base, intr); | ||
552 | |||
544 | seq[fence->ring] = fence->seq; | 553 | seq[fence->ring] = fence->seq; |
545 | r = radeon_fence_wait_seq_timeout(fence->rdev, seq, intr, MAX_SCHEDULE_TIMEOUT); | 554 | r = radeon_fence_wait_seq_timeout(fence->rdev, seq, intr, MAX_SCHEDULE_TIMEOUT); |
546 | if (r < 0) { | 555 | if (r < 0) { |
diff --git a/drivers/gpu/drm/radeon/radeon_gart.c b/drivers/gpu/drm/radeon/radeon_gart.c index a053a0779aac..84146d5901aa 100644 --- a/drivers/gpu/drm/radeon/radeon_gart.c +++ b/drivers/gpu/drm/radeon/radeon_gart.c | |||
@@ -128,7 +128,7 @@ int radeon_gart_table_vram_alloc(struct radeon_device *rdev) | |||
128 | if (rdev->gart.robj == NULL) { | 128 | if (rdev->gart.robj == NULL) { |
129 | r = radeon_bo_create(rdev, rdev->gart.table_size, | 129 | r = radeon_bo_create(rdev, rdev->gart.table_size, |
130 | PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM, | 130 | PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM, |
131 | 0, NULL, &rdev->gart.robj); | 131 | 0, NULL, NULL, &rdev->gart.robj); |
132 | if (r) { | 132 | if (r) { |
133 | return r; | 133 | return r; |
134 | } | 134 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c index 4b7c8ec36c2f..c194497aa586 100644 --- a/drivers/gpu/drm/radeon/radeon_gem.c +++ b/drivers/gpu/drm/radeon/radeon_gem.c | |||
@@ -67,7 +67,7 @@ int radeon_gem_object_create(struct radeon_device *rdev, unsigned long size, | |||
67 | 67 | ||
68 | retry: | 68 | retry: |
69 | r = radeon_bo_create(rdev, size, alignment, kernel, initial_domain, | 69 | r = radeon_bo_create(rdev, size, alignment, kernel, initial_domain, |
70 | flags, NULL, &robj); | 70 | flags, NULL, NULL, &robj); |
71 | if (r) { | 71 | if (r) { |
72 | if (r != -ERESTARTSYS) { | 72 | if (r != -ERESTARTSYS) { |
73 | if (initial_domain == RADEON_GEM_DOMAIN_VRAM) { | 73 | if (initial_domain == RADEON_GEM_DOMAIN_VRAM) { |
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h index e27608c29c11..04db2fdd8692 100644 --- a/drivers/gpu/drm/radeon/radeon_mode.h +++ b/drivers/gpu/drm/radeon/radeon_mode.h | |||
@@ -777,6 +777,7 @@ extern void atombios_digital_setup(struct drm_encoder *encoder, int action); | |||
777 | extern int atombios_get_encoder_mode(struct drm_encoder *encoder); | 777 | extern int atombios_get_encoder_mode(struct drm_encoder *encoder); |
778 | extern bool atombios_set_edp_panel_power(struct drm_connector *connector, int action); | 778 | extern bool atombios_set_edp_panel_power(struct drm_connector *connector, int action); |
779 | extern void radeon_encoder_set_active_device(struct drm_encoder *encoder); | 779 | extern void radeon_encoder_set_active_device(struct drm_encoder *encoder); |
780 | extern bool radeon_encoder_is_digital(struct drm_encoder *encoder); | ||
780 | 781 | ||
781 | extern void radeon_crtc_load_lut(struct drm_crtc *crtc); | 782 | extern void radeon_crtc_load_lut(struct drm_crtc *crtc); |
782 | extern int atombios_crtc_set_base(struct drm_crtc *crtc, int x, int y, | 783 | extern int atombios_crtc_set_base(struct drm_crtc *crtc, int x, int y, |
diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c index 0e82f0223fd4..99a960a4f302 100644 --- a/drivers/gpu/drm/radeon/radeon_object.c +++ b/drivers/gpu/drm/radeon/radeon_object.c | |||
@@ -167,8 +167,10 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain) | |||
167 | } | 167 | } |
168 | 168 | ||
169 | int radeon_bo_create(struct radeon_device *rdev, | 169 | int radeon_bo_create(struct radeon_device *rdev, |
170 | unsigned long size, int byte_align, bool kernel, u32 domain, | 170 | unsigned long size, int byte_align, bool kernel, |
171 | u32 flags, struct sg_table *sg, struct radeon_bo **bo_ptr) | 171 | u32 domain, u32 flags, struct sg_table *sg, |
172 | struct reservation_object *resv, | ||
173 | struct radeon_bo **bo_ptr) | ||
172 | { | 174 | { |
173 | struct radeon_bo *bo; | 175 | struct radeon_bo *bo; |
174 | enum ttm_bo_type type; | 176 | enum ttm_bo_type type; |
@@ -216,7 +218,7 @@ int radeon_bo_create(struct radeon_device *rdev, | |||
216 | down_read(&rdev->pm.mclk_lock); | 218 | down_read(&rdev->pm.mclk_lock); |
217 | r = ttm_bo_init(&rdev->mman.bdev, &bo->tbo, size, type, | 219 | r = ttm_bo_init(&rdev->mman.bdev, &bo->tbo, size, type, |
218 | &bo->placement, page_align, !kernel, NULL, | 220 | &bo->placement, page_align, !kernel, NULL, |
219 | acc_size, sg, NULL, &radeon_ttm_bo_destroy); | 221 | acc_size, sg, resv, &radeon_ttm_bo_destroy); |
220 | up_read(&rdev->pm.mclk_lock); | 222 | up_read(&rdev->pm.mclk_lock); |
221 | if (unlikely(r != 0)) { | 223 | if (unlikely(r != 0)) { |
222 | return r; | 224 | return r; |
diff --git a/drivers/gpu/drm/radeon/radeon_object.h b/drivers/gpu/drm/radeon/radeon_object.h index 98a47fdf3625..1b8ec7917154 100644 --- a/drivers/gpu/drm/radeon/radeon_object.h +++ b/drivers/gpu/drm/radeon/radeon_object.h | |||
@@ -126,6 +126,7 @@ extern int radeon_bo_create(struct radeon_device *rdev, | |||
126 | unsigned long size, int byte_align, | 126 | unsigned long size, int byte_align, |
127 | bool kernel, u32 domain, u32 flags, | 127 | bool kernel, u32 domain, u32 flags, |
128 | struct sg_table *sg, | 128 | struct sg_table *sg, |
129 | struct reservation_object *resv, | ||
129 | struct radeon_bo **bo_ptr); | 130 | struct radeon_bo **bo_ptr); |
130 | extern int radeon_bo_kmap(struct radeon_bo *bo, void **ptr); | 131 | extern int radeon_bo_kmap(struct radeon_bo *bo, void **ptr); |
131 | extern void radeon_bo_kunmap(struct radeon_bo *bo); | 132 | extern void radeon_bo_kunmap(struct radeon_bo *bo); |
diff --git a/drivers/gpu/drm/radeon/radeon_prime.c b/drivers/gpu/drm/radeon/radeon_prime.c index 171daf7fc483..f3609c97496b 100644 --- a/drivers/gpu/drm/radeon/radeon_prime.c +++ b/drivers/gpu/drm/radeon/radeon_prime.c | |||
@@ -61,12 +61,15 @@ struct drm_gem_object *radeon_gem_prime_import_sg_table(struct drm_device *dev, | |||
61 | struct dma_buf_attachment *attach, | 61 | struct dma_buf_attachment *attach, |
62 | struct sg_table *sg) | 62 | struct sg_table *sg) |
63 | { | 63 | { |
64 | struct reservation_object *resv = attach->dmabuf->resv; | ||
64 | struct radeon_device *rdev = dev->dev_private; | 65 | struct radeon_device *rdev = dev->dev_private; |
65 | struct radeon_bo *bo; | 66 | struct radeon_bo *bo; |
66 | int ret; | 67 | int ret; |
67 | 68 | ||
69 | ww_mutex_lock(&resv->lock, NULL); | ||
68 | ret = radeon_bo_create(rdev, attach->dmabuf->size, PAGE_SIZE, false, | 70 | ret = radeon_bo_create(rdev, attach->dmabuf->size, PAGE_SIZE, false, |
69 | RADEON_GEM_DOMAIN_GTT, 0, sg, &bo); | 71 | RADEON_GEM_DOMAIN_GTT, 0, sg, resv, &bo); |
72 | ww_mutex_unlock(&resv->lock); | ||
70 | if (ret) | 73 | if (ret) |
71 | return ERR_PTR(ret); | 74 | return ERR_PTR(ret); |
72 | 75 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c index 6f2a9bd6bb54..3d17af34afa7 100644 --- a/drivers/gpu/drm/radeon/radeon_ring.c +++ b/drivers/gpu/drm/radeon/radeon_ring.c | |||
@@ -383,7 +383,7 @@ int radeon_ring_init(struct radeon_device *rdev, struct radeon_ring *ring, unsig | |||
383 | /* Allocate ring buffer */ | 383 | /* Allocate ring buffer */ |
384 | if (ring->ring_obj == NULL) { | 384 | if (ring->ring_obj == NULL) { |
385 | r = radeon_bo_create(rdev, ring->ring_size, PAGE_SIZE, true, | 385 | r = radeon_bo_create(rdev, ring->ring_size, PAGE_SIZE, true, |
386 | RADEON_GEM_DOMAIN_GTT, 0, | 386 | RADEON_GEM_DOMAIN_GTT, 0, NULL, |
387 | NULL, &ring->ring_obj); | 387 | NULL, &ring->ring_obj); |
388 | if (r) { | 388 | if (r) { |
389 | dev_err(rdev->dev, "(%d) ring create failed\n", r); | 389 | dev_err(rdev->dev, "(%d) ring create failed\n", r); |
diff --git a/drivers/gpu/drm/radeon/radeon_sa.c b/drivers/gpu/drm/radeon/radeon_sa.c index b84f97c8718c..c507896aca45 100644 --- a/drivers/gpu/drm/radeon/radeon_sa.c +++ b/drivers/gpu/drm/radeon/radeon_sa.c | |||
@@ -65,7 +65,7 @@ int radeon_sa_bo_manager_init(struct radeon_device *rdev, | |||
65 | } | 65 | } |
66 | 66 | ||
67 | r = radeon_bo_create(rdev, size, align, true, | 67 | r = radeon_bo_create(rdev, size, align, true, |
68 | domain, flags, NULL, &sa_manager->bo); | 68 | domain, flags, NULL, NULL, &sa_manager->bo); |
69 | if (r) { | 69 | if (r) { |
70 | dev_err(rdev->dev, "(%d) failed to allocate bo for manager\n", r); | 70 | dev_err(rdev->dev, "(%d) failed to allocate bo for manager\n", r); |
71 | return r; | 71 | return r; |
diff --git a/drivers/gpu/drm/radeon/radeon_semaphore.c b/drivers/gpu/drm/radeon/radeon_semaphore.c index 4d4b0773638a..6deb08f045b7 100644 --- a/drivers/gpu/drm/radeon/radeon_semaphore.c +++ b/drivers/gpu/drm/radeon/radeon_semaphore.c | |||
@@ -124,27 +124,42 @@ void radeon_semaphore_sync_fence(struct radeon_semaphore *semaphore, | |||
124 | * | 124 | * |
125 | * Sync to the fence using this semaphore object | 125 | * Sync to the fence using this semaphore object |
126 | */ | 126 | */ |
127 | void radeon_semaphore_sync_resv(struct radeon_semaphore *sema, | 127 | int radeon_semaphore_sync_resv(struct radeon_device *rdev, |
128 | struct reservation_object *resv, | 128 | struct radeon_semaphore *sema, |
129 | bool shared) | 129 | struct reservation_object *resv, |
130 | bool shared) | ||
130 | { | 131 | { |
131 | struct reservation_object_list *flist; | 132 | struct reservation_object_list *flist; |
132 | struct fence *f; | 133 | struct fence *f; |
134 | struct radeon_fence *fence; | ||
133 | unsigned i; | 135 | unsigned i; |
136 | int r = 0; | ||
134 | 137 | ||
135 | /* always sync to the exclusive fence */ | 138 | /* always sync to the exclusive fence */ |
136 | f = reservation_object_get_excl(resv); | 139 | f = reservation_object_get_excl(resv); |
137 | radeon_semaphore_sync_fence(sema, (struct radeon_fence*)f); | 140 | fence = f ? to_radeon_fence(f) : NULL; |
141 | if (fence && fence->rdev == rdev) | ||
142 | radeon_semaphore_sync_fence(sema, fence); | ||
143 | else if (f) | ||
144 | r = fence_wait(f, true); | ||
138 | 145 | ||
139 | flist = reservation_object_get_list(resv); | 146 | flist = reservation_object_get_list(resv); |
140 | if (shared || !flist) | 147 | if (shared || !flist || r) |
141 | return; | 148 | return r; |
142 | 149 | ||
143 | for (i = 0; i < flist->shared_count; ++i) { | 150 | for (i = 0; i < flist->shared_count; ++i) { |
144 | f = rcu_dereference_protected(flist->shared[i], | 151 | f = rcu_dereference_protected(flist->shared[i], |
145 | reservation_object_held(resv)); | 152 | reservation_object_held(resv)); |
146 | radeon_semaphore_sync_fence(sema, (struct radeon_fence*)f); | 153 | fence = to_radeon_fence(f); |
154 | if (fence && fence->rdev == rdev) | ||
155 | radeon_semaphore_sync_fence(sema, fence); | ||
156 | else | ||
157 | r = fence_wait(f, true); | ||
158 | |||
159 | if (r) | ||
160 | break; | ||
147 | } | 161 | } |
162 | return r; | ||
148 | } | 163 | } |
149 | 164 | ||
150 | /** | 165 | /** |
diff --git a/drivers/gpu/drm/radeon/radeon_test.c b/drivers/gpu/drm/radeon/radeon_test.c index ce943e1a5e51..07b506b41008 100644 --- a/drivers/gpu/drm/radeon/radeon_test.c +++ b/drivers/gpu/drm/radeon/radeon_test.c | |||
@@ -67,7 +67,7 @@ static void radeon_do_test_moves(struct radeon_device *rdev, int flag) | |||
67 | } | 67 | } |
68 | 68 | ||
69 | r = radeon_bo_create(rdev, size, PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM, | 69 | r = radeon_bo_create(rdev, size, PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM, |
70 | 0, NULL, &vram_obj); | 70 | 0, NULL, NULL, &vram_obj); |
71 | if (r) { | 71 | if (r) { |
72 | DRM_ERROR("Failed to create VRAM object\n"); | 72 | DRM_ERROR("Failed to create VRAM object\n"); |
73 | goto out_cleanup; | 73 | goto out_cleanup; |
@@ -87,7 +87,8 @@ static void radeon_do_test_moves(struct radeon_device *rdev, int flag) | |||
87 | struct radeon_fence *fence = NULL; | 87 | struct radeon_fence *fence = NULL; |
88 | 88 | ||
89 | r = radeon_bo_create(rdev, size, PAGE_SIZE, true, | 89 | r = radeon_bo_create(rdev, size, PAGE_SIZE, true, |
90 | RADEON_GEM_DOMAIN_GTT, 0, NULL, gtt_obj + i); | 90 | RADEON_GEM_DOMAIN_GTT, 0, NULL, NULL, |
91 | gtt_obj + i); | ||
91 | if (r) { | 92 | if (r) { |
92 | DRM_ERROR("Failed to create GTT object %d\n", i); | 93 | DRM_ERROR("Failed to create GTT object %d\n", i); |
93 | goto out_lclean; | 94 | goto out_lclean; |
diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c index 738a2f248b36..8624979afb65 100644 --- a/drivers/gpu/drm/radeon/radeon_ttm.c +++ b/drivers/gpu/drm/radeon/radeon_ttm.c | |||
@@ -865,7 +865,7 @@ int radeon_ttm_init(struct radeon_device *rdev) | |||
865 | radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size); | 865 | radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size); |
866 | 866 | ||
867 | r = radeon_bo_create(rdev, 256 * 1024, PAGE_SIZE, true, | 867 | r = radeon_bo_create(rdev, 256 * 1024, PAGE_SIZE, true, |
868 | RADEON_GEM_DOMAIN_VRAM, 0, | 868 | RADEON_GEM_DOMAIN_VRAM, 0, NULL, |
869 | NULL, &rdev->stollen_vga_memory); | 869 | NULL, &rdev->stollen_vga_memory); |
870 | if (r) { | 870 | if (r) { |
871 | return r; | 871 | return r; |
diff --git a/drivers/gpu/drm/radeon/radeon_uvd.c b/drivers/gpu/drm/radeon/radeon_uvd.c index ba4f38916026..11b662469253 100644 --- a/drivers/gpu/drm/radeon/radeon_uvd.c +++ b/drivers/gpu/drm/radeon/radeon_uvd.c | |||
@@ -141,7 +141,8 @@ int radeon_uvd_init(struct radeon_device *rdev) | |||
141 | RADEON_UVD_STACK_SIZE + RADEON_UVD_HEAP_SIZE + | 141 | RADEON_UVD_STACK_SIZE + RADEON_UVD_HEAP_SIZE + |
142 | RADEON_GPU_PAGE_SIZE; | 142 | RADEON_GPU_PAGE_SIZE; |
143 | r = radeon_bo_create(rdev, bo_size, PAGE_SIZE, true, | 143 | r = radeon_bo_create(rdev, bo_size, PAGE_SIZE, true, |
144 | RADEON_GEM_DOMAIN_VRAM, 0, NULL, &rdev->uvd.vcpu_bo); | 144 | RADEON_GEM_DOMAIN_VRAM, 0, NULL, |
145 | NULL, &rdev->uvd.vcpu_bo); | ||
145 | if (r) { | 146 | if (r) { |
146 | dev_err(rdev->dev, "(%d) failed to allocate UVD bo\n", r); | 147 | dev_err(rdev->dev, "(%d) failed to allocate UVD bo\n", r); |
147 | return r; | 148 | return r; |
diff --git a/drivers/gpu/drm/radeon/radeon_vce.c b/drivers/gpu/drm/radeon/radeon_vce.c index c7190aadbd89..9e85757d5599 100644 --- a/drivers/gpu/drm/radeon/radeon_vce.c +++ b/drivers/gpu/drm/radeon/radeon_vce.c | |||
@@ -126,7 +126,8 @@ int radeon_vce_init(struct radeon_device *rdev) | |||
126 | size = RADEON_GPU_PAGE_ALIGN(rdev->vce_fw->size) + | 126 | size = RADEON_GPU_PAGE_ALIGN(rdev->vce_fw->size) + |
127 | RADEON_VCE_STACK_SIZE + RADEON_VCE_HEAP_SIZE; | 127 | RADEON_VCE_STACK_SIZE + RADEON_VCE_HEAP_SIZE; |
128 | r = radeon_bo_create(rdev, size, PAGE_SIZE, true, | 128 | r = radeon_bo_create(rdev, size, PAGE_SIZE, true, |
129 | RADEON_GEM_DOMAIN_VRAM, 0, NULL, &rdev->vce.vcpu_bo); | 129 | RADEON_GEM_DOMAIN_VRAM, 0, NULL, NULL, |
130 | &rdev->vce.vcpu_bo); | ||
130 | if (r) { | 131 | if (r) { |
131 | dev_err(rdev->dev, "(%d) failed to allocate VCE bo\n", r); | 132 | dev_err(rdev->dev, "(%d) failed to allocate VCE bo\n", r); |
132 | return r; | 133 | return r; |
diff --git a/drivers/gpu/drm/radeon/radeon_vm.c b/drivers/gpu/drm/radeon/radeon_vm.c index ce870959dff8..4532cc76a0a6 100644 --- a/drivers/gpu/drm/radeon/radeon_vm.c +++ b/drivers/gpu/drm/radeon/radeon_vm.c | |||
@@ -548,7 +548,8 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev, | |||
548 | 548 | ||
549 | r = radeon_bo_create(rdev, RADEON_VM_PTE_COUNT * 8, | 549 | r = radeon_bo_create(rdev, RADEON_VM_PTE_COUNT * 8, |
550 | RADEON_GPU_PAGE_SIZE, true, | 550 | RADEON_GPU_PAGE_SIZE, true, |
551 | RADEON_GEM_DOMAIN_VRAM, 0, NULL, &pt); | 551 | RADEON_GEM_DOMAIN_VRAM, 0, |
552 | NULL, NULL, &pt); | ||
552 | if (r) | 553 | if (r) |
553 | return r; | 554 | return r; |
554 | 555 | ||
@@ -698,7 +699,7 @@ int radeon_vm_update_page_directory(struct radeon_device *rdev, | |||
698 | if (ib.length_dw != 0) { | 699 | if (ib.length_dw != 0) { |
699 | radeon_asic_vm_pad_ib(rdev, &ib); | 700 | radeon_asic_vm_pad_ib(rdev, &ib); |
700 | 701 | ||
701 | radeon_semaphore_sync_resv(ib.semaphore, pd->tbo.resv, false); | 702 | radeon_semaphore_sync_resv(rdev, ib.semaphore, pd->tbo.resv, false); |
702 | radeon_semaphore_sync_fence(ib.semaphore, vm->last_id_use); | 703 | radeon_semaphore_sync_fence(ib.semaphore, vm->last_id_use); |
703 | WARN_ON(ib.length_dw > ndw); | 704 | WARN_ON(ib.length_dw > ndw); |
704 | r = radeon_ib_schedule(rdev, &ib, NULL, false); | 705 | r = radeon_ib_schedule(rdev, &ib, NULL, false); |
@@ -825,7 +826,7 @@ static void radeon_vm_update_ptes(struct radeon_device *rdev, | |||
825 | unsigned nptes; | 826 | unsigned nptes; |
826 | uint64_t pte; | 827 | uint64_t pte; |
827 | 828 | ||
828 | radeon_semaphore_sync_resv(ib->semaphore, pt->tbo.resv, false); | 829 | radeon_semaphore_sync_resv(rdev, ib->semaphore, pt->tbo.resv, false); |
829 | 830 | ||
830 | if ((addr & ~mask) == (end & ~mask)) | 831 | if ((addr & ~mask) == (end & ~mask)) |
831 | nptes = end - addr; | 832 | nptes = end - addr; |
@@ -1127,7 +1128,7 @@ int radeon_vm_init(struct radeon_device *rdev, struct radeon_vm *vm) | |||
1127 | 1128 | ||
1128 | r = radeon_bo_create(rdev, pd_size, align, true, | 1129 | r = radeon_bo_create(rdev, pd_size, align, true, |
1129 | RADEON_GEM_DOMAIN_VRAM, 0, NULL, | 1130 | RADEON_GEM_DOMAIN_VRAM, 0, NULL, |
1130 | &vm->page_directory); | 1131 | NULL, &vm->page_directory); |
1131 | if (r) | 1132 | if (r) |
1132 | return r; | 1133 | return r; |
1133 | 1134 | ||
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c index d9f5ce715c9b..372016e266d0 100644 --- a/drivers/gpu/drm/radeon/rv770.c +++ b/drivers/gpu/drm/radeon/rv770.c | |||
@@ -26,7 +26,6 @@ | |||
26 | * Jerome Glisse | 26 | * Jerome Glisse |
27 | */ | 27 | */ |
28 | #include <linux/firmware.h> | 28 | #include <linux/firmware.h> |
29 | #include <linux/platform_device.h> | ||
30 | #include <linux/slab.h> | 29 | #include <linux/slab.h> |
31 | #include <drm/drmP.h> | 30 | #include <drm/drmP.h> |
32 | #include "radeon.h" | 31 | #include "radeon.h" |
diff --git a/drivers/gpu/drm/radeon/rv770_dma.c b/drivers/gpu/drm/radeon/rv770_dma.c index c112764adfdf..7f34bad2e724 100644 --- a/drivers/gpu/drm/radeon/rv770_dma.c +++ b/drivers/gpu/drm/radeon/rv770_dma.c | |||
@@ -67,7 +67,7 @@ struct radeon_fence *rv770_copy_dma(struct radeon_device *rdev, | |||
67 | return ERR_PTR(r); | 67 | return ERR_PTR(r); |
68 | } | 68 | } |
69 | 69 | ||
70 | radeon_semaphore_sync_resv(sem, resv, false); | 70 | radeon_semaphore_sync_resv(rdev, sem, resv, false); |
71 | radeon_semaphore_sync_rings(rdev, sem, ring->idx); | 71 | radeon_semaphore_sync_rings(rdev, sem, ring->idx); |
72 | 72 | ||
73 | for (i = 0; i < num_loops; i++) { | 73 | for (i = 0; i < num_loops; i++) { |
diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c index 6bce40847753..423a8cd052aa 100644 --- a/drivers/gpu/drm/radeon/si.c +++ b/drivers/gpu/drm/radeon/si.c | |||
@@ -4684,7 +4684,7 @@ static int si_vm_packet3_compute_check(struct radeon_device *rdev, | |||
4684 | int si_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib) | 4684 | int si_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib) |
4685 | { | 4685 | { |
4686 | int ret = 0; | 4686 | int ret = 0; |
4687 | u32 idx = 0; | 4687 | u32 idx = 0, i; |
4688 | struct radeon_cs_packet pkt; | 4688 | struct radeon_cs_packet pkt; |
4689 | 4689 | ||
4690 | do { | 4690 | do { |
@@ -4695,6 +4695,12 @@ int si_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib) | |||
4695 | switch (pkt.type) { | 4695 | switch (pkt.type) { |
4696 | case RADEON_PACKET_TYPE0: | 4696 | case RADEON_PACKET_TYPE0: |
4697 | dev_err(rdev->dev, "Packet0 not allowed!\n"); | 4697 | dev_err(rdev->dev, "Packet0 not allowed!\n"); |
4698 | for (i = 0; i < ib->length_dw; i++) { | ||
4699 | if (i == idx) | ||
4700 | printk("\t0x%08x <---\n", ib->ptr[i]); | ||
4701 | else | ||
4702 | printk("\t0x%08x\n", ib->ptr[i]); | ||
4703 | } | ||
4698 | ret = -EINVAL; | 4704 | ret = -EINVAL; |
4699 | break; | 4705 | break; |
4700 | case RADEON_PACKET_TYPE2: | 4706 | case RADEON_PACKET_TYPE2: |
diff --git a/drivers/gpu/drm/radeon/si_dma.c b/drivers/gpu/drm/radeon/si_dma.c index 9b0dfbc913f3..b58f12b762d7 100644 --- a/drivers/gpu/drm/radeon/si_dma.c +++ b/drivers/gpu/drm/radeon/si_dma.c | |||
@@ -252,7 +252,7 @@ struct radeon_fence *si_copy_dma(struct radeon_device *rdev, | |||
252 | return ERR_PTR(r); | 252 | return ERR_PTR(r); |
253 | } | 253 | } |
254 | 254 | ||
255 | radeon_semaphore_sync_resv(sem, resv, false); | 255 | radeon_semaphore_sync_resv(rdev, sem, resv, false); |
256 | radeon_semaphore_sync_rings(rdev, sem, ring->idx); | 256 | radeon_semaphore_sync_rings(rdev, sem, ring->idx); |
257 | 257 | ||
258 | for (i = 0; i < num_loops; i++) { | 258 | for (i = 0; i < num_loops; i++) { |
diff --git a/drivers/gpu/drm/radeon/si_dpm.c b/drivers/gpu/drm/radeon/si_dpm.c index 70e61ffeace2..9e4d5d7d348f 100644 --- a/drivers/gpu/drm/radeon/si_dpm.c +++ b/drivers/gpu/drm/radeon/si_dpm.c | |||
@@ -2916,7 +2916,6 @@ static void si_apply_state_adjust_rules(struct radeon_device *rdev, | |||
2916 | bool disable_sclk_switching = false; | 2916 | bool disable_sclk_switching = false; |
2917 | u32 mclk, sclk; | 2917 | u32 mclk, sclk; |
2918 | u16 vddc, vddci; | 2918 | u16 vddc, vddci; |
2919 | u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc; | ||
2920 | int i; | 2919 | int i; |
2921 | 2920 | ||
2922 | if ((rdev->pm.dpm.new_active_crtc_count > 1) || | 2921 | if ((rdev->pm.dpm.new_active_crtc_count > 1) || |
@@ -2950,29 +2949,6 @@ static void si_apply_state_adjust_rules(struct radeon_device *rdev, | |||
2950 | } | 2949 | } |
2951 | } | 2950 | } |
2952 | 2951 | ||
2953 | /* limit clocks to max supported clocks based on voltage dependency tables */ | ||
2954 | btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk, | ||
2955 | &max_sclk_vddc); | ||
2956 | btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk, | ||
2957 | &max_mclk_vddci); | ||
2958 | btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk, | ||
2959 | &max_mclk_vddc); | ||
2960 | |||
2961 | for (i = 0; i < ps->performance_level_count; i++) { | ||
2962 | if (max_sclk_vddc) { | ||
2963 | if (ps->performance_levels[i].sclk > max_sclk_vddc) | ||
2964 | ps->performance_levels[i].sclk = max_sclk_vddc; | ||
2965 | } | ||
2966 | if (max_mclk_vddci) { | ||
2967 | if (ps->performance_levels[i].mclk > max_mclk_vddci) | ||
2968 | ps->performance_levels[i].mclk = max_mclk_vddci; | ||
2969 | } | ||
2970 | if (max_mclk_vddc) { | ||
2971 | if (ps->performance_levels[i].mclk > max_mclk_vddc) | ||
2972 | ps->performance_levels[i].mclk = max_mclk_vddc; | ||
2973 | } | ||
2974 | } | ||
2975 | |||
2976 | /* XXX validate the min clocks required for display */ | 2952 | /* XXX validate the min clocks required for display */ |
2977 | 2953 | ||
2978 | if (disable_mclk_switching) { | 2954 | if (disable_mclk_switching) { |
diff --git a/drivers/gpu/drm/radeon/sid.h b/drivers/gpu/drm/radeon/sid.h index fd414d34d885..6635da9ec986 100644 --- a/drivers/gpu/drm/radeon/sid.h +++ b/drivers/gpu/drm/radeon/sid.h | |||
@@ -736,7 +736,7 @@ | |||
736 | # define DESCRIPTION16(x) (((x) & 0xff) << 0) | 736 | # define DESCRIPTION16(x) (((x) & 0xff) << 0) |
737 | # define DESCRIPTION17(x) (((x) & 0xff) << 8) | 737 | # define DESCRIPTION17(x) (((x) & 0xff) << 8) |
738 | 738 | ||
739 | #define AZ_F0_CODEC_PIN_CONTROL_HOTPLUG_CONTROL 0x54 | 739 | #define AZ_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL 0x54 |
740 | # define AUDIO_ENABLED (1 << 31) | 740 | # define AUDIO_ENABLED (1 << 31) |
741 | 741 | ||
742 | #define AZ_F0_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT 0x56 | 742 | #define AZ_F0_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT 0x56 |