FILE
hw_translate_dcn401.c
File preview with syntax highlighting.
linux-6.19.14/drivers/gpu/drm/amd/display/dc/gpio/dcn401/hw_translate_dcn401.c
1// SPDX-License-Identifier: MIT 2// 3// Copyright 2024 Advanced Micro Devices, Inc. 4 5#include "hw_translate_dcn401.h" 6 7#include "dm_services.h" 8#include "include/gpio_types.h" 9#include "../hw_translate.h" 10 11#include "dcn/dcn_4_1_0_offset.h" 12#include "dcn/dcn_4_1_0_sh_mask.h" 13 14#define DCN_BASE__INST0_SEG2 0x000034C0 15/* begin ********************* 16 * macros to expend register list macro defined in HW object header file */ 17 18/* DCN */ 19#define block HPD 20#define reg_num 0 21 22#undef BASE_INNER 23#define BASE_INNER(seg) DCN_BASE__INST0_SEG ## seg 24 25#define BASE(seg) BASE_INNER(seg) 26 27#undef REG 28#define REG(reg_name)\ 29 BASE(reg ## reg_name ## _BASE_IDX) + reg ## reg_name 30#define SF_HPD(reg_name, field_name, post_fix)\ 31 .field_name = reg_name ## __ ## field_name ## post_fix 32 33 34/* macros to expend register list macro defined in HW object header file 35 * end *********************/ 36 37 38static bool offset_to_id( 39 uint32_t offset, 40 uint32_t mask, 41 enum gpio_id *id, 42 uint32_t *en) 43{ 44 switch (offset) { 45 /* GENERIC */ 46 case REG(DC_GPIO_GENERIC_A): 47 *id = GPIO_ID_GENERIC; 48 switch (mask) { 49 case DC_GPIO_GENERIC_A__DC_GPIO_GENERICA_A_MASK: 50 *en = GPIO_GENERIC_A; 51 return true; 52 case DC_GPIO_GENERIC_A__DC_GPIO_GENERICB_A_MASK: 53 *en = GPIO_GENERIC_B; 54 return true; 55 case DC_GPIO_GENERIC_A__DC_GPIO_GENERICC_A_MASK: 56 *en = GPIO_GENERIC_C; 57 return true; 58 case DC_GPIO_GENERIC_A__DC_GPIO_GENERICD_A_MASK: 59 *en = GPIO_GENERIC_D; 60 return true; 61 case DC_GPIO_GENERIC_A__DC_GPIO_GENERICE_A_MASK: 62 *en = GPIO_GENERIC_E; 63 return true; 64 case DC_GPIO_GENERIC_A__DC_GPIO_GENERICF_A_MASK: 65 *en = GPIO_GENERIC_F; 66 return true; 67 default: 68 ASSERT_CRITICAL(false); 69 return false; 70 } 71 break; 72 /* HPD */ 73 case REG(DC_GPIO_HPD_A): 74 *id = GPIO_ID_HPD; 75 switch (mask) { 76 case DC_GPIO_HPD_A__DC_GPIO_HPD1_A_MASK: 77 *en = GPIO_HPD_1; 78 return true; 79 case DC_GPIO_HPD_A__DC_GPIO_HPD2_A_MASK: 80 *en = GPIO_HPD_2; 81 return true; 82 case DC_GPIO_HPD_A__DC_GPIO_HPD3_A_MASK: 83 *en = GPIO_HPD_3; 84 return true; 85 case DC_GPIO_HPD_A__DC_GPIO_HPD4_A_MASK: 86 *en = GPIO_HPD_4; 87 return true; 88 case DC_GPIO_HPD_A__DC_GPIO_HPD5_A_MASK: 89 *en = GPIO_HPD_5; 90 return true; 91 default: 92 ASSERT_CRITICAL(false); 93 return false; 94 } 95 break; 96 /* REG(DC_GPIO_GENLK_MASK */ 97 case REG(DC_GPIO_GENLK_A): 98 *id = GPIO_ID_GSL; 99 switch (mask) { 100 case DC_GPIO_GENLK_A__DC_GPIO_GENLK_CLK_A_MASK: 101 *en = GPIO_GSL_GENLOCK_CLOCK; 102 return true; 103 case DC_GPIO_GENLK_A__DC_GPIO_GENLK_VSYNC_A_MASK: 104 *en = GPIO_GSL_GENLOCK_VSYNC; 105 return true; 106 case DC_GPIO_GENLK_A__DC_GPIO_SWAPLOCK_A_A_MASK: 107 *en = GPIO_GSL_SWAPLOCK_A; 108 return true; 109 case DC_GPIO_GENLK_A__DC_GPIO_SWAPLOCK_B_A_MASK: 110 *en = GPIO_GSL_SWAPLOCK_B; 111 return true; 112 default: 113 ASSERT_CRITICAL(false); 114 return false; 115 } 116 break; 117 /* DDC */ 118 /* we don't care about the GPIO_ID for DDC 119 * in DdcHandle it will use GPIO_ID_DDC_DATA/GPIO_ID_DDC_CLOCK 120 * directly in the create method 121 */ 122 case REG(DC_GPIO_DDC1_A): 123 *en = GPIO_DDC_LINE_DDC1; 124 return true; 125 case REG(DC_GPIO_DDC2_A): 126 *en = GPIO_DDC_LINE_DDC2; 127 return true; 128 case REG(DC_GPIO_DDC3_A): 129 *en = GPIO_DDC_LINE_DDC3; 130 return true; 131 case REG(DC_GPIO_DDC4_A): 132 *en = GPIO_DDC_LINE_DDC4; 133 return true; 134 case REG(DC_GPIO_DDCVGA_A): 135 *en = GPIO_DDC_LINE_DDC_VGA; 136 return true; 137 138/* 139 * case REG(DC_GPIO_I2CPAD_A): not exit 140 * case REG(DC_GPIO_PWRSEQ_A): 141 * case REG(DC_GPIO_PAD_STRENGTH_1): 142 * case REG(DC_GPIO_PAD_STRENGTH_2): 143 * case REG(DC_GPIO_DEBUG): 144 */ 145 /* UNEXPECTED */ 146 default: 147/* case REG(DC_GPIO_SYNCA_A): not exist */ 148 ASSERT_CRITICAL(false); 149 return false; 150 } 151} 152 153 154static bool id_to_offset( 155 enum gpio_id id, 156 uint32_t en, 157 struct gpio_pin_info *info) 158{ 159 bool result = true; 160 161 switch (id) { 162 case GPIO_ID_DDC_DATA: 163 info->mask = DC_GPIO_DDC1_A__DC_GPIO_DDC1DATA_A_MASK; 164 switch (en) { 165 case GPIO_DDC_LINE_DDC1: 166 info->offset = REG(DC_GPIO_DDC1_A); 167 break; 168 case GPIO_DDC_LINE_DDC2: 169 info->offset = REG(DC_GPIO_DDC2_A); 170 break; 171 case GPIO_DDC_LINE_DDC3: 172 info->offset = REG(DC_GPIO_DDC3_A); 173 break; 174 case GPIO_DDC_LINE_DDC4: 175 info->offset = REG(DC_GPIO_DDC4_A); 176 break; 177/* case GPIO_DDC_LINE_DDC5: 178 info->offset = REG(DC_GPIO_DDC5_A); 179 break; */ 180 case GPIO_DDC_LINE_DDC_VGA: 181 info->offset = REG(DC_GPIO_DDCVGA_A); 182 break; 183 case GPIO_DDC_LINE_I2C_PAD: 184 default: 185 ASSERT_CRITICAL(false); 186 result = false; 187 } 188 break; 189 case GPIO_ID_DDC_CLOCK: 190 info->mask = DC_GPIO_DDC1_A__DC_GPIO_DDC1CLK_A_MASK; 191 switch (en) { 192 case GPIO_DDC_LINE_DDC1: 193 info->offset = REG(DC_GPIO_DDC1_A); 194 break; 195 case GPIO_DDC_LINE_DDC2: 196 info->offset = REG(DC_GPIO_DDC2_A); 197 break; 198 case GPIO_DDC_LINE_DDC3: 199 info->offset = REG(DC_GPIO_DDC3_A); 200 break; 201 case GPIO_DDC_LINE_DDC4: 202 info->offset = REG(DC_GPIO_DDC4_A); 203 break; 204/* case GPIO_DDC_LINE_DDC5: 205 info->offset = REG(DC_GPIO_DDC5_A); 206 break; */ 207 case GPIO_DDC_LINE_DDC_VGA: 208 info->offset = REG(DC_GPIO_DDCVGA_A); 209 break; 210 case GPIO_DDC_LINE_I2C_PAD: 211 default: 212 ASSERT_CRITICAL(false); 213 result = false; 214 } 215 break; 216 case GPIO_ID_GENERIC: 217 info->offset = REG(DC_GPIO_GENERIC_A); 218 switch (en) { 219 case GPIO_GENERIC_A: 220 info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICA_A_MASK; 221 break; 222 case GPIO_GENERIC_B: 223 info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICB_A_MASK; 224 break; 225 case GPIO_GENERIC_C: 226 info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICC_A_MASK; 227 break; 228 case GPIO_GENERIC_D: 229 info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICD_A_MASK; 230 break; 231 case GPIO_GENERIC_E: 232 info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICE_A_MASK; 233 break; 234 case GPIO_GENERIC_F: 235 info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICF_A_MASK; 236 break; 237 default: 238 ASSERT_CRITICAL(false); 239 result = false; 240 } 241 break; 242 case GPIO_ID_HPD: 243 info->offset = REG(DC_GPIO_HPD_A); 244 switch (en) { 245 case GPIO_HPD_1: 246 info->mask = DC_GPIO_HPD_A__DC_GPIO_HPD1_A_MASK; 247 break; 248 case GPIO_HPD_2: 249 info->mask = DC_GPIO_HPD_A__DC_GPIO_HPD2_A_MASK; 250 break; 251 case GPIO_HPD_3: 252 info->mask = DC_GPIO_HPD_A__DC_GPIO_HPD3_A_MASK; 253 break; 254 case GPIO_HPD_4: 255 info->mask = DC_GPIO_HPD_A__DC_GPIO_HPD4_A_MASK; 256 break; 257 case GPIO_HPD_5: 258 info->mask = DC_GPIO_HPD_A__DC_GPIO_HPD5_A_MASK; 259 break; 260 default: 261 ASSERT_CRITICAL(false); 262 result = false; 263 } 264 break; 265 case GPIO_ID_GSL: 266 switch (en) { 267 case GPIO_GSL_GENLOCK_CLOCK: 268 /*not implmented*/ 269 ASSERT_CRITICAL(false); 270 result = false; 271 break; 272 case GPIO_GSL_GENLOCK_VSYNC: 273 /*not implmented*/ 274 ASSERT_CRITICAL(false); 275 result = false; 276 break; 277 case GPIO_GSL_SWAPLOCK_A: 278 /*not implmented*/ 279 ASSERT_CRITICAL(false); 280 result = false; 281 break; 282 case GPIO_GSL_SWAPLOCK_B: 283 /*not implmented*/ 284 ASSERT_CRITICAL(false); 285 result = false; 286 287 break; 288 default: 289 ASSERT_CRITICAL(false); 290 result = false; 291 } 292 break; 293 case GPIO_ID_SYNC: 294 case GPIO_ID_VIP_PAD: 295 default: 296 ASSERT_CRITICAL(false); 297 result = false; 298 } 299 300 if (result) { 301 info->offset_y = info->offset + 2; 302 info->offset_en = info->offset + 1; 303 info->offset_mask = info->offset - 1; 304 305 info->mask_y = info->mask; 306 info->mask_en = info->mask; 307 info->mask_mask = info->mask; 308 } 309 310 return result; 311} 312 313 314/* function table */ 315static const struct hw_translate_funcs funcs = { 316 .offset_to_id = offset_to_id, 317 .id_to_offset = id_to_offset, 318}; 319 320 321/* 322 * dal_hw_translate_dcn401_init 323 * 324 * @brief 325 * Initialize Hw translate function pointers. 326 * 327 * @param 328 * struct hw_translate *tr - [out] struct of function pointers 329 * 330 */ 331void dal_hw_translate_dcn401_init(struct hw_translate *tr) 332{ 333 tr->funcs = &funcs; 334} 335
~/
Read-only file preview.