diff options
Diffstat (limited to 'drivers/gpu/drm')
| -rw-r--r-- | drivers/gpu/drm/i915/i915_debugfs.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem_execbuffer.c | 21 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_irq.c | 11 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_reg.h | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 47 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_pm.c | 17 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/evergreen.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/ni.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/r600.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon.h | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_drv.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_object.c | 18 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_ring.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_semaphore.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/reg_srcs/rv515 | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/si.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/ttm/ttm_bo.c | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/ttm/ttm_bo_util.c | 11 | 
19 files changed, 140 insertions, 32 deletions
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index e6a11ca85ea..7944d301518 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c @@ -641,6 +641,7 @@ static void i915_ring_error_state(struct seq_file *m,  	seq_printf(m, "%s command stream:\n", ring_str(ring));  	seq_printf(m, "  HEAD: 0x%08x\n", error->head[ring]);  	seq_printf(m, "  TAIL: 0x%08x\n", error->tail[ring]); +	seq_printf(m, "  CTL: 0x%08x\n", error->ctl[ring]);  	seq_printf(m, "  ACTHD: 0x%08x\n", error->acthd[ring]);  	seq_printf(m, "  IPEIR: 0x%08x\n", error->ipeir[ring]);  	seq_printf(m, "  IPEHR: 0x%08x\n", error->ipehr[ring]); @@ -693,6 +694,8 @@ static int i915_error_state(struct seq_file *m, void *unused)  	seq_printf(m, "EIR: 0x%08x\n", error->eir);  	seq_printf(m, "IER: 0x%08x\n", error->ier);  	seq_printf(m, "PGTBL_ER: 0x%08x\n", error->pgtbl_er); +	seq_printf(m, "FORCEWAKE: 0x%08x\n", error->forcewake); +	seq_printf(m, "DERRMR: 0x%08x\n", error->derrmr);  	seq_printf(m, "CCID: 0x%08x\n", error->ccid);  	for (i = 0; i < dev_priv->num_fence_regs; i++) diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index ed305957557..12ab3bdea54 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -188,10 +188,13 @@ struct drm_i915_error_state {  	u32 pgtbl_er;  	u32 ier;  	u32 ccid; +	u32 derrmr; +	u32 forcewake;  	bool waiting[I915_NUM_RINGS];  	u32 pipestat[I915_MAX_PIPES];  	u32 tail[I915_NUM_RINGS];  	u32 head[I915_NUM_RINGS]; +	u32 ctl[I915_NUM_RINGS];  	u32 ipeir[I915_NUM_RINGS];  	u32 ipehr[I915_NUM_RINGS];  	u32 instdone[I915_NUM_RINGS]; diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c index d6a994a0739..26d08bb5821 100644 --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c @@ -539,6 +539,8 @@ i915_gem_execbuffer_relocate_slow(struct drm_device *dev,  	total = 0;  	for (i = 0; i < count; i++) {  		struct drm_i915_gem_relocation_entry __user *user_relocs; +		u64 invalid_offset = (u64)-1; +		int j;  		user_relocs = (void __user *)(uintptr_t)exec[i].relocs_ptr; @@ -549,6 +551,25 @@ i915_gem_execbuffer_relocate_slow(struct drm_device *dev,  			goto err;  		} +		/* As we do not update the known relocation offsets after +		 * relocating (due to the complexities in lock handling), +		 * we need to mark them as invalid now so that we force the +		 * relocation processing next time. Just in case the target +		 * object is evicted and then rebound into its old +		 * presumed_offset before the next execbuffer - if that +		 * happened we would make the mistake of assuming that the +		 * relocations were valid. +		 */ +		for (j = 0; j < exec[i].relocation_count; j++) { +			if (copy_to_user(&user_relocs[j].presumed_offset, +					 &invalid_offset, +					 sizeof(invalid_offset))) { +				ret = -EFAULT; +				mutex_lock(&dev->struct_mutex); +				goto err; +			} +		} +  		reloc_offset[i] = total;  		total += exec[i].relocation_count;  	} diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 2220dec3e5d..fe843389c7b 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c @@ -1157,6 +1157,7 @@ static void i915_record_ring_state(struct drm_device *dev,  	error->acthd[ring->id] = intel_ring_get_active_head(ring);  	error->head[ring->id] = I915_READ_HEAD(ring);  	error->tail[ring->id] = I915_READ_TAIL(ring); +	error->ctl[ring->id] = I915_READ_CTL(ring);  	error->cpu_ring_head[ring->id] = ring->head;  	error->cpu_ring_tail[ring->id] = ring->tail; @@ -1251,6 +1252,16 @@ static void i915_capture_error_state(struct drm_device *dev)  	else  		error->ier = I915_READ(IER); +	if (INTEL_INFO(dev)->gen >= 6) +		error->derrmr = I915_READ(DERRMR); + +	if (IS_VALLEYVIEW(dev)) +		error->forcewake = I915_READ(FORCEWAKE_VLV); +	else if (INTEL_INFO(dev)->gen >= 7) +		error->forcewake = I915_READ(FORCEWAKE_MT); +	else if (INTEL_INFO(dev)->gen == 6) +		error->forcewake = I915_READ(FORCEWAKE); +  	for_each_pipe(pipe)  		error->pipestat[pipe] = I915_READ(PIPESTAT(pipe)); diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index 186ee5c85b5..b401788e179 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h @@ -512,6 +512,8 @@  #define GEN7_ERR_INT	0x44040  #define   ERR_INT_MMIO_UNCLAIMED (1<<13) +#define DERRMR		0x44050 +  /* GM45+ chicken bits -- debug workaround bits that may be required   * for various sorts of correct behavior.  The top 16 bits of each are   * the enables for writing to the corresponding low bit. diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 1b63d55318a..fb3715b4b09 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c @@ -2579,7 +2579,8 @@ intel_dp_add_properties(struct intel_dp *intel_dp, struct drm_connector *connect  static void  intel_dp_init_panel_power_sequencer(struct drm_device *dev, -				    struct intel_dp *intel_dp) +				    struct intel_dp *intel_dp, +				    struct edp_power_seq *out)  {  	struct drm_i915_private *dev_priv = dev->dev_private;  	struct edp_power_seq cur, vbt, spec, final; @@ -2650,16 +2651,35 @@ intel_dp_init_panel_power_sequencer(struct drm_device *dev,  	intel_dp->panel_power_cycle_delay = get_delay(t11_t12);  #undef get_delay +	DRM_DEBUG_KMS("panel power up delay %d, power down delay %d, power cycle delay %d\n", +		      intel_dp->panel_power_up_delay, intel_dp->panel_power_down_delay, +		      intel_dp->panel_power_cycle_delay); + +	DRM_DEBUG_KMS("backlight on delay %d, off delay %d\n", +		      intel_dp->backlight_on_delay, intel_dp->backlight_off_delay); + +	if (out) +		*out = final; +} + +static void +intel_dp_init_panel_power_sequencer_registers(struct drm_device *dev, +					      struct intel_dp *intel_dp, +					      struct edp_power_seq *seq) +{ +	struct drm_i915_private *dev_priv = dev->dev_private; +	u32 pp_on, pp_off, pp_div; +  	/* And finally store the new values in the power sequencer. */ -	pp_on = (final.t1_t3 << PANEL_POWER_UP_DELAY_SHIFT) | -		(final.t8 << PANEL_LIGHT_ON_DELAY_SHIFT); -	pp_off = (final.t9 << PANEL_LIGHT_OFF_DELAY_SHIFT) | -		 (final.t10 << PANEL_POWER_DOWN_DELAY_SHIFT); +	pp_on = (seq->t1_t3 << PANEL_POWER_UP_DELAY_SHIFT) | +		(seq->t8 << PANEL_LIGHT_ON_DELAY_SHIFT); +	pp_off = (seq->t9 << PANEL_LIGHT_OFF_DELAY_SHIFT) | +		 (seq->t10 << PANEL_POWER_DOWN_DELAY_SHIFT);  	/* Compute the divisor for the pp clock, simply match the Bspec  	 * formula. */  	pp_div = ((100 * intel_pch_rawclk(dev))/2 - 1)  			<< PP_REFERENCE_DIVIDER_SHIFT; -	pp_div |= (DIV_ROUND_UP(final.t11_t12, 1000) +	pp_div |= (DIV_ROUND_UP(seq->t11_t12, 1000)  			<< PANEL_POWER_CYCLE_DELAY_SHIFT);  	/* Haswell doesn't have any port selection bits for the panel @@ -2675,14 +2695,6 @@ intel_dp_init_panel_power_sequencer(struct drm_device *dev,  	I915_WRITE(PCH_PP_OFF_DELAYS, pp_off);  	I915_WRITE(PCH_PP_DIVISOR, pp_div); - -	DRM_DEBUG_KMS("panel power up delay %d, power down delay %d, power cycle delay %d\n", -		      intel_dp->panel_power_up_delay, intel_dp->panel_power_down_delay, -		      intel_dp->panel_power_cycle_delay); - -	DRM_DEBUG_KMS("backlight on delay %d, off delay %d\n", -		      intel_dp->backlight_on_delay, intel_dp->backlight_off_delay); -  	DRM_DEBUG_KMS("panel power sequencer register settings: PP_ON %#x, PP_OFF %#x, PP_DIV %#x\n",  		      I915_READ(PCH_PP_ON_DELAYS),  		      I915_READ(PCH_PP_OFF_DELAYS), @@ -2699,6 +2711,7 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,  	struct drm_device *dev = intel_encoder->base.dev;  	struct drm_i915_private *dev_priv = dev->dev_private;  	struct drm_display_mode *fixed_mode = NULL; +	struct edp_power_seq power_seq = { 0 };  	enum port port = intel_dig_port->port;  	const char *name = NULL;  	int type; @@ -2771,7 +2784,7 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,  	}  	if (is_edp(intel_dp)) -		intel_dp_init_panel_power_sequencer(dev, intel_dp); +		intel_dp_init_panel_power_sequencer(dev, intel_dp, &power_seq);  	intel_dp_i2c_init(intel_dp, intel_connector, name); @@ -2798,6 +2811,10 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,  			return;  		} +		/* We now know it's not a ghost, init power sequence regs. */ +		intel_dp_init_panel_power_sequencer_registers(dev, intel_dp, +							      &power_seq); +  		ironlake_edp_panel_vdd_on(intel_dp);  		edid = drm_get_edid(connector, &intel_dp->adapter);  		if (edid) { diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index e83a1179417..3280cffe50f 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c @@ -4250,7 +4250,8 @@ static void __gen6_gt_force_wake_get(struct drm_i915_private *dev_priv)  static void __gen6_gt_force_wake_mt_reset(struct drm_i915_private *dev_priv)  {  	I915_WRITE_NOTRACE(FORCEWAKE_MT, _MASKED_BIT_DISABLE(0xffff)); -	POSTING_READ(ECOBUS); /* something from same cacheline, but !FORCEWAKE */ +	/* something from same cacheline, but !FORCEWAKE_MT */ +	POSTING_READ(ECOBUS);  }  static void __gen6_gt_force_wake_mt_get(struct drm_i915_private *dev_priv) @@ -4267,7 +4268,8 @@ static void __gen6_gt_force_wake_mt_get(struct drm_i915_private *dev_priv)  		DRM_ERROR("Timed out waiting for forcewake old ack to clear.\n");  	I915_WRITE_NOTRACE(FORCEWAKE_MT, _MASKED_BIT_ENABLE(FORCEWAKE_KERNEL)); -	POSTING_READ(ECOBUS); /* something from same cacheline, but !FORCEWAKE */ +	/* something from same cacheline, but !FORCEWAKE_MT */ +	POSTING_READ(ECOBUS);  	if (wait_for_atomic((I915_READ_NOTRACE(forcewake_ack) & 1),  			    FORCEWAKE_ACK_TIMEOUT_MS)) @@ -4304,14 +4306,16 @@ void gen6_gt_check_fifodbg(struct drm_i915_private *dev_priv)  static void __gen6_gt_force_wake_put(struct drm_i915_private *dev_priv)  {  	I915_WRITE_NOTRACE(FORCEWAKE, 0); -	/* gen6_gt_check_fifodbg doubles as the POSTING_READ */ +	/* something from same cacheline, but !FORCEWAKE */ +	POSTING_READ(ECOBUS);  	gen6_gt_check_fifodbg(dev_priv);  }  static void __gen6_gt_force_wake_mt_put(struct drm_i915_private *dev_priv)  {  	I915_WRITE_NOTRACE(FORCEWAKE_MT, _MASKED_BIT_DISABLE(FORCEWAKE_KERNEL)); -	/* gen6_gt_check_fifodbg doubles as the POSTING_READ */ +	/* something from same cacheline, but !FORCEWAKE_MT */ +	POSTING_READ(ECOBUS);  	gen6_gt_check_fifodbg(dev_priv);  } @@ -4351,6 +4355,8 @@ int __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv)  static void vlv_force_wake_reset(struct drm_i915_private *dev_priv)  {  	I915_WRITE_NOTRACE(FORCEWAKE_VLV, _MASKED_BIT_DISABLE(0xffff)); +	/* something from same cacheline, but !FORCEWAKE_VLV */ +	POSTING_READ(FORCEWAKE_ACK_VLV);  }  static void vlv_force_wake_get(struct drm_i915_private *dev_priv) @@ -4371,7 +4377,8 @@ static void vlv_force_wake_get(struct drm_i915_private *dev_priv)  static void vlv_force_wake_put(struct drm_i915_private *dev_priv)  {  	I915_WRITE_NOTRACE(FORCEWAKE_VLV, _MASKED_BIT_DISABLE(FORCEWAKE_KERNEL)); -	/* The below doubles as a POSTING_READ */ +	/* something from same cacheline, but !FORCEWAKE_VLV */ +	POSTING_READ(FORCEWAKE_ACK_VLV);  	gen6_gt_check_fifodbg(dev_priv);  } diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index 061fa0a2890..4d0e60adbc6 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c @@ -2401,6 +2401,12 @@ static int evergreen_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask)  {  	struct evergreen_mc_save save; +	if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE)) +		reset_mask &= ~(RADEON_RESET_GFX | RADEON_RESET_COMPUTE); + +	if (RREG32(DMA_STATUS_REG) & DMA_IDLE) +		reset_mask &= ~RADEON_RESET_DMA; +  	if (reset_mask == 0)  		return 0; diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c index 896f1cbc58a..59acabb45c9 100644 --- a/drivers/gpu/drm/radeon/ni.c +++ b/drivers/gpu/drm/radeon/ni.c @@ -1409,6 +1409,12 @@ static int cayman_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask)  {  	struct evergreen_mc_save save; +	if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE)) +		reset_mask &= ~(RADEON_RESET_GFX | RADEON_RESET_COMPUTE); + +	if (RREG32(DMA_STATUS_REG) & DMA_IDLE) +		reset_mask &= ~RADEON_RESET_DMA; +  	if (reset_mask == 0)  		return 0; diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index 537e259b383..3cb9d608937 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c @@ -1378,6 +1378,12 @@ static int r600_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask)  {  	struct rv515_mc_save save; +	if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE)) +		reset_mask &= ~(RADEON_RESET_GFX | RADEON_RESET_COMPUTE); + +	if (RREG32(DMA_STATUS_REG) & DMA_IDLE) +		reset_mask &= ~RADEON_RESET_DMA; +  	if (reset_mask == 0)  		return 0; diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index 34e52304a52..a08f657329a 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h @@ -324,7 +324,6 @@ struct radeon_bo {  	struct list_head		list;  	/* Protected by tbo.reserved */  	u32				placements[3]; -	u32				busy_placements[3];  	struct ttm_placement		placement;  	struct ttm_buffer_object	tbo;  	struct ttm_bo_kmap_obj		kmap; @@ -654,6 +653,8 @@ struct radeon_ring {  	u32			ptr_reg_mask;  	u32			nop;  	u32			idx; +	u64			last_semaphore_signal_addr; +	u64			last_semaphore_wait_addr;  };  /* diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c index dff6cf77f95..d9bf96ee299 100644 --- a/drivers/gpu/drm/radeon/radeon_drv.c +++ b/drivers/gpu/drm/radeon/radeon_drv.c @@ -69,9 +69,10 @@   *   2.26.0 - r600-eg: fix htile size computation   *   2.27.0 - r600-SI: Add CS ioctl support for async DMA   *   2.28.0 - r600-eg: Add MEM_WRITE packet support + *   2.29.0 - R500 FP16 color clear registers   */  #define KMS_DRIVER_MAJOR	2 -#define KMS_DRIVER_MINOR	28 +#define KMS_DRIVER_MINOR	29  #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); diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c index 883c95d8d90..d3aface2d12 100644 --- a/drivers/gpu/drm/radeon/radeon_object.c +++ b/drivers/gpu/drm/radeon/radeon_object.c @@ -84,6 +84,7 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)  	rbo->placement.fpfn = 0;  	rbo->placement.lpfn = 0;  	rbo->placement.placement = rbo->placements; +	rbo->placement.busy_placement = rbo->placements;  	if (domain & RADEON_GEM_DOMAIN_VRAM)  		rbo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED |  					TTM_PL_FLAG_VRAM; @@ -104,14 +105,6 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)  	if (!c)  		rbo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;  	rbo->placement.num_placement = c; - -	c = 0; -	rbo->placement.busy_placement = rbo->busy_placements; -	if (rbo->rdev->flags & RADEON_IS_AGP) { -		rbo->busy_placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_TT; -	} else { -		rbo->busy_placements[c++] = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_TT; -	}  	rbo->placement.num_busy_placement = c;  } @@ -357,6 +350,7 @@ int radeon_bo_list_validate(struct list_head *head)  {  	struct radeon_bo_list *lobj;  	struct radeon_bo *bo; +	u32 domain;  	int r;  	r = ttm_eu_reserve_buffers(head); @@ -366,9 +360,17 @@ int radeon_bo_list_validate(struct list_head *head)  	list_for_each_entry(lobj, head, tv.head) {  		bo = lobj->bo;  		if (!bo->pin_count) { +			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);  			if (unlikely(r)) { +				if (r != -ERESTARTSYS && domain == RADEON_GEM_DOMAIN_VRAM) { +					domain |= RADEON_GEM_DOMAIN_GTT; +					goto retry; +				}  				return r;  			}  		} diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c index 141f2b6a9cf..2430d80b187 100644 --- a/drivers/gpu/drm/radeon/radeon_ring.c +++ b/drivers/gpu/drm/radeon/radeon_ring.c @@ -784,6 +784,8 @@ static int radeon_debugfs_ring_info(struct seq_file *m, void *data)  	}  	seq_printf(m, "driver's copy of the wptr: 0x%08x [%5d]\n", ring->wptr, ring->wptr);  	seq_printf(m, "driver's copy of the rptr: 0x%08x [%5d]\n", ring->rptr, ring->rptr); +	seq_printf(m, "last semaphore signal addr : 0x%016llx\n", ring->last_semaphore_signal_addr); +	seq_printf(m, "last semaphore wait addr   : 0x%016llx\n", ring->last_semaphore_wait_addr);  	seq_printf(m, "%u free dwords in ring\n", ring->ring_free_dw);  	seq_printf(m, "%u dwords in ring\n", count);  	/* print 8 dw before current rptr as often it's the last executed diff --git a/drivers/gpu/drm/radeon/radeon_semaphore.c b/drivers/gpu/drm/radeon/radeon_semaphore.c index 97f3ece81cd..8dcc20f53d7 100644 --- a/drivers/gpu/drm/radeon/radeon_semaphore.c +++ b/drivers/gpu/drm/radeon/radeon_semaphore.c @@ -95,6 +95,10 @@ int radeon_semaphore_sync_rings(struct radeon_device *rdev,  	/* we assume caller has already allocated space on waiters ring */  	radeon_semaphore_emit_wait(rdev, waiter, semaphore); +	/* for debugging lockup only, used by sysfs debug files */ +	rdev->ring[signaler].last_semaphore_signal_addr = semaphore->gpu_addr; +	rdev->ring[waiter].last_semaphore_wait_addr = semaphore->gpu_addr; +  	return 0;  } diff --git a/drivers/gpu/drm/radeon/reg_srcs/rv515 b/drivers/gpu/drm/radeon/reg_srcs/rv515 index 911a8fbd32b..78d5e99d759 100644 --- a/drivers/gpu/drm/radeon/reg_srcs/rv515 +++ b/drivers/gpu/drm/radeon/reg_srcs/rv515 @@ -324,6 +324,8 @@ rv515 0x6d40  0x46AC US_OUT_FMT_2  0x46B0 US_OUT_FMT_3  0x46B4 US_W_FMT +0x46C0 RB3D_COLOR_CLEAR_VALUE_AR +0x46C4 RB3D_COLOR_CLEAR_VALUE_GB  0x4BC0 FG_FOG_BLEND  0x4BC4 FG_FOG_FACTOR  0x4BC8 FG_FOG_COLOR_R diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c index 3240a3d64f3..ae8b48205a6 100644 --- a/drivers/gpu/drm/radeon/si.c +++ b/drivers/gpu/drm/radeon/si.c @@ -2215,6 +2215,12 @@ static int si_gpu_soft_reset(struct radeon_device *rdev, u32 reset_mask)  {  	struct evergreen_mc_save save; +	if (!(RREG32(GRBM_STATUS) & GUI_ACTIVE)) +		reset_mask &= ~(RADEON_RESET_GFX | RADEON_RESET_COMPUTE); + +	if (RREG32(DMA_STATUS_REG) & DMA_IDLE) +		reset_mask &= ~RADEON_RESET_DMA; +  	if (reset_mask == 0)  		return 0; diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c index 33d20be87db..52b20b12c83 100644 --- a/drivers/gpu/drm/ttm/ttm_bo.c +++ b/drivers/gpu/drm/ttm/ttm_bo.c @@ -434,6 +434,7 @@ static int ttm_bo_handle_move_mem(struct ttm_buffer_object *bo,  			bo->mem = tmp_mem;  			bdev->driver->move_notify(bo, mem);  			bo->mem = *mem; +			*mem = tmp_mem;  		}  		goto out_err; diff --git a/drivers/gpu/drm/ttm/ttm_bo_util.c b/drivers/gpu/drm/ttm/ttm_bo_util.c index d73d6e3e17b..44420fca7df 100644 --- a/drivers/gpu/drm/ttm/ttm_bo_util.c +++ b/drivers/gpu/drm/ttm/ttm_bo_util.c @@ -344,8 +344,12 @@ int ttm_bo_move_memcpy(struct ttm_buffer_object *bo,  	if (ttm->state == tt_unpopulated) {  		ret = ttm->bdev->driver->ttm_tt_populate(ttm); -		if (ret) +		if (ret) { +			/* if we fail here don't nuke the mm node +			 * as the bo still owns it */ +			old_copy.mm_node = NULL;  			goto out1; +		}  	}  	add = 0; @@ -371,8 +375,11 @@ int ttm_bo_move_memcpy(struct ttm_buffer_object *bo,  						   prot);  		} else  			ret = ttm_copy_io_page(new_iomap, old_iomap, page); -		if (ret) +		if (ret) { +			/* failing here, means keep old copy as-is */ +			old_copy.mm_node = NULL;  			goto out1; +		}  	}  	mb();  out2:  |