1 /* 2 * Copyright 2012-15 Advanced Micro Devices, Inc. 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice shall be included in 12 * all copies or substantial portions of the Software. 13 * 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 * OTHER DEALINGS IN THE SOFTWARE. 21 * 22 * Authors: AMD 23 * 24 */ 25 26 /** 27 * DOC: overview 28 * 29 * Multiple Pipe/Plane Combiner (MPC) is a component in the hardware pipeline 30 * that performs blending of multiple planes, using global and per-pixel alpha. 31 * It also performs post-blending color correction operations according to the 32 * hardware capabilities, such as color transformation matrix and gamma 1D and 33 * 3D LUT. 34 * 35 * MPC receives output from all DPP pipes and combines them to multiple outputs 36 * supporting "M MPC inputs -> N MPC outputs" flexible composition 37 * architecture. It features: 38 * 39 * - Programmable blending structure to allow software controlled blending and 40 * cascading; 41 * - Programmable window location of each DPP in active region of display; 42 * - Combining multiple DPP pipes in one active region when a single DPP pipe 43 * cannot process very large surface; 44 * - Combining multiple DPP from different SLS with blending; 45 * - Stereo formats from single DPP in top-bottom or side-by-side modes; 46 * - Stereo formats from 2 DPPs; 47 * - Alpha blending of multiple layers from different DPP pipes; 48 * - Programmable background color; 49 */ 50 51 #ifndef __DC_MPCC_H__ 52 #define __DC_MPCC_H__ 53 54 #include "dc_hw_types.h" 55 #include "hw_shared.h" 56 #include "transform.h" 57 58 #define MAX_MPCC 6 59 #define MAX_OPP 6 60 61 #define MAX_DWB 2 62 63 enum mpc_output_csc_mode { 64 MPC_OUTPUT_CSC_DISABLE = 0, 65 MPC_OUTPUT_CSC_COEF_A, 66 MPC_OUTPUT_CSC_COEF_B 67 }; 68 69 70 enum mpcc_blend_mode { 71 MPCC_BLEND_MODE_BYPASS, 72 MPCC_BLEND_MODE_TOP_LAYER_PASSTHROUGH, 73 MPCC_BLEND_MODE_TOP_LAYER_ONLY, 74 MPCC_BLEND_MODE_TOP_BOT_BLENDING 75 }; 76 77 /** 78 * enum mpcc_alpha_blend_mode - define the alpha blend mode regarding pixel 79 * alpha and plane alpha values 80 */ 81 enum mpcc_alpha_blend_mode { 82 /** 83 * @MPCC_ALPHA_BLEND_MODE_PER_PIXEL_ALPHA: per pixel alpha using DPP 84 * alpha value 85 */ 86 MPCC_ALPHA_BLEND_MODE_PER_PIXEL_ALPHA, 87 /** 88 * @MPCC_ALPHA_BLEND_MODE_PER_PIXEL_ALPHA_COMBINED_GLOBAL_GAIN: per 89 * pixel alpha using DPP alpha value multiplied by a global gain (plane 90 * alpha) 91 */ 92 MPCC_ALPHA_BLEND_MODE_PER_PIXEL_ALPHA_COMBINED_GLOBAL_GAIN, 93 /** 94 * @MPCC_ALPHA_BLEND_MODE_GLOBAL_ALPHA: global alpha value, ignores 95 * pixel alpha and consider only plane alpha 96 */ 97 MPCC_ALPHA_BLEND_MODE_GLOBAL_ALPHA 98 }; 99 100 enum mpcc_movable_cm_location { 101 MPCC_MOVABLE_CM_LOCATION_BEFORE, 102 MPCC_MOVABLE_CM_LOCATION_AFTER, 103 }; 104 105 enum MCM_LUT_XABLE { 106 MCM_LUT_DISABLE, 107 MCM_LUT_DISABLED = MCM_LUT_DISABLE, 108 MCM_LUT_ENABLE, 109 MCM_LUT_ENABLED = MCM_LUT_ENABLE, 110 }; 111 112 enum MCM_LUT_ID { 113 MCM_LUT_3DLUT, 114 MCM_LUT_1DLUT, 115 MCM_LUT_SHAPER 116 }; 117 118 union mcm_lut_params { 119 const struct pwl_params *pwl; 120 const struct tetrahedral_params *lut3d; 121 }; 122 123 /** 124 * struct mpcc_blnd_cfg - MPCC blending configuration 125 */ 126 struct mpcc_blnd_cfg { 127 /** 128 * @black_color: background color. 129 */ 130 struct tg_color black_color; 131 132 /** 133 * @alpha_mode: alpha blend mode (MPCC_ALPHA_BLND_MODE). 134 */ 135 enum mpcc_alpha_blend_mode alpha_mode; 136 137 /** 138 * @pre_multiplied_alpha: 139 * Whether pixel color values were pre-multiplied by the alpha channel 140 * (MPCC_ALPHA_MULTIPLIED_MODE). 141 */ 142 bool pre_multiplied_alpha; 143 144 /** 145 * @global_gain: Used when blend mode considers both pixel alpha and plane. 146 */ 147 int global_gain; 148 149 /** 150 * @global_alpha: Plane alpha value. 151 */ 152 int global_alpha; 153 154 /** 155 * @overlap_only: Whether overlapping of different planes is allowed. 156 */ 157 bool overlap_only; 158 159 /* MPCC top/bottom gain settings */ 160 161 /** 162 * @bottom_gain_mode: Blend mode for bottom gain setting. 163 */ 164 int bottom_gain_mode; 165 166 /** 167 * @background_color_bpc: Background color for bpc. 168 */ 169 int background_color_bpc; 170 171 /** 172 * @top_gain: Top gain setting. 173 */ 174 int top_gain; 175 176 /** 177 * @bottom_inside_gain: Blend mode for bottom inside. 178 */ 179 int bottom_inside_gain; 180 181 /** 182 * @bottom_outside_gain: Blend mode for bottom outside. 183 */ 184 int bottom_outside_gain; 185 }; 186 187 struct mpc_grph_gamut_adjustment { 188 struct fixed31_32 temperature_matrix[CSC_TEMPERATURE_MATRIX_SIZE]; 189 enum graphics_gamut_adjust_type gamut_adjust_type; 190 enum mpcc_gamut_remap_id mpcc_gamut_remap_block_id; 191 }; 192 193 struct mpcc_sm_cfg { 194 bool enable; 195 /* 0-single plane,2-row subsampling,4-column subsampling,6-checkboard subsampling */ 196 int sm_mode; 197 /* 0- disable frame alternate, 1- enable frame alternate */ 198 bool frame_alt; 199 /* 0- disable field alternate, 1- enable field alternate */ 200 bool field_alt; 201 /* 0-no force,2-force frame polarity from top,3-force frame polarity from bottom */ 202 int force_next_frame_porlarity; 203 /* 0-no force,2-force field polarity from top,3-force field polarity from bottom */ 204 int force_next_field_polarity; 205 }; 206 207 struct mpc_denorm_clamp { 208 int clamp_max_r_cr; 209 int clamp_min_r_cr; 210 int clamp_max_g_y; 211 int clamp_min_g_y; 212 int clamp_max_b_cb; 213 int clamp_min_b_cb; 214 }; 215 216 struct mpc_dwb_flow_control { 217 int flow_ctrl_mode; 218 int flow_ctrl_cnt0; 219 int flow_ctrl_cnt1; 220 }; 221 222 /** 223 * struct mpcc - MPCC connection and blending configuration for a single MPCC instance. 224 * 225 * This struct is used as a node in an MPC tree. 226 */ 227 struct mpcc { 228 /** 229 * @mpcc_id: MPCC physical instance. 230 */ 231 int mpcc_id; 232 233 /** 234 * @dpp_id: DPP input to this MPCC 235 */ 236 int dpp_id; 237 238 /** 239 * @mpcc_bot: Pointer to bottom layer MPCC. NULL when not connected. 240 */ 241 struct mpcc *mpcc_bot; 242 243 /** 244 * @blnd_cfg: The blending configuration for this MPCC. 245 */ 246 struct mpcc_blnd_cfg blnd_cfg; 247 248 /** 249 * @sm_cfg: stereo mix setting for this MPCC 250 */ 251 struct mpcc_sm_cfg sm_cfg; 252 253 /** 254 * @shared_bottom: 255 * 256 * If MPCC output to both OPP and DWB endpoints, true. Otherwise, false. 257 */ 258 bool shared_bottom; 259 }; 260 261 /** 262 * struct mpc_tree - MPC tree represents all MPCC connections for a pipe. 263 * 264 * 265 */ 266 struct mpc_tree { 267 /** 268 * @opp_id: The OPP instance that owns this MPC tree. 269 */ 270 int opp_id; 271 272 /** 273 * @opp_list: the top MPCC layer of the MPC tree that outputs to OPP endpoint 274 */ 275 struct mpcc *opp_list; 276 }; 277 278 struct mpc { 279 const struct mpc_funcs *funcs; 280 struct dc_context *ctx; 281 282 struct mpcc mpcc_array[MAX_MPCC]; 283 struct pwl_params blender_params; 284 bool cm_bypass_mode; 285 }; 286 287 struct mpcc_state { 288 uint32_t opp_id; 289 uint32_t dpp_id; 290 uint32_t bot_mpcc_id; 291 uint32_t mode; 292 uint32_t alpha_mode; 293 uint32_t pre_multiplied_alpha; 294 uint32_t overlap_only; 295 uint32_t idle; 296 uint32_t busy; 297 uint32_t shaper_lut_mode; 298 uint32_t lut3d_mode; 299 uint32_t lut3d_bit_depth; 300 uint32_t lut3d_size; 301 uint32_t rgam_mode; 302 uint32_t rgam_lut; 303 struct mpc_grph_gamut_adjustment gamut_remap; 304 }; 305 306 /** 307 * struct mpc_funcs - funcs 308 */ 309 struct mpc_funcs { 310 /** 311 * @read_mpcc_state: 312 * 313 * Read register content from given MPCC physical instance. 314 * 315 * Parameters: 316 * 317 * - [in/out] mpc - MPC context 318 * - [in] mpcc_instance - MPC context instance 319 * - [in] mpcc_state - MPC context state 320 * 321 * Return: 322 * 323 * void 324 */ 325 void (*read_mpcc_state)( 326 struct mpc *mpc, 327 int mpcc_inst, 328 struct mpcc_state *s); 329 330 /** 331 * @insert_plane: 332 * 333 * Insert DPP into MPC tree based on specified blending position. 334 * Only used for planes that are part of blending chain for OPP output 335 * 336 * Parameters: 337 * 338 * - [in/out] mpc - MPC context. 339 * - [in/out] tree - MPC tree structure that plane will be added to. 340 * - [in] blnd_cfg - MPCC blending configuration for the new blending layer. 341 * - [in] sm_cfg - MPCC stereo mix configuration for the new blending layer. 342 * stereo mix must disable for the very bottom layer of the tree config. 343 * - [in] insert_above_mpcc - Insert new plane above this MPCC. 344 * If NULL, insert as bottom plane. 345 * - [in] dpp_id - DPP instance for the plane to be added. 346 * - [in] mpcc_id - The MPCC physical instance to use for blending. 347 * 348 * Return: 349 * 350 * struct mpcc* - MPCC that was added. 351 */ 352 struct mpcc* (*insert_plane)( 353 struct mpc *mpc, 354 struct mpc_tree *tree, 355 struct mpcc_blnd_cfg *blnd_cfg, 356 struct mpcc_sm_cfg *sm_cfg, 357 struct mpcc *insert_above_mpcc, 358 int dpp_id, 359 int mpcc_id); 360 361 /** 362 * @remove_mpcc: 363 * 364 * Remove a specified MPCC from the MPC tree. 365 * 366 * Parameters: 367 * 368 * - [in/out] mpc - MPC context. 369 * - [in/out] tree - MPC tree structure that plane will be removed from. 370 * - [in/out] mpcc - MPCC to be removed from tree. 371 * 372 * Return: 373 * 374 * void 375 */ 376 void (*remove_mpcc)( 377 struct mpc *mpc, 378 struct mpc_tree *tree, 379 struct mpcc *mpcc); 380 381 /** 382 * @mpc_init: 383 * 384 * Reset the MPCC HW status by disconnecting all muxes. 385 * 386 * Parameters: 387 * 388 * - [in/out] mpc - MPC context. 389 * 390 * Return: 391 * 392 * void 393 */ 394 void (*mpc_init)(struct mpc *mpc); 395 396 /** 397 * @mpc_init_single_inst: 398 * 399 * Initialize given MPCC physical instance. 400 * 401 * Parameters: 402 * - [in/out] mpc - MPC context. 403 * - [in] mpcc_id - The MPCC physical instance to be initialized. 404 */ 405 void (*mpc_init_single_inst)( 406 struct mpc *mpc, 407 unsigned int mpcc_id); 408 409 /** 410 * @update_blending: 411 * 412 * Update the blending configuration for a specified MPCC. 413 * 414 * Parameters: 415 * 416 * - [in/out] mpc - MPC context. 417 * - [in] blnd_cfg - MPCC blending configuration. 418 * - [in] mpcc_id - The MPCC physical instance. 419 * 420 * Return: 421 * 422 * void 423 */ 424 void (*update_blending)( 425 struct mpc *mpc, 426 struct mpcc_blnd_cfg *blnd_cfg, 427 int mpcc_id); 428 429 /** 430 * @cursor_lock: 431 * 432 * Lock cursor updates for the specified OPP. OPP defines the set of 433 * MPCC that are locked together for cursor. 434 * 435 * Parameters: 436 * 437 * - [in] mpc - MPC context. 438 * - [in] opp_id - The OPP to lock cursor updates on 439 * - [in] lock - lock/unlock the OPP 440 * 441 * Return: 442 * 443 * void 444 */ 445 void (*cursor_lock)( 446 struct mpc *mpc, 447 int opp_id, 448 bool lock); 449 450 /** 451 * @insert_plane_to_secondary: 452 * 453 * Add DPP into secondary MPC tree based on specified blending 454 * position. Only used for planes that are part of blending chain for 455 * DWB output 456 * 457 * Parameters: 458 * 459 * - [in/out] mpc - MPC context. 460 * - [in/out] tree - MPC tree structure that plane will be added to. 461 * - [in] blnd_cfg - MPCC blending configuration for the new blending layer. 462 * - [in] sm_cfg - MPCC stereo mix configuration for the new blending layer. 463 * stereo mix must disable for the very bottom layer of the tree config. 464 * - [in] insert_above_mpcc - Insert new plane above this MPCC. If 465 * NULL, insert as bottom plane. 466 * - [in] dpp_id - DPP instance for the plane to be added. 467 * - [in] mpcc_id - The MPCC physical instance to use for blending. 468 * 469 * Return: 470 * 471 * struct mpcc* - MPCC that was added. 472 */ 473 struct mpcc* (*insert_plane_to_secondary)( 474 struct mpc *mpc, 475 struct mpc_tree *tree, 476 struct mpcc_blnd_cfg *blnd_cfg, 477 struct mpcc_sm_cfg *sm_cfg, 478 struct mpcc *insert_above_mpcc, 479 int dpp_id, 480 int mpcc_id); 481 482 /** 483 * @remove_mpcc_from_secondary: 484 * 485 * Remove a specified DPP from the 'secondary' MPC tree. 486 * 487 * Parameters: 488 * 489 * - [in/out] mpc - MPC context. 490 * - [in/out] tree - MPC tree structure that plane will be removed from. 491 * - [in] mpcc - MPCC to be removed from tree. 492 * 493 * Return: 494 * 495 * void 496 */ 497 void (*remove_mpcc_from_secondary)( 498 struct mpc *mpc, 499 struct mpc_tree *tree, 500 struct mpcc *mpcc); 501 502 /** 503 * @get_mpcc_for_dpp_from_secondary: 504 * 505 * Find, if it exists, a MPCC from a given 'secondary' MPC tree that 506 * is associated with specified plane. 507 * 508 * Parameters: 509 * - [in/out] tree - MPC tree structure to search for plane. 510 * - [in] dpp_id - DPP to be searched. 511 * 512 * Return: 513 * 514 * struct mpcc* - pointer to plane or NULL if no plane found. 515 */ 516 struct mpcc* (*get_mpcc_for_dpp_from_secondary)( 517 struct mpc_tree *tree, 518 int dpp_id); 519 520 /** 521 * @get_mpcc_for_dpp: 522 * 523 * Find, if it exists, a MPCC from a given MPC tree that 524 * is associated with specified plane. 525 * 526 * Parameters: 527 * - [in/out] tree - MPC tree structure to search for plane. 528 * - [in] dpp_id - DPP to be searched. 529 * 530 * Return: 531 * 532 * struct mpcc* - pointer to plane or NULL if no plane found. 533 */ 534 struct mpcc* (*get_mpcc_for_dpp)( 535 struct mpc_tree *tree, 536 int dpp_id); 537 538 /** 539 * @wait_for_idle: 540 * 541 * Wait for a MPCC in MPC context to enter idle state. 542 * 543 * Parameters: 544 * - [in/out] mpc - MPC Context. 545 * - [in] id - MPCC to wait for idle state. 546 * 547 * Return: 548 * 549 * void 550 */ 551 void (*wait_for_idle)(struct mpc *mpc, int id); 552 553 /** 554 * @assert_mpcc_idle_before_connect: 555 * 556 * Assert if MPCC in MPC context is in idle state. 557 * 558 * Parameters: 559 * - [in/out] mpc - MPC context. 560 * - [in] id - MPCC to assert idle state. 561 * 562 * Return: 563 * 564 * void 565 */ 566 void (*assert_mpcc_idle_before_connect)(struct mpc *mpc, int mpcc_id); 567 568 /** 569 * @init_mpcc_list_from_hw: 570 * 571 * Iterate through the MPCC array from a given MPC context struct 572 * and configure each MPCC according to its registers' values. 573 * 574 * Parameters: 575 * - [in/out] mpc - MPC context to initialize MPCC array. 576 * - [in/out] tree - MPC tree structure containing MPCC contexts to initialize. 577 * 578 * Return: 579 * 580 * void 581 */ 582 void (*init_mpcc_list_from_hw)( 583 struct mpc *mpc, 584 struct mpc_tree *tree); 585 586 /** 587 * @set_denorm: 588 * 589 * Set corresponding OPP DENORM_CONTROL register value to specific denorm_mode 590 * based on given color depth. 591 * 592 * Parameters: 593 * - [in/out] mpc - MPC context. 594 * - [in] opp_id - Corresponding OPP to update register. 595 * - [in] output_depth - Arbitrary color depth to set denorm_mode. 596 * 597 * Return: 598 * 599 * void 600 */ 601 void (*set_denorm)(struct mpc *mpc, 602 int opp_id, 603 enum dc_color_depth output_depth); 604 605 /** 606 * @set_denorm_clamp: 607 * 608 * Set denorm clamp values on corresponding OPP DENORM CONTROL register. 609 * 610 * Parameters: 611 * - [in/out] mpc - MPC context. 612 * - [in] opp_id - Corresponding OPP to update register. 613 * - [in] denorm_clamp - Arbitrary denorm clamp to be set. 614 * 615 * Return: 616 * 617 * void 618 */ 619 void (*set_denorm_clamp)( 620 struct mpc *mpc, 621 int opp_id, 622 struct mpc_denorm_clamp denorm_clamp); 623 624 /** 625 * @set_output_csc: 626 * 627 * Set the Output Color Space Conversion matrix 628 * with given values and mode. 629 * 630 * Parameters: 631 * - [in/out] mpc - MPC context. 632 * - [in] opp_id - Corresponding OPP to update register. 633 * - [in] regval - Values to set in CSC matrix. 634 * - [in] ocsc_mode - Mode to set CSC. 635 * 636 * Return: 637 * 638 * void 639 */ 640 void (*set_output_csc)(struct mpc *mpc, 641 int opp_id, 642 const uint16_t *regval, 643 enum mpc_output_csc_mode ocsc_mode); 644 645 /** 646 * @set_ocsc_default: 647 * 648 * Set the Output Color Space Conversion matrix 649 * to default values according to color space. 650 * 651 * Parameters: 652 * - [in/out] mpc - MPC context. 653 * - [in] opp_id - Corresponding OPP to update register. 654 * - [in] color_space - OCSC color space. 655 * - [in] ocsc_mode - Mode to set CSC. 656 * 657 * Return: 658 * 659 * void 660 * 661 */ 662 void (*set_ocsc_default)(struct mpc *mpc, 663 int opp_id, 664 enum dc_color_space color_space, 665 enum mpc_output_csc_mode ocsc_mode); 666 667 /** 668 * @set_output_gamma: 669 * 670 * Set Output Gamma with given curve parameters. 671 * 672 * Parameters: 673 * - [in/out] mpc - MPC context. 674 * - [in] mpcc_id - Corresponding MPC to update registers. 675 * - [in] params - Parameters. 676 * 677 * Return: 678 * 679 * void 680 * 681 */ 682 void (*set_output_gamma)( 683 struct mpc *mpc, 684 int mpcc_id, 685 const struct pwl_params *params); 686 /** 687 * @power_on_mpc_mem_pwr: 688 * 689 * Power on/off memory LUT for given MPCC. 690 * Powering on enables LUT to be updated. 691 * Powering off allows entering low power mode. 692 * 693 * Parameters: 694 * - [in/out] mpc - MPC context. 695 * - [in] mpcc_id - MPCC to power on. 696 * - [in] power_on 697 * 698 * Return: 699 * 700 * void 701 */ 702 void (*power_on_mpc_mem_pwr)( 703 struct mpc *mpc, 704 int mpcc_id, 705 bool power_on); 706 /** 707 * @set_dwb_mux: 708 * 709 * Set corresponding Display Writeback mux 710 * MPC register field to given MPCC id. 711 * 712 * Parameters: 713 * - [in/out] mpc - MPC context. 714 * - [in] dwb_id - DWB to be set. 715 * - [in] mpcc_id - MPCC id to be stored in DWB mux register. 716 * 717 * Return: 718 * 719 * void 720 */ 721 void (*set_dwb_mux)( 722 struct mpc *mpc, 723 int dwb_id, 724 int mpcc_id); 725 726 /** 727 * @disable_dwb_mux: 728 * 729 * Reset corresponding Display Writeback mux 730 * MPC register field. 731 * 732 * Parameters: 733 * - [in/out] mpc - MPC context. 734 * - [in] dwb_id - DWB to be set. 735 * 736 * Return: 737 * 738 * void 739 */ 740 void (*disable_dwb_mux)( 741 struct mpc *mpc, 742 int dwb_id); 743 744 /** 745 * @is_dwb_idle: 746 * 747 * Check DWB status on MPC_DWB0_MUX_STATUS register field. 748 * Return if it is null. 749 * 750 * Parameters: 751 * - [in/out] mpc - MPC context. 752 * - [in] dwb_id - DWB to be checked. 753 * 754 * Return: 755 * 756 * bool - wheter DWB is idle or not 757 */ 758 bool (*is_dwb_idle)( 759 struct mpc *mpc, 760 int dwb_id); 761 762 /** 763 * @set_out_rate_control: 764 * 765 * Set display output rate control. 766 * 767 * Parameters: 768 * - [in/out] mpc - MPC context. 769 * - [in] opp_id - OPP to be set. 770 * - [in] enable 771 * - [in] rate_2x_mode 772 * - [in] flow_control 773 * 774 * Return: 775 * 776 * void 777 */ 778 void (*set_out_rate_control)( 779 struct mpc *mpc, 780 int opp_id, 781 bool enable, 782 bool rate_2x_mode, 783 struct mpc_dwb_flow_control *flow_control); 784 785 /** 786 * @set_gamut_remap: 787 * 788 * Set post-blending CTM for given MPCC. 789 * 790 * Parameters: 791 * - [in] mpc - MPC context. 792 * - [in] mpcc_id - MPCC to set gamut map. 793 * - [in] adjust 794 * 795 * Return: 796 * 797 * void 798 */ 799 void (*set_gamut_remap)( 800 struct mpc *mpc, 801 int mpcc_id, 802 const struct mpc_grph_gamut_adjustment *adjust); 803 804 /** 805 * @program_1dlut: 806 * 807 * Set 1 dimensional Lookup Table. 808 * 809 * Parameters: 810 * - [in/out] mpc - MPC context 811 * - [in] params - curve parameters for the LUT configuration 812 * - [in] rmu_idx 813 * 814 * bool - wheter LUT was set (set with given parameters) or not (params is NULL and LUT is disabled). 815 */ 816 bool (*program_1dlut)( 817 struct mpc *mpc, 818 const struct pwl_params *params, 819 uint32_t rmu_idx); 820 821 /** 822 * @program_shaper: 823 * 824 * Set shaper. 825 * 826 * Parameters: 827 * - [in/out] mpc - MPC context 828 * - [in] params - curve parameters to be set 829 * - [in] rmu_idx 830 * 831 * Return: 832 * 833 * bool - wheter shaper was set (set with given parameters) or not (params is NULL and LUT is disabled). 834 */ 835 bool (*program_shaper)( 836 struct mpc *mpc, 837 const struct pwl_params *params, 838 uint32_t rmu_idx); 839 840 /** 841 * @acquire_rmu: 842 * 843 * Set given MPCC to be multiplexed to given RMU unit. 844 * 845 * Parameters: 846 * - [in/out] mpc - MPC context 847 * - [in] mpcc_id - MPCC 848 * - [in] rmu_idx - Given RMU unit to set MPCC to be multiplexed to. 849 * 850 * Return: 851 * 852 * unit32_t - rmu_idx if operation was successful, -1 else. 853 */ 854 uint32_t (*acquire_rmu)(struct mpc *mpc, int mpcc_id, int rmu_idx); 855 856 /** 857 * @program_3dlut: 858 * 859 * Set 3 dimensional Lookup Table. 860 * 861 * Parameters: 862 * - [in/out] mpc - MPC context 863 * - [in] params - tetrahedral parameters for the LUT configuration 864 * - [in] rmu_idx 865 * 866 * bool - wheter LUT was set (set with given parameters) or not (params is NULL and LUT is disabled). 867 */ 868 bool (*program_3dlut)( 869 struct mpc *mpc, 870 const struct tetrahedral_params *params, 871 int rmu_idx); 872 873 /** 874 * @release_rmu: 875 * 876 * For a given MPCC, release the RMU unit it muliplexes to. 877 * 878 * Parameters: 879 * - [in/out] mpc - MPC context 880 * - [in] mpcc_id - MPCC 881 * 882 * Return: 883 * 884 * int - a valid rmu_idx representing released RMU unit or -1 if there was no RMU unit to release. 885 */ 886 int (*release_rmu)(struct mpc *mpc, int mpcc_id); 887 888 /** 889 * @get_mpc_out_mux: 890 * 891 * Return MPC out mux. 892 * 893 * Parameters: 894 * - [in] mpc - MPC context. 895 * - [in] opp_id - OPP 896 * 897 * Return: 898 * 899 * unsigned int - Out Mux 900 */ 901 unsigned int (*get_mpc_out_mux)( 902 struct mpc *mpc, 903 int opp_id); 904 905 /** 906 * @set_bg_color: 907 * 908 * Find corresponding bottommost MPCC and 909 * set its bg color. 910 * 911 * Parameters: 912 * - [in/out] mpc - MPC context. 913 * - [in] bg_color - background color to be set. 914 * - [in] mpcc_id 915 * 916 * Return: 917 * 918 * void 919 */ 920 void (*set_bg_color)(struct mpc *mpc, 921 struct tg_color *bg_color, 922 int mpcc_id); 923 924 /** 925 * @set_mpc_mem_lp_mode: 926 * 927 * Set mpc_mem_lp_mode. 928 * 929 * Parameters: 930 * - [in/out] mpc - MPC context. 931 * 932 * Return: 933 * 934 * void 935 */ 936 937 void (*set_mpc_mem_lp_mode)(struct mpc *mpc); 938 /** 939 * @set_movable_cm_location: 940 * 941 * Set Movable CM Location. 942 * 943 * Parameters: 944 * - [in/out] mpc - MPC context. 945 * - [in] location 946 * - [in] mpcc_id 947 * 948 * Return: 949 * 950 * void 951 */ 952 953 void (*set_movable_cm_location)(struct mpc *mpc, enum mpcc_movable_cm_location location, int mpcc_id); 954 /** 955 * @update_3dlut_fast_load_select: 956 * 957 * Update 3D LUT fast load select. 958 * 959 * Parameters: 960 * - [in/out] mpc - MPC context. 961 * - [in] mpcc_id 962 * - [in] hubp_idx 963 * 964 * Return: 965 * 966 * void 967 */ 968 969 void (*update_3dlut_fast_load_select)(struct mpc *mpc, int mpcc_id, int hubp_idx); 970 /** 971 * @get_3dlut_fast_load_status: 972 * 973 * Get 3D LUT fast load status and reference them with done, soft_underflow and hard_underflow pointers. 974 * 975 * Parameters: 976 * - [in/out] mpc - MPC context. 977 * - [in] mpcc_id 978 * - [in/out] done 979 * - [in/out] soft_underflow 980 * - [in/out] hard_underflow 981 * 982 * Return: 983 * 984 * void 985 */ 986 void (*get_3dlut_fast_load_status)(struct mpc *mpc, int mpcc_id, uint32_t *done, uint32_t *soft_underflow, uint32_t *hard_underflow); 987 988 /** 989 * @populate_lut: 990 * 991 * Populate LUT with given tetrahedral parameters. 992 * 993 * Parameters: 994 * - [in/out] mpc - MPC context. 995 * - [in] id 996 * - [in] params 997 * - [in] lut_bank_a 998 * - [in] mpcc_id 999 * 1000 * Return: 1001 * 1002 * void 1003 */ 1004 void (*populate_lut)(struct mpc *mpc, const enum MCM_LUT_ID id, const union mcm_lut_params params, 1005 bool lut_bank_a, int mpcc_id); 1006 1007 /** 1008 * @program_lut_read_write_control: 1009 * 1010 * Program LUT RW control. 1011 * 1012 * Parameters: 1013 * - [in/out] mpc - MPC context. 1014 * - [in] id 1015 * - [in] lut_bank_a 1016 * - [in] mpcc_id 1017 * 1018 * Return: 1019 * 1020 * void 1021 */ 1022 void (*program_lut_read_write_control)(struct mpc *mpc, const enum MCM_LUT_ID id, bool lut_bank_a, int mpcc_id); 1023 1024 /** 1025 * @program_lut_mode: 1026 * 1027 * Program LUT mode. 1028 * 1029 * Parameters: 1030 * - [in/out] mpc - MPC context. 1031 * - [in] id 1032 * - [in] xable 1033 * - [in] lut_bank_a 1034 * - [in] mpcc_id 1035 * 1036 * Return: 1037 * 1038 * void 1039 */ 1040 void (*program_lut_mode)(struct mpc *mpc, const enum MCM_LUT_ID id, const enum MCM_LUT_XABLE xable, 1041 bool lut_bank_a, int mpcc_id); 1042 /** 1043 * @program_3dlut_size: 1044 * 1045 * Program 3D LUT size. 1046 * 1047 * Parameters: 1048 * - [in/out] mpc - MPC context. 1049 * - [in] is_17x17x17 - is 3dlut 17x17x17 1050 * - [in] mpcc_id 1051 * 1052 * Return: 1053 * 1054 * void 1055 */ 1056 void (*program_3dlut_size)(struct mpc *mpc, bool is_17x17x17, int mpcc_id); 1057 }; 1058 1059 #endif 1060