1/* 2 * Copyright 2013-15 Advanced Micro Devices, Inc. 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice shall be included in 12 * all copies or substantial portions of the Software. 13 * 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 * OTHER DEALINGS IN THE SOFTWARE. 21 * 22 * Authors: AMD 23 * 24 */ 25 26/* 27 * Pre-requisites: headers required by header of this unit 28 */ 29 30#include "hw_translate_dcn10.h" 31 32#include "dm_services.h" 33#include "include/gpio_types.h" 34#include "../hw_translate.h" 35 36#include "dcn/dcn_1_0_offset.h" 37#include "dcn/dcn_1_0_sh_mask.h" 38#include "soc15_hw_ip.h" 39#include "vega10_ip_offset.h" 40 41/* begin ********************* 42 * macros to expend register list macro defined in HW object header file */ 43 44#define BASE_INNER(seg) \ 45 DCE_BASE__INST0_SEG ## seg 46 47/* compile time expand base address. */ 48#define BASE(seg) \ 49 BASE_INNER(seg) 50 51#define REG(reg_name)\ 52 BASE(mm ## reg_name ## _BASE_IDX) + mm ## reg_name 53 54#define REGI(reg_name, block, id)\ 55 BASE(mm ## block ## id ## _ ## reg_name ## _BASE_IDX) + \ 56 mm ## block ## id ## _ ## reg_name 57 58/* macros to expend register list macro defined in HW object header file 59 * end *********************/ 60 61static bool offset_to_id( 62 uint32_t offset, 63 uint32_t mask, 64 enum gpio_id *id, 65 uint32_t *en) 66{ 67 switch (offset) { 68 /* GENERIC */ 69 case REG(DC_GPIO_GENERIC_A): 70 *id = GPIO_ID_GENERIC; 71 switch (mask) { 72 case DC_GPIO_GENERIC_A__DC_GPIO_GENERICA_A_MASK: 73 *en = GPIO_GENERIC_A; 74 return true; 75 case DC_GPIO_GENERIC_A__DC_GPIO_GENERICB_A_MASK: 76 *en = GPIO_GENERIC_B; 77 return true; 78 case DC_GPIO_GENERIC_A__DC_GPIO_GENERICC_A_MASK: 79 *en = GPIO_GENERIC_C; 80 return true; 81 case DC_GPIO_GENERIC_A__DC_GPIO_GENERICD_A_MASK: 82 *en = GPIO_GENERIC_D; 83 return true; 84 case DC_GPIO_GENERIC_A__DC_GPIO_GENERICE_A_MASK: 85 *en = GPIO_GENERIC_E; 86 return true; 87 case DC_GPIO_GENERIC_A__DC_GPIO_GENERICF_A_MASK: 88 *en = GPIO_GENERIC_F; 89 return true; 90 case DC_GPIO_GENERIC_A__DC_GPIO_GENERICG_A_MASK: 91 *en = GPIO_GENERIC_G; 92 return true; 93 default: 94 ASSERT_CRITICAL(false); 95 return false; 96 } 97 break; 98 /* HPD */ 99 case REG(DC_GPIO_HPD_A): 100 *id = GPIO_ID_HPD; 101 switch (mask) { 102 case DC_GPIO_HPD_A__DC_GPIO_HPD1_A_MASK: 103 *en = GPIO_HPD_1; 104 return true; 105 case DC_GPIO_HPD_A__DC_GPIO_HPD2_A_MASK: 106 *en = GPIO_HPD_2; 107 return true; 108 case DC_GPIO_HPD_A__DC_GPIO_HPD3_A_MASK: 109 *en = GPIO_HPD_3; 110 return true; 111 case DC_GPIO_HPD_A__DC_GPIO_HPD4_A_MASK: 112 *en = GPIO_HPD_4; 113 return true; 114 case DC_GPIO_HPD_A__DC_GPIO_HPD5_A_MASK: 115 *en = GPIO_HPD_5; 116 return true; 117 case DC_GPIO_HPD_A__DC_GPIO_HPD6_A_MASK: 118 *en = GPIO_HPD_6; 119 return true; 120 default: 121 ASSERT_CRITICAL(false); 122 return false; 123 } 124 break; 125 /* SYNCA */ 126 case REG(DC_GPIO_SYNCA_A): 127 *id = GPIO_ID_SYNC; 128 switch (mask) { 129 case DC_GPIO_SYNCA_A__DC_GPIO_HSYNCA_A_MASK: 130 *en = GPIO_SYNC_HSYNC_A; 131 return true; 132 case DC_GPIO_SYNCA_A__DC_GPIO_VSYNCA_A_MASK: 133 *en = GPIO_SYNC_VSYNC_A; 134 return true; 135 default: 136 ASSERT_CRITICAL(false); 137 return false; 138 } 139 break; 140 /* REG(DC_GPIO_GENLK_MASK */ 141 case REG(DC_GPIO_GENLK_A): 142 *id = GPIO_ID_GSL; 143 switch (mask) { 144 case DC_GPIO_GENLK_A__DC_GPIO_GENLK_CLK_A_MASK: 145 *en = GPIO_GSL_GENLOCK_CLOCK; 146 return true; 147 case DC_GPIO_GENLK_A__DC_GPIO_GENLK_VSYNC_A_MASK: 148 *en = GPIO_GSL_GENLOCK_VSYNC; 149 return true; 150 case DC_GPIO_GENLK_A__DC_GPIO_SWAPLOCK_A_A_MASK: 151 *en = GPIO_GSL_SWAPLOCK_A; 152 return true; 153 case DC_GPIO_GENLK_A__DC_GPIO_SWAPLOCK_B_A_MASK: 154 *en = GPIO_GSL_SWAPLOCK_B; 155 return true; 156 default: 157 ASSERT_CRITICAL(false); 158 return false; 159 } 160 break; 161 /* DDC */ 162 /* we don't care about the GPIO_ID for DDC 163 * in DdcHandle it will use GPIO_ID_DDC_DATA/GPIO_ID_DDC_CLOCK 164 * directly in the create method */ 165 case REG(DC_GPIO_DDC1_A): 166 *en = GPIO_DDC_LINE_DDC1; 167 return true; 168 case REG(DC_GPIO_DDC2_A): 169 *en = GPIO_DDC_LINE_DDC2; 170 return true; 171 case REG(DC_GPIO_DDC3_A): 172 *en = GPIO_DDC_LINE_DDC3; 173 return true; 174 case REG(DC_GPIO_DDC4_A): 175 *en = GPIO_DDC_LINE_DDC4; 176 return true; 177 case REG(DC_GPIO_DDC5_A): 178 *en = GPIO_DDC_LINE_DDC5; 179 return true; 180 case REG(DC_GPIO_DDC6_A): 181 *en = GPIO_DDC_LINE_DDC6; 182 return true; 183 case REG(DC_GPIO_DDCVGA_A): 184 *en = GPIO_DDC_LINE_DDC_VGA; 185 return true; 186 /* GPIO_I2CPAD */ 187 case REG(DC_GPIO_I2CPAD_A): 188 *en = GPIO_DDC_LINE_I2C_PAD; 189 return true; 190 /* Not implemented */ 191 case REG(DC_GPIO_PWRSEQ_A): 192 case REG(DC_GPIO_PAD_STRENGTH_1): 193 case REG(DC_GPIO_PAD_STRENGTH_2): 194 case REG(DC_GPIO_DEBUG): 195 return false; 196 /* UNEXPECTED */ 197 default: 198 ASSERT_CRITICAL(false); 199 return false; 200 } 201} 202 203static bool id_to_offset( 204 enum gpio_id id, 205 uint32_t en, 206 struct gpio_pin_info *info) 207{ 208 bool result = true; 209 210 switch (id) { 211 case GPIO_ID_DDC_DATA: 212 info->mask = DC_GPIO_DDC6_A__DC_GPIO_DDC6DATA_A_MASK; 213 switch (en) { 214 case GPIO_DDC_LINE_DDC1: 215 info->offset = REG(DC_GPIO_DDC1_A); 216 break; 217 case GPIO_DDC_LINE_DDC2: 218 info->offset = REG(DC_GPIO_DDC2_A); 219 break; 220 case GPIO_DDC_LINE_DDC3: 221 info->offset = REG(DC_GPIO_DDC3_A); 222 break; 223 case GPIO_DDC_LINE_DDC4: 224 info->offset = REG(DC_GPIO_DDC4_A); 225 break; 226 case GPIO_DDC_LINE_DDC5: 227 info->offset = REG(DC_GPIO_DDC5_A); 228 break; 229 case GPIO_DDC_LINE_DDC6: 230 info->offset = REG(DC_GPIO_DDC6_A); 231 break; 232 case GPIO_DDC_LINE_DDC_VGA: 233 info->offset = REG(DC_GPIO_DDCVGA_A); 234 break; 235 case GPIO_DDC_LINE_I2C_PAD: 236 info->offset = REG(DC_GPIO_I2CPAD_A); 237 break; 238 default: 239 ASSERT_CRITICAL(false); 240 result = false; 241 } 242 break; 243 case GPIO_ID_DDC_CLOCK: 244 info->mask = DC_GPIO_DDC6_A__DC_GPIO_DDC6CLK_A_MASK; 245 switch (en) { 246 case GPIO_DDC_LINE_DDC1: 247 info->offset = REG(DC_GPIO_DDC1_A); 248 break; 249 case GPIO_DDC_LINE_DDC2: 250 info->offset = REG(DC_GPIO_DDC2_A); 251 break; 252 case GPIO_DDC_LINE_DDC3: 253 info->offset = REG(DC_GPIO_DDC3_A); 254 break; 255 case GPIO_DDC_LINE_DDC4: 256 info->offset = REG(DC_GPIO_DDC4_A); 257 break; 258 case GPIO_DDC_LINE_DDC5: 259 info->offset = REG(DC_GPIO_DDC5_A); 260 break; 261 case GPIO_DDC_LINE_DDC6: 262 info->offset = REG(DC_GPIO_DDC6_A); 263 break; 264 case GPIO_DDC_LINE_DDC_VGA: 265 info->offset = REG(DC_GPIO_DDCVGA_A); 266 break; 267 case GPIO_DDC_LINE_I2C_PAD: 268 info->offset = REG(DC_GPIO_I2CPAD_A); 269 break; 270 default: 271 ASSERT_CRITICAL(false); 272 result = false; 273 } 274 break; 275 case GPIO_ID_GENERIC: 276 info->offset = REG(DC_GPIO_GENERIC_A); 277 switch (en) { 278 case GPIO_GENERIC_A: 279 info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICA_A_MASK; 280 break; 281 case GPIO_GENERIC_B: 282 info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICB_A_MASK; 283 break; 284 case GPIO_GENERIC_C: 285 info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICC_A_MASK; 286 break; 287 case GPIO_GENERIC_D: 288 info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICD_A_MASK; 289 break; 290 case GPIO_GENERIC_E: 291 info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICE_A_MASK; 292 break; 293 case GPIO_GENERIC_F: 294 info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICF_A_MASK; 295 break; 296 case GPIO_GENERIC_G: 297 info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICG_A_MASK; 298 break; 299 default: 300 ASSERT_CRITICAL(false); 301 result = false; 302 } 303 break; 304 case GPIO_ID_HPD: 305 info->offset = REG(DC_GPIO_HPD_A); 306 switch (en) { 307 case GPIO_HPD_1: 308 info->mask = DC_GPIO_HPD_A__DC_GPIO_HPD1_A_MASK; 309 break; 310 case GPIO_HPD_2: 311 info->mask = DC_GPIO_HPD_A__DC_GPIO_HPD2_A_MASK; 312 break; 313 case GPIO_HPD_3: 314 info->mask = DC_GPIO_HPD_A__DC_GPIO_HPD3_A_MASK; 315 break; 316 case GPIO_HPD_4: 317 info->mask = DC_GPIO_HPD_A__DC_GPIO_HPD4_A_MASK; 318 break; 319 case GPIO_HPD_5: 320 info->mask = DC_GPIO_HPD_A__DC_GPIO_HPD5_A_MASK; 321 break; 322 case GPIO_HPD_6: 323 info->mask = DC_GPIO_HPD_A__DC_GPIO_HPD6_A_MASK; 324 break; 325 default: 326 ASSERT_CRITICAL(false); 327 result = false; 328 } 329 break; 330 case GPIO_ID_SYNC: 331 switch (en) { 332 case GPIO_SYNC_HSYNC_A: 333 info->offset = REG(DC_GPIO_SYNCA_A); 334 info->mask = DC_GPIO_SYNCA_A__DC_GPIO_HSYNCA_A_MASK; 335 break; 336 case GPIO_SYNC_VSYNC_A: 337 info->offset = REG(DC_GPIO_SYNCA_A); 338 info->mask = DC_GPIO_SYNCA_A__DC_GPIO_VSYNCA_A_MASK; 339 break; 340 case GPIO_SYNC_HSYNC_B: 341 case GPIO_SYNC_VSYNC_B: 342 default: 343 ASSERT_CRITICAL(false); 344 result = false; 345 } 346 break; 347 case GPIO_ID_GSL: 348 switch (en) { 349 case GPIO_GSL_GENLOCK_CLOCK: 350 info->offset = REG(DC_GPIO_GENLK_A); 351 info->mask = DC_GPIO_GENLK_A__DC_GPIO_GENLK_CLK_A_MASK; 352 break; 353 case GPIO_GSL_GENLOCK_VSYNC: 354 info->offset = REG(DC_GPIO_GENLK_A); 355 info->mask = 356 DC_GPIO_GENLK_A__DC_GPIO_GENLK_VSYNC_A_MASK; 357 break; 358 case GPIO_GSL_SWAPLOCK_A: 359 info->offset = REG(DC_GPIO_GENLK_A); 360 info->mask = DC_GPIO_GENLK_A__DC_GPIO_SWAPLOCK_A_A_MASK; 361 break; 362 case GPIO_GSL_SWAPLOCK_B: 363 info->offset = REG(DC_GPIO_GENLK_A); 364 info->mask = DC_GPIO_GENLK_A__DC_GPIO_SWAPLOCK_B_A_MASK; 365 break; 366 default: 367 ASSERT_CRITICAL(false); 368 result = false; 369 } 370 break; 371 case GPIO_ID_VIP_PAD: 372 default: 373 ASSERT_CRITICAL(false); 374 result = false; 375 } 376 377 if (result) { 378 info->offset_y = info->offset + 2; 379 info->offset_en = info->offset + 1; 380 info->offset_mask = info->offset - 1; 381 382 info->mask_y = info->mask; 383 info->mask_en = info->mask; 384 info->mask_mask = info->mask; 385 } 386 387 return result; 388} 389 390/* function table */ 391static const struct hw_translate_funcs funcs = { 392 .offset_to_id = offset_to_id, 393 .id_to_offset = id_to_offset, 394}; 395 396/* 397 * dal_hw_translate_dcn10_init 398 * 399 * @brief 400 * Initialize Hw translate function pointers. 401 * 402 * @param 403 * struct hw_translate *tr - [out] struct of function pointers 404 * 405 */ 406void dal_hw_translate_dcn10_init(struct hw_translate *tr) 407{ 408 tr->funcs = &funcs; 409} 410