.. | .. |
---|
27 | 27 | |
---|
28 | 28 | #include "dc_hw_types.h" |
---|
29 | 29 | #include "hw_shared.h" |
---|
| 30 | +#include "transform.h" |
---|
30 | 31 | |
---|
31 | 32 | #define MAX_MPCC 6 |
---|
32 | 33 | #define MAX_OPP 6 |
---|
| 34 | + |
---|
| 35 | +#if defined(CONFIG_DRM_AMD_DC_DCN3_0) |
---|
| 36 | +#define MAX_DWB 2 |
---|
| 37 | +#else |
---|
| 38 | +#define MAX_DWB 1 |
---|
| 39 | +#endif |
---|
33 | 40 | |
---|
34 | 41 | enum mpc_output_csc_mode { |
---|
35 | 42 | MPC_OUTPUT_CSC_DISABLE = 0, |
---|
.. | .. |
---|
62 | 69 | int global_alpha; |
---|
63 | 70 | bool overlap_only; |
---|
64 | 71 | |
---|
| 72 | + /* MPCC top/bottom gain settings */ |
---|
| 73 | + int bottom_gain_mode; |
---|
| 74 | + int background_color_bpc; |
---|
| 75 | + int top_gain; |
---|
| 76 | + int bottom_inside_gain; |
---|
| 77 | + int bottom_outside_gain; |
---|
65 | 78 | }; |
---|
66 | 79 | |
---|
| 80 | +#if defined(CONFIG_DRM_AMD_DC_DCN3_0) |
---|
| 81 | +struct mpc_grph_gamut_adjustment { |
---|
| 82 | + struct fixed31_32 temperature_matrix[CSC_TEMPERATURE_MATRIX_SIZE]; |
---|
| 83 | + enum graphics_gamut_adjust_type gamut_adjust_type; |
---|
| 84 | +}; |
---|
| 85 | +#endif |
---|
67 | 86 | struct mpcc_sm_cfg { |
---|
68 | 87 | bool enable; |
---|
69 | 88 | /* 0-single plane,2-row subsampling,4-column subsampling,6-checkboard subsampling */ |
---|
.. | .. |
---|
78 | 97 | int force_next_field_polarity; |
---|
79 | 98 | }; |
---|
80 | 99 | |
---|
| 100 | +struct mpc_denorm_clamp { |
---|
| 101 | + int clamp_max_r_cr; |
---|
| 102 | + int clamp_min_r_cr; |
---|
| 103 | + int clamp_max_g_y; |
---|
| 104 | + int clamp_min_g_y; |
---|
| 105 | + int clamp_max_b_cb; |
---|
| 106 | + int clamp_min_b_cb; |
---|
| 107 | +}; |
---|
| 108 | + |
---|
| 109 | +#if defined(CONFIG_DRM_AMD_DC_DCN3_0) |
---|
| 110 | +struct mpc_dwb_flow_control { |
---|
| 111 | + int flow_ctrl_mode; |
---|
| 112 | + int flow_ctrl_cnt0; |
---|
| 113 | + int flow_ctrl_cnt1; |
---|
| 114 | +}; |
---|
| 115 | +#endif |
---|
81 | 116 | /* |
---|
82 | 117 | * MPCC connection and blending configuration for a single MPCC instance. |
---|
83 | 118 | * This struct is used as a node in an MPC tree. |
---|
.. | .. |
---|
88 | 123 | struct mpcc *mpcc_bot; /* pointer to bottom layer MPCC. NULL when not connected */ |
---|
89 | 124 | struct mpcc_blnd_cfg blnd_cfg; /* The blending configuration for this MPCC */ |
---|
90 | 125 | struct mpcc_sm_cfg sm_cfg; /* stereo mix setting for this MPCC */ |
---|
| 126 | +#if defined(CONFIG_DRM_AMD_DC_DCN3_0) |
---|
| 127 | + bool shared_bottom; /* TRUE if MPCC output to both OPP and DWB endpoints, else FALSE */ |
---|
| 128 | +#endif |
---|
91 | 129 | }; |
---|
92 | 130 | |
---|
93 | 131 | /* |
---|
.. | .. |
---|
103 | 141 | struct dc_context *ctx; |
---|
104 | 142 | |
---|
105 | 143 | struct mpcc mpcc_array[MAX_MPCC]; |
---|
| 144 | + struct pwl_params blender_params; |
---|
| 145 | + bool cm_bypass_mode; |
---|
106 | 146 | }; |
---|
107 | 147 | |
---|
108 | 148 | struct mpcc_state { |
---|
.. | .. |
---|
172 | 212 | * Return: void |
---|
173 | 213 | */ |
---|
174 | 214 | void (*mpc_init)(struct mpc *mpc); |
---|
| 215 | + void (*mpc_init_single_inst)( |
---|
| 216 | + struct mpc *mpc, |
---|
| 217 | + unsigned int mpcc_id); |
---|
175 | 218 | |
---|
176 | 219 | /* |
---|
177 | 220 | * Update the blending configuration for a specified MPCC. |
---|
.. | .. |
---|
188 | 231 | struct mpcc_blnd_cfg *blnd_cfg, |
---|
189 | 232 | int mpcc_id); |
---|
190 | 233 | |
---|
| 234 | + /* |
---|
| 235 | + * Lock cursor updates for the specified OPP. |
---|
| 236 | + * OPP defines the set of MPCC that are locked together for cursor. |
---|
| 237 | + * |
---|
| 238 | + * Parameters: |
---|
| 239 | + * [in] mpc - MPC context. |
---|
| 240 | + * [in] opp_id - The OPP to lock cursor updates on |
---|
| 241 | + * [in] lock - lock/unlock the OPP |
---|
| 242 | + * |
---|
| 243 | + * Return: void |
---|
| 244 | + */ |
---|
| 245 | + void (*cursor_lock)( |
---|
| 246 | + struct mpc *mpc, |
---|
| 247 | + int opp_id, |
---|
| 248 | + bool lock); |
---|
| 249 | + |
---|
| 250 | +#if defined(CONFIG_DRM_AMD_DC_DCN3_0) |
---|
| 251 | + /* |
---|
| 252 | + * Add DPP into 'secondary' MPC tree based on specified blending position. |
---|
| 253 | + * Only used for planes that are part of blending chain for DWB output |
---|
| 254 | + * |
---|
| 255 | + * Parameters: |
---|
| 256 | + * [in/out] mpc - MPC context. |
---|
| 257 | + * [in/out] tree - MPC tree structure that plane will be added to. |
---|
| 258 | + * [in] blnd_cfg - MPCC blending configuration for the new blending layer. |
---|
| 259 | + * [in] sm_cfg - MPCC stereo mix configuration for the new blending layer. |
---|
| 260 | + * stereo mix must disable for the very bottom layer of the tree config. |
---|
| 261 | + * [in] insert_above_mpcc - Insert new plane above this MPCC. If NULL, insert as bottom plane. |
---|
| 262 | + * [in] dpp_id - DPP instance for the plane to be added. |
---|
| 263 | + * [in] mpcc_id - The MPCC physical instance to use for blending. |
---|
| 264 | + * |
---|
| 265 | + * Return: struct mpcc* - MPCC that was added. |
---|
| 266 | + */ |
---|
| 267 | + struct mpcc* (*insert_plane_to_secondary)( |
---|
| 268 | + struct mpc *mpc, |
---|
| 269 | + struct mpc_tree *tree, |
---|
| 270 | + struct mpcc_blnd_cfg *blnd_cfg, |
---|
| 271 | + struct mpcc_sm_cfg *sm_cfg, |
---|
| 272 | + struct mpcc *insert_above_mpcc, |
---|
| 273 | + int dpp_id, |
---|
| 274 | + int mpcc_id); |
---|
| 275 | + |
---|
| 276 | + /* |
---|
| 277 | + * Remove a specified DPP from the 'secondary' MPC tree. |
---|
| 278 | + * |
---|
| 279 | + * Parameters: |
---|
| 280 | + * [in/out] mpc - MPC context. |
---|
| 281 | + * [in/out] tree - MPC tree structure that plane will be removed from. |
---|
| 282 | + * [in] mpcc - MPCC to be removed from tree. |
---|
| 283 | + * Return: void |
---|
| 284 | + */ |
---|
| 285 | + void (*remove_mpcc_from_secondary)( |
---|
| 286 | + struct mpc *mpc, |
---|
| 287 | + struct mpc_tree *tree, |
---|
| 288 | + struct mpcc *mpcc); |
---|
| 289 | + |
---|
| 290 | + struct mpcc* (*get_mpcc_for_dpp_from_secondary)( |
---|
| 291 | + struct mpc_tree *tree, |
---|
| 292 | + int dpp_id); |
---|
| 293 | +#endif |
---|
191 | 294 | struct mpcc* (*get_mpcc_for_dpp)( |
---|
192 | 295 | struct mpc_tree *tree, |
---|
193 | 296 | int dpp_id); |
---|
.. | .. |
---|
200 | 303 | struct mpc *mpc, |
---|
201 | 304 | struct mpc_tree *tree); |
---|
202 | 305 | |
---|
| 306 | + void (*set_denorm)(struct mpc *mpc, |
---|
| 307 | + int opp_id, |
---|
| 308 | + enum dc_color_depth output_depth); |
---|
| 309 | + |
---|
| 310 | + void (*set_denorm_clamp)( |
---|
| 311 | + struct mpc *mpc, |
---|
| 312 | + int opp_id, |
---|
| 313 | + struct mpc_denorm_clamp denorm_clamp); |
---|
| 314 | + |
---|
| 315 | + void (*set_output_csc)(struct mpc *mpc, |
---|
| 316 | + int opp_id, |
---|
| 317 | + const uint16_t *regval, |
---|
| 318 | + enum mpc_output_csc_mode ocsc_mode); |
---|
| 319 | + |
---|
| 320 | + void (*set_ocsc_default)(struct mpc *mpc, |
---|
| 321 | + int opp_id, |
---|
| 322 | + enum dc_color_space color_space, |
---|
| 323 | + enum mpc_output_csc_mode ocsc_mode); |
---|
| 324 | + |
---|
| 325 | + void (*set_output_gamma)( |
---|
| 326 | + struct mpc *mpc, |
---|
| 327 | + int mpcc_id, |
---|
| 328 | + const struct pwl_params *params); |
---|
| 329 | + void (*power_on_mpc_mem_pwr)( |
---|
| 330 | + struct mpc *mpc, |
---|
| 331 | + int mpcc_id, |
---|
| 332 | + bool power_on); |
---|
| 333 | +#if defined(CONFIG_DRM_AMD_DC_DCN3_0) |
---|
| 334 | + void (*set_dwb_mux)( |
---|
| 335 | + struct mpc *mpc, |
---|
| 336 | + int dwb_id, |
---|
| 337 | + int mpcc_id); |
---|
| 338 | + |
---|
| 339 | + void (*disable_dwb_mux)( |
---|
| 340 | + struct mpc *mpc, |
---|
| 341 | + int dwb_id); |
---|
| 342 | + |
---|
| 343 | + bool (*is_dwb_idle)( |
---|
| 344 | + struct mpc *mpc, |
---|
| 345 | + int dwb_id); |
---|
| 346 | + |
---|
| 347 | + void (*set_out_rate_control)( |
---|
| 348 | + struct mpc *mpc, |
---|
| 349 | + int opp_id, |
---|
| 350 | + bool enable, |
---|
| 351 | + bool rate_2x_mode, |
---|
| 352 | + struct mpc_dwb_flow_control *flow_control); |
---|
| 353 | +#endif |
---|
| 354 | + |
---|
| 355 | +#if defined(CONFIG_DRM_AMD_DC_DCN3_0) |
---|
| 356 | + void (*set_gamut_remap)( |
---|
| 357 | + struct mpc *mpc, |
---|
| 358 | + int mpcc_id, |
---|
| 359 | + const struct mpc_grph_gamut_adjustment *adjust); |
---|
| 360 | + |
---|
| 361 | + bool (*program_shaper)( |
---|
| 362 | + struct mpc *mpc, |
---|
| 363 | + const struct pwl_params *params, |
---|
| 364 | + uint32_t rmu_idx); |
---|
| 365 | + |
---|
| 366 | + uint32_t (*acquire_rmu)(struct mpc *mpc, int mpcc_id, int rmu_idx); |
---|
| 367 | + |
---|
| 368 | + bool (*program_3dlut)( |
---|
| 369 | + struct mpc *mpc, |
---|
| 370 | + const struct tetrahedral_params *params, |
---|
| 371 | + int rmu_idx); |
---|
| 372 | + |
---|
| 373 | + int (*release_rmu)(struct mpc *mpc, int mpcc_id); |
---|
| 374 | + |
---|
| 375 | +#endif |
---|
| 376 | + |
---|
203 | 377 | }; |
---|
204 | 378 | |
---|
205 | 379 | #endif |
---|