diff options
Diffstat (limited to 'drivers/gpu/drm/vc4')
| -rw-r--r-- | drivers/gpu/drm/vc4/vc4_bo.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/vc4/vc4_drv.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/vc4/vc4_drv.h | 9 | ||||
| -rw-r--r-- | drivers/gpu/drm/vc4/vc4_gem.c | 18 | ||||
| -rw-r--r-- | drivers/gpu/drm/vc4/vc4_irq.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/vc4/vc4_validate_shaders.c | 10 | 
6 files changed, 33 insertions, 16 deletions
diff --git a/drivers/gpu/drm/vc4/vc4_bo.c b/drivers/gpu/drm/vc4/vc4_bo.c index 59adcf8532dd..3f6704cf6608 100644 --- a/drivers/gpu/drm/vc4/vc4_bo.c +++ b/drivers/gpu/drm/vc4/vc4_bo.c @@ -144,7 +144,7 @@ static struct list_head *vc4_get_cache_list_for_size(struct drm_device *dev,  	return &vc4->bo_cache.size_list[page_index];  } -void vc4_bo_cache_purge(struct drm_device *dev) +static void vc4_bo_cache_purge(struct drm_device *dev)  {  	struct vc4_dev *vc4 = to_vc4_dev(dev); diff --git a/drivers/gpu/drm/vc4/vc4_drv.c b/drivers/gpu/drm/vc4/vc4_drv.c index 8b42d31a7f0e..9ecef9385491 100644 --- a/drivers/gpu/drm/vc4/vc4_drv.c +++ b/drivers/gpu/drm/vc4/vc4_drv.c @@ -57,21 +57,21 @@ static int vc4_get_param_ioctl(struct drm_device *dev, void *data,  	switch (args->param) {  	case DRM_VC4_PARAM_V3D_IDENT0:  		ret = pm_runtime_get_sync(&vc4->v3d->pdev->dev); -		if (ret) +		if (ret < 0)  			return ret;  		args->value = V3D_READ(V3D_IDENT0);  		pm_runtime_put(&vc4->v3d->pdev->dev);  		break;  	case DRM_VC4_PARAM_V3D_IDENT1:  		ret = pm_runtime_get_sync(&vc4->v3d->pdev->dev); -		if (ret) +		if (ret < 0)  			return ret;  		args->value = V3D_READ(V3D_IDENT1);  		pm_runtime_put(&vc4->v3d->pdev->dev);  		break;  	case DRM_VC4_PARAM_V3D_IDENT2:  		ret = pm_runtime_get_sync(&vc4->v3d->pdev->dev); -		if (ret) +		if (ret < 0)  			return ret;  		args->value = V3D_READ(V3D_IDENT2);  		pm_runtime_put(&vc4->v3d->pdev->dev); diff --git a/drivers/gpu/drm/vc4/vc4_drv.h b/drivers/gpu/drm/vc4/vc4_drv.h index 489e3de0c050..428e24919ef1 100644 --- a/drivers/gpu/drm/vc4/vc4_drv.h +++ b/drivers/gpu/drm/vc4/vc4_drv.h @@ -321,6 +321,15 @@ vc4_first_render_job(struct vc4_dev *vc4)  				struct vc4_exec_info, head);  } +static inline struct vc4_exec_info * +vc4_last_render_job(struct vc4_dev *vc4) +{ +	if (list_empty(&vc4->render_job_list)) +		return NULL; +	return list_last_entry(&vc4->render_job_list, +			       struct vc4_exec_info, head); +} +  /**   * struct vc4_texture_sample_info - saves the offsets into the UBO for texture   * setup parameters. diff --git a/drivers/gpu/drm/vc4/vc4_gem.c b/drivers/gpu/drm/vc4/vc4_gem.c index 6155e8aca1c6..b262c5c26f10 100644 --- a/drivers/gpu/drm/vc4/vc4_gem.c +++ b/drivers/gpu/drm/vc4/vc4_gem.c @@ -534,8 +534,8 @@ vc4_cl_lookup_bos(struct drm_device *dev,  		return -EINVAL;  	} -	exec->bo = kcalloc(exec->bo_count, sizeof(struct drm_gem_cma_object *), -			   GFP_KERNEL); +	exec->bo = drm_calloc_large(exec->bo_count, +				    sizeof(struct drm_gem_cma_object *));  	if (!exec->bo) {  		DRM_ERROR("Failed to allocate validated BO pointers\n");  		return -ENOMEM; @@ -572,8 +572,8 @@ vc4_cl_lookup_bos(struct drm_device *dev,  	spin_unlock(&file_priv->table_lock);  fail: -	kfree(handles); -	return 0; +	drm_free_large(handles); +	return ret;  }  static int @@ -608,7 +608,7 @@ vc4_get_bcl(struct drm_device *dev, struct vc4_exec_info *exec)  	 * read the contents back for validation, and I think the  	 * bo->vaddr is uncached access.  	 */ -	temp = kmalloc(temp_size, GFP_KERNEL); +	temp = drm_malloc_ab(temp_size, 1);  	if (!temp) {  		DRM_ERROR("Failed to allocate storage for copying "  			  "in bin/render CLs.\n"); @@ -675,7 +675,7 @@ vc4_get_bcl(struct drm_device *dev, struct vc4_exec_info *exec)  	ret = vc4_validate_shader_recs(dev, exec);  fail: -	kfree(temp); +	drm_free_large(temp);  	return ret;  } @@ -688,7 +688,7 @@ vc4_complete_exec(struct drm_device *dev, struct vc4_exec_info *exec)  	if (exec->bo) {  		for (i = 0; i < exec->bo_count; i++)  			drm_gem_object_unreference_unlocked(&exec->bo[i]->base); -		kfree(exec->bo); +		drm_free_large(exec->bo);  	}  	while (!list_empty(&exec->unref_list)) { @@ -942,8 +942,8 @@ vc4_gem_destroy(struct drm_device *dev)  		vc4->overflow_mem = NULL;  	} -	vc4_bo_cache_destroy(dev); -  	if (vc4->hang_state)  		vc4_free_hang_state(dev, vc4->hang_state); + +	vc4_bo_cache_destroy(dev);  } diff --git a/drivers/gpu/drm/vc4/vc4_irq.c b/drivers/gpu/drm/vc4/vc4_irq.c index b0104a346a74..094bc6a475c1 100644 --- a/drivers/gpu/drm/vc4/vc4_irq.c +++ b/drivers/gpu/drm/vc4/vc4_irq.c @@ -83,8 +83,10 @@ vc4_overflow_mem_work(struct work_struct *work)  		spin_lock_irqsave(&vc4->job_lock, irqflags);  		current_exec = vc4_first_bin_job(vc4); +		if (!current_exec) +			current_exec = vc4_last_render_job(vc4);  		if (current_exec) { -			vc4->overflow_mem->seqno = vc4->finished_seqno + 1; +			vc4->overflow_mem->seqno = current_exec->seqno;  			list_add_tail(&vc4->overflow_mem->unref_head,  				      ¤t_exec->unref_list);  			vc4->overflow_mem = NULL; diff --git a/drivers/gpu/drm/vc4/vc4_validate_shaders.c b/drivers/gpu/drm/vc4/vc4_validate_shaders.c index 46527e989ce3..2543cf5b8b51 100644 --- a/drivers/gpu/drm/vc4/vc4_validate_shaders.c +++ b/drivers/gpu/drm/vc4/vc4_validate_shaders.c @@ -309,8 +309,14 @@ validate_uniform_address_write(struct vc4_validated_shader_info *validated_shade  	 * of uniforms on each side.  However, this scheme is easy to  	 * validate so it's all we allow for now.  	 */ - -	if (QPU_GET_FIELD(inst, QPU_SIG) != QPU_SIG_NONE) { +	switch (QPU_GET_FIELD(inst, QPU_SIG)) { +	case QPU_SIG_NONE: +	case QPU_SIG_SCOREBOARD_UNLOCK: +	case QPU_SIG_COLOR_LOAD: +	case QPU_SIG_LOAD_TMU0: +	case QPU_SIG_LOAD_TMU1: +		break; +	default:  		DRM_ERROR("uniforms address change must be "  			  "normal math\n");  		return false;  | 
