Lines Matching +full:mali +full:- +full:400

1 // SPDX-License-Identifier: GPL-2.0 OR MIT
2 /* Copyright 2017-2019 Qiang Yu <[email protected]> */
42 if (args->pad) in lima_ioctl_get_param()
43 return -EINVAL; in lima_ioctl_get_param()
45 switch (args->param) { in lima_ioctl_get_param()
47 switch (ldev->id) { in lima_ioctl_get_param()
49 args->value = DRM_LIMA_PARAM_GPU_ID_MALI400; in lima_ioctl_get_param()
52 args->value = DRM_LIMA_PARAM_GPU_ID_MALI450; in lima_ioctl_get_param()
55 args->value = DRM_LIMA_PARAM_GPU_ID_UNKNOWN; in lima_ioctl_get_param()
61 args->value = ldev->pipe[lima_pipe_pp].num_processor; in lima_ioctl_get_param()
65 args->value = ldev->gp_version; in lima_ioctl_get_param()
69 args->value = ldev->pp_version; in lima_ioctl_get_param()
73 return -EINVAL; in lima_ioctl_get_param()
83 if (args->pad) in lima_ioctl_gem_create()
84 return -EINVAL; in lima_ioctl_gem_create()
86 if (args->flags & ~(LIMA_BO_FLAG_HEAP)) in lima_ioctl_gem_create()
87 return -EINVAL; in lima_ioctl_gem_create()
89 if (args->size == 0) in lima_ioctl_gem_create()
90 return -EINVAL; in lima_ioctl_gem_create()
92 return lima_gem_create_handle(dev, file, args->size, args->flags, &args->handle); in lima_ioctl_gem_create()
99 return lima_gem_get_info(file, args->handle, &args->va, &args->offset); in lima_ioctl_gem_info()
106 struct lima_drm_priv *priv = file->driver_priv; in lima_ioctl_gem_submit()
115 if (args->pipe >= lima_pipe_num || args->nr_bos == 0) in lima_ioctl_gem_submit()
116 return -EINVAL; in lima_ioctl_gem_submit()
118 if (args->flags & ~(LIMA_SUBMIT_FLAG_EXPLICIT_FENCE)) in lima_ioctl_gem_submit()
119 return -EINVAL; in lima_ioctl_gem_submit()
121 pipe = ldev->pipe + args->pipe; in lima_ioctl_gem_submit()
122 if (args->frame_size != pipe->frame_size) in lima_ioctl_gem_submit()
123 return -EINVAL; in lima_ioctl_gem_submit()
125 bos = kvcalloc(args->nr_bos, sizeof(*submit.bos) + sizeof(*submit.lbos), GFP_KERNEL); in lima_ioctl_gem_submit()
127 return -ENOMEM; in lima_ioctl_gem_submit()
129 size = args->nr_bos * sizeof(*submit.bos); in lima_ioctl_gem_submit()
130 if (copy_from_user(bos, u64_to_user_ptr(args->bos), size)) { in lima_ioctl_gem_submit()
131 err = -EFAULT; in lima_ioctl_gem_submit()
135 task = kmem_cache_zalloc(pipe->task_slab, GFP_KERNEL); in lima_ioctl_gem_submit()
137 err = -ENOMEM; in lima_ioctl_gem_submit()
141 task->frame = task + 1; in lima_ioctl_gem_submit()
142 if (copy_from_user(task->frame, u64_to_user_ptr(args->frame), args->frame_size)) { in lima_ioctl_gem_submit()
143 err = -EFAULT; in lima_ioctl_gem_submit()
147 err = pipe->task_validate(pipe, task); in lima_ioctl_gem_submit()
151 ctx = lima_ctx_get(&priv->ctx_mgr, args->ctx); in lima_ioctl_gem_submit()
153 err = -ENOENT; in lima_ioctl_gem_submit()
157 submit.pipe = args->pipe; in lima_ioctl_gem_submit()
160 submit.nr_bos = args->nr_bos; in lima_ioctl_gem_submit()
163 submit.flags = args->flags; in lima_ioctl_gem_submit()
164 submit.in_sync[0] = args->in_sync[0]; in lima_ioctl_gem_submit()
165 submit.in_sync[1] = args->in_sync[1]; in lima_ioctl_gem_submit()
166 submit.out_sync = args->out_sync; in lima_ioctl_gem_submit()
173 kmem_cache_free(pipe->task_slab, task); in lima_ioctl_gem_submit()
183 if (args->op & ~(LIMA_GEM_WAIT_READ|LIMA_GEM_WAIT_WRITE)) in lima_ioctl_gem_wait()
184 return -EINVAL; in lima_ioctl_gem_wait()
186 return lima_gem_wait(file, args->handle, args->op, args->timeout_ns); in lima_ioctl_gem_wait()
192 struct lima_drm_priv *priv = file->driver_priv; in lima_ioctl_ctx_create()
195 if (args->_pad) in lima_ioctl_ctx_create()
196 return -EINVAL; in lima_ioctl_ctx_create()
198 return lima_ctx_create(ldev, &priv->ctx_mgr, &args->id); in lima_ioctl_ctx_create()
204 struct lima_drm_priv *priv = file->driver_priv; in lima_ioctl_ctx_free()
206 if (args->_pad) in lima_ioctl_ctx_free()
207 return -EINVAL; in lima_ioctl_ctx_free()
209 return lima_ctx_free(&priv->ctx_mgr, args->id); in lima_ioctl_ctx_free()
220 return -ENOMEM; in lima_drm_driver_open()
222 priv->vm = lima_vm_create(ldev); in lima_drm_driver_open()
223 if (!priv->vm) { in lima_drm_driver_open()
224 err = -ENOMEM; in lima_drm_driver_open()
228 lima_ctx_mgr_init(&priv->ctx_mgr); in lima_drm_driver_open()
230 file->driver_priv = priv; in lima_drm_driver_open()
240 struct lima_drm_priv *priv = file->driver_priv; in lima_drm_driver_postclose()
242 lima_ctx_mgr_fini(&priv->ctx_mgr); in lima_drm_driver_postclose()
243 lima_vm_put(priv->vm); in lima_drm_driver_postclose()
262 * - 1.1.0 - add heap buffer support
293 size_t max_off = reader->base + src_size; in lima_read_block()
295 if (reader->off < max_off) { in lima_read_block()
296 size_t size = min_t(size_t, max_off - reader->off, in lima_read_block()
297 reader->count); in lima_read_block()
299 memcpy(reader->dst, src + (reader->off - reader->base), size); in lima_read_block()
301 reader->dst += size; in lima_read_block()
302 reader->off += size; in lima_read_block()
303 reader->read += size; in lima_read_block()
304 reader->count -= size; in lima_read_block()
307 reader->base = max_off; in lima_read_block()
309 return !!reader->count; in lima_read_block()
325 mutex_lock(&ldev->error_task_list_lock); in lima_error_state_read()
327 if (lima_read_block(&reader, &ldev->dump, sizeof(ldev->dump))) { in lima_error_state_read()
328 list_for_each_entry(et, &ldev->error_task_list, list) { in lima_error_state_read()
329 if (!lima_read_block(&reader, et->data, et->size)) in lima_error_state_read()
334 mutex_unlock(&ldev->error_task_list_lock); in lima_error_state_read()
346 mutex_lock(&ldev->error_task_list_lock); in lima_error_state_write()
348 list_for_each_entry_safe(et, tmp, &ldev->error_task_list, list) { in lima_error_state_write()
349 list_del(&et->list); in lima_error_state_write()
353 ldev->dump.size = 0; in lima_error_state_write()
354 ldev->dump.num_tasks = 0; in lima_error_state_write()
356 mutex_unlock(&ldev->error_task_list_lock); in lima_error_state_write()
380 ldev = devm_kzalloc(&pdev->dev, sizeof(*ldev), GFP_KERNEL); in lima_pdev_probe()
382 err = -ENOMEM; in lima_pdev_probe()
386 ldev->dev = &pdev->dev; in lima_pdev_probe()
387 comp = of_device_get_match_data(&pdev->dev); in lima_pdev_probe()
389 err = -ENODEV; in lima_pdev_probe()
393 ldev->id = comp->id; in lima_pdev_probe()
398 ddev = drm_dev_alloc(&lima_drm_driver, &pdev->dev); in lima_pdev_probe()
404 ddev->dev_private = ldev; in lima_pdev_probe()
405 ldev->ddev = ddev; in lima_pdev_probe()
413 dev_err(&pdev->dev, "Fatal error during devfreq init\n"); in lima_pdev_probe()
417 pm_runtime_set_active(ldev->dev); in lima_pdev_probe()
418 pm_runtime_mark_last_busy(ldev->dev); in lima_pdev_probe()
419 pm_runtime_set_autosuspend_delay(ldev->dev, 200); in lima_pdev_probe()
420 pm_runtime_use_autosuspend(ldev->dev); in lima_pdev_probe()
421 pm_runtime_enable(ldev->dev); in lima_pdev_probe()
431 if (sysfs_create_bin_file(&ldev->dev->kobj, &lima_error_state_attr)) in lima_pdev_probe()
432 dev_warn(ldev->dev, "fail to create error state sysfs\n"); in lima_pdev_probe()
437 pm_runtime_disable(ldev->dev); in lima_pdev_probe()
451 struct drm_device *ddev = ldev->ddev; in lima_pdev_remove()
453 sysfs_remove_bin_file(&ldev->dev->kobj, &lima_error_state_attr); in lima_pdev_remove()
458 pm_runtime_set_autosuspend_delay(ldev->dev, -1); in lima_pdev_remove()
459 pm_runtime_disable(ldev->dev); in lima_pdev_remove()
477 { .compatible = "arm,mali-400", .data = &lima_mali400_data },
478 { .compatible = "arm,mali-450", .data = &lima_mali450_data },