1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * (C) COPYRIGHT 2018 ARM Limited. All rights reserved. 4 * Author: James.Qian.Wang <james.qian.wang@arm.com> 5 * 6 */ 7 #ifndef _KOMEDA_KMS_H_ 8 #define _KOMEDA_KMS_H_ 9 10 #include <drm/drm_atomic.h> 11 #include <drm/drm_atomic_helper.h> 12 #include <drm/drm_crtc_helper.h> 13 #include <drm/drm_writeback.h> 14 15 /** struct komeda_plane - komeda instance of drm_plane */ 16 struct komeda_plane { 17 /** @base: &drm_plane */ 18 struct drm_plane base; 19 /** 20 * @layer: 21 * 22 * represents available layer input pipelines for this plane. 23 * 24 * NOTE: 25 * the layer is not for a specific Layer, but indicate a group of 26 * Layers with same capabilities. 27 */ 28 struct komeda_layer *layer; 29 }; 30 31 /** 32 * struct komeda_plane_state 33 * 34 * The plane_state can be split into two data flow (left/right) and handled 35 * by two layers &komeda_plane.layer and &komeda_plane.layer.right 36 */ 37 struct komeda_plane_state { 38 /** @base: &drm_plane_state */ 39 struct drm_plane_state base; 40 41 /* private properties */ 42 }; 43 44 /** 45 * struct komeda_wb_connector 46 */ 47 struct komeda_wb_connector { 48 /** @base: &drm_writeback_connector */ 49 struct drm_writeback_connector base; 50 51 /** @wb_layer: represents associated writeback pipeline of komeda */ 52 struct komeda_layer *wb_layer; 53 }; 54 55 /** 56 * struct komeda_crtc 57 */ 58 struct komeda_crtc { 59 /** @base: &drm_crtc */ 60 struct drm_crtc base; 61 /** @master: only master has display output */ 62 struct komeda_pipeline *master; 63 /** 64 * @slave: optional 65 * 66 * Doesn't have its own display output, the handled data flow will 67 * merge into the master. 68 */ 69 struct komeda_pipeline *slave; 70 }; 71 72 /** struct komeda_crtc_state */ 73 struct komeda_crtc_state { 74 /** @base: &drm_crtc_state */ 75 struct drm_crtc_state base; 76 77 /* private properties */ 78 79 /* computed state which are used by validate/check */ 80 u32 affected_pipes; 81 u32 active_pipes; 82 }; 83 84 /** struct komeda_kms_dev - for gather KMS related things */ 85 struct komeda_kms_dev { 86 /** @base: &drm_device */ 87 struct drm_device base; 88 89 /** @n_crtcs: valid numbers of crtcs in &komeda_kms_dev.crtcs */ 90 int n_crtcs; 91 /** @crtcs: crtcs list */ 92 struct komeda_crtc crtcs[KOMEDA_MAX_PIPELINES]; 93 }; 94 95 #define to_kplane(p) container_of(p, struct komeda_plane, base) 96 #define to_kplane_st(p) container_of(p, struct komeda_plane_state, base) 97 #define to_kconn(p) container_of(p, struct komeda_wb_connector, base) 98 #define to_kcrtc(p) container_of(p, struct komeda_crtc, base) 99 #define to_kcrtc_st(p) container_of(p, struct komeda_crtc_state, base) 100 #define to_kdev(p) container_of(p, struct komeda_kms_dev, base) 101 102 int komeda_kms_setup_crtcs(struct komeda_kms_dev *kms, struct komeda_dev *mdev); 103 104 int komeda_kms_add_crtcs(struct komeda_kms_dev *kms, struct komeda_dev *mdev); 105 int komeda_kms_add_planes(struct komeda_kms_dev *kms, struct komeda_dev *mdev); 106 int komeda_kms_add_private_objs(struct komeda_kms_dev *kms, 107 struct komeda_dev *mdev); 108 void komeda_kms_cleanup_private_objs(struct komeda_dev *mdev); 109 110 struct komeda_kms_dev *komeda_kms_attach(struct komeda_dev *mdev); 111 void komeda_kms_detach(struct komeda_kms_dev *kms); 112 113 #endif /*_KOMEDA_KMS_H_*/ 114