diff options
Diffstat (limited to 'drivers/gpu/drm/radeon')
51 files changed, 1527 insertions, 1195 deletions
diff --git a/drivers/gpu/drm/radeon/Makefile b/drivers/gpu/drm/radeon/Makefile index 84b1f2729d4..aebe0087504 100644 --- a/drivers/gpu/drm/radeon/Makefile +++ b/drivers/gpu/drm/radeon/Makefile @@ -69,5 +69,6 @@ radeon-y += radeon_device.o radeon_asic.o radeon_kms.o \  radeon-$(CONFIG_COMPAT) += radeon_ioc32.o  radeon-$(CONFIG_VGA_SWITCHEROO) += radeon_atpx_handler.o +radeon-$(CONFIG_ACPI) += radeon_acpi.o  obj-$(CONFIG_DRM_RADEON)+= radeon.o diff --git a/drivers/gpu/drm/radeon/atom.c b/drivers/gpu/drm/radeon/atom.c index 1d569830ed9..8e421f644a5 100644 --- a/drivers/gpu/drm/radeon/atom.c +++ b/drivers/gpu/drm/radeon/atom.c @@ -108,12 +108,11 @@ static uint32_t atom_iio_execute(struct atom_context *ctx, int base,  			base++;  			break;  		case ATOM_IIO_READ: -			temp = ctx->card->reg_read(ctx->card, CU16(base + 1)); +			temp = ctx->card->ioreg_read(ctx->card, CU16(base + 1));  			base += 3;  			break;  		case ATOM_IIO_WRITE: -			(void)ctx->card->reg_read(ctx->card, CU16(base + 1)); -			ctx->card->reg_write(ctx->card, CU16(base + 1), temp); +			ctx->card->ioreg_write(ctx->card, CU16(base + 1), temp);  			base += 3;  			break;  		case ATOM_IIO_CLEAR: @@ -715,8 +714,8 @@ static void atom_op_jump(atom_exec_context *ctx, int *ptr, int arg)  			cjiffies = jiffies;  			if (time_after(cjiffies, ctx->last_jump_jiffies)) {  				cjiffies -= ctx->last_jump_jiffies; -				if ((jiffies_to_msecs(cjiffies) > 1000)) { -					DRM_ERROR("atombios stuck in loop for more than 1sec aborting\n"); +				if ((jiffies_to_msecs(cjiffies) > 5000)) { +					DRM_ERROR("atombios stuck in loop for more than 5secs aborting\n");  					ctx->abort = true;  				}  			} else { diff --git a/drivers/gpu/drm/radeon/atom.h b/drivers/gpu/drm/radeon/atom.h index cd1b64ab5ca..a589a55b223 100644 --- a/drivers/gpu/drm/radeon/atom.h +++ b/drivers/gpu/drm/radeon/atom.h @@ -113,6 +113,8 @@ struct card_info {  	struct drm_device *dev;  	void (* reg_write)(struct card_info *, uint32_t, uint32_t);   /*  filled by driver */          uint32_t (* reg_read)(struct card_info *, uint32_t);          /*  filled by driver */ +	void (* ioreg_write)(struct card_info *, uint32_t, uint32_t);   /*  filled by driver */ +        uint32_t (* ioreg_read)(struct card_info *, uint32_t);          /*  filled by driver */  	void (* mc_write)(struct card_info *, uint32_t, uint32_t);   /*  filled by driver */          uint32_t (* mc_read)(struct card_info *, uint32_t);          /*  filled by driver */  	void (* pll_write)(struct card_info *, uint32_t, uint32_t);   /*  filled by driver */ diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c index 8c2d6478a22..12ad512bd3d 100644 --- a/drivers/gpu/drm/radeon/atombios_crtc.c +++ b/drivers/gpu/drm/radeon/atombios_crtc.c @@ -44,10 +44,6 @@ static void atombios_overscan_setup(struct drm_crtc *crtc,  	memset(&args, 0, sizeof(args)); -	args.usOverscanRight = 0; -	args.usOverscanLeft = 0; -	args.usOverscanBottom = 0; -	args.usOverscanTop = 0;  	args.ucCRTC = radeon_crtc->crtc_id;  	switch (radeon_crtc->rmx_type) { @@ -56,7 +52,6 @@ static void atombios_overscan_setup(struct drm_crtc *crtc,  		args.usOverscanBottom = (adjusted_mode->crtc_vdisplay - mode->crtc_vdisplay) / 2;  		args.usOverscanLeft = (adjusted_mode->crtc_hdisplay - mode->crtc_hdisplay) / 2;  		args.usOverscanRight = (adjusted_mode->crtc_hdisplay - mode->crtc_hdisplay) / 2; -		atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);  		break;  	case RMX_ASPECT:  		a1 = mode->crtc_vdisplay * adjusted_mode->crtc_hdisplay; @@ -69,17 +64,16 @@ static void atombios_overscan_setup(struct drm_crtc *crtc,  			args.usOverscanLeft = (adjusted_mode->crtc_vdisplay - (a1 / mode->crtc_hdisplay)) / 2;  			args.usOverscanRight = (adjusted_mode->crtc_vdisplay - (a1 / mode->crtc_hdisplay)) / 2;  		} -		atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);  		break;  	case RMX_FULL:  	default: -		args.usOverscanRight = 0; -		args.usOverscanLeft = 0; -		args.usOverscanBottom = 0; -		args.usOverscanTop = 0; -		atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args); +		args.usOverscanRight = radeon_crtc->h_border; +		args.usOverscanLeft = radeon_crtc->h_border; +		args.usOverscanBottom = radeon_crtc->v_border; +		args.usOverscanTop = radeon_crtc->v_border;  		break;  	} +	atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);  }  static void atombios_scaler_setup(struct drm_crtc *crtc) @@ -282,22 +276,22 @@ atombios_set_crtc_dtd_timing(struct drm_crtc *crtc,  	u16 misc = 0;  	memset(&args, 0, sizeof(args)); -	args.usH_Size = cpu_to_le16(mode->crtc_hdisplay); +	args.usH_Size = cpu_to_le16(mode->crtc_hdisplay - (radeon_crtc->h_border * 2));  	args.usH_Blanking_Time = -		cpu_to_le16(mode->crtc_hblank_end - mode->crtc_hdisplay); -	args.usV_Size = cpu_to_le16(mode->crtc_vdisplay); +		cpu_to_le16(mode->crtc_hblank_end - mode->crtc_hdisplay + (radeon_crtc->h_border * 2)); +	args.usV_Size = cpu_to_le16(mode->crtc_vdisplay - (radeon_crtc->v_border * 2));  	args.usV_Blanking_Time = -	    cpu_to_le16(mode->crtc_vblank_end - mode->crtc_vdisplay); +		cpu_to_le16(mode->crtc_vblank_end - mode->crtc_vdisplay + (radeon_crtc->v_border * 2));  	args.usH_SyncOffset = -		cpu_to_le16(mode->crtc_hsync_start - mode->crtc_hdisplay); +		cpu_to_le16(mode->crtc_hsync_start - mode->crtc_hdisplay + radeon_crtc->h_border);  	args.usH_SyncWidth =  		cpu_to_le16(mode->crtc_hsync_end - mode->crtc_hsync_start);  	args.usV_SyncOffset = -		cpu_to_le16(mode->crtc_vsync_start - mode->crtc_vdisplay); +		cpu_to_le16(mode->crtc_vsync_start - mode->crtc_vdisplay + radeon_crtc->v_border);  	args.usV_SyncWidth =  		cpu_to_le16(mode->crtc_vsync_end - mode->crtc_vsync_start); -	/*args.ucH_Border = mode->hborder;*/ -	/*args.ucV_Border = mode->vborder;*/ +	args.ucH_Border = radeon_crtc->h_border; +	args.ucV_Border = radeon_crtc->v_border;  	if (mode->flags & DRM_MODE_FLAG_NVSYNC)  		misc |= ATOM_VSYNC_POLARITY; @@ -669,56 +663,25 @@ static void atombios_crtc_set_dcpll(struct drm_crtc *crtc)  	atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);  } -static void atombios_crtc_set_pll(struct drm_crtc *crtc, struct drm_display_mode *mode) +static void atombios_crtc_program_pll(struct drm_crtc *crtc, +				      int crtc_id, +				      int pll_id, +				      u32 encoder_mode, +				      u32 encoder_id, +				      u32 clock, +				      u32 ref_div, +				      u32 fb_div, +				      u32 frac_fb_div, +				      u32 post_div)  { -	struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);  	struct drm_device *dev = crtc->dev;  	struct radeon_device *rdev = dev->dev_private; -	struct drm_encoder *encoder = NULL; -	struct radeon_encoder *radeon_encoder = NULL;  	u8 frev, crev; -	int index; +	int index = GetIndexIntoMasterTable(COMMAND, SetPixelClock);  	union set_pixel_clock args; -	u32 pll_clock = mode->clock; -	u32 ref_div = 0, fb_div = 0, frac_fb_div = 0, post_div = 0; -	struct radeon_pll *pll; -	u32 adjusted_clock; -	int encoder_mode = 0;  	memset(&args, 0, sizeof(args)); -	list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { -		if (encoder->crtc == crtc) { -			radeon_encoder = to_radeon_encoder(encoder); -			encoder_mode = atombios_get_encoder_mode(encoder); -			break; -		} -	} - -	if (!radeon_encoder) -		return; - -	switch (radeon_crtc->pll_id) { -	case ATOM_PPLL1: -		pll = &rdev->clock.p1pll; -		break; -	case ATOM_PPLL2: -		pll = &rdev->clock.p2pll; -		break; -	case ATOM_DCPLL: -	case ATOM_PPLL_INVALID: -	default: -		pll = &rdev->clock.dcpll; -		break; -	} - -	/* adjust pixel clock as needed */ -	adjusted_clock = atombios_adjust_pll(crtc, mode, pll); - -	radeon_compute_pll(pll, adjusted_clock, &pll_clock, &fb_div, &frac_fb_div, -			   &ref_div, &post_div); - -	index = GetIndexIntoMasterTable(COMMAND, SetPixelClock);  	if (!atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev,  				   &crev))  		return; @@ -727,47 +690,49 @@ static void atombios_crtc_set_pll(struct drm_crtc *crtc, struct drm_display_mode  	case 1:  		switch (crev) {  		case 1: -			args.v1.usPixelClock = cpu_to_le16(mode->clock / 10); +			if (clock == ATOM_DISABLE) +				return; +			args.v1.usPixelClock = cpu_to_le16(clock / 10);  			args.v1.usRefDiv = cpu_to_le16(ref_div);  			args.v1.usFbDiv = cpu_to_le16(fb_div);  			args.v1.ucFracFbDiv = frac_fb_div;  			args.v1.ucPostDiv = post_div; -			args.v1.ucPpll = radeon_crtc->pll_id; -			args.v1.ucCRTC = radeon_crtc->crtc_id; +			args.v1.ucPpll = pll_id; +			args.v1.ucCRTC = crtc_id;  			args.v1.ucRefDivSrc = 1;  			break;  		case 2: -			args.v2.usPixelClock = cpu_to_le16(mode->clock / 10); +			args.v2.usPixelClock = cpu_to_le16(clock / 10);  			args.v2.usRefDiv = cpu_to_le16(ref_div);  			args.v2.usFbDiv = cpu_to_le16(fb_div);  			args.v2.ucFracFbDiv = frac_fb_div;  			args.v2.ucPostDiv = post_div; -			args.v2.ucPpll = radeon_crtc->pll_id; -			args.v2.ucCRTC = radeon_crtc->crtc_id; +			args.v2.ucPpll = pll_id; +			args.v2.ucCRTC = crtc_id;  			args.v2.ucRefDivSrc = 1;  			break;  		case 3: -			args.v3.usPixelClock = cpu_to_le16(mode->clock / 10); +			args.v3.usPixelClock = cpu_to_le16(clock / 10);  			args.v3.usRefDiv = cpu_to_le16(ref_div);  			args.v3.usFbDiv = cpu_to_le16(fb_div);  			args.v3.ucFracFbDiv = frac_fb_div;  			args.v3.ucPostDiv = post_div; -			args.v3.ucPpll = radeon_crtc->pll_id; -			args.v3.ucMiscInfo = (radeon_crtc->pll_id << 2); -			args.v3.ucTransmitterId = radeon_encoder->encoder_id; +			args.v3.ucPpll = pll_id; +			args.v3.ucMiscInfo = (pll_id << 2); +			args.v3.ucTransmitterId = encoder_id;  			args.v3.ucEncoderMode = encoder_mode;  			break;  		case 5: -			args.v5.ucCRTC = radeon_crtc->crtc_id; -			args.v5.usPixelClock = cpu_to_le16(mode->clock / 10); +			args.v5.ucCRTC = crtc_id; +			args.v5.usPixelClock = cpu_to_le16(clock / 10);  			args.v5.ucRefDiv = ref_div;  			args.v5.usFbDiv = cpu_to_le16(fb_div);  			args.v5.ulFbDivDecFrac = cpu_to_le32(frac_fb_div * 100000);  			args.v5.ucPostDiv = post_div;  			args.v5.ucMiscInfo = 0; /* HDMI depth, etc. */ -			args.v5.ucTransmitterID = radeon_encoder->encoder_id; +			args.v5.ucTransmitterID = encoder_id;  			args.v5.ucEncoderMode = encoder_mode; -			args.v5.ucPpll = radeon_crtc->pll_id; +			args.v5.ucPpll = pll_id;  			break;  		default:  			DRM_ERROR("Unknown table version %d %d\n", frev, crev); @@ -782,6 +747,56 @@ static void atombios_crtc_set_pll(struct drm_crtc *crtc, struct drm_display_mode  	atom_execute_table(rdev->mode_info.atom_context, index, (uint32_t *)&args);  } +static void atombios_crtc_set_pll(struct drm_crtc *crtc, struct drm_display_mode *mode) +{ +	struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); +	struct drm_device *dev = crtc->dev; +	struct radeon_device *rdev = dev->dev_private; +	struct drm_encoder *encoder = NULL; +	struct radeon_encoder *radeon_encoder = NULL; +	u32 pll_clock = mode->clock; +	u32 ref_div = 0, fb_div = 0, frac_fb_div = 0, post_div = 0; +	struct radeon_pll *pll; +	u32 adjusted_clock; +	int encoder_mode = 0; + +	list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { +		if (encoder->crtc == crtc) { +			radeon_encoder = to_radeon_encoder(encoder); +			encoder_mode = atombios_get_encoder_mode(encoder); +			break; +		} +	} + +	if (!radeon_encoder) +		return; + +	switch (radeon_crtc->pll_id) { +	case ATOM_PPLL1: +		pll = &rdev->clock.p1pll; +		break; +	case ATOM_PPLL2: +		pll = &rdev->clock.p2pll; +		break; +	case ATOM_DCPLL: +	case ATOM_PPLL_INVALID: +	default: +		pll = &rdev->clock.dcpll; +		break; +	} + +	/* adjust pixel clock as needed */ +	adjusted_clock = atombios_adjust_pll(crtc, mode, pll); + +	radeon_compute_pll(pll, adjusted_clock, &pll_clock, &fb_div, &frac_fb_div, +			   &ref_div, &post_div); + +	atombios_crtc_program_pll(crtc, radeon_crtc->crtc_id, radeon_crtc->pll_id, +				  encoder_mode, radeon_encoder->encoder_id, mode->clock, +				  ref_div, fb_div, frac_fb_div, post_div); + +} +  static int evergreen_crtc_set_base(struct drm_crtc *crtc, int x, int y,  				   struct drm_framebuffer *old_fb)  { @@ -797,7 +812,7 @@ static int evergreen_crtc_set_base(struct drm_crtc *crtc, int x, int y,  	/* no fb bound */  	if (!crtc->fb) { -		DRM_DEBUG("No FB bound\n"); +		DRM_DEBUG_KMS("No FB bound\n");  		return 0;  	} @@ -841,6 +856,11 @@ static int evergreen_crtc_set_base(struct drm_crtc *crtc, int x, int y,  		return -EINVAL;  	} +	if (tiling_flags & RADEON_TILING_MACRO) +		fb_format |= EVERGREEN_GRPH_ARRAY_MODE(EVERGREEN_GRPH_ARRAY_2D_TILED_THIN1); +	else if (tiling_flags & RADEON_TILING_MICRO) +		fb_format |= EVERGREEN_GRPH_ARRAY_MODE(EVERGREEN_GRPH_ARRAY_1D_TILED_THIN1); +  	switch (radeon_crtc->crtc_id) {  	case 0:  		WREG32(AVIVO_D1VGA_CONTROL, 0); @@ -931,7 +951,7 @@ static int avivo_crtc_set_base(struct drm_crtc *crtc, int x, int y,  	/* no fb bound */  	if (!crtc->fb) { -		DRM_DEBUG("No FB bound\n"); +		DRM_DEBUG_KMS("No FB bound\n");  		return 0;  	} @@ -979,11 +999,18 @@ static int avivo_crtc_set_base(struct drm_crtc *crtc, int x, int y,  		return -EINVAL;  	} -	if (tiling_flags & RADEON_TILING_MACRO) -		fb_format |= AVIVO_D1GRPH_MACRO_ADDRESS_MODE; +	if (rdev->family >= CHIP_R600) { +		if (tiling_flags & RADEON_TILING_MACRO) +			fb_format |= R600_D1GRPH_ARRAY_MODE_2D_TILED_THIN1; +		else if (tiling_flags & RADEON_TILING_MICRO) +			fb_format |= R600_D1GRPH_ARRAY_MODE_1D_TILED_THIN1; +	} else { +		if (tiling_flags & RADEON_TILING_MACRO) +			fb_format |= AVIVO_D1GRPH_MACRO_ADDRESS_MODE; -	if (tiling_flags & RADEON_TILING_MICRO) -		fb_format |= AVIVO_D1GRPH_TILED; +		if (tiling_flags & RADEON_TILING_MICRO) +			fb_format |= AVIVO_D1GRPH_TILED; +	}  	if (radeon_crtc->crtc_id == 0)  		WREG32(AVIVO_D1VGA_CONTROL, 0); @@ -1143,10 +1170,8 @@ int atombios_crtc_mode_set(struct drm_crtc *crtc,  	atombios_crtc_set_pll(crtc, adjusted_mode);  	atombios_enable_ss(crtc); -	if (ASIC_IS_DCE4(rdev)) +	if (ASIC_IS_AVIVO(rdev))  		atombios_set_crtc_dtd_timing(crtc, adjusted_mode); -	else if (ASIC_IS_AVIVO(rdev)) -		atombios_crtc_set_timing(crtc, adjusted_mode);  	else {  		atombios_crtc_set_timing(crtc, adjusted_mode);  		if (radeon_crtc->crtc_id == 0) @@ -1191,6 +1216,24 @@ static void atombios_crtc_commit(struct drm_crtc *crtc)  	atombios_lock_crtc(crtc, ATOM_DISABLE);  } +static void atombios_crtc_disable(struct drm_crtc *crtc) +{ +	struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); +	atombios_crtc_dpms(crtc, DRM_MODE_DPMS_OFF); + +	switch (radeon_crtc->pll_id) { +	case ATOM_PPLL1: +	case ATOM_PPLL2: +		/* disable the ppll */ +		atombios_crtc_program_pll(crtc, radeon_crtc->crtc_id, radeon_crtc->pll_id, +					  0, 0, ATOM_DISABLE, 0, 0, 0, 0); +		break; +	default: +		break; +	} +	radeon_crtc->pll_id = -1; +} +  static const struct drm_crtc_helper_funcs atombios_helper_funcs = {  	.dpms = atombios_crtc_dpms,  	.mode_fixup = atombios_crtc_mode_fixup, @@ -1199,6 +1242,7 @@ static const struct drm_crtc_helper_funcs atombios_helper_funcs = {  	.prepare = atombios_crtc_prepare,  	.commit = atombios_crtc_commit,  	.load_lut = radeon_crtc_load_lut, +	.disable = atombios_crtc_disable,  };  void radeon_atombios_init_crtc(struct drm_device *dev, diff --git a/drivers/gpu/drm/radeon/atombios_dp.c b/drivers/gpu/drm/radeon/atombios_dp.c index abffb1499e2..36e0d4b545e 100644 --- a/drivers/gpu/drm/radeon/atombios_dp.c +++ b/drivers/gpu/drm/radeon/atombios_dp.c @@ -296,7 +296,7 @@ static void dp_get_adjust_train(u8 link_status[DP_LINK_STATUS_SIZE],  		u8 this_v = dp_get_adjust_request_voltage(link_status, lane);  		u8 this_p = dp_get_adjust_request_pre_emphasis(link_status, lane); -		DRM_DEBUG("requested signal parameters: lane %d voltage %s pre_emph %s\n", +		DRM_DEBUG_KMS("requested signal parameters: lane %d voltage %s pre_emph %s\n",  			  lane,  			  voltage_names[this_v >> DP_TRAIN_VOLTAGE_SWING_SHIFT],  			  pre_emph_names[this_p >> DP_TRAIN_PRE_EMPHASIS_SHIFT]); @@ -313,7 +313,7 @@ static void dp_get_adjust_train(u8 link_status[DP_LINK_STATUS_SIZE],  	if (p >= dp_pre_emphasis_max(v))  		p = dp_pre_emphasis_max(v) | DP_TRAIN_MAX_PRE_EMPHASIS_REACHED; -	DRM_DEBUG("using signal parameters: voltage %s pre_emph %s\n", +	DRM_DEBUG_KMS("using signal parameters: voltage %s pre_emph %s\n",  		  voltage_names[(v & DP_TRAIN_VOLTAGE_SWING_MASK) >> DP_TRAIN_VOLTAGE_SWING_SHIFT],  		  pre_emph_names[(p & DP_TRAIN_PRE_EMPHASIS_MASK) >> DP_TRAIN_PRE_EMPHASIS_SHIFT]); @@ -358,7 +358,7 @@ retry:  	if (args.v1.ucReplyStatus && !args.v1.ucDataOutLen) {  		if (args.v1.ucReplyStatus == 0x20 && retry_count++ < 10)  			goto retry; -		DRM_DEBUG("failed to get auxch %02x%02x %02x %02x 0x%02x %02x after %d retries\n", +		DRM_DEBUG_KMS("failed to get auxch %02x%02x %02x %02x 0x%02x %02x after %d retries\n",  			  req_bytes[1], req_bytes[0], req_bytes[2], req_bytes[3],  			  chan->rec.i2c_id, args.v1.ucReplyStatus, retry_count);  		return false; @@ -461,10 +461,10 @@ bool radeon_dp_getdpcd(struct radeon_connector *radeon_connector)  		memcpy(dig_connector->dpcd, msg, 8);  		{  			int i; -			DRM_DEBUG("DPCD: "); +			DRM_DEBUG_KMS("DPCD: ");  			for (i = 0; i < 8; i++) -				DRM_DEBUG("%02x ", msg[i]); -			DRM_DEBUG("\n"); +				DRM_DEBUG_KMS("%02x ", msg[i]); +			DRM_DEBUG_KMS("\n");  		}  		return true;  	} @@ -512,7 +512,7 @@ static bool atom_dp_get_link_status(struct radeon_connector *radeon_connector,  		return false;  	} -	DRM_DEBUG("link status %02x %02x %02x %02x %02x %02x\n", +	DRM_DEBUG_KMS("link status %02x %02x %02x %02x %02x %02x\n",  		  link_status[0], link_status[1], link_status[2],  		  link_status[3], link_status[4], link_status[5]);  	return true; @@ -695,7 +695,7 @@ void dp_link_train(struct drm_encoder *encoder,  	if (!clock_recovery)  		DRM_ERROR("clock recovery failed\n");  	else -		DRM_DEBUG("clock recovery at voltage %d pre-emphasis %d\n", +		DRM_DEBUG_KMS("clock recovery at voltage %d pre-emphasis %d\n",  			  train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK,  			  (train_set[0] & DP_TRAIN_PRE_EMPHASIS_MASK) >>  			  DP_TRAIN_PRE_EMPHASIS_SHIFT); @@ -739,7 +739,7 @@ void dp_link_train(struct drm_encoder *encoder,  	if (!channel_eq)  		DRM_ERROR("channel eq failed\n");  	else -		DRM_DEBUG("channel eq at voltage %d pre-emphasis %d\n", +		DRM_DEBUG_KMS("channel eq at voltage %d pre-emphasis %d\n",  			  train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK,  			  (train_set[0] & DP_TRAIN_PRE_EMPHASIS_MASK)  			  >> DP_TRAIN_PRE_EMPHASIS_SHIFT); diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index 1caf625e472..957d5067ad9 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c @@ -39,6 +39,23 @@  static void evergreen_gpu_init(struct radeon_device *rdev);  void evergreen_fini(struct radeon_device *rdev); +/* get temperature in millidegrees */ +u32 evergreen_get_temp(struct radeon_device *rdev) +{ +	u32 temp = (RREG32(CG_MULT_THERMAL_STATUS) & ASIC_T_MASK) >> +		ASIC_T_SHIFT; +	u32 actual_temp = 0; + +	if ((temp >> 10) & 1) +		actual_temp = 0; +	else if ((temp >> 9) & 1) +		actual_temp = 255; +	else +		actual_temp = (temp >> 1) & 0xff; + +	return actual_temp * 1000; +} +  void evergreen_pm_misc(struct radeon_device *rdev)  {  	int req_ps_idx = rdev->pm.requested_power_state_index; @@ -1115,6 +1132,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev)  								 rdev->config.evergreen.max_backends) &  								EVERGREEN_MAX_BACKENDS_MASK)); +	rdev->config.evergreen.tile_config = gb_addr_config;  	WREG32(GB_BACKEND_MAP, gb_backend_map);  	WREG32(GB_ADDR_CONFIG, gb_addr_config);  	WREG32(DMIF_ADDR_CONFIG, gb_addr_config); @@ -1334,8 +1352,8 @@ int evergreen_mc_init(struct radeon_device *rdev)  	}  	rdev->mc.vram_width = numchan * chansize;  	/* Could aper size report 0 ? */ -	rdev->mc.aper_base = drm_get_resource_start(rdev->ddev, 0); -	rdev->mc.aper_size = drm_get_resource_len(rdev->ddev, 0); +	rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0); +	rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);  	/* Setup GPU memory space */  	/* size in MB on evergreen */  	rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024; diff --git a/drivers/gpu/drm/radeon/evergreen_reg.h b/drivers/gpu/drm/radeon/evergreen_reg.h index e028c1cd9d9..2330f3a36fd 100644 --- a/drivers/gpu/drm/radeon/evergreen_reg.h +++ b/drivers/gpu/drm/radeon/evergreen_reg.h @@ -61,6 +61,11 @@  #       define EVERGREEN_GRPH_FORMAT_8B_BGRA1010102     5  #       define EVERGREEN_GRPH_FORMAT_RGB111110          6  #       define EVERGREEN_GRPH_FORMAT_BGR101111          7 +#       define EVERGREEN_GRPH_ARRAY_MODE(x)             (((x) & 0x7) << 20) +#       define EVERGREEN_GRPH_ARRAY_LINEAR_GENERAL      0 +#       define EVERGREEN_GRPH_ARRAY_LINEAR_ALIGNED      1 +#       define EVERGREEN_GRPH_ARRAY_1D_TILED_THIN1      2 +#       define EVERGREEN_GRPH_ARRAY_2D_TILED_THIN1      4  #define EVERGREEN_GRPH_SWAP_CONTROL                     0x680c  #       define EVERGREEN_GRPH_ENDIAN_SWAP(x)            (((x) & 0x3) << 0)  #       define EVERGREEN_GRPH_ENDIAN_NONE               0 diff --git a/drivers/gpu/drm/radeon/evergreend.h b/drivers/gpu/drm/radeon/evergreend.h index a1cd621780e..9b7532dd30f 100644 --- a/drivers/gpu/drm/radeon/evergreend.h +++ b/drivers/gpu/drm/radeon/evergreend.h @@ -165,6 +165,11 @@  #define		SE_DB_BUSY					(1 << 30)  #define		SE_CB_BUSY					(1 << 31) +#define	CG_MULT_THERMAL_STATUS				0x740 +#define		ASIC_T(x)			        ((x) << 16) +#define		ASIC_T_MASK			        0x7FF0000 +#define		ASIC_T_SHIFT			        16 +  #define	HDP_HOST_PATH_CNTL				0x2C00  #define	HDP_NONSURFACE_BASE				0x2C04  #define	HDP_NONSURFACE_INFO				0x2C08 diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c index a89a15ab524..e817a0bb5eb 100644 --- a/drivers/gpu/drm/radeon/r100.c +++ b/drivers/gpu/drm/radeon/r100.c @@ -141,7 +141,7 @@ void r100_pm_get_dynpm_state(struct radeon_device *rdev)  	/* only one clock mode per power state */  	rdev->pm.requested_clock_mode_index = 0; -	DRM_DEBUG("Requested: e: %d m: %d p: %d\n", +	DRM_DEBUG_DRIVER("Requested: e: %d m: %d p: %d\n",  		  rdev->pm.power_state[rdev->pm.requested_power_state_index].  		  clock_info[rdev->pm.requested_clock_mode_index].sclk,  		  rdev->pm.power_state[rdev->pm.requested_power_state_index]. @@ -276,7 +276,7 @@ void r100_pm_misc(struct radeon_device *rdev)  	     rdev->pm.power_state[rdev->pm.current_power_state_index].pcie_lanes)) {  		radeon_set_pcie_lanes(rdev,  				      ps->pcie_lanes); -		DRM_DEBUG("Setting: p: %d\n", ps->pcie_lanes); +		DRM_DEBUG_DRIVER("Setting: p: %d\n", ps->pcie_lanes);  	}  } @@ -849,7 +849,7 @@ static int r100_cp_init_microcode(struct radeon_device *rdev)  	const char *fw_name = NULL;  	int err; -	DRM_DEBUG("\n"); +	DRM_DEBUG_KMS("\n");  	pdev = platform_device_register_simple("radeon_cp", 0, NULL, 0);  	err = IS_ERR(pdev); @@ -1803,6 +1803,11 @@ static int r100_packet3_check(struct radeon_cs_parser *p,  			return r;  		break;  		/* triggers drawing using indices to vertex buffer */ +	case PACKET3_3D_CLEAR_HIZ: +	case PACKET3_3D_CLEAR_ZMASK: +		if (p->rdev->hyperz_filp != p->filp) +			return -EINVAL; +		break;  	case PACKET3_NOP:  		break;  	default: @@ -2295,8 +2300,8 @@ void r100_vram_init_sizes(struct radeon_device *rdev)  	u64 config_aper_size;  	/* work out accessible VRAM */ -	rdev->mc.aper_base = drm_get_resource_start(rdev->ddev, 0); -	rdev->mc.aper_size = drm_get_resource_len(rdev->ddev, 0); +	rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0); +	rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);  	rdev->mc.visible_vram_size = r100_get_accessible_vram(rdev);  	/* FIXME we don't use the second aperture yet when we could use it */  	if (rdev->mc.visible_vram_size > rdev->mc.aper_size) @@ -2364,11 +2369,10 @@ void r100_mc_init(struct radeon_device *rdev)   */  void r100_pll_errata_after_index(struct radeon_device *rdev)  { -	if (!(rdev->pll_errata & CHIP_ERRATA_PLL_DUMMYREADS)) { -		return; +	if (rdev->pll_errata & CHIP_ERRATA_PLL_DUMMYREADS) { +		(void)RREG32(RADEON_CLOCK_CNTL_DATA); +		(void)RREG32(RADEON_CRTC_GEN_CNTL);  	} -	(void)RREG32(RADEON_CLOCK_CNTL_DATA); -	(void)RREG32(RADEON_CRTC_GEN_CNTL);  }  static void r100_pll_errata_after_data(struct radeon_device *rdev) @@ -2643,7 +2647,7 @@ int r100_set_surface_reg(struct radeon_device *rdev, int reg,  		flags |= pitch / 8; -	DRM_DEBUG("writing surface %d %d %x %x\n", reg, flags, offset, offset+obj_size-1); +	DRM_DEBUG_KMS("writing surface %d %d %x %x\n", reg, flags, offset, offset+obj_size-1);  	WREG32(RADEON_SURFACE0_INFO + surf_index, flags);  	WREG32(RADEON_SURFACE0_LOWER_BOUND + surf_index, offset);  	WREG32(RADEON_SURFACE0_UPPER_BOUND + surf_index, offset + obj_size - 1); @@ -3039,7 +3043,7 @@ void r100_bandwidth_update(struct radeon_device *rdev)  		}  #endif -		DRM_DEBUG("GRPH_BUFFER_CNTL from to %x\n", +		DRM_DEBUG_KMS("GRPH_BUFFER_CNTL from to %x\n",  			  /* 	  (unsigned int)info->SavedReg->grph_buffer_cntl, */  			  (unsigned int)RREG32(RADEON_GRPH_BUFFER_CNTL));  	} @@ -3135,7 +3139,7 @@ void r100_bandwidth_update(struct radeon_device *rdev)  			WREG32(RS400_DISP1_REQ_CNTL1, 0x28FBC3AC);  		} -		DRM_DEBUG("GRPH2_BUFFER_CNTL from to %x\n", +		DRM_DEBUG_KMS("GRPH2_BUFFER_CNTL from to %x\n",  			  (unsigned int)RREG32(RADEON_GRPH2_BUFFER_CNTL));  	}  } @@ -3809,6 +3813,31 @@ void r100_fini(struct radeon_device *rdev)  	rdev->bios = NULL;  } +/* + * Due to how kexec works, it can leave the hw fully initialised when it + * boots the new kernel. However doing our init sequence with the CP and + * WB stuff setup causes GPU hangs on the RN50 at least. So at startup + * do some quick sanity checks and restore sane values to avoid this + * problem. + */ +void r100_restore_sanity(struct radeon_device *rdev) +{ +	u32 tmp; + +	tmp = RREG32(RADEON_CP_CSQ_CNTL); +	if (tmp) { +		WREG32(RADEON_CP_CSQ_CNTL, 0); +	} +	tmp = RREG32(RADEON_CP_RB_CNTL); +	if (tmp) { +		WREG32(RADEON_CP_RB_CNTL, 0); +	} +	tmp = RREG32(RADEON_SCRATCH_UMSK); +	if (tmp) { +		WREG32(RADEON_SCRATCH_UMSK, 0); +	} +} +  int r100_init(struct radeon_device *rdev)  {  	int r; @@ -3821,6 +3850,8 @@ int r100_init(struct radeon_device *rdev)  	radeon_scratch_init(rdev);  	/* Initialize surface registers */  	radeon_surface_init(rdev); +	/* sanity check some register to avoid hangs like after kexec */ +	r100_restore_sanity(rdev);  	/* TODO: disable VGA need to use VGA request */  	/* BIOS*/  	if (!radeon_get_bios(rdev)) { diff --git a/drivers/gpu/drm/radeon/r100d.h b/drivers/gpu/drm/radeon/r100d.h index d016b16fa11..b121b6c678d 100644 --- a/drivers/gpu/drm/radeon/r100d.h +++ b/drivers/gpu/drm/radeon/r100d.h @@ -48,10 +48,12 @@  #define		PACKET3_3D_DRAW_IMMD		0x29  #define		PACKET3_3D_DRAW_INDX		0x2A  #define		PACKET3_3D_LOAD_VBPNTR		0x2F +#define		PACKET3_3D_CLEAR_ZMASK		0x32  #define		PACKET3_INDX_BUFFER		0x33  #define		PACKET3_3D_DRAW_VBUF_2		0x34  #define		PACKET3_3D_DRAW_IMMD_2		0x35  #define		PACKET3_3D_DRAW_INDX_2		0x36 +#define		PACKET3_3D_CLEAR_HIZ		0x37  #define		PACKET3_BITBLT_MULTI		0x9B  #define PACKET0(reg, n)	(CP_PACKET0 |					\ diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c index 19a7ef7ee34..c827738ad7d 100644 --- a/drivers/gpu/drm/radeon/r300.c +++ b/drivers/gpu/drm/radeon/r300.c @@ -1048,14 +1048,47 @@ static int r300_packet0_check(struct radeon_cs_parser *p,  		/* RB3D_COLOR_CHANNEL_MASK */  		track->color_channel_mask = idx_value;  		break; -	case 0x4d1c: +	case 0x43a4: +		/* SC_HYPERZ_EN */ +		/* r300c emits this register - we need to disable hyperz for it +		 * without complaining */ +		if (p->rdev->hyperz_filp != p->filp) { +			if (idx_value & 0x1) +				ib[idx] = idx_value & ~1; +		} +		break; +	case 0x4f1c:  		/* ZB_BW_CNTL */  		track->zb_cb_clear = !!(idx_value & (1 << 5)); +		if (p->rdev->hyperz_filp != p->filp) { +			if (idx_value & (R300_HIZ_ENABLE | +					 R300_RD_COMP_ENABLE | +					 R300_WR_COMP_ENABLE | +					 R300_FAST_FILL_ENABLE)) +				goto fail; +		}  		break;  	case 0x4e04:  		/* RB3D_BLENDCNTL */  		track->blend_read_enable = !!(idx_value & (1 << 2));  		break; +	case 0x4f28: /* ZB_DEPTHCLEARVALUE */ +		break; +	case 0x4f30: /* ZB_MASK_OFFSET */ +	case 0x4f34: /* ZB_ZMASK_PITCH */ +	case 0x4f44: /* ZB_HIZ_OFFSET */ +	case 0x4f54: /* ZB_HIZ_PITCH */ +		if (idx_value && (p->rdev->hyperz_filp != p->filp)) +			goto fail; +		break; +	case 0x4028: +		if (idx_value && (p->rdev->hyperz_filp != p->filp)) +			goto fail; +		/* GB_Z_PEQ_CONFIG */ +		if (p->rdev->family >= CHIP_RV350) +			break; +		goto fail; +		break;  	case 0x4be8:  		/* valid register only on RV530 */  		if (p->rdev->family == CHIP_RV530) @@ -1066,8 +1099,8 @@ static int r300_packet0_check(struct radeon_cs_parser *p,  	}  	return 0;  fail: -	printk(KERN_ERR "Forbidden register 0x%04X in cs at %d\n", -	       reg, idx); +	printk(KERN_ERR "Forbidden register 0x%04X in cs at %d (val=%08x)\n", +	       reg, idx, idx_value);  	return -EINVAL;  } @@ -1161,6 +1194,11 @@ static int r300_packet3_check(struct radeon_cs_parser *p,  			return r;  		}  		break; +	case PACKET3_3D_CLEAR_HIZ: +	case PACKET3_3D_CLEAR_ZMASK: +		if (p->rdev->hyperz_filp != p->filp) +			return -EINVAL; +		break;  	case PACKET3_NOP:  		break;  	default: @@ -1380,6 +1418,8 @@ int r300_init(struct radeon_device *rdev)  	/* Initialize surface registers */  	radeon_surface_init(rdev);  	/* TODO: disable VGA need to use VGA request */ +	/* restore some register to sane defaults */ +	r100_restore_sanity(rdev);  	/* BIOS*/  	if (!radeon_get_bios(rdev)) {  		if (ASIC_IS_AVIVO(rdev)) diff --git a/drivers/gpu/drm/radeon/r300d.h b/drivers/gpu/drm/radeon/r300d.h index 968a33317fb..0c036c60d9d 100644 --- a/drivers/gpu/drm/radeon/r300d.h +++ b/drivers/gpu/drm/radeon/r300d.h @@ -48,10 +48,12 @@  #define		PACKET3_3D_DRAW_IMMD		0x29  #define		PACKET3_3D_DRAW_INDX		0x2A  #define		PACKET3_3D_LOAD_VBPNTR		0x2F +#define		PACKET3_3D_CLEAR_ZMASK		0x32  #define		PACKET3_INDX_BUFFER		0x33  #define		PACKET3_3D_DRAW_VBUF_2		0x34  #define		PACKET3_3D_DRAW_IMMD_2		0x35  #define		PACKET3_3D_DRAW_INDX_2		0x36 +#define		PACKET3_3D_CLEAR_HIZ		0x37  #define		PACKET3_BITBLT_MULTI		0x9B  #define PACKET0(reg, n)	(CP_PACKET0 |					\ diff --git a/drivers/gpu/drm/radeon/r420.c b/drivers/gpu/drm/radeon/r420.c index e6c89142bb4..59f7bccc5be 100644 --- a/drivers/gpu/drm/radeon/r420.c +++ b/drivers/gpu/drm/radeon/r420.c @@ -343,6 +343,8 @@ int r420_init(struct radeon_device *rdev)  	/* Initialize surface registers */  	radeon_surface_init(rdev);  	/* TODO: disable VGA need to use VGA request */ +	/* restore some register to sane defaults */ +	r100_restore_sanity(rdev);  	/* BIOS*/  	if (!radeon_get_bios(rdev)) {  		if (ASIC_IS_AVIVO(rdev)) diff --git a/drivers/gpu/drm/radeon/r500_reg.h b/drivers/gpu/drm/radeon/r500_reg.h index 93c9a2bbccf..6ac1f604e29 100644 --- a/drivers/gpu/drm/radeon/r500_reg.h +++ b/drivers/gpu/drm/radeon/r500_reg.h @@ -386,6 +386,11 @@  #       define AVIVO_D1GRPH_TILED                               (1 << 20)  #       define AVIVO_D1GRPH_MACRO_ADDRESS_MODE                  (1 << 21) +#       define R600_D1GRPH_ARRAY_MODE_LINEAR_GENERAL            (0 << 20) +#       define R600_D1GRPH_ARRAY_MODE_LINEAR_ALIGNED            (1 << 20) +#       define R600_D1GRPH_ARRAY_MODE_1D_TILED_THIN1            (2 << 20) +#       define R600_D1GRPH_ARRAY_MODE_2D_TILED_THIN1            (4 << 20) +  /* The R7xx *_HIGH surface regs are backwards; the D1 regs are in the D2   * block and vice versa.  This applies to GRPH, CUR, etc.   */ diff --git a/drivers/gpu/drm/radeon/r520.c b/drivers/gpu/drm/radeon/r520.c index 694af7cc23a..1458dee902d 100644 --- a/drivers/gpu/drm/radeon/r520.c +++ b/drivers/gpu/drm/radeon/r520.c @@ -231,6 +231,8 @@ int r520_init(struct radeon_device *rdev)  	radeon_scratch_init(rdev);  	/* Initialize surface registers */  	radeon_surface_init(rdev); +	/* restore some register to sane defaults */ +	r100_restore_sanity(rdev);  	/* TODO: disable VGA need to use VGA request */  	/* BIOS*/  	if (!radeon_get_bios(rdev)) { diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index e100f69faee..d0ebae9dde2 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c @@ -92,6 +92,21 @@ void r600_gpu_init(struct radeon_device *rdev);  void r600_fini(struct radeon_device *rdev);  void r600_irq_disable(struct radeon_device *rdev); +/* get temperature in millidegrees */ +u32 rv6xx_get_temp(struct radeon_device *rdev) +{ +	u32 temp = (RREG32(CG_THERMAL_STATUS) & ASIC_T_MASK) >> +		ASIC_T_SHIFT; +	u32 actual_temp = 0; + +	if ((temp >> 7) & 1) +		actual_temp = 0; +	else +		actual_temp = (temp >> 1) & 0xff; + +	return actual_temp * 1000; +} +  void r600_pm_get_dynpm_state(struct radeon_device *rdev)  {  	int i; @@ -256,7 +271,7 @@ void r600_pm_get_dynpm_state(struct radeon_device *rdev)  		}  	} -	DRM_DEBUG("Requested: e: %d m: %d p: %d\n", +	DRM_DEBUG_DRIVER("Requested: e: %d m: %d p: %d\n",  		  rdev->pm.power_state[rdev->pm.requested_power_state_index].  		  clock_info[rdev->pm.requested_clock_mode_index].sclk,  		  rdev->pm.power_state[rdev->pm.requested_power_state_index]. @@ -571,7 +586,7 @@ void r600_pm_misc(struct radeon_device *rdev)  		if (voltage->voltage != rdev->pm.current_vddc) {  			radeon_atom_set_voltage(rdev, voltage->voltage);  			rdev->pm.current_vddc = voltage->voltage; -			DRM_DEBUG("Setting: v: %d\n", voltage->voltage); +			DRM_DEBUG_DRIVER("Setting: v: %d\n", voltage->voltage);  		}  	}  } @@ -869,7 +884,17 @@ void r600_pcie_gart_tlb_flush(struct radeon_device *rdev)  	u32 tmp;  	/* flush hdp cache so updates hit vram */ -	WREG32(R_005480_HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1); +	if ((rdev->family >= CHIP_RV770) && (rdev->family <= CHIP_RV740)) { +		void __iomem *ptr = (void *)rdev->gart.table.vram.ptr; +		u32 tmp; + +		/* r7xx hw bug.  write to HDP_DEBUG1 followed by fb read +		 * rather than write to HDP_REG_COHERENCY_FLUSH_CNTL +		 */ +		WREG32(HDP_DEBUG1, 0); +		tmp = readl((void __iomem *)ptr); +	} else +		WREG32(R_005480_HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1);  	WREG32(VM_CONTEXT0_INVALIDATION_LOW_ADDR, rdev->mc.gtt_start >> 12);  	WREG32(VM_CONTEXT0_INVALIDATION_HIGH_ADDR, (rdev->mc.gtt_end - 1) >> 12); @@ -1217,8 +1242,8 @@ int r600_mc_init(struct radeon_device *rdev)  	}  	rdev->mc.vram_width = numchan * chansize;  	/* Could aper size report 0 ? */ -	rdev->mc.aper_base = drm_get_resource_start(rdev->ddev, 0); -	rdev->mc.aper_size = drm_get_resource_len(rdev->ddev, 0); +	rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0); +	rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);  	/* Setup GPU memory space */  	rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE);  	rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE); @@ -1609,7 +1634,7 @@ void r600_gpu_init(struct radeon_device *rdev)  							 r600_count_pipe_bits((cc_rb_backend_disable &  									       R6XX_MAX_BACKENDS_MASK) >> 16)),  							(cc_rb_backend_disable >> 16)); - +	rdev->config.r600.tile_config = tiling_config;  	tiling_config |= BACKEND_MAP(backend_map);  	WREG32(GB_TILING_CONFIG, tiling_config);  	WREG32(DCP_TILING_CONFIG, tiling_config & 0xffff); @@ -3512,5 +3537,15 @@ int r600_debugfs_mc_info_init(struct radeon_device *rdev)   */  void r600_ioctl_wait_idle(struct radeon_device *rdev, struct radeon_bo *bo)  { -	WREG32(R_005480_HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1); +	/* r7xx hw bug.  write to HDP_DEBUG1 followed by fb read +	 * rather than write to HDP_REG_COHERENCY_FLUSH_CNTL +	 */ +	if ((rdev->family >= CHIP_RV770) && (rdev->family <= CHIP_RV740)) { +		void __iomem *ptr = (void *)rdev->gart.table.vram.ptr; +		u32 tmp; + +		WREG32(HDP_DEBUG1, 0); +		tmp = readl((void __iomem *)ptr); +	} else +		WREG32(R_005480_HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1);  } diff --git a/drivers/gpu/drm/radeon/r600_audio.c b/drivers/gpu/drm/radeon/r600_audio.c index 2b26553c352..b5443fe1c1d 100644 --- a/drivers/gpu/drm/radeon/r600_audio.c +++ b/drivers/gpu/drm/radeon/r600_audio.c @@ -63,7 +63,8 @@ int r600_audio_bits_per_sample(struct radeon_device *rdev)  	case 0x4: return 32;  	} -	DRM_ERROR("Unknown bits per sample 0x%x using 16 instead.\n", (int)value); +	dev_err(rdev->dev, "Unknown bits per sample 0x%x using 16 instead\n", +		(int)value);  	return 16;  } @@ -150,7 +151,8 @@ static void r600_audio_update_hdmi(unsigned long param)  			r600_hdmi_update_audio_settings(encoder);  	} -	if(still_going) r600_audio_schedule_polling(rdev); +	if (still_going) +		r600_audio_schedule_polling(rdev);  }  /* @@ -158,8 +160,9 @@ static void r600_audio_update_hdmi(unsigned long param)   */  static void r600_audio_engine_enable(struct radeon_device *rdev, bool enable)  { -	DRM_INFO("%s audio support", enable ? "Enabling" : "Disabling"); +	DRM_INFO("%s audio support\n", enable ? "Enabling" : "Disabling");  	WREG32_P(R600_AUDIO_ENABLE, enable ? 0x81000000 : 0x0, ~0x81000000); +	rdev->audio_enabled = enable;  }  /* @@ -195,12 +198,14 @@ void r600_audio_enable_polling(struct drm_encoder *encoder)  	struct radeon_device *rdev = dev->dev_private;  	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); -	DRM_DEBUG("r600_audio_enable_polling: %d", radeon_encoder->audio_polling_active); +	DRM_DEBUG("r600_audio_enable_polling: %d\n", +		radeon_encoder->audio_polling_active);  	if (radeon_encoder->audio_polling_active)  		return;  	radeon_encoder->audio_polling_active = 1; -	mod_timer(&rdev->audio_timer, jiffies + 1); +	if (rdev->audio_enabled) +		mod_timer(&rdev->audio_timer, jiffies + 1);  }  /* @@ -209,7 +214,8 @@ void r600_audio_enable_polling(struct drm_encoder *encoder)  void r600_audio_disable_polling(struct drm_encoder *encoder)  {  	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); -	DRM_DEBUG("r600_audio_disable_polling: %d", radeon_encoder->audio_polling_active); +	DRM_DEBUG("r600_audio_disable_polling: %d\n", +		radeon_encoder->audio_polling_active);  	radeon_encoder->audio_polling_active = 0;  } @@ -236,7 +242,7 @@ void r600_audio_set_clock(struct drm_encoder *encoder, int clock)  		WREG32_P(R600_AUDIO_TIMING, 0x100, ~0x301);  		break;  	default: -		DRM_ERROR("Unsupported encoder type 0x%02X\n", +		dev_err(rdev->dev, "Unsupported encoder type 0x%02X\n",  			  radeon_encoder->encoder_id);  		return;  	} @@ -266,7 +272,7 @@ void r600_audio_set_clock(struct drm_encoder *encoder, int clock)   */  void r600_audio_fini(struct radeon_device *rdev)  { -	if (!radeon_audio || !r600_audio_chipset_supported(rdev)) +	if (!rdev->audio_enabled)  		return;  	del_timer(&rdev->audio_timer); diff --git a/drivers/gpu/drm/radeon/r600_blit_shaders.c b/drivers/gpu/drm/radeon/r600_blit_shaders.c index 0271b53fa2d..e8151c1d55b 100644 --- a/drivers/gpu/drm/radeon/r600_blit_shaders.c +++ b/drivers/gpu/drm/radeon/r600_blit_shaders.c @@ -39,37 +39,45 @@  const u32 r6xx_default_state[] =  { -	0xc0002400, +	0xc0002400, /* START_3D_CMDBUF */  	0x00000000, -	0xc0012800, + +	0xc0012800, /* CONTEXT_CONTROL */  	0x80000000,  	0x80000000, +  	0xc0016800,  	0x00000010, -	0x00008000, +	0x00008000, /* WAIT_UNTIL */ +  	0xc0016800,  	0x00000542, -	0x07000003, +	0x07000003, /* TA_CNTL_AUX */ +  	0xc0016800,  	0x000005c5, -	0x00000000, +	0x00000000, /* VC_ENHANCE */ +  	0xc0016800,  	0x00000363, -	0x00000000, +	0x00000000, /* SQ_DYN_GPR_CNTL_PS_FLUSH_REQ */ +  	0xc0016800,  	0x0000060c, -	0x82000000, +	0x82000000, /* DB_DEBUG */ +  	0xc0016800,  	0x0000060e, -	0x01020204, -	0xc0016f00, -	0x00000000, -	0x00000000, -	0xc0016f00, -	0x00000001, +	0x01020204, /* DB_WATERMARKS */ + +	0xc0026f00,  	0x00000000, +	0x00000000, /* SQ_VTX_BASE_VTX_LOC */ +	0x00000000, /* SQ_VTX_START_INST_LOC */ +  	0xc0096900,  	0x0000022a, +	0x00000000, /* SQ_ESGS_RING_ITEMSIZE */  	0x00000000,  	0x00000000,  	0x00000000, @@ -78,515 +86,317 @@ const u32 r6xx_default_state[] =  	0x00000000,  	0x00000000,  	0x00000000, -	0x00000000, +  	0xc0016900,  	0x00000004, -	0x00000000, -	0xc0016900, +	0x00000000, /* DB_DEPTH_INFO */ + +	0xc0026900,  	0x0000000a, -	0x00000000, -	0xc0016900, -	0x0000000b, -	0x00000000, -	0xc0016900, -	0x0000010c, -	0x00000000, -	0xc0016900, -	0x0000010d, -	0x00000000, +	0x00000000, /* DB_STENCIL_CLEAR */ +	0x00000000, /* DB_DEPTH_CLEAR */ +  	0xc0016900,  	0x00000200, -	0x00000000, -	0xc0016900, +	0x00000000, /* DB_DEPTH_CONTROL */ + +	0xc0026900,  	0x00000343, -	0x00000060, -	0xc0016900, -	0x00000344, -	0x00000040, +	0x00000060, /* DB_RENDER_CONTROL */ +	0x00000040, /* DB_RENDER_OVERRIDE */ +  	0xc0016900,  	0x00000351, -	0x0000aa00, -	0xc0016900, -	0x00000104, -	0x00000000, -	0xc0016900, -	0x0000010e, -	0x00000000, -	0xc0046900, -	0x00000105, -	0x00000000, -	0x00000000, +	0x0000aa00, /* DB_ALPHA_TO_MASK */ + +	0xc00f6900, +	0x00000100, +	0x00000800, /* VGT_MAX_VTX_INDX */ +	0x00000000, /* VGT_MIN_VTX_INDX */ +	0x00000000, /* VGT_INDX_OFFSET */ +	0x00000000, /* VGT_MULTI_PRIM_IB_RESET_INDX */ +	0x00000000, /* SX_ALPHA_TEST_CONTROL */ +	0x00000000, /* CB_BLEND_RED */  	0x00000000,  	0x00000000, -	0xc0036900, -	0x00000109,  	0x00000000, +	0x00000000, /* CB_FOG_RED */  	0x00000000,  	0x00000000, +	0x00000000, /* DB_STENCILREFMASK */ +	0x00000000, /* DB_STENCILREFMASK_BF */ +	0x00000000, /* SX_ALPHA_REF */ +  	0xc0046900,  	0x0000030c, -	0x01000000, +	0x01000000, /* CB_CLRCMP_CNTL */  	0x00000000,  	0x00000000,  	0x00000000, +  	0xc0046900,  	0x00000048, -	0x3f800000, +	0x3f800000, /* CB_CLEAR_RED */  	0x00000000,  	0x3f800000,  	0x3f800000, -	0xc0016900, -	0x0000008e, -	0x0000000f, +  	0xc0016900,  	0x00000080, -	0x00000000, -	0xc0016900, +	0x00000000, /* PA_SC_WINDOW_OFFSET */ + +	0xc00a6900,  	0x00000083, -	0x0000ffff, -	0xc0016900, -	0x00000084, -	0x00000000, -	0xc0016900, -	0x00000085, +	0x0000ffff, /* PA_SC_CLIP_RECT_RULE */ +	0x00000000, /* PA_SC_CLIPRECT_0_TL */  	0x20002000, -	0xc0016900, -	0x00000086,  	0x00000000, -	0xc0016900, -	0x00000087,  	0x20002000, -	0xc0016900, -	0x00000088,  	0x00000000, -	0xc0016900, -	0x00000089,  	0x20002000, -	0xc0016900, -	0x0000008a,  	0x00000000, -	0xc0016900, -	0x0000008b,  	0x20002000, -	0xc0016900, -	0x0000008c, -	0x00000000, -	0xc0016900, +	0x00000000, /* PA_SC_EDGERULE */ + +	0xc0406900,  	0x00000094, -	0x80000000, -	0xc0016900, -	0x00000095, +	0x80000000, /* PA_SC_VPORT_SCISSOR_0_TL */ +	0x20002000, /* PA_SC_VPORT_SCISSOR_0_BR */ +	0x80000000, /* PA_SC_VPORT_SCISSOR_1_TL */  	0x20002000, -	0xc0026900, -	0x000000b4, -	0x00000000, -	0x3f800000, -	0xc0016900, -	0x00000096,  	0x80000000, -	0xc0016900, -	0x00000097,  	0x20002000, -	0xc0026900, -	0x000000b6, -	0x00000000, -	0x3f800000, -	0xc0016900, -	0x00000098,  	0x80000000, -	0xc0016900, -	0x00000099,  	0x20002000, -	0xc0026900, -	0x000000b8, -	0x00000000, -	0x3f800000, -	0xc0016900, -	0x0000009a,  	0x80000000, -	0xc0016900, -	0x0000009b,  	0x20002000, -	0xc0026900, -	0x000000ba, -	0x00000000, -	0x3f800000, -	0xc0016900, -	0x0000009c,  	0x80000000, -	0xc0016900, -	0x0000009d,  	0x20002000, -	0xc0026900, -	0x000000bc, -	0x00000000, -	0x3f800000, -	0xc0016900, -	0x0000009e,  	0x80000000, -	0xc0016900, -	0x0000009f,  	0x20002000, -	0xc0026900, -	0x000000be, -	0x00000000, -	0x3f800000, -	0xc0016900, -	0x000000a0,  	0x80000000, -	0xc0016900, -	0x000000a1,  	0x20002000, -	0xc0026900, -	0x000000c0, -	0x00000000, -	0x3f800000, -	0xc0016900, -	0x000000a2,  	0x80000000, -	0xc0016900, -	0x000000a3,  	0x20002000, -	0xc0026900, -	0x000000c2, -	0x00000000, -	0x3f800000, -	0xc0016900, -	0x000000a4,  	0x80000000, -	0xc0016900, -	0x000000a5,  	0x20002000, -	0xc0026900, -	0x000000c4, -	0x00000000, -	0x3f800000, -	0xc0016900, -	0x000000a6,  	0x80000000, -	0xc0016900, -	0x000000a7,  	0x20002000, -	0xc0026900, -	0x000000c6, -	0x00000000, -	0x3f800000, -	0xc0016900, -	0x000000a8,  	0x80000000, -	0xc0016900, -	0x000000a9,  	0x20002000, -	0xc0026900, -	0x000000c8, -	0x00000000, -	0x3f800000, -	0xc0016900, -	0x000000aa,  	0x80000000, -	0xc0016900, -	0x000000ab,  	0x20002000, -	0xc0026900, -	0x000000ca, -	0x00000000, -	0x3f800000, -	0xc0016900, -	0x000000ac,  	0x80000000, -	0xc0016900, -	0x000000ad,  	0x20002000, -	0xc0026900, -	0x000000cc, -	0x00000000, -	0x3f800000, -	0xc0016900, -	0x000000ae,  	0x80000000, -	0xc0016900, -	0x000000af,  	0x20002000, -	0xc0026900, -	0x000000ce, -	0x00000000, -	0x3f800000, -	0xc0016900, -	0x000000b0,  	0x80000000, -	0xc0016900, -	0x000000b1,  	0x20002000, -	0xc0026900, -	0x000000d0, -	0x00000000, +	0x00000000, /* PA_SC_VPORT_ZMIN_0 */  	0x3f800000, -	0xc0016900, -	0x000000b2, -	0x80000000, -	0xc0016900, -	0x000000b3, -	0x20002000, -	0xc0026900, -	0x000000d2,  	0x00000000,  	0x3f800000, -	0xc0016900, -	0x00000293, -	0x00004010, -	0xc0016900, -	0x00000300,  	0x00000000, -	0xc0016900, -	0x00000301, -	0x00000000, -	0xc0016900, -	0x00000312, -	0xffffffff, -	0xc0016900, -	0x00000307, +	0x3f800000,  	0x00000000, -	0xc0016900, -	0x00000308, +	0x3f800000,  	0x00000000, -	0xc0016900, -	0x00000283, +	0x3f800000,  	0x00000000, -	0xc0016900, -	0x00000292, +	0x3f800000,  	0x00000000, -	0xc0066900, -	0x0000010f, +	0x3f800000,  	0x00000000, +	0x3f800000,  	0x00000000, +	0x3f800000,  	0x00000000, +	0x3f800000,  	0x00000000, +	0x3f800000,  	0x00000000, +	0x3f800000,  	0x00000000, -	0xc0016900, -	0x00000206, +	0x3f800000,  	0x00000000, -	0xc0016900, -	0x00000207, +	0x3f800000,  	0x00000000, -	0xc0016900, -	0x00000208, +	0x3f800000,  	0x00000000, -	0xc0046900, -	0x00000303,  	0x3f800000, + +	0xc0026900, +	0x00000292, +	0x00000000, /* PA_SC_MPASS_PS_CNTL */ +	0x00004010, /* PA_SC_MODE_CNTL */ + +	0xc0096900, +	0x00000300, +	0x00000000, /* PA_SC_LINE_CNTL */ +	0x00000000, /* PA_SC_AA_CONFIG */ +	0x0000002d, /* PA_SU_VTX_CNTL */ +	0x3f800000, /* PA_CL_GB_VERT_CLIP_ADJ */  	0x3f800000,  	0x3f800000,  	0x3f800000, -	0xc0016900, -	0x00000205, -	0x00000004, -	0xc0016900, -	0x00000280, -	0x00000000, -	0xc0016900, -	0x00000281, +	0x00000000, /* PA_SC_SAMPLE_LOCS_MCTX */  	0x00000000, +  	0xc0016900, +	0x00000312, +	0xffffffff, /* PA_SC_AA_MASK */ + +	0xc0066900,  	0x0000037e, -	0x00000000, -	0xc0016900, -	0x00000382, -	0x00000000, -	0xc0016900, -	0x00000380, -	0x00000000, -	0xc0016900, -	0x00000383, -	0x00000000, -	0xc0016900, -	0x00000381, -	0x00000000, -	0xc0016900, -	0x00000282, -	0x00000008, -	0xc0016900, -	0x00000302, -	0x0000002d, -	0xc0016900, -	0x0000037f, -	0x00000000, -	0xc0016900, -	0x000001b2, -	0x00000000, -	0xc0016900, +	0x00000000, /* PA_SU_POLY_OFFSET_DB_FMT_CNTL */ +	0x00000000, /* PA_SU_POLY_OFFSET_CLAMP */ +	0x00000000, /* PA_SU_POLY_OFFSET_FRONT_SCALE */ +	0x00000000, /* PA_SU_POLY_OFFSET_FRONT_OFFSET */ +	0x00000000, /* PA_SU_POLY_OFFSET_BACK_SCALE */ +	0x00000000, /* PA_SU_POLY_OFFSET_BACK_OFFSET */ + +	0xc0046900,  	0x000001b6, -	0x00000000, -	0xc0016900, -	0x000001b7, -	0x00000000, -	0xc0016900, -	0x000001b8, -	0x00000000, -	0xc0016900, -	0x000001b9, -	0x00000000, +	0x00000000, /* SPI_INPUT_Z */ +	0x00000000, /* SPI_FOG_CNTL */ +	0x00000000, /* SPI_FOG_FUNC_SCALE */ +	0x00000000, /* SPI_FOG_FUNC_BIAS */ +  	0xc0016900,  	0x00000225, -	0x00000000, +	0x00000000, /* SQ_PGM_START_FS */ +  	0xc0016900,  	0x00000229, -	0x00000000, +	0x00000000, /* SQ_PGM_RESOURCES_FS */ +  	0xc0016900,  	0x00000237, -	0x00000000, -	0xc0016900, -	0x00000100, -	0x00000800, -	0xc0016900, -	0x00000101, -	0x00000000, -	0xc0016900, -	0x00000102, -	0x00000000, -	0xc0016900, +	0x00000000, /* SQ_PGM_CF_OFFSET_FS */ + +	0xc0026900,  	0x000002a8, -	0x00000000, -	0xc0016900, -	0x000002a9, -	0x00000000, -	0xc0016900, -	0x00000103, -	0x00000000, -	0xc0016900, -	0x00000284, -	0x00000000, -	0xc0016900, -	0x00000290, -	0x00000000, -	0xc0016900, -	0x00000285, -	0x00000000, -	0xc0016900, -	0x00000286, -	0x00000000, -	0xc0016900, -	0x00000287, -	0x00000000, -	0xc0016900, -	0x00000288, -	0x00000000, -	0xc0016900, -	0x00000289, -	0x00000000, -	0xc0016900, -	0x0000028a, -	0x00000000, -	0xc0016900, -	0x0000028b, -	0x00000000, -	0xc0016900, -	0x0000028c, -	0x00000000, -	0xc0016900, -	0x0000028d, -	0x00000000, -	0xc0016900, -	0x0000028e, -	0x00000000, -	0xc0016900, -	0x0000028f, -	0x00000000, +	0x00000000, /* VGT_INSTANCE_STEP_RATE_0 */ +	0x00000000, /* VGT_INSTANCE_STEP_RATE_1 */ + +	0xc0116900, +	0x00000280, +	0x00000000, /* PA_SU_POINT_SIZE */ +	0x00000000, /* PA_SU_POINT_MINMAX */ +	0x00000008, /* PA_SU_LINE_CNTL */ +	0x00000000, /* PA_SC_LINE_STIPPLE */ +	0x00000000, /* VGT_OUTPUT_PATH_CNTL */ +	0x00000000, /* VGT_HOS_CNTL */ +	0x00000000, /* VGT_HOS_MAX_TESS_LEVEL */ +	0x00000000, /* VGT_HOS_MIN_TESS_LEVEL */ +	0x00000000, /* VGT_HOS_REUSE_DEPTH */ +	0x00000000, /* VGT_GROUP_PRIM_TYPE */ +	0x00000000, /* VGT_GROUP_FIRST_DECR */ +	0x00000000, /* VGT_GROUP_DECR */ +	0x00000000, /* VGT_GROUP_VECT_0_CNTL */ +	0x00000000, /* VGT_GROUP_VECT_1_CNTL */ +	0x00000000, /* VGT_GROUP_VECT_0_FMT_CNTL */ +	0x00000000, /* VGT_GROUP_VECT_1_FMT_CNTL */ +	0x00000000, /* VGT_GS_MODE */ +  	0xc0016900,  	0x000002a1, -	0x00000000, +	0x00000000, /* VGT_PRIMITIVEID_EN */ +  	0xc0016900,  	0x000002a5, -	0x00000000, -	0xc0016900, +	0x00000000, /* VGT_MULTI_PRIM_ID_RESET_EN */ + +	0xc0036900,  	0x000002ac, -	0x00000000, -	0xc0016900, -	0x000002ad, -	0x00000000, -	0xc0016900, -	0x000002ae, -	0x00000000, +	0x00000000, /* VGT_STRMOUT_EN */ +	0x00000000, /* VGT_REUSE_OFF */ +	0x00000000, /* VGT_VTX_CNT_EN */ +  	0xc0016900,  	0x000002c8, -	0x00000000, -	0xc0016900, -	0x00000206, -	0x00000100, -	0xc0016900, -	0x00000204, -	0x00010000, -	0xc0036e00, -	0x00000000, -	0x00000012, -	0x00000000, -	0x00000000, -	0xc0016900, -	0x0000008f, -	0x0000000f, -	0xc0016900, -	0x000001e8, -	0x00000001, -	0xc0016900, +	0x00000000, /* VGT_STRMOUT_BUFFER_EN */ + +	0xc0076900,  	0x00000202, -	0x00cc0000, +	0x00cc0000, /* CB_COLOR_CONTROL */ +	0x00000210, /* DB_SHADER_CNTL */ +	0x00010000, /* PA_CL_CLIP_CNTL */ +	0x00000244, /* PA_SU_SC_MODE_CNTL */ +	0x00000100, /* PA_CL_VTE_CNTL */ +	0x00000000, /* PA_CL_VS_OUT_CNTL */ +	0x00000000, /* PA_CL_NANINF_CNTL */ + +	0xc0026900, +	0x0000008e, +	0x0000000f, /* CB_TARGET_MASK */ +	0x0000000f, /* CB_SHADER_MASK */ +  	0xc0016900, -	0x00000205, -	0x00000244, +	0x000001e8, +	0x00000001, /* CB_SHADER_CONTROL */ +  	0xc0016900, -	0x00000203, -	0x00000210, +	0x00000185, +	0x00000000, /* SPI_VS_OUT_ID_0 */ +  	0xc0016900, +	0x00000191, +	0x00000b00, /* SPI_PS_INPUT_CNTL_0 */ + +	0xc0056900,  	0x000001b1, +	0x00000000, /* SPI_VS_OUT_CONFIG */ +	0x00000000, /* SPI_THREAD_GROUPING */ +	0x00000001, /* SPI_PS_IN_CONTROL_0 */ +	0x00000000, /* SPI_PS_IN_CONTROL_1 */ +	0x00000000, /* SPI_INTERP_CONTROL_0 */ + +	0xc0036e00, /* SET_SAMPLER */  	0x00000000, -	0xc0016900, -	0x00000185, -	0x00000000, -	0xc0016900, -	0x000001b3, -	0x00000001, -	0xc0016900, -	0x000001b4, +	0x00000012,  	0x00000000, -	0xc0016900, -	0x00000191, -	0x00000b00, -	0xc0016900, -	0x000001b5,  	0x00000000,  };  const u32 r7xx_default_state[] =  { -	0xc0012800, +	0xc0012800, /* CONTEXT_CONTROL */  	0x80000000,  	0x80000000, +  	0xc0016800,  	0x00000010, -	0x00008000, +	0x00008000, /* WAIT_UNTIL */ +  	0xc0016800,  	0x00000542, -	0x07000002, +	0x07000002, /* TA_CNTL_AUX */ +  	0xc0016800,  	0x000005c5, -	0x00000000, +	0x00000000, /* VC_ENHANCE */ +  	0xc0016800,  	0x00000363, -	0x00004000, +	0x00004000, /* SQ_DYN_GPR_CNTL_PS_FLUSH_REQ */ +  	0xc0016800,  	0x0000060c, -	0x00000000, +	0x00000000, /* DB_DEBUG */ +  	0xc0016800,  	0x0000060e, -	0x00420204, -	0xc0016f00, -	0x00000000, -	0x00000000, -	0xc0016f00, -	0x00000001, +	0x00420204, /* DB_WATERMARKS */ + +	0xc0026f00,  	0x00000000, +	0x00000000, /* SQ_VTX_BASE_VTX_LOC */ +	0x00000000, /* SQ_VTX_START_INST_LOC */ +  	0xc0096900,  	0x0000022a, +	0x00000000, /* SQ_ESGS_RING_ITEMSIZE */  	0x00000000,  	0x00000000,  	0x00000000, @@ -595,470 +405,269 @@ const u32 r7xx_default_state[] =  	0x00000000,  	0x00000000,  	0x00000000, -	0x00000000, +  	0xc0016900,  	0x00000004, -	0x00000000, -	0xc0016900, +	0x00000000, /* DB_DEPTH_INFO */ + +	0xc0026900,  	0x0000000a, -	0x00000000, -	0xc0016900, -	0x0000000b, -	0x00000000, -	0xc0016900, -	0x0000010c, -	0x00000000, -	0xc0016900, -	0x0000010d, -	0x00000000, +	0x00000000, /* DB_STENCIL_CLEAR */ +	0x00000000, /* DB_DEPTH_CLEAR */ +  	0xc0016900,  	0x00000200, -	0x00000000, -	0xc0016900, +	0x00000000, /* DB_DEPTH_CONTROL */ + +	0xc0026900,  	0x00000343, -	0x00000060, -	0xc0016900, -	0x00000344, -	0x00000000, +	0x00000060, /* DB_RENDER_CONTROL */ +	0x00000000, /* DB_RENDER_OVERRIDE */ +  	0xc0016900,  	0x00000351, -	0x0000aa00, -	0xc0016900, -	0x00000104, -	0x00000000, -	0xc0016900, -	0x0000010e, -	0x00000000, -	0xc0046900, -	0x00000105, -	0x00000000, +	0x0000aa00, /* DB_ALPHA_TO_MASK */ + +	0xc0096900, +	0x00000100, +	0x00000800, /* VGT_MAX_VTX_INDX */ +	0x00000000, /* VGT_MIN_VTX_INDX */ +	0x00000000, /* VGT_INDX_OFFSET */ +	0x00000000, /* VGT_MULTI_PRIM_IB_RESET_INDX */ +	0x00000000, /* SX_ALPHA_TEST_CONTROL */ +	0x00000000, /* CB_BLEND_RED */  	0x00000000,  	0x00000000,  	0x00000000, + +	0xc0036900, +	0x0000010c, +	0x00000000, /* DB_STENCILREFMASK */ +	0x00000000, /* DB_STENCILREFMASK_BF */ +	0x00000000, /* SX_ALPHA_REF */ +  	0xc0046900, -	0x0000030c, +	0x0000030c, /* CB_CLRCMP_CNTL */  	0x01000000,  	0x00000000,  	0x00000000,  	0x00000000, -	0xc0016900, -	0x0000008e, -	0x0000000f, +  	0xc0016900,  	0x00000080, -	0x00000000, -	0xc0016900, +	0x00000000, /* PA_SC_WINDOW_OFFSET */ + +	0xc00a6900,  	0x00000083, -	0x0000ffff, -	0xc0016900, -	0x00000084, -	0x00000000, -	0xc0016900, -	0x00000085, +	0x0000ffff, /* PA_SC_CLIP_RECT_RULE */ +	0x00000000, /* PA_SC_CLIPRECT_0_TL */  	0x20002000, -	0xc0016900, -	0x00000086,  	0x00000000, -	0xc0016900, -	0x00000087,  	0x20002000, -	0xc0016900, -	0x00000088,  	0x00000000, -	0xc0016900, -	0x00000089,  	0x20002000, -	0xc0016900, -	0x0000008a,  	0x00000000, -	0xc0016900, -	0x0000008b,  	0x20002000, -	0xc0016900, -	0x0000008c, -	0xaaaaaaaa, -	0xc0016900, +	0xaaaaaaaa, /* PA_SC_EDGERULE */ + +	0xc0406900,  	0x00000094, -	0x80000000, -	0xc0016900, -	0x00000095, +	0x80000000, /* PA_SC_VPORT_SCISSOR_0_TL */ +	0x20002000, /* PA_SC_VPORT_SCISSOR_0_BR */ +	0x80000000, /* PA_SC_VPORT_SCISSOR_1_TL */  	0x20002000, -	0xc0026900, -	0x000000b4, -	0x00000000, -	0x3f800000, -	0xc0016900, -	0x00000096,  	0x80000000, -	0xc0016900, -	0x00000097,  	0x20002000, -	0xc0026900, -	0x000000b6, -	0x00000000, -	0x3f800000, -	0xc0016900, -	0x00000098,  	0x80000000, -	0xc0016900, -	0x00000099,  	0x20002000, -	0xc0026900, -	0x000000b8, -	0x00000000, -	0x3f800000, -	0xc0016900, -	0x0000009a,  	0x80000000, -	0xc0016900, -	0x0000009b,  	0x20002000, -	0xc0026900, -	0x000000ba, -	0x00000000, -	0x3f800000, -	0xc0016900, -	0x0000009c,  	0x80000000, -	0xc0016900, -	0x0000009d,  	0x20002000, -	0xc0026900, -	0x000000bc, -	0x00000000, -	0x3f800000, -	0xc0016900, -	0x0000009e,  	0x80000000, -	0xc0016900, -	0x0000009f,  	0x20002000, -	0xc0026900, -	0x000000be, -	0x00000000, -	0x3f800000, -	0xc0016900, -	0x000000a0,  	0x80000000, -	0xc0016900, -	0x000000a1,  	0x20002000, -	0xc0026900, -	0x000000c0, -	0x00000000, -	0x3f800000, -	0xc0016900, -	0x000000a2,  	0x80000000, -	0xc0016900, -	0x000000a3,  	0x20002000, -	0xc0026900, -	0x000000c2, -	0x00000000, -	0x3f800000, -	0xc0016900, -	0x000000a4,  	0x80000000, -	0xc0016900, -	0x000000a5,  	0x20002000, -	0xc0026900, -	0x000000c4, -	0x00000000, -	0x3f800000, -	0xc0016900, -	0x000000a6,  	0x80000000, -	0xc0016900, -	0x000000a7,  	0x20002000, -	0xc0026900, -	0x000000c6, -	0x00000000, -	0x3f800000, -	0xc0016900, -	0x000000a8,  	0x80000000, -	0xc0016900, -	0x000000a9,  	0x20002000, -	0xc0026900, -	0x000000c8, -	0x00000000, -	0x3f800000, -	0xc0016900, -	0x000000aa,  	0x80000000, -	0xc0016900, -	0x000000ab,  	0x20002000, -	0xc0026900, -	0x000000ca, -	0x00000000, -	0x3f800000, -	0xc0016900, -	0x000000ac,  	0x80000000, -	0xc0016900, -	0x000000ad,  	0x20002000, -	0xc0026900, -	0x000000cc, -	0x00000000, -	0x3f800000, -	0xc0016900, -	0x000000ae,  	0x80000000, -	0xc0016900, -	0x000000af,  	0x20002000, -	0xc0026900, -	0x000000ce, -	0x00000000, -	0x3f800000, -	0xc0016900, -	0x000000b0,  	0x80000000, -	0xc0016900, -	0x000000b1,  	0x20002000, -	0xc0026900, -	0x000000d0, -	0x00000000, +	0x00000000, /* PA_SC_VPORT_ZMIN_0 */  	0x3f800000, -	0xc0016900, -	0x000000b2, -	0x80000000, -	0xc0016900, -	0x000000b3, -	0x20002000, -	0xc0026900, -	0x000000d2,  	0x00000000,  	0x3f800000, -	0xc0016900, -	0x00000293, -	0x00514000, -	0xc0016900, -	0x00000300, -	0x00000000, -	0xc0016900, -	0x00000301,  	0x00000000, -	0xc0016900, -	0x00000312, -	0xffffffff, -	0xc0016900, -	0x00000307, +	0x3f800000,  	0x00000000, -	0xc0016900, -	0x00000308, +	0x3f800000,  	0x00000000, -	0xc0016900, -	0x00000283, +	0x3f800000,  	0x00000000, -	0xc0016900, -	0x00000292, +	0x3f800000,  	0x00000000, -	0xc0066900, -	0x0000010f, +	0x3f800000,  	0x00000000, +	0x3f800000,  	0x00000000, +	0x3f800000,  	0x00000000, +	0x3f800000,  	0x00000000, +	0x3f800000,  	0x00000000, +	0x3f800000,  	0x00000000, -	0xc0016900, -	0x00000206, +	0x3f800000,  	0x00000000, -	0xc0016900, -	0x00000207, +	0x3f800000,  	0x00000000, -	0xc0016900, -	0x00000208, +	0x3f800000,  	0x00000000, -	0xc0046900, -	0x00000303,  	0x3f800000, + +	0xc0026900, +	0x00000292, +	0x00000000, /* PA_SC_MPASS_PS_CNTL */ +	0x00514000, /* PA_SC_MODE_CNTL */ + +	0xc0096900, +	0x00000300, +	0x00000000, /* PA_SC_LINE_CNTL */ +	0x00000000, /* PA_SC_AA_CONFIG */ +	0x0000002d, /* PA_SU_VTX_CNTL */ +	0x3f800000, /* PA_CL_GB_VERT_CLIP_ADJ */  	0x3f800000,  	0x3f800000,  	0x3f800000, -	0xc0016900, -	0x00000205, -	0x00000004, -	0xc0016900, -	0x00000280, -	0x00000000, -	0xc0016900, -	0x00000281, +	0x00000000, /* PA_SC_SAMPLE_LOCS_MCTX */  	0x00000000, +  	0xc0016900, +	0x00000312, +	0xffffffff, /* PA_SC_AA_MASK */ + +	0xc0066900,  	0x0000037e, -	0x00000000, -	0xc0016900, -	0x00000382, -	0x00000000, -	0xc0016900, -	0x00000380, -	0x00000000, -	0xc0016900, -	0x00000383, -	0x00000000, -	0xc0016900, -	0x00000381, -	0x00000000, -	0xc0016900, -	0x00000282, -	0x00000008, -	0xc0016900, -	0x00000302, -	0x0000002d, -	0xc0016900, -	0x0000037f, -	0x00000000, -	0xc0016900, -	0x000001b2, -	0x00000001, -	0xc0016900, +	0x00000000, /* PA_SU_POLY_OFFSET_DB_FMT_CNTL */ +	0x00000000, /* PA_SU_POLY_OFFSET_CLAMP */ +	0x00000000, /* PA_SU_POLY_OFFSET_FRONT_SCALE */ +	0x00000000, /* PA_SU_POLY_OFFSET_FRONT_OFFSET */ +	0x00000000, /* PA_SU_POLY_OFFSET_BACK_SCALE */ +	0x00000000, /* PA_SU_POLY_OFFSET_BACK_OFFSET */ + +	0xc0046900,  	0x000001b6, -	0x00000000, -	0xc0016900, -	0x000001b7, -	0x00000000, -	0xc0016900, -	0x000001b8, -	0x00000000, -	0xc0016900, -	0x000001b9, -	0x00000000, +	0x00000000, /* SPI_INPUT_Z */ +	0x00000000, /* SPI_FOG_CNTL */ +	0x00000000, /* SPI_FOG_FUNC_SCALE */ +	0x00000000, /* SPI_FOG_FUNC_BIAS */ +  	0xc0016900,  	0x00000225, -	0x00000000, +	0x00000000, /* SQ_PGM_START_FS */ +  	0xc0016900,  	0x00000229, -	0x00000000, +	0x00000000, /* SQ_PGM_RESOURCES_FS */ +  	0xc0016900,  	0x00000237, -	0x00000000, -	0xc0016900, -	0x00000100, -	0x00000800, -	0xc0016900, -	0x00000101, -	0x00000000, -	0xc0016900, -	0x00000102, -	0x00000000, -	0xc0016900, +	0x00000000, /* SQ_PGM_CF_OFFSET_FS */ + +	0xc0026900,  	0x000002a8, -	0x00000000, -	0xc0016900, -	0x000002a9, -	0x00000000, -	0xc0016900, -	0x00000103, -	0x00000000, -	0xc0016900, -	0x00000284, -	0x00000000, -	0xc0016900, -	0x00000290, -	0x00000000, -	0xc0016900, -	0x00000285, -	0x00000000, -	0xc0016900, -	0x00000286, -	0x00000000, -	0xc0016900, -	0x00000287, -	0x00000000, -	0xc0016900, -	0x00000288, -	0x00000000, -	0xc0016900, -	0x00000289, -	0x00000000, -	0xc0016900, -	0x0000028a, -	0x00000000, -	0xc0016900, -	0x0000028b, -	0x00000000, -	0xc0016900, -	0x0000028c, -	0x00000000, -	0xc0016900, -	0x0000028d, -	0x00000000, -	0xc0016900, -	0x0000028e, -	0x00000000, -	0xc0016900, -	0x0000028f, -	0x00000000, +	0x00000000, /* VGT_INSTANCE_STEP_RATE_0 */ +	0x00000000, /* VGT_INSTANCE_STEP_RATE_1 */ + +	0xc0116900, +	0x00000280, +	0x00000000, /* PA_SU_POINT_SIZE */ +	0x00000000, /* PA_SU_POINT_MINMAX */ +	0x00000008, /* PA_SU_LINE_CNTL */ +	0x00000000, /* PA_SC_LINE_STIPPLE */ +	0x00000000, /* VGT_OUTPUT_PATH_CNTL */ +	0x00000000, /* VGT_HOS_CNTL */ +	0x00000000, /* VGT_HOS_MAX_TESS_LEVEL */ +	0x00000000, /* VGT_HOS_MIN_TESS_LEVEL */ +	0x00000000, /* VGT_HOS_REUSE_DEPTH */ +	0x00000000, /* VGT_GROUP_PRIM_TYPE */ +	0x00000000, /* VGT_GROUP_FIRST_DECR */ +	0x00000000, /* VGT_GROUP_DECR */ +	0x00000000, /* VGT_GROUP_VECT_0_CNTL */ +	0x00000000, /* VGT_GROUP_VECT_1_CNTL */ +	0x00000000, /* VGT_GROUP_VECT_0_FMT_CNTL */ +	0x00000000, /* VGT_GROUP_VECT_1_FMT_CNTL */ +	0x00000000, /* VGT_GS_MODE */ +  	0xc0016900,  	0x000002a1, -	0x00000000, +	0x00000000, /* VGT_PRIMITIVEID_EN */ +  	0xc0016900,  	0x000002a5, -	0x00000000, -	0xc0016900, +	0x00000000, /* VGT_MULTI_PRIM_ID_RESET_EN */ + +	0xc0036900,  	0x000002ac, -	0x00000000, -	0xc0016900, -	0x000002ad, -	0x00000000, -	0xc0016900, -	0x000002ae, -	0x00000000, +	0x00000000, /* VGT_STRMOUT_EN */ +	0x00000000, /* VGT_REUSE_OFF */ +	0x00000000, /* VGT_VTX_CNT_EN */ +  	0xc0016900,  	0x000002c8, -	0x00000000, -	0xc0016900, -	0x00000206, -	0x00000100, -	0xc0016900, -	0x00000204, -	0x00010000, -	0xc0036e00, -	0x00000000, -	0x00000012, -	0x00000000, -	0x00000000, -	0xc0016900, -	0x0000008f, -	0x0000000f, -	0xc0016900, -	0x000001e8, -	0x00000001, -	0xc0016900, +	0x00000000, /* VGT_STRMOUT_BUFFER_EN */ + +	0xc0076900,  	0x00000202, -	0x00cc0000, +	0x00cc0000, /* CB_COLOR_CONTROL */ +	0x00000210, /* DB_SHADER_CNTL */ +	0x00010000, /* PA_CL_CLIP_CNTL */ +	0x00000244, /* PA_SU_SC_MODE_CNTL */ +	0x00000100, /* PA_CL_VTE_CNTL */ +	0x00000000, /* PA_CL_VS_OUT_CNTL */ +	0x00000000, /* PA_CL_NANINF_CNTL */ + +	0xc0026900, +	0x0000008e, +	0x0000000f, /* CB_TARGET_MASK */ +	0x0000000f, /* CB_SHADER_MASK */ +  	0xc0016900, -	0x00000205, -	0x00000244, +	0x000001e8, +	0x00000001, /* CB_SHADER_CONTROL */ +  	0xc0016900, -	0x00000203, -	0x00000210, +	0x00000185, +	0x00000000, /* SPI_VS_OUT_ID_0 */ +  	0xc0016900, +	0x00000191, +	0x00000b00, /* SPI_PS_INPUT_CNTL_0 */ + +	0xc0056900,  	0x000001b1, +	0x00000000, /* SPI_VS_OUT_CONFIG */ +	0x00000001, /* SPI_THREAD_GROUPING */ +	0x00000001, /* SPI_PS_IN_CONTROL_0 */ +	0x00000000, /* SPI_PS_IN_CONTROL_1 */ +	0x00000000, /* SPI_INTERP_CONTROL_0 */ + +	0xc0036e00, /* SET_SAMPLER */  	0x00000000, -	0xc0016900, -	0x00000185, -	0x00000000, -	0xc0016900, -	0x000001b3, -	0x00000001, -	0xc0016900, -	0x000001b4, +	0x00000012,  	0x00000000, -	0xc0016900, -	0x00000191, -	0x00000b00, -	0xc0016900, -	0x000001b5,  	0x00000000,  }; diff --git a/drivers/gpu/drm/radeon/r600_cs.c b/drivers/gpu/drm/radeon/r600_cs.c index 144c32d3713..c3ea212e0c3 100644 --- a/drivers/gpu/drm/radeon/r600_cs.c +++ b/drivers/gpu/drm/radeon/r600_cs.c @@ -25,6 +25,7 @@   *          Alex Deucher   *          Jerome Glisse   */ +#include <linux/kernel.h>  #include "drmP.h"  #include "radeon.h"  #include "r600d.h" @@ -166,7 +167,7 @@ static void r600_cs_track_init(struct r600_cs_track *track)  static inline int r600_cs_track_validate_cb(struct radeon_cs_parser *p, int i)  {  	struct r600_cs_track *track = p->track; -	u32 bpe = 0, pitch, slice_tile_max, size, tmp, height; +	u32 bpe = 0, pitch, slice_tile_max, size, tmp, height, pitch_align;  	volatile u32 *ib = p->ib->ptr;  	if (G_0280A0_TILE_MODE(track->cb_color_info[i])) { @@ -180,56 +181,57 @@ static inline int r600_cs_track_validate_cb(struct radeon_cs_parser *p, int i)  			i, track->cb_color_info[i]);  		return -EINVAL;  	} -	pitch = (G_028060_PITCH_TILE_MAX(track->cb_color_size[i]) + 1) << 3; +	/* pitch is the number of 8x8 tiles per row */ +	pitch = G_028060_PITCH_TILE_MAX(track->cb_color_size[i]) + 1;  	slice_tile_max = G_028060_SLICE_TILE_MAX(track->cb_color_size[i]) + 1; -	if (!pitch) { -		dev_warn(p->dev, "%s:%d cb pitch (%d) for %d invalid (0x%08X)\n", -			__func__, __LINE__, pitch, i, track->cb_color_size[i]); -		return -EINVAL; -	} -	height = size / (pitch * bpe); +	height = size / (pitch * 8 * bpe);  	if (height > 8192)  		height = 8192; +	if (height > 7) +		height &= ~0x7;  	switch (G_0280A0_ARRAY_MODE(track->cb_color_info[i])) {  	case V_0280A0_ARRAY_LINEAR_GENERAL: +		/* technically height & 0x7 */ +		break;  	case V_0280A0_ARRAY_LINEAR_ALIGNED: -		if (pitch & 0x3f) { -			dev_warn(p->dev, "%s:%d cb pitch (%d x %d = %d) invalid\n", -				__func__, __LINE__, pitch, bpe, pitch * bpe); +		pitch_align = max((u32)64, (u32)(track->group_size / bpe)) / 8; +		if (!IS_ALIGNED(pitch, pitch_align)) { +			dev_warn(p->dev, "%s:%d cb pitch (%d) invalid\n", +				 __func__, __LINE__, pitch);  			return -EINVAL;  		} -		if ((pitch * bpe) & (track->group_size - 1)) { -			dev_warn(p->dev, "%s:%d cb pitch (%d) invalid\n", -				__func__, __LINE__, pitch); +		if (!IS_ALIGNED(height, 8)) { +			dev_warn(p->dev, "%s:%d cb height (%d) invalid\n", +				 __func__, __LINE__, height);  			return -EINVAL;  		}  		break;  	case V_0280A0_ARRAY_1D_TILED_THIN1: -		if ((pitch * 8 * bpe * track->nsamples) & (track->group_size - 1)) { +		pitch_align = max((u32)8, (u32)(track->group_size / (8 * bpe * track->nsamples))) / 8; +		if (!IS_ALIGNED(pitch, pitch_align)) {  			dev_warn(p->dev, "%s:%d cb pitch (%d) invalid\n", -				__func__, __LINE__, pitch); +				 __func__, __LINE__, pitch); +			return -EINVAL; +		} +		if (!IS_ALIGNED(height, 8)) { +			dev_warn(p->dev, "%s:%d cb height (%d) invalid\n", +				 __func__, __LINE__, height);  			return -EINVAL;  		} -		height &= ~0x7; -		if (!height) -			height = 8;  		break;  	case V_0280A0_ARRAY_2D_TILED_THIN1: -		if (pitch & ((8 * track->nbanks) - 1)) { +		pitch_align = max((u32)track->nbanks, +				  (u32)(((track->group_size / 8) / (bpe * track->nsamples)) * track->nbanks)); +		if (!IS_ALIGNED(pitch, pitch_align)) {  			dev_warn(p->dev, "%s:%d cb pitch (%d) invalid\n",  				__func__, __LINE__, pitch);  			return -EINVAL;  		} -		tmp = pitch * 8 * bpe * track->nsamples; -		tmp = tmp / track->nbanks; -		if (tmp & (track->group_size - 1)) { -			dev_warn(p->dev, "%s:%d cb pitch (%d) invalid\n", -				__func__, __LINE__, pitch); +		if (!IS_ALIGNED((height / 8), track->nbanks)) { +			dev_warn(p->dev, "%s:%d cb height (%d) invalid\n", +				 __func__, __LINE__, height);  			return -EINVAL;  		} -		height &= ~((16 * track->npipes) - 1); -		if (!height) -			height = 16 * track->npipes;  		break;  	default:  		dev_warn(p->dev, "%s invalid tiling %d for %d (0x%08X)\n", __func__, @@ -238,16 +240,20 @@ static inline int r600_cs_track_validate_cb(struct radeon_cs_parser *p, int i)  		return -EINVAL;  	}  	/* check offset */ -	tmp = height * pitch; +	tmp = height * pitch * 8 * bpe;  	if ((tmp + track->cb_color_bo_offset[i]) > radeon_bo_size(track->cb_color_bo[i])) { -		dev_warn(p->dev, "%s offset[%d] %d to big\n", __func__, i, track->cb_color_bo_offset[i]); +		dev_warn(p->dev, "%s offset[%d] %d too big\n", __func__, i, track->cb_color_bo_offset[i]); +		return -EINVAL; +	} +	if (!IS_ALIGNED(track->cb_color_bo_offset[i], track->group_size)) { +		dev_warn(p->dev, "%s offset[%d] %d not aligned\n", __func__, i, track->cb_color_bo_offset[i]);  		return -EINVAL;  	}  	/* limit max tile */ -	tmp = (height * pitch) >> 6; +	tmp = (height * pitch * 8) >> 6;  	if (tmp < slice_tile_max)  		slice_tile_max = tmp; -	tmp = S_028060_PITCH_TILE_MAX((pitch >> 3) - 1) | +	tmp = S_028060_PITCH_TILE_MAX(pitch - 1) |  		S_028060_SLICE_TILE_MAX(slice_tile_max - 1);  	ib[track->cb_color_size_idx[i]] = tmp;  	return 0; @@ -289,7 +295,7 @@ static int r600_cs_track_check(struct radeon_cs_parser *p)  	/* Check depth buffer */  	if (G_028800_STENCIL_ENABLE(track->db_depth_control) ||  		G_028800_Z_ENABLE(track->db_depth_control)) { -		u32 nviews, bpe, ntiles; +		u32 nviews, bpe, ntiles, pitch, pitch_align, height, size;  		if (track->db_bo == NULL) {  			dev_warn(p->dev, "z/stencil with no depth buffer\n");  			return -EINVAL; @@ -332,6 +338,51 @@ static int r600_cs_track_check(struct radeon_cs_parser *p)  			}  			ib[track->db_depth_size_idx] = S_028000_SLICE_TILE_MAX(tmp - 1) | (track->db_depth_size & 0x3FF);  		} else { +			size = radeon_bo_size(track->db_bo); +			pitch = G_028000_PITCH_TILE_MAX(track->db_depth_size) + 1; +			height = size / (pitch * 8 * bpe); +			height &= ~0x7; +			if (!height) +				height = 8; + +			switch (G_028010_ARRAY_MODE(track->db_depth_info)) { +			case V_028010_ARRAY_1D_TILED_THIN1: +				pitch_align = (max((u32)8, (u32)(track->group_size / (8 * bpe))) / 8); +				if (!IS_ALIGNED(pitch, pitch_align)) { +					dev_warn(p->dev, "%s:%d db pitch (%d) invalid\n", +						 __func__, __LINE__, pitch); +					return -EINVAL; +				} +				if (!IS_ALIGNED(height, 8)) { +					dev_warn(p->dev, "%s:%d db height (%d) invalid\n", +						 __func__, __LINE__, height); +					return -EINVAL; +				} +				break; +			case V_028010_ARRAY_2D_TILED_THIN1: +				pitch_align = max((u32)track->nbanks, +						  (u32)(((track->group_size / 8) / bpe) * track->nbanks)); +				if (!IS_ALIGNED(pitch, pitch_align)) { +					dev_warn(p->dev, "%s:%d db pitch (%d) invalid\n", +						 __func__, __LINE__, pitch); +					return -EINVAL; +				} +				if ((height / 8) & (track->nbanks - 1)) { +					dev_warn(p->dev, "%s:%d db height (%d) invalid\n", +						 __func__, __LINE__, height); +					return -EINVAL; +				} +				break; +			default: +				dev_warn(p->dev, "%s invalid tiling %d (0x%08X)\n", __func__, +					 G_028010_ARRAY_MODE(track->db_depth_info), +					 track->db_depth_info); +				return -EINVAL; +			} +			if (!IS_ALIGNED(track->db_offset, track->group_size)) { +				dev_warn(p->dev, "%s offset[%d] %d not aligned\n", __func__, i, track->db_offset); +				return -EINVAL; +			}  			ntiles = G_028000_SLICE_TILE_MAX(track->db_depth_size) + 1;  			nviews = G_028004_SLICE_MAX(track->db_depth_view) + 1;  			tmp = ntiles * bpe * 64 * nviews; @@ -724,7 +775,25 @@ static inline int r600_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u32 idx  		track->db_depth_control = radeon_get_ib_value(p, idx);  		break;  	case R_028010_DB_DEPTH_INFO: -		track->db_depth_info = radeon_get_ib_value(p, idx); +		if (r600_cs_packet_next_is_pkt3_nop(p)) { +			r = r600_cs_packet_next_reloc(p, &reloc); +			if (r) { +				dev_warn(p->dev, "bad SET_CONTEXT_REG " +					 "0x%04X\n", reg); +				return -EINVAL; +			} +			track->db_depth_info = radeon_get_ib_value(p, idx); +			ib[idx] &= C_028010_ARRAY_MODE; +			track->db_depth_info &= C_028010_ARRAY_MODE; +			if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) { +				ib[idx] |= S_028010_ARRAY_MODE(V_028010_ARRAY_2D_TILED_THIN1); +				track->db_depth_info |= S_028010_ARRAY_MODE(V_028010_ARRAY_2D_TILED_THIN1); +			} else { +				ib[idx] |= S_028010_ARRAY_MODE(V_028010_ARRAY_1D_TILED_THIN1); +				track->db_depth_info |= S_028010_ARRAY_MODE(V_028010_ARRAY_1D_TILED_THIN1); +			} +		} else +			track->db_depth_info = radeon_get_ib_value(p, idx);  		break;  	case R_028004_DB_DEPTH_VIEW:  		track->db_depth_view = radeon_get_ib_value(p, idx); @@ -757,8 +826,25 @@ static inline int r600_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u32 idx  	case R_0280B4_CB_COLOR5_INFO:  	case R_0280B8_CB_COLOR6_INFO:  	case R_0280BC_CB_COLOR7_INFO: -		tmp = (reg - R_0280A0_CB_COLOR0_INFO) / 4; -		track->cb_color_info[tmp] = radeon_get_ib_value(p, idx); +		if (r600_cs_packet_next_is_pkt3_nop(p)) { +			r = r600_cs_packet_next_reloc(p, &reloc); +			if (r) { +				dev_err(p->dev, "bad SET_CONTEXT_REG 0x%04X\n", reg); +				return -EINVAL; +			} +			tmp = (reg - R_0280A0_CB_COLOR0_INFO) / 4; +			track->cb_color_info[tmp] = radeon_get_ib_value(p, idx); +			if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) { +				ib[idx] |= S_0280A0_ARRAY_MODE(V_0280A0_ARRAY_2D_TILED_THIN1); +				track->cb_color_info[tmp] |= S_0280A0_ARRAY_MODE(V_0280A0_ARRAY_2D_TILED_THIN1); +			} else if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) { +				ib[idx] |= S_0280A0_ARRAY_MODE(V_0280A0_ARRAY_1D_TILED_THIN1); +				track->cb_color_info[tmp] |= S_0280A0_ARRAY_MODE(V_0280A0_ARRAY_1D_TILED_THIN1); +			} +		} else { +			tmp = (reg - R_0280A0_CB_COLOR0_INFO) / 4; +			track->cb_color_info[tmp] = radeon_get_ib_value(p, idx); +		}  		break;  	case R_028060_CB_COLOR0_SIZE:  	case R_028064_CB_COLOR1_SIZE: @@ -946,8 +1032,9 @@ static inline unsigned minify(unsigned size, unsigned levels)  }  static void r600_texture_size(unsigned nfaces, unsigned blevel, unsigned nlevels, -				unsigned w0, unsigned h0, unsigned d0, unsigned bpe, -				unsigned *l0_size, unsigned *mipmap_size) +			      unsigned w0, unsigned h0, unsigned d0, unsigned bpe, +			      unsigned pitch_align, +			      unsigned *l0_size, unsigned *mipmap_size)  {  	unsigned offset, i, level, face;  	unsigned width, height, depth, rowstride, size; @@ -960,13 +1047,13 @@ static void r600_texture_size(unsigned nfaces, unsigned blevel, unsigned nlevels  		height = minify(h0, i);  		depth = minify(d0, i);  		for(face = 0; face < nfaces; face++) { -			rowstride = ((width * bpe) + 255) & ~255; +			rowstride = ALIGN((width * bpe), pitch_align);  			size = height * rowstride * depth;  			offset += size;  			offset = (offset + 0x1f) & ~0x1f;  		}  	} -	*l0_size = (((w0 * bpe) + 255) & ~255) * h0 * d0; +	*l0_size = ALIGN((w0 * bpe), pitch_align) * h0 * d0;  	*mipmap_size = offset;  	if (!blevel)  		*mipmap_size -= *l0_size; @@ -985,16 +1072,23 @@ static void r600_texture_size(unsigned nfaces, unsigned blevel, unsigned nlevels   * the texture and mipmap bo object are big enough to cover this resource.   */  static inline int r600_check_texture_resource(struct radeon_cs_parser *p,  u32 idx, -						struct radeon_bo *texture, -						struct radeon_bo *mipmap) +					      struct radeon_bo *texture, +					      struct radeon_bo *mipmap, +					      u32 tiling_flags)  { +	struct r600_cs_track *track = p->track;  	u32 nfaces, nlevels, blevel, w0, h0, d0, bpe = 0; -	u32 word0, word1, l0_size, mipmap_size; +	u32 word0, word1, l0_size, mipmap_size, pitch, pitch_align;  	/* on legacy kernel we don't perform advanced check */  	if (p->rdev == NULL)  		return 0; +  	word0 = radeon_get_ib_value(p, idx + 0); +	if (tiling_flags & RADEON_TILING_MACRO) +		word0 |= S_038000_TILE_MODE(V_038000_ARRAY_2D_TILED_THIN1); +	else if (tiling_flags & RADEON_TILING_MICRO) +		word0 |= S_038000_TILE_MODE(V_038000_ARRAY_1D_TILED_THIN1);  	word1 = radeon_get_ib_value(p, idx + 1);  	w0 = G_038000_TEX_WIDTH(word0) + 1;  	h0 = G_038004_TEX_HEIGHT(word1) + 1; @@ -1021,11 +1115,55 @@ static inline int r600_check_texture_resource(struct radeon_cs_parser *p,  u32 i  			 __func__, __LINE__, G_038004_DATA_FORMAT(word1));  		return -EINVAL;  	} + +	pitch = G_038000_PITCH(word0) + 1; +	switch (G_038000_TILE_MODE(word0)) { +	case V_038000_ARRAY_LINEAR_GENERAL: +		pitch_align = 1; +		/* XXX check height align */ +		break; +	case V_038000_ARRAY_LINEAR_ALIGNED: +		pitch_align = max((u32)64, (u32)(track->group_size / bpe)) / 8; +		if (!IS_ALIGNED(pitch, pitch_align)) { +			dev_warn(p->dev, "%s:%d tex pitch (%d) invalid\n", +				 __func__, __LINE__, pitch); +			return -EINVAL; +		} +		/* XXX check height align */ +		break; +	case V_038000_ARRAY_1D_TILED_THIN1: +		pitch_align = max((u32)8, (u32)(track->group_size / (8 * bpe))) / 8; +		if (!IS_ALIGNED(pitch, pitch_align)) { +			dev_warn(p->dev, "%s:%d tex pitch (%d) invalid\n", +				 __func__, __LINE__, pitch); +			return -EINVAL; +		} +		/* XXX check height align */ +		break; +	case V_038000_ARRAY_2D_TILED_THIN1: +		pitch_align = max((u32)track->nbanks, +				  (u32)(((track->group_size / 8) / bpe) * track->nbanks)); +		if (!IS_ALIGNED(pitch, pitch_align)) { +			dev_warn(p->dev, "%s:%d tex pitch (%d) invalid\n", +				__func__, __LINE__, pitch); +			return -EINVAL; +		} +		/* XXX check height align */ +		break; +	default: +		dev_warn(p->dev, "%s invalid tiling %d (0x%08X)\n", __func__, +			 G_038000_TILE_MODE(word0), word0); +		return -EINVAL; +	} +	/* XXX check offset align */ +  	word0 = radeon_get_ib_value(p, idx + 4);  	word1 = radeon_get_ib_value(p, idx + 5);  	blevel = G_038010_BASE_LEVEL(word0);  	nlevels = G_038014_LAST_LEVEL(word1); -	r600_texture_size(nfaces, blevel, nlevels, w0, h0, d0, bpe, &l0_size, &mipmap_size); +	r600_texture_size(nfaces, blevel, nlevels, w0, h0, d0, bpe, +			  (pitch_align * bpe), +			  &l0_size, &mipmap_size);  	/* using get ib will give us the offset into the texture bo */  	word0 = radeon_get_ib_value(p, idx + 2);  	if ((l0_size + word0) > radeon_bo_size(texture)) { @@ -1239,6 +1377,10 @@ static int r600_packet3_check(struct radeon_cs_parser *p,  					return -EINVAL;  				}  				ib[idx+1+(i*7)+2] += (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff); +				if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) +					ib[idx+1+(i*7)+0] |= S_038000_TILE_MODE(V_038000_ARRAY_2D_TILED_THIN1); +				else if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) +					ib[idx+1+(i*7)+0] |= S_038000_TILE_MODE(V_038000_ARRAY_1D_TILED_THIN1);  				texture = reloc->robj;  				/* tex mip base */  				r = r600_cs_packet_next_reloc(p, &reloc); @@ -1249,7 +1391,7 @@ static int r600_packet3_check(struct radeon_cs_parser *p,  				ib[idx+1+(i*7)+3] += (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff);  				mipmap = reloc->robj;  				r = r600_check_texture_resource(p,  idx+(i*7)+1, -						texture, mipmap); +								texture, mipmap, reloc->lobj.tiling_flags);  				if (r)  					return r;  				break; diff --git a/drivers/gpu/drm/radeon/r600_hdmi.c b/drivers/gpu/drm/radeon/r600_hdmi.c index 26b4bc9d89a..e6a58ed48dc 100644 --- a/drivers/gpu/drm/radeon/r600_hdmi.c +++ b/drivers/gpu/drm/radeon/r600_hdmi.c @@ -435,7 +435,8 @@ static int r600_hdmi_find_free_block(struct drm_device *dev)  		}  	} -	if (rdev->family == CHIP_RS600 || rdev->family == CHIP_RS690) { +	if (rdev->family == CHIP_RS600 || rdev->family == CHIP_RS690 || +	    rdev->family == CHIP_RS740) {  		return free_blocks[0] ? R600_HDMI_BLOCK1 : 0;  	} else if (rdev->family >= CHIP_R600) {  		if (free_blocks[0]) @@ -466,7 +467,8 @@ static void r600_hdmi_assign_block(struct drm_encoder *encoder)  		if (ASIC_IS_DCE32(rdev))  			radeon_encoder->hdmi_config_offset = dig->dig_encoder ?  				R600_HDMI_CONFIG2 : R600_HDMI_CONFIG1; -	} else if (rdev->family >= CHIP_R600) { +	} else if (rdev->family >= CHIP_R600 || rdev->family == CHIP_RS600 || +		   rdev->family == CHIP_RS690 || rdev->family == CHIP_RS740) {  		radeon_encoder->hdmi_offset = r600_hdmi_find_free_block(dev);  	}  } diff --git a/drivers/gpu/drm/radeon/r600d.h b/drivers/gpu/drm/radeon/r600d.h index 59c1f8793e6..858a1920c0d 100644 --- a/drivers/gpu/drm/radeon/r600d.h +++ b/drivers/gpu/drm/radeon/r600d.h @@ -239,12 +239,18 @@  #define	GRBM_SOFT_RESET					0x8020  #define		SOFT_RESET_CP					(1<<0) +#define	CG_THERMAL_STATUS				0x7F4 +#define		ASIC_T(x)			        ((x) << 0) +#define		ASIC_T_MASK			        0x1FF +#define		ASIC_T_SHIFT			        0 +  #define	HDP_HOST_PATH_CNTL				0x2C00  #define	HDP_NONSURFACE_BASE				0x2C04  #define	HDP_NONSURFACE_INFO				0x2C08  #define	HDP_NONSURFACE_SIZE				0x2C0C  #define HDP_REG_COHERENCY_FLUSH_CNTL			0x54A0  #define	HDP_TILING_CONFIG				0x2F3C +#define HDP_DEBUG1                                      0x2F34  #define MC_VM_AGP_TOP					0x2184  #define MC_VM_AGP_BOT					0x2188 @@ -1154,6 +1160,10 @@  #define   S_038000_TILE_MODE(x)                        (((x) & 0xF) << 3)  #define   G_038000_TILE_MODE(x)                        (((x) >> 3) & 0xF)  #define   C_038000_TILE_MODE                           0xFFFFFF87 +#define     V_038000_ARRAY_LINEAR_GENERAL              0x00000000 +#define     V_038000_ARRAY_LINEAR_ALIGNED              0x00000001 +#define     V_038000_ARRAY_1D_TILED_THIN1              0x00000002 +#define     V_038000_ARRAY_2D_TILED_THIN1              0x00000004  #define   S_038000_TILE_TYPE(x)                        (((x) & 0x1) << 7)  #define   G_038000_TILE_TYPE(x)                        (((x) >> 7) & 0x1)  #define   C_038000_TILE_TYPE                           0xFFFFFF7F @@ -1357,6 +1367,8 @@  #define   S_028010_ARRAY_MODE(x)                       (((x) & 0xF) << 15)  #define   G_028010_ARRAY_MODE(x)                       (((x) >> 15) & 0xF)  #define   C_028010_ARRAY_MODE                          0xFFF87FFF +#define     V_028010_ARRAY_1D_TILED_THIN1              0x00000002 +#define     V_028010_ARRAY_2D_TILED_THIN1              0x00000004  #define   S_028010_TILE_SURFACE_ENABLE(x)              (((x) & 0x1) << 25)  #define   G_028010_TILE_SURFACE_ENABLE(x)              (((x) >> 25) & 0x1)  #define   C_028010_TILE_SURFACE_ENABLE                 0xFDFFFFFF diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index 2f94dc66c18..3cd1c470b77 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h @@ -178,6 +178,9 @@ void radeon_combios_get_power_modes(struct radeon_device *rdev);  void radeon_atombios_get_power_modes(struct radeon_device *rdev);  void radeon_atom_set_voltage(struct radeon_device *rdev, u16 level);  void rs690_pm_info(struct radeon_device *rdev); +extern u32 rv6xx_get_temp(struct radeon_device *rdev); +extern u32 rv770_get_temp(struct radeon_device *rdev); +extern u32 evergreen_get_temp(struct radeon_device *rdev);  /*   * Fences. @@ -232,7 +235,7 @@ struct radeon_surface_reg {   */  struct radeon_mman {  	struct ttm_bo_global_ref        bo_global_ref; -	struct ttm_global_reference	mem_global_ref; +	struct drm_global_reference	mem_global_ref;  	struct ttm_bo_device		bdev;  	bool				mem_global_referenced;  	bool				initialized; @@ -671,6 +674,13 @@ struct radeon_pm_profile {  	int dpms_on_cm_idx;  }; +enum radeon_int_thermal_type { +	THERMAL_TYPE_NONE, +	THERMAL_TYPE_RV6XX, +	THERMAL_TYPE_RV770, +	THERMAL_TYPE_EVERGREEN, +}; +  struct radeon_voltage {  	enum radeon_voltage_type type;  	/* gpio voltage */ @@ -766,6 +776,9 @@ struct radeon_pm {  	enum radeon_pm_profile_type profile;  	int                     profile_index;  	struct radeon_pm_profile profiles[PM_PROFILE_MAX]; +	/* internal thermal controller on rv6xx+ */ +	enum radeon_int_thermal_type int_thermal_type; +	struct device	        *int_hwmon_dev;  }; @@ -902,6 +915,7 @@ struct r600_asic {  	unsigned		tiling_nbanks;  	unsigned		tiling_npipes;  	unsigned		tiling_group_size; +	unsigned		tile_config;  	struct r100_gpu_lockup	lockup;  }; @@ -926,6 +940,7 @@ struct rv770_asic {  	unsigned		tiling_nbanks;  	unsigned		tiling_npipes;  	unsigned		tiling_group_size; +	unsigned		tile_config;  	struct r100_gpu_lockup	lockup;  }; @@ -951,6 +966,7 @@ struct evergreen_asic {  	unsigned tiling_nbanks;  	unsigned tiling_npipes;  	unsigned tiling_group_size; +	unsigned tile_config;  };  union radeon_asic_config { @@ -1033,6 +1049,9 @@ struct radeon_device {  	uint32_t                        pcie_reg_mask;  	radeon_rreg_t			pciep_rreg;  	radeon_wreg_t			pciep_wreg; +	/* io port */ +	void __iomem                    *rio_mem; +	resource_size_t			rio_mem_size;  	struct radeon_clock             clock;  	struct radeon_mc		mc;  	struct radeon_gart		gart; @@ -1069,6 +1088,7 @@ struct radeon_device {  	struct mutex vram_mutex;  	/* audio stuff */ +	bool			audio_enabled;  	struct timer_list	audio_timer;  	int			audio_channels;  	int			audio_rate; @@ -1078,6 +1098,8 @@ struct radeon_device {  	bool powered_down;  	struct notifier_block acpi_nb; +	/* only one userspace can use Hyperz features at a time */ +	struct drm_file *hyperz_filp;  };  int radeon_device_init(struct radeon_device *rdev, @@ -1114,6 +1136,26 @@ static inline void r100_mm_wreg(struct radeon_device *rdev, uint32_t reg, uint32  	}  } +static inline u32 r100_io_rreg(struct radeon_device *rdev, u32 reg) +{ +	if (reg < rdev->rio_mem_size) +		return ioread32(rdev->rio_mem + reg); +	else { +		iowrite32(reg, rdev->rio_mem + RADEON_MM_INDEX); +		return ioread32(rdev->rio_mem + RADEON_MM_DATA); +	} +} + +static inline void r100_io_wreg(struct radeon_device *rdev, u32 reg, u32 v) +{ +	if (reg < rdev->rio_mem_size) +		iowrite32(v, rdev->rio_mem + reg); +	else { +		iowrite32(reg, rdev->rio_mem + RADEON_MM_INDEX); +		iowrite32(v, rdev->rio_mem + RADEON_MM_DATA); +	} +} +  /*   * Cast helper   */ @@ -1152,6 +1194,8 @@ static inline void r100_mm_wreg(struct radeon_device *rdev, uint32_t reg, uint32  		WREG32_PLL(reg, tmp_);				\  	} while (0)  #define DREG32_SYS(sqf, rdev, reg) seq_printf((sqf), #reg " : 0x%08X\n", r100_mm_rreg((rdev), (reg))) +#define RREG32_IO(reg) r100_io_rreg(rdev, (reg)) +#define WREG32_IO(reg, v) r100_io_wreg(rdev, (reg), (v))  /*   * Indirect registers accessor @@ -1415,6 +1459,13 @@ extern void r700_cp_fini(struct radeon_device *rdev);  extern void evergreen_disable_interrupt_state(struct radeon_device *rdev);  extern int evergreen_irq_set(struct radeon_device *rdev); +/* radeon_acpi.c */  +#if defined(CONFIG_ACPI)  +extern int radeon_acpi_init(struct radeon_device *rdev);  +#else  +static inline int radeon_acpi_init(struct radeon_device *rdev) { return 0; }  +#endif  +  /* evergreen */  struct evergreen_mc_save {  	u32 vga_control[6]; diff --git a/drivers/gpu/drm/radeon/radeon_acpi.c b/drivers/gpu/drm/radeon/radeon_acpi.c new file mode 100644 index 00000000000..3f6636bb2d7 --- /dev/null +++ b/drivers/gpu/drm/radeon/radeon_acpi.c @@ -0,0 +1,67 @@ +#include <linux/pci.h> +#include <linux/acpi.h> +#include <linux/slab.h> +#include <acpi/acpi_drivers.h> +#include <acpi/acpi_bus.h> + +#include "drmP.h" +#include "drm.h" +#include "drm_sarea.h" +#include "drm_crtc_helper.h" +#include "radeon.h" + +#include <linux/vga_switcheroo.h> + +/* Call the ATIF method + * + * Note: currently we discard the output + */ +static int radeon_atif_call(acpi_handle handle) +{ +	acpi_status status; +	union acpi_object atif_arg_elements[2]; +	struct acpi_object_list atif_arg; +	struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL}; + +	atif_arg.count = 2; +	atif_arg.pointer = &atif_arg_elements[0]; + +	atif_arg_elements[0].type = ACPI_TYPE_INTEGER; +	atif_arg_elements[0].integer.value = 0; +	atif_arg_elements[1].type = ACPI_TYPE_INTEGER; +	atif_arg_elements[1].integer.value = 0; + +	status = acpi_evaluate_object(handle, "ATIF", &atif_arg, &buffer); + +	/* Fail only if calling the method fails and ATIF is supported */ +	if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) { +		printk(KERN_DEBUG "failed to evaluate ATIF got %s\n", acpi_format_exception(status)); +		kfree(buffer.pointer); +		return 1; +	} + +	kfree(buffer.pointer); +	return 0; +} + +/* Call all ACPI methods here */ +int radeon_acpi_init(struct radeon_device *rdev) +{ +	acpi_handle handle; +	int ret; + +	/* No need to proceed if we're sure that ATIF is not supported */ +	if (!ASIC_IS_AVIVO(rdev) || !rdev->bios) +		return 0; + +	/* Get the device handle */ +	handle = DEVICE_ACPI_HANDLE(&rdev->pdev->dev); + +	/* Call the ATIF method */ +	ret = radeon_atif_call(handle); +	if (ret) +		return ret; + +	return 0; +} + diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h index c0bbaa64157..a5aff755f0d 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.h +++ b/drivers/gpu/drm/radeon/radeon_asic.h @@ -113,6 +113,7 @@ void r100_wb_fini(struct radeon_device *rdev);  int r100_wb_init(struct radeon_device *rdev);  int r100_cp_reset(struct radeon_device *rdev);  void r100_vga_render_disable(struct radeon_device *rdev); +void r100_restore_sanity(struct radeon_device *rdev);  int r100_cs_track_check_pkt3_indx_buffer(struct radeon_cs_parser *p,  					 struct radeon_cs_packet *pkt,  					 struct radeon_bo *robj); diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c index 10673ae59cf..3bc2bcdf530 100644 --- a/drivers/gpu/drm/radeon/radeon_atombios.c +++ b/drivers/gpu/drm/radeon/radeon_atombios.c @@ -723,7 +723,7 @@ bool radeon_get_atom_connector_info_from_supported_devices_table(struct  		}  		if (i == ATOM_DEVICE_CV_INDEX) { -			DRM_DEBUG("Skipping Component Video\n"); +			DRM_DEBUG_KMS("Skipping Component Video\n");  			continue;  		} @@ -1032,21 +1032,18 @@ bool radeon_atombios_sideport_present(struct radeon_device *rdev)  	u8 frev, crev;  	u16 data_offset; +	/* sideport is AMD only */ +	if (rdev->family == CHIP_RS600) +		return false; +  	if (atom_parse_data_header(mode_info->atom_context, index, NULL,  				   &frev, &crev, &data_offset)) {  		igp_info = (union igp_info *)(mode_info->atom_context->bios +  				      data_offset);  		switch (crev) {  		case 1: -			/* AMD IGPS */ -			if ((rdev->family == CHIP_RS690) || -			    (rdev->family == CHIP_RS740)) { -				if (igp_info->info.ulBootUpMemoryClock) -					return true; -			} else { -				if (igp_info->info.ucMemoryType & 0xf0) -					return true; -			} +			if (igp_info->info.ulBootUpMemoryClock) +				return true;  			break;  		case 2:  			if (igp_info->info_2.ucMemoryType & 0x0f) @@ -1095,7 +1092,7 @@ bool radeon_atombios_get_tmds_info(struct radeon_encoder *encoder,  			    (tmds_info->asMiscInfo[i].  			     ucPLL_VoltageSwing & 0xf) << 16; -			DRM_DEBUG("TMDS PLL From ATOMBIOS %u %x\n", +			DRM_DEBUG_KMS("TMDS PLL From ATOMBIOS %u %x\n",  				  tmds->tmds_pll[i].freq,  				  tmds->tmds_pll[i].value); @@ -1789,14 +1786,22 @@ void radeon_atombios_get_power_modes(struct radeon_device *rdev)  			}  			/* add the i2c bus for thermal/fan chip */ -			/* no support for internal controller yet */  			if (controller->ucType > 0) { -				if ((controller->ucType == ATOM_PP_THERMALCONTROLLER_RV6xx) || -				    (controller->ucType == ATOM_PP_THERMALCONTROLLER_RV770) || -				    (controller->ucType == ATOM_PP_THERMALCONTROLLER_EVERGREEN)) { +				if (controller->ucType == ATOM_PP_THERMALCONTROLLER_RV6xx) { +					DRM_INFO("Internal thermal controller %s fan control\n", +						 (controller->ucFanParameters & +						  ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with"); +					rdev->pm.int_thermal_type = THERMAL_TYPE_RV6XX; +				} else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_RV770) { +					DRM_INFO("Internal thermal controller %s fan control\n", +						 (controller->ucFanParameters & +						  ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with"); +					rdev->pm.int_thermal_type = THERMAL_TYPE_RV770; +				} else if (controller->ucType == ATOM_PP_THERMALCONTROLLER_EVERGREEN) {  					DRM_INFO("Internal thermal controller %s fan control\n",  						 (controller->ucFanParameters &  						  ATOM_PP_FANPARAMETERS_NOFAN) ? "without" : "with"); +					rdev->pm.int_thermal_type = THERMAL_TYPE_EVERGREEN;  				} else if ((controller->ucType ==  					    ATOM_PP_THERMALCONTROLLER_EXTERNAL_GPIO) ||  					   (controller->ucType == @@ -2179,11 +2184,11 @@ radeon_atombios_connected_scratch_regs(struct drm_connector *connector,  	if ((radeon_encoder->devices & ATOM_DEVICE_TV1_SUPPORT) &&  	    (radeon_connector->devices & ATOM_DEVICE_TV1_SUPPORT)) {  		if (connected) { -			DRM_DEBUG("TV1 connected\n"); +			DRM_DEBUG_KMS("TV1 connected\n");  			bios_3_scratch |= ATOM_S3_TV1_ACTIVE;  			bios_6_scratch |= ATOM_S6_ACC_REQ_TV1;  		} else { -			DRM_DEBUG("TV1 disconnected\n"); +			DRM_DEBUG_KMS("TV1 disconnected\n");  			bios_0_scratch &= ~ATOM_S0_TV1_MASK;  			bios_3_scratch &= ~ATOM_S3_TV1_ACTIVE;  			bios_6_scratch &= ~ATOM_S6_ACC_REQ_TV1; @@ -2192,11 +2197,11 @@ radeon_atombios_connected_scratch_regs(struct drm_connector *connector,  	if ((radeon_encoder->devices & ATOM_DEVICE_CV_SUPPORT) &&  	    (radeon_connector->devices & ATOM_DEVICE_CV_SUPPORT)) {  		if (connected) { -			DRM_DEBUG("CV connected\n"); +			DRM_DEBUG_KMS("CV connected\n");  			bios_3_scratch |= ATOM_S3_CV_ACTIVE;  			bios_6_scratch |= ATOM_S6_ACC_REQ_CV;  		} else { -			DRM_DEBUG("CV disconnected\n"); +			DRM_DEBUG_KMS("CV disconnected\n");  			bios_0_scratch &= ~ATOM_S0_CV_MASK;  			bios_3_scratch &= ~ATOM_S3_CV_ACTIVE;  			bios_6_scratch &= ~ATOM_S6_ACC_REQ_CV; @@ -2205,12 +2210,12 @@ radeon_atombios_connected_scratch_regs(struct drm_connector *connector,  	if ((radeon_encoder->devices & ATOM_DEVICE_LCD1_SUPPORT) &&  	    (radeon_connector->devices & ATOM_DEVICE_LCD1_SUPPORT)) {  		if (connected) { -			DRM_DEBUG("LCD1 connected\n"); +			DRM_DEBUG_KMS("LCD1 connected\n");  			bios_0_scratch |= ATOM_S0_LCD1;  			bios_3_scratch |= ATOM_S3_LCD1_ACTIVE;  			bios_6_scratch |= ATOM_S6_ACC_REQ_LCD1;  		} else { -			DRM_DEBUG("LCD1 disconnected\n"); +			DRM_DEBUG_KMS("LCD1 disconnected\n");  			bios_0_scratch &= ~ATOM_S0_LCD1;  			bios_3_scratch &= ~ATOM_S3_LCD1_ACTIVE;  			bios_6_scratch &= ~ATOM_S6_ACC_REQ_LCD1; @@ -2219,12 +2224,12 @@ radeon_atombios_connected_scratch_regs(struct drm_connector *connector,  	if ((radeon_encoder->devices & ATOM_DEVICE_CRT1_SUPPORT) &&  	    (radeon_connector->devices & ATOM_DEVICE_CRT1_SUPPORT)) {  		if (connected) { -			DRM_DEBUG("CRT1 connected\n"); +			DRM_DEBUG_KMS("CRT1 connected\n");  			bios_0_scratch |= ATOM_S0_CRT1_COLOR;  			bios_3_scratch |= ATOM_S3_CRT1_ACTIVE;  			bios_6_scratch |= ATOM_S6_ACC_REQ_CRT1;  		} else { -			DRM_DEBUG("CRT1 disconnected\n"); +			DRM_DEBUG_KMS("CRT1 disconnected\n");  			bios_0_scratch &= ~ATOM_S0_CRT1_MASK;  			bios_3_scratch &= ~ATOM_S3_CRT1_ACTIVE;  			bios_6_scratch &= ~ATOM_S6_ACC_REQ_CRT1; @@ -2233,12 +2238,12 @@ radeon_atombios_connected_scratch_regs(struct drm_connector *connector,  	if ((radeon_encoder->devices & ATOM_DEVICE_CRT2_SUPPORT) &&  	    (radeon_connector->devices & ATOM_DEVICE_CRT2_SUPPORT)) {  		if (connected) { -			DRM_DEBUG("CRT2 connected\n"); +			DRM_DEBUG_KMS("CRT2 connected\n");  			bios_0_scratch |= ATOM_S0_CRT2_COLOR;  			bios_3_scratch |= ATOM_S3_CRT2_ACTIVE;  			bios_6_scratch |= ATOM_S6_ACC_REQ_CRT2;  		} else { -			DRM_DEBUG("CRT2 disconnected\n"); +			DRM_DEBUG_KMS("CRT2 disconnected\n");  			bios_0_scratch &= ~ATOM_S0_CRT2_MASK;  			bios_3_scratch &= ~ATOM_S3_CRT2_ACTIVE;  			bios_6_scratch &= ~ATOM_S6_ACC_REQ_CRT2; @@ -2247,12 +2252,12 @@ radeon_atombios_connected_scratch_regs(struct drm_connector *connector,  	if ((radeon_encoder->devices & ATOM_DEVICE_DFP1_SUPPORT) &&  	    (radeon_connector->devices & ATOM_DEVICE_DFP1_SUPPORT)) {  		if (connected) { -			DRM_DEBUG("DFP1 connected\n"); +			DRM_DEBUG_KMS("DFP1 connected\n");  			bios_0_scratch |= ATOM_S0_DFP1;  			bios_3_scratch |= ATOM_S3_DFP1_ACTIVE;  			bios_6_scratch |= ATOM_S6_ACC_REQ_DFP1;  		} else { -			DRM_DEBUG("DFP1 disconnected\n"); +			DRM_DEBUG_KMS("DFP1 disconnected\n");  			bios_0_scratch &= ~ATOM_S0_DFP1;  			bios_3_scratch &= ~ATOM_S3_DFP1_ACTIVE;  			bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP1; @@ -2261,12 +2266,12 @@ radeon_atombios_connected_scratch_regs(struct drm_connector *connector,  	if ((radeon_encoder->devices & ATOM_DEVICE_DFP2_SUPPORT) &&  	    (radeon_connector->devices & ATOM_DEVICE_DFP2_SUPPORT)) {  		if (connected) { -			DRM_DEBUG("DFP2 connected\n"); +			DRM_DEBUG_KMS("DFP2 connected\n");  			bios_0_scratch |= ATOM_S0_DFP2;  			bios_3_scratch |= ATOM_S3_DFP2_ACTIVE;  			bios_6_scratch |= ATOM_S6_ACC_REQ_DFP2;  		} else { -			DRM_DEBUG("DFP2 disconnected\n"); +			DRM_DEBUG_KMS("DFP2 disconnected\n");  			bios_0_scratch &= ~ATOM_S0_DFP2;  			bios_3_scratch &= ~ATOM_S3_DFP2_ACTIVE;  			bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP2; @@ -2275,12 +2280,12 @@ radeon_atombios_connected_scratch_regs(struct drm_connector *connector,  	if ((radeon_encoder->devices & ATOM_DEVICE_DFP3_SUPPORT) &&  	    (radeon_connector->devices & ATOM_DEVICE_DFP3_SUPPORT)) {  		if (connected) { -			DRM_DEBUG("DFP3 connected\n"); +			DRM_DEBUG_KMS("DFP3 connected\n");  			bios_0_scratch |= ATOM_S0_DFP3;  			bios_3_scratch |= ATOM_S3_DFP3_ACTIVE;  			bios_6_scratch |= ATOM_S6_ACC_REQ_DFP3;  		} else { -			DRM_DEBUG("DFP3 disconnected\n"); +			DRM_DEBUG_KMS("DFP3 disconnected\n");  			bios_0_scratch &= ~ATOM_S0_DFP3;  			bios_3_scratch &= ~ATOM_S3_DFP3_ACTIVE;  			bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP3; @@ -2289,12 +2294,12 @@ radeon_atombios_connected_scratch_regs(struct drm_connector *connector,  	if ((radeon_encoder->devices & ATOM_DEVICE_DFP4_SUPPORT) &&  	    (radeon_connector->devices & ATOM_DEVICE_DFP4_SUPPORT)) {  		if (connected) { -			DRM_DEBUG("DFP4 connected\n"); +			DRM_DEBUG_KMS("DFP4 connected\n");  			bios_0_scratch |= ATOM_S0_DFP4;  			bios_3_scratch |= ATOM_S3_DFP4_ACTIVE;  			bios_6_scratch |= ATOM_S6_ACC_REQ_DFP4;  		} else { -			DRM_DEBUG("DFP4 disconnected\n"); +			DRM_DEBUG_KMS("DFP4 disconnected\n");  			bios_0_scratch &= ~ATOM_S0_DFP4;  			bios_3_scratch &= ~ATOM_S3_DFP4_ACTIVE;  			bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP4; @@ -2303,12 +2308,12 @@ radeon_atombios_connected_scratch_regs(struct drm_connector *connector,  	if ((radeon_encoder->devices & ATOM_DEVICE_DFP5_SUPPORT) &&  	    (radeon_connector->devices & ATOM_DEVICE_DFP5_SUPPORT)) {  		if (connected) { -			DRM_DEBUG("DFP5 connected\n"); +			DRM_DEBUG_KMS("DFP5 connected\n");  			bios_0_scratch |= ATOM_S0_DFP5;  			bios_3_scratch |= ATOM_S3_DFP5_ACTIVE;  			bios_6_scratch |= ATOM_S6_ACC_REQ_DFP5;  		} else { -			DRM_DEBUG("DFP5 disconnected\n"); +			DRM_DEBUG_KMS("DFP5 disconnected\n");  			bios_0_scratch &= ~ATOM_S0_DFP5;  			bios_3_scratch &= ~ATOM_S3_DFP5_ACTIVE;  			bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP5; diff --git a/drivers/gpu/drm/radeon/radeon_bios.c b/drivers/gpu/drm/radeon/radeon_bios.c index 2c921373999..654787ec43f 100644 --- a/drivers/gpu/drm/radeon/radeon_bios.c +++ b/drivers/gpu/drm/radeon/radeon_bios.c @@ -53,7 +53,7 @@ static bool igp_read_bios_from_vram(struct radeon_device *rdev)  			return false;  	rdev->bios = NULL; -	vram_base = drm_get_resource_start(rdev->ddev, 0); +	vram_base = pci_resource_start(rdev->pdev, 0);  	bios = ioremap(vram_base, size);  	if (!bios) {  		return false; diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c index 2417d7b06fd..5e1474cde4b 100644 --- a/drivers/gpu/drm/radeon/radeon_combios.c +++ b/drivers/gpu/drm/radeon/radeon_combios.c @@ -693,6 +693,10 @@ bool radeon_combios_sideport_present(struct radeon_device *rdev)  	struct drm_device *dev = rdev->ddev;  	u16 igp_info; +	/* sideport is AMD only */ +	if (rdev->family == CHIP_RS400) +		return false; +  	igp_info = combios_get_table_offset(dev, COMBIOS_INTEGRATED_SYSTEM_INFO_TABLE);  	if (igp_info) { @@ -1205,7 +1209,7 @@ bool radeon_legacy_get_tmds_info_from_combios(struct radeon_encoder *encoder,  				    RBIOS32(tmds_info + i * 10 + 0x08);  				tmds->tmds_pll[i].freq =  				    RBIOS16(tmds_info + i * 10 + 0x10); -				DRM_DEBUG("TMDS PLL From COMBIOS %u %x\n", +				DRM_DEBUG_KMS("TMDS PLL From COMBIOS %u %x\n",  					  tmds->tmds_pll[i].freq,  					  tmds->tmds_pll[i].value);  			} @@ -1223,7 +1227,7 @@ bool radeon_legacy_get_tmds_info_from_combios(struct radeon_encoder *encoder,  					stride += 10;  				else  					stride += 6; -				DRM_DEBUG("TMDS PLL From COMBIOS %u %x\n", +				DRM_DEBUG_KMS("TMDS PLL From COMBIOS %u %x\n",  					  tmds->tmds_pll[i].freq,  					  tmds->tmds_pll[i].value);  			} @@ -2208,7 +2212,7 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev)  		uint16_t tmds_info =  		    combios_get_table_offset(dev, COMBIOS_DFP_INFO_TABLE);  		if (tmds_info) { -			DRM_DEBUG("Found DFP table, assuming DVI connector\n"); +			DRM_DEBUG_KMS("Found DFP table, assuming DVI connector\n");  			radeon_add_legacy_encoder(dev,  						  radeon_get_encoder_id(dev, @@ -2234,7 +2238,7 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev)  		} else {  			uint16_t crt_info =  				combios_get_table_offset(dev, COMBIOS_CRT_INFO_TABLE); -			DRM_DEBUG("Found CRT table, assuming VGA connector\n"); +			DRM_DEBUG_KMS("Found CRT table, assuming VGA connector\n");  			if (crt_info) {  				radeon_add_legacy_encoder(dev,  							  radeon_get_encoder_id(dev, @@ -2251,7 +2255,7 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev)  							    CONNECTOR_OBJECT_ID_VGA,  							    &hpd);  			} else { -				DRM_DEBUG("No connector info found\n"); +				DRM_DEBUG_KMS("No connector info found\n");  				return false;  			}  		} @@ -2340,7 +2344,7 @@ bool radeon_get_legacy_connector_info_from_bios(struct drm_device *dev)  					ddc_i2c.valid = false;  					break;  				} -				DRM_DEBUG("LCD DDC Info Table found!\n"); +				DRM_DEBUG_KMS("LCD DDC Info Table found!\n");  			} else  				ddc_i2c.valid = false; @@ -2941,9 +2945,8 @@ static void combios_write_ram_size(struct drm_device *dev)  		if (rev < 3) {  			mem_cntl = RBIOS32(offset + 1);  			mem_size = RBIOS16(offset + 5); -			if (((rdev->flags & RADEON_FAMILY_MASK) < CHIP_R200) && -			    ((dev->pdev->device != 0x515e) -			     && (dev->pdev->device != 0x5969))) +			if ((rdev->family < CHIP_R200) && +			    !ASIC_IS_RN50(rdev))  				WREG32(RADEON_MEM_CNTL, mem_cntl);  		}  	} @@ -2954,10 +2957,8 @@ static void combios_write_ram_size(struct drm_device *dev)  		if (offset) {  			rev = RBIOS8(offset - 1);  			if (rev < 1) { -				if (((rdev->flags & RADEON_FAMILY_MASK) < -				     CHIP_R200) -				    && ((dev->pdev->device != 0x515e) -					&& (dev->pdev->device != 0x5969))) { +				if ((rdev->family < CHIP_R200) +				    && !ASIC_IS_RN50(rdev)) {  					int ram = 0;  					int mem_addr_mapping = 0; @@ -3121,14 +3122,14 @@ radeon_combios_connected_scratch_regs(struct drm_connector *connector,  	if ((radeon_encoder->devices & ATOM_DEVICE_TV1_SUPPORT) &&  	    (radeon_connector->devices & ATOM_DEVICE_TV1_SUPPORT)) {  		if (connected) { -			DRM_DEBUG("TV1 connected\n"); +			DRM_DEBUG_KMS("TV1 connected\n");  			/* fix me */  			bios_4_scratch |= RADEON_TV1_ATTACHED_SVIDEO;  			/*save->bios_4_scratch |= RADEON_TV1_ATTACHED_COMP; */  			bios_5_scratch |= RADEON_TV1_ON;  			bios_5_scratch |= RADEON_ACC_REQ_TV1;  		} else { -			DRM_DEBUG("TV1 disconnected\n"); +			DRM_DEBUG_KMS("TV1 disconnected\n");  			bios_4_scratch &= ~RADEON_TV1_ATTACHED_MASK;  			bios_5_scratch &= ~RADEON_TV1_ON;  			bios_5_scratch &= ~RADEON_ACC_REQ_TV1; @@ -3137,12 +3138,12 @@ radeon_combios_connected_scratch_regs(struct drm_connector *connector,  	if ((radeon_encoder->devices & ATOM_DEVICE_LCD1_SUPPORT) &&  	    (radeon_connector->devices & ATOM_DEVICE_LCD1_SUPPORT)) {  		if (connected) { -			DRM_DEBUG("LCD1 connected\n"); +			DRM_DEBUG_KMS("LCD1 connected\n");  			bios_4_scratch |= RADEON_LCD1_ATTACHED;  			bios_5_scratch |= RADEON_LCD1_ON;  			bios_5_scratch |= RADEON_ACC_REQ_LCD1;  		} else { -			DRM_DEBUG("LCD1 disconnected\n"); +			DRM_DEBUG_KMS("LCD1 disconnected\n");  			bios_4_scratch &= ~RADEON_LCD1_ATTACHED;  			bios_5_scratch &= ~RADEON_LCD1_ON;  			bios_5_scratch &= ~RADEON_ACC_REQ_LCD1; @@ -3151,12 +3152,12 @@ radeon_combios_connected_scratch_regs(struct drm_connector *connector,  	if ((radeon_encoder->devices & ATOM_DEVICE_CRT1_SUPPORT) &&  	    (radeon_connector->devices & ATOM_DEVICE_CRT1_SUPPORT)) {  		if (connected) { -			DRM_DEBUG("CRT1 connected\n"); +			DRM_DEBUG_KMS("CRT1 connected\n");  			bios_4_scratch |= RADEON_CRT1_ATTACHED_COLOR;  			bios_5_scratch |= RADEON_CRT1_ON;  			bios_5_scratch |= RADEON_ACC_REQ_CRT1;  		} else { -			DRM_DEBUG("CRT1 disconnected\n"); +			DRM_DEBUG_KMS("CRT1 disconnected\n");  			bios_4_scratch &= ~RADEON_CRT1_ATTACHED_MASK;  			bios_5_scratch &= ~RADEON_CRT1_ON;  			bios_5_scratch &= ~RADEON_ACC_REQ_CRT1; @@ -3165,12 +3166,12 @@ radeon_combios_connected_scratch_regs(struct drm_connector *connector,  	if ((radeon_encoder->devices & ATOM_DEVICE_CRT2_SUPPORT) &&  	    (radeon_connector->devices & ATOM_DEVICE_CRT2_SUPPORT)) {  		if (connected) { -			DRM_DEBUG("CRT2 connected\n"); +			DRM_DEBUG_KMS("CRT2 connected\n");  			bios_4_scratch |= RADEON_CRT2_ATTACHED_COLOR;  			bios_5_scratch |= RADEON_CRT2_ON;  			bios_5_scratch |= RADEON_ACC_REQ_CRT2;  		} else { -			DRM_DEBUG("CRT2 disconnected\n"); +			DRM_DEBUG_KMS("CRT2 disconnected\n");  			bios_4_scratch &= ~RADEON_CRT2_ATTACHED_MASK;  			bios_5_scratch &= ~RADEON_CRT2_ON;  			bios_5_scratch &= ~RADEON_ACC_REQ_CRT2; @@ -3179,12 +3180,12 @@ radeon_combios_connected_scratch_regs(struct drm_connector *connector,  	if ((radeon_encoder->devices & ATOM_DEVICE_DFP1_SUPPORT) &&  	    (radeon_connector->devices & ATOM_DEVICE_DFP1_SUPPORT)) {  		if (connected) { -			DRM_DEBUG("DFP1 connected\n"); +			DRM_DEBUG_KMS("DFP1 connected\n");  			bios_4_scratch |= RADEON_DFP1_ATTACHED;  			bios_5_scratch |= RADEON_DFP1_ON;  			bios_5_scratch |= RADEON_ACC_REQ_DFP1;  		} else { -			DRM_DEBUG("DFP1 disconnected\n"); +			DRM_DEBUG_KMS("DFP1 disconnected\n");  			bios_4_scratch &= ~RADEON_DFP1_ATTACHED;  			bios_5_scratch &= ~RADEON_DFP1_ON;  			bios_5_scratch &= ~RADEON_ACC_REQ_DFP1; @@ -3193,12 +3194,12 @@ radeon_combios_connected_scratch_regs(struct drm_connector *connector,  	if ((radeon_encoder->devices & ATOM_DEVICE_DFP2_SUPPORT) &&  	    (radeon_connector->devices & ATOM_DEVICE_DFP2_SUPPORT)) {  		if (connected) { -			DRM_DEBUG("DFP2 connected\n"); +			DRM_DEBUG_KMS("DFP2 connected\n");  			bios_4_scratch |= RADEON_DFP2_ATTACHED;  			bios_5_scratch |= RADEON_DFP2_ON;  			bios_5_scratch |= RADEON_ACC_REQ_DFP2;  		} else { -			DRM_DEBUG("DFP2 disconnected\n"); +			DRM_DEBUG_KMS("DFP2 disconnected\n");  			bios_4_scratch &= ~RADEON_DFP2_ATTACHED;  			bios_5_scratch &= ~RADEON_DFP2_ON;  			bios_5_scratch &= ~RADEON_ACC_REQ_DFP2; diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c index adccbc2c202..2395c8600cf 100644 --- a/drivers/gpu/drm/radeon/radeon_connectors.c +++ b/drivers/gpu/drm/radeon/radeon_connectors.c @@ -214,7 +214,7 @@ static struct drm_display_mode *radeon_fp_native_mode(struct drm_encoder *encode  		mode->type = DRM_MODE_TYPE_PREFERRED | DRM_MODE_TYPE_DRIVER;  		drm_mode_set_name(mode); -		DRM_DEBUG("Adding native panel mode %s\n", mode->name); +		DRM_DEBUG_KMS("Adding native panel mode %s\n", mode->name);  	} else if (native_mode->hdisplay != 0 &&  		   native_mode->vdisplay != 0) {  		/* mac laptops without an edid */ @@ -226,7 +226,7 @@ static struct drm_display_mode *radeon_fp_native_mode(struct drm_encoder *encode  		 */  		mode = drm_cvt_mode(dev, native_mode->hdisplay, native_mode->vdisplay, 60, true, false, false);  		mode->type = DRM_MODE_TYPE_PREFERRED | DRM_MODE_TYPE_DRIVER; -		DRM_DEBUG("Adding cvt approximation of native panel mode %s\n", mode->name); +		DRM_DEBUG_KMS("Adding cvt approximation of native panel mode %s\n", mode->name);  	}  	return mode;  } @@ -312,6 +312,20 @@ int radeon_connector_set_property(struct drm_connector *connector, struct drm_pr  		}  	} +	if (property == rdev->mode_info.underscan_property) { +		/* need to find digital encoder on connector */ +		encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS); +		if (!encoder) +			return 0; + +		radeon_encoder = to_radeon_encoder(encoder); + +		if (radeon_encoder->underscan_type != val) { +			radeon_encoder->underscan_type = val; +			radeon_property_change_mode(&radeon_encoder->base); +		} +	} +  	if (property == rdev->mode_info.tv_std_property) {  		encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TVDAC);  		if (!encoder) { @@ -522,7 +536,7 @@ static int radeon_lvds_set_property(struct drm_connector *connector,  	struct radeon_encoder *radeon_encoder;  	enum radeon_rmx_type rmx_type; -	DRM_DEBUG("\n"); +	DRM_DEBUG_KMS("\n");  	if (property != dev->mode_config.scaling_mode_property)  		return 0; @@ -1082,6 +1096,8 @@ radeon_add_atom_connector(struct drm_device *dev,  		drm_connector_attach_property(&radeon_connector->base,  					      rdev->mode_info.load_detect_property,  					      1); +		/* no HPD on analog connectors */ +		radeon_connector->hpd.hpd = RADEON_HPD_NONE;  		connector->polled = DRM_CONNECTOR_POLL_CONNECT;  		break;  	case DRM_MODE_CONNECTOR_DVIA: @@ -1096,6 +1112,8 @@ radeon_add_atom_connector(struct drm_device *dev,  		drm_connector_attach_property(&radeon_connector->base,  					      rdev->mode_info.load_detect_property,  					      1); +		/* no HPD on analog connectors */ +		radeon_connector->hpd.hpd = RADEON_HPD_NONE;  		break;  	case DRM_MODE_CONNECTOR_DVII:  	case DRM_MODE_CONNECTOR_DVID: @@ -1116,6 +1134,10 @@ radeon_add_atom_connector(struct drm_device *dev,  		drm_connector_attach_property(&radeon_connector->base,  					      rdev->mode_info.coherent_mode_property,  					      1); +		if (ASIC_IS_AVIVO(rdev)) +			drm_connector_attach_property(&radeon_connector->base, +						      rdev->mode_info.underscan_property, +						      UNDERSCAN_AUTO);  		if (connector_type == DRM_MODE_CONNECTOR_DVII) {  			radeon_connector->dac_load_detect = true;  			drm_connector_attach_property(&radeon_connector->base, @@ -1141,6 +1163,10 @@ radeon_add_atom_connector(struct drm_device *dev,  		drm_connector_attach_property(&radeon_connector->base,  					      rdev->mode_info.coherent_mode_property,  					      1); +		if (ASIC_IS_AVIVO(rdev)) +			drm_connector_attach_property(&radeon_connector->base, +						      rdev->mode_info.underscan_property, +						      UNDERSCAN_AUTO);  		subpixel_order = SubPixelHorizontalRGB;  		break;  	case DRM_MODE_CONNECTOR_DisplayPort: @@ -1172,6 +1198,10 @@ radeon_add_atom_connector(struct drm_device *dev,  		drm_connector_attach_property(&radeon_connector->base,  					      rdev->mode_info.coherent_mode_property,  					      1); +		if (ASIC_IS_AVIVO(rdev)) +			drm_connector_attach_property(&radeon_connector->base, +						      rdev->mode_info.underscan_property, +						      UNDERSCAN_AUTO);  		break;  	case DRM_MODE_CONNECTOR_SVIDEO:  	case DRM_MODE_CONNECTOR_Composite: @@ -1186,6 +1216,8 @@ radeon_add_atom_connector(struct drm_device *dev,  			drm_connector_attach_property(&radeon_connector->base,  						      rdev->mode_info.tv_std_property,  						      radeon_atombios_get_tv_info(rdev)); +			/* no HPD on analog connectors */ +			radeon_connector->hpd.hpd = RADEON_HPD_NONE;  		}  		break;  	case DRM_MODE_CONNECTOR_LVDS: @@ -1209,7 +1241,7 @@ radeon_add_atom_connector(struct drm_device *dev,  		break;  	} -	if (hpd->hpd == RADEON_HPD_NONE) { +	if (radeon_connector->hpd.hpd == RADEON_HPD_NONE) {  		if (i2c_bus->valid)  			connector->polled = DRM_CONNECTOR_POLL_CONNECT;  	} else @@ -1276,6 +1308,8 @@ radeon_add_legacy_connector(struct drm_device *dev,  		drm_connector_attach_property(&radeon_connector->base,  					      rdev->mode_info.load_detect_property,  					      1); +		/* no HPD on analog connectors */ +		radeon_connector->hpd.hpd = RADEON_HPD_NONE;  		connector->polled = DRM_CONNECTOR_POLL_CONNECT;  		break;  	case DRM_MODE_CONNECTOR_DVIA: @@ -1290,6 +1324,8 @@ radeon_add_legacy_connector(struct drm_device *dev,  		drm_connector_attach_property(&radeon_connector->base,  					      rdev->mode_info.load_detect_property,  					      1); +		/* no HPD on analog connectors */ +		radeon_connector->hpd.hpd = RADEON_HPD_NONE;  		break;  	case DRM_MODE_CONNECTOR_DVII:  	case DRM_MODE_CONNECTOR_DVID: @@ -1328,6 +1364,8 @@ radeon_add_legacy_connector(struct drm_device *dev,  			drm_connector_attach_property(&radeon_connector->base,  						      rdev->mode_info.tv_std_property,  						      radeon_combios_get_tv_info(rdev)); +			/* no HPD on analog connectors */ +			radeon_connector->hpd.hpd = RADEON_HPD_NONE;  		}  		break;  	case DRM_MODE_CONNECTOR_LVDS: @@ -1345,7 +1383,7 @@ radeon_add_legacy_connector(struct drm_device *dev,  		break;  	} -	if (hpd->hpd == RADEON_HPD_NONE) { +	if (radeon_connector->hpd.hpd == RADEON_HPD_NONE) {  		if (i2c_bus->valid)  			connector->polled = DRM_CONNECTOR_POLL_CONNECT;  	} else diff --git a/drivers/gpu/drm/radeon/radeon_cp.c b/drivers/gpu/drm/radeon/radeon_cp.c index 2f042a3c0e6..eb6b9eed734 100644 --- a/drivers/gpu/drm/radeon/radeon_cp.c +++ b/drivers/gpu/drm/radeon/radeon_cp.c @@ -2120,8 +2120,8 @@ int radeon_driver_load(struct drm_device *dev, unsigned long flags)  	else  		dev_priv->flags |= RADEON_IS_PCI; -	ret = drm_addmap(dev, drm_get_resource_start(dev, 2), -			 drm_get_resource_len(dev, 2), _DRM_REGISTERS, +	ret = drm_addmap(dev, pci_resource_start(dev->pdev, 2), +			 pci_resource_len(dev->pdev, 2), _DRM_REGISTERS,  			 _DRM_READ_ONLY | _DRM_DRIVER, &dev_priv->mmio);  	if (ret != 0)  		return ret; @@ -2194,9 +2194,9 @@ int radeon_driver_firstopen(struct drm_device *dev)  	dev_priv->gart_info.table_size = RADEON_PCIGART_TABLE_SIZE; -	dev_priv->fb_aper_offset = drm_get_resource_start(dev, 0); +	dev_priv->fb_aper_offset = pci_resource_start(dev->pdev, 0);  	ret = drm_addmap(dev, dev_priv->fb_aper_offset, -			 drm_get_resource_len(dev, 0), _DRM_FRAME_BUFFER, +			 pci_resource_len(dev->pdev, 0), _DRM_FRAME_BUFFER,  			 _DRM_WRITE_COMBINING, &map);  	if (ret != 0)  		return ret; diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index dd279da9054..a64811a9451 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c @@ -415,6 +415,22 @@ static uint32_t cail_reg_read(struct card_info *info, uint32_t reg)  	return r;  } +static void cail_ioreg_write(struct card_info *info, uint32_t reg, uint32_t val) +{ +	struct radeon_device *rdev = info->dev->dev_private; + +	WREG32_IO(reg*4, val); +} + +static uint32_t cail_ioreg_read(struct card_info *info, uint32_t reg) +{ +	struct radeon_device *rdev = info->dev->dev_private; +	uint32_t r; + +	r = RREG32_IO(reg*4); +	return r; +} +  int radeon_atombios_init(struct radeon_device *rdev)  {  	struct card_info *atom_card_info = @@ -427,6 +443,15 @@ int radeon_atombios_init(struct radeon_device *rdev)  	atom_card_info->dev = rdev->ddev;  	atom_card_info->reg_read = cail_reg_read;  	atom_card_info->reg_write = cail_reg_write; +	/* needed for iio ops */ +	if (rdev->rio_mem) { +		atom_card_info->ioreg_read = cail_ioreg_read; +		atom_card_info->ioreg_write = cail_ioreg_write; +	} else { +		DRM_ERROR("Unable to find PCI I/O BAR; using MMIO for ATOM IIO\n"); +		atom_card_info->ioreg_read = cail_reg_read; +		atom_card_info->ioreg_write = cail_reg_write; +	}  	atom_card_info->mc_read = cail_mc_read;  	atom_card_info->mc_write = cail_mc_write;  	atom_card_info->pll_read = cail_pll_read; @@ -573,7 +598,7 @@ int radeon_device_init(struct radeon_device *rdev,  		       struct pci_dev *pdev,  		       uint32_t flags)  { -	int r; +	int r, i;  	int dma_bits;  	rdev->shutdown = false; @@ -650,8 +675,8 @@ int radeon_device_init(struct radeon_device *rdev,  	/* Registers mapping */  	/* TODO: block userspace mapping of io register */ -	rdev->rmmio_base = drm_get_resource_start(rdev->ddev, 2); -	rdev->rmmio_size = drm_get_resource_len(rdev->ddev, 2); +	rdev->rmmio_base = pci_resource_start(rdev->pdev, 2); +	rdev->rmmio_size = pci_resource_len(rdev->pdev, 2);  	rdev->rmmio = ioremap(rdev->rmmio_base, rdev->rmmio_size);  	if (rdev->rmmio == NULL) {  		return -ENOMEM; @@ -659,6 +684,17 @@ int radeon_device_init(struct radeon_device *rdev,  	DRM_INFO("register mmio base: 0x%08X\n", (uint32_t)rdev->rmmio_base);  	DRM_INFO("register mmio size: %u\n", (unsigned)rdev->rmmio_size); +	/* io port mapping */ +	for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { +		if (pci_resource_flags(rdev->pdev, i) & IORESOURCE_IO) { +			rdev->rio_mem_size = pci_resource_len(rdev->pdev, i); +			rdev->rio_mem = pci_iomap(rdev->pdev, i, rdev->rio_mem_size); +			break; +		} +	} +	if (rdev->rio_mem == NULL) +		DRM_ERROR("Unable to find PCI I/O BAR\n"); +  	/* if we have > 1 VGA cards, then disable the radeon VGA resources */  	/* this will fail for cards that aren't VGA class devices, just  	 * ignore it */ @@ -701,6 +737,9 @@ void radeon_device_fini(struct radeon_device *rdev)  	destroy_workqueue(rdev->wq);  	vga_switcheroo_unregister_client(rdev->pdev);  	vga_client_register(rdev->pdev, NULL, NULL, NULL); +	if (rdev->rio_mem) +		pci_iounmap(rdev->pdev, rdev->rio_mem); +	rdev->rio_mem = NULL;  	iounmap(rdev->rmmio);  	rdev->rmmio = NULL;  } diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c index 8154cdf796e..74dac9635d7 100644 --- a/drivers/gpu/drm/radeon/radeon_display.c +++ b/drivers/gpu/drm/radeon/radeon_display.c @@ -42,7 +42,7 @@ static void avivo_crtc_load_lut(struct drm_crtc *crtc)  	struct radeon_device *rdev = dev->dev_private;  	int i; -	DRM_DEBUG("%d\n", radeon_crtc->crtc_id); +	DRM_DEBUG_KMS("%d\n", radeon_crtc->crtc_id);  	WREG32(AVIVO_DC_LUTA_CONTROL + radeon_crtc->crtc_offset, 0);  	WREG32(AVIVO_DC_LUTA_BLACK_OFFSET_BLUE + radeon_crtc->crtc_offset, 0); @@ -75,7 +75,7 @@ static void evergreen_crtc_load_lut(struct drm_crtc *crtc)  	struct radeon_device *rdev = dev->dev_private;  	int i; -	DRM_DEBUG("%d\n", radeon_crtc->crtc_id); +	DRM_DEBUG_KMS("%d\n", radeon_crtc->crtc_id);  	WREG32(EVERGREEN_DC_LUT_CONTROL + radeon_crtc->crtc_offset, 0);  	WREG32(EVERGREEN_DC_LUT_BLACK_OFFSET_BLUE + radeon_crtc->crtc_offset, 0); @@ -469,7 +469,7 @@ static void radeon_compute_pll_legacy(struct radeon_pll *pll,  	uint32_t post_div;  	u32 pll_out_min, pll_out_max; -	DRM_DEBUG("PLL freq %llu %u %u\n", freq, pll->min_ref_div, pll->max_ref_div); +	DRM_DEBUG_KMS("PLL freq %llu %u %u\n", freq, pll->min_ref_div, pll->max_ref_div);  	freq = freq * 1000;  	if (pll->flags & RADEON_PLL_IS_LCD) { @@ -558,15 +558,17 @@ static void radeon_compute_pll_legacy(struct radeon_pll *pll,  					current_freq = radeon_div(tmp, ref_div * post_div);  					if (pll->flags & RADEON_PLL_PREFER_CLOSEST_LOWER) { -						error = freq - current_freq; -						error = error < 0 ? 0xffffffff : error; +						if (freq < current_freq) +							error = 0xffffffff; +						else +							error = freq - current_freq;  					} else  						error = abs(current_freq - freq);  					vco_diff = abs(vco - best_vco);  					if ((best_vco == 0 && error < best_error) ||  					    (best_vco != 0 && -					     (error < best_error - 100 || +					     ((best_error > 100 && error < best_error - 100) ||  					      (abs(error - best_error) < 100 && vco_diff < best_vco_diff)))) {  						best_post_div = post_div;  						best_ref_div = ref_div; @@ -803,7 +805,7 @@ done:  	*ref_div_p = ref_div;  	*post_div_p = post_div; -	DRM_DEBUG("%u %d.%d, %d, %d\n", *dot_clock_p, *fb_div_p, *frac_fb_div_p, *ref_div_p, *post_div_p); +	DRM_DEBUG_KMS("%u %d.%d, %d, %d\n", *dot_clock_p, *fb_div_p, *frac_fb_div_p, *ref_div_p, *post_div_p);  }  void radeon_compute_pll(struct radeon_pll *pll, @@ -919,6 +921,12 @@ static struct drm_prop_enum_list radeon_tv_std_enum_list[] =  	{ TV_STD_SECAM, "secam" },  }; +static struct drm_prop_enum_list radeon_underscan_enum_list[] = +{	{ UNDERSCAN_OFF, "off" }, +	{ UNDERSCAN_ON, "on" }, +	{ UNDERSCAN_AUTO, "auto" }, +}; +  static int radeon_modeset_create_props(struct radeon_device *rdev)  {  	int i, sz; @@ -972,6 +980,18 @@ static int radeon_modeset_create_props(struct radeon_device *rdev)  				      radeon_tv_std_enum_list[i].name);  	} +	sz = ARRAY_SIZE(radeon_underscan_enum_list); +	rdev->mode_info.underscan_property = +		drm_property_create(rdev->ddev, +				    DRM_MODE_PROP_ENUM, +				    "underscan", sz); +	for (i = 0; i < sz; i++) { +		drm_property_add_enum(rdev->mode_info.underscan_property, +				      i, +				      radeon_underscan_enum_list[i].type, +				      radeon_underscan_enum_list[i].name); +	} +  	return 0;  } @@ -1067,15 +1087,26 @@ bool radeon_crtc_scaling_mode_fixup(struct drm_crtc *crtc,  				struct drm_display_mode *adjusted_mode)  {  	struct drm_device *dev = crtc->dev; +	struct radeon_device *rdev = dev->dev_private;  	struct drm_encoder *encoder;  	struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);  	struct radeon_encoder *radeon_encoder; +	struct drm_connector *connector; +	struct radeon_connector *radeon_connector;  	bool first = true; +	u32 src_v = 1, dst_v = 1; +	u32 src_h = 1, dst_h = 1; + +	radeon_crtc->h_border = 0; +	radeon_crtc->v_border = 0;  	list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { -		radeon_encoder = to_radeon_encoder(encoder);  		if (encoder->crtc != crtc)  			continue; +		radeon_encoder = to_radeon_encoder(encoder); +		connector = radeon_get_connector_for_encoder(encoder); +		radeon_connector = to_radeon_connector(connector); +  		if (first) {  			/* set scaling */  			if (radeon_encoder->rmx_type == RMX_OFF) @@ -1085,31 +1116,49 @@ bool radeon_crtc_scaling_mode_fixup(struct drm_crtc *crtc,  				radeon_crtc->rmx_type = radeon_encoder->rmx_type;  			else  				radeon_crtc->rmx_type = RMX_OFF; +			src_v = crtc->mode.vdisplay; +			dst_v = radeon_crtc->native_mode.vdisplay; +			src_h = crtc->mode.hdisplay; +			dst_h = radeon_crtc->native_mode.vdisplay;  			/* copy native mode */  			memcpy(&radeon_crtc->native_mode,  			       &radeon_encoder->native_mode,  				sizeof(struct drm_display_mode)); + +			/* fix up for overscan on hdmi */ +			if (ASIC_IS_AVIVO(rdev) && +			    ((radeon_encoder->underscan_type == UNDERSCAN_ON) || +			     ((radeon_encoder->underscan_type == UNDERSCAN_AUTO) && +			      drm_detect_hdmi_monitor(radeon_connector->edid)))) { +				radeon_crtc->h_border = (mode->hdisplay >> 5) + 16; +				radeon_crtc->v_border = (mode->vdisplay >> 5) + 16; +				radeon_crtc->rmx_type = RMX_FULL; +				src_v = crtc->mode.vdisplay; +				dst_v = crtc->mode.vdisplay - (radeon_crtc->v_border * 2); +				src_h = crtc->mode.hdisplay; +				dst_h = crtc->mode.hdisplay - (radeon_crtc->h_border * 2); +			}  			first = false;  		} else {  			if (radeon_crtc->rmx_type != radeon_encoder->rmx_type) {  				/* WARNING: Right now this can't happen but  				 * in the future we need to check that scaling -				 * are consistent accross different encoder +				 * are consistent across different encoder  				 * (ie all encoder can work with the same  				 *  scaling).  				 */ -				DRM_ERROR("Scaling not consistent accross encoder.\n"); +				DRM_ERROR("Scaling not consistent across encoder.\n");  				return false;  			}  		}  	}  	if (radeon_crtc->rmx_type != RMX_OFF) {  		fixed20_12 a, b; -		a.full = dfixed_const(crtc->mode.vdisplay); -		b.full = dfixed_const(radeon_crtc->native_mode.hdisplay); +		a.full = dfixed_const(src_v); +		b.full = dfixed_const(dst_v);  		radeon_crtc->vsc.full = dfixed_div(a, b); -		a.full = dfixed_const(crtc->mode.hdisplay); -		b.full = dfixed_const(radeon_crtc->native_mode.vdisplay); +		a.full = dfixed_const(src_h); +		b.full = dfixed_const(dst_h);  		radeon_crtc->hsc.full = dfixed_div(a, b);  	} else {  		radeon_crtc->vsc.full = dfixed_const(1); diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c index e166fe4d7c3..795403b0e2c 100644 --- a/drivers/gpu/drm/radeon/radeon_drv.c +++ b/drivers/gpu/drm/radeon/radeon_drv.c @@ -46,9 +46,10 @@   * - 2.3.0 - add MSPOS + 3D texture + r500 VAP regs   * - 2.4.0 - add crtc id query   * - 2.5.0 - add get accel 2 to work around ddx breakage for evergreen + * - 2.6.0 - add tiling config query (r6xx+), add initial HiZ support (r300->r500)   */  #define KMS_DRIVER_MAJOR	2 -#define KMS_DRIVER_MINOR	5 +#define KMS_DRIVER_MINOR	6  #define KMS_DRIVER_PATCHLEVEL	0  int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags);  int radeon_driver_unload_kms(struct drm_device *dev); @@ -238,7 +239,7 @@ static struct drm_driver kms_driver;  static int __devinit  radeon_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)  { -	return drm_get_dev(pdev, ent, &kms_driver); +	return drm_get_pci_dev(pdev, ent, &kms_driver);  }  static void diff --git a/drivers/gpu/drm/radeon/radeon_encoders.c b/drivers/gpu/drm/radeon/radeon_encoders.c index e0b30b264c2..263c8098d7d 100644 --- a/drivers/gpu/drm/radeon/radeon_encoders.c +++ b/drivers/gpu/drm/radeon/radeon_encoders.c @@ -205,14 +205,14 @@ void radeon_encoder_set_active_device(struct drm_encoder *encoder)  		if (connector->encoder == encoder) {  			struct radeon_connector *radeon_connector = to_radeon_connector(connector);  			radeon_encoder->active_device = radeon_encoder->devices & radeon_connector->devices; -			DRM_DEBUG("setting active device to %08x from %08x %08x for encoder %d\n", +			DRM_DEBUG_KMS("setting active device to %08x from %08x %08x for encoder %d\n",  				  radeon_encoder->active_device, radeon_encoder->devices,  				  radeon_connector->devices, encoder->encoder_type);  		}  	}  } -static struct drm_connector * +struct drm_connector *  radeon_get_connector_for_encoder(struct drm_encoder *encoder)  {  	struct drm_device *dev = encoder->dev; @@ -1021,7 +1021,7 @@ radeon_atom_encoder_dpms(struct drm_encoder *encoder, int mode)  	memset(&args, 0, sizeof(args)); -	DRM_DEBUG("encoder dpms %d to mode %d, devices %08x, active_devices %08x\n", +	DRM_DEBUG_KMS("encoder dpms %d to mode %d, devices %08x, active_devices %08x\n",  		  radeon_encoder->encoder_id, mode, radeon_encoder->devices,  		  radeon_encoder->active_device);  	switch (radeon_encoder->encoder_id) { @@ -1484,7 +1484,7 @@ radeon_atom_dac_detect(struct drm_encoder *encoder, struct drm_connector *connec  	uint32_t bios_0_scratch;  	if (!atombios_dac_load_detect(encoder, connector)) { -		DRM_DEBUG("detect returned false \n"); +		DRM_DEBUG_KMS("detect returned false \n");  		return connector_status_unknown;  	} @@ -1493,7 +1493,7 @@ radeon_atom_dac_detect(struct drm_encoder *encoder, struct drm_connector *connec  	else  		bios_0_scratch = RREG32(RADEON_BIOS_0_SCRATCH); -	DRM_DEBUG("Bios 0 scratch %x %08x\n", bios_0_scratch, radeon_encoder->devices); +	DRM_DEBUG_KMS("Bios 0 scratch %x %08x\n", bios_0_scratch, radeon_encoder->devices);  	if (radeon_connector->devices & ATOM_DEVICE_CRT1_SUPPORT) {  		if (bios_0_scratch & ATOM_S0_CRT1_MASK)  			return connector_status_connected; @@ -1694,6 +1694,7 @@ radeon_add_atom_encoder(struct drm_device *dev, uint32_t encoder_id, uint32_t su  	radeon_encoder->encoder_id = encoder_id;  	radeon_encoder->devices = supported_device;  	radeon_encoder->rmx_type = RMX_OFF; +	radeon_encoder->underscan_type = UNDERSCAN_OFF;  	switch (radeon_encoder->encoder_id) {  	case ENCODER_OBJECT_ID_INTERNAL_LVDS: @@ -1707,6 +1708,8 @@ radeon_add_atom_encoder(struct drm_device *dev, uint32_t encoder_id, uint32_t su  		} else {  			drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, DRM_MODE_ENCODER_TMDS);  			radeon_encoder->enc_priv = radeon_atombios_set_dig_info(radeon_encoder); +			if (ASIC_IS_AVIVO(rdev)) +				radeon_encoder->underscan_type = UNDERSCAN_AUTO;  		}  		drm_encoder_helper_add(encoder, &radeon_atom_dig_helper_funcs);  		break; @@ -1736,6 +1739,8 @@ radeon_add_atom_encoder(struct drm_device *dev, uint32_t encoder_id, uint32_t su  		} else {  			drm_encoder_init(dev, encoder, &radeon_atom_enc_funcs, DRM_MODE_ENCODER_TMDS);  			radeon_encoder->enc_priv = radeon_atombios_set_dig_info(radeon_encoder); +			if (ASIC_IS_AVIVO(rdev)) +				radeon_encoder->underscan_type = UNDERSCAN_AUTO;  		}  		drm_encoder_helper_add(encoder, &radeon_atom_dig_helper_funcs);  		break; diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c index ab389f89fa8..ddcd3b13f15 100644 --- a/drivers/gpu/drm/radeon/radeon_kms.c +++ b/drivers/gpu/drm/radeon/radeon_kms.c @@ -49,7 +49,7 @@ int radeon_driver_unload_kms(struct drm_device *dev)  int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags)  {  	struct radeon_device *rdev; -	int r; +	int r, acpi_status;  	rdev = kzalloc(sizeof(struct radeon_device), GFP_KERNEL);  	if (rdev == NULL) { @@ -77,6 +77,12 @@ int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags)  		dev_err(&dev->pdev->dev, "Fatal error during GPU init\n");  		goto out;  	} + +	/* Call ACPI methods */ +	acpi_status = radeon_acpi_init(rdev); +	if (acpi_status) +		dev_dbg(&dev->pdev->dev, "Error during ACPI methods call\n"); +  	/* Again modeset_init should fail only on fatal error  	 * otherwise it should provide enough functionalities  	 * for shadowfb to run @@ -135,15 +141,36 @@ int radeon_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)  			}  		}  		if (!found) { -			DRM_DEBUG("unknown crtc id %d\n", value); +			DRM_DEBUG_KMS("unknown crtc id %d\n", value);  			return -EINVAL;  		}  		break;  	case RADEON_INFO_ACCEL_WORKING2:  		value = rdev->accel_working;  		break; +	case RADEON_INFO_TILING_CONFIG: +		if (rdev->family >= CHIP_CEDAR) +			value = rdev->config.evergreen.tile_config; +		else if (rdev->family >= CHIP_RV770) +			value = rdev->config.rv770.tile_config; +		else if (rdev->family >= CHIP_R600) +			value = rdev->config.r600.tile_config; +		else { +			DRM_DEBUG_KMS("tiling config is r6xx+ only!\n"); +			return -EINVAL; +		} +	case RADEON_INFO_WANT_HYPERZ: +		mutex_lock(&dev->struct_mutex); +		if (rdev->hyperz_filp) +			value = 0; +		else { +			rdev->hyperz_filp = filp; +			value = 1; +		} +		mutex_unlock(&dev->struct_mutex); +		break;  	default: -		DRM_DEBUG("Invalid request %d\n", info->request); +		DRM_DEBUG_KMS("Invalid request %d\n", info->request);  		return -EINVAL;  	}  	if (DRM_COPY_TO_USER(value_ptr, &value, sizeof(uint32_t))) { @@ -181,9 +208,11 @@ void radeon_driver_postclose_kms(struct drm_device *dev,  void radeon_driver_preclose_kms(struct drm_device *dev,  				struct drm_file *file_priv)  { +	struct radeon_device *rdev = dev->dev_private; +	if (rdev->hyperz_filp == file_priv) +		rdev->hyperz_filp = NULL;  } -  /*   * VBlank related functions.   */ diff --git a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c index e1e5255396a..989df519a1e 100644 --- a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c +++ b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c @@ -362,10 +362,10 @@ int radeon_crtc_set_base(struct drm_crtc *crtc, int x, int y,  	uint32_t gen_cntl_reg, gen_cntl_val;  	int r; -	DRM_DEBUG("\n"); +	DRM_DEBUG_KMS("\n");  	/* no fb bound */  	if (!crtc->fb) { -		DRM_DEBUG("No FB bound\n"); +		DRM_DEBUG_KMS("No FB bound\n");  		return 0;  	} @@ -528,7 +528,7 @@ static bool radeon_set_crtc_timing(struct drm_crtc *crtc, struct drm_display_mod  	uint32_t crtc_v_sync_strt_wid;  	bool is_tv = false; -	DRM_DEBUG("\n"); +	DRM_DEBUG_KMS("\n");  	list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {  		if (encoder->crtc == crtc) {  			struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); @@ -757,7 +757,7 @@ static void radeon_set_pll(struct drm_crtc *crtc, struct drm_display_mode *mode)  		}  	} -	DRM_DEBUG("\n"); +	DRM_DEBUG_KMS("\n");  	if (!use_bios_divs) {  		radeon_compute_pll(pll, mode->clock, @@ -772,7 +772,7 @@ static void radeon_set_pll(struct drm_crtc *crtc, struct drm_display_mode *mode)  		if (!post_div->divider)  			post_div = &post_divs[0]; -		DRM_DEBUG("dc=%u, fd=%d, rd=%d, pd=%d\n", +		DRM_DEBUG_KMS("dc=%u, fd=%d, rd=%d, pd=%d\n",  			  (unsigned)freq,  			  feedback_div,  			  reference_div, @@ -841,12 +841,12 @@ static void radeon_set_pll(struct drm_crtc *crtc, struct drm_display_mode *mode)  			       | RADEON_P2PLL_SLEEP  			       | RADEON_P2PLL_ATOMIC_UPDATE_EN)); -		DRM_DEBUG("Wrote2: 0x%08x 0x%08x 0x%08x (0x%08x)\n", +		DRM_DEBUG_KMS("Wrote2: 0x%08x 0x%08x 0x%08x (0x%08x)\n",  			  (unsigned)pll_ref_div,  			  (unsigned)pll_fb_post_div,  			  (unsigned)htotal_cntl,  			  RREG32_PLL(RADEON_P2PLL_CNTL)); -		DRM_DEBUG("Wrote2: rd=%u, fd=%u, pd=%u\n", +		DRM_DEBUG_KMS("Wrote2: rd=%u, fd=%u, pd=%u\n",  			  (unsigned)pll_ref_div & RADEON_P2PLL_REF_DIV_MASK,  			  (unsigned)pll_fb_post_div & RADEON_P2PLL_FB0_DIV_MASK,  			  (unsigned)((pll_fb_post_div & @@ -947,12 +947,12 @@ static void radeon_set_pll(struct drm_crtc *crtc, struct drm_display_mode *mode)  			       | RADEON_PPLL_ATOMIC_UPDATE_EN  			       | RADEON_PPLL_VGA_ATOMIC_UPDATE_EN)); -		DRM_DEBUG("Wrote: 0x%08x 0x%08x 0x%08x (0x%08x)\n", +		DRM_DEBUG_KMS("Wrote: 0x%08x 0x%08x 0x%08x (0x%08x)\n",  			  pll_ref_div,  			  pll_fb_post_div,  			  (unsigned)htotal_cntl,  			  RREG32_PLL(RADEON_PPLL_CNTL)); -		DRM_DEBUG("Wrote: rd=%d, fd=%d, pd=%d\n", +		DRM_DEBUG_KMS("Wrote: rd=%d, fd=%d, pd=%d\n",  			  pll_ref_div & RADEON_PPLL_REF_DIV_MASK,  			  pll_fb_post_div & RADEON_PPLL_FB3_DIV_MASK,  			  (pll_fb_post_div & RADEON_PPLL_POST3_DIV_MASK) >> 16); diff --git a/drivers/gpu/drm/radeon/radeon_legacy_encoders.c b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c index 5688a0cf6bb..b8149cbc0c7 100644 --- a/drivers/gpu/drm/radeon/radeon_legacy_encoders.c +++ b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c @@ -47,7 +47,7 @@ static void radeon_legacy_lvds_dpms(struct drm_encoder *encoder, int mode)  	uint32_t lvds_gen_cntl, lvds_pll_cntl, pixclks_cntl, disp_pwr_man;  	int panel_pwr_delay = 2000;  	bool is_mac = false; -	DRM_DEBUG("\n"); +	DRM_DEBUG_KMS("\n");  	if (radeon_encoder->enc_priv) {  		if (rdev->is_atom_bios) { @@ -151,7 +151,7 @@ static void radeon_legacy_lvds_mode_set(struct drm_encoder *encoder,  	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);  	uint32_t lvds_pll_cntl, lvds_gen_cntl, lvds_ss_gen_cntl; -	DRM_DEBUG("\n"); +	DRM_DEBUG_KMS("\n");  	lvds_pll_cntl = RREG32(RADEON_LVDS_PLL_CNTL);  	lvds_pll_cntl &= ~RADEON_LVDS_PLL_EN; @@ -167,7 +167,7 @@ static void radeon_legacy_lvds_mode_set(struct drm_encoder *encoder,  	} else {  		struct radeon_encoder_lvds *lvds = (struct radeon_encoder_lvds *)radeon_encoder->enc_priv;  		if (lvds) { -			DRM_DEBUG("bios LVDS_GEN_CNTL: 0x%x\n", lvds->lvds_gen_cntl); +			DRM_DEBUG_KMS("bios LVDS_GEN_CNTL: 0x%x\n", lvds->lvds_gen_cntl);  			lvds_gen_cntl = lvds->lvds_gen_cntl;  			lvds_ss_gen_cntl &= ~((0xf << RADEON_LVDS_PWRSEQ_DELAY1_SHIFT) |  					      (0xf << RADEON_LVDS_PWRSEQ_DELAY2_SHIFT)); @@ -250,7 +250,7 @@ static void radeon_legacy_primary_dac_dpms(struct drm_encoder *encoder, int mode  	uint32_t dac_cntl = RREG32(RADEON_DAC_CNTL);  	uint32_t dac_macro_cntl = RREG32(RADEON_DAC_MACRO_CNTL); -	DRM_DEBUG("\n"); +	DRM_DEBUG_KMS("\n");  	switch (mode) {  	case DRM_MODE_DPMS_ON: @@ -315,7 +315,7 @@ static void radeon_legacy_primary_dac_mode_set(struct drm_encoder *encoder,  	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);  	uint32_t disp_output_cntl, dac_cntl, dac2_cntl, dac_macro_cntl; -	DRM_DEBUG("\n"); +	DRM_DEBUG_KMS("\n");  	if (radeon_crtc->crtc_id == 0) {  		if (rdev->family == CHIP_R200 || ASIC_IS_R300(rdev)) { @@ -446,7 +446,7 @@ static void radeon_legacy_tmds_int_dpms(struct drm_encoder *encoder, int mode)  	struct drm_device *dev = encoder->dev;  	struct radeon_device *rdev = dev->dev_private;  	uint32_t fp_gen_cntl = RREG32(RADEON_FP_GEN_CNTL); -	DRM_DEBUG("\n"); +	DRM_DEBUG_KMS("\n");  	switch (mode) {  	case DRM_MODE_DPMS_ON: @@ -502,7 +502,7 @@ static void radeon_legacy_tmds_int_mode_set(struct drm_encoder *encoder,  	uint32_t tmp, tmds_pll_cntl, tmds_transmitter_cntl, fp_gen_cntl;  	int i; -	DRM_DEBUG("\n"); +	DRM_DEBUG_KMS("\n");  	tmp = tmds_pll_cntl = RREG32(RADEON_TMDS_PLL_CNTL);  	tmp &= 0xfffff; @@ -610,7 +610,7 @@ static void radeon_legacy_tmds_ext_dpms(struct drm_encoder *encoder, int mode)  	struct drm_device *dev = encoder->dev;  	struct radeon_device *rdev = dev->dev_private;  	uint32_t fp2_gen_cntl = RREG32(RADEON_FP2_GEN_CNTL); -	DRM_DEBUG("\n"); +	DRM_DEBUG_KMS("\n");  	switch (mode) {  	case DRM_MODE_DPMS_ON: @@ -666,7 +666,7 @@ static void radeon_legacy_tmds_ext_mode_set(struct drm_encoder *encoder,  	struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);  	uint32_t fp2_gen_cntl; -	DRM_DEBUG("\n"); +	DRM_DEBUG_KMS("\n");  	if (rdev->is_atom_bios) {  		radeon_encoder->pixel_clock = adjusted_mode->clock; @@ -760,7 +760,7 @@ static void radeon_legacy_tv_dac_dpms(struct drm_encoder *encoder, int mode)  	uint32_t fp2_gen_cntl = 0, crtc2_gen_cntl = 0, tv_dac_cntl = 0;  	uint32_t tv_master_cntl = 0;  	bool is_tv; -	DRM_DEBUG("\n"); +	DRM_DEBUG_KMS("\n");  	is_tv = radeon_encoder->active_device & ATOM_DEVICE_TV_SUPPORT ? true : false; @@ -878,7 +878,7 @@ static void radeon_legacy_tv_dac_mode_set(struct drm_encoder *encoder,  	uint32_t disp_hw_debug = 0, fp2_gen_cntl = 0, disp_tv_out_cntl = 0;  	bool is_tv = false; -	DRM_DEBUG("\n"); +	DRM_DEBUG_KMS("\n");  	is_tv = radeon_encoder->active_device & ATOM_DEVICE_TV_SUPPORT ? true : false; @@ -1075,10 +1075,10 @@ static bool r300_legacy_tv_detect(struct drm_encoder *encoder,  	tmp = RREG32(RADEON_TV_DAC_CNTL);  	if ((tmp & RADEON_TV_DAC_GDACDET) != 0) {  		found = true; -		DRM_DEBUG("S-video TV connection detected\n"); +		DRM_DEBUG_KMS("S-video TV connection detected\n");  	} else if ((tmp & RADEON_TV_DAC_BDACDET) != 0) {  		found = true; -		DRM_DEBUG("Composite TV connection detected\n"); +		DRM_DEBUG_KMS("Composite TV connection detected\n");  	}  	WREG32(RADEON_TV_DAC_CNTL, tv_dac_cntl); @@ -1141,10 +1141,10 @@ static bool radeon_legacy_tv_detect(struct drm_encoder *encoder,  	tmp = RREG32(RADEON_TV_DAC_CNTL);  	if (tmp & RADEON_TV_DAC_GDACDET) {  		found = true; -		DRM_DEBUG("S-video TV connection detected\n"); +		DRM_DEBUG_KMS("S-video TV connection detected\n");  	} else if ((tmp & RADEON_TV_DAC_BDACDET) != 0) {  		found = true; -		DRM_DEBUG("Composite TV connection detected\n"); +		DRM_DEBUG_KMS("Composite TV connection detected\n");  	}  	WREG32(RADEON_TV_PRE_DAC_MUX_CNTL, tv_pre_dac_mux_cntl); diff --git a/drivers/gpu/drm/radeon/radeon_legacy_tv.c b/drivers/gpu/drm/radeon/radeon_legacy_tv.c index 03204039774..c7b6cb428d0 100644 --- a/drivers/gpu/drm/radeon/radeon_legacy_tv.c +++ b/drivers/gpu/drm/radeon/radeon_legacy_tv.c @@ -496,7 +496,7 @@ static bool radeon_legacy_tv_init_restarts(struct drm_encoder *encoder)  	restart -= v_offset + h_offset; -	DRM_DEBUG("compute_restarts: def = %u h = %d v = %d, p1 = %04x, p2 = %04x, restart = %d\n", +	DRM_DEBUG_KMS("compute_restarts: def = %u h = %d v = %d, p1 = %04x, p2 = %04x, restart = %d\n",  		  const_ptr->def_restart, tv_dac->h_pos, tv_dac->v_pos, p1, p2, restart);  	tv_dac->tv.hrestart = restart % h_total; @@ -505,7 +505,7 @@ static bool radeon_legacy_tv_init_restarts(struct drm_encoder *encoder)  	restart /= v_total;  	tv_dac->tv.frestart = restart % f_total; -	DRM_DEBUG("compute_restart: F/H/V=%u,%u,%u\n", +	DRM_DEBUG_KMS("compute_restart: F/H/V=%u,%u,%u\n",  		  (unsigned)tv_dac->tv.frestart,  		  (unsigned)tv_dac->tv.vrestart,  		  (unsigned)tv_dac->tv.hrestart); @@ -523,7 +523,7 @@ static bool radeon_legacy_tv_init_restarts(struct drm_encoder *encoder)  	tv_dac->tv.timing_cntl = (tv_dac->tv.timing_cntl & ~RADEON_H_INC_MASK) |  		((u32)h_inc << RADEON_H_INC_SHIFT); -	DRM_DEBUG("compute_restart: h_size = %d h_inc = %d\n", tv_dac->h_size, h_inc); +	DRM_DEBUG_KMS("compute_restart: h_size = %d h_inc = %d\n", tv_dac->h_size, h_inc);  	return h_changed;  } diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h index 95696aa57ac..71aea4037e9 100644 --- a/drivers/gpu/drm/radeon/radeon_mode.h +++ b/drivers/gpu/drm/radeon/radeon_mode.h @@ -66,6 +66,12 @@ enum radeon_tv_std {  	TV_STD_PAL_N,  }; +enum radeon_underscan_type { +	UNDERSCAN_OFF, +	UNDERSCAN_ON, +	UNDERSCAN_AUTO, +}; +  enum radeon_hpd_id {  	RADEON_HPD_1 = 0,  	RADEON_HPD_2, @@ -226,10 +232,12 @@ struct radeon_mode_info {  	struct drm_property *coherent_mode_property;  	/* DAC enable load detect */  	struct drm_property *load_detect_property; -	/* TV standard load detect */ +	/* TV standard */  	struct drm_property *tv_std_property;  	/* legacy TMDS PLL detect */  	struct drm_property *tmds_pll_property; +	/* underscan */ +	struct drm_property *underscan_property;  	/* hardcoded DFP edid from BIOS */  	struct edid *bios_hardcoded_edid; @@ -266,6 +274,8 @@ struct radeon_crtc {  	uint32_t legacy_display_base_addr;  	uint32_t legacy_cursor_offset;  	enum radeon_rmx_type rmx_type; +	u8 h_border; +	u8 v_border;  	fixed20_12 vsc;  	fixed20_12 hsc;  	struct drm_display_mode native_mode; @@ -354,6 +364,7 @@ struct radeon_encoder {  	uint32_t flags;  	uint32_t pixel_clock;  	enum radeon_rmx_type rmx_type; +	enum radeon_underscan_type underscan_type;  	struct drm_display_mode native_mode;  	void *enc_priv;  	int audio_polling_active; @@ -392,7 +403,7 @@ struct radeon_connector {  	uint32_t connector_id;  	uint32_t devices;  	struct radeon_i2c_chan *ddc_bus; -	/* some systems have a an hdmi and vga port with a shared ddc line */ +	/* some systems have an hdmi and vga port with a shared ddc line */  	bool shared_ddc;  	bool use_digital;  	/* we need to mind the EDID between detect @@ -414,6 +425,9 @@ radeon_combios_get_tv_info(struct radeon_device *rdev);  extern enum radeon_tv_std  radeon_atombios_get_tv_info(struct radeon_device *rdev); +extern struct drm_connector * +radeon_get_connector_for_encoder(struct drm_encoder *encoder); +  extern void radeon_connector_hotplug(struct drm_connector *connector);  extern bool radeon_dp_needs_link_train(struct radeon_connector *radeon_connector);  extern int radeon_dp_mode_valid_helper(struct radeon_connector *radeon_connector, diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c index d5b9373ce06..0afd1e62347 100644 --- a/drivers/gpu/drm/radeon/radeon_object.c +++ b/drivers/gpu/drm/radeon/radeon_object.c @@ -110,6 +110,7 @@ int radeon_bo_create(struct radeon_device *rdev, struct drm_gem_object *gobj,  	bo->surface_reg = -1;  	INIT_LIST_HEAD(&bo->list); +retry:  	radeon_ttm_placement_from_domain(bo, domain);  	/* Kernel allocation are uninterruptible */  	mutex_lock(&rdev->vram_mutex); @@ -118,10 +119,15 @@ int radeon_bo_create(struct radeon_device *rdev, struct drm_gem_object *gobj,  			&radeon_ttm_bo_destroy);  	mutex_unlock(&rdev->vram_mutex);  	if (unlikely(r != 0)) { -		if (r != -ERESTARTSYS) +		if (r != -ERESTARTSYS) { +			if (domain == RADEON_GEM_DOMAIN_VRAM) { +				domain |= RADEON_GEM_DOMAIN_GTT; +				goto retry; +			}  			dev_err(rdev->dev,  				"object_init failed for (%lu, 0x%08X)\n",  				size, domain); +		}  		return r;  	}  	*bo_ptr = bo; @@ -321,6 +327,7 @@ int radeon_bo_list_validate(struct list_head *head)  {  	struct radeon_bo_list *lobj;  	struct radeon_bo *bo; +	u32 domain;  	int r;  	list_for_each_entry(lobj, head, list) { @@ -333,17 +340,19 @@ int radeon_bo_list_validate(struct list_head *head)  	list_for_each_entry(lobj, head, list) {  		bo = lobj->bo;  		if (!bo->pin_count) { -			if (lobj->wdomain) { -				radeon_ttm_placement_from_domain(bo, -								lobj->wdomain); -			} else { -				radeon_ttm_placement_from_domain(bo, -								lobj->rdomain); -			} +			domain = lobj->wdomain ? lobj->wdomain : lobj->rdomain; +			 +		retry: +			radeon_ttm_placement_from_domain(bo, domain);  			r = ttm_bo_validate(&bo->tbo, &bo->placement,  						true, false, false); -			if (unlikely(r)) +			if (unlikely(r)) { +				if (r != -ERESTARTSYS && domain == RADEON_GEM_DOMAIN_VRAM) { +					domain |= RADEON_GEM_DOMAIN_GTT; +					goto retry; +				}  				return r; +			}  		}  		lobj->gpu_offset = radeon_bo_gpu_offset(bo);  		lobj->tiling_flags = bo->tiling_flags; diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c index 3fa6984d989..95f8b3a3c43 100644 --- a/drivers/gpu/drm/radeon/radeon_pm.c +++ b/drivers/gpu/drm/radeon/radeon_pm.c @@ -27,6 +27,8 @@  #include <linux/acpi.h>  #endif  #include <linux/power_supply.h> +#include <linux/hwmon.h> +#include <linux/hwmon-sysfs.h>  #define RADEON_IDLE_LOOP_MS 100  #define RADEON_RECLOCK_DELAY_MS 200 @@ -60,9 +62,9 @@ static int radeon_acpi_event(struct notifier_block *nb,  	if (strcmp(entry->device_class, ACPI_AC_CLASS) == 0) {  		if (power_supply_is_system_supplied() > 0) -			DRM_DEBUG("pm: AC\n"); +			DRM_DEBUG_DRIVER("pm: AC\n");  		else -			DRM_DEBUG("pm: DC\n"); +			DRM_DEBUG_DRIVER("pm: DC\n");  		if (rdev->pm.pm_method == PM_METHOD_PROFILE) {  			if (rdev->pm.profile == PM_PROFILE_AUTO) { @@ -196,7 +198,7 @@ static void radeon_set_power_state(struct radeon_device *rdev)  			radeon_set_engine_clock(rdev, sclk);  			radeon_pm_debug_check_in_vbl(rdev, true);  			rdev->pm.current_sclk = sclk; -			DRM_DEBUG("Setting: e: %d\n", sclk); +			DRM_DEBUG_DRIVER("Setting: e: %d\n", sclk);  		}  		/* set memory clock */ @@ -205,7 +207,7 @@ static void radeon_set_power_state(struct radeon_device *rdev)  			radeon_set_memory_clock(rdev, mclk);  			radeon_pm_debug_check_in_vbl(rdev, true);  			rdev->pm.current_mclk = mclk; -			DRM_DEBUG("Setting: m: %d\n", mclk); +			DRM_DEBUG_DRIVER("Setting: m: %d\n", mclk);  		}  		if (misc_after) @@ -217,7 +219,7 @@ static void radeon_set_power_state(struct radeon_device *rdev)  		rdev->pm.current_power_state_index = rdev->pm.requested_power_state_index;  		rdev->pm.current_clock_mode_index = rdev->pm.requested_clock_mode_index;  	} else -		DRM_DEBUG("pm: GUI not idle!!!\n"); +		DRM_DEBUG_DRIVER("pm: GUI not idle!!!\n");  }  static void radeon_pm_set_clocks(struct radeon_device *rdev) @@ -292,27 +294,27 @@ static void radeon_pm_print_states(struct radeon_device *rdev)  	struct radeon_power_state *power_state;  	struct radeon_pm_clock_info *clock_info; -	DRM_DEBUG("%d Power State(s)\n", rdev->pm.num_power_states); +	DRM_DEBUG_DRIVER("%d Power State(s)\n", rdev->pm.num_power_states);  	for (i = 0; i < rdev->pm.num_power_states; i++) {  		power_state = &rdev->pm.power_state[i]; -		DRM_DEBUG("State %d: %s\n", i, +		DRM_DEBUG_DRIVER("State %d: %s\n", i,  			radeon_pm_state_type_name[power_state->type]);  		if (i == rdev->pm.default_power_state_index) -			DRM_DEBUG("\tDefault"); +			DRM_DEBUG_DRIVER("\tDefault");  		if ((rdev->flags & RADEON_IS_PCIE) && !(rdev->flags & RADEON_IS_IGP)) -			DRM_DEBUG("\t%d PCIE Lanes\n", power_state->pcie_lanes); +			DRM_DEBUG_DRIVER("\t%d PCIE Lanes\n", power_state->pcie_lanes);  		if (power_state->flags & RADEON_PM_STATE_SINGLE_DISPLAY_ONLY) -			DRM_DEBUG("\tSingle display only\n"); -		DRM_DEBUG("\t%d Clock Mode(s)\n", power_state->num_clock_modes); +			DRM_DEBUG_DRIVER("\tSingle display only\n"); +		DRM_DEBUG_DRIVER("\t%d Clock Mode(s)\n", power_state->num_clock_modes);  		for (j = 0; j < power_state->num_clock_modes; j++) {  			clock_info = &(power_state->clock_info[j]);  			if (rdev->flags & RADEON_IS_IGP) -				DRM_DEBUG("\t\t%d e: %d%s\n", +				DRM_DEBUG_DRIVER("\t\t%d e: %d%s\n",  					j,  					clock_info->sclk * 10,  					clock_info->flags & RADEON_PM_MODE_NO_DISPLAY ? "\tNo display only" : "");  			else -				DRM_DEBUG("\t\t%d e: %d\tm: %d\tv: %d%s\n", +				DRM_DEBUG_DRIVER("\t\t%d e: %d\tm: %d\tv: %d%s\n",  					j,  					clock_info->sclk * 10,  					clock_info->mclk * 10, @@ -424,6 +426,82 @@ fail:  static DEVICE_ATTR(power_profile, S_IRUGO | S_IWUSR, radeon_get_pm_profile, radeon_set_pm_profile);  static DEVICE_ATTR(power_method, S_IRUGO | S_IWUSR, radeon_get_pm_method, radeon_set_pm_method); +static ssize_t radeon_hwmon_show_temp(struct device *dev, +				      struct device_attribute *attr, +				      char *buf) +{ +	struct drm_device *ddev = pci_get_drvdata(to_pci_dev(dev)); +	struct radeon_device *rdev = ddev->dev_private; +	u32 temp; + +	switch (rdev->pm.int_thermal_type) { +	case THERMAL_TYPE_RV6XX: +		temp = rv6xx_get_temp(rdev); +		break; +	case THERMAL_TYPE_RV770: +		temp = rv770_get_temp(rdev); +		break; +	case THERMAL_TYPE_EVERGREEN: +		temp = evergreen_get_temp(rdev); +		break; +	default: +		temp = 0; +		break; +	} + +	return snprintf(buf, PAGE_SIZE, "%d\n", temp); +} + +static ssize_t radeon_hwmon_show_name(struct device *dev, +				      struct device_attribute *attr, +				      char *buf) +{ +	return sprintf(buf, "radeon\n"); +} + +static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, radeon_hwmon_show_temp, NULL, 0); +static SENSOR_DEVICE_ATTR(name, S_IRUGO, radeon_hwmon_show_name, NULL, 0); + +static struct attribute *hwmon_attributes[] = { +	&sensor_dev_attr_temp1_input.dev_attr.attr, +	&sensor_dev_attr_name.dev_attr.attr, +	NULL +}; + +static const struct attribute_group hwmon_attrgroup = { +	.attrs = hwmon_attributes, +}; + +static void radeon_hwmon_init(struct radeon_device *rdev) +{ +	int err; + +	rdev->pm.int_hwmon_dev = NULL; + +	switch (rdev->pm.int_thermal_type) { +	case THERMAL_TYPE_RV6XX: +	case THERMAL_TYPE_RV770: +	case THERMAL_TYPE_EVERGREEN: +		rdev->pm.int_hwmon_dev = hwmon_device_register(rdev->dev); +		dev_set_drvdata(rdev->pm.int_hwmon_dev, rdev->ddev); +		err = sysfs_create_group(&rdev->pm.int_hwmon_dev->kobj, +					 &hwmon_attrgroup); +		if (err) +			DRM_ERROR("Unable to create hwmon sysfs file: %d\n", err); +		break; +	default: +		break; +	} +} + +static void radeon_hwmon_fini(struct radeon_device *rdev) +{ +	if (rdev->pm.int_hwmon_dev) { +		sysfs_remove_group(&rdev->pm.int_hwmon_dev->kobj, &hwmon_attrgroup); +		hwmon_device_unregister(rdev->pm.int_hwmon_dev); +	} +} +  void radeon_pm_suspend(struct radeon_device *rdev)  {  	bool flush_wq = false; @@ -471,6 +549,7 @@ int radeon_pm_init(struct radeon_device *rdev)  	rdev->pm.dynpm_can_downclock = true;  	rdev->pm.current_sclk = rdev->clock.default_sclk;  	rdev->pm.current_mclk = rdev->clock.default_mclk; +	rdev->pm.int_thermal_type = THERMAL_TYPE_NONE;  	if (rdev->bios) {  		if (rdev->is_atom_bios) @@ -481,6 +560,8 @@ int radeon_pm_init(struct radeon_device *rdev)  		radeon_pm_init_profile(rdev);  	} +	/* set up the internal thermal sensor if applicable */ +	radeon_hwmon_init(rdev);  	if (rdev->pm.num_power_states > 1) {  		/* where's the best place to put these? */  		ret = device_create_file(rdev->dev, &dev_attr_power_profile); @@ -536,6 +617,7 @@ void radeon_pm_fini(struct radeon_device *rdev)  #endif  	} +	radeon_hwmon_fini(rdev);  	if (rdev->pm.i2c_bus)  		radeon_i2c_destroy(rdev->pm.i2c_bus);  } @@ -576,7 +658,7 @@ void radeon_pm_compute_clocks(struct radeon_device *rdev)  					radeon_pm_get_dynpm_state(rdev);  					radeon_pm_set_clocks(rdev); -					DRM_DEBUG("radeon: dynamic power management deactivated\n"); +					DRM_DEBUG_DRIVER("radeon: dynamic power management deactivated\n");  				}  			} else if (rdev->pm.active_crtc_count == 1) {  				/* TODO: Increase clocks if needed for current mode */ @@ -593,7 +675,7 @@ void radeon_pm_compute_clocks(struct radeon_device *rdev)  					rdev->pm.dynpm_state = DYNPM_STATE_ACTIVE;  					queue_delayed_work(rdev->wq, &rdev->pm.dynpm_idle_work,  							   msecs_to_jiffies(RADEON_IDLE_LOOP_MS)); -					DRM_DEBUG("radeon: dynamic power management activated\n"); +					DRM_DEBUG_DRIVER("radeon: dynamic power management activated\n");  				}  			} else { /* count == 0 */  				if (rdev->pm.dynpm_state != DYNPM_STATE_MINIMUM) { @@ -689,7 +771,7 @@ static bool radeon_pm_debug_check_in_vbl(struct radeon_device *rdev, bool finish  	bool in_vbl = radeon_pm_in_vbl(rdev);  	if (in_vbl == false) -		DRM_DEBUG("not in vbl for pm change %08x at %s\n", stat_crtc, +		DRM_DEBUG_DRIVER("not in vbl for pm change %08x at %s\n", stat_crtc,  			 finish ? "exit" : "entry");  	return in_vbl;  } diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c index e9918d88f5b..84c53e41a88 100644 --- a/drivers/gpu/drm/radeon/radeon_ttm.c +++ b/drivers/gpu/drm/radeon/radeon_ttm.c @@ -59,28 +59,28 @@ static struct radeon_device *radeon_get_rdev(struct ttm_bo_device *bdev)  /*   * Global memory.   */ -static int radeon_ttm_mem_global_init(struct ttm_global_reference *ref) +static int radeon_ttm_mem_global_init(struct drm_global_reference *ref)  {  	return ttm_mem_global_init(ref->object);  } -static void radeon_ttm_mem_global_release(struct ttm_global_reference *ref) +static void radeon_ttm_mem_global_release(struct drm_global_reference *ref)  {  	ttm_mem_global_release(ref->object);  }  static int radeon_ttm_global_init(struct radeon_device *rdev)  { -	struct ttm_global_reference *global_ref; +	struct drm_global_reference *global_ref;  	int r;  	rdev->mman.mem_global_referenced = false;  	global_ref = &rdev->mman.mem_global_ref; -	global_ref->global_type = TTM_GLOBAL_TTM_MEM; +	global_ref->global_type = DRM_GLOBAL_TTM_MEM;  	global_ref->size = sizeof(struct ttm_mem_global);  	global_ref->init = &radeon_ttm_mem_global_init;  	global_ref->release = &radeon_ttm_mem_global_release; -	r = ttm_global_item_ref(global_ref); +	r = drm_global_item_ref(global_ref);  	if (r != 0) {  		DRM_ERROR("Failed setting up TTM memory accounting "  			  "subsystem.\n"); @@ -90,14 +90,14 @@ static int radeon_ttm_global_init(struct radeon_device *rdev)  	rdev->mman.bo_global_ref.mem_glob =  		rdev->mman.mem_global_ref.object;  	global_ref = &rdev->mman.bo_global_ref.ref; -	global_ref->global_type = TTM_GLOBAL_TTM_BO; +	global_ref->global_type = DRM_GLOBAL_TTM_BO;  	global_ref->size = sizeof(struct ttm_bo_global);  	global_ref->init = &ttm_bo_global_init;  	global_ref->release = &ttm_bo_global_release; -	r = ttm_global_item_ref(global_ref); +	r = drm_global_item_ref(global_ref);  	if (r != 0) {  		DRM_ERROR("Failed setting up TTM BO subsystem.\n"); -		ttm_global_item_unref(&rdev->mman.mem_global_ref); +		drm_global_item_unref(&rdev->mman.mem_global_ref);  		return r;  	} @@ -108,8 +108,8 @@ static int radeon_ttm_global_init(struct radeon_device *rdev)  static void radeon_ttm_global_fini(struct radeon_device *rdev)  {  	if (rdev->mman.mem_global_referenced) { -		ttm_global_item_unref(&rdev->mman.bo_global_ref.ref); -		ttm_global_item_unref(&rdev->mman.mem_global_ref); +		drm_global_item_unref(&rdev->mman.bo_global_ref.ref); +		drm_global_item_unref(&rdev->mman.mem_global_ref);  		rdev->mman.mem_global_referenced = false;  	}  } diff --git a/drivers/gpu/drm/radeon/reg_srcs/r300 b/drivers/gpu/drm/radeon/reg_srcs/r300 index 1e97b2d129f..b506ec1cab4 100644 --- a/drivers/gpu/drm/radeon/reg_srcs/r300 +++ b/drivers/gpu/drm/radeon/reg_srcs/r300 @@ -187,7 +187,6 @@ r300 0x4f60  0x4364 RS_INST_13  0x4368 RS_INST_14  0x436C RS_INST_15 -0x43A4 SC_HYPERZ_EN  0x43A8 SC_EDGERULE  0x43B0 SC_CLIP_0_A  0x43B4 SC_CLIP_0_B @@ -716,16 +715,4 @@ r300 0x4f60  0x4F08 ZB_STENCILREFMASK  0x4F14 ZB_ZTOP  0x4F18 ZB_ZCACHE_CTLSTAT -0x4F1C ZB_BW_CNTL -0x4F28 ZB_DEPTHCLEARVALUE -0x4F30 ZB_ZMASK_OFFSET -0x4F34 ZB_ZMASK_PITCH -0x4F38 ZB_ZMASK_WRINDEX -0x4F3C ZB_ZMASK_DWORD -0x4F40 ZB_ZMASK_RDINDEX -0x4F44 ZB_HIZ_OFFSET -0x4F48 ZB_HIZ_WRINDEX -0x4F4C ZB_HIZ_DWORD -0x4F50 ZB_HIZ_RDINDEX -0x4F54 ZB_HIZ_PITCH  0x4F58 ZB_ZPASS_DATA diff --git a/drivers/gpu/drm/radeon/reg_srcs/r420 b/drivers/gpu/drm/radeon/reg_srcs/r420 index e958980d00f..8c1214c2390 100644 --- a/drivers/gpu/drm/radeon/reg_srcs/r420 +++ b/drivers/gpu/drm/radeon/reg_srcs/r420 @@ -130,6 +130,7 @@ r420 0x4f60  0x401C GB_SELECT  0x4020 GB_AA_CONFIG  0x4024 GB_FIFO_SIZE +0x4028 GB_Z_PEQ_CONFIG  0x4100 TX_INVALTAGS  0x4200 GA_POINT_S0  0x4204 GA_POINT_T0 @@ -187,7 +188,6 @@ r420 0x4f60  0x4364 RS_INST_13  0x4368 RS_INST_14  0x436C RS_INST_15 -0x43A4 SC_HYPERZ_EN  0x43A8 SC_EDGERULE  0x43B0 SC_CLIP_0_A  0x43B4 SC_CLIP_0_B @@ -782,16 +782,4 @@ r420 0x4f60  0x4F08 ZB_STENCILREFMASK  0x4F14 ZB_ZTOP  0x4F18 ZB_ZCACHE_CTLSTAT -0x4F1C ZB_BW_CNTL -0x4F28 ZB_DEPTHCLEARVALUE -0x4F30 ZB_ZMASK_OFFSET -0x4F34 ZB_ZMASK_PITCH -0x4F38 ZB_ZMASK_WRINDEX -0x4F3C ZB_ZMASK_DWORD -0x4F40 ZB_ZMASK_RDINDEX -0x4F44 ZB_HIZ_OFFSET -0x4F48 ZB_HIZ_WRINDEX -0x4F4C ZB_HIZ_DWORD -0x4F50 ZB_HIZ_RDINDEX -0x4F54 ZB_HIZ_PITCH  0x4F58 ZB_ZPASS_DATA diff --git a/drivers/gpu/drm/radeon/reg_srcs/rs600 b/drivers/gpu/drm/radeon/reg_srcs/rs600 index 83e8bc0c2bb..0828d80396f 100644 --- a/drivers/gpu/drm/radeon/reg_srcs/rs600 +++ b/drivers/gpu/drm/radeon/reg_srcs/rs600 @@ -187,7 +187,6 @@ rs600 0x6d40  0x4364 RS_INST_13  0x4368 RS_INST_14  0x436C RS_INST_15 -0x43A4 SC_HYPERZ_EN  0x43A8 SC_EDGERULE  0x43B0 SC_CLIP_0_A  0x43B4 SC_CLIP_0_B @@ -782,16 +781,4 @@ rs600 0x6d40  0x4F08 ZB_STENCILREFMASK  0x4F14 ZB_ZTOP  0x4F18 ZB_ZCACHE_CTLSTAT -0x4F1C ZB_BW_CNTL -0x4F28 ZB_DEPTHCLEARVALUE -0x4F30 ZB_ZMASK_OFFSET -0x4F34 ZB_ZMASK_PITCH -0x4F38 ZB_ZMASK_WRINDEX -0x4F3C ZB_ZMASK_DWORD -0x4F40 ZB_ZMASK_RDINDEX -0x4F44 ZB_HIZ_OFFSET -0x4F48 ZB_HIZ_WRINDEX -0x4F4C ZB_HIZ_DWORD -0x4F50 ZB_HIZ_RDINDEX -0x4F54 ZB_HIZ_PITCH  0x4F58 ZB_ZPASS_DATA diff --git a/drivers/gpu/drm/radeon/reg_srcs/rv515 b/drivers/gpu/drm/radeon/reg_srcs/rv515 index 1e46233985e..8293855f5f0 100644 --- a/drivers/gpu/drm/radeon/reg_srcs/rv515 +++ b/drivers/gpu/drm/radeon/reg_srcs/rv515 @@ -235,7 +235,6 @@ rv515 0x6d40  0x4354 RS_INST_13  0x4358 RS_INST_14  0x435C RS_INST_15 -0x43A4 SC_HYPERZ_EN  0x43A8 SC_EDGERULE  0x43B0 SC_CLIP_0_A  0x43B4 SC_CLIP_0_B @@ -479,17 +478,5 @@ rv515 0x6d40  0x4F08 ZB_STENCILREFMASK  0x4F14 ZB_ZTOP  0x4F18 ZB_ZCACHE_CTLSTAT -0x4F1C ZB_BW_CNTL -0x4F28 ZB_DEPTHCLEARVALUE -0x4F30 ZB_ZMASK_OFFSET -0x4F34 ZB_ZMASK_PITCH -0x4F38 ZB_ZMASK_WRINDEX -0x4F3C ZB_ZMASK_DWORD -0x4F40 ZB_ZMASK_RDINDEX -0x4F44 ZB_HIZ_OFFSET -0x4F48 ZB_HIZ_WRINDEX -0x4F4C ZB_HIZ_DWORD -0x4F50 ZB_HIZ_RDINDEX -0x4F54 ZB_HIZ_PITCH  0x4F58 ZB_ZPASS_DATA  0x4FD4 ZB_STENCILREFMASK_BF diff --git a/drivers/gpu/drm/radeon/rs400.c b/drivers/gpu/drm/radeon/rs400.c index f454c9a5e7f..ae2b76b9a38 100644 --- a/drivers/gpu/drm/radeon/rs400.c +++ b/drivers/gpu/drm/radeon/rs400.c @@ -55,14 +55,6 @@ void rs400_gart_adjust_size(struct radeon_device *rdev)  		rdev->mc.gtt_size = 32 * 1024 * 1024;  		return;  	} -	if (rdev->family == CHIP_RS400 || rdev->family == CHIP_RS480) { -		/* FIXME: RS400 & RS480 seems to have issue with GART size -		 * if 4G of system memory (needs more testing) -		 */ -		/* XXX is this still an issue with proper alignment? */ -		rdev->mc.gtt_size = 32 * 1024 * 1024; -		DRM_ERROR("Forcing to 32M GART size (because of ASIC bug ?)\n"); -	}  }  void rs400_gart_tlb_flush(struct radeon_device *rdev) @@ -483,6 +475,8 @@ int rs400_init(struct radeon_device *rdev)  	/* Initialize surface registers */  	radeon_surface_init(rdev);  	/* TODO: disable VGA need to use VGA request */ +	/* restore some register to sane defaults */ +	r100_restore_sanity(rdev);  	/* BIOS*/  	if (!radeon_get_bios(rdev)) {  		if (ASIC_IS_AVIVO(rdev)) diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c index 6dc15ea8ba3..cc05b230d7e 100644 --- a/drivers/gpu/drm/radeon/rs600.c +++ b/drivers/gpu/drm/radeon/rs600.c @@ -686,8 +686,8 @@ void rs600_mc_init(struct radeon_device *rdev)  {  	u64 base; -	rdev->mc.aper_base = drm_get_resource_start(rdev->ddev, 0); -	rdev->mc.aper_size = drm_get_resource_len(rdev->ddev, 0); +	rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0); +	rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);  	rdev->mc.vram_is_ddr = true;  	rdev->mc.vram_width = 128;  	rdev->mc.real_vram_size = RREG32(RADEON_CONFIG_MEMSIZE); @@ -696,7 +696,6 @@ void rs600_mc_init(struct radeon_device *rdev)  	rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev);  	base = RREG32_MC(R_000004_MC_FB_LOCATION);  	base = G_000004_MC_FB_START(base) << 16; -	rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev);  	radeon_vram_location(rdev, &rdev->mc, base);  	rdev->mc.gtt_base_align = 0;  	radeon_gtt_location(rdev, &rdev->mc); @@ -813,6 +812,13 @@ static int rs600_startup(struct radeon_device *rdev)  		dev_err(rdev->dev, "failled initializing IB (%d).\n", r);  		return r;  	} + +	r = r600_audio_init(rdev); +	if (r) { +		dev_err(rdev->dev, "failed initializing audio\n"); +		return r; +	} +  	return 0;  } @@ -839,6 +845,7 @@ int rs600_resume(struct radeon_device *rdev)  int rs600_suspend(struct radeon_device *rdev)  { +	r600_audio_fini(rdev);  	r100_cp_disable(rdev);  	r100_wb_disable(rdev);  	rs600_irq_disable(rdev); @@ -848,6 +855,7 @@ int rs600_suspend(struct radeon_device *rdev)  void rs600_fini(struct radeon_device *rdev)  { +	r600_audio_fini(rdev);  	r100_cp_fini(rdev);  	r100_wb_fini(rdev);  	r100_ib_fini(rdev); @@ -871,6 +879,8 @@ int rs600_init(struct radeon_device *rdev)  	radeon_scratch_init(rdev);  	/* Initialize surface registers */  	radeon_surface_init(rdev); +	/* restore some register to sane defaults */ +	r100_restore_sanity(rdev);  	/* BIOS */  	if (!radeon_get_bios(rdev)) {  		if (ASIC_IS_AVIVO(rdev)) diff --git a/drivers/gpu/drm/radeon/rs690.c b/drivers/gpu/drm/radeon/rs690.c index ce4ecbe1081..3e3f75718be 100644 --- a/drivers/gpu/drm/radeon/rs690.c +++ b/drivers/gpu/drm/radeon/rs690.c @@ -154,13 +154,13 @@ void rs690_mc_init(struct radeon_device *rdev)  	rdev->mc.vram_width = 128;  	rdev->mc.real_vram_size = RREG32(RADEON_CONFIG_MEMSIZE);  	rdev->mc.mc_vram_size = rdev->mc.real_vram_size; -	rdev->mc.aper_base = drm_get_resource_start(rdev->ddev, 0); -	rdev->mc.aper_size = drm_get_resource_len(rdev->ddev, 0); +	rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0); +	rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);  	rdev->mc.visible_vram_size = rdev->mc.aper_size;  	base = RREG32_MC(R_000100_MCCFG_FB_LOCATION);  	base = G_000100_MC_FB_START(base) << 16; -	rs690_pm_info(rdev);  	rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev); +	rs690_pm_info(rdev);  	radeon_vram_location(rdev, &rdev->mc, base);  	rdev->mc.gtt_base_align = rdev->mc.gtt_size - 1;  	radeon_gtt_location(rdev, &rdev->mc); @@ -398,7 +398,9 @@ void rs690_bandwidth_update(struct radeon_device *rdev)  	struct drm_display_mode *mode1 = NULL;  	struct rs690_watermark wm0;  	struct rs690_watermark wm1; -	u32 tmp, d1mode_priority_a_cnt, d2mode_priority_a_cnt; +	u32 tmp; +	u32 d1mode_priority_a_cnt = S_006548_D1MODE_PRIORITY_A_OFF(1); +	u32 d2mode_priority_a_cnt = S_006548_D1MODE_PRIORITY_A_OFF(1);  	fixed20_12 priority_mark02, priority_mark12, fill_rate;  	fixed20_12 a, b; @@ -495,10 +497,6 @@ void rs690_bandwidth_update(struct radeon_device *rdev)  			d1mode_priority_a_cnt |= S_006548_D1MODE_PRIORITY_A_ALWAYS_ON(1);  			d2mode_priority_a_cnt |= S_006D48_D2MODE_PRIORITY_A_ALWAYS_ON(1);  		} -		WREG32(R_006548_D1MODE_PRIORITY_A_CNT, d1mode_priority_a_cnt); -		WREG32(R_00654C_D1MODE_PRIORITY_B_CNT, d1mode_priority_a_cnt); -		WREG32(R_006D48_D2MODE_PRIORITY_A_CNT, d2mode_priority_a_cnt); -		WREG32(R_006D4C_D2MODE_PRIORITY_B_CNT, d2mode_priority_a_cnt);  	} else if (mode0) {  		if (dfixed_trunc(wm0.dbpp) > 64)  			a.full = dfixed_mul(wm0.dbpp, wm0.num_line_pair); @@ -528,13 +526,7 @@ void rs690_bandwidth_update(struct radeon_device *rdev)  		d1mode_priority_a_cnt = dfixed_trunc(priority_mark02);  		if (rdev->disp_priority == 2)  			d1mode_priority_a_cnt |= S_006548_D1MODE_PRIORITY_A_ALWAYS_ON(1); -		WREG32(R_006548_D1MODE_PRIORITY_A_CNT, d1mode_priority_a_cnt); -		WREG32(R_00654C_D1MODE_PRIORITY_B_CNT, d1mode_priority_a_cnt); -		WREG32(R_006D48_D2MODE_PRIORITY_A_CNT, -			S_006D48_D2MODE_PRIORITY_A_OFF(1)); -		WREG32(R_006D4C_D2MODE_PRIORITY_B_CNT, -			S_006D4C_D2MODE_PRIORITY_B_OFF(1)); -	} else { +	} else if (mode1) {  		if (dfixed_trunc(wm1.dbpp) > 64)  			a.full = dfixed_mul(wm1.dbpp, wm1.num_line_pair);  		else @@ -563,13 +555,12 @@ void rs690_bandwidth_update(struct radeon_device *rdev)  		d2mode_priority_a_cnt = dfixed_trunc(priority_mark12);  		if (rdev->disp_priority == 2)  			d2mode_priority_a_cnt |= S_006D48_D2MODE_PRIORITY_A_ALWAYS_ON(1); -		WREG32(R_006548_D1MODE_PRIORITY_A_CNT, -			S_006548_D1MODE_PRIORITY_A_OFF(1)); -		WREG32(R_00654C_D1MODE_PRIORITY_B_CNT, -			S_00654C_D1MODE_PRIORITY_B_OFF(1)); -		WREG32(R_006D48_D2MODE_PRIORITY_A_CNT, d2mode_priority_a_cnt); -		WREG32(R_006D4C_D2MODE_PRIORITY_B_CNT, d2mode_priority_a_cnt);  	} + +	WREG32(R_006548_D1MODE_PRIORITY_A_CNT, d1mode_priority_a_cnt); +	WREG32(R_00654C_D1MODE_PRIORITY_B_CNT, d1mode_priority_a_cnt); +	WREG32(R_006D48_D2MODE_PRIORITY_A_CNT, d2mode_priority_a_cnt); +	WREG32(R_006D4C_D2MODE_PRIORITY_B_CNT, d2mode_priority_a_cnt);  }  uint32_t rs690_mc_rreg(struct radeon_device *rdev, uint32_t reg) @@ -641,6 +632,13 @@ static int rs690_startup(struct radeon_device *rdev)  		dev_err(rdev->dev, "failled initializing IB (%d).\n", r);  		return r;  	} + +	r = r600_audio_init(rdev); +	if (r) { +		dev_err(rdev->dev, "failed initializing audio\n"); +		return r; +	} +  	return 0;  } @@ -667,6 +665,7 @@ int rs690_resume(struct radeon_device *rdev)  int rs690_suspend(struct radeon_device *rdev)  { +	r600_audio_fini(rdev);  	r100_cp_disable(rdev);  	r100_wb_disable(rdev);  	rs600_irq_disable(rdev); @@ -676,6 +675,7 @@ int rs690_suspend(struct radeon_device *rdev)  void rs690_fini(struct radeon_device *rdev)  { +	r600_audio_fini(rdev);  	r100_cp_fini(rdev);  	r100_wb_fini(rdev);  	r100_ib_fini(rdev); @@ -699,6 +699,8 @@ int rs690_init(struct radeon_device *rdev)  	radeon_scratch_init(rdev);  	/* Initialize surface registers */  	radeon_surface_init(rdev); +	/* restore some register to sane defaults */ +	r100_restore_sanity(rdev);  	/* TODO: disable VGA need to use VGA request */  	/* BIOS*/  	if (!radeon_get_bios(rdev)) { diff --git a/drivers/gpu/drm/radeon/rv515.c b/drivers/gpu/drm/radeon/rv515.c index 0c9c169a685..4d6e86041a9 100644 --- a/drivers/gpu/drm/radeon/rv515.c +++ b/drivers/gpu/drm/radeon/rv515.c @@ -469,6 +469,8 @@ int rv515_init(struct radeon_device *rdev)  	/* Initialize surface registers */  	radeon_surface_init(rdev);  	/* TODO: disable VGA need to use VGA request */ +	/* restore some register to sane defaults */ +	r100_restore_sanity(rdev);  	/* BIOS*/  	if (!radeon_get_bios(rdev)) {  		if (ASIC_IS_AVIVO(rdev)) @@ -925,7 +927,9 @@ void rv515_bandwidth_avivo_update(struct radeon_device *rdev)  	struct drm_display_mode *mode1 = NULL;  	struct rv515_watermark wm0;  	struct rv515_watermark wm1; -	u32 tmp, d1mode_priority_a_cnt, d2mode_priority_a_cnt; +	u32 tmp; +	u32 d1mode_priority_a_cnt = MODE_PRIORITY_OFF; +	u32 d2mode_priority_a_cnt = MODE_PRIORITY_OFF;  	fixed20_12 priority_mark02, priority_mark12, fill_rate;  	fixed20_12 a, b; @@ -999,10 +1003,6 @@ void rv515_bandwidth_avivo_update(struct radeon_device *rdev)  			d1mode_priority_a_cnt |= MODE_PRIORITY_ALWAYS_ON;  			d2mode_priority_a_cnt |= MODE_PRIORITY_ALWAYS_ON;  		} -		WREG32(D1MODE_PRIORITY_A_CNT, d1mode_priority_a_cnt); -		WREG32(D1MODE_PRIORITY_B_CNT, d1mode_priority_a_cnt); -		WREG32(D2MODE_PRIORITY_A_CNT, d2mode_priority_a_cnt); -		WREG32(D2MODE_PRIORITY_B_CNT, d2mode_priority_a_cnt);  	} else if (mode0) {  		if (dfixed_trunc(wm0.dbpp) > 64)  			a.full = dfixed_div(wm0.dbpp, wm0.num_line_pair); @@ -1032,11 +1032,7 @@ void rv515_bandwidth_avivo_update(struct radeon_device *rdev)  		d1mode_priority_a_cnt = dfixed_trunc(priority_mark02);  		if (rdev->disp_priority == 2)  			d1mode_priority_a_cnt |= MODE_PRIORITY_ALWAYS_ON; -		WREG32(D1MODE_PRIORITY_A_CNT, d1mode_priority_a_cnt); -		WREG32(D1MODE_PRIORITY_B_CNT, d1mode_priority_a_cnt); -		WREG32(D2MODE_PRIORITY_A_CNT, MODE_PRIORITY_OFF); -		WREG32(D2MODE_PRIORITY_B_CNT, MODE_PRIORITY_OFF); -	} else { +	} else if (mode1) {  		if (dfixed_trunc(wm1.dbpp) > 64)  			a.full = dfixed_div(wm1.dbpp, wm1.num_line_pair);  		else @@ -1065,11 +1061,12 @@ void rv515_bandwidth_avivo_update(struct radeon_device *rdev)  		d2mode_priority_a_cnt = dfixed_trunc(priority_mark12);  		if (rdev->disp_priority == 2)  			d2mode_priority_a_cnt |= MODE_PRIORITY_ALWAYS_ON; -		WREG32(D1MODE_PRIORITY_A_CNT, MODE_PRIORITY_OFF); -		WREG32(D1MODE_PRIORITY_B_CNT, MODE_PRIORITY_OFF); -		WREG32(D2MODE_PRIORITY_A_CNT, d2mode_priority_a_cnt); -		WREG32(D2MODE_PRIORITY_B_CNT, d2mode_priority_a_cnt);  	} + +	WREG32(D1MODE_PRIORITY_A_CNT, d1mode_priority_a_cnt); +	WREG32(D1MODE_PRIORITY_B_CNT, d1mode_priority_a_cnt); +	WREG32(D2MODE_PRIORITY_A_CNT, d2mode_priority_a_cnt); +	WREG32(D2MODE_PRIORITY_B_CNT, d2mode_priority_a_cnt);  }  void rv515_bandwidth_update(struct radeon_device *rdev) diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c index b7fd8206492..f1c79681011 100644 --- a/drivers/gpu/drm/radeon/rv770.c +++ b/drivers/gpu/drm/radeon/rv770.c @@ -42,6 +42,21 @@  static void rv770_gpu_init(struct radeon_device *rdev);  void rv770_fini(struct radeon_device *rdev); +/* get temperature in millidegrees */ +u32 rv770_get_temp(struct radeon_device *rdev) +{ +	u32 temp = (RREG32(CG_MULT_THERMAL_STATUS) & ASIC_T_MASK) >> +		ASIC_T_SHIFT; +	u32 actual_temp = 0; + +	if ((temp >> 9) & 1) +		actual_temp = 0; +	else +		actual_temp = (temp >> 1) & 0xff; + +	return actual_temp * 1000; +} +  void rv770_pm_misc(struct radeon_device *rdev)  {  	int req_ps_idx = rdev->pm.requested_power_state_index; @@ -189,7 +204,10 @@ static void rv770_mc_program(struct radeon_device *rdev)  		WREG32((0x2c20 + j), 0x00000000);  		WREG32((0x2c24 + j), 0x00000000);  	} -	WREG32(HDP_REG_COHERENCY_FLUSH_CNTL, 0); +	/* r7xx hw bug.  Read from HDP_DEBUG1 rather +	 * than writing to HDP_REG_COHERENCY_FLUSH_CNTL +	 */ +	tmp = RREG32(HDP_DEBUG1);  	rv515_mc_stop(rdev, &save);  	if (r600_mc_wait_for_idle(rdev)) { @@ -659,8 +677,9 @@ static void rv770_gpu_init(struct radeon_device *rdev)  								 r600_count_pipe_bits((cc_rb_backend_disable &  										       R7XX_MAX_BACKENDS_MASK) >> 16)),  								(cc_rb_backend_disable >> 16)); -	gb_tiling_config |= BACKEND_MAP(backend_map); +	rdev->config.rv770.tile_config = gb_tiling_config; +	gb_tiling_config |= BACKEND_MAP(backend_map);  	WREG32(GB_TILING_CONFIG, gb_tiling_config);  	WREG32(DCP_TILING_CONFIG, (gb_tiling_config & 0xffff)); @@ -919,8 +938,8 @@ int rv770_mc_init(struct radeon_device *rdev)  	}  	rdev->mc.vram_width = numchan * chansize;  	/* Could aper size report 0 ? */ -	rdev->mc.aper_base = drm_get_resource_start(rdev->ddev, 0); -	rdev->mc.aper_size = drm_get_resource_len(rdev->ddev, 0); +	rdev->mc.aper_base = pci_resource_start(rdev->pdev, 0); +	rdev->mc.aper_size = pci_resource_len(rdev->pdev, 0);  	/* Setup GPU memory space */  	rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE);  	rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE); diff --git a/drivers/gpu/drm/radeon/rv770d.h b/drivers/gpu/drm/radeon/rv770d.h index 9506f8cb99e..b7a5a20e81d 100644 --- a/drivers/gpu/drm/radeon/rv770d.h +++ b/drivers/gpu/drm/radeon/rv770d.h @@ -122,12 +122,18 @@  #define		GUI_ACTIVE					(1<<31)  #define	GRBM_STATUS2					0x8014 +#define	CG_MULT_THERMAL_STATUS				0x740 +#define		ASIC_T(x)			        ((x) << 16) +#define		ASIC_T_MASK			        0x3FF0000 +#define		ASIC_T_SHIFT			        16 +  #define	HDP_HOST_PATH_CNTL				0x2C00  #define	HDP_NONSURFACE_BASE				0x2C04  #define	HDP_NONSURFACE_INFO				0x2C08  #define	HDP_NONSURFACE_SIZE				0x2C0C  #define HDP_REG_COHERENCY_FLUSH_CNTL			0x54A0  #define	HDP_TILING_CONFIG				0x2F3C +#define HDP_DEBUG1                                      0x2F34  #define MC_SHARED_CHMAP						0x2004  #define		NOOFCHAN_SHIFT					12  |