Back to home page

OSCL-LXR

 
 

    


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