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