Commit eaab0130 authored by Russell King's avatar Russell King
Browse files

drm/armada: store plane in armada_plane_work



Store the plane in the armada_plane_work structure rather than passing
it around; it doesn't get used very much in the work structures, so
passing it around is a needless expense.

Signed-off-by: default avatarRussell King <rmk+kernel@armlinux.org.uk>
parent 901bb889
Loading
Loading
Loading
Loading
+11 −16
Original line number Diff line number Diff line
@@ -224,7 +224,7 @@ static void armada_drm_plane_work_run(struct armada_crtc *dcrtc,

	/* Handle any pending frame work. */
	if (work) {
		work->fn(dcrtc, dplane, work);
		work->fn(dcrtc, work);
		drm_crtc_vblank_put(&dcrtc->crtc);
	}

@@ -232,8 +232,9 @@ static void armada_drm_plane_work_run(struct armada_crtc *dcrtc,
}

int armada_drm_plane_work_queue(struct armada_crtc *dcrtc,
	struct armada_plane *plane, struct armada_plane_work *work)
	struct armada_plane_work *work)
{
	struct armada_plane *plane = drm_to_armada_plane(work->plane);
	int ret;

	ret = drm_crtc_vblank_get(&dcrtc->crtc);
@@ -263,16 +264,8 @@ void armada_drm_plane_work_cancel(struct armada_crtc *dcrtc,
		drm_crtc_vblank_put(&dcrtc->crtc);
}

static int armada_drm_crtc_queue_frame_work(struct armada_crtc *dcrtc,
	struct armada_frame_work *work)
{
	struct armada_plane *plane = drm_to_armada_plane(dcrtc->crtc.primary);

	return armada_drm_plane_work_queue(dcrtc, plane, &work->work);
}

static void armada_drm_crtc_complete_frame_work(struct armada_crtc *dcrtc,
	struct armada_plane *plane, struct armada_plane_work *work)
	struct armada_plane_work *work)
{
	struct armada_frame_work *fwork = container_of(work, struct armada_frame_work, work);
	struct drm_device *dev = dcrtc->crtc.dev;
@@ -293,7 +286,8 @@ static void armada_drm_crtc_complete_frame_work(struct armada_crtc *dcrtc,
	kfree(fwork);
}

static struct armada_frame_work *armada_drm_crtc_alloc_frame_work(void)
static struct armada_frame_work *
armada_drm_crtc_alloc_frame_work(struct drm_plane *plane)
{
	struct armada_frame_work *work;
	int i = 0;
@@ -302,6 +296,7 @@ static struct armada_frame_work *armada_drm_crtc_alloc_frame_work(void)
	if (!work)
		return NULL;

	work->work.plane = plane;
	work->work.fn = armada_drm_crtc_complete_frame_work;
	armada_reg_queue_end(work->regs, i);

@@ -322,11 +317,11 @@ static void armada_drm_crtc_finish_fb(struct armada_crtc *dcrtc,
		return;
	}

	work = armada_drm_crtc_alloc_frame_work();
	work = armada_drm_crtc_alloc_frame_work(dcrtc->crtc.primary);
	if (work) {
		work->old_fb = fb;

		if (armada_drm_crtc_queue_frame_work(dcrtc, work) == 0)
		if (armada_drm_plane_work_queue(dcrtc, work) == 0)
			return;

		kfree(work);
@@ -1044,7 +1039,7 @@ static int armada_drm_crtc_page_flip(struct drm_crtc *crtc,
	if (fb->format != crtc->primary->fb->format)
		return -EINVAL;

	work = armada_drm_crtc_alloc_frame_work();
	work = armada_drm_crtc_alloc_frame_work(dcrtc->crtc.primary);
	if (!work)
		return -ENOMEM;

@@ -1061,7 +1056,7 @@ static int armada_drm_crtc_page_flip(struct drm_crtc *crtc,
	 */
	drm_framebuffer_get(fb);

	ret = armada_drm_crtc_queue_frame_work(dcrtc, work);
	ret = armada_drm_plane_work_queue(dcrtc, work);
	if (ret) {
		/* Undo our reference above */
		drm_framebuffer_put(fb);
+3 −4
Original line number Diff line number Diff line
@@ -36,9 +36,8 @@ struct armada_plane;
struct armada_variant;

struct armada_plane_work {
	void			(*fn)(struct armada_crtc *,
				      struct armada_plane *,
				      struct armada_plane_work *);
	void (*fn)(struct armada_crtc *, struct armada_plane_work *);
	struct drm_plane *plane;
};

struct armada_plane_state {
@@ -60,7 +59,7 @@ struct armada_plane {

int armada_drm_plane_init(struct armada_plane *plane);
int armada_drm_plane_work_queue(struct armada_crtc *dcrtc,
	struct armada_plane *plane, struct armada_plane_work *work);
	struct armada_plane_work *work);
int armada_drm_plane_work_wait(struct armada_plane *plane, long timeout);
void armada_drm_plane_work_cancel(struct armada_crtc *dcrtc,
	struct armada_plane *plane);
+7 −5
Original line number Diff line number Diff line
@@ -80,11 +80,12 @@ static void armada_ovl_retire_fb(struct armada_ovl_plane *dplane,

/* === Plane support === */
static void armada_ovl_plane_work(struct armada_crtc *dcrtc,
	struct armada_plane *plane, struct armada_plane_work *work)
	struct armada_plane_work *work)
{
	struct armada_ovl_plane *dplane = container_of(plane, struct armada_ovl_plane, base);
	struct armada_ovl_plane *dplane = container_of(work->plane,
					struct armada_ovl_plane, base.base);

	trace_armada_ovl_plane_work(&dcrtc->crtc, &plane->base);
	trace_armada_ovl_plane_work(&dcrtc->crtc, work->plane);

	armada_drm_crtc_update_regs(dcrtc, dplane->vbl.regs);
	armada_ovl_retire_fb(dplane, NULL);
@@ -252,8 +253,8 @@ armada_ovl_plane_update(struct drm_plane *plane, struct drm_crtc *crtc,
	}
	if (idx) {
		armada_reg_queue_end(dplane->vbl.regs, idx);
		armada_drm_plane_work_queue(dcrtc, &dplane->base,
					    &dplane->vbl.work);
		/* Queue it for update on the next interrupt if we are enabled */
		armada_drm_plane_work_queue(dcrtc, &dplane->vbl.work);
	}
	return 0;
}
@@ -454,6 +455,7 @@ int armada_overlay_plane_create(struct drm_device *dev, unsigned long crtcs)
		return ret;
	}

	dplane->vbl.work.plane = &dplane->base.base;
	dplane->vbl.work.fn = armada_ovl_plane_work;

	ret = drm_universal_plane_init(dev, &dplane->base.base, crtcs,