Lines Matching refs:vic
21 #include "vic.h"
29 struct vic {
45 static inline struct vic *to_vic(struct tegra_drm_client *client)
47 return container_of(client, struct vic, client);
50 static void vic_writel(struct vic *vic, u32 value, unsigned int offset)
52 writel(value, vic->regs + offset);
55 static int vic_boot(struct vic *vic)
61 if (vic->config->supports_sid && tegra_dev_iommu_get_stream_id(vic->dev, &stream_id)) {
66 vic_writel(vic, value, VIC_TFBIF_TRANSCFG);
76 vic_writel(vic, stream_id, VIC_THI_STREAMID0);
79 vic_writel(vic, stream_id, VIC_THI_STREAMID1);
83 vic_writel(vic, CG_IDLE_CG_DLY_CNT(4) |
88 err = falcon_boot(&vic->falcon);
92 hdr = vic->falcon.firmware.virt;
97 hdr = vic->falcon.firmware.virt +
101 falcon_execute_method(&vic->falcon, VIC_SET_FCE_UCODE_SIZE,
104 &vic->falcon, VIC_SET_FCE_UCODE_OFFSET,
105 (vic->falcon.firmware.iova + fce_bin_data_offset) >> 8);
108 err = falcon_wait_idle(&vic->falcon);
110 dev_err(vic->dev,
123 struct vic *vic = to_vic(drm);
128 dev_err(vic->dev, "failed to attach to domain: %d\n", err);
132 vic->channel = host1x_channel_request(client);
133 if (!vic->channel) {
159 host1x_channel_put(vic->channel);
171 struct vic *vic = to_vic(drm);
185 host1x_channel_put(vic->channel);
188 vic->channel = NULL;
191 dma_unmap_single(vic->dev, vic->falcon.firmware.phys,
192 vic->falcon.firmware.size, DMA_TO_DEVICE);
193 tegra_drm_free(tegra, vic->falcon.firmware.size,
194 vic->falcon.firmware.virt,
195 vic->falcon.firmware.iova);
197 dma_free_coherent(vic->dev, vic->falcon.firmware.size,
198 vic->falcon.firmware.virt,
199 vic->falcon.firmware.iova);
210 static int vic_load_firmware(struct vic *vic)
212 struct host1x_client *client = &vic->client.base;
213 struct tegra_drm *tegra = vic->client.drm;
223 if (vic->falcon.firmware.virt) {
228 err = falcon_read_firmware(&vic->falcon, vic->config->firmware);
232 size = vic->falcon.firmware.size;
235 virt = dma_alloc_coherent(vic->dev, size, &iova, GFP_KERNEL);
248 vic->falcon.firmware.virt = virt;
249 vic->falcon.firmware.iova = iova;
251 err = falcon_load_firmware(&vic->falcon);
263 phys = dma_map_single(vic->dev, virt, size, DMA_TO_DEVICE);
265 err = dma_mapping_error(vic->dev, phys);
269 vic->falcon.firmware.phys = phys;
278 if (!vic->config->supports_sid) {
279 vic->can_use_context = false;
285 vic->can_use_context = false;
286 dev_warn_once(vic->dev, "context isolation disabled due to old firmware\n");
288 vic->can_use_context = true;
297 dma_free_coherent(vic->dev, size, virt, iova);
308 struct vic *vic = dev_get_drvdata(dev);
311 err = clk_prepare_enable(vic->clk);
317 err = reset_control_deassert(vic->rst);
323 err = vic_load_firmware(vic);
327 err = vic_boot(vic);
334 reset_control_assert(vic->rst);
336 clk_disable_unprepare(vic->clk);
342 struct vic *vic = dev_get_drvdata(dev);
345 host1x_channel_stop(vic->channel);
347 err = reset_control_assert(vic->rst);
353 clk_disable_unprepare(vic->clk);
361 struct vic *vic = to_vic(client);
363 context->channel = host1x_channel_get(vic->channel);
377 struct vic *vic = to_vic(client);
381 err = vic_load_firmware(vic);
385 *supported = vic->can_use_context;
422 #define NVIDIA_TEGRA_194_VIC_FIRMWARE "nvidia/tegra194/vic.bin"
430 #define NVIDIA_TEGRA_234_VIC_FIRMWARE "nvidia/tegra234/vic.bin"
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 },
452 struct vic *vic;
462 vic = devm_kzalloc(dev, sizeof(*vic), GFP_KERNEL);
463 if (!vic)
466 vic->config = of_device_get_match_data(dev);
472 vic->regs = devm_platform_ioremap_resource(pdev, 0);
473 if (IS_ERR(vic->regs))
474 return PTR_ERR(vic->regs);
476 vic->clk = devm_clk_get(dev, NULL);
477 if (IS_ERR(vic->clk)) {
479 return PTR_ERR(vic->clk);
482 err = clk_set_rate(vic->clk, ULONG_MAX);
489 vic->rst = devm_reset_control_get(dev, "vic");
490 if (IS_ERR(vic->rst)) {
492 return PTR_ERR(vic->rst);
496 vic->falcon.dev = dev;
497 vic->falcon.regs = vic->regs;
499 err = falcon_init(&vic->falcon);
503 platform_set_drvdata(pdev, vic);
505 INIT_LIST_HEAD(&vic->client.base.list);
506 vic->client.base.ops = &vic_client_ops;
507 vic->client.base.dev = dev;
508 vic->client.base.class = HOST1X_CLASS_VIC;
509 vic->client.base.syncpts = syncpts;
510 vic->client.base.num_syncpts = 1;
511 vic->dev = dev;
513 INIT_LIST_HEAD(&vic->client.list);
514 vic->client.version = vic->config->version;
515 vic->client.ops = &vic_ops;
517 err = host1x_client_register(&vic->client.base);
530 falcon_exit(&vic->falcon);
537 struct vic *vic = platform_get_drvdata(pdev);
540 host1x_client_unregister(&vic->client.base);
541 falcon_exit(&vic->falcon);
551 .name = "tegra-vic",