Lines Matching +full:data +full:- +full:mapping

1 // SPDX-License-Identifier: GPL-2.0
26 static int panfrost_ioctl_get_param(struct drm_device *ddev, void *data, struct drm_file *file) in panfrost_ioctl_get_param() argument
28 struct drm_panfrost_get_param *param = data; in panfrost_ioctl_get_param()
29 struct panfrost_device *pfdev = ddev->dev_private; in panfrost_ioctl_get_param()
31 if (param->pad != 0) in panfrost_ioctl_get_param()
32 return -EINVAL; in panfrost_ioctl_get_param()
36 param->value = pfdev->features.member; \ in panfrost_ioctl_get_param()
41 param->value = pfdev->features.member[param->param - \ in panfrost_ioctl_get_param()
45 switch (param->param) { in panfrost_ioctl_get_param()
71 return -EINVAL; in panfrost_ioctl_get_param()
77 static int panfrost_ioctl_create_bo(struct drm_device *dev, void *data, in panfrost_ioctl_create_bo() argument
80 struct panfrost_file_priv *priv = file->driver_priv; in panfrost_ioctl_create_bo()
82 struct drm_panfrost_create_bo *args = data; in panfrost_ioctl_create_bo()
83 struct panfrost_gem_mapping *mapping; in panfrost_ioctl_create_bo() local
85 if (!args->size || args->pad || in panfrost_ioctl_create_bo()
86 (args->flags & ~(PANFROST_BO_NOEXEC | PANFROST_BO_HEAP))) in panfrost_ioctl_create_bo()
87 return -EINVAL; in panfrost_ioctl_create_bo()
90 if ((args->flags & PANFROST_BO_HEAP) && in panfrost_ioctl_create_bo()
91 !(args->flags & PANFROST_BO_NOEXEC)) in panfrost_ioctl_create_bo()
92 return -EINVAL; in panfrost_ioctl_create_bo()
94 bo = panfrost_gem_create_with_handle(file, dev, args->size, args->flags, in panfrost_ioctl_create_bo()
95 &args->handle); in panfrost_ioctl_create_bo()
99 mapping = panfrost_gem_mapping_get(bo, priv); in panfrost_ioctl_create_bo()
100 if (!mapping) { in panfrost_ioctl_create_bo()
101 drm_gem_object_put(&bo->base.base); in panfrost_ioctl_create_bo()
102 return -EINVAL; in panfrost_ioctl_create_bo()
105 args->offset = mapping->mmnode.start << PAGE_SHIFT; in panfrost_ioctl_create_bo()
106 panfrost_gem_mapping_put(mapping); in panfrost_ioctl_create_bo()
112 * panfrost_lookup_bos() - Sets up job->bo[] with the GEM objects
130 struct panfrost_file_priv *priv = file_priv->driver_priv; in panfrost_lookup_bos()
135 job->bo_count = args->bo_handle_count; in panfrost_lookup_bos()
137 if (!job->bo_count) in panfrost_lookup_bos()
140 job->implicit_fences = kvmalloc_array(job->bo_count, in panfrost_lookup_bos()
143 if (!job->implicit_fences) in panfrost_lookup_bos()
144 return -ENOMEM; in panfrost_lookup_bos()
147 (void __user *)(uintptr_t)args->bo_handles, in panfrost_lookup_bos()
148 job->bo_count, &job->bos); in panfrost_lookup_bos()
152 job->mappings = kvmalloc_array(job->bo_count, in panfrost_lookup_bos()
155 if (!job->mappings) in panfrost_lookup_bos()
156 return -ENOMEM; in panfrost_lookup_bos()
158 for (i = 0; i < job->bo_count; i++) { in panfrost_lookup_bos()
159 struct panfrost_gem_mapping *mapping; in panfrost_lookup_bos() local
161 bo = to_panfrost_bo(job->bos[i]); in panfrost_lookup_bos()
162 mapping = panfrost_gem_mapping_get(bo, priv); in panfrost_lookup_bos()
163 if (!mapping) { in panfrost_lookup_bos()
164 ret = -EINVAL; in panfrost_lookup_bos()
168 atomic_inc(&bo->gpu_usecount); in panfrost_lookup_bos()
169 job->mappings[i] = mapping; in panfrost_lookup_bos()
176 * panfrost_copy_in_sync() - Sets up job->in_fences[] with the sync objects
198 job->in_fence_count = args->in_sync_count; in panfrost_copy_in_sync()
200 if (!job->in_fence_count) in panfrost_copy_in_sync()
203 job->in_fences = kvmalloc_array(job->in_fence_count, in panfrost_copy_in_sync()
206 if (!job->in_fences) { in panfrost_copy_in_sync()
208 return -ENOMEM; in panfrost_copy_in_sync()
211 handles = kvmalloc_array(job->in_fence_count, sizeof(u32), GFP_KERNEL); in panfrost_copy_in_sync()
213 ret = -ENOMEM; in panfrost_copy_in_sync()
219 (void __user *)(uintptr_t)args->in_syncs, in panfrost_copy_in_sync()
220 job->in_fence_count * sizeof(u32))) { in panfrost_copy_in_sync()
221 ret = -EFAULT; in panfrost_copy_in_sync()
226 for (i = 0; i < job->in_fence_count; i++) { in panfrost_copy_in_sync()
228 &job->in_fences[i]); in panfrost_copy_in_sync()
229 if (ret == -EINVAL) in panfrost_copy_in_sync()
238 static int panfrost_ioctl_submit(struct drm_device *dev, void *data, in panfrost_ioctl_submit() argument
241 struct panfrost_device *pfdev = dev->dev_private; in panfrost_ioctl_submit()
242 struct drm_panfrost_submit *args = data; in panfrost_ioctl_submit()
247 if (!args->jc) in panfrost_ioctl_submit()
248 return -EINVAL; in panfrost_ioctl_submit()
250 if (args->requirements && args->requirements != PANFROST_JD_REQ_FS) in panfrost_ioctl_submit()
251 return -EINVAL; in panfrost_ioctl_submit()
253 if (args->out_sync > 0) { in panfrost_ioctl_submit()
254 sync_out = drm_syncobj_find(file, args->out_sync); in panfrost_ioctl_submit()
256 return -ENODEV; in panfrost_ioctl_submit()
261 ret = -ENOMEM; in panfrost_ioctl_submit()
265 kref_init(&job->refcount); in panfrost_ioctl_submit()
267 job->pfdev = pfdev; in panfrost_ioctl_submit()
268 job->jc = args->jc; in panfrost_ioctl_submit()
269 job->requirements = args->requirements; in panfrost_ioctl_submit()
270 job->flush_id = panfrost_gpu_get_latest_flush_id(pfdev); in panfrost_ioctl_submit()
271 job->file_priv = file->driver_priv; in panfrost_ioctl_submit()
287 drm_syncobj_replace_fence(sync_out, job->render_done_fence); in panfrost_ioctl_submit()
299 panfrost_ioctl_wait_bo(struct drm_device *dev, void *data, in panfrost_ioctl_wait_bo() argument
303 struct drm_panfrost_wait_bo *args = data; in panfrost_ioctl_wait_bo()
305 unsigned long timeout = drm_timeout_abs_to_jiffies(args->timeout_ns); in panfrost_ioctl_wait_bo()
307 if (args->pad) in panfrost_ioctl_wait_bo()
308 return -EINVAL; in panfrost_ioctl_wait_bo()
310 gem_obj = drm_gem_object_lookup(file_priv, args->handle); in panfrost_ioctl_wait_bo()
312 return -ENOENT; in panfrost_ioctl_wait_bo()
314 ret = dma_resv_wait_timeout_rcu(gem_obj->resv, true, in panfrost_ioctl_wait_bo()
317 ret = timeout ? -ETIMEDOUT : -EBUSY; in panfrost_ioctl_wait_bo()
324 static int panfrost_ioctl_mmap_bo(struct drm_device *dev, void *data, in panfrost_ioctl_mmap_bo() argument
327 struct drm_panfrost_mmap_bo *args = data; in panfrost_ioctl_mmap_bo()
331 if (args->flags != 0) { in panfrost_ioctl_mmap_bo()
332 DRM_INFO("unknown mmap_bo flags: %d\n", args->flags); in panfrost_ioctl_mmap_bo()
333 return -EINVAL; in panfrost_ioctl_mmap_bo()
336 gem_obj = drm_gem_object_lookup(file_priv, args->handle); in panfrost_ioctl_mmap_bo()
338 DRM_DEBUG("Failed to look up GEM BO %d\n", args->handle); in panfrost_ioctl_mmap_bo()
339 return -ENOENT; in panfrost_ioctl_mmap_bo()
343 if (to_panfrost_bo(gem_obj)->is_heap) { in panfrost_ioctl_mmap_bo()
344 ret = -EINVAL; in panfrost_ioctl_mmap_bo()
350 args->offset = drm_vma_node_offset_addr(&gem_obj->vma_node); in panfrost_ioctl_mmap_bo()
357 static int panfrost_ioctl_get_bo_offset(struct drm_device *dev, void *data, in panfrost_ioctl_get_bo_offset() argument
360 struct panfrost_file_priv *priv = file_priv->driver_priv; in panfrost_ioctl_get_bo_offset()
361 struct drm_panfrost_get_bo_offset *args = data; in panfrost_ioctl_get_bo_offset()
362 struct panfrost_gem_mapping *mapping; in panfrost_ioctl_get_bo_offset() local
366 gem_obj = drm_gem_object_lookup(file_priv, args->handle); in panfrost_ioctl_get_bo_offset()
368 DRM_DEBUG("Failed to look up GEM BO %d\n", args->handle); in panfrost_ioctl_get_bo_offset()
369 return -ENOENT; in panfrost_ioctl_get_bo_offset()
373 mapping = panfrost_gem_mapping_get(bo, priv); in panfrost_ioctl_get_bo_offset()
376 if (!mapping) in panfrost_ioctl_get_bo_offset()
377 return -EINVAL; in panfrost_ioctl_get_bo_offset()
379 args->offset = mapping->mmnode.start << PAGE_SHIFT; in panfrost_ioctl_get_bo_offset()
380 panfrost_gem_mapping_put(mapping); in panfrost_ioctl_get_bo_offset()
384 static int panfrost_ioctl_madvise(struct drm_device *dev, void *data, in panfrost_ioctl_madvise() argument
387 struct panfrost_file_priv *priv = file_priv->driver_priv; in panfrost_ioctl_madvise()
388 struct drm_panfrost_madvise *args = data; in panfrost_ioctl_madvise()
389 struct panfrost_device *pfdev = dev->dev_private; in panfrost_ioctl_madvise()
394 gem_obj = drm_gem_object_lookup(file_priv, args->handle); in panfrost_ioctl_madvise()
396 DRM_DEBUG("Failed to look up GEM BO %d\n", args->handle); in panfrost_ioctl_madvise()
397 return -ENOENT; in panfrost_ioctl_madvise()
402 mutex_lock(&pfdev->shrinker_lock); in panfrost_ioctl_madvise()
403 mutex_lock(&bo->mappings.lock); in panfrost_ioctl_madvise()
404 if (args->madv == PANFROST_MADV_DONTNEED) { in panfrost_ioctl_madvise()
407 first = list_first_entry(&bo->mappings.list, in panfrost_ioctl_madvise()
419 if (!list_is_singular(&bo->mappings.list) || in panfrost_ioctl_madvise()
420 WARN_ON_ONCE(first->mmu != &priv->mmu)) { in panfrost_ioctl_madvise()
421 ret = -EINVAL; in panfrost_ioctl_madvise()
426 args->retained = drm_gem_shmem_madvise(gem_obj, args->madv); in panfrost_ioctl_madvise()
428 if (args->retained) { in panfrost_ioctl_madvise()
429 if (args->madv == PANFROST_MADV_DONTNEED) in panfrost_ioctl_madvise()
430 list_add_tail(&bo->base.madv_list, in panfrost_ioctl_madvise()
431 &pfdev->shrinker_list); in panfrost_ioctl_madvise()
432 else if (args->madv == PANFROST_MADV_WILLNEED) in panfrost_ioctl_madvise()
433 list_del_init(&bo->base.madv_list); in panfrost_ioctl_madvise()
437 mutex_unlock(&bo->mappings.lock); in panfrost_ioctl_madvise()
438 mutex_unlock(&pfdev->shrinker_lock); in panfrost_ioctl_madvise()
447 return -ENOSYS; in panfrost_unstable_ioctl_check()
453 #define PFN_4G_MASK (PFN_4G - 1)
468 (*end)--; in panfrost_drm_mm_color_adjust()
471 if (next_seg - *start <= PFN_16M) in panfrost_drm_mm_color_adjust()
474 *end = min(*end, ALIGN(*start, PFN_4G) - 1); in panfrost_drm_mm_color_adjust()
482 struct panfrost_device *pfdev = dev->dev_private; in panfrost_open()
487 return -ENOMEM; in panfrost_open()
489 panfrost_priv->pfdev = pfdev; in panfrost_open()
490 file->driver_priv = panfrost_priv; in panfrost_open()
492 spin_lock_init(&panfrost_priv->mm_lock); in panfrost_open()
494 /* 4G enough for now. can be 48-bit */ in panfrost_open()
495 drm_mm_init(&panfrost_priv->mm, SZ_32M >> PAGE_SHIFT, (SZ_4G - SZ_32M) >> PAGE_SHIFT); in panfrost_open()
496 panfrost_priv->mm.color_adjust = panfrost_drm_mm_color_adjust; in panfrost_open()
511 drm_mm_takedown(&panfrost_priv->mm); in panfrost_open()
519 struct panfrost_file_priv *panfrost_priv = file->driver_priv; in panfrost_postclose()
525 drm_mm_takedown(&panfrost_priv->mm); in panfrost_postclose()
548 * - 1.0 - initial interface
549 * - 1.1 - adds HEAP and NOEXEC flags for CREATE_BO
577 pfdev = devm_kzalloc(&pdev->dev, sizeof(*pfdev), GFP_KERNEL); in panfrost_probe()
579 return -ENOMEM; in panfrost_probe()
581 pfdev->pdev = pdev; in panfrost_probe()
582 pfdev->dev = &pdev->dev; in panfrost_probe()
586 pfdev->comp = of_device_get_match_data(&pdev->dev); in panfrost_probe()
587 if (!pfdev->comp) in panfrost_probe()
588 return -ENODEV; in panfrost_probe()
591 ddev = drm_dev_alloc(&panfrost_drm_driver, &pdev->dev); in panfrost_probe()
595 ddev->dev_private = pfdev; in panfrost_probe()
596 pfdev->ddev = ddev; in panfrost_probe()
598 mutex_init(&pfdev->shrinker_lock); in panfrost_probe()
599 INIT_LIST_HEAD(&pfdev->shrinker_list); in panfrost_probe()
603 if (err != -EPROBE_DEFER) in panfrost_probe()
604 dev_err(&pdev->dev, "Fatal error during GPU init\n"); in panfrost_probe()
608 pm_runtime_set_active(pfdev->dev); in panfrost_probe()
609 pm_runtime_mark_last_busy(pfdev->dev); in panfrost_probe()
610 pm_runtime_enable(pfdev->dev); in panfrost_probe()
611 pm_runtime_set_autosuspend_delay(pfdev->dev, 50); /* ~3 frames */ in panfrost_probe()
612 pm_runtime_use_autosuspend(pfdev->dev); in panfrost_probe()
627 pm_runtime_disable(pfdev->dev); in panfrost_probe()
629 pm_runtime_set_suspended(pfdev->dev); in panfrost_probe()
638 struct drm_device *ddev = pfdev->ddev; in panfrost_remove()
643 pm_runtime_get_sync(pfdev->dev); in panfrost_remove()
644 pm_runtime_disable(pfdev->dev); in panfrost_remove()
646 pm_runtime_set_suspended(pfdev->dev); in panfrost_remove()
668 { .compatible = "amlogic,meson-gxm-mali",
669 .data = &amlogic_data, },
670 { .compatible = "amlogic,meson-g12a-mali",
671 .data = &amlogic_data, },
672 { .compatible = "arm,mali-t604", .data = &default_data, },
673 { .compatible = "arm,mali-t624", .data = &default_data, },
674 { .compatible = "arm,mali-t628", .data = &default_data, },
675 { .compatible = "arm,mali-t720", .data = &default_data, },
676 { .compatible = "arm,mali-t760", .data = &default_data, },
677 { .compatible = "arm,mali-t820", .data = &default_data, },
678 { .compatible = "arm,mali-t830", .data = &default_data, },
679 { .compatible = "arm,mali-t860", .data = &default_data, },
680 { .compatible = "arm,mali-t880", .data = &default_data, },
681 { .compatible = "arm,mali-bifrost", .data = &default_data, },