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