diff options
Diffstat (limited to 'drivers/gpu/drm/msm/msm_drv.c')
| -rw-r--r-- | drivers/gpu/drm/msm/msm_drv.c | 48 | 
1 files changed, 42 insertions, 6 deletions
| diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c index 2e6fc185e54d..7936e8d498dd 100644 --- a/drivers/gpu/drm/msm/msm_drv.c +++ b/drivers/gpu/drm/msm/msm_drv.c @@ -58,7 +58,7 @@ static const struct drm_mode_config_helper_funcs mode_config_helper_funcs = {  };  #ifdef CONFIG_DRM_MSM_REGISTER_LOGGING -static bool reglog = false; +static bool reglog;  MODULE_PARM_DESC(reglog, "Enable register read/write logging");  module_param(reglog, bool, 0600);  #else @@ -75,7 +75,7 @@ static char *vram = "16m";  MODULE_PARM_DESC(vram, "Configure VRAM size (for devices without IOMMU/GPUMMU)");  module_param(vram, charp, 0); -bool dumpstate = false; +bool dumpstate;  MODULE_PARM_DESC(dumpstate, "Dump KMS state on errors");  module_param(dumpstate, bool, 0600); @@ -200,6 +200,35 @@ void msm_rmw(void __iomem *addr, u32 mask, u32 or)  	msm_writel(val | or, addr);  } +static enum hrtimer_restart msm_hrtimer_worktimer(struct hrtimer *t) +{ +	struct msm_hrtimer_work *work = container_of(t, +			struct msm_hrtimer_work, timer); + +	kthread_queue_work(work->worker, &work->work); + +	return HRTIMER_NORESTART; +} + +void msm_hrtimer_queue_work(struct msm_hrtimer_work *work, +			    ktime_t wakeup_time, +			    enum hrtimer_mode mode) +{ +	hrtimer_start(&work->timer, wakeup_time, mode); +} + +void msm_hrtimer_work_init(struct msm_hrtimer_work *work, +			   struct kthread_worker *worker, +			   kthread_work_func_t fn, +			   clockid_t clock_id, +			   enum hrtimer_mode mode) +{ +	hrtimer_init(&work->timer, clock_id, mode); +	work->timer.function = msm_hrtimer_worktimer; +	work->worker = worker; +	kthread_init_work(&work->work, fn); +} +  static irqreturn_t msm_irq(int irq, void *arg)  {  	struct drm_device *dev = arg; @@ -630,10 +659,11 @@ static int msm_drm_init(struct device *dev, const struct drm_driver *drv)  	if (ret)  		goto err_msm_uninit; -	ret = msm_disp_snapshot_init(ddev); -	if (ret) -		DRM_DEV_ERROR(dev, "msm_disp_snapshot_init failed ret = %d\n", ret); - +	if (kms) { +		ret = msm_disp_snapshot_init(ddev); +		if (ret) +			DRM_DEV_ERROR(dev, "msm_disp_snapshot_init failed ret = %d\n", ret); +	}  	drm_mode_config_reset(ddev);  #ifdef CONFIG_DRM_FBDEV_EMULATION @@ -682,6 +712,7 @@ static void load_gpu(struct drm_device *dev)  static int context_init(struct drm_device *dev, struct drm_file *file)  { +	static atomic_t ident = ATOMIC_INIT(0);  	struct msm_drm_private *priv = dev->dev_private;  	struct msm_file_private *ctx; @@ -689,12 +720,17 @@ static int context_init(struct drm_device *dev, struct drm_file *file)  	if (!ctx)  		return -ENOMEM; +	INIT_LIST_HEAD(&ctx->submitqueues); +	rwlock_init(&ctx->queuelock); +  	kref_init(&ctx->ref);  	msm_submitqueue_init(dev, ctx);  	ctx->aspace = msm_gpu_create_private_address_space(priv->gpu, current);  	file->driver_priv = ctx; +	ctx->seqno = atomic_inc_return(&ident); +  	return 0;  } |