All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/7] drm/amdgpu: fix indentation in struct amdgpu_ring
@ 2016-07-21 10:01 Christian König
       [not found] ` <1469095284-2024-1-git-send-email-deathsimple-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org>
  0 siblings, 1 reply; 12+ messages in thread
From: Christian König @ 2016-07-21 10:01 UTC (permalink / raw)
  To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

From: Christian König <christian.koenig@amd.com>

Signed-off-by: Christian König <christian.koenig@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index 459e136..d939038 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -802,8 +802,8 @@ struct amdgpu_ring {
 	enum amdgpu_ring_type	type;
 	char			name[16];
 	unsigned		cond_exe_offs;
-	u64				cond_exe_gpu_addr;
-	volatile u32	*cond_exe_cpu_addr;
+	u64			cond_exe_gpu_addr;
+	volatile u32		*cond_exe_cpu_addr;
 #if defined(CONFIG_DEBUG_FS)
 	struct dentry *ent;
 #endif
-- 
2.5.0

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 2/7] drm/amdgpu: remove fence_lock
       [not found] ` <1469095284-2024-1-git-send-email-deathsimple-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org>
@ 2016-07-21 10:01   ` Christian König
       [not found]     ` <1469095284-2024-2-git-send-email-deathsimple-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org>
  2016-07-21 10:01   ` [PATCH 3/7] drm/amdgpu: add begin/end_use ring callbacks Christian König
                     ` (6 subsequent siblings)
  7 siblings, 1 reply; 12+ messages in thread
From: Christian König @ 2016-07-21 10:01 UTC (permalink / raw)
  To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

From: Christian König <christian.koenig@amd.com>

Was never used as far as I can see.

