Am 11.05.2017 um 07:42 schrieb Huang Rui: > As Christian and David's suggestion, submit the test ib ring debug interfaces. > It's useful for debugging with the command submission without VM case. > > Signed-off-by: Huang Rui <ray.huang at amd.com> Reviewed-by: Christian König <christian.koenig at amd.com> for this one. > --- > > V1 -> V2: > - park the scheduler thread for each ring to avoid conflict with commands from > active apps. > > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 54 ++++++++++++++++++++++++++++++ > 1 file changed, 54 insertions(+) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c > index b93356b..19ac196 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c > @@ -59,6 +59,7 @@ > > static int amdgpu_debugfs_regs_init(struct amdgpu_device *adev); > static void amdgpu_debugfs_regs_cleanup(struct amdgpu_device *adev); > +static int amdgpu_debugfs_test_ib_ring_init(struct amdgpu_device *adev); > > static const char *amdgpu_asic_name[] = { > "TAHITI", > @@ -2083,6 +2084,10 @@ int amdgpu_device_init(struct amdgpu_device *adev, > if (r) > DRM_ERROR("registering register debugfs failed (%d).\n", r); > > + r = amdgpu_debugfs_test_ib_ring_init(adev); > + if (r) > + DRM_ERROR("registering register test ib ring debugfs failed (%d).\n", r); > + > r = amdgpu_debugfs_firmware_init(adev); > if (r) > DRM_ERROR("registering firmware debugfs failed (%d).\n", r); > @@ -3603,6 +3608,51 @@ static void amdgpu_debugfs_regs_cleanup(struct amdgpu_device *adev) > } > } > > +static int amdgpu_debugfs_test_ib(struct seq_file *m, void *data) > +{ > + struct drm_info_node *node = (struct drm_info_node *) m->private; > + struct drm_device *dev = node->minor->dev; > + struct amdgpu_device *adev = dev->dev_private; > + int r = 0, i; > + > + /* hold on the scheduler */ > + for (i = 0; i < AMDGPU_MAX_RINGS; i++) { > + struct amdgpu_ring *ring = adev->rings[i]; > + > + if (!ring || !ring->sched.thread) > + continue; > + kthread_park(ring->sched.thread); > + } > + > + seq_printf(m, "run ib test:\n"); > + r = amdgpu_ib_ring_tests(adev); > + if (r) > + seq_printf(m, "ib ring tests failed (%d).\n", r); > + else > + seq_printf(m, "ib ring tests passed.\n"); > + > + /* go on the scheduler */ > + for (i = 0; i < AMDGPU_MAX_RINGS; i++) { > + struct amdgpu_ring *ring = adev->rings[i]; > + > + if (!ring || !ring->sched.thread) > + continue; > + kthread_unpark(ring->sched.thread); > + } > + > + return 0; > +} > + > +static const struct drm_info_list amdgpu_debugfs_test_ib_ring_list[] = { > + {"amdgpu_test_ib", &amdgpu_debugfs_test_ib} > +}; > + > +static int amdgpu_debugfs_test_ib_ring_init(struct amdgpu_device *adev) > +{ > + return amdgpu_debugfs_add_files(adev, > + amdgpu_debugfs_test_ib_ring_list, 1); > +} > + > int amdgpu_debugfs_init(struct drm_minor *minor) > { > return 0; > @@ -3612,6 +3662,10 @@ void amdgpu_debugfs_cleanup(struct drm_minor *minor) > { > } > #else > +static int amdgpu_debugfs_test_ib_init(struct amdgpu_device *adev) > +{ > + return 0; > +} > static int amdgpu_debugfs_regs_init(struct amdgpu_device *adev) > { > return 0;