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