Signed-off-by: Christian König <christian.koenig@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu.h      | 1 -
 drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c | 1 -
 2 files changed, 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index d939038..0bc84c3 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -775,7 +775,6 @@ struct amdgpu_ring {
 	struct amdgpu_fence_driver	fence_drv;
 	struct amd_gpu_scheduler	sched;
 
-	spinlock_t              fence_lock;
 	struct amdgpu_bo	*ring_obj;
 	volatile uint32_t	*ring;
 	unsigned		rptr_offs;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
index 3b885e3..f305f63 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
@@ -198,7 +198,6 @@ int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring,
 	ring->cond_exe_gpu_addr = adev->wb.gpu_addr + (ring->cond_exe_offs * 4);
 	ring->cond_exe_cpu_addr = &adev->wb.wb[ring->cond_exe_offs];
 
-	spin_lock_init(&ring->fence_lock);
 	r = amdgpu_fence_driver_start_ring(ring, irq_src, irq_type);
 	if (r) {
 		dev_err(adev->dev, "failed initializing fences (%d).\n", r);
-- 
2.5.0

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 3/7] drm/amdgpu: add begin/end_use ring callbacks
       [not found] ` <1469095284-2024-1-git-send-email-deathsimple-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org>
  2016-07-21 10:01   ` [PATCH 2/7] drm/amdgpu: remove fence_lock Christian König
@ 2016-07-21 10:01   ` Christian König
  2016-07-21 10:01   ` [PATCH 4/7] drm/amdgpu: use begin/end_use for UVD power/clock gating Christian König
                     ` (5 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Christian König @ 2016-07-21 10:01 UTC (permalink / raw)
  To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

From: Christian König <christian.koenig@amd.com>

For manual UVD/VCE power and clock gating.

Signed-off-by: Christian König <christian.koenig@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu.h      |  3 +++
 drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c | 10 ++++++++++
 2 files changed, 13 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index 0bc84c3..a086547 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -314,6 +314,9 @@ struct amdgpu_ring_funcs {
 	void (*pad_ib)(struct amdgpu_ring *ring, struct amdgpu_ib *ib);
 	unsigned (*init_cond_exec)(struct amdgpu_ring *ring);
 	void (*patch_cond_exec)(struct amdgpu_ring *ring, unsigned offset);
+	/* note usage for clock and power gating */
+	void (*begin_use)(struct amdgpu_ring *ring);
+	void (*end_use)(struct amdgpu_ring *ring);
 };
 
 /*
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
index f305f63..85aeb0a 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
@@ -75,6 +75,10 @@ int amdgpu_ring_alloc(struct amdgpu_ring *ring, unsigned ndw)
 
 	ring->count_dw = ndw;
 	ring->wptr_old = ring->wptr;
+
+	if (ring->funcs->begin_use)
+		ring->funcs->begin_use(ring);
+
 	return 0;
 }
 
@@ -127,6 +131,9 @@ void amdgpu_ring_commit(struct amdgpu_ring *ring)
 
 	mb();
 	amdgpu_ring_set_wptr(ring);
+
+	if (ring->funcs->end_use)
+		ring->funcs->end_use(ring);
 }
 
 /**
@@ -139,6 +146,9 @@ void amdgpu_ring_commit(struct amdgpu_ring *ring)
 void amdgpu_ring_undo(struct amdgpu_ring *ring)
 {
 	ring->wptr = ring->wptr_old;
+
+	if (ring->funcs->end_use)
+		ring->funcs->end_use(ring);
 }
 
 /**
-- 
2.5.0

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 4/7] drm/amdgpu: use begin/end_use for UVD power/clock gating
       [not found] ` <1469095284-2024-1-git-send-email-deathsimple-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org>
  2016-07-21 10:01   ` [PATCH 2/7] drm/amdgpu: remove fence_lock Christian König
  2016-07-21 10:01   ` [PATCH 3/7] drm/amdgpu: add begin/end_use ring callbacks Christian König
@ 2016-07-21 10:01   ` Christian König
  2016-07-21 10:01   ` [PATCH 5/7] drm/amdgpu: use begin/end_use for VCE " Christian König
                     ` (4 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Christian König @ 2016-07-21 10:01 UTC (permalink / raw)
  To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

From: Christian König <christian.koenig@amd.com>

This fixes turning power and clock on when it is actually needed.

Signed-off-by: Christian König <christian.koenig@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c | 15 +++++++--------
 drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h |  2 ++
 drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c   |  2 ++
 drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c   |  2 ++
 drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c   |  4 ++++
 5 files changed, 17 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
index a46a64c..2a70c42 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
@@ -92,7 +92,6 @@ MODULE_FIRMWARE(FIRMWARE_STONEY);
 MODULE_FIRMWARE(FIRMWARE_POLARIS10);
 MODULE_FIRMWARE(FIRMWARE_POLARIS11);
 
-static void amdgpu_uvd_note_usage(struct amdgpu_device *adev);
 static void amdgpu_uvd_idle_work_handler(struct work_struct *work);
 
 int amdgpu_uvd_sw_init(struct amdgpu_device *adev)
@@ -346,8 +345,6 @@ void amdgpu_uvd_free_handles(struct amdgpu_device *adev, struct drm_file *filp)
 		if (handle != 0 && adev->uvd.filp[i] == filp) {
 			struct fence *fence;
 
-			amdgpu_uvd_note_usage(adev);
-
 			r = amdgpu_uvd_get_destroy_msg(ring, handle,
 						       false, &fence);
 			if (r) {
@@ -913,8 +910,6 @@ int amdgpu_uvd_ring_parse_cs(struct amdgpu_cs_parser *parser, uint32_t ib_idx)
 		return -EINVAL;
 	}
 
-	amdgpu_uvd_note_usage(ctx.parser->adev);
-
 	return 0;
 }
 
@@ -1118,11 +1113,10 @@ static void amdgpu_uvd_idle_work_handler(struct work_struct *work)
 	}
 }
 
-static void amdgpu_uvd_note_usage(struct amdgpu_device *adev)
+void amdgpu_uvd_ring_begin_use(struct amdgpu_ring *ring)
 {
+	struct amdgpu_device *adev = ring->adev;
 	bool set_clocks = !cancel_delayed_work_sync(&adev->uvd.idle_work);
-	set_clocks &= schedule_delayed_work(&adev->uvd.idle_work,
-					    UVD_IDLE_TIMEOUT);
 
 	if (set_clocks) {
 		if (adev->pm.dpm_enabled) {
@@ -1132,3 +1126,8 @@ static void amdgpu_uvd_note_usage(struct amdgpu_device *adev)
 		}
 	}
 }
+
+void amdgpu_uvd_ring_end_use(struct amdgpu_ring *ring)
+{
+	schedule_delayed_work(&ring->adev->uvd.idle_work, UVD_IDLE_TIMEOUT);
+}
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h
index 9a3b449..5bad371 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h
@@ -35,5 +35,7 @@ int amdgpu_uvd_get_destroy_msg(struct amdgpu_ring *ring, uint32_t handle,
 void amdgpu_uvd_free_handles(struct amdgpu_device *adev,
 			     struct drm_file *filp);
 int amdgpu_uvd_ring_parse_cs(struct amdgpu_cs_parser *parser, uint32_t ib_idx);
+void amdgpu_uvd_ring_begin_use(struct amdgpu_ring *ring);
+void amdgpu_uvd_ring_end_use(struct amdgpu_ring *ring);
 
 #endif
diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c b/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c
index 416c856..862d6cf 100644
--- a/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c
+++ b/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c
@@ -797,6 +797,8 @@ static const struct amdgpu_ring_funcs uvd_v4_2_ring_funcs = {
 	.test_ib = uvd_v4_2_ring_test_ib,
 	.insert_nop = amdgpu_ring_insert_nop,
 	.pad_ib = amdgpu_ring_generic_pad_ib,
+	.begin_use = amdgpu_uvd_ring_begin_use,
+	.end_use = amdgpu_uvd_ring_end_use,
 };
 
 static void uvd_v4_2_set_ring_funcs(struct amdgpu_device *adev)
diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c
index dd636c4..f585247 100644
--- a/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c
@@ -848,6 +848,8 @@ static const struct amdgpu_ring_funcs uvd_v5_0_ring_funcs = {
 	.test_ib = uvd_v5_0_ring_test_ib,
 	.insert_nop = amdgpu_ring_insert_nop,
 	.pad_ib = amdgpu_ring_generic_pad_ib,
+	.begin_use = amdgpu_uvd_ring_begin_use,
+	.end_use = amdgpu_uvd_ring_end_use,
 };
 
 static void uvd_v5_0_set_ring_funcs(struct amdgpu_device *adev)
diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c
index f757c04..8c03132 100644
--- a/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c
@@ -1084,6 +1084,8 @@ static const struct amdgpu_ring_funcs uvd_v6_0_ring_phys_funcs = {
 	.test_ib = uvd_v6_0_ring_test_ib,
 	.insert_nop = amdgpu_ring_insert_nop,
 	.pad_ib = amdgpu_ring_generic_pad_ib,
+	.begin_use = amdgpu_uvd_ring_begin_use,
+	.end_use = amdgpu_uvd_ring_end_use,
 };
 
 static const struct amdgpu_ring_funcs uvd_v6_0_ring_vm_funcs = {
@@ -1101,6 +1103,8 @@ static const struct amdgpu_ring_funcs uvd_v6_0_ring_vm_funcs = {
 	.test_ib = uvd_v6_0_ring_test_ib,
 	.insert_nop = amdgpu_ring_insert_nop,
 	.pad_ib = amdgpu_ring_generic_pad_ib,
+	.begin_use = amdgpu_uvd_ring_begin_use,
+	.end_use = amdgpu_uvd_ring_end_use,
 };
 
 static void uvd_v6_0_set_ring_funcs(struct amdgpu_device *adev)
-- 
2.5.0

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 5/7] drm/amdgpu: use begin/end_use for VCE power/clock gating
       [not found] ` <1469095284-2024-1-git-send-email-deathsimple-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org>
                     ` (2 preceding siblings ...)
  2016-07-21 10:01   ` [PATCH 4/7] drm/amdgpu: use begin/end_use for UVD power/clock gating Christian König
@ 2016-07-21 10:01   ` Christian König
  2016-07-21 10:01   ` [PATCH 6/7] drm/amdgpu: move UVD IB test into common code v2 Christian König
                     ` (3 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Christian König @ 2016-07-21 10:01 UTC (permalink / raw)
  To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

From: Christian König <christian.koenig@amd.com>

This fixes turning power and clock on when it is actually needed.

Signed-off-by: Christian König <christian.koenig@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu.h     |  1 +
 drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c | 37 +++++++++++++++++++++------------
 drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h |  2 ++
 drivers/gpu/drm/amd/amdgpu/vce_v2_0.c   |  2 ++
 drivers/gpu/drm/amd/amdgpu/vce_v3_0.c   |  2 ++
 5 files changed, 31 insertions(+), 13 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index a086547..f724a87 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -1708,6 +1708,7 @@ struct amdgpu_vce {
 	struct drm_file		*filp[AMDGPU_MAX_VCE_HANDLES];
 	uint32_t		img_size[AMDGPU_MAX_VCE_HANDLES];
 	struct delayed_work	idle_work;
+	struct mutex		idle_mutex;
 	const struct firmware	*fw;	/* VCE firmware */
 	struct amdgpu_ring	ring[AMDGPU_MAX_VCE_RINGS];
 	struct amdgpu_irq_src	irq;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
index aeeeb72..6b49d40 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
@@ -85,8 +85,6 @@ int amdgpu_vce_sw_init(struct amdgpu_device *adev, unsigned long size)
 	unsigned ucode_version, version_major, version_minor, binary_id;
 	int i, r;
 
-	INIT_DELAYED_WORK(&adev->vce.idle_work, amdgpu_vce_idle_work_handler);
-
 	switch (adev->asic_type) {
 #ifdef CONFIG_DRM_AMDGPU_CIK
 	case CHIP_BONAIRE:
@@ -197,6 +195,9 @@ int amdgpu_vce_sw_init(struct amdgpu_device *adev, unsigned long size)
 		adev->vce.filp[i] = NULL;
 	}
 
+	INIT_DELAYED_WORK(&adev->vce.idle_work, amdgpu_vce_idle_work_handler);
+	mutex_init(&adev->vce.idle_mutex);
+
 	return 0;
 }
 
@@ -220,6 +221,7 @@ int amdgpu_vce_sw_fini(struct amdgpu_device *adev)
 	amdgpu_ring_fini(&adev->vce.ring[1]);
 
 	release_firmware(adev->vce.fw);
+	mutex_destroy(&adev->vce.idle_mutex);
 
 	return 0;
 }
@@ -315,19 +317,19 @@ static void amdgpu_vce_idle_work_handler(struct work_struct *work)
 }
 
 /**
- * amdgpu_vce_note_usage - power up VCE
+ * amdgpu_vce_ring_begin_use - power up VCE
  *
- * @adev: amdgpu_device pointer
+ * @ring: amdgpu ring
  *
  * Make sure VCE is powerd up when we want to use it
  */
-static void amdgpu_vce_note_usage(struct amdgpu_device *adev)
+void amdgpu_vce_ring_begin_use(struct amdgpu_ring *ring)
 {
-	bool set_clocks = !cancel_delayed_work_sync(&adev->vce.idle_work);
-
-	set_clocks &= schedule_delayed_work(&adev->vce.idle_work,
-					    VCE_IDLE_TIMEOUT);
+	struct amdgpu_device *adev = ring->adev;
+	bool set_clocks;
 
+	mutex_lock(&adev->vce.idle_mutex);
+	set_clocks = !cancel_delayed_work_sync(&adev->vce.idle_work);
 	if (set_clocks) {
 		if (adev->pm.dpm_enabled) {
 			amdgpu_dpm_enable_vce(adev, true);
@@ -335,6 +337,19 @@ static void amdgpu_vce_note_usage(struct amdgpu_device *adev)
 			amdgpu_asic_set_vce_clocks(adev, 53300, 40000);
 		}
 	}
+	mutex_unlock(&adev->vce.idle_mutex);
+}
+
+/**
+ * amdgpu_vce_ring_end_use - power VCE down
+ *
+ * @ring: amdgpu ring
+ *
+ * Schedule work to power VCE down again
+ */
+void amdgpu_vce_ring_end_use(struct amdgpu_ring *ring)
+{
+	schedule_delayed_work(&ring->adev->vce.idle_work, VCE_IDLE_TIMEOUT);
 }
 
 /**
@@ -355,8 +370,6 @@ void amdgpu_vce_free_handles(struct amdgpu_device *adev, struct drm_file *filp)
 		if (!handle || adev->vce.filp[i] != filp)
 			continue;
 
-		amdgpu_vce_note_usage(adev);
-
 		r = amdgpu_vce_get_destroy_msg(ring, handle, false, NULL);
 		if (r)
 			DRM_ERROR("Error destroying VCE handle (%d)!\n", r);
@@ -622,8 +635,6 @@ int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p, uint32_t ib_idx)
 	uint32_t *size = &tmp;
 	int i, r = 0, idx = 0;
 
-	amdgpu_vce_note_usage(p->adev);
-
 	while (idx < ib->length_dw) {
 		uint32_t len = amdgpu_get_ib_value(p, ib_idx, idx);
 		uint32_t cmd = amdgpu_get_ib_value(p, ib_idx, idx + 1);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
index f40cf76..fe84b80 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
@@ -40,5 +40,7 @@ void amdgpu_vce_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 seq,
 				unsigned flags);
 int amdgpu_vce_ring_test_ring(struct amdgpu_ring *ring);
 int amdgpu_vce_ring_test_ib(struct amdgpu_ring *ring);
+void amdgpu_vce_ring_begin_use(struct amdgpu_ring *ring);
+void amdgpu_vce_ring_end_use(struct amdgpu_ring *ring);
 
 #endif
diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v2_0.c b/drivers/gpu/drm/amd/amdgpu/vce_v2_0.c
index 45d92ac..80a37a6 100644
--- a/drivers/gpu/drm/amd/amdgpu/vce_v2_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vce_v2_0.c
@@ -594,6 +594,8 @@ static const struct amdgpu_ring_funcs vce_v2_0_ring_funcs = {
 	.test_ib = amdgpu_vce_ring_test_ib,
 	.insert_nop = amdgpu_ring_insert_nop,
 	.pad_ib = amdgpu_ring_generic_pad_ib,
+	.begin_use = amdgpu_vce_ring_begin_use,
+	.end_use = amdgpu_vce_ring_end_use,
 };
 
 static void vce_v2_0_set_ring_funcs(struct amdgpu_device *adev)
diff --git a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c
index 63d8169..6247513 100644
--- a/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/vce_v3_0.c
@@ -853,6 +853,8 @@ static const struct amdgpu_ring_funcs vce_v3_0_ring_funcs = {
 	.test_ib = amdgpu_vce_ring_test_ib,
 	.insert_nop = amdgpu_ring_insert_nop,
 	.pad_ib = amdgpu_ring_generic_pad_ib,
+	.begin_use = amdgpu_vce_ring_begin_use,
+	.end_use = amdgpu_vce_ring_end_use,
 };
 
 static void vce_v3_0_set_ring_funcs(struct amdgpu_device *adev)
-- 
2.5.0

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 6/7] drm/amdgpu: move UVD IB test into common code v2
       [not found] ` <1469095284-2024-1-git-send-email-deathsimple-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org>
                     ` (3 preceding siblings ...)
  2016-07-21 10:01   ` [PATCH 5/7] drm/amdgpu: use begin/end_use for VCE " Christian König
@ 2016-07-21 10:01   ` Christian König
  2016-07-21 10:01   ` [PATCH 7/7] drm/amdgpu: add a fence timeout for the IB tests v2 Christian König
                     ` (2 subsequent siblings)
  7 siblings, 0 replies; 12+ messages in thread
From: Christian König @ 2016-07-21 10:01 UTC (permalink / raw)
  To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

From: Christian König <christian.koenig@amd.com>

Since we now raise the clocks from begin_use() we don't need
a separate function for each hw generation any more.

v2: remove unintentional lowering of the UVD clocks, fix typos for CIK hw.

Signed-off-by: Christian König <christian.koenig@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c | 35 +++++++++++++++++++++++++
 drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h |  1 +
 drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c   | 45 +--------------------------------
 drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c   | 45 +--------------------------------
 drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c   | 39 ++--------------------------
 5 files changed, 40 insertions(+), 125 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
index 2a70c42..d8b461a 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
@@ -1131,3 +1131,38 @@ void amdgpu_uvd_ring_end_use(struct amdgpu_ring *ring)
 {
 	schedule_delayed_work(&ring->adev->uvd.idle_work, UVD_IDLE_TIMEOUT);
 }
+
+/**
+ * amdgpu_uvd_ring_test_ib - test ib execution
+ *
+ * @ring: amdgpu_ring pointer
+ *
+ * Test if we can successfully execute an IB
+ */
+int amdgpu_uvd_ring_test_ib(struct amdgpu_ring *ring)
+{
+	struct fence *fence = NULL;
+	int r;
+
+	r = amdgpu_uvd_get_create_msg(ring, 1, NULL);
+	if (r) {
+		DRM_ERROR("amdgpu: failed to get create msg (%d).\n", r);
+		goto error;
+	}
+
+	r = amdgpu_uvd_get_destroy_msg(ring, 1, true, &fence);
+	if (r) {
+		DRM_ERROR("amdgpu: failed to get destroy ib (%d).\n", r);
+		goto error;
+	}
+
+	r = fence_wait(fence, false);
+	if (r) {
+		DRM_ERROR("amdgpu: fence wait failed (%d).\n", r);
+		goto error;
+	}
+	DRM_INFO("ib test on ring %d succeeded\n",  ring->idx);
+error:
+	fence_put(fence);
+	return r;
+}
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h
index 5bad371..224359e 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h
@@ -37,5 +37,6 @@ void amdgpu_uvd_free_handles(struct amdgpu_device *adev,
 int amdgpu_uvd_ring_parse_cs(struct amdgpu_cs_parser *parser, uint32_t ib_idx);
 void amdgpu_uvd_ring_begin_use(struct amdgpu_ring *ring);
 void amdgpu_uvd_ring_end_use(struct amdgpu_ring *ring);
+int amdgpu_uvd_ring_test_ib(struct amdgpu_ring *ring);
 
 #endif
diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c b/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c
index 862d6cf..132e613 100644
--- a/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c
+++ b/drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c
@@ -527,49 +527,6 @@ static void uvd_v4_2_ring_emit_ib(struct amdgpu_ring *ring,
 }
 
 /**
- * uvd_v4_2_ring_test_ib - test ib execution
- *
- * @ring: amdgpu_ring pointer
- *
- * Test if we can successfully execute an IB
- */
-static int uvd_v4_2_ring_test_ib(struct amdgpu_ring *ring)
-{
-	struct amdgpu_device *adev = ring->adev;
-	struct fence *fence = NULL;
-	int r;
-
-	r = amdgpu_asic_set_uvd_clocks(adev, 53300, 40000);
-	if (r) {
-		DRM_ERROR("amdgpu: failed to raise UVD clocks (%d).\n", r);
-		return r;
-	}
-
-	r = amdgpu_uvd_get_create_msg(ring, 1, NULL);
-	if (r) {
-		DRM_ERROR("amdgpu: failed to get create msg (%d).\n", r);
-		goto error;
-	}
-
-	r = amdgpu_uvd_get_destroy_msg(ring, 1, true, &fence);
-	if (r) {
-		DRM_ERROR("amdgpu: failed to get destroy ib (%d).\n", r);
-		goto error;
-	}
-
-	r = fence_wait(fence, false);
-	if (r) {
-		DRM_ERROR("amdgpu: fence wait failed (%d).\n", r);
-		goto error;
-	}
-	DRM_INFO("ib test on ring %d succeeded\n",  ring->idx);
-error:
-	fence_put(fence);
-	amdgpu_asic_set_uvd_clocks(adev, 0, 0);
-	return r;
-}
-
-/**
  * uvd_v4_2_mc_resume - memory controller programming
  *
  * @adev: amdgpu_device pointer
@@ -794,7 +751,7 @@ static const struct amdgpu_ring_funcs uvd_v4_2_ring_funcs = {
 	.emit_hdp_flush = uvd_v4_2_ring_emit_hdp_flush,
 	.emit_hdp_invalidate = uvd_v4_2_ring_emit_hdp_invalidate,
 	.test_ring = uvd_v4_2_ring_test_ring,
-	.test_ib = uvd_v4_2_ring_test_ib,
+	.test_ib = amdgpu_uvd_ring_test_ib,
 	.insert_nop = amdgpu_ring_insert_nop,
 	.pad_ib = amdgpu_ring_generic_pad_ib,
 	.begin_use = amdgpu_uvd_ring_begin_use,
diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c
index f585247..101de13 100644
--- a/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c
@@ -577,49 +577,6 @@ static void uvd_v5_0_ring_emit_ib(struct amdgpu_ring *ring,
 	amdgpu_ring_write(ring, ib->length_dw);
 }
 
-/**
- * uvd_v5_0_ring_test_ib - test ib execution
- *
- * @ring: amdgpu_ring pointer
- *
- * Test if we can successfully execute an IB
- */
-static int uvd_v5_0_ring_test_ib(struct amdgpu_ring *ring)
-{
-	struct amdgpu_device *adev = ring->adev;
-	struct fence *fence = NULL;
-	int r;
-
-	r = amdgpu_asic_set_uvd_clocks(adev, 53300, 40000);
-	if (r) {
-		DRM_ERROR("amdgpu: failed to raise UVD clocks (%d).\n", r);
-		return r;
-	}
-
-	r = amdgpu_uvd_get_create_msg(ring, 1, NULL);
-	if (r) {
-		DRM_ERROR("amdgpu: failed to get create msg (%d).\n", r);
-		goto error;
-	}
-
-	r = amdgpu_uvd_get_destroy_msg(ring, 1, true, &fence);
-	if (r) {
-		DRM_ERROR("amdgpu: failed to get destroy ib (%d).\n", r);
-		goto error;
-	}
-
-	r = fence_wait(fence, false);
-	if (r) {
-		DRM_ERROR("amdgpu: fence wait failed (%d).\n", r);
-		goto error;
-	}
-	DRM_INFO("ib test on ring %d succeeded\n",  ring->idx);
-error:
-	fence_put(fence);
-	amdgpu_asic_set_uvd_clocks(adev, 0, 0);
-	return r;
-}
-
 static bool uvd_v5_0_is_idle(void *handle)
 {
 	struct amdgpu_device *adev = (struct amdgpu_device *)handle;
@@ -845,7 +802,7 @@ static const struct amdgpu_ring_funcs uvd_v5_0_ring_funcs = {
 	.emit_hdp_flush = uvd_v5_0_ring_emit_hdp_flush,
 	.emit_hdp_invalidate = uvd_v5_0_ring_emit_hdp_invalidate,
 	.test_ring = uvd_v5_0_ring_test_ring,
-	.test_ib = uvd_v5_0_ring_test_ib,
+	.test_ib = amdgpu_uvd_ring_test_ib,
 	.insert_nop = amdgpu_ring_insert_nop,
 	.pad_ib = amdgpu_ring_generic_pad_ib,
 	.begin_use = amdgpu_uvd_ring_begin_use,
diff --git a/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c b/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c
index 8c03132..f46d11c 100644
--- a/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c
@@ -684,41 +684,6 @@ static void uvd_v6_0_ring_emit_ib(struct amdgpu_ring *ring,
 	amdgpu_ring_write(ring, ib->length_dw);
 }
 
-/**
- * uvd_v6_0_ring_test_ib - test ib execution
- *
- * @ring: amdgpu_ring pointer
- *
- * Test if we can successfully execute an IB
- */
-static int uvd_v6_0_ring_test_ib(struct amdgpu_ring *ring)
-{
-	struct fence *fence = NULL;
-	int r;
-
-	r = amdgpu_uvd_get_create_msg(ring, 1, NULL);
-	if (r) {
-		DRM_ERROR("amdgpu: failed to get create msg (%d).\n", r);
-		goto error;
-	}
-
-	r = amdgpu_uvd_get_destroy_msg(ring, 1, true, &fence);
-	if (r) {
-		DRM_ERROR("amdgpu: failed to get destroy ib (%d).\n", r);
-		goto error;
-	}
-
-	r = fence_wait(fence, false);
-	if (r) {
-		DRM_ERROR("amdgpu: fence wait failed (%d).\n", r);
-		goto error;
-	}
-	DRM_INFO("ib test on ring %d succeeded\n",  ring->idx);
-error:
-	fence_put(fence);
-	return r;
-}
-
 static void uvd_v6_0_ring_emit_vm_flush(struct amdgpu_ring *ring,
 					 unsigned vm_id, uint64_t pd_addr)
 {
@@ -1081,7 +1046,7 @@ static const struct amdgpu_ring_funcs uvd_v6_0_ring_phys_funcs = {
 	.emit_hdp_flush = uvd_v6_0_ring_emit_hdp_flush,
 	.emit_hdp_invalidate = uvd_v6_0_ring_emit_hdp_invalidate,
 	.test_ring = uvd_v6_0_ring_test_ring,
-	.test_ib = uvd_v6_0_ring_test_ib,
+	.test_ib = amdgpu_uvd_ring_test_ib,
 	.insert_nop = amdgpu_ring_insert_nop,
 	.pad_ib = amdgpu_ring_generic_pad_ib,
 	.begin_use = amdgpu_uvd_ring_begin_use,
@@ -1100,7 +1065,7 @@ static const struct amdgpu_ring_funcs uvd_v6_0_ring_vm_funcs = {
 	.emit_hdp_flush = uvd_v6_0_ring_emit_hdp_flush,
 	.emit_hdp_invalidate = uvd_v6_0_ring_emit_hdp_invalidate,
 	.test_ring = uvd_v6_0_ring_test_ring,
-	.test_ib = uvd_v6_0_ring_test_ib,
+	.test_ib = amdgpu_uvd_ring_test_ib,
 	.insert_nop = amdgpu_ring_insert_nop,
 	.pad_ib = amdgpu_ring_generic_pad_ib,
 	.begin_use = amdgpu_uvd_ring_begin_use,
-- 
2.5.0

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 7/7] drm/amdgpu: add a fence timeout for the IB tests v2
       [not found] ` <1469095284-2024-1-git-send-email-deathsimple-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org>
                     ` (4 preceding siblings ...)
  2016-07-21 10:01   ` [PATCH 6/7] drm/amdgpu: move UVD IB test into common code v2 Christian König
@ 2016-07-21 10:01   ` Christian König
       [not found]     ` <1469095284-2024-7-git-send-email-deathsimple-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org>
  2016-07-21 10:22   ` [PATCH 1/7] drm/amdgpu: fix indentation in struct amdgpu_ring zhoucm1
  2016-07-21 10:24   ` Edward O'Callaghan
  7 siblings, 1 reply; 12+ messages in thread
From: Christian König @ 2016-07-21 10:01 UTC (permalink / raw)
  To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

From: Christian König <christian.koenig@amd.com>

10ms should be enough for now.

v2: fix some typos in CIK code

Signed-off-by: Christian König <christian.koenig@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu.h     |  4 ++--
 drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c  |  4 +++-
 drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c | 25 +++++++++++++++----------
 drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h |  2 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c | 18 +++++++++++-------
 drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h |  2 +-
 drivers/gpu/drm/amd/amdgpu/cik_sdma.c   | 19 ++++++++++++-------
 drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c   | 19 ++++++++++++-------
 drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c   | 19 ++++++++++++-------
 drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c  | 19 ++++++++++++-------
 drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c  | 19 ++++++++++++-------
 11 files changed, 93 insertions(+), 57 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index f724a87..03c3a8a 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -307,7 +307,7 @@ struct amdgpu_ring_funcs {
 				uint32_t oa_base, uint32_t oa_size);
 	/* testing functions */
 	int (*test_ring)(struct amdgpu_ring *ring);
-	int (*test_ib)(struct amdgpu_ring *ring);
+	int (*test_ib)(struct amdgpu_ring *ring, long timeout);
 	/* insert NOP packets */
 	void (*insert_nop)(struct amdgpu_ring *ring, uint32_t count);
 	/* pad the indirect buffer to the necessary number of dw */
@@ -2261,7 +2261,7 @@ amdgpu_get_sdma_instance(struct amdgpu_ring *ring)
 #define amdgpu_vm_set_pte_pde(adev, ib, pe, addr, count, incr, flags) ((adev)->vm_manager.vm_pte_funcs->set_pte_pde((ib), (pe), (addr), (count), (incr), (flags)))
 #define amdgpu_ring_parse_cs(r, p, ib) ((r)->funcs->parse_cs((p), (ib)))
 #define amdgpu_ring_test_ring(r) (r)->funcs->test_ring((r))
-#define amdgpu_ring_test_ib(r) (r)->funcs->test_ib((r))
+#define amdgpu_ring_test_ib(r, t) (r)->funcs->test_ib((r), (t))
 #define amdgpu_ring_get_rptr(r) (r)->funcs->get_rptr((r))
 #define amdgpu_ring_get_wptr(r) (r)->funcs->get_wptr((r))
 #define amdgpu_ring_set_wptr(r) (r)->funcs->set_wptr((r))
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
index 428ebf3..050062e 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
@@ -33,6 +33,8 @@
 #include "amdgpu.h"
 #include "atom.h"
 
+#define AMDGPU_IB_TEST_TIMEOUT	msecs_to_jiffies(10)
+
 /*
  * IB
  * IBs (Indirect Buffers) and areas of GPU accessible memory where
@@ -286,7 +288,7 @@ int amdgpu_ib_ring_tests(struct amdgpu_device *adev)
 		if (!ring || !ring->ready)
 			continue;
 
-		r = amdgpu_ring_test_ib(ring);
+		r = amdgpu_ring_test_ib(ring, AMDGPU_IB_TEST_TIMEOUT);
 		if (r) {
 			ring->ready = false;
 
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
index d8b461a..aa80b72 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
@@ -1139,29 +1139,34 @@ void amdgpu_uvd_ring_end_use(struct amdgpu_ring *ring)
  *
  * Test if we can successfully execute an IB
  */
-int amdgpu_uvd_ring_test_ib(struct amdgpu_ring *ring)
+int amdgpu_uvd_ring_test_ib(struct amdgpu_ring *ring, long timeout)
 {
-	struct fence *fence = NULL;
-	int r;
+	struct fence *fence;
+	long r;
 
 	r = amdgpu_uvd_get_create_msg(ring, 1, NULL);
 	if (r) {
-		DRM_ERROR("amdgpu: failed to get create msg (%d).\n", r);
+		DRM_ERROR("amdgpu: failed to get create msg (%ld).\n", r);
 		goto error;
 	}
 
 	r = amdgpu_uvd_get_destroy_msg(ring, 1, true, &fence);
 	if (r) {
-		DRM_ERROR("amdgpu: failed to get destroy ib (%d).\n", r);
+		DRM_ERROR("amdgpu: failed to get destroy ib (%ld).\n", r);
 		goto error;
 	}
 
-	r = fence_wait(fence, false);
-	if (r) {
-		DRM_ERROR("amdgpu: fence wait failed (%d).\n", r);
-		goto error;
+	r = fence_wait_timeout(fence, false, timeout);
+	if (r == 0) {
+		DRM_ERROR("amdgpu: IB test timed out.\n");
+		r = -ETIMEDOUT;
+	} else if (r < 0) {
+		DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
+	} else {
+		DRM_INFO("ib test on ring %d succeeded\n",  ring->idx);
+		r = 0;
 	}
-	DRM_INFO("ib test on ring %d succeeded\n",  ring->idx);
+
 error:
 	fence_put(fence);
 	return r;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h
index 224359e..c850009 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h
@@ -37,6 +37,6 @@ void amdgpu_uvd_free_handles(struct amdgpu_device *adev,
 int amdgpu_uvd_ring_parse_cs(struct amdgpu_cs_parser *parser, uint32_t ib_idx);
 void amdgpu_uvd_ring_begin_use(struct amdgpu_ring *ring);
 void amdgpu_uvd_ring_end_use(struct amdgpu_ring *ring);
-int amdgpu_uvd_ring_test_ib(struct amdgpu_ring *ring);
+int amdgpu_uvd_ring_test_ib(struct amdgpu_ring *ring, long timeout);
 
 #endif
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
index 6b49d40..0afa73c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
@@ -844,10 +844,10 @@ int amdgpu_vce_ring_test_ring(struct amdgpu_ring *ring)
  * @ring: the engine to test on
  *
  */
-int amdgpu_vce_ring_test_ib(struct amdgpu_ring *ring)
+int amdgpu_vce_ring_test_ib(struct amdgpu_ring *ring, long timeout)
 {
 	struct fence *fence = NULL;
-	int r;
+	long r;
 
 	/* skip vce ring1 ib test for now, since it's not reliable */
 	if (ring == &ring->adev->vce.ring[1])
@@ -855,21 +855,25 @@ int amdgpu_vce_ring_test_ib(struct amdgpu_ring *ring)
 
 	r = amdgpu_vce_get_create_msg(ring, 1, NULL);
 	if (r) {
-		DRM_ERROR("amdgpu: failed to get create msg (%d).\n", r);
+		DRM_ERROR("amdgpu: failed to get create msg (%ld).\n", r);
 		goto error;
 	}
 
 	r = amdgpu_vce_get_destroy_msg(ring, 1, true, &fence);
 	if (r) {
-		DRM_ERROR("amdgpu: failed to get destroy ib (%d).\n", r);
+		DRM_ERROR("amdgpu: failed to get destroy ib (%ld).\n", r);
 		goto error;
 	}
 
-	r = fence_wait(fence, false);
-	if (r) {
-		DRM_ERROR("amdgpu: fence wait failed (%d).\n", r);
+	r = fence_wait_timeout(fence, false, timeout);
+	if (r == 0) {
+		DRM_ERROR("amdgpu: IB test timed out.\n");
+		r = -ETIMEDOUT;
+	} else if (r < 0) {
+		DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
 	} else {
 		DRM_INFO("ib test on ring %d succeeded\n", ring->idx);
+		r = 0;
 	}
 error:
 	fence_put(fence);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
index fe84b80..63f83d0 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
@@ -39,7 +39,7 @@ void amdgpu_vce_ring_emit_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib,
 void amdgpu_vce_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 seq,
 				unsigned flags);
 int amdgpu_vce_ring_test_ring(struct amdgpu_ring *ring);
-int amdgpu_vce_ring_test_ib(struct amdgpu_ring *ring);
+int amdgpu_vce_ring_test_ib(struct amdgpu_ring *ring, long timeout);
 void amdgpu_vce_ring_begin_use(struct amdgpu_ring *ring);
 void amdgpu_vce_ring_end_use(struct amdgpu_ring *ring);
 
diff --git a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
index 6507a7e..7f95a8b 100644
--- a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
+++ b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
@@ -617,19 +617,19 @@ static int cik_sdma_ring_test_ring(struct amdgpu_ring *ring)
  * Test a simple IB in the DMA ring (CIK).
  * Returns 0 on success, error on failure.
  */
-static int cik_sdma_ring_test_ib(struct amdgpu_ring *ring)
+static int cik_sdma_ring_test_ib(struct amdgpu_ring *ring, long timeout)
 {
 	struct amdgpu_device *adev = ring->adev;
 	struct amdgpu_ib ib;
 	struct fence *f = NULL;
 	unsigned index;
-	int r;
 	u32 tmp = 0;
 	u64 gpu_addr;
+	long r;
 
 	r = amdgpu_wb_get(adev, &index);
 	if (r) {
-		dev_err(adev->dev, "(%d) failed to allocate wb slot\n", r);
+		dev_err(adev->dev, "(%ld) failed to allocate wb slot\n", r);
 		return r;
 	}
 
@@ -639,7 +639,7 @@ static int cik_sdma_ring_test_ib(struct amdgpu_ring *ring)
 	memset(&ib, 0, sizeof(ib));
 	r = amdgpu_ib_get(adev, NULL, 256, &ib);
 	if (r) {
-		DRM_ERROR("amdgpu: failed to get ib (%d).\n", r);
+		DRM_ERROR("amdgpu: failed to get ib (%ld).\n", r);
 		goto err0;
 	}
 
@@ -654,14 +654,19 @@ static int cik_sdma_ring_test_ib(struct amdgpu_ring *ring)
 	if (r)
 		goto err1;
 
-	r = fence_wait(f, false);
-	if (r) {
-		DRM_ERROR("amdgpu: fence wait failed (%d).\n", r);
+	r = fence_wait_timeout(f, false, timeout);
+	if (r == 0) {
+		DRM_ERROR("amdgpu: IB test timed out\n");
+		r = -ETIMEDOUT;
+		goto err1;
+	} else if (r < 0) {
+		DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
 		goto err1;
 	}
 	tmp = le32_to_cpu(adev->wb.wb[index]);
 	if (tmp == 0xDEADBEEF) {
 		DRM_INFO("ib test on ring %d succeeded\n", ring->idx);
+		r = 0;
 	} else {
 		DRM_ERROR("amdgpu: ib test failed (0x%08X)\n", tmp);
 		r = -EINVAL;
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
index 81e5dec..740b4be 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
@@ -2105,25 +2105,25 @@ static void gfx_v7_0_ring_emit_ib_compute(struct amdgpu_ring *ring,
  * Provides a basic gfx ring test to verify that IBs are working.
  * Returns 0 on success, error on failure.
  */
-static int gfx_v7_0_ring_test_ib(struct amdgpu_ring *ring)
+static int gfx_v7_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
 {
 	struct amdgpu_device *adev = ring->adev;
 	struct amdgpu_ib ib;
 	struct fence *f = NULL;
 	uint32_t scratch;
 	uint32_t tmp = 0;
-	int r;
+	long r;
 
 	r = amdgpu_gfx_scratch_get(adev, &scratch);
 	if (r) {
-		DRM_ERROR("amdgpu: failed to get scratch reg (%d).\n", r);
+		DRM_ERROR("amdgpu: failed to get scratch reg (%ld).\n", r);
 		return r;
 	}
 	WREG32(scratch, 0xCAFEDEAD);
 	memset(&ib, 0, sizeof(ib));
 	r = amdgpu_ib_get(adev, NULL, 256, &ib);
 	if (r) {
-		DRM_ERROR("amdgpu: failed to get ib (%d).\n", r);
+		DRM_ERROR("amdgpu: failed to get ib (%ld).\n", r);
 		goto err1;
 	}
 	ib.ptr[0] = PACKET3(PACKET3_SET_UCONFIG_REG, 1);
@@ -2135,14 +2135,19 @@ static int gfx_v7_0_ring_test_ib(struct amdgpu_ring *ring)
 	if (r)
 		goto err2;
 
-	r = fence_wait(f, false);
-	if (r) {
-		DRM_ERROR("amdgpu: fence wait failed (%d).\n", r);
+	r = fence_wait_timeout(f, false, timeout);
+	if (r == 0) {
+		DRM_ERROR("amdgpu: IB test timed out\n");
+		r = -ETIMEDOUT;
+		goto err2;
+	} else if (r < 0) {
+		DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
 		goto err2;
 	}
 	tmp = RREG32(scratch);
 	if (tmp == 0xDEADBEEF) {
 		DRM_INFO("ib test on ring %d succeeded\n", ring->idx);
+		r = 0;
 	} else {
 		DRM_ERROR("amdgpu: ib test failed (scratch(0x%04X)=0x%08X)\n",
 			  scratch, tmp);
diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
index 5882d3a..f58fc84 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
@@ -784,25 +784,25 @@ static int gfx_v8_0_ring_test_ring(struct amdgpu_ring *ring)
 	return r;
 }
 
-static int gfx_v8_0_ring_test_ib(struct amdgpu_ring *ring)
+static int gfx_v8_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
 {
 	struct amdgpu_device *adev = ring->adev;
 	struct amdgpu_ib ib;
 	struct fence *f = NULL;
 	uint32_t scratch;
 	uint32_t tmp = 0;
-	int r;
+	long r;
 
 	r = amdgpu_gfx_scratch_get(adev, &scratch);
 	if (r) {
-		DRM_ERROR("amdgpu: failed to get scratch reg (%d).\n", r);
+		DRM_ERROR("amdgpu: failed to get scratch reg (%ld).\n", r);
 		return r;
 	}
 	WREG32(scratch, 0xCAFEDEAD);
 	memset(&ib, 0, sizeof(ib));
 	r = amdgpu_ib_get(adev, NULL, 256, &ib);
 	if (r) {
-		DRM_ERROR("amdgpu: failed to get ib (%d).\n", r);
+		DRM_ERROR("amdgpu: failed to get ib (%ld).\n", r);
 		goto err1;
 	}
 	ib.ptr[0] = PACKET3(PACKET3_SET_UCONFIG_REG, 1);
@@ -814,14 +814,19 @@ static int gfx_v8_0_ring_test_ib(struct amdgpu_ring *ring)
 	if (r)
 		goto err2;
 
-	r = fence_wait(f, false);
-	if (r) {
-		DRM_ERROR("amdgpu: fence wait failed (%d).\n", r);
+	r = fence_wait_timeout(f, false, timeout);
+	if (r == 0) {
+		DRM_ERROR("amdgpu: IB test timed out.\n");
+		r = -ETIMEDOUT;
+		goto err2;
+	} else if (r < 0) {
+		DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
 		goto err2;
 	}
 	tmp = RREG32(scratch);
 	if (tmp == 0xDEADBEEF) {
 		DRM_INFO("ib test on ring %d succeeded\n", ring->idx);
+		r = 0;
 	} else {
 		DRM_ERROR("amdgpu: ib test failed (scratch(0x%04X)=0x%08X)\n",
 			  scratch, tmp);
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
index 0111d15..c7113ee 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
@@ -668,19 +668,19 @@ static int sdma_v2_4_ring_test_ring(struct amdgpu_ring *ring)
  * Test a simple IB in the DMA ring (VI).
  * Returns 0 on success, error on failure.
  */
-static int sdma_v2_4_ring_test_ib(struct amdgpu_ring *ring)
+static int sdma_v2_4_ring_test_ib(struct amdgpu_ring *ring, long timeout)
 {
 	struct amdgpu_device *adev = ring->adev;
 	struct amdgpu_ib ib;
 	struct fence *f = NULL;
 	unsigned index;
-	int r;
 	u32 tmp = 0;
 	u64 gpu_addr;
+	long r;
 
 	r = amdgpu_wb_get(adev, &index);
 	if (r) {
-		dev_err(adev->dev, "(%d) failed to allocate wb slot\n", r);
+		dev_err(adev->dev, "(%ld) failed to allocate wb slot\n", r);
 		return r;
 	}
 
@@ -690,7 +690,7 @@ static int sdma_v2_4_ring_test_ib(struct amdgpu_ring *ring)
 	memset(&ib, 0, sizeof(ib));
 	r = amdgpu_ib_get(adev, NULL, 256, &ib);
 	if (r) {
-		DRM_ERROR("amdgpu: failed to get ib (%d).\n", r);
+		DRM_ERROR("amdgpu: failed to get ib (%ld).\n", r);
 		goto err0;
 	}
 
@@ -709,14 +709,19 @@ static int sdma_v2_4_ring_test_ib(struct amdgpu_ring *ring)
 	if (r)
 		goto err1;
 
-	r = fence_wait(f, false);
-	if (r) {
-		DRM_ERROR("amdgpu: fence wait failed (%d).\n", r);
+	r = fence_wait_timeout(f, false, timeout);
+	if (r == 0) {
+		DRM_ERROR("amdgpu: IB test timed out\n");
+		r = -ETIMEDOUT;
+		goto err1;
+	} else if (r) {
+		DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
 		goto err1;
 	}
 	tmp = le32_to_cpu(adev->wb.wb[index]);
 	if (tmp == 0xDEADBEEF) {
 		DRM_INFO("ib test on ring %d succeeded\n", ring->idx);
+		r = 0;
 	} else {
 		DRM_ERROR("amdgpu: ib test failed (0x%08X)\n", tmp);
 		r = -EINVAL;
diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
index e506d3c..df09d85 100644
--- a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
@@ -896,19 +896,19 @@ static int sdma_v3_0_ring_test_ring(struct amdgpu_ring *ring)
  * Test a simple IB in the DMA ring (VI).
  * Returns 0 on success, error on failure.
  */
-static int sdma_v3_0_ring_test_ib(struct amdgpu_ring *ring)
+static int sdma_v3_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
 {
 	struct amdgpu_device *adev = ring->adev;
 	struct amdgpu_ib ib;
 	struct fence *f = NULL;
 	unsigned index;
-	int r;
 	u32 tmp = 0;
 	u64 gpu_addr;
+	long r;
 
 	r = amdgpu_wb_get(adev, &index);
 	if (r) {
-		dev_err(adev->dev, "(%d) failed to allocate wb slot\n", r);
+		dev_err(adev->dev, "(%ld) failed to allocate wb slot\n", r);
 		return r;
 	}
 
@@ -918,7 +918,7 @@ static int sdma_v3_0_ring_test_ib(struct amdgpu_ring *ring)
 	memset(&ib, 0, sizeof(ib));
 	r = amdgpu_ib_get(adev, NULL, 256, &ib);
 	if (r) {
-		DRM_ERROR("amdgpu: failed to get ib (%d).\n", r);
+		DRM_ERROR("amdgpu: failed to get ib (%ld).\n", r);
 		goto err0;
 	}
 
@@ -937,14 +937,19 @@ static int sdma_v3_0_ring_test_ib(struct amdgpu_ring *ring)
 	if (r)
 		goto err1;
 
-	r = fence_wait(f, false);
-	if (r) {
-		DRM_ERROR("amdgpu: fence wait failed (%d).\n", r);
+	r = fence_wait_timeout(f, false, timeout);
+	if (r == 0) {
+		DRM_ERROR("amdgpu: IB test timed out\n");
+		r = -ETIMEDOUT;
+		goto err1;
+	} else if (r < 0) {
+		DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
 		goto err1;
 	}
 	tmp = le32_to_cpu(adev->wb.wb[index]);
 	if (tmp == 0xDEADBEEF) {
 		DRM_INFO("ib test on ring %d succeeded\n", ring->idx);
+		r = 0;
 	} else {
 		DRM_ERROR("amdgpu: ib test failed (0x%08X)\n", tmp);
 		r = -EINVAL;
-- 
2.5.0

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH 1/7] drm/amdgpu: fix indentation in struct amdgpu_ring
       [not found] ` <1469095284-2024-1-git-send-email-deathsimple-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org>
                     ` (5 preceding siblings ...)
  2016-07-21 10:01   ` [PATCH 7/7] drm/amdgpu: add a fence timeout for the IB tests v2 Christian König
@ 2016-07-21 10:22   ` zhoucm1
  2016-07-21 10:24   ` Edward O'Callaghan
  7 siblings, 0 replies; 12+ messages in thread
From: zhoucm1 @ 2016-07-21 10:22 UTC (permalink / raw)
  To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW



On 2016年07月21日 18:01, Christian König wrote:
> From: Christian König <christian.koenig@amd.com>
>
> Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Chunming Zhou <david1.zhou@amd.com>
> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu.h | 4 ++--
>   1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> index 459e136..d939038 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> @@ -802,8 +802,8 @@ struct amdgpu_ring {
>   	enum amdgpu_ring_type	type;
>   	char			name[16];
>   	unsigned		cond_exe_offs;
> -	u64				cond_exe_gpu_addr;
> -	volatile u32	*cond_exe_cpu_addr;
> +	u64			cond_exe_gpu_addr;
> +	volatile u32		*cond_exe_cpu_addr;
>   #if defined(CONFIG_DEBUG_FS)
>   	struct dentry *ent;
>   #endif

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 2/7] drm/amdgpu: remove fence_lock
       [not found]     ` <1469095284-2024-2-git-send-email-deathsimple-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org>
@ 2016-07-21 10:23       ` zhoucm1
  0 siblings, 0 replies; 12+ messages in thread
From: zhoucm1 @ 2016-07-21 10:23 UTC (permalink / raw)
  To: Christian König, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW



On 2016年07月21日 18:01, Christian König wrote:
> From: Christian König <christian.koenig@amd.com>
>
> Was never used as far as I can see.
>
> Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Chunming Zhou <david1.zhou@amd.com>
> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu.h      | 1 -
>   drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c | 1 -
>   2 files changed, 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> index d939038..0bc84c3 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> @@ -775,7 +775,6 @@ struct amdgpu_ring {
>   	struct amdgpu_fence_driver	fence_drv;
>   	struct amd_gpu_scheduler	sched;
>   
> -	spinlock_t              fence_lock;
>   	struct amdgpu_bo	*ring_obj;
>   	volatile uint32_t	*ring;
>   	unsigned		rptr_offs;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
> index 3b885e3..f305f63 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
> @@ -198,7 +198,6 @@ int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring,
>   	ring->cond_exe_gpu_addr = adev->wb.gpu_addr + (ring->cond_exe_offs * 4);
>   	ring->cond_exe_cpu_addr = &adev->wb.wb[ring->cond_exe_offs];
>   
> -	spin_lock_init(&ring->fence_lock);
>   	r = amdgpu_fence_driver_start_ring(ring, irq_src, irq_type);
>   	if (r) {
>   		dev_err(adev->dev, "failed initializing fences (%d).\n", r);

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 7/7] drm/amdgpu: add a fence timeout for the IB tests v2
       [not found]     ` <1469095284-2024-7-git-send-email-deathsimple-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org>
@ 2016-07-21 10:24       ` zhoucm1
  2016-07-27 17:57       ` Deucher, Alexander
  1 sibling, 0 replies; 12+ messages in thread
From: zhoucm1 @ 2016-07-21 10:24 UTC (permalink / raw)
  To: Christian König, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW



On 2016年07月21日 18:01, Christian König wrote:
> From: Christian König <christian.koenig@amd.com>
>
> 10ms should be enough for now.
>
> v2: fix some typos in CIK code
>
> Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Chunming Zhou <david1.zhou@amd.com>
> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu.h     |  4 ++--
>   drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c  |  4 +++-
>   drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c | 25 +++++++++++++++----------
>   drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h |  2 +-
>   drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c | 18 +++++++++++-------
>   drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h |  2 +-
>   drivers/gpu/drm/amd/amdgpu/cik_sdma.c   | 19 ++++++++++++-------
>   drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c   | 19 ++++++++++++-------
>   drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c   | 19 ++++++++++++-------
>   drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c  | 19 ++++++++++++-------
>   drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c  | 19 ++++++++++++-------
>   11 files changed, 93 insertions(+), 57 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> index f724a87..03c3a8a 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> @@ -307,7 +307,7 @@ struct amdgpu_ring_funcs {
>   				uint32_t oa_base, uint32_t oa_size);
>   	/* testing functions */
>   	int (*test_ring)(struct amdgpu_ring *ring);
> -	int (*test_ib)(struct amdgpu_ring *ring);
> +	int (*test_ib)(struct amdgpu_ring *ring, long timeout);
>   	/* insert NOP packets */
>   	void (*insert_nop)(struct amdgpu_ring *ring, uint32_t count);
>   	/* pad the indirect buffer to the necessary number of dw */
> @@ -2261,7 +2261,7 @@ amdgpu_get_sdma_instance(struct amdgpu_ring *ring)
>   #define amdgpu_vm_set_pte_pde(adev, ib, pe, addr, count, incr, flags) ((adev)->vm_manager.vm_pte_funcs->set_pte_pde((ib), (pe), (addr), (count), (incr), (flags)))
>   #define amdgpu_ring_parse_cs(r, p, ib) ((r)->funcs->parse_cs((p), (ib)))
>   #define amdgpu_ring_test_ring(r) (r)->funcs->test_ring((r))
> -#define amdgpu_ring_test_ib(r) (r)->funcs->test_ib((r))
> +#define amdgpu_ring_test_ib(r, t) (r)->funcs->test_ib((r), (t))
>   #define amdgpu_ring_get_rptr(r) (r)->funcs->get_rptr((r))
>   #define amdgpu_ring_get_wptr(r) (r)->funcs->get_wptr((r))
>   #define amdgpu_ring_set_wptr(r) (r)->funcs->set_wptr((r))
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
> index 428ebf3..050062e 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
> @@ -33,6 +33,8 @@
>   #include "amdgpu.h"
>   #include "atom.h"
>   
> +#define AMDGPU_IB_TEST_TIMEOUT	msecs_to_jiffies(10)
> +
>   /*
>    * IB
>    * IBs (Indirect Buffers) and areas of GPU accessible memory where
> @@ -286,7 +288,7 @@ int amdgpu_ib_ring_tests(struct amdgpu_device *adev)
>   		if (!ring || !ring->ready)
>   			continue;
>   
> -		r = amdgpu_ring_test_ib(ring);
> +		r = amdgpu_ring_test_ib(ring, AMDGPU_IB_TEST_TIMEOUT);
>   		if (r) {
>   			ring->ready = false;
>   
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
> index d8b461a..aa80b72 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
> @@ -1139,29 +1139,34 @@ void amdgpu_uvd_ring_end_use(struct amdgpu_ring *ring)
>    *
>    * Test if we can successfully execute an IB
>    */
> -int amdgpu_uvd_ring_test_ib(struct amdgpu_ring *ring)
> +int amdgpu_uvd_ring_test_ib(struct amdgpu_ring *ring, long timeout)
>   {
> -	struct fence *fence = NULL;
> -	int r;
> +	struct fence *fence;
> +	long r;
>   
>   	r = amdgpu_uvd_get_create_msg(ring, 1, NULL);
>   	if (r) {
> -		DRM_ERROR("amdgpu: failed to get create msg (%d).\n", r);
> +		DRM_ERROR("amdgpu: failed to get create msg (%ld).\n", r);
>   		goto error;
>   	}
>   
>   	r = amdgpu_uvd_get_destroy_msg(ring, 1, true, &fence);
>   	if (r) {
> -		DRM_ERROR("amdgpu: failed to get destroy ib (%d).\n", r);
> +		DRM_ERROR("amdgpu: failed to get destroy ib (%ld).\n", r);
>   		goto error;
>   	}
>   
> -	r = fence_wait(fence, false);
> -	if (r) {
> -		DRM_ERROR("amdgpu: fence wait failed (%d).\n", r);
> -		goto error;
> +	r = fence_wait_timeout(fence, false, timeout);
> +	if (r == 0) {
> +		DRM_ERROR("amdgpu: IB test timed out.\n");
> +		r = -ETIMEDOUT;
> +	} else if (r < 0) {
> +		DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
> +	} else {
> +		DRM_INFO("ib test on ring %d succeeded\n",  ring->idx);
> +		r = 0;
>   	}
> -	DRM_INFO("ib test on ring %d succeeded\n",  ring->idx);
> +
>   error:
>   	fence_put(fence);
>   	return r;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h
> index 224359e..c850009 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h
> @@ -37,6 +37,6 @@ void amdgpu_uvd_free_handles(struct amdgpu_device *adev,
>   int amdgpu_uvd_ring_parse_cs(struct amdgpu_cs_parser *parser, uint32_t ib_idx);
>   void amdgpu_uvd_ring_begin_use(struct amdgpu_ring *ring);
>   void amdgpu_uvd_ring_end_use(struct amdgpu_ring *ring);
> -int amdgpu_uvd_ring_test_ib(struct amdgpu_ring *ring);
> +int amdgpu_uvd_ring_test_ib(struct amdgpu_ring *ring, long timeout);
>   
>   #endif
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
> index 6b49d40..0afa73c 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
> @@ -844,10 +844,10 @@ int amdgpu_vce_ring_test_ring(struct amdgpu_ring *ring)
>    * @ring: the engine to test on
>    *
>    */
> -int amdgpu_vce_ring_test_ib(struct amdgpu_ring *ring)
> +int amdgpu_vce_ring_test_ib(struct amdgpu_ring *ring, long timeout)
>   {
>   	struct fence *fence = NULL;
> -	int r;
> +	long r;
>   
>   	/* skip vce ring1 ib test for now, since it's not reliable */
>   	if (ring == &ring->adev->vce.ring[1])
> @@ -855,21 +855,25 @@ int amdgpu_vce_ring_test_ib(struct amdgpu_ring *ring)
>   
>   	r = amdgpu_vce_get_create_msg(ring, 1, NULL);
>   	if (r) {
> -		DRM_ERROR("amdgpu: failed to get create msg (%d).\n", r);
> +		DRM_ERROR("amdgpu: failed to get create msg (%ld).\n", r);
>   		goto error;
>   	}
>   
>   	r = amdgpu_vce_get_destroy_msg(ring, 1, true, &fence);
>   	if (r) {
> -		DRM_ERROR("amdgpu: failed to get destroy ib (%d).\n", r);
> +		DRM_ERROR("amdgpu: failed to get destroy ib (%ld).\n", r);
>   		goto error;
>   	}
>   
> -	r = fence_wait(fence, false);
> -	if (r) {
> -		DRM_ERROR("amdgpu: fence wait failed (%d).\n", r);
> +	r = fence_wait_timeout(fence, false, timeout);
> +	if (r == 0) {
> +		DRM_ERROR("amdgpu: IB test timed out.\n");
> +		r = -ETIMEDOUT;
> +	} else if (r < 0) {
> +		DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
>   	} else {
>   		DRM_INFO("ib test on ring %d succeeded\n", ring->idx);
> +		r = 0;
>   	}
>   error:
>   	fence_put(fence);
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
> index fe84b80..63f83d0 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
> @@ -39,7 +39,7 @@ void amdgpu_vce_ring_emit_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib,
>   void amdgpu_vce_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 seq,
>   				unsigned flags);
>   int amdgpu_vce_ring_test_ring(struct amdgpu_ring *ring);
> -int amdgpu_vce_ring_test_ib(struct amdgpu_ring *ring);
> +int amdgpu_vce_ring_test_ib(struct amdgpu_ring *ring, long timeout);
>   void amdgpu_vce_ring_begin_use(struct amdgpu_ring *ring);
>   void amdgpu_vce_ring_end_use(struct amdgpu_ring *ring);
>   
> diff --git a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
> index 6507a7e..7f95a8b 100644
> --- a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
> +++ b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
> @@ -617,19 +617,19 @@ static int cik_sdma_ring_test_ring(struct amdgpu_ring *ring)
>    * Test a simple IB in the DMA ring (CIK).
>    * Returns 0 on success, error on failure.
>    */
> -static int cik_sdma_ring_test_ib(struct amdgpu_ring *ring)
> +static int cik_sdma_ring_test_ib(struct amdgpu_ring *ring, long timeout)
>   {
>   	struct amdgpu_device *adev = ring->adev;
>   	struct amdgpu_ib ib;
>   	struct fence *f = NULL;
>   	unsigned index;
> -	int r;
>   	u32 tmp = 0;
>   	u64 gpu_addr;
> +	long r;
>   
>   	r = amdgpu_wb_get(adev, &index);
>   	if (r) {
> -		dev_err(adev->dev, "(%d) failed to allocate wb slot\n", r);
> +		dev_err(adev->dev, "(%ld) failed to allocate wb slot\n", r);
>   		return r;
>   	}
>   
> @@ -639,7 +639,7 @@ static int cik_sdma_ring_test_ib(struct amdgpu_ring *ring)
>   	memset(&ib, 0, sizeof(ib));
>   	r = amdgpu_ib_get(adev, NULL, 256, &ib);
>   	if (r) {
> -		DRM_ERROR("amdgpu: failed to get ib (%d).\n", r);
> +		DRM_ERROR("amdgpu: failed to get ib (%ld).\n", r);
>   		goto err0;
>   	}
>   
> @@ -654,14 +654,19 @@ static int cik_sdma_ring_test_ib(struct amdgpu_ring *ring)
>   	if (r)
>   		goto err1;
>   
> -	r = fence_wait(f, false);
> -	if (r) {
> -		DRM_ERROR("amdgpu: fence wait failed (%d).\n", r);
> +	r = fence_wait_timeout(f, false, timeout);
> +	if (r == 0) {
> +		DRM_ERROR("amdgpu: IB test timed out\n");
> +		r = -ETIMEDOUT;
> +		goto err1;
> +	} else if (r < 0) {
> +		DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
>   		goto err1;
>   	}
>   	tmp = le32_to_cpu(adev->wb.wb[index]);
>   	if (tmp == 0xDEADBEEF) {
>   		DRM_INFO("ib test on ring %d succeeded\n", ring->idx);
> +		r = 0;
>   	} else {
>   		DRM_ERROR("amdgpu: ib test failed (0x%08X)\n", tmp);
>   		r = -EINVAL;
> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
> index 81e5dec..740b4be 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
> @@ -2105,25 +2105,25 @@ static void gfx_v7_0_ring_emit_ib_compute(struct amdgpu_ring *ring,
>    * Provides a basic gfx ring test to verify that IBs are working.
>    * Returns 0 on success, error on failure.
>    */
> -static int gfx_v7_0_ring_test_ib(struct amdgpu_ring *ring)
> +static int gfx_v7_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
>   {
>   	struct amdgpu_device *adev = ring->adev;
>   	struct amdgpu_ib ib;
>   	struct fence *f = NULL;
>   	uint32_t scratch;
>   	uint32_t tmp = 0;
> -	int r;
> +	long r;
>   
>   	r = amdgpu_gfx_scratch_get(adev, &scratch);
>   	if (r) {
> -		DRM_ERROR("amdgpu: failed to get scratch reg (%d).\n", r);
> +		DRM_ERROR("amdgpu: failed to get scratch reg (%ld).\n", r);
>   		return r;
>   	}
>   	WREG32(scratch, 0xCAFEDEAD);
>   	memset(&ib, 0, sizeof(ib));
>   	r = amdgpu_ib_get(adev, NULL, 256, &ib);
>   	if (r) {
> -		DRM_ERROR("amdgpu: failed to get ib (%d).\n", r);
> +		DRM_ERROR("amdgpu: failed to get ib (%ld).\n", r);
>   		goto err1;
>   	}
>   	ib.ptr[0] = PACKET3(PACKET3_SET_UCONFIG_REG, 1);
> @@ -2135,14 +2135,19 @@ static int gfx_v7_0_ring_test_ib(struct amdgpu_ring *ring)
>   	if (r)
>   		goto err2;
>   
> -	r = fence_wait(f, false);
> -	if (r) {
> -		DRM_ERROR("amdgpu: fence wait failed (%d).\n", r);
> +	r = fence_wait_timeout(f, false, timeout);
> +	if (r == 0) {
> +		DRM_ERROR("amdgpu: IB test timed out\n");
> +		r = -ETIMEDOUT;
> +		goto err2;
> +	} else if (r < 0) {
> +		DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
>   		goto err2;
>   	}
>   	tmp = RREG32(scratch);
>   	if (tmp == 0xDEADBEEF) {
>   		DRM_INFO("ib test on ring %d succeeded\n", ring->idx);
> +		r = 0;
>   	} else {
>   		DRM_ERROR("amdgpu: ib test failed (scratch(0x%04X)=0x%08X)\n",
>   			  scratch, tmp);
> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
> index 5882d3a..f58fc84 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
> @@ -784,25 +784,25 @@ static int gfx_v8_0_ring_test_ring(struct amdgpu_ring *ring)
>   	return r;
>   }
>   
> -static int gfx_v8_0_ring_test_ib(struct amdgpu_ring *ring)
> +static int gfx_v8_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
>   {
>   	struct amdgpu_device *adev = ring->adev;
>   	struct amdgpu_ib ib;
>   	struct fence *f = NULL;
>   	uint32_t scratch;
>   	uint32_t tmp = 0;
> -	int r;
> +	long r;
>   
>   	r = amdgpu_gfx_scratch_get(adev, &scratch);
>   	if (r) {
> -		DRM_ERROR("amdgpu: failed to get scratch reg (%d).\n", r);
> +		DRM_ERROR("amdgpu: failed to get scratch reg (%ld).\n", r);
>   		return r;
>   	}
>   	WREG32(scratch, 0xCAFEDEAD);
>   	memset(&ib, 0, sizeof(ib));
>   	r = amdgpu_ib_get(adev, NULL, 256, &ib);
>   	if (r) {
> -		DRM_ERROR("amdgpu: failed to get ib (%d).\n", r);
> +		DRM_ERROR("amdgpu: failed to get ib (%ld).\n", r);
>   		goto err1;
>   	}
>   	ib.ptr[0] = PACKET3(PACKET3_SET_UCONFIG_REG, 1);
> @@ -814,14 +814,19 @@ static int gfx_v8_0_ring_test_ib(struct amdgpu_ring *ring)
>   	if (r)
>   		goto err2;
>   
> -	r = fence_wait(f, false);
> -	if (r) {
> -		DRM_ERROR("amdgpu: fence wait failed (%d).\n", r);
> +	r = fence_wait_timeout(f, false, timeout);
> +	if (r == 0) {
> +		DRM_ERROR("amdgpu: IB test timed out.\n");
> +		r = -ETIMEDOUT;
> +		goto err2;
> +	} else if (r < 0) {
> +		DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
>   		goto err2;
>   	}
>   	tmp = RREG32(scratch);
>   	if (tmp == 0xDEADBEEF) {
>   		DRM_INFO("ib test on ring %d succeeded\n", ring->idx);
> +		r = 0;
>   	} else {
>   		DRM_ERROR("amdgpu: ib test failed (scratch(0x%04X)=0x%08X)\n",
>   			  scratch, tmp);
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
> index 0111d15..c7113ee 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
> @@ -668,19 +668,19 @@ static int sdma_v2_4_ring_test_ring(struct amdgpu_ring *ring)
>    * Test a simple IB in the DMA ring (VI).
>    * Returns 0 on success, error on failure.
>    */
> -static int sdma_v2_4_ring_test_ib(struct amdgpu_ring *ring)
> +static int sdma_v2_4_ring_test_ib(struct amdgpu_ring *ring, long timeout)
>   {
>   	struct amdgpu_device *adev = ring->adev;
>   	struct amdgpu_ib ib;
>   	struct fence *f = NULL;
>   	unsigned index;
> -	int r;
>   	u32 tmp = 0;
>   	u64 gpu_addr;
> +	long r;
>   
>   	r = amdgpu_wb_get(adev, &index);
>   	if (r) {
> -		dev_err(adev->dev, "(%d) failed to allocate wb slot\n", r);
> +		dev_err(adev->dev, "(%ld) failed to allocate wb slot\n", r);
>   		return r;
>   	}
>   
> @@ -690,7 +690,7 @@ static int sdma_v2_4_ring_test_ib(struct amdgpu_ring *ring)
>   	memset(&ib, 0, sizeof(ib));
>   	r = amdgpu_ib_get(adev, NULL, 256, &ib);
>   	if (r) {
> -		DRM_ERROR("amdgpu: failed to get ib (%d).\n", r);
> +		DRM_ERROR("amdgpu: failed to get ib (%ld).\n", r);
>   		goto err0;
>   	}
>   
> @@ -709,14 +709,19 @@ static int sdma_v2_4_ring_test_ib(struct amdgpu_ring *ring)
>   	if (r)
>   		goto err1;
>   
> -	r = fence_wait(f, false);
> -	if (r) {
> -		DRM_ERROR("amdgpu: fence wait failed (%d).\n", r);
> +	r = fence_wait_timeout(f, false, timeout);
> +	if (r == 0) {
> +		DRM_ERROR("amdgpu: IB test timed out\n");
> +		r = -ETIMEDOUT;
> +		goto err1;
> +	} else if (r) {
> +		DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
>   		goto err1;
>   	}
>   	tmp = le32_to_cpu(adev->wb.wb[index]);
>   	if (tmp == 0xDEADBEEF) {
>   		DRM_INFO("ib test on ring %d succeeded\n", ring->idx);
> +		r = 0;
>   	} else {
>   		DRM_ERROR("amdgpu: ib test failed (0x%08X)\n", tmp);
>   		r = -EINVAL;
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
> index e506d3c..df09d85 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
> @@ -896,19 +896,19 @@ static int sdma_v3_0_ring_test_ring(struct amdgpu_ring *ring)
>    * Test a simple IB in the DMA ring (VI).
>    * Returns 0 on success, error on failure.
>    */
> -static int sdma_v3_0_ring_test_ib(struct amdgpu_ring *ring)
> +static int sdma_v3_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
>   {
>   	struct amdgpu_device *adev = ring->adev;
>   	struct amdgpu_ib ib;
>   	struct fence *f = NULL;
>   	unsigned index;
> -	int r;
>   	u32 tmp = 0;
>   	u64 gpu_addr;
> +	long r;
>   
>   	r = amdgpu_wb_get(adev, &index);
>   	if (r) {
> -		dev_err(adev->dev, "(%d) failed to allocate wb slot\n", r);
> +		dev_err(adev->dev, "(%ld) failed to allocate wb slot\n", r);
>   		return r;
>   	}
>   
> @@ -918,7 +918,7 @@ static int sdma_v3_0_ring_test_ib(struct amdgpu_ring *ring)
>   	memset(&ib, 0, sizeof(ib));
>   	r = amdgpu_ib_get(adev, NULL, 256, &ib);
>   	if (r) {
> -		DRM_ERROR("amdgpu: failed to get ib (%d).\n", r);
> +		DRM_ERROR("amdgpu: failed to get ib (%ld).\n", r);
>   		goto err0;
>   	}
>   
> @@ -937,14 +937,19 @@ static int sdma_v3_0_ring_test_ib(struct amdgpu_ring *ring)
>   	if (r)
>   		goto err1;
>   
> -	r = fence_wait(f, false);
> -	if (r) {
> -		DRM_ERROR("amdgpu: fence wait failed (%d).\n", r);
> +	r = fence_wait_timeout(f, false, timeout);
> +	if (r == 0) {
> +		DRM_ERROR("amdgpu: IB test timed out\n");
> +		r = -ETIMEDOUT;
> +		goto err1;
> +	} else if (r < 0) {
> +		DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
>   		goto err1;
>   	}
>   	tmp = le32_to_cpu(adev->wb.wb[index]);
>   	if (tmp == 0xDEADBEEF) {
>   		DRM_INFO("ib test on ring %d succeeded\n", ring->idx);
> +		r = 0;
>   	} else {
>   		DRM_ERROR("amdgpu: ib test failed (0x%08X)\n", tmp);
>   		r = -EINVAL;

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 1/7] drm/amdgpu: fix indentation in struct amdgpu_ring
       [not found] ` <1469095284-2024-1-git-send-email-deathsimple-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org>
                     ` (6 preceding siblings ...)
  2016-07-21 10:22   ` [PATCH 1/7] drm/amdgpu: fix indentation in struct amdgpu_ring zhoucm1
@ 2016-07-21 10:24   ` Edward O'Callaghan
  7 siblings, 0 replies; 12+ messages in thread
From: Edward O'Callaghan @ 2016-07-21 10:24 UTC (permalink / raw)
  To: Christian König, amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW


[-- Attachment #1.1.1: Type: text/plain, Size: 1034 bytes --]

This series is,

Reviewed-by: Edward O'Callaghan <funfunctor-dczkZgxz+BNUPWh3PAxdjQ@public.gmane.org>

A nice revision of the previous solution btw..

On 07/21/2016 08:01 PM, Christian König wrote:
> From: Christian König <christian.koenig-5C7GfCeVMHo@public.gmane.org>
> 
> Signed-off-by: Christian König <christian.koenig-5C7GfCeVMHo@public.gmane.org>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu.h | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> index 459e136..d939038 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> @@ -802,8 +802,8 @@ struct amdgpu_ring {
>  	enum amdgpu_ring_type	type;
>  	char			name[16];
>  	unsigned		cond_exe_offs;
> -	u64				cond_exe_gpu_addr;
> -	volatile u32	*cond_exe_cpu_addr;
> +	u64			cond_exe_gpu_addr;
> +	volatile u32		*cond_exe_cpu_addr;
>  #if defined(CONFIG_DEBUG_FS)
>  	struct dentry *ent;
>  #endif
> 


[-- Attachment #1.2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

[-- Attachment #2: Type: text/plain, Size: 154 bytes --]

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply	[flat|nested] 12+ messages in thread

* RE: [PATCH 7/7] drm/amdgpu: add a fence timeout for the IB tests v2
       [not found]     ` <1469095284-2024-7-git-send-email-deathsimple-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org>
  2016-07-21 10:24       ` zhoucm1
@ 2016-07-27 17:57       ` Deucher, Alexander
  1 sibling, 0 replies; 12+ messages in thread
From: Deucher, Alexander @ 2016-07-27 17:57 UTC (permalink / raw)
  To: 'Christian König', amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW

> -----Original Message-----
> From: amd-gfx [mailto:amd-gfx-bounces@lists.freedesktop.org] On Behalf
> Of Christian König
> Sent: Thursday, July 21, 2016 6:01 AM
> To: amd-gfx@lists.freedesktop.org
> Subject: [PATCH 7/7] drm/amdgpu: add a fence timeout for the IB tests v2
> 
> From: Christian König <christian.koenig@amd.com>
> 
> 10ms should be enough for now.
> 
> v2: fix some typos in CIK code
> 
> Signed-off-by: Christian König <christian.koenig@amd.com>

For the series:
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>

> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu.h     |  4 ++--
>  drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c  |  4 +++-
>  drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c | 25 +++++++++++++++-----
> -----
>  drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h |  2 +-
>  drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c | 18 +++++++++++-------
>  drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h |  2 +-
>  drivers/gpu/drm/amd/amdgpu/cik_sdma.c   | 19 ++++++++++++-------
>  drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c   | 19 ++++++++++++-------
>  drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c   | 19 ++++++++++++-------
>  drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c  | 19 ++++++++++++-------
>  drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c  | 19 ++++++++++++-------
>  11 files changed, 93 insertions(+), 57 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> index f724a87..03c3a8a 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
> @@ -307,7 +307,7 @@ struct amdgpu_ring_funcs {
>  				uint32_t oa_base, uint32_t oa_size);
>  	/* testing functions */
>  	int (*test_ring)(struct amdgpu_ring *ring);
> -	int (*test_ib)(struct amdgpu_ring *ring);
> +	int (*test_ib)(struct amdgpu_ring *ring, long timeout);
>  	/* insert NOP packets */
>  	void (*insert_nop)(struct amdgpu_ring *ring, uint32_t count);
>  	/* pad the indirect buffer to the necessary number of dw */
> @@ -2261,7 +2261,7 @@ amdgpu_get_sdma_instance(struct amdgpu_ring
> *ring)
>  #define amdgpu_vm_set_pte_pde(adev, ib, pe, addr, count, incr, flags)
> ((adev)->vm_manager.vm_pte_funcs->set_pte_pde((ib), (pe), (addr),
> (count), (incr), (flags)))
>  #define amdgpu_ring_parse_cs(r, p, ib) ((r)->funcs->parse_cs((p), (ib)))
>  #define amdgpu_ring_test_ring(r) (r)->funcs->test_ring((r))
> -#define amdgpu_ring_test_ib(r) (r)->funcs->test_ib((r))
> +#define amdgpu_ring_test_ib(r, t) (r)->funcs->test_ib((r), (t))
>  #define amdgpu_ring_get_rptr(r) (r)->funcs->get_rptr((r))
>  #define amdgpu_ring_get_wptr(r) (r)->funcs->get_wptr((r))
>  #define amdgpu_ring_set_wptr(r) (r)->funcs->set_wptr((r))
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
> index 428ebf3..050062e 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
> @@ -33,6 +33,8 @@
>  #include "amdgpu.h"
>  #include "atom.h"
> 
> +#define AMDGPU_IB_TEST_TIMEOUT	msecs_to_jiffies(10)
> +
>  /*
>   * IB
>   * IBs (Indirect Buffers) and areas of GPU accessible memory where
> @@ -286,7 +288,7 @@ int amdgpu_ib_ring_tests(struct amdgpu_device
> *adev)
>  		if (!ring || !ring->ready)
>  			continue;
> 
> -		r = amdgpu_ring_test_ib(ring);
> +		r = amdgpu_ring_test_ib(ring,
> AMDGPU_IB_TEST_TIMEOUT);
>  		if (r) {
>  			ring->ready = false;
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
> index d8b461a..aa80b72 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
> @@ -1139,29 +1139,34 @@ void amdgpu_uvd_ring_end_use(struct
> amdgpu_ring *ring)
>   *
>   * Test if we can successfully execute an IB
>   */
> -int amdgpu_uvd_ring_test_ib(struct amdgpu_ring *ring)
> +int amdgpu_uvd_ring_test_ib(struct amdgpu_ring *ring, long timeout)
>  {
> -	struct fence *fence = NULL;
> -	int r;
> +	struct fence *fence;
> +	long r;
> 
>  	r = amdgpu_uvd_get_create_msg(ring, 1, NULL);
>  	if (r) {
> -		DRM_ERROR("amdgpu: failed to get create msg (%d).\n", r);
> +		DRM_ERROR("amdgpu: failed to get create msg (%ld).\n", r);
>  		goto error;
>  	}
> 
>  	r = amdgpu_uvd_get_destroy_msg(ring, 1, true, &fence);
>  	if (r) {
> -		DRM_ERROR("amdgpu: failed to get destroy ib (%d).\n", r);
> +		DRM_ERROR("amdgpu: failed to get destroy ib (%ld).\n", r);
>  		goto error;
>  	}
> 
> -	r = fence_wait(fence, false);
> -	if (r) {
> -		DRM_ERROR("amdgpu: fence wait failed (%d).\n", r);
> -		goto error;
> +	r = fence_wait_timeout(fence, false, timeout);
> +	if (r == 0) {
> +		DRM_ERROR("amdgpu: IB test timed out.\n");
> +		r = -ETIMEDOUT;
> +	} else if (r < 0) {
> +		DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
> +	} else {
> +		DRM_INFO("ib test on ring %d succeeded\n",  ring->idx);
> +		r = 0;
>  	}
> -	DRM_INFO("ib test on ring %d succeeded\n",  ring->idx);
> +
>  error:
>  	fence_put(fence);
>  	return r;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h
> index 224359e..c850009 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.h
> @@ -37,6 +37,6 @@ void amdgpu_uvd_free_handles(struct amdgpu_device
> *adev,
>  int amdgpu_uvd_ring_parse_cs(struct amdgpu_cs_parser *parser, uint32_t
> ib_idx);
>  void amdgpu_uvd_ring_begin_use(struct amdgpu_ring *ring);
>  void amdgpu_uvd_ring_end_use(struct amdgpu_ring *ring);
> -int amdgpu_uvd_ring_test_ib(struct amdgpu_ring *ring);
> +int amdgpu_uvd_ring_test_ib(struct amdgpu_ring *ring, long timeout);
> 
>  #endif
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
> index 6b49d40..0afa73c 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
> @@ -844,10 +844,10 @@ int amdgpu_vce_ring_test_ring(struct
> amdgpu_ring *ring)
>   * @ring: the engine to test on
>   *
>   */
> -int amdgpu_vce_ring_test_ib(struct amdgpu_ring *ring)
> +int amdgpu_vce_ring_test_ib(struct amdgpu_ring *ring, long timeout)
>  {
>  	struct fence *fence = NULL;
> -	int r;
> +	long r;
> 
>  	/* skip vce ring1 ib test for now, since it's not reliable */
>  	if (ring == &ring->adev->vce.ring[1])
> @@ -855,21 +855,25 @@ int amdgpu_vce_ring_test_ib(struct amdgpu_ring
> *ring)
> 
>  	r = amdgpu_vce_get_create_msg(ring, 1, NULL);
>  	if (r) {
> -		DRM_ERROR("amdgpu: failed to get create msg (%d).\n", r);
> +		DRM_ERROR("amdgpu: failed to get create msg (%ld).\n", r);
>  		goto error;
>  	}
> 
>  	r = amdgpu_vce_get_destroy_msg(ring, 1, true, &fence);
>  	if (r) {
> -		DRM_ERROR("amdgpu: failed to get destroy ib (%d).\n", r);
> +		DRM_ERROR("amdgpu: failed to get destroy ib (%ld).\n", r);
>  		goto error;
>  	}
> 
> -	r = fence_wait(fence, false);
> -	if (r) {
> -		DRM_ERROR("amdgpu: fence wait failed (%d).\n", r);
> +	r = fence_wait_timeout(fence, false, timeout);
> +	if (r == 0) {
> +		DRM_ERROR("amdgpu: IB test timed out.\n");
> +		r = -ETIMEDOUT;
> +	} else if (r < 0) {
> +		DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
>  	} else {
>  		DRM_INFO("ib test on ring %d succeeded\n", ring->idx);
> +		r = 0;
>  	}
>  error:
>  	fence_put(fence);
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
> b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
> index fe84b80..63f83d0 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
> @@ -39,7 +39,7 @@ void amdgpu_vce_ring_emit_ib(struct amdgpu_ring
> *ring, struct amdgpu_ib *ib,
>  void amdgpu_vce_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64
> seq,
>  				unsigned flags);
>  int amdgpu_vce_ring_test_ring(struct amdgpu_ring *ring);
> -int amdgpu_vce_ring_test_ib(struct amdgpu_ring *ring);
> +int amdgpu_vce_ring_test_ib(struct amdgpu_ring *ring, long timeout);
>  void amdgpu_vce_ring_begin_use(struct amdgpu_ring *ring);
>  void amdgpu_vce_ring_end_use(struct amdgpu_ring *ring);
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
> b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
> index 6507a7e..7f95a8b 100644
> --- a/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
> +++ b/drivers/gpu/drm/amd/amdgpu/cik_sdma.c
> @@ -617,19 +617,19 @@ static int cik_sdma_ring_test_ring(struct
> amdgpu_ring *ring)
>   * Test a simple IB in the DMA ring (CIK).
>   * Returns 0 on success, error on failure.
>   */
> -static int cik_sdma_ring_test_ib(struct amdgpu_ring *ring)
> +static int cik_sdma_ring_test_ib(struct amdgpu_ring *ring, long timeout)
>  {
>  	struct amdgpu_device *adev = ring->adev;
>  	struct amdgpu_ib ib;
>  	struct fence *f = NULL;
>  	unsigned index;
> -	int r;
>  	u32 tmp = 0;
>  	u64 gpu_addr;
> +	long r;
> 
>  	r = amdgpu_wb_get(adev, &index);
>  	if (r) {
> -		dev_err(adev->dev, "(%d) failed to allocate wb slot\n", r);
> +		dev_err(adev->dev, "(%ld) failed to allocate wb slot\n", r);
>  		return r;
>  	}
> 
> @@ -639,7 +639,7 @@ static int cik_sdma_ring_test_ib(struct amdgpu_ring
> *ring)
>  	memset(&ib, 0, sizeof(ib));
>  	r = amdgpu_ib_get(adev, NULL, 256, &ib);
>  	if (r) {
> -		DRM_ERROR("amdgpu: failed to get ib (%d).\n", r);
> +		DRM_ERROR("amdgpu: failed to get ib (%ld).\n", r);
>  		goto err0;
>  	}
> 
> @@ -654,14 +654,19 @@ static int cik_sdma_ring_test_ib(struct
> amdgpu_ring *ring)
>  	if (r)
>  		goto err1;
> 
> -	r = fence_wait(f, false);
> -	if (r) {
> -		DRM_ERROR("amdgpu: fence wait failed (%d).\n", r);
> +	r = fence_wait_timeout(f, false, timeout);
> +	if (r == 0) {
> +		DRM_ERROR("amdgpu: IB test timed out\n");
> +		r = -ETIMEDOUT;
> +		goto err1;
> +	} else if (r < 0) {
> +		DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
>  		goto err1;
>  	}
>  	tmp = le32_to_cpu(adev->wb.wb[index]);
>  	if (tmp == 0xDEADBEEF) {
>  		DRM_INFO("ib test on ring %d succeeded\n", ring->idx);
> +		r = 0;
>  	} else {
>  		DRM_ERROR("amdgpu: ib test failed (0x%08X)\n", tmp);
>  		r = -EINVAL;
> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
> b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
> index 81e5dec..740b4be 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
> @@ -2105,25 +2105,25 @@ static void
> gfx_v7_0_ring_emit_ib_compute(struct amdgpu_ring *ring,
>   * Provides a basic gfx ring test to verify that IBs are working.
>   * Returns 0 on success, error on failure.
>   */
> -static int gfx_v7_0_ring_test_ib(struct amdgpu_ring *ring)
> +static int gfx_v7_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
>  {
>  	struct amdgpu_device *adev = ring->adev;
>  	struct amdgpu_ib ib;
>  	struct fence *f = NULL;
>  	uint32_t scratch;
>  	uint32_t tmp = 0;
> -	int r;
> +	long r;
> 
>  	r = amdgpu_gfx_scratch_get(adev, &scratch);
>  	if (r) {
> -		DRM_ERROR("amdgpu: failed to get scratch reg (%d).\n", r);
> +		DRM_ERROR("amdgpu: failed to get scratch reg (%ld).\n", r);
>  		return r;
>  	}
>  	WREG32(scratch, 0xCAFEDEAD);
>  	memset(&ib, 0, sizeof(ib));
>  	r = amdgpu_ib_get(adev, NULL, 256, &ib);
>  	if (r) {
> -		DRM_ERROR("amdgpu: failed to get ib (%d).\n", r);
> +		DRM_ERROR("amdgpu: failed to get ib (%ld).\n", r);
>  		goto err1;
>  	}
>  	ib.ptr[0] = PACKET3(PACKET3_SET_UCONFIG_REG, 1);
> @@ -2135,14 +2135,19 @@ static int gfx_v7_0_ring_test_ib(struct
> amdgpu_ring *ring)
>  	if (r)
>  		goto err2;
> 
> -	r = fence_wait(f, false);
> -	if (r) {
> -		DRM_ERROR("amdgpu: fence wait failed (%d).\n", r);
> +	r = fence_wait_timeout(f, false, timeout);
> +	if (r == 0) {
> +		DRM_ERROR("amdgpu: IB test timed out\n");
> +		r = -ETIMEDOUT;
> +		goto err2;
> +	} else if (r < 0) {
> +		DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
>  		goto err2;
>  	}
>  	tmp = RREG32(scratch);
>  	if (tmp == 0xDEADBEEF) {
>  		DRM_INFO("ib test on ring %d succeeded\n", ring->idx);
> +		r = 0;
>  	} else {
>  		DRM_ERROR("amdgpu: ib test failed
> (scratch(0x%04X)=0x%08X)\n",
>  			  scratch, tmp);
> diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
> b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
> index 5882d3a..f58fc84 100644
> --- a/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
> @@ -784,25 +784,25 @@ static int gfx_v8_0_ring_test_ring(struct
> amdgpu_ring *ring)
>  	return r;
>  }
> 
> -static int gfx_v8_0_ring_test_ib(struct amdgpu_ring *ring)
> +static int gfx_v8_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
>  {
>  	struct amdgpu_device *adev = ring->adev;
>  	struct amdgpu_ib ib;
>  	struct fence *f = NULL;
>  	uint32_t scratch;
>  	uint32_t tmp = 0;
> -	int r;
> +	long r;
> 
>  	r = amdgpu_gfx_scratch_get(adev, &scratch);
>  	if (r) {
> -		DRM_ERROR("amdgpu: failed to get scratch reg (%d).\n", r);
> +		DRM_ERROR("amdgpu: failed to get scratch reg (%ld).\n", r);
>  		return r;
>  	}
>  	WREG32(scratch, 0xCAFEDEAD);
>  	memset(&ib, 0, sizeof(ib));
>  	r = amdgpu_ib_get(adev, NULL, 256, &ib);
>  	if (r) {
> -		DRM_ERROR("amdgpu: failed to get ib (%d).\n", r);
> +		DRM_ERROR("amdgpu: failed to get ib (%ld).\n", r);
>  		goto err1;
>  	}
>  	ib.ptr[0] = PACKET3(PACKET3_SET_UCONFIG_REG, 1);
> @@ -814,14 +814,19 @@ static int gfx_v8_0_ring_test_ib(struct
> amdgpu_ring *ring)
>  	if (r)
>  		goto err2;
> 
> -	r = fence_wait(f, false);
> -	if (r) {
> -		DRM_ERROR("amdgpu: fence wait failed (%d).\n", r);
> +	r = fence_wait_timeout(f, false, timeout);
> +	if (r == 0) {
> +		DRM_ERROR("amdgpu: IB test timed out.\n");
> +		r = -ETIMEDOUT;
> +		goto err2;
> +	} else if (r < 0) {
> +		DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
>  		goto err2;
>  	}
>  	tmp = RREG32(scratch);
>  	if (tmp == 0xDEADBEEF) {
>  		DRM_INFO("ib test on ring %d succeeded\n", ring->idx);
> +		r = 0;
>  	} else {
>  		DRM_ERROR("amdgpu: ib test failed
> (scratch(0x%04X)=0x%08X)\n",
>  			  scratch, tmp);
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
> b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
> index 0111d15..c7113ee 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
> @@ -668,19 +668,19 @@ static int sdma_v2_4_ring_test_ring(struct
> amdgpu_ring *ring)
>   * Test a simple IB in the DMA ring (VI).
>   * Returns 0 on success, error on failure.
>   */
> -static int sdma_v2_4_ring_test_ib(struct amdgpu_ring *ring)
> +static int sdma_v2_4_ring_test_ib(struct amdgpu_ring *ring, long timeout)
>  {
>  	struct amdgpu_device *adev = ring->adev;
>  	struct amdgpu_ib ib;
>  	struct fence *f = NULL;
>  	unsigned index;
> -	int r;
>  	u32 tmp = 0;
>  	u64 gpu_addr;
> +	long r;
> 
>  	r = amdgpu_wb_get(adev, &index);
>  	if (r) {
> -		dev_err(adev->dev, "(%d) failed to allocate wb slot\n", r);
> +		dev_err(adev->dev, "(%ld) failed to allocate wb slot\n", r);
>  		return r;
>  	}
> 
> @@ -690,7 +690,7 @@ static int sdma_v2_4_ring_test_ib(struct
> amdgpu_ring *ring)
>  	memset(&ib, 0, sizeof(ib));
>  	r = amdgpu_ib_get(adev, NULL, 256, &ib);
>  	if (r) {
> -		DRM_ERROR("amdgpu: failed to get ib (%d).\n", r);
> +		DRM_ERROR("amdgpu: failed to get ib (%ld).\n", r);
>  		goto err0;
>  	}
> 
> @@ -709,14 +709,19 @@ static int sdma_v2_4_ring_test_ib(struct
> amdgpu_ring *ring)
>  	if (r)
>  		goto err1;
> 
> -	r = fence_wait(f, false);
> -	if (r) {
> -		DRM_ERROR("amdgpu: fence wait failed (%d).\n", r);
> +	r = fence_wait_timeout(f, false, timeout);
> +	if (r == 0) {
> +		DRM_ERROR("amdgpu: IB test timed out\n");
> +		r = -ETIMEDOUT;
> +		goto err1;
> +	} else if (r) {
> +		DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
>  		goto err1;
>  	}
>  	tmp = le32_to_cpu(adev->wb.wb[index]);
>  	if (tmp == 0xDEADBEEF) {
>  		DRM_INFO("ib test on ring %d succeeded\n", ring->idx);
> +		r = 0;
>  	} else {
>  		DRM_ERROR("amdgpu: ib test failed (0x%08X)\n", tmp);
>  		r = -EINVAL;
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
> b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
> index e506d3c..df09d85 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
> @@ -896,19 +896,19 @@ static int sdma_v3_0_ring_test_ring(struct
> amdgpu_ring *ring)
>   * Test a simple IB in the DMA ring (VI).
>   * Returns 0 on success, error on failure.
>   */
> -static int sdma_v3_0_ring_test_ib(struct amdgpu_ring *ring)
> +static int sdma_v3_0_ring_test_ib(struct amdgpu_ring *ring, long timeout)
>  {
>  	struct amdgpu_device *adev = ring->adev;
>  	struct amdgpu_ib ib;
>  	struct fence *f = NULL;
>  	unsigned index;
> -	int r;
>  	u32 tmp = 0;
>  	u64 gpu_addr;
> +	long r;
> 
>  	r = amdgpu_wb_get(adev, &index);
>  	if (r) {
> -		dev_err(adev->dev, "(%d) failed to allocate wb slot\n", r);
> +		dev_err(adev->dev, "(%ld) failed to allocate wb slot\n", r);
>  		return r;
>  	}
> 
> @@ -918,7 +918,7 @@ static int sdma_v3_0_ring_test_ib(struct
> amdgpu_ring *ring)
>  	memset(&ib, 0, sizeof(ib));
>  	r = amdgpu_ib_get(adev, NULL, 256, &ib);
>  	if (r) {
> -		DRM_ERROR("amdgpu: failed to get ib (%d).\n", r);
> +		DRM_ERROR("amdgpu: failed to get ib (%ld).\n", r);
>  		goto err0;
>  	}
> 
> @@ -937,14 +937,19 @@ static int sdma_v3_0_ring_test_ib(struct
> amdgpu_ring *ring)
>  	if (r)
>  		goto err1;
> 
> -	r = fence_wait(f, false);
> -	if (r) {
> -		DRM_ERROR("amdgpu: fence wait failed (%d).\n", r);
> +	r = fence_wait_timeout(f, false, timeout);
> +	if (r == 0) {
> +		DRM_ERROR("amdgpu: IB test timed out\n");
> +		r = -ETIMEDOUT;
> +		goto err1;
> +	} else if (r < 0) {
> +		DRM_ERROR("amdgpu: fence wait failed (%ld).\n", r);
>  		goto err1;
>  	}
>  	tmp = le32_to_cpu(adev->wb.wb[index]);
>  	if (tmp == 0xDEADBEEF) {
>  		DRM_INFO("ib test on ring %d succeeded\n", ring->idx);
> +		r = 0;
>  	} else {
>  		DRM_ERROR("amdgpu: ib test failed (0x%08X)\n", tmp);
>  		r = -EINVAL;
> --
> 2.5.0
> 
> _______________________________________________
> amd-gfx mailing list
> amd-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2016-07-27 17:57 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-07-21 10:01 [PATCH 1/7] drm/amdgpu: fix indentation in struct amdgpu_ring Christian König
     [not found] ` <1469095284-2024-1-git-send-email-deathsimple-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org>
2016-07-21 10:01   ` [PATCH 2/7] drm/amdgpu: remove fence_lock Christian König
     [not found]     ` <1469095284-2024-2-git-send-email-deathsimple-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org>
2016-07-21 10:23       ` zhoucm1
2016-07-21 10:01   ` [PATCH 3/7] drm/amdgpu: add begin/end_use ring callbacks Christian König
2016-07-21 10:01   ` [PATCH 4/7] drm/amdgpu: use begin/end_use for UVD power/clock gating Christian König
2016-07-21 10:01   ` [PATCH 5/7] drm/amdgpu: use begin/end_use for VCE " Christian König
2016-07-21 10:01   ` [PATCH 6/7] drm/amdgpu: move UVD IB test into common code v2 Christian König
2016-07-21 10:01   ` [PATCH 7/7] drm/amdgpu: add a fence timeout for the IB tests v2 Christian König
     [not found]     ` <1469095284-2024-7-git-send-email-deathsimple-ANTagKRnAhcb1SvskN2V4Q@public.gmane.org>
2016-07-21 10:24       ` zhoucm1
2016-07-27 17:57       ` Deucher, Alexander
2016-07-21 10:22   ` [PATCH 1/7] drm/amdgpu: fix indentation in struct amdgpu_ring zhoucm1
2016-07-21 10:24   ` Edward O'Callaghan

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.