Commit 4d0f62e4 authored by Rob Clark's avatar Rob Clark
Browse files

drm/msm: Stop passing vm to msm_framebuffer



The fb only deals with kms->vm, so make that explicit.  This will start
letting us refcount the # of times the fb is pinned, so we can only
unpin the vma after last user of the fb is done.  Having a single
reference count really only works if there is only a single vm.

Signed-off-by: default avatarRob Clark <robin.clark@oss.qualcomm.com>
Tested-by: default avatarAntonino Maniscalco <antomani103@gmail.com>
Reviewed-by: default avatarAntonino Maniscalco <antomani103@gmail.com>
Patchwork: https://patchwork.freedesktop.org/patch/661476/
parent 001ddc85
Loading
Loading
Loading
Loading
+3 −8
Original line number Diff line number Diff line
@@ -563,7 +563,6 @@ static void dpu_encoder_phys_wb_prepare_wb_job(struct dpu_encoder_phys *phys_enc
		struct drm_writeback_job *job)
{
	const struct msm_format *format;
	struct msm_gem_vm *vm;
	struct dpu_hw_wb_cfg *wb_cfg;
	int ret;
	struct dpu_encoder_phys_wb *wb_enc = to_dpu_encoder_phys_wb(phys_enc);
@@ -573,13 +572,12 @@ static void dpu_encoder_phys_wb_prepare_wb_job(struct dpu_encoder_phys *phys_enc

	wb_enc->wb_job = job;
	wb_enc->wb_conn = job->connector;
	vm = phys_enc->dpu_kms->base.vm;

	wb_cfg = &wb_enc->wb_cfg;

	memset(wb_cfg, 0, sizeof(struct dpu_hw_wb_cfg));

	ret = msm_framebuffer_prepare(job->fb, vm, false);
	ret = msm_framebuffer_prepare(job->fb, false);
	if (ret) {
		DPU_ERROR("prep fb failed, %d\n", ret);
		return;
@@ -593,7 +591,7 @@ static void dpu_encoder_phys_wb_prepare_wb_job(struct dpu_encoder_phys *phys_enc
		return;
	}

	dpu_format_populate_addrs(vm, job->fb, &wb_cfg->dest);
	dpu_format_populate_addrs(job->fb, &wb_cfg->dest);

	wb_cfg->dest.width = job->fb->width;
	wb_cfg->dest.height = job->fb->height;
@@ -616,14 +614,11 @@ static void dpu_encoder_phys_wb_cleanup_wb_job(struct dpu_encoder_phys *phys_enc
		struct drm_writeback_job *job)
{
	struct dpu_encoder_phys_wb *wb_enc = to_dpu_encoder_phys_wb(phys_enc);
	struct msm_gem_vm *vm;

	if (!job->fb)
		return;

	vm = phys_enc->dpu_kms->base.vm;

	msm_framebuffer_cleanup(job->fb, vm, false);
	msm_framebuffer_cleanup(job->fb, false);
	wb_enc->wb_job = NULL;
	wb_enc->wb_conn = NULL;
}
+7 −11
Original line number Diff line number Diff line
@@ -274,15 +274,14 @@ int dpu_format_populate_plane_sizes(
	return _dpu_format_populate_plane_sizes_linear(fmt, fb, layout);
}

static void _dpu_format_populate_addrs_ubwc(struct msm_gem_vm *vm,
					    struct drm_framebuffer *fb,
static void _dpu_format_populate_addrs_ubwc(struct drm_framebuffer *fb,
					    struct dpu_hw_fmt_layout *layout)
{
	const struct msm_format *fmt;
	uint32_t base_addr = 0;
	bool meta;

	base_addr = msm_framebuffer_iova(fb, vm, 0);
	base_addr = msm_framebuffer_iova(fb, 0);

	fmt = msm_framebuffer_format(fb);
	meta = MSM_FORMAT_IS_UBWC(fmt);
@@ -355,26 +354,23 @@ static void _dpu_format_populate_addrs_ubwc(struct msm_gem_vm *vm,
	}
}

static void _dpu_format_populate_addrs_linear(struct msm_gem_vm *vm,
					      struct drm_framebuffer *fb,
static void _dpu_format_populate_addrs_linear(struct drm_framebuffer *fb,
					      struct dpu_hw_fmt_layout *layout)
{
	unsigned int i;

	/* Populate addresses for simple formats here */
	for (i = 0; i < layout->num_planes; ++i)
		layout->plane_addr[i] = msm_framebuffer_iova(fb, vm, i);
		layout->plane_addr[i] = msm_framebuffer_iova(fb, i);
	}

/**
 * dpu_format_populate_addrs - populate buffer addresses based on
 *                     mmu, fb, and format found in the fb
 * @vm:                address space pointer
 * @fb:                framebuffer pointer
 * @layout:            format layout structure to populate
 */
void dpu_format_populate_addrs(struct msm_gem_vm *vm,
			       struct drm_framebuffer *fb,
void dpu_format_populate_addrs(struct drm_framebuffer *fb,
			       struct dpu_hw_fmt_layout *layout)
{
	const struct msm_format *fmt;
@@ -384,7 +380,7 @@ void dpu_format_populate_addrs(struct msm_gem_vm *vm,
	/* Populate the addresses given the fb */
	if (MSM_FORMAT_IS_UBWC(fmt) ||
			MSM_FORMAT_IS_TILE(fmt))
		_dpu_format_populate_addrs_ubwc(vm, fb, layout);
		_dpu_format_populate_addrs_ubwc(fb, layout);
	else
		_dpu_format_populate_addrs_linear(vm, fb, layout);
		_dpu_format_populate_addrs_linear(fb, layout);
}
+1 −2
Original line number Diff line number Diff line
@@ -31,8 +31,7 @@ static inline bool dpu_find_format(u32 format, const u32 *supported_formats,
	return false;
}

void dpu_format_populate_addrs(struct msm_gem_vm *vm,
			       struct drm_framebuffer *fb,
void dpu_format_populate_addrs(struct drm_framebuffer *fb,
			       struct dpu_hw_fmt_layout *layout);

int dpu_format_populate_plane_sizes(
+6 −14
Original line number Diff line number Diff line
@@ -646,7 +646,6 @@ static int dpu_plane_prepare_fb(struct drm_plane *plane,
	struct drm_framebuffer *fb = new_state->fb;
	struct dpu_plane *pdpu = to_dpu_plane(plane);
	struct dpu_plane_state *pstate = to_dpu_plane_state(new_state);
	struct dpu_kms *kms = _dpu_plane_get_kms(&pdpu->base);
	int ret;

	if (!new_state->fb)
@@ -654,9 +653,6 @@ static int dpu_plane_prepare_fb(struct drm_plane *plane,

	DPU_DEBUG_PLANE(pdpu, "FB[%u]\n", fb->base.id);

	/* cache vm */
	pstate->vm = kms->base.vm;

	/*
	 * TODO: Need to sort out the msm_framebuffer_prepare() call below so
	 *       we can use msm_atomic_prepare_fb() instead of doing the
@@ -664,14 +660,11 @@ static int dpu_plane_prepare_fb(struct drm_plane *plane,
	 */
	drm_gem_plane_helper_prepare_fb(plane, new_state);

	if (pstate->vm) {
		ret = msm_framebuffer_prepare(new_state->fb,
				pstate->vm, pstate->needs_dirtyfb);
	ret = msm_framebuffer_prepare(new_state->fb, pstate->needs_dirtyfb);
	if (ret) {
		DPU_ERROR("failed to prepare framebuffer\n");
		return ret;
	}
	}

	return 0;
}
@@ -689,8 +682,7 @@ static void dpu_plane_cleanup_fb(struct drm_plane *plane,

	DPU_DEBUG_PLANE(pdpu, "FB[%u]\n", old_state->fb->base.id);

	msm_framebuffer_cleanup(old_state->fb, old_pstate->vm,
				old_pstate->needs_dirtyfb);
	msm_framebuffer_cleanup(old_state->fb, old_pstate->needs_dirtyfb);
}

static int dpu_plane_check_inline_rotation(struct dpu_plane *pdpu,
@@ -1457,7 +1449,7 @@ static void dpu_plane_sspp_atomic_update(struct drm_plane *plane,
	pstate->needs_qos_remap |= (is_rt_pipe != pdpu->is_rt_pipe);
	pdpu->is_rt_pipe = is_rt_pipe;

	dpu_format_populate_addrs(pstate->vm, new_state->fb, &pstate->layout);
	dpu_format_populate_addrs(new_state->fb, &pstate->layout);

	DPU_DEBUG_PLANE(pdpu, "FB[%u] " DRM_RECT_FP_FMT "->crtc%u " DRM_RECT_FMT
			", %p4cc ubwc %d\n", fb->base.id, DRM_RECT_FP_ARG(&state->src),
+0 −2
Original line number Diff line number Diff line
@@ -17,7 +17,6 @@
/**
 * struct dpu_plane_state: Define dpu extension of drm plane state object
 * @base:	base drm plane state object
 * @vm:	pointer to address space for input/output buffers
 * @pipe:	software pipe description
 * @r_pipe:	software pipe description of the second pipe
 * @pipe_cfg:	software pipe configuration
@@ -34,7 +33,6 @@
 */
struct dpu_plane_state {
	struct drm_plane_state base;
	struct msm_gem_vm *vm;
	struct dpu_sw_pipe pipe;
	struct dpu_sw_pipe r_pipe;
	struct dpu_sw_pipe_cfg pipe_cfg;
Loading