• Home
  • Raw
  • Download

Lines Matching +full:tegra +full:- +full:pmc

1 // SPDX-License-Identifier: GPL-2.0-only
8 #include <linux/dma-mapping.h>
19 #include <soc/tegra/pmc.h>
53 writel(value, vic->regs + offset); in vic_writel()
61 err = clk_prepare_enable(vic->clk); in vic_runtime_resume()
67 err = reset_control_deassert(vic->rst); in vic_runtime_resume()
76 clk_disable_unprepare(vic->clk); in vic_runtime_resume()
85 err = reset_control_assert(vic->rst); in vic_runtime_suspend()
91 clk_disable_unprepare(vic->clk); in vic_runtime_suspend()
93 vic->booted = false; in vic_runtime_suspend()
101 struct iommu_fwspec *spec = dev_iommu_fwspec_get(vic->dev); in vic_boot()
107 if (vic->booted) in vic_boot()
111 if (vic->config->supports_sid && spec) { in vic_boot()
118 if (spec->num_ids > 0) { in vic_boot()
119 value = spec->ids[0] & 0xffff; in vic_boot()
133 err = falcon_boot(&vic->falcon); in vic_boot()
137 hdr = vic->falcon.firmware.virt; in vic_boot()
139 hdr = vic->falcon.firmware.virt + in vic_boot()
143 falcon_execute_method(&vic->falcon, VIC_SET_APPLICATION_ID, 1); in vic_boot()
144 falcon_execute_method(&vic->falcon, VIC_SET_FCE_UCODE_SIZE, in vic_boot()
146 falcon_execute_method(&vic->falcon, VIC_SET_FCE_UCODE_OFFSET, in vic_boot()
147 (vic->falcon.firmware.iova + fce_bin_data_offset) in vic_boot()
150 err = falcon_wait_idle(&vic->falcon); in vic_boot()
152 dev_err(vic->dev, in vic_boot()
157 vic->booted = true; in vic_boot()
165 struct drm_device *dev = dev_get_drvdata(client->host); in vic_init()
166 struct tegra_drm *tegra = dev->dev_private; in vic_init() local
171 if (err < 0 && err != -ENODEV) { in vic_init()
172 dev_err(vic->dev, "failed to attach to domain: %d\n", err); in vic_init()
176 vic->channel = host1x_channel_request(client); in vic_init()
177 if (!vic->channel) { in vic_init()
178 err = -ENOMEM; in vic_init()
182 client->syncpts[0] = host1x_syncpt_request(client, 0); in vic_init()
183 if (!client->syncpts[0]) { in vic_init()
184 err = -ENOMEM; in vic_init()
188 err = tegra_drm_register_client(tegra, drm); in vic_init()
196 client->dev->dma_parms = client->host->dma_parms; in vic_init()
201 host1x_syncpt_free(client->syncpts[0]); in vic_init()
203 host1x_channel_put(vic->channel); in vic_init()
213 struct drm_device *dev = dev_get_drvdata(client->host); in vic_exit()
214 struct tegra_drm *tegra = dev->dev_private; in vic_exit() local
219 client->dev->dma_parms = NULL; in vic_exit()
221 err = tegra_drm_unregister_client(tegra, drm); in vic_exit()
225 host1x_syncpt_free(client->syncpts[0]); in vic_exit()
226 host1x_channel_put(vic->channel); in vic_exit()
229 if (client->group) { in vic_exit()
230 dma_unmap_single(vic->dev, vic->falcon.firmware.phys, in vic_exit()
231 vic->falcon.firmware.size, DMA_TO_DEVICE); in vic_exit()
232 tegra_drm_free(tegra, vic->falcon.firmware.size, in vic_exit()
233 vic->falcon.firmware.virt, in vic_exit()
234 vic->falcon.firmware.iova); in vic_exit()
236 dma_free_coherent(vic->dev, vic->falcon.firmware.size, in vic_exit()
237 vic->falcon.firmware.virt, in vic_exit()
238 vic->falcon.firmware.iova); in vic_exit()
251 struct host1x_client *client = &vic->client.base; in vic_load_firmware()
252 struct tegra_drm *tegra = vic->client.drm; in vic_load_firmware() local
258 if (vic->falcon.firmware.virt) in vic_load_firmware()
261 err = falcon_read_firmware(&vic->falcon, vic->config->firmware); in vic_load_firmware()
265 size = vic->falcon.firmware.size; in vic_load_firmware()
267 if (!client->group) { in vic_load_firmware()
268 virt = dma_alloc_coherent(vic->dev, size, &iova, GFP_KERNEL); in vic_load_firmware()
270 return -ENOMEM; in vic_load_firmware()
272 virt = tegra_drm_alloc(tegra, size, &iova); in vic_load_firmware()
275 vic->falcon.firmware.virt = virt; in vic_load_firmware()
276 vic->falcon.firmware.iova = iova; in vic_load_firmware()
278 err = falcon_load_firmware(&vic->falcon); in vic_load_firmware()
287 if (client->group) { in vic_load_firmware()
290 phys = dma_map_single(vic->dev, virt, size, DMA_TO_DEVICE); in vic_load_firmware()
292 err = dma_mapping_error(vic->dev, phys); in vic_load_firmware()
296 vic->falcon.firmware.phys = phys; in vic_load_firmware()
302 if (!client->group) in vic_load_firmware()
303 dma_free_coherent(vic->dev, size, virt, iova); in vic_load_firmware()
305 tegra_drm_free(tegra, size, virt, iova); in vic_load_firmware()
316 err = pm_runtime_resume_and_get(vic->dev); in vic_open_channel()
328 context->channel = host1x_channel_get(vic->channel); in vic_open_channel()
329 if (!context->channel) { in vic_open_channel()
330 err = -ENOMEM; in vic_open_channel()
337 pm_runtime_put(vic->dev); in vic_open_channel()
343 struct vic *vic = to_vic(context->client); in vic_close_channel()
345 host1x_channel_put(context->channel); in vic_close_channel()
347 pm_runtime_put(vic->dev); in vic_close_channel()
389 { .compatible = "nvidia,tegra124-vic", .data = &vic_t124_config },
390 { .compatible = "nvidia,tegra210-vic", .data = &vic_t210_config },
391 { .compatible = "nvidia,tegra186-vic", .data = &vic_t186_config },
392 { .compatible = "nvidia,tegra194-vic", .data = &vic_t194_config },
399 struct device *dev = &pdev->dev; in vic_probe()
406 err = dma_coerce_mask_and_coherent(dev, *dev->parent->dma_mask); in vic_probe()
408 dev_err(&pdev->dev, "failed to set DMA mask: %d\n", err); in vic_probe()
414 return -ENOMEM; in vic_probe()
416 vic->config = of_device_get_match_data(dev); in vic_probe()
420 return -ENOMEM; in vic_probe()
424 dev_err(&pdev->dev, "failed to get registers\n"); in vic_probe()
425 return -ENXIO; in vic_probe()
428 vic->regs = devm_ioremap_resource(dev, regs); in vic_probe()
429 if (IS_ERR(vic->regs)) in vic_probe()
430 return PTR_ERR(vic->regs); in vic_probe()
432 vic->clk = devm_clk_get(dev, NULL); in vic_probe()
433 if (IS_ERR(vic->clk)) { in vic_probe()
434 dev_err(&pdev->dev, "failed to get clock\n"); in vic_probe()
435 return PTR_ERR(vic->clk); in vic_probe()
438 if (!dev->pm_domain) { in vic_probe()
439 vic->rst = devm_reset_control_get(dev, "vic"); in vic_probe()
440 if (IS_ERR(vic->rst)) { in vic_probe()
441 dev_err(&pdev->dev, "failed to get reset\n"); in vic_probe()
442 return PTR_ERR(vic->rst); in vic_probe()
446 vic->falcon.dev = dev; in vic_probe()
447 vic->falcon.regs = vic->regs; in vic_probe()
449 err = falcon_init(&vic->falcon); in vic_probe()
455 INIT_LIST_HEAD(&vic->client.base.list); in vic_probe()
456 vic->client.base.ops = &vic_client_ops; in vic_probe()
457 vic->client.base.dev = dev; in vic_probe()
458 vic->client.base.class = HOST1X_CLASS_VIC; in vic_probe()
459 vic->client.base.syncpts = syncpts; in vic_probe()
460 vic->client.base.num_syncpts = 1; in vic_probe()
461 vic->dev = dev; in vic_probe()
463 INIT_LIST_HEAD(&vic->client.list); in vic_probe()
464 vic->client.version = vic->config->version; in vic_probe()
465 vic->client.ops = &vic_ops; in vic_probe()
467 err = host1x_client_register(&vic->client.base); in vic_probe()
473 pm_runtime_enable(&pdev->dev); in vic_probe()
474 if (!pm_runtime_enabled(&pdev->dev)) { in vic_probe()
475 err = vic_runtime_resume(&pdev->dev); in vic_probe()
483 host1x_client_unregister(&vic->client.base); in vic_probe()
485 falcon_exit(&vic->falcon); in vic_probe()
495 err = host1x_client_unregister(&vic->client.base); in vic_remove()
497 dev_err(&pdev->dev, "failed to unregister host1x client: %d\n", in vic_remove()
502 if (pm_runtime_enabled(&pdev->dev)) in vic_remove()
503 pm_runtime_disable(&pdev->dev); in vic_remove()
505 vic_runtime_suspend(&pdev->dev); in vic_remove()
507 falcon_exit(&vic->falcon); in vic_remove()
518 .name = "tegra-vic",