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