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 \  	radeon_cs.o radeon_bios.o radeon_benchmark.o r100.o r300.o r420.o \  	rs400.o rs600.o rs690.o rv515.o r520.o r600.o rv770.o radeon_test.o \  	r200.o radeon_legacy_tv.o r600_cs.o r600_blit_shaders.o \ -	radeon_pm.o atombios_dp.o r600_audio.o r600_hdmi.o dce3_1_afmt.o \ +	radeon_pm.o atombios_dp.o r600_hdmi.o dce3_1_afmt.o \  	evergreen.o evergreen_cs.o evergreen_blit_shaders.o \  	evergreen_hdmi.o radeon_trace_points.o ni.o cayman_blit_shaders.o \  	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)  bool radeon_atom_get_tv_timings(struct radeon_device *rdev, int index,  				struct drm_display_mode *mode); - -static inline bool radeon_encoder_is_digital(struct drm_encoder *encoder) -{ -	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); -	switch (radeon_encoder->encoder_id) { -	case ENCODER_OBJECT_ID_INTERNAL_LVDS: -	case ENCODER_OBJECT_ID_INTERNAL_TMDS1: -	case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1: -	case ENCODER_OBJECT_ID_INTERNAL_LVTM1: -	case ENCODER_OBJECT_ID_INTERNAL_DVO1: -	case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1: -	case ENCODER_OBJECT_ID_INTERNAL_DDI: -	case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: -	case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: -	case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: -	case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: -	case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3: -		return true; -	default: -		return false; -	} -} -  static bool radeon_atom_mode_fixup(struct drm_encoder *encoder,  				   const struct drm_display_mode *mode,  				   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[] =          { 25000, 30000, RADEON_SCLK_UP }  }; -void btc_get_max_clock_from_voltage_dependency_table(struct radeon_clock_voltage_dependency_table *table, -						     u32 *max_clock) -{ -	u32 i, clock = 0; - -	if ((table == NULL) || (table->count == 0)) { -		*max_clock = clock; -		return; -	} - -	for (i = 0; i < table->count; i++) { -		if (clock < table->entries[i].clk) -			clock = table->entries[i].clk; -	} -	*max_clock = clock; -} -  void btc_apply_voltage_dependency_rules(struct radeon_clock_voltage_dependency_table *table,  					u32 clock, u16 max_voltage, u16 *voltage)  { @@ -2099,7 +2082,6 @@ static void btc_apply_state_adjust_rules(struct radeon_device *rdev,  	bool disable_mclk_switching;  	u32 mclk, sclk;  	u16 vddc, vddci; -	u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc;  	if ((rdev->pm.dpm.new_active_crtc_count > 1) ||  	    btc_dpm_vblank_too_short(rdev)) @@ -2141,39 +2123,6 @@ static void btc_apply_state_adjust_rules(struct radeon_device *rdev,  			ps->low.vddci = max_limits->vddci;  	} -	/* limit clocks to max supported clocks based on voltage dependency tables */ -	btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk, -							&max_sclk_vddc); -	btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk, -							&max_mclk_vddci); -	btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk, -							&max_mclk_vddc); - -	if (max_sclk_vddc) { -		if (ps->low.sclk > max_sclk_vddc) -			ps->low.sclk = max_sclk_vddc; -		if (ps->medium.sclk > max_sclk_vddc) -			ps->medium.sclk = max_sclk_vddc; -		if (ps->high.sclk > max_sclk_vddc) -			ps->high.sclk = max_sclk_vddc; -	} -	if (max_mclk_vddci) { -		if (ps->low.mclk > max_mclk_vddci) -			ps->low.mclk = max_mclk_vddci; -		if (ps->medium.mclk > max_mclk_vddci) -			ps->medium.mclk = max_mclk_vddci; -		if (ps->high.mclk > max_mclk_vddci) -			ps->high.mclk = max_mclk_vddci; -	} -	if (max_mclk_vddc) { -		if (ps->low.mclk > max_mclk_vddc) -			ps->low.mclk = max_mclk_vddc; -		if (ps->medium.mclk > max_mclk_vddc) -			ps->medium.mclk = max_mclk_vddc; -		if (ps->high.mclk > max_mclk_vddc) -			ps->high.mclk = max_mclk_vddc; -	} -  	/* XXX validate the min clocks required for display */  	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,  				   struct rv7xx_pl *pl);  void btc_apply_voltage_dependency_rules(struct radeon_clock_voltage_dependency_table *table,  					u32 clock, u16 max_voltage, u16 *voltage); -void btc_get_max_clock_from_voltage_dependency_table(struct radeon_clock_voltage_dependency_table *table, -						     u32 *max_clock);  void btc_apply_voltage_delta_rules(struct radeon_device *rdev,  				   u16 max_vddc, u16 max_vddci,  				   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[] =  };  extern u8 rv770_get_memory_module_index(struct radeon_device *rdev); -extern void btc_get_max_clock_from_voltage_dependency_table(struct radeon_clock_voltage_dependency_table *table, -							    u32 *max_clock);  extern int ni_copy_and_switch_arb_sets(struct radeon_device *rdev,  				       u32 arb_freq_src, u32 arb_freq_dest);  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,  	struct radeon_clock_and_voltage_limits *max_limits;  	bool disable_mclk_switching;  	u32 sclk, mclk; -	u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc;  	int i;  	if (rps->vce_active) { @@ -784,29 +781,6 @@ static void ci_apply_state_adjust_rules(struct radeon_device *rdev,  		}  	} -	/* limit clocks to max supported clocks based on voltage dependency tables */ -	btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk, -							&max_sclk_vddc); -	btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk, -							&max_mclk_vddci); -	btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk, -							&max_mclk_vddc); - -	for (i = 0; i < ps->performance_level_count; i++) { -		if (max_sclk_vddc) { -			if (ps->performance_levels[i].sclk > max_sclk_vddc) -				ps->performance_levels[i].sclk = max_sclk_vddc; -		} -		if (max_mclk_vddci) { -			if (ps->performance_levels[i].mclk > max_mclk_vddci) -				ps->performance_levels[i].mclk = max_mclk_vddci; -		} -		if (max_mclk_vddc) { -			if (ps->performance_levels[i].mclk > max_mclk_vddc) -				ps->performance_levels[i].mclk = max_mclk_vddc; -		} -	} -  	/* XXX validate the min clocks required for display */  	if (disable_mclk_switching) { @@ -5293,9 +5267,13 @@ int ci_dpm_init(struct radeon_device *rdev)  void ci_dpm_debugfs_print_current_performance_level(struct radeon_device *rdev,  						    struct seq_file *m)  { +	struct ci_power_info *pi = ci_get_pi(rdev); +	struct radeon_ps *rps = &pi->current_rps;  	u32 sclk = ci_get_average_sclk_freq(rdev);  	u32 mclk = ci_get_average_mclk_freq(rdev); +	seq_printf(m, "uvd    %sabled\n", pi->uvd_enabled ? "en" : "dis"); +	seq_printf(m, "vce    %sabled\n", rps->vce_active ? "en" : "dis");  	seq_printf(m, "power level avg    sclk: %u mclk: %u\n",  		   sclk, mclk);  } 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,  		return ERR_PTR(r);  	} -	radeon_semaphore_sync_resv(sem, resv, false); +	radeon_semaphore_sync_resv(rdev, sem, resv, false);  	radeon_semaphore_sync_rings(rdev, sem, ring->idx);  	for (i = 0; i < num_loops; i++) { @@ -4235,7 +4235,7 @@ static int cik_cp_gfx_load_microcode(struct radeon_device *rdev)  		WREG32(CP_PFP_UCODE_ADDR, 0);  		for (i = 0; i < fw_size; i++)  			WREG32(CP_PFP_UCODE_DATA, le32_to_cpup(fw_data++)); -		WREG32(CP_PFP_UCODE_ADDR, 0); +		WREG32(CP_PFP_UCODE_ADDR, le32_to_cpu(pfp_hdr->header.ucode_version));  		/* CE */  		fw_data = (const __le32 *) @@ -4244,7 +4244,7 @@ static int cik_cp_gfx_load_microcode(struct radeon_device *rdev)  		WREG32(CP_CE_UCODE_ADDR, 0);  		for (i = 0; i < fw_size; i++)  			WREG32(CP_CE_UCODE_DATA, le32_to_cpup(fw_data++)); -		WREG32(CP_CE_UCODE_ADDR, 0); +		WREG32(CP_CE_UCODE_ADDR, le32_to_cpu(ce_hdr->header.ucode_version));  		/* ME */  		fw_data = (const __be32 *) @@ -4253,7 +4253,8 @@ static int cik_cp_gfx_load_microcode(struct radeon_device *rdev)  		WREG32(CP_ME_RAM_WADDR, 0);  		for (i = 0; i < fw_size; i++)  			WREG32(CP_ME_RAM_DATA, le32_to_cpup(fw_data++)); -		WREG32(CP_ME_RAM_WADDR, 0); +		WREG32(CP_ME_RAM_WADDR, le32_to_cpu(me_hdr->header.ucode_version)); +		WREG32(CP_ME_RAM_RADDR, le32_to_cpu(me_hdr->header.ucode_version));  	} else {  		const __be32 *fw_data; @@ -4279,10 +4280,6 @@ static int cik_cp_gfx_load_microcode(struct radeon_device *rdev)  		WREG32(CP_ME_RAM_WADDR, 0);  	} -	WREG32(CP_PFP_UCODE_ADDR, 0); -	WREG32(CP_CE_UCODE_ADDR, 0); -	WREG32(CP_ME_RAM_WADDR, 0); -	WREG32(CP_ME_RAM_RADDR, 0);  	return 0;  } @@ -4564,7 +4561,7 @@ static int cik_cp_compute_load_microcode(struct radeon_device *rdev)  		WREG32(CP_MEC_ME1_UCODE_ADDR, 0);  		for (i = 0; i < fw_size; i++)  			WREG32(CP_MEC_ME1_UCODE_DATA, le32_to_cpup(fw_data++)); -		WREG32(CP_MEC_ME1_UCODE_ADDR, 0); +		WREG32(CP_MEC_ME1_UCODE_ADDR, le32_to_cpu(mec_hdr->header.ucode_version));  		/* MEC2 */  		if (rdev->family == CHIP_KAVERI) { @@ -4578,7 +4575,7 @@ static int cik_cp_compute_load_microcode(struct radeon_device *rdev)  			WREG32(CP_MEC_ME2_UCODE_ADDR, 0);  			for (i = 0; i < fw_size; i++)  				WREG32(CP_MEC_ME2_UCODE_DATA, le32_to_cpup(fw_data++)); -			WREG32(CP_MEC_ME2_UCODE_ADDR, 0); +			WREG32(CP_MEC_ME2_UCODE_ADDR, le32_to_cpu(mec2_hdr->header.ucode_version));  		}  	} else {  		const __be32 *fw_data; @@ -4690,7 +4687,7 @@ static int cik_mec_init(struct radeon_device *rdev)  		r = radeon_bo_create(rdev,  				     rdev->mec.num_mec *rdev->mec.num_pipe * MEC_HPD_SIZE * 2,  				     PAGE_SIZE, true, -				     RADEON_GEM_DOMAIN_GTT, 0, NULL, +				     RADEON_GEM_DOMAIN_GTT, 0, NULL, NULL,  				     &rdev->mec.hpd_eop_obj);  		if (r) {  			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)  					     sizeof(struct bonaire_mqd),  					     PAGE_SIZE, true,  					     RADEON_GEM_DOMAIN_GTT, 0, NULL, -					     &rdev->ring[idx].mqd_obj); +					     NULL, &rdev->ring[idx].mqd_obj);  			if (r) {  				dev_warn(rdev->dev, "(%d) create MQD bo failed\n", r);  				return r; @@ -6227,7 +6224,7 @@ static int cik_rlc_resume(struct radeon_device *rdev)  		WREG32(RLC_GPM_UCODE_ADDR, 0);  		for (i = 0; i < size; i++)  			WREG32(RLC_GPM_UCODE_DATA, le32_to_cpup(fw_data++)); -		WREG32(RLC_GPM_UCODE_ADDR, 0); +		WREG32(RLC_GPM_UCODE_ADDR, le32_to_cpu(hdr->header.ucode_version));  	} else {  		const __be32 *fw_data; 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,  		return ERR_PTR(r);  	} -	radeon_semaphore_sync_resv(sem, resv, false); +	radeon_semaphore_sync_resv(rdev, sem, resv, false);  	radeon_semaphore_sync_rings(rdev, sem, ring->idx);  	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  	/* disable audio prior to setting up hw */  	dig->afmt->pin = r600_audio_get_pin(rdev); -	r600_audio_enable(rdev, dig->afmt->pin, false); +	r600_audio_enable(rdev, dig->afmt->pin, 0);  	r600_audio_set_dto(encoder, mode->clock); @@ -240,5 +240,5 @@ void dce3_1_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *m  	r600_hdmi_audio_workaround(encoder);  	/* enable audio after to setting up hw */ -	r600_audio_enable(rdev, dig->afmt->pin, true); +	r600_audio_enable(rdev, dig->afmt->pin, 0xf);  } 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)  void dce6_audio_enable(struct radeon_device *rdev,  		       struct r600_audio_pin *pin, -		       bool enable) +		       u8 enable_mask)  {  	if (!pin)  		return; -	WREG32_ENDPOINT(pin->offset, AZ_F0_CODEC_PIN_CONTROL_HOTPLUG_CONTROL, -			enable ? AUDIO_ENABLED : 0); +	WREG32_ENDPOINT(pin->offset, AZ_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL, +			enable_mask ? AUDIO_ENABLED : 0);  }  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 @@   * Authors: Alex Deucher   */  #include <linux/firmware.h> -#include <linux/platform_device.h>  #include <linux/slab.h>  #include <drm/drmP.h>  #include "radeon.h" @@ -4023,7 +4022,7 @@ int sumo_rlc_init(struct radeon_device *rdev)  		if (rdev->rlc.save_restore_obj == NULL) {  			r = radeon_bo_create(rdev, dws * 4, PAGE_SIZE, true,  					     RADEON_GEM_DOMAIN_VRAM, 0, NULL, -					     &rdev->rlc.save_restore_obj); +					     NULL, &rdev->rlc.save_restore_obj);  			if (r) {  				dev_warn(rdev->dev, "(%d) create RLC sr bo failed\n", r);  				return r; @@ -4102,7 +4101,7 @@ int sumo_rlc_init(struct radeon_device *rdev)  		if (rdev->rlc.clear_state_obj == NULL) {  			r = radeon_bo_create(rdev, dws * 4, PAGE_SIZE, true,  					     RADEON_GEM_DOMAIN_VRAM, 0, NULL, -					     &rdev->rlc.clear_state_obj); +					     NULL, &rdev->rlc.clear_state_obj);  			if (r) {  				dev_warn(rdev->dev, "(%d) create RLC c bo failed\n", r);  				sumo_rlc_fini(rdev); @@ -4179,7 +4178,7 @@ int sumo_rlc_init(struct radeon_device *rdev)  			r = radeon_bo_create(rdev, rdev->rlc.cp_table_size,  					     PAGE_SIZE, true,  					     RADEON_GEM_DOMAIN_VRAM, 0, NULL, -					     &rdev->rlc.cp_table_obj); +					     NULL, &rdev->rlc.cp_table_obj);  			if (r) {  				dev_warn(rdev->dev, "(%d) create RLC cp table bo failed\n", r);  				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,  		return ERR_PTR(r);  	} -	radeon_semaphore_sync_resv(sem, resv, false); +	radeon_semaphore_sync_resv(rdev, sem, resv, false);  	radeon_semaphore_sync_rings(rdev, sem, ring->idx);  	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);  extern void dce6_afmt_write_latency_fields(struct drm_encoder *encoder,  					   struct drm_display_mode *mode); +/* enable the audio stream */ +static void dce4_audio_enable(struct radeon_device *rdev, +			      struct r600_audio_pin *pin, +			      u8 enable_mask) +{ +	u32 tmp = RREG32(AZ_HOT_PLUG_CONTROL); + +	if (!pin) +		return; + +	if (enable_mask) { +		tmp |= AUDIO_ENABLED; +		if (enable_mask & 1) +			tmp |= PIN0_AUDIO_ENABLED; +		if (enable_mask & 2) +			tmp |= PIN1_AUDIO_ENABLED; +		if (enable_mask & 4) +			tmp |= PIN2_AUDIO_ENABLED; +		if (enable_mask & 8) +			tmp |= PIN3_AUDIO_ENABLED; +	} else { +		tmp &= ~(AUDIO_ENABLED | +			 PIN0_AUDIO_ENABLED | +			 PIN1_AUDIO_ENABLED | +			 PIN2_AUDIO_ENABLED | +			 PIN3_AUDIO_ENABLED); +	} + +	WREG32(AZ_HOT_PLUG_CONTROL, tmp); +} +  /*   * update the N and CTS parameters for a given pixel clock rate   */ @@ -318,10 +349,10 @@ void evergreen_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode  	/* disable audio prior to setting up hw */  	if (ASIC_IS_DCE6(rdev)) {  		dig->afmt->pin = dce6_audio_get_pin(rdev); -		dce6_audio_enable(rdev, dig->afmt->pin, false); +		dce6_audio_enable(rdev, dig->afmt->pin, 0);  	} else {  		dig->afmt->pin = r600_audio_get_pin(rdev); -		r600_audio_enable(rdev, dig->afmt->pin, false); +		dce4_audio_enable(rdev, dig->afmt->pin, 0);  	}  	evergreen_audio_set_dto(encoder, mode->clock); @@ -463,13 +494,15 @@ void evergreen_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode  	/* enable audio after to setting up hw */  	if (ASIC_IS_DCE6(rdev)) -		dce6_audio_enable(rdev, dig->afmt->pin, true); +		dce6_audio_enable(rdev, dig->afmt->pin, 1);  	else -		r600_audio_enable(rdev, dig->afmt->pin, true); +		dce4_audio_enable(rdev, dig->afmt->pin, 0xf);  }  void evergreen_hdmi_enable(struct drm_encoder *encoder, bool enable)  { +	struct drm_device *dev = encoder->dev; +	struct radeon_device *rdev = dev->dev_private;  	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);  	struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; @@ -482,6 +515,14 @@ void evergreen_hdmi_enable(struct drm_encoder *encoder, bool enable)  	if (!enable && !dig->afmt->enabled)  		return; +	if (!enable && dig->afmt->pin) { +		if (ASIC_IS_DCE6(rdev)) +			dce6_audio_enable(rdev, dig->afmt->pin, 0); +		else +			dce4_audio_enable(rdev, dig->afmt->pin, 0); +		dig->afmt->pin = NULL; +	} +  	dig->afmt->enabled = enable;  	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,  		tmp = (RREG32_SMC(SMU_VOLTAGE_STATUS) & SMU_VOLTAGE_CURRENT_LEVEL_MASK) >>  			SMU_VOLTAGE_CURRENT_LEVEL_SHIFT;  		vddc = kv_convert_8bit_index_to_voltage(rdev, (u16)tmp); +		seq_printf(m, "uvd    %sabled\n", pi->uvd_power_gated ? "dis" : "en"); +		seq_printf(m, "vce    %sabled\n", pi->vce_power_gated ? "dis" : "en");  		seq_printf(m, "power level %d    sclk: %u vddc: %u\n",  			   current_index, sclk, vddc);  	} 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,  	bool disable_mclk_switching;  	u32 mclk;  	u16 vddci; -	u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc;  	int i;  	if ((rdev->pm.dpm.new_active_crtc_count > 1) || @@ -816,29 +815,6 @@ static void ni_apply_state_adjust_rules(struct radeon_device *rdev,  		}  	} -	/* limit clocks to max supported clocks based on voltage dependency tables */ -	btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk, -							&max_sclk_vddc); -	btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk, -							&max_mclk_vddci); -	btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk, -							&max_mclk_vddc); - -	for (i = 0; i < ps->performance_level_count; i++) { -		if (max_sclk_vddc) { -			if (ps->performance_levels[i].sclk > max_sclk_vddc) -				ps->performance_levels[i].sclk = max_sclk_vddc; -		} -		if (max_mclk_vddci) { -			if (ps->performance_levels[i].mclk > max_mclk_vddci) -				ps->performance_levels[i].mclk = max_mclk_vddci; -		} -		if (max_mclk_vddc) { -			if (ps->performance_levels[i].mclk > max_mclk_vddc) -				ps->performance_levels[i].mclk = max_mclk_vddc; -		} -	} -  	/* XXX validate the min clocks required for display */  	/* 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)  	if (rdev->vram_scratch.robj == NULL) {  		r = radeon_bo_create(rdev, RADEON_GPU_PAGE_SIZE,  				     PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM, -				     0, NULL, &rdev->vram_scratch.robj); +				     0, NULL, NULL, &rdev->vram_scratch.robj);  		if (r) {  			return r;  		} @@ -2912,7 +2912,7 @@ struct radeon_fence *r600_copy_cpdma(struct radeon_device *rdev,  		return ERR_PTR(r);  	} -	radeon_semaphore_sync_resv(sem, resv, false); +	radeon_semaphore_sync_resv(rdev, sem, resv, false);  	radeon_semaphore_sync_rings(rdev, sem, ring->idx);  	radeon_ring_write(ring, PACKET3(PACKET3_SET_CONFIG_REG, 1)); @@ -3368,7 +3368,7 @@ int r600_ih_ring_alloc(struct radeon_device *rdev)  		r = radeon_bo_create(rdev, rdev->ih.ring_size,  				     PAGE_SIZE, true,  				     RADEON_GEM_DOMAIN_GTT, 0, -				     NULL, &rdev->ih.ring_obj); +				     NULL, NULL, &rdev->ih.ring_obj);  		if (r) {  			DRM_ERROR("radeon: failed to create ih ring buffer (%d).\n", r);  			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 @@ -/* - * Copyright 2008 Advanced Micro Devices, Inc. - * Copyright 2008 Red Hat Inc. - * Copyright 2009 Christian König. - * - * Permission is hereby granted, free of charge, to any person obtaining a - * copy of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL - * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - * - * Authors: Christian König - */ -#include <drm/drmP.h> -#include "radeon.h" -#include "radeon_reg.h" -#include "radeon_asic.h" -#include "atom.h" - -/* - * check if enc_priv stores radeon_encoder_atom_dig - */ -static bool radeon_dig_encoder(struct drm_encoder *encoder) -{ -	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); -	switch (radeon_encoder->encoder_id) { -	case ENCODER_OBJECT_ID_INTERNAL_LVDS: -	case ENCODER_OBJECT_ID_INTERNAL_TMDS1: -	case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1: -	case ENCODER_OBJECT_ID_INTERNAL_LVTM1: -	case ENCODER_OBJECT_ID_INTERNAL_DVO1: -	case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1: -	case ENCODER_OBJECT_ID_INTERNAL_DDI: -	case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: -	case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: -	case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: -	case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: -		return true; -	} -	return false; -} - -/* - * check if the chipset is supported - */ -static int r600_audio_chipset_supported(struct radeon_device *rdev) -{ -	return ASIC_IS_DCE2(rdev) && !ASIC_IS_NODCE(rdev); -} - -struct r600_audio_pin r600_audio_status(struct radeon_device *rdev) -{ -	struct r600_audio_pin status; -	uint32_t value; - -	value = RREG32(R600_AUDIO_RATE_BPS_CHANNEL); - -	/* number of channels */ -	status.channels = (value & 0x7) + 1; - -	/* bits per sample */ -	switch ((value & 0xF0) >> 4) { -	case 0x0: -		status.bits_per_sample = 8; -		break; -	case 0x1: -		status.bits_per_sample = 16; -		break; -	case 0x2: -		status.bits_per_sample = 20; -		break; -	case 0x3: -		status.bits_per_sample = 24; -		break; -	case 0x4: -		status.bits_per_sample = 32; -		break; -	default: -		dev_err(rdev->dev, "Unknown bits per sample 0x%x, using 16\n", -			(int)value); -		status.bits_per_sample = 16; -	} - -	/* current sampling rate in HZ */ -	if (value & 0x4000) -		status.rate = 44100; -	else -		status.rate = 48000; -	status.rate *= ((value >> 11) & 0x7) + 1; -	status.rate /= ((value >> 8) & 0x7) + 1; - -	value = RREG32(R600_AUDIO_STATUS_BITS); - -	/* iec 60958 status bits */ -	status.status_bits = value & 0xff; - -	/* iec 60958 category code */ -	status.category_code = (value >> 8) & 0xff; - -	return status; -} - -/* - * update all hdmi interfaces with current audio parameters - */ -void r600_audio_update_hdmi(struct work_struct *work) -{ -	struct radeon_device *rdev = container_of(work, struct radeon_device, -						  audio_work); -	struct drm_device *dev = rdev->ddev; -	struct r600_audio_pin audio_status = r600_audio_status(rdev); -	struct drm_encoder *encoder; -	bool changed = false; - -	if (rdev->audio.pin[0].channels != audio_status.channels || -	    rdev->audio.pin[0].rate != audio_status.rate || -	    rdev->audio.pin[0].bits_per_sample != audio_status.bits_per_sample || -	    rdev->audio.pin[0].status_bits != audio_status.status_bits || -	    rdev->audio.pin[0].category_code != audio_status.category_code) { -		rdev->audio.pin[0] = audio_status; -		changed = true; -	} - -	list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { -		if (!radeon_dig_encoder(encoder)) -			continue; -		if (changed || r600_hdmi_buffer_status_changed(encoder)) -			r600_hdmi_update_audio_settings(encoder); -	} -} - -/* enable the audio stream */ -void r600_audio_enable(struct radeon_device *rdev, -		       struct r600_audio_pin *pin, -		       bool enable) -{ -	u32 value = 0; - -	if (!pin) -		return; - -	if (ASIC_IS_DCE4(rdev)) { -		if (enable) { -			value |= 0x81000000; /* Required to enable audio */ -			value |= 0x0e1000f0; /* fglrx sets that too */ -		} -		WREG32(EVERGREEN_AUDIO_ENABLE, value); -	} else { -		WREG32_P(R600_AUDIO_ENABLE, -			 enable ? 0x81000000 : 0x0, ~0x81000000); -	} -} - -/* - * initialize the audio vars - */ -int r600_audio_init(struct radeon_device *rdev) -{ -	if (!radeon_audio || !r600_audio_chipset_supported(rdev)) -		return 0; - -	rdev->audio.enabled = true; - -	rdev->audio.num_pins = 1; -	rdev->audio.pin[0].channels = -1; -	rdev->audio.pin[0].rate = -1; -	rdev->audio.pin[0].bits_per_sample = -1; -	rdev->audio.pin[0].status_bits = 0; -	rdev->audio.pin[0].category_code = 0; -	rdev->audio.pin[0].id = 0; -	/* disable audio.  it will be set up later */ -	r600_audio_enable(rdev, &rdev->audio.pin[0], false); - -	return 0; -} - -/* - * release the audio timer - * TODO: How to do this correctly on SMP systems? - */ -void r600_audio_fini(struct radeon_device *rdev) -{ -	if (!rdev->audio.enabled) -		return; - -	r600_audio_enable(rdev, &rdev->audio.pin[0], false); - -	rdev->audio.enabled = false; -} - -struct r600_audio_pin *r600_audio_get_pin(struct radeon_device *rdev) -{ -	/* only one pin on 6xx-NI */ -	return &rdev->audio.pin[0]; -} 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,  		return ERR_PTR(r);  	} -	radeon_semaphore_sync_resv(sem, resv, false); +	radeon_semaphore_sync_resv(rdev, sem, resv, false);  	radeon_semaphore_sync_rings(rdev, sem, ring->idx);  	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[] = {  /* + * check if the chipset is supported + */ +static int r600_audio_chipset_supported(struct radeon_device *rdev) +{ +	return ASIC_IS_DCE2(rdev) && !ASIC_IS_NODCE(rdev); +} + +static struct r600_audio_pin r600_audio_status(struct radeon_device *rdev) +{ +	struct r600_audio_pin status; +	uint32_t value; + +	value = RREG32(R600_AUDIO_RATE_BPS_CHANNEL); + +	/* number of channels */ +	status.channels = (value & 0x7) + 1; + +	/* bits per sample */ +	switch ((value & 0xF0) >> 4) { +	case 0x0: +		status.bits_per_sample = 8; +		break; +	case 0x1: +		status.bits_per_sample = 16; +		break; +	case 0x2: +		status.bits_per_sample = 20; +		break; +	case 0x3: +		status.bits_per_sample = 24; +		break; +	case 0x4: +		status.bits_per_sample = 32; +		break; +	default: +		dev_err(rdev->dev, "Unknown bits per sample 0x%x, using 16\n", +			(int)value); +		status.bits_per_sample = 16; +	} + +	/* current sampling rate in HZ */ +	if (value & 0x4000) +		status.rate = 44100; +	else +		status.rate = 48000; +	status.rate *= ((value >> 11) & 0x7) + 1; +	status.rate /= ((value >> 8) & 0x7) + 1; + +	value = RREG32(R600_AUDIO_STATUS_BITS); + +	/* iec 60958 status bits */ +	status.status_bits = value & 0xff; + +	/* iec 60958 category code */ +	status.category_code = (value >> 8) & 0xff; + +	return status; +} + +/* + * update all hdmi interfaces with current audio parameters + */ +void r600_audio_update_hdmi(struct work_struct *work) +{ +	struct radeon_device *rdev = container_of(work, struct radeon_device, +						  audio_work); +	struct drm_device *dev = rdev->ddev; +	struct r600_audio_pin audio_status = r600_audio_status(rdev); +	struct drm_encoder *encoder; +	bool changed = false; + +	if (rdev->audio.pin[0].channels != audio_status.channels || +	    rdev->audio.pin[0].rate != audio_status.rate || +	    rdev->audio.pin[0].bits_per_sample != audio_status.bits_per_sample || +	    rdev->audio.pin[0].status_bits != audio_status.status_bits || +	    rdev->audio.pin[0].category_code != audio_status.category_code) { +		rdev->audio.pin[0] = audio_status; +		changed = true; +	} + +	list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { +		if (!radeon_encoder_is_digital(encoder)) +			continue; +		if (changed || r600_hdmi_buffer_status_changed(encoder)) +			r600_hdmi_update_audio_settings(encoder); +	} +} + +/* enable the audio stream */ +void r600_audio_enable(struct radeon_device *rdev, +		       struct r600_audio_pin *pin, +		       u8 enable_mask) +{ +	u32 tmp = RREG32(AZ_HOT_PLUG_CONTROL); + +	if (!pin) +		return; + +	if (enable_mask) { +		tmp |= AUDIO_ENABLED; +		if (enable_mask & 1) +			tmp |= PIN0_AUDIO_ENABLED; +		if (enable_mask & 2) +			tmp |= PIN1_AUDIO_ENABLED; +		if (enable_mask & 4) +			tmp |= PIN2_AUDIO_ENABLED; +		if (enable_mask & 8) +			tmp |= PIN3_AUDIO_ENABLED; +	} else { +		tmp &= ~(AUDIO_ENABLED | +			 PIN0_AUDIO_ENABLED | +			 PIN1_AUDIO_ENABLED | +			 PIN2_AUDIO_ENABLED | +			 PIN3_AUDIO_ENABLED); +	} + +	WREG32(AZ_HOT_PLUG_CONTROL, tmp); +} + +/* + * initialize the audio vars + */ +int r600_audio_init(struct radeon_device *rdev) +{ +	if (!radeon_audio || !r600_audio_chipset_supported(rdev)) +		return 0; + +	rdev->audio.enabled = true; + +	rdev->audio.num_pins = 1; +	rdev->audio.pin[0].channels = -1; +	rdev->audio.pin[0].rate = -1; +	rdev->audio.pin[0].bits_per_sample = -1; +	rdev->audio.pin[0].status_bits = 0; +	rdev->audio.pin[0].category_code = 0; +	rdev->audio.pin[0].id = 0; +	/* disable audio.  it will be set up later */ +	r600_audio_enable(rdev, &rdev->audio.pin[0], 0); + +	return 0; +} + +/* + * release the audio timer + * TODO: How to do this correctly on SMP systems? + */ +void r600_audio_fini(struct radeon_device *rdev) +{ +	if (!rdev->audio.enabled) +		return; + +	r600_audio_enable(rdev, &rdev->audio.pin[0], 0); + +	rdev->audio.enabled = false; +} + +struct r600_audio_pin *r600_audio_get_pin(struct radeon_device *rdev) +{ +	/* only one pin on 6xx-NI */ +	return &rdev->audio.pin[0]; +} + +/*   * calculate CTS and N values if they are not found in the table   */  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  	/* disable audio prior to setting up hw */  	dig->afmt->pin = r600_audio_get_pin(rdev); -	r600_audio_enable(rdev, dig->afmt->pin, false); +	r600_audio_enable(rdev, dig->afmt->pin, 0xf);  	r600_audio_set_dto(encoder, mode->clock); @@ -443,7 +606,7 @@ void r600_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *mod  	WREG32(HDMI0_RAMP_CONTROL3 + offset, 0x00000001);  	/* enable audio after to setting up hw */ -	r600_audio_enable(rdev, dig->afmt->pin, true); +	r600_audio_enable(rdev, dig->afmt->pin, 0xf);  }  /** @@ -528,6 +691,11 @@ void r600_hdmi_enable(struct drm_encoder *encoder, bool enable)  	if (!enable && !dig->afmt->enabled)  		return; +	if (!enable && dig->afmt->pin) { +		r600_audio_enable(rdev, dig->afmt->pin, 0); +		dig->afmt->pin = NULL; +	} +  	/* Older chipsets require setting HDMI and routing manually */  	if (!ASIC_IS_DCE3(rdev)) {  		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 @@  #       define TARGET_LINK_SPEED_MASK                     (0xf << 0)  #       define SELECTABLE_DEEMPHASIS                      (1 << 6) +/* Audio */ +#define AZ_HOT_PLUG_CONTROL               0x7300 +#       define AZ_FORCE_CODEC_WAKE        (1 << 0) +#       define JACK_DETECTION_ENABLE      (1 << 4) +#       define UNSOLICITED_RESPONSE_ENABLE (1 << 8) +#       define CODEC_HOT_PLUG_ENABLE      (1 << 12) +#       define AUDIO_ENABLED              (1 << 31) +/* DCE3 adds */ +#       define PIN0_JACK_DETECTION_ENABLE (1 << 4) +#       define PIN1_JACK_DETECTION_ENABLE (1 << 5) +#       define PIN2_JACK_DETECTION_ENABLE (1 << 6) +#       define PIN3_JACK_DETECTION_ENABLE (1 << 7) +#       define PIN0_AUDIO_ENABLED         (1 << 24) +#       define PIN1_AUDIO_ENABLED         (1 << 25) +#       define PIN2_AUDIO_ENABLED         (1 << 26) +#       define PIN3_AUDIO_ENABLED         (1 << 27) +  /* Audio clocks DCE 2.0/3.0 */  #define AUDIO_DTO                         0x7340  #       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,  				struct radeon_semaphore *semaphore);  void radeon_semaphore_sync_fence(struct radeon_semaphore *semaphore,  				 struct radeon_fence *fence); -void radeon_semaphore_sync_resv(struct radeon_semaphore *semaphore, -				struct reservation_object *resv, -				bool shared); +int radeon_semaphore_sync_resv(struct radeon_device *rdev, +			       struct radeon_semaphore *semaphore, +			       struct reservation_object *resv, +			       bool shared);  int radeon_semaphore_sync_rings(struct radeon_device *rdev,  				struct radeon_semaphore *semaphore,  				int waiting_ring); @@ -712,7 +713,7 @@ struct radeon_flip_work {  	uint64_t			base;  	struct drm_pending_vblank_event *event;  	struct radeon_bo		*old_rbo; -	struct radeon_fence		*fence; +	struct fence			*fence;  };  struct r500_irq_stat_regs { @@ -2977,10 +2978,10 @@ struct r600_audio_pin *r600_audio_get_pin(struct radeon_device *rdev);  struct r600_audio_pin *dce6_audio_get_pin(struct radeon_device *rdev);  void r600_audio_enable(struct radeon_device *rdev,  		       struct r600_audio_pin *pin, -		       bool enable); +		       u8 enable_mask);  void dce6_audio_enable(struct radeon_device *rdev,  		       struct r600_audio_pin *pin, -		       bool enable); +		       u8 enable_mask);  /*   * 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);  void r600_rlc_stop(struct radeon_device *rdev);  /* r600 audio */  int r600_audio_init(struct radeon_device *rdev); -struct r600_audio_pin r600_audio_status(struct radeon_device *rdev);  void r600_audio_fini(struct radeon_device *rdev);  void r600_audio_set_dto(struct drm_encoder *encoder, u32 clock);  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,  	return true;  } -const int supported_devices_connector_convert[] = { +static const int supported_devices_connector_convert[] = {  	DRM_MODE_CONNECTOR_Unknown,  	DRM_MODE_CONNECTOR_VGA,  	DRM_MODE_CONNECTOR_DVII, @@ -477,7 +477,7 @@ const int supported_devices_connector_convert[] = {  	DRM_MODE_CONNECTOR_DisplayPort  }; -const uint16_t supported_devices_connector_object_id_convert[] = { +static const uint16_t supported_devices_connector_object_id_convert[] = {  	CONNECTOR_OBJECT_ID_NONE,  	CONNECTOR_OBJECT_ID_VGA,  	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[] = {  	CONNECTOR_OBJECT_ID_SVIDEO  }; -const int object_connector_convert[] = { +static const int object_connector_convert[] = {  	DRM_MODE_CONNECTOR_Unknown,  	DRM_MODE_CONNECTOR_DVII,  	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,  	int time;  	n = RADEON_BENCHMARK_ITERATIONS; -	r = radeon_bo_create(rdev, size, PAGE_SIZE, true, sdomain, 0, NULL, &sobj); +	r = radeon_bo_create(rdev, size, PAGE_SIZE, true, sdomain, 0, NULL, NULL, &sobj);  	if (r) {  		goto out_cleanup;  	} @@ -105,7 +105,7 @@ static void radeon_benchmark_move(struct radeon_device *rdev, unsigned size,  	if (r) {  		goto out_cleanup;  	} -	r = radeon_bo_create(rdev, size, PAGE_SIZE, true, ddomain, 0, NULL, &dobj); +	r = radeon_bo_create(rdev, size, PAGE_SIZE, true, ddomain, 0, NULL, NULL, &dobj);  	if (r) {  		goto out_cleanup;  	} 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 {  	CONNECTOR_UNSUPPORTED_LEGACY  }; -const int legacy_connector_convert[] = { +static const int legacy_connector_convert[] = {  	DRM_MODE_CONNECTOR_Unknown,  	DRM_MODE_CONNECTOR_DVID,  	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  	return 0;  } -static void radeon_cs_sync_rings(struct radeon_cs_parser *p) +static int radeon_cs_sync_rings(struct radeon_cs_parser *p)  { -	int i; +	int i, r = 0;  	for (i = 0; i < p->nrelocs; i++) {  		struct reservation_object *resv; @@ -260,9 +260,13 @@ static void radeon_cs_sync_rings(struct radeon_cs_parser *p)  			continue;  		resv = p->relocs[i].robj->tbo.resv; -		radeon_semaphore_sync_resv(p->ib.semaphore, resv, -					   p->relocs[i].tv.shared); +		r = radeon_semaphore_sync_resv(p->rdev, p->ib.semaphore, resv, +					       p->relocs[i].tv.shared); + +		if (r) +			break;  	} +	return r;  }  /* 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,  		return r;  	} +	r = radeon_cs_sync_rings(parser); +	if (r) { +		if (r != -ERESTARTSYS) +			DRM_ERROR("Failed to sync rings: %i\n", r); +		return r; +	} +  	if (parser->ring == R600_RING_TYPE_UVD_INDEX)  		radeon_uvd_note_usage(rdev);  	else if ((parser->ring == TN_RING_TYPE_VCE1_INDEX) ||  		 (parser->ring == TN_RING_TYPE_VCE2_INDEX))  		radeon_vce_note_usage(rdev); -	radeon_cs_sync_rings(parser);  	r = radeon_ib_schedule(rdev, &parser->ib, NULL, true);  	if (r) {  		DRM_ERROR("Failed to schedule IB !\n"); @@ -565,7 +575,13 @@ static int radeon_cs_ib_vm_chunk(struct radeon_device *rdev,  	if (r) {  		goto out;  	} -	radeon_cs_sync_rings(parser); + +	r = radeon_cs_sync_rings(parser); +	if (r) { +		if (r != -ERESTARTSYS) +			DRM_ERROR("Failed to sync rings: %i\n", r); +		goto out; +	}  	radeon_semaphore_sync_fence(parser->ib.semaphore, vm->fence);  	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)  	if (rdev->wb.wb_obj == NULL) {  		r = radeon_bo_create(rdev, RADEON_GPU_PAGE_SIZE, PAGE_SIZE, true, -				     RADEON_GEM_DOMAIN_GTT, 0, NULL, +				     RADEON_GEM_DOMAIN_GTT, 0, NULL, NULL,  				     &rdev->wb.wb_obj);  		if (r) {  			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)          down_read(&rdev->exclusive_lock);  	if (work->fence) { -		r = radeon_fence_wait(work->fence, false); -		if (r == -EDEADLK) { -			up_read(&rdev->exclusive_lock); -			do { -				r = radeon_gpu_reset(rdev); -			} while (r == -EAGAIN); -			down_read(&rdev->exclusive_lock); -		} +		struct radeon_fence *fence; + +		fence = to_radeon_fence(work->fence); +		if (fence && fence->rdev == rdev) { +			r = radeon_fence_wait(fence, false); +			if (r == -EDEADLK) { +				up_read(&rdev->exclusive_lock); +				do { +					r = radeon_gpu_reset(rdev); +				} while (r == -EAGAIN); +				down_read(&rdev->exclusive_lock); +			} +		} else +			r = fence_wait(work->fence, false); +  		if (r)  			DRM_ERROR("failed to wait on page flip fence (%d)!\n", r); @@ -418,7 +425,8 @@ static void radeon_flip_work_func(struct work_struct *__work)  		 * confused about which BO the CRTC is scanning out  		 */ -		radeon_fence_unref(&work->fence); +		fence_put(work->fence); +		work->fence = NULL;  	}  	/* We borrow the event spin lock for protecting flip_status */ @@ -494,7 +502,7 @@ static int radeon_crtc_page_flip(struct drm_crtc *crtc,  		DRM_ERROR("failed to pin new rbo buffer before flip\n");  		goto cleanup;  	} -	work->fence = (struct radeon_fence *)fence_get(reservation_object_get_excl(new_rbo->tbo.resv)); +	work->fence = fence_get(reservation_object_get_excl(new_rbo->tbo.resv));  	radeon_bo_get_tiling_flags(new_rbo, &tiling_flags, NULL);  	radeon_bo_unreserve(new_rbo); @@ -576,7 +584,7 @@ pflip_cleanup:  cleanup:  	drm_gem_object_unreference_unlocked(&work->old_rbo->gem_base); -	radeon_fence_unref(&work->fence); +	fence_put(work->fence);  	kfree(work);  	return r;  } 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,  	}  } +bool radeon_encoder_is_digital(struct drm_encoder *encoder) +{ +	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); +	switch (radeon_encoder->encoder_id) { +	case ENCODER_OBJECT_ID_INTERNAL_LVDS: +	case ENCODER_OBJECT_ID_INTERNAL_TMDS1: +	case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1: +	case ENCODER_OBJECT_ID_INTERNAL_LVTM1: +	case ENCODER_OBJECT_ID_INTERNAL_DVO1: +	case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1: +	case ENCODER_OBJECT_ID_INTERNAL_DDI: +	case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: +	case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: +	case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: +	case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: +	case ENCODER_OBJECT_ID_INTERNAL_UNIPHY3: +		return true; +	default: +		return false; +	} +} 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)  	uint64_t seq[RADEON_NUM_RINGS] = {};  	long r; +	/* +	 * This function should not be called on !radeon fences. +	 * If this is the case, it would mean this function can +	 * also be called on radeon fences belonging to another card. +	 * exclusive_lock is not held in that case. +	 */ +	if (WARN_ON_ONCE(!to_radeon_fence(&fence->base))) +		return fence_wait(&fence->base, intr); +  	seq[fence->ring] = fence->seq;  	r = radeon_fence_wait_seq_timeout(fence->rdev, seq, intr, MAX_SCHEDULE_TIMEOUT);  	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)  	if (rdev->gart.robj == NULL) {  		r = radeon_bo_create(rdev, rdev->gart.table_size,  				     PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM, -				     0, NULL, &rdev->gart.robj); +				     0, NULL, NULL, &rdev->gart.robj);  		if (r) {  			return r;  		} 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,  retry:  	r = radeon_bo_create(rdev, size, alignment, kernel, initial_domain, -			     flags, NULL, &robj); +			     flags, NULL, NULL, &robj);  	if (r) {  		if (r != -ERESTARTSYS) {  			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);  extern int atombios_get_encoder_mode(struct drm_encoder *encoder);  extern bool atombios_set_edp_panel_power(struct drm_connector *connector, int action);  extern void radeon_encoder_set_active_device(struct drm_encoder *encoder); +extern bool radeon_encoder_is_digital(struct drm_encoder *encoder);  extern void radeon_crtc_load_lut(struct drm_crtc *crtc);  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)  }  int radeon_bo_create(struct radeon_device *rdev, -		     unsigned long size, int byte_align, bool kernel, u32 domain, -		     u32 flags, struct sg_table *sg, struct radeon_bo **bo_ptr) +		     unsigned long size, int byte_align, bool kernel, +		     u32 domain, u32 flags, struct sg_table *sg, +		     struct reservation_object *resv, +		     struct radeon_bo **bo_ptr)  {  	struct radeon_bo *bo;  	enum ttm_bo_type type; @@ -216,7 +218,7 @@ int radeon_bo_create(struct radeon_device *rdev,  	down_read(&rdev->pm.mclk_lock);  	r = ttm_bo_init(&rdev->mman.bdev, &bo->tbo, size, type,  			&bo->placement, page_align, !kernel, NULL, -			acc_size, sg, NULL, &radeon_ttm_bo_destroy); +			acc_size, sg, resv, &radeon_ttm_bo_destroy);  	up_read(&rdev->pm.mclk_lock);  	if (unlikely(r != 0)) {  		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,  			    unsigned long size, int byte_align,  			    bool kernel, u32 domain, u32 flags,  			    struct sg_table *sg, +			    struct reservation_object *resv,  			    struct radeon_bo **bo_ptr);  extern int radeon_bo_kmap(struct radeon_bo *bo, void **ptr);  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,  							struct dma_buf_attachment *attach,  							struct sg_table *sg)  { +	struct reservation_object *resv = attach->dmabuf->resv;  	struct radeon_device *rdev = dev->dev_private;  	struct radeon_bo *bo;  	int ret; +	ww_mutex_lock(&resv->lock, NULL);  	ret = radeon_bo_create(rdev, attach->dmabuf->size, PAGE_SIZE, false, -			       RADEON_GEM_DOMAIN_GTT, 0, sg, &bo); +			       RADEON_GEM_DOMAIN_GTT, 0, sg, resv, &bo); +	ww_mutex_unlock(&resv->lock);  	if (ret)  		return ERR_PTR(ret); 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  	/* Allocate ring buffer */  	if (ring->ring_obj == NULL) {  		r = radeon_bo_create(rdev, ring->ring_size, PAGE_SIZE, true, -				     RADEON_GEM_DOMAIN_GTT, 0, +				     RADEON_GEM_DOMAIN_GTT, 0, NULL,  				     NULL, &ring->ring_obj);  		if (r) {  			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,  	}  	r = radeon_bo_create(rdev, size, align, true, -			     domain, flags, NULL, &sa_manager->bo); +			     domain, flags, NULL, NULL, &sa_manager->bo);  	if (r) {  		dev_err(rdev->dev, "(%d) failed to allocate bo for manager\n", r);  		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,   *   * Sync to the fence using this semaphore object   */ -void radeon_semaphore_sync_resv(struct radeon_semaphore *sema, -				struct reservation_object *resv, -				bool shared) +int radeon_semaphore_sync_resv(struct radeon_device *rdev, +			       struct radeon_semaphore *sema, +			       struct reservation_object *resv, +			       bool shared)  {  	struct reservation_object_list *flist;  	struct fence *f; +	struct radeon_fence *fence;  	unsigned i; +	int r = 0;  	/* always sync to the exclusive fence */  	f = reservation_object_get_excl(resv); -	radeon_semaphore_sync_fence(sema, (struct radeon_fence*)f); +	fence = f ? to_radeon_fence(f) : NULL; +	if (fence && fence->rdev == rdev) +		radeon_semaphore_sync_fence(sema, fence); +	else if (f) +		r = fence_wait(f, true);  	flist = reservation_object_get_list(resv); -	if (shared || !flist) -		return; +	if (shared || !flist || r) +		return r;  	for (i = 0; i < flist->shared_count; ++i) {  		f = rcu_dereference_protected(flist->shared[i],  					      reservation_object_held(resv)); -		radeon_semaphore_sync_fence(sema, (struct radeon_fence*)f); +		fence = to_radeon_fence(f); +		if (fence && fence->rdev == rdev) +			radeon_semaphore_sync_fence(sema, fence); +		else +			r = fence_wait(f, true); + +		if (r) +			break;  	} +	return r;  }  /** 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)  	}  	r = radeon_bo_create(rdev, size, PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM, -			     0, NULL, &vram_obj); +			     0, NULL, NULL, &vram_obj);  	if (r) {  		DRM_ERROR("Failed to create VRAM object\n");  		goto out_cleanup; @@ -87,7 +87,8 @@ static void radeon_do_test_moves(struct radeon_device *rdev, int flag)  		struct radeon_fence *fence = NULL;  		r = radeon_bo_create(rdev, size, PAGE_SIZE, true, -				     RADEON_GEM_DOMAIN_GTT, 0, NULL, gtt_obj + i); +				     RADEON_GEM_DOMAIN_GTT, 0, NULL, NULL, +				     gtt_obj + i);  		if (r) {  			DRM_ERROR("Failed to create GTT object %d\n", i);  			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)  	radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);  	r = radeon_bo_create(rdev, 256 * 1024, PAGE_SIZE, true, -			     RADEON_GEM_DOMAIN_VRAM, 0, +			     RADEON_GEM_DOMAIN_VRAM, 0, NULL,  			     NULL, &rdev->stollen_vga_memory);  	if (r) {  		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)  		  RADEON_UVD_STACK_SIZE + RADEON_UVD_HEAP_SIZE +  		  RADEON_GPU_PAGE_SIZE;  	r = radeon_bo_create(rdev, bo_size, PAGE_SIZE, true, -			     RADEON_GEM_DOMAIN_VRAM, 0, NULL, &rdev->uvd.vcpu_bo); +			     RADEON_GEM_DOMAIN_VRAM, 0, NULL, +			     NULL, &rdev->uvd.vcpu_bo);  	if (r) {  		dev_err(rdev->dev, "(%d) failed to allocate UVD bo\n", r);  		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)  	size = RADEON_GPU_PAGE_ALIGN(rdev->vce_fw->size) +  	       RADEON_VCE_STACK_SIZE + RADEON_VCE_HEAP_SIZE;  	r = radeon_bo_create(rdev, size, PAGE_SIZE, true, -			     RADEON_GEM_DOMAIN_VRAM, 0, NULL, &rdev->vce.vcpu_bo); +			     RADEON_GEM_DOMAIN_VRAM, 0, NULL, NULL, +			     &rdev->vce.vcpu_bo);  	if (r) {  		dev_err(rdev->dev, "(%d) failed to allocate VCE bo\n", r);  		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,  		r = radeon_bo_create(rdev, RADEON_VM_PTE_COUNT * 8,  				     RADEON_GPU_PAGE_SIZE, true, -				     RADEON_GEM_DOMAIN_VRAM, 0, NULL, &pt); +				     RADEON_GEM_DOMAIN_VRAM, 0, +				     NULL, NULL, &pt);  		if (r)  			return r; @@ -698,7 +699,7 @@ int radeon_vm_update_page_directory(struct radeon_device *rdev,  	if (ib.length_dw != 0) {  		radeon_asic_vm_pad_ib(rdev, &ib); -		radeon_semaphore_sync_resv(ib.semaphore, pd->tbo.resv, false); +		radeon_semaphore_sync_resv(rdev, ib.semaphore, pd->tbo.resv, false);  		radeon_semaphore_sync_fence(ib.semaphore, vm->last_id_use);  		WARN_ON(ib.length_dw > ndw);  		r = radeon_ib_schedule(rdev, &ib, NULL, false); @@ -825,7 +826,7 @@ static void radeon_vm_update_ptes(struct radeon_device *rdev,  		unsigned nptes;  		uint64_t pte; -		radeon_semaphore_sync_resv(ib->semaphore, pt->tbo.resv, false); +		radeon_semaphore_sync_resv(rdev, ib->semaphore, pt->tbo.resv, false);  		if ((addr & ~mask) == (end & ~mask))  			nptes = end - addr; @@ -1127,7 +1128,7 @@ int radeon_vm_init(struct radeon_device *rdev, struct radeon_vm *vm)  	r = radeon_bo_create(rdev, pd_size, align, true,  			     RADEON_GEM_DOMAIN_VRAM, 0, NULL, -			     &vm->page_directory); +			     NULL, &vm->page_directory);  	if (r)  		return r; 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 @@   *          Jerome Glisse   */  #include <linux/firmware.h> -#include <linux/platform_device.h>  #include <linux/slab.h>  #include <drm/drmP.h>  #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,  		return ERR_PTR(r);  	} -	radeon_semaphore_sync_resv(sem, resv, false); +	radeon_semaphore_sync_resv(rdev, sem, resv, false);  	radeon_semaphore_sync_rings(rdev, sem, ring->idx);  	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,  int si_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib)  {  	int ret = 0; -	u32 idx = 0; +	u32 idx = 0, i;  	struct radeon_cs_packet pkt;  	do { @@ -4695,6 +4695,12 @@ int si_ib_parse(struct radeon_device *rdev, struct radeon_ib *ib)  		switch (pkt.type) {  		case RADEON_PACKET_TYPE0:  			dev_err(rdev->dev, "Packet0 not allowed!\n"); +			for (i = 0; i < ib->length_dw; i++) { +				if (i == idx) +					printk("\t0x%08x <---\n", ib->ptr[i]); +				else +					printk("\t0x%08x\n", ib->ptr[i]); +			}  			ret = -EINVAL;  			break;  		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,  		return ERR_PTR(r);  	} -	radeon_semaphore_sync_resv(sem, resv, false); +	radeon_semaphore_sync_resv(rdev, sem, resv, false);  	radeon_semaphore_sync_rings(rdev, sem, ring->idx);  	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,  	bool disable_sclk_switching = false;  	u32 mclk, sclk;  	u16 vddc, vddci; -	u32 max_sclk_vddc, max_mclk_vddci, max_mclk_vddc;  	int i;  	if ((rdev->pm.dpm.new_active_crtc_count > 1) || @@ -2950,29 +2949,6 @@ static void si_apply_state_adjust_rules(struct radeon_device *rdev,  		}  	} -	/* limit clocks to max supported clocks based on voltage dependency tables */ -	btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_sclk, -							&max_sclk_vddc); -	btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddci_dependency_on_mclk, -							&max_mclk_vddci); -	btc_get_max_clock_from_voltage_dependency_table(&rdev->pm.dpm.dyn_state.vddc_dependency_on_mclk, -							&max_mclk_vddc); - -	for (i = 0; i < ps->performance_level_count; i++) { -		if (max_sclk_vddc) { -			if (ps->performance_levels[i].sclk > max_sclk_vddc) -				ps->performance_levels[i].sclk = max_sclk_vddc; -		} -		if (max_mclk_vddci) { -			if (ps->performance_levels[i].mclk > max_mclk_vddci) -				ps->performance_levels[i].mclk = max_mclk_vddci; -		} -		if (max_mclk_vddc) { -			if (ps->performance_levels[i].mclk > max_mclk_vddc) -				ps->performance_levels[i].mclk = max_mclk_vddc; -		} -	} -  	/* XXX validate the min clocks required for display */  	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 @@  #       define DESCRIPTION16(x)                          (((x) & 0xff) << 0)  #       define DESCRIPTION17(x)                          (((x) & 0xff) << 8) -#define AZ_F0_CODEC_PIN_CONTROL_HOTPLUG_CONTROL          0x54 +#define AZ_F0_CODEC_PIN_CONTROL_HOT_PLUG_CONTROL         0x54  #       define AUDIO_ENABLED                             (1 << 31)  #define AZ_F0_CODEC_PIN_CONTROL_RESPONSE_CONFIGURATION_DEFAULT  0x56  | 
