diff options
Diffstat (limited to 'drivers/gpu/drm/msm')
| -rw-r--r-- | drivers/gpu/drm/msm/adreno/a6xx_gmu.c | 5 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/adreno/adreno_gpu.c | 7 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 14 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/dsi/phy/dsi_phy.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/dsi/phy/dsi_phy_7nm.c | 18 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/msm_gem.c | 10 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/msm_gem_submit.c | 9 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/msm_gem_vma.c | 8 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/msm_gpu.h | 11 | ||||
| -rw-r--r-- | drivers/gpu/drm/msm/msm_iommu.c | 5 | 
14 files changed, 58 insertions, 42 deletions
diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c index fc62fef2fed8..4e6dc16e4a4c 100644 --- a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c +++ b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c @@ -780,6 +780,9 @@ static bool fw_block_mem(struct a6xx_gmu_bo *bo, const struct block_header *blk)  	return true;  } +#define NEXT_BLK(blk) \ +	((const struct block_header *)((const char *)(blk) + sizeof(*(blk)) + (blk)->size)) +  static int a6xx_gmu_fw_load(struct a6xx_gmu *gmu)  {  	struct a6xx_gpu *a6xx_gpu = container_of(gmu, struct a6xx_gpu, gmu); @@ -811,7 +814,7 @@ static int a6xx_gmu_fw_load(struct a6xx_gmu *gmu)  	for (blk = (const struct block_header *) fw_image->data;  	     (const u8*) blk < fw_image->data + fw_image->size; -	     blk = (const struct block_header *) &blk->data[blk->size >> 2]) { +	     blk = NEXT_BLK(blk)) {  		if (blk->size == 0)  			continue; diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.c b/drivers/gpu/drm/msm/adreno/adreno_gpu.c index afaa3cfefd35..4b5a4edd0702 100644 --- a/drivers/gpu/drm/msm/adreno/adreno_gpu.c +++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.c @@ -348,13 +348,6 @@ int adreno_fault_handler(struct msm_gpu *gpu, unsigned long iova, int flags,  	return 0;  } -static bool -adreno_smmu_has_prr(struct msm_gpu *gpu) -{ -	struct adreno_smmu_priv *adreno_smmu = dev_get_drvdata(&gpu->pdev->dev); -	return adreno_smmu && adreno_smmu->set_prr_addr; -} -  int adreno_get_param(struct msm_gpu *gpu, struct msm_context *ctx,  		     uint32_t param, uint64_t *value, uint32_t *len)  { diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c index 4b970a59deaf..2f8156051d9b 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c @@ -1545,6 +1545,9 @@ static enum drm_mode_status dpu_crtc_mode_valid(struct drm_crtc *crtc,  	adjusted_mode_clk = dpu_core_perf_adjusted_mode_clk(mode->clock,  							    dpu_kms->perf.perf_cfg); +	if (dpu_kms->catalog->caps->has_3d_merge) +		adjusted_mode_clk /= 2; +  	/*  	 * The given mode, adjusted for the perf clock factor, should not exceed  	 * the max core clock rate diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c index 6641455c4ec6..9f8d1bba9139 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c @@ -267,8 +267,8 @@ static const u32 wb2_formats_rgb_yuv[] = {  		.base = 0x200, .len = 0xa0,}, \  	.csc_blk = {.name = "csc", \  		.base = 0x320, .len = 0x100,}, \ -	.format_list = plane_formats_yuv, \ -	.num_formats = ARRAY_SIZE(plane_formats_yuv), \ +	.format_list = plane_formats, \ +	.num_formats = ARRAY_SIZE(plane_formats), \  	.rotation_cfg = NULL, \  	} diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c index f54cf0faa1c7..905524ceeb1f 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c @@ -500,13 +500,15 @@ static void _dpu_plane_setup_pixel_ext(struct dpu_hw_scaler3_cfg *scale_cfg,  	int i;  	for (i = 0; i < DPU_MAX_PLANES; i++) { +		uint32_t w = src_w, h = src_h; +  		if (i == DPU_SSPP_COMP_1_2 || i == DPU_SSPP_COMP_2) { -			src_w /= chroma_subsmpl_h; -			src_h /= chroma_subsmpl_v; +			w /= chroma_subsmpl_h; +			h /= chroma_subsmpl_v;  		} -		pixel_ext->num_ext_pxls_top[i] = src_h; -		pixel_ext->num_ext_pxls_left[i] = src_w; +		pixel_ext->num_ext_pxls_top[i] = h; +		pixel_ext->num_ext_pxls_left[i] = w;  	}  } @@ -740,7 +742,7 @@ static int dpu_plane_atomic_check_pipe(struct dpu_plane *pdpu,  	 * We already have verified scaling against platform limitations.  	 * Now check if the SSPP supports scaling at all.  	 */ -	if (!sblk->scaler_blk.len && +	if (!(sblk->scaler_blk.len && pipe->sspp->ops.setup_scaler) &&  	    ((drm_rect_width(&new_plane_state->src) >> 16 !=  	      drm_rect_width(&new_plane_state->dst)) ||  	     (drm_rect_height(&new_plane_state->src) >> 16 != @@ -1278,7 +1280,7 @@ int dpu_assign_plane_resources(struct dpu_global_state *global_state,  							     state, plane_state,  							     prev_adjacent_plane_state);  		if (ret) -			break; +			return ret;  		prev_adjacent_plane_state = plane_state;  	} diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c index 2c77c74fac0f..d9c3b0a1d091 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c @@ -842,7 +842,7 @@ struct dpu_hw_sspp *dpu_rm_reserve_sspp(struct dpu_rm *rm,  	if (!reqs->scale && !reqs->yuv)  		hw_sspp = dpu_rm_try_sspp(rm, global_state, crtc, reqs, SSPP_TYPE_DMA); -	if (!hw_sspp && reqs->scale) +	if (!hw_sspp && !reqs->yuv)  		hw_sspp = dpu_rm_try_sspp(rm, global_state, crtc, reqs, SSPP_TYPE_RGB);  	if (!hw_sspp)  		hw_sspp = dpu_rm_try_sspp(rm, global_state, crtc, reqs, SSPP_TYPE_VIG); diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c index cd73468e369a..7545c0293efb 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_writeback.c @@ -72,6 +72,9 @@ static int dpu_wb_conn_atomic_check(struct drm_connector *connector,  		DPU_ERROR("invalid fb w=%d, maxlinewidth=%u\n",  			  fb->width, dpu_wb_conn->maxlinewidth);  		return -EINVAL; +	} else if (fb->modifier != DRM_FORMAT_MOD_LINEAR) { +		DPU_ERROR("unsupported fb modifier:%#llx\n", fb->modifier); +		return -EINVAL;  	}  	return drm_atomic_helper_check_wb_connector_state(conn_state->connector, conn_state->state); diff --git a/drivers/gpu/drm/msm/dsi/phy/dsi_phy.h b/drivers/gpu/drm/msm/dsi/phy/dsi_phy.h index e391505fdaf0..3cbf08231492 100644 --- a/drivers/gpu/drm/msm/dsi/phy/dsi_phy.h +++ b/drivers/gpu/drm/msm/dsi/phy/dsi_phy.h @@ -109,7 +109,6 @@ struct msm_dsi_phy {  	struct msm_dsi_dphy_timing timing;  	const struct msm_dsi_phy_cfg *cfg;  	void *tuning_cfg; -	void *pll_data;  	enum msm_dsi_phy_usecase usecase;  	bool regulator_ldo_mode; diff --git a/drivers/gpu/drm/msm/dsi/phy/dsi_phy_7nm.c b/drivers/gpu/drm/msm/dsi/phy/dsi_phy_7nm.c index 32f06edd21a9..c5e1d2016bcc 100644 --- a/drivers/gpu/drm/msm/dsi/phy/dsi_phy_7nm.c +++ b/drivers/gpu/drm/msm/dsi/phy/dsi_phy_7nm.c @@ -426,11 +426,8 @@ static void dsi_pll_enable_pll_bias(struct dsi_pll_7nm *pll)  	u32 data;  	spin_lock_irqsave(&pll->pll_enable_lock, flags); -	if (pll->pll_enable_cnt++) { -		spin_unlock_irqrestore(&pll->pll_enable_lock, flags); -		WARN_ON(pll->pll_enable_cnt == INT_MAX); -		return; -	} +	pll->pll_enable_cnt++; +	WARN_ON(pll->pll_enable_cnt == INT_MAX);  	data = readl(pll->phy->base + REG_DSI_7nm_PHY_CMN_CTRL_0);  	data |= DSI_7nm_PHY_CMN_CTRL_0_PLL_SHUTDOWNB; @@ -876,7 +873,6 @@ static int dsi_pll_7nm_init(struct msm_dsi_phy *phy)  	spin_lock_init(&pll_7nm->pll_enable_lock);  	pll_7nm->phy = phy; -	phy->pll_data = pll_7nm;  	ret = pll_7nm_register(pll_7nm, phy->provided_clocks->hws);  	if (ret) { @@ -965,10 +961,8 @@ static int dsi_7nm_phy_enable(struct msm_dsi_phy *phy,  	u32 const delay_us = 5;  	u32 const timeout_us = 1000;  	struct msm_dsi_dphy_timing *timing = &phy->timing; -	struct dsi_pll_7nm *pll = phy->pll_data;  	void __iomem *base = phy->base;  	bool less_than_1500_mhz; -	unsigned long flags;  	u32 vreg_ctrl_0, vreg_ctrl_1, lane_ctrl0;  	u32 glbl_pemph_ctrl_0;  	u32 glbl_str_swi_cal_sel_ctrl, glbl_hstx_str_ctrl_0; @@ -1090,13 +1084,10 @@ static int dsi_7nm_phy_enable(struct msm_dsi_phy *phy,  		glbl_rescode_bot_ctrl = 0x3c;  	} -	spin_lock_irqsave(&pll->pll_enable_lock, flags); -	pll->pll_enable_cnt = 1;  	/* de-assert digital and pll power down */  	data = DSI_7nm_PHY_CMN_CTRL_0_DIGTOP_PWRDN_B |  	       DSI_7nm_PHY_CMN_CTRL_0_PLL_SHUTDOWNB;  	writel(data, base + REG_DSI_7nm_PHY_CMN_CTRL_0); -	spin_unlock_irqrestore(&pll->pll_enable_lock, flags);  	/* Assert PLL core reset */  	writel(0x00, base + REG_DSI_7nm_PHY_CMN_PLL_CNTRL); @@ -1209,9 +1200,7 @@ static bool dsi_7nm_set_continuous_clock(struct msm_dsi_phy *phy, bool enable)  static void dsi_7nm_phy_disable(struct msm_dsi_phy *phy)  { -	struct dsi_pll_7nm *pll = phy->pll_data;  	void __iomem *base = phy->base; -	unsigned long flags;  	u32 data;  	DBG(""); @@ -1238,11 +1227,8 @@ static void dsi_7nm_phy_disable(struct msm_dsi_phy *phy)  	writel(data, base + REG_DSI_7nm_PHY_CMN_CTRL_0);  	writel(0, base + REG_DSI_7nm_PHY_CMN_LANE_CTRL0); -	spin_lock_irqsave(&pll->pll_enable_lock, flags); -	pll->pll_enable_cnt = 0;  	/* Turn off all PHY blocks */  	writel(0x00, base + REG_DSI_7nm_PHY_CMN_CTRL_0); -	spin_unlock_irqrestore(&pll->pll_enable_lock, flags);  	/* make sure phy is turned off */  	wmb(); diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c index 07d8cdd6bb2e..9f7fbe577abb 100644 --- a/drivers/gpu/drm/msm/msm_gem.c +++ b/drivers/gpu/drm/msm/msm_gem.c @@ -1120,12 +1120,16 @@ static void msm_gem_free_object(struct drm_gem_object *obj)  		put_pages(obj);  	} -	if (obj->resv != &obj->_resv) { +	/* +	 * In error paths, we could end up here before msm_gem_new_handle() +	 * has changed obj->resv to point to the shared resv.  In this case, +	 * we don't want to drop a ref to the shared r_obj that we haven't +	 * taken yet. +	 */ +	if ((msm_obj->flags & MSM_BO_NO_SHARE) && (obj->resv != &obj->_resv)) {  		struct drm_gem_object *r_obj =  			container_of(obj->resv, struct drm_gem_object, _resv); -		WARN_ON(!(msm_obj->flags & MSM_BO_NO_SHARE)); -  		/* Drop reference we hold to shared resv obj: */  		drm_gem_object_put(r_obj);  	} diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c b/drivers/gpu/drm/msm/msm_gem_submit.c index 3ab3b27134f9..75d9f3574370 100644 --- a/drivers/gpu/drm/msm/msm_gem_submit.c +++ b/drivers/gpu/drm/msm/msm_gem_submit.c @@ -414,6 +414,11 @@ static void submit_attach_object_fences(struct msm_gem_submit *submit)  					 submit->user_fence,  					 DMA_RESV_USAGE_BOOKKEEP,  					 DMA_RESV_USAGE_BOOKKEEP); + +		last_fence = vm->last_fence; +		vm->last_fence = dma_fence_unwrap_merge(submit->user_fence, last_fence); +		dma_fence_put(last_fence); +  		return;  	} @@ -427,10 +432,6 @@ static void submit_attach_object_fences(struct msm_gem_submit *submit)  			dma_resv_add_fence(obj->resv, submit->user_fence,  					   DMA_RESV_USAGE_READ);  	} - -	last_fence = vm->last_fence; -	vm->last_fence = dma_fence_unwrap_merge(submit->user_fence, last_fence); -	dma_fence_put(last_fence);  }  static int submit_bo(struct msm_gem_submit *submit, uint32_t idx, diff --git a/drivers/gpu/drm/msm/msm_gem_vma.c b/drivers/gpu/drm/msm/msm_gem_vma.c index 8316af1723c2..89a95977f41e 100644 --- a/drivers/gpu/drm/msm/msm_gem_vma.c +++ b/drivers/gpu/drm/msm/msm_gem_vma.c @@ -971,6 +971,7 @@ static int  lookup_op(struct msm_vm_bind_job *job, const struct drm_msm_vm_bind_op *op)  {  	struct drm_device *dev = job->vm->drm; +	struct msm_drm_private *priv = dev->dev_private;  	int i = job->nr_ops++;  	int ret = 0; @@ -1017,6 +1018,11 @@ lookup_op(struct msm_vm_bind_job *job, const struct drm_msm_vm_bind_op *op)  		break;  	} +	if ((op->op == MSM_VM_BIND_OP_MAP_NULL) && +	    !adreno_smmu_has_prr(priv->gpu)) { +		ret = UERR(EINVAL, dev, "PRR not supported\n"); +	} +  	return ret;  } @@ -1421,7 +1427,7 @@ msm_ioctl_vm_bind(struct drm_device *dev, void *data, struct drm_file *file)  	 * Maybe we could allow just UNMAP ops?  OTOH userspace should just  	 * immediately close the device file and all will be torn down.  	 */ -	if (to_msm_vm(ctx->vm)->unusable) +	if (to_msm_vm(msm_context_vm(dev, ctx))->unusable)  		return UERR(EPIPE, dev, "context is unusable");  	/* diff --git a/drivers/gpu/drm/msm/msm_gpu.h b/drivers/gpu/drm/msm/msm_gpu.h index a597f2bee30b..2894fc118485 100644 --- a/drivers/gpu/drm/msm/msm_gpu.h +++ b/drivers/gpu/drm/msm/msm_gpu.h @@ -299,6 +299,17 @@ static inline struct msm_gpu *dev_to_gpu(struct device *dev)  	return container_of(adreno_smmu, struct msm_gpu, adreno_smmu);  } +static inline bool +adreno_smmu_has_prr(struct msm_gpu *gpu) +{ +	struct adreno_smmu_priv *adreno_smmu = dev_get_drvdata(&gpu->pdev->dev); + +	if (!adreno_smmu) +		return false; + +	return adreno_smmu && adreno_smmu->set_prr_addr; +} +  /* It turns out that all targets use the same ringbuffer size */  #define MSM_GPU_RINGBUFFER_SZ SZ_32K  #define MSM_GPU_RINGBUFFER_BLKSIZE 32 diff --git a/drivers/gpu/drm/msm/msm_iommu.c b/drivers/gpu/drm/msm/msm_iommu.c index 0e18619f96cb..a188617653e8 100644 --- a/drivers/gpu/drm/msm/msm_iommu.c +++ b/drivers/gpu/drm/msm/msm_iommu.c @@ -338,6 +338,8 @@ msm_iommu_pagetable_prealloc_allocate(struct msm_mmu *mmu, struct msm_mmu_preall  	ret = kmem_cache_alloc_bulk(pt_cache, GFP_KERNEL, p->count, p->pages);  	if (ret != p->count) { +		kfree(p->pages); +		p->pages = NULL;  		p->count = ret;  		return -ENOMEM;  	} @@ -351,6 +353,9 @@ msm_iommu_pagetable_prealloc_cleanup(struct msm_mmu *mmu, struct msm_mmu_preallo  	struct kmem_cache *pt_cache = get_pt_cache(mmu);  	uint32_t remaining_pt_count = p->count - p->ptr; +	if (!p->pages) +		return; +  	if (p->count > 0)  		trace_msm_mmu_prealloc_cleanup(p->count, remaining_pt_count);  | 
