1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (C) STMicroelectronics SA 2014 4*4882a593Smuzhiyun * Author: Benjamin Gaignard <benjamin.gaignard@st.com> for STMicroelectronics. 5*4882a593Smuzhiyun */ 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun #ifndef _STI_PLANE_H_ 8*4882a593Smuzhiyun #define _STI_PLANE_H_ 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #include <drm/drm_atomic_helper.h> 11*4882a593Smuzhiyun #include <drm/drm_plane_helper.h> 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #define to_sti_plane(x) container_of(x, struct sti_plane, drm_plane) 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun #define STI_PLANE_TYPE_SHIFT 8 16*4882a593Smuzhiyun #define STI_PLANE_TYPE_MASK (~((1 << STI_PLANE_TYPE_SHIFT) - 1)) 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun enum sti_plane_type { 19*4882a593Smuzhiyun STI_GDP = 1 << STI_PLANE_TYPE_SHIFT, 20*4882a593Smuzhiyun STI_VDP = 2 << STI_PLANE_TYPE_SHIFT, 21*4882a593Smuzhiyun STI_CUR = 3 << STI_PLANE_TYPE_SHIFT, 22*4882a593Smuzhiyun STI_BCK = 4 << STI_PLANE_TYPE_SHIFT 23*4882a593Smuzhiyun }; 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun enum sti_plane_id_of_type { 26*4882a593Smuzhiyun STI_ID_0 = 0, 27*4882a593Smuzhiyun STI_ID_1 = 1, 28*4882a593Smuzhiyun STI_ID_2 = 2, 29*4882a593Smuzhiyun STI_ID_3 = 3 30*4882a593Smuzhiyun }; 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun enum sti_plane_desc { 33*4882a593Smuzhiyun STI_GDP_0 = STI_GDP | STI_ID_0, 34*4882a593Smuzhiyun STI_GDP_1 = STI_GDP | STI_ID_1, 35*4882a593Smuzhiyun STI_GDP_2 = STI_GDP | STI_ID_2, 36*4882a593Smuzhiyun STI_GDP_3 = STI_GDP | STI_ID_3, 37*4882a593Smuzhiyun STI_HQVDP_0 = STI_VDP | STI_ID_0, 38*4882a593Smuzhiyun STI_CURSOR = STI_CUR, 39*4882a593Smuzhiyun STI_BACK = STI_BCK 40*4882a593Smuzhiyun }; 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun enum sti_plane_status { 43*4882a593Smuzhiyun STI_PLANE_READY, 44*4882a593Smuzhiyun STI_PLANE_UPDATED, 45*4882a593Smuzhiyun STI_PLANE_DISABLING, 46*4882a593Smuzhiyun STI_PLANE_FLUSHING, 47*4882a593Smuzhiyun STI_PLANE_DISABLED, 48*4882a593Smuzhiyun }; 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun #define FPS_LENGTH 128 51*4882a593Smuzhiyun struct sti_fps_info { 52*4882a593Smuzhiyun bool output; 53*4882a593Smuzhiyun unsigned int curr_frame_counter; 54*4882a593Smuzhiyun unsigned int last_frame_counter; 55*4882a593Smuzhiyun unsigned int curr_field_counter; 56*4882a593Smuzhiyun unsigned int last_field_counter; 57*4882a593Smuzhiyun ktime_t last_timestamp; 58*4882a593Smuzhiyun char fps_str[FPS_LENGTH]; 59*4882a593Smuzhiyun char fips_str[FPS_LENGTH]; 60*4882a593Smuzhiyun }; 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun /** 63*4882a593Smuzhiyun * STI plane structure 64*4882a593Smuzhiyun * 65*4882a593Smuzhiyun * @plane: drm plane it is bound to (if any) 66*4882a593Smuzhiyun * @desc: plane type & id 67*4882a593Smuzhiyun * @status: to know the status of the plane 68*4882a593Smuzhiyun * @fps_info: frame per second info 69*4882a593Smuzhiyun */ 70*4882a593Smuzhiyun struct sti_plane { 71*4882a593Smuzhiyun struct drm_plane drm_plane; 72*4882a593Smuzhiyun enum sti_plane_desc desc; 73*4882a593Smuzhiyun enum sti_plane_status status; 74*4882a593Smuzhiyun struct sti_fps_info fps_info; 75*4882a593Smuzhiyun }; 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun const char *sti_plane_to_str(struct sti_plane *plane); 78*4882a593Smuzhiyun void sti_plane_update_fps(struct sti_plane *plane, 79*4882a593Smuzhiyun bool new_frame, 80*4882a593Smuzhiyun bool new_field); 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun void sti_plane_init_property(struct sti_plane *plane, 83*4882a593Smuzhiyun enum drm_plane_type type); 84*4882a593Smuzhiyun void sti_plane_reset(struct drm_plane *plane); 85*4882a593Smuzhiyun #endif 86