* [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.