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

          Line data    Source code
       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             : 
      61           0 : static bool offset_to_id(
      62             :         uint32_t offset,
      63             :         uint32_t mask,
      64             :         enum gpio_id *id,
      65             :         uint32_t *en)
      66             : {
      67           0 :         switch (offset) {
      68             :         /* GENERIC */
      69             :         case REG(DC_GPIO_GENERIC_A):
      70           0 :                 *id = GPIO_ID_GENERIC;
      71           0 :                 switch (mask) {
      72             :                 case DC_GPIO_GENERIC_A__DC_GPIO_GENERICA_A_MASK:
      73           0 :                         *en = GPIO_GENERIC_A;
      74           0 :                         return true;
      75             :                 case DC_GPIO_GENERIC_A__DC_GPIO_GENERICB_A_MASK:
      76           0 :                         *en = GPIO_GENERIC_B;
      77           0 :                         return true;
      78             :                 case DC_GPIO_GENERIC_A__DC_GPIO_GENERICC_A_MASK:
      79           0 :                         *en = GPIO_GENERIC_C;
      80           0 :                         return true;
      81             :                 case DC_GPIO_GENERIC_A__DC_GPIO_GENERICD_A_MASK:
      82           0 :                         *en = GPIO_GENERIC_D;
      83           0 :                         return true;
      84             :                 case DC_GPIO_GENERIC_A__DC_GPIO_GENERICE_A_MASK:
      85           0 :                         *en = GPIO_GENERIC_E;
      86           0 :                         return true;
      87             :                 case DC_GPIO_GENERIC_A__DC_GPIO_GENERICF_A_MASK:
      88           0 :                         *en = GPIO_GENERIC_F;
      89           0 :                         return true;
      90             :                 case DC_GPIO_GENERIC_A__DC_GPIO_GENERICG_A_MASK:
      91           0 :                         *en = GPIO_GENERIC_G;
      92           0 :                         return true;
      93             :                 default:
      94           0 :                         ASSERT_CRITICAL(false);
      95           0 :                         return false;
      96             :                 }
      97             :         break;
      98             :         /* HPD */
      99             :         case REG(DC_GPIO_HPD_A):
     100           0 :                 *id = GPIO_ID_HPD;
     101           0 :                 switch (mask) {
     102             :                 case DC_GPIO_HPD_A__DC_GPIO_HPD1_A_MASK:
     103           0 :                         *en = GPIO_HPD_1;
     104           0 :                         return true;
     105             :                 case DC_GPIO_HPD_A__DC_GPIO_HPD2_A_MASK:
     106           0 :                         *en = GPIO_HPD_2;
     107           0 :                         return true;
     108             :                 case DC_GPIO_HPD_A__DC_GPIO_HPD3_A_MASK:
     109           0 :                         *en = GPIO_HPD_3;
     110           0 :                         return true;
     111             :                 case DC_GPIO_HPD_A__DC_GPIO_HPD4_A_MASK:
     112           0 :                         *en = GPIO_HPD_4;
     113           0 :                         return true;
     114             :                 case DC_GPIO_HPD_A__DC_GPIO_HPD5_A_MASK:
     115           0 :                         *en = GPIO_HPD_5;
     116           0 :                         return true;
     117             :                 case DC_GPIO_HPD_A__DC_GPIO_HPD6_A_MASK:
     118           0 :                         *en = GPIO_HPD_6;
     119           0 :                         return true;
     120             :                 default:
     121           0 :                         ASSERT_CRITICAL(false);
     122           0 :                         return false;
     123             :                 }
     124             :         break;
     125             :         /* SYNCA */
     126             :         case REG(DC_GPIO_SYNCA_A):
     127           0 :                 *id = GPIO_ID_SYNC;
     128           0 :                 switch (mask) {
     129             :                 case DC_GPIO_SYNCA_A__DC_GPIO_HSYNCA_A_MASK:
     130           0 :                         *en = GPIO_SYNC_HSYNC_A;
     131           0 :                         return true;
     132             :                 case DC_GPIO_SYNCA_A__DC_GPIO_VSYNCA_A_MASK:
     133           0 :                         *en = GPIO_SYNC_VSYNC_A;
     134           0 :                         return true;
     135             :                 default:
     136           0 :                         ASSERT_CRITICAL(false);
     137           0 :                         return false;
     138             :                 }
     139             :         break;
     140             :         /* REG(DC_GPIO_GENLK_MASK */
     141             :         case REG(DC_GPIO_GENLK_A):
     142           0 :                 *id = GPIO_ID_GSL;
     143           0 :                 switch (mask) {
     144             :                 case DC_GPIO_GENLK_A__DC_GPIO_GENLK_CLK_A_MASK:
     145           0 :                         *en = GPIO_GSL_GENLOCK_CLOCK;
     146           0 :                         return true;
     147             :                 case DC_GPIO_GENLK_A__DC_GPIO_GENLK_VSYNC_A_MASK:
     148           0 :                         *en = GPIO_GSL_GENLOCK_VSYNC;
     149           0 :                         return true;
     150             :                 case DC_GPIO_GENLK_A__DC_GPIO_SWAPLOCK_A_A_MASK:
     151           0 :                         *en = GPIO_GSL_SWAPLOCK_A;
     152           0 :                         return true;
     153             :                 case DC_GPIO_GENLK_A__DC_GPIO_SWAPLOCK_B_A_MASK:
     154           0 :                         *en = GPIO_GSL_SWAPLOCK_B;
     155           0 :                         return true;
     156             :                 default:
     157           0 :                         ASSERT_CRITICAL(false);
     158           0 :                         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           0 :                 *en = GPIO_DDC_LINE_DDC1;
     167           0 :                 return true;
     168             :         case REG(DC_GPIO_DDC2_A):
     169           0 :                 *en = GPIO_DDC_LINE_DDC2;
     170           0 :                 return true;
     171             :         case REG(DC_GPIO_DDC3_A):
     172           0 :                 *en = GPIO_DDC_LINE_DDC3;
     173           0 :                 return true;
     174             :         case REG(DC_GPIO_DDC4_A):
     175           0 :                 *en = GPIO_DDC_LINE_DDC4;
     176           0 :                 return true;
     177             :         case REG(DC_GPIO_DDC5_A):
     178           0 :                 *en = GPIO_DDC_LINE_DDC5;
     179           0 :                 return true;
     180             :         case REG(DC_GPIO_DDC6_A):
     181           0 :                 *en = GPIO_DDC_LINE_DDC6;
     182           0 :                 return true;
     183             :         case REG(DC_GPIO_DDCVGA_A):
     184           0 :                 *en = GPIO_DDC_LINE_DDC_VGA;
     185           0 :                 return true;
     186             :         /* GPIO_I2CPAD */
     187             :         case REG(DC_GPIO_I2CPAD_A):
     188           0 :                 *en = GPIO_DDC_LINE_I2C_PAD;
     189           0 :                 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           0 :                 ASSERT_CRITICAL(false);
     199           0 :                 return false;
     200             :         }
     201             : }
     202             : 
     203           0 : static bool id_to_offset(
     204             :         enum gpio_id id,
     205             :         uint32_t en,
     206             :         struct gpio_pin_info *info)
     207             : {
     208           0 :         bool result = true;
     209             : 
     210           0 :         switch (id) {
     211             :         case GPIO_ID_DDC_DATA:
     212           0 :                 info->mask = DC_GPIO_DDC6_A__DC_GPIO_DDC6DATA_A_MASK;
     213           0 :                 switch (en) {
     214             :                 case GPIO_DDC_LINE_DDC1:
     215           0 :                         info->offset = REG(DC_GPIO_DDC1_A);
     216           0 :                 break;
     217             :                 case GPIO_DDC_LINE_DDC2:
     218           0 :                         info->offset = REG(DC_GPIO_DDC2_A);
     219           0 :                 break;
     220             :                 case GPIO_DDC_LINE_DDC3:
     221           0 :                         info->offset = REG(DC_GPIO_DDC3_A);
     222           0 :                 break;
     223             :                 case GPIO_DDC_LINE_DDC4:
     224           0 :                         info->offset = REG(DC_GPIO_DDC4_A);
     225           0 :                 break;
     226             :                 case GPIO_DDC_LINE_DDC5:
     227           0 :                         info->offset = REG(DC_GPIO_DDC5_A);
     228           0 :                 break;
     229             :                 case GPIO_DDC_LINE_DDC6:
     230           0 :                         info->offset = REG(DC_GPIO_DDC6_A);
     231           0 :                 break;
     232             :                 case GPIO_DDC_LINE_DDC_VGA:
     233           0 :                         info->offset = REG(DC_GPIO_DDCVGA_A);
     234           0 :                 break;
     235             :                 case GPIO_DDC_LINE_I2C_PAD:
     236           0 :                         info->offset = REG(DC_GPIO_I2CPAD_A);
     237           0 :                 break;
     238             :                 default:
     239           0 :                         ASSERT_CRITICAL(false);
     240           0 :                         result = false;
     241             :                 }
     242             :         break;
     243             :         case GPIO_ID_DDC_CLOCK:
     244           0 :                 info->mask = DC_GPIO_DDC6_A__DC_GPIO_DDC6CLK_A_MASK;
     245           0 :                 switch (en) {
     246             :                 case GPIO_DDC_LINE_DDC1:
     247           0 :                         info->offset = REG(DC_GPIO_DDC1_A);
     248           0 :                 break;
     249             :                 case GPIO_DDC_LINE_DDC2:
     250           0 :                         info->offset = REG(DC_GPIO_DDC2_A);
     251           0 :                 break;
     252             :                 case GPIO_DDC_LINE_DDC3:
     253           0 :                         info->offset = REG(DC_GPIO_DDC3_A);
     254           0 :                 break;
     255             :                 case GPIO_DDC_LINE_DDC4:
     256           0 :                         info->offset = REG(DC_GPIO_DDC4_A);
     257           0 :                 break;
     258             :                 case GPIO_DDC_LINE_DDC5:
     259           0 :                         info->offset = REG(DC_GPIO_DDC5_A);
     260           0 :                 break;
     261             :                 case GPIO_DDC_LINE_DDC6:
     262           0 :                         info->offset = REG(DC_GPIO_DDC6_A);
     263           0 :                 break;
     264             :                 case GPIO_DDC_LINE_DDC_VGA:
     265           0 :                         info->offset = REG(DC_GPIO_DDCVGA_A);
     266           0 :                 break;
     267             :                 case GPIO_DDC_LINE_I2C_PAD:
     268           0 :                         info->offset = REG(DC_GPIO_I2CPAD_A);
     269           0 :                 break;
     270             :                 default:
     271           0 :                         ASSERT_CRITICAL(false);
     272           0 :                         result = false;
     273             :                 }
     274             :         break;
     275             :         case GPIO_ID_GENERIC:
     276           0 :                 info->offset = REG(DC_GPIO_GENERIC_A);
     277           0 :                 switch (en) {
     278             :                 case GPIO_GENERIC_A:
     279           0 :                         info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICA_A_MASK;
     280           0 :                 break;
     281             :                 case GPIO_GENERIC_B:
     282           0 :                         info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICB_A_MASK;
     283           0 :                 break;
     284             :                 case GPIO_GENERIC_C:
     285           0 :                         info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICC_A_MASK;
     286           0 :                 break;
     287             :                 case GPIO_GENERIC_D:
     288           0 :                         info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICD_A_MASK;
     289           0 :                 break;
     290             :                 case GPIO_GENERIC_E:
     291           0 :                         info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICE_A_MASK;
     292           0 :                 break;
     293             :                 case GPIO_GENERIC_F:
     294           0 :                         info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICF_A_MASK;
     295           0 :                 break;
     296             :                 case GPIO_GENERIC_G:
     297           0 :                         info->mask = DC_GPIO_GENERIC_A__DC_GPIO_GENERICG_A_MASK;
     298           0 :                 break;
     299             :                 default:
     300           0 :                         ASSERT_CRITICAL(false);
     301           0 :                         result = false;
     302             :                 }
     303             :         break;
     304             :         case GPIO_ID_HPD:
     305           0 :                 info->offset = REG(DC_GPIO_HPD_A);
     306           0 :                 switch (en) {
     307             :                 case GPIO_HPD_1:
     308           0 :                         info->mask = DC_GPIO_HPD_A__DC_GPIO_HPD1_A_MASK;
     309           0 :                 break;
     310             :                 case GPIO_HPD_2:
     311           0 :                         info->mask = DC_GPIO_HPD_A__DC_GPIO_HPD2_A_MASK;
     312           0 :                 break;
     313             :                 case GPIO_HPD_3:
     314           0 :                         info->mask = DC_GPIO_HPD_A__DC_GPIO_HPD3_A_MASK;
     315           0 :                 break;
     316             :                 case GPIO_HPD_4:
     317           0 :                         info->mask = DC_GPIO_HPD_A__DC_GPIO_HPD4_A_MASK;
     318           0 :                 break;
     319             :                 case GPIO_HPD_5:
     320           0 :                         info->mask = DC_GPIO_HPD_A__DC_GPIO_HPD5_A_MASK;
     321           0 :                 break;
     322             :                 case GPIO_HPD_6:
     323           0 :                         info->mask = DC_GPIO_HPD_A__DC_GPIO_HPD6_A_MASK;
     324           0 :                 break;
     325             :                 default:
     326           0 :                         ASSERT_CRITICAL(false);
     327           0 :                         result = false;
     328             :                 }
     329             :         break;
     330             :         case GPIO_ID_SYNC:
     331           0 :                 switch (en) {
     332             :                 case GPIO_SYNC_HSYNC_A:
     333           0 :                         info->offset = REG(DC_GPIO_SYNCA_A);
     334           0 :                         info->mask = DC_GPIO_SYNCA_A__DC_GPIO_HSYNCA_A_MASK;
     335           0 :                 break;
     336             :                 case GPIO_SYNC_VSYNC_A:
     337           0 :                         info->offset = REG(DC_GPIO_SYNCA_A);
     338           0 :                         info->mask = DC_GPIO_SYNCA_A__DC_GPIO_VSYNCA_A_MASK;
     339           0 :                 break;
     340             :                 case GPIO_SYNC_HSYNC_B:
     341             :                 case GPIO_SYNC_VSYNC_B:
     342             :                 default:
     343           0 :                         ASSERT_CRITICAL(false);
     344           0 :                         result = false;
     345             :                 }
     346             :         break;
     347             :         case GPIO_ID_GSL:
     348           0 :                 switch (en) {
     349             :                 case GPIO_GSL_GENLOCK_CLOCK:
     350           0 :                         info->offset = REG(DC_GPIO_GENLK_A);
     351           0 :                         info->mask = DC_GPIO_GENLK_A__DC_GPIO_GENLK_CLK_A_MASK;
     352           0 :                 break;
     353             :                 case GPIO_GSL_GENLOCK_VSYNC:
     354           0 :                         info->offset = REG(DC_GPIO_GENLK_A);
     355           0 :                         info->mask =
     356             :                                 DC_GPIO_GENLK_A__DC_GPIO_GENLK_VSYNC_A_MASK;
     357           0 :                 break;
     358             :                 case GPIO_GSL_SWAPLOCK_A:
     359           0 :                         info->offset = REG(DC_GPIO_GENLK_A);
     360           0 :                         info->mask = DC_GPIO_GENLK_A__DC_GPIO_SWAPLOCK_A_A_MASK;
     361           0 :                 break;
     362             :                 case GPIO_GSL_SWAPLOCK_B:
     363           0 :                         info->offset = REG(DC_GPIO_GENLK_A);
     364           0 :                         info->mask = DC_GPIO_GENLK_A__DC_GPIO_SWAPLOCK_B_A_MASK;
     365           0 :                 break;
     366             :                 default:
     367           0 :                         ASSERT_CRITICAL(false);
     368           0 :                         result = false;
     369             :                 }
     370             :         break;
     371             :         case GPIO_ID_VIP_PAD:
     372             :         default:
     373           0 :                 ASSERT_CRITICAL(false);
     374           0 :                 result = false;
     375             :         }
     376             : 
     377           0 :         if (result) {
     378           0 :                 info->offset_y = info->offset + 2;
     379           0 :                 info->offset_en = info->offset + 1;
     380           0 :                 info->offset_mask = info->offset - 1;
     381             : 
     382           0 :                 info->mask_y = info->mask;
     383           0 :                 info->mask_en = info->mask;
     384           0 :                 info->mask_mask = info->mask;
     385             :         }
     386             : 
     387           0 :         return result;
     388             : }
     389             : 
     390             : /* function table */
     391             : static 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             :  */
     406           0 : void dal_hw_translate_dcn10_init(struct hw_translate *tr)
     407             : {
     408           0 :         tr->funcs = &funcs;
     409           0 : }

Generated by: LCOV version 1.14