Hi, Taylor R Campbell <riastr...@netbsd.org> writes:
>> Date: Tue, 28 Dec 2021 11:34:43 +0900 >> From: Ryo ONODERA <r...@tetera.org> >> >> intel_gt_pm_fini() at netbsd:intel_gt_pm_fini+0x18 >> intel_gt_init() at netbsd:intel_gt_init+0x6ad >> i915_gem_init() at netbsd:i915_gem_init+0x14d >> i915_driver_probe() at netbsd:i915_driver_probe+0x949 >> i915drmkms_attach_real() at netbsd:i915drmkms_attach_real+0x4c >> config_mountroot_thread() at netbsd:config_mountroot_thread+0x60 > > So intel_gt_init is failing on boot, and the driver has decided to > give up -- and proximate cause of the crash is that one of the error > branches is screwy, but while it would be nice to fix the error > branches it's more important to find why we're reaching them in the > first place. > > Can you get a line number for intel_gt_init+0x6ad, and can you also > insert prints into every error branch of intel_gt_init to find out > which one it is and how it fails? And maybe do that recursively in > whichever branch does fail? In sys/external/bsd/drm2/dist/drm/i915/gt/intel_gt.c: intel_gt_init(), __engines_record_defaults(gt) failed and went to err_gt label, then the panic happened. "intel_gt_init+0x6ad" is err_uc_init's intel_uc_fini(>->uc). (snip) err = __engines_record_defaults(gt); if (err) goto err_gt; (snip) err_gt: __intel_gt_disable(gt); intel_uc_fini_hw(>->uc); err_uc_init: intel_uc_fini(>->uc); err_engines: intel_engines_release(gt); i915_vm_put(fetch_and_zero(>->vm)); err_pm: intel_gt_pm_fini(gt); intel_gt_fini_scratch(gt); out_fw: if (err) (snip) And I have added some printfs to __engines_record_defaults() and the other functions invoked from __engines_record_defaults() as follows. __engines_record_defaults intel_gt_wait_for_idle intel_gt_retire_requests_timeout dma_fence_wait_timeout i915_fence_wait (via *fence->ops->wait) i915_request_wait In i915_request_wait, DRM_SPIN_TIMED_WAIT_UNTIL sets timeout=0 and i915_request_wait returns timeout=-ETIME. #ifdef __NetBSD__ spin_lock(rq->fence.lock); #define C (i915_request_completed(rq) ? 1 : \ (spin_unlock(rq->fence.lock), \ intel_engine_flush_submission(rq->engine), \ spin_lock(rq->fence.lock), \ i915_request_completed(rq))) if (flags & I915_WAIT_INTERRUPTIBLE) { DRM_SPIN_TIMED_WAIT_UNTIL(timeout, &wait.wq, rq->fence.lock, timeout, C); } else { DRM_SPIN_TIMED_WAIT_NOINTR_UNTIL(timeout, &wait.wq, rq->fence.lock, timeout, C); } #undef C if (timeout > 0) { /* succeeded before timeout */ KASSERT(i915_request_completed(rq)); dma_fence_signal_locked(&rq->fence); } else if (timeout == 0) { /* timed out */ timeout = -ETIME; } spin_unlock(rq->fence.lock); DRM_DESTROY_WAITQUEUE(&wait.wq); #else Thank you. -- Ryo ONODERA // r...@tetera.org PGP fingerprint = 82A2 DC91 76E0 A10A 8ABB FD1B F404 27FA C7D1 15F3