tree: https://git.kernel.org/pub/scm/linux/kernel/git/daeinki/drm-exynos.git exynos-drm-misc-next head: 01ac6e4e53b6351df42c97d217b0d2dbeef5c917 commit: 0810d5ad88a18f1e6d549853a388ad0316f74e36 [1286/1301] accel/rocket: Add job submission IOCTL config: m68k-allmodconfig (https://download.01.org/0day-ci/archive/20250730/202507300607.o0gdzwrj-...@intel.com/config) compiler: m68k-linux-gcc (GCC) 15.1.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250730/202507300607.o0gdzwrj-...@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <l...@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202507300607.o0gdzwrj-...@intel.com/ All errors (new ones prefixed by >>): drivers/accel/rocket/rocket_job.c: In function 'rocket_job_timedout': >> drivers/accel/rocket/rocket_job.c:393:16: error: >> 'DRM_GPU_SCHED_STAT_NOMINAL' undeclared (first use in this function); did >> you mean 'DRM_GPU_SCHED_STAT_NO_HANG'? 393 | return DRM_GPU_SCHED_STAT_NOMINAL; | ^~~~~~~~~~~~~~~~~~~~~~~~~~ | DRM_GPU_SCHED_STAT_NO_HANG drivers/accel/rocket/rocket_job.c:393:16: note: each undeclared identifier is reported only once for each function it appears in drivers/accel/rocket/rocket_job.c: In function 'rocket_ioctl_submit_job': >> drivers/accel/rocket/rocket_job.c:553:15: error: too few arguments to >> function 'drm_sched_job_init'; expected 5, have 4 553 | ret = drm_sched_job_init(&rjob->base, | ^~~~~~~~~~~~~~~~~~ In file included from drivers/accel/rocket/rocket_core.h:7, from drivers/accel/rocket/rocket_job.c:15: include/drm/gpu_scheduler.h:655:5: note: declared here 655 | int drm_sched_job_init(struct drm_sched_job *job, | ^~~~~~~~~~~~~~~~~~ vim +393 drivers/accel/rocket/rocket_job.c 381 382 static enum drm_gpu_sched_stat rocket_job_timedout(struct drm_sched_job *sched_job) 383 { 384 struct rocket_job *job = to_rocket_job(sched_job); 385 struct rocket_device *rdev = job->rdev; 386 struct rocket_core *core = sched_to_core(rdev, sched_job->sched); 387 388 dev_err(core->dev, "NPU job timed out"); 389 390 atomic_set(&core->reset.pending, 1); 391 rocket_reset(core, sched_job); 392 > 393 return DRM_GPU_SCHED_STAT_NOMINAL; 394 } 395 396 static void rocket_reset_work(struct work_struct *work) 397 { 398 struct rocket_core *core; 399 400 core = container_of(work, struct rocket_core, reset.work); 401 rocket_reset(core, NULL); 402 } 403 404 static const struct drm_sched_backend_ops rocket_sched_ops = { 405 .run_job = rocket_job_run, 406 .timedout_job = rocket_job_timedout, 407 .free_job = rocket_job_free 408 }; 409 410 static irqreturn_t rocket_job_irq_handler_thread(int irq, void *data) 411 { 412 struct rocket_core *core = data; 413 414 rocket_job_handle_irq(core); 415 416 return IRQ_HANDLED; 417 } 418 419 static irqreturn_t rocket_job_irq_handler(int irq, void *data) 420 { 421 struct rocket_core *core = data; 422 u32 raw_status = rocket_pc_readl(core, INTERRUPT_RAW_STATUS); 423 424 WARN_ON(raw_status & PC_INTERRUPT_RAW_STATUS_DMA_READ_ERROR); 425 WARN_ON(raw_status & PC_INTERRUPT_RAW_STATUS_DMA_READ_ERROR); 426 427 if (!(raw_status & PC_INTERRUPT_RAW_STATUS_DPU_0 || 428 raw_status & PC_INTERRUPT_RAW_STATUS_DPU_1)) 429 return IRQ_NONE; 430 431 rocket_pc_writel(core, INTERRUPT_MASK, 0x0); 432 433 return IRQ_WAKE_THREAD; 434 } 435 436 int rocket_job_init(struct rocket_core *core) 437 { 438 struct drm_sched_init_args args = { 439 .ops = &rocket_sched_ops, 440 .num_rqs = DRM_SCHED_PRIORITY_COUNT, 441 .credit_limit = 1, 442 .timeout = msecs_to_jiffies(JOB_TIMEOUT_MS), 443 .name = dev_name(core->dev), 444 .dev = core->dev, 445 }; 446 int ret; 447 448 INIT_WORK(&core->reset.work, rocket_reset_work); 449 spin_lock_init(&core->fence_lock); 450 mutex_init(&core->job_lock); 451 452 core->irq = platform_get_irq(to_platform_device(core->dev), 0); 453 if (core->irq < 0) 454 return core->irq; 455 456 ret = devm_request_threaded_irq(core->dev, core->irq, 457 rocket_job_irq_handler, 458 rocket_job_irq_handler_thread, 459 IRQF_SHARED, dev_name(core->dev), 460 core); 461 if (ret) { 462 dev_err(core->dev, "failed to request job irq"); 463 return ret; 464 } 465 466 core->reset.wq = alloc_ordered_workqueue("rocket-reset-%d", 0, core->index); 467 if (!core->reset.wq) 468 return -ENOMEM; 469 470 core->fence_context = dma_fence_context_alloc(1); 471 472 args.timeout_wq = core->reset.wq; 473 ret = drm_sched_init(&core->sched, &args); 474 if (ret) { 475 dev_err(core->dev, "Failed to create scheduler: %d.", ret); 476 goto err_sched; 477 } 478 479 return 0; 480 481 err_sched: 482 drm_sched_fini(&core->sched); 483 484 destroy_workqueue(core->reset.wq); 485 return ret; 486 } 487 488 void rocket_job_fini(struct rocket_core *core) 489 { 490 drm_sched_fini(&core->sched); 491 492 cancel_work_sync(&core->reset.work); 493 destroy_workqueue(core->reset.wq); 494 } 495 496 int rocket_job_open(struct rocket_file_priv *rocket_priv) 497 { 498 struct rocket_device *rdev = rocket_priv->rdev; 499 struct drm_gpu_scheduler **scheds = kmalloc_array(rdev->num_cores, sizeof(scheds), 500 GFP_KERNEL); 501 unsigned int core; 502 int ret; 503 504 for (core = 0; core < rdev->num_cores; core++) 505 scheds[core] = &rdev->cores[core].sched; 506 507 ret = drm_sched_entity_init(&rocket_priv->sched_entity, 508 DRM_SCHED_PRIORITY_NORMAL, 509 scheds, 510 rdev->num_cores, NULL); 511 if (WARN_ON(ret)) 512 return ret; 513 514 return 0; 515 } 516 517 void rocket_job_close(struct rocket_file_priv *rocket_priv) 518 { 519 struct drm_sched_entity *entity = &rocket_priv->sched_entity; 520 521 kfree(entity->sched_list); 522 drm_sched_entity_destroy(entity); 523 } 524 525 int rocket_job_is_idle(struct rocket_core *core) 526 { 527 /* If there are any jobs in this HW queue, we're not idle */ 528 if (atomic_read(&core->sched.credit_count)) 529 return false; 530 531 return true; 532 } 533 534 static int rocket_ioctl_submit_job(struct drm_device *dev, struct drm_file *file, 535 struct drm_rocket_job *job) 536 { 537 struct rocket_device *rdev = to_rocket_device(dev); 538 struct rocket_file_priv *file_priv = file->driver_priv; 539 struct rocket_job *rjob = NULL; 540 int ret = 0; 541 542 if (job->task_count == 0) 543 return -EINVAL; 544 545 rjob = kzalloc(sizeof(*rjob), GFP_KERNEL); 546 if (!rjob) 547 return -ENOMEM; 548 549 kref_init(&rjob->refcount); 550 551 rjob->rdev = rdev; 552 > 553 ret = drm_sched_job_init(&rjob->base, 554 &file_priv->sched_entity, 555 1, NULL); 556 if (ret) 557 goto out_put_job; 558 559 ret = rocket_copy_tasks(dev, file, job, rjob); 560 if (ret) 561 goto out_cleanup_job; 562 563 ret = drm_gem_objects_lookup(file, u64_to_user_ptr(job->in_bo_handles), 564 job->in_bo_handle_count, &rjob->in_bos); 565 if (ret) 566 goto out_cleanup_job; 567 568 rjob->in_bo_count = job->in_bo_handle_count; 569 570 ret = drm_gem_objects_lookup(file, u64_to_user_ptr(job->out_bo_handles), 571 job->out_bo_handle_count, &rjob->out_bos); 572 if (ret) 573 goto out_cleanup_job; 574 575 rjob->out_bo_count = job->out_bo_handle_count; 576 577 rjob->domain = rocket_iommu_domain_get(file_priv); 578 579 ret = rocket_job_push(rjob); 580 if (ret) 581 goto out_cleanup_job; 582 583 out_cleanup_job: 584 if (ret) 585 drm_sched_job_cleanup(&rjob->base); 586 out_put_job: 587 rocket_job_put(rjob); 588 589 return ret; 590 } 591 -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki