diff options
Diffstat (limited to 'drivers/gpu/drm/msm/msm_drv.c')
| -rw-r--r-- | drivers/gpu/drm/msm/msm_drv.c | 51 | 
1 files changed, 31 insertions, 20 deletions
| diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c index 47f4dd407671..b7ef56ed8d1c 100644 --- a/drivers/gpu/drm/msm/msm_drv.c +++ b/drivers/gpu/drm/msm/msm_drv.c @@ -21,9 +21,11 @@  static void msm_fb_output_poll_changed(struct drm_device *dev)  { +#ifdef CONFIG_DRM_MSM_FBDEV  	struct msm_drm_private *priv = dev->dev_private;  	if (priv->fbdev)  		drm_fb_helper_hotplug_event(priv->fbdev); +#endif  }  static const struct drm_mode_config_funcs mode_config_funcs = { @@ -94,7 +96,7 @@ void __iomem *msm_ioremap(struct platform_device *pdev, const char *name,  	}  	if (reglog) -		printk(KERN_DEBUG "IO:region %s %08x %08lx\n", dbgname, (u32)ptr, size); +		printk(KERN_DEBUG "IO:region %s %p %08lx\n", dbgname, ptr, size);  	return ptr;  } @@ -102,7 +104,7 @@ void __iomem *msm_ioremap(struct platform_device *pdev, const char *name,  void msm_writel(u32 data, void __iomem *addr)  {  	if (reglog) -		printk(KERN_DEBUG "IO:W %08x %08x\n", (u32)addr, data); +		printk(KERN_DEBUG "IO:W %p %08x\n", addr, data);  	writel(data, addr);  } @@ -110,7 +112,7 @@ u32 msm_readl(const void __iomem *addr)  {  	u32 val = readl(addr);  	if (reglog) -		printk(KERN_ERR "IO:R %08x %08x\n", (u32)addr, val); +		printk(KERN_ERR "IO:R %p %08x\n", addr, val);  	return val;  } @@ -143,8 +145,8 @@ static int msm_unload(struct drm_device *dev)  	if (gpu) {  		mutex_lock(&dev->struct_mutex);  		gpu->funcs->pm_suspend(gpu); -		gpu->funcs->destroy(gpu);  		mutex_unlock(&dev->struct_mutex); +		gpu->funcs->destroy(gpu);  	}  	if (priv->vram.paddr) { @@ -177,7 +179,7 @@ static int get_mdp_ver(struct platform_device *pdev)  	const struct of_device_id *match;  	match = of_match_node(match_types, dev->of_node);  	if (match) -		return (int)match->data; +		return (int)(unsigned long)match->data;  #endif  	return 4;  } @@ -216,7 +218,7 @@ static int msm_init_vram(struct drm_device *dev)  		if (ret)  			return ret;  		size = r.end - r.start; -		DRM_INFO("using VRAM carveout: %lx@%08x\n", size, r.start); +		DRM_INFO("using VRAM carveout: %lx@%pa\n", size, &r.start);  	} else  #endif @@ -283,10 +285,6 @@ static int msm_load(struct drm_device *dev, unsigned long flags)  	drm_mode_config_init(dev); -	ret = msm_init_vram(dev); -	if (ret) -		goto fail; -  	platform_set_drvdata(pdev, dev);  	/* Bind all our sub-components: */ @@ -294,6 +292,10 @@ static int msm_load(struct drm_device *dev, unsigned long flags)  	if (ret)  		return ret; +	ret = msm_init_vram(dev); +	if (ret) +		goto fail; +  	switch (get_mdp_ver(pdev)) {  	case 4:  		kms = mdp4_kms_init(dev); @@ -419,9 +421,11 @@ static void msm_preclose(struct drm_device *dev, struct drm_file *file)  static void msm_lastclose(struct drm_device *dev)  { +#ifdef CONFIG_DRM_MSM_FBDEV  	struct msm_drm_private *priv = dev->dev_private;  	if (priv->fbdev)  		drm_fb_helper_restore_fbdev_mode_unlocked(priv->fbdev); +#endif  }  static irqreturn_t msm_irq(int irq, void *arg) @@ -634,7 +638,7 @@ static void msm_debugfs_cleanup(struct drm_minor *minor)   */  int msm_wait_fence_interruptable(struct drm_device *dev, uint32_t fence, -		struct timespec *timeout) +		ktime_t *timeout)  {  	struct msm_drm_private *priv = dev->dev_private;  	int ret; @@ -652,14 +656,16 @@ int msm_wait_fence_interruptable(struct drm_device *dev, uint32_t fence,  		/* no-wait: */  		ret = fence_completed(dev, fence) ? 0 : -EBUSY;  	} else { -		unsigned long timeout_jiffies = timespec_to_jiffies(timeout); -		unsigned long start_jiffies = jiffies; +		ktime_t now = ktime_get();  		unsigned long remaining_jiffies; -		if (time_after(start_jiffies, timeout_jiffies)) +		if (ktime_compare(*timeout, now) < 0) {  			remaining_jiffies = 0; -		else -			remaining_jiffies = timeout_jiffies - start_jiffies; +		} else { +			ktime_t rem = ktime_sub(*timeout, now); +			struct timespec ts = ktime_to_timespec(rem); +			remaining_jiffies = timespec_to_jiffies(&ts); +		}  		ret = wait_event_interruptible_timeout(priv->fence_event,  				fence_completed(dev, fence), @@ -768,13 +774,17 @@ static int msm_ioctl_gem_new(struct drm_device *dev, void *data,  			args->flags, &args->handle);  } -#define TS(t) ((struct timespec){ .tv_sec = (t).tv_sec, .tv_nsec = (t).tv_nsec }) +static inline ktime_t to_ktime(struct drm_msm_timespec timeout) +{ +	return ktime_set(timeout.tv_sec, timeout.tv_nsec); +}  static int msm_ioctl_gem_cpu_prep(struct drm_device *dev, void *data,  		struct drm_file *file)  {  	struct drm_msm_gem_cpu_prep *args = data;  	struct drm_gem_object *obj; +	ktime_t timeout = to_ktime(args->timeout);  	int ret;  	if (args->op & ~MSM_PREP_FLAGS) { @@ -786,7 +796,7 @@ static int msm_ioctl_gem_cpu_prep(struct drm_device *dev, void *data,  	if (!obj)  		return -ENOENT; -	ret = msm_gem_cpu_prep(obj, args->op, &TS(args->timeout)); +	ret = msm_gem_cpu_prep(obj, args->op, &timeout);  	drm_gem_object_unreference_unlocked(obj); @@ -836,14 +846,14 @@ static int msm_ioctl_wait_fence(struct drm_device *dev, void *data,  		struct drm_file *file)  {  	struct drm_msm_wait_fence *args = data; +	ktime_t timeout = to_ktime(args->timeout);  	if (args->pad) {  		DRM_ERROR("invalid pad: %08x\n", args->pad);  		return -EINVAL;  	} -	return msm_wait_fence_interruptable(dev, args->fence, -			&TS(args->timeout)); +	return msm_wait_fence_interruptable(dev, args->fence, &timeout);  }  static const struct drm_ioctl_desc msm_ioctls[] = { @@ -881,6 +891,7 @@ static struct drm_driver msm_driver = {  				DRIVER_GEM |  				DRIVER_PRIME |  				DRIVER_RENDER | +				DRIVER_ATOMIC |  				DRIVER_MODESET,  	.load               = msm_load,  	.unload             = msm_unload, | 
