1557c3736Sjames qian wang (Arm Technology China).. SPDX-License-Identifier: GPL-2.0 2557c3736Sjames qian wang (Arm Technology China) 3557c3736Sjames qian wang (Arm Technology China)============================== 4557c3736Sjames qian wang (Arm Technology China) drm/komeda Arm display driver 5557c3736Sjames qian wang (Arm Technology China)============================== 6557c3736Sjames qian wang (Arm Technology China) 7557c3736Sjames qian wang (Arm Technology China)The drm/komeda driver supports the Arm display processor D71 and later products, 8557c3736Sjames qian wang (Arm Technology China)this document gives a brief overview of driver design: how it works and why 9557c3736Sjames qian wang (Arm Technology China)design it like that. 10557c3736Sjames qian wang (Arm Technology China) 11557c3736Sjames qian wang (Arm Technology China)Overview of D71 like display IPs 12557c3736Sjames qian wang (Arm Technology China)================================ 13557c3736Sjames qian wang (Arm Technology China) 14557c3736Sjames qian wang (Arm Technology China)From D71, Arm display IP begins to adopt a flexible and modularized 15557c3736Sjames qian wang (Arm Technology China)architecture. A display pipeline is made up of multiple individual and 16557c3736Sjames qian wang (Arm Technology China)functional pipeline stages called components, and every component has some 17557c3736Sjames qian wang (Arm Technology China)specific capabilities that can give the flowed pipeline pixel data a 18557c3736Sjames qian wang (Arm Technology China)particular processing. 19557c3736Sjames qian wang (Arm Technology China) 20557c3736Sjames qian wang (Arm Technology China)Typical D71 components: 21557c3736Sjames qian wang (Arm Technology China) 22557c3736Sjames qian wang (Arm Technology China)Layer 23557c3736Sjames qian wang (Arm Technology China)----- 24557c3736Sjames qian wang (Arm Technology China)Layer is the first pipeline stage, which prepares the pixel data for the next 25557c3736Sjames qian wang (Arm Technology China)stage. It fetches the pixel from memory, decodes it if it's AFBC, rotates the 26557c3736Sjames qian wang (Arm Technology China)source image, unpacks or converts YUV pixels to the device internal RGB pixels, 27557c3736Sjames qian wang (Arm Technology China)then adjusts the color_space of pixels if needed. 28557c3736Sjames qian wang (Arm Technology China) 29557c3736Sjames qian wang (Arm Technology China)Scaler 30557c3736Sjames qian wang (Arm Technology China)------ 31557c3736Sjames qian wang (Arm Technology China)As its name suggests, scaler takes responsibility for scaling, and D71 also 32557c3736Sjames qian wang (Arm Technology China)supports image enhancements by scaler. 33557c3736Sjames qian wang (Arm Technology China)The usage of scaler is very flexible and can be connected to layer output 34557c3736Sjames qian wang (Arm Technology China)for layer scaling, or connected to compositor and scale the whole display 35557c3736Sjames qian wang (Arm Technology China)frame and then feed the output data into wb_layer which will then write it 36557c3736Sjames qian wang (Arm Technology China)into memory. 37557c3736Sjames qian wang (Arm Technology China) 38557c3736Sjames qian wang (Arm Technology China)Compositor (compiz) 39557c3736Sjames qian wang (Arm Technology China)------------------- 40557c3736Sjames qian wang (Arm Technology China)Compositor blends multiple layers or pixel data flows into one single display 41557c3736Sjames qian wang (Arm Technology China)frame. its output frame can be fed into post image processor for showing it on 42557c3736Sjames qian wang (Arm Technology China)the monitor or fed into wb_layer and written to memory at the same time. 43557c3736Sjames qian wang (Arm Technology China)user can also insert a scaler between compositor and wb_layer to down scale 44686ebbfeSRandy Dunlapthe display frame first and then write to memory. 45557c3736Sjames qian wang (Arm Technology China) 46557c3736Sjames qian wang (Arm Technology China)Writeback Layer (wb_layer) 47557c3736Sjames qian wang (Arm Technology China)-------------------------- 48557c3736Sjames qian wang (Arm Technology China)Writeback layer does the opposite things of Layer, which connects to compiz 49557c3736Sjames qian wang (Arm Technology China)and writes the composition result to memory. 50557c3736Sjames qian wang (Arm Technology China) 51557c3736Sjames qian wang (Arm Technology China)Post image processor (improc) 52557c3736Sjames qian wang (Arm Technology China)----------------------------- 53557c3736Sjames qian wang (Arm Technology China)Post image processor adjusts frame data like gamma and color space to fit the 54557c3736Sjames qian wang (Arm Technology China)requirements of the monitor. 55557c3736Sjames qian wang (Arm Technology China) 56557c3736Sjames qian wang (Arm Technology China)Timing controller (timing_ctrlr) 57557c3736Sjames qian wang (Arm Technology China)-------------------------------- 58557c3736Sjames qian wang (Arm Technology China)Final stage of display pipeline, Timing controller is not for the pixel 59557c3736Sjames qian wang (Arm Technology China)handling, but only for controlling the display timing. 60557c3736Sjames qian wang (Arm Technology China) 61557c3736Sjames qian wang (Arm Technology China)Merger 62557c3736Sjames qian wang (Arm Technology China)------ 63557c3736Sjames qian wang (Arm Technology China)D71 scaler mostly only has the half horizontal input/output capabilities 64557c3736Sjames qian wang (Arm Technology China)compared with Layer, like if Layer supports 4K input size, the scaler only can 65557c3736Sjames qian wang (Arm Technology China)support 2K input/output in the same time. To achieve the ful frame scaling, D71 66557c3736Sjames qian wang (Arm Technology China)introduces Layer Split, which splits the whole image to two half parts and feeds 67557c3736Sjames qian wang (Arm Technology China)them to two Layers A and B, and does the scaling independently. After scaling 68557c3736Sjames qian wang (Arm Technology China)the result need to be fed to merger to merge two part images together, and then 69557c3736Sjames qian wang (Arm Technology China)output merged result to compiz. 70557c3736Sjames qian wang (Arm Technology China) 71557c3736Sjames qian wang (Arm Technology China)Splitter 72557c3736Sjames qian wang (Arm Technology China)-------- 73557c3736Sjames qian wang (Arm Technology China)Similar to Layer Split, but Splitter is used for writeback, which splits the 74557c3736Sjames qian wang (Arm Technology China)compiz result to two parts and then feed them to two scalers. 75557c3736Sjames qian wang (Arm Technology China) 76557c3736Sjames qian wang (Arm Technology China)Possible D71 Pipeline usage 77557c3736Sjames qian wang (Arm Technology China)=========================== 78557c3736Sjames qian wang (Arm Technology China) 79557c3736Sjames qian wang (Arm Technology China)Benefitting from the modularized architecture, D71 pipelines can be easily 80557c3736Sjames qian wang (Arm Technology China)adjusted to fit different usages. And D71 has two pipelines, which support two 81557c3736Sjames qian wang (Arm Technology China)types of working mode: 82557c3736Sjames qian wang (Arm Technology China) 83557c3736Sjames qian wang (Arm Technology China)- Dual display mode 84557c3736Sjames qian wang (Arm Technology China) Two pipelines work independently and separately to drive two display outputs. 85557c3736Sjames qian wang (Arm Technology China) 86557c3736Sjames qian wang (Arm Technology China)- Single display mode 87557c3736Sjames qian wang (Arm Technology China) Two pipelines work together to drive only one display output. 88557c3736Sjames qian wang (Arm Technology China) 89557c3736Sjames qian wang (Arm Technology China) On this mode, pipeline_B doesn't work indenpendently, but outputs its 90557c3736Sjames qian wang (Arm Technology China) composition result into pipeline_A, and its pixel timing also derived from 91557c3736Sjames qian wang (Arm Technology China) pipeline_A.timing_ctrlr. The pipeline_B works just like a "slave" of 92557c3736Sjames qian wang (Arm Technology China) pipeline_A(master) 93557c3736Sjames qian wang (Arm Technology China) 94557c3736Sjames qian wang (Arm Technology China)Single pipeline data flow 95557c3736Sjames qian wang (Arm Technology China)------------------------- 96557c3736Sjames qian wang (Arm Technology China) 97557c3736Sjames qian wang (Arm Technology China).. kernel-render:: DOT 98557c3736Sjames qian wang (Arm Technology China) :alt: Single pipeline digraph 99557c3736Sjames qian wang (Arm Technology China) :caption: Single pipeline data flow 100557c3736Sjames qian wang (Arm Technology China) 101557c3736Sjames qian wang (Arm Technology China) digraph single_ppl { 102557c3736Sjames qian wang (Arm Technology China) rankdir=LR; 103557c3736Sjames qian wang (Arm Technology China) 104557c3736Sjames qian wang (Arm Technology China) subgraph { 105557c3736Sjames qian wang (Arm Technology China) "Memory"; 106557c3736Sjames qian wang (Arm Technology China) "Monitor"; 107557c3736Sjames qian wang (Arm Technology China) } 108557c3736Sjames qian wang (Arm Technology China) 109557c3736Sjames qian wang (Arm Technology China) subgraph cluster_pipeline { 110557c3736Sjames qian wang (Arm Technology China) style=dashed 111557c3736Sjames qian wang (Arm Technology China) node [shape=box] 112557c3736Sjames qian wang (Arm Technology China) { 113557c3736Sjames qian wang (Arm Technology China) node [bgcolor=grey style=dashed] 114557c3736Sjames qian wang (Arm Technology China) "Scaler-0"; 115557c3736Sjames qian wang (Arm Technology China) "Scaler-1"; 116557c3736Sjames qian wang (Arm Technology China) "Scaler-0/1" 117557c3736Sjames qian wang (Arm Technology China) } 118557c3736Sjames qian wang (Arm Technology China) 119557c3736Sjames qian wang (Arm Technology China) node [bgcolor=grey style=filled] 120557c3736Sjames qian wang (Arm Technology China) "Layer-0" -> "Scaler-0" 121557c3736Sjames qian wang (Arm Technology China) "Layer-1" -> "Scaler-0" 122557c3736Sjames qian wang (Arm Technology China) "Layer-2" -> "Scaler-1" 123557c3736Sjames qian wang (Arm Technology China) "Layer-3" -> "Scaler-1" 124557c3736Sjames qian wang (Arm Technology China) 125557c3736Sjames qian wang (Arm Technology China) "Layer-0" -> "Compiz" 126557c3736Sjames qian wang (Arm Technology China) "Layer-1" -> "Compiz" 127557c3736Sjames qian wang (Arm Technology China) "Layer-2" -> "Compiz" 128557c3736Sjames qian wang (Arm Technology China) "Layer-3" -> "Compiz" 129557c3736Sjames qian wang (Arm Technology China) "Scaler-0" -> "Compiz" 130557c3736Sjames qian wang (Arm Technology China) "Scaler-1" -> "Compiz" 131557c3736Sjames qian wang (Arm Technology China) 132557c3736Sjames qian wang (Arm Technology China) "Compiz" -> "Scaler-0/1" -> "Wb_layer" 133557c3736Sjames qian wang (Arm Technology China) "Compiz" -> "Improc" -> "Timing Controller" 134557c3736Sjames qian wang (Arm Technology China) } 135557c3736Sjames qian wang (Arm Technology China) 136557c3736Sjames qian wang (Arm Technology China) "Wb_layer" -> "Memory" 137557c3736Sjames qian wang (Arm Technology China) "Timing Controller" -> "Monitor" 138557c3736Sjames qian wang (Arm Technology China) } 139557c3736Sjames qian wang (Arm Technology China) 140557c3736Sjames qian wang (Arm Technology China)Dual pipeline with Slave enabled 141557c3736Sjames qian wang (Arm Technology China)-------------------------------- 142557c3736Sjames qian wang (Arm Technology China) 143557c3736Sjames qian wang (Arm Technology China).. kernel-render:: DOT 144557c3736Sjames qian wang (Arm Technology China) :alt: Slave pipeline digraph 145557c3736Sjames qian wang (Arm Technology China) :caption: Slave pipeline enabled data flow 146557c3736Sjames qian wang (Arm Technology China) 147557c3736Sjames qian wang (Arm Technology China) digraph slave_ppl { 148557c3736Sjames qian wang (Arm Technology China) rankdir=LR; 149557c3736Sjames qian wang (Arm Technology China) 150557c3736Sjames qian wang (Arm Technology China) subgraph { 151557c3736Sjames qian wang (Arm Technology China) "Memory"; 152557c3736Sjames qian wang (Arm Technology China) "Monitor"; 153557c3736Sjames qian wang (Arm Technology China) } 154557c3736Sjames qian wang (Arm Technology China) node [shape=box] 155557c3736Sjames qian wang (Arm Technology China) subgraph cluster_pipeline_slave { 156557c3736Sjames qian wang (Arm Technology China) style=dashed 157557c3736Sjames qian wang (Arm Technology China) label="Slave Pipeline_B" 158557c3736Sjames qian wang (Arm Technology China) node [shape=box] 159557c3736Sjames qian wang (Arm Technology China) { 160557c3736Sjames qian wang (Arm Technology China) node [bgcolor=grey style=dashed] 161557c3736Sjames qian wang (Arm Technology China) "Slave.Scaler-0"; 162557c3736Sjames qian wang (Arm Technology China) "Slave.Scaler-1"; 163557c3736Sjames qian wang (Arm Technology China) } 164557c3736Sjames qian wang (Arm Technology China) 165557c3736Sjames qian wang (Arm Technology China) node [bgcolor=grey style=filled] 166557c3736Sjames qian wang (Arm Technology China) "Slave.Layer-0" -> "Slave.Scaler-0" 167557c3736Sjames qian wang (Arm Technology China) "Slave.Layer-1" -> "Slave.Scaler-0" 168557c3736Sjames qian wang (Arm Technology China) "Slave.Layer-2" -> "Slave.Scaler-1" 169557c3736Sjames qian wang (Arm Technology China) "Slave.Layer-3" -> "Slave.Scaler-1" 170557c3736Sjames qian wang (Arm Technology China) 171557c3736Sjames qian wang (Arm Technology China) "Slave.Layer-0" -> "Slave.Compiz" 172557c3736Sjames qian wang (Arm Technology China) "Slave.Layer-1" -> "Slave.Compiz" 173557c3736Sjames qian wang (Arm Technology China) "Slave.Layer-2" -> "Slave.Compiz" 174557c3736Sjames qian wang (Arm Technology China) "Slave.Layer-3" -> "Slave.Compiz" 175557c3736Sjames qian wang (Arm Technology China) "Slave.Scaler-0" -> "Slave.Compiz" 176557c3736Sjames qian wang (Arm Technology China) "Slave.Scaler-1" -> "Slave.Compiz" 177557c3736Sjames qian wang (Arm Technology China) } 178557c3736Sjames qian wang (Arm Technology China) 179557c3736Sjames qian wang (Arm Technology China) subgraph cluster_pipeline_master { 180557c3736Sjames qian wang (Arm Technology China) style=dashed 181557c3736Sjames qian wang (Arm Technology China) label="Master Pipeline_A" 182557c3736Sjames qian wang (Arm Technology China) node [shape=box] 183557c3736Sjames qian wang (Arm Technology China) { 184557c3736Sjames qian wang (Arm Technology China) node [bgcolor=grey style=dashed] 185557c3736Sjames qian wang (Arm Technology China) "Scaler-0"; 186557c3736Sjames qian wang (Arm Technology China) "Scaler-1"; 187557c3736Sjames qian wang (Arm Technology China) "Scaler-0/1" 188557c3736Sjames qian wang (Arm Technology China) } 189557c3736Sjames qian wang (Arm Technology China) 190557c3736Sjames qian wang (Arm Technology China) node [bgcolor=grey style=filled] 191557c3736Sjames qian wang (Arm Technology China) "Layer-0" -> "Scaler-0" 192557c3736Sjames qian wang (Arm Technology China) "Layer-1" -> "Scaler-0" 193557c3736Sjames qian wang (Arm Technology China) "Layer-2" -> "Scaler-1" 194557c3736Sjames qian wang (Arm Technology China) "Layer-3" -> "Scaler-1" 195557c3736Sjames qian wang (Arm Technology China) 196557c3736Sjames qian wang (Arm Technology China) "Slave.Compiz" -> "Compiz" 197557c3736Sjames qian wang (Arm Technology China) "Layer-0" -> "Compiz" 198557c3736Sjames qian wang (Arm Technology China) "Layer-1" -> "Compiz" 199557c3736Sjames qian wang (Arm Technology China) "Layer-2" -> "Compiz" 200557c3736Sjames qian wang (Arm Technology China) "Layer-3" -> "Compiz" 201557c3736Sjames qian wang (Arm Technology China) "Scaler-0" -> "Compiz" 202557c3736Sjames qian wang (Arm Technology China) "Scaler-1" -> "Compiz" 203557c3736Sjames qian wang (Arm Technology China) 204557c3736Sjames qian wang (Arm Technology China) "Compiz" -> "Scaler-0/1" -> "Wb_layer" 205557c3736Sjames qian wang (Arm Technology China) "Compiz" -> "Improc" -> "Timing Controller" 206557c3736Sjames qian wang (Arm Technology China) } 207557c3736Sjames qian wang (Arm Technology China) 208557c3736Sjames qian wang (Arm Technology China) "Wb_layer" -> "Memory" 209557c3736Sjames qian wang (Arm Technology China) "Timing Controller" -> "Monitor" 210557c3736Sjames qian wang (Arm Technology China) } 211557c3736Sjames qian wang (Arm Technology China) 212557c3736Sjames qian wang (Arm Technology China)Sub-pipelines for input and output 213557c3736Sjames qian wang (Arm Technology China)---------------------------------- 214557c3736Sjames qian wang (Arm Technology China) 215557c3736Sjames qian wang (Arm Technology China)A complete display pipeline can be easily divided into three sub-pipelines 216557c3736Sjames qian wang (Arm Technology China)according to the in/out usage. 217557c3736Sjames qian wang (Arm Technology China) 218557c3736Sjames qian wang (Arm Technology China)Layer(input) pipeline 219557c3736Sjames qian wang (Arm Technology China)~~~~~~~~~~~~~~~~~~~~~ 220557c3736Sjames qian wang (Arm Technology China) 221557c3736Sjames qian wang (Arm Technology China).. kernel-render:: DOT 222557c3736Sjames qian wang (Arm Technology China) :alt: Layer data digraph 223557c3736Sjames qian wang (Arm Technology China) :caption: Layer (input) data flow 224557c3736Sjames qian wang (Arm Technology China) 225557c3736Sjames qian wang (Arm Technology China) digraph layer_data_flow { 226557c3736Sjames qian wang (Arm Technology China) rankdir=LR; 227557c3736Sjames qian wang (Arm Technology China) node [shape=box] 228557c3736Sjames qian wang (Arm Technology China) 229557c3736Sjames qian wang (Arm Technology China) { 230557c3736Sjames qian wang (Arm Technology China) node [bgcolor=grey style=dashed] 231557c3736Sjames qian wang (Arm Technology China) "Scaler-n"; 232557c3736Sjames qian wang (Arm Technology China) } 233557c3736Sjames qian wang (Arm Technology China) 234557c3736Sjames qian wang (Arm Technology China) "Layer-n" -> "Scaler-n" -> "Compiz" 235557c3736Sjames qian wang (Arm Technology China) } 236557c3736Sjames qian wang (Arm Technology China) 237557c3736Sjames qian wang (Arm Technology China).. kernel-render:: DOT 238557c3736Sjames qian wang (Arm Technology China) :alt: Layer Split digraph 239557c3736Sjames qian wang (Arm Technology China) :caption: Layer Split pipeline 240557c3736Sjames qian wang (Arm Technology China) 241557c3736Sjames qian wang (Arm Technology China) digraph layer_data_flow { 242557c3736Sjames qian wang (Arm Technology China) rankdir=LR; 243557c3736Sjames qian wang (Arm Technology China) node [shape=box] 244557c3736Sjames qian wang (Arm Technology China) 245557c3736Sjames qian wang (Arm Technology China) "Layer-0/1" -> "Scaler-0" -> "Merger" 246557c3736Sjames qian wang (Arm Technology China) "Layer-2/3" -> "Scaler-1" -> "Merger" 247557c3736Sjames qian wang (Arm Technology China) "Merger" -> "Compiz" 248557c3736Sjames qian wang (Arm Technology China) } 249557c3736Sjames qian wang (Arm Technology China) 250557c3736Sjames qian wang (Arm Technology China)Writeback(output) pipeline 251557c3736Sjames qian wang (Arm Technology China)~~~~~~~~~~~~~~~~~~~~~~~~~~ 252557c3736Sjames qian wang (Arm Technology China).. kernel-render:: DOT 253557c3736Sjames qian wang (Arm Technology China) :alt: writeback digraph 254557c3736Sjames qian wang (Arm Technology China) :caption: Writeback(output) data flow 255557c3736Sjames qian wang (Arm Technology China) 256557c3736Sjames qian wang (Arm Technology China) digraph writeback_data_flow { 257557c3736Sjames qian wang (Arm Technology China) rankdir=LR; 258557c3736Sjames qian wang (Arm Technology China) node [shape=box] 259557c3736Sjames qian wang (Arm Technology China) 260557c3736Sjames qian wang (Arm Technology China) { 261557c3736Sjames qian wang (Arm Technology China) node [bgcolor=grey style=dashed] 262557c3736Sjames qian wang (Arm Technology China) "Scaler-n"; 263557c3736Sjames qian wang (Arm Technology China) } 264557c3736Sjames qian wang (Arm Technology China) 265557c3736Sjames qian wang (Arm Technology China) "Compiz" -> "Scaler-n" -> "Wb_layer" 266557c3736Sjames qian wang (Arm Technology China) } 267557c3736Sjames qian wang (Arm Technology China) 268557c3736Sjames qian wang (Arm Technology China).. kernel-render:: DOT 269557c3736Sjames qian wang (Arm Technology China) :alt: split writeback digraph 270557c3736Sjames qian wang (Arm Technology China) :caption: Writeback(output) Split data flow 271557c3736Sjames qian wang (Arm Technology China) 272557c3736Sjames qian wang (Arm Technology China) digraph writeback_data_flow { 273557c3736Sjames qian wang (Arm Technology China) rankdir=LR; 274557c3736Sjames qian wang (Arm Technology China) node [shape=box] 275557c3736Sjames qian wang (Arm Technology China) 276557c3736Sjames qian wang (Arm Technology China) "Compiz" -> "Splitter" 277557c3736Sjames qian wang (Arm Technology China) "Splitter" -> "Scaler-0" -> "Merger" 278557c3736Sjames qian wang (Arm Technology China) "Splitter" -> "Scaler-1" -> "Merger" 279557c3736Sjames qian wang (Arm Technology China) "Merger" -> "Wb_layer" 280557c3736Sjames qian wang (Arm Technology China) } 281557c3736Sjames qian wang (Arm Technology China) 282557c3736Sjames qian wang (Arm Technology China)Display output pipeline 283557c3736Sjames qian wang (Arm Technology China)~~~~~~~~~~~~~~~~~~~~~~~ 284557c3736Sjames qian wang (Arm Technology China).. kernel-render:: DOT 285557c3736Sjames qian wang (Arm Technology China) :alt: display digraph 286557c3736Sjames qian wang (Arm Technology China) :caption: display output data flow 287557c3736Sjames qian wang (Arm Technology China) 288557c3736Sjames qian wang (Arm Technology China) digraph single_ppl { 289557c3736Sjames qian wang (Arm Technology China) rankdir=LR; 290557c3736Sjames qian wang (Arm Technology China) node [shape=box] 291557c3736Sjames qian wang (Arm Technology China) 292557c3736Sjames qian wang (Arm Technology China) "Compiz" -> "Improc" -> "Timing Controller" 293557c3736Sjames qian wang (Arm Technology China) } 294557c3736Sjames qian wang (Arm Technology China) 295557c3736Sjames qian wang (Arm Technology China)In the following section we'll see these three sub-pipelines will be handled 296557c3736Sjames qian wang (Arm Technology China)by KMS-plane/wb_conn/crtc respectively. 297557c3736Sjames qian wang (Arm Technology China) 298557c3736Sjames qian wang (Arm Technology China)Komeda Resource abstraction 299557c3736Sjames qian wang (Arm Technology China)=========================== 300557c3736Sjames qian wang (Arm Technology China) 301557c3736Sjames qian wang (Arm Technology China)struct komeda_pipeline/component 302557c3736Sjames qian wang (Arm Technology China)-------------------------------- 303557c3736Sjames qian wang (Arm Technology China) 304557c3736Sjames qian wang (Arm Technology China)To fully utilize and easily access/configure the HW, the driver side also uses 305557c3736Sjames qian wang (Arm Technology China)a similar architecture: Pipeline/Component to describe the HW features and 306557c3736Sjames qian wang (Arm Technology China)capabilities, and a specific component includes two parts: 307557c3736Sjames qian wang (Arm Technology China) 308557c3736Sjames qian wang (Arm Technology China)- Data flow controlling. 309557c3736Sjames qian wang (Arm Technology China)- Specific component capabilities and features. 310557c3736Sjames qian wang (Arm Technology China) 311557c3736Sjames qian wang (Arm Technology China)So the driver defines a common header struct komeda_component to describe the 312557c3736Sjames qian wang (Arm Technology China)data flow control and all specific components are a subclass of this base 313557c3736Sjames qian wang (Arm Technology China)structure. 314557c3736Sjames qian wang (Arm Technology China) 315557c3736Sjames qian wang (Arm Technology China).. kernel-doc:: drivers/gpu/drm/arm/display/komeda/komeda_pipeline.h 316557c3736Sjames qian wang (Arm Technology China) :internal: 317557c3736Sjames qian wang (Arm Technology China) 318557c3736Sjames qian wang (Arm Technology China)Resource discovery and initialization 319557c3736Sjames qian wang (Arm Technology China)===================================== 320557c3736Sjames qian wang (Arm Technology China) 321557c3736Sjames qian wang (Arm Technology China)Pipeline and component are used to describe how to handle the pixel data. We 322557c3736Sjames qian wang (Arm Technology China)still need a @struct komeda_dev to describe the whole view of the device, and 323557c3736Sjames qian wang (Arm Technology China)the control-abilites of device. 324557c3736Sjames qian wang (Arm Technology China) 325557c3736Sjames qian wang (Arm Technology China)We have &komeda_dev, &komeda_pipeline, &komeda_component. Now fill devices with 326557c3736Sjames qian wang (Arm Technology China)pipelines. Since komeda is not for D71 only but also intended for later products, 327557c3736Sjames qian wang (Arm Technology China)of course we’d better share as much as possible between different products. To 328557c3736Sjames qian wang (Arm Technology China)achieve this, split the komeda device into two layers: CORE and CHIP. 329557c3736Sjames qian wang (Arm Technology China) 330557c3736Sjames qian wang (Arm Technology China)- CORE: for common features and capabilities handling. 331*d56b699dSBjorn Helgaas- CHIP: for register programming and HW specific feature (limitation) handling. 332557c3736Sjames qian wang (Arm Technology China) 333557c3736Sjames qian wang (Arm Technology China)CORE can access CHIP by three chip function structures: 334557c3736Sjames qian wang (Arm Technology China) 335557c3736Sjames qian wang (Arm Technology China)- struct komeda_dev_funcs 336557c3736Sjames qian wang (Arm Technology China)- struct komeda_pipeline_funcs 337557c3736Sjames qian wang (Arm Technology China)- struct komeda_component_funcs 338557c3736Sjames qian wang (Arm Technology China) 339557c3736Sjames qian wang (Arm Technology China).. kernel-doc:: drivers/gpu/drm/arm/display/komeda/komeda_dev.h 340557c3736Sjames qian wang (Arm Technology China) :internal: 341557c3736Sjames qian wang (Arm Technology China) 342557c3736Sjames qian wang (Arm Technology China)Format handling 343557c3736Sjames qian wang (Arm Technology China)=============== 344557c3736Sjames qian wang (Arm Technology China) 345557c3736Sjames qian wang (Arm Technology China).. kernel-doc:: drivers/gpu/drm/arm/display/komeda/komeda_format_caps.h 346557c3736Sjames qian wang (Arm Technology China) :internal: 347557c3736Sjames qian wang (Arm Technology China).. kernel-doc:: drivers/gpu/drm/arm/display/komeda/komeda_framebuffer.h 348557c3736Sjames qian wang (Arm Technology China) :internal: 349557c3736Sjames qian wang (Arm Technology China) 350557c3736Sjames qian wang (Arm Technology China)Attach komeda_dev to DRM-KMS 351557c3736Sjames qian wang (Arm Technology China)============================ 352557c3736Sjames qian wang (Arm Technology China) 353557c3736Sjames qian wang (Arm Technology China)Komeda abstracts resources by pipeline/component, but DRM-KMS uses 354557c3736Sjames qian wang (Arm Technology China)crtc/plane/connector. One KMS-obj cannot represent only one single component, 355557c3736Sjames qian wang (Arm Technology China)since the requirements of a single KMS object cannot simply be achieved by a 356557c3736Sjames qian wang (Arm Technology China)single component, usually that needs multiple components to fit the requirement. 357557c3736Sjames qian wang (Arm Technology China)Like set mode, gamma, ctm for KMS all target on CRTC-obj, but komeda needs 358557c3736Sjames qian wang (Arm Technology China)compiz, improc and timing_ctrlr to work together to fit these requirements. 359557c3736Sjames qian wang (Arm Technology China)And a KMS-Plane may require multiple komeda resources: layer/scaler/compiz. 360557c3736Sjames qian wang (Arm Technology China) 361557c3736Sjames qian wang (Arm Technology China)So, one KMS-Obj represents a sub-pipeline of komeda resources. 362557c3736Sjames qian wang (Arm Technology China) 363557c3736Sjames qian wang (Arm Technology China)- Plane: `Layer(input) pipeline`_ 364557c3736Sjames qian wang (Arm Technology China)- Wb_connector: `Writeback(output) pipeline`_ 365557c3736Sjames qian wang (Arm Technology China)- Crtc: `Display output pipeline`_ 366557c3736Sjames qian wang (Arm Technology China) 367557c3736Sjames qian wang (Arm Technology China)So, for komeda, we treat KMS crtc/plane/connector as users of pipeline and 368557c3736Sjames qian wang (Arm Technology China)component, and at any one time a pipeline/component only can be used by one 369557c3736Sjames qian wang (Arm Technology China)user. And pipeline/component will be treated as private object of DRM-KMS; the 370557c3736Sjames qian wang (Arm Technology China)state will be managed by drm_atomic_state as well. 371557c3736Sjames qian wang (Arm Technology China) 372557c3736Sjames qian wang (Arm Technology China)How to map plane to Layer(input) pipeline 373557c3736Sjames qian wang (Arm Technology China)----------------------------------------- 374557c3736Sjames qian wang (Arm Technology China) 375557c3736Sjames qian wang (Arm Technology China)Komeda has multiple Layer input pipelines, see: 376557c3736Sjames qian wang (Arm Technology China)- `Single pipeline data flow`_ 377557c3736Sjames qian wang (Arm Technology China)- `Dual pipeline with Slave enabled`_ 378557c3736Sjames qian wang (Arm Technology China) 379557c3736Sjames qian wang (Arm Technology China)The easiest way is binding a plane to a fixed Layer pipeline, but consider the 380557c3736Sjames qian wang (Arm Technology China)komeda capabilities: 381557c3736Sjames qian wang (Arm Technology China) 382557c3736Sjames qian wang (Arm Technology China)- Layer Split, See `Layer(input) pipeline`_ 383557c3736Sjames qian wang (Arm Technology China) 384557c3736Sjames qian wang (Arm Technology China) Layer_Split is quite complicated feature, which splits a big image into two 385557c3736Sjames qian wang (Arm Technology China) parts and handles it by two layers and two scalers individually. But it 386557c3736Sjames qian wang (Arm Technology China) imports an edge problem or effect in the middle of the image after the split. 387557c3736Sjames qian wang (Arm Technology China) To avoid such a problem, it needs a complicated Split calculation and some 388557c3736Sjames qian wang (Arm Technology China) special configurations to the layer and scaler. We'd better hide such HW 389557c3736Sjames qian wang (Arm Technology China) related complexity to user mode. 390557c3736Sjames qian wang (Arm Technology China) 391557c3736Sjames qian wang (Arm Technology China)- Slave pipeline, See `Dual pipeline with Slave enabled`_ 392557c3736Sjames qian wang (Arm Technology China) 393557c3736Sjames qian wang (Arm Technology China) Since the compiz component doesn't output alpha value, the slave pipeline 394557c3736Sjames qian wang (Arm Technology China) only can be used for bottom layers composition. The komeda driver wants to 395557c3736Sjames qian wang (Arm Technology China) hide this limitation to the user. The way to do this is to pick a suitable 396557c3736Sjames qian wang (Arm Technology China) Layer according to plane_state->zpos. 397557c3736Sjames qian wang (Arm Technology China) 398557c3736Sjames qian wang (Arm Technology China)So for komeda, the KMS-plane doesn't represent a fixed komeda layer pipeline, 399557c3736Sjames qian wang (Arm Technology China)but multiple Layers with same capabilities. Komeda will select one or more 400557c3736Sjames qian wang (Arm Technology China)Layers to fit the requirement of one KMS-plane. 401557c3736Sjames qian wang (Arm Technology China) 402557c3736Sjames qian wang (Arm Technology China)Make component/pipeline to be drm_private_obj 403557c3736Sjames qian wang (Arm Technology China)--------------------------------------------- 404557c3736Sjames qian wang (Arm Technology China) 405557c3736Sjames qian wang (Arm Technology China)Add :c:type:`drm_private_obj` to :c:type:`komeda_component`, :c:type:`komeda_pipeline` 406557c3736Sjames qian wang (Arm Technology China) 407557c3736Sjames qian wang (Arm Technology China).. code-block:: c 408557c3736Sjames qian wang (Arm Technology China) 409557c3736Sjames qian wang (Arm Technology China) struct komeda_component { 410557c3736Sjames qian wang (Arm Technology China) struct drm_private_obj obj; 411557c3736Sjames qian wang (Arm Technology China) ... 412557c3736Sjames qian wang (Arm Technology China) } 413557c3736Sjames qian wang (Arm Technology China) 414557c3736Sjames qian wang (Arm Technology China) struct komeda_pipeline { 415557c3736Sjames qian wang (Arm Technology China) struct drm_private_obj obj; 416557c3736Sjames qian wang (Arm Technology China) ... 417557c3736Sjames qian wang (Arm Technology China) } 418557c3736Sjames qian wang (Arm Technology China) 419557c3736Sjames qian wang (Arm Technology China)Tracking component_state/pipeline_state by drm_atomic_state 420557c3736Sjames qian wang (Arm Technology China)----------------------------------------------------------- 421557c3736Sjames qian wang (Arm Technology China) 422557c3736Sjames qian wang (Arm Technology China)Add :c:type:`drm_private_state` and user to :c:type:`komeda_component_state`, 423557c3736Sjames qian wang (Arm Technology China):c:type:`komeda_pipeline_state` 424557c3736Sjames qian wang (Arm Technology China) 425557c3736Sjames qian wang (Arm Technology China).. code-block:: c 426557c3736Sjames qian wang (Arm Technology China) 427557c3736Sjames qian wang (Arm Technology China) struct komeda_component_state { 428557c3736Sjames qian wang (Arm Technology China) struct drm_private_state obj; 429557c3736Sjames qian wang (Arm Technology China) void *binding_user; 430557c3736Sjames qian wang (Arm Technology China) ... 431557c3736Sjames qian wang (Arm Technology China) } 432557c3736Sjames qian wang (Arm Technology China) 433557c3736Sjames qian wang (Arm Technology China) struct komeda_pipeline_state { 434557c3736Sjames qian wang (Arm Technology China) struct drm_private_state obj; 435557c3736Sjames qian wang (Arm Technology China) struct drm_crtc *crtc; 436557c3736Sjames qian wang (Arm Technology China) ... 437557c3736Sjames qian wang (Arm Technology China) } 438557c3736Sjames qian wang (Arm Technology China) 439557c3736Sjames qian wang (Arm Technology China)komeda component validation 440557c3736Sjames qian wang (Arm Technology China)--------------------------- 441557c3736Sjames qian wang (Arm Technology China) 442557c3736Sjames qian wang (Arm Technology China)Komeda has multiple types of components, but the process of validation are 443557c3736Sjames qian wang (Arm Technology China)similar, usually including the following steps: 444557c3736Sjames qian wang (Arm Technology China) 445557c3736Sjames qian wang (Arm Technology China).. code-block:: c 446557c3736Sjames qian wang (Arm Technology China) 447557c3736Sjames qian wang (Arm Technology China) int komeda_xxxx_validate(struct komeda_component_xxx xxx_comp, 448557c3736Sjames qian wang (Arm Technology China) struct komeda_component_output *input_dflow, 449557c3736Sjames qian wang (Arm Technology China) struct drm_plane/crtc/connector *user, 450557c3736Sjames qian wang (Arm Technology China) struct drm_plane/crtc/connector_state, *user_state) 451557c3736Sjames qian wang (Arm Technology China) { 452557c3736Sjames qian wang (Arm Technology China) setup 1: check if component is needed, like the scaler is optional depending 453557c3736Sjames qian wang (Arm Technology China) on the user_state; if unneeded, just return, and the caller will 454557c3736Sjames qian wang (Arm Technology China) put the data flow into next stage. 455557c3736Sjames qian wang (Arm Technology China) Setup 2: check user_state with component features and capabilities to see 456557c3736Sjames qian wang (Arm Technology China) if requirements can be met; if not, return fail. 457557c3736Sjames qian wang (Arm Technology China) Setup 3: get component_state from drm_atomic_state, and try set to set 458557c3736Sjames qian wang (Arm Technology China) user to component; fail if component has been assigned to another 459557c3736Sjames qian wang (Arm Technology China) user already. 460557c3736Sjames qian wang (Arm Technology China) Setup 3: configure the component_state, like set its input component, 461557c3736Sjames qian wang (Arm Technology China) convert user_state to component specific state. 462557c3736Sjames qian wang (Arm Technology China) Setup 4: adjust the input_dflow and prepare it for the next stage. 463557c3736Sjames qian wang (Arm Technology China) } 464557c3736Sjames qian wang (Arm Technology China) 465557c3736Sjames qian wang (Arm Technology China)komeda_kms Abstraction 466557c3736Sjames qian wang (Arm Technology China)---------------------- 467557c3736Sjames qian wang (Arm Technology China) 468557c3736Sjames qian wang (Arm Technology China).. kernel-doc:: drivers/gpu/drm/arm/display/komeda/komeda_kms.h 469557c3736Sjames qian wang (Arm Technology China) :internal: 470557c3736Sjames qian wang (Arm Technology China) 471557c3736Sjames qian wang (Arm Technology China)komde_kms Functions 472557c3736Sjames qian wang (Arm Technology China)------------------- 473557c3736Sjames qian wang (Arm Technology China).. kernel-doc:: drivers/gpu/drm/arm/display/komeda/komeda_crtc.c 474557c3736Sjames qian wang (Arm Technology China) :internal: 475557c3736Sjames qian wang (Arm Technology China).. kernel-doc:: drivers/gpu/drm/arm/display/komeda/komeda_plane.c 476557c3736Sjames qian wang (Arm Technology China) :internal: 477557c3736Sjames qian wang (Arm Technology China) 478557c3736Sjames qian wang (Arm Technology China)Build komeda to be a Linux module driver 479557c3736Sjames qian wang (Arm Technology China)======================================== 480557c3736Sjames qian wang (Arm Technology China) 481557c3736Sjames qian wang (Arm Technology China)Now we have two level devices: 482557c3736Sjames qian wang (Arm Technology China) 483557c3736Sjames qian wang (Arm Technology China)- komeda_dev: describes the real display hardware. 484*d56b699dSBjorn Helgaas- komeda_kms_dev: attaches or connects komeda_dev to DRM-KMS. 485557c3736Sjames qian wang (Arm Technology China) 486557c3736Sjames qian wang (Arm Technology China)All komeda operations are supplied or operated by komeda_dev or komeda_kms_dev, 487557c3736Sjames qian wang (Arm Technology China)the module driver is only a simple wrapper to pass the Linux command 488557c3736Sjames qian wang (Arm Technology China)(probe/remove/pm) into komeda_dev or komeda_kms_dev. 489