diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/dce_v11_0.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/dce_v11_0.c | 282 | 
1 files changed, 138 insertions, 144 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c index d4bf133908b1..2006abbbfb62 100644 --- a/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c +++ b/drivers/gpu/drm/amd/amdgpu/dce_v11_0.c @@ -31,6 +31,7 @@  #include "atombios_encoders.h"  #include "amdgpu_pll.h"  #include "amdgpu_connectors.h" +#include "dce_v11_0.h"  #include "dce/dce_11_0_d.h"  #include "dce/dce_11_0_sh_mask.h" @@ -166,6 +167,7 @@ static void dce_v11_0_init_golden_registers(struct amdgpu_device *adev)  						 (const u32)ARRAY_SIZE(stoney_golden_settings_a11));  		break;  	case CHIP_POLARIS11: +	case CHIP_POLARIS12:  		amdgpu_program_register_sequence(adev,  						 polaris11_golden_settings_a11,  						 (const u32)ARRAY_SIZE(polaris11_golden_settings_a11)); @@ -346,33 +348,12 @@ static int dce_v11_0_crtc_get_scanoutpos(struct amdgpu_device *adev, int crtc,  static bool dce_v11_0_hpd_sense(struct amdgpu_device *adev,  			       enum amdgpu_hpd_id hpd)  { -	int idx;  	bool connected = false; -	switch (hpd) { -	case AMDGPU_HPD_1: -		idx = 0; -		break; -	case AMDGPU_HPD_2: -		idx = 1; -		break; -	case AMDGPU_HPD_3: -		idx = 2; -		break; -	case AMDGPU_HPD_4: -		idx = 3; -		break; -	case AMDGPU_HPD_5: -		idx = 4; -		break; -	case AMDGPU_HPD_6: -		idx = 5; -		break; -	default: +	if (hpd >= adev->mode_info.num_hpd)  		return connected; -	} -	if (RREG32(mmDC_HPD_INT_STATUS + hpd_offsets[idx]) & +	if (RREG32(mmDC_HPD_INT_STATUS + hpd_offsets[hpd]) &  	    DC_HPD_INT_STATUS__DC_HPD_SENSE_MASK)  		connected = true; @@ -392,37 +373,16 @@ static void dce_v11_0_hpd_set_polarity(struct amdgpu_device *adev,  {  	u32 tmp;  	bool connected = dce_v11_0_hpd_sense(adev, hpd); -	int idx; -	switch (hpd) { -	case AMDGPU_HPD_1: -		idx = 0; -		break; -	case AMDGPU_HPD_2: -		idx = 1; -		break; -	case AMDGPU_HPD_3: -		idx = 2; -		break; -	case AMDGPU_HPD_4: -		idx = 3; -		break; -	case AMDGPU_HPD_5: -		idx = 4; -		break; -	case AMDGPU_HPD_6: -		idx = 5; -		break; -	default: +	if (hpd >= adev->mode_info.num_hpd)  		return; -	} -	tmp = RREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[idx]); +	tmp = RREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[hpd]);  	if (connected)  		tmp = REG_SET_FIELD(tmp, DC_HPD_INT_CONTROL, DC_HPD_INT_POLARITY, 0);  	else  		tmp = REG_SET_FIELD(tmp, DC_HPD_INT_CONTROL, DC_HPD_INT_POLARITY, 1); -	WREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[idx], tmp); +	WREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[hpd], tmp);  }  /** @@ -438,11 +398,13 @@ static void dce_v11_0_hpd_init(struct amdgpu_device *adev)  	struct drm_device *dev = adev->ddev;  	struct drm_connector *connector;  	u32 tmp; -	int idx;  	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {  		struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector); +		if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd) +			continue; +  		if (connector->connector_type == DRM_MODE_CONNECTOR_eDP ||  		    connector->connector_type == DRM_MODE_CONNECTOR_LVDS) {  			/* don't try to enable hpd on eDP or LVDS avoid breaking the @@ -450,44 +412,24 @@ static void dce_v11_0_hpd_init(struct amdgpu_device *adev)  			 * https://bugzilla.redhat.com/show_bug.cgi?id=726143  			 * also avoid interrupt storms during dpms.  			 */ +			tmp = RREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd]); +			tmp = REG_SET_FIELD(tmp, DC_HPD_INT_CONTROL, DC_HPD_INT_EN, 0); +			WREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd], tmp);  			continue;  		} -		switch (amdgpu_connector->hpd.hpd) { -		case AMDGPU_HPD_1: -			idx = 0; -			break; -		case AMDGPU_HPD_2: -			idx = 1; -			break; -		case AMDGPU_HPD_3: -			idx = 2; -			break; -		case AMDGPU_HPD_4: -			idx = 3; -			break; -		case AMDGPU_HPD_5: -			idx = 4; -			break; -		case AMDGPU_HPD_6: -			idx = 5; -			break; -		default: -			continue; -		} - -		tmp = RREG32(mmDC_HPD_CONTROL + hpd_offsets[idx]); +		tmp = RREG32(mmDC_HPD_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd]);  		tmp = REG_SET_FIELD(tmp, DC_HPD_CONTROL, DC_HPD_EN, 1); -		WREG32(mmDC_HPD_CONTROL + hpd_offsets[idx], tmp); +		WREG32(mmDC_HPD_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd], tmp); -		tmp = RREG32(mmDC_HPD_TOGGLE_FILT_CNTL + hpd_offsets[idx]); +		tmp = RREG32(mmDC_HPD_TOGGLE_FILT_CNTL + hpd_offsets[amdgpu_connector->hpd.hpd]);  		tmp = REG_SET_FIELD(tmp, DC_HPD_TOGGLE_FILT_CNTL,  				    DC_HPD_CONNECT_INT_DELAY,  				    AMDGPU_HPD_CONNECT_INT_DELAY_IN_MS);  		tmp = REG_SET_FIELD(tmp, DC_HPD_TOGGLE_FILT_CNTL,  				    DC_HPD_DISCONNECT_INT_DELAY,  				    AMDGPU_HPD_DISCONNECT_INT_DELAY_IN_MS); -		WREG32(mmDC_HPD_TOGGLE_FILT_CNTL + hpd_offsets[idx], tmp); +		WREG32(mmDC_HPD_TOGGLE_FILT_CNTL + hpd_offsets[amdgpu_connector->hpd.hpd], tmp);  		dce_v11_0_hpd_set_polarity(adev, amdgpu_connector->hpd.hpd);  		amdgpu_irq_get(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd); @@ -507,37 +449,16 @@ static void dce_v11_0_hpd_fini(struct amdgpu_device *adev)  	struct drm_device *dev = adev->ddev;  	struct drm_connector *connector;  	u32 tmp; -	int idx;  	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {  		struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector); -		switch (amdgpu_connector->hpd.hpd) { -		case AMDGPU_HPD_1: -			idx = 0; -			break; -		case AMDGPU_HPD_2: -			idx = 1; -			break; -		case AMDGPU_HPD_3: -			idx = 2; -			break; -		case AMDGPU_HPD_4: -			idx = 3; -			break; -		case AMDGPU_HPD_5: -			idx = 4; -			break; -		case AMDGPU_HPD_6: -			idx = 5; -			break; -		default: +		if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd)  			continue; -		} -		tmp = RREG32(mmDC_HPD_CONTROL + hpd_offsets[idx]); +		tmp = RREG32(mmDC_HPD_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd]);  		tmp = REG_SET_FIELD(tmp, DC_HPD_CONTROL, DC_HPD_EN, 0); -		WREG32(mmDC_HPD_CONTROL + hpd_offsets[idx], tmp); +		WREG32(mmDC_HPD_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd], tmp);  		amdgpu_irq_put(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd);  	} @@ -673,6 +594,54 @@ static void dce_v11_0_set_vga_render_state(struct amdgpu_device *adev,  	WREG32(mmVGA_RENDER_CONTROL, tmp);  } +static int dce_v11_0_get_num_crtc (struct amdgpu_device *adev) +{ +	int num_crtc = 0; + +	switch (adev->asic_type) { +	case CHIP_CARRIZO: +		num_crtc = 3; +		break; +	case CHIP_STONEY: +		num_crtc = 2; +		break; +	case CHIP_POLARIS10: +		num_crtc = 6; +		break; +	case CHIP_POLARIS11: +	case CHIP_POLARIS12: +		num_crtc = 5; +		break; +	default: +		num_crtc = 0; +	} +	return num_crtc; +} + +void dce_v11_0_disable_dce(struct amdgpu_device *adev) +{ +	/*Disable VGA render and enabled crtc, if has DCE engine*/ +	if (amdgpu_atombios_has_dce_engine_info(adev)) { +		u32 tmp; +		int crtc_enabled, i; + +		dce_v11_0_set_vga_render_state(adev, false); + +		/*Disable crtc*/ +		for (i = 0; i < dce_v11_0_get_num_crtc(adev); i++) { +			crtc_enabled = REG_GET_FIELD(RREG32(mmCRTC_CONTROL + crtc_offsets[i]), +									 CRTC_CONTROL, CRTC_MASTER_EN); +			if (crtc_enabled) { +				WREG32(mmCRTC_UPDATE_LOCK + crtc_offsets[i], 1); +				tmp = RREG32(mmCRTC_CONTROL + crtc_offsets[i]); +				tmp = REG_SET_FIELD(tmp, CRTC_CONTROL, CRTC_MASTER_EN, 0); +				WREG32(mmCRTC_CONTROL + crtc_offsets[i], tmp); +				WREG32(mmCRTC_UPDATE_LOCK + crtc_offsets[i], 0); +			} +		} +	} +} +  static void dce_v11_0_program_fmt(struct drm_encoder *encoder)  {  	struct drm_device *dev = encoder->dev; @@ -1622,6 +1591,7 @@ static int dce_v11_0_audio_init(struct amdgpu_device *adev)  		adev->mode_info.audio.num_pins = 8;  		break;  	case CHIP_POLARIS11: +	case CHIP_POLARIS12:  		adev->mode_info.audio.num_pins = 6;  		break;  	default: @@ -2038,7 +2008,7 @@ static int dce_v11_0_crtc_do_set_base(struct drm_crtc *crtc,  	struct amdgpu_framebuffer *amdgpu_fb;  	struct drm_framebuffer *target_fb;  	struct drm_gem_object *obj; -	struct amdgpu_bo *rbo; +	struct amdgpu_bo *abo;  	uint64_t fb_location, tiling_flags;  	uint32_t fb_format, fb_pitch_pixels;  	u32 fb_swap = REG_SET_FIELD(0, GRPH_SWAP_CNTL, GRPH_ENDIAN_SWAP, ENDIAN_NONE); @@ -2046,6 +2016,7 @@ static int dce_v11_0_crtc_do_set_base(struct drm_crtc *crtc,  	u32 tmp, viewport_w, viewport_h;  	int r;  	bool bypass_lut = false; +	struct drm_format_name_buf format_name;  	/* no fb bound */  	if (!atomic && !crtc->primary->fb) { @@ -2065,23 +2036,23 @@ static int dce_v11_0_crtc_do_set_base(struct drm_crtc *crtc,  	 * just update base pointers  	 */  	obj = amdgpu_fb->obj; -	rbo = gem_to_amdgpu_bo(obj); -	r = amdgpu_bo_reserve(rbo, false); +	abo = gem_to_amdgpu_bo(obj); +	r = amdgpu_bo_reserve(abo, false);  	if (unlikely(r != 0))  		return r;  	if (atomic) { -		fb_location = amdgpu_bo_gpu_offset(rbo); +		fb_location = amdgpu_bo_gpu_offset(abo);  	} else { -		r = amdgpu_bo_pin(rbo, AMDGPU_GEM_DOMAIN_VRAM, &fb_location); +		r = amdgpu_bo_pin(abo, AMDGPU_GEM_DOMAIN_VRAM, &fb_location);  		if (unlikely(r != 0)) { -			amdgpu_bo_unreserve(rbo); +			amdgpu_bo_unreserve(abo);  			return -EINVAL;  		}  	} -	amdgpu_bo_get_tiling_flags(rbo, &tiling_flags); -	amdgpu_bo_unreserve(rbo); +	amdgpu_bo_get_tiling_flags(abo, &tiling_flags); +	amdgpu_bo_unreserve(abo);  	pipe_config = AMDGPU_TILING_GET(tiling_flags, PIPE_CONFIG); @@ -2158,7 +2129,7 @@ static int dce_v11_0_crtc_do_set_base(struct drm_crtc *crtc,  		break;  	default:  		DRM_ERROR("Unsupported screen format %s\n", -			drm_get_format_name(target_fb->pixel_format)); +		          drm_get_format_name(target_fb->pixel_format, &format_name));  		return -EINVAL;  	} @@ -2250,17 +2221,17 @@ static int dce_v11_0_crtc_do_set_base(struct drm_crtc *crtc,  	WREG32(mmVIEWPORT_SIZE + amdgpu_crtc->crtc_offset,  	       (viewport_w << 16) | viewport_h); -	/* set pageflip to happen only at start of vblank interval (front porch) */ -	WREG32(mmCRTC_MASTER_UPDATE_MODE + amdgpu_crtc->crtc_offset, 3); +	/* set pageflip to happen anywhere in vblank interval */ +	WREG32(mmCRTC_MASTER_UPDATE_MODE + amdgpu_crtc->crtc_offset, 0);  	if (!atomic && fb && fb != crtc->primary->fb) {  		amdgpu_fb = to_amdgpu_framebuffer(fb); -		rbo = gem_to_amdgpu_bo(amdgpu_fb->obj); -		r = amdgpu_bo_reserve(rbo, false); +		abo = gem_to_amdgpu_bo(amdgpu_fb->obj); +		r = amdgpu_bo_reserve(abo, false);  		if (unlikely(r != 0))  			return r; -		amdgpu_bo_unpin(rbo); -		amdgpu_bo_unreserve(rbo); +		amdgpu_bo_unpin(abo); +		amdgpu_bo_unreserve(abo);  	}  	/* Bytes per pixel may have changed */ @@ -2420,7 +2391,8 @@ static u32 dce_v11_0_pick_pll(struct drm_crtc *crtc)  	int pll;  	if ((adev->asic_type == CHIP_POLARIS10) || -	    (adev->asic_type == CHIP_POLARIS11)) { +	    (adev->asic_type == CHIP_POLARIS11) || +	    (adev->asic_type == CHIP_POLARIS12)) {  		struct amdgpu_encoder *amdgpu_encoder =  			to_amdgpu_encoder(amdgpu_crtc->encoder);  		struct amdgpu_encoder_atom_dig *dig = amdgpu_encoder->enc_priv; @@ -2541,6 +2513,9 @@ static int dce_v11_0_cursor_move_locked(struct drm_crtc *crtc,  	struct amdgpu_device *adev = crtc->dev->dev_private;  	int xorigin = 0, yorigin = 0; +	amdgpu_crtc->cursor_x = x; +	amdgpu_crtc->cursor_y = y; +  	/* avivo cursor are offset into the total surface */  	x += crtc->x;  	y += crtc->y; @@ -2557,11 +2532,6 @@ static int dce_v11_0_cursor_move_locked(struct drm_crtc *crtc,  	WREG32(mmCUR_POSITION + amdgpu_crtc->crtc_offset, (x << 16) | y);  	WREG32(mmCUR_HOT_SPOT + amdgpu_crtc->crtc_offset, (xorigin << 16) | yorigin); -	WREG32(mmCUR_SIZE + amdgpu_crtc->crtc_offset, -	       ((amdgpu_crtc->cursor_width - 1) << 16) | (amdgpu_crtc->cursor_height - 1)); - -	amdgpu_crtc->cursor_x = x; -	amdgpu_crtc->cursor_y = y;  	return 0;  } @@ -2587,6 +2557,7 @@ static int dce_v11_0_crtc_cursor_set2(struct drm_crtc *crtc,  				      int32_t hot_y)  {  	struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); +	struct amdgpu_device *adev = crtc->dev->dev_private;  	struct drm_gem_object *obj;  	struct amdgpu_bo *aobj;  	int ret; @@ -2625,9 +2596,6 @@ static int dce_v11_0_crtc_cursor_set2(struct drm_crtc *crtc,  		return ret;  	} -	amdgpu_crtc->cursor_width = width; -	amdgpu_crtc->cursor_height = height; -  	dce_v11_0_lock_cursor(crtc, true);  	if (hot_x != amdgpu_crtc->cursor_hot_x || @@ -2643,6 +2611,14 @@ static int dce_v11_0_crtc_cursor_set2(struct drm_crtc *crtc,  		amdgpu_crtc->cursor_hot_y = hot_y;  	} +	if (width != amdgpu_crtc->cursor_width || +	    height != amdgpu_crtc->cursor_height) { +		WREG32(mmCUR_SIZE + amdgpu_crtc->crtc_offset, +		       (width - 1) << 16 | (height - 1)); +		amdgpu_crtc->cursor_width = width; +		amdgpu_crtc->cursor_height = height; +	} +  	dce_v11_0_show_cursor(crtc);  	dce_v11_0_lock_cursor(crtc, false); @@ -2664,6 +2640,7 @@ unpin:  static void dce_v11_0_cursor_reset(struct drm_crtc *crtc)  {  	struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); +	struct amdgpu_device *adev = crtc->dev->dev_private;  	if (amdgpu_crtc->cursor_bo) {  		dce_v11_0_lock_cursor(crtc, true); @@ -2671,6 +2648,10 @@ static void dce_v11_0_cursor_reset(struct drm_crtc *crtc)  		dce_v11_0_cursor_move_locked(crtc, amdgpu_crtc->cursor_x,  					     amdgpu_crtc->cursor_y); +		WREG32(mmCUR_SIZE + amdgpu_crtc->crtc_offset, +		       (amdgpu_crtc->cursor_width - 1) << 16 | +		       (amdgpu_crtc->cursor_height - 1)); +  		dce_v11_0_show_cursor(crtc);  		dce_v11_0_lock_cursor(crtc, false); @@ -2708,7 +2689,7 @@ static const struct drm_crtc_funcs dce_v11_0_crtc_funcs = {  	.gamma_set = dce_v11_0_crtc_gamma_set,  	.set_config = amdgpu_crtc_set_config,  	.destroy = dce_v11_0_crtc_destroy, -	.page_flip = amdgpu_crtc_page_flip, +	.page_flip_target = amdgpu_crtc_page_flip_target,  };  static void dce_v11_0_crtc_dpms(struct drm_crtc *crtc, int mode) @@ -2775,16 +2756,16 @@ static void dce_v11_0_crtc_disable(struct drm_crtc *crtc)  	if (crtc->primary->fb) {  		int r;  		struct amdgpu_framebuffer *amdgpu_fb; -		struct amdgpu_bo *rbo; +		struct amdgpu_bo *abo;  		amdgpu_fb = to_amdgpu_framebuffer(crtc->primary->fb); -		rbo = gem_to_amdgpu_bo(amdgpu_fb->obj); -		r = amdgpu_bo_reserve(rbo, false); +		abo = gem_to_amdgpu_bo(amdgpu_fb->obj); +		r = amdgpu_bo_reserve(abo, false);  		if (unlikely(r)) -			DRM_ERROR("failed to reserve rbo before unpin\n"); +			DRM_ERROR("failed to reserve abo before unpin\n");  		else { -			amdgpu_bo_unpin(rbo); -			amdgpu_bo_unreserve(rbo); +			amdgpu_bo_unpin(abo); +			amdgpu_bo_unreserve(abo);  		}  	}  	/* disable the GRPH */ @@ -2845,7 +2826,8 @@ static int dce_v11_0_crtc_mode_set(struct drm_crtc *crtc,  		return -EINVAL;  	if ((adev->asic_type == CHIP_POLARIS10) || -	    (adev->asic_type == CHIP_POLARIS11)) { +	    (adev->asic_type == CHIP_POLARIS11) || +	    (adev->asic_type == CHIP_POLARIS12)) {  		struct amdgpu_encoder *amdgpu_encoder =  			to_amdgpu_encoder(amdgpu_crtc->encoder);  		int encoder_mode = @@ -2999,24 +2981,23 @@ static int dce_v11_0_early_init(void *handle)  	dce_v11_0_set_display_funcs(adev);  	dce_v11_0_set_irq_funcs(adev); +	adev->mode_info.num_crtc = dce_v11_0_get_num_crtc(adev); +  	switch (adev->asic_type) {  	case CHIP_CARRIZO: -		adev->mode_info.num_crtc = 3;  		adev->mode_info.num_hpd = 6;  		adev->mode_info.num_dig = 9;  		break;  	case CHIP_STONEY: -		adev->mode_info.num_crtc = 2;  		adev->mode_info.num_hpd = 6;  		adev->mode_info.num_dig = 9;  		break;  	case CHIP_POLARIS10: -		adev->mode_info.num_crtc = 6;  		adev->mode_info.num_hpd = 6;  		adev->mode_info.num_dig = 6;  		break;  	case CHIP_POLARIS11: -		adev->mode_info.num_crtc = 5; +	case CHIP_POLARIS12:  		adev->mode_info.num_hpd = 5;  		adev->mode_info.num_dig = 5;  		break; @@ -3109,6 +3090,7 @@ static int dce_v11_0_sw_fini(void *handle)  	dce_v11_0_afmt_fini(adev); +	drm_mode_config_cleanup(adev->ddev);  	adev->mode_info.mode_config_initialized = false;  	return 0; @@ -3125,7 +3107,8 @@ static int dce_v11_0_hw_init(void *handle)  	amdgpu_atombios_crtc_powergate_init(adev);  	amdgpu_atombios_encoder_init_dig(adev);  	if ((adev->asic_type == CHIP_POLARIS10) || -	    (adev->asic_type == CHIP_POLARIS11)) { +	    (adev->asic_type == CHIP_POLARIS11) || +	    (adev->asic_type == CHIP_POLARIS12)) {  		amdgpu_atombios_crtc_set_dce_clock(adev, adev->clock.default_dispclk,  						   DCE_CLOCK_TYPE_DISPCLK, ATOM_GCK_DFS);  		amdgpu_atombios_crtc_set_dce_clock(adev, 0, @@ -3164,10 +3147,6 @@ static int dce_v11_0_hw_fini(void *handle)  static int dce_v11_0_suspend(void *handle)  { -	struct amdgpu_device *adev = (struct amdgpu_device *)handle; - -	amdgpu_atombios_scratch_regs_save(adev); -  	return dce_v11_0_hw_fini(handle);  } @@ -3178,8 +3157,6 @@ static int dce_v11_0_resume(void *handle)  	ret = dce_v11_0_hw_init(handle); -	amdgpu_atombios_scratch_regs_restore(adev); -  	/* turn on the BL */  	if (adev->mode_info.bl_encoder) {  		u8 bl_level = amdgpu_display_backlight_get_level(adev, @@ -3560,7 +3537,7 @@ static int dce_v11_0_set_powergating_state(void *handle,  	return 0;  } -const struct amd_ip_funcs dce_v11_0_ip_funcs = { +static const struct amd_ip_funcs dce_v11_0_ip_funcs = {  	.name = "dce_v11_0",  	.early_init = dce_v11_0_early_init,  	.late_init = NULL, @@ -3844,7 +3821,6 @@ static const struct amdgpu_display_funcs dce_v11_0_display_funcs = {  	.bandwidth_update = &dce_v11_0_bandwidth_update,  	.vblank_get_counter = &dce_v11_0_vblank_get_counter,  	.vblank_wait = &dce_v11_0_vblank_wait, -	.is_display_hung = &dce_v11_0_is_display_hung,  	.backlight_set_level = &amdgpu_atombios_encoder_set_backlight_level,  	.backlight_get_level = &amdgpu_atombios_encoder_get_backlight_level,  	.hpd_sense = &dce_v11_0_hpd_sense, @@ -3890,3 +3866,21 @@ static void dce_v11_0_set_irq_funcs(struct amdgpu_device *adev)  	adev->hpd_irq.num_types = AMDGPU_HPD_LAST;  	adev->hpd_irq.funcs = &dce_v11_0_hpd_irq_funcs;  } + +const struct amdgpu_ip_block_version dce_v11_0_ip_block = +{ +	.type = AMD_IP_BLOCK_TYPE_DCE, +	.major = 11, +	.minor = 0, +	.rev = 0, +	.funcs = &dce_v11_0_ip_funcs, +}; + +const struct amdgpu_ip_block_version dce_v11_2_ip_block = +{ +	.type = AMD_IP_BLOCK_TYPE_DCE, +	.major = 11, +	.minor = 2, +	.rev = 0, +	.funcs = &dce_v11_0_ip_funcs, +};  | 
