diff options
Diffstat (limited to 'drivers/gpu')
| -rw-r--r-- | drivers/gpu/drm/drm_edid.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_crt.c | 20 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_drv.h | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_i2c.c | 25 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_lvds.c | 34 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_gem.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/atombios_crtc.c | 20 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/evergreen.c | 11 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_atombios.c | 13 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_combios.c | 13 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/rs600.c | 11 | ||||
| -rw-r--r-- | drivers/gpu/drm/ttm/ttm_bo.c | 10 | ||||
| -rw-r--r-- | drivers/gpu/drm/ttm/ttm_tt.c | 16 | 
13 files changed, 80 insertions, 100 deletions
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index 9c595e3b9c2..adc9358c9be 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c @@ -1297,7 +1297,7 @@ add_detailed_modes(struct drm_connector *connector, struct edid *edid,  /**   * Search EDID for CEA extension block.   */ -static u8 *drm_find_cea_extension(struct edid *edid) +u8 *drm_find_cea_extension(struct edid *edid)  {  	u8 *edid_ext = NULL;  	int i; @@ -1318,6 +1318,7 @@ static u8 *drm_find_cea_extension(struct edid *edid)  	return edid_ext;  } +EXPORT_SYMBOL(drm_find_cea_extension);  /**   * drm_detect_hdmi_monitor - detect whether monitor is hdmi. diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c index 8342259f316..d03fc05b39c 100644 --- a/drivers/gpu/drm/i915/intel_crt.c +++ b/drivers/gpu/drm/i915/intel_crt.c @@ -269,21 +269,6 @@ static bool intel_crt_detect_hotplug(struct drm_connector *connector)  	return ret;  } -static bool intel_crt_ddc_probe(struct drm_i915_private *dev_priv, int ddc_bus) -{ -	u8 buf; -	struct i2c_msg msgs[] = { -		{ -			.addr = 0xA0, -			.flags = 0, -			.len = 1, -			.buf = &buf, -		}, -	}; -	/* DDC monitor detect: Does it ACK a write to 0xA0? */ -	return i2c_transfer(&dev_priv->gmbus[ddc_bus].adapter, msgs, 1) == 1; -} -  static bool intel_crt_detect_ddc(struct drm_connector *connector)  {  	struct intel_crt *crt = intel_attached_crt(connector); @@ -293,11 +278,6 @@ static bool intel_crt_detect_ddc(struct drm_connector *connector)  	if (crt->base.type != INTEL_OUTPUT_ANALOG)  		return false; -	if (intel_crt_ddc_probe(dev_priv, dev_priv->crt_ddc_pin)) { -		DRM_DEBUG_KMS("CRT detected via DDC:0xa0\n"); -		return true; -	} -  	if (intel_ddc_probe(&crt->base, dev_priv->crt_ddc_pin)) {  		struct edid *edid;  		bool is_digital = false; diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index 5daa991cb28..f5b0d8306d8 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h @@ -39,7 +39,7 @@  			ret__ = -ETIMEDOUT;				\  			break;						\  		}							\ -		if (W && !in_dbg_master()) msleep(W);			\ +		if (W && !(in_atomic() || in_dbg_master())) msleep(W);	\  	}								\  	ret__;								\  }) diff --git a/drivers/gpu/drm/i915/intel_i2c.c b/drivers/gpu/drm/i915/intel_i2c.c index 82d04c5899d..d3b903bce7c 100644 --- a/drivers/gpu/drm/i915/intel_i2c.c +++ b/drivers/gpu/drm/i915/intel_i2c.c @@ -259,7 +259,7 @@ gmbus_xfer(struct i2c_adapter *adapter,  				if (wait_for(I915_READ(GMBUS2 + reg_offset) & (GMBUS_SATOER | GMBUS_HW_RDY), 50))  					goto timeout;  				if (I915_READ(GMBUS2 + reg_offset) & GMBUS_SATOER) -					return 0; +					goto clear_err;  				val = I915_READ(GMBUS3 + reg_offset);  				do { @@ -287,7 +287,7 @@ gmbus_xfer(struct i2c_adapter *adapter,  				if (wait_for(I915_READ(GMBUS2 + reg_offset) & (GMBUS_SATOER | GMBUS_HW_RDY), 50))  					goto timeout;  				if (I915_READ(GMBUS2 + reg_offset) & GMBUS_SATOER) -					return 0; +					goto clear_err;  				val = loop = 0;  				do { @@ -302,14 +302,31 @@ gmbus_xfer(struct i2c_adapter *adapter,  		if (i + 1 < num && wait_for(I915_READ(GMBUS2 + reg_offset) & (GMBUS_SATOER | GMBUS_HW_WAIT_PHASE), 50))  			goto timeout;  		if (I915_READ(GMBUS2 + reg_offset) & GMBUS_SATOER) -			return 0; +			goto clear_err;  	} -	return num; +	goto done; + +clear_err: +	/* Toggle the Software Clear Interrupt bit. This has the effect +	 * of resetting the GMBUS controller and so clearing the +	 * BUS_ERROR raised by the slave's NAK. +	 */ +	I915_WRITE(GMBUS1 + reg_offset, GMBUS_SW_CLR_INT); +	I915_WRITE(GMBUS1 + reg_offset, 0); + +done: +	/* Mark the GMBUS interface as disabled. We will re-enable it at the +	 * start of the next xfer, till then let it sleep. +	 */ +	I915_WRITE(GMBUS0 + reg_offset, 0); +	return i;  timeout:  	DRM_INFO("GMBUS timed out, falling back to bit banging on pin %d [%s]\n",  		 bus->reg0 & 0xff, bus->adapter.name); +	I915_WRITE(GMBUS0 + reg_offset, 0); +  	/* Hardware may not support GMBUS over these pins? Try GPIO bitbanging instead. */  	bus->force_bit = intel_gpio_create(dev_priv, bus->reg0 & 0xff);  	if (!bus->force_bit) diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c index 1a311ad0111..a562bd2648c 100644 --- a/drivers/gpu/drm/i915/intel_lvds.c +++ b/drivers/gpu/drm/i915/intel_lvds.c @@ -473,19 +473,13 @@ static enum drm_connector_status  intel_lvds_detect(struct drm_connector *connector, bool force)  {  	struct drm_device *dev = connector->dev; -	enum drm_connector_status status = connector_status_connected; +	enum drm_connector_status status;  	status = intel_panel_detect(dev);  	if (status != connector_status_unknown)  		return status; -	/* ACPI lid methods were generally unreliable in this generation, so -	 * don't even bother. -	 */ -	if (IS_GEN2(dev) || IS_GEN3(dev)) -		return connector_status_connected; - -	return status; +	return connector_status_connected;  }  /** @@ -835,25 +829,6 @@ static bool lvds_is_present_in_vbt(struct drm_device *dev,  	return false;  } -static bool intel_lvds_ddc_probe(struct drm_device *dev, u8 pin) -{ -	struct drm_i915_private *dev_priv = dev->dev_private; -	u8 buf = 0; -	struct i2c_msg msgs[] = { -		{ -			.addr = 0xA0, -			.flags = 0, -			.len = 1, -			.buf = &buf, -		}, -	}; -	struct i2c_adapter *i2c = &dev_priv->gmbus[pin].adapter; -	/* XXX this only appears to work when using GMBUS */ -	if (intel_gmbus_is_forced_bit(i2c)) -		return true; -	return i2c_transfer(i2c, msgs, 1) == 1; -} -  /**   * intel_lvds_init - setup LVDS connectors on this device   * @dev: drm device @@ -894,11 +869,6 @@ bool intel_lvds_init(struct drm_device *dev)  		}  	} -	if (!intel_lvds_ddc_probe(dev, pin)) { -		DRM_DEBUG_KMS("LVDS did not respond to DDC probe\n"); -		return false; -	} -  	intel_lvds = kzalloc(sizeof(struct intel_lvds), GFP_KERNEL);  	if (!intel_lvds) {  		return false; diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c b/drivers/gpu/drm/nouveau/nouveau_gem.c index e8b04f4aed7..b52e4601824 100644 --- a/drivers/gpu/drm/nouveau/nouveau_gem.c +++ b/drivers/gpu/drm/nouveau/nouveau_gem.c @@ -97,7 +97,7 @@ nouveau_gem_new(struct drm_device *dev, struct nouveau_channel *chan,  		return -ENOMEM;  	} -	nvbo->bo.persistant_swap_storage = nvbo->gem->filp; +	nvbo->bo.persistent_swap_storage = nvbo->gem->filp;  	nvbo->gem->driver_private = nvbo;  	return 0;  } diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c index 10e41af6b02..b41ec59c710 100644 --- a/drivers/gpu/drm/radeon/atombios_crtc.c +++ b/drivers/gpu/drm/radeon/atombios_crtc.c @@ -1009,6 +1009,7 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc,  	uint64_t fb_location;  	uint32_t fb_format, fb_pitch_pixels, tiling_flags;  	u32 fb_swap = EVERGREEN_GRPH_ENDIAN_SWAP(EVERGREEN_GRPH_ENDIAN_NONE); +	u32 tmp;  	int r;  	/* no fb bound */ @@ -1137,6 +1138,15 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc,  	WREG32(EVERGREEN_VIEWPORT_SIZE + radeon_crtc->crtc_offset,  	       (crtc->mode.hdisplay << 16) | crtc->mode.vdisplay); +	/* pageflip setup */ +	/* make sure flip is at vb rather than hb */ +	tmp = RREG32(EVERGREEN_GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset); +	tmp &= ~EVERGREEN_GRPH_SURFACE_UPDATE_H_RETRACE_EN; +	WREG32(EVERGREEN_GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset, tmp); + +	/* set pageflip to happen anywhere in vblank interval */ +	WREG32(EVERGREEN_MASTER_UPDATE_MODE + radeon_crtc->crtc_offset, 0); +  	if (!atomic && fb && fb != crtc->fb) {  		radeon_fb = to_radeon_framebuffer(fb);  		rbo = gem_to_radeon_bo(radeon_fb->obj); @@ -1167,6 +1177,7 @@ static int avivo_crtc_do_set_base(struct drm_crtc *crtc,  	uint64_t fb_location;  	uint32_t fb_format, fb_pitch_pixels, tiling_flags;  	u32 fb_swap = R600_D1GRPH_SWAP_ENDIAN_NONE; +	u32 tmp;  	int r;  	/* no fb bound */ @@ -1294,6 +1305,15 @@ static int avivo_crtc_do_set_base(struct drm_crtc *crtc,  	WREG32(AVIVO_D1MODE_VIEWPORT_SIZE + radeon_crtc->crtc_offset,  	       (crtc->mode.hdisplay << 16) | crtc->mode.vdisplay); +	/* pageflip setup */ +	/* make sure flip is at vb rather than hb */ +	tmp = RREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset); +	tmp &= ~AVIVO_D1GRPH_SURFACE_UPDATE_H_RETRACE_EN; +	WREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset, tmp); + +	/* set pageflip to happen anywhere in vblank interval */ +	WREG32(AVIVO_D1MODE_MASTER_UPDATE_MODE + radeon_crtc->crtc_offset, 0); +  	if (!atomic && fb && fb != crtc->fb) {  		radeon_fb = to_radeon_framebuffer(fb);  		rbo = gem_to_radeon_bo(radeon_fb->obj); diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index 941080a7794..0b0cc74c08c 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c @@ -43,17 +43,6 @@ static void evergreen_pcie_gen2_enable(struct radeon_device *rdev);  void evergreen_pre_page_flip(struct radeon_device *rdev, int crtc)  { -	struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc]; -	u32 tmp; - -	/* make sure flip is at vb rather than hb */ -	tmp = RREG32(EVERGREEN_GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset); -	tmp &= ~EVERGREEN_GRPH_SURFACE_UPDATE_H_RETRACE_EN; -	WREG32(EVERGREEN_GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset, tmp); - -	/* set pageflip to happen anywhere in vblank interval */ -	WREG32(EVERGREEN_MASTER_UPDATE_MODE + radeon_crtc->crtc_offset, 0); -  	/* enable the pflip int */  	radeon_irq_kms_pflip_irq_get(rdev, crtc);  } diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c index 02d5c415f49..99768d9d91d 100644 --- a/drivers/gpu/drm/radeon/radeon_atombios.c +++ b/drivers/gpu/drm/radeon/radeon_atombios.c @@ -675,7 +675,8 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev)  							ATOM_ENCODER_CAP_RECORD *cap_record;  							u16 caps = 0; -							while (record->ucRecordType > 0 && +							while (record->ucRecordSize > 0 && +							       record->ucRecordType > 0 &&  							       record->ucRecordType <= ATOM_MAX_OBJECT_RECORD_NUMBER) {  								switch (record->ucRecordType) {  								case ATOM_ENCODER_CAP_RECORD_TYPE: @@ -720,7 +721,8 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev)  									break;  							} -							while (record->ucRecordType > 0 && +							while (record->ucRecordSize > 0 && +							       record->ucRecordType > 0 &&  							       record->ucRecordType <= ATOM_MAX_OBJECT_RECORD_NUMBER) {  								switch (record->ucRecordType) {  								case ATOM_I2C_RECORD_TYPE: @@ -782,10 +784,9 @@ bool radeon_get_atom_connector_info_from_object_table(struct drm_device *dev)  						ATOM_HPD_INT_RECORD *hpd_record;  						ATOM_I2C_ID_CONFIG_ACCESS *i2c_config; -						while (record->ucRecordType > 0 -						       && record-> -						       ucRecordType <= -						       ATOM_MAX_OBJECT_RECORD_NUMBER) { +						while (record->ucRecordSize > 0 && +						       record->ucRecordType > 0 && +						       record->ucRecordType <= ATOM_MAX_OBJECT_RECORD_NUMBER) {  							switch (record->ucRecordType) {  							case ATOM_I2C_RECORD_TYPE:  								i2c_record = diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c index cf602e2d071..8caf546c8e9 100644 --- a/drivers/gpu/drm/radeon/radeon_combios.c +++ b/drivers/gpu/drm/radeon/radeon_combios.c @@ -2079,6 +2079,19 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev)  					    DRM_MODE_CONNECTOR_DVII, &ddc_i2c,  					    CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I,  					    &hpd); +		/* TV - TV DAC */ +		ddc_i2c.valid = false; +		hpd.hpd = RADEON_HPD_NONE; +		radeon_add_legacy_encoder(dev, +					  radeon_get_encoder_enum(dev, +								ATOM_DEVICE_TV1_SUPPORT, +								2), +					  ATOM_DEVICE_TV1_SUPPORT); +		radeon_add_legacy_connector(dev, 2, ATOM_DEVICE_TV1_SUPPORT, +					    DRM_MODE_CONNECTOR_SVIDEO, +					    &ddc_i2c, +					    CONNECTOR_OBJECT_ID_SVIDEO, +					    &hpd);  		break;  	default:  		DRM_INFO("Connector table: %d (invalid)\n", diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c index 19763f5df5e..876cebc4b8b 100644 --- a/drivers/gpu/drm/radeon/rs600.c +++ b/drivers/gpu/drm/radeon/rs600.c @@ -48,17 +48,6 @@ int rs600_mc_wait_for_idle(struct radeon_device *rdev);  void rs600_pre_page_flip(struct radeon_device *rdev, int crtc)  { -	struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc]; -	u32 tmp; - -	/* make sure flip is at vb rather than hb */ -	tmp = RREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset); -	tmp &= ~AVIVO_D1GRPH_SURFACE_UPDATE_H_RETRACE_EN; -	WREG32(AVIVO_D1GRPH_FLIP_CONTROL + radeon_crtc->crtc_offset, tmp); - -	/* set pageflip to happen anywhere in vblank interval */ -	WREG32(AVIVO_D1MODE_MASTER_UPDATE_MODE + radeon_crtc->crtc_offset, 0); -  	/* enable the pflip int */  	radeon_irq_kms_pflip_irq_get(rdev, crtc);  } diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c index 0b6a55ac2f8..2e618b5ac46 100644 --- a/drivers/gpu/drm/ttm/ttm_bo.c +++ b/drivers/gpu/drm/ttm/ttm_bo.c @@ -1168,7 +1168,7 @@ int ttm_bo_init(struct ttm_bo_device *bdev,  		uint32_t page_alignment,  		unsigned long buffer_start,  		bool interruptible, -		struct file *persistant_swap_storage, +		struct file *persistent_swap_storage,  		size_t acc_size,  		void (*destroy) (struct ttm_buffer_object *))  { @@ -1211,7 +1211,7 @@ int ttm_bo_init(struct ttm_bo_device *bdev,  	bo->priv_flags = 0;  	bo->mem.placement = (TTM_PL_FLAG_SYSTEM | TTM_PL_FLAG_CACHED);  	bo->seq_valid = false; -	bo->persistant_swap_storage = persistant_swap_storage; +	bo->persistent_swap_storage = persistent_swap_storage;  	bo->acc_size = acc_size;  	atomic_inc(&bo->glob->bo_count); @@ -1260,7 +1260,7 @@ int ttm_bo_create(struct ttm_bo_device *bdev,  			uint32_t page_alignment,  			unsigned long buffer_start,  			bool interruptible, -			struct file *persistant_swap_storage, +			struct file *persistent_swap_storage,  			struct ttm_buffer_object **p_bo)  {  	struct ttm_buffer_object *bo; @@ -1282,7 +1282,7 @@ int ttm_bo_create(struct ttm_bo_device *bdev,  	ret = ttm_bo_init(bdev, bo, size, type, placement, page_alignment,  				buffer_start, interruptible, -				persistant_swap_storage, acc_size, NULL); +				persistent_swap_storage, acc_size, NULL);  	if (likely(ret == 0))  		*p_bo = bo; @@ -1863,7 +1863,7 @@ static int ttm_bo_swapout(struct ttm_mem_shrink *shrink)  	if (bo->bdev->driver->swap_notify)  		bo->bdev->driver->swap_notify(bo); -	ret = ttm_tt_swapout(bo->ttm, bo->persistant_swap_storage); +	ret = ttm_tt_swapout(bo->ttm, bo->persistent_swap_storage);  out:  	/** diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c index 86d5b1745a4..90e23e0bfad 100644 --- a/drivers/gpu/drm/ttm/ttm_tt.c +++ b/drivers/gpu/drm/ttm/ttm_tt.c @@ -332,7 +332,7 @@ void ttm_tt_destroy(struct ttm_tt *ttm)  		ttm_tt_free_page_directory(ttm);  	} -	if (!(ttm->page_flags & TTM_PAGE_FLAG_PERSISTANT_SWAP) && +	if (!(ttm->page_flags & TTM_PAGE_FLAG_PERSISTENT_SWAP) &&  	    ttm->swap_storage)  		fput(ttm->swap_storage); @@ -503,7 +503,7 @@ static int ttm_tt_swapin(struct ttm_tt *ttm)  		page_cache_release(from_page);  	} -	if (!(ttm->page_flags & TTM_PAGE_FLAG_PERSISTANT_SWAP)) +	if (!(ttm->page_flags & TTM_PAGE_FLAG_PERSISTENT_SWAP))  		fput(swap_storage);  	ttm->swap_storage = NULL;  	ttm->page_flags &= ~TTM_PAGE_FLAG_SWAPPED; @@ -514,7 +514,7 @@ out_err:  	return ret;  } -int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage) +int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistent_swap_storage)  {  	struct address_space *swap_space;  	struct file *swap_storage; @@ -540,7 +540,7 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage)  		return 0;  	} -	if (!persistant_swap_storage) { +	if (!persistent_swap_storage) {  		swap_storage = shmem_file_setup("ttm swap",  						ttm->num_pages << PAGE_SHIFT,  						0); @@ -549,7 +549,7 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage)  			return PTR_ERR(swap_storage);  		}  	} else -		swap_storage = persistant_swap_storage; +		swap_storage = persistent_swap_storage;  	swap_space = swap_storage->f_path.dentry->d_inode->i_mapping; @@ -577,12 +577,12 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage)  	ttm_tt_free_alloced_pages(ttm);  	ttm->swap_storage = swap_storage;  	ttm->page_flags |= TTM_PAGE_FLAG_SWAPPED; -	if (persistant_swap_storage) -		ttm->page_flags |= TTM_PAGE_FLAG_PERSISTANT_SWAP; +	if (persistent_swap_storage) +		ttm->page_flags |= TTM_PAGE_FLAG_PERSISTENT_SWAP;  	return 0;  out_err: -	if (!persistant_swap_storage) +	if (!persistent_swap_storage)  		fput(swap_storage);  	return ret;  |