LCOV - code coverage report
Current view: top level - drivers/gpu/drm/amd/display/dc/dcn32 - dcn32_mpc.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 400 0.0 %
Date: 2022-12-09 01:23:36 Functions: 0 24 0.0 %

          Line data    Source code
       1             : /*
       2             :  * Copyright 2021 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             : #include "reg_helper.h"
      27             : #include "dcn30/dcn30_mpc.h"
      28             : #include "dcn30/dcn30_cm_common.h"
      29             : #include "dcn32_mpc.h"
      30             : #include "basics/conversion.h"
      31             : #include "dcn10/dcn10_cm_common.h"
      32             : #include "dc.h"
      33             : 
      34             : #define REG(reg)\
      35             :         mpc30->mpc_regs->reg
      36             : 
      37             : #define CTX \
      38             :         mpc30->base.ctx
      39             : 
      40             : #undef FN
      41             : #define FN(reg_name, field_name) \
      42             :         mpc30->mpc_shift->field_name, mpc30->mpc_mask->field_name
      43             : 
      44             : 
      45           0 : static void mpc32_mpc_init(struct mpc *mpc)
      46             : {
      47           0 :         struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
      48             :         int mpcc_id;
      49             : 
      50           0 :         mpc1_mpc_init(mpc);
      51             : 
      52           0 :         if (mpc->ctx->dc->debug.enable_mem_low_power.bits.mpc) {
      53           0 :                 if (mpc30->mpc_mask->MPCC_MCM_SHAPER_MEM_LOW_PWR_MODE && mpc30->mpc_mask->MPCC_MCM_3DLUT_MEM_LOW_PWR_MODE) {
      54           0 :                         for (mpcc_id = 0; mpcc_id < mpc30->num_mpcc; mpcc_id++) {
      55           0 :                                 REG_UPDATE(MPCC_MCM_MEM_PWR_CTRL[mpcc_id], MPCC_MCM_SHAPER_MEM_LOW_PWR_MODE, 3);
      56           0 :                                 REG_UPDATE(MPCC_MCM_MEM_PWR_CTRL[mpcc_id], MPCC_MCM_3DLUT_MEM_LOW_PWR_MODE, 3);
      57           0 :                                 REG_UPDATE(MPCC_MCM_MEM_PWR_CTRL[mpcc_id], MPCC_MCM_1DLUT_MEM_LOW_PWR_MODE, 3);
      58             :                         }
      59             :                 }
      60           0 :                 if (mpc30->mpc_mask->MPCC_OGAM_MEM_LOW_PWR_MODE) {
      61           0 :                         for (mpcc_id = 0; mpcc_id < mpc30->num_mpcc; mpcc_id++)
      62           0 :                                 REG_UPDATE(MPCC_MEM_PWR_CTRL[mpcc_id], MPCC_OGAM_MEM_LOW_PWR_MODE, 3);
      63             :                 }
      64             :         }
      65           0 : }
      66             : 
      67           0 : static void mpc32_power_on_blnd_lut(
      68             :         struct mpc *mpc,
      69             :         uint32_t mpcc_id,
      70             :         bool power_on)
      71             : {
      72           0 :         struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
      73             : 
      74           0 :         if (mpc->ctx->dc->debug.enable_mem_low_power.bits.cm) {
      75           0 :                 if (power_on) {
      76           0 :                         REG_UPDATE(MPCC_MCM_MEM_PWR_CTRL[mpcc_id], MPCC_MCM_1DLUT_MEM_PWR_FORCE, 0);
      77           0 :                         REG_WAIT(MPCC_MCM_MEM_PWR_CTRL[mpcc_id], MPCC_MCM_1DLUT_MEM_PWR_STATE, 0, 1, 5);
      78             :                 } else {
      79           0 :                         ASSERT(false);
      80             :                         /* TODO: change to mpc
      81             :                          *  dpp_base->ctx->dc->optimized_required = true;
      82             :                          *  dpp_base->deferred_reg_writes.bits.disable_blnd_lut = true;
      83             :                          */
      84             :                 }
      85             :         } else {
      86           0 :                 REG_SET(MPCC_MCM_MEM_PWR_CTRL[mpcc_id], 0,
      87             :                                 MPCC_MCM_1DLUT_MEM_PWR_FORCE, power_on == true ? 0 : 1);
      88             :         }
      89           0 : }
      90             : 
      91           0 : static enum dc_lut_mode mpc32_get_post1dlut_current(struct mpc *mpc, uint32_t mpcc_id)
      92             : {
      93             :         enum dc_lut_mode mode;
      94           0 :         uint32_t mode_current = 0;
      95           0 :         uint32_t in_use = 0;
      96             : 
      97           0 :         struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
      98             : 
      99           0 :         REG_GET(MPCC_MCM_1DLUT_CONTROL[mpcc_id],
     100             :                         MPCC_MCM_1DLUT_MODE_CURRENT, &mode_current);
     101           0 :         REG_GET(MPCC_MCM_1DLUT_CONTROL[mpcc_id],
     102             :                         MPCC_MCM_1DLUT_SELECT_CURRENT, &in_use);
     103             : 
     104           0 :         switch (mode_current) {
     105             :         case 0:
     106             :         case 1:
     107             :                 mode = LUT_BYPASS;
     108             :                 break;
     109             : 
     110             :         case 2:
     111           0 :                 if (in_use == 0)
     112             :                         mode = LUT_RAM_A;
     113             :                 else
     114           0 :                         mode = LUT_RAM_B;
     115             :                 break;
     116             :         default:
     117             :                 mode = LUT_BYPASS;
     118             :                 break;
     119             :         }
     120           0 :         return mode;
     121             : }
     122             : 
     123           0 : static void mpc32_configure_post1dlut(
     124             :                 struct mpc *mpc,
     125             :                 uint32_t mpcc_id,
     126             :                 bool is_ram_a)
     127             : {
     128           0 :         struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
     129             : 
     130             :         //TODO: this
     131           0 :         REG_UPDATE_2(MPCC_MCM_1DLUT_LUT_CONTROL[mpcc_id],
     132             :                         MPCC_MCM_1DLUT_LUT_WRITE_COLOR_MASK, 7,
     133             :                         MPCC_MCM_1DLUT_LUT_HOST_SEL, is_ram_a == true ? 0 : 1);
     134             : 
     135           0 :         REG_SET(MPCC_MCM_1DLUT_LUT_INDEX[mpcc_id], 0, MPCC_MCM_1DLUT_LUT_INDEX, 0);
     136           0 : }
     137             : 
     138           0 : static void mpc32_post1dlut_get_reg_field(
     139             :                 struct dcn30_mpc *mpc,
     140             :                 struct dcn3_xfer_func_reg *reg)
     141             : {
     142           0 :         reg->shifts.exp_region0_lut_offset = mpc->mpc_shift->MPCC_MCM_1DLUT_RAMA_EXP_REGION0_LUT_OFFSET;
     143           0 :         reg->masks.exp_region0_lut_offset = mpc->mpc_mask->MPCC_MCM_1DLUT_RAMA_EXP_REGION0_LUT_OFFSET;
     144           0 :         reg->shifts.exp_region0_num_segments = mpc->mpc_shift->MPCC_MCM_1DLUT_RAMA_EXP_REGION0_NUM_SEGMENTS;
     145           0 :         reg->masks.exp_region0_num_segments = mpc->mpc_mask->MPCC_MCM_1DLUT_RAMA_EXP_REGION0_NUM_SEGMENTS;
     146           0 :         reg->shifts.exp_region1_lut_offset = mpc->mpc_shift->MPCC_MCM_1DLUT_RAMA_EXP_REGION1_LUT_OFFSET;
     147           0 :         reg->masks.exp_region1_lut_offset = mpc->mpc_mask->MPCC_MCM_1DLUT_RAMA_EXP_REGION1_LUT_OFFSET;
     148           0 :         reg->shifts.exp_region1_num_segments = mpc->mpc_shift->MPCC_MCM_1DLUT_RAMA_EXP_REGION1_NUM_SEGMENTS;
     149           0 :         reg->masks.exp_region1_num_segments = mpc->mpc_mask->MPCC_MCM_1DLUT_RAMA_EXP_REGION1_NUM_SEGMENTS;
     150             : 
     151           0 :         reg->shifts.field_region_end = mpc->mpc_shift->MPCC_MCM_1DLUT_RAMA_EXP_REGION_END_B;
     152           0 :         reg->masks.field_region_end = mpc->mpc_mask->MPCC_MCM_1DLUT_RAMA_EXP_REGION_END_B;
     153           0 :         reg->shifts.field_region_end_slope = mpc->mpc_shift->MPCC_MCM_1DLUT_RAMA_EXP_REGION_END_SLOPE_B;
     154           0 :         reg->masks.field_region_end_slope = mpc->mpc_mask->MPCC_MCM_1DLUT_RAMA_EXP_REGION_END_SLOPE_B;
     155           0 :         reg->shifts.field_region_end_base = mpc->mpc_shift->MPCC_MCM_1DLUT_RAMA_EXP_REGION_END_BASE_B;
     156           0 :         reg->masks.field_region_end_base = mpc->mpc_mask->MPCC_MCM_1DLUT_RAMA_EXP_REGION_END_BASE_B;
     157           0 :         reg->shifts.field_region_linear_slope = mpc->mpc_shift->MPCC_MCM_1DLUT_RAMA_EXP_REGION_START_SLOPE_B;
     158           0 :         reg->masks.field_region_linear_slope = mpc->mpc_mask->MPCC_MCM_1DLUT_RAMA_EXP_REGION_START_SLOPE_B;
     159           0 :         reg->shifts.exp_region_start = mpc->mpc_shift->MPCC_MCM_1DLUT_RAMA_EXP_REGION_START_B;
     160           0 :         reg->masks.exp_region_start = mpc->mpc_mask->MPCC_MCM_1DLUT_RAMA_EXP_REGION_START_B;
     161           0 :         reg->shifts.exp_resion_start_segment = mpc->mpc_shift->MPCC_MCM_1DLUT_RAMA_EXP_REGION_START_SEGMENT_B;
     162           0 :         reg->masks.exp_resion_start_segment = mpc->mpc_mask->MPCC_MCM_1DLUT_RAMA_EXP_REGION_START_SEGMENT_B;
     163           0 : }
     164             : 
     165             : /*program blnd lut RAM A*/
     166           0 : static void mpc32_program_post1dluta_settings(
     167             :                 struct mpc *mpc,
     168             :                 uint32_t mpcc_id,
     169             :                 const struct pwl_params *params)
     170             : {
     171           0 :         struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
     172             :         struct dcn3_xfer_func_reg gam_regs;
     173             : 
     174           0 :         mpc32_post1dlut_get_reg_field(mpc30, &gam_regs);
     175             : 
     176           0 :         gam_regs.start_cntl_b = REG(MPCC_MCM_1DLUT_RAMA_START_CNTL_B[mpcc_id]);
     177           0 :         gam_regs.start_cntl_g = REG(MPCC_MCM_1DLUT_RAMA_START_CNTL_G[mpcc_id]);
     178           0 :         gam_regs.start_cntl_r = REG(MPCC_MCM_1DLUT_RAMA_START_CNTL_R[mpcc_id]);
     179           0 :         gam_regs.start_slope_cntl_b = REG(MPCC_MCM_1DLUT_RAMA_START_SLOPE_CNTL_B[mpcc_id]);
     180           0 :         gam_regs.start_slope_cntl_g = REG(MPCC_MCM_1DLUT_RAMA_START_SLOPE_CNTL_G[mpcc_id]);
     181           0 :         gam_regs.start_slope_cntl_r = REG(MPCC_MCM_1DLUT_RAMA_START_SLOPE_CNTL_R[mpcc_id]);
     182           0 :         gam_regs.start_end_cntl1_b = REG(MPCC_MCM_1DLUT_RAMA_END_CNTL1_B[mpcc_id]);
     183           0 :         gam_regs.start_end_cntl2_b = REG(MPCC_MCM_1DLUT_RAMA_END_CNTL2_B[mpcc_id]);
     184           0 :         gam_regs.start_end_cntl1_g = REG(MPCC_MCM_1DLUT_RAMA_END_CNTL1_G[mpcc_id]);
     185           0 :         gam_regs.start_end_cntl2_g = REG(MPCC_MCM_1DLUT_RAMA_END_CNTL2_G[mpcc_id]);
     186           0 :         gam_regs.start_end_cntl1_r = REG(MPCC_MCM_1DLUT_RAMA_END_CNTL1_R[mpcc_id]);
     187           0 :         gam_regs.start_end_cntl2_r = REG(MPCC_MCM_1DLUT_RAMA_END_CNTL2_R[mpcc_id]);
     188           0 :         gam_regs.region_start = REG(MPCC_MCM_1DLUT_RAMA_REGION_0_1[mpcc_id]);
     189           0 :         gam_regs.region_end = REG(MPCC_MCM_1DLUT_RAMA_REGION_32_33[mpcc_id]);
     190             : 
     191           0 :         cm_helper_program_gamcor_xfer_func(mpc->ctx, params, &gam_regs);
     192           0 : }
     193             : 
     194             : /*program blnd lut RAM B*/
     195           0 : static void mpc32_program_post1dlutb_settings(
     196             :                 struct mpc *mpc,
     197             :                 uint32_t mpcc_id,
     198             :                 const struct pwl_params *params)
     199             : {
     200           0 :         struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
     201             :         struct dcn3_xfer_func_reg gam_regs;
     202             : 
     203           0 :         mpc32_post1dlut_get_reg_field(mpc30, &gam_regs);
     204             : 
     205           0 :         gam_regs.start_cntl_b = REG(MPCC_MCM_1DLUT_RAMB_START_CNTL_B[mpcc_id]);
     206           0 :         gam_regs.start_cntl_g = REG(MPCC_MCM_1DLUT_RAMB_START_CNTL_G[mpcc_id]);
     207           0 :         gam_regs.start_cntl_r = REG(MPCC_MCM_1DLUT_RAMB_START_CNTL_R[mpcc_id]);
     208           0 :         gam_regs.start_slope_cntl_b = REG(MPCC_MCM_1DLUT_RAMB_START_SLOPE_CNTL_B[mpcc_id]);
     209           0 :         gam_regs.start_slope_cntl_g = REG(MPCC_MCM_1DLUT_RAMB_START_SLOPE_CNTL_G[mpcc_id]);
     210           0 :         gam_regs.start_slope_cntl_r = REG(MPCC_MCM_1DLUT_RAMB_START_SLOPE_CNTL_R[mpcc_id]);
     211           0 :         gam_regs.start_end_cntl1_b = REG(MPCC_MCM_1DLUT_RAMB_END_CNTL1_B[mpcc_id]);
     212           0 :         gam_regs.start_end_cntl2_b = REG(MPCC_MCM_1DLUT_RAMB_END_CNTL2_B[mpcc_id]);
     213           0 :         gam_regs.start_end_cntl1_g = REG(MPCC_MCM_1DLUT_RAMB_END_CNTL1_G[mpcc_id]);
     214           0 :         gam_regs.start_end_cntl2_g = REG(MPCC_MCM_1DLUT_RAMB_END_CNTL2_G[mpcc_id]);
     215           0 :         gam_regs.start_end_cntl1_r = REG(MPCC_MCM_1DLUT_RAMB_END_CNTL1_R[mpcc_id]);
     216           0 :         gam_regs.start_end_cntl2_r = REG(MPCC_MCM_1DLUT_RAMB_END_CNTL2_R[mpcc_id]);
     217           0 :         gam_regs.region_start = REG(MPCC_MCM_1DLUT_RAMB_REGION_0_1[mpcc_id]);
     218           0 :         gam_regs.region_end = REG(MPCC_MCM_1DLUT_RAMB_REGION_32_33[mpcc_id]);
     219             : 
     220           0 :         cm_helper_program_gamcor_xfer_func(mpc->ctx, params, &gam_regs);
     221           0 : }
     222             : 
     223           0 : static void mpc32_program_post1dlut_pwl(
     224             :                 struct mpc *mpc,
     225             :                 uint32_t mpcc_id,
     226             :                 const struct pwl_result_data *rgb,
     227             :                 uint32_t num)
     228             : {
     229             :         uint32_t i;
     230           0 :         struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
     231           0 :         uint32_t last_base_value_red = rgb[num-1].red_reg + rgb[num-1].delta_red_reg;
     232           0 :         uint32_t last_base_value_green = rgb[num-1].green_reg + rgb[num-1].delta_green_reg;
     233           0 :         uint32_t last_base_value_blue = rgb[num-1].blue_reg + rgb[num-1].delta_blue_reg;
     234             : 
     235           0 :         if (is_rgb_equal(rgb, num)) {
     236           0 :                 for (i = 0 ; i < num; i++)
     237           0 :                         REG_SET(MPCC_MCM_1DLUT_LUT_DATA[mpcc_id], 0, MPCC_MCM_1DLUT_LUT_DATA, rgb[i].red_reg);
     238           0 :                 REG_SET(MPCC_MCM_1DLUT_LUT_DATA[mpcc_id], 0, MPCC_MCM_1DLUT_LUT_DATA, last_base_value_red);
     239             :         } else {
     240           0 :                 REG_UPDATE(MPCC_MCM_1DLUT_LUT_CONTROL[mpcc_id], MPCC_MCM_1DLUT_LUT_WRITE_COLOR_MASK, 4);
     241           0 :                 for (i = 0 ; i < num; i++)
     242           0 :                         REG_SET(MPCC_MCM_1DLUT_LUT_DATA[mpcc_id], 0, MPCC_MCM_1DLUT_LUT_DATA, rgb[i].red_reg);
     243           0 :                 REG_SET(MPCC_MCM_1DLUT_LUT_DATA[mpcc_id], 0, MPCC_MCM_1DLUT_LUT_DATA, last_base_value_red);
     244             : 
     245           0 :                 REG_UPDATE(MPCC_MCM_1DLUT_LUT_CONTROL[mpcc_id], MPCC_MCM_1DLUT_LUT_WRITE_COLOR_MASK, 2);
     246           0 :                 for (i = 0 ; i < num; i++)
     247           0 :                         REG_SET(MPCC_MCM_1DLUT_LUT_DATA[mpcc_id], 0, MPCC_MCM_1DLUT_LUT_DATA, rgb[i].green_reg);
     248           0 :                 REG_SET(MPCC_MCM_1DLUT_LUT_DATA[mpcc_id], 0, MPCC_MCM_1DLUT_LUT_DATA, last_base_value_green);
     249             : 
     250           0 :                 REG_UPDATE(MPCC_MCM_1DLUT_LUT_CONTROL[mpcc_id], MPCC_MCM_1DLUT_LUT_WRITE_COLOR_MASK, 1);
     251           0 :                 for (i = 0 ; i < num; i++)
     252           0 :                         REG_SET(MPCC_MCM_1DLUT_LUT_DATA[mpcc_id], 0, MPCC_MCM_1DLUT_LUT_DATA, rgb[i].blue_reg);
     253           0 :                 REG_SET(MPCC_MCM_1DLUT_LUT_DATA[mpcc_id], 0, MPCC_MCM_1DLUT_LUT_DATA, last_base_value_blue);
     254             :         }
     255           0 : }
     256             : 
     257           0 : static bool mpc32_program_post1dlut(
     258             :                 struct mpc *mpc,
     259             :                 const struct pwl_params *params,
     260             :                 uint32_t mpcc_id)
     261             : {
     262             :         enum dc_lut_mode current_mode;
     263             :         enum dc_lut_mode next_mode;
     264           0 :         struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
     265             : 
     266           0 :         if (params == NULL) {
     267           0 :                 REG_SET(MPCC_MCM_1DLUT_CONTROL[mpcc_id], 0, MPCC_MCM_1DLUT_MODE, 0);
     268           0 :                 if (mpc->ctx->dc->debug.enable_mem_low_power.bits.cm)
     269           0 :                         mpc32_power_on_blnd_lut(mpc, mpcc_id, false);
     270             :                 return false;
     271             :         }
     272             : 
     273           0 :         current_mode = mpc32_get_post1dlut_current(mpc, mpcc_id);
     274           0 :         if (current_mode == LUT_BYPASS || current_mode == LUT_RAM_B)
     275             :                 next_mode = LUT_RAM_A;
     276             :         else
     277           0 :                 next_mode = LUT_RAM_B;
     278             : 
     279           0 :         mpc32_power_on_blnd_lut(mpc, mpcc_id, true);
     280           0 :         mpc32_configure_post1dlut(mpc, mpcc_id, next_mode == LUT_RAM_A);
     281             : 
     282           0 :         if (next_mode == LUT_RAM_A)
     283           0 :                 mpc32_program_post1dluta_settings(mpc, mpcc_id, params);
     284             :         else
     285           0 :                 mpc32_program_post1dlutb_settings(mpc, mpcc_id, params);
     286             : 
     287           0 :         mpc32_program_post1dlut_pwl(
     288           0 :                         mpc, mpcc_id, params->rgb_resulted, params->hw_points_num);
     289             : 
     290           0 :         REG_UPDATE_2(MPCC_MCM_1DLUT_CONTROL[mpcc_id],
     291             :                         MPCC_MCM_1DLUT_MODE, 2,
     292             :                         MPCC_MCM_1DLUT_SELECT, next_mode == LUT_RAM_A ? 0 : 1);
     293             : 
     294           0 :         return true;
     295             : }
     296             : 
     297           0 : static enum dc_lut_mode mpc32_get_shaper_current(struct mpc *mpc, uint32_t mpcc_id)
     298             : {
     299             :         enum dc_lut_mode mode;
     300             :         uint32_t state_mode;
     301           0 :         struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
     302             : 
     303           0 :         REG_GET(MPCC_MCM_SHAPER_CONTROL[mpcc_id], MPCC_MCM_SHAPER_MODE_CURRENT, &state_mode);
     304             : 
     305           0 :         switch (state_mode) {
     306             :         case 0:
     307             :                 mode = LUT_BYPASS;
     308             :                 break;
     309             :         case 1:
     310           0 :                 mode = LUT_RAM_A;
     311           0 :                 break;
     312             :         case 2:
     313           0 :                 mode = LUT_RAM_B;
     314           0 :                 break;
     315             :         default:
     316             :                 mode = LUT_BYPASS;
     317             :                 break;
     318             :         }
     319             : 
     320           0 :         return mode;
     321             : }
     322             : 
     323             : 
     324           0 : static void mpc32_configure_shaper_lut(
     325             :                 struct mpc *mpc,
     326             :                 bool is_ram_a,
     327             :                 uint32_t mpcc_id)
     328             : {
     329           0 :         struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
     330             : 
     331           0 :         REG_UPDATE(MPCC_MCM_SHAPER_LUT_WRITE_EN_MASK[mpcc_id],
     332             :                         MPCC_MCM_SHAPER_LUT_WRITE_EN_MASK, 7);
     333           0 :         REG_UPDATE(MPCC_MCM_SHAPER_LUT_WRITE_EN_MASK[mpcc_id],
     334             :                         MPCC_MCM_SHAPER_LUT_WRITE_SEL, is_ram_a == true ? 0:1);
     335           0 :         REG_SET(MPCC_MCM_SHAPER_LUT_INDEX[mpcc_id], 0, MPCC_MCM_SHAPER_LUT_INDEX, 0);
     336           0 : }
     337             : 
     338             : 
     339           0 : static void mpc32_program_shaper_luta_settings(
     340             :                 struct mpc *mpc,
     341             :                 const struct pwl_params *params,
     342             :                 uint32_t mpcc_id)
     343             : {
     344             :         const struct gamma_curve *curve;
     345           0 :         struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
     346             : 
     347           0 :         REG_SET_2(MPCC_MCM_SHAPER_RAMA_START_CNTL_B[mpcc_id], 0,
     348             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION_START_B, params->corner_points[0].blue.custom_float_x,
     349             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION_START_SEGMENT_B, 0);
     350           0 :         REG_SET_2(MPCC_MCM_SHAPER_RAMA_START_CNTL_G[mpcc_id], 0,
     351             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION_START_B, params->corner_points[0].green.custom_float_x,
     352             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION_START_SEGMENT_B, 0);
     353           0 :         REG_SET_2(MPCC_MCM_SHAPER_RAMA_START_CNTL_R[mpcc_id], 0,
     354             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION_START_B, params->corner_points[0].red.custom_float_x,
     355             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION_START_SEGMENT_B, 0);
     356             : 
     357           0 :         REG_SET_2(MPCC_MCM_SHAPER_RAMA_END_CNTL_B[mpcc_id], 0,
     358             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION_END_B, params->corner_points[1].blue.custom_float_x,
     359             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION_END_BASE_B, params->corner_points[1].blue.custom_float_y);
     360           0 :         REG_SET_2(MPCC_MCM_SHAPER_RAMA_END_CNTL_G[mpcc_id], 0,
     361             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION_END_B, params->corner_points[1].green.custom_float_x,
     362             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION_END_BASE_B, params->corner_points[1].green.custom_float_y);
     363           0 :         REG_SET_2(MPCC_MCM_SHAPER_RAMA_END_CNTL_R[mpcc_id], 0,
     364             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION_END_B, params->corner_points[1].red.custom_float_x,
     365             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION_END_BASE_B, params->corner_points[1].red.custom_float_y);
     366             : 
     367           0 :         curve = params->arr_curve_points;
     368           0 :         REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_0_1[mpcc_id], 0,
     369             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
     370             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
     371             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
     372             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
     373             : 
     374           0 :         curve += 2;
     375           0 :         REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_2_3[mpcc_id], 0,
     376             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
     377             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
     378             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
     379             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
     380             : 
     381           0 :         curve += 2;
     382           0 :         REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_4_5[mpcc_id], 0,
     383             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
     384             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
     385             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
     386             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
     387             : 
     388           0 :         curve += 2;
     389           0 :         REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_6_7[mpcc_id], 0,
     390             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
     391             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
     392             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
     393             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
     394             : 
     395           0 :         curve += 2;
     396           0 :         REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_8_9[mpcc_id], 0,
     397             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
     398             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
     399             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
     400             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
     401             : 
     402           0 :         curve += 2;
     403           0 :         REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_10_11[mpcc_id], 0,
     404             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
     405             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
     406             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
     407             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
     408             : 
     409           0 :         curve += 2;
     410           0 :         REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_12_13[mpcc_id], 0,
     411             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
     412             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
     413             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
     414             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
     415             : 
     416           0 :         curve += 2;
     417           0 :         REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_14_15[mpcc_id], 0,
     418             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
     419             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
     420             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
     421             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
     422             : 
     423             : 
     424           0 :         curve += 2;
     425           0 :         REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_16_17[mpcc_id], 0,
     426             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
     427             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
     428             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
     429             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
     430             : 
     431           0 :         curve += 2;
     432           0 :         REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_18_19[mpcc_id], 0,
     433             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
     434             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
     435             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
     436             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
     437             : 
     438           0 :         curve += 2;
     439           0 :         REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_20_21[mpcc_id], 0,
     440             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
     441             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
     442             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
     443             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
     444             : 
     445           0 :         curve += 2;
     446           0 :         REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_22_23[mpcc_id], 0,
     447             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
     448             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
     449             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
     450             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
     451             : 
     452           0 :         curve += 2;
     453           0 :         REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_24_25[mpcc_id], 0,
     454             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
     455             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
     456             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
     457             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
     458             : 
     459           0 :         curve += 2;
     460           0 :         REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_26_27[mpcc_id], 0,
     461             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
     462             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
     463             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
     464             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
     465             : 
     466           0 :         curve += 2;
     467           0 :         REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_28_29[mpcc_id], 0,
     468             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
     469             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
     470             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
     471             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
     472             : 
     473           0 :         curve += 2;
     474           0 :         REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_30_31[mpcc_id], 0,
     475             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
     476             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
     477             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
     478             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
     479             : 
     480           0 :         curve += 2;
     481           0 :         REG_SET_4(MPCC_MCM_SHAPER_RAMA_REGION_32_33[mpcc_id], 0,
     482             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
     483             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
     484             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
     485             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
     486           0 : }
     487             : 
     488             : 
     489           0 : static void mpc32_program_shaper_lutb_settings(
     490             :                 struct mpc *mpc,
     491             :                 const struct pwl_params *params,
     492             :                 uint32_t mpcc_id)
     493             : {
     494             :         const struct gamma_curve *curve;
     495           0 :         struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
     496             : 
     497           0 :         REG_SET_2(MPCC_MCM_SHAPER_RAMB_START_CNTL_B[mpcc_id], 0,
     498             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION_START_B, params->corner_points[0].blue.custom_float_x,
     499             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION_START_SEGMENT_B, 0);
     500           0 :         REG_SET_2(MPCC_MCM_SHAPER_RAMB_START_CNTL_G[mpcc_id], 0,
     501             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION_START_B, params->corner_points[0].green.custom_float_x,
     502             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION_START_SEGMENT_B, 0);
     503           0 :         REG_SET_2(MPCC_MCM_SHAPER_RAMB_START_CNTL_R[mpcc_id], 0,
     504             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION_START_B, params->corner_points[0].red.custom_float_x,
     505             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION_START_SEGMENT_B, 0);
     506             : 
     507           0 :         REG_SET_2(MPCC_MCM_SHAPER_RAMB_END_CNTL_B[mpcc_id], 0,
     508             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION_END_B, params->corner_points[1].blue.custom_float_x,
     509             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION_END_BASE_B, params->corner_points[1].blue.custom_float_y);
     510           0 :         REG_SET_2(MPCC_MCM_SHAPER_RAMB_END_CNTL_G[mpcc_id], 0,
     511             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION_END_B, params->corner_points[1].green.custom_float_x,
     512             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION_END_BASE_B, params->corner_points[1].green.custom_float_y);
     513           0 :         REG_SET_2(MPCC_MCM_SHAPER_RAMB_END_CNTL_R[mpcc_id], 0,
     514             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION_END_B, params->corner_points[1].red.custom_float_x,
     515             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION_END_BASE_B, params->corner_points[1].red.custom_float_y);
     516             : 
     517           0 :         curve = params->arr_curve_points;
     518           0 :         REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_0_1[mpcc_id], 0,
     519             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
     520             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
     521             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
     522             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
     523             : 
     524           0 :         curve += 2;
     525           0 :         REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_2_3[mpcc_id], 0,
     526             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
     527             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
     528             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
     529             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
     530             : 
     531             : 
     532           0 :         curve += 2;
     533           0 :         REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_4_5[mpcc_id], 0,
     534             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
     535             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
     536             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
     537             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
     538             : 
     539           0 :         curve += 2;
     540           0 :         REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_6_7[mpcc_id], 0,
     541             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
     542             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
     543             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
     544             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
     545             : 
     546           0 :         curve += 2;
     547           0 :         REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_8_9[mpcc_id], 0,
     548             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
     549             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
     550             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
     551             :                 MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
     552             : 
     553           0 :         curve += 2;
     554           0 :         REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_10_11[mpcc_id], 0,
     555             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
     556             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
     557             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
     558             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
     559             : 
     560           0 :         curve += 2;
     561           0 :         REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_12_13[mpcc_id], 0,
     562             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
     563             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
     564             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
     565             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
     566             : 
     567           0 :         curve += 2;
     568           0 :         REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_14_15[mpcc_id], 0,
     569             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
     570             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
     571             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
     572             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
     573             : 
     574             : 
     575           0 :         curve += 2;
     576           0 :         REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_16_17[mpcc_id], 0,
     577             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
     578             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
     579             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
     580             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
     581             : 
     582           0 :         curve += 2;
     583           0 :         REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_18_19[mpcc_id], 0,
     584             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
     585             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
     586             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
     587             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
     588             : 
     589           0 :         curve += 2;
     590           0 :         REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_20_21[mpcc_id], 0,
     591             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
     592             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
     593             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
     594             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
     595             : 
     596           0 :         curve += 2;
     597           0 :         REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_22_23[mpcc_id], 0,
     598             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
     599             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
     600             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
     601             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
     602             : 
     603           0 :         curve += 2;
     604           0 :         REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_24_25[mpcc_id], 0,
     605             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
     606             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
     607             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
     608             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
     609             : 
     610           0 :         curve += 2;
     611           0 :         REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_26_27[mpcc_id], 0,
     612             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
     613             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
     614             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
     615             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
     616             : 
     617           0 :         curve += 2;
     618           0 :         REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_28_29[mpcc_id], 0,
     619             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
     620             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
     621             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
     622             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
     623             : 
     624           0 :         curve += 2;
     625           0 :         REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_30_31[mpcc_id], 0,
     626             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
     627             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
     628             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
     629             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
     630             : 
     631           0 :         curve += 2;
     632           0 :         REG_SET_4(MPCC_MCM_SHAPER_RAMB_REGION_32_33[mpcc_id], 0,
     633             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION0_LUT_OFFSET, curve[0].offset,
     634             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION0_NUM_SEGMENTS, curve[0].segments_num,
     635             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION1_LUT_OFFSET, curve[1].offset,
     636             :                         MPCC_MCM_SHAPER_RAMA_EXP_REGION1_NUM_SEGMENTS, curve[1].segments_num);
     637           0 : }
     638             : 
     639             : 
     640           0 : static void mpc32_program_shaper_lut(
     641             :                 struct mpc *mpc,
     642             :                 const struct pwl_result_data *rgb,
     643             :                 uint32_t num,
     644             :                 uint32_t mpcc_id)
     645             : {
     646             :         uint32_t i, red, green, blue;
     647             :         uint32_t  red_delta, green_delta, blue_delta;
     648             :         uint32_t  red_value, green_value, blue_value;
     649             : 
     650           0 :         struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
     651             : 
     652           0 :         for (i = 0 ; i < num; i++) {
     653             : 
     654           0 :                 red   = rgb[i].red_reg;
     655           0 :                 green = rgb[i].green_reg;
     656           0 :                 blue  = rgb[i].blue_reg;
     657             : 
     658           0 :                 red_delta   = rgb[i].delta_red_reg;
     659           0 :                 green_delta = rgb[i].delta_green_reg;
     660           0 :                 blue_delta  = rgb[i].delta_blue_reg;
     661             : 
     662           0 :                 red_value   = ((red_delta   & 0x3ff) << 14) | (red   & 0x3fff);
     663           0 :                 green_value = ((green_delta & 0x3ff) << 14) | (green & 0x3fff);
     664           0 :                 blue_value  = ((blue_delta  & 0x3ff) << 14) | (blue  & 0x3fff);
     665             : 
     666           0 :                 REG_SET(MPCC_MCM_SHAPER_LUT_DATA[mpcc_id], 0, MPCC_MCM_SHAPER_LUT_DATA, red_value);
     667           0 :                 REG_SET(MPCC_MCM_SHAPER_LUT_DATA[mpcc_id], 0, MPCC_MCM_SHAPER_LUT_DATA, green_value);
     668           0 :                 REG_SET(MPCC_MCM_SHAPER_LUT_DATA[mpcc_id], 0, MPCC_MCM_SHAPER_LUT_DATA, blue_value);
     669             :         }
     670             : 
     671           0 : }
     672             : 
     673             : 
     674           0 : static void mpc32_power_on_shaper_3dlut(
     675             :                 struct mpc *mpc,
     676             :                 uint32_t mpcc_id,
     677             :                 bool power_on)
     678             : {
     679           0 :         uint32_t power_status_shaper = 2;
     680           0 :         uint32_t power_status_3dlut  = 2;
     681           0 :         struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
     682           0 :         int max_retries = 10;
     683             : 
     684           0 :         REG_SET(MPCC_MCM_MEM_PWR_CTRL[mpcc_id], 0,
     685             :         MPCC_MCM_3DLUT_MEM_PWR_DIS, power_on == true ? 1:0);
     686             :         /* wait for memory to fully power up */
     687           0 :         if (power_on && mpc->ctx->dc->debug.enable_mem_low_power.bits.mpc) {
     688           0 :                 REG_WAIT(MPCC_MCM_MEM_PWR_CTRL[mpcc_id], MPCC_MCM_SHAPER_MEM_PWR_STATE, 0, 1, max_retries);
     689           0 :                 REG_WAIT(MPCC_MCM_MEM_PWR_CTRL[mpcc_id], MPCC_MCM_3DLUT_MEM_PWR_STATE, 0, 1, max_retries);
     690             :         }
     691             : 
     692             :         /*read status is not mandatory, it is just for debugging*/
     693           0 :         REG_GET(MPCC_MCM_MEM_PWR_CTRL[mpcc_id], MPCC_MCM_SHAPER_MEM_PWR_STATE, &power_status_shaper);
     694           0 :         REG_GET(MPCC_MCM_MEM_PWR_CTRL[mpcc_id], MPCC_MCM_3DLUT_MEM_PWR_STATE, &power_status_3dlut);
     695             : 
     696           0 :         if (power_status_shaper != 0 && power_on == true)
     697           0 :                 BREAK_TO_DEBUGGER();
     698             : 
     699           0 :         if (power_status_3dlut != 0 && power_on == true)
     700           0 :                 BREAK_TO_DEBUGGER();
     701           0 : }
     702             : 
     703             : 
     704           0 : bool mpc32_program_shaper(
     705             :                 struct mpc *mpc,
     706             :                 const struct pwl_params *params,
     707             :                 uint32_t mpcc_id)
     708             : {
     709             :         enum dc_lut_mode current_mode;
     710             :         enum dc_lut_mode next_mode;
     711             : 
     712           0 :         struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
     713             : 
     714           0 :         if (params == NULL) {
     715           0 :                 REG_SET(MPCC_MCM_SHAPER_CONTROL[mpcc_id], 0, MPCC_MCM_SHAPER_LUT_MODE, 0);
     716           0 :                 return false;
     717             :         }
     718             : 
     719           0 :         if (mpc->ctx->dc->debug.enable_mem_low_power.bits.mpc)
     720           0 :                 mpc32_power_on_shaper_3dlut(mpc, mpcc_id, true);
     721             : 
     722           0 :         current_mode = mpc32_get_shaper_current(mpc, mpcc_id);
     723             : 
     724           0 :         if (current_mode == LUT_BYPASS || current_mode == LUT_RAM_A)
     725             :                 next_mode = LUT_RAM_B;
     726             :         else
     727           0 :                 next_mode = LUT_RAM_A;
     728             : 
     729           0 :         mpc32_configure_shaper_lut(mpc, next_mode == LUT_RAM_A ? true:false, mpcc_id);
     730             : 
     731           0 :         if (next_mode == LUT_RAM_A)
     732           0 :                 mpc32_program_shaper_luta_settings(mpc, params, mpcc_id);
     733             :         else
     734           0 :                 mpc32_program_shaper_lutb_settings(mpc, params, mpcc_id);
     735             : 
     736           0 :         mpc32_program_shaper_lut(
     737           0 :                         mpc, params->rgb_resulted, params->hw_points_num, mpcc_id);
     738             : 
     739           0 :         REG_SET(MPCC_MCM_SHAPER_CONTROL[mpcc_id], 0, MPCC_MCM_SHAPER_LUT_MODE, next_mode == LUT_RAM_A ? 1:2);
     740           0 :         mpc32_power_on_shaper_3dlut(mpc, mpcc_id, false);
     741             : 
     742           0 :         return true;
     743             : }
     744             : 
     745             : 
     746           0 : static enum dc_lut_mode get3dlut_config(
     747             :                         struct mpc *mpc,
     748             :                         bool *is_17x17x17,
     749             :                         bool *is_12bits_color_channel,
     750             :                         int mpcc_id)
     751             : {
     752             :         uint32_t i_mode, i_enable_10bits, lut_size;
     753             :         enum dc_lut_mode mode;
     754           0 :         struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
     755             : 
     756           0 :         REG_GET(MPCC_MCM_3DLUT_MODE[mpcc_id],
     757             :                         MPCC_MCM_3DLUT_MODE_CURRENT,  &i_mode);
     758             : 
     759           0 :         REG_GET(MPCC_MCM_3DLUT_READ_WRITE_CONTROL[mpcc_id],
     760             :                         MPCC_MCM_3DLUT_30BIT_EN, &i_enable_10bits);
     761             : 
     762           0 :         switch (i_mode) {
     763             :         case 0:
     764             :                 mode = LUT_BYPASS;
     765             :                 break;
     766             :         case 1:
     767           0 :                 mode = LUT_RAM_A;
     768           0 :                 break;
     769             :         case 2:
     770           0 :                 mode = LUT_RAM_B;
     771           0 :                 break;
     772             :         default:
     773             :                 mode = LUT_BYPASS;
     774             :                 break;
     775             :         }
     776           0 :         if (i_enable_10bits > 0)
     777           0 :                 *is_12bits_color_channel = false;
     778             :         else
     779           0 :                 *is_12bits_color_channel = true;
     780             : 
     781           0 :         REG_GET(MPCC_MCM_3DLUT_MODE[mpcc_id], MPCC_MCM_3DLUT_SIZE, &lut_size);
     782             : 
     783           0 :         if (lut_size == 0)
     784           0 :                 *is_17x17x17 = true;
     785             :         else
     786           0 :                 *is_17x17x17 = false;
     787             : 
     788           0 :         return mode;
     789             : }
     790             : 
     791             : 
     792           0 : static void mpc32_select_3dlut_ram(
     793             :                 struct mpc *mpc,
     794             :                 enum dc_lut_mode mode,
     795             :                 bool is_color_channel_12bits,
     796             :                 uint32_t mpcc_id)
     797             : {
     798           0 :         struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
     799             : 
     800           0 :         REG_UPDATE_2(MPCC_MCM_3DLUT_READ_WRITE_CONTROL[mpcc_id],
     801             :                 MPCC_MCM_3DLUT_RAM_SEL, mode == LUT_RAM_A ? 0 : 1,
     802             :                 MPCC_MCM_3DLUT_30BIT_EN, is_color_channel_12bits == true ? 0:1);
     803           0 : }
     804             : 
     805             : 
     806           0 : static void mpc32_select_3dlut_ram_mask(
     807             :                 struct mpc *mpc,
     808             :                 uint32_t ram_selection_mask,
     809             :                 uint32_t mpcc_id)
     810             : {
     811           0 :         struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
     812             : 
     813           0 :         REG_UPDATE(MPCC_MCM_3DLUT_READ_WRITE_CONTROL[mpcc_id], MPCC_MCM_3DLUT_WRITE_EN_MASK,
     814             :                         ram_selection_mask);
     815           0 :         REG_SET(MPCC_MCM_3DLUT_INDEX[mpcc_id], 0, MPCC_MCM_3DLUT_INDEX, 0);
     816           0 : }
     817             : 
     818             : 
     819           0 : static void mpc32_set3dlut_ram12(
     820             :                 struct mpc *mpc,
     821             :                 const struct dc_rgb *lut,
     822             :                 uint32_t entries,
     823             :                 uint32_t mpcc_id)
     824             : {
     825             :         uint32_t i, red, green, blue, red1, green1, blue1;
     826           0 :         struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
     827             : 
     828           0 :         for (i = 0 ; i < entries; i += 2) {
     829           0 :                 red   = lut[i].red<<4;
     830           0 :                 green = lut[i].green<<4;
     831           0 :                 blue  = lut[i].blue<<4;
     832           0 :                 red1   = lut[i+1].red<<4;
     833           0 :                 green1 = lut[i+1].green<<4;
     834           0 :                 blue1  = lut[i+1].blue<<4;
     835             : 
     836           0 :                 REG_SET_2(MPCC_MCM_3DLUT_DATA[mpcc_id], 0,
     837             :                                 MPCC_MCM_3DLUT_DATA0, red,
     838             :                                 MPCC_MCM_3DLUT_DATA1, red1);
     839             : 
     840           0 :                 REG_SET_2(MPCC_MCM_3DLUT_DATA[mpcc_id], 0,
     841             :                                 MPCC_MCM_3DLUT_DATA0, green,
     842             :                                 MPCC_MCM_3DLUT_DATA1, green1);
     843             : 
     844           0 :                 REG_SET_2(MPCC_MCM_3DLUT_DATA[mpcc_id], 0,
     845             :                                 MPCC_MCM_3DLUT_DATA0, blue,
     846             :                                 MPCC_MCM_3DLUT_DATA1, blue1);
     847             :         }
     848           0 : }
     849             : 
     850             : 
     851           0 : static void mpc32_set3dlut_ram10(
     852             :                 struct mpc *mpc,
     853             :                 const struct dc_rgb *lut,
     854             :                 uint32_t entries,
     855             :                 uint32_t mpcc_id)
     856             : {
     857             :         uint32_t i, red, green, blue, value;
     858           0 :         struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
     859             : 
     860           0 :         for (i = 0; i < entries; i++) {
     861           0 :                 red   = lut[i].red;
     862           0 :                 green = lut[i].green;
     863           0 :                 blue  = lut[i].blue;
     864             :                 //should we shift red 22bit and green 12?
     865           0 :                 value = (red<<20) | (green<<10) | blue;
     866             : 
     867           0 :                 REG_SET(MPCC_MCM_3DLUT_DATA_30BIT[mpcc_id], 0, MPCC_MCM_3DLUT_DATA_30BIT, value);
     868             :         }
     869             : 
     870           0 : }
     871             : 
     872             : 
     873           0 : static void mpc32_set_3dlut_mode(
     874             :                 struct mpc *mpc,
     875             :                 enum dc_lut_mode mode,
     876             :                 bool is_color_channel_12bits,
     877             :                 bool is_lut_size17x17x17,
     878             :                 uint32_t mpcc_id)
     879             : {
     880             :         uint32_t lut_mode;
     881           0 :         struct dcn30_mpc *mpc30 = TO_DCN30_MPC(mpc);
     882             : 
     883             :         // set default 3DLUT to pre-blend
     884             :         // TODO: implement movable CM location
     885           0 :         REG_UPDATE(MPCC_MOVABLE_CM_LOCATION_CONTROL[mpcc_id], MPCC_MOVABLE_CM_LOCATION_CNTL, 0);
     886             : 
     887           0 :         if (mode == LUT_BYPASS)
     888             :                 lut_mode = 0;
     889           0 :         else if (mode == LUT_RAM_A)
     890             :                 lut_mode = 1;
     891             :         else
     892           0 :                 lut_mode = 2;
     893             : 
     894           0 :         REG_UPDATE_2(MPCC_MCM_3DLUT_MODE[mpcc_id],
     895             :                         MPCC_MCM_3DLUT_MODE, lut_mode,
     896             :                         MPCC_MCM_3DLUT_SIZE, is_lut_size17x17x17 == true ? 0 : 1);
     897           0 : }
     898             : 
     899             : 
     900           0 : bool mpc32_program_3dlut(
     901             :                 struct mpc *mpc,
     902             :                 const struct tetrahedral_params *params,
     903             :                 int mpcc_id)
     904             : {
     905             :         enum dc_lut_mode mode;
     906             :         bool is_17x17x17;
     907             :         bool is_12bits_color_channel;
     908             :         const struct dc_rgb *lut0;
     909             :         const struct dc_rgb *lut1;
     910             :         const struct dc_rgb *lut2;
     911             :         const struct dc_rgb *lut3;
     912             :         int lut_size0;
     913             :         int lut_size;
     914             : 
     915           0 :         if (params == NULL) {
     916           0 :                 mpc32_set_3dlut_mode(mpc, LUT_BYPASS, false, false, mpcc_id);
     917           0 :                 return false;
     918             :         }
     919           0 :         mpc32_power_on_shaper_3dlut(mpc, mpcc_id, true);
     920             : 
     921           0 :         mode = get3dlut_config(mpc, &is_17x17x17, &is_12bits_color_channel, mpcc_id);
     922             : 
     923           0 :         if (mode == LUT_BYPASS || mode == LUT_RAM_B)
     924             :                 mode = LUT_RAM_A;
     925             :         else
     926           0 :                 mode = LUT_RAM_B;
     927             : 
     928           0 :         is_17x17x17 = !params->use_tetrahedral_9;
     929           0 :         is_12bits_color_channel = params->use_12bits;
     930           0 :         if (is_17x17x17) {
     931           0 :                 lut0 = params->tetrahedral_17.lut0;
     932           0 :                 lut1 = params->tetrahedral_17.lut1;
     933           0 :                 lut2 = params->tetrahedral_17.lut2;
     934           0 :                 lut3 = params->tetrahedral_17.lut3;
     935           0 :                 lut_size0 = sizeof(params->tetrahedral_17.lut0)/
     936             :                                         sizeof(params->tetrahedral_17.lut0[0]);
     937           0 :                 lut_size  = sizeof(params->tetrahedral_17.lut1)/
     938             :                                         sizeof(params->tetrahedral_17.lut1[0]);
     939             :         } else {
     940           0 :                 lut0 = params->tetrahedral_9.lut0;
     941           0 :                 lut1 = params->tetrahedral_9.lut1;
     942           0 :                 lut2 = params->tetrahedral_9.lut2;
     943           0 :                 lut3 = params->tetrahedral_9.lut3;
     944           0 :                 lut_size0 = sizeof(params->tetrahedral_9.lut0)/
     945             :                                 sizeof(params->tetrahedral_9.lut0[0]);
     946           0 :                 lut_size  = sizeof(params->tetrahedral_9.lut1)/
     947             :                                 sizeof(params->tetrahedral_9.lut1[0]);
     948             :                 }
     949             : 
     950           0 :         mpc32_select_3dlut_ram(mpc, mode,
     951             :                                 is_12bits_color_channel, mpcc_id);
     952           0 :         mpc32_select_3dlut_ram_mask(mpc, 0x1, mpcc_id);
     953           0 :         if (is_12bits_color_channel)
     954           0 :                 mpc32_set3dlut_ram12(mpc, lut0, lut_size0, mpcc_id);
     955             :         else
     956           0 :                 mpc32_set3dlut_ram10(mpc, lut0, lut_size0, mpcc_id);
     957             : 
     958           0 :         mpc32_select_3dlut_ram_mask(mpc, 0x2, mpcc_id);
     959           0 :         if (is_12bits_color_channel)
     960           0 :                 mpc32_set3dlut_ram12(mpc, lut1, lut_size, mpcc_id);
     961             :         else
     962           0 :                 mpc32_set3dlut_ram10(mpc, lut1, lut_size, mpcc_id);
     963             : 
     964           0 :         mpc32_select_3dlut_ram_mask(mpc, 0x4, mpcc_id);
     965           0 :         if (is_12bits_color_channel)
     966           0 :                 mpc32_set3dlut_ram12(mpc, lut2, lut_size, mpcc_id);
     967             :         else
     968           0 :                 mpc32_set3dlut_ram10(mpc, lut2, lut_size, mpcc_id);
     969             : 
     970           0 :         mpc32_select_3dlut_ram_mask(mpc, 0x8, mpcc_id);
     971           0 :         if (is_12bits_color_channel)
     972           0 :                 mpc32_set3dlut_ram12(mpc, lut3, lut_size, mpcc_id);
     973             :         else
     974           0 :                 mpc32_set3dlut_ram10(mpc, lut3, lut_size, mpcc_id);
     975             : 
     976           0 :         mpc32_set_3dlut_mode(mpc, mode, is_12bits_color_channel,
     977             :                                         is_17x17x17, mpcc_id);
     978             : 
     979           0 :         if (mpc->ctx->dc->debug.enable_mem_low_power.bits.mpc)
     980           0 :                 mpc32_power_on_shaper_3dlut(mpc, mpcc_id, false);
     981             : 
     982             :         return true;
     983             : }
     984             : 
     985             : const struct mpc_funcs dcn32_mpc_funcs = {
     986             :         .read_mpcc_state = mpc1_read_mpcc_state,
     987             :         .insert_plane = mpc1_insert_plane,
     988             :         .remove_mpcc = mpc1_remove_mpcc,
     989             :         .mpc_init = mpc32_mpc_init,
     990             :         .mpc_init_single_inst = mpc1_mpc_init_single_inst,
     991             :         .update_blending = mpc2_update_blending,
     992             :         .cursor_lock = mpc1_cursor_lock,
     993             :         .get_mpcc_for_dpp = mpc1_get_mpcc_for_dpp,
     994             :         .wait_for_idle = mpc2_assert_idle_mpcc,
     995             :         .assert_mpcc_idle_before_connect = mpc2_assert_mpcc_idle_before_connect,
     996             :         .init_mpcc_list_from_hw = mpc1_init_mpcc_list_from_hw,
     997             :         .set_denorm =  mpc3_set_denorm,
     998             :         .set_denorm_clamp = mpc3_set_denorm_clamp,
     999             :         .set_output_csc = mpc3_set_output_csc,
    1000             :         .set_ocsc_default = mpc3_set_ocsc_default,
    1001             :         .set_output_gamma = mpc3_set_output_gamma,
    1002             :         .insert_plane_to_secondary = NULL,
    1003             :         .remove_mpcc_from_secondary =  NULL,
    1004             :         .set_dwb_mux = mpc3_set_dwb_mux,
    1005             :         .disable_dwb_mux = mpc3_disable_dwb_mux,
    1006             :         .is_dwb_idle = mpc3_is_dwb_idle,
    1007             :         .set_out_rate_control = mpc3_set_out_rate_control,
    1008             :         .set_gamut_remap = mpc3_set_gamut_remap,
    1009             :         .program_shaper = mpc32_program_shaper,
    1010             :         .program_3dlut = mpc32_program_3dlut,
    1011             :         .program_1dlut = mpc32_program_post1dlut,
    1012             :         .acquire_rmu = NULL,
    1013             :         .release_rmu = NULL,
    1014             :         .power_on_mpc_mem_pwr = mpc3_power_on_ogam_lut,
    1015             :         .get_mpc_out_mux = mpc1_get_mpc_out_mux,
    1016             :         .set_bg_color = mpc1_set_bg_color,
    1017             : };
    1018             : 
    1019             : 
    1020           0 : void dcn32_mpc_construct(struct dcn30_mpc *mpc30,
    1021             :         struct dc_context *ctx,
    1022             :         const struct dcn30_mpc_registers *mpc_regs,
    1023             :         const struct dcn30_mpc_shift *mpc_shift,
    1024             :         const struct dcn30_mpc_mask *mpc_mask,
    1025             :         int num_mpcc,
    1026             :         int num_rmu)
    1027             : {
    1028             :         int i;
    1029             : 
    1030           0 :         mpc30->base.ctx = ctx;
    1031             : 
    1032           0 :         mpc30->base.funcs = &dcn32_mpc_funcs;
    1033             : 
    1034           0 :         mpc30->mpc_regs = mpc_regs;
    1035           0 :         mpc30->mpc_shift = mpc_shift;
    1036           0 :         mpc30->mpc_mask = mpc_mask;
    1037             : 
    1038           0 :         mpc30->mpcc_in_use_mask = 0;
    1039           0 :         mpc30->num_mpcc = num_mpcc;
    1040           0 :         mpc30->num_rmu = num_rmu;
    1041             : 
    1042           0 :         for (i = 0; i < MAX_MPCC; i++)
    1043           0 :                 mpc3_init_mpcc(&mpc30->base.mpcc_array[i], i);
    1044           0 : }

Generated by: LCOV version 1.14