1 /* SPDX-License-Identifier: GPL-2.0 */
3 * (C) COPYRIGHT 2018 ARM Limited. All rights reserved.
4 * Author: James.Qian.Wang <james.qian.wang@arm.com>
7 #ifndef _KOMEDA_PIPELINE_H_
8 #define _KOMEDA_PIPELINE_H_
10 #include <linux/types.h>
11 #include <drm/drm_atomic.h>
12 #include <drm/drm_atomic_helper.h>
13 #include "malidp_utils.h"
14 #include "komeda_color_mgmt.h"
16 #define KOMEDA_MAX_PIPELINES 2
17 #define KOMEDA_PIPELINE_MAX_LAYERS 4
18 #define KOMEDA_PIPELINE_MAX_SCALERS 2
19 #define KOMEDA_COMPONENT_N_INPUTS 5
21 /* pipeline component IDs */
23 KOMEDA_COMPONENT_LAYER0
= 0,
24 KOMEDA_COMPONENT_LAYER1
= 1,
25 KOMEDA_COMPONENT_LAYER2
= 2,
26 KOMEDA_COMPONENT_LAYER3
= 3,
27 KOMEDA_COMPONENT_WB_LAYER
= 7, /* write back layer */
28 KOMEDA_COMPONENT_SCALER0
= 8,
29 KOMEDA_COMPONENT_SCALER1
= 9,
30 KOMEDA_COMPONENT_SPLITTER
= 12,
31 KOMEDA_COMPONENT_MERGER
= 14,
32 KOMEDA_COMPONENT_COMPIZ0
= 16, /* compositor */
33 KOMEDA_COMPONENT_COMPIZ1
= 17,
34 KOMEDA_COMPONENT_IPS0
= 20, /* post image processor */
35 KOMEDA_COMPONENT_IPS1
= 21,
36 KOMEDA_COMPONENT_TIMING_CTRLR
= 22, /* timing controller */
39 #define KOMEDA_PIPELINE_LAYERS (BIT(KOMEDA_COMPONENT_LAYER0) |\
40 BIT(KOMEDA_COMPONENT_LAYER1) |\
41 BIT(KOMEDA_COMPONENT_LAYER2) |\
42 BIT(KOMEDA_COMPONENT_LAYER3))
44 #define KOMEDA_PIPELINE_SCALERS (BIT(KOMEDA_COMPONENT_SCALER0) |\
45 BIT(KOMEDA_COMPONENT_SCALER1))
47 #define KOMEDA_PIPELINE_COMPIZS (BIT(KOMEDA_COMPONENT_COMPIZ0) |\
48 BIT(KOMEDA_COMPONENT_COMPIZ1))
50 #define KOMEDA_PIPELINE_IMPROCS (BIT(KOMEDA_COMPONENT_IPS0) |\
51 BIT(KOMEDA_COMPONENT_IPS1))
52 struct komeda_component
;
53 struct komeda_component_state
;
55 /** komeda_component_funcs - component control functions */
56 struct komeda_component_funcs
{
57 /** @validate: optional,
58 * component may has special requirements or limitations, this function
59 * supply HW the ability to do the further HW specific check.
61 int (*validate
)(struct komeda_component
*c
,
62 struct komeda_component_state
*state
);
63 /** @update: update is a active update */
64 void (*update
)(struct komeda_component
*c
,
65 struct komeda_component_state
*state
);
66 /** @disable: disable component */
67 void (*disable
)(struct komeda_component
*c
);
68 /** @dump_register: Optional, dump registers to seq_file */
69 void (*dump_register
)(struct komeda_component
*c
, struct seq_file
*seq
);
73 * struct komeda_component
75 * struct komeda_component describe the data flow capabilities for how to link a
76 * component into the display pipeline.
77 * all specified components are subclass of this structure.
79 struct komeda_component
{
80 /** @obj: treat component as private obj */
81 struct drm_private_obj obj
;
82 /** @pipeline: the komeda pipeline this component belongs to */
83 struct komeda_pipeline
*pipeline
;
84 /** @name: component name */
88 * component register base,
89 * which is initialized by chip and used by chip only
92 /** @id: component id */
95 * @hw_id: component hw id,
96 * which is initialized by chip and used by chip only
101 * @max_active_inputs:
102 * @max_active_outputs:
104 * maximum number of inputs/outputs that can be active at the same time
106 * the number isn't the bit number of @supported_inputs or
107 * @supported_outputs, but may be less than it, since component may not
108 * support enabling all @supported_inputs/outputs at the same time.
110 u8 max_active_inputs
;
111 /** @max_active_outputs: maximum number of outputs */
112 u8 max_active_outputs
;
115 * @supported_outputs:
117 * bitmask of BIT(component->id) for the supported inputs/outputs,
118 * describes the possibilities of how a component is linked into a
121 u32 supported_inputs
;
122 /** @supported_outputs: bitmask of supported output componenet ids */
123 u32 supported_outputs
;
126 * @funcs: chip functions to access HW
128 const struct komeda_component_funcs
*funcs
;
132 * struct komeda_component_output
134 * a component has multiple outputs, if want to know where the data
135 * comes from, only know the component is not enough, we still need to know
138 struct komeda_component_output
{
139 /** @component: indicate which component the data comes from */
140 struct komeda_component
*component
;
143 * the output port of the &komeda_component_output.component
149 * struct komeda_component_state
151 * component_state is the data flow configuration of the component, and it's
152 * the superclass of all specific component_state like @komeda_layer_state,
153 * @komeda_scaler_state
155 struct komeda_component_state
{
156 /** @obj: tracking component_state by drm_atomic_state */
157 struct drm_private_state obj
;
158 /** @component: backpointer to the component */
159 struct komeda_component
*component
;
162 * currently bound user, the user can be @crtc, @plane or @wb_conn,
163 * which is valid decided by @component and @inputs
165 * - Layer: its user always is plane.
166 * - compiz/improc/timing_ctrlr: the user is crtc.
167 * - wb_layer: wb_conn;
168 * - scaler: plane when input is layer, wb_conn if input is compiz.
171 /** @crtc: backpointer for user crtc */
172 struct drm_crtc
*crtc
;
173 /** @plane: backpointer for user plane */
174 struct drm_plane
*plane
;
175 /** @wb_conn: backpointer for user wb_connector */
176 struct drm_connector
*wb_conn
;
183 * active_inputs is bitmask of @inputs index
185 * - active_inputs = changed_active_inputs | unchanged_active_inputs
186 * - affected_inputs = old->active_inputs | new->active_inputs;
187 * - disabling_inputs = affected_inputs ^ active_inputs;
188 * - changed_inputs = disabling_inputs | changed_active_inputs;
191 * changed_inputs doesn't include all active_input but only
192 * @changed_active_inputs, and this bitmask can be used in chip
193 * level for dirty update.
196 /** @changed_active_inputs: bitmask of the changed @active_inputs */
197 u16 changed_active_inputs
;
198 /** @affected_inputs: bitmask for affected @inputs */
203 * the specific inputs[i] only valid on BIT(i) has been set in
204 * @active_inputs, if not the inputs[i] is undefined.
206 struct komeda_component_output inputs
[KOMEDA_COMPONENT_N_INPUTS
];
209 static inline u16
component_disabling_inputs(struct komeda_component_state
*st
)
211 return st
->affected_inputs
^ st
->active_inputs
;
214 static inline u16
component_changed_inputs(struct komeda_component_state
*st
)
216 return component_disabling_inputs(st
) | st
->changed_active_inputs
;
219 #define for_each_changed_input(st, i) \
220 for ((i) = 0; (i) < (st)->component->max_active_inputs; (i)++) \
221 if (has_bit((i), component_changed_inputs(st)))
223 #define to_comp(__c) (((__c) == NULL) ? NULL : &((__c)->base))
224 #define to_cpos(__c) ((struct komeda_component **)&(__c))
226 struct komeda_layer
{
227 struct komeda_component base
;
228 /* accepted h/v input range before rotation */
229 struct malidp_range hsize_in
, vsize_in
;
230 u32 layer_type
; /* RICH, SIMPLE or WB */
232 u32 yuv_line_sz
; /* maximum line size for YUV422 and YUV420 */
234 /* komeda supports layer split which splits a whole image to two parts
235 * left and right and handle them by two individual layer processors
236 * Note: left/right are always according to the final display rect,
237 * not the source buffer.
239 struct komeda_layer
*right
;
242 struct komeda_layer_state
{
243 struct komeda_component_state base
;
244 /* layer specific configuration state */
254 struct komeda_scaler
{
255 struct komeda_component base
;
256 struct malidp_range hsize
, vsize
;
259 u8 scaling_split_overlap
; /* split overlap for scaling */
260 u8 enh_split_overlap
; /* split overlap for image enhancement */
263 struct komeda_scaler_state
{
264 struct komeda_component_state base
;
265 u16 hsize_in
, vsize_in
;
266 u16 hsize_out
, vsize_out
;
267 u16 total_hsize_in
, total_vsize_in
;
268 u16 total_hsize_out
; /* total_xxxx are size before split */
269 u16 left_crop
, right_crop
;
271 en_alpha
: 1, /* enable alpha processing */
272 en_img_enhancement
: 1,
274 right_part
: 1; /* right part of split image */
277 struct komeda_compiz
{
278 struct komeda_component base
;
279 struct malidp_range hsize
, vsize
;
282 struct komeda_compiz_input_cfg
{
284 u16 hoffset
, voffset
;
285 u8 pixel_blend_mode
, layer_alpha
;
288 struct komeda_compiz_state
{
289 struct komeda_component_state base
;
290 /* composition size */
292 struct komeda_compiz_input_cfg cins
[KOMEDA_COMPONENT_N_INPUTS
];
295 struct komeda_merger
{
296 struct komeda_component base
;
297 struct malidp_range hsize_merged
;
298 struct malidp_range vsize_merged
;
301 struct komeda_merger_state
{
302 struct komeda_component_state base
;
307 struct komeda_splitter
{
308 struct komeda_component base
;
309 struct malidp_range hsize
, vsize
;
312 struct komeda_splitter_state
{
313 struct komeda_component_state base
;
318 struct komeda_improc
{
319 struct komeda_component base
;
320 u32 supported_color_formats
; /* DRM_RGB/YUV444/YUV420*/
321 u32 supported_color_depths
; /* BIT(8) | BIT(10)*/
322 u8 supports_degamma
: 1;
324 u8 supports_gamma
: 1;
327 struct komeda_improc_state
{
328 struct komeda_component_state base
;
329 u8 color_format
, color_depth
;
331 u32 fgamma_coeffs
[KOMEDA_N_GAMMA_COEFFS
];
332 u32 ctm_coeffs
[KOMEDA_N_CTM_COEFFS
];
335 /* display timing controller */
336 struct komeda_timing_ctrlr
{
337 struct komeda_component base
;
338 u8 supports_dual_link
: 1;
341 struct komeda_timing_ctrlr_state
{
342 struct komeda_component_state base
;
345 /* Why define A separated structure but not use plane_state directly ?
346 * 1. Komeda supports layer_split which means a plane_state can be split and
347 * handled by two layers, one layer only handle half of plane image.
348 * 2. Fix up the user properties according to HW's capabilities, like user
349 * set rotation to R180, but HW only supports REFLECT_X+Y. the rot here is
350 * after drm_rotation_simplify()
352 struct komeda_data_flow_cfg
{
353 struct komeda_component_output input
;
354 u16 in_x
, in_y
, in_w
, in_h
;
355 u32 out_x
, out_y
, out_w
, out_h
;
356 u16 total_in_h
, total_in_w
;
358 u16 left_crop
, right_crop
, overlap
;
361 u8 pixel_blend_mode
, layer_alpha
;
363 en_img_enhancement
: 1,
366 right_part
: 1; /* right part of display image if split enabled */
369 struct komeda_pipeline_funcs
{
370 /* check if the aclk (main engine clock) can satisfy the clock
371 * requirements of the downscaling that specified by dflow
373 int (*downscaling_clk_check
)(struct komeda_pipeline
*pipe
,
374 struct drm_display_mode
*mode
,
375 unsigned long aclk_rate
,
376 struct komeda_data_flow_cfg
*dflow
);
377 /* dump_register: Optional, dump registers to seq_file */
378 void (*dump_register
)(struct komeda_pipeline
*pipe
,
379 struct seq_file
*sf
);
383 * struct komeda_pipeline
385 * Represent a complete display pipeline and hold all functional components.
387 struct komeda_pipeline
{
388 /** @obj: link pipeline as private obj of drm_atomic_state */
389 struct drm_private_obj obj
;
390 /** @mdev: the parent komeda_dev */
391 struct komeda_dev
*mdev
;
392 /** @pxlclk: pixel clock */
394 /** @id: pipeline id */
396 /** @avail_comps: available components mask of pipeline */
399 * @standalone_disabled_comps:
401 * When disable the pipeline, some components can not be disabled
402 * together with others, but need a sparated and standalone disable.
403 * The standalone_disabled_comps are the components which need to be
404 * disabled standalone, and this concept also introduce concept of
406 * phase 1: for disabling the common components.
407 * phase 2: for disabling the standalong_disabled_comps.
409 u32 standalone_disabled_comps
;
410 /** @n_layers: the number of layer on @layers */
412 /** @layers: the pipeline layers */
413 struct komeda_layer
*layers
[KOMEDA_PIPELINE_MAX_LAYERS
];
414 /** @n_scalers: the number of scaler on @scalers */
416 /** @scalers: the pipeline scalers */
417 struct komeda_scaler
*scalers
[KOMEDA_PIPELINE_MAX_SCALERS
];
418 /** @compiz: compositor */
419 struct komeda_compiz
*compiz
;
420 /** @splitter: for split the compiz output to two half data flows */
421 struct komeda_splitter
*splitter
;
422 /** @merger: merger */
423 struct komeda_merger
*merger
;
424 /** @wb_layer: writeback layer */
425 struct komeda_layer
*wb_layer
;
426 /** @improc: post image processor */
427 struct komeda_improc
*improc
;
428 /** @ctrlr: timing controller */
429 struct komeda_timing_ctrlr
*ctrlr
;
430 /** @funcs: chip private pipeline functions */
431 const struct komeda_pipeline_funcs
*funcs
;
433 /** @of_node: pipeline dt node */
434 struct device_node
*of_node
;
435 /** @of_output_port: pipeline output port */
436 struct device_node
*of_output_port
;
437 /** @of_output_links: output connector device nodes */
438 struct device_node
*of_output_links
[2];
439 /** @dual_link: true if of_output_links[0] and [1] are both valid */
444 * struct komeda_pipeline_state
447 * Unlike the pipeline, pipeline_state doesn’t gather any component_state
448 * into it. It because all component will be managed by drm_atomic_state.
450 struct komeda_pipeline_state
{
451 /** @obj: tracking pipeline_state by drm_atomic_state */
452 struct drm_private_state obj
;
453 /** @pipe: backpointer to the pipeline */
454 struct komeda_pipeline
*pipe
;
455 /** @crtc: currently bound crtc */
456 struct drm_crtc
*crtc
;
460 * bitmask - BIT(component->id) of active components
465 #define to_layer(c) container_of(c, struct komeda_layer, base)
466 #define to_compiz(c) container_of(c, struct komeda_compiz, base)
467 #define to_scaler(c) container_of(c, struct komeda_scaler, base)
468 #define to_splitter(c) container_of(c, struct komeda_splitter, base)
469 #define to_merger(c) container_of(c, struct komeda_merger, base)
470 #define to_improc(c) container_of(c, struct komeda_improc, base)
471 #define to_ctrlr(c) container_of(c, struct komeda_timing_ctrlr, base)
473 #define to_layer_st(c) container_of(c, struct komeda_layer_state, base)
474 #define to_compiz_st(c) container_of(c, struct komeda_compiz_state, base)
475 #define to_scaler_st(c) container_of(c, struct komeda_scaler_state, base)
476 #define to_splitter_st(c) container_of(c, struct komeda_splitter_state, base)
477 #define to_merger_st(c) container_of(c, struct komeda_merger_state, base)
478 #define to_improc_st(c) container_of(c, struct komeda_improc_state, base)
479 #define to_ctrlr_st(c) container_of(c, struct komeda_timing_ctrlr_state, base)
481 #define priv_to_comp_st(o) container_of(o, struct komeda_component_state, obj)
482 #define priv_to_pipe_st(o) container_of(o, struct komeda_pipeline_state, obj)
485 struct komeda_pipeline
*
486 komeda_pipeline_add(struct komeda_dev
*mdev
, size_t size
,
487 const struct komeda_pipeline_funcs
*funcs
);
488 void komeda_pipeline_destroy(struct komeda_dev
*mdev
,
489 struct komeda_pipeline
*pipe
);
490 struct komeda_pipeline
*
491 komeda_pipeline_get_slave(struct komeda_pipeline
*master
);
492 int komeda_assemble_pipelines(struct komeda_dev
*mdev
);
493 struct komeda_component
*
494 komeda_pipeline_get_component(struct komeda_pipeline
*pipe
, int id
);
495 struct komeda_component
*
496 komeda_pipeline_get_first_component(struct komeda_pipeline
*pipe
,
499 void komeda_pipeline_dump_register(struct komeda_pipeline
*pipe
,
500 struct seq_file
*sf
);
503 extern __printf(10, 11)
504 struct komeda_component
*
505 komeda_component_add(struct komeda_pipeline
*pipe
,
506 size_t comp_sz
, u32 id
, u32 hw_id
,
507 const struct komeda_component_funcs
*funcs
,
508 u8 max_active_inputs
, u32 supported_inputs
,
509 u8 max_active_outputs
, u32 __iomem
*reg
,
510 const char *name_fmt
, ...);
512 void komeda_component_destroy(struct komeda_dev
*mdev
,
513 struct komeda_component
*c
);
515 static inline struct komeda_component
*
516 komeda_component_pickup_output(struct komeda_component
*c
, u32 avail_comps
)
518 u32 avail_inputs
= c
->supported_outputs
& (avail_comps
);
520 return komeda_pipeline_get_first_component(c
->pipeline
, avail_inputs
);
523 struct komeda_plane_state
;
524 struct komeda_crtc_state
;
527 void pipeline_composition_size(struct komeda_crtc_state
*kcrtc_st
,
528 u16
*hsize
, u16
*vsize
);
530 int komeda_build_layer_data_flow(struct komeda_layer
*layer
,
531 struct komeda_plane_state
*kplane_st
,
532 struct komeda_crtc_state
*kcrtc_st
,
533 struct komeda_data_flow_cfg
*dflow
);
534 int komeda_build_wb_data_flow(struct komeda_layer
*wb_layer
,
535 struct drm_connector_state
*conn_st
,
536 struct komeda_crtc_state
*kcrtc_st
,
537 struct komeda_data_flow_cfg
*dflow
);
538 int komeda_build_display_data_flow(struct komeda_crtc
*kcrtc
,
539 struct komeda_crtc_state
*kcrtc_st
);
541 int komeda_build_layer_split_data_flow(struct komeda_layer
*left
,
542 struct komeda_plane_state
*kplane_st
,
543 struct komeda_crtc_state
*kcrtc_st
,
544 struct komeda_data_flow_cfg
*dflow
);
545 int komeda_build_wb_split_data_flow(struct komeda_layer
*wb_layer
,
546 struct drm_connector_state
*conn_st
,
547 struct komeda_crtc_state
*kcrtc_st
,
548 struct komeda_data_flow_cfg
*dflow
);
550 int komeda_release_unclaimed_resources(struct komeda_pipeline
*pipe
,
551 struct komeda_crtc_state
*kcrtc_st
);
553 struct komeda_pipeline_state
*
554 komeda_pipeline_get_old_state(struct komeda_pipeline
*pipe
,
555 struct drm_atomic_state
*state
);
556 bool komeda_pipeline_disable(struct komeda_pipeline
*pipe
,
557 struct drm_atomic_state
*old_state
);
558 void komeda_pipeline_update(struct komeda_pipeline
*pipe
,
559 struct drm_atomic_state
*old_state
);
561 void komeda_complete_data_flow_cfg(struct komeda_layer
*layer
,
562 struct komeda_data_flow_cfg
*dflow
,
563 struct drm_framebuffer
*fb
);
565 #endif /* _KOMEDA_PIPELINE_H_*/