Lines Matching +full:gpu +full:- +full:id

1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) 2015-2018 Etnaviv Project
7 #include <linux/dma-mapping.h>
46 struct etnaviv_drm_private *priv = dev->dev_private; in load_gpu()
50 struct etnaviv_gpu *g = priv->gpu[i]; in load_gpu()
57 priv->gpu[i] = NULL; in load_gpu()
64 struct etnaviv_drm_private *priv = dev->dev_private; in etnaviv_open()
70 return -ENOMEM; in etnaviv_open()
72 ret = xa_alloc_cyclic(&priv->active_contexts, &ctx->id, ctx, in etnaviv_open()
73 xa_limit_32b, &priv->next_context_id, GFP_KERNEL); in etnaviv_open()
77 ctx->mmu = etnaviv_iommu_context_init(priv->mmu_global, in etnaviv_open()
78 priv->cmdbuf_suballoc); in etnaviv_open()
79 if (!ctx->mmu) { in etnaviv_open()
80 ret = -ENOMEM; in etnaviv_open()
85 struct etnaviv_gpu *gpu = priv->gpu[i]; in etnaviv_open() local
88 if (gpu) { in etnaviv_open()
89 sched = &gpu->sched; in etnaviv_open()
90 drm_sched_entity_init(&ctx->sched_entity[i], in etnaviv_open()
96 file->driver_priv = ctx; in etnaviv_open()
107 struct etnaviv_drm_private *priv = dev->dev_private; in etnaviv_postclose()
108 struct etnaviv_file_private *ctx = file->driver_priv; in etnaviv_postclose()
112 struct etnaviv_gpu *gpu = priv->gpu[i]; in etnaviv_postclose() local
114 if (gpu) in etnaviv_postclose()
115 drm_sched_entity_destroy(&ctx->sched_entity[i]); in etnaviv_postclose()
118 etnaviv_iommu_context_put(ctx->mmu); in etnaviv_postclose()
120 xa_erase(&priv->active_contexts, ctx->id); in etnaviv_postclose()
132 struct etnaviv_drm_private *priv = dev->dev_private; in etnaviv_gem_show()
143 read_lock(&dev->vma_offset_manager->vm_lock); in etnaviv_mm_show()
144 drm_mm_print(&dev->vma_offset_manager->vm_addr_space_mm, &p); in etnaviv_mm_show()
145 read_unlock(&dev->vma_offset_manager->vm_lock); in etnaviv_mm_show()
150 static int etnaviv_mmu_show(struct etnaviv_gpu *gpu, struct seq_file *m) in etnaviv_mmu_show() argument
155 seq_printf(m, "Active Objects (%s):\n", dev_name(gpu->dev)); in etnaviv_mmu_show()
158 * Lock the GPU to avoid a MMU context switch just now and elevate in etnaviv_mmu_show()
162 mutex_lock(&gpu->lock); in etnaviv_mmu_show()
163 mmu_context = gpu->mmu_context; in etnaviv_mmu_show()
166 mutex_unlock(&gpu->lock); in etnaviv_mmu_show()
171 mutex_lock(&mmu_context->lock); in etnaviv_mmu_show()
172 drm_mm_print(&mmu_context->mm, &p); in etnaviv_mmu_show()
173 mutex_unlock(&mmu_context->lock); in etnaviv_mmu_show()
180 static void etnaviv_buffer_dump(struct etnaviv_gpu *gpu, struct seq_file *m) in etnaviv_buffer_dump() argument
182 struct etnaviv_cmdbuf *buf = &gpu->buffer; in etnaviv_buffer_dump()
183 u32 size = buf->size; in etnaviv_buffer_dump()
184 u32 *ptr = buf->vaddr; in etnaviv_buffer_dump()
187 seq_printf(m, "virt %p - phys 0x%llx - free 0x%08x\n", in etnaviv_buffer_dump()
188 buf->vaddr, (u64)etnaviv_cmdbuf_get_pa(buf), in etnaviv_buffer_dump()
189 size - buf->user_size); in etnaviv_buffer_dump()
201 static int etnaviv_ring_show(struct etnaviv_gpu *gpu, struct seq_file *m) in etnaviv_ring_show() argument
203 seq_printf(m, "Ring Buffer (%s): ", dev_name(gpu->dev)); in etnaviv_ring_show()
205 mutex_lock(&gpu->lock); in etnaviv_ring_show()
206 etnaviv_buffer_dump(gpu, m); in etnaviv_ring_show()
207 mutex_unlock(&gpu->lock); in etnaviv_ring_show()
214 struct drm_info_node *node = (struct drm_info_node *) m->private; in show_unlocked()
215 struct drm_device *dev = node->minor->dev; in show_unlocked()
217 node->info_ent->data; in show_unlocked()
224 struct drm_info_node *node = (struct drm_info_node *) m->private; in show_each_gpu()
225 struct drm_device *dev = node->minor->dev; in show_each_gpu()
226 struct etnaviv_drm_private *priv = dev->dev_private; in show_each_gpu()
227 struct etnaviv_gpu *gpu; in show_each_gpu() local
228 int (*show)(struct etnaviv_gpu *gpu, struct seq_file *m) = in show_each_gpu()
229 node->info_ent->data; in show_each_gpu()
234 gpu = priv->gpu[i]; in show_each_gpu()
235 if (!gpu) in show_each_gpu()
238 ret = show(gpu, m); in show_each_gpu()
247 {"gpu", show_each_gpu, 0, etnaviv_gpu_debugfs},
258 minor->debugfs_root, minor); in etnaviv_debugfs_init()
269 struct etnaviv_drm_private *priv = dev->dev_private; in etnaviv_ioctl_get_param()
271 struct etnaviv_gpu *gpu; in etnaviv_ioctl_get_param() local
273 if (args->pipe >= ETNA_MAX_PIPES) in etnaviv_ioctl_get_param()
274 return -EINVAL; in etnaviv_ioctl_get_param()
276 gpu = priv->gpu[args->pipe]; in etnaviv_ioctl_get_param()
277 if (!gpu) in etnaviv_ioctl_get_param()
278 return -ENXIO; in etnaviv_ioctl_get_param()
280 return etnaviv_gpu_get_param(gpu, args->param, &args->value); in etnaviv_ioctl_get_param()
288 if (args->flags & ~(ETNA_BO_CACHED | ETNA_BO_WC | ETNA_BO_UNCACHED | in etnaviv_ioctl_gem_new()
290 return -EINVAL; in etnaviv_ioctl_gem_new()
292 return etnaviv_gem_new_handle(dev, file, args->size, in etnaviv_ioctl_gem_new()
293 args->flags, &args->handle); in etnaviv_ioctl_gem_new()
303 if (args->op & ~(ETNA_PREP_READ | ETNA_PREP_WRITE | ETNA_PREP_NOSYNC)) in etnaviv_ioctl_gem_cpu_prep()
304 return -EINVAL; in etnaviv_ioctl_gem_cpu_prep()
306 obj = drm_gem_object_lookup(file, args->handle); in etnaviv_ioctl_gem_cpu_prep()
308 return -ENOENT; in etnaviv_ioctl_gem_cpu_prep()
310 ret = etnaviv_gem_cpu_prep(obj, args->op, &args->timeout); in etnaviv_ioctl_gem_cpu_prep()
324 if (args->flags) in etnaviv_ioctl_gem_cpu_fini()
325 return -EINVAL; in etnaviv_ioctl_gem_cpu_fini()
327 obj = drm_gem_object_lookup(file, args->handle); in etnaviv_ioctl_gem_cpu_fini()
329 return -ENOENT; in etnaviv_ioctl_gem_cpu_fini()
345 if (args->pad) in etnaviv_ioctl_gem_info()
346 return -EINVAL; in etnaviv_ioctl_gem_info()
348 obj = drm_gem_object_lookup(file, args->handle); in etnaviv_ioctl_gem_info()
350 return -ENOENT; in etnaviv_ioctl_gem_info()
352 ret = etnaviv_gem_mmap_offset(obj, &args->offset); in etnaviv_ioctl_gem_info()
362 struct etnaviv_drm_private *priv = dev->dev_private; in etnaviv_ioctl_wait_fence()
363 struct drm_etnaviv_timespec *timeout = &args->timeout; in etnaviv_ioctl_wait_fence()
364 struct etnaviv_gpu *gpu; in etnaviv_ioctl_wait_fence() local
366 if (args->flags & ~(ETNA_WAIT_NONBLOCK)) in etnaviv_ioctl_wait_fence()
367 return -EINVAL; in etnaviv_ioctl_wait_fence()
369 if (args->pipe >= ETNA_MAX_PIPES) in etnaviv_ioctl_wait_fence()
370 return -EINVAL; in etnaviv_ioctl_wait_fence()
372 gpu = priv->gpu[args->pipe]; in etnaviv_ioctl_wait_fence()
373 if (!gpu) in etnaviv_ioctl_wait_fence()
374 return -ENXIO; in etnaviv_ioctl_wait_fence()
376 if (args->flags & ETNA_WAIT_NONBLOCK) in etnaviv_ioctl_wait_fence()
379 return etnaviv_gpu_wait_fence_interruptible(gpu, args->fence, in etnaviv_ioctl_wait_fence()
388 if (args->flags & ~(ETNA_USERPTR_READ|ETNA_USERPTR_WRITE) || in etnaviv_ioctl_gem_userptr()
389 args->flags == 0) in etnaviv_ioctl_gem_userptr()
390 return -EINVAL; in etnaviv_ioctl_gem_userptr()
392 if (offset_in_page(args->user_ptr | args->user_size) || in etnaviv_ioctl_gem_userptr()
393 (uintptr_t)args->user_ptr != args->user_ptr || in etnaviv_ioctl_gem_userptr()
394 (u32)args->user_size != args->user_size || in etnaviv_ioctl_gem_userptr()
395 args->user_ptr & ~PAGE_MASK) in etnaviv_ioctl_gem_userptr()
396 return -EINVAL; in etnaviv_ioctl_gem_userptr()
398 if (!access_ok((void __user *)(unsigned long)args->user_ptr, in etnaviv_ioctl_gem_userptr()
399 args->user_size)) in etnaviv_ioctl_gem_userptr()
400 return -EFAULT; in etnaviv_ioctl_gem_userptr()
402 return etnaviv_gem_new_userptr(dev, file, args->user_ptr, in etnaviv_ioctl_gem_userptr()
403 args->user_size, args->flags, in etnaviv_ioctl_gem_userptr()
404 &args->handle); in etnaviv_ioctl_gem_userptr()
410 struct etnaviv_drm_private *priv = dev->dev_private; in etnaviv_ioctl_gem_wait()
412 struct drm_etnaviv_timespec *timeout = &args->timeout; in etnaviv_ioctl_gem_wait()
414 struct etnaviv_gpu *gpu; in etnaviv_ioctl_gem_wait() local
417 if (args->flags & ~(ETNA_WAIT_NONBLOCK)) in etnaviv_ioctl_gem_wait()
418 return -EINVAL; in etnaviv_ioctl_gem_wait()
420 if (args->pipe >= ETNA_MAX_PIPES) in etnaviv_ioctl_gem_wait()
421 return -EINVAL; in etnaviv_ioctl_gem_wait()
423 gpu = priv->gpu[args->pipe]; in etnaviv_ioctl_gem_wait()
424 if (!gpu) in etnaviv_ioctl_gem_wait()
425 return -ENXIO; in etnaviv_ioctl_gem_wait()
427 obj = drm_gem_object_lookup(file, args->handle); in etnaviv_ioctl_gem_wait()
429 return -ENOENT; in etnaviv_ioctl_gem_wait()
431 if (args->flags & ETNA_WAIT_NONBLOCK) in etnaviv_ioctl_gem_wait()
434 ret = etnaviv_gem_wait_bo(gpu, obj, timeout); in etnaviv_ioctl_gem_wait()
444 struct etnaviv_drm_private *priv = dev->dev_private; in etnaviv_ioctl_pm_query_dom()
446 struct etnaviv_gpu *gpu; in etnaviv_ioctl_pm_query_dom() local
448 if (args->pipe >= ETNA_MAX_PIPES) in etnaviv_ioctl_pm_query_dom()
449 return -EINVAL; in etnaviv_ioctl_pm_query_dom()
451 gpu = priv->gpu[args->pipe]; in etnaviv_ioctl_pm_query_dom()
452 if (!gpu) in etnaviv_ioctl_pm_query_dom()
453 return -ENXIO; in etnaviv_ioctl_pm_query_dom()
455 return etnaviv_pm_query_dom(gpu, args); in etnaviv_ioctl_pm_query_dom()
461 struct etnaviv_drm_private *priv = dev->dev_private; in etnaviv_ioctl_pm_query_sig()
463 struct etnaviv_gpu *gpu; in etnaviv_ioctl_pm_query_sig() local
465 if (args->pipe >= ETNA_MAX_PIPES) in etnaviv_ioctl_pm_query_sig()
466 return -EINVAL; in etnaviv_ioctl_pm_query_sig()
468 gpu = priv->gpu[args->pipe]; in etnaviv_ioctl_pm_query_sig()
469 if (!gpu) in etnaviv_ioctl_pm_query_sig()
470 return -ENXIO; in etnaviv_ioctl_pm_query_sig()
472 return etnaviv_pm_query_sig(gpu, args); in etnaviv_ioctl_pm_query_sig()
536 ret = -ENOMEM; in etnaviv_bind()
539 drm->dev_private = priv; in etnaviv_bind()
543 xa_init_flags(&priv->active_contexts, XA_FLAGS_ALLOC); in etnaviv_bind()
545 mutex_init(&priv->gem_lock); in etnaviv_bind()
546 INIT_LIST_HEAD(&priv->gem_list); in etnaviv_bind()
547 priv->num_gpus = 0; in etnaviv_bind()
548 priv->shm_gfp_mask = GFP_HIGHUSER | __GFP_RETRY_MAYFAIL | __GFP_NOWARN; in etnaviv_bind()
551 * If the GPU is part of a system with DMA addressing limitations, in etnaviv_bind()
556 priv->shm_gfp_mask |= GFP_DMA32; in etnaviv_bind()
557 priv->shm_gfp_mask &= ~__GFP_HIGHMEM; in etnaviv_bind()
560 priv->cmdbuf_suballoc = etnaviv_cmdbuf_suballoc_new(drm->dev); in etnaviv_bind()
561 if (IS_ERR(priv->cmdbuf_suballoc)) { in etnaviv_bind()
562 dev_err(drm->dev, "Failed to create cmdbuf suballocator\n"); in etnaviv_bind()
563 ret = PTR_ERR(priv->cmdbuf_suballoc); in etnaviv_bind()
584 etnaviv_cmdbuf_suballoc_destroy(priv->cmdbuf_suballoc); in etnaviv_bind()
586 mutex_destroy(&priv->gem_lock); in etnaviv_bind()
597 struct etnaviv_drm_private *priv = drm->dev_private; in etnaviv_unbind()
603 etnaviv_cmdbuf_suballoc_destroy(priv->cmdbuf_suballoc); in etnaviv_unbind()
605 xa_destroy(&priv->active_contexts); in etnaviv_unbind()
607 drm->dev_private = NULL; in etnaviv_unbind()
620 struct device *dev = &pdev->dev; in etnaviv_pdev_probe()
624 if (!dev->platform_data) { in etnaviv_pdev_probe()
635 char **names = dev->platform_data; in etnaviv_pdev_probe()
657 return -ENODEV; in etnaviv_pdev_probe()
662 * device as the GPU we found. This assumes that all Vivante in etnaviv_pdev_probe()
676 component_master_del(&pdev->dev, &etnaviv_master_ops); in etnaviv_pdev_remove()
695 return -ENOMEM; in etnaviv_create_platform_device()
738 * If the DT contains at least one available GPU device, instantiate in etnaviv_init()