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
0028
0029 #include "hw_translate_dcn21.h"
0030
0031 #include "dm_services.h"
0032 #include "include/gpio_types.h"
0033 #include "../hw_translate.h"
0034
0035 #include "dcn/dcn_2_1_0_offset.h"
0036 #include "dcn/dcn_2_1_0_sh_mask.h"
0037 #include "renoir_ip_offset.h"
0038
0039
0040
0041
0042
0043
0044
0045
0046 #define block HPD
0047 #define reg_num 0
0048
0049 #undef BASE_INNER
0050 #define BASE_INNER(seg) DMU_BASE__INST0_SEG ## seg
0051
0052 #define BASE(seg) BASE_INNER(seg)
0053
0054 #undef REG
0055 #define REG(reg_name)\
0056 BASE(mm ## reg_name ## _BASE_IDX) + mm ## reg_name
0057 #define SF_HPD(reg_name, field_name, post_fix)\
0058 .field_name = reg_name ## __ ## field_name ## post_fix
0059
0060
0061
0062
0063
0064 static bool offset_to_id(
0065 uint32_t offset,
0066 uint32_t mask,
0067 enum gpio_id *id,
0068 uint32_t *en)
0069 {
0070 switch (offset) {
0071
0072 case REG(DC_GPIO_GENERIC_A):
0073 *id = GPIO_ID_GENERIC;
0074 switch (mask) {
0075 case DC_GPIO_GENERIC_A__DC_GPIO_GENERICA_A_MASK:
0076 *en = GPIO_GENERIC_A;
0077 return true;
0078 case DC_GPIO_GENERIC_A__DC_GPIO_GENERICB_A_MASK:
0079 *en = GPIO_GENERIC_B;
0080 return true;
0081 case DC_GPIO_GENERIC_A__DC_GPIO_GENERICC_A_MASK:
0082 *en = GPIO_GENERIC_C;
0083 return true;
0084 case DC_GPIO_GENERIC_A__DC_GPIO_GENERICD_A_MASK:
0085 *en = GPIO_GENERIC_D;
0086 return true;
0087 case DC_GPIO_GENERIC_A__DC_GPIO_GENERICE_A_MASK:
0088 *en = GPIO_GENERIC_E;
0089 return true;
0090 case DC_GPIO_GENERIC_A__DC_GPIO_GENERICF_A_MASK:
0091 *en = GPIO_GENERIC_F;
0092 return true;
0093 case DC_GPIO_GENERIC_A__DC_GPIO_GENERICG_A_MASK:
0094 *en = GPIO_GENERIC_G;
0095 return true;
0096 default:
0097 ASSERT_CRITICAL(false);
0098 #ifdef PALLADIUM_SUPPORTED
0099 *en = GPIO_DDC_LINE_DDC1;
0100 return true;
0101 #endif
0102 return false;
0103 }
0104 break;
0105
0106 case REG(DC_GPIO_HPD_A):
0107 *id = GPIO_ID_HPD;
0108 switch (mask) {
0109 case DC_GPIO_HPD_A__DC_GPIO_HPD1_A_MASK:
0110 *en = GPIO_HPD_1;
0111 return true;
0112 case DC_GPIO_HPD_A__DC_GPIO_HPD2_A_MASK:
0113 *en = GPIO_HPD_2;
0114 return true;
0115 case DC_GPIO_HPD_A__DC_GPIO_HPD3_A_MASK:
0116 *en = GPIO_HPD_3;
0117 return true;
0118 case DC_GPIO_HPD_A__DC_GPIO_HPD4_A_MASK:
0119 *en = GPIO_HPD_4;
0120 return true;
0121 case DC_GPIO_HPD_A__DC_GPIO_HPD5_A_MASK:
0122 *en = GPIO_HPD_5;
0123 return true;
0124 case DC_GPIO_HPD_A__DC_GPIO_HPD6_A_MASK:
0125 *en = GPIO_HPD_6;
0126 return true;
0127 default:
0128 ASSERT_CRITICAL(false);
0129 return false;
0130 }
0131 break;
0132
0133 case REG(DC_GPIO_GENLK_A):
0134 *id = GPIO_ID_GSL;
0135 switch (mask) {
0136 case DC_GPIO_GENLK_A__DC_GPIO_GENLK_CLK_A_MASK:
0137 *en = GPIO_GSL_GENLOCK_CLOCK;
0138 return true;
0139 case DC_GPIO_GENLK_A__DC_GPIO_GENLK_VSYNC_A_MASK:
0140 *en = GPIO_GSL_GENLOCK_VSYNC;
0141 return true;
0142 case DC_GPIO_GENLK_A__DC_GPIO_SWAPLOCK_A_A_MASK:
0143 *en = GPIO_GSL_SWAPLOCK_A;
0144 return true;
0145 case DC_GPIO_GENLK_A__DC_GPIO_SWAPLOCK_B_A_MASK:
0146 *en = GPIO_GSL_SWAPLOCK_B;
0147 return true;
0148 default:
0149 ASSERT_CRITICAL(false);
0150 return false;
0151 }
0152 break;
0153
0154
0155
0156
0157
0158 case REG(DC_GPIO_DDC1_A):
0159 *en = GPIO_DDC_LINE_DDC1;
0160 return true;
0161 case REG(DC_GPIO_DDC2_A):
0162 *en = GPIO_DDC_LINE_DDC2;
0163 return true;
0164 case REG(DC_GPIO_DDC3_A):
0165 *en = GPIO_DDC_LINE_DDC3;
0166 return true;
0167 case REG(DC_GPIO_DDC4_A):
0168 *en = GPIO_DDC_LINE_DDC4;
0169 return true;
0170 case REG(DC_GPIO_DDC5_A):
0171 *en = GPIO_DDC_LINE_DDC5;
0172 return true;
0173 case REG(DC_GPIO_DDCVGA_A):
0174 *en = GPIO_DDC_LINE_DDC_VGA;
0175 return true;
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185 default:
0186
0187 #ifdef PALLADIUM_SUPPORTED
0188 *id = GPIO_ID_HPD;
0189 *en = GPIO_DDC_LINE_DDC1;
0190 return true;
0191 #endif
0192 ASSERT_CRITICAL(false);
0193 return false;
0194 }
0195 }
0196
0197 static bool id_to_offset(
0198 enum gpio_id id,
0199 uint32_t en,
0200 struct gpio_pin_info *info)
0201 {
0202 bool result = true;
0203
0204 switch (id) {
0205 case GPIO_ID_DDC_DATA:
0206 info->mask = DC_GPIO_DDC5_A__DC_GPIO_DDC5DATA_A_MASK;
0207 switch (en) {
0208 case GPIO_DDC_LINE_DDC1:
0209 info->offset = REG(DC_GPIO_DDC1_A);
0210 break;
0211 case GPIO_DDC_LINE_DDC2:
0212 info->offset = REG(DC_GPIO_DDC2_A);
0213 break;
0214 case GPIO_DDC_LINE_DDC3:
0215 info->offset = REG(DC_GPIO_DDC3_A);
0216 break;
0217 case GPIO_DDC_LINE_DDC4:
0218 info->offset = REG(DC_GPIO_DDC4_A);
0219 break;
0220 case GPIO_DDC_LINE_DDC5:
0221 info->offset = REG(DC_GPIO_DDC5_A);
0222 break;
0223 case GPIO_DDC_LINE_DDC_VGA:
0224 info->offset = REG(DC_GPIO_DDCVGA_A);
0225 break;
0226 case GPIO_DDC_LINE_I2C_PAD:
0227 default:
0228 ASSERT_CRITICAL(false);
0229 result = false;
0230 }
0231 break;
0232 case GPIO_ID_DDC_CLOCK:
0233 info->mask = DC_GPIO_DDC5_A__DC_GPIO_DDC5CLK_A_MASK;
0234 switch (en) {
0235 case GPIO_DDC_LINE_DDC1:
0236 info->offset = REG(DC_GPIO_DDC1_A);
0237 break;
0238 case GPIO_DDC_LINE_DDC2:
0239 info->offset = REG(DC_GPIO_DDC2_A);
0240 break;
0241 case GPIO_DDC_LINE_DDC3:
0242 info->offset = REG(DC_GPIO_DDC3_A);
0243 break;
0244 case GPIO_DDC_LINE_DDC4:
0245 info->offset = REG(DC_GPIO_DDC4_A);
0246 break;
0247 case GPIO_DDC_LINE_DDC5:
0248 info->offset = REG(DC_GPIO_DDC5_A);
0249 break;
0250 case GPIO_DDC_LINE_DDC_VGA:
0251 info->offset = REG(DC_GPIO_DDCVGA_A);
0252 break;
0253 case GPIO_DDC_LINE_I2C_PAD:
0254 default:
0255 ASSERT_CRITICAL(false);
0256 result = false;
0257 }
0258 break;
0259 case GPIO_ID_GENERIC:
0260 info->offset = REG(DC_GPIO_GENERIC_A);
0261 switch (en) {
0262 case GPIO_GENERIC_A:
0263 info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICA_A_MASK;
0264 break;
0265 case GPIO_GENERIC_B:
0266 info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICB_A_MASK;
0267 break;
0268 case GPIO_GENERIC_C:
0269 info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICC_A_MASK;
0270 break;
0271 case GPIO_GENERIC_D:
0272 info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICD_A_MASK;
0273 break;
0274 case GPIO_GENERIC_E:
0275 info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICE_A_MASK;
0276 break;
0277 case GPIO_GENERIC_F:
0278 info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICF_A_MASK;
0279 break;
0280 case GPIO_GENERIC_G:
0281 info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICG_A_MASK;
0282 break;
0283 default:
0284 ASSERT_CRITICAL(false);
0285 result = false;
0286 }
0287 break;
0288 case GPIO_ID_HPD:
0289 info->offset = REG(DC_GPIO_HPD_A);
0290 switch (en) {
0291 case GPIO_HPD_1:
0292 info->mask = DC_GPIO_HPD_A__DC_GPIO_HPD1_A_MASK;
0293 break;
0294 case GPIO_HPD_2:
0295 info->mask = DC_GPIO_HPD_A__DC_GPIO_HPD2_A_MASK;
0296 break;
0297 case GPIO_HPD_3:
0298 info->mask = DC_GPIO_HPD_A__DC_GPIO_HPD3_A_MASK;
0299 break;
0300 case GPIO_HPD_4:
0301 info->mask = DC_GPIO_HPD_A__DC_GPIO_HPD4_A_MASK;
0302 break;
0303 case GPIO_HPD_5:
0304 info->mask = DC_GPIO_HPD_A__DC_GPIO_HPD5_A_MASK;
0305 break;
0306 case GPIO_HPD_6:
0307 info->mask = DC_GPIO_HPD_A__DC_GPIO_HPD6_A_MASK;
0308 break;
0309 default:
0310 ASSERT_CRITICAL(false);
0311 #ifdef PALLADIUM_SUPPORTED
0312 info->mask = DC_GPIO_HPD_A__DC_GPIO_HPD1_A_MASK;
0313 result = true;
0314 #endif
0315 result = false;
0316 }
0317 break;
0318 case GPIO_ID_GSL:
0319 switch (en) {
0320 case GPIO_GSL_GENLOCK_CLOCK:
0321
0322 ASSERT_CRITICAL(false);
0323 result = false;
0324 break;
0325 case GPIO_GSL_GENLOCK_VSYNC:
0326
0327 ASSERT_CRITICAL(false);
0328 result = false;
0329 break;
0330 case GPIO_GSL_SWAPLOCK_A:
0331
0332 ASSERT_CRITICAL(false);
0333 result = false;
0334 break;
0335 case GPIO_GSL_SWAPLOCK_B:
0336
0337 ASSERT_CRITICAL(false);
0338 result = false;
0339
0340 break;
0341 default:
0342 ASSERT_CRITICAL(false);
0343 result = false;
0344 }
0345 break;
0346 case GPIO_ID_SYNC:
0347 case GPIO_ID_VIP_PAD:
0348 default:
0349 ASSERT_CRITICAL(false);
0350 result = false;
0351 }
0352
0353 if (result) {
0354 info->offset_y = info->offset + 2;
0355 info->offset_en = info->offset + 1;
0356 info->offset_mask = info->offset - 1;
0357
0358 info->mask_y = info->mask;
0359 info->mask_en = info->mask;
0360 info->mask_mask = info->mask;
0361 }
0362
0363 return result;
0364 }
0365
0366
0367 static const struct hw_translate_funcs funcs = {
0368 .offset_to_id = offset_to_id,
0369 .id_to_offset = id_to_offset,
0370 };
0371
0372
0373
0374
0375
0376
0377
0378
0379
0380
0381
0382 void dal_hw_translate_dcn21_init(struct hw_translate *tr)
0383 {
0384 tr->funcs = &funcs;
0385 }
0386