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 "dcn32_mmhubbub.h"
0031
0032
0033 #define REG(reg)\
0034 mcif_wb30->mcif_wb_regs->reg
0035
0036 #define CTX \
0037 mcif_wb30->base.ctx
0038
0039 #undef FN
0040 #define FN(reg_name, field_name) \
0041 mcif_wb30->mcif_wb_shift->field_name, mcif_wb30->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 mmhubbub32_warmup_mcif(struct mcif_wb *mcif_wb,
0077 struct mcif_warmup_params *params)
0078 {
0079 struct dcn30_mmhubbub *mcif_wb30 = TO_DCN30_MMHUBBUB(mcif_wb);
0080 union large_integer start_address_shift = {.quad_part = params->start_address.quad_part >> 5};
0081
0082
0083 REG_SET(MMHUBBUB_WARMUP_BASE_ADDR_HIGH, 0, MMHUBBUB_WARMUP_BASE_ADDR_HIGH, start_address_shift.high_part);
0084 REG_SET(MMHUBBUB_WARMUP_BASE_ADDR_LOW, 0, MMHUBBUB_WARMUP_BASE_ADDR_LOW, start_address_shift.low_part);
0085 REG_SET(MMHUBBUB_WARMUP_ADDR_REGION, 0, MMHUBBUB_WARMUP_ADDR_REGION, params->region_size >> 5);
0086
0087
0088
0089 REG_SET_3(MMHUBBUB_WARMUP_CONTROL_STATUS, 0, MMHUBBUB_WARMUP_EN, true,
0090 MMHUBBUB_WARMUP_SW_INT_EN, true,
0091 MMHUBBUB_WARMUP_INC_ADDR, params->address_increment >> 5);
0092
0093
0094 REG_WAIT(MMHUBBUB_WARMUP_CONTROL_STATUS, MMHUBBUB_WARMUP_SW_INT_STATUS, 1, 20, 100);
0095
0096
0097 REG_UPDATE(MMHUBBUB_WARMUP_CONTROL_STATUS, MMHUBBUB_WARMUP_SW_INT_ACK, 1);
0098
0099
0100 REG_UPDATE(MMHUBBUB_WARMUP_CONTROL_STATUS, MMHUBBUB_WARMUP_EN, false);
0101 }
0102
0103 void mmhubbub32_config_mcif_buf(struct mcif_wb *mcif_wb,
0104 struct mcif_buf_params *params,
0105 unsigned int dest_height)
0106 {
0107 struct dcn30_mmhubbub *mcif_wb30 = TO_DCN30_MMHUBBUB(mcif_wb);
0108
0109
0110 REG_UPDATE(MCIF_WB_BUF_1_ADDR_Y, MCIF_WB_BUF_1_ADDR_Y, MCIF_ADDR(params->luma_address[0]));
0111 REG_UPDATE(MCIF_WB_BUF_1_ADDR_Y_HIGH, MCIF_WB_BUF_1_ADDR_Y_HIGH, MCIF_ADDR_HIGH(params->luma_address[0]));
0112
0113
0114 REG_UPDATE(MCIF_WB_BUF_1_ADDR_C, MCIF_WB_BUF_1_ADDR_C, MCIF_ADDR(params->chroma_address[0]));
0115 REG_UPDATE(MCIF_WB_BUF_1_ADDR_C_HIGH, MCIF_WB_BUF_1_ADDR_C_HIGH, MCIF_ADDR_HIGH(params->chroma_address[0]));
0116
0117
0118 REG_UPDATE(MCIF_WB_BUF_2_ADDR_Y, MCIF_WB_BUF_2_ADDR_Y, MCIF_ADDR(params->luma_address[1]));
0119 REG_UPDATE(MCIF_WB_BUF_2_ADDR_Y_HIGH, MCIF_WB_BUF_2_ADDR_Y_HIGH, MCIF_ADDR_HIGH(params->luma_address[1]));
0120
0121
0122 REG_UPDATE(MCIF_WB_BUF_2_ADDR_C, MCIF_WB_BUF_2_ADDR_C, MCIF_ADDR(params->chroma_address[1]));
0123 REG_UPDATE(MCIF_WB_BUF_2_ADDR_C_HIGH, MCIF_WB_BUF_2_ADDR_C_HIGH, MCIF_ADDR_HIGH(params->chroma_address[1]));
0124
0125
0126 REG_UPDATE(MCIF_WB_BUF_3_ADDR_Y, MCIF_WB_BUF_3_ADDR_Y, MCIF_ADDR(params->luma_address[2]));
0127 REG_UPDATE(MCIF_WB_BUF_3_ADDR_Y_HIGH, MCIF_WB_BUF_3_ADDR_Y_HIGH, MCIF_ADDR_HIGH(params->luma_address[2]));
0128
0129
0130 REG_UPDATE(MCIF_WB_BUF_3_ADDR_C, MCIF_WB_BUF_3_ADDR_C, MCIF_ADDR(params->chroma_address[2]));
0131 REG_UPDATE(MCIF_WB_BUF_3_ADDR_C_HIGH, MCIF_WB_BUF_3_ADDR_C_HIGH, MCIF_ADDR_HIGH(params->chroma_address[2]));
0132
0133
0134 REG_UPDATE(MCIF_WB_BUF_4_ADDR_Y, MCIF_WB_BUF_4_ADDR_Y, MCIF_ADDR(params->luma_address[3]));
0135 REG_UPDATE(MCIF_WB_BUF_4_ADDR_Y_HIGH, MCIF_WB_BUF_4_ADDR_Y_HIGH, MCIF_ADDR_HIGH(params->luma_address[3]));
0136
0137
0138 REG_UPDATE(MCIF_WB_BUF_4_ADDR_C, MCIF_WB_BUF_4_ADDR_C, MCIF_ADDR(params->chroma_address[3]));
0139 REG_UPDATE(MCIF_WB_BUF_4_ADDR_C_HIGH, MCIF_WB_BUF_4_ADDR_C_HIGH, MCIF_ADDR_HIGH(params->chroma_address[3]));
0140
0141
0142
0143
0144
0145 REG_UPDATE(MCIF_WB_BUF_LUMA_SIZE, MCIF_WB_BUF_LUMA_SIZE, (params->luma_pitch>>8) * dest_height);
0146 REG_UPDATE(MCIF_WB_BUF_CHROMA_SIZE, MCIF_WB_BUF_CHROMA_SIZE, (params->chroma_pitch>>8) * dest_height);
0147
0148
0149 REG_UPDATE(MCIF_WB_BUFMGR_SW_CONTROL, MCIF_WB_BUF_ADDR_FENCE_EN, 1);
0150
0151
0152 REG_UPDATE_2(MCIF_WB_BUF_PITCH, MCIF_WB_BUF_LUMA_PITCH, params->luma_pitch >> 8,
0153 MCIF_WB_BUF_CHROMA_PITCH, params->chroma_pitch >> 8);
0154 }
0155
0156 static void mmhubbub32_config_mcif_arb(struct mcif_wb *mcif_wb,
0157 struct mcif_arb_params *params)
0158 {
0159 struct dcn30_mmhubbub *mcif_wb30 = TO_DCN30_MMHUBBUB(mcif_wb);
0160
0161
0162 REG_UPDATE(MCIF_WB_ARBITRATION_CONTROL, MCIF_WB_TIME_PER_PIXEL, params->time_per_pixel);
0163
0164
0165
0166
0167 REG_UPDATE(MCIF_WB_WATERMARK, MCIF_WB_CLI_WATERMARK_MASK, 0x0);
0168
0169 REG_UPDATE(MCIF_WB_WATERMARK, MCIF_WB_CLI_WATERMARK, params->cli_watermark[0]);
0170 REG_UPDATE(MCIF_WB_WATERMARK, MCIF_WB_CLI_WATERMARK_MASK, 0x1);
0171
0172 REG_UPDATE(MCIF_WB_WATERMARK, MCIF_WB_CLI_WATERMARK, params->cli_watermark[1]);
0173 REG_UPDATE(MCIF_WB_WATERMARK, MCIF_WB_CLI_WATERMARK_MASK, 0x2);
0174
0175 REG_UPDATE(MCIF_WB_WATERMARK, MCIF_WB_CLI_WATERMARK, params->cli_watermark[2]);
0176 REG_UPDATE(MCIF_WB_WATERMARK, MCIF_WB_CLI_WATERMARK_MASK, 0x3);
0177
0178 REG_UPDATE(MCIF_WB_WATERMARK, MCIF_WB_CLI_WATERMARK, params->cli_watermark[3]);
0179
0180
0181
0182 REG_UPDATE(MCIF_WB_NB_PSTATE_LATENCY_WATERMARK, NB_PSTATE_CHANGE_WATERMARK_MASK, 0x0);
0183 REG_UPDATE(MCIF_WB_NB_PSTATE_LATENCY_WATERMARK,
0184 NB_PSTATE_CHANGE_REFRESH_WATERMARK, params->pstate_watermark[0]);
0185
0186 REG_UPDATE(MCIF_WB_NB_PSTATE_LATENCY_WATERMARK, NB_PSTATE_CHANGE_WATERMARK_MASK, 0x1);
0187 REG_UPDATE(MCIF_WB_NB_PSTATE_LATENCY_WATERMARK,
0188 NB_PSTATE_CHANGE_REFRESH_WATERMARK, params->pstate_watermark[1]);
0189
0190 REG_UPDATE(MCIF_WB_NB_PSTATE_LATENCY_WATERMARK, NB_PSTATE_CHANGE_WATERMARK_MASK, 0x2);
0191 REG_UPDATE(MCIF_WB_NB_PSTATE_LATENCY_WATERMARK,
0192 NB_PSTATE_CHANGE_REFRESH_WATERMARK, params->pstate_watermark[2]);
0193
0194 REG_UPDATE(MCIF_WB_NB_PSTATE_LATENCY_WATERMARK, NB_PSTATE_CHANGE_WATERMARK_MASK, 0x3);
0195 REG_UPDATE(MCIF_WB_NB_PSTATE_LATENCY_WATERMARK,
0196 NB_PSTATE_CHANGE_REFRESH_WATERMARK, params->pstate_watermark[3]);
0197
0198
0199
0200
0201
0202
0203 REG_UPDATE(MULTI_LEVEL_QOS_CTRL, MAX_SCALED_TIME_TO_URGENT, params->max_scaled_time);
0204
0205
0206 REG_UPDATE(MCIF_WB_BUFMGR_VCE_CONTROL, MCIF_WB_BUFMGR_SLICE_SIZE, params->slice_lines-1);
0207
0208
0209
0210
0211 REG_UPDATE(MCIF_WB_ARBITRATION_CONTROL, MCIF_WB_CLIENT_ARBITRATION_SLICE, params->arbitration_slice);
0212 }
0213
0214 const struct mcif_wb_funcs dcn32_mmhubbub_funcs = {
0215 .warmup_mcif = mmhubbub32_warmup_mcif,
0216 .enable_mcif = mmhubbub2_enable_mcif,
0217 .disable_mcif = mmhubbub2_disable_mcif,
0218 .config_mcif_buf = mmhubbub32_config_mcif_buf,
0219 .config_mcif_arb = mmhubbub32_config_mcif_arb,
0220 .config_mcif_irq = mmhubbub2_config_mcif_irq,
0221 .dump_frame = mcifwb2_dump_frame,
0222 };
0223
0224 void dcn32_mmhubbub_construct(struct dcn30_mmhubbub *mcif_wb30,
0225 struct dc_context *ctx,
0226 const struct dcn30_mmhubbub_registers *mcif_wb_regs,
0227 const struct dcn30_mmhubbub_shift *mcif_wb_shift,
0228 const struct dcn30_mmhubbub_mask *mcif_wb_mask,
0229 int inst)
0230 {
0231 mcif_wb30->base.ctx = ctx;
0232
0233 mcif_wb30->base.inst = inst;
0234 mcif_wb30->base.funcs = &dcn32_mmhubbub_funcs;
0235
0236 mcif_wb30->mcif_wb_regs = mcif_wb_regs;
0237 mcif_wb30->mcif_wb_shift = mcif_wb_shift;
0238 mcif_wb30->mcif_wb_mask = mcif_wb_mask;
0239 }