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

Reply via email to