Lines Matching +full:host1x +full:- +full:class

1 // SPDX-License-Identifier: GPL-2.0-only
8 #include <linux/dma-mapping.h>
9 #include <linux/host1x.h>
52 writel(value, vic->regs + offset); in vic_writel()
61 if (vic->config->supports_sid && tegra_dev_iommu_get_stream_id(vic->dev, &stream_id)) { in vic_boot()
88 err = falcon_boot(&vic->falcon); in vic_boot()
92 hdr = vic->falcon.firmware.virt; in vic_boot()
97 hdr = vic->falcon.firmware.virt + in vic_boot()
101 falcon_execute_method(&vic->falcon, VIC_SET_FCE_UCODE_SIZE, in vic_boot()
104 &vic->falcon, VIC_SET_FCE_UCODE_OFFSET, in vic_boot()
105 (vic->falcon.firmware.iova + fce_bin_data_offset) >> 8); in vic_boot()
108 err = falcon_wait_idle(&vic->falcon); in vic_boot()
110 dev_err(vic->dev, in vic_boot()
121 struct drm_device *dev = dev_get_drvdata(client->host); in vic_init()
122 struct tegra_drm *tegra = dev->dev_private; in vic_init()
127 if (err < 0 && err != -ENODEV) { in vic_init()
128 dev_err(vic->dev, "failed to attach to domain: %d\n", err); in vic_init()
132 vic->channel = host1x_channel_request(client); in vic_init()
133 if (!vic->channel) { in vic_init()
134 err = -ENOMEM; in vic_init()
138 client->syncpts[0] = host1x_syncpt_request(client, 0); in vic_init()
139 if (!client->syncpts[0]) { in vic_init()
140 err = -ENOMEM; in vic_init()
150 * parent host1x device. in vic_init()
152 client->dev->dma_parms = client->host->dma_parms; in vic_init()
157 host1x_syncpt_put(client->syncpts[0]); in vic_init()
159 host1x_channel_put(vic->channel); in vic_init()
169 struct drm_device *dev = dev_get_drvdata(client->host); in vic_exit()
170 struct tegra_drm *tegra = dev->dev_private; in vic_exit()
175 client->dev->dma_parms = NULL; in vic_exit()
181 pm_runtime_dont_use_autosuspend(client->dev); in vic_exit()
182 pm_runtime_force_suspend(client->dev); in vic_exit()
184 host1x_syncpt_put(client->syncpts[0]); in vic_exit()
185 host1x_channel_put(vic->channel); in vic_exit()
188 vic->channel = NULL; in vic_exit()
190 if (client->group) { in vic_exit()
191 dma_unmap_single(vic->dev, vic->falcon.firmware.phys, in vic_exit()
192 vic->falcon.firmware.size, DMA_TO_DEVICE); in vic_exit()
193 tegra_drm_free(tegra, vic->falcon.firmware.size, in vic_exit()
194 vic->falcon.firmware.virt, in vic_exit()
195 vic->falcon.firmware.iova); in vic_exit()
197 dma_free_coherent(vic->dev, vic->falcon.firmware.size, in vic_exit()
198 vic->falcon.firmware.virt, in vic_exit()
199 vic->falcon.firmware.iova); in vic_exit()
212 struct host1x_client *client = &vic->client.base; in vic_load_firmware()
213 struct tegra_drm *tegra = vic->client.drm; in vic_load_firmware()
223 if (vic->falcon.firmware.virt) { in vic_load_firmware()
228 err = falcon_read_firmware(&vic->falcon, vic->config->firmware); in vic_load_firmware()
232 size = vic->falcon.firmware.size; in vic_load_firmware()
234 if (!client->group) { in vic_load_firmware()
235 virt = dma_alloc_coherent(vic->dev, size, &iova, GFP_KERNEL); in vic_load_firmware()
237 err = -ENOMEM; in vic_load_firmware()
248 vic->falcon.firmware.virt = virt; in vic_load_firmware()
249 vic->falcon.firmware.iova = iova; in vic_load_firmware()
251 err = falcon_load_firmware(&vic->falcon); in vic_load_firmware()
260 if (client->group) { in vic_load_firmware()
263 phys = dma_map_single(vic->dev, virt, size, DMA_TO_DEVICE); in vic_load_firmware()
265 err = dma_mapping_error(vic->dev, phys); in vic_load_firmware()
269 vic->falcon.firmware.phys = phys; in vic_load_firmware()
278 if (!vic->config->supports_sid) { in vic_load_firmware()
279 vic->can_use_context = false; in vic_load_firmware()
285 vic->can_use_context = false; in vic_load_firmware()
286 dev_warn_once(vic->dev, "context isolation disabled due to old firmware\n"); in vic_load_firmware()
288 vic->can_use_context = true; in vic_load_firmware()
296 if (!client->group) in vic_load_firmware()
297 dma_free_coherent(vic->dev, size, virt, iova); in vic_load_firmware()
311 err = clk_prepare_enable(vic->clk); in vic_runtime_resume()
317 err = reset_control_deassert(vic->rst); in vic_runtime_resume()
334 reset_control_assert(vic->rst); in vic_runtime_resume()
336 clk_disable_unprepare(vic->clk); in vic_runtime_resume()
345 host1x_channel_stop(vic->channel); in vic_runtime_suspend()
347 err = reset_control_assert(vic->rst); in vic_runtime_suspend()
353 clk_disable_unprepare(vic->clk); in vic_runtime_suspend()
363 context->channel = host1x_channel_get(vic->channel); in vic_open_channel()
364 if (!context->channel) in vic_open_channel()
365 return -ENOMEM; in vic_open_channel()
372 host1x_channel_put(context->channel); in vic_close_channel()
385 *supported = vic->can_use_context; in vic_can_use_memory_ctx()
439 { .compatible = "nvidia,tegra124-vic", .data = &vic_t124_config },
440 { .compatible = "nvidia,tegra210-vic", .data = &vic_t210_config },
441 { .compatible = "nvidia,tegra186-vic", .data = &vic_t186_config },
442 { .compatible = "nvidia,tegra194-vic", .data = &vic_t194_config },
443 { .compatible = "nvidia,tegra234-vic", .data = &vic_t234_config },
450 struct device *dev = &pdev->dev; in vic_probe()
455 /* inherit DMA mask from host1x parent */ in vic_probe()
456 err = dma_coerce_mask_and_coherent(dev, *dev->parent->dma_mask); in vic_probe()
458 dev_err(&pdev->dev, "failed to set DMA mask: %d\n", err); in vic_probe()
464 return -ENOMEM; in vic_probe()
466 vic->config = of_device_get_match_data(dev); in vic_probe()
470 return -ENOMEM; in vic_probe()
472 vic->regs = devm_platform_ioremap_resource(pdev, 0); in vic_probe()
473 if (IS_ERR(vic->regs)) in vic_probe()
474 return PTR_ERR(vic->regs); in vic_probe()
476 vic->clk = devm_clk_get(dev, NULL); in vic_probe()
477 if (IS_ERR(vic->clk)) { in vic_probe()
478 dev_err(&pdev->dev, "failed to get clock\n"); in vic_probe()
479 return PTR_ERR(vic->clk); in vic_probe()
482 err = clk_set_rate(vic->clk, ULONG_MAX); in vic_probe()
484 dev_err(&pdev->dev, "failed to set clock rate\n"); in vic_probe()
488 if (!dev->pm_domain) { in vic_probe()
489 vic->rst = devm_reset_control_get(dev, "vic"); in vic_probe()
490 if (IS_ERR(vic->rst)) { in vic_probe()
491 dev_err(&pdev->dev, "failed to get reset\n"); in vic_probe()
492 return PTR_ERR(vic->rst); in vic_probe()
496 vic->falcon.dev = dev; in vic_probe()
497 vic->falcon.regs = vic->regs; in vic_probe()
499 err = falcon_init(&vic->falcon); in vic_probe()
505 INIT_LIST_HEAD(&vic->client.base.list); in vic_probe()
506 vic->client.base.ops = &vic_client_ops; in vic_probe()
507 vic->client.base.dev = dev; in vic_probe()
508 vic->client.base.class = HOST1X_CLASS_VIC; in vic_probe()
509 vic->client.base.syncpts = syncpts; in vic_probe()
510 vic->client.base.num_syncpts = 1; in vic_probe()
511 vic->dev = dev; in vic_probe()
513 INIT_LIST_HEAD(&vic->client.list); in vic_probe()
514 vic->client.version = vic->config->version; in vic_probe()
515 vic->client.ops = &vic_ops; in vic_probe()
517 err = host1x_client_register(&vic->client.base); in vic_probe()
519 dev_err(dev, "failed to register host1x client: %d\n", err); in vic_probe()
530 falcon_exit(&vic->falcon); in vic_probe()
539 pm_runtime_disable(&pdev->dev); in vic_remove()
540 host1x_client_unregister(&vic->client.base); in vic_remove()
541 falcon_exit(&vic->falcon); in vic_remove()
551 .name = "tegra-vic",