1919 */
2020
2121#include <linux/kthread.h>
22+ #include <linux/moduleparam.h>
2223
2324#include "v3d_drv.h"
2425#include "v3d_regs.h"
2526#include "v3d_trace.h"
2627
28+ uint v3d_hang_limit = 5000 ;
29+ MODULE_PARM_DESC (hang_limit ,
30+ "Timeout for a job in ms (0 means infinity and default is 5000 ms)" );
31+ module_param_named (hang_limit , v3d_hang_limit , uint , 0664 );
32+
2733static struct v3d_job *
2834to_v3d_job (struct drm_sched_job * sched_job )
2935{
@@ -346,13 +352,13 @@ v3d_sched_init(struct v3d_dev *v3d)
346352{
347353 int hw_jobs_limit = 1 ;
348354 int job_hang_limit = 0 ;
349- int hang_limit_ms = 500 ;
355+ uint hang_limit = v3d_hang_limit ?
356+ msecs_to_jiffies (v3d_hang_limit ) : MAX_SCHEDULE_TIMEOUT ;
350357 int ret ;
351358
352359 ret = drm_sched_init (& v3d -> queue [V3D_BIN ].sched ,
353360 & v3d_bin_sched_ops ,
354- hw_jobs_limit , job_hang_limit ,
355- msecs_to_jiffies (hang_limit_ms ),
361+ hw_jobs_limit , job_hang_limit , hang_limit ,
356362 "v3d_bin" );
357363 if (ret ) {
358364 dev_err (v3d -> dev , "Failed to create bin scheduler: %d." , ret );
@@ -361,8 +367,7 @@ v3d_sched_init(struct v3d_dev *v3d)
361367
362368 ret = drm_sched_init (& v3d -> queue [V3D_RENDER ].sched ,
363369 & v3d_render_sched_ops ,
364- hw_jobs_limit , job_hang_limit ,
365- msecs_to_jiffies (hang_limit_ms ),
370+ hw_jobs_limit , job_hang_limit , hang_limit ,
366371 "v3d_render" );
367372 if (ret ) {
368373 dev_err (v3d -> dev , "Failed to create render scheduler: %d." ,
@@ -373,8 +378,7 @@ v3d_sched_init(struct v3d_dev *v3d)
373378
374379 ret = drm_sched_init (& v3d -> queue [V3D_TFU ].sched ,
375380 & v3d_tfu_sched_ops ,
376- hw_jobs_limit , job_hang_limit ,
377- msecs_to_jiffies (hang_limit_ms ),
381+ hw_jobs_limit , job_hang_limit , hang_limit ,
378382 "v3d_tfu" );
379383 if (ret ) {
380384 dev_err (v3d -> dev , "Failed to create TFU scheduler: %d." ,
@@ -386,8 +390,7 @@ v3d_sched_init(struct v3d_dev *v3d)
386390 if (v3d_has_csd (v3d )) {
387391 ret = drm_sched_init (& v3d -> queue [V3D_CSD ].sched ,
388392 & v3d_csd_sched_ops ,
389- hw_jobs_limit , job_hang_limit ,
390- msecs_to_jiffies (hang_limit_ms ),
393+ hw_jobs_limit , job_hang_limit , hang_limit ,
391394 "v3d_csd" );
392395 if (ret ) {
393396 dev_err (v3d -> dev , "Failed to create CSD scheduler: %d." ,
@@ -398,8 +401,7 @@ v3d_sched_init(struct v3d_dev *v3d)
398401
399402 ret = drm_sched_init (& v3d -> queue [V3D_CACHE_CLEAN ].sched ,
400403 & v3d_cache_clean_sched_ops ,
401- hw_jobs_limit , job_hang_limit ,
402- msecs_to_jiffies (hang_limit_ms ),
404+ hw_jobs_limit , job_hang_limit , hang_limit ,
403405 "v3d_cache_clean" );
404406 if (ret ) {
405407 dev_err (v3d -> dev , "Failed to create CACHE_CLEAN scheduler: %d." ,
0 commit comments