Back to home page

OSCL-LXR

 
 

    


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