Back to home page

OSCL-LXR

 
 

    


0001 /*
0002  * Copyright 2018 Advanced Micro Devices, Inc.
0003  *
0004  * Permission is hereby granted, free of charge, to any person obtaining a
0005  * copy of this software and associated documentation files (the "Software"),
0006  * to deal in the Software without restriction, including without limitation
0007  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
0008  * and/or sell copies of the Software, and to permit persons to whom the
0009  * Software is furnished to do so, subject to the following conditions:
0010  *
0011  * The above copyright notice and this permission notice shall be included in
0012  * all copies or substantial portions of the Software.
0013  *
0014  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
0015  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
0016  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
0017  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
0018  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
0019  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
0020  * OTHER DEALINGS IN THE SOFTWARE.
0021  *
0022  * Authors: AMD
0023  *
0024  */
0025 
0026 /*
0027  * Pre-requisites: headers required by header of this unit
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 /* begin *********************
0043  * macros to expend register list macro defined in HW object header file */
0044 
0045 /* DCN */
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 /* macros to expend register list macro defined in HW object header file
0062  * end *********************/
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     /* GENERIC */
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     /* HPD */
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     /* REG(DC_GPIO_GENLK_MASK */
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     /* DDC */
0151     /* we don't care about the GPIO_ID for DDC
0152      * in DdcHandle it will use GPIO_ID_DDC_DATA/GPIO_ID_DDC_CLOCK
0153      * directly in the create method
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  *  case REG(DC_GPIO_I2CPAD_A): not exit
0179  *  case REG(DC_GPIO_PWRSEQ_A):
0180  *  case REG(DC_GPIO_PAD_STRENGTH_1):
0181  *  case REG(DC_GPIO_PAD_STRENGTH_2):
0182  *  case REG(DC_GPIO_DEBUG):
0183  */
0184     /* UNEXPECTED */
0185     default:
0186 /*  case REG(DC_GPIO_SYNCA_A): not exist */
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                 /*not implmented*/
0319             ASSERT_CRITICAL(false);
0320             result = false;
0321         break;
0322         case GPIO_GSL_GENLOCK_VSYNC:
0323             /*not implmented*/
0324             ASSERT_CRITICAL(false);
0325             result = false;
0326         break;
0327         case GPIO_GSL_SWAPLOCK_A:
0328             /*not implmented*/
0329             ASSERT_CRITICAL(false);
0330             result = false;
0331         break;
0332         case GPIO_GSL_SWAPLOCK_B:
0333             /*not implmented*/
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 /* function table */
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  * dal_hw_translate_dcn10_init
0371  *
0372  * @brief
0373  * Initialize Hw translate function pointers.
0374  *
0375  * @param
0376  * struct hw_translate *tr - [out] struct of function pointers
0377  *
0378  */
0379 void dal_hw_translate_dcn20_init(struct hw_translate *tr)
0380 {
0381     tr->funcs = &funcs;
0382 }
0383