xref: /linux/Documentation/gpu/komeda-kms.rst (revision d56b699d)
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