diff options
Diffstat (limited to 'drivers/gpu/drm/tegra/drm.c')
| -rw-r--r-- | drivers/gpu/drm/tegra/drm.c | 57 | 
1 files changed, 32 insertions, 25 deletions
| diff --git a/drivers/gpu/drm/tegra/drm.c b/drivers/gpu/drm/tegra/drm.c index 4b70ce664c41..0c5f1e6a0446 100644 --- a/drivers/gpu/drm/tegra/drm.c +++ b/drivers/gpu/drm/tegra/drm.c @@ -92,10 +92,6 @@ static int tegra_drm_load(struct drm_device *drm, unsigned long flags)  		return -ENOMEM;  	if (iommu_present(&platform_bus_type)) { -		u64 carveout_start, carveout_end, gem_start, gem_end; -		struct iommu_domain_geometry *geometry; -		unsigned long order; -  		tegra->domain = iommu_domain_alloc(&platform_bus_type);  		if (!tegra->domain) {  			err = -ENOMEM; @@ -105,27 +101,6 @@ static int tegra_drm_load(struct drm_device *drm, unsigned long flags)  		err = iova_cache_get();  		if (err < 0)  			goto domain; - -		geometry = &tegra->domain->geometry; -		gem_start = geometry->aperture_start; -		gem_end = geometry->aperture_end - CARVEOUT_SZ; -		carveout_start = gem_end + 1; -		carveout_end = geometry->aperture_end; - -		order = __ffs(tegra->domain->pgsize_bitmap); -		init_iova_domain(&tegra->carveout.domain, 1UL << order, -				 carveout_start >> order); - -		tegra->carveout.shift = iova_shift(&tegra->carveout.domain); -		tegra->carveout.limit = carveout_end >> tegra->carveout.shift; - -		drm_mm_init(&tegra->mm, gem_start, gem_end - gem_start + 1); -		mutex_init(&tegra->mm_lock); - -		DRM_DEBUG("IOMMU apertures:\n"); -		DRM_DEBUG("  GEM: %#llx-%#llx\n", gem_start, gem_end); -		DRM_DEBUG("  Carveout: %#llx-%#llx\n", carveout_start, -			  carveout_end);  	}  	mutex_init(&tegra->clients_lock); @@ -159,6 +134,36 @@ static int tegra_drm_load(struct drm_device *drm, unsigned long flags)  	if (err < 0)  		goto fbdev; +	if (tegra->domain) { +		u64 carveout_start, carveout_end, gem_start, gem_end; +		u64 dma_mask = dma_get_mask(&device->dev); +		dma_addr_t start, end; +		unsigned long order; + +		start = tegra->domain->geometry.aperture_start & dma_mask; +		end = tegra->domain->geometry.aperture_end & dma_mask; + +		gem_start = start; +		gem_end = end - CARVEOUT_SZ; +		carveout_start = gem_end + 1; +		carveout_end = end; + +		order = __ffs(tegra->domain->pgsize_bitmap); +		init_iova_domain(&tegra->carveout.domain, 1UL << order, +				 carveout_start >> order); + +		tegra->carveout.shift = iova_shift(&tegra->carveout.domain); +		tegra->carveout.limit = carveout_end >> tegra->carveout.shift; + +		drm_mm_init(&tegra->mm, gem_start, gem_end - gem_start + 1); +		mutex_init(&tegra->mm_lock); + +		DRM_DEBUG("IOMMU apertures:\n"); +		DRM_DEBUG("  GEM: %#llx-%#llx\n", gem_start, gem_end); +		DRM_DEBUG("  Carveout: %#llx-%#llx\n", carveout_start, +			  carveout_end); +	} +  	if (tegra->hub) {  		err = tegra_display_hub_prepare(tegra->hub);  		if (err < 0) @@ -1041,6 +1046,7 @@ int tegra_drm_register_client(struct tegra_drm *tegra,  {  	mutex_lock(&tegra->clients_lock);  	list_add_tail(&client->list, &tegra->clients); +	client->drm = tegra;  	mutex_unlock(&tegra->clients_lock);  	return 0; @@ -1051,6 +1057,7 @@ int tegra_drm_unregister_client(struct tegra_drm *tegra,  {  	mutex_lock(&tegra->clients_lock);  	list_del_init(&client->list); +	client->drm = NULL;  	mutex_unlock(&tegra->clients_lock);  	return 0; | 
