Lines Matching +full:mali +full:- +full:bifrost

1 // SPDX-License-Identifier: GPL-2.0
39 ret = pm_runtime_resume_and_get(pfdev->dev);
47 pm_runtime_put(pfdev->dev);
54 struct panfrost_device *pfdev = ddev->dev_private;
57 if (param->pad != 0)
58 return -EINVAL;
62 param->value = pfdev->features.member; \
67 param->value = pfdev->features.member[param->param - \
71 switch (param->param) {
99 ret = panfrost_ioctl_query_timestamp(pfdev, &param->value);
106 param->value = arch_timer_get_cntfrq();
108 param->value = 0;
113 return -EINVAL;
122 struct panfrost_file_priv *priv = file->driver_priv;
128 if (!args->size || args->pad ||
129 (args->flags & ~(PANFROST_BO_NOEXEC | PANFROST_BO_HEAP)))
130 return -EINVAL;
133 if ((args->flags & PANFROST_BO_HEAP) &&
134 !(args->flags & PANFROST_BO_NOEXEC))
135 return -EINVAL;
137 bo = panfrost_gem_create(dev, args->size, args->flags);
141 ret = drm_gem_handle_create(file, &bo->base.base, &args->handle);
147 args->offset = mapping->mmnode.start << PAGE_SHIFT;
154 ret = -EINVAL;
158 drm_gem_object_put(&bo->base.base);
163 * panfrost_lookup_bos() - Sets up job->bo[] with the GEM objects
181 struct panfrost_file_priv *priv = file_priv->driver_priv;
186 job->bo_count = args->bo_handle_count;
188 if (!job->bo_count)
192 (void __user *)(uintptr_t)args->bo_handles,
193 job->bo_count, &job->bos);
197 job->mappings = kvmalloc_array(job->bo_count,
200 if (!job->mappings)
201 return -ENOMEM;
203 for (i = 0; i < job->bo_count; i++) {
206 bo = to_panfrost_bo(job->bos[i]);
209 ret = -EINVAL;
213 atomic_inc(&bo->gpu_usecount);
214 job->mappings[i] = mapping;
221 * panfrost_copy_in_sync() - Sets up job->deps with the sync objects
243 in_fence_count = args->in_sync_count;
250 ret = -ENOMEM;
256 (void __user *)(uintptr_t)args->in_syncs,
258 ret = -EFAULT;
264 ret = drm_sched_job_add_syncobj_dependency(&job->base, file_priv,
278 struct panfrost_device *pfdev = dev->dev_private;
279 struct panfrost_file_priv *file_priv = file->driver_priv;
285 if (!args->jc)
286 return -EINVAL;
288 if (args->requirements & ~JOB_REQUIREMENTS)
289 return -EINVAL;
291 if (args->out_sync > 0) {
292 sync_out = drm_syncobj_find(file, args->out_sync);
294 return -ENODEV;
299 ret = -ENOMEM;
303 kref_init(&job->refcount);
305 job->pfdev = pfdev;
306 job->jc = args->jc;
307 job->requirements = args->requirements;
308 job->flush_id = panfrost_gpu_get_latest_flush_id(pfdev);
309 job->mmu = file_priv->mmu;
310 job->engine_usage = &file_priv->engine_usage;
314 ret = drm_sched_job_init(&job->base,
315 &file_priv->sched_entity[slot],
316 1, NULL, file->client_id);
334 drm_syncobj_replace_fence(sync_out, job->render_done_fence);
338 drm_sched_job_cleanup(&job->base);
355 unsigned long timeout = drm_timeout_abs_to_jiffies(args->timeout_ns);
357 if (args->pad)
358 return -EINVAL;
360 gem_obj = drm_gem_object_lookup(file_priv, args->handle);
362 return -ENOENT;
364 ret = dma_resv_wait_timeout(gem_obj->resv, DMA_RESV_USAGE_READ,
367 ret = timeout ? -ETIMEDOUT : -EBUSY;
381 if (args->flags != 0) {
382 DRM_INFO("unknown mmap_bo flags: %d\n", args->flags);
383 return -EINVAL;
386 gem_obj = drm_gem_object_lookup(file_priv, args->handle);
388 DRM_DEBUG("Failed to look up GEM BO %d\n", args->handle);
389 return -ENOENT;
393 if (to_panfrost_bo(gem_obj)->is_heap) {
394 ret = -EINVAL;
400 args->offset = drm_vma_node_offset_addr(&gem_obj->vma_node);
410 struct panfrost_file_priv *priv = file_priv->driver_priv;
416 gem_obj = drm_gem_object_lookup(file_priv, args->handle);
418 DRM_DEBUG("Failed to look up GEM BO %d\n", args->handle);
419 return -ENOENT;
427 return -EINVAL;
429 args->offset = mapping->mmnode.start << PAGE_SHIFT;
437 struct panfrost_file_priv *priv = file_priv->driver_priv;
439 struct panfrost_device *pfdev = dev->dev_private;
444 gem_obj = drm_gem_object_lookup(file_priv, args->handle);
446 DRM_DEBUG("Failed to look up GEM BO %d\n", args->handle);
447 return -ENOENT;
452 ret = dma_resv_lock_interruptible(bo->base.base.resv, NULL);
456 mutex_lock(&pfdev->shrinker_lock);
457 mutex_lock(&bo->mappings.lock);
458 if (args->madv == PANFROST_MADV_DONTNEED) {
461 first = list_first_entry(&bo->mappings.list,
473 if (!list_is_singular(&bo->mappings.list) ||
474 WARN_ON_ONCE(first->mmu != priv->mmu)) {
475 ret = -EINVAL;
480 args->retained = drm_gem_shmem_madvise_locked(&bo->base, args->madv);
482 if (args->retained) {
483 if (args->madv == PANFROST_MADV_DONTNEED)
484 list_move_tail(&bo->base.madv_list,
485 &pfdev->shrinker_list);
486 else if (args->madv == PANFROST_MADV_WILLNEED)
487 list_del_init(&bo->base.madv_list);
491 mutex_unlock(&bo->mappings.lock);
492 mutex_unlock(&pfdev->shrinker_lock);
493 dma_resv_unlock(bo->base.base.resv);
507 if (args->pad)
508 return -EINVAL;
510 obj = drm_gem_object_lookup(file, args->handle);
512 return -ENOENT;
514 if (args->label) {
515 label = strndup_user(u64_to_user_ptr(args->label),
519 if (ret == -EINVAL)
520 ret = -E2BIG;
542 return -ENOSYS;
551 struct panfrost_device *pfdev = dev->dev_private;
556 return -ENOMEM;
558 panfrost_priv->pfdev = pfdev;
559 file->driver_priv = panfrost_priv;
561 panfrost_priv->mmu = panfrost_mmu_ctx_create(pfdev);
562 if (IS_ERR(panfrost_priv->mmu)) {
563 ret = PTR_ERR(panfrost_priv->mmu);
574 panfrost_mmu_ctx_put(panfrost_priv->mmu);
583 struct panfrost_file_priv *panfrost_priv = file->driver_priv;
588 panfrost_mmu_ctx_put(panfrost_priv->mmu);
615 * IMPORTANT NOTE: drm-cycles and drm-engine measurements are not
619 * - Firstly, we must consider the time the CPU and then the kernel
622 * - Secondly, the pipelining done by the Job Manager (2 job slots per
628 "fragment", "vertex-tiler", "compute-only"
633 for (i = 0; i < NUM_JOB_SLOTS - 1; i++) {
634 if (pfdev->profile_mode) {
635 drm_printf(p, "drm-engine-%s:\t%llu ns\n",
636 engine_names[i], panfrost_priv->engine_usage.elapsed_ns[i]);
637 drm_printf(p, "drm-cycles-%s:\t%llu\n",
638 engine_names[i], panfrost_priv->engine_usage.cycles[i]);
640 drm_printf(p, "drm-maxfreq-%s:\t%lu Hz\n",
641 engine_names[i], pfdev->pfdevfreq.fast_rate);
642 drm_printf(p, "drm-curfreq-%s:\t%lu Hz\n",
643 engine_names[i], pfdev->pfdevfreq.current_frequency);
649 struct drm_device *dev = file->minor->dev;
650 struct panfrost_device *pfdev = dev->dev_private;
652 panfrost_gpu_show_fdinfo(pfdev, file->driver_priv, p);
666 struct drm_info_node *node = m->private;
667 struct drm_device *dev = node->minor->dev;
668 struct panfrost_device *pfdev = dev->dev_private;
683 minor->debugfs_root, minor);
696 * - 1.0 - initial interface
697 * - 1.1 - adds HEAP and NOEXEC flags for CREATE_BO
698 * - 1.2 - adds AFBC_FEATURES query
699 * - 1.3 - adds JD_REQ_CYCLE_COUNT job requirement for SUBMIT
700 * - adds SYSTEM_TIMESTAMP and SYSTEM_TIMESTAMP_FREQUENCY queries
701 * - 1.4 - adds SET_LABEL_BO
729 pfdev = devm_kzalloc(&pdev->dev, sizeof(*pfdev), GFP_KERNEL);
731 return -ENOMEM;
733 pfdev->pdev = pdev;
734 pfdev->dev = &pdev->dev;
738 pfdev->comp = of_device_get_match_data(&pdev->dev);
739 if (!pfdev->comp)
740 return -ENODEV;
742 pfdev->coherent = device_get_dma_attr(&pdev->dev) == DEV_DMA_COHERENT;
745 ddev = drm_dev_alloc(&panfrost_drm_driver, &pdev->dev);
749 ddev->dev_private = pfdev;
750 pfdev->ddev = ddev;
752 mutex_init(&pfdev->shrinker_lock);
753 INIT_LIST_HEAD(&pfdev->shrinker_list);
757 if (err != -EPROBE_DEFER)
758 dev_err(&pdev->dev, "Fatal error during GPU init\n");
762 pm_runtime_set_active(pfdev->dev);
763 pm_runtime_mark_last_busy(pfdev->dev);
764 pm_runtime_enable(pfdev->dev);
765 pm_runtime_set_autosuspend_delay(pfdev->dev, 50); /* ~3 frames */
766 pm_runtime_use_autosuspend(pfdev->dev);
785 pm_runtime_disable(pfdev->dev);
787 pm_runtime_set_suspended(pfdev->dev);
796 struct drm_device *ddev = pfdev->ddev;
801 pm_runtime_get_sync(pfdev->dev);
802 pm_runtime_disable(pfdev->dev);
804 pm_runtime_set_suspended(pfdev->dev);
814 return sysfs_emit(buf, "%d\n", pfdev->profile_mode);
829 pfdev->profile_mode = value;
846 * and then initialize num_supplies with ARRAY_SIZE - 1.
848 static const char * const default_supplies[] = { "mali", NULL };
850 .num_supplies = ARRAY_SIZE(default_supplies) - 1,
857 .num_supplies = ARRAY_SIZE(default_supplies) - 1,
864 .num_supplies = ARRAY_SIZE(default_supplies) - 1,
873 * keep retro-compatibility with older devicetrees, as DVFS will
879 static const char * const legacy_supplies[] = { "mali", "sram", NULL };
881 .num_supplies = ARRAY_SIZE(legacy_supplies) - 1,
888 .num_supplies = ARRAY_SIZE(default_supplies) - 1,
896 .num_supplies = ARRAY_SIZE(default_supplies) - 1,
904 .num_supplies = ARRAY_SIZE(default_supplies) - 1,
913 .num_supplies = ARRAY_SIZE(default_supplies) - 1,
922 .num_supplies = ARRAY_SIZE(default_supplies) - 1,
932 { .compatible = "amlogic,meson-gxm-mali",
934 { .compatible = "amlogic,meson-g12a-mali",
936 { .compatible = "arm,mali-t604", .data = &default_data, },
937 { .compatible = "arm,mali-t624", .data = &default_data, },
938 { .compatible = "arm,mali-t628", .data = &default_data, },
939 { .compatible = "arm,mali-t720", .data = &default_data, },
940 { .compatible = "arm,mali-t760", .data = &default_data, },
941 { .compatible = "arm,mali-t820", .data = &default_data, },
942 { .compatible = "arm,mali-t830", .data = &default_data, },
943 { .compatible = "arm,mali-t860", .data = &default_data, },
944 { .compatible = "arm,mali-t880", .data = &default_data, },
945 { .compatible = "arm,mali-bifrost", .data = &default_data, },
946 { .compatible = "arm,mali-valhall-jm", .data = &default_data, },
947 { .compatible = "mediatek,mt8183-mali", .data = &mediatek_mt8183_data },
948 { .compatible = "mediatek,mt8183b-mali", .data = &mediatek_mt8183_b_data },
949 { .compatible = "mediatek,mt8186-mali", .data = &mediatek_mt8186_data },
950 { .compatible = "mediatek,mt8188-mali", .data = &mediatek_mt8188_data },
951 { .compatible = "mediatek,mt8192-mali", .data = &mediatek_mt8192_data },
952 { .compatible = "mediatek,mt8370-mali", .data = &mediatek_mt8370_data },
953 { .compatible = "allwinner,sun50i-h616-mali", .data = &allwinner_h616_data },