0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027 #include "reg_helper.h"
0028 #include "resource.h"
0029 #include "mcif_wb.h"
0030 #include "dcn20_mmhubbub.h"
0031
0032
0033 #define REG(reg)\
0034 mcif_wb20->mcif_wb_regs->reg
0035
0036 #define CTX \
0037 mcif_wb20->base.ctx
0038
0039 #undef FN
0040 #define FN(reg_name, field_name) \
0041 mcif_wb20->mcif_wb_shift->field_name, mcif_wb20->mcif_wb_mask->field_name
0042
0043 #define MCIF_ADDR(addr) (((unsigned long long)addr & 0xffffffffff) + 0xFE) >> 8
0044 #define MCIF_ADDR_HIGH(addr) (unsigned long long)addr >> 40
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076 static void mmhubbub2_config_mcif_buf(struct mcif_wb *mcif_wb,
0077 struct mcif_buf_params *params,
0078 unsigned int dest_height)
0079 {
0080 struct dcn20_mmhubbub *mcif_wb20 = TO_DCN20_MMHUBBUB(mcif_wb);
0081
0082
0083 REG_UPDATE(MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_BUFMGR_SW_LOCK, params->swlock);
0084
0085
0086 REG_UPDATE(MCIF_WB_BUF_1_ADDR_Y, MCIF_WB_BUF_1_ADDR_Y, MCIF_ADDR(params->luma_address[0]));
0087 REG_UPDATE(MCIF_WB_BUF_1_ADDR_Y_HIGH, MCIF_WB_BUF_1_ADDR_Y_HIGH, MCIF_ADDR_HIGH(params->luma_address[0]));
0088
0089 REG_UPDATE(MCIF_WB_BUF_1_ADDR_Y_OFFSET, MCIF_WB_BUF_1_ADDR_Y_OFFSET, 0);
0090
0091
0092 REG_UPDATE(MCIF_WB_BUF_1_ADDR_C, MCIF_WB_BUF_1_ADDR_C, MCIF_ADDR(params->chroma_address[0]));
0093 REG_UPDATE(MCIF_WB_BUF_1_ADDR_C_HIGH, MCIF_WB_BUF_1_ADDR_C_HIGH, MCIF_ADDR_HIGH(params->chroma_address[0]));
0094
0095 REG_UPDATE(MCIF_WB_BUF_1_ADDR_C_OFFSET, MCIF_WB_BUF_1_ADDR_C_OFFSET, 0);
0096
0097
0098 REG_UPDATE(MCIF_WB_BUF_2_ADDR_Y, MCIF_WB_BUF_2_ADDR_Y, MCIF_ADDR(params->luma_address[1]));
0099 REG_UPDATE(MCIF_WB_BUF_2_ADDR_Y_HIGH, MCIF_WB_BUF_2_ADDR_Y_HIGH, MCIF_ADDR_HIGH(params->luma_address[1]));
0100
0101 REG_UPDATE(MCIF_WB_BUF_2_ADDR_Y_OFFSET, MCIF_WB_BUF_2_ADDR_Y_OFFSET, 0);
0102
0103
0104 REG_UPDATE(MCIF_WB_BUF_2_ADDR_C, MCIF_WB_BUF_2_ADDR_C, MCIF_ADDR(params->chroma_address[1]));
0105 REG_UPDATE(MCIF_WB_BUF_2_ADDR_C_HIGH, MCIF_WB_BUF_2_ADDR_C_HIGH, MCIF_ADDR_HIGH(params->chroma_address[1]));
0106
0107 REG_UPDATE(MCIF_WB_BUF_2_ADDR_C_OFFSET, MCIF_WB_BUF_2_ADDR_C_OFFSET, 0);
0108
0109
0110 REG_UPDATE(MCIF_WB_BUF_3_ADDR_Y, MCIF_WB_BUF_3_ADDR_Y, MCIF_ADDR(params->luma_address[2]));
0111 REG_UPDATE(MCIF_WB_BUF_3_ADDR_Y_HIGH, MCIF_WB_BUF_3_ADDR_Y_HIGH, MCIF_ADDR_HIGH(params->luma_address[2]));
0112
0113 REG_UPDATE(MCIF_WB_BUF_3_ADDR_Y_OFFSET, MCIF_WB_BUF_3_ADDR_Y_OFFSET, 0);
0114
0115
0116 REG_UPDATE(MCIF_WB_BUF_3_ADDR_C, MCIF_WB_BUF_3_ADDR_C, MCIF_ADDR(params->chroma_address[2]));
0117 REG_UPDATE(MCIF_WB_BUF_3_ADDR_C_HIGH, MCIF_WB_BUF_3_ADDR_C_HIGH, MCIF_ADDR_HIGH(params->chroma_address[2]));
0118
0119 REG_UPDATE(MCIF_WB_BUF_3_ADDR_C_OFFSET, MCIF_WB_BUF_3_ADDR_C_OFFSET, 0);
0120
0121
0122 REG_UPDATE(MCIF_WB_BUF_4_ADDR_Y, MCIF_WB_BUF_4_ADDR_Y, MCIF_ADDR(params->luma_address[3]));
0123 REG_UPDATE(MCIF_WB_BUF_4_ADDR_Y_HIGH, MCIF_WB_BUF_4_ADDR_Y_HIGH, MCIF_ADDR_HIGH(params->luma_address[3]));
0124
0125 REG_UPDATE(MCIF_WB_BUF_4_ADDR_Y_OFFSET, MCIF_WB_BUF_4_ADDR_Y_OFFSET, 0);
0126
0127
0128 REG_UPDATE(MCIF_WB_BUF_4_ADDR_C, MCIF_WB_BUF_4_ADDR_C, MCIF_ADDR(params->chroma_address[3]));
0129 REG_UPDATE(MCIF_WB_BUF_4_ADDR_C_HIGH, MCIF_WB_BUF_4_ADDR_C_HIGH, MCIF_ADDR_HIGH(params->chroma_address[3]));
0130
0131 REG_UPDATE(MCIF_WB_BUF_4_ADDR_C_OFFSET, MCIF_WB_BUF_4_ADDR_C_OFFSET, 0);
0132
0133
0134
0135
0136
0137 REG_UPDATE(MCIF_WB_BUF_LUMA_SIZE, MCIF_WB_BUF_LUMA_SIZE, (params->luma_pitch>>8) * dest_height);
0138 REG_UPDATE(MCIF_WB_BUF_CHROMA_SIZE, MCIF_WB_BUF_CHROMA_SIZE, (params->chroma_pitch>>8) * dest_height);
0139
0140
0141 REG_UPDATE(MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_BUF_ADDR_FENCE_EN, 1);
0142
0143
0144 REG_UPDATE_2(MCIF_WB_BUF_PITCH, MCIF_WB_BUF_LUMA_PITCH, params->luma_pitch >> 8,
0145 MCIF_WB_BUF_CHROMA_PITCH, params->chroma_pitch >> 8);
0146
0147
0148
0149
0150 REG_UPDATE(MCIF_WB_WARM_UP_CNTL, MCIF_WB_PITCH_SIZE_WARMUP, params->warmup_pitch);
0151 }
0152
0153 static void mmhubbub2_config_mcif_arb(struct mcif_wb *mcif_wb,
0154 struct mcif_arb_params *params)
0155 {
0156 struct dcn20_mmhubbub *mcif_wb20 = TO_DCN20_MMHUBBUB(mcif_wb);
0157
0158
0159 REG_UPDATE(MCIF_WB_ARBITRATION_CONTROL, MCIF_WB_TIME_PER_PIXEL, params->time_per_pixel);
0160
0161
0162
0163
0164 REG_UPDATE(MCIF_WB_SCLK_CHANGE, MCIF_WB_CLI_WATERMARK_MASK, 0x0);
0165
0166 REG_UPDATE(MCIF_WB_WATERMARK, MCIF_WB_CLI_WATERMARK, params->cli_watermark[0]);
0167 REG_UPDATE(MCIF_WB_SCLK_CHANGE, MCIF_WB_CLI_WATERMARK_MASK, 0x1);
0168
0169 REG_UPDATE(MCIF_WB_WATERMARK, MCIF_WB_CLI_WATERMARK, params->cli_watermark[1]);
0170 REG_UPDATE(MCIF_WB_SCLK_CHANGE, MCIF_WB_CLI_WATERMARK_MASK, 0x2);
0171
0172 REG_UPDATE(MCIF_WB_WATERMARK, MCIF_WB_CLI_WATERMARK, params->cli_watermark[2]);
0173 REG_UPDATE(MCIF_WB_SCLK_CHANGE, MCIF_WB_CLI_WATERMARK_MASK, 0x3);
0174
0175 REG_UPDATE(MCIF_WB_WATERMARK, MCIF_WB_CLI_WATERMARK, params->cli_watermark[3]);
0176
0177
0178
0179 REG_UPDATE(MCIF_WB_NB_PSTATE_CONTROL, NB_PSTATE_CHANGE_WATERMARK_MASK, 0x0);
0180 REG_UPDATE(MCIF_WB_NB_PSTATE_LATENCY_WATERMARK,
0181 NB_PSTATE_CHANGE_REFRESH_WATERMARK, params->pstate_watermark[0]);
0182
0183 REG_UPDATE(MCIF_WB_NB_PSTATE_CONTROL, NB_PSTATE_CHANGE_WATERMARK_MASK, 0x1);
0184 REG_UPDATE(MCIF_WB_NB_PSTATE_LATENCY_WATERMARK,
0185 NB_PSTATE_CHANGE_REFRESH_WATERMARK, params->pstate_watermark[1]);
0186
0187 REG_UPDATE(MCIF_WB_NB_PSTATE_CONTROL, NB_PSTATE_CHANGE_WATERMARK_MASK, 0x2);
0188 REG_UPDATE(MCIF_WB_NB_PSTATE_LATENCY_WATERMARK,
0189 NB_PSTATE_CHANGE_REFRESH_WATERMARK, params->pstate_watermark[2]);
0190
0191 REG_UPDATE(MCIF_WB_NB_PSTATE_CONTROL, NB_PSTATE_CHANGE_WATERMARK_MASK, 0x3);
0192 REG_UPDATE(MCIF_WB_NB_PSTATE_LATENCY_WATERMARK,
0193 NB_PSTATE_CHANGE_REFRESH_WATERMARK, params->pstate_watermark[3]);
0194
0195
0196 REG_UPDATE(MULTI_LEVEL_QOS_CTRL, MAX_SCALED_TIME_TO_URGENT, params->max_scaled_time);
0197
0198
0199 REG_UPDATE(MCIF_WB_BUFMGR_VCE_CONTROL, MCIF_WB_BUFMGR_SLICE_SIZE, params->slice_lines-1);
0200
0201
0202
0203
0204 REG_UPDATE(MCIF_WB_ARBITRATION_CONTROL, MCIF_WB_CLIENT_ARBITRATION_SLICE, params->arbitration_slice);
0205 }
0206
0207 void mmhubbub2_config_mcif_irq(struct mcif_wb *mcif_wb,
0208 struct mcif_irq_params *params)
0209 {
0210 struct dcn20_mmhubbub *mcif_wb20 = TO_DCN20_MMHUBBUB(mcif_wb);
0211
0212
0213 REG_UPDATE(MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_BUFMGR_SW_INT_EN, params->sw_int_en);
0214 REG_UPDATE(MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_BUFMGR_SW_SLICE_INT_EN, params->sw_slice_int_en);
0215 REG_UPDATE(MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_BUFMGR_SW_OVERRUN_INT_EN, params->sw_overrun_int_en);
0216
0217 REG_UPDATE(MCIF_WB_BUFMGR_VCE_CONTROL, MCIF_WB_BUFMGR_VCE_INT_EN, params->vce_int_en);
0218 REG_UPDATE(MCIF_WB_BUFMGR_VCE_CONTROL, MCIF_WB_BUFMGR_VCE_SLICE_INT_EN, params->vce_slice_int_en);
0219 }
0220
0221 void mmhubbub2_enable_mcif(struct mcif_wb *mcif_wb)
0222 {
0223 struct dcn20_mmhubbub *mcif_wb20 = TO_DCN20_MMHUBBUB(mcif_wb);
0224
0225
0226 REG_UPDATE(MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_BUFMGR_ENABLE, 1);
0227 }
0228
0229 void mmhubbub2_disable_mcif(struct mcif_wb *mcif_wb)
0230 {
0231 struct dcn20_mmhubbub *mcif_wb20 = TO_DCN20_MMHUBBUB(mcif_wb);
0232
0233
0234 REG_UPDATE(MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_BUFMGR_ENABLE, 0);
0235 }
0236
0237
0238
0239
0240
0241
0242
0243
0244
0245
0246
0247
0248
0249
0250
0251
0252
0253
0254
0255
0256
0257
0258
0259
0260
0261
0262
0263
0264
0265
0266
0267
0268
0269
0270
0271 void mcifwb2_dump_frame(struct mcif_wb *mcif_wb,
0272 struct mcif_buf_params *mcif_params,
0273 enum dwb_scaler_mode out_format,
0274 unsigned int dest_width,
0275 unsigned int dest_height,
0276 struct mcif_wb_frame_dump_info *dump_info,
0277 unsigned char *luma_buffer,
0278 unsigned char *chroma_buffer,
0279 unsigned char *dest_luma_buffer,
0280 unsigned char *dest_chroma_buffer)
0281 {
0282 struct dcn20_mmhubbub *mcif_wb20 = TO_DCN20_MMHUBBUB(mcif_wb);
0283
0284 REG_UPDATE(MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_BUFMGR_SW_LOCK, 0xf);
0285
0286 memcpy(dest_luma_buffer, luma_buffer, mcif_params->luma_pitch * dest_height);
0287 memcpy(dest_chroma_buffer, chroma_buffer, mcif_params->chroma_pitch * dest_height / 2);
0288
0289 REG_UPDATE(MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_BUFMGR_SW_LOCK, 0x0);
0290
0291 dump_info->format = out_format;
0292 dump_info->width = dest_width;
0293 dump_info->height = dest_height;
0294 dump_info->luma_pitch = mcif_params->luma_pitch;
0295 dump_info->chroma_pitch = mcif_params->chroma_pitch;
0296 dump_info->size = dest_height * (mcif_params->luma_pitch + mcif_params->chroma_pitch);
0297 }
0298
0299 const struct mcif_wb_funcs dcn20_mmhubbub_funcs = {
0300 .enable_mcif = mmhubbub2_enable_mcif,
0301 .disable_mcif = mmhubbub2_disable_mcif,
0302 .config_mcif_buf = mmhubbub2_config_mcif_buf,
0303 .config_mcif_arb = mmhubbub2_config_mcif_arb,
0304 .config_mcif_irq = mmhubbub2_config_mcif_irq,
0305 .dump_frame = mcifwb2_dump_frame,
0306 };
0307
0308 void dcn20_mmhubbub_construct(struct dcn20_mmhubbub *mcif_wb20,
0309 struct dc_context *ctx,
0310 const struct dcn20_mmhubbub_registers *mcif_wb_regs,
0311 const struct dcn20_mmhubbub_shift *mcif_wb_shift,
0312 const struct dcn20_mmhubbub_mask *mcif_wb_mask,
0313 int inst)
0314 {
0315 mcif_wb20->base.ctx = ctx;
0316
0317 mcif_wb20->base.inst = inst;
0318 mcif_wb20->base.funcs = &dcn20_mmhubbub_funcs;
0319
0320 mcif_wb20->mcif_wb_regs = mcif_wb_regs;
0321 mcif_wb20->mcif_wb_shift = mcif_wb_shift;
0322 mcif_wb20->mcif_wb_mask = mcif_wb_mask;
0323 }