1060 lines · c
1/*2 * Copyright 2012-15 Advanced Micro Devices, Inc.3 *4 * Permission is hereby granted, free of charge, to any person obtaining a5 * copy of this software and associated documentation files (the "Software"),6 * to deal in the Software without restriction, including without limitation7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,8 * and/or sell copies of the Software, and to permit persons to whom the9 * Software is furnished to do so, subject to the following conditions:10 *11 * The above copyright notice and this permission notice shall be included in12 * all copies or substantial portions of the Software.13 *14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR18 * 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 OR20 * OTHER DEALINGS IN THE SOFTWARE.21 *22 * Authors: AMD23 *24 */25 26/**27 * DOC: overview28 *29 * Multiple Pipe/Plane Combiner (MPC) is a component in the hardware pipeline30 * that performs blending of multiple planes, using global and per-pixel alpha.31 * It also performs post-blending color correction operations according to the32 * hardware capabilities, such as color transformation matrix and gamma 1D and33 * 3D LUT.34 *35 * MPC receives output from all DPP pipes and combines them to multiple outputs36 * supporting "M MPC inputs -> N MPC outputs" flexible composition37 * architecture. It features:38 *39 * - Programmable blending structure to allow software controlled blending and40 * 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 pipe43 * 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 659#define MAX_OPP 660 61#define MAX_DWB 262 63enum mpc_output_csc_mode {64 MPC_OUTPUT_CSC_DISABLE = 0,65 MPC_OUTPUT_CSC_COEF_A,66 MPC_OUTPUT_CSC_COEF_B67};68 69 70enum 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_BLENDING75};76 77/**78 * enum mpcc_alpha_blend_mode - define the alpha blend mode regarding pixel79 * alpha and plane alpha values80 */81enum mpcc_alpha_blend_mode {82 /**83 * @MPCC_ALPHA_BLEND_MODE_PER_PIXEL_ALPHA: per pixel alpha using DPP84 * alpha value85 */86 MPCC_ALPHA_BLEND_MODE_PER_PIXEL_ALPHA,87 /**88 * @MPCC_ALPHA_BLEND_MODE_PER_PIXEL_ALPHA_COMBINED_GLOBAL_GAIN: per89 * pixel alpha using DPP alpha value multiplied by a global gain (plane90 * alpha)91 */92 MPCC_ALPHA_BLEND_MODE_PER_PIXEL_ALPHA_COMBINED_GLOBAL_GAIN,93 /**94 * @MPCC_ALPHA_BLEND_MODE_GLOBAL_ALPHA: global alpha value, ignores95 * pixel alpha and consider only plane alpha96 */97 MPCC_ALPHA_BLEND_MODE_GLOBAL_ALPHA98};99 100enum mpcc_movable_cm_location {101 MPCC_MOVABLE_CM_LOCATION_BEFORE,102 MPCC_MOVABLE_CM_LOCATION_AFTER,103};104 105enum 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 112enum MCM_LUT_ID {113 MCM_LUT_3DLUT,114 MCM_LUT_1DLUT,115 MCM_LUT_SHAPER116};117 118union 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 configuration125 */126struct 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 channel140 * (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 187struct 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 193struct 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 207struct 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 216struct 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 */227struct mpcc {228 /**229 * @mpcc_id: MPCC physical instance.230 */231 int mpcc_id;232 233 /**234 * @dpp_id: DPP input to this MPCC235 */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 MPCC250 */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 */266struct 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 endpoint274 */275 struct mpcc *opp_list;276};277 278struct 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 287struct 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 - funcs308 */309struct 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 context318 * - [in] mpcc_instance - MPC context instance319 * - [in] mpcc_state - MPC context state320 *321 * Return:322 *323 * void324 */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 output335 *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 * void375 */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 * void393 */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 * void423 */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 of433 * 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 on439 * - [in] lock - lock/unlock the OPP440 *441 * Return:442 *443 * void444 */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 blending454 * position. Only used for planes that are part of blending chain for455 * DWB output456 *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. If465 * 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 * void496 */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 that506 * 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 that524 * 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 * void550 */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 * void565 */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 struct572 * 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 * void581 */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_mode590 * 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 * void600 */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 * void618 */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 matrix628 * 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 * void639 */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 matrix649 * 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 * void660 *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 * void680 *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_on697 *698 * Return:699 *700 * void701 */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 mux710 * 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 * void720 */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 mux730 * 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 * void739 */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 not757 */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] enable771 * - [in] rate_2x_mode772 * - [in] flow_control773 *774 * Return:775 *776 * void777 */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] adjust794 *795 * Return:796 *797 * void798 */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 context811 * - [in] params - curve parameters for the LUT configuration812 * - [in] rmu_idx813 *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 context828 * - [in] params - curve parameters to be set829 * - [in] rmu_idx830 *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 context847 * - [in] mpcc_id - MPCC848 * - [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 context863 * - [in] params - tetrahedral parameters for the LUT configuration864 * - [in] rmu_idx865 *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 context880 * - [in] mpcc_id - MPCC881 *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 - OPP896 *897 * Return:898 *899 * unsigned int - Out Mux900 */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 and909 * 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_id915 *916 * Return:917 *918 * void919 */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 * void935 */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] location946 * - [in] mpcc_id947 *948 * Return:949 *950 * void951 */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_id962 * - [in] hubp_idx963 *964 * Return:965 *966 * void967 */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_id978 * - [in/out] done979 * - [in/out] soft_underflow980 * - [in/out] hard_underflow981 *982 * Return:983 *984 * void985 */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] id996 * - [in] params997 * - [in] lut_bank_a998 * - [in] mpcc_id999 *1000 * Return:1001 *1002 * void1003 */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] id1015 * - [in] lut_bank_a1016 * - [in] mpcc_id1017 *1018 * Return:1019 *1020 * void1021 */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] id1032 * - [in] xable1033 * - [in] lut_bank_a1034 * - [in] mpcc_id1035 *1036 * Return:1037 *1038 * void1039 */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 17x17x171050 * - [in] mpcc_id1051 *1052 * Return:1053 *1054 * void1055 */1056 void (*program_3dlut_size)(struct mpc *mpc, bool is_17x17x17, int mpcc_id);1057};1058 1059#endif1060