1bd628c1bSjames qian wang (Arm Technology China) /* SPDX-License-Identifier: GPL-2.0 */ 2bd628c1bSjames qian wang (Arm Technology China) /* 3bd628c1bSjames qian wang (Arm Technology China) * (C) COPYRIGHT 2018 ARM Limited. All rights reserved. 4bd628c1bSjames qian wang (Arm Technology China) * Author: James.Qian.Wang <james.qian.wang@arm.com> 5bd628c1bSjames qian wang (Arm Technology China) * 6bd628c1bSjames qian wang (Arm Technology China) */ 7bd628c1bSjames qian wang (Arm Technology China) #ifndef _KOMEDA_PIPELINE_H_ 8bd628c1bSjames qian wang (Arm Technology China) #define _KOMEDA_PIPELINE_H_ 9bd628c1bSjames qian wang (Arm Technology China) 10bd628c1bSjames qian wang (Arm Technology China) #include <linux/types.h> 11bd628c1bSjames qian wang (Arm Technology China) #include <drm/drm_atomic.h> 12bd628c1bSjames qian wang (Arm Technology China) #include <drm/drm_atomic_helper.h> 13bd628c1bSjames qian wang (Arm Technology China) #include "malidp_utils.h" 14bd628c1bSjames qian wang (Arm Technology China) 15bd628c1bSjames qian wang (Arm Technology China) #define KOMEDA_MAX_PIPELINES 2 16bd628c1bSjames qian wang (Arm Technology China) #define KOMEDA_PIPELINE_MAX_LAYERS 4 17bd628c1bSjames qian wang (Arm Technology China) #define KOMEDA_PIPELINE_MAX_SCALERS 2 18bd628c1bSjames qian wang (Arm Technology China) #define KOMEDA_COMPONENT_N_INPUTS 5 19bd628c1bSjames qian wang (Arm Technology China) 20bd628c1bSjames qian wang (Arm Technology China) /* pipeline component IDs */ 21bd628c1bSjames qian wang (Arm Technology China) enum { 22bd628c1bSjames qian wang (Arm Technology China) KOMEDA_COMPONENT_LAYER0 = 0, 23bd628c1bSjames qian wang (Arm Technology China) KOMEDA_COMPONENT_LAYER1 = 1, 24bd628c1bSjames qian wang (Arm Technology China) KOMEDA_COMPONENT_LAYER2 = 2, 25bd628c1bSjames qian wang (Arm Technology China) KOMEDA_COMPONENT_LAYER3 = 3, 26bd628c1bSjames qian wang (Arm Technology China) KOMEDA_COMPONENT_WB_LAYER = 7, /* write back layer */ 27bd628c1bSjames qian wang (Arm Technology China) KOMEDA_COMPONENT_SCALER0 = 8, 28bd628c1bSjames qian wang (Arm Technology China) KOMEDA_COMPONENT_SCALER1 = 9, 29bd628c1bSjames qian wang (Arm Technology China) KOMEDA_COMPONENT_SPLITTER = 12, 30bd628c1bSjames qian wang (Arm Technology China) KOMEDA_COMPONENT_MERGER = 14, 31bd628c1bSjames qian wang (Arm Technology China) KOMEDA_COMPONENT_COMPIZ0 = 16, /* compositor */ 32bd628c1bSjames qian wang (Arm Technology China) KOMEDA_COMPONENT_COMPIZ1 = 17, 33bd628c1bSjames qian wang (Arm Technology China) KOMEDA_COMPONENT_IPS0 = 20, /* post image processor */ 34bd628c1bSjames qian wang (Arm Technology China) KOMEDA_COMPONENT_IPS1 = 21, 35bd628c1bSjames qian wang (Arm Technology China) KOMEDA_COMPONENT_TIMING_CTRLR = 22, /* timing controller */ 36bd628c1bSjames qian wang (Arm Technology China) }; 37bd628c1bSjames qian wang (Arm Technology China) 38bd628c1bSjames qian wang (Arm Technology China) #define KOMEDA_PIPELINE_LAYERS (BIT(KOMEDA_COMPONENT_LAYER0) |\ 39bd628c1bSjames qian wang (Arm Technology China) BIT(KOMEDA_COMPONENT_LAYER1) |\ 40bd628c1bSjames qian wang (Arm Technology China) BIT(KOMEDA_COMPONENT_LAYER2) |\ 41bd628c1bSjames qian wang (Arm Technology China) BIT(KOMEDA_COMPONENT_LAYER3)) 42bd628c1bSjames qian wang (Arm Technology China) 43bd628c1bSjames qian wang (Arm Technology China) #define KOMEDA_PIPELINE_SCALERS (BIT(KOMEDA_COMPONENT_SCALER0) |\ 44bd628c1bSjames qian wang (Arm Technology China) BIT(KOMEDA_COMPONENT_SCALER1)) 45bd628c1bSjames qian wang (Arm Technology China) 46bd628c1bSjames qian wang (Arm Technology China) #define KOMEDA_PIPELINE_COMPIZS (BIT(KOMEDA_COMPONENT_COMPIZ0) |\ 47bd628c1bSjames qian wang (Arm Technology China) BIT(KOMEDA_COMPONENT_COMPIZ1)) 48bd628c1bSjames qian wang (Arm Technology China) 49bd628c1bSjames qian wang (Arm Technology China) #define KOMEDA_PIPELINE_IMPROCS (BIT(KOMEDA_COMPONENT_IPS0) |\ 50bd628c1bSjames qian wang (Arm Technology China) BIT(KOMEDA_COMPONENT_IPS1)) 51bd628c1bSjames qian wang (Arm Technology China) struct komeda_component; 52bd628c1bSjames qian wang (Arm Technology China) struct komeda_component_state; 53bd628c1bSjames qian wang (Arm Technology China) 54bd628c1bSjames qian wang (Arm Technology China) /** komeda_component_funcs - component control functions */ 55bd628c1bSjames qian wang (Arm Technology China) struct komeda_component_funcs { 56bd628c1bSjames qian wang (Arm Technology China) /** @validate: optional, 57bd628c1bSjames qian wang (Arm Technology China) * component may has special requirements or limitations, this function 58bd628c1bSjames qian wang (Arm Technology China) * supply HW the ability to do the further HW specific check. 59bd628c1bSjames qian wang (Arm Technology China) */ 60bd628c1bSjames qian wang (Arm Technology China) int (*validate)(struct komeda_component *c, 61bd628c1bSjames qian wang (Arm Technology China) struct komeda_component_state *state); 62bd628c1bSjames qian wang (Arm Technology China) /** @update: update is a active update */ 63bd628c1bSjames qian wang (Arm Technology China) void (*update)(struct komeda_component *c, 64bd628c1bSjames qian wang (Arm Technology China) struct komeda_component_state *state); 65bd628c1bSjames qian wang (Arm Technology China) /** @disable: disable component */ 66bd628c1bSjames qian wang (Arm Technology China) void (*disable)(struct komeda_component *c); 67bd628c1bSjames qian wang (Arm Technology China) /** @dump_register: Optional, dump registers to seq_file */ 68bd628c1bSjames qian wang (Arm Technology China) void (*dump_register)(struct komeda_component *c, struct seq_file *seq); 69bd628c1bSjames qian wang (Arm Technology China) }; 70bd628c1bSjames qian wang (Arm Technology China) 71bd628c1bSjames qian wang (Arm Technology China) /** 72bd628c1bSjames qian wang (Arm Technology China) * struct komeda_component 73bd628c1bSjames qian wang (Arm Technology China) * 74bd628c1bSjames qian wang (Arm Technology China) * struct komeda_component describe the data flow capabilities for how to link a 75bd628c1bSjames qian wang (Arm Technology China) * component into the display pipeline. 76bd628c1bSjames qian wang (Arm Technology China) * all specified components are subclass of this structure. 77bd628c1bSjames qian wang (Arm Technology China) */ 78bd628c1bSjames qian wang (Arm Technology China) struct komeda_component { 79bd628c1bSjames qian wang (Arm Technology China) /** @obj: treat component as private obj */ 80bd628c1bSjames qian wang (Arm Technology China) struct drm_private_obj obj; 81bd628c1bSjames qian wang (Arm Technology China) /** @pipeline: the komeda pipeline this component belongs to */ 82bd628c1bSjames qian wang (Arm Technology China) struct komeda_pipeline *pipeline; 83bd628c1bSjames qian wang (Arm Technology China) /** @name: component name */ 84bd628c1bSjames qian wang (Arm Technology China) char name[32]; 85bd628c1bSjames qian wang (Arm Technology China) /** 86bd628c1bSjames qian wang (Arm Technology China) * @reg: 87bd628c1bSjames qian wang (Arm Technology China) * component register base, 88bd628c1bSjames qian wang (Arm Technology China) * which is initialized by chip and used by chip only 89bd628c1bSjames qian wang (Arm Technology China) */ 90bd628c1bSjames qian wang (Arm Technology China) u32 __iomem *reg; 91bd628c1bSjames qian wang (Arm Technology China) /** @id: component id */ 92bd628c1bSjames qian wang (Arm Technology China) u32 id; 938c919745Sjames qian wang (Arm Technology China) /** 948c919745Sjames qian wang (Arm Technology China) * @hw_id: component hw id, 95bd628c1bSjames qian wang (Arm Technology China) * which is initialized by chip and used by chip only 96bd628c1bSjames qian wang (Arm Technology China) */ 97bd628c1bSjames qian wang (Arm Technology China) u32 hw_id; 98bd628c1bSjames qian wang (Arm Technology China) 99bd628c1bSjames qian wang (Arm Technology China) /** 100bd628c1bSjames qian wang (Arm Technology China) * @max_active_inputs: 1018c919745Sjames qian wang (Arm Technology China) * @max_active_outputs: 102bd628c1bSjames qian wang (Arm Technology China) * 1038c919745Sjames qian wang (Arm Technology China) * maximum number of inputs/outputs that can be active at the same time 104bd628c1bSjames qian wang (Arm Technology China) * Note: 105bd628c1bSjames qian wang (Arm Technology China) * the number isn't the bit number of @supported_inputs or 106bd628c1bSjames qian wang (Arm Technology China) * @supported_outputs, but may be less than it, since component may not 107bd628c1bSjames qian wang (Arm Technology China) * support enabling all @supported_inputs/outputs at the same time. 108bd628c1bSjames qian wang (Arm Technology China) */ 109bd628c1bSjames qian wang (Arm Technology China) u8 max_active_inputs; 1108c919745Sjames qian wang (Arm Technology China) /** @max_active_outputs: maximum number of outputs */ 111bd628c1bSjames qian wang (Arm Technology China) u8 max_active_outputs; 112bd628c1bSjames qian wang (Arm Technology China) /** 113bd628c1bSjames qian wang (Arm Technology China) * @supported_inputs: 114bd628c1bSjames qian wang (Arm Technology China) * @supported_outputs: 115bd628c1bSjames qian wang (Arm Technology China) * 1168c919745Sjames qian wang (Arm Technology China) * bitmask of BIT(component->id) for the supported inputs/outputs, 117bd628c1bSjames qian wang (Arm Technology China) * describes the possibilities of how a component is linked into a 118bd628c1bSjames qian wang (Arm Technology China) * pipeline. 119bd628c1bSjames qian wang (Arm Technology China) */ 120bd628c1bSjames qian wang (Arm Technology China) u32 supported_inputs; 1218c919745Sjames qian wang (Arm Technology China) /** @supported_outputs: bitmask of supported output componenet ids */ 122bd628c1bSjames qian wang (Arm Technology China) u32 supported_outputs; 123bd628c1bSjames qian wang (Arm Technology China) 124bd628c1bSjames qian wang (Arm Technology China) /** 125bd628c1bSjames qian wang (Arm Technology China) * @funcs: chip functions to access HW 126bd628c1bSjames qian wang (Arm Technology China) */ 127ba1b9f8cSjames qian wang (Arm Technology China) const struct komeda_component_funcs *funcs; 128bd628c1bSjames qian wang (Arm Technology China) }; 129bd628c1bSjames qian wang (Arm Technology China) 130bd628c1bSjames qian wang (Arm Technology China) /** 131bd628c1bSjames qian wang (Arm Technology China) * struct komeda_component_output 132bd628c1bSjames qian wang (Arm Technology China) * 133bd628c1bSjames qian wang (Arm Technology China) * a component has multiple outputs, if want to know where the data 134bd628c1bSjames qian wang (Arm Technology China) * comes from, only know the component is not enough, we still need to know 135bd628c1bSjames qian wang (Arm Technology China) * its output port 136bd628c1bSjames qian wang (Arm Technology China) */ 137bd628c1bSjames qian wang (Arm Technology China) struct komeda_component_output { 138bd628c1bSjames qian wang (Arm Technology China) /** @component: indicate which component the data comes from */ 139bd628c1bSjames qian wang (Arm Technology China) struct komeda_component *component; 1408c919745Sjames qian wang (Arm Technology China) /** 1418c919745Sjames qian wang (Arm Technology China) * @output_port: 142bd628c1bSjames qian wang (Arm Technology China) * the output port of the &komeda_component_output.component 143bd628c1bSjames qian wang (Arm Technology China) */ 144bd628c1bSjames qian wang (Arm Technology China) u8 output_port; 145bd628c1bSjames qian wang (Arm Technology China) }; 146bd628c1bSjames qian wang (Arm Technology China) 147bd628c1bSjames qian wang (Arm Technology China) /** 148bd628c1bSjames qian wang (Arm Technology China) * struct komeda_component_state 149bd628c1bSjames qian wang (Arm Technology China) * 150bd628c1bSjames qian wang (Arm Technology China) * component_state is the data flow configuration of the component, and it's 151bd628c1bSjames qian wang (Arm Technology China) * the superclass of all specific component_state like @komeda_layer_state, 152bd628c1bSjames qian wang (Arm Technology China) * @komeda_scaler_state 153bd628c1bSjames qian wang (Arm Technology China) */ 154bd628c1bSjames qian wang (Arm Technology China) struct komeda_component_state { 155bd628c1bSjames qian wang (Arm Technology China) /** @obj: tracking component_state by drm_atomic_state */ 156bd628c1bSjames qian wang (Arm Technology China) struct drm_private_state obj; 1578c919745Sjames qian wang (Arm Technology China) /** @component: backpointer to the component */ 158bd628c1bSjames qian wang (Arm Technology China) struct komeda_component *component; 159bd628c1bSjames qian wang (Arm Technology China) /** 160bd628c1bSjames qian wang (Arm Technology China) * @binding_user: 1618c919745Sjames qian wang (Arm Technology China) * currently bound user, the user can be @crtc, @plane or @wb_conn, 1628c919745Sjames qian wang (Arm Technology China) * which is valid decided by @component and @inputs 163bd628c1bSjames qian wang (Arm Technology China) * 164bd628c1bSjames qian wang (Arm Technology China) * - Layer: its user always is plane. 165bd628c1bSjames qian wang (Arm Technology China) * - compiz/improc/timing_ctrlr: the user is crtc. 166bd628c1bSjames qian wang (Arm Technology China) * - wb_layer: wb_conn; 167bd628c1bSjames qian wang (Arm Technology China) * - scaler: plane when input is layer, wb_conn if input is compiz. 168bd628c1bSjames qian wang (Arm Technology China) */ 169bd628c1bSjames qian wang (Arm Technology China) union { 1708c919745Sjames qian wang (Arm Technology China) /** @crtc: backpointer for user crtc */ 171bd628c1bSjames qian wang (Arm Technology China) struct drm_crtc *crtc; 1728c919745Sjames qian wang (Arm Technology China) /** @plane: backpointer for user plane */ 173bd628c1bSjames qian wang (Arm Technology China) struct drm_plane *plane; 1748c919745Sjames qian wang (Arm Technology China) /** @wb_conn: backpointer for user wb_connector */ 175bd628c1bSjames qian wang (Arm Technology China) struct drm_connector *wb_conn; 176bd628c1bSjames qian wang (Arm Technology China) void *binding_user; 177bd628c1bSjames qian wang (Arm Technology China) }; 1788c919745Sjames qian wang (Arm Technology China) 179bd628c1bSjames qian wang (Arm Technology China) /** 180bd628c1bSjames qian wang (Arm Technology China) * @active_inputs: 181bd628c1bSjames qian wang (Arm Technology China) * 182bd628c1bSjames qian wang (Arm Technology China) * active_inputs is bitmask of @inputs index 183bd628c1bSjames qian wang (Arm Technology China) * 1848c919745Sjames qian wang (Arm Technology China) * - active_inputs = changed_active_inputs | unchanged_active_inputs 1858c919745Sjames qian wang (Arm Technology China) * - affected_inputs = old->active_inputs | new->active_inputs; 186bd628c1bSjames qian wang (Arm Technology China) * - disabling_inputs = affected_inputs ^ active_inputs; 1878c919745Sjames qian wang (Arm Technology China) * - changed_inputs = disabling_inputs | changed_active_inputs; 188bd628c1bSjames qian wang (Arm Technology China) * 189bd628c1bSjames qian wang (Arm Technology China) * NOTE: 190bd628c1bSjames qian wang (Arm Technology China) * changed_inputs doesn't include all active_input but only 191bd628c1bSjames qian wang (Arm Technology China) * @changed_active_inputs, and this bitmask can be used in chip 192bd628c1bSjames qian wang (Arm Technology China) * level for dirty update. 193bd628c1bSjames qian wang (Arm Technology China) */ 194bd628c1bSjames qian wang (Arm Technology China) u16 active_inputs; 1958c919745Sjames qian wang (Arm Technology China) /** @changed_active_inputs: bitmask of the changed @active_inputs */ 196bd628c1bSjames qian wang (Arm Technology China) u16 changed_active_inputs; 1978c919745Sjames qian wang (Arm Technology China) /** @affected_inputs: bitmask for affected @inputs */ 198bd628c1bSjames qian wang (Arm Technology China) u16 affected_inputs; 199bd628c1bSjames qian wang (Arm Technology China) /** 200bd628c1bSjames qian wang (Arm Technology China) * @inputs: 201bd628c1bSjames qian wang (Arm Technology China) * 202bd628c1bSjames qian wang (Arm Technology China) * the specific inputs[i] only valid on BIT(i) has been set in 203bd628c1bSjames qian wang (Arm Technology China) * @active_inputs, if not the inputs[i] is undefined. 204bd628c1bSjames qian wang (Arm Technology China) */ 205bd628c1bSjames qian wang (Arm Technology China) struct komeda_component_output inputs[KOMEDA_COMPONENT_N_INPUTS]; 206bd628c1bSjames qian wang (Arm Technology China) }; 207bd628c1bSjames qian wang (Arm Technology China) 208bd628c1bSjames qian wang (Arm Technology China) static inline u16 component_disabling_inputs(struct komeda_component_state *st) 209bd628c1bSjames qian wang (Arm Technology China) { 210bd628c1bSjames qian wang (Arm Technology China) return st->affected_inputs ^ st->active_inputs; 211bd628c1bSjames qian wang (Arm Technology China) } 212bd628c1bSjames qian wang (Arm Technology China) 213bd628c1bSjames qian wang (Arm Technology China) static inline u16 component_changed_inputs(struct komeda_component_state *st) 214bd628c1bSjames qian wang (Arm Technology China) { 215bd628c1bSjames qian wang (Arm Technology China) return component_disabling_inputs(st) | st->changed_active_inputs; 216bd628c1bSjames qian wang (Arm Technology China) } 217bd628c1bSjames qian wang (Arm Technology China) 2187013b667Sjames qian wang (Arm Technology China) #define for_each_changed_input(st, i) \ 2197013b667Sjames qian wang (Arm Technology China) for ((i) = 0; (i) < (st)->component->max_active_inputs; (i)++) \ 2207013b667Sjames qian wang (Arm Technology China) if (has_bit((i), component_changed_inputs(st))) 2217013b667Sjames qian wang (Arm Technology China) 222bd628c1bSjames qian wang (Arm Technology China) #define to_comp(__c) (((__c) == NULL) ? NULL : &((__c)->base)) 223bd628c1bSjames qian wang (Arm Technology China) #define to_cpos(__c) ((struct komeda_component **)&(__c)) 224bd628c1bSjames qian wang (Arm Technology China) 225bd628c1bSjames qian wang (Arm Technology China) struct komeda_layer { 226bd628c1bSjames qian wang (Arm Technology China) struct komeda_component base; 22771c420b7Sjames qian wang (Arm Technology China) /* accepted h/v input range before rotation */ 22871c420b7Sjames qian wang (Arm Technology China) struct malidp_range hsize_in, vsize_in; 22971c420b7Sjames qian wang (Arm Technology China) u32 layer_type; /* RICH, SIMPLE or WB */ 23071c420b7Sjames qian wang (Arm Technology China) u32 supported_rots; 231bd628c1bSjames qian wang (Arm Technology China) }; 232bd628c1bSjames qian wang (Arm Technology China) 233bd628c1bSjames qian wang (Arm Technology China) struct komeda_layer_state { 234bd628c1bSjames qian wang (Arm Technology China) struct komeda_component_state base; 235bd628c1bSjames qian wang (Arm Technology China) /* layer specific configuration state */ 23671c420b7Sjames qian wang (Arm Technology China) u16 hsize, vsize; 23771c420b7Sjames qian wang (Arm Technology China) u32 rot; 23865ad2392Sjames qian wang (Arm Technology China) u16 afbc_crop_l; 23965ad2392Sjames qian wang (Arm Technology China) u16 afbc_crop_r; 24065ad2392Sjames qian wang (Arm Technology China) u16 afbc_crop_t; 24165ad2392Sjames qian wang (Arm Technology China) u16 afbc_crop_b; 24271c420b7Sjames qian wang (Arm Technology China) dma_addr_t addr[3]; 243bd628c1bSjames qian wang (Arm Technology China) }; 244bd628c1bSjames qian wang (Arm Technology China) 245bd628c1bSjames qian wang (Arm Technology China) struct komeda_scaler { 246bd628c1bSjames qian wang (Arm Technology China) struct komeda_component base; 247502932a0Sjames qian wang (Arm Technology China) struct malidp_range hsize, vsize; 248502932a0Sjames qian wang (Arm Technology China) u32 max_upscaling; 249502932a0Sjames qian wang (Arm Technology China) u32 max_downscaling; 250bd628c1bSjames qian wang (Arm Technology China) }; 251bd628c1bSjames qian wang (Arm Technology China) 252bd628c1bSjames qian wang (Arm Technology China) struct komeda_scaler_state { 253bd628c1bSjames qian wang (Arm Technology China) struct komeda_component_state base; 254502932a0Sjames qian wang (Arm Technology China) u16 hsize_in, vsize_in; 255502932a0Sjames qian wang (Arm Technology China) u16 hsize_out, vsize_out; 256502932a0Sjames qian wang (Arm Technology China) u8 en_scaling : 1, 257502932a0Sjames qian wang (Arm Technology China) en_alpha : 1; /* enable alpha processing */ 258bd628c1bSjames qian wang (Arm Technology China) }; 259bd628c1bSjames qian wang (Arm Technology China) 2607013b667Sjames qian wang (Arm Technology China) struct komeda_compiz { 2617013b667Sjames qian wang (Arm Technology China) struct komeda_component base; 2627013b667Sjames qian wang (Arm Technology China) struct malidp_range hsize, vsize; 2637013b667Sjames qian wang (Arm Technology China) }; 2647013b667Sjames qian wang (Arm Technology China) 2657013b667Sjames qian wang (Arm Technology China) struct komeda_compiz_input_cfg { 2667013b667Sjames qian wang (Arm Technology China) u16 hsize, vsize; 2677013b667Sjames qian wang (Arm Technology China) u16 hoffset, voffset; 2687013b667Sjames qian wang (Arm Technology China) u8 pixel_blend_mode, layer_alpha; 2697013b667Sjames qian wang (Arm Technology China) }; 2707013b667Sjames qian wang (Arm Technology China) 2717013b667Sjames qian wang (Arm Technology China) struct komeda_compiz_state { 2727013b667Sjames qian wang (Arm Technology China) struct komeda_component_state base; 2737013b667Sjames qian wang (Arm Technology China) /* composition size */ 2747013b667Sjames qian wang (Arm Technology China) u16 hsize, vsize; 2757013b667Sjames qian wang (Arm Technology China) struct komeda_compiz_input_cfg cins[KOMEDA_COMPONENT_N_INPUTS]; 2767013b667Sjames qian wang (Arm Technology China) }; 2777013b667Sjames qian wang (Arm Technology China) 278bd628c1bSjames qian wang (Arm Technology China) struct komeda_improc { 279bd628c1bSjames qian wang (Arm Technology China) struct komeda_component base; 280f5f0a68eSjames qian wang (Arm Technology China) u32 supported_color_formats; /* DRM_RGB/YUV444/YUV420*/ 281f5f0a68eSjames qian wang (Arm Technology China) u32 supported_color_depths; /* BIT(8) | BIT(10)*/ 282f5f0a68eSjames qian wang (Arm Technology China) u8 supports_degamma : 1; 283f5f0a68eSjames qian wang (Arm Technology China) u8 supports_csc : 1; 284f5f0a68eSjames qian wang (Arm Technology China) u8 supports_gamma : 1; 285bd628c1bSjames qian wang (Arm Technology China) }; 286bd628c1bSjames qian wang (Arm Technology China) 287bd628c1bSjames qian wang (Arm Technology China) struct komeda_improc_state { 288bd628c1bSjames qian wang (Arm Technology China) struct komeda_component_state base; 289f5f0a68eSjames qian wang (Arm Technology China) u16 hsize, vsize; 290bd628c1bSjames qian wang (Arm Technology China) }; 291bd628c1bSjames qian wang (Arm Technology China) 292bd628c1bSjames qian wang (Arm Technology China) /* display timing controller */ 293bd628c1bSjames qian wang (Arm Technology China) struct komeda_timing_ctrlr { 294bd628c1bSjames qian wang (Arm Technology China) struct komeda_component base; 295f5f0a68eSjames qian wang (Arm Technology China) u8 supports_dual_link : 1; 296bd628c1bSjames qian wang (Arm Technology China) }; 297bd628c1bSjames qian wang (Arm Technology China) 298bd628c1bSjames qian wang (Arm Technology China) struct komeda_timing_ctrlr_state { 299bd628c1bSjames qian wang (Arm Technology China) struct komeda_component_state base; 300bd628c1bSjames qian wang (Arm Technology China) }; 301bd628c1bSjames qian wang (Arm Technology China) 30211bb22eeSjames qian wang (Arm Technology China) /* Why define A separated structure but not use plane_state directly ? 30311bb22eeSjames qian wang (Arm Technology China) * 1. Komeda supports layer_split which means a plane_state can be split and 30411bb22eeSjames qian wang (Arm Technology China) * handled by two layers, one layer only handle half of plane image. 30511bb22eeSjames qian wang (Arm Technology China) * 2. Fix up the user properties according to HW's capabilities, like user 30611bb22eeSjames qian wang (Arm Technology China) * set rotation to R180, but HW only supports REFLECT_X+Y. the rot here is 30711bb22eeSjames qian wang (Arm Technology China) * after drm_rotation_simplify() 30811bb22eeSjames qian wang (Arm Technology China) */ 30911bb22eeSjames qian wang (Arm Technology China) struct komeda_data_flow_cfg { 31011bb22eeSjames qian wang (Arm Technology China) struct komeda_component_output input; 31111bb22eeSjames qian wang (Arm Technology China) u16 in_x, in_y, in_w, in_h; 31211bb22eeSjames qian wang (Arm Technology China) u32 out_x, out_y, out_w, out_h; 31311bb22eeSjames qian wang (Arm Technology China) u32 rot; 31411bb22eeSjames qian wang (Arm Technology China) int blending_zorder; 31511bb22eeSjames qian wang (Arm Technology China) u8 pixel_blend_mode, layer_alpha; 316502932a0Sjames qian wang (Arm Technology China) u8 en_scaling : 1; 31711bb22eeSjames qian wang (Arm Technology China) }; 31811bb22eeSjames qian wang (Arm Technology China) 319bd628c1bSjames qian wang (Arm Technology China) /** struct komeda_pipeline_funcs */ 320bd628c1bSjames qian wang (Arm Technology China) struct komeda_pipeline_funcs { 321bd628c1bSjames qian wang (Arm Technology China) /* dump_register: Optional, dump registers to seq_file */ 322bd628c1bSjames qian wang (Arm Technology China) void (*dump_register)(struct komeda_pipeline *pipe, 323bd628c1bSjames qian wang (Arm Technology China) struct seq_file *sf); 324bd628c1bSjames qian wang (Arm Technology China) }; 325bd628c1bSjames qian wang (Arm Technology China) 326bd628c1bSjames qian wang (Arm Technology China) /** 327bd628c1bSjames qian wang (Arm Technology China) * struct komeda_pipeline 328bd628c1bSjames qian wang (Arm Technology China) * 329bd628c1bSjames qian wang (Arm Technology China) * Represent a complete display pipeline and hold all functional components. 330bd628c1bSjames qian wang (Arm Technology China) */ 331bd628c1bSjames qian wang (Arm Technology China) struct komeda_pipeline { 332bd628c1bSjames qian wang (Arm Technology China) /** @obj: link pipeline as private obj of drm_atomic_state */ 333bd628c1bSjames qian wang (Arm Technology China) struct drm_private_obj obj; 334bd628c1bSjames qian wang (Arm Technology China) /** @mdev: the parent komeda_dev */ 335bd628c1bSjames qian wang (Arm Technology China) struct komeda_dev *mdev; 336bd628c1bSjames qian wang (Arm Technology China) /** @pxlclk: pixel clock */ 337bd628c1bSjames qian wang (Arm Technology China) struct clk *pxlclk; 338bd628c1bSjames qian wang (Arm Technology China) /** @aclk: AXI clock */ 339bd628c1bSjames qian wang (Arm Technology China) struct clk *aclk; 340bd628c1bSjames qian wang (Arm Technology China) /** @id: pipeline id */ 341bd628c1bSjames qian wang (Arm Technology China) int id; 342bd628c1bSjames qian wang (Arm Technology China) /** @avail_comps: available components mask of pipeline */ 343bd628c1bSjames qian wang (Arm Technology China) u32 avail_comps; 3448c919745Sjames qian wang (Arm Technology China) /** @n_layers: the number of layer on @layers */ 345bd628c1bSjames qian wang (Arm Technology China) int n_layers; 3468c919745Sjames qian wang (Arm Technology China) /** @layers: the pipeline layers */ 347bd628c1bSjames qian wang (Arm Technology China) struct komeda_layer *layers[KOMEDA_PIPELINE_MAX_LAYERS]; 3488c919745Sjames qian wang (Arm Technology China) /** @n_scalers: the number of scaler on @scalers */ 349bd628c1bSjames qian wang (Arm Technology China) int n_scalers; 3508c919745Sjames qian wang (Arm Technology China) /** @scalers: the pipeline scalers */ 351bd628c1bSjames qian wang (Arm Technology China) struct komeda_scaler *scalers[KOMEDA_PIPELINE_MAX_SCALERS]; 3528c919745Sjames qian wang (Arm Technology China) /** @compiz: compositor */ 353bd628c1bSjames qian wang (Arm Technology China) struct komeda_compiz *compiz; 3548c919745Sjames qian wang (Arm Technology China) /** @wb_layer: writeback layer */ 355bd628c1bSjames qian wang (Arm Technology China) struct komeda_layer *wb_layer; 3568c919745Sjames qian wang (Arm Technology China) /** @improc: post image processor */ 357bd628c1bSjames qian wang (Arm Technology China) struct komeda_improc *improc; 3588c919745Sjames qian wang (Arm Technology China) /** @ctrlr: timing controller */ 359bd628c1bSjames qian wang (Arm Technology China) struct komeda_timing_ctrlr *ctrlr; 360ba1b9f8cSjames qian wang (Arm Technology China) /** @funcs: chip private pipeline functions */ 361ba1b9f8cSjames qian wang (Arm Technology China) const struct komeda_pipeline_funcs *funcs; 36229e56aecSjames qian wang (Arm Technology China) 36329e56aecSjames qian wang (Arm Technology China) /** @of_node: pipeline dt node */ 36429e56aecSjames qian wang (Arm Technology China) struct device_node *of_node; 36529e56aecSjames qian wang (Arm Technology China) /** @of_output_port: pipeline output port */ 36629e56aecSjames qian wang (Arm Technology China) struct device_node *of_output_port; 36729e56aecSjames qian wang (Arm Technology China) /** @of_output_dev: output connector device node */ 36829e56aecSjames qian wang (Arm Technology China) struct device_node *of_output_dev; 369bd628c1bSjames qian wang (Arm Technology China) }; 370bd628c1bSjames qian wang (Arm Technology China) 371bd628c1bSjames qian wang (Arm Technology China) /** 372bd628c1bSjames qian wang (Arm Technology China) * struct komeda_pipeline_state 373bd628c1bSjames qian wang (Arm Technology China) * 374bd628c1bSjames qian wang (Arm Technology China) * NOTE: 375bd628c1bSjames qian wang (Arm Technology China) * Unlike the pipeline, pipeline_state doesn’t gather any component_state 376bd628c1bSjames qian wang (Arm Technology China) * into it. It because all component will be managed by drm_atomic_state. 377bd628c1bSjames qian wang (Arm Technology China) */ 378bd628c1bSjames qian wang (Arm Technology China) struct komeda_pipeline_state { 379bd628c1bSjames qian wang (Arm Technology China) /** @obj: tracking pipeline_state by drm_atomic_state */ 380bd628c1bSjames qian wang (Arm Technology China) struct drm_private_state obj; 3818c919745Sjames qian wang (Arm Technology China) /** @pipe: backpointer to the pipeline */ 382bd628c1bSjames qian wang (Arm Technology China) struct komeda_pipeline *pipe; 383bd628c1bSjames qian wang (Arm Technology China) /** @crtc: currently bound crtc */ 384bd628c1bSjames qian wang (Arm Technology China) struct drm_crtc *crtc; 385bd628c1bSjames qian wang (Arm Technology China) /** 386bd628c1bSjames qian wang (Arm Technology China) * @active_comps: 387bd628c1bSjames qian wang (Arm Technology China) * 388bd628c1bSjames qian wang (Arm Technology China) * bitmask - BIT(component->id) of active components 389bd628c1bSjames qian wang (Arm Technology China) */ 390bd628c1bSjames qian wang (Arm Technology China) u32 active_comps; 391bd628c1bSjames qian wang (Arm Technology China) }; 392bd628c1bSjames qian wang (Arm Technology China) 393bd628c1bSjames qian wang (Arm Technology China) #define to_layer(c) container_of(c, struct komeda_layer, base) 394bd628c1bSjames qian wang (Arm Technology China) #define to_compiz(c) container_of(c, struct komeda_compiz, base) 395bd628c1bSjames qian wang (Arm Technology China) #define to_scaler(c) container_of(c, struct komeda_scaler, base) 396bd628c1bSjames qian wang (Arm Technology China) #define to_improc(c) container_of(c, struct komeda_improc, base) 397bd628c1bSjames qian wang (Arm Technology China) #define to_ctrlr(c) container_of(c, struct komeda_timing_ctrlr, base) 398bd628c1bSjames qian wang (Arm Technology China) 399bd628c1bSjames qian wang (Arm Technology China) #define to_layer_st(c) container_of(c, struct komeda_layer_state, base) 400bd628c1bSjames qian wang (Arm Technology China) #define to_compiz_st(c) container_of(c, struct komeda_compiz_state, base) 401bd628c1bSjames qian wang (Arm Technology China) #define to_scaler_st(c) container_of(c, struct komeda_scaler_state, base) 402bd628c1bSjames qian wang (Arm Technology China) #define to_improc_st(c) container_of(c, struct komeda_improc_state, base) 403bd628c1bSjames qian wang (Arm Technology China) #define to_ctrlr_st(c) container_of(c, struct komeda_timing_ctrlr_state, base) 404bd628c1bSjames qian wang (Arm Technology China) 40561f1c4a8Sjames qian wang (Arm Technology China) #define priv_to_comp_st(o) container_of(o, struct komeda_component_state, obj) 40661f1c4a8Sjames qian wang (Arm Technology China) #define priv_to_pipe_st(o) container_of(o, struct komeda_pipeline_state, obj) 40761f1c4a8Sjames qian wang (Arm Technology China) 408bd628c1bSjames qian wang (Arm Technology China) /* pipeline APIs */ 409bd628c1bSjames qian wang (Arm Technology China) struct komeda_pipeline * 410bd628c1bSjames qian wang (Arm Technology China) komeda_pipeline_add(struct komeda_dev *mdev, size_t size, 411ba1b9f8cSjames qian wang (Arm Technology China) const struct komeda_pipeline_funcs *funcs); 412bd628c1bSjames qian wang (Arm Technology China) void komeda_pipeline_destroy(struct komeda_dev *mdev, 413bd628c1bSjames qian wang (Arm Technology China) struct komeda_pipeline *pipe); 414321e925cSjames qian wang (Arm Technology China) int komeda_assemble_pipelines(struct komeda_dev *mdev); 415bd628c1bSjames qian wang (Arm Technology China) struct komeda_component * 416bd628c1bSjames qian wang (Arm Technology China) komeda_pipeline_get_component(struct komeda_pipeline *pipe, int id); 417502932a0Sjames qian wang (Arm Technology China) struct komeda_component * 418502932a0Sjames qian wang (Arm Technology China) komeda_pipeline_get_first_component(struct komeda_pipeline *pipe, 419502932a0Sjames qian wang (Arm Technology China) u32 comp_mask); 420bd628c1bSjames qian wang (Arm Technology China) 4217d3cfb70Sjames qian wang (Arm Technology China) void komeda_pipeline_dump_register(struct komeda_pipeline *pipe, 4227d3cfb70Sjames qian wang (Arm Technology China) struct seq_file *sf); 4237d3cfb70Sjames qian wang (Arm Technology China) 424bd628c1bSjames qian wang (Arm Technology China) /* component APIs */ 425bd628c1bSjames qian wang (Arm Technology China) struct komeda_component * 426bd628c1bSjames qian wang (Arm Technology China) komeda_component_add(struct komeda_pipeline *pipe, 427bd628c1bSjames qian wang (Arm Technology China) size_t comp_sz, u32 id, u32 hw_id, 428ba1b9f8cSjames qian wang (Arm Technology China) const struct komeda_component_funcs *funcs, 429bd628c1bSjames qian wang (Arm Technology China) u8 max_active_inputs, u32 supported_inputs, 430bd628c1bSjames qian wang (Arm Technology China) u8 max_active_outputs, u32 __iomem *reg, 431bd628c1bSjames qian wang (Arm Technology China) const char *name_fmt, ...); 432bd628c1bSjames qian wang (Arm Technology China) 433bd628c1bSjames qian wang (Arm Technology China) void komeda_component_destroy(struct komeda_dev *mdev, 434bd628c1bSjames qian wang (Arm Technology China) struct komeda_component *c); 435bd628c1bSjames qian wang (Arm Technology China) 436502932a0Sjames qian wang (Arm Technology China) static inline struct komeda_component * 437502932a0Sjames qian wang (Arm Technology China) komeda_component_pickup_output(struct komeda_component *c, u32 avail_comps) 438502932a0Sjames qian wang (Arm Technology China) { 439502932a0Sjames qian wang (Arm Technology China) u32 avail_inputs = c->supported_outputs & (avail_comps); 440502932a0Sjames qian wang (Arm Technology China) 441502932a0Sjames qian wang (Arm Technology China) return komeda_pipeline_get_first_component(c->pipeline, avail_inputs); 442502932a0Sjames qian wang (Arm Technology China) } 443502932a0Sjames qian wang (Arm Technology China) 44411bb22eeSjames qian wang (Arm Technology China) struct komeda_plane_state; 44511bb22eeSjames qian wang (Arm Technology China) struct komeda_crtc_state; 446c3015342Sjames qian wang (Arm Technology China) struct komeda_crtc; 44711bb22eeSjames qian wang (Arm Technology China) 4485d51f6c0Sjames qian wang (Arm Technology China) void pipeline_composition_size(struct komeda_crtc_state *kcrtc_st, 4495d51f6c0Sjames qian wang (Arm Technology China) u16 *hsize, u16 *vsize); 4505d51f6c0Sjames qian wang (Arm Technology China) 45111bb22eeSjames qian wang (Arm Technology China) int komeda_build_layer_data_flow(struct komeda_layer *layer, 45211bb22eeSjames qian wang (Arm Technology China) struct komeda_plane_state *kplane_st, 45311bb22eeSjames qian wang (Arm Technology China) struct komeda_crtc_state *kcrtc_st, 45411bb22eeSjames qian wang (Arm Technology China) struct komeda_data_flow_cfg *dflow); 4555d51f6c0Sjames qian wang (Arm Technology China) int komeda_build_wb_data_flow(struct komeda_layer *wb_layer, 4565d51f6c0Sjames qian wang (Arm Technology China) struct drm_connector_state *conn_st, 4575d51f6c0Sjames qian wang (Arm Technology China) struct komeda_crtc_state *kcrtc_st, 4585d51f6c0Sjames qian wang (Arm Technology China) struct komeda_data_flow_cfg *dflow); 459c3015342Sjames qian wang (Arm Technology China) int komeda_build_display_data_flow(struct komeda_crtc *kcrtc, 460c3015342Sjames qian wang (Arm Technology China) struct komeda_crtc_state *kcrtc_st); 46111bb22eeSjames qian wang (Arm Technology China) 462552b831cSjames qian wang (Arm Technology China) int komeda_release_unclaimed_resources(struct komeda_pipeline *pipe, 463552b831cSjames qian wang (Arm Technology China) struct komeda_crtc_state *kcrtc_st); 464552b831cSjames qian wang (Arm Technology China) 465b7925b61Sjames qian wang (Arm Technology China) struct komeda_pipeline_state * 466b7925b61Sjames qian wang (Arm Technology China) komeda_pipeline_get_old_state(struct komeda_pipeline *pipe, 467b7925b61Sjames qian wang (Arm Technology China) struct drm_atomic_state *state); 46859dd6d58Sjames qian wang (Arm Technology China) void komeda_pipeline_disable(struct komeda_pipeline *pipe, 46959dd6d58Sjames qian wang (Arm Technology China) struct drm_atomic_state *old_state); 47059dd6d58Sjames qian wang (Arm Technology China) void komeda_pipeline_update(struct komeda_pipeline *pipe, 47159dd6d58Sjames qian wang (Arm Technology China) struct drm_atomic_state *old_state); 47259dd6d58Sjames qian wang (Arm Technology China) 473bd628c1bSjames qian wang (Arm Technology China) #endif /* _KOMEDA_PIPELINE_H_*/ 474