Lines Matching refs:tegra

35 #define DRIVER_NAME "tegra"
77 struct tegra_drm *tegra = drm->dev_private;
79 if (tegra->hub) {
461 struct tegra_drm *tegra = drm->dev_private;
473 list_for_each_entry(client, &tegra->clients, list)
855 struct tegra_drm *tegra = drm->dev_private;
858 if (tegra->domain) {
859 mutex_lock(&tegra->mm_lock);
860 drm_mm_print(&tegra->mm, &p);
861 mutex_unlock(&tegra->mm_lock);
906 int tegra_drm_register_client(struct tegra_drm *tegra,
917 mutex_lock(&tegra->clients_lock);
918 list_add_tail(&client->list, &tegra->clients);
919 client->drm = tegra;
920 mutex_unlock(&tegra->clients_lock);
925 int tegra_drm_unregister_client(struct tegra_drm *tegra,
928 mutex_lock(&tegra->clients_lock);
931 mutex_unlock(&tegra->clients_lock);
943 struct tegra_drm *tegra = drm->dev_private;
963 if (domain && domain != tegra->domain)
966 if (tegra->domain) {
971 if (domain != tegra->domain) {
972 err = iommu_attach_group(tegra->domain, group);
979 tegra->use_explicit_iommu = true;
990 struct tegra_drm *tegra = drm->dev_private;
1001 iommu_detach_group(tegra->domain, client->group);
1008 void *tegra_drm_alloc(struct tegra_drm *tegra, size_t size, dma_addr_t *dma)
1015 if (tegra->domain)
1016 size = iova_align(&tegra->carveout.domain, size);
1021 if (!tegra->domain) {
1035 if (!tegra->domain) {
1044 alloc = alloc_iova(&tegra->carveout.domain,
1045 size >> tegra->carveout.shift,
1046 tegra->carveout.limit, true);
1052 *dma = iova_dma_addr(&tegra->carveout.domain, alloc);
1053 err = iommu_map(tegra->domain, *dma, virt_to_phys(virt),
1061 __free_iova(&tegra->carveout.domain, alloc);
1068 void tegra_drm_free(struct tegra_drm *tegra, size_t size, void *virt,
1071 if (tegra->domain)
1072 size = iova_align(&tegra->carveout.domain, size);
1076 if (tegra->domain) {
1077 iommu_unmap(tegra->domain, dma, size);
1078 free_iova(&tegra->carveout.domain,
1079 iova_pfn(&tegra->carveout.domain, dma));
1137 struct tegra_drm *tegra;
1145 tegra = kzalloc(sizeof(*tegra), GFP_KERNEL);
1146 if (!tegra) {
1152 tegra->domain = iommu_domain_alloc(&platform_bus_type);
1153 if (!tegra->domain) {
1163 mutex_init(&tegra->clients_lock);
1164 INIT_LIST_HEAD(&tegra->clients);
1167 drm->dev_private = tegra;
1168 tegra->drm = drm;
1193 tegra->hmask = drm->mode_config.max_width - 1;
1194 tegra->vmask = drm->mode_config.max_height - 1;
1196 if (tegra->use_explicit_iommu) {
1202 start = tegra->domain->geometry.aperture_start & dma_mask;
1203 end = tegra->domain->geometry.aperture_end & dma_mask;
1210 order = __ffs(tegra->domain->pgsize_bitmap);
1211 init_iova_domain(&tegra->carveout.domain, 1UL << order,
1214 tegra->carveout.shift = iova_shift(&tegra->carveout.domain);
1215 tegra->carveout.limit = carveout_end >> tegra->carveout.shift;
1217 drm_mm_init(&tegra->mm, gem_start, gem_end - gem_start + 1);
1218 mutex_init(&tegra->mm_lock);
1224 } else if (tegra->domain) {
1225 iommu_domain_free(tegra->domain);
1226 tegra->domain = NULL;
1230 if (tegra->hub) {
1231 err = tegra_display_hub_prepare(tegra->hub);
1275 if (tegra->hub)
1276 tegra_display_hub_cleanup(tegra->hub);
1278 if (tegra->domain) {
1279 mutex_destroy(&tegra->mm_lock);
1280 drm_mm_takedown(&tegra->mm);
1281 put_iova_domain(&tegra->carveout.domain);
1290 if (tegra->domain)
1291 iommu_domain_free(tegra->domain);
1293 kfree(tegra);
1302 struct tegra_drm *tegra = drm->dev_private;
1311 if (tegra->hub)
1312 tegra_display_hub_cleanup(tegra->hub);
1318 if (tegra->domain) {
1319 mutex_destroy(&tegra->mm_lock);
1320 drm_mm_takedown(&tegra->mm);
1321 put_iova_domain(&tegra->carveout.domain);
1323 iommu_domain_free(tegra->domain);
1326 kfree(tegra);