Lines Matching full:vic
22 #include "vic.h"
30 struct vic { struct
45 static inline struct vic *to_vic(struct tegra_drm_client *client) in to_vic() argument
47 return container_of(client, struct vic, client); in to_vic()
50 static void vic_writel(struct vic *vic, u32 value, unsigned int offset) in vic_writel() argument
52 writel(value, vic->regs + offset); in vic_writel()
57 struct vic *vic = dev_get_drvdata(dev); in vic_runtime_resume() local
60 err = clk_prepare_enable(vic->clk); in vic_runtime_resume()
66 err = reset_control_deassert(vic->rst); in vic_runtime_resume()
75 clk_disable_unprepare(vic->clk); in vic_runtime_resume()
81 struct vic *vic = dev_get_drvdata(dev); in vic_runtime_suspend() local
84 err = reset_control_assert(vic->rst); in vic_runtime_suspend()
90 clk_disable_unprepare(vic->clk); in vic_runtime_suspend()
92 vic->booted = false; in vic_runtime_suspend()
97 static int vic_boot(struct vic *vic) in vic_boot() argument
100 struct iommu_fwspec *spec = dev_iommu_fwspec_get(vic->dev); in vic_boot()
106 if (vic->booted) in vic_boot()
110 if (vic->config->supports_sid && spec) { in vic_boot()
115 vic_writel(vic, value, VIC_TFBIF_TRANSCFG); in vic_boot()
120 vic_writel(vic, value, VIC_THI_STREAMID0); in vic_boot()
121 vic_writel(vic, value, VIC_THI_STREAMID1); in vic_boot()
127 vic_writel(vic, CG_IDLE_CG_DLY_CNT(4) | in vic_boot()
132 err = falcon_boot(&vic->falcon); in vic_boot()
136 hdr = vic->falcon.firmware.virt; in vic_boot()
138 hdr = vic->falcon.firmware.virt + in vic_boot()
142 falcon_execute_method(&vic->falcon, VIC_SET_APPLICATION_ID, 1); in vic_boot()
143 falcon_execute_method(&vic->falcon, VIC_SET_FCE_UCODE_SIZE, in vic_boot()
145 falcon_execute_method(&vic->falcon, VIC_SET_FCE_UCODE_OFFSET, in vic_boot()
146 (vic->falcon.firmware.iova + fce_bin_data_offset) in vic_boot()
149 err = falcon_wait_idle(&vic->falcon); in vic_boot()
151 dev_err(vic->dev, in vic_boot()
156 vic->booted = true; in vic_boot()
166 struct vic *vic = to_vic(drm); in vic_init() local
171 dev_err(vic->dev, "failed to attach to domain: %d\n", err); in vic_init()
175 vic->channel = host1x_channel_request(client); in vic_init()
176 if (!vic->channel) { in vic_init()
202 host1x_channel_put(vic->channel); in vic_init()
214 struct vic *vic = to_vic(drm); in vic_exit() local
225 host1x_channel_put(vic->channel); in vic_exit()
229 dma_unmap_single(vic->dev, vic->falcon.firmware.phys, in vic_exit()
230 vic->falcon.firmware.size, DMA_TO_DEVICE); in vic_exit()
231 tegra_drm_free(tegra, vic->falcon.firmware.size, in vic_exit()
232 vic->falcon.firmware.virt, in vic_exit()
233 vic->falcon.firmware.iova); in vic_exit()
235 dma_free_coherent(vic->dev, vic->falcon.firmware.size, in vic_exit()
236 vic->falcon.firmware.virt, in vic_exit()
237 vic->falcon.firmware.iova); in vic_exit()
248 static int vic_load_firmware(struct vic *vic) in vic_load_firmware() argument
250 struct host1x_client *client = &vic->client.base; in vic_load_firmware()
251 struct tegra_drm *tegra = vic->client.drm; in vic_load_firmware()
257 if (vic->falcon.firmware.virt) in vic_load_firmware()
260 err = falcon_read_firmware(&vic->falcon, vic->config->firmware); in vic_load_firmware()
264 size = vic->falcon.firmware.size; in vic_load_firmware()
267 virt = dma_alloc_coherent(vic->dev, size, &iova, GFP_KERNEL); in vic_load_firmware()
269 err = dma_mapping_error(vic->dev, iova); in vic_load_firmware()
276 vic->falcon.firmware.virt = virt; in vic_load_firmware()
277 vic->falcon.firmware.iova = iova; in vic_load_firmware()
279 err = falcon_load_firmware(&vic->falcon); in vic_load_firmware()
291 phys = dma_map_single(vic->dev, virt, size, DMA_TO_DEVICE); in vic_load_firmware()
293 err = dma_mapping_error(vic->dev, phys); in vic_load_firmware()
297 vic->falcon.firmware.phys = phys; in vic_load_firmware()
304 dma_free_coherent(vic->dev, size, virt, iova); in vic_load_firmware()
314 struct vic *vic = to_vic(client); in vic_open_channel() local
317 err = pm_runtime_resume_and_get(vic->dev); in vic_open_channel()
321 err = vic_load_firmware(vic); in vic_open_channel()
325 err = vic_boot(vic); in vic_open_channel()
329 context->channel = host1x_channel_get(vic->channel); in vic_open_channel()
338 pm_runtime_put(vic->dev); in vic_open_channel()
344 struct vic *vic = to_vic(context->client); in vic_close_channel() local
348 pm_runtime_put(vic->dev); in vic_close_channel()
381 #define NVIDIA_TEGRA_194_VIC_FIRMWARE "nvidia/tegra194/vic.bin"
390 { .compatible = "nvidia,tegra124-vic", .data = &vic_t124_config },
391 { .compatible = "nvidia,tegra210-vic", .data = &vic_t210_config },
392 { .compatible = "nvidia,tegra186-vic", .data = &vic_t186_config },
393 { .compatible = "nvidia,tegra194-vic", .data = &vic_t194_config },
403 struct vic *vic; in vic_probe() local
413 vic = devm_kzalloc(dev, sizeof(*vic), GFP_KERNEL); in vic_probe()
414 if (!vic) in vic_probe()
417 vic->config = of_device_get_match_data(dev); in vic_probe()
429 vic->regs = devm_ioremap_resource(dev, regs); in vic_probe()
430 if (IS_ERR(vic->regs)) in vic_probe()
431 return PTR_ERR(vic->regs); in vic_probe()
433 vic->clk = devm_clk_get(dev, NULL); in vic_probe()
434 if (IS_ERR(vic->clk)) { in vic_probe()
436 return PTR_ERR(vic->clk); in vic_probe()
440 vic->rst = devm_reset_control_get(dev, "vic"); in vic_probe()
441 if (IS_ERR(vic->rst)) { in vic_probe()
443 return PTR_ERR(vic->rst); in vic_probe()
447 vic->falcon.dev = dev; in vic_probe()
448 vic->falcon.regs = vic->regs; in vic_probe()
450 err = falcon_init(&vic->falcon); in vic_probe()
454 platform_set_drvdata(pdev, vic); in vic_probe()
456 INIT_LIST_HEAD(&vic->client.base.list); in vic_probe()
457 vic->client.base.ops = &vic_client_ops; in vic_probe()
458 vic->client.base.dev = dev; in vic_probe()
459 vic->client.base.class = HOST1X_CLASS_VIC; in vic_probe()
460 vic->client.base.syncpts = syncpts; in vic_probe()
461 vic->client.base.num_syncpts = 1; in vic_probe()
462 vic->dev = dev; in vic_probe()
464 INIT_LIST_HEAD(&vic->client.list); in vic_probe()
465 vic->client.version = vic->config->version; in vic_probe()
466 vic->client.ops = &vic_ops; in vic_probe()
468 err = host1x_client_register(&vic->client.base); in vic_probe()
484 host1x_client_unregister(&vic->client.base); in vic_probe()
486 falcon_exit(&vic->falcon); in vic_probe()
493 struct vic *vic = platform_get_drvdata(pdev); in vic_remove() local
496 err = host1x_client_unregister(&vic->client.base); in vic_remove()
508 falcon_exit(&vic->falcon); in vic_remove()
519 .name = "tegra-vic",