LCOV - code coverage report
Current view: top level - drivers/gpu/drm/amd/display/dc/gpio/dcn315 - hw_translate_dcn315.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 159 0.0 %
Date: 2022-12-09 01:23:36 Functions: 0 3 0.0 %

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

Generated by: LCOV version 1.14