Lines Matching +full:bcm2835 +full:- +full:v3d

1 // SPDX-License-Identifier: GPL-2.0-only
99 struct drm_info_node *node = (struct drm_info_node *)m->private; in vc4_v3d_debugfs_ident()
100 struct drm_device *dev = node->minor->dev; in vc4_v3d_debugfs_ident()
130 mutex_lock(&vc4->power_lock); in vc4_v3d_pm_get()
131 if (vc4->power_refcount++ == 0) { in vc4_v3d_pm_get()
132 int ret = pm_runtime_get_sync(&vc4->v3d->pdev->dev); in vc4_v3d_pm_get()
135 vc4->power_refcount--; in vc4_v3d_pm_get()
136 mutex_unlock(&vc4->power_lock); in vc4_v3d_pm_get()
140 mutex_unlock(&vc4->power_lock); in vc4_v3d_pm_get()
148 mutex_lock(&vc4->power_lock); in vc4_v3d_pm_put()
149 if (--vc4->power_refcount == 0) { in vc4_v3d_pm_put()
150 pm_runtime_mark_last_busy(&vc4->v3d->pdev->dev); in vc4_v3d_pm_put()
151 pm_runtime_put_autosuspend(&vc4->v3d->pdev->dev); in vc4_v3d_pm_put()
153 mutex_unlock(&vc4->power_lock); in vc4_v3d_pm_put()
169 struct drm_device *dev = &vc4->base; in vc4_v3d_get_bin_slot()
176 spin_lock_irqsave(&vc4->job_lock, irqflags); in vc4_v3d_get_bin_slot()
177 slot = ffs(~vc4->bin_alloc_used); in vc4_v3d_get_bin_slot()
179 /* Switch from ffs() bit index to a 0-based index. */ in vc4_v3d_get_bin_slot()
180 slot--; in vc4_v3d_get_bin_slot()
181 vc4->bin_alloc_used |= BIT(slot); in vc4_v3d_get_bin_slot()
182 spin_unlock_irqrestore(&vc4->job_lock, irqflags); in vc4_v3d_get_bin_slot()
191 seqno = exec->seqno; in vc4_v3d_get_bin_slot()
192 spin_unlock_irqrestore(&vc4->job_lock, irqflags); in vc4_v3d_get_bin_slot()
203 return -ENOMEM; in vc4_v3d_get_bin_slot()
207 * bin_bo_alloc() - allocates the memory that will be used for
216 * To work around this, we allocate a single large buffer while V3D is
224 * real-world applications run into allocation failures from the
230 struct vc4_v3d *v3d = vc4->v3d; in bin_bo_alloc() local
235 if (!v3d) in bin_bo_alloc()
236 return -ENODEV; in bin_bo_alloc()
247 struct vc4_bo *bo = vc4_bo_create(&vc4->base, size, true, in bin_bo_alloc()
253 dev_err(&v3d->pdev->dev, in bin_bo_alloc()
262 if ((bo->base.paddr & 0xf0000000) == in bin_bo_alloc()
263 ((bo->base.paddr + bo->base.base.size - 1) & 0xf0000000)) { in bin_bo_alloc()
264 vc4->bin_bo = bo; in bin_bo_alloc()
276 * for a total of 320kb for our worst-case. in bin_bo_alloc()
282 vc4->bin_alloc_size = 512 * 1024; in bin_bo_alloc()
283 vc4->bin_alloc_used = 0; in bin_bo_alloc()
284 vc4->bin_alloc_overflow = 0; in bin_bo_alloc()
285 WARN_ON_ONCE(sizeof(vc4->bin_alloc_used) * 8 != in bin_bo_alloc()
286 bo->base.base.size / vc4->bin_alloc_size); in bin_bo_alloc()
288 kref_init(&vc4->bin_bo_kref); in bin_bo_alloc()
290 /* Enable the out-of-memory interrupt to set our in bin_bo_alloc()
291 * newly-allocated binner BO, potentially from an in bin_bo_alloc()
292 * already-pending-but-masked interrupt. in bin_bo_alloc()
300 list_add(&bo->unref_head, &list); in bin_bo_alloc()
308 list_del(&bo->unref_head); in bin_bo_alloc()
309 drm_gem_object_put(&bo->base.base); in bin_bo_alloc()
319 mutex_lock(&vc4->bin_bo_lock); in vc4_v3d_bin_bo_get()
324 if (vc4->bin_bo) in vc4_v3d_bin_bo_get()
325 kref_get(&vc4->bin_bo_kref); in vc4_v3d_bin_bo_get()
333 mutex_unlock(&vc4->bin_bo_lock); in vc4_v3d_bin_bo_get()
342 if (WARN_ON_ONCE(!vc4->bin_bo)) in bin_bo_release()
345 drm_gem_object_put(&vc4->bin_bo->base.base); in bin_bo_release()
346 vc4->bin_bo = NULL; in bin_bo_release()
351 mutex_lock(&vc4->bin_bo_lock); in vc4_v3d_bin_bo_put()
352 kref_put(&vc4->bin_bo_kref, bin_bo_release); in vc4_v3d_bin_bo_put()
353 mutex_unlock(&vc4->bin_bo_lock); in vc4_v3d_bin_bo_put()
359 struct vc4_v3d *v3d = dev_get_drvdata(dev); in vc4_v3d_runtime_suspend() local
360 struct vc4_dev *vc4 = v3d->vc4; in vc4_v3d_runtime_suspend()
362 vc4_irq_disable(&vc4->base); in vc4_v3d_runtime_suspend()
364 clk_disable_unprepare(v3d->clk); in vc4_v3d_runtime_suspend()
371 struct vc4_v3d *v3d = dev_get_drvdata(dev); in vc4_v3d_runtime_resume() local
372 struct vc4_dev *vc4 = v3d->vc4; in vc4_v3d_runtime_resume()
375 ret = clk_prepare_enable(v3d->clk); in vc4_v3d_runtime_resume()
379 vc4_v3d_init_hw(&vc4->base); in vc4_v3d_runtime_resume()
382 enable_irq(vc4->irq); in vc4_v3d_runtime_resume()
383 vc4_irq_enable(&vc4->base); in vc4_v3d_runtime_resume()
394 struct vc4_v3d *v3d = NULL; in vc4_v3d_bind() local
397 v3d = devm_kzalloc(&pdev->dev, sizeof(*v3d), GFP_KERNEL); in vc4_v3d_bind()
398 if (!v3d) in vc4_v3d_bind()
399 return -ENOMEM; in vc4_v3d_bind()
401 dev_set_drvdata(dev, v3d); in vc4_v3d_bind()
403 v3d->pdev = pdev; in vc4_v3d_bind()
405 v3d->regs = vc4_ioremap_regs(pdev, 0); in vc4_v3d_bind()
406 if (IS_ERR(v3d->regs)) in vc4_v3d_bind()
407 return PTR_ERR(v3d->regs); in vc4_v3d_bind()
408 v3d->regset.base = v3d->regs; in vc4_v3d_bind()
409 v3d->regset.regs = v3d_regs; in vc4_v3d_bind()
410 v3d->regset.nregs = ARRAY_SIZE(v3d_regs); in vc4_v3d_bind()
412 vc4->v3d = v3d; in vc4_v3d_bind()
413 v3d->vc4 = vc4; in vc4_v3d_bind()
415 v3d->clk = devm_clk_get(dev, NULL); in vc4_v3d_bind()
416 if (IS_ERR(v3d->clk)) { in vc4_v3d_bind()
417 int ret = PTR_ERR(v3d->clk); in vc4_v3d_bind()
419 if (ret == -ENOENT) { in vc4_v3d_bind()
420 /* bcm2835 didn't have a clock reference in the DT. */ in vc4_v3d_bind()
422 v3d->clk = NULL; in vc4_v3d_bind()
424 if (ret != -EPROBE_DEFER) in vc4_v3d_bind()
425 dev_err(dev, "Failed to get V3D clock: %d\n", in vc4_v3d_bind()
434 return -EINVAL; in vc4_v3d_bind()
437 ret = clk_prepare_enable(v3d->clk); in vc4_v3d_bind()
452 vc4->irq = ret; in vc4_v3d_bind()
454 ret = vc4_irq_install(drm, vc4->irq); in vc4_v3d_bind()
466 vc4_debugfs_add_regset32(drm, "v3d_regs", &v3d->regset); in vc4_v3d_bind()
488 vc4->v3d = NULL; in vc4_v3d_unbind()
502 return component_add(&pdev->dev, &vc4_v3d_ops); in vc4_v3d_dev_probe()
507 component_del(&pdev->dev, &vc4_v3d_ops); in vc4_v3d_dev_remove()
512 { .compatible = "brcm,bcm2835-v3d" },
513 { .compatible = "brcm,cygnus-v3d" },
514 { .compatible = "brcm,vc4-v3d" },