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