161f1c4a8Sjames qian wang (Arm Technology China) /* SPDX-License-Identifier: GPL-2.0 */
261f1c4a8Sjames qian wang (Arm Technology China) /*
361f1c4a8Sjames qian wang (Arm Technology China)  * (C) COPYRIGHT 2018 ARM Limited. All rights reserved.
461f1c4a8Sjames qian wang (Arm Technology China)  * Author: James.Qian.Wang <james.qian.wang@arm.com>
561f1c4a8Sjames qian wang (Arm Technology China)  *
661f1c4a8Sjames qian wang (Arm Technology China)  */
761f1c4a8Sjames qian wang (Arm Technology China) #ifndef _KOMEDA_KMS_H_
861f1c4a8Sjames qian wang (Arm Technology China) #define _KOMEDA_KMS_H_
961f1c4a8Sjames qian wang (Arm Technology China) 
10109bd7d5SLowry Li (Arm Technology China) #include <linux/list.h>
1161f1c4a8Sjames qian wang (Arm Technology China) #include <drm/drm_atomic.h>
1261f1c4a8Sjames qian wang (Arm Technology China) #include <drm/drm_atomic_helper.h>
1390bb087fSVille Syrjälä #include <drm/drm_blend.h>
146649a95dSSam Ravnborg #include <drm/drm_device.h>
1561f1c4a8Sjames qian wang (Arm Technology China) #include <drm/drm_writeback.h>
165d51f6c0Sjames qian wang (Arm Technology China) #include <drm/drm_print.h>
1761f1c4a8Sjames qian wang (Arm Technology China) 
188c919745Sjames qian wang (Arm Technology China) /**
198c919745Sjames qian wang (Arm Technology China)  * struct komeda_plane - komeda instance of drm_plane
208c919745Sjames qian wang (Arm Technology China)  */
2161f1c4a8Sjames qian wang (Arm Technology China) struct komeda_plane {
2261f1c4a8Sjames qian wang (Arm Technology China) 	/** @base: &drm_plane */
2361f1c4a8Sjames qian wang (Arm Technology China) 	struct drm_plane base;
2461f1c4a8Sjames qian wang (Arm Technology China) 	/**
2561f1c4a8Sjames qian wang (Arm Technology China) 	 * @layer:
2661f1c4a8Sjames qian wang (Arm Technology China) 	 *
2761f1c4a8Sjames qian wang (Arm Technology China) 	 * represents available layer input pipelines for this plane.
2861f1c4a8Sjames qian wang (Arm Technology China) 	 *
2961f1c4a8Sjames qian wang (Arm Technology China) 	 * NOTE:
3061f1c4a8Sjames qian wang (Arm Technology China) 	 * the layer is not for a specific Layer, but indicate a group of
3161f1c4a8Sjames qian wang (Arm Technology China) 	 * Layers with same capabilities.
3261f1c4a8Sjames qian wang (Arm Technology China) 	 */
3361f1c4a8Sjames qian wang (Arm Technology China) 	struct komeda_layer *layer;
3461f1c4a8Sjames qian wang (Arm Technology China) };
3561f1c4a8Sjames qian wang (Arm Technology China) 
3661f1c4a8Sjames qian wang (Arm Technology China) /**
3761f1c4a8Sjames qian wang (Arm Technology China)  * struct komeda_plane_state
3861f1c4a8Sjames qian wang (Arm Technology China)  *
3961f1c4a8Sjames qian wang (Arm Technology China)  * The plane_state can be split into two data flow (left/right) and handled
4061f1c4a8Sjames qian wang (Arm Technology China)  * by two layers &komeda_plane.layer and &komeda_plane.layer.right
4161f1c4a8Sjames qian wang (Arm Technology China)  */
4261f1c4a8Sjames qian wang (Arm Technology China) struct komeda_plane_state {
4361f1c4a8Sjames qian wang (Arm Technology China) 	/** @base: &drm_plane_state */
4461f1c4a8Sjames qian wang (Arm Technology China) 	struct drm_plane_state base;
45109bd7d5SLowry Li (Arm Technology China) 	/** @zlist_node: zorder list node */
46109bd7d5SLowry Li (Arm Technology China) 	struct list_head zlist_node;
4761f1c4a8Sjames qian wang (Arm Technology China) 
48990dee3aSjames qian wang (Arm Technology China) 	/** @layer_split: on/off layer_split */
49990dee3aSjames qian wang (Arm Technology China) 	u8 layer_split : 1;
5061f1c4a8Sjames qian wang (Arm Technology China) };
5161f1c4a8Sjames qian wang (Arm Technology China) 
5261f1c4a8Sjames qian wang (Arm Technology China) /**
5361f1c4a8Sjames qian wang (Arm Technology China)  * struct komeda_wb_connector
5461f1c4a8Sjames qian wang (Arm Technology China)  */
5561f1c4a8Sjames qian wang (Arm Technology China) struct komeda_wb_connector {
5661f1c4a8Sjames qian wang (Arm Technology China) 	/** @base: &drm_writeback_connector */
5761f1c4a8Sjames qian wang (Arm Technology China) 	struct drm_writeback_connector base;
5861f1c4a8Sjames qian wang (Arm Technology China) 
5961f1c4a8Sjames qian wang (Arm Technology China) 	/** @wb_layer: represents associated writeback pipeline of komeda */
6061f1c4a8Sjames qian wang (Arm Technology China) 	struct komeda_layer *wb_layer;
6161f1c4a8Sjames qian wang (Arm Technology China) };
6261f1c4a8Sjames qian wang (Arm Technology China) 
6361f1c4a8Sjames qian wang (Arm Technology China) /**
6461f1c4a8Sjames qian wang (Arm Technology China)  * struct komeda_crtc
6561f1c4a8Sjames qian wang (Arm Technology China)  */
6661f1c4a8Sjames qian wang (Arm Technology China) struct komeda_crtc {
6761f1c4a8Sjames qian wang (Arm Technology China) 	/** @base: &drm_crtc */
6861f1c4a8Sjames qian wang (Arm Technology China) 	struct drm_crtc base;
6961f1c4a8Sjames qian wang (Arm Technology China) 	/** @master: only master has display output */
7061f1c4a8Sjames qian wang (Arm Technology China) 	struct komeda_pipeline *master;
7161f1c4a8Sjames qian wang (Arm Technology China) 	/**
7261f1c4a8Sjames qian wang (Arm Technology China) 	 * @slave: optional
7361f1c4a8Sjames qian wang (Arm Technology China) 	 *
7461f1c4a8Sjames qian wang (Arm Technology China) 	 * Doesn't have its own display output, the handled data flow will
7561f1c4a8Sjames qian wang (Arm Technology China) 	 * merge into the master.
7661f1c4a8Sjames qian wang (Arm Technology China) 	 */
7761f1c4a8Sjames qian wang (Arm Technology China) 	struct komeda_pipeline *slave;
78b7925b61Sjames qian wang (Arm Technology China) 
793b9dfa4eSLowry Li (Arm Technology China) 	/** @slave_planes: komeda slave planes mask */
803b9dfa4eSLowry Li (Arm Technology China) 	u32 slave_planes;
813b9dfa4eSLowry Li (Arm Technology China) 
825d51f6c0Sjames qian wang (Arm Technology China) 	/** @wb_conn: komeda write back connector */
835d51f6c0Sjames qian wang (Arm Technology China) 	struct komeda_wb_connector *wb_conn;
845d51f6c0Sjames qian wang (Arm Technology China) 
858c919745Sjames qian wang (Arm Technology China) 	/** @disable_done: this flip_done is for tracing the disable */
86b7925b61Sjames qian wang (Arm Technology China) 	struct completion *disable_done;
87*4cfe5cc0SFaiz Abbas 
88*4cfe5cc0SFaiz Abbas 	/** @encoder: encoder at the end of the pipeline */
89*4cfe5cc0SFaiz Abbas 	struct drm_encoder encoder;
9061f1c4a8Sjames qian wang (Arm Technology China) };
9161f1c4a8Sjames qian wang (Arm Technology China) 
928c919745Sjames qian wang (Arm Technology China) /**
938c919745Sjames qian wang (Arm Technology China)  * struct komeda_crtc_state
948c919745Sjames qian wang (Arm Technology China)  */
9561f1c4a8Sjames qian wang (Arm Technology China) struct komeda_crtc_state {
9661f1c4a8Sjames qian wang (Arm Technology China) 	/** @base: &drm_crtc_state */
9761f1c4a8Sjames qian wang (Arm Technology China) 	struct drm_crtc_state base;
9861f1c4a8Sjames qian wang (Arm Technology China) 
9961f1c4a8Sjames qian wang (Arm Technology China) 	/* private properties */
10061f1c4a8Sjames qian wang (Arm Technology China) 
10161f1c4a8Sjames qian wang (Arm Technology China) 	/* computed state which are used by validate/check */
1028c919745Sjames qian wang (Arm Technology China) 	/**
1038c919745Sjames qian wang (Arm Technology China) 	 * @affected_pipes:
1048c919745Sjames qian wang (Arm Technology China) 	 * the affected pipelines in once display instance
1058c919745Sjames qian wang (Arm Technology China) 	 */
10661f1c4a8Sjames qian wang (Arm Technology China) 	u32 affected_pipes;
1078c919745Sjames qian wang (Arm Technology China) 	/**
1088c919745Sjames qian wang (Arm Technology China) 	 * @active_pipes:
1098c919745Sjames qian wang (Arm Technology China) 	 * the active pipelines in once display instance
1108c919745Sjames qian wang (Arm Technology China) 	 */
11161f1c4a8Sjames qian wang (Arm Technology China) 	u32 active_pipes;
1121f7f9ab7Sjames qian wang (Arm Technology China) 
1136f84da0cSjames qian wang (Arm Technology China) 	/** @clock_ratio: ratio of (aclk << 32)/pxlclk */
1141f7f9ab7Sjames qian wang (Arm Technology China) 	u64 clock_ratio;
1153b9dfa4eSLowry Li (Arm Technology China) 
1163b9dfa4eSLowry Li (Arm Technology China) 	/** @max_slave_zorder: the maximum of slave zorder */
1173b9dfa4eSLowry Li (Arm Technology China) 	u32 max_slave_zorder;
11861f1c4a8Sjames qian wang (Arm Technology China) };
11961f1c4a8Sjames qian wang (Arm Technology China) 
12061f1c4a8Sjames qian wang (Arm Technology China) /** struct komeda_kms_dev - for gather KMS related things */
12161f1c4a8Sjames qian wang (Arm Technology China) struct komeda_kms_dev {
12261f1c4a8Sjames qian wang (Arm Technology China) 	/** @base: &drm_device */
12361f1c4a8Sjames qian wang (Arm Technology China) 	struct drm_device base;
12461f1c4a8Sjames qian wang (Arm Technology China) 
12561f1c4a8Sjames qian wang (Arm Technology China) 	/** @n_crtcs: valid numbers of crtcs in &komeda_kms_dev.crtcs */
12661f1c4a8Sjames qian wang (Arm Technology China) 	int n_crtcs;
12761f1c4a8Sjames qian wang (Arm Technology China) 	/** @crtcs: crtcs list */
12861f1c4a8Sjames qian wang (Arm Technology China) 	struct komeda_crtc crtcs[KOMEDA_MAX_PIPELINES];
12961f1c4a8Sjames qian wang (Arm Technology China) };
13061f1c4a8Sjames qian wang (Arm Technology China) 
13161f1c4a8Sjames qian wang (Arm Technology China) #define to_kplane(p)	container_of(p, struct komeda_plane, base)
13261f1c4a8Sjames qian wang (Arm Technology China) #define to_kplane_st(p)	container_of(p, struct komeda_plane_state, base)
13361f1c4a8Sjames qian wang (Arm Technology China) #define to_kconn(p)	container_of(p, struct komeda_wb_connector, base)
13461f1c4a8Sjames qian wang (Arm Technology China) #define to_kcrtc(p)	container_of(p, struct komeda_crtc, base)
13561f1c4a8Sjames qian wang (Arm Technology China) #define to_kcrtc_st(p)	container_of(p, struct komeda_crtc_state, base)
13661f1c4a8Sjames qian wang (Arm Technology China) #define to_kdev(p)	container_of(p, struct komeda_kms_dev, base)
1375d51f6c0Sjames qian wang (Arm Technology China) #define to_wb_conn(x)	container_of(x, struct drm_writeback_connector, base)
1385d51f6c0Sjames qian wang (Arm Technology China) 
is_writeback_only(struct drm_crtc_state * st)1395d51f6c0Sjames qian wang (Arm Technology China) static inline bool is_writeback_only(struct drm_crtc_state *st)
1405d51f6c0Sjames qian wang (Arm Technology China) {
1415d51f6c0Sjames qian wang (Arm Technology China) 	struct komeda_wb_connector *wb_conn = to_kcrtc(st->crtc)->wb_conn;
1425d51f6c0Sjames qian wang (Arm Technology China) 	struct drm_connector *conn = wb_conn ? &wb_conn->base.base : NULL;
1435d51f6c0Sjames qian wang (Arm Technology China) 
1445d51f6c0Sjames qian wang (Arm Technology China) 	return conn && (st->connector_mask == BIT(drm_connector_index(conn)));
1455d51f6c0Sjames qian wang (Arm Technology China) }
1465d51f6c0Sjames qian wang (Arm Technology China) 
1475d51f6c0Sjames qian wang (Arm Technology China) static inline bool
is_only_changed_connector(struct drm_crtc_state * st,struct drm_connector * conn)1485d51f6c0Sjames qian wang (Arm Technology China) is_only_changed_connector(struct drm_crtc_state *st, struct drm_connector *conn)
1495d51f6c0Sjames qian wang (Arm Technology China) {
1505d51f6c0Sjames qian wang (Arm Technology China) 	struct drm_crtc_state *old_st;
1515d51f6c0Sjames qian wang (Arm Technology China) 	u32 changed_connectors;
1525d51f6c0Sjames qian wang (Arm Technology China) 
1535d51f6c0Sjames qian wang (Arm Technology China) 	old_st = drm_atomic_get_old_crtc_state(st->state, st->crtc);
1545d51f6c0Sjames qian wang (Arm Technology China) 	changed_connectors = st->connector_mask ^ old_st->connector_mask;
1555d51f6c0Sjames qian wang (Arm Technology China) 
1565d51f6c0Sjames qian wang (Arm Technology China) 	return BIT(drm_connector_index(conn)) == changed_connectors;
1575d51f6c0Sjames qian wang (Arm Technology China) }
15861f1c4a8Sjames qian wang (Arm Technology China) 
has_flip_h(u32 rot)159a407a650Sjames qian wang (Arm Technology China) static inline bool has_flip_h(u32 rot)
160a407a650Sjames qian wang (Arm Technology China) {
161a407a650Sjames qian wang (Arm Technology China) 	u32 rotation = drm_rotation_simplify(rot,
162a407a650Sjames qian wang (Arm Technology China) 					     DRM_MODE_ROTATE_0 |
163a407a650Sjames qian wang (Arm Technology China) 					     DRM_MODE_ROTATE_90 |
164a407a650Sjames qian wang (Arm Technology China) 					     DRM_MODE_REFLECT_MASK);
165a407a650Sjames qian wang (Arm Technology China) 
166a407a650Sjames qian wang (Arm Technology China) 	if (rotation & DRM_MODE_ROTATE_90)
167a407a650Sjames qian wang (Arm Technology China) 		return !!(rotation & DRM_MODE_REFLECT_Y);
168a407a650Sjames qian wang (Arm Technology China) 	else
169a407a650Sjames qian wang (Arm Technology China) 		return !!(rotation & DRM_MODE_REFLECT_X);
170a407a650Sjames qian wang (Arm Technology China) }
171a407a650Sjames qian wang (Arm Technology China) 
172f9204ad9SLowry Li (Arm Technology China) void komeda_crtc_get_color_config(struct drm_crtc_state *crtc_st,
173f61714cdSLowry Li (Arm Technology China) 				  u32 *color_depths, u32 *color_formats);
1748965ad84Sjames qian wang (Arm Technology China) unsigned long komeda_crtc_get_aclk(struct komeda_crtc_state *kcrtc_st);
1751f7f9ab7Sjames qian wang (Arm Technology China) 
17661f1c4a8Sjames qian wang (Arm Technology China) int komeda_kms_setup_crtcs(struct komeda_kms_dev *kms, struct komeda_dev *mdev);
17761f1c4a8Sjames qian wang (Arm Technology China) 
17861f1c4a8Sjames qian wang (Arm Technology China) int komeda_kms_add_crtcs(struct komeda_kms_dev *kms, struct komeda_dev *mdev);
17961f1c4a8Sjames qian wang (Arm Technology China) int komeda_kms_add_planes(struct komeda_kms_dev *kms, struct komeda_dev *mdev);
18061f1c4a8Sjames qian wang (Arm Technology China) int komeda_kms_add_private_objs(struct komeda_kms_dev *kms,
18161f1c4a8Sjames qian wang (Arm Technology China) 				struct komeda_dev *mdev);
1825d51f6c0Sjames qian wang (Arm Technology China) int komeda_kms_add_wb_connectors(struct komeda_kms_dev *kms,
1835d51f6c0Sjames qian wang (Arm Technology China) 				 struct komeda_dev *mdev);
184ee6b73d6Sjames qian wang (Arm Technology China) void komeda_kms_cleanup_private_objs(struct komeda_kms_dev *kms);
18561f1c4a8Sjames qian wang (Arm Technology China) 
1860dac37bfSjames qian wang (Arm Technology China) void komeda_crtc_handle_event(struct komeda_crtc   *kcrtc,
1870dac37bfSjames qian wang (Arm Technology China) 			      struct komeda_events *evts);
188eaa225b6SLiviu Dudau void komeda_crtc_flush_and_wait_for_flip_done(struct komeda_crtc *kcrtc,
189eaa225b6SLiviu Dudau 					      struct completion *input_flip_done);
1900dac37bfSjames qian wang (Arm Technology China) 
19161f1c4a8Sjames qian wang (Arm Technology China) struct komeda_kms_dev *komeda_kms_attach(struct komeda_dev *mdev);
19261f1c4a8Sjames qian wang (Arm Technology China) void komeda_kms_detach(struct komeda_kms_dev *kms);
19361f1c4a8Sjames qian wang (Arm Technology China) 
19461f1c4a8Sjames qian wang (Arm Technology China) #endif /*_KOMEDA_KMS_H_*/
195