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) 
1061f1c4a8Sjames qian wang (Arm Technology China) #include <drm/drm_atomic.h>
1161f1c4a8Sjames qian wang (Arm Technology China) #include <drm/drm_atomic_helper.h>
1261f1c4a8Sjames qian wang (Arm Technology China) #include <drm/drm_crtc_helper.h>
136649a95dSSam Ravnborg #include <drm/drm_device.h>
1461f1c4a8Sjames qian wang (Arm Technology China) #include <drm/drm_writeback.h>
15f5f0a68eSjames qian wang (Arm Technology China) #include <video/videomode.h>
16f5f0a68eSjames qian wang (Arm Technology China) #include <video/display_timing.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;
4561f1c4a8Sjames qian wang (Arm Technology China) 
4661f1c4a8Sjames qian wang (Arm Technology China) 	/* private properties */
4761f1c4a8Sjames qian wang (Arm Technology China) };
4861f1c4a8Sjames qian wang (Arm Technology China) 
4961f1c4a8Sjames qian wang (Arm Technology China) /**
5061f1c4a8Sjames qian wang (Arm Technology China)  * struct komeda_wb_connector
5161f1c4a8Sjames qian wang (Arm Technology China)  */
5261f1c4a8Sjames qian wang (Arm Technology China) struct komeda_wb_connector {
5361f1c4a8Sjames qian wang (Arm Technology China) 	/** @base: &drm_writeback_connector */
5461f1c4a8Sjames qian wang (Arm Technology China) 	struct drm_writeback_connector base;
5561f1c4a8Sjames qian wang (Arm Technology China) 
5661f1c4a8Sjames qian wang (Arm Technology China) 	/** @wb_layer: represents associated writeback pipeline of komeda */
5761f1c4a8Sjames qian wang (Arm Technology China) 	struct komeda_layer *wb_layer;
5861f1c4a8Sjames qian wang (Arm Technology China) };
5961f1c4a8Sjames qian wang (Arm Technology China) 
6061f1c4a8Sjames qian wang (Arm Technology China) /**
6161f1c4a8Sjames qian wang (Arm Technology China)  * struct komeda_crtc
6261f1c4a8Sjames qian wang (Arm Technology China)  */
6361f1c4a8Sjames qian wang (Arm Technology China) struct komeda_crtc {
6461f1c4a8Sjames qian wang (Arm Technology China) 	/** @base: &drm_crtc */
6561f1c4a8Sjames qian wang (Arm Technology China) 	struct drm_crtc base;
6661f1c4a8Sjames qian wang (Arm Technology China) 	/** @master: only master has display output */
6761f1c4a8Sjames qian wang (Arm Technology China) 	struct komeda_pipeline *master;
6861f1c4a8Sjames qian wang (Arm Technology China) 	/**
6961f1c4a8Sjames qian wang (Arm Technology China) 	 * @slave: optional
7061f1c4a8Sjames qian wang (Arm Technology China) 	 *
7161f1c4a8Sjames qian wang (Arm Technology China) 	 * Doesn't have its own display output, the handled data flow will
7261f1c4a8Sjames qian wang (Arm Technology China) 	 * merge into the master.
7361f1c4a8Sjames qian wang (Arm Technology China) 	 */
7461f1c4a8Sjames qian wang (Arm Technology China) 	struct komeda_pipeline *slave;
75b7925b61Sjames qian wang (Arm Technology China) 
768c919745Sjames qian wang (Arm Technology China) 	/** @disable_done: this flip_done is for tracing the disable */
77b7925b61Sjames qian wang (Arm Technology China) 	struct completion *disable_done;
7861f1c4a8Sjames qian wang (Arm Technology China) };
7961f1c4a8Sjames qian wang (Arm Technology China) 
808c919745Sjames qian wang (Arm Technology China) /**
818c919745Sjames qian wang (Arm Technology China)  * struct komeda_crtc_state
828c919745Sjames qian wang (Arm Technology China)  */
8361f1c4a8Sjames qian wang (Arm Technology China) struct komeda_crtc_state {
8461f1c4a8Sjames qian wang (Arm Technology China) 	/** @base: &drm_crtc_state */
8561f1c4a8Sjames qian wang (Arm Technology China) 	struct drm_crtc_state base;
8661f1c4a8Sjames qian wang (Arm Technology China) 
8761f1c4a8Sjames qian wang (Arm Technology China) 	/* private properties */
8861f1c4a8Sjames qian wang (Arm Technology China) 
8961f1c4a8Sjames qian wang (Arm Technology China) 	/* computed state which are used by validate/check */
908c919745Sjames qian wang (Arm Technology China) 	/**
918c919745Sjames qian wang (Arm Technology China) 	 * @affected_pipes:
928c919745Sjames qian wang (Arm Technology China) 	 * the affected pipelines in once display instance
938c919745Sjames qian wang (Arm Technology China) 	 */
9461f1c4a8Sjames qian wang (Arm Technology China) 	u32 affected_pipes;
958c919745Sjames qian wang (Arm Technology China) 	/**
968c919745Sjames qian wang (Arm Technology China) 	 * @active_pipes:
978c919745Sjames qian wang (Arm Technology China) 	 * the active pipelines in once display instance
988c919745Sjames qian wang (Arm Technology China) 	 */
9961f1c4a8Sjames qian wang (Arm Technology China) 	u32 active_pipes;
10061f1c4a8Sjames qian wang (Arm Technology China) };
10161f1c4a8Sjames qian wang (Arm Technology China) 
10261f1c4a8Sjames qian wang (Arm Technology China) /** struct komeda_kms_dev - for gather KMS related things */
10361f1c4a8Sjames qian wang (Arm Technology China) struct komeda_kms_dev {
10461f1c4a8Sjames qian wang (Arm Technology China) 	/** @base: &drm_device */
10561f1c4a8Sjames qian wang (Arm Technology China) 	struct drm_device base;
10661f1c4a8Sjames qian wang (Arm Technology China) 
10761f1c4a8Sjames qian wang (Arm Technology China) 	/** @n_crtcs: valid numbers of crtcs in &komeda_kms_dev.crtcs */
10861f1c4a8Sjames qian wang (Arm Technology China) 	int n_crtcs;
10961f1c4a8Sjames qian wang (Arm Technology China) 	/** @crtcs: crtcs list */
11061f1c4a8Sjames qian wang (Arm Technology China) 	struct komeda_crtc crtcs[KOMEDA_MAX_PIPELINES];
11161f1c4a8Sjames qian wang (Arm Technology China) };
11261f1c4a8Sjames qian wang (Arm Technology China) 
11361f1c4a8Sjames qian wang (Arm Technology China) #define to_kplane(p)	container_of(p, struct komeda_plane, base)
11461f1c4a8Sjames qian wang (Arm Technology China) #define to_kplane_st(p)	container_of(p, struct komeda_plane_state, base)
11561f1c4a8Sjames qian wang (Arm Technology China) #define to_kconn(p)	container_of(p, struct komeda_wb_connector, base)
11661f1c4a8Sjames qian wang (Arm Technology China) #define to_kcrtc(p)	container_of(p, struct komeda_crtc, base)
11761f1c4a8Sjames qian wang (Arm Technology China) #define to_kcrtc_st(p)	container_of(p, struct komeda_crtc_state, base)
11861f1c4a8Sjames qian wang (Arm Technology China) #define to_kdev(p)	container_of(p, struct komeda_kms_dev, base)
11961f1c4a8Sjames qian wang (Arm Technology China) 
12061f1c4a8Sjames qian wang (Arm Technology China) int komeda_kms_setup_crtcs(struct komeda_kms_dev *kms, struct komeda_dev *mdev);
12161f1c4a8Sjames qian wang (Arm Technology China) 
12261f1c4a8Sjames qian wang (Arm Technology China) int komeda_kms_add_crtcs(struct komeda_kms_dev *kms, struct komeda_dev *mdev);
12361f1c4a8Sjames qian wang (Arm Technology China) int komeda_kms_add_planes(struct komeda_kms_dev *kms, struct komeda_dev *mdev);
12461f1c4a8Sjames qian wang (Arm Technology China) int komeda_kms_add_private_objs(struct komeda_kms_dev *kms,
12561f1c4a8Sjames qian wang (Arm Technology China) 				struct komeda_dev *mdev);
126ee6b73d6Sjames qian wang (Arm Technology China) void komeda_kms_cleanup_private_objs(struct komeda_kms_dev *kms);
12761f1c4a8Sjames qian wang (Arm Technology China) 
1280dac37bfSjames qian wang (Arm Technology China) void komeda_crtc_handle_event(struct komeda_crtc   *kcrtc,
1290dac37bfSjames qian wang (Arm Technology China) 			      struct komeda_events *evts);
1300dac37bfSjames qian wang (Arm Technology China) 
13161f1c4a8Sjames qian wang (Arm Technology China) struct komeda_kms_dev *komeda_kms_attach(struct komeda_dev *mdev);
13261f1c4a8Sjames qian wang (Arm Technology China) void komeda_kms_detach(struct komeda_kms_dev *kms);
13361f1c4a8Sjames qian wang (Arm Technology China) 
13461f1c4a8Sjames qian wang (Arm Technology China) #endif /*_KOMEDA_KMS_H_*/
135