Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8cbc5caf authored by Brian Starkey's avatar Brian Starkey Committed by Liviu Dudau
Browse files

drm: mali-dp: Add writeback connector



Mali-DP has a memory writeback engine which can be used to write the
composition result to a memory buffer. Expose this functionality as a
DRM writeback connector on supported hardware.

Changes since v1:
 Daniel Vetter:
 - Don't require a modeset when writeback routing changes
 - Make writeback connector always disconnected

Changes since v2:
 - Rebase onto new drm_writeback_connector
 - Add reset callback, allocating subclassed state
 Daniel Vetter:
 - Squash out-fence support into this commit
 Gustavo Padovan:
 - Don't signal fence directly from driver (and drop malidp_mw_job)

Changes since v3:
 - Modifications to fit with Mali-DP commit tail changes

Signed-off-by: default avatarBrian Starkey <brian.starkey@arm.com>
[rebased and fixed conflicts]
Signed-off-by: default avatarMihail Atanassov <mihail.atanassov@arm.com>
Signed-off-by: default avatarLiviu Dudau <liviu.dudau@arm.com>
parent 09368e32
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
hdlcd-y := hdlcd_drv.o hdlcd_crtc.o
hdlcd-y := hdlcd_drv.o hdlcd_crtc.o
obj-$(CONFIG_DRM_HDLCD)	+= hdlcd.o
obj-$(CONFIG_DRM_HDLCD)	+= hdlcd.o
mali-dp-y := malidp_drv.o malidp_hw.o malidp_planes.o malidp_crtc.o
mali-dp-y := malidp_drv.o malidp_hw.o malidp_planes.o malidp_crtc.o
mali-dp-y += malidp_mw.o
obj-$(CONFIG_DRM_MALI_DISPLAY)	+= mali-dp.o
obj-$(CONFIG_DRM_MALI_DISPLAY)	+= mali-dp.o
+10 −0
Original line number Original line Diff line number Diff line
@@ -411,6 +411,16 @@ static int malidp_crtc_atomic_check(struct drm_crtc *crtc,
		}
		}
	}
	}


	/* If only the writeback routing has changed, we don't need a modeset */
	if (state->connectors_changed) {
		u32 old_mask = crtc->state->connector_mask;
		u32 new_mask = state->connector_mask;

		if ((old_mask ^ new_mask) ==
		    (1 << drm_connector_index(&malidp->mw_connector.base)))
			state->connectors_changed = false;
	}

	ret = malidp_crtc_atomic_check_gamma(crtc, state);
	ret = malidp_crtc_atomic_check_gamma(crtc, state);
	ret = ret ? ret : malidp_crtc_atomic_check_ctm(crtc, state);
	ret = ret ? ret : malidp_crtc_atomic_check_ctm(crtc, state);
	ret = ret ? ret : malidp_crtc_atomic_check_scaling(crtc, state);
	ret = ret ? ret : malidp_crtc_atomic_check_scaling(crtc, state);
+14 −5
Original line number Original line Diff line number Diff line
@@ -31,6 +31,7 @@
#include <drm/drm_of.h>
#include <drm/drm_of.h>


#include "malidp_drv.h"
#include "malidp_drv.h"
#include "malidp_mw.h"
#include "malidp_regs.h"
#include "malidp_regs.h"
#include "malidp_hw.h"
#include "malidp_hw.h"


@@ -238,7 +239,9 @@ static void malidp_atomic_commit_tail(struct drm_atomic_state *state)
		malidp_atomic_commit_se_config(crtc, old_crtc_state);
		malidp_atomic_commit_se_config(crtc, old_crtc_state);
	}
	}


	drm_atomic_helper_commit_planes(drm, state, 0);
	drm_atomic_helper_commit_planes(drm, state, DRM_PLANE_COMMIT_ACTIVE_ONLY);

	malidp_mw_atomic_commit(drm, state);


	drm_atomic_helper_commit_modeset_enables(drm, state);
	drm_atomic_helper_commit_modeset_enables(drm, state);


@@ -276,12 +279,18 @@ static int malidp_init(struct drm_device *drm)
	drm->mode_config.helper_private = &malidp_mode_config_helpers;
	drm->mode_config.helper_private = &malidp_mode_config_helpers;


	ret = malidp_crtc_init(drm);
	ret = malidp_crtc_init(drm);
	if (ret) {
	if (ret)
		drm_mode_config_cleanup(drm);
		goto crtc_fail;
		return ret;

	}
	ret = malidp_mw_connector_init(drm);
	if (ret)
		goto crtc_fail;


	return 0;
	return 0;

crtc_fail:
	drm_mode_config_cleanup(drm);
	return ret;
}
}


static void malidp_fini(struct drm_device *drm)
static void malidp_fini(struct drm_device *drm)
+3 −0
Original line number Original line Diff line number Diff line
@@ -13,6 +13,8 @@
#ifndef __MALIDP_DRV_H__
#ifndef __MALIDP_DRV_H__
#define __MALIDP_DRV_H__
#define __MALIDP_DRV_H__


#include <drm/drm_writeback.h>
#include <drm/drm_encoder.h>
#include <linux/mutex.h>
#include <linux/mutex.h>
#include <linux/wait.h>
#include <linux/wait.h>
#include <drm/drmP.h>
#include <drm/drmP.h>
@@ -25,6 +27,7 @@
struct malidp_drm {
struct malidp_drm {
	struct malidp_hw_device *dev;
	struct malidp_hw_device *dev;
	struct drm_crtc crtc;
	struct drm_crtc crtc;
	struct drm_writeback_connector mw_connector;
	wait_queue_head_t wq;
	wait_queue_head_t wq;
	struct drm_pending_vblank_event *event;
	struct drm_pending_vblank_event *event;
	atomic_t config_valid;
	atomic_t config_valid;
+5 −0
Original line number Original line Diff line number Diff line
@@ -21,6 +21,7 @@


#include "malidp_drv.h"
#include "malidp_drv.h"
#include "malidp_hw.h"
#include "malidp_hw.h"
#include "malidp_mw.h"


enum {
enum {
	MW_NOT_ENABLED = 0,	/* SE writeback not enabled */
	MW_NOT_ENABLED = 0,	/* SE writeback not enabled */
@@ -996,7 +997,11 @@ static irqreturn_t malidp_se_irq(int irq, void *arg)


	if (status & se->vsync_irq) {
	if (status & se->vsync_irq) {
		switch (hwdev->mw_state) {
		switch (hwdev->mw_state) {
		case MW_ONESHOT:
			drm_writeback_signal_completion(&malidp->mw_connector, 0);
			break;
		case MW_STOP:
		case MW_STOP:
			drm_writeback_signal_completion(&malidp->mw_connector, 0);
			/* disable writeback after stop */
			/* disable writeback after stop */
			hwdev->mw_state = MW_NOT_ENABLED;
			hwdev->mw_state = MW_NOT_ENABLED;
			break;
			break;
Loading