Lines Matching defs:pfdev
94 static struct dma_fence *panfrost_fence_create(struct panfrost_device *pfdev, int js_num)
97 struct panfrost_job_slot *js = pfdev->js;
103 fence->dev = pfdev->ddev;
125 (job->pfdev->features.nr_core_groups == 2))
127 if (panfrost_has_hw_issue(job->pfdev, HW_ISSUE_8987))
134 static void panfrost_job_write_affinity(struct panfrost_device *pfdev,
145 affinity = pfdev->features.shader_present;
147 job_write(pfdev, JS_AFFINITY_NEXT_LO(js), affinity & 0xFFFFFFFF);
148 job_write(pfdev, JS_AFFINITY_NEXT_HI(js), affinity >> 32);
153 struct panfrost_device *pfdev = job->pfdev;
158 panfrost_devfreq_record_busy(&pfdev->pfdevfreq);
160 ret = pm_runtime_get_sync(pfdev->dev);
164 if (WARN_ON(job_read(pfdev, JS_COMMAND_NEXT(js)))) {
168 cfg = panfrost_mmu_as_get(pfdev, job->file_priv->mmu);
170 job_write(pfdev, JS_HEAD_NEXT_LO(js), jc_head & 0xFFFFFFFF);
171 job_write(pfdev, JS_HEAD_NEXT_HI(js), jc_head >> 32);
173 panfrost_job_write_affinity(pfdev, job->requirements, js);
181 if (panfrost_has_hw_feature(pfdev, HW_FEATURE_FLUSH_REDUCTION))
184 if (panfrost_has_hw_issue(pfdev, HW_ISSUE_10649))
187 job_write(pfdev, JS_CONFIG_NEXT(js), cfg);
189 if (panfrost_has_hw_feature(pfdev, HW_FEATURE_FLUSH_REDUCTION))
190 job_write(pfdev, JS_FLUSH_ID_NEXT(js), job->flush_id);
193 dev_dbg(pfdev->dev, "JS: Submitting atom %p to js[%d] with head=0x%llx",
196 job_write(pfdev, JS_COMMAND_NEXT(js), JS_COMMAND_START);
221 struct panfrost_device *pfdev = job->pfdev;
227 mutex_lock(&pfdev->sched_lock);
232 mutex_unlock(&pfdev->sched_lock);
238 mutex_unlock(&pfdev->sched_lock);
251 mutex_unlock(&pfdev->sched_lock);
347 struct panfrost_device *pfdev = job->pfdev;
354 pfdev->jobs[slot] = job;
356 fence = panfrost_fence_create(pfdev, slot);
369 void panfrost_job_enable_interrupts(struct panfrost_device *pfdev)
378 job_write(pfdev, JOB_INT_CLEAR, irq_mask);
379 job_write(pfdev, JOB_INT_MASK, irq_mask);
438 struct panfrost_device *pfdev = job->pfdev;
448 dev_err(pfdev->dev, "gpu sched timeout, js=%d, config=0x%x, status=0x%x, head=0x%x, tail=0x%x, sched_job=%p",
450 job_read(pfdev, JS_CONFIG(js)),
451 job_read(pfdev, JS_STATUS(js)),
452 job_read(pfdev, JS_HEAD_LO(js)),
453 job_read(pfdev, JS_TAIL_LO(js)),
457 if (!panfrost_scheduler_stop(&pfdev->js->queue[js], sched_job))
461 if (!atomic_xchg(&pfdev->reset.pending, 1))
462 schedule_work(&pfdev->reset.work);
474 struct panfrost_device *pfdev = data;
475 u32 status = job_read(pfdev, JOB_INT_STAT);
478 dev_dbg(pfdev->dev, "jobslot irq status=%x\n", status);
483 pm_runtime_mark_last_busy(pfdev->dev);
491 job_write(pfdev, JOB_INT_CLEAR, mask);
496 job_write(pfdev, JS_COMMAND_NEXT(j), JS_COMMAND_NOP);
498 dev_err(pfdev->dev, "js fault, js=%d, status=%s, head=0x%x, tail=0x%x",
500 panfrost_exception_name(pfdev, job_read(pfdev, JS_STATUS(j))),
501 job_read(pfdev, JS_HEAD_LO(j)),
502 job_read(pfdev, JS_TAIL_LO(j)));
511 old_status = atomic_cmpxchg(&pfdev->js->queue[j].status,
515 drm_sched_fault(&pfdev->js->queue[j].sched);
521 spin_lock(&pfdev->js->job_lock);
522 job = pfdev->jobs[j];
525 pfdev->jobs[j] = NULL;
527 panfrost_mmu_as_put(pfdev, job->file_priv->mmu);
528 panfrost_devfreq_record_idle(&pfdev->pfdevfreq);
531 pm_runtime_put_autosuspend(pfdev->dev);
533 spin_unlock(&pfdev->js->job_lock);
544 struct panfrost_device *pfdev = container_of(work,
569 pfdev->js->queue[i].sched.timeout = MAX_SCHEDULE_TIMEOUT - 1;
570 cancel_delayed_work_sync(&pfdev->js->queue[i].sched.work_tdr);
571 panfrost_scheduler_stop(&pfdev->js->queue[i], NULL);
575 atomic_set(&pfdev->reset.pending, 0);
577 spin_lock_irqsave(&pfdev->js->job_lock, flags);
579 if (pfdev->jobs[i]) {
580 pm_runtime_put_noidle(pfdev->dev);
581 panfrost_devfreq_record_idle(&pfdev->pfdevfreq);
582 pfdev->jobs[i] = NULL;
585 spin_unlock_irqrestore(&pfdev->js->job_lock, flags);
587 panfrost_device_reset(pfdev);
590 panfrost_scheduler_start(&pfdev->js->queue[i]);
595 int panfrost_job_init(struct panfrost_device *pfdev)
600 INIT_WORK(&pfdev->reset.work, panfrost_reset);
602 pfdev->js = js = devm_kzalloc(pfdev->dev, sizeof(*js), GFP_KERNEL);
608 irq = platform_get_irq_byname(to_platform_device(pfdev->dev), "job");
612 ret = devm_request_irq(pfdev->dev, irq, panfrost_job_irq_handler,
613 IRQF_SHARED, KBUILD_MODNAME "-job", pfdev);
615 dev_err(pfdev->dev, "failed to request job irq");
629 dev_err(pfdev->dev, "Failed to create scheduler: %d.", ret);
634 panfrost_job_enable_interrupts(pfdev);
645 void panfrost_job_fini(struct panfrost_device *pfdev)
647 struct panfrost_job_slot *js = pfdev->js;
650 job_write(pfdev, JOB_INT_MASK, 0);
661 struct panfrost_device *pfdev = panfrost_priv->pfdev;
662 struct panfrost_job_slot *js = pfdev->js;
685 int panfrost_job_is_idle(struct panfrost_device *pfdev)
687 struct panfrost_job_slot *js = pfdev->js;