Lines Matching refs:vic

23 #include "vic.h"
31 struct vic {
46 static inline struct vic *to_vic(struct tegra_drm_client *client)
48 return container_of(client, struct vic, client);
51 static void vic_writel(struct vic *vic, u32 value, unsigned int offset)
53 writel(value, vic->regs + offset);
58 struct vic *vic = dev_get_drvdata(dev);
61 err = clk_prepare_enable(vic->clk);
67 err = reset_control_deassert(vic->rst);
76 clk_disable_unprepare(vic->clk);
82 struct vic *vic = dev_get_drvdata(dev);
85 err = reset_control_assert(vic->rst);
91 clk_disable_unprepare(vic->clk);
93 vic->booted = false;
98 static int vic_boot(struct vic *vic)
101 struct iommu_fwspec *spec = dev_iommu_fwspec_get(vic->dev);
107 if (vic->booted)
111 if (vic->config->supports_sid && spec) {
116 vic_writel(vic, value, VIC_TFBIF_TRANSCFG);
121 vic_writel(vic, value, VIC_THI_STREAMID0);
122 vic_writel(vic, value, VIC_THI_STREAMID1);
128 vic_writel(vic, CG_IDLE_CG_DLY_CNT(4) |
133 err = falcon_boot(&vic->falcon);
137 hdr = vic->falcon.firmware.virt;
139 hdr = vic->falcon.firmware.virt +
143 falcon_execute_method(&vic->falcon, VIC_SET_APPLICATION_ID, 1);
144 falcon_execute_method(&vic->falcon, VIC_SET_FCE_UCODE_SIZE,
146 falcon_execute_method(&vic->falcon, VIC_SET_FCE_UCODE_OFFSET,
147 (vic->falcon.firmware.iova + fce_bin_data_offset)
150 err = falcon_wait_idle(&vic->falcon);
152 dev_err(vic->dev,
157 vic->booted = true;
167 struct vic *vic = to_vic(drm);
172 dev_err(vic->dev, "failed to attach to domain: %d\n", err);
176 vic->channel = host1x_channel_request(client);
177 if (!vic->channel) {
203 host1x_channel_put(vic->channel);
215 struct vic *vic = to_vic(drm);
226 host1x_channel_put(vic->channel);
230 dma_unmap_single(vic->dev, vic->falcon.firmware.phys,
231 vic->falcon.firmware.size, DMA_TO_DEVICE);
232 tegra_drm_free(tegra, vic->falcon.firmware.size,
233 vic->falcon.firmware.virt,
234 vic->falcon.firmware.iova);
236 dma_free_coherent(vic->dev, vic->falcon.firmware.size,
237 vic->falcon.firmware.virt,
238 vic->falcon.firmware.iova);
249 static int vic_load_firmware(struct vic *vic)
251 struct host1x_client *client = &vic->client.base;
252 struct tegra_drm *tegra = vic->client.drm;
258 if (vic->falcon.firmware.virt)
261 err = falcon_read_firmware(&vic->falcon, vic->config->firmware);
265 size = vic->falcon.firmware.size;
268 virt = dma_alloc_coherent(vic->dev, size, &iova, GFP_KERNEL);
275 vic->falcon.firmware.virt = virt;
276 vic->falcon.firmware.iova = iova;
278 err = falcon_load_firmware(&vic->falcon);
290 phys = dma_map_single(vic->dev, virt, size, DMA_TO_DEVICE);
292 err = dma_mapping_error(vic->dev, phys);
296 vic->falcon.firmware.phys = phys;
303 dma_free_coherent(vic->dev, size, virt, iova);
313 struct vic *vic = to_vic(client);
316 err = pm_runtime_resume_and_get(vic->dev);
320 err = vic_load_firmware(vic);
324 err = vic_boot(vic);
328 context->channel = host1x_channel_get(vic->channel);
337 pm_runtime_put(vic->dev);
343 struct vic *vic = to_vic(context->client);
347 pm_runtime_put(vic->dev);
380 #define NVIDIA_TEGRA_194_VIC_FIRMWARE "nvidia/tegra194/vic.bin"
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 },
402 struct vic *vic;
412 vic = devm_kzalloc(dev, sizeof(*vic), GFP_KERNEL);
413 if (!vic)
416 vic->config = of_device_get_match_data(dev);
428 vic->regs = devm_ioremap_resource(dev, regs);
429 if (IS_ERR(vic->regs))
430 return PTR_ERR(vic->regs);
432 vic->clk = devm_clk_get(dev, NULL);
433 if (IS_ERR(vic->clk)) {
435 return PTR_ERR(vic->clk);
439 vic->rst = devm_reset_control_get(dev, "vic");
440 if (IS_ERR(vic->rst)) {
442 return PTR_ERR(vic->rst);
446 vic->falcon.dev = dev;
447 vic->falcon.regs = vic->regs;
449 err = falcon_init(&vic->falcon);
453 platform_set_drvdata(pdev, vic);
455 INIT_LIST_HEAD(&vic->client.base.list);
456 vic->client.base.ops = &vic_client_ops;
457 vic->client.base.dev = dev;
458 vic->client.base.class = HOST1X_CLASS_VIC;
459 vic->client.base.syncpts = syncpts;
460 vic->client.base.num_syncpts = 1;
461 vic->dev = dev;
463 INIT_LIST_HEAD(&vic->client.list);
464 vic->client.version = vic->config->version;
465 vic->client.ops = &vic_ops;
467 err = host1x_client_register(&vic->client.base);
483 host1x_client_unregister(&vic->client.base);
485 falcon_exit(&vic->falcon);
492 struct vic *vic = platform_get_drvdata(pdev);
495 err = host1x_client_unregister(&vic->client.base);
507 falcon_exit(&vic->falcon);
518 .name = "tegra-vic",