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 "dc_bios_types.h"
0028 #include "dcn30_vpg.h"
0029 #include "reg_helper.h"
0030
0031 #define DC_LOGGER \
0032 vpg3->base.ctx->logger
0033
0034 #define REG(reg)\
0035 (vpg3->regs->reg)
0036
0037 #undef FN
0038 #define FN(reg_name, field_name) \
0039 vpg3->vpg_shift->field_name, vpg3->vpg_mask->field_name
0040
0041
0042 #define CTX \
0043 vpg3->base.ctx
0044
0045
0046 void vpg3_update_generic_info_packet(
0047 struct vpg *vpg,
0048 uint32_t packet_index,
0049 const struct dc_info_packet *info_packet,
0050 bool immediate_update)
0051 {
0052 struct dcn30_vpg *vpg3 = DCN30_VPG_FROM_VPG(vpg);
0053 uint32_t i;
0054
0055
0056
0057
0058 uint32_t max_retries = 50;
0059
0060 if (packet_index > 14)
0061 ASSERT(0);
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072 REG_WAIT(VPG_GENERIC_STATUS, VPG_GENERIC_CONFLICT_OCCURED,
0073 0, 10, max_retries);
0074
0075
0076
0077
0078
0079 REG_UPDATE(VPG_GENERIC_STATUS, VPG_GENERIC_CONFLICT_CLR, 1);
0080
0081
0082 REG_UPDATE(VPG_GENERIC_PACKET_ACCESS_CTRL,
0083 VPG_GENERIC_DATA_INDEX, packet_index*9);
0084
0085
0086
0087
0088 REG_SET_4(VPG_GENERIC_PACKET_DATA, 0,
0089 VPG_GENERIC_DATA_BYTE0, info_packet->hb0,
0090 VPG_GENERIC_DATA_BYTE1, info_packet->hb1,
0091 VPG_GENERIC_DATA_BYTE2, info_packet->hb2,
0092 VPG_GENERIC_DATA_BYTE3, info_packet->hb3);
0093
0094
0095
0096
0097
0098 {
0099 const uint32_t *content =
0100 (const uint32_t *) &info_packet->sb[0];
0101
0102 for (i = 0; i < 8; i++) {
0103 REG_WRITE(VPG_GENERIC_PACKET_DATA, *content++);
0104 }
0105 }
0106
0107
0108
0109
0110 if (immediate_update) {
0111 switch (packet_index) {
0112 case 0:
0113 REG_UPDATE(VPG_GSP_IMMEDIATE_UPDATE_CTRL,
0114 VPG_GENERIC0_IMMEDIATE_UPDATE, 1);
0115 break;
0116 case 1:
0117 REG_UPDATE(VPG_GSP_IMMEDIATE_UPDATE_CTRL,
0118 VPG_GENERIC1_IMMEDIATE_UPDATE, 1);
0119 break;
0120 case 2:
0121 REG_UPDATE(VPG_GSP_IMMEDIATE_UPDATE_CTRL,
0122 VPG_GENERIC2_IMMEDIATE_UPDATE, 1);
0123 break;
0124 case 3:
0125 REG_UPDATE(VPG_GSP_IMMEDIATE_UPDATE_CTRL,
0126 VPG_GENERIC3_IMMEDIATE_UPDATE, 1);
0127 break;
0128 case 4:
0129 REG_UPDATE(VPG_GSP_IMMEDIATE_UPDATE_CTRL,
0130 VPG_GENERIC4_IMMEDIATE_UPDATE, 1);
0131 break;
0132 case 5:
0133 REG_UPDATE(VPG_GSP_IMMEDIATE_UPDATE_CTRL,
0134 VPG_GENERIC5_IMMEDIATE_UPDATE, 1);
0135 break;
0136 case 6:
0137 REG_UPDATE(VPG_GSP_IMMEDIATE_UPDATE_CTRL,
0138 VPG_GENERIC6_IMMEDIATE_UPDATE, 1);
0139 break;
0140 case 7:
0141 REG_UPDATE(VPG_GSP_IMMEDIATE_UPDATE_CTRL,
0142 VPG_GENERIC7_IMMEDIATE_UPDATE, 1);
0143 break;
0144 case 8:
0145 REG_UPDATE(VPG_GSP_IMMEDIATE_UPDATE_CTRL,
0146 VPG_GENERIC8_IMMEDIATE_UPDATE, 1);
0147 break;
0148 case 9:
0149 REG_UPDATE(VPG_GSP_IMMEDIATE_UPDATE_CTRL,
0150 VPG_GENERIC9_IMMEDIATE_UPDATE, 1);
0151 break;
0152 case 10:
0153 REG_UPDATE(VPG_GSP_IMMEDIATE_UPDATE_CTRL,
0154 VPG_GENERIC10_IMMEDIATE_UPDATE, 1);
0155 break;
0156 case 11:
0157 REG_UPDATE(VPG_GSP_IMMEDIATE_UPDATE_CTRL,
0158 VPG_GENERIC11_IMMEDIATE_UPDATE, 1);
0159 break;
0160 case 12:
0161 REG_UPDATE(VPG_GSP_IMMEDIATE_UPDATE_CTRL,
0162 VPG_GENERIC12_IMMEDIATE_UPDATE, 1);
0163 break;
0164 case 13:
0165 REG_UPDATE(VPG_GSP_IMMEDIATE_UPDATE_CTRL,
0166 VPG_GENERIC13_IMMEDIATE_UPDATE, 1);
0167 break;
0168 case 14:
0169 REG_UPDATE(VPG_GSP_IMMEDIATE_UPDATE_CTRL,
0170 VPG_GENERIC14_IMMEDIATE_UPDATE, 1);
0171 break;
0172 default:
0173 break;
0174 }
0175 } else {
0176 switch (packet_index) {
0177 case 0:
0178 REG_UPDATE(VPG_GSP_FRAME_UPDATE_CTRL,
0179 VPG_GENERIC0_FRAME_UPDATE, 1);
0180 break;
0181 case 1:
0182 REG_UPDATE(VPG_GSP_FRAME_UPDATE_CTRL,
0183 VPG_GENERIC1_FRAME_UPDATE, 1);
0184 break;
0185 case 2:
0186 REG_UPDATE(VPG_GSP_FRAME_UPDATE_CTRL,
0187 VPG_GENERIC2_FRAME_UPDATE, 1);
0188 break;
0189 case 3:
0190 REG_UPDATE(VPG_GSP_FRAME_UPDATE_CTRL,
0191 VPG_GENERIC3_FRAME_UPDATE, 1);
0192 break;
0193 case 4:
0194 REG_UPDATE(VPG_GSP_FRAME_UPDATE_CTRL,
0195 VPG_GENERIC4_FRAME_UPDATE, 1);
0196 break;
0197 case 5:
0198 REG_UPDATE(VPG_GSP_FRAME_UPDATE_CTRL,
0199 VPG_GENERIC5_FRAME_UPDATE, 1);
0200 break;
0201 case 6:
0202 REG_UPDATE(VPG_GSP_FRAME_UPDATE_CTRL,
0203 VPG_GENERIC6_FRAME_UPDATE, 1);
0204 break;
0205 case 7:
0206 REG_UPDATE(VPG_GSP_FRAME_UPDATE_CTRL,
0207 VPG_GENERIC7_FRAME_UPDATE, 1);
0208 break;
0209 case 8:
0210 REG_UPDATE(VPG_GSP_FRAME_UPDATE_CTRL,
0211 VPG_GENERIC8_FRAME_UPDATE, 1);
0212 break;
0213 case 9:
0214 REG_UPDATE(VPG_GSP_FRAME_UPDATE_CTRL,
0215 VPG_GENERIC9_FRAME_UPDATE, 1);
0216 break;
0217 case 10:
0218 REG_UPDATE(VPG_GSP_FRAME_UPDATE_CTRL,
0219 VPG_GENERIC10_FRAME_UPDATE, 1);
0220 break;
0221 case 11:
0222 REG_UPDATE(VPG_GSP_FRAME_UPDATE_CTRL,
0223 VPG_GENERIC11_FRAME_UPDATE, 1);
0224 break;
0225 case 12:
0226 REG_UPDATE(VPG_GSP_FRAME_UPDATE_CTRL,
0227 VPG_GENERIC12_FRAME_UPDATE, 1);
0228 break;
0229 case 13:
0230 REG_UPDATE(VPG_GSP_FRAME_UPDATE_CTRL,
0231 VPG_GENERIC13_FRAME_UPDATE, 1);
0232 break;
0233 case 14:
0234 REG_UPDATE(VPG_GSP_FRAME_UPDATE_CTRL,
0235 VPG_GENERIC14_FRAME_UPDATE, 1);
0236 break;
0237
0238 default:
0239 break;
0240 }
0241
0242 }
0243 }
0244
0245 static struct vpg_funcs dcn30_vpg_funcs = {
0246 .update_generic_info_packet = vpg3_update_generic_info_packet,
0247 };
0248
0249 void vpg3_construct(struct dcn30_vpg *vpg3,
0250 struct dc_context *ctx,
0251 uint32_t inst,
0252 const struct dcn30_vpg_registers *vpg_regs,
0253 const struct dcn30_vpg_shift *vpg_shift,
0254 const struct dcn30_vpg_mask *vpg_mask)
0255 {
0256 vpg3->base.ctx = ctx;
0257
0258 vpg3->base.inst = inst;
0259 vpg3->base.funcs = &dcn30_vpg_funcs;
0260
0261 vpg3->regs = vpg_regs;
0262 vpg3->vpg_shift = vpg_shift;
0263 vpg3->vpg_mask = vpg_mask;
0264 }