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) 207bd628c1bSjames qian wang (Arm Technology China) #define to_comp(__c) (((__c) == NULL) ? NULL : &((__c)->base)) 208bd628c1bSjames qian wang (Arm Technology China) #define to_cpos(__c) ((struct komeda_component **)&(__c)) 209bd628c1bSjames qian wang (Arm Technology China) 210bd628c1bSjames qian wang (Arm Technology China) /* these structures are going to be filled in in uture patches */ 211bd628c1bSjames qian wang (Arm Technology China) struct komeda_layer { 212bd628c1bSjames qian wang (Arm Technology China) struct komeda_component base; 213bd628c1bSjames qian wang (Arm Technology China) /* layer specific features and caps */ 214bd628c1bSjames qian wang (Arm Technology China) }; 215bd628c1bSjames qian wang (Arm Technology China) 216bd628c1bSjames qian wang (Arm Technology China) struct komeda_layer_state { 217bd628c1bSjames qian wang (Arm Technology China) struct komeda_component_state base; 218bd628c1bSjames qian wang (Arm Technology China) /* layer specific configuration state */ 219bd628c1bSjames qian wang (Arm Technology China) }; 220bd628c1bSjames qian wang (Arm Technology China) 221bd628c1bSjames qian wang (Arm Technology China) struct komeda_compiz { 222bd628c1bSjames qian wang (Arm Technology China) struct komeda_component base; 223bd628c1bSjames qian wang (Arm Technology China) /* compiz specific features and caps */ 224bd628c1bSjames qian wang (Arm Technology China) }; 225bd628c1bSjames qian wang (Arm Technology China) 226bd628c1bSjames qian wang (Arm Technology China) struct komeda_compiz_state { 227bd628c1bSjames qian wang (Arm Technology China) struct komeda_component_state base; 228bd628c1bSjames qian wang (Arm Technology China) /* compiz specific configuration state */ 229bd628c1bSjames qian wang (Arm Technology China) }; 230bd628c1bSjames qian wang (Arm Technology China) 231bd628c1bSjames qian wang (Arm Technology China) struct komeda_scaler { 232bd628c1bSjames qian wang (Arm Technology China) struct komeda_component base; 233bd628c1bSjames qian wang (Arm Technology China) /* scaler features and caps */ 234bd628c1bSjames qian wang (Arm Technology China) }; 235bd628c1bSjames qian wang (Arm Technology China) 236bd628c1bSjames qian wang (Arm Technology China) struct komeda_scaler_state { 237bd628c1bSjames qian wang (Arm Technology China) struct komeda_component_state base; 238bd628c1bSjames qian wang (Arm Technology China) }; 239bd628c1bSjames qian wang (Arm Technology China) 240bd628c1bSjames qian wang (Arm Technology China) struct komeda_improc { 241bd628c1bSjames qian wang (Arm Technology China) struct komeda_component base; 242bd628c1bSjames qian wang (Arm Technology China) }; 243bd628c1bSjames qian wang (Arm Technology China) 244bd628c1bSjames qian wang (Arm Technology China) struct komeda_improc_state { 245bd628c1bSjames qian wang (Arm Technology China) struct komeda_component_state base; 246bd628c1bSjames qian wang (Arm Technology China) }; 247bd628c1bSjames qian wang (Arm Technology China) 248bd628c1bSjames qian wang (Arm Technology China) /* display timing controller */ 249bd628c1bSjames qian wang (Arm Technology China) struct komeda_timing_ctrlr { 250bd628c1bSjames qian wang (Arm Technology China) struct komeda_component base; 251bd628c1bSjames qian wang (Arm Technology China) }; 252bd628c1bSjames qian wang (Arm Technology China) 253bd628c1bSjames qian wang (Arm Technology China) struct komeda_timing_ctrlr_state { 254bd628c1bSjames qian wang (Arm Technology China) struct komeda_component_state base; 255bd628c1bSjames qian wang (Arm Technology China) }; 256bd628c1bSjames qian wang (Arm Technology China) 257bd628c1bSjames qian wang (Arm Technology China) /** struct komeda_pipeline_funcs */ 258bd628c1bSjames qian wang (Arm Technology China) struct komeda_pipeline_funcs { 259bd628c1bSjames qian wang (Arm Technology China) /* dump_register: Optional, dump registers to seq_file */ 260bd628c1bSjames qian wang (Arm Technology China) void (*dump_register)(struct komeda_pipeline *pipe, 261bd628c1bSjames qian wang (Arm Technology China) struct seq_file *sf); 262bd628c1bSjames qian wang (Arm Technology China) }; 263bd628c1bSjames qian wang (Arm Technology China) 264bd628c1bSjames qian wang (Arm Technology China) /** 265bd628c1bSjames qian wang (Arm Technology China) * struct komeda_pipeline 266bd628c1bSjames qian wang (Arm Technology China) * 267bd628c1bSjames qian wang (Arm Technology China) * Represent a complete display pipeline and hold all functional components. 268bd628c1bSjames qian wang (Arm Technology China) */ 269bd628c1bSjames qian wang (Arm Technology China) struct komeda_pipeline { 270bd628c1bSjames qian wang (Arm Technology China) /** @obj: link pipeline as private obj of drm_atomic_state */ 271bd628c1bSjames qian wang (Arm Technology China) struct drm_private_obj obj; 272bd628c1bSjames qian wang (Arm Technology China) /** @mdev: the parent komeda_dev */ 273bd628c1bSjames qian wang (Arm Technology China) struct komeda_dev *mdev; 274bd628c1bSjames qian wang (Arm Technology China) /** @pxlclk: pixel clock */ 275bd628c1bSjames qian wang (Arm Technology China) struct clk *pxlclk; 276bd628c1bSjames qian wang (Arm Technology China) /** @aclk: AXI clock */ 277bd628c1bSjames qian wang (Arm Technology China) struct clk *aclk; 278bd628c1bSjames qian wang (Arm Technology China) /** @id: pipeline id */ 279bd628c1bSjames qian wang (Arm Technology China) int id; 280bd628c1bSjames qian wang (Arm Technology China) /** @avail_comps: available components mask of pipeline */ 281bd628c1bSjames qian wang (Arm Technology China) u32 avail_comps; 282bd628c1bSjames qian wang (Arm Technology China) int n_layers; 283bd628c1bSjames qian wang (Arm Technology China) struct komeda_layer *layers[KOMEDA_PIPELINE_MAX_LAYERS]; 284bd628c1bSjames qian wang (Arm Technology China) int n_scalers; 285bd628c1bSjames qian wang (Arm Technology China) struct komeda_scaler *scalers[KOMEDA_PIPELINE_MAX_SCALERS]; 286bd628c1bSjames qian wang (Arm Technology China) struct komeda_compiz *compiz; 287bd628c1bSjames qian wang (Arm Technology China) struct komeda_layer *wb_layer; 288bd628c1bSjames qian wang (Arm Technology China) struct komeda_improc *improc; 289bd628c1bSjames qian wang (Arm Technology China) struct komeda_timing_ctrlr *ctrlr; 290bd628c1bSjames qian wang (Arm Technology China) struct komeda_pipeline_funcs *funcs; /* private pipeline functions */ 291bd628c1bSjames qian wang (Arm Technology China) }; 292bd628c1bSjames qian wang (Arm Technology China) 293bd628c1bSjames qian wang (Arm Technology China) /** 294bd628c1bSjames qian wang (Arm Technology China) * struct komeda_pipeline_state 295bd628c1bSjames qian wang (Arm Technology China) * 296bd628c1bSjames qian wang (Arm Technology China) * NOTE: 297bd628c1bSjames qian wang (Arm Technology China) * Unlike the pipeline, pipeline_state doesn’t gather any component_state 298bd628c1bSjames qian wang (Arm Technology China) * into it. It because all component will be managed by drm_atomic_state. 299bd628c1bSjames qian wang (Arm Technology China) */ 300bd628c1bSjames qian wang (Arm Technology China) struct komeda_pipeline_state { 301bd628c1bSjames qian wang (Arm Technology China) /** @obj: tracking pipeline_state by drm_atomic_state */ 302bd628c1bSjames qian wang (Arm Technology China) struct drm_private_state obj; 303bd628c1bSjames qian wang (Arm Technology China) struct komeda_pipeline *pipe; 304bd628c1bSjames qian wang (Arm Technology China) /** @crtc: currently bound crtc */ 305bd628c1bSjames qian wang (Arm Technology China) struct drm_crtc *crtc; 306bd628c1bSjames qian wang (Arm Technology China) /** 307bd628c1bSjames qian wang (Arm Technology China) * @active_comps: 308bd628c1bSjames qian wang (Arm Technology China) * 309bd628c1bSjames qian wang (Arm Technology China) * bitmask - BIT(component->id) of active components 310bd628c1bSjames qian wang (Arm Technology China) */ 311bd628c1bSjames qian wang (Arm Technology China) u32 active_comps; 312bd628c1bSjames qian wang (Arm Technology China) }; 313bd628c1bSjames qian wang (Arm Technology China) 314bd628c1bSjames qian wang (Arm Technology China) #define to_layer(c) container_of(c, struct komeda_layer, base) 315bd628c1bSjames qian wang (Arm Technology China) #define to_compiz(c) container_of(c, struct komeda_compiz, base) 316bd628c1bSjames qian wang (Arm Technology China) #define to_scaler(c) container_of(c, struct komeda_scaler, base) 317bd628c1bSjames qian wang (Arm Technology China) #define to_improc(c) container_of(c, struct komeda_improc, base) 318bd628c1bSjames qian wang (Arm Technology China) #define to_ctrlr(c) container_of(c, struct komeda_timing_ctrlr, base) 319bd628c1bSjames qian wang (Arm Technology China) 320bd628c1bSjames qian wang (Arm Technology China) #define to_layer_st(c) container_of(c, struct komeda_layer_state, base) 321bd628c1bSjames qian wang (Arm Technology China) #define to_compiz_st(c) container_of(c, struct komeda_compiz_state, base) 322bd628c1bSjames qian wang (Arm Technology China) #define to_scaler_st(c) container_of(c, struct komeda_scaler_state, base) 323bd628c1bSjames qian wang (Arm Technology China) #define to_improc_st(c) container_of(c, struct komeda_improc_state, base) 324bd628c1bSjames qian wang (Arm Technology China) #define to_ctrlr_st(c) container_of(c, struct komeda_timing_ctrlr_state, base) 325bd628c1bSjames qian wang (Arm Technology China) 326bd628c1bSjames qian wang (Arm Technology China) /* pipeline APIs */ 327bd628c1bSjames qian wang (Arm Technology China) struct komeda_pipeline * 328bd628c1bSjames qian wang (Arm Technology China) komeda_pipeline_add(struct komeda_dev *mdev, size_t size, 329bd628c1bSjames qian wang (Arm Technology China) struct komeda_pipeline_funcs *funcs); 330bd628c1bSjames qian wang (Arm Technology China) void komeda_pipeline_destroy(struct komeda_dev *mdev, 331bd628c1bSjames qian wang (Arm Technology China) struct komeda_pipeline *pipe); 332bd628c1bSjames qian wang (Arm Technology China) 333bd628c1bSjames qian wang (Arm Technology China) struct komeda_component * 334bd628c1bSjames qian wang (Arm Technology China) komeda_pipeline_get_component(struct komeda_pipeline *pipe, int id); 335bd628c1bSjames qian wang (Arm Technology China) 336bd628c1bSjames qian wang (Arm Technology China) /* component APIs */ 337bd628c1bSjames qian wang (Arm Technology China) struct komeda_component * 338bd628c1bSjames qian wang (Arm Technology China) komeda_component_add(struct komeda_pipeline *pipe, 339bd628c1bSjames qian wang (Arm Technology China) size_t comp_sz, u32 id, u32 hw_id, 340bd628c1bSjames qian wang (Arm Technology China) struct komeda_component_funcs *funcs, 341bd628c1bSjames qian wang (Arm Technology China) u8 max_active_inputs, u32 supported_inputs, 342bd628c1bSjames qian wang (Arm Technology China) u8 max_active_outputs, u32 __iomem *reg, 343bd628c1bSjames qian wang (Arm Technology China) const char *name_fmt, ...); 344bd628c1bSjames qian wang (Arm Technology China) 345bd628c1bSjames qian wang (Arm Technology China) void komeda_component_destroy(struct komeda_dev *mdev, 346bd628c1bSjames qian wang (Arm Technology China) struct komeda_component *c); 347bd628c1bSjames qian wang (Arm Technology China) 348bd628c1bSjames qian wang (Arm Technology China) #endif /* _KOMEDA_PIPELINE_H_*/ 349