Lines Matching refs:tegra
26 #define DRIVER_NAME "tegra"
65 struct tegra_drm *tegra = drm->dev_private;
67 if (tegra->hub) {
447 struct tegra_drm *tegra = drm->dev_private;
459 list_for_each_entry(client, &tegra->clients, list)
825 struct tegra_drm *tegra = drm->dev_private;
828 if (tegra->domain) {
829 mutex_lock(&tegra->mm_lock);
830 drm_mm_print(&tegra->mm, &p);
831 mutex_unlock(&tegra->mm_lock);
883 int tegra_drm_register_client(struct tegra_drm *tegra,
886 mutex_lock(&tegra->clients_lock);
887 list_add_tail(&client->list, &tegra->clients);
888 client->drm = tegra;
889 mutex_unlock(&tegra->clients_lock);
894 int tegra_drm_unregister_client(struct tegra_drm *tegra,
897 mutex_lock(&tegra->clients_lock);
900 mutex_unlock(&tegra->clients_lock);
909 struct tegra_drm *tegra = drm->dev_private;
918 if (domain && domain != tegra->domain)
921 if (tegra->domain) {
926 if (domain != tegra->domain) {
927 err = iommu_attach_group(tegra->domain, group);
934 tegra->use_explicit_iommu = true;
945 struct tegra_drm *tegra = drm->dev_private;
956 iommu_detach_group(tegra->domain, client->group);
963 void *tegra_drm_alloc(struct tegra_drm *tegra, size_t size, dma_addr_t *dma)
970 if (tegra->domain)
971 size = iova_align(&tegra->carveout.domain, size);
976 if (!tegra->domain) {
990 if (!tegra->domain) {
999 alloc = alloc_iova(&tegra->carveout.domain,
1000 size >> tegra->carveout.shift,
1001 tegra->carveout.limit, true);
1007 *dma = iova_dma_addr(&tegra->carveout.domain, alloc);
1008 err = iommu_map(tegra->domain, *dma, virt_to_phys(virt),
1016 __free_iova(&tegra->carveout.domain, alloc);
1023 void tegra_drm_free(struct tegra_drm *tegra, size_t size, void *virt,
1026 if (tegra->domain)
1027 size = iova_align(&tegra->carveout.domain, size);
1031 if (tegra->domain) {
1032 iommu_unmap(tegra->domain, dma, size);
1033 free_iova(&tegra->carveout.domain,
1034 iova_pfn(&tegra->carveout.domain, dma));
1093 struct tegra_drm *tegra;
1101 tegra = kzalloc(sizeof(*tegra), GFP_KERNEL);
1102 if (!tegra) {
1108 tegra->domain = iommu_domain_alloc(&platform_bus_type);
1109 if (!tegra->domain) {
1119 mutex_init(&tegra->clients_lock);
1120 INIT_LIST_HEAD(&tegra->clients);
1123 drm->dev_private = tegra;
1124 tegra->drm = drm;
1149 if (tegra->use_explicit_iommu) {
1155 start = tegra->domain->geometry.aperture_start & dma_mask;
1156 end = tegra->domain->geometry.aperture_end & dma_mask;
1163 order = __ffs(tegra->domain->pgsize_bitmap);
1164 init_iova_domain(&tegra->carveout.domain, 1UL << order,
1167 tegra->carveout.shift = iova_shift(&tegra->carveout.domain);
1168 tegra->carveout.limit = carveout_end >> tegra->carveout.shift;
1170 drm_mm_init(&tegra->mm, gem_start, gem_end - gem_start + 1);
1171 mutex_init(&tegra->mm_lock);
1177 } else if (tegra->domain) {
1178 iommu_domain_free(tegra->domain);
1179 tegra->domain = NULL;
1183 if (tegra->hub) {
1184 err = tegra_display_hub_prepare(tegra->hub);
1223 if (tegra->hub)
1224 tegra_display_hub_cleanup(tegra->hub);
1226 if (tegra->domain) {
1227 mutex_destroy(&tegra->mm_lock);
1228 drm_mm_takedown(&tegra->mm);
1229 put_iova_domain(&tegra->carveout.domain);
1240 if (tegra->domain)
1241 iommu_domain_free(tegra->domain);
1243 kfree(tegra);
1252 struct tegra_drm *tegra = drm->dev_private;
1262 if (tegra->hub)
1263 tegra_display_hub_cleanup(tegra->hub);
1269 if (tegra->domain) {
1270 mutex_destroy(&tegra->mm_lock);
1271 drm_mm_takedown(&tegra->mm);
1272 put_iova_domain(&tegra->carveout.domain);
1274 iommu_domain_free(tegra->domain);
1277 kfree(tegra);