Back to home page

OSCL-LXR

 
 

    


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