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; 93bd628c1bSjames qian wang (Arm Technology China) /** @hw_ic: component hw id, 94bd628c1bSjames qian wang (Arm Technology China) * which is initialized by chip and used by chip only 95bd628c1bSjames qian wang (Arm Technology China) */ 96bd628c1bSjames qian wang (Arm Technology China) u32 hw_id; 97bd628c1bSjames qian wang (Arm Technology China) 98bd628c1bSjames qian wang (Arm Technology China) /** 99bd628c1bSjames qian wang (Arm Technology China) * @max_active_inputs: 100bd628c1bSjames qian wang (Arm Technology China) * @max_active_outpus: 101bd628c1bSjames qian wang (Arm Technology China) * 102bd628c1bSjames qian wang (Arm Technology China) * maximum number of inputs/outputs that can be active in the same time 103bd628c1bSjames qian wang (Arm Technology China) * Note: 104bd628c1bSjames qian wang (Arm Technology China) * the number isn't the bit number of @supported_inputs or 105bd628c1bSjames qian wang (Arm Technology China) * @supported_outputs, but may be less than it, since component may not 106bd628c1bSjames qian wang (Arm Technology China) * support enabling all @supported_inputs/outputs at the same time. 107bd628c1bSjames qian wang (Arm Technology China) */ 108bd628c1bSjames qian wang (Arm Technology China) u8 max_active_inputs; 109bd628c1bSjames qian wang (Arm Technology China) u8 max_active_outputs; 110bd628c1bSjames qian wang (Arm Technology China) /** 111bd628c1bSjames qian wang (Arm Technology China) * @supported_inputs: 112bd628c1bSjames qian wang (Arm Technology China) * @supported_outputs: 113bd628c1bSjames qian wang (Arm Technology China) * 114bd628c1bSjames qian wang (Arm Technology China) * bitmask of BIT(component->id) for the supported inputs/outputs 115bd628c1bSjames qian wang (Arm Technology China) * describes the possibilities of how a component is linked into a 116bd628c1bSjames qian wang (Arm Technology China) * pipeline. 117bd628c1bSjames qian wang (Arm Technology China) */ 118bd628c1bSjames qian wang (Arm Technology China) u32 supported_inputs; 119bd628c1bSjames qian wang (Arm Technology China) u32 supported_outputs; 120bd628c1bSjames qian wang (Arm Technology China) 121bd628c1bSjames qian wang (Arm Technology China) /** 122bd628c1bSjames qian wang (Arm Technology China) * @funcs: chip functions to access HW 123bd628c1bSjames qian wang (Arm Technology China) */ 124bd628c1bSjames qian wang (Arm Technology China) struct komeda_component_funcs *funcs; 125bd628c1bSjames qian wang (Arm Technology China) }; 126bd628c1bSjames qian wang (Arm Technology China) 127bd628c1bSjames qian wang (Arm Technology China) /** 128bd628c1bSjames qian wang (Arm Technology China) * struct komeda_component_output 129bd628c1bSjames qian wang (Arm Technology China) * 130bd628c1bSjames qian wang (Arm Technology China) * a component has multiple outputs, if want to know where the data 131bd628c1bSjames qian wang (Arm Technology China) * comes from, only know the component is not enough, we still need to know 132bd628c1bSjames qian wang (Arm Technology China) * its output port 133bd628c1bSjames qian wang (Arm Technology China) */ 134bd628c1bSjames qian wang (Arm Technology China) struct komeda_component_output { 135bd628c1bSjames qian wang (Arm Technology China) /** @component: indicate which component the data comes from */ 136bd628c1bSjames qian wang (Arm Technology China) struct komeda_component *component; 137bd628c1bSjames qian wang (Arm Technology China) /** @output_port: 138bd628c1bSjames qian wang (Arm Technology China) * the output port of the &komeda_component_output.component 139bd628c1bSjames qian wang (Arm Technology China) */ 140bd628c1bSjames qian wang (Arm Technology China) u8 output_port; 141bd628c1bSjames qian wang (Arm Technology China) }; 142bd628c1bSjames qian wang (Arm Technology China) 143bd628c1bSjames qian wang (Arm Technology China) /** 144bd628c1bSjames qian wang (Arm Technology China) * struct komeda_component_state 145bd628c1bSjames qian wang (Arm Technology China) * 146bd628c1bSjames qian wang (Arm Technology China) * component_state is the data flow configuration of the component, and it's 147bd628c1bSjames qian wang (Arm Technology China) * the superclass of all specific component_state like @komeda_layer_state, 148bd628c1bSjames qian wang (Arm Technology China) * @komeda_scaler_state 149bd628c1bSjames qian wang (Arm Technology China) */ 150bd628c1bSjames qian wang (Arm Technology China) struct komeda_component_state { 151bd628c1bSjames qian wang (Arm Technology China) /** @obj: tracking component_state by drm_atomic_state */ 152bd628c1bSjames qian wang (Arm Technology China) struct drm_private_state obj; 153bd628c1bSjames qian wang (Arm Technology China) struct komeda_component *component; 154bd628c1bSjames qian wang (Arm Technology China) /** 155bd628c1bSjames qian wang (Arm Technology China) * @binding_user: 156bd628c1bSjames qian wang (Arm Technology China) * currently bound user, the user can be crtc/plane/wb_conn, which is 157bd628c1bSjames qian wang (Arm Technology China) * valid decided by @component and @inputs 158bd628c1bSjames qian wang (Arm Technology China) * 159bd628c1bSjames qian wang (Arm Technology China) * - Layer: its user always is plane. 160bd628c1bSjames qian wang (Arm Technology China) * - compiz/improc/timing_ctrlr: the user is crtc. 161bd628c1bSjames qian wang (Arm Technology China) * - wb_layer: wb_conn; 162bd628c1bSjames qian wang (Arm Technology China) * - scaler: plane when input is layer, wb_conn if input is compiz. 163bd628c1bSjames qian wang (Arm Technology China) */ 164bd628c1bSjames qian wang (Arm Technology China) union { 165bd628c1bSjames qian wang (Arm Technology China) struct drm_crtc *crtc; 166bd628c1bSjames qian wang (Arm Technology China) struct drm_plane *plane; 167bd628c1bSjames qian wang (Arm Technology China) struct drm_connector *wb_conn; 168bd628c1bSjames qian wang (Arm Technology China) void *binding_user; 169bd628c1bSjames qian wang (Arm Technology China) }; 170bd628c1bSjames qian wang (Arm Technology China) /** 171bd628c1bSjames qian wang (Arm Technology China) * @active_inputs: 172bd628c1bSjames qian wang (Arm Technology China) * 173bd628c1bSjames qian wang (Arm Technology China) * active_inputs is bitmask of @inputs index 174bd628c1bSjames qian wang (Arm Technology China) * 175bd628c1bSjames qian wang (Arm Technology China) * - active_inputs = changed_active_inputs + unchanged_active_inputs 176bd628c1bSjames qian wang (Arm Technology China) * - affected_inputs = old->active_inputs + new->active_inputs; 177bd628c1bSjames qian wang (Arm Technology China) * - disabling_inputs = affected_inputs ^ active_inputs; 178bd628c1bSjames qian wang (Arm Technology China) * - changed_inputs = disabling_inputs + changed_active_inputs; 179bd628c1bSjames qian wang (Arm Technology China) * 180bd628c1bSjames qian wang (Arm Technology China) * NOTE: 181bd628c1bSjames qian wang (Arm Technology China) * changed_inputs doesn't include all active_input but only 182bd628c1bSjames qian wang (Arm Technology China) * @changed_active_inputs, and this bitmask can be used in chip 183bd628c1bSjames qian wang (Arm Technology China) * level for dirty update. 184bd628c1bSjames qian wang (Arm Technology China) */ 185bd628c1bSjames qian wang (Arm Technology China) u16 active_inputs; 186bd628c1bSjames qian wang (Arm Technology China) u16 changed_active_inputs; 187bd628c1bSjames qian wang (Arm Technology China) u16 affected_inputs; 188bd628c1bSjames qian wang (Arm Technology China) /** 189bd628c1bSjames qian wang (Arm Technology China) * @inputs: 190bd628c1bSjames qian wang (Arm Technology China) * 191bd628c1bSjames qian wang (Arm Technology China) * the specific inputs[i] only valid on BIT(i) has been set in 192bd628c1bSjames qian wang (Arm Technology China) * @active_inputs, if not the inputs[i] is undefined. 193bd628c1bSjames qian wang (Arm Technology China) */ 194bd628c1bSjames qian wang (Arm Technology China) struct komeda_component_output inputs[KOMEDA_COMPONENT_N_INPUTS]; 195bd628c1bSjames qian wang (Arm Technology China) }; 196bd628c1bSjames qian wang (Arm Technology China) 197bd628c1bSjames qian wang (Arm Technology China) static inline u16 component_disabling_inputs(struct komeda_component_state *st) 198bd628c1bSjames qian wang (Arm Technology China) { 199bd628c1bSjames qian wang (Arm Technology China) return st->affected_inputs ^ st->active_inputs; 200bd628c1bSjames qian wang (Arm Technology China) } 201bd628c1bSjames qian wang (Arm Technology China) 202bd628c1bSjames qian wang (Arm Technology China) static inline u16 component_changed_inputs(struct komeda_component_state *st) 203bd628c1bSjames qian wang (Arm Technology China) { 204bd628c1bSjames qian wang (Arm Technology China) return component_disabling_inputs(st) | st->changed_active_inputs; 205bd628c1bSjames qian wang (Arm Technology China) } 206bd628c1bSjames qian wang (Arm Technology China) 2077013b667Sjames qian wang (Arm Technology China) #define for_each_changed_input(st, i) \ 2087013b667Sjames qian wang (Arm Technology China) for ((i) = 0; (i) < (st)->component->max_active_inputs; (i)++) \ 2097013b667Sjames qian wang (Arm Technology China) if (has_bit((i), component_changed_inputs(st))) 2107013b667Sjames qian wang (Arm Technology China) 211bd628c1bSjames qian wang (Arm Technology China) #define to_comp(__c) (((__c) == NULL) ? NULL : &((__c)->base)) 212bd628c1bSjames qian wang (Arm Technology China) #define to_cpos(__c) ((struct komeda_component **)&(__c)) 213bd628c1bSjames qian wang (Arm Technology China) 214bd628c1bSjames qian wang (Arm Technology China) struct komeda_layer { 215bd628c1bSjames qian wang (Arm Technology China) struct komeda_component base; 21671c420b7Sjames qian wang (Arm Technology China) /* accepted h/v input range before rotation */ 21771c420b7Sjames qian wang (Arm Technology China) struct malidp_range hsize_in, vsize_in; 21871c420b7Sjames qian wang (Arm Technology China) u32 layer_type; /* RICH, SIMPLE or WB */ 21971c420b7Sjames qian wang (Arm Technology China) u32 supported_rots; 220bd628c1bSjames qian wang (Arm Technology China) }; 221bd628c1bSjames qian wang (Arm Technology China) 222bd628c1bSjames qian wang (Arm Technology China) struct komeda_layer_state { 223bd628c1bSjames qian wang (Arm Technology China) struct komeda_component_state base; 224bd628c1bSjames qian wang (Arm Technology China) /* layer specific configuration state */ 22571c420b7Sjames qian wang (Arm Technology China) u16 hsize, vsize; 22671c420b7Sjames qian wang (Arm Technology China) u32 rot; 22771c420b7Sjames qian wang (Arm Technology China) dma_addr_t addr[3]; 228bd628c1bSjames qian wang (Arm Technology China) }; 229bd628c1bSjames qian wang (Arm Technology China) 230bd628c1bSjames qian wang (Arm Technology China) struct komeda_scaler { 231bd628c1bSjames qian wang (Arm Technology China) struct komeda_component base; 232bd628c1bSjames qian wang (Arm Technology China) /* scaler features and caps */ 233bd628c1bSjames qian wang (Arm Technology China) }; 234bd628c1bSjames qian wang (Arm Technology China) 235bd628c1bSjames qian wang (Arm Technology China) struct komeda_scaler_state { 236bd628c1bSjames qian wang (Arm Technology China) struct komeda_component_state base; 237bd628c1bSjames qian wang (Arm Technology China) }; 238bd628c1bSjames qian wang (Arm Technology China) 2397013b667Sjames qian wang (Arm Technology China) struct komeda_compiz { 2407013b667Sjames qian wang (Arm Technology China) struct komeda_component base; 2417013b667Sjames qian wang (Arm Technology China) struct malidp_range hsize, vsize; 2427013b667Sjames qian wang (Arm Technology China) }; 2437013b667Sjames qian wang (Arm Technology China) 2447013b667Sjames qian wang (Arm Technology China) struct komeda_compiz_input_cfg { 2457013b667Sjames qian wang (Arm Technology China) u16 hsize, vsize; 2467013b667Sjames qian wang (Arm Technology China) u16 hoffset, voffset; 2477013b667Sjames qian wang (Arm Technology China) u8 pixel_blend_mode, layer_alpha; 2487013b667Sjames qian wang (Arm Technology China) }; 2497013b667Sjames qian wang (Arm Technology China) 2507013b667Sjames qian wang (Arm Technology China) struct komeda_compiz_state { 2517013b667Sjames qian wang (Arm Technology China) struct komeda_component_state base; 2527013b667Sjames qian wang (Arm Technology China) /* composition size */ 2537013b667Sjames qian wang (Arm Technology China) u16 hsize, vsize; 2547013b667Sjames qian wang (Arm Technology China) struct komeda_compiz_input_cfg cins[KOMEDA_COMPONENT_N_INPUTS]; 2557013b667Sjames qian wang (Arm Technology China) }; 2567013b667Sjames qian wang (Arm Technology China) 257bd628c1bSjames qian wang (Arm Technology China) struct komeda_improc { 258bd628c1bSjames qian wang (Arm Technology China) struct komeda_component base; 259f5f0a68eSjames qian wang (Arm Technology China) u32 supported_color_formats; /* DRM_RGB/YUV444/YUV420*/ 260f5f0a68eSjames qian wang (Arm Technology China) u32 supported_color_depths; /* BIT(8) | BIT(10)*/ 261f5f0a68eSjames qian wang (Arm Technology China) u8 supports_degamma : 1; 262f5f0a68eSjames qian wang (Arm Technology China) u8 supports_csc : 1; 263f5f0a68eSjames qian wang (Arm Technology China) u8 supports_gamma : 1; 264bd628c1bSjames qian wang (Arm Technology China) }; 265bd628c1bSjames qian wang (Arm Technology China) 266bd628c1bSjames qian wang (Arm Technology China) struct komeda_improc_state { 267bd628c1bSjames qian wang (Arm Technology China) struct komeda_component_state base; 268f5f0a68eSjames qian wang (Arm Technology China) u16 hsize, vsize; 269bd628c1bSjames qian wang (Arm Technology China) }; 270bd628c1bSjames qian wang (Arm Technology China) 271bd628c1bSjames qian wang (Arm Technology China) /* display timing controller */ 272bd628c1bSjames qian wang (Arm Technology China) struct komeda_timing_ctrlr { 273bd628c1bSjames qian wang (Arm Technology China) struct komeda_component base; 274f5f0a68eSjames qian wang (Arm Technology China) u8 supports_dual_link : 1; 275bd628c1bSjames qian wang (Arm Technology China) }; 276bd628c1bSjames qian wang (Arm Technology China) 277bd628c1bSjames qian wang (Arm Technology China) struct komeda_timing_ctrlr_state { 278bd628c1bSjames qian wang (Arm Technology China) struct komeda_component_state base; 279bd628c1bSjames qian wang (Arm Technology China) }; 280bd628c1bSjames qian wang (Arm Technology China) 281bd628c1bSjames qian wang (Arm Technology China) /** struct komeda_pipeline_funcs */ 282bd628c1bSjames qian wang (Arm Technology China) struct komeda_pipeline_funcs { 283bd628c1bSjames qian wang (Arm Technology China) /* dump_register: Optional, dump registers to seq_file */ 284bd628c1bSjames qian wang (Arm Technology China) void (*dump_register)(struct komeda_pipeline *pipe, 285bd628c1bSjames qian wang (Arm Technology China) struct seq_file *sf); 286bd628c1bSjames qian wang (Arm Technology China) }; 287bd628c1bSjames qian wang (Arm Technology China) 288bd628c1bSjames qian wang (Arm Technology China) /** 289bd628c1bSjames qian wang (Arm Technology China) * struct komeda_pipeline 290bd628c1bSjames qian wang (Arm Technology China) * 291bd628c1bSjames qian wang (Arm Technology China) * Represent a complete display pipeline and hold all functional components. 292bd628c1bSjames qian wang (Arm Technology China) */ 293bd628c1bSjames qian wang (Arm Technology China) struct komeda_pipeline { 294bd628c1bSjames qian wang (Arm Technology China) /** @obj: link pipeline as private obj of drm_atomic_state */ 295bd628c1bSjames qian wang (Arm Technology China) struct drm_private_obj obj; 296bd628c1bSjames qian wang (Arm Technology China) /** @mdev: the parent komeda_dev */ 297bd628c1bSjames qian wang (Arm Technology China) struct komeda_dev *mdev; 298bd628c1bSjames qian wang (Arm Technology China) /** @pxlclk: pixel clock */ 299bd628c1bSjames qian wang (Arm Technology China) struct clk *pxlclk; 300bd628c1bSjames qian wang (Arm Technology China) /** @aclk: AXI clock */ 301bd628c1bSjames qian wang (Arm Technology China) struct clk *aclk; 302bd628c1bSjames qian wang (Arm Technology China) /** @id: pipeline id */ 303bd628c1bSjames qian wang (Arm Technology China) int id; 304bd628c1bSjames qian wang (Arm Technology China) /** @avail_comps: available components mask of pipeline */ 305bd628c1bSjames qian wang (Arm Technology China) u32 avail_comps; 306bd628c1bSjames qian wang (Arm Technology China) int n_layers; 307bd628c1bSjames qian wang (Arm Technology China) struct komeda_layer *layers[KOMEDA_PIPELINE_MAX_LAYERS]; 308bd628c1bSjames qian wang (Arm Technology China) int n_scalers; 309bd628c1bSjames qian wang (Arm Technology China) struct komeda_scaler *scalers[KOMEDA_PIPELINE_MAX_SCALERS]; 310bd628c1bSjames qian wang (Arm Technology China) struct komeda_compiz *compiz; 311bd628c1bSjames qian wang (Arm Technology China) struct komeda_layer *wb_layer; 312bd628c1bSjames qian wang (Arm Technology China) struct komeda_improc *improc; 313bd628c1bSjames qian wang (Arm Technology China) struct komeda_timing_ctrlr *ctrlr; 314bd628c1bSjames qian wang (Arm Technology China) struct komeda_pipeline_funcs *funcs; /* private pipeline functions */ 31529e56aecSjames qian wang (Arm Technology China) 31629e56aecSjames qian wang (Arm Technology China) /** @of_node: pipeline dt node */ 31729e56aecSjames qian wang (Arm Technology China) struct device_node *of_node; 31829e56aecSjames qian wang (Arm Technology China) /** @of_output_port: pipeline output port */ 31929e56aecSjames qian wang (Arm Technology China) struct device_node *of_output_port; 32029e56aecSjames qian wang (Arm Technology China) /** @of_output_dev: output connector device node */ 32129e56aecSjames qian wang (Arm Technology China) struct device_node *of_output_dev; 322bd628c1bSjames qian wang (Arm Technology China) }; 323bd628c1bSjames qian wang (Arm Technology China) 324bd628c1bSjames qian wang (Arm Technology China) /** 325bd628c1bSjames qian wang (Arm Technology China) * struct komeda_pipeline_state 326bd628c1bSjames qian wang (Arm Technology China) * 327bd628c1bSjames qian wang (Arm Technology China) * NOTE: 328bd628c1bSjames qian wang (Arm Technology China) * Unlike the pipeline, pipeline_state doesn’t gather any component_state 329bd628c1bSjames qian wang (Arm Technology China) * into it. It because all component will be managed by drm_atomic_state. 330bd628c1bSjames qian wang (Arm Technology China) */ 331bd628c1bSjames qian wang (Arm Technology China) struct komeda_pipeline_state { 332bd628c1bSjames qian wang (Arm Technology China) /** @obj: tracking pipeline_state by drm_atomic_state */ 333bd628c1bSjames qian wang (Arm Technology China) struct drm_private_state obj; 334bd628c1bSjames qian wang (Arm Technology China) struct komeda_pipeline *pipe; 335bd628c1bSjames qian wang (Arm Technology China) /** @crtc: currently bound crtc */ 336bd628c1bSjames qian wang (Arm Technology China) struct drm_crtc *crtc; 337bd628c1bSjames qian wang (Arm Technology China) /** 338bd628c1bSjames qian wang (Arm Technology China) * @active_comps: 339bd628c1bSjames qian wang (Arm Technology China) * 340bd628c1bSjames qian wang (Arm Technology China) * bitmask - BIT(component->id) of active components 341bd628c1bSjames qian wang (Arm Technology China) */ 342bd628c1bSjames qian wang (Arm Technology China) u32 active_comps; 343bd628c1bSjames qian wang (Arm Technology China) }; 344bd628c1bSjames qian wang (Arm Technology China) 345bd628c1bSjames qian wang (Arm Technology China) #define to_layer(c) container_of(c, struct komeda_layer, base) 346bd628c1bSjames qian wang (Arm Technology China) #define to_compiz(c) container_of(c, struct komeda_compiz, base) 347bd628c1bSjames qian wang (Arm Technology China) #define to_scaler(c) container_of(c, struct komeda_scaler, base) 348bd628c1bSjames qian wang (Arm Technology China) #define to_improc(c) container_of(c, struct komeda_improc, base) 349bd628c1bSjames qian wang (Arm Technology China) #define to_ctrlr(c) container_of(c, struct komeda_timing_ctrlr, base) 350bd628c1bSjames qian wang (Arm Technology China) 351bd628c1bSjames qian wang (Arm Technology China) #define to_layer_st(c) container_of(c, struct komeda_layer_state, base) 352bd628c1bSjames qian wang (Arm Technology China) #define to_compiz_st(c) container_of(c, struct komeda_compiz_state, base) 353bd628c1bSjames qian wang (Arm Technology China) #define to_scaler_st(c) container_of(c, struct komeda_scaler_state, base) 354bd628c1bSjames qian wang (Arm Technology China) #define to_improc_st(c) container_of(c, struct komeda_improc_state, base) 355bd628c1bSjames qian wang (Arm Technology China) #define to_ctrlr_st(c) container_of(c, struct komeda_timing_ctrlr_state, base) 356bd628c1bSjames qian wang (Arm Technology China) 35761f1c4a8Sjames qian wang (Arm Technology China) #define priv_to_comp_st(o) container_of(o, struct komeda_component_state, obj) 35861f1c4a8Sjames qian wang (Arm Technology China) #define priv_to_pipe_st(o) container_of(o, struct komeda_pipeline_state, obj) 35961f1c4a8Sjames qian wang (Arm Technology China) 360bd628c1bSjames qian wang (Arm Technology China) /* pipeline APIs */ 361bd628c1bSjames qian wang (Arm Technology China) struct komeda_pipeline * 362bd628c1bSjames qian wang (Arm Technology China) komeda_pipeline_add(struct komeda_dev *mdev, size_t size, 363bd628c1bSjames qian wang (Arm Technology China) struct komeda_pipeline_funcs *funcs); 364bd628c1bSjames qian wang (Arm Technology China) void komeda_pipeline_destroy(struct komeda_dev *mdev, 365bd628c1bSjames qian wang (Arm Technology China) struct komeda_pipeline *pipe); 366bd628c1bSjames qian wang (Arm Technology China) 367bd628c1bSjames qian wang (Arm Technology China) struct komeda_component * 368bd628c1bSjames qian wang (Arm Technology China) komeda_pipeline_get_component(struct komeda_pipeline *pipe, int id); 369bd628c1bSjames qian wang (Arm Technology China) 370bd628c1bSjames qian wang (Arm Technology China) /* component APIs */ 371bd628c1bSjames qian wang (Arm Technology China) struct komeda_component * 372bd628c1bSjames qian wang (Arm Technology China) komeda_component_add(struct komeda_pipeline *pipe, 373bd628c1bSjames qian wang (Arm Technology China) size_t comp_sz, u32 id, u32 hw_id, 374bd628c1bSjames qian wang (Arm Technology China) struct komeda_component_funcs *funcs, 375bd628c1bSjames qian wang (Arm Technology China) u8 max_active_inputs, u32 supported_inputs, 376bd628c1bSjames qian wang (Arm Technology China) u8 max_active_outputs, u32 __iomem *reg, 377bd628c1bSjames qian wang (Arm Technology China) const char *name_fmt, ...); 378bd628c1bSjames qian wang (Arm Technology China) 379bd628c1bSjames qian wang (Arm Technology China) void komeda_component_destroy(struct komeda_dev *mdev, 380bd628c1bSjames qian wang (Arm Technology China) struct komeda_component *c); 381bd628c1bSjames qian wang (Arm Technology China) 382bd628c1bSjames qian wang (Arm Technology China) #endif /* _KOMEDA_PIPELINE_H_*/ 